Skip to main content

The terminal-native anime client — providers, mirrors and resolvers, handled for you.

Project description

anime-sh

PyPI Python License: MIT

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.

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

anime_sh-0.2.1.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.1-py3-none-any.whl (139.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: anime_sh-0.2.1.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.1.tar.gz
Algorithm Hash digest
SHA256 4e19c7cfc0c9864d8846fc91340e933846e18788cd55920fd62d562f03f6d6d9
MD5 a458253cbf22370cf0c6ca0ac0cf35ef
BLAKE2b-256 54486b235a387654c49e40be9f60f5cfe01bc1e732fd007249d44c05ad219ed8

See more details on using hashes here.

Provenance

The following attestation bundles were made for anime_sh-0.2.1.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.1-py3-none-any.whl.

File metadata

  • Download URL: anime_sh-0.2.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 969dd00a06aeefb52a14bcb158a3fb8226a776928941241f66b41eacc52d8dac
MD5 2af9527a395c423ea8c2fea8864a975b
BLAKE2b-256 13717dc04d7a80609d4bee5fecb8bfd3293ab5d8824cbe1288fc93386c7d638c

See more details on using hashes here.

Provenance

The following attestation bundles were made for anime_sh-0.2.1-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