github getmydia/mydia v0.14.0-beta.4

pre-release3 hours ago

67 PRs since v0.14.0-beta.3. The big one is the import pipeline, largely rewritten: discovery, the review inbox, and the orphaned files neither of them used to surface. That work is what has kept 0.14.0 in beta this long, and once it holds up in the field, 0.14.0 goes stable. Six migrations ship with this release, one of them irreversible.

Import

  • Discovery and maintenance run on separate paths. auto_import gates discovery only, media_files requires a parent via a CHECK constraint on both adapters, and a new path-keyed import_candidates table replaces media_file_match_candidates and import_groups. Clear stops un-ignoring everything, and deleting an episode demotes its files instead of orphaning them (#628)
  • A scan builds the import inbox, and the auto_import flag actually gets read, so a library doesn't sit on hundreds of matched orphans while /import claims there's nothing to review. Orphan re-enrichment also stops re-paying the metadata relay for files it already matched (#600)
  • An accepted import can create the episode rows a metadata provider is missing, bounded by a plausibility check on the parsed season and episode, and adopts them in place once the provider catches up (#614)

Extras

  • Movie extras get classified instead of showing up as versions of the feature. Detection runs at scan time and again after analysis, demoting any file under half its movie's published runtime, with promote and demote controls and operator decisions that stick (#596)
  • The demote-to-extra button no longer looks like a download button (#623)

Subtitles

  • Subtitle tracks are first-class, with their own settings rows (#585)
  • Subtitles re-sync automatically against the media file's own audio (#588)
  • Subtitles moved onto the file row, per episode (#592)
  • The subsync cdylib builds on musl, which unbreaks the Alpine images (#589)

Configuration

  • Database-backed settings survive a restart. Config used to load before Repo started, catch the resulting error, and quietly fall back to an empty layer, so anything saved in the admin UI reverted at the next boot with nothing logged (#599)
  • A single malformed config_settings row stops taking down the entire database layer, and a parent/child key pair like server plus server.port doesn't fail application start (#605)

Indexers

  • Cardigann search URL construction, redirects, failover and the connection test are repaired, after a user reported five passing connection tests and five failing searches (#601)
  • Cardigann session cookies stay scoped to a definition's own origins (#606)

Server

  • The activity feed and title timeline are scoped for guest accounts (#555)
  • Media requests carry posters, with a detail popup (#556)
  • PreDVD releases stop resolving to the DVD source (#593)
  • An external-id duplicate tie breaks on id rather than inserted_at alone, so the winner is stable instead of arbitrary when two rows share a timestamp (#632)
  • A 1080p quality profile stops grabbing a 360p rip (#635)
  • Season packs match at show level, and titles can be added straight from the match dialog (#637)
  • Playback profile validation covers the whole profile, not just codec names (#563)
  • HLS_COPY is never offered for a stream the client already rejected (#564)

Web UI

  • The Media Files card renders on TV shows, and fixing that root cause also stops shows being excluded from quality filters, showing blank quality badges, or reporting 0 B in the list view. Foreign key violations return a changeset error on SQLite instead of raising a 500 (#591)
  • Fixes across dashboard tile links, media page layout, the discover modal and poster hover (#557)
  • The show page's Media Files card stops listing every episode file (#598)
  • The Media Files card works on mobile (#616)
  • The History rail doesn't crowd the media detail page anymore (#597)
  • Metadata fields don't crash the smart rules dialog (#615)

Player

  • The player runs on Android TV, including Chromecast with Google TV (#561)
  • A new calendar view (#595)
  • A leading HLS_COPY candidate isn't treated as direct-playable (#566)
  • Linux window decorations draw inside the window (#567)
  • Windows builds ship the VC++ runtime (#568)
  • flutter_secure_storage 11 dropped the AndroidOptions parameter, so it's gone here too (#617)
  • The Rust bridge bindings are regenerated at 2.13.0. A dependency bump moved the package but left the generated code at 2.12.0, and the version check that catches that mismatch runs at startup, so native builds opened on an error screen instead of the app (#633)

Dependencies and CI

  • Nine advisories closed out in the Elixir dependency tree (#575)
  • jsonwebtoken bumped to 10.4 on the server (#572)
  • Dependabot scans every lockfile in the repo (#574)
  • Dependency updates are grouped across actions, rust, dart, javascript, ruby, the site and metadata-relay (#577, #579, #582, #612, #613, #569, #624, #625, #626, #627)
  • Dependabot pull requests auto-merge once the check rollup is fully green, and comment when something blocks them (#583, #610, #619, #620, #622, #631)
  • The site moved to Astro 7 (#571)
  • Docs and assets dependency trees got upgraded (#573, #584)
  • The test suite refuses outbound HTTP (#611)
  • Two nondeterministic CI failures cleaned up (#604)
  • Site and fastlane gates report on every pull request (#570, #581)
  • The player path filter moved into a changes job, so its contexts always report (#621)
  • Every master commit gets its own Docker concurrency group (#618)
  • The fork OSV job has security-events (#590)
  • Agent-memory knowledge moved into code-adjacent docs (#630, #629, #634)
  • The Nix build downloads crates from the CDN instead of the crates.io API host, which had started rejecting them, four stale Rust lockfiles are regenerated, and the player E2E seed pins its file as an operator decision so the extras classifier stops emptying the fixture movie. A new check asserts on every pull request that generated bindings and lockfiles still match the manifests they came from (#636)

Upgrade notes

  1. Six migrations. The import split (#628) is irreversible by design: parentless media_files rows get backfilled into import_candidates, and orphan-only analysis (phash, probe metadata, generated blobs) is discarded rather than carried across. Take a backup.
  2. auto_import changes meaning. It gates discovery of new files rather than linking them. Maintenance on files already known keeps running either way (#628).
  3. /import may show work that was previously invisible. A library carrying orphaned files will surface them as candidates for the first time (#600, #628).
  4. Movie extras get reclassified. A recurring worker demotes any file running under half its movie's published runtime. Promote anything it gets wrong, and the decision sticks (#596).

Don't miss a new mydia release

NewReleases is sending notifications on new releases.