Skip to content

v0.14.0

Latest

Choose a tag to compare

@arsfeld arsfeld released this 04 Sep 22:10
Immutable release. Only release title and notes can be modified.
eeb713e

200 pull requests since v0.13.2, across five betas and fifteen days. The import pipeline was rewritten and then spent four betas being corrected by operators running it against real libraries, which is what the long beta was for.

Read the upgrade notes before pulling this. Music, books and adult are gone, remote access turns on for existing installs, and there are 37 migrations, two of them irreversible. Back up first.

Import

  • The import run lives in Oban on its own queue, in two phases, resumable and stoppable. Closing the tab or redeploying keeps everything processed so far (#472, #480, #494, #497)
  • Review clusters unresolved files into folder groups: change the match, reversible ignore, create a show from a folder no provider carries, bulk accept. One 0.85 threshold governs the review bands and the ingest path (#482, #493, #495)
  • auto_import gates discovery only, media_files requires a parent, a path-keyed import_candidates table replaces the two it used to take, an accepted import can create episodes the provider is missing, and accept and re-match are Oban workers again (#628, #600, #614, #663, #647)
  • ENABLE_IMPORT_LISTS gates the whole feature, not one nav link, with scheme and destination checks on custom URLs and exponential backoff on failures. It defaults to on (#665)

Fixed during the beta

  • Re-scan could trash media that was still on disk. A unique index on library path plus relative path closes the duplicate rows behind it, and a migration folds existing ones (#658)
  • Re-enrichment had been resetting monitored to true. Those changes land in item history (#659)
  • The release matcher attached season packs to unrelated titles on a shared first word, scoring 0.897. Candidates whose words the release title does not cover are rejected (#669)
  • Combined files such as S01E09E10 link to every episode they contain (#679)
  • An external-id duplicate tie breaks on id, so the winner is stable (#632)

Library and media

  • Oversized TV seasons split losslessly via TVDB's alternate orderings, and only the orderings TVDB publishes for a show are offered (#486, #499, #504, #517)
  • Movie extras are classified as extras. They used to appear as versions of the feature (#596, #623)
  • Trash is visible at /admin/config/trash with restore, permanent delete and bulk actions, and Settings > Duplicates reviews items holding more than one active file and trashes per group with an undo (#666, #520, #521, #522, #664)
  • Scheduled metadata refreshes reach episodes, monitoring stays in sync between presets and manual toggles, adding a show fetches every season before the preset applies, and HDR gets one canonical representation plus a separate Dolby Vision profile after HDR files had been scoring below SDR (#454, #447, #692, #543)
  • Cancelling a download stops deleting source media, trackerless torrents get public trackers, min_seeders is operator-configurable, a magnet redirect no longer swallows the grab, and adopted torrents outside the policy get a per-client External mode (#450, #505, #508, #440, #441, #675, #535)
  • Cardigann URL construction, redirects, failover and the connection test are repaired with cookies scoped per definition, PreDVD stops resolving to DVD, a 1080p profile stops taking a 360p rip, season packs match at show level, and manual search streams so one dead indexer cannot blank it (#601, #606, #593, #635, #637, #474, #479, #500)

Discover and collections

  • Discover is the only place to add media, /add and /request are deleted, AddDefaults resolves library, quality profile, monitoring and search-on-add through one chain, and the library picker is merged into Configure Before Adding (#649, #676, #678, #536, #537)
  • Media ids carry their provider as a tagged ref, which fixes TVDB ids sent to TMDB on add, preview, recommendations and import lists (#672, #677, #456)
  • Approving a request offers the same controls as adding one and queues the search it always claimed to, adding a title auto-approves matching pending requests, requests carry posters, and guest feeds are scoped (#689, #691, #556, #555)
  • Any smart collection can be pinned to the sidebar as a section carrying the full media-index toolbar, exclusive ones claim their categories from Movies and TV, and sixteen preset collections come with live counts (#644, #654, #667, #652, #615)
  • Hide in library refills the grid to a full page, a poster in any rail opens the detail dialog, and the Add button fits its pill (#684, #674, #673)

Remote access and players

  • Pairing is end-to-end encrypted: an Argon2id seed derived from the claim code, a blinded lookup key, and a ChaCha20-Poly1305 sealed blob the relay cannot read. Guess limiting added (#513)
  • Any account can pair a player from /devices, and the Remote Access toggle gates claim codes, pairing, media reads and GraphQL, which it never did before (#510, #496)
  • One player can discover, adopt and drive another over iroh, in the same picker as Chromecast and DLNA. Two players on one account can finally see each other; iOS had never registered a node id (#524, #526, #527, #528, #648)
  • p2p connections stopped dropping and reconnecting, a raising resolver no longer takes the host down, the unauthenticated read_media request is retired, and both ends declare a minimum counterpart version (#681, #695, #470, #509, #498)
  • Android TV, Chromecast with Google TV included (#561)

Streaming and playback

  • HLS segments are served on demand against a complete VOD playlist, so a far scrub relocates the encoder where it used to rebuild the whole stack behind a spinner (#638, #639)
  • Per-device direct play profiles, probed by the player and honoured by the server over p2p too (#541, #563, #564, #566)
  • Subtitle tracks are first-class and per episode, re-sync automatically against the file's own audio, download reliably, rank by release-name match, fit a phone, and open from the player even on a file with no tracks (#585, #588, #592, #589, #532, #545, #546, #467, #682, #548)
  • Chromecast subtitles over both direct and p2p routes, and the audio track follows a language preference (#462, #449)
  • A resume point has to clear two minutes or 10%, so one stray nine-second row stops naming the wrong episode (#680)
  • The player gets a calendar, coherent watched state everywhere, refracted playback chrome, a rebuilt up-next prompt, sidebar edit mode, a corrected loading skeleton, Linux decorations inside the window, the VC++ runtime on Windows, working macOS sign out, and a web build that ships from CI (#595, #645, #443, #444, #491, #501, #455, #514, #488, #540, #492, #475, #661, #481, #507, #567, #568, #617, #633, #446, #512)

Web UI

  • Poster cards share one body so grid rows align, grids hold their shape while loading, and posters pick up hover effects (#657, #662, #688)
  • The detail page backdrop is anchored to the viewport, the History rail stopped crowding it, and a movie's files sit above the discovery rails (#655, #597, #518)
  • The Media Files card renders on TV shows, works on mobile, and sizes itself by container query. So does the episode file row, which at 1024px had been showing two characters of a filename (#591, #598, #616, #683)
  • Dense pages got season count, grid density, view mode, a Recently Added rail and collapsible seasons; episode rows align on a fixed-track grid; segmented controls are visible in dark mode; and the mobile dock stops covering the sidebar (#469, #484, #476, #483, #453, #457, #516, #519, #668, #656)
  • Avatar upload on the profile page, a dismissible player banner with the option to hide the player entirely, real favicons, and smaller fixes across the dashboard, the Discover picker, rail add tracking and two crash regressions from 0.13.x (#686, #685, #650, #515, #439, #468, #485, #461, #445, #557)

Removed

Music, books and adult library types are gone: the UI, the contexts and schemas, and the enums. Movies and TV Shows are unaffected. Twelve tables are archived to NDJSON before they are dropped, and the migration raises without dropping if archival fails (#471).

Under the hood

  • Thirteen root causes from a security audit closed across authentication, the p2p node and the shared metadata relay, the SQL sandbox plug mounted in test only, jsonwebtoken at 10.4, and nine advisories closed in the Elixir tree (#544, #539, #572, #575)
  • Database-backed settings survive a restart and one malformed row stops disabling the layer, varchar is widened to TEXT and int4 to bigint on PostgreSQL, SQLite Database busy is fixed, and a foreign key violation returns a changeset error (#599, #605, #448, #451, #502)
  • CI: the NixOS module boots again with every Alpine base pinned, Docker dependency layers are cacheable, the player E2E runs on pull requests, dependabot merges through a gate reading the whole check rollup, the test suite refuses outbound HTTP, the site moved to Astro 7, TestFlight notes come from the changelog, and metadata-relay v0.14.0 ships alongside (#640, #584, #646, #618, #643, #636, #574, #583, #610, #619, #620, #622, #631, #629, #634, #611, #542, #693, #604, #651, #697, #442, #571, #570, #581, #590, #621, #533, #547, #573, #549, #550, #630, #694, #696, #529, #452, #478)

Upgrade notes

Back up first. Thirty-seven migrations, two of them irreversible.

  1. Music, books and adult are removed. Library paths of those types convert to mixed and are left unmonitored. Leave monitoring off: a mixed scan collects video only and would treat the rest as deleted. Twelve tables are archived to NDJSON under MYDIA_DATA_DIR, else the SQLite directory, else /data, else priv/data, which does not survive an image pull (#471).
  2. Two migrations do not roll back. The import split discards orphan-only analysis (#628), and the duplicate fold deletes the losing media_files rows outright (#658).
  3. Remote access turns on for any install that already has a config row. The old flag was never enforced, so a stored false records a click and nothing more. ENABLE_REMOTE_ACCESS=false is still the hard off switch, and pairing is no longer admin-only (#510).
  4. Manual claim codes fail against players that have not updated. Use the QR on the same screen, which works across versions. The unencrypted fallback comes out one minor from now (#513).
  5. /import will show files that were invisible before, and /add and /request 404 with no redirect (#472, #600, #649, #676).
  6. Import lists default to on, so a list configured with auto-add starts being honoured and its items are monitored (#665).
  7. Check your monitored flags once. Re-enrichment had been resetting them since long before this release, and nothing restores one already overwritten (#659).
  8. Deleting a file routes through the trash and holds it for TRASH_RETENTION_DAYS, 30 by default (#666).
  9. Some things get re-evaluated on first boot: the relink migration can flip episodes to present (#679), extras are reclassified (#596), and HDR files are re-ranked against your quality profiles (#543).
  10. PostgreSQL gets column widening across the schema, which takes longer on a large database. monitoring_preset is also dropped from media_items (#448, #451, #447).

Full Changelog: v0.13.2...v0.14.0