Kaizoku
Kaizoku is a local web app for searching, tracking, and downloading anime from Anikoto, AniNeko, and AnimePahe.
Features
- Search anime through the configured provider and tag results with available
SUBandDUBepisode languages. - Choose the active search provider directly from the Search page.
- Prefer provider-supplied search artwork, with a local title-based thumbnail fallback when provider artwork is missing or broken.
- Queue single episodes or batches in subbed or dubbed mode.
- Monitor active Queue jobs with per-episode progress, segment counts, and live downloader output.
- Open result actions in a floating window for watchlist, media type, subbed/dubbed mode, library name, season, episode range, and download folder choices.
- Fall back across the other configured providers when an episode or stream cannot be resolved on the primary provider.
- Save files with Jellyfin-friendly layout:
TV/Series Name/Season 01/Series Name - S01E01.mp4. - Save English external subtitles when the provider exposes usable subtitle tracks.
- Manage focused watchlists for
Watching,Planned,Finished, andDropped, with provider source tags and title links back to the original provider page. - Periodically refresh selected watchlists and auto-download newly available episodes.
- Sync watchlist download flags from the filesystem.
- Hand completed libraries to Jellyfin TV or movie folders.
- Export/import watchlist backups.
- Send unified Discord notifications for downloads, refreshes, Jellyfin handoff, and runtime errors.
- Store configuration, queue state, and watchlist data in SQLite under
.kaizoku/.
Requirements
- Python 3.12 or newer.
- Node.js and npm for the provider bridge.
ffmpegavailable inPATH.opensslavailable inPATHfor AES-128 encrypted HLS segments.- Docker builds install the locked Node dependencies with
npm ci; rebuild the image after dependency updates.
Install Node dependencies once:
npm install
Run locally:
./kaizoku
Then open:
http://127.0.0.1:8421/
Useful environment variables:
KAIZOKU_HOST=0.0.0.0KAIZOKU_PORT=8421KAIZOKU_ALLOW_REMOTE=1to allow non-loopback clients.KAIZOKU_AUTH_USERNAME=adminandKAIZOKU_AUTH_PASSWORD=choose-a-long-random-passwordfor remote access.KAIZOKU_JOB_STDOUT=trueto mirror job logs to container or terminal output.KAIZOKU_STATE_ROOT=/path/to/stateto move SQLite state, config, thumbnails, sessions, and staging.KAIZOKU_DOWNLOAD_DIR=/downloadsfor the default library output path.KAIZOKU_REMOTE_PATH_ROOTS=/downloads,/media/animeto limit remote filesystem browsing; comma-separated and platform path separators are accepted.KAIZOKU_MODE=sub,KAIZOKU_QUALITY=best, andKAIZOKU_DEBUG=1for runtime defaults and diagnostics.
Docker
docker compose up -d --build
The compose file builds the local checkout and runs Kaizoku on port 8421 by default. It mounts:
./downloadsto/downloads./.kaizokuto/app/.kaizoku
The Docker image installs Python, Node.js, npm, ffmpeg, openssl, and util-linux for optional UID/GID switching, then runs npm install --omit=dev for the provider bridge. Downloads go through Kaizoku's provider bridge and provider_downloader.py.
Useful Compose overrides:
KAIZOKU_PORT=8080 docker compose up -d --build
KAIZOKU_ALLOW_REMOTE=1 KAIZOKU_AUTH_USERNAME=admin KAIZOKU_AUTH_PASSWORD='change-me' docker compose up -d
USER_UID=$(id -u) USER_GID=$(id -g) docker compose up -d
Keep ./.kaizoku mounted for production instances. That directory contains the SQLite database, configuration, queue history, watchlist data, thumbnail cache, remote sessions, and temporary staging files. Removing the mount starts Kaizoku with a fresh empty state.
Download Flow
Kaizoku stores provider-backed show IDs as provider:id, for example anikoto:some-show-slug. Queue jobs resolve the episode source through providers/bridge.js, then provider_downloader.py downloads the media with ffmpeg into a staging directory. If a provider returns a master HLS playlist, Kaizoku selects the highest-bandwidth variant before starting ffmpeg. When a media playlist uses extensionless CDN segments, Kaizoku skips direct ffmpeg and uses a StrawVerse-style segment downloader: it fetches the media playlist, downloads and concatenates segments itself, strips short PNG wrappers when present, then remuxes the local transport stream to MP4. Direct ffmpeg attempts also have a timeout guard so stalled HLS inputs can fall back cleanly. Each episode is written as a temporary .mp4.part file and moved into place only after the download succeeds, so failed fallback attempts do not leave broken final MP4 files behind. If the primary provider cannot list, resolve, or download a requested episode, Kaizoku searches the same title on the remaining providers and tries the matching episode there. Existing finalization code moves staged files into the configured library layout, preserving data already present in production download folders.
Data Safety
Kaizoku uses additive SQLite migrations for queue and watchlist schema changes. Upgrades do not delete configuration, watchlists, queue history, or downloaded files. Jellyfin handoff moves only completed library folders that pass the existing readiness checks.
Provider Source
The Anikoto, AniNeko, and AnimePahe parser modules in providers/extensions/Anime/ are adapted from TheYogMehta/extensions and retain their GPL/license headers. Kaizoku acts as a local client-side parser/downloader wrapper and does not host media.