This commit is contained in:
CatChow0 2025-06-04 13:52:09 +02:00
parent 449dfa0ec7
commit 0ceebb5a57

View File

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