Skip to content

mydia

v0.10.0 Feature

This release adds 3 notable features for engineering teams evaluating rollout.

Published 19d Media Servers
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Summary

AI summary

Usenet feature parity is complete with parsing, filtering, ranking, routing, priority mapping, stall detection, blacklisting, and webhook support.

Changes in this release

Feature Medium

Parses `usenetdate` and `nzb_grabs` from Newznab/Prowlarr/NZBHydra2 responses for NZB freshness ranking.

Parses `usenetdate` and `nzb_grabs` from Newznab/Prowlarr/NZBHydra2 responses for NZB freshness ranking.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Filters Usenet releases by minimum post age per indexer setting.

Filters Usenet releases by minimum post age per indexer setting.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Ranks NZB results with a dedicated scoring branch instead of torrent heuristics.

Ranks NZB results with a dedicated scoring branch instead of torrent heuristics.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Routes Usenet downloads by content type to separate SABnzbd/NZBGet categories for movies, TV, and anime.

Routes Usenet downloads by content type to separate SABnzbd/NZBGet categories for movies, TV, and anime.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Maps quality to a 5-tier priority profile per client for automatic download prioritization.

Maps quality to a 5-tier priority profile per client for automatic download prioritization.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Detects stalled Usenet downloads at 99% and surfaces them with a badge in the Downloads view.

Detects stalled Usenet downloads at 99% and surfaces them with a badge in the Downloads view.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Blacklists failed Usenet releases to prevent repeated search attempts.

Blacklists failed Usenet releases to prevent repeated search attempts.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Accepts SABnzbd and NZBGet completion webhooks as a fast-path download completion signal.

Accepts SABnzbd and NZBGet completion webhooks as a fast-path download completion signal.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Auto-rename on import using TRaSH Guides naming format, toggleable per library.

Auto-rename on import using TRaSH Guides naming format, toggleable per library.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

NFO writer emits Jellyfin-compatible `.nfo` files on import and refresh, opt-in per library.

NFO writer emits Jellyfin-compatible `.nfo` files on import and refresh, opt-in per library.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Issues tab revamp into three-section layout: unmatched, partial pack, failed with first-class actions.

Issues tab revamp into three-section layout: unmatched, partial pack, failed with first-class actions.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Sidebar now surfaces bundled web player with prominent label and CTA banner.

Sidebar now surfaces bundled web player with prominent label and CTA banner.

Source: llm_adapter@2026-05-21

Confidence: high

Dependency Medium

Iroh upgraded to 1.0.0-rc.0 for P2P core, relay image updated to n0computer/iroh-relay:1.0.0-rc.0.

Iroh upgraded to 1.0.0-rc.0 for P2P core, relay image updated to n0computer/iroh-relay:1.0.0-rc.0.

Source: llm_adapter@2026-05-21

Confidence: high

Performance Medium

Test suite execution speed improved by ~42%, runtime reduced from 221s to 127s.

Test suite execution speed improved by ~42%, runtime reduced from 221s to 127s.

Source: llm_adapter@2026-05-21

Confidence: high

Performance Medium

Docker CI builds shortened from over 2 hours to approximately 15 minutes.

Docker CI builds shortened from over 2 hours to approximately 15 minutes.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Series rescan no longer imports wrong files or deletes metadata on refresh.

Series rescan no longer imports wrong files or deletes metadata on refresh.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

SQLite FK corruption during table recreation fixed.

SQLite FK corruption during table recreation fixed.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Word-form titles like `Season Two Episode Five` now import correctly.

Word-form titles like `Season Two Episode Five` now import correctly.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

File parser uses byte offsets for regex slicing, fixing Unicode title mismatches.

File parser uses byte offsets for regex slicing, fixing Unicode title mismatches.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

`Req.TransportError` from FlareSolverr and indexer connections no longer crashes the page.

`Req.TransportError` from FlareSolverr and indexer connections no longer crashes the page.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Paused torrents at 100% correctly classified as completed.

Paused torrents at 100% correctly classified as completed.

Source: llm_adapter@2026-05-21

Confidence: high

Refactor Medium

