Intro skip: MAL timings via keyless Jikan + player button

- upstream: _intros(mal_id) -> per-episode {start,length} (seconds),
  30d TTL cache; Jikan is down or show uncovered -> [] (no button)
- app: GET /api/intros/{mal_id}, never errors into the player
- player: 'skip intro' pill appears while currentTime is inside the
  intro window (+8s grace); click seeks past; reappears if rewound.
  Ep-1 intros are often missing in MAL data, so falls back to the
  show's first known timing (usually identical across eps)
- test: _parse_intros unit test (Jikan itself is 504ing right now,
  live path verified by hand: endpoint returns [] cleanly)
This commit is contained in:
jozamudi committed 2026-08-30 21:01:24 +00:00
1 parent c2461f8fba
commit 0613cf7e27
5 files changed
+77 -1

No files matched your search

+10
View File
@@ -417,6 +417,16 @@ def api_anime(slug_id: str):
return _upstream(upstream.details, slug_id)
@app.get("/api/intros/{mal_id}")
def api_intros(mal_id: int):
# keyless Jikan/MAL intro timings; Jikan down or no data = no skip
# button, never an error that could touch the player
try:
return upstream.intros(mal_id)
except Exception:
return []
@app.get("/api/anime/{anime_id}/episodes")
def api_episodes(anime_id: int):
return _upstream(upstream.episodes, anime_id)