From real use: a show on Jellyfin read "not in AnimeFlow". AnimeFlow's
new GET /library lists every Jellyfin series with AniList ids per TVDB
season; matchSchedule uses it for untracked shows (status inLibrary,
Put it up, no Request) and to fill jellyfinSeriesId. A failing or
missing /library never fails the schedule. Episodes may carry
anilist_episode (split cours, absolute numbering), matched first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Standalone SchedulePage (plugged into the shell later): cover-first
cards in day columns from last week's Monday, filters (On Jellyfin /
Following / All airing, niche toggle, compact), requests that really
call AnimeFlow (episode with AnimeFlow's own numbering, series via
AniDB search by AniList id), follow, Put it up resolving the Jellyfin
episode, the requests sheet with the owner's Retry/Decline, refresh
every 60 s while visible, stale-AniList and AnimeFlow-error states.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lib/src/schedule/ for the 1.0 Schedule tab (UI and docs come with the
schedule round):
- AniListClient: airingSchedules in a window, 50 per page, adult/music
dropped; memory 10 min + disk 1 h cache, one Retry-After wait on 429,
stale cache on failure; real User-Agent (AniList 403s some defaults).
- AnimeFlowClient: the full app API (me, schedule, series, follow,
search, requests incl. approve/reject, users/scopes) with the user's
Jellyfin token, only for a Jellyfin on AnimeFlow's parent domain;
ETag/304, typed error codes, backoff on nginx's HTML 429, /me cached
at most 60 s so scope changes show.
- matchSchedule + ScheduleRepository: AniList airings with AnimeFlow
status by (episode anilist_id, episode), then absolute number, then
air day; degrades to AniList-only when AnimeFlow fails.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>