Patch
This commit is contained in:
parent
449dfa0ec7
commit
0ceebb5a57
73
animecli.py
73
animecli.py
@ -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)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user