Script Python : Besoin d'aide pour ajuster un calcul

Gregoryen

Membre actif
Club iGen
16 Juin 2013
653
45
32
Arles
www.gregoryen.fr
Bonjour,
J'ai utilisé ChatGPT pour m'aider à créer un script python destiné à détecter les épisodes manquants dans mes séries télévisées. Le script me permet de repérer les extensions de fichiers différentes ainsi que les saisons manquantes. J'ai réalisé un test avec une série fictive que j'ai nommée "test". Dans ce dossier, j'ai enlevé l'épisode 2 de la saison 1, les épisodes 1 et 2 de la saison 2, la saison 3 entière, et les épisodes 1 et 4 de la saison 4. Voici la liste de mes fichiers :
  • test.S01E01.mkv
  • test.S01E03.mkv
  • test.S01E04.mkv
  • test.S01E05.mkv
  • test.S02E03.mkv
  • test.S02E05.mkv
  • test.S04E02.mkv
  • test.S04E03.mkv
  • test.S04E05.mkv
Le problème que je rencontre est que le script ne semble pas reconnaître que chaque saison commence forcément par l'épisode 1. En conséquence, il ne me signale pas les épisodes manquants tels que les épisodes 1 et 2 de la saison 2, ainsi que l'épisode 1 de la saison 4. Actuellement, il effectue les calculs entre le premier et le dernier fichier de chaque saison uniquement. Vous pouvez visualiser le résultat actuel dans cette capture d'écran.

Screenshot - 16-08-2023 à 00h35 03s - CleanShot - CleanShot.png

Cependant, j'ai pu constater que dans une version antérieure du code, le calcul des épisodes manquants était correct. Entretemps, j'ai apporté plusieurs modifications pour améliorer la présentation du message. Je recherche de l'aide pour adapter mon code actuel afin qu'il puisse effectuer le calcul correct des épisodes manquants tout en conservant le format d'affichage amélioré.
Pouvez-vous m'aider à résoudre ce problème ?
Merci d'avance pour votre assistance.

Je vais vous donner le code actuel suivi du code avec le bon calcul.

Voici le code actuel :
Bloc de code:
import os
import re

def verifier_episodes_dossier(dossier, nom_serie=""):
    fichiers = os.listdir(dossier)
    episodes_par_saison = {}
    fichiers_extension_diff = {}

    for fichier in fichiers:
        if fichier == ".DS_Store":
            continue  # Ignorer le fichier .DS_Store

        chemin_fichier = os.path.join(dossier, fichier)
        if os.path.isdir(chemin_fichier):
            if "Exclure" in fichier:
                print(f"\nIgnoré le dossier '{fichier}' contenant 'Exclure'")
                continue  # Ignorer le dossier avec "Exclure" dans le nom
            nouveau_nom_serie = os.path.basename(chemin_fichier)
            episodes_par_saison.update(verifier_episodes_dossier(chemin_fichier, nouveau_nom_serie))
        else:
            extension = os.path.splitext(fichier)[1]
            if extension.lower() != ".mkv":
                if nom_serie not in fichiers_extension_diff:
                    fichiers_extension_diff[nom_serie] = []
                fichiers_extension_diff[nom_serie].append(fichier)

            if fichier.endswith(".mkv"):
                # Extraire le nom de l'épisode en enlevant l'extension .mkv
                nom_episode = os.path.splitext(fichier)[0]
                
                # Recherchez le format SxxExx ou sxxexx dans le nom de l'épisode
                saison_episode_match = re.search(r"S(\d{2})E(\d{2})|s(\d{2})e(\d{2})", nom_episode)
                if saison_episode_match:
                    saison = int(saison_episode_match.group(1) or saison_episode_match.group(3))
                    episode = int(saison_episode_match.group(2) or saison_episode_match.group(4))

                    if nom_serie not in episodes_par_saison:
                        episodes_par_saison[nom_serie] = {}

                    if saison not in episodes_par_saison[nom_serie]:
                        episodes_par_saison[nom_serie][saison] = []

                    episodes_par_saison[nom_serie][saison].append(episode)
                else:
                    print(f"\nAttention : Nom de fichier non reconnu dans la série '{nom_serie}': {fichier}")

    if fichiers_extension_diff:
        print(f"\nAttention : Fichier{'s' if len(fichiers_extension_diff) > 1 else ''} avec extension différente :")
        for nom_serie, fichiers in fichiers_extension_diff.items():
            print(f"{nom_serie}:")
            for fichier in fichiers:
                print(f"{fichier}")

    return episodes_par_saison

# Chemin vers le dossier principal contenant les séries
dossier_principal = "/Users/gregoryen/Dropbox (Rémi Forest)/Images & Vidéos/Film & Séries/Séries"

# Parcourir les épisodes dans les sous-dossiers
episodes_par_serie = verifier_episodes_dossier(dossier_principal)

# Vérifier les épisodes manquants
tous_les_trous = False
for serie, saisons in episodes_par_serie.items():
    missing_seasons = []
    missing_episodes = {}
    for saison in range(1, max(saisons.keys()) + 1):
        if saison not in saisons:
            missing_seasons.append(saison)
        else:
            episodes = saisons[saison]
            episodes.sort()
            for i in range(1, len(episodes)):
                if episodes[i] - episodes[i-1] > 1:
                    if saison not in missing_episodes:
                        missing_episodes[saison] = []
                    for missing_episode in range(episodes[i-1] + 1, episodes[i]):
                        missing_episodes[saison].append(missing_episode)

    if "Exclure" in serie:
        print(f"\nIgnoré le dossier '{serie}' contenant 'Exclure'")
    if missing_seasons or missing_episodes:
        print(f"\nManquant{'s' if (len(missing_seasons) + len(missing_episodes)) != 1 else ''} dans la série '{serie}'")
        if missing_seasons:
            print(f"Saison{'s' if len(missing_seasons) != 1 else ''} manquante{'s' if len(missing_seasons) != 1 else ''} : {missing_seasons}")
        if missing_episodes:
            print(f"Épisode{'s' if sum(len(episodes) for episodes in missing_episodes.values()) > 1 else ''} manquant{'s' if sum(len(episodes) for episodes in missing_episodes.values()) > 1 else ''} :")
            for saison, episodes in missing_episodes.items():
                print(f"Saison {saison} : {episodes}")
        tous_les_trous = True

