github getmydia/mydia v0.15.0

3 hours ago

175 pull requests since v0.14.0, across three betas and seventeen days. The player is now usable on Android TV and Chromecast with Google TV, hardware-accelerated transcoding is supported with VAAPI, and an admin-scoped Library GraphQL API is available.

Read the upgrade notes before pulling this. There are 18 migrations (additive schema changes, column conversions, and an SSO username data backfill), download audio and subtitle preferences are separated from playback defaults, and movies and TV shows can now share external IDs.

Player

  • Android TV and Chromecast with Google TV support with full D-pad remote navigation across the sidebar, home hero, and dialogs with focus trapping (#787, #845, #846)
  • D-pad timeline scrubbing with hold-to-accelerate seeking, thumbnail previews, and focusable timeline controls (#865)
  • Dedicated on-screen numeric keypad for entering server claim codes on TV displays (#788)
  • Direct zero-copy video frame rendering to eliminate playback stutter on Chromecast and lower-power TV hardware (#782)
  • Native bitmap subtitle rendering (PGS, VobSub, DVB, XSUB) during HLS streaming and direct play (#861)
  • Subtitle selections persist per show across episodes and devices via a new preferences table, surviving quality switches and source fallbacks without racing file transitions (#855, #860, #869, #872)
  • In-app release track switching (Stable, Beta, Dev) with automated self-updating via Flatpak portal, macOS Sparkle beta channel, and Android APK downloads (#722, #725, #848, #888)
  • Frosted glass styling across all on-screen surfaces, replacing Material SnackBars with a content-aware glass toast notification layer (#858, #862)
  • Live Stats for nerds overlay displaying real-time playback metrics (resolution, bitrate, dropped frames, buffer health, link path) with a one-click debug copy button (#852)
  • Auto quality mode optimistically attempts direct play and remembers stall history per connection path instead of falling back on throttled bandwidth estimates (#769, #776, #814, #856)
  • Original quality stays on the file's own bytes through slow links and decode fallbacks, and decode failure memory expires after 14 days (#814, #827)
  • Seeking or closing a stream cancels the upstream byte-range download immediately rather than spooling discarded data to disk (#841)
  • Web player streams HLS through hls.js to fix mid-file resume freezes, and renders HTML5 video track cues for subtitle display (#867, #868)
  • 7-day calendar week view with persistent device layout memory and dock inset clearance (#842, #843)
  • Player remote control works end-to-end across peers, and ambient scan only probes online devices to prevent connection storms (#832, #835, #836, #837, #838)
  • Upgraded player to Flutter 3.47.4 with Impeller rendering default on Linux and Windows, and Android APK size trimmed to ~103 MB (#783, #864)

Streaming and transcoding

  • VAAPI hardware-accelerated transcoding detected automatically with software fallback, configurable via HWACCEL and HWACCEL_DEVICE (#751, #753, #811)
  • Now Playing dashboard displays active FFmpeg transcoding speed, parameters, and stream plans (#752, #759)
  • Intel media driver packaged in the amd64 container image (#811)
  • Audio, video segments, and resume points remain aligned after seeking, and cold transcodes no longer trigger playback timeouts (#749, #774, #881)
  • Media segment requests no longer block on database peer liveness updates, and large TV seasons load reliably over P2P under response caps (#829, #830)

Library API and admin

  • Admin-scoped Library GraphQL API with queries, mutations, event feed, revision change feed, and an API keys management page (LIBRARY_API_KEY) (#781, #784, #790)
  • Admin views reorganized into Configuration, Administration, and System hubs (#796, #748)
  • Customizable Home dashboard layout with system health widget for admins (#799)
  • Language settings section gathers download audio, playback audio, subtitle download, and metadata language, applying changes without restart (#822)
  • ENABLE_PLAYER=false turns off everything the player needs: p2p node, pairing, HLS streaming, transcoding, hardware acceleration probing, intro and credits detection, and the player UI (#778)
  • Performance metrics collection with 14-day hourly rollups for pages, queries, jobs, and p2p requests, accessible via rpc (#817)

Search, downloads and media

  • Movies and TV shows can share TMDB or TVDB external IDs without database constraint collisions (#712, #724, #726)
  • Releases ranked by detected audio language from release titles (Dual Audio, English Dub, language tags), with season packs sized per episode (#816)
  • Dedicated downloads.audio_language setting separate from playback audio, with a per-show Download Audio menu (#821)
  • The daily upgrade sweep replaces files that leave a language gap under the active policy: any listed language satisfies the server default, while a per-show policy demands the show's first preferred language (#823, #824)
  • Library sections and media pages display on-disk storage size for TV shows and seasons, and support sorting by size (#844, #847)
  • Unmatched TV files during rescans or downloads are routed to Import rather than attaching directly to the show (#818)
  • Bulk selection checkbox on hover for posters and list rows, and files on the Import page can be deleted individually or in bulk (#812, #825)
  • Remove After Import waits for torrents to finish seeding on qBittorrent, Transmission, and rTorrent before removal (#791)
  • Download removal runs asynchronously in the background, keeping the Downloads page responsive (#826)
  • Generic Newznab indexer type with configurable API path, trailing slash handling for base URLs, and pre-save FlareSolverr connection testing (#766, #767, #789)
  • Malware wrapped in archives is rejected and blacklisted, preventing grab loops (#763, #777)
  • SSO accounts get derived usernames at login, fixing blank names, Plex Home and Jellyfin integration crashes (#710, #713)

Under the hood

  • Asynchronous P2P core event loop with dedicated concurrent workers for outbound requests and HLS writes (#831)
  • Exqlite prepared-statement destructors avoid connection locks during busy waits, preventing 30-second VM freezes (#828)
  • Metadata relay rewritten as Cloudflare Worker with KV-driven traffic cutover, routing cache, and six-hour airing season caching (#727, #729, #730, #731, #732, #733, #734, #742, #745, #820, #853, #863)
  • Toolchain upgraded to Elixir 1.20 and Erlang/OTP 29.1, Docker images upgraded to Alpine 3.24 (#849, #851, #854)
  • Bundled system plugins approved and granted automatically on upgrade (#798)
  • TestFlight automated notification and refresh handling (#703, #704, #761)
  • Dependabot monthly grouping, automated derived-file regeneration, and CI gate fixups (#797, #883)

Upgrade notes

Back up first. Eighteen migrations: seventeen schema changes (all additive or column conversions) and one SSO username data backfill.

  1. Provider IDs are scoped by media type. A movie and TV show can now share a TMDB or TVDB ID. Rolling back to 0.14.0 is refused once such a pair exists (#712, #724, #726).
  2. Audio and subtitle language preferences are separated. downloads.audio_language (default original) controls download search and automated upgrade sweeps, while playback audio language remains a user setting. Similarly, subtitle acquisition language is separated into downloads.subtitle_language while subtitles.subtitle_language sets default playback (#816, #821, #869).
  3. Daily upgrade sweep replaces missing audio languages. Files leaving a language gap under the active policy are queued for upgrade (the server default is satisfied by any listed language, while a per-show preference requires the first preferred language); files with untagged audio are not touched (#823).
  4. ENABLE_PLAYER=false shuts down the player stack. This turns off the p2p node, pairing, HLS streaming, transcoding, hardware acceleration probing, intro and credits detection, and the player UI (#778).
  5. Orphan TV files route to Import. TV files with no matching episode are sent to Import on rescan instead of attaching directly to the show (#818).
  6. Performance metrics are recorded by default. Hourly rollups are retained for 14 days. Set MYDIA_PERF_METRICS=false to disable (#817).
  7. SSO users receive derived usernames. Existing SSO accounts without usernames are backfilled on migration (#713).

Full Changelog: v0.14.0...v0.15.0

Don't miss a new mydia release

NewReleases is sending notifications on new releases.