Skip to main content

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 anime launches 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. See docs/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.

Install straight from GitHub — this puts the anime command on your PATH:

uv tool install "anime-sh[tui] @ git+https://github.com/Anime123450/anime-sh.git"
# or: pipx install "anime-sh[tui] @ git+https://github.com/Anime123450/anime-sh.git"
anime doctor
anime "Frieren"

(Not on PyPI yet; once it is, this shortens to uv tool install "anime-sh[tui]".)

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

anime_sh-0.2.0.tar.gz (99.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

anime_sh-0.2.0-py3-none-any.whl (139.6 kB view details)

Uploaded Python 3

File details

Details for the file anime_sh-0.2.0.tar.gz.

File metadata

  • Download URL: anime_sh-0.2.0.tar.gz
  • Upload date:
  • Size: 99.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for anime_sh-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9de5988a90bdb0183cef707c63d33e663fc7f295df7827f31cf7f8fcbe399ecd
MD5 91da46aa04f2865466a529f1727f6924
BLAKE2b-256 4e489017b8f1003105cc689d43f674e913cb23c33154cd51ed4b52798ccfb81f

See more details on using hashes here.

Provenance

The following attestation bundles were made for anime_sh-0.2.0.tar.gz:

Publisher: release.yml on Anime123450/anime-sh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file anime_sh-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: anime_sh-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 139.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for anime_sh-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 14c20512d77395fba01e552d353c1bbc34dfaf90bce2517e1cc94066d3e5866d
MD5 b3209f0f7c899cad668cd0d6bc688b13
BLAKE2b-256 f1506f51dbeb79de3c9e4eee69d460f1d771a4ba09b1c0c62960efdcd43f996d

See more details on using hashes here.

Provenance

The following attestation bundles were made for anime_sh-0.2.0-py3-none-any.whl:

Publisher: release.yml on Anime123450/anime-sh

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page