Add TV and movie watchlist download tags

This commit is contained in:
Dymas
2026-05-25 16:53:24 +02:00
parent 1487257bed
commit 139d7d9e2f
10 changed files with 197 additions and 23 deletions
+23 -7
View File
@@ -20,7 +20,7 @@ from uuid import uuid4
PROJECT_ROOT = Path(__file__).resolve().parent
ANI_CLI = os.environ.get("ANI_CLI_BIN") or shutil.which("ani-cli") or "ani-cli"
APP_NAME = "ani-cli-web"
VERSION = "0.41.0"
VERSION = "0.42.0"
ALLANIME_BASE = "allanime.day"
ALLANIME_API = f"https://api.{ALLANIME_BASE}"
ALLANIME_REFERER = "https://allmanga.to"
@@ -35,6 +35,7 @@ DEBUG_MODE = False
QUALITY_CHOICES = {"best", "1080", "1080p", "720", "720p", "480", "480p", "360", "360p", "worst"}
MODE_CHOICES = {"sub", "dub"}
MEDIA_TYPE_CHOICES = {"tv", "movie"}
WATCHLIST_CATEGORY_LABELS = {
"watching": "Watching",
"planned": "Planned",
@@ -695,9 +696,18 @@ def normalize_season(value):
return str(number)
def normalize_media_type(value, default="tv"):
media_type = str(value or default).strip().lower()
return media_type if media_type in MEDIA_TYPE_CHOICES else default
def job_output_dir(job):
anime_name = sanitize_path_component(job.get("anime_name") or job.get("title"))
return Path(job["download_dir"]).expanduser() / anime_name / f"Season {season_label(job)}"
media_type = normalize_media_type(job.get("media_type"))
library_root = Path(job["download_dir"]).expanduser() / media_type / anime_name
if media_type == "movie":
return library_root
return library_root / f"Season {season_label(job)}"
def job_staging_dir(job):
@@ -738,6 +748,7 @@ def finalize_library_files(job):
staging_dir = job_staging_dir(job)
target_dir = job_output_dir(job)
library_name = sanitize_path_component(job.get("anime_name") or job.get("title"))
media_type = normalize_media_type(job.get("media_type"))
season = season_label(job)
target_dir.mkdir(parents=True, exist_ok=True)
files = sorted(
@@ -750,11 +761,14 @@ def finalize_library_files(job):
moved = []
fallback_episode = 1
for source in files:
ep = extract_episode_from_filename(source)
if ep is None:
ep = str(fallback_episode)
fallback_episode += 1
final_name = f"{library_name} - S{season}E{episode_label(ep)}{source.suffix}"
if media_type == "movie":
final_name = f"{library_name}{source.suffix}"
else:
ep = extract_episode_from_filename(source)
if ep is None:
ep = str(fallback_episode)
fallback_episode += 1
final_name = f"{library_name} - S{season}E{episode_label(ep)}{source.suffix}"
destination = unique_destination(target_dir / final_name)
shutil.move(str(source), str(destination))
moved.append(str(destination))
@@ -784,6 +798,7 @@ def build_job(payload, config):
mode = str(payload.get("mode") or config["mode"]).lower()
quality = str(payload.get("quality") or config["quality"]).lower()
download_dir = str(payload.get("download_dir") or config["download_dir"]).strip()
media_type = normalize_media_type(payload.get("media_type"), default="tv")
if mode not in MODE_CHOICES:
raise ValueError("Mode must be sub or dub")
if quality not in QUALITY_CHOICES:
@@ -794,6 +809,7 @@ def build_job(payload, config):
"show_id": str(payload.get("show_id") or "").strip(),
"title": title,
"anime_name": anime_name,
"media_type": media_type,
"season": normalize_season(payload.get("season")),
"query": query,
"result_index": index,