The terminal-native anime client — providers, mirrors and resolvers, handled for you.
Project description
anime-sh
The terminal-native anime client. You type a title; it plays. Providers, mirrors, and resolvers are internal details you never have to think about.
anime "Frieren"
Status: M5 — polish. Bare
animelaunches a keyboard-driven Textual app; playback auto-skips intros and rolls into the next episode on its own. Under it: AniList metadata, three live providers (AllAnime, anikoto, AniZone) fanned out with circuit breakers, resolvers, mpv over JSON IPC, a persistent library (resume/history/favorites), and ffmpeg downloads. Seedocs/architecture.md.
What works today
anime # launch the keyboard-driven TUI (needs [tui] extra)
anime "Frieren" # search + best match + play episode 1
anime play "Frieren" -e 18 # a specific episode (add --dub, -q 1080p)
anime search "frieren" # AniList search (instant; no providers touched)
anime search --genre action --year 2024 --sort score # browse with filters
anime trending
anime recommend "Frieren" # shows for people who liked it (AniList)
anime related "Attack on Titan" # prequels, sequels, side stories, movies
anime mark "Frieren" -e 12 # catch up: mark eps 1–12 watched (syncs to AniList)
anime stats # episodes, hours, top genres & providers
anime continue # episodes you started but didn't finish
anime resume # jump back into the most recent one
anime history # what you've watched
anime favorite add "Frieren" # ★ (also: favorite ls / rm)
anime download "Frieren" -e 1-12 # save a range to disk (ffmpeg); resumes, skips done
anime download "Frieren" -e 1,3,5 # or a list; also: anime downloads
anime auth login # link AniList (one-time); status / logout
anime sync pull # import your AniList list; sync push sends yours up
anime list --status watching # your AniList list by status (also planning/completed…)
anime rate "Frieren" 9 # set a score; anime status "X" completed
anime next "Mob Psycho 100" # find + play the next season (sequel)
anime doctor # player, ffmpeg, config, database, plugins
anime --version # print the version and exit
anime config get # dump settings; `config get playback.quality`
anime config set playback.quality 1080p # also: audio dub, ui.theme nord …
anime config path | validate
anime providers ls
anime cache clear # wipe the disposable metadata cache (or: cache purge)
The TUI home shows Continue Watching, Favorites, Airing This Season, and
Trending; the detail screen renders cover art, score, studio and a live
next-episode countdown. Press ? for keys, / to search.
Forgiving search. You don't have to spell titles exactly the way AniList
stores them — dont toy with me, dukes son claims he wont love me, even
atack on titan all find the right show. When AniList's strict search comes up
empty, anime-sh retries with apostrophes restored and the query's distinctive
words, then fuzzy-ranks the results against what you typed.
Tab-completion. Run anime --install-completion once for your shell.
AniList sync. Link your account once with anime auth login (create a free
API client at anilist.co/settings/developer,
redirect URL https://anilist.co/api/v2/oauth/pin, then paste the token — your
password is never involved). After that, finishing an episode automatically bumps
your AniList progress. anime sync pull imports your existing list into the local
library; anime sync push sends your local history up in one pass.
Add --json to search, trending, play, continue, history, and
favorite ls for machine-readable output (play --json resolves the stream
without launching a player). Your library (progress, history, favorites) lives
in a separate anime.db from the disposable cache and renders offline.
Cached catalog. AniList responses (search, trending, seasonal, schedule,
details) are cached in a throwaway cache.db with short TTLs, so repeat browses
are instant and recently-seen pages still render offline. It is always safe to
wipe with anime cache clear; nothing user-owned lives there.
Streaming providers break and get Cloudflare-gated constantly — that's the normal operating state, not a bug. When a provider is unreachable, anime-sh degrades cleanly instead of crashing; metadata and your library keep working.
Multiple providers, merged. anime-sh fans out across providers (currently AllAnime + anikoto + AniZone) and falls through to whichever one actually has your show — so a title missing from one source still plays from another, with no action from you. AniZone serves a clean, un-obfuscated HLS stream with soft English subs, so it plays where Cloudflare-gated sites can't.
Install
Needs Python 3.11+, plus an external media player (mpv recommended) and
ffmpeg for playback/downloads. anime doctor reports what's missing.
uv tool install "anime-sh[tui]" # or: pipx install "anime-sh[tui]"
anime doctor
anime "Frieren"
Prefer the bleeding edge? Install straight from main:
uv tool install "anime-sh[tui] @ git+https://github.com/Anime123450/anime-sh.git"
From source (dev)
git clone https://github.com/Anime123450/anime-sh.git && cd anime-sh
uv sync --extra dev --extra tui
uv run anime doctor
uv run anime # launch the TUI
uv run pytest -q # tests (no network); add ANIME_SH_LIVE=1 for live ones
See docs/plugins.md to add a provider or resolver.
Develop
uv run pytest # fast unit suite — no network
uv run lint-imports # architecture contracts (must stay green)
Design
anime-sh is layered cli/tui → app → domain, with infra, providers, and
resolvers as swappable adapters behind ports. Dependencies point downward only
and that is enforced in CI. Identity comes from AniList (every show is keyed by
its AniList id), so adding a provider is attaching a source to a known identity,
not fuzzy-matching titles. Full write-up: docs/architecture.md.
Legal
anime-sh is a client, not a content library. It bundles no media, mirrors nothing, and bypasses no DRM. Providers read public pages and are expected to break; a broken provider is a degraded experience, not an outage. Provider plugins are separable from the core so the project survives any single one.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file anime_sh-0.2.6.tar.gz.
File metadata
- Download URL: anime_sh-0.2.6.tar.gz
- Upload date:
- Size: 104.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00d2067c45a0b6d454ffc30b926cff87b3466f48f5ea8e51eda513d65457e602
|
|
| MD5 |
30bd55381ed66dd153de908cd1a3fd33
|
|
| BLAKE2b-256 |
b5451871bed966e41c6ef911d8467ff853cc22f31e1d4548b4c9b032bff7af87
|
Provenance
The following attestation bundles were made for anime_sh-0.2.6.tar.gz:
Publisher:
release.yml on Anime123450/anime-sh
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
anime_sh-0.2.6.tar.gz -
Subject digest:
00d2067c45a0b6d454ffc30b926cff87b3466f48f5ea8e51eda513d65457e602 - Sigstore transparency entry: 2275048580
- Sigstore integration time:
-
Permalink:
Anime123450/anime-sh@013ae6280a97cf5e7540c1c81dd8b985961d75cf -
Branch / Tag:
refs/tags/v0.2.6 - Owner: https://github.com/Anime123450
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@013ae6280a97cf5e7540c1c81dd8b985961d75cf -
Trigger Event:
push
-
Statement type:
File details
Details for the file anime_sh-0.2.6-py3-none-any.whl.
File metadata
- Download URL: anime_sh-0.2.6-py3-none-any.whl
- Upload date:
- Size: 145.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d66c5035bd1617cc1080aebd50daad0e656c2843712602202dcf929bc9aa1fb
|
|
| MD5 |
8a1d22b5d91b319464a534adf1f17294
|
|
| BLAKE2b-256 |
e3aa28c3ee991867d406c64dc76c43cabf43bc156cc58d963131610e5efded3a
|
Provenance
The following attestation bundles were made for anime_sh-0.2.6-py3-none-any.whl:
Publisher:
release.yml on Anime123450/anime-sh
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
anime_sh-0.2.6-py3-none-any.whl -
Subject digest:
9d66c5035bd1617cc1080aebd50daad0e656c2843712602202dcf929bc9aa1fb - Sigstore transparency entry: 2275048682
- Sigstore integration time:
-
Permalink:
Anime123450/anime-sh@013ae6280a97cf5e7540c1c81dd8b985961d75cf -
Branch / Tag:
refs/tags/v0.2.6 - Owner: https://github.com/Anime123450
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@013ae6280a97cf5e7540c1c81dd8b985961d75cf -
Trigger Event:
push
-
Statement type: