575 lines
41 KiB
Markdown
575 lines
41 KiB
Markdown
# Changelog
|
|
|
|
## 0.45.3 - 2026-05-25
|
|
|
|
- Improved queue failure handling for no-op `ani-cli` runs: when the command exits successfully but downloads no files, the job now fails with a clear message explaining that nothing was downloaded and the empty staging folder is cleaned up.
|
|
|
|
## 0.45.2 - 2026-05-25
|
|
|
|
- Fixed watchlist completion so a successful partial dub or sub download no longer moves a TV series to `Finished`; the category now changes only when the downloaded mode has every expected episode both available and downloaded.
|
|
- Fixed Jellyfin TV handoff to use that same mode-aware completion rule, preventing partial dub libraries such as `8/12` from being moved early.
|
|
|
|
## 0.45.1 - 2026-05-25
|
|
|
|
- Expanded the `download_completed` Discord webhook so it includes the full saved file list instead of only the first few paths, splitting the list across extra embeds when needed.
|
|
- Added `jellyfin_sync_success` and `jellyfin_sync_failed` Discord webhook events for finished-library handoffs, with success and actionable failure notifications emitted from Jellyfin moves.
|
|
|
|
## 0.45.0 - 2026-05-25
|
|
|
|
- Added an optional per-anime auto-download episode offset for split-part seasons, so queued watchlist downloads can rename files as `S02E13`, `S02E14`, and onward while still downloading the underlying source episodes normally.
|
|
- Added a migration-safe `auto_download_offset` watchlist column, exposed it in the watchlist auto-download editor, and applied it to both manual watchlist `Download all` jobs and automatic watchlist episode downloads.
|
|
|
|
## 0.44.1 - 2026-05-25
|
|
|
|
- Limited bulk watchlist refreshes to entries marked `Watching` or `Planned`, so manual `Refresh All` runs and scheduled refreshes skip `Finished` and `Dropped` shows.
|
|
|
|
## 0.44.0 - 2026-05-25
|
|
|
|
- Added host filesystem browse buttons to the Config page path fields so default download and Jellyfin library folders can be selected from a built-in browser modal instead of typed manually.
|
|
- Added an authenticated `/api/fs/browse` endpoint for directory and file browsing to support the new host path picker workflow.
|
|
|
|
## 0.43.0 - 2026-05-25
|
|
|
|
- Added a Jellyfin section on the Config page with enable or disable control, separate TV and movie destination folders, and a manual `Run now` handoff trigger.
|
|
- Added automatic Jellyfin handoff for completed watchlist entries, moving TV libraries only once the show is finished and fully downloaded in at least one language, while downloaded movies move into the configured Jellyfin movie library.
|
|
|
|
## 0.42.0 - 2026-05-25
|
|
|
|
- Added a watchlist `TV` or `Movie` media tag with a migration-safe SQLite update for existing installs, plus Search and Watchlist controls to set or change that tag.
|
|
- Changed completed library layout so TV downloads now go under `.../tv/<anime>/Season NN/...`, while movie-tagged entries go under `.../movie/<anime>/<anime>.ext` without season-style folders or episode naming.
|
|
|
|
## 0.41.0 - 2026-05-25
|
|
|
|
- Replaced the shared remote-access token flow with a classic single-user username/password login, backed by a persistent signed session cookie for browser sessions and HTTP Basic auth for API clients.
|
|
- Added `ANI_CLI_WEB_AUTH_USERNAME` and `ANI_CLI_WEB_AUTH_PASSWORD` support plus matching `config.json` fields, while keeping those private auth fields out of the public config API so the web UI does not leak or overwrite them.
|
|
|
|
## 0.40.6 - 2026-05-25
|
|
|
|
- Fixed the Config page `Dependencies` panel so it stretches across the full settings width, centered its dependency badges, and added the installed `ani-cli` version to the runtime info block.
|
|
|
|
## 0.40.5 - 2026-05-25
|
|
|
|
- Moved the Config page `Dependencies` panel to the top as a full-width card and changed the remaining settings panels to a two-column layout that collapses back to one column at `1080px` and below.
|
|
|
|
## 0.40.4 - 2026-05-25
|
|
|
|
- Widened the watchlist auto-download modal layout so `Name source` and `Name` each fill half of the dialog row instead of staying in narrow grid cells.
|
|
|
|
## 0.40.3 - 2026-05-25
|
|
|
|
- Passed the Search page `Season` value into new watchlist entries so the initial auto-download series setting matches what was chosen before tracking the show.
|
|
|
|
## 0.40.2 - 2026-05-25
|
|
|
|
- Replaced the inline `Alternative titles` expansion with a centered overlay dialog so opening AniDB title variants no longer shifts the watchlist layout.
|
|
|
|
## 0.40.1 - 2026-05-25
|
|
|
|
- Replaced the per-card auto-download expansion with a centered overlay dialog so opening settings no longer shifts the watchlist grid layout.
|
|
|
|
## 0.40.0 - 2026-05-25
|
|
|
|
- Added per-watchlist storage for downloaded sub and dub episode lists so auto-download can compare actual downloaded history instead of only refresh count deltas.
|
|
- Changed auto-download to queue any available episodes that are still missing after a later manual or scheduled refresh, including backlog episodes that existed before tracking started.
|
|
|
|
## 0.39.1 - 2026-05-25
|
|
|
|
- Replaced the auto-download name datalist with an explicit dropdown that lists the current title, AniDB alternative titles, and a `Custom` option.
|
|
- Added a per-anime `Series` field to auto-download settings so queued episodes can target a chosen series/season number instead of always using `1`.
|
|
|
|
## 0.39.0 - 2026-05-25
|
|
|
|
- Added watchlist auto-download support with global Config controls plus per-anime mode, quality, and library-name settings hidden behind a card-level editor.
|
|
- Limited auto-download to `Watching` entries after later manual or scheduled refreshes, and only queue episodes that are newly discovered and not already pending or downloaded.
|
|
|
|
## 0.38.0 - 2026-05-25
|
|
|
|
- Switched watchlist `Alternative titles` from AniList lookups to AniDB title-dump matching and now keep only English alternate titles.
|
|
- Reused the cached AniDB title metadata already present in the app, which makes alternate-title matching more predictable for watchlist refreshes.
|
|
|
|
## 0.37.0 - 2026-05-25
|
|
|
|
- Added an `Alternative titles` toggle to every watchlist card so AniList title variants can be expanded inline.
|
|
- Cached AniList title matches during watchlist refreshes and stored Romaji, English, Native, and synonym titles in SQLite with a migration-safe schema update for existing installs.
|
|
|
|
## 0.36.3 - 2026-05-24
|
|
|
|
- Changed the Queue page to stop re-rendering the full job list on every poll and refresh only visible non-terminal job cards in place.
|
|
- Added single-job queue reads so active job logs and status can update every 2.5 seconds while `done`, `failed`, and `canceled` jobs stop polling automatically.
|
|
|
|
## 0.36.2 - 2026-05-23
|
|
|
|
- Replaced the watchlist `Download all` text prompt with an inline dropdown-style picker that lets you choose `Sub` or `Dub` directly on the card.
|
|
|
|
## 0.36.1 - 2026-05-23
|
|
|
|
- Replaced the first-visit remote-access 403 dead end with a browser sign-in page and persistent auth cookie, so remote users no longer need to know the `?token=...` bootstrap URL format up front.
|
|
|
|
## 0.36.0 - 2026-05-23
|
|
|
|
- Replaced the watchlist card `Open` action with `Download all`, which prompts for `sub` or `dub` and then queues all currently available episodes directly from the watchlist.
|
|
|
|
## 0.35.2 - 2026-05-23
|
|
|
|
- Made queue job cards collapsible and defaulted finished jobs to collapsed so long queue histories take less space while running and pending jobs stay expanded.
|
|
|
|
## 0.35.1 - 2026-05-23
|
|
|
|
- Changed the shared sidebar navigation to a vertical one-link-per-line stack so the menu stays balanced after adding the dedicated Queue page.
|
|
|
|
## 0.35.0 - 2026-05-22
|
|
|
|
- Split the download queue out of the Search page into a dedicated `/queue` page so searching and queue management are separate workflows.
|
|
- Added a Queue navigation tab and moved queue polling, logs, paging, retry, cancel, and finished-job cleanup controls onto the new page.
|
|
|
|
## 0.34.0 - 2026-05-21
|
|
|
|
- Added a Discord webhook notification event for completed downloads so successful queue jobs can report the resolved anime title, saved files, and cached thumbnail.
|
|
- Fixed watchlist download sync so successfully downloaded series are moved into the `Finished` category instead of staying in `Watching`, `Planned`, or another earlier category.
|
|
|
|
## 0.33.1 - 2026-05-21
|
|
|
|
- Updated the Docker image build to install `yt-dlp` directly from the latest upstream GitHub release and verify the binary during the image build.
|
|
|
|
## 0.33.0 - 2026-05-21
|
|
|
|
- Added Discord webhook notifications with Config page controls for the webhook URL, selectable notification events, and a one-click test action.
|
|
- Added refresh result notifications that report each anime with newly found episodes, including cached thumbnails plus current sub and dub counts.
|
|
- Added Discord notifications for refresh failures, interrupted refresh runs, and unexpected runtime errors so background problems are easier to notice without watching the web UI.
|
|
|
|
## 0.32.5 - 2026-05-17
|
|
|
|
- Fixed the green ready-border highlight so it applies to any watchlist card with both subbed and dubbed episodes complete, instead of only cards filed under the `Finished` category.
|
|
|
|
## 0.32.4 - 2026-05-17
|
|
|
|
- Highlighted fully ready finished watchlist entries with a thin green card border when both subbed and dubbed episodes are complete, making download-complete anime easier to scan quickly.
|
|
|
|
## 0.32.3 - 2026-05-17
|
|
|
|
- Fixed watchlist download sync so a successful download now reuses the existing tracked entry when the resolved `show_id` changes, preserving its category and marking it downloaded instead of creating a duplicate finished-only row.
|
|
|
|
## 0.32.2 - 2026-05-17
|
|
|
|
- Changed Search page queue log rendering to show the newest lines first instead of oldest-first.
|
|
|
|
## 0.32.1 - 2026-05-17
|
|
|
|
- Suppressed stdout request logging for routine polling endpoints such as `/api/queue` and `/api/watchlist/refresh-status`, reducing noisy access-log spam during normal browser use.
|
|
|
|
## 0.32.0 - 2026-05-17
|
|
|
|
- Changed bulk `Refresh All` processing to pace requests with a configurable delay between shows, reducing the chance of flooding upstream episode sources on large watchlists.
|
|
- Added a Config page setting for the per-show bulk refresh delay and expanded regression coverage for the new config field and pacing behavior.
|
|
|
|
## 0.31.1 - 2026-05-17
|
|
|
|
- Added stdout lifecycle logging for scheduled watchlist refresh jobs so container logs now show when a scheduled run is queued, starts, finishes successfully, finishes with errors, gets interrupted, or fails.
|
|
|
|
## 0.31.0 - 2026-05-17
|
|
|
|
- Added scheduled background watchlist refresh support so the app can periodically recheck episode counts for tracked anime.
|
|
- Added Config page controls for enabling or disabling the scheduled refresh and setting the refresh period in minutes.
|
|
- Reused the existing background `Refresh All` worker for scheduled runs and expanded regression coverage for the new config fields and scheduler timing behavior.
|
|
|
|
## 0.30.4 - 2026-05-17
|
|
|
|
- Added browser-friendly remote auth bootstrap: remote users can open the app once with `?token=...`, the server stores the token in an HTTP-only cookie, and then strips the token back out of the URL with a redirect.
|
|
- Kept existing remote header auth support for API clients while extending regression coverage for cookie, query-token, and bootstrap redirect access.
|
|
|
|
## 0.30.3 - 2026-05-17
|
|
|
|
- Fixed container startup under `docker-compose` and custom `USER_UID`/`USER_GID` mappings by launching the web app with `python3 /app/app.py` directly instead of relying on the `./ani-cli-web` launcher file being executable inside the container.
|
|
|
|
## 0.30.2 - 2026-05-17
|
|
|
|
- Added container runtime support for `USER_UID` and `USER_GID`, letting `ani-cli-web` run under a chosen numeric host user/group so files created in mounted folders are not owned by `root`.
|
|
- Updated the Docker and Compose documentation to show how to pass host UID/GID values into the container.
|
|
|
|
## 0.30.1 - 2026-05-17
|
|
|
|
- Added a `docker-compose.yaml` file that builds the bundled Docker image, mounts `./downloads` and `./.ani-cli-web`, and exposes the ani-cli git remotes, branch, and startup flags through Compose environment defaults.
|
|
- Documented the Compose workflow alongside the existing Docker build and `docker run` setup.
|
|
|
|
## 0.30.0 - 2026-05-17
|
|
|
|
- Added a Docker image build that clones `ani-cli` and `ani-cli-web` from configurable git remotes, installs `ani-cli` system-wide, and starts `ani-cli-web` from `/app`.
|
|
- Added container startup support for `UPDATE_ON_START=true`, which runs `sudo ani-cli --update` before launching the web app.
|
|
- Documented the Docker build arguments, runtime mounts for `./downloads` and `./.ani-cli-web`, and the default container networking and storage layout.
|
|
|
|
## 0.29.5 - 2026-05-16
|
|
|
|
- Fixed `/api/config` malformed-body handling so non-object JSON payloads now return `400 Bad Request` instead of silently resetting saved settings to defaults.
|
|
- Expanded regression coverage for invalid config payload shapes.
|
|
|
|
## 0.29.4 - 2026-05-16
|
|
|
|
- Fixed `/api/watchlist/add` malformed-body handling so non-object JSON payloads now return `400 Bad Request` instead of surfacing as an internal server error.
|
|
- Expanded regression coverage for invalid watchlist add payload shapes.
|
|
|
|
## 0.29.3 - 2026-05-16
|
|
|
|
- Fixed duplicate watchlist add responses so already-tracked shows now return `200 OK` with `created: false` instead of the misleading `201 Created`.
|
|
- Tightened `/api/watchlist/ensure-thumbnails` request validation so `show_ids` must be a JSON array and `force` is parsed as a real boolean value instead of relying on Python truthiness.
|
|
- Expanded regression coverage for duplicate watchlist add status handling and thumbnail warm-up payload validation.
|
|
|
|
## 0.29.2 - 2026-05-16
|
|
|
|
- Hardened the download queue again so unexpected post-launch worker exceptions now fail the active job cleanly instead of killing the worker thread and leaving the job stuck in `running`.
|
|
- Fixed malformed JSON POST handling for watchlist action routes so missing required fields such as `show_id` and `data_url` now return `400 Bad Request` instead of surfacing as misleading `404 Not Found` errors.
|
|
- Expanded regression coverage for post-launch queue worker failures and required-field validation on watchlist POST endpoints.
|
|
|
|
## 0.29.1 - 2026-05-16
|
|
|
|
- Hardened download queue startup so a failed `ani-cli` process launch now marks the job as failed instead of crashing the background queue worker thread.
|
|
- Cleaned up per-job staging directories after canceled and failed download runs, preventing partial artifacts from piling up under `.ani-cli-web/staging/`.
|
|
- Fixed thumbnail refresh fallback flow so stale stored AnimeSchedule routes and AniDB IDs now continue on to title-based lookups instead of aborting the whole cover refresh attempt early.
|
|
- Expanded regression coverage for queue startup failures, failed-download staging cleanup, and stale thumbnail source fallback behavior.
|
|
|
|
## 0.29.0 - 2026-05-16
|
|
|
|
- Fixed watchlist thumbnail retry backoff so failed automatic cover lookups now record a retry timestamp and stop hammering AnimeSchedule or AniDB on every later warm-up pass.
|
|
- Hardened queued-download fallback matching to keep season and part identity intact while still accepting equivalent season notation such as `2nd Season` and `Season 2`.
|
|
- Made paged watchlist responses clamp out-of-range page requests before fetching rows, keeping the reported `page` value aligned with the returned `items`.
|
|
- Expanded regression coverage for thumbnail backoff persistence, season-aware fallback matching, and out-of-range watchlist pagination.
|
|
|
|
## 0.28.0 - 2026-05-16
|
|
|
|
- Bounded watchlist refresh network calls with a shorter dedicated timeout and matched worker-shutdown grace period, making per-show and bulk watchlist teardown behavior more predictable when upstream services are slow.
|
|
- Improved completed-download watchlist sync failures by preserving the fallback resolution reason and surfacing it in logs and raised errors instead of collapsing everything into one generic unresolved `show_id` message.
|
|
- Continued the backend split by moving shared title-normalization and title-query helpers into a dedicated `title_matching.py` module.
|
|
- Tightened the shared browser polling helper so it uses serial `setTimeout` scheduling plus unload cleanup.
|
|
- Expanded regression coverage for bounded watchlist refresh timeouts, clearer fallback-match failures, and the updated poll-helper cleanup behavior.
|
|
|
|
## 0.27.0 - 2026-05-15
|
|
|
|
- Made runtime reset stricter by refusing to clear the global runtime state when background workers do not stop cleanly, preventing stale workers from outliving the runtime instance they came from.
|
|
- Taught per-show watchlist refreshes to stop earlier during shutdown by checking the refresh stop flag before committing later update stages.
|
|
- Marked bulk watchlist refresh jobs as `interrupted` when shutdown interrupts them instead of letting them look like a normal successful completion.
|
|
- Hardened the completed-download watchlist sync fallback so it only trusts a fallback search result when the queued title still matches confidently, failing safe instead of risking the wrong anime being marked downloaded.
|
|
- Reworked the shared browser polling helper to use serial `setTimeout` polling with unload cleanup instead of a bare repeating interval.
|
|
- Continued the backend split by moving queued-download watchlist identity resolution into a dedicated `watchlist_identity.py` helper module.
|
|
- Expanded regression coverage for interrupted resets, interrupted bulk watchlist refresh jobs, safer watchlist identity fallback behavior, and browser poll helper cleanup.
|
|
|
|
## 0.26.0 - 2026-05-15
|
|
|
|
- Made controlled runtime shutdown stricter by canceling active download workers during blocking teardown paths such as app exit and runtime reset, reducing the chance of orphaned background work outliving the server.
|
|
- Hardened watchlist thumbnail warm-up batches so shows removed mid-request are skipped cleanly instead of bubbling a stale lookup back as a route error.
|
|
- Added shared serial browser polling helpers and switched the Search and Watchlist pages to use them, preventing overlapping queue and watchlist poll requests from stacking up when the server responds slowly.
|
|
- Improved background refresh diagnostics by logging per-show worker failures and preserving the last bulk-refresh item error in refresh-job state.
|
|
- Expanded regression coverage for deterministic download-queue shutdown, removed-entry thumbnail warm-up handling, shutdown-on-exit behavior, and shared serial polling usage in page templates.
|
|
|
|
## 0.25.0 - 2026-05-15
|
|
|
|
- Stopped the watchlist page from repeatedly rewarming the same unresolved thumbnails during silent queued-refresh polling by caching per-show warm-up attempts in the browser until thumbnail state changes.
|
|
- Made background `Refresh All` lighter and faster by skipping inline thumbnail downloads during bulk refreshes and refreshing multiple watchlist shows in parallel.
|
|
- Taught per-show refreshes to bail out quietly when a show disappears mid-refresh, avoiding stale watchlist writes and extra thumbnail work after removal.
|
|
- Woke waiting thumbnail resolvers immediately when a show is removed, so stale in-flight cover waits no longer sit on the timeout path.
|
|
- Expanded regression coverage for thumbnail warm-up deduplication, bulk refresh thumbnail skipping, thumbnail wait cleanup, and removed-entry handling during background refresh jobs.
|
|
|
|
## 0.24.0 - 2026-05-15
|
|
|
|
- Moved single-item watchlist refresh requests onto the existing per-show background refresh queue instead of doing episode, AnimeSchedule, and thumbnail work synchronously in the request handler.
|
|
- Added queued-item counts to watchlist listing responses and taught the watchlist page to silently refresh itself while queued per-show refresh work is still draining.
|
|
- Cleared removed shows out of the in-memory per-show refresh queue and in-flight tracking sets so deleted entries no longer consume stale queued refresh work.
|
|
- Expanded regression coverage for queued watchlist counts, queued single-item refreshes, queued refresh removal cleanup, and watchlist-page queued polling behavior.
|
|
|
|
## 0.23.0 - 2026-05-15
|
|
|
|
- Fixed the per-show watchlist refresh queue so a show already being refreshed is no longer re-enqueued while its refresh is still in flight.
|
|
- Added regression coverage for in-flight watchlist refresh deduplication and cleanup of the in-flight marker after refresh completion.
|
|
|
|
## 0.22.0 - 2026-05-15
|
|
|
|
- Added explicit runtime shutdown and reset hooks so shared globals and background workers can be torn down cleanly between in-process runs and tests.
|
|
- Fixed deferred worker startup to keep respecting `ANI_CLI_WEB_DISABLE_WORKER`, preventing runtime-backed handler calls from silently enabling background workers in worker-disabled environments.
|
|
- Split download-queue persistence into structured SQLite columns plus a separate log column, leaving JSON payload storage only for extra fields instead of rewriting the whole job record on routine state changes.
|
|
- Reduced server-side exception noise by only printing full tracebacks in debug mode.
|
|
- Centralized the shared browser `api()` fetch helper used by the Search, Config, and Watchlist pages.
|
|
- Expanded regression coverage for runtime reset, worker-disable behavior, structured queue persistence, and the quieter exception path.
|
|
|
|
## 0.21.0 - 2026-05-15
|
|
|
|
- Persisted the per-show watchlist refresh queue across restarts by rebuilding pending refresh work from watchlist rows still marked `queued` during runtime startup.
|
|
- Preserved queued refresh ordering during restart recovery so older queued watchlist items resume before newer ones.
|
|
- Added regression coverage for queued watchlist refresh restoration after restart.
|
|
|
|
## 0.20.0 - 2026-05-15
|
|
|
|
- Replaced the HTTP handler's old mutable string-key service locator with an explicit configured handler context, making route dependencies clearer and surfacing wiring issues at startup time instead of during later requests.
|
|
- Moved watchlist add and successful-download sync off the hot request path by queueing per-show background refresh work instead of doing episode, AnimeSchedule, and thumbnail fetches synchronously before the request returns.
|
|
- Ensured runtime-backed HTTP requests start background workers when allowed, while still respecting `ANI_CLI_WEB_DISABLE_WORKER` in tests and intentionally worker-free runs.
|
|
- Expanded regression coverage for the new non-blocking watchlist add/download-sync flow.
|
|
|
|
## 0.19.0 - 2026-05-15
|
|
|
|
- Guarded Search-page queue polling against stale out-of-order responses so an older refresh result no longer overwrites a newer queue state.
|
|
- Added `get_cached_anidb_titles()` and switched AniDB lookup to reuse the cached parsed title list directly instead of rebuilding a duplicate list on every fallback lookup.
|
|
- Expanded regression coverage for the queue freshness guard and AniDB cache reuse path.
|
|
|
|
## 0.18.0 - 2026-05-15
|
|
|
|
- Removed the eager runtime bootstrap from `main()`, so server startup no longer forces migrations, DB setup, worker startup, and config writes before the first runtime-backed request.
|
|
- Batched queue log persistence so running downloads no longer rewrite the entire job payload into SQLite on every single output line.
|
|
- Added regression coverage for lazy startup and queue log batching.
|
|
|
|
## 0.17.0 - 2026-05-15
|
|
|
|
- Tightened the remote-access guard so loopback reverse-proxy traffic with forwarded external client IPs no longer bypasses the non-local token requirement.
|
|
- Stopped mutating the shared runtime config dict in place; queue creation now reads a stable config snapshot and config saves replace the runtime config atomically.
|
|
- Reduced cheap-route startup overhead by serving page shells, `/api/version`, `/api/dependencies`, and `/api/config` without forcing a full runtime bootstrap first.
|
|
- Added request-order guards on the Search and Watchlist pages so slower stale responses no longer overwrite newer searches, result selections, or category/page switches.
|
|
- Added AniDB title lookup caching and indexed candidate narrowing, while preserving a full-scan fallback when narrowed candidates miss.
|
|
- Expanded regression coverage for forwarded-client access checks and config snapshot behavior.
|
|
|
|
## 0.16.0 - 2026-05-15
|
|
|
|
- Hardened non-local access so `ANI_CLI_WEB_ALLOW_REMOTE=1` now also requires `ANI_CLI_WEB_REMOTE_TOKEN`, accepted through `Authorization: Bearer ...` or `X-AniCli-Web-Token`, before remote clients can use the web UI or JSON APIs.
|
|
- Removed import-time state migration side effects from `app_support.py`; legacy state migration now runs during runtime bootstrap instead of plain module import.
|
|
- Narrowed watchlist persistence updates so refreshes, category changes, and download-sync writes stop rewriting the full row and are less likely to clobber unrelated fields.
|
|
- Resolve missing queue `show_id` values when jobs are queued, making completed-download watchlist sync stable even if upstream search ordering changes later.
|
|
- Continued the backend split by moving queue workers into `queue_jobs.py`, HTTP routing into `http_handler.py`, and page bodies into `search_page.py`, `config_page.py`, and `watchlist_page.py`, while keeping `app.py` and `web_templates.py` as stable aggregation entrypoints.
|
|
- Hardened the shared frontend `api()` helpers so page scripts handle non-JSON error responses more gracefully and only send JSON content headers when a request body is present.
|
|
- Expanded regression coverage for the new remote token gate and queue identity enrichment path.
|
|
|
|
## 0.15.0 - 2026-05-15
|
|
|
|
- Started the backend/module split by moving shared runtime, state-path, config, and queue/file helper logic out of `app.py` into `app_support.py`.
|
|
- Split shared page-shell helpers out of `web_templates.py` into `template_helpers.py`, so page templates no longer carry their own navigation/branding helpers inline.
|
|
- Kept `app.py` and `web_templates.py` as stable aggregation points so the current tests and imports continue to work while the rest of the modularization can happen in smaller follow-up steps.
|
|
|
|
## 0.14.0 - 2026-05-15
|
|
|
|
- Added watchlist categories with separate `Watching`, `Planned`, `Finished`, and `Dropped` tabs, category-aware add forms, and in-card category editing for existing entries.
|
|
- Migrated existing watchlist rows into the `Watching` category by default so older tracked shows keep working without manual cleanup.
|
|
- Added finished-state check badges: finished anime that were downloaded now show a green check, while anime moved into `Finished` manually show a gray check.
|
|
- Automatically sync successful downloads into the watchlist by flagging tracked shows as downloaded and creating a new `Finished` entry when the show was not already tracked.
|
|
|
|
## 0.13.0 - 2026-05-15
|
|
|
|
- Added AnimeSchedule-backed watchlist metadata refresh so tracked shows now store the expected total episode count and upstream airing status alongside the live AllAnime sub and dub availability counts.
|
|
- Marked watchlist episode pills with `current / total` progress when the total is known, and highlight `Sub` or `Dub` in green when that release track has fully finished airing and is ready for download.
|
|
- Added compact watchlist status tags such as `Finished`, `Sub ready`, and `Dub ready`, plus regression coverage for the new completion-state persistence and messaging.
|
|
|
|
## 0.12.0 - 2026-05-13
|
|
|
|
- Deferred runtime initialization until the server starts or a runtime-backed API/helper is first used, removing the earlier worker/thread startup and state writes from plain module import.
|
|
- Persisted watchlist refresh history in SQLite, restore interrupted `pending` and `running` refresh jobs as `interrupted` after restart, and block duplicate queued refresh submissions.
|
|
- Hardened thumbnail in-flight event cleanup so unexpected errors during cache updates do not leave later requests waiting on a stuck per-show event.
|
|
- Return `400 Bad Request` for non-UTF-8 JSON payloads instead of surfacing them as internal server errors.
|
|
- Expanded regression coverage for deferred bootstrap, duplicate refresh protection, interrupted refresh recovery, UTF-8 body validation, and thumbnail event cleanup.
|
|
|
|
## 0.11.0 - 2026-05-13
|
|
|
|
- Moved the large inline page templates and shared page-shell helpers into `web_templates.py`, reducing `app.py` to server and runtime logic.
|
|
- Changed the shared SQLite file from `queue.sqlite3` to `state.sqlite3` and added automatic migration from the previous project-local database filename.
|
|
- Made watchlist poster image routes cache-only so opening the watchlist no longer fans out synchronous remote cover lookups from the browser image tags.
|
|
- Moved `Refresh All` onto a background watchlist-refresh worker with status polling so large watchlists no longer block a request thread until every show finishes updating.
|
|
- Added an HTTP JSON body-size guard to reject oversized uploads before the server reads unbounded request bodies into memory.
|
|
- Reworked the test harness to run against an isolated temporary state root and added handler-level coverage for thumbnail serving, background refresh status, and oversized POST rejection.
|
|
|
|
## 0.10.0 - 2026-05-13
|
|
|
|
- Fixed running-job cancellation so the worker now consistently finishes canceled downloads as `canceled` instead of drifting into failed or completed final states.
|
|
- Fixed watchlist `Refresh All` to iterate every tracked show instead of silently stopping at the paged list limit.
|
|
- Added loopback-only request protection by default, with `ANI_CLI_WEB_ALLOW_REMOTE=1` available when remote/LAN access is intentionally desired.
|
|
- Extracted shared sidebar branding and page-link helpers to reduce repeated inline page chrome across Search, Config, and Watchlist.
|
|
- Added focused regression tests for cancellation propagation, full watchlist refresh coverage, local-access helpers, and shared template helpers.
|
|
|
|
## 0.9.0 - 2026-05-13
|
|
|
|
- Reworked Search, Config, and Watchlist with a Tsuki-inspired visual refresh using violet accents, glassy surfaces, softer gradients, and calmer card styling.
|
|
- Kept the existing ani-cli-web behavior and routing intact while unifying the refreshed design language across the whole web UI.
|
|
|
|
## 0.8.16 - 2026-05-13
|
|
|
|
- Unified the left sidebar layout across Search, Config, and Watchlist so the page chrome now uses the same panel width, spacing, and structure everywhere.
|
|
- Kept the Config page compact by constraining its main settings content while restoring the shared sidebar pattern.
|
|
|
|
## 0.8.15 - 2026-05-13
|
|
|
|
- Removed the dependency status panel from the Search page so the main route stays focused on search, episode selection, and queue management.
|
|
- Reworked the Config page into a centered compact settings layout instead of the earlier stretched split-screen view.
|
|
|
|
## 0.8.14 - 2026-05-13
|
|
|
|
- Added a standalone `/config` page for saved defaults.
|
|
- Moved the Search page defaults section onto the new Config page and added Config navigation across Search and Watchlist.
|
|
- Kept dependency status visible while moving saved folder, mode, and quality management into the dedicated settings view.
|
|
|
|
## 0.8.13 - 2026-05-12
|
|
|
|
- Added a manual thumbnail upload button for watchlist cards that still have no poster, saving the selected image into the local thumbnail cache for that anime.
|
|
|
|
## 0.8.12 - 2026-05-12
|
|
|
|
- Improved thumbnail lookup for season-labeled titles by retrying AnimeSchedule searches with simplified base-title queries before falling back to AniDB.
|
|
- Stopped failed thumbnail fetch attempts from refreshing the retry window, so broken lookups do not get stuck in an immediate 404 state after one bad fetch.
|
|
- Added extra request headers to AniDB page lookups to improve compatibility with cover-page fetches that were returning `403 Forbidden`.
|
|
|
|
## 0.8.11 - 2026-05-12
|
|
|
|
- Added a small per-anime thumbnail reload button on watchlist cards that forces a redownload of that show's cached cover image.
|
|
|
|
## 0.8.10 - 2026-05-12
|
|
|
|
- Fixed watchlist source links to use AllManga's `bangumi/<show_id>` page format instead of the earlier incorrect route pattern.
|
|
|
|
## 0.8.9 - 2026-05-12
|
|
|
|
- Changed watchlist anime titles into direct links to their AllManga source pages, using the tracked show ID plus a normalized title slug.
|
|
|
|
## 0.8.8 - 2026-05-11
|
|
|
|
- Moved `config.json` into the project-local `.ani-cli-web/` folder so app settings now live alongside the queue database, watchlist data, staging files, and thumbnail cache.
|
|
- Added automatic migration from the legacy XDG config location so existing web app settings are preserved on first startup after the move.
|
|
|
|
## 0.8.7 - 2026-05-11
|
|
|
|
- Moved all project runtime state that previously lived under `~/.local/state/ani-cli-web/` into the project-local `.ani-cli-web/` folder.
|
|
- Added one-time migration for the legacy queue database, queue JSON, watchlist JSON, AniDB title dump, staging directory, and thumbnails so existing local data is carried into the project folder automatically.
|
|
|
|
## 0.8.6 - 2026-05-11
|
|
|
|
- Changed watchlist cards to append into the DOM before assigning poster image URLs, avoiding detached-image and lazy-load edge cases during poster rendering.
|
|
- Added a per-page thumbnail nonce to the local poster URL so a fresh watchlist load always bypasses stale browser-cached misses for `/api/watchlist/thumb/...`.
|
|
|
|
## 0.8.5 - 2026-05-11
|
|
|
|
- Fixed watchlist poster rendering for browser-cached images by attaching thumbnail load and error handlers before setting `img.src`, then immediately showing already-complete images.
|
|
- This resolves the case where posters existed on disk and the watchlist route was healthy, but cached images stayed hidden because the browser had already finished loading them before the old listener was attached.
|
|
|
|
## 0.8.4 - 2026-05-11
|
|
|
|
- Fixed the watchlist thumbnail renderer to always request the local `/api/watchlist/thumb/...` image route instead of trusting stale `thumbnail_ready` state from older cached entries.
|
|
- This lets already-downloaded project-local thumbnails render on the page even when the cached file exists but the watchlist row has not yet been refreshed to mark it ready.
|
|
|
|
## 0.8.3 - 2026-05-11
|
|
|
|
- Migrated any legacy watchlist thumbnails from the old state-directory cache into the new project-local `.ani-cli-web/thumbnails/` folder on access.
|
|
- Fixed thumbnail retry gating so the app no longer skips refetch attempts when a thumbnail filename exists in the database but the actual cached file is missing on disk.
|
|
- Expanded thumbnail debug logging to show whether the expected cached file actually exists before the retry-window decision is made.
|
|
|
|
## 0.8.2 - 2026-05-11
|
|
|
|
- Moved watchlist thumbnail storage into the project-local `.ani-cli-web/thumbnails/` folder so cached images can be inspected directly from the repository tree.
|
|
- Added debug logs for the local `/api/watchlist/thumb/...` route and file-serving path so thumbnail cache hits, misses, and served files are visible in `--debug` output.
|
|
|
|
## 0.8.1 - 2026-05-11
|
|
|
|
- Added a `--debug` runtime flag for `ani-cli-web` and `./ani-cli-web` that logs thumbnail-source request flow, match decisions, responses, cache writes, and failures while fetching watchlist images.
|
|
- Added support for the typo-tolerant `---debug` form as well, so debugging still works if that form is used by mistake.
|
|
|
|
## 0.8.0 - 2026-05-11
|
|
|
|
- Switched watchlist thumbnails to prefer AnimeSchedule metadata, which `ani-cli` already uses upstream for title-based metadata lookups.
|
|
- Stored the resolved AnimeSchedule route and title on watchlist entries so future poster fetches can reuse that stable route instead of repeating a title search every time.
|
|
- Restored only a one-shot watchlist thumbnail warm-up request for the visible page, avoiding the old repeated background refresh loop.
|
|
|
|
## 0.7.5 - 2026-05-11
|
|
|
|
- Removed automatic watchlist thumbnail warm-up requests after page render so the watchlist no longer keeps making background refresh-style requests while the thumbnail issue is shelved.
|
|
|
|
## 0.7.4 - 2026-05-11
|
|
|
|
- Added watchlist removal end-to-end with a new `Remove` button beside `Refresh` and `Open` on each watchlist card.
|
|
- Added a watchlist remove API action and cleaned up a card's cached poster file when its watchlist entry is deleted.
|
|
|
|
## 0.7.3 - 2026-05-11
|
|
|
|
- Handled browser/client disconnects gracefully in the shared HTTP response writer so abandoned watchlist requests no longer cascade into `BrokenPipeError` tracebacks.
|
|
- Ignored disconnect exceptions in the request exception path to avoid attempting a second error response on an already closed socket.
|
|
|
|
## 0.7.2 - 2026-05-11
|
|
|
|
- Fixed the AniDB poster extractor to handle relative `/images/main/...` image links in addition to fully qualified CDN URLs.
|
|
- Normalized AniDB poster URLs through `urljoin` before downloading, which should unblock entries where AniDB serves the image link off the anime page first and redirects afterward.
|
|
- Added an AniDB referer header to image downloads for better compatibility with direct cover fetches.
|
|
|
|
## 0.7.1 - 2026-05-11
|
|
|
|
- Stored the matched AniDB `aid` and AniDB title on each watchlist entry so future thumbnail fetches reuse a stable AniDB identity instead of re-searching by name every time.
|
|
- Added lightweight AniDB debug hints to watchlist cards via hover text so matched AniDB IDs and titles can be inspected without changing the compact card layout.
|
|
- Allowed forced thumbnail retries to rematch by title when a previously stored AniDB ID fails to produce a cover.
|
|
|
|
## 0.7.0 - 2026-05-11
|
|
|
|
- Switched watchlist thumbnails from AniList to AniDB.
|
|
- Added AniDB title-dump caching for local title-to-anime resolution and AniDB page poster extraction for one-at-a-time cover fetching.
|
|
- Kept local thumbnail caching so each watchlist entry only needs its AniDB poster resolved once while it remains tracked.
|
|
|
|
## 0.6.2 - 2026-05-11
|
|
|
|
- Changed watchlist thumbnail warm-up to force small sequential retry batches for the currently visible page so previously failed covers can recover immediately.
|
|
- Removed the client-side `CSS.escape` dependency from thumbnail repaint logic for broader browser compatibility.
|
|
- Kept thumbnail batching capped to avoid reintroducing external source rate-limit spikes.
|
|
|
|
## 0.6.1 - 2026-05-11
|
|
|
|
- Changed watchlist thumbnail loading to a controlled batched warm-up flow so missing covers are not requested all at once.
|
|
- Added per-show thumbnail request deduplication to avoid duplicate cover fetches while the same image is already being resolved.
|
|
- Updated the watchlist client to repaint cards when newly cached thumbnails become available.
|
|
|
|
## 0.6.0 - 2026-05-11
|
|
|
|
- Switched the watchlist to paged loading with 30 cards per page so the desktop view can target a 5 by 6 layout without leaving large blank areas.
|
|
- Tightened the sidebar again so the main watchlist pane has more room for cards on wide screens.
|
|
- Improved thumbnail loading by prefetching missing covers in the background and retrying failed card image requests with a forced refresh.
|
|
|
|
## 0.5.0 - 2026-05-11
|
|
|
|
- Reworked the watchlist into a tighter multi-column poster grid that prioritizes title, sub and dub counts, last checked time, and refresh/open actions.
|
|
- Added cached external cover lookups for watchlist entries under the app state directory.
|
|
- Reduced the watchlist sidebar width so wider screens can fit roughly 4 to 5 anime cards per row.
|
|
|
|
## 0.4.0 - 2026-05-11
|
|
|
|
- Reworked the standalone watchlist page to use the same split-panel layout and navigation language as the search page.
|
|
- Added watchlist summary cards and richer tracked-show cards so status, episode totals, and search handoff all live in the same visual system.
|
|
- Updated the search page navigation styling so both pages now feel like one consistent GUI.
|
|
|
|
## 0.3.1 - 2026-05-11
|
|
|
|
- Split the watchlist out to its own standalone `/watchlist` page.
|
|
- Kept the main `/` page focused on search, queue management, and downloads.
|
|
- Added a watchlist-to-search handoff that pre-fills the search page query.
|
|
|
|
## 0.3.0 - 2026-05-11
|
|
|
|
- Moved the watchlist into SQLite with automatic migration from the legacy `watchlist.json` file.
|
|
- Changed the watchlist model to track one row per show with separate sub and dub episode counts.
|
|
- Added manual refresh actions for one show or the entire watchlist.
|
|
- Split the sidebar into switchable Search and Watchlist pages.
|
|
- Added direct watchlist tracking from search results.
|
|
|
|
## 0.2.2 - 2026-05-11
|
|
|
|
- Fixed a broken watchlist merge that caused `app.py` to fail during startup with an `IndentationError`.
|
|
- Restored the web server entrypoint so `./ani-cli-web` starts the local HTTP server again.
|
|
- Repaired watchlist POST routes, storage lookups, and embedded page script placement so the watchlist UI can load and update cleanly.
|
|
|
|
## 0.2.1 - 2026-05-11
|
|
|
|
- Padded season folder numbers to two digits, such as `Season 01` and `Season 02`.
|
|
|
|
## 0.2.0 - 2026-05-11
|
|
|
|
- Replaced JSON queue storage with SQLite-backed queue persistence.
|
|
- Added automatic migration from the previous `queue.json` queue file.
|
|
- Limited the queue view to 10 jobs per page with previous and next controls.
|
|
- Added bulk queue actions to remove finished jobs and retry all failed jobs.
|
|
|
|
## 0.1.2 - 2026-05-11
|
|
|
|
- Updated finalized download layout to save media under `ANI_CLI_DOWNLOAD_DIR/anime_name/Season <season>/`.
|
|
|
|
## 0.1.1 - 2026-05-11
|
|
|
|
- Expanded `.gitignore` to ignore `__pycache__` directories at every project depth.
|
|
|
|
## 0.1.0 - 2026-05-11
|
|
|
|
- Split `ani-cli-web` into a standalone project that uses system-wide `ani-cli`.
|
|
- Added project hygiene files: `.gitignore`, `VERSION`, and this changelog.
|
|
- Documented runtime state handling and standalone project layout.
|