Compare commits

..

7 Commits

Author SHA1 Message Date
3cc07f2b86 Lien vers dépôt devpi
All checks were successful
/ 🐍 Build & Publish Python Packages (push) Successful in 6s
2025-07-24 22:35:20 +02:00
c5c16c649a Espace entre saison et episode + 0.1.2
All checks were successful
/ 🐍 Build & Publish Python Packages (push) Successful in 13s
2025-07-24 22:29:24 +02:00
b1c553e015 MaJ Readme pour utiliser devpi
All checks were successful
/ 🐍 Build & Publish Python Packages (push) Successful in 6s
2025-07-24 18:54:15 +02:00
b57c0117e4 Switch from gitea to devpi
All checks were successful
/ 🐍 Build & Publish Python Packages (push) Successful in 12s
2025-07-24 18:48:43 +02:00
4d7170f570 [multiplex] Change la gestion des chapitres
All checks were successful
/ 🐍 Build & Publish Python Packages (push) Successful in 10s
2025-07-24 01:07:42 +02:00
4766e87e8a [multiplex] Fix regex nom de fichiers + Compte nb fichiers + 0.1.1
All checks were successful
/ 🐍 Build & Publish Python Packages (push) Successful in 20s
2025-07-24 00:10:13 +02:00
4c24a87bc2 [multiplex] Fix sous-titres par défaut + argparse 2025-07-24 00:10:13 +02:00
4 changed files with 26 additions and 43 deletions

View File

