|
|
@ -2,6 +2,7 @@ import os
|
|
|
|
import sys
|
|
|
|
import sys
|
|
|
|
import glob
|
|
|
|
import glob
|
|
|
|
import re
|
|
|
|
import re
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
from pathlib import Path
|
|
|
|
from pathlib import Path
|
|
|
|
from pymkv import MKVFile, MKVTrack
|
|
|
|
from pymkv import MKVFile, MKVTrack
|
|
|
|
|
|
|
|
|
|
|
@ -50,9 +51,13 @@ def find_episode_file(source_dir, saison, episode):
|
|
|
|
:param episode: Numéro de l'épisode
|
|
|
|
:param episode: Numéro de l'épisode
|
|
|
|
:return: Chemin du fichier trouvé ou None
|
|
|
|
:return: Chemin du fichier trouvé ou None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
target = f"s0{saison}e{episode}".lower()
|
|
|
|
pattern = re.compile(rf"s{int(saison):02d}[ex]{int(episode):02d}", re.IGNORECASE)
|
|
|
|
for file in glob.glob(os.path.join(source_dir, "*.mkv")):
|
|
|
|
p = Path(source_dir)
|
|
|
|
if target in os.path.basename(file).lower():
|
|
|
|
# On récupère tous les fichiers mkv ou mp4 en une seule liste
|
|
|
|
|
|
|
|
files = list(p.glob("*.mkv")) + list(p.glob("*.mp4"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for file in files:
|
|
|
|
|
|
|
|
if pattern.search(os.path.basename(file)):
|
|
|
|
return file
|
|
|
|
return file
|
|
|
|
return None
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
@ -145,7 +150,7 @@ def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, des
|
|
|
|
subtitle_tracks_other = [t for t in source_2_mkv.tracks if t.track_type == 'subtitles' and t.language != 'fre']
|
|
|
|
subtitle_tracks_other = [t for t in source_2_mkv.tracks if t.track_type == 'subtitles' and t.language != 'fre']
|
|
|
|
|
|
|
|
|
|
|
|
for idx, track in enumerate(subtitle_tracks_fr):
|
|
|
|
for idx, track in enumerate(subtitle_tracks_fr):
|
|
|
|
track.default_track = (idx == 0)
|
|
|
|
track.default_track = (idx == 0) and track.default_track
|
|
|
|
if not track.track_name:
|
|
|
|
if not track.track_name:
|
|
|
|
codec = track._track_codec
|
|
|
|
codec = track._track_codec
|
|
|
|
if track.forced_track:
|
|
|
|
if track.forced_track:
|
|
|
@ -201,24 +206,53 @@ def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, des
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
def main():
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
Point d'entrée principal du script.
|
|
|
|
@brief Point d'entrée du script.
|
|
|
|
|
|
|
|
@details Parse les arguments en ligne de commande et lance le traitement
|
|
|
|
Lit les arguments de ligne de commande, prépare les répertoires,
|
|
|
|
des épisodes de la série.
|
|
|
|
et lance le traitement de chaque épisode (de 01 à 30).
|
|
|
|
@arg -v, --video Répertoire source vidéo
|
|
|
|
|
|
|
|
@arg -a, --audio Répertoire source audio/sous-titres
|
|
|
|
|
|
|
|
@arg -va Répertoire source commun pour vidéo et audio
|
|
|
|
|
|
|
|
@arg -n, --nom Nom de la série
|
|
|
|
|
|
|
|
@arg -s, --saison Numéro de la saison
|
|
|
|
|
|
|
|
@arg -d, --dest Répertoire de sortie
|
|
|
|
|
|
|
|
@return None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
if len(sys.argv) != 5:
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
print(f'Usage: {sys.argv[0]} <SOURCE_DIR_1> <SOURCE_DIR_2> <SERIE_NAME> <SAISON>')
|
|
|
|
description="Combine des épisodes MKV depuis deux sources (vidéo + audio/sous-titres)."
|
|
|
|
sys.exit(1)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
source_dir_1 = sys.argv[1]
|
|
|
|
parser.add_argument("-v", "--video", help="Répertoire source vidéo" )
|
|
|
|
source_dir_2 = sys.argv[2]
|
|
|
|
parser.add_argument("-a", "--audio", help="Répertoire source audio/sous-titres" )
|
|
|
|
serie_name = sys.argv[3]
|
|
|
|
parser.add_argument("-va", help="Répertoire source commun pour vidéo et audio" )
|
|
|
|
saison = sys.argv[4]
|
|
|
|
parser.add_argument("-n", "--nom", required=True, help="Nom de la série")
|
|
|
|
dest_dir = f"/media/data/reencoded/{serie_name}/Saison {saison}"
|
|
|
|
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")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Gestion de l'option commune -va
|
|
|
|
|
|
|
|
if args.va:
|
|
|
|
|
|
|
|
source_dir_1 = source_dir_2 = args.va
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
source_dir_1 = args.video
|
|
|
|
|
|
|
|
source_dir_2 = args.audio
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Vérification que les deux dossiers sont renseignés
|
|
|
|
|
|
|
|
if not source_dir_1 or not source_dir_2:
|
|
|
|
|
|
|
|
parser.error("Vous devez fournir soit -va, soit à la fois -v et -a.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
serie_name = args.nom
|
|
|
|
|
|
|
|
saison = args.saison
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Chemin de sortie
|
|
|
|
|
|
|
|
dest_dir = f"{args.dest}/{serie_name}/Saison {saison}"
|
|
|
|
Path(dest_dir).mkdir(parents=True, exist_ok=True)
|
|
|
|
Path(dest_dir).mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
|
|
|
|
|
|
for i in range(1, 31):
|
|
|
|
# Compte le nombre de fichiers dans chaque répertoire source
|
|
|
|
|
|
|
|
count1 = sum(1 for _ in Path(source_dir_1).iterdir() if _.is_file())
|
|
|
|
|
|
|
|
count2 = sum(1 for _ in Path(source_dir_2).iterdir() if _.is_file())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i in range(1, max(count1, count2) + 1):
|
|
|
|
episode = f"{i:02}"
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|