if not tous_les_trous:
    print("\nAucun trou d'épisode trouvé dans toutes les séries.")



Le code avec le bon calcul :

Bloc de code:
import os
import re

def verifier_episodes_dossier(dossier, nom_serie=""):
    fichiers = os.listdir(dossier)
    episodes_par_saison = {}

    for fichier in fichiers:
        if fichier == ".DS_Store":
            continue  # Ignorer le fichier .DS_Store

        chemin_fichier = os.path.join(dossier, fichier)
        if os.path.isdir(chemin_fichier):
            if "Exclure" in fichier:
                print(f"Ignoré le dossier '{fichier}' contenant 'Exclure'")
                continue  # Ignorer le dossier avec "Exclure" dans le nom
            nouveau_nom_serie = os.path.basename(chemin_fichier)
            episodes_par_saison.update(verifier_episodes_dossier(chemin_fichier, nouveau_nom_serie))
        else:
            extension = os.path.splitext(fichier)[1]
            if extension.lower() != ".mkv":
                print(f"Attention : Fichier avec extension différente dans la série '{nom_serie}': {fichier}")

            if fichier.endswith(".mkv"):
                # Extraire le nom de l'épisode en enlevant l'extension .mkv
                nom_episode = os.path.splitext(fichier)[0]
                
                # Recherchez le format SxxExx ou sxxexx dans le nom de l'épisode
                saison_episode_match = re.search(r"S(\d{2})E(\d{2})|s(\d{2})e(\d{2})", nom_episode)
                if saison_episode_match:
                    saison = int(saison_episode_match.group(1) or saison_episode_match.group(3))
                    episode = int(saison_episode_match.group(2) or saison_episode_match.group(4))

                    if nom_serie not in episodes_par_saison:
                        episodes_par_saison[nom_serie] = {}

                    if saison not in episodes_par_saison[nom_serie]:
                        episodes_par_saison[nom_serie][saison] = []

                    episodes_par_saison[nom_serie][saison].append(episode)
                else:
                    print(f"Attention : Nom de fichier non reconnu dans la série '{nom_serie}': {fichier}")

    return episodes_par_saison

# Chemin vers le dossier principal contenant les séries
dossier_principal = "/Users/gregoryen/Dropbox (Rémi Forest)/Images & Vidéos/Film & Séries/Séries"

# Parcourir les épisodes dans les sous-dossiers
episodes_par_serie = verifier_episodes_dossier(dossier_principal)

# Vérifier les épisodes manquants et les extensions différentes
for serie, saisons in episodes_par_serie.items():
    for saison, episodes in saisons.items():
        episodes.sort()
        missing_episodes = []

        for missing_episode in range(1, min(episodes) + 1):
            if missing_episode not in episodes:
                missing_episodes.append(missing_episode)

        for i in range(1, len(episodes)):
            if episodes[i] - episodes[i-1] > 1:
                for missing_episode in range(episodes[i-1] + 1, episodes[i]):
                    missing_episodes.append(missing_episode)

        if missing_episodes:
            print(f"Il y a des épisodes manquants dans la série '{serie}', saison {saison} : {missing_episodes}")
 
Bonjour,

Lorsque vous testez les écarts if episodes[i] - episodes[i-1] > 1, (après avoir trié la liste episodes), votre programme ne pourra pas identifier les épisodes absents qui précèdent le premier élément de cette liste.

Je crois (on n'est jamais sur de rien :) ) qu'il suffit d'ajouter, tout de suite après avoir trié votre liste episodes, tous les épisodes de 1 à episodes[0]-1 à la liste des manquants, si episodes[0] n'est pas 1. En ajoutant les 2 lignes qui suivent (entre les # ----), le programme retourne les résultats attendus.

Python:
          ...
          episodes = saisons[saison]
          episodes.sort()
          #---------------------------------------------
          if episodes[0] != 1:
              missing_episodes[saison] = [ajout for ajout in range(1,episodes[0])]
          #---------------------------------------------
          for i in range(1, len(episodes)):
              if episodes[i] - episodes[i-1] > 1:
              ...
 
Dernière édition:
  • J’adore
Réactions: Gregoryen
Oh merci beaucoup ! C'est la toute dernière chose qui manquait maintenant tout fonctionne ! Tu es au top ! :)
En parlant avec GPT je lui disais de commencer à l'épisode 0 mais après j'avais surement mal formulé et il fessait n'importe quoi. Mais il m'a quand même fait tout le reste.
 
Oh merci beaucoup ! C'est la toute dernière chose qui manquait maintenant tout fonctionne !
Heureux d'avoir pu aider.
Cependant, ça dit ce qu'il manque en supposant que le dernier épisode de la saison est présent dans le dossier. Par exemple, si le dernier épisode disponible de la saison 3 est l'épisode 8, et que le dernier épisode présent dans le dossier est test.S03E06, il va trouver tous les manquants qui précède cet épisode.