AdminConfigLive split into eight focused LiveViews for settings, indexers, quality profiles, etc.

AdminConfigLive split into eight focused LiveViews for settings, indexers, quality profiles, etc.

Source: llm_adapter@2026-05-21

Confidence: high

Refactor Medium

Settings and Downloads contexts split into facade and sub-modules.

Settings and Downloads contexts split into facade and sub-modules.

Source: llm_adapter@2026-05-21

Confidence: high

Refactor Medium

MediaLive.Show extracted into focused event modules: SearchEvents, FileEvents, SubtitleEvents, etc.

MediaLive.Show extracted into focused event modules: SearchEvents, FileEvents, SubtitleEvents, etc.

Source: llm_adapter@2026-05-21

Confidence: high

Refactor Medium

Type safety overhaul with @spec and @type annotations across Ecto schemas, contexts, and Oban workers.

Type safety overhaul with @spec and @type annotations across Ecto schemas, contexts, and Oban workers.

Source: llm_adapter@2026-05-21

Confidence: high

Refactor Medium

`QueryHelpers.Filterable` macro introduced for declarative query filters across collections.

`QueryHelpers.Filterable` macro introduced for declarative query filters across collections.

Source: llm_adapter@2026-05-21

Confidence: high

Full changelog

Mydia v0.10.0

v0.10.0 is here. After three betas across the past two days, this release graduates the long-running Usenet feature-parity push, the Release Parser v3 rewrite, the AdminConfig split, the type-safety overhaul, and the iroh 1.0 transport upgrade into a single stable cut.

If you've been running :beta, this is what you've been testing — minus a couple of last-mile fixes folded in below.

🎬 The big stories

Usenet, finally feature-complete

When the Usenet pipeline shipped a few months back, it worked — but it wasn't a peer of the torrent path. v0.10.0 closes the gap. Mydia now:

  • Parses usenetdate and nzb_grabs from Newznab/Prowlarr/NZBHydra2 responses, so the ranker can reason about NZB freshness and popularity instead of pretending NZB results were torrents with zero seeders.
  • Filters releases by minimum post age (per-indexer setting), so you can avoid grabbing brand-new posts that haven't propagated yet.
  • Ranks NZB results properly with a dedicated scoring branch instead of torrent heuristics.
  • Routes downloads by content type — separate SABnzbd/NZBGet categories for movies vs TV vs anime, instead of the old one-category-per-client setup.
  • Maps quality to a 5-tier priority profile per client, so you can push 4K to high priority and SD to low without touching the client.
  • Detects stalled downloads at 99% and surfaces them with a badge in the Downloads view rather than polling forever.
  • Blacklists failed releases so the next search doesn't pick the same broken NZB again.
  • Accepts SABnzbd + NZBGet completion webhooks as a fast-path signal on top of the existing poll loop. MediaImport is now idempotent so duplicate triggers from webhook + poll are safe.

Internally, SABnzbd (665 LOC) and NZBGet (517 LOC) now share a unified DownloadStatus struct and adapter helpers, with table-driven state mapping tests against frozen JSON fixtures from real API responses.

Closes #119, #120, #121, #122, #123, #124, #125, #126, #127, #128, #129.

Release Parser v3

The old FileParser.V2 was a regex-soup with edge cases that bit us in real-world torrent titles. v3 is a clean tokenizer → classifier → resolver pipeline with a regression corpus harvested from Sonarr and Radarr. All 14 call sites have been migrated, V2 has been deleted, and the parser is now 245-case parity tested against the corpus.

The tokenizer is byte-safe (the Unicode bugs in the old parser that caused the file-parser-unicode-byte-offset fix), and the quality extractor finally handles weird release groups, parenthesized sub-expressions, and word-form Season 1 Episode 5 titles that V2 missed.

Iroh 1.0.0-rc.0 for P2P transport

The P2P core (mydia_p2p_core) now runs against the first release-candidate of iroh 1.0, up from 0.96.1. Client and server stay protocol-compatible because both wrap the same Rust crate. If you run your own relay, note that n0computer dropped the v prefix at 1.0+ — the matching image is n0computer/iroh-relay:1.0.0-rc.0.

