Vendored Anime4K v4.0.1 GLSL (MIT), extracted to app support once per version. Presets A/B/C/A+A/B+B/C+A in HQ and Fast per Anime4K's mpv templates, plus custom files. Shader button in the video controls (works in fullscreen), Ctrl+1..6 / Ctrl+0, live apply with read-back, failures fall back to Off with a toast. Render mode detected from mpv's GL log; warns when on the software path. Docs include the Jellyfin client section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.4 KiB
Roadmap
Backlog and epics, in order. Done work lives in git history. Check an item off by deleting it in the same commit as the code. Wire changes also edit PROTOCOL.md.
Backlog
-
Windows build + CI. There is no Windows runner. Try
ubuntu2610/flutter_build(LLVM-MinGW + Winegen_snapshot) on the Linux runner, fallback a GitHub Actions mirror. The manifest needs per-platform URLs andrelease_publish.shmust handle a second platform. The updater's Windows apply path exists but is untested. The tarball'swatch-together-serverneeds a Windowsdart compile exetoo. Desktop tests are not in CI either. -
Jellyfin (epic, below).
-
Smaller items
- Video output robustness: if media_kit's hardware path regresses to software (see ARCHITECTURE, Media: render mode), vendor a media_kit_video fix that builds the EGL display from GDK's native display. The video freeze after GPU idle is not explained by this; next suspect is media_kit's context switching on the raster thread with NVIDIA.
- Link conveniences: a link swap in session updates the remembered media;
show the open link with an open-in-browser button; the session's swap
panel reuses Home's
MediaPicker. - Time UI: remaining time, scrubber preview.
- mpv / mpv.net shortcut parity.
- Sounds: replace
NoopSfxService(cues already fire). Candidates: Kenney Interface Sounds (CC0), ObsydianX Pack 1 (CC0), akx/Notifications (CC0); playback via flutter_soloud. Keep seek/pause/resume near silent. - Chaos suite: host drop 5 s / 30 s, viewer stall, 20-seek storm, long
outage with cache exhaustion (
tool/shaper.dart --kill-after); assert no OOM, no stuck session, drift recovers. - Chat history pane (today: activity log only).
- Avatar caching: serve avatar bytes once by hash instead of base64 in
every
statebroadcast. - The
statebroadcast carries the full media URL, which can include anapi_key. - TLS: document a reverse proxy in front of the server.
- Playlist:
queue-add,queue-skip, auto-advance like a swap. - Sidecar subtitles.
Epic: Jellyfin
- Each viewer logs in to Jellyfin themselves (Quick Connect or password).
- Several Jellyfin servers can be linked, keyed by
ServerId. - The sync server shares only
{ServerId, ItemId}. Pasted Jellyfin links are recognised and reduced to that pair. - Viewers with an account direct-play
/Videos/{id}/stream?static=truewith their own token and report Playing / Progress / Stopped, so watched state and Continue Watching update per account. - Guests without an account play through the sync server, which fetches with a credential that stays server-side (the host's own or a configured one).
- Next episode: the successor in
/Shows/{seriesId}/Episodes(NextUp means first unwatched, not next-after-X); audio and subtitle track matching by language, then title, then codec/channels. - Library browser; anyone can put up items.
Spike facts (Jellyfin 10.11.11): /Videos/{id}/stream?static=true&mediaSourceId=
serves the original with byte ranges (206). PlaybackInfo gives PlaySessionId
and DirectPlay. All audio and subtitle tracks are embedded in the mkv. Quick
Connect is enabled but /QuickConnect/Initiate returned 400: investigate
(likely missing client/device fields in the auth header).
Deferred
P2P, Android. Never: transcoding, web clients.