@ -16,9 +16,8 @@ jobs:
- name: 🔍 Sélectionner les projets à publier
id: detect
env:
REGISTRY_URL: ${{ vars.REGISTRY_URL }}
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
DEVPI_URL: ${{ vars.DEVPI_URL }}
DEVPI_USERNAME: ${{ secrets.DEVPI_USERNAME }}
run: |
set +e # Ne pas interrompre le script en cas d'erreur
git fetch origin master --depth=2 || true
@ -51,8 +50,8 @@ jobs:
fi
done
API_URL="https://$REGISTRY_USERNAME:$REGISTRY_PASSWORD@$REGISTRY_URL/api/v1/packages/$REGISTRY_USERNAME/pypi/$NAME/$VERSION"
STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$API_URL")
API_URL="https://$DEVPI_URL/$DEVPI_USERNAME/dev/$NAME/$VERSION"
STATUS_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" "$API_URL")
if [ "$STATUS_CODE" = "404" ]; then
echo "📦 $NAME version $VERSION n'existe pas (HTTP $STATUS_CODE)"
@ -73,18 +72,18 @@ jobs:
- name: 🚀 Publier les projets sélectionnés
if: steps.detect.outputs.selected_projects != ''
env:
REGISTRY_URL: ${{ vars.REGISTRY_URL }}
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
DEVPI_URL: ${{ vars.DEVPI_URL }}
DEVPI_USERNAME: ${{ secrets.DEVPI_USERNAME }}
DEVPI_PASSWORD: ${{ secrets.DEVPI_PASSWORD }}
run: |
for dir in ${{ steps.detect.outputs.selected_projects }}; do
echo "🚀 Publication de $dir"
cd "$dir"
python3 setup.py sdist
twine upload \
--repository-url https://$REGISTRY_URL/api/packages/$REGISTRY_USERNAME/pypi \
-u "$REGISTRY_USERNAME" \
-p "$REGISTRY_PASSWORD" \
--repository-url https://$DEVPI_URL/$DEVPI_USERNAME/dev \
-u "$DEVPI_USERNAME" \
-p "$DEVPI_PASSWORD" \
dist/* || exit 1
cd -
done

View File

@ -2,6 +2,8 @@
Ce dépôt contient plusieurs projets Python que vous pouvez installer et utiliser avec `pipx`.
Dépôt PyPi → [🔗 devpi.netdldata.net](https://devpi.netdldata.net/lionel/dev)
## Installation de pipx
Si `pipx` n'est pas installé, vous pouvez l'installer en utilisant les commandes suivantes selon votre distribution :
@ -35,7 +37,7 @@ pipx ensurepath
Un outil pour encoder des vidéos de manière récursive en utilisant HandBrake. Il permet de traiter des fichiers vidéo dans un répertoire donné, en utilisant des presets définis pour le transcodage. Il génère également un résumé des opérations effectuées dans un fichier Excel.
```bash
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" HandBrake-recursive
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple HandBrake-recursive
```
### proxmox_export_disk
@ -43,7 +45,7 @@ pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/package
Un script pour exporter des informations sur les disques depuis Proxmox. Il récupère les détails des disques des machines virtuelles et des conteneurs sur un serveur Proxmox, et exporte ces informations dans un fichier Excel ou ODS.
```bash
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" proxmox-export-disk
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple proxmox-export-disk
```
### tree_stream
@ -51,7 +53,7 @@ pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/package
Un utilitaire pour afficher la structure des répertoires sous forme de flux. Il permet de visualiser l'arborescence des fichiers et des dossiers avec des informations supplémentaires sur les fichiers vidéo, comme les flux et les chapitres.
```bash
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" tree-stream
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple tree-stream
```
### multiplex
@ -60,5 +62,5 @@ Un script Python pour assembler des pistes vidéo, audio et sous-titres issues d
Il gère la priorité des pistes françaises, la définition des pistes par défaut, la gestion des chapitres et le renommage intelligent des pistes.
```bash
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" multiplex
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple multiplex
```

View File

@ -51,7 +51,7 @@ def find_episode_file(source_dir, saison, episode):
:param episode: Numéro de l'épisode
:return: Chemin du fichier trouvé ou None
"""
pattern = re.compile(rf"s{int(saison):02d}[ex]{int(episode):02d}", re.IGNORECASE)
pattern = re.compile(rf"s{int(saison):02d}\s*[ex]{int(episode):02d}", re.IGNORECASE)
p = Path(source_dir)
# On récupère tous les fichiers mkv ou mp4 en une seule liste
files = list(p.glob("*.mkv")) + list(p.glob("*.mp4"))
@ -73,15 +73,7 @@ def find_first_video_track_index(mkv_file):
return idx
return None
def has_named_chapters(chapters):
"""
Détermine si une liste de chapitres contient des noms réels (autres que des génériques).
"""
import re
pattern = re.compile(r'(?i)^\s*(chapter|chapitre)\s*\d+\s*$')
return any(not pattern.match(c.name or '') for c in chapters)
def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir):
def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir, chapitre):
"""
Traite un épisode en combinant les pistes vidéo et audio/sous-titres de deux sources.
@ -91,6 +83,7 @@ def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, des
:param saison: Numéro de saison
:param serie_name: Nom de la série
:param dest_dir: Répertoire de sortie
:param chapitre: Indique quels chapitres inclure dans le fichier final
:return: None
"""
# Affiche une ligne bleue pour la lisibilité dans le terminal
@ -168,27 +161,14 @@ def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, des
final_mkv.add_track(track)
# Traitement des chapitres
try:
chapters_1 = (source_1_mkv._info_json.get('chapters'))[0].get('num_entries')
except (AttributeError, IndexError):
chapters_1 = 0
try:
chapters_2 = (source_2_mkv._info_json.get('chapters'))[0].get('num_entries')
except (AttributeError, IndexError):
chapters_2 = 0
valid_1 = chapters_1 >= 4
valid_2 = chapters_2 >= 4
if valid_1 and len(chapters_1) >= len(chapters_2):
if chapitre in ('v', 'video'):
source_2_mkv.no_chapters()
elif valid_2:
elif chapitre in ('a', 'audio'):
source_1_mkv.no_chapters()
else:
source_1_mkv.no_chapters()
source_2_mkv.no_chapters()
# Éffacer tous les tags
source_1_mkv.no_global_tags()
source_2_mkv.no_global_tags()
@ -227,6 +207,7 @@ def main():
parser.add_argument("-n", "--nom", required=True, help="Nom de la série")
parser.add_argument("-s", "--saison", required=True, help="Numéro de la saison")
parser.add_argument("-d", "--dest", required=True, help="Répertoire de sortie")
parser.add_argument("-c", "--chapitre", choices=['n', 'non', 'v', 'video', 'a', 'audio'], default='a', help="Gestion des chapitres : 'n'/'non' pour aucun, 'v'/'video' pour source vidéo, 'a'/'audio' pour source audio (par défaut 'a')")
args = parser.parse_args()
@ -243,9 +224,10 @@ def main():
serie_name = args.nom
saison = args.saison
chapitre = args.chapitre
# Chemin de sortie
dest_dir = args.dest
dest_dir = f"{args.dest}/{serie_name}/Saison {saison}"
Path(dest_dir).mkdir(parents=True, exist_ok=True)
# Compte le nombre de fichiers dans chaque répertoire source
@ -254,7 +236,7 @@ def main():
for i in range(1, max(count1, count2) + 1):
episode = f"{i:02}"
process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir)
process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir, chapitre)
if __name__ == '__main__':
main()

View File

@ -2,7 +2,7 @@ from setuptools import setup
setup(
name='multiplex',
version='0.1.1',
version='0.1.2',
description='Un script pour multiplexer les fichiers vidéo avec mkvmerge.',
py_modules=['multiplex'],
install_requires=[