Add a Queue page bulk action and API route to remove all failed jobs, cover it with regression tests, and update the version, changelog, and README for the new queue workflow.
6.4 KiB
6.4 KiB
ani-cli web
Local web UI for a system-wide ani-cli install.
Current version: 0.48.0
What it does
- Search anime in
subordub, with poster-style results shown below the selection panel and the first English alternate title when available - Queue downloads with folder, quality, media type, season, and episode controls
- Optionally retry failed
ani-clidownloads withanipy-cli - Track shows in a watchlist with
Watching,Planned,Finished, andDroppedcategories - Expose a small JSON summary endpoint for Homepage dashboard widgets
- Refresh watchlist episode counts manually or on a schedule
- Auto-download missing episodes for
Watchingentries after later refreshes, with a per-showSource nameoverride forani-clisearch - Move fully completed libraries into Jellyfin TV or movie folders with a tracked background handoff job
- Send optional Discord webhook notifications
Pages
/: Search and queue downloads, with poster-card search results below the selection box and alternate English titles under the main name when available/queue: Monitor jobs, inspect logs, retry failed jobs, clear failed jobs, and remove finished jobs/watchlist: Track shows, refresh them, download all available episodes, and manage auto-download settings such asSource name, libraryName, season, and episode offset/config: Save defaults, toggleanipy-clifallback retries, schedule refreshes, configure Jellyfin and Discord, monitor Jellyfin handoff progress, and view runtime info and the changelog
Quick start
Requirements:
ani-cliinstalled and available inPATH- Optional:
anipy-cliinstalled and available inPATHif you want automatic fallback retries outside Docker - Common runtime tools used by
ani-cli, especiallycurl,ffmpeg,fzf,grep,openssl,sed,aria2c, andyt-dlp
Run locally:
./ani-cli-web
Open:
http://127.0.0.1:8421/
Useful flags and env:
./ani-cli-web --debugANI_CLI_WEB_HOST=0.0.0.0ANI_CLI_WEB_PORT=8421ANI_CLI_BIN=/path/to/ani-cliANIPY_CLI_BIN=/path/to/anipy-cli
Docker
Build:
docker build -t ani-cli-web .
Build a specific ani-cli-web branch:
docker build \
--build-arg ANI_CLI_WEB_BRANCH=anipy_backup \
-t ani-cli-web .
Run:
docker run --rm \
-p 8421:8421 \
-e USER_UID="$(id -u)" \
-e USER_GID="$(id -g)" \
-v "$(pwd)/downloads:/downloads" \
-v "$(pwd)/.ani-cli-web:/app/.ani-cli-web" \
ani-cli-web
Compose:
USER_UID="$(id -u)" USER_GID="$(id -g)" docker compose up --build -d
Docker notes:
- The container serves on
0.0.0.0:8421 - Downloads are written under
/downloads - App state is stored under
/app/.ani-cli-web USER_UIDandUSER_GIDhelp keep mounted files owned by your host userUPDATE_ON_START=truerunsani-cli --updatebefore startupANI_CLI_WEB_BRANCHlets the image clone a specificani-cli-webbranch at build timeanipy-cliis installed systemwide inside the container, so fallback retries are available without extra container setup
Key behavior
Watchlist
- Adding a show tracks it without downloading immediately
- Later manual refreshes or scheduled refreshes can queue missing episodes
Download allqueues every currently available episode for the chosen mode- Successful downloads sync back into the watchlist
- TV entries move to
Finishedwhen the selected downloaded mode reaches the expected episode count - Movie entries can be treated as complete after download and routed to movie storage
Auto-download
- Runs only for entries in
Watching - Uses the per-show language, quality,
Source namesearch override, season, library name, and optional episode offset settings - Can queue backlog episodes that were already available before the show was first tracked
Download fallback
- Optional and configured from
/config - When enabled, a failed
ani-cliqueue job retries once withanipy-cli - Fallback retries keep the queued episode numbers when the downloaded
anipy-clifilenames are renumbered from1 - Docker images install
anipy-cliautomatically; non-Docker installs should provide it inPATHthemselves
Jellyfin handoff
- Optional and configured from
/config - TV libraries move only after the show is finished and download-complete
- Movie libraries move after download completion
- Manual
Run nowscans the watchlist in a background job and shows live progress for processed entries, moved files, and the current destination path - Recent Jellyfin handoff jobs survive page reloads and show their latest status after app restarts
Homepage widget API
For Homepage's Custom API widget, use:
http://127.0.0.1:8421/api/watchlist/homepage
Example response:
{
"watchlist": 12,
"planned": 4,
"finished": 31,
"dropped": 2,
"total": 49
}
This endpoint is intentionally small so Homepage can map the returned values directly into its widget fields.
Runtime info
The Config page runtime panel shows:
ani-cli-webversion loaded fromVERSION- Installed
ani-cliversion - Installed
anipy-cliversion and dependency status - A
Changelogbutton that opens a scrollable viewer backed byCHANGELOG.md
Remote access
By default the app only serves loopback clients.
To allow LAN or remote access:
ANI_CLI_WEB_ALLOW_REMOTE=1
ANI_CLI_WEB_AUTH_USERNAME=admin
ANI_CLI_WEB_AUTH_PASSWORD=choose-a-long-random-password
Optional remote path restriction:
ANI_CLI_WEB_REMOTE_PATH_ROOTS=/downloads:/srv/jellyfin-tv:/srv/jellyfin-movies
State and storage
Project state is stored in:
ani-cli-web/.ani-cli-web/
Main contents:
config.jsonremote-sessions.jsonstate.sqlite3thumbnails/
Downloaded files are organized like this:
ANI_CLI_DOWNLOAD_DIR/tv/Show Name/Season 01/Show Name - S01E01.mp4
ANI_CLI_DOWNLOAD_DIR/movie/Movie Name/Movie Name.mp4
Configuration
Most users only need these environment variables:
ANI_CLI_BINANIPY_CLI_BINANI_CLI_WEB_HOSTANI_CLI_WEB_PORTANI_CLI_WEB_ALLOW_REMOTEANI_CLI_WEB_AUTH_USERNAMEANI_CLI_WEB_AUTH_PASSWORDANI_CLI_WEB_REMOTE_PATH_ROOTSANI_CLI_WEB_DEBUGANI_CLI_WEB_STATE_ROOT
Container-specific variables:
UPDATE_ON_STARTUSER_UIDUSER_GID
Everything else can usually be configured from /config.
Testing
Run the regression suite with:
python3 -m unittest test_app.py