From 12cb82a07969ab5353b9969af17b2ede0949b00a Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Wed, 4 Jun 2025 18:46:58 +0200 Subject: [PATCH] Patch --- animecli.py | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/animecli.py b/animecli.py index add99bc..cfb4134 100644 --- a/animecli.py +++ b/animecli.py @@ -275,7 +275,21 @@ def handle_multi_download(stdscr, conn): # Choix de la source globale (site) sel_src, urls_par_source = choisir_source_globale(stdscr, episode_data) - selected = [False] * len(episode_data) + # Vérification des épisodes déjà présents + base_folder = Path(CONFIG["download_dir"]) / titre + saison_folder = base_folder / f"Saison {int(saison):02d}" + present = set() + if saison_folder.exists(): + for f in saison_folder.glob(f"{titre.replace(' ', '_')} - S{int(saison):02d}E*.mp4"): + m = re.search(r"S(\d{2})E(\d{2})", f.name) + if m: + ep_num = int(m.group(2)) + present.add(ep_num) + + selected = [] + for idx in range(len(episode_data)): + selected.append((idx + 1) not in present) + cursor = 0 scroll_offset = 0 @@ -311,7 +325,8 @@ def handle_multi_download(stdscr, conn): if y - 2 >= visible_lines: break mark = "[X]" if selected[idx] else "[ ]" - line = f"{mark} Épisode {idx+1}" + extra = " (Déjà téléchargé)" if (idx + 1) in present else "" + line = f"{mark} Épisode {idx+1}{extra}" if cursor == line_idx: stdscr.attron(curses.color_pair(1)) safe_addstr(stdscr, y, 2, line) @@ -344,7 +359,6 @@ def handle_multi_download(stdscr, conn): return qualite = "1080p" - base_folder = Path(CONFIG["download_dir"]) / titre download_queue = [] for idx in to_download: if idx >= len(urls_par_source): @@ -352,28 +366,33 @@ def handle_multi_download(stdscr, conn): chosen_url = urls_par_source[idx] saison_str = f"S{int(saison):02d}" ep_str = f"E{idx+1:02d}" - saison_folder = base_folder / f"Saison {int(saison):02d}" saison_folder.mkdir(parents=True, exist_ok=True) filename = f"{titre.replace(' ', '_')} - {saison_str}{ep_str}.%(ext)s" - download_queue.append((chosen_url, saison_folder, filename, qualite)) + download_queue.append((chosen_url, saison_folder, filename, qualite, idx+1)) curses.endwin() + episodes_dl = [] with concurrent.futures.ThreadPoolExecutor(max_workers=CONFIG.get("telechargements_simultanes", 2)) as executor: futures = [ executor.submit(telecharger_episode, url, folder, fname, qualite) - for url, folder, fname, qualite in download_queue + for url, folder, fname, qualite, epnum in download_queue ] - for future in concurrent.futures.as_completed(futures): + for (url, folder, fname, qualite, epnum), future in zip(download_queue, futures): success, url = future.result() if success: print(f"Téléchargement réussi: {url}") + episodes_dl.append(epnum) else: print(f"Echec téléchargement: {url}") - if to_download: - dernier_url = download_queue[-1][0] + # Mise à jour du dernier épisode téléchargé dans la DB (le plus grand numéro téléchargé) + if episodes_dl: + max_ep = max(episodes_dl) + saison_str = f"S{int(saison):02d}" + ep_str = f"E{max_ep:02d}" + last_file = f"{titre.replace(' ', '_')} - {saison_str}{ep_str}.mp4" c = conn.cursor() - c.execute("UPDATE animes SET dernier_episode = ? WHERE id = ?", (dernier_url, anime_id)) + c.execute("UPDATE animes SET dernier_episode = ? WHERE id = ?", (last_file, anime_id)) conn.commit() def curses_menu(stdscr, conn):