mirror of
https://github.com/narrrl/proton-stream.git
synced 2026-11-03 16:41:26 +01:00
feat(core,meta,app,android,ios,cli): TVmaze for the shows AniList does not have
With AniList chosen, a title AniList has no match for is now searched on TVmaze, keyless, before it is given up on. One provider for the whole library left live-action shows in a share of anime unmatched, and switching to TMDB would have dropped every AniList match, chain and shelf. The service holds a chain of providers. A match is stored under the provider that gave it, and enrichment and refreshes go to that provider; a miss is stored under the last provider asked, and is_fresh only trusts a miss from the end of the chain, so AniList misses stored before this are asked again at once. A provider failure still ends the lookup instead of falling through. The hand matcher searches every provider in the chain and labels each result with its source. TVmaze is never offered in the settings and is not asked about titles known to be films.
This commit is contained in:
1 parent
bb5a6638c4
commit
3ca431feca
18 files changed
+892
-195
No files matched your search
+1
-1
@@ -10,7 +10,7 @@
|
||||
| `pstr-stream` — block cache, read-ahead | **done, live-verified** — 68 offline tests; benchmarked against a real 761 MiB episode (see `docs/TESTING.md`) |
|
||||
| `pstr-player` — libmpv `stream_cb` + render API | **done, live-verified** — 33 offline tests; plays a real 1080p HEVC episode over a public link, seeks, resumes from the disk cache, and renders into the app's GL context |
|
||||
| `pstr-app` — egui UI, poster grid, embedded video | **done, offline-tested** — 15 offline tests; library wall, title pages, player page with overlay controls, themes, share management |
|
||||
| Metadata providers (AniList / TMDB) | **done** — 32 offline tests; posters, synopses, per-episode titles, hand-pinned matches. Opt-in, off by default |
|
||||
| Metadata providers (AniList, then TVmaze / TMDB) | **done** — 32 offline tests; posters, synopses, per-episode titles, hand-pinned matches. Opt-in, off by default |
|
||||
| Packaging | **done, locally verified** — `scripts/build.sh` (tarball, `.deb`, `.rpm`, `.app`, `.dmg`) and `scripts/build.ps1` (portable `.zip`, WiX `.msi`), plus `packaging/PKGBUILD`. See `packaging/README.md`. The macOS half is written but has not been run on a Mac |
|
||||
|
||||
## Build order from here
|
||||
|
||||
+31
-3
@@ -46,7 +46,7 @@ good. What hung off it was not:
|
||||
| **AniList** GraphQL | none | Identity. Search, every alias, cover art, relations (`SEQUEL`, `PREQUEL`, `SIDE_STORY`…), studios, staff, tags, format, season, popularity, next airing episode, the MAL id. |
|
||||
| **ani.zip** `api.ani.zip/mappings?anilist_id=` | none | Everything AniList lacks, per AniList id: TVDB season, episode and absolute numbers; episode titles in several languages; TVDB synopses; 16:9 stills; air dates; runtime. Series art: TVDB **fanart at 1920×1080**, poster, banner, logo. Cross-ids for MAL, AniDB, TVDB, TMDB, Kitsu, IMDb. A community service — cache what it says. |
|
||||
| **TMDB** | free key | Film backdrops and logos; live-action TV. Already implemented. |
|
||||
| **TVmaze** | none | Live-action TV episodes, keyless. |
|
||||
| **TVmaze** | none | Live-action TV: episodes with 16:9 stills and runtimes, network, status, full-HD backgrounds. No films; its "typography" art is a JPEG, so no logos. In use after AniList. |
|
||||
| **AniSkip** | none | Opening and ending timestamps by MAL id and episode. |
|
||||
| **Jikan** (MAL) | none | Filler and recap flags. Timed out when tried; optional. |
|
||||
| **manami-project/anime-offline-database** | none | Every anime with its synonyms, ids and relations, as one 6 MB `.zst`. Matching against it locally sends no title anywhere. |
|
||||
@@ -192,9 +192,37 @@ answer lands, rather than being blanked by the migration as schema v10 did.
|
||||
|
||||
## Phase 3 — reach
|
||||
|
||||
**Routing by title (done).** One provider for the whole library left Game of
|
||||
Thrones unmatched in a share of anime, and switching the library to TMDB would
|
||||
have thrown away every AniList match, chain and shelf. So the providers are now
|
||||
asked in a chain (`pstr_meta::service::chain_of`): with AniList chosen, a title
|
||||
AniList has no match for is searched on TVmaze, keyless, before it is given up
|
||||
on. TMDB, which has television itself, is still asked alone.
|
||||
|
||||
- A match is stored under the provider that gave it, and everything after it
|
||||
— enrichment, refreshing details by id — goes to that provider.
|
||||
- A miss is stored under the *last* provider asked. `MetadataRecord::is_fresh`
|
||||
takes the chain, and a miss only stands when the chain ends with the provider
|
||||
that stored it. So an AniList miss from before TVmaze joined is not trusted,
|
||||
and the next run asks TVmaze at once rather than after the miss expires.
|
||||
- A provider that fails (a timeout, a 429) ends the lookup with an error rather
|
||||
than falling through. The next provider's answer for a title AniList could
|
||||
not be asked about is a guess about an anime, and a guess stored as a match
|
||||
would stay.
|
||||
- TVmaze is not asked about a title the library knows to be a film. It has
|
||||
none, and a show sharing a film's name is far more often wrong than an
|
||||
adaptation.
|
||||
- A hand search asks every provider in the chain and labels each result with
|
||||
the provider it came from; picking one pins the title to that provider.
|
||||
|
||||
TVmaze answers search with whole show records — genres, network, status,
|
||||
premiere date, runtime, rating — so a match carries its details with no second
|
||||
request. Enrichment is one more: `/shows/{id}` with the episodes and images
|
||||
embedded. Specials, which TVmaze numbers nowhere a file would, are left out.
|
||||
|
||||
Still to do:
|
||||
|
||||
- **Local matching** against the offline database, so only ids leave the
|
||||
machine.
|
||||
- **Routing by title**: AniList first, then TMDB (with a key) or TVmaze for
|
||||
whatever is not anime — Game of Thrones in a mostly-anime share.
|
||||
- **Skip intro** from AniSkip for files without chapters, and filler flags from
|
||||
Jikan.
|
||||
@@ -9,6 +9,7 @@ and to nothing else unless you turn on posters and descriptions. This page lists
|
||||
|---|---|---|
|
||||
| Proton | Requests for the shares you added and, if you signed in, your account's Drive | Always |
|
||||
| AniList and ani.zip, or TMDB | The names of the titles in your library, and the ids of matched titles | Only with **Posters and descriptions** on |
|
||||
| TVmaze | With AniList chosen: the names of the titles AniList has no match for, and the ids of those TVmaze matched | Only with **Posters and descriptions** on |
|
||||
|
||||
Nothing else leaves your device. There is no telemetry, no crash reporting and no update check.
|
||||
|
||||
|
||||
+7
-4
@@ -65,9 +65,10 @@ Click a title to open its page. **Esc** goes back.
|
||||
- **Resume S01E03 · 12:04** continues where you stopped. **Start over** plays the episode from
|
||||
the beginning.
|
||||
- **Download show** keeps every episode on this device. See [Downloads](#downloads).
|
||||
- **Match…** opens the matcher, where you choose which AniList or TMDB entry the title is. Use it
|
||||
when the app guessed wrong or did not guess at all. A match you pick is never replaced.
|
||||
- **More on AniList** (or TMDB) opens the title's page there.
|
||||
- **Match…** opens the matcher, where you choose which AniList, TVmaze or TMDB entry the title
|
||||
is. Each result names the site it came from. Use it when the app guessed wrong or did not guess
|
||||
at all. A match you pick is never replaced.
|
||||
- **More on AniList** (or TVmaze, or TMDB) opens the title's page there.
|
||||
- Each season has **Mark season watched** and **Download season**.
|
||||
- Each episode shows a tick when you have watched it. Right-click an episode and choose **Mark
|
||||
watched up to here** to tick it and every episode before it.
|
||||
@@ -220,6 +221,8 @@ a video that is playing changes at once.
|
||||
**Posters and descriptions**
|
||||
|
||||
- Off by default. When it is on, the app sends the names of your titles to the provider you pick:
|
||||
**AniList** (no key needed) or **TMDB** (needs a free API key). See [Privacy](PRIVACY.md).
|
||||
**AniList** (no key needed) or **TMDB** (needs a free API key). With AniList, a title it does
|
||||
not have, such as a live-action show, is looked up on **TVmaze** next, which needs no key
|
||||
either. See [Privacy](PRIVACY.md).
|
||||
- **Match the library** looks up new titles now. **Match everything again** looks up every title,
|
||||
except those you matched by hand.
|
||||
Reference in new issue
Block a user