Bug Fixes
- api: add GET+POST .../delete action routes for unfavorite and unplayed (#329) (30175d9)
- api: honor per-user view filtering in /UserViews (fixes #307) (7f41366)
- api: playlist filtering, uuid format consistency and album runtime (#260) (08abacd)
- apply query macro to structs (#327) (8bf436e)
- ci: restore server compilation and formatting (#295) (2a7d680)
- collections: use parent_id for group container add/remove (#320) (c50dc9d)
- desktop: statically link liblzma to remove Homebrew runtime dependency on macOS (0e4a4ba)
- filters: roll up episode plays to series for Watched smart collections (#354) (a5828e4)
- include filename stem in PlaybackInfo MediaSource path (#352) (21e9a21)
- items: correct episode sort order for Android TV (fixes #342) (9f7d1d2)
- playback: force AAC for TS-incompatible audio codecs and fix remuxdb stream indexing (79774bc)
- playback: prefer item language for stream defaults (#289) (7e6769c)
- playback: replace 20s no-streams placeholder with 10-hour video (76fa176)
- playback: skip streamOptions deserialization, advertise dtsh for DTS audio in HLS (4087035)
- preserve episode/season progress and watched state across a library purge (#249) (f5bac48)
- sdks: gate cache middleware to native to fix WASM dashboard build (4db6184)
- server: preserve keyed locks across queued waiters (#296) (283be1c)
- server: stop advertising unsupported SyncPlay (#301) (24d8200)
- store: make Store::insert atomic using moka entry API (fixes #353) (a9c1529)
- stremio: derive end_date from episodes when releaseInfo is absent (fixes #340) (d104d79)
- stremio: infer ended status and end_date from releaseInfo (#335) (6b57800)
- subtitles: expose matching torrent sidecars (#278) (636c203)
- subtitles: normalize WebVTT timestamp separators (#290) (a0398cc)
- torrent: preserve bundle files during stream deduplication (#299) (f948c32)
- torrent: validate persisted tracker URLs (#297) (4d1134a)
- web: allow static file requests through to ServeDir regardless of Accept header (0b0663d)
- web: make header controls clickable on webOS (#300) (9906080)
- web: preserve sources for direct item fetches (#292) (e7ae7f9)
- web: return 404 for unknown routes instead of serving SPA html (52c0ca1)
- web: serve client under /web with trailing-slash redirects (#346) (e652ccc)
Features
- collections: make ui elements draggable (#286) (#293) (78b5189)
- dashboard: add DatePlayed as a collection default sort option (eca7ede)
- filters: add Favorite filter rule (#315) (ce72cac)
- filters: add MediaKind filter rule and apply policy to live TV endpoints (fixes #344) (#348) (df1fdc1)
- filters: add Watched filter rule (#334) (f68a8ba)
- migrations: seed Probe Segments and IntroDb addons by default (5a095c4)
- playback: enforce audio/remux/media-playback policy flags (#310) (6a950ee)
- probe: HEAD-check cached streams, fall through to fallback on dead URL (#328) (86aad12)
- sdks: add configurable retry middleware via reqwest-retry (#324) (de32633)
- tracking: queue watch activity as it happens (#261) (0ceb2ad)
- users: add Allow media downloads policy toggle (#332) (5f4942b)