Bug Fixes
- accept any ext-id UUID candidate in media validate to fix [❌] stub collisions (648d8c6)
- downgrade fetch_subtitles log to debug (1ae2e42)
- drive desktop asset embedding via DASHBOARD_PATH/WEB_PATH env vars (2dc8618)
- external-ID deduplication and tree-aware import (#165) (a75295d)
- free disk space before desktop build on macOS runners (692c44e)
- lazy subtitle extraction — only extract when subtitle URL is requested (1cb906a)
- log fetch_subtitles at info only for real fetches, debug for cached lookups (266af94)
- playlists: return all media kinds from playlist items endpoint (#199) (ca67af4)
- restore portable jellyfin-ffmpeg asset filter and add system ffmpeg fallback (6d34317)
- route librqbit and yt-dlp cache writes to data_dir/cache (fixes #200) (f01d3e6)
- skip remuxdb submission when stream has no torrent hash or nzb (fixes #202) (d795afa)
- skip stremio error stubs in catalog stream and search (2340312)
- strip manifest.json from StremioManifestUrl when query string is present (fixes #203) (48377ee)
- use absolute paths for DASHBOARD_PATH/WEB_PATH in desktop CI build (b1da7be)
- web: re-apply real track selections when core re-renders after playback (408928d)
Features
- add default ElegantFin CSS to BrandingOptions (d66c92d)
- allow JS injection on branding page (fixes #190) (8e297d8)
- forward manifest URL query params to all addon resource requests (fixes #203) (7657629)
- idPrefixes-aware addon routing and stream ID selection (#193) (e0638bf)
- implement PlayDefaultAudioTrack using original_language from DB (7f991ab)
- nested collection browsing with smart group containers (#205) (44af3a8)
- sessions: admin session revocation and activity log (#128) (15e4197)
- support animated GIF images; preserve image format extension on save (7b82965)