Download Latest Version Release v0.31.0 source code.zip (4.8 MB) Google Add to Preferred Sources
Home / v0.31.0
Name Modified Size InfoDownloads / Week
Parent folder
README.md 2026-09-13 13.2 kB
Release v0.31.0 source code.tar.gz 2026-09-13 4.2 MB
Release v0.31.0 source code.zip 2026-09-13 4.8 MB
Totals: 3 Items   9.0 MB 28

✨ New Features

Central Log Collector and In-App Log Browser

  • Container output is normalized into one log stream (and optionally one file under /data/logs/), with severity mapped per source and traceback / Postgres detail lines kept with their parent record. (#1601) - Thanks @nagelm:
  • Settings → System Settings adds Persist Logs to File, Maximum Log File Size (MB) (default 5 MB, cap 20 MB), and Log Files Kept (live file plus rotations); changes apply at runtime without a restart
  • Controls are hidden when no collector is running (for example bare-metal or some dev setups)
  • System → Logs lets admins list, view, and download those log files without shell access. - Thanks @nagelm:
  • Colour by severity, filter by level / category / search, auto-refresh, and virtualized scrolling for large files
  • The Logs nav entry is omitted when no collector is running

Per-User Allowed Provider Profiles for Redirect

  • Admins can set Allowed Provider Profiles on the user Permissions tab so Redirect live, catch-up, and (when Redirect is the system default) VOD only use provider URLs from that allowlist. (Closes [#1528])
  • Leave the field unset to allow all profiles, clear it to allow none, or pick specific profiles to restrict Redirect to those sources
  • Authenticated direct-link M3U exports apply the same filter and omit channels with no allowed source
  • Channel stream order and VOD provider priority are preserved; failover stays inside allowed profiles

DVR Output Profile and Broadcast-Date Path Placeholders

  • A new DVR Output Profile setting lets recordings use the same transcoding as live playback. Unset (the default) keeps the previous raw-copy behaviour. (Closes [#1618]) - Thanks @v8eta
  • DVR path templates support broadcast-date placeholders {start_date}, {start_year}, {start_month}, and {start_day} (programme air date in the system time zone). (Closes [#682]) - Thanks @v8eta:
  • Works in TV, TV fallback, movie, and movie fallback templates
  • Integer values so padding like {start_month:02d} works the same way as {season:02d}

M3U and EPG Refresh Error Events

  • Failed M3U and EPG refreshes (downloads, parses, and Schedules Direct errors) emit m3u_error / epg_error system events with red indicators in System Events, and can trigger Connect webhooks and scripts. (Closes [#1507]) - Thanks @gianlucalauro

VOD Mid-Stream Retry on Upstream Stalls

  • When a provider read times out or drops mid-download, VOD playback can reopen at the same byte offset and continue, with a short streak of consecutive retries before giving up

Optional Redirect URL Pre-Check

  • Settings → Proxy → Advanced adds Validate Redirect URLs (on by default). (Closes [#1546])
  • When enabled, live Redirect still probes the provider and can fail over to alternate streams
  • Turn it off for providers that close probe connections or add channel-change latency; handoff then skips validation and failover probing

EPG Grid Time Windows and Profile Scoping

  • The EPG grid API accepts optional day offsets, absolute start/end times, and a channel profile scope so callers can request the programmes they need
  • With no parameters, the window stays roughly the past hour through the next 24 hours, as before

Configurable Worker Counts

  • UWSGI_WORKERS and CELERY_MAX_WORKERS / CELERY_MIN_WORKERS tune how many workers run (defaults 4, 6, and 1), so small hosts can save memory and busy servers can raise throughput
  • Values must be integers from 1 to 20; invalid settings fail at container startup with a clear error
  • The Users page can sort by User Level, Username, Name, Email, Date Joined, and Last Login, and filter with a debounced search. - Thanks @brendongl

🔄 Changes & Improvements

Channels & Streams Tables

  • Page sizes go up to 500 rows, with smoother scrolling and less work for off-screen rows, logos, and live resizing
  • Pinned headers, stream action tooltips, scroll position when locking Channels, and Safari column resizing are improved

TV Guide & EPG Access

  • The TV Guide is no longer capped at roughly the next 24 hours. Scrolling forward or back loads more programme data as you go, so you can browse further into the schedule without waiting on a full multi-day fetch up front
  • EPG grid programmes are limited to channels the caller can see (same access rules as XMLTV), including optional profile scoping
  • Channel groups for non-admins only include groups that contain at least one channel they can activate
  • The TV Guide group dropdown only lists groups present on the currently loaded, profile-scoped channels

Settings Saves

  • Stream, System, and DVR settings each save only their own settings group, so saving one tab no longer rewrites unrelated settings
  • Deleting an output profile clears stale references from users, HDHR, and DVR defaults
  • Locked output profiles cannot be deleted via the API (matching the UI)
  • Deleting output or stream profiles asks for confirmation, with optional "Don't ask me again"

🐛 Bug Fixes

VOD Sync & Catalog

  • Fixed VOD list sync dropping extra category/stream copies of the same movie or series when they landed in the same batch, so multi-category titles keep a relation for each provider ID. (Closes [#1511]) - Thanks @northernpowerhouse
  • Fixed a blank provider name discarding an entire VOD import batch; blank names are skipped and the rest of the batch imports. (Closes [#1586]) - Thanks @thejdubb02
  • Fixed VOD category filters mis-splitting names that contain | (for example locale-tagged categories like |EN| 4K CLASSIC MOVIES). (Fixes [#1603]) - Thanks @thejdubb02
  • Fixed the VOD category m3u_account filter using the wrong relation path. (Fixes [#1661]) - Thanks @nshttpd
  • Fixed VOD OpenAPI schemas and runtime JSON disagreeing for generated clients (pagination links, provider-info shapes, and related fields). (Fixes [#1660]) - Thanks @nshttpd

VOD Playback & Profiles

  • Fixed VOD proxy leaving provider connection slots elevated after clients were gone, which could leave max_streams=1 accounts stuck returning 503 until Redis or the container was reset. (Fixes [#1577])
  • Fixed M3U profile credential transforms falling back to the base account username/password when a search/replace did not match. Live, VOD, and catch-up now fail closed instead. (Fixes [#1635])

Logos & Images

  • Fixed raw image proxy endpoints returning 406 for clients that send Accept: image/* (common on Apple TV and similar). Channel/VOD logos, posters, and related image endpoints work for those clients again. (Closes [#1541]) - Thanks @thejdubb02

DVR

  • Fixed HLS finalize introducing periodic audio/video gaps by concatenating segments; finalize now remuxes the playlist as a whole so finished recordings play cleanly. - Thanks @torhve for the diagnosis
  • Fixed Redirect DVR captures sending a Dispatcharr-DVR User-Agent that providers often reject; they now use the M3U account User-Agent, matching live connections
  • Fixed DVR playback redirects/playlists (and plugin logos) dropping or mishandling non-standard ports and forwarded host/scheme behind a reverse proxy

EPG, Dummy EPG & Guides

  • Fixed bulk Set TVG-IDs from EPG and Set names from EPG overwriting every dummy-assigned channel with the shared placeholder for that dummy source. - Thanks @hdimer
  • Fixed recurring (time-only) dummy EPG going blank after today's event left the lookback window; ended filler now keeps the channel populated for the rest of the window
  • Fixed dummy grid programme IDs colliding across multi-day windows when the same clock time repeated on another day
  • Fixed Schedules Direct and M3U refreshes leaving stale XMLTV / playlist caches so clients could keep old channel lists or programmes after the in-app guide had already updated

Live, Catch-up & Channels UI

  • Fixed catch-up ignoring a channel (or override) set to Redirect and proxying instead of following the channel's effective stream profile
  • Fixed the Channels table crashing when a refresh raced without page parameters after restore/reload

Plugins

  • Fixed plugin reload returning 500 errors for some namespace packages when listing or enabling plugins. (Fixes [#1658])

🔒 Security

  • DVR recording paths are confined to /data/recordings; client-supplied path fields are ignored on create/update so a DVR manager cannot read or delete files outside that root
  • Plugin manifest and zip downloads re-validate every redirect hop against the existing SSRF checks (no private/loopback by default)
  • Forwarded Host and scheme are trusted only from configured proxies, so untrusted peers cannot rewrite absolute URLs in M3U, EPG, HDHR, or similar responses
  • Stream rehash (rebuilding stream identity hashes) is limited to admins; previously any authenticated user could trigger it
  • Modular Compose no longer publishes Postgres to the host; the database stays on the Docker network only
  • Updated Django 6.0.7 → 6.0.8:
  • High: Server-side file-write and request forgery via spatial lookups (CVE-2026-15307)
  • Moderate: Potential denial-of-service via nested geometry collections (CVE-2026-15830)
  • Moderate: Potential cross-site scripting via URLField values in the admin (CVE-2026-15920)
  • Low: Potential denial-of-service in check_for_language() (CVE-2026-15337)
  • Updated djangorestframework 3.17.1 → 3.18.1:
  • AdminRenderer may disclose GET-protected data when rendering invalid write requests (GHSA-g47c-3xmw-q6m2)
  • Potential bypass of Django upload size limits when parsing oversized bodies via DRF request.data (GHSA-2m8g-3cmr-wg3w)
  • Updated additional Python dependencies for known issues:
  • pillow 12.2.0 → 12.3.0 (image/font DoS and related fixes; see 12.3.0 release notes)
  • cryptography 48.0.1 → 50.0.1 (GHSA-m2h6-j472-rp4c, GHSA-jwv3-5hgf-82ww, GHSA-g6cj-pr64-35w5)
  • sqlparse 0.5.5 → 0.6.0 (GHSA-f2ff-p2ww-7p4p, GHSA-pwgv-4x5q-6m9f, GHSA-3496-9g83-7v6x, GHSA-prg7-hcfm-mfcr, GHSA-cfqr-cjx5-5jcm)
  • msgpack 1.2.0 → 1.2.2 (GHSA-6v7p-g79w-8964)
  • ujson 5.12.1 → 6.0.0 (GHSA-3j69-69wj-xqx2)
  • setuptools 81.0.0 → 84.0.0 (GHSA-h35f-9h28-mq5c)
  • yt-dlp 2026.6.9 → 2026.8.19 (GHSA-6v4j-43gg-vj32)
  • Updated frontend npm dependencies (4 audit findings: 3 moderate, 1 high):
  • vitest 4.1.8 → 4.1.11 (Moderate: path traversal / arbitrary file read via redirect mock) (GHSA-82fw-gwwq-j7x9)
  • @xmldom/xmldom 0.8.13 → 0.8.15 (High: XML injection and DoS in name handling, serialization, and parsing) (GHSA-w2rr-34g9-rvrj, GHSA-4w3w-2rp5-g8jm, GHSA-c7q8-3ch8-vqpv, GHSA-27p8-2357-5qqv, GHSA-8344-3jmq-59r6, GHSA-x4fp-j954-r2f4, GHSA-965w-775f-mr7g, GHSA-93r5-fhx6-vmg9), plus related moderate serialization/parse issues (GHSA-6gmq-8vp8-gcm6, GHSA-6h8r-xr42-gp59)
  • @humanfs/node 0.16.7 → 0.16.8 (Moderate: recursive copy following symlinked files outside the source tree) (GHSA-p498-v437-472g)
Source: README.md, updated 2026-09-13