diff --git a/animecli.py b/animecli.py index c730196..4156a53 100644 --- a/animecli.py +++ b/animecli.py @@ -7,19 +7,49 @@ import curses import re from urllib.parse import urljoin import concurrent.futures +import configparser +import os +# Chemins par défaut DB_DIR = Path.home() / ".animecli" DB_PATH = DB_DIR / "animes.db" DOWNLOAD_DIR = Path.home() / "MesAnimes" +CONFIG_PATH = DB_DIR / "config.ini" -CONFIG = { - "vitesse_max": 0, # 0 = illimité, sinon en Ko/s - "telechargements_simultanes": 1 # Nombre de téléchargements simultanés +# Valeurs par défaut +DEFAULT_CONFIG = { + "vitesse_max": "0", + "telechargements_simultanes": "1", + "download_dir": str(DOWNLOAD_DIR), + "db_path": str(DB_PATH) } +CONFIG = {} + +def load_config(): + config = configparser.ConfigParser() + if CONFIG_PATH.exists(): + config.read(CONFIG_PATH) + if "animecli" in config: + for k, v in DEFAULT_CONFIG.items(): + CONFIG[k] = config["animecli"].get(k, v) + else: + CONFIG.update(DEFAULT_CONFIG) + else: + CONFIG.update(DEFAULT_CONFIG) + CONFIG["vitesse_max"] = int(CONFIG["vitesse_max"]) + CONFIG["telechargements_simultanes"] = int(CONFIG["telechargements_simultanes"]) + +def save_config(): + config = configparser.ConfigParser() + config["animecli"] = {k: str(v) for k, v in CONFIG.items()} + DB_DIR.mkdir(parents=True, exist_ok=True) + with open(CONFIG_PATH, "w") as f: + config.write(f) def init_db(): - DB_DIR.mkdir(parents=True, exist_ok=True) - conn = sqlite3.connect(DB_PATH) + db_path = Path(CONFIG.get("db_path", str(DB_PATH))) + db_path.parent.mkdir(parents=True, exist_ok=True) + conn = sqlite3.connect(db_path) c = conn.cursor() c.execute( """ @@ -100,7 +130,7 @@ def choisir_source(stdscr, sources_infos): elif k == curses.KEY_DOWN and sel < len(sources_infos) - 1: sel += 1 elif k in [curses.KEY_ENTER, 10, 13]: - return sel # retourne l'index choisi + return sel def extract_episode_sources(url_page): resp = requests.get(url_page) @@ -201,16 +231,15 @@ def handle_multi_download(stdscr, conn): return selected = [False] * len(episode_data) - cursor = 0 # 0 = "Tout sélectionner", 1...N = épisodes + cursor = 0 scroll_offset = 0 while True: stdscr.clear() max_y, max_x = stdscr.getmaxyx() - visible_lines = max_y - 3 # 1 ligne titre + 2 marges - total_lines = len(episode_data) + 1 # +1 pour "Tout sélectionner" + visible_lines = max_y - 3 + total_lines = len(episode_data) + 1 - # Gestion du scroll if cursor < scroll_offset: scroll_offset = cursor elif cursor >= scroll_offset + visible_lines: @@ -218,7 +247,6 @@ def handle_multi_download(stdscr, conn): stdscr.addstr(0, 0, "Sélectionnez les épisodes à télécharger (Espace pour cocher, Entrée pour valider) :") - # Affichage de la case "Tout sélectionner" tout_sel = all(selected) and len(selected) > 0 mark = "[X]" if tout_sel else "[ ]" y = 2 @@ -231,9 +259,8 @@ def handle_multi_download(stdscr, conn): safe_addstr(stdscr, y, 2, f"{mark} Tout sélectionner") y += 1 - # Affichage des épisodes visibles for idx in range(len(episode_data)): - line_idx = idx + 1 # +1 à cause de "Tout sélectionner" + line_idx = idx + 1 if line_idx < scroll_offset: continue if y - 2 >= visible_lines: @@ -256,7 +283,6 @@ def handle_multi_download(stdscr, conn): cursor += 1 elif k == ord(' '): if cursor == 0: - # (Dé)sélectionner tout new_val = not all(selected) for i in range(len(selected)): selected[i] = new_val @@ -273,7 +299,7 @@ def handle_multi_download(stdscr, conn): return qualite = "1080p" - base_folder = DOWNLOAD_DIR / titre + base_folder = Path(CONFIG["download_dir"]) / titre download_queue = [] for idx in to_download: sources, _ = episode_data[idx] @@ -306,7 +332,6 @@ def handle_multi_download(stdscr, conn): else: print(f"Echec téléchargement: {url}") - # Mise à jour du dernier épisode téléchargé if to_download: dernier_url = download_queue[-1][0] c = conn.cursor() @@ -402,7 +427,9 @@ def popup_menu(stdscr, title, options, default_sel=0): def handle_config(stdscr): options = [ f"Vitesse max: {CONFIG['vitesse_max']} KB/s (0 = illimité)", - f"Téléchargements simultanés: {CONFIG['telechargements_simultanes']}" + f"Téléchargements simultanés: {CONFIG['telechargements_simultanes']}", + f"Dossier de téléchargement: {CONFIG['download_dir']}", + f"Emplacement de la base de données: {CONFIG['db_path']}" ] sel = 0 while True: @@ -435,6 +462,17 @@ def handle_config(stdscr): if sim_idx is not None: CONFIG["telechargements_simultanes"] = int(sim_options[sim_idx]) options[1] = f"Téléchargements simultanés: {CONFIG['telechargements_simultanes']}" + elif sel == 2: + new_dir = get_input(stdscr, "Nouveau dossier de téléchargement : ") + if new_dir: + CONFIG["download_dir"] = new_dir + options[2] = f"Dossier de téléchargement: {CONFIG['download_dir']}" + elif sel == 3: + new_db = get_input(stdscr, "Nouvel emplacement de la base de données : ") + if new_db: + CONFIG["db_path"] = new_db + options[3] = f"Emplacement de la base de données: {CONFIG['db_path']}" + save_config() elif k in [ord('q'), ord('Q')]: break @@ -505,6 +543,7 @@ def safe_addstr(stdscr, y, x, text): stdscr.addstr(y, x, text[:max_x - x - 1]) def main(): + load_config() conn = init_db() curses.wrapper(setup_and_run, conn)