Skip to content

Releases: braedonsaunders/ether

v0.2.58

Choose a tag to compare

@braedonsaunders braedonsaunders released this 31 Oct 15:27

What's Changed

  • Client Rules & Android Mobile 4K Support (#187): Added an optional Maximum resolution override per Client Rule (Releases → Client rules) and updated ApplyClientRules so user-defined Client Rules override the default 1080p ceiling for the official Plex Android mobile app (up to 2160p with HDR10 when the selected profile allows HDR), while preserving 1080p as the default when no rule overrides it.
  • Separate Movie & TV Episode Size Limits + Prefer Largest File (#186): Added optional TV episodes size-per-minute bounds (episodeMinSizeMbPerMin / episodeMaxSizeMbPerMin, falling back to the movie limits when 0) and a Prefer largest file toggle (preferLargest) to quality profiles (Releases → Quality), and raised the default 4K profile ceiling from 600 to 1000 MB/min so full 80+ GB 4K UHD Remuxes are not rejected for runtime size.
  • 4K Profile Remote Bitrate Cap Fix (#179, #186): Fixed the default 8000 kbps remote bitrate ceiling (transcode.remoteMaxBitrateKbps) overriding 4K (2160p / unlimited) quality profiles when the client did not send an explicit bitrate limit, which previously caused 1080p releases or tiny ~3 GB 2160p encodes under 8 Mbps to rank ahead of normal 4K releases and remuxes.
  • Support Capture Retention Slot Eviction (#184): Fixed Recorder.Start in internal/diagnostics so finished support captures retained for download are evicted oldest-first when starting a new capture instead of returning too many support captures are already open.

Ether 0.2.57

Choose a tag to compare

@github-actions github-actions released this 31 Oct 14:23

This release adds Profilarr (Dictionarry) quality profile and custom format import (#128), adds opt-in per-viewer Plex account watch-state and rating sync (#143), and fixes Plex alphabet jumpbar (firstCharacter) offsets (#185).

Profilarr (Dictionarry) Quality Profile Import

  • Profilarr / Dictionarry quality profile import: Releases → Quality now includes Profilarr (Dictionarry) alongside TRaSH Guides and JSON file / paste as an import source, compiling Dictionarry's v2 database operations into Radarr and Sonarr quality profiles (2160p Remux, 2160p Quality, 2160p Balanced, 1080p Remux, 1080p Quality, 1080p Quality HDR, 1080p Balanced, 1080p Efficient, 1080p Transparent, 720p Quality, and SD Quality) with custom formats, scores, regex rules, and language conditions (#128).

Plex Account Watch-State Sync

  • Per-viewer opt-in Plex watch-state and rating sync: each viewer can connect their own Plex account under Viewers → Access and enable future sync to publish watched/unwatched marks and 1–5 star ratings to scrobbles.plex.tv, with manual Import and Export controls for existing history (#143).
  • Local playback remains authoritative: sync delivery is asynchronous, bounded, and fenced per viewer so neither a Plex outage nor an unmapped GUID delays or blocks local playback, and guest accounts cannot bind the server owner's Plex token (#143).

Library Browse & Alphabet Jumpbar Fixes

  • Accurate firstCharacter alphabet jumpbar counts and offsets: /library/sections/{id}/firstCharacter now applies library visibility exclusions identically to Browse and separates leading # (sort_title < 'a') from trailing non-ASCII sort titles (sort_title >= '{'), so jumping to A–Z lands on the exact starting letter instead of drifting forward (#185).

Ether 0.2.56

Choose a tag to compare

@github-actions github-actions released this 31 Oct 12:57

This release fixes missing owner collection shelves and disappearing genre shelves on Plex Home, restores subtitle and audio stream listings on initial playback queue creation, expands LAN GDM multicast discovery across active network interfaces for Fire TV clients, holds unlabelled .XviD / MPEG-2 scene encodes to profile minimum resolution floors, refills Play Versions candidates when resuming a remembered release, and reduces settings snapshot allocations during availability discovery.

Plex Home, Playback, and Discovery

  • Keep owner collection shelves and genre rows stable on Plex Home: owner-authored collection shelves (RowSourceOwner) are no longer hidden by the 12-item algorithmic shelf floor, cold-start viewer models inherit the active generic presentation's shelf-count floor so shelves such as Acclaimed <Genre> do not vanish when /hubs/items expands count to 50, /hubs/items resolves items against the requesting viewer's layout, and saving or deleting a collection immediately invalidates cached owner shelves (#180).
  • Warm detail metadata before rendering /playQueues: POST /playQueues now warms detail metadata for the selected item when not already warm, and paused or stopped playback sessions no longer block detail-page warming, ensuring embedded and external subtitle tracks appear immediately in the Plex Web and Android player OSD (#145).
  • Join GDM multicast across all active LAN interfaces: listenGDM now binds 0.0.0.0 (IPv4zero) and joins 239.0.0.250 across every active non-loopback, non-virtual multicast interface so Plex on Fire TV and Android TV discovers Ether reliably on multi-NIC hosts (#181).
  • Refill Play Versions candidates on resumed detail warm-up: when an admitted detail warm-up reuses a remembered release after a restart or search-cache expiry, Ether now triggers a bounded background search-cache refill so alternative versions remain available in Plex's Play Version menu (#182).

Release Selection, Collections, and Availability

  • Hold unlabelled .XviD and MPEG-2 releases to minimum resolution floors: floorHeight now treats unlabelled SourceUnknown releases with xvid or mpeg2 codecs as 480p so SD .XviD-AFG releases cannot bypass a 720p or 1080p profile minimum resolution gate (#179).
  • Include TV content ratings in Movie and Mixed collection rule pickers: the contentRating facet picker in the collection rule builder now always includes standard MPAA and US TV ratings (TV-Y, TV-G, TV-Y7, TV-PG, TV-14, TV-MA) even before those ratings are cached in the local TMDB movie facet table.
  • Accept Torznab/Newznab URLs pasted with query parameters: apiURL now parses and normalizes indexer URLs that already contain query parameters (such as copied Jackett feed links with ?apikey=...) before appending /api.
  • Reuse settings snapshots during availability discovery: availability filtering, prioritization, and newly available shelves now capture a single isolated settings and source snapshot per discovery operation instead of cloning full settings per check (#183).

Ether 0.2.55

Choose a tag to compare

@github-actions github-actions released this 31 Oct 11:09

This release completes Plex migration watch-state folding for history-only
titles, removes the 100-item preview truncation in the admin console, and skips
empty Plex collections during import.

Plex Migration and Watch State

  • Fold history-only plays into watched state and preview items: historical
    viewings resolved from /status/sessions/history/all for movies and episodes
    that were later removed or replaced in the source Plex library are now folded
    into the migration plan's watch records (plan.items) and upserted into
    state_watch (view_count, counted, and last_viewed_at) during import so
    every historical watch marks the title watched across Plex clients and
    recommendations (#152).
  • Show all matched watch records in the import preview: removed the
    100-item display slice (plan.items.slice(0, 100)) in the Settings →
    Backups & import
    review list so the scrollable preview shows all matched
    watch records (#152).
  • Skip and clean up empty Plex collections: collections and playlists in
    Plex with zero resolved titles (such as empty collection shells left behind
    after library files were removed) are no longer imported as empty titles
    specs that log invalid collection: sources[0].keys: pick at least one title
    on refresh, and any previously imported zero-title collection specs are
    automatically pruned by the collection scheduler (#152).

Ether 0.2.54

Choose a tag to compare

@github-actions github-actions released this 31 Oct 09:21

This release adds configurable same-quality alternative releases to Plex's
Play Version menu and eliminates cold account-list waiting during speculative
background checks on TorBox and Debrid-Link.

Plex Play Versions

  • Offer same-quality alternative releases after Auto: detail pages now list
    other ranked releases sharing the automatic pick's cut, resolution, and HDR
    type right after Auto in Plex's Play Version menu, labelled by quality,
    audio, size, and release group (for example
    1080p WEB-DL · DD+ 5.1 · 2.3 GB · FLUX) so viewers can switch releases if
    one fails (#176).
  • Configurable alternative count (0 to 3, default 1): owners can set
    Same-quality versions to offer (resolver.sameQualityAlternatives) under
    Releases → Release selection in the admin console, raising the shared
    Play Version picker cap (core.MaxVariants) from 4 to 7 while preserving
    distinct quality tiers and cuts (#176).

Debrid and Resolver

  • Non-blocking cold account lists in background checks: speculative
    background checks on TorBox and Debrid-Link now consult known torrent IDs or
    a fresh one-minute account snapshot and start a single shared read-only
    refresh in the background without blocking, allowing foreground playback to
    proceed immediately while sharing the in-flight snapshot for duplicate
    recovery (#177).

Ether 0.2.53

Choose a tag to compare

@github-actions github-actions released this 31 Oct 08:22

This release fixes Plex Media Server watch-history migration for stripped and
stale history entries, fixes CSV import/export round-tripping and CSRF upload
checks in the admin console, and ensures foreground playback retries debrid
candidates that background speculative checks cannot evaluate without adding the
torrent.

Migration and Backups

  • Resolve stripped and stale Plex /status/sessions/history/all rows:
    Plex Media Server omits ratingKey, grandparentRatingKey, year, and
    <Guid> elements on historical play rows once an episode or movie has been
    upgraded, replaced, or removed from the library. Migration previews now index
    library shows and movies by title during the library scan, extract release
    years from originallyAvailableAt (YYYY-MM-DD) when year is omitted, and
    resolve stripped or stale (404) episode and movie history rows via library
    show/movie metadata and catalog search (including country suffixes such as
    (US) / (UK), trailing (YYYY) years, and normalized punctuation) (#152).
  • Prefer tmdb:// GUIDs and type-scoped external ID lookups: migration now
    checks tmdb:// <Guid> tags before imdb:// and tvdb:// tags, supports
    legacy Plex agent episode GUIDs (com.plexapp.agents.thetvdb://... and
    com.plexapp.agents.themoviedb://...), and scopes external ID lookups and
    migration searches by media type so GateMoviesByHomeRelease, library
    exclusions, or overlapping TVDB movie/show IDs never hide watched titles
    (#152).
  • Allow text/csv uploads on /api/adoption/migration/csv/preview: the
    admin CSRF gate (csrfOK) now permits same-origin POST uploads with
    Content-Type: text/csv (with X-Ether-Request: 1) on the CSV preview
    endpoint instead of rejecting browser CSV imports with HTTP 403 (#173).
  • Round-trip episode watch history in Trakt CSV exports and imports: Trakt
    CSV exports now write the series title, premiere year, and show TMDB/IMDb IDs
    alongside season, episode, and episode_title columns for episode entries,
    and PreviewCSV resolves type=episode rows via show TMDB/IMDb/TVDB IDs or
    show title + season/episode numbers (#174).

Debrid and Resolver

  • Foreground retry when a background debrid check cannot decide: when a
    speculative background check on Real-Debrid or TorBox cannot verify an unadded
    torrent without adding it to the account (core.ErrForegroundOnly), foreground
    playback now tries the higher-ranked release instead of skipping it in favor
    of a lower-ranked release already in the account (#175).

Ether 0.2.52

Choose a tag to compare

@github-actions github-actions released this 31 Oct 05:18

This release fixes pre-play audio and subtitle track selectors across cold
detail-page opens, stopped playback, and TV show/season views on Plex clients
(including NVIDIA Shield / Android TV), fixes embedded text subtitle playback
during remux/transcode sessions, and adds default TRaSH release group custom
formats to quality profile imports.

Plex Playback and Pre-Play Track Selectors

  • Synchronous detail-page warm-up probe (WaitWarmProbe): opening a movie
    or episode detail page now waits up to a bounded budget (4s) for the
    background warm probe (probeGeneration) to complete before rendering
    <Media><Part><Stream> metadata, so the very first detail-page visit lists
    real embedded audio and subtitle tracks instead of a single estimated track
    (#145).
  • Retain probed tracks on Auto across fallback candidates and playback:
    when Auto playback selects a candidate other than Variants[0] (because
    the top cached search result was skipped during health or debrid cache
    checks), stopping playback and returning to the detail page now attaches the
    probed tracks to the Auto entry (Media[0]) instead of dropping all
    <Stream> tags (#145).
  • Retain warm-probed tracks across Prepare and extended browsing:
    consuming a warm resolution for playback now preserves its probed MediaInfo
    in the warm cache (60m TTL, 128 entries, 30/min detail warm-up budget,
    and automatic replacement of stale in-flight detail warm-ups when navigating
    to a new title), and ResumedTracks matches across LAN/WAN remote-cap
    boundaries in Docker bridge setups (#145).
  • TV show OnDeck and season episode track warming: opening a TV show page
    (includeOnDeck=1), /ondeck, or a season episode list (/children) now
    warms the next playable episode (OnDeck or first unwatched/in-progress
    episode) and includes its probed <Stream> tags in the response (#145).
  • Embedded text subtitles during remux and transcode sessions: selected
    non-burned embedded text subtitles in remux/transcode decisions now report
    location="sidecar" with key="/library/streams/<id>" and serve extracted
    WebVTT/SRT cues from /library/streams/<id> and
    /video/:/transcode/universal/subtitles, instead of reporting
    location="segments-subtitle" when FFmpeg runs with -sn (#145).

Quality Profiles and Import

  • TRaSH default release group custom formats: quality profile imports now
    include built-in TRaSH release group custom formats (WEB Tier 01/02/03,
    HD Bluray Tier 01/02/03, UHD Bluray Tier 01/02/03, Remux Tier 01/02,
    LQ, LQ (Release Title), Bad Dual Groups, No-RlsGroup, Obfuscated,
    Retags, Scene) with pre-populated regex rules so imported profiles score
    release groups out of the box (#86, #172 — thanks @evulhotdog!).

Ether 0.2.51

Choose a tag to compare

@github-actions github-actions released this 31 Oct 02:30
4588b98

This release fixes Intel VAAPI hardware transcoding on Linux and in Docker,
preserves warm-probed embedded audio and subtitle tracks on Plex detail pages
when quality variants are active, and improves Plex Media Server migration
preview matching.

Transcoding and Docker

  • Full Intel VAAPI shader drivers in Docker (amd64): the Docker image now
    installs intel-media-va-driver-non-free and i965-va-driver-shaders
    instead of Debian's stripped intel-media-va-driver / i965-va-driver
    packages. On Intel Gen8–Gen12 GPUs (including HD Graphics 620 / Kaby Lake),
    this restores the EU kernel shaders needed for VAEntrypointEncSlice
    (QVBR / VBR / CBR rate control) and VAEntrypointVideoProc
    (scale_vaapi / tonemap_vaapi GPU video processing) (#13).
  • VAAPI rate-control mode probing and fallback: at startup Ether now probes
    which rate-control modes (QVBR, VBR, CBR, CQP) each VAAPI encoder
    (h264_vaapi, hevc_vaapi) supports on the active device. Bare-metal hosts
    using Low-Power-only (VAEntrypointEncSliceLP) or CQP-only VAAPI drivers
    automatically fall back to VBR, CBR, or bitrate-scaled CQP instead of
    failing encoder init with Driver does not support QVBR RC mode (#13).
  • VAAPI HDR tone-mapping probe: startup also probes tonemap_vaapi
    alongside scale_vaapi; if the driver supports GPU scaling but rejects
    hardware HDR tone-mapping, Ether tone-maps in software and still encodes on
    the GPU (#13).

Plex Playback and Metadata

  • Pre-play audio and subtitle track selectors with variants enabled:
    /library/metadata/<key> now forwards warm-probed MediaInfo streams into
    the Auto variant entry when no resume row is recorded yet, instead of
    overwriting the warm-probed tracks with the variant resolver's single-stream
    estimate (#145).

Migration and Import

  • Plex Media Server preview matching and unwatched filtering: full PMS
    previews no longer resolve or emit Unmatched: warnings for unwatched,
    unrated library items that carry no personal watch state, and items with
    opaque plex:// GUIDs now fall back to exact title + year catalog matching
    when external <Guid> tags are absent (#152).

Ether 0.2.50

Choose a tag to compare

@github-actions github-actions released this 31 Oct 01:14
2984620

This release fixes watched episode counts in library, search, and hub listings,
custom collection background artwork and UltraBlur colours, the Release
History search link, catalog health polling during background syncs,
lower-bitrate fallback selection during direct-play down-failover, and debrid
streaming against slow or rate-limiting CDN edges.

Playback and library

  • Watched counts in library, search, and hub lists: shows and seasons that
    have watched episodes now include viewedLeafCount (and viewCount when all
    regular episodes are watched) in /library/sections/{id}/all, /hubs, and
    /hubs/search responses, so marking a show or season watched stays visible
    when Plex clients refresh from list endpoints (#163).
  • Custom collection artwork on /art and UltraBlur: collections configured
    with a custom artwork URL now use that artwork for /art / /background and
    derive UltraBlurColors from the custom image instead of falling back to the
    first member's TMDB backdrop (#164).
  • Release History title search link: "Search releases for this title" in
    Releases → History now links to /releases/pinned?key=…&title=… (where
    the release search lives), and legacy /releases/search?… deep links redirect
    to /releases/pinned with query parameters preserved (#166).
  • Catalog health and sync batching: catalog status polling now caches and
    coalesces mirror count queries across unchanged write generations, batches
    discover-page upserts into one transaction per page, and serves the last
    known counts with live sync progress if a status poll times out under disk
    load (#167).
  • Lower-bitrate remux fallback on direct-play down-failover: when a
    direct-play session down-fails over and the first healthy size-mismatched
    candidate is higher bitrate than the starving release, Ether now supersedes
    it with a later lower-bitrate mismatch instead of dropping the lower-bitrate
    candidate (#168).
  • Debrid CDN handshake tolerance, deferred hedging, and backoff: raised the
    debrid media dial timeout to 10s and TLS handshake timeout to 15s, deferred
    the urgent-read hedge timer until after the primary connection finishes
    DNS/TCP/TLS setup, added per-host exponential backoff (500ms to 30s) on
    connect/TLS/transport failures, and halved the per-host connection cap (down
    to 2) for 3 minutes after ECONNRESET/WSAECONNRESET or HTTP 429 (#162).

Ether 0.2.49

Choose a tag to compare

@github-actions github-actions released this 30 Oct 22:36
f1c35d7

This release lets owners rank releases with rules they type, record one
device's problem as a redacted support archive, and corrects health, new
seasons, Home rows, and several playback and library gates.

New and improved

  • Release preferences: on Releases → Quality profiles, edit a profile
    and type terms to require, prefer, or avoid. A term can be a language, a
    tag, a release group, a codec, or any other text. Order is priority.
    Preview the draft against pasted filenames, or search a title to include
    the rest of the quality rules. Import and export the list. The rules are
    part of the profile, so editing them forgets the release Ether had
    remembered for that profile. The title's original language is used only
    while ranking that title. Changing it forgets a remembered release that
    was chosen with an original-language rule (#156).
  • Integrations as brand cards: the Integrations page shows each service
    as a brand card. Turning a card on walks through setup, and the service
    stays off until that setup is saved. The new copy is translated in the
    owner-console catalogues (feat/integrations-public).
  • Record a problem: from Logs, or from command search, record one device
    and download a single redacted support ZIP (ether.support.v1). An
    unknown device is not selected for you. A capture that only saw polls
    says no playback request was observed. Titles, usernames, and addresses
    are separate opt-ins, and the finish preview names the identity that
    will be in the archive. Review the ZIP before sharing (#151).
  • New seasons of returning shows: a returning series, including its
    season list, is refreshed within an hour instead of waiting out the
    24-hour catalogue refresh. Reported on Reddit for Dexter: Resurrection
    season 2 (#148).

Playback and library

  • Unlabelled WEB releases and a 4K floor: a WEB-DL or WEBRip with no
    resolution in the name counts as SD (480) against the profile minimum.
    That stops an SD WEB release winning when the 4K copy cannot play for
    the client. Reported on Reddit for Coyote vs. Acme. Unlabelled HDTV
    and DVD rips stay exempt. An explicit version pick or a pin still
    bypasses the floor (#149).
  • Home rows: empty Continue Watching, in-progress, and
    viewer-restricted hubs are left out, so Plex for Android no longer
    receives blank rows at the top of Ether's Home. Personalised order stays
    put for one viewer, library surface, and device class until browsing is
    idle for five minutes or the day changes. A repeated hub is listed once.
    Personalised ranking itself is unchanged. A phone build and a Shield
    sitting have not been checked yet (#155, #150).
  • Android audio and subtitle choices: Plex for Android, Android TV and
    Fire TV decisions list every real audio and subtitle track, so the
    in-player menu can switch between them. On a first open Ether uses the
    file probe the detail page already started, rather than a one-audio
    estimate. If that probe has not finished yet, that one open still shows
    the estimate. Embedded text subtitles picked during playback are now
    served from the session. Other clients keep the exact Plex Media Server
    decision shape. Contributed by @alfablac, verified on a Galaxy S24
    (#160, #145).
  • Plezy gets 4K: Plezy on Linux, Windows and macOS receives the same
    2160p, HEVC and HDR10 capabilities as other desktop players instead of the
    generic 1080p H.264 profile. Plezy on Apple devices and Android TV keeps
    its platform's capabilities; Android phones stay at 1080p, like the
    official Plex app. Contributed by @ggiannotti (#161, part of #86).
  • Director disclaimers: a movie release named like
    Title 2026 NOT The <Director> FILM is rejected when that director is
    the catalogue director of the title being resolved. The complete name is
    required. Episodes are unchanged (#154).
  • VAAPI when GPU scaling is unavailable: if scale_vaapi fails a
    one-frame probe, VAAPI sessions decode and scale in software and upload
    frames to the hardware encoder, instead of failing the hardware path and
    transcoding every ladder rung on the CPU. This has automated coverage
    only. No live GPU result is claimed, and the #13 reporter has been asked
    for vainfo output (#153, #13).
  • Content ratings: a content-rating rule set to "is none of" also hides
    titles with no rating, so a missing certification cannot slip past an
    allowlist. Unknown country, genre, year, and language still do not match
    an exclusion. A known local rating still wins over an incomplete remote
    summary (e7fb04e2).
  • Health behind a reverse proxy: an installed, unexpired certificate
    that Ether has not trust-checked stays "Not verified", and that row no
    longer holds the whole server at "Status incomplete." A configured
    direct route and a published custom route are labeled separately.
    Neither label means Ether has proved the server is reachable from
    outside. Missing validity dates, real expiry, renewal, sign-in, and
    publishing failures still count (#146, #144).
  • Large Live TV guides: playlist and XMLTV uploads go to the server
    as the raw file, gzip included, and are streamed. Ether keeps only the
    guide channels the playlist uses, from one day back to 14 days ahead, so
    a full provider EPG no longer hits "exceeds the import size limit." The
    limits are now 2 GB decompressed for a guide and 64 MB for a playlist,
    and URL refreshes use the same filter (#158).
  • Subtitles download only when you pick one: Ether no longer downloads
    OpenSubtitles files in the background (detail pages, playback warm-up,
    preferred languages, or timing alignment), which could use up a free
    account's daily quota and make every later selection fail. Search and
    already-downloaded subtitles still work. A download happens only when a
    viewer chooses a subtitle.
  • Plex import preview: a large preview used to run inside one request
    and show nothing until the scan finished, so the screen stayed on
    "Working…" until the browser or a proxy dropped it (#152). The preview
    now returns immediately and scans in the background. The import screen
    shows how many titles have been scanned, a cancel button, and the
    failure text in an alert. Mapping runs eight titles at a time. Progress
    and failures are logged as component=migrate, without the Plex token
    (#157).

After upgrading

  • Reload an already-open owner console to use Release preferences, the
    Integrations cards, and Record a problem.
  • If a library uses a content-rating "is none of" rule, unrated titles in
    that library are now hidden. Confirm that is what you want.
  • #144 can be checked on the reverse-proxy server that reported a permanent
    "Status incomplete." The certificate row remains "Not verified."

Please retest

These reports are not claimed fixed. After upgrading, please say whether
they still happen:

  • @aZuiZui, #86: 2160p releases missing from the ranking list.
  • @darkjezza, #94: an error when changing quality.
  • @darkjezza, #21: playback still unavailable with the cache turned off.
  • @c-anth, #42: the tray and Plex still using the previous port after Ether
    is moved off 32400.
  • @FizzWhirl, #152: a large Plex import preview that sits on "Working…"
    and then stops. The new job was checked offline, not against that
    library.

Known limits

No live GPU confirmation for the VAAPI scale probe. The shape of
unselected Android tracks follows library metadata; it has not been
compared with a real Plex Media Server capture from the Android app. Prism, Jellyfin client
support, and watch-state sync are not in this release. The Integrations
cards are the owner console only.

Full changes: v0.2.48 → v0.2.49.