diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aa87c4..d8ce129 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.1.2 - 2026-05-11 + +- Updated finalized download layout to save media under `ANI_CLI_DOWNLOAD_DIR/anime_name/Season /`. + ## 0.1.1 - 2026-05-11 - Expanded `.gitignore` to ignore `__pycache__` directories at every project depth. diff --git a/README.md b/README.md index 2bb0656..ade2d24 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A small local web UI for a system-wide `ani-cli` install. -Current version: `0.1.1` +Current version: `0.1.2` ## Project Layout @@ -32,7 +32,7 @@ The app searches anime, queues downloads, supports original or dubbed mode, qual Downloads are staged in the web app state directory first. After `ani-cli` finishes, the wrapper moves them into a Plex/Jellyfin-friendly layout: ```text -ANI_CLI_DOWNLOAD_DIR/anime_name/anime_name - S01E01.mp4 +ANI_CLI_DOWNLOAD_DIR/anime_name/Season /anime_name - S01E01.mp4 ``` ## Configuration diff --git a/VERSION b/VERSION index 17e51c3..d917d3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1 +0.1.2 diff --git a/app.py b/app.py index a0f1b9d..0156ca3 100644 --- a/app.py +++ b/app.py @@ -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.1.1" +VERSION = "0.1.2" ALLANIME_BASE = "allanime.day" ALLANIME_API = f"https://api.{ALLANIME_BASE}" ALLANIME_REFERER = "https://allmanga.to" @@ -449,7 +449,8 @@ def normalize_season(value): def job_output_dir(job): - return Path(job["download_dir"]).expanduser() / sanitize_path_component(job.get("anime_name") or job.get("title")) + anime_name = sanitize_path_component(job.get("anime_name") or job.get("title")) + return Path(job["download_dir"]).expanduser() / anime_name / f"Season {job.get('season') or '1'}" def job_staging_dir(job): @@ -1194,7 +1195,8 @@ INDEX_HTML = r""" item.querySelector(".job-title").textContent = job.title; const libraryName = job.anime_name || job.title; const season = String(job.season || "1").padStart(2, "0"); - const target = job.target_dir || `${job.download_dir}/${libraryName}`; + const seasonFolder = `Season ${job.season || "1"}`; + const target = job.target_dir || `${job.download_dir}/${libraryName}/${seasonFolder}`; item.querySelector(".job-head .muted").textContent = `${libraryName} · S${season} · ${job.mode} · ${job.quality} · episodes ${job.episodes} · ${target}`; const status = item.querySelector(".status");