Auto-rename on import (TRaSH Guides format)

You can now opt into automatic file renaming on import using the TRaSH Guides naming format. Per-library toggle, exposed in library settings and through GraphQL.

Jellyfin NFO export

NFO writer module that emits Jellyfin-compatible .nfo files on import and refresh. Per-library opt-in plus a bulk export mix task for back-filling existing media. Handy if you're running Mydia alongside Jellyfin and want metadata to follow your files.

Issues tab revamp

The Downloads → Issues tab is now a proper three-section layout: unmatched, partial pack, failed. Manual match, manual resolution, and dismiss are all first-class actions instead of buried buttons. Season packs with unresolved files now do partial imports — the matched episodes land, the rest stay flagged.

Player CTA in the sidebar

The sidebar now surfaces the bundled web player with a prominent label and a CTA banner — so first-time users actually discover that /player is a thing.

🛠 Reliability & correctness

  • qBittorrent: multipart uploads, post-add verification, 5.x compatibility, and a less-aggressive "missing" detector that doesn't flap on slow refreshes.
  • Season pack redownload loop: fixed — packs no longer requeue every hour. Trackerless torrents are now detected structurally instead of by string matching.
  • Stuck season-pack imports self-heal instead of retrying forever after a partial-state crash.
  • Title mismatch filter: search results where the parsed title doesn't match the target are rejected upfront. Unicode normalization (NFD) is consistent across the search path so accents don't cause false negatives.
  • Crash reporting: Logger backend installs cleanly on Elixir 1.15+, and the admin toggle actually works.
  • Configurable metadata language for TMDB/TVDB requests, per install.
  • Test suite is ~42% faster (221s → 127s) and Docker CI builds dropped from 2h+ to ~15min.

🧱 Architectural cleanup

A lot of this release is invisible to users but matters for everyone contributing or reading the code:

  • AdminConfigLive split into eight focused LiveViews (AdminSettingsLive, AdminIndexersLive, AdminQualityProfilesLive, AdminLibraryPathsLive, AdminMediaServersLive, AdminDownloadClientsLive, AdminSystemLive, AdminRemoteAccessLive). The monolith is gone.
  • Settings and Downloads contexts split into facade + sub-modules.
  • MediaLive.Show extracted into focused event modules (SearchEvents, FileEvents, SubtitleEvents, plus five more).
  • Type safety overhaul: @spec and @type t annotations across all 43 Ecto schemas, all context module public functions, and 14 Oban workers (with typed Args structs). MediaFile.metadata is now a FileMetadata struct, not a plain map.
  • QueryHelpers.Filterable macro for declarative query filters, rolled out across collections, accounts, and downloads.
  • Component organization conventions documented (three-tier system: core / domain / feature-local).

⚙️ Infra

  • Iroh upgraded to 1.0.0-rc.0 for the P2P core (relay image: n0computer/iroh-relay:1.0.0-rc.0).
  • Docker CI: replaced Blacksmith with standard GitHub Actions for layer caching.
  • CI postgres containers no longer leak between precommit runs.

🐛 Notable fixes

  • Series rescan no longer imports wrong files / deletes metadata on refresh.
  • SQLite FK corruption during table recreation: fixed.
  • Word-form Season Two Episode Five filenames now import correctly.
  • File parser uses byte offsets for regex slicing, fixing Unicode title mismatches.
  • Req.TransportError from FlareSolverr and indexer connections no longer crashes the page.
  • Paused torrents at 100% are correctly classified as completed.

📦 Try it

docker pull ghcr.io/getmydia/mydia:0.10.0
# Postgres variant
docker pull ghcr.io/getmydia/mydia:0.10.0-pg
# Or the rolling stable tag
docker pull ghcr.io/getmydia/mydia:latest

Player builds for Android, macOS, Windows, and Linux are attached below.

Feedback welcome — open issues at getmydia/mydia.

Full Changelog: https://github.com/getmydia/mydia/compare/v0.9.0...v0.10.0

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track mydia

Get notified when new releases ship.

Sign up free

About mydia

Your personal media companion, built with Phoenix LiveView

All releases →

Beta — feedback welcome: [email protected]