Add TV and movie watchlist download tags
This commit is contained in:
+23
-7
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user