Commit graph

3942 commits

Author SHA1 Message Date
SergeantPanda
a2656184e8 perf/fix: migrate DB driver to psycopg3, fix pool settings
- Switch engine to postgresql_psycopg3 (PR had wrong engine name,
  and we're migrating from psycopg2 to psycopg3 as part of this work)
- Set CONN_MAX_AGE=0 (required by geventpool; PR had None)
- Reduce MAX_CONNS 20→8, REUSE_CONNS 10→3 to avoid exhausting
  pg max_connections across 4 uWSGI workers + Celery
- Add pool=False to explicitly disable Django's native psycopg3 pool
2026-05-28 19:31:50 -05:00
SergeantPanda
80b72d8cfa Enhancement: Update psycopg2 to 3. 2026-05-28 19:27:52 -05:00
SergeantPanda
d6f837238f Enhancement: Update psycopg from 2 to 3, remove psycogreen as it's no longer needed with psycopg3. 2026-05-28 19:27:11 -05:00
SergeantPanda
2f31a17be3 changelog: Update changelog for plugin page pr. 2026-05-28 15:39:46 -05:00
SergeantPanda
6d37b44e75
Merge pull request #1265 from sv-dispatcharr/fix/plugin-repo-tweaks 2026-05-28 15:26:38 -05:00
Seth Van Niekerk
3acb5ff0f5 Introduce In-House Template & Compliance Actions 2026-05-28 15:08:01 -05:00
SergeantPanda
1d2ca3c436
Merge pull request #1300 from sv-dispatcharr:repo/compliance-checks
Introduce In-House Template & Compliance Actions
2026-05-28 15:06:06 -05:00
SergeantPanda
7768d137c4 fix: remove unnecessary libpq-dev dependency from Dockerfile 2026-05-28 14:38:27 -05:00
Kanishk Sachdev
3e966cd1dd docker: split base image into builder and runtime stages
Keeps compilers in the builder; runtime stage copies only the venv
and NumPy wheel.
2026-05-28 14:38:18 -05:00
SergeantPanda
1cfd26227b
Merge pull request #1271 from kensac:docker-multistage-base
docker: split base image into builder and runtime stages
2026-05-28 14:36:45 -05:00
SergeantPanda
89a689c5a0 changelog: Update changelog for Docker PR. 2026-05-28 14:36:02 -05:00
SergeantPanda
9c6c2a081b fix: remove unnecessary libpq-dev dependency from Dockerfile 2026-05-28 14:31:00 -05:00
Seth Van Niekerk
3e7bd3d431
Introduce In-House Template & Compliance Actions 2026-05-28 14:20:39 -04:00
nemesbak
f08a30e303 fix(vod): import director, actors and release_date from XC provider sync
get_vod_streams on XC providers supplies director, cast/actors and
release_date for each movie, but process_movie_batch was only persisting
trailer in custom_properties. As a result those fields were always empty
in Dispatcharr's own get_vod_info / provider-info responses even when
the upstream provider returned correct data.

Changes:
- Extract director, actors (also mapped from 'cast') and release_date
  from movie_data during the batch-import phase and store them in
  custom_properties alongside the existing trailer field.
- Fix the update path to merge incoming custom_properties into the
  existing dict (using {**existing, **incoming}) rather than overwriting
  it wholesale, so that detailed_info and other keys written by the
  advanced refresh task are preserved across subsequent basic syncs.

Fixes #1228

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 13:39:05 +02:00
nemesbak
5eb118478b fix(channels): honor stream profile override in Channel.get_stream_profile()
Channel.get_stream_profile() read self.stream_profile directly, bypassing
the override system. The override-aware property effective_stream_profile_obj
already existed and called _resolve_effective_fk('stream_profile') which
correctly picks override.stream_profile when set, but nothing in the
streaming path called it.

As a result, a per-channel 'Stream Profile' override saved through the UI
was visible in the channel edit form (yellow pencil indicator appeared) but
silently ignored at stream time — Dispatcharr always used the global default
profile regardless of what was configured per-channel.

Fix: call effective_stream_profile_obj in get_stream_profile() so that all
callers (live proxy url_utils, input manager, views) automatically pick up
channel-level overrides without any further changes.

Fixes #1268

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 13:39:05 +02:00
nemesbak
16f4f0c9ed fix(frontend): clean up profiles state when playlists are deleted
removePlaylists() filtered the playlists array but never removed the
corresponding entries from the profiles map (the @TODO left since the
store was introduced). Any component reading profiles[id] after
deletion would get undefined and crash with
'undefined is not an object (evaluating P[R].name)'.

Fix: build a copy of profiles with the deleted IDs removed and include
it in the state update alongside the filtered playlists array.

Fixes #1269

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 13:39:04 +02:00
nemesbak
5fbe38f8d2 fix(vod): respect relation_id when switching providers in SeriesModal/VODModal
The provider-info endpoints for both series and movies always returned
data from the highest-priority relation, ignoring the provider the user
had selected in the dropdown. Switching sources in the UI produced no
change in the episode list or movie details.

Root cause: the endpoints had no support for a relation_id query param,
and the frontend never passed one when the user changed the selection.

Fix (backend):
- series provider-info: accept ?relation_id=<id> and query that specific
  M3USeriesRelation; fall back to highest-priority when omitted
- movie provider-info: same treatment for M3UMovieRelation

Fix (frontend):
- api.getSeriesInfo / api.getMovieProviderInfo accept an optional
  relationId argument and append it to the query string
- useVODStore.fetchSeriesInfo / fetchMovieDetailsFromProvider forward
  the argument to the API layer
- SeriesModal.onChangeSelectedProvider re-fetches series info (episodes
  included) with the newly selected relation's id
- VODModal.onChangeSelectedProvider re-fetches movie details with the
  newly selected relation's id

Fixes #1250

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 13:39:04 +02:00
Cédric Marcoux
3b8717c4ce fix: timeshift stream management, channel resolution, and streaming throughput
- Channel resolution: resolve by Channel.id first (what the XC API emits
  to clients), fall back to provider stream_id for backward compatibility.
  Fixes 404 on all timeshift requests from XC clients.

- Stream management: timeshift is now a first-class citizen alongside live
  and VOD in the stream-limits system.  get_user_active_connections()
  detects type='timeshift', attempt_stream_termination() sets a Redis
  stop key (same pattern as VOD), and the timeshift view calls
  check_user_stream_limits() before connecting upstream.  The stream
  generator checks the stop key every 100 chunks.  Fixes infinite retry
  loops on max_connections=1 providers for live→timeshift and
  timeshift→timeshift transitions.

- Streaming: replaced HTTPStreamReader thread+pipe with direct
  iter_content+yield (same pattern as VOD proxy).  The pipe approach
  deadlocked under gevent because the reader thread's select() competed
  with the greenlet's pipe read for hub scheduling.  Throughput went
  from ~74 B/s to 13+ MB/s.

- TS preamble: peek now strips pre-sync bytes (PHP warnings, BOM) before
  prepending to the stream, preventing corrupt TS output.

- Credential safety: _redact_url() now truncates to scheme://host/...
  to avoid leaking XC path-based credentials in logs.

- Tests: updated 5 tests that referenced the removed HTTPStreamReader.
  21/21 timeshift tests pass.

- Migration: fixed SyntaxWarning for unescaped regex in 0038.
2026-05-27 23:32:57 +02:00
Cédric Marcoux
2781b21a89 feat: built-in XC catch-up (timeshift) support
Adds native catch-up/timeshift replay for Xtream Codes providers through
the same HTTPStreamReader transport pipeline as live TV.

Timeshift proxy (apps/timeshift/):
- URL cascade: 3 candidate timestamp formats per provider, per-account
  format cache for fast-forward seek performance
- MPEG-TS preamble stripping (shared with HTTPStreamReader)
- Stats integration: timeshift viewers appear on /stats with TIMESHIFT badge
- Auth via hmac.compare_digest on XC password

Catchup detection — denormalized for zero-cost output queries:
- Stream.is_catchup + Stream.catchup_days populated at XC import time
- Channel.has_catchup + Channel.catchup_days + Channel.catchup_provider_stream_id
  rolled up via ChannelStream post_save signal (UI path) and explicit SQL
  after bulk_create (import path)
- _xc_channel_entry() reads denormalized fields instead of per-channel
  custom_properties JSON introspection (eliminates N+1 queries)
- Migration 0038 backfills existing data via raw SQL

XC API enhancements:
- server_info.timezone + start/end + time_now use configured timezone
  (triple consistency rule — fixes wrong-programme-plays bug)
- Dynamic has_archive flag + auto prev_days for catch-up channels
- XMLTV timestamps rewritten to local timezone for catch-up clients

HTTPStreamReader extended (apps/proxy/live_proxy/input/http_streamer.py):
- 1 MB pipe buffer via fcntl F_SETPIPE_SZ (eliminates producer/consumer
  ping-pong that halved throughput)
- Pre-opened response= for URL cascade workflows
- strip_ts_preamble= for XC servers emitting PHP warnings before TS
- find_ts_sync() as shared utility
- Builds on upstream O_NONBLOCK + select() write loop

Provider stream_id lookup order:
- stream_xc() and xc_get_epg() try internal Channel.id first, fall back
  to provider stream_id only when needed (avoids unconditional query on
  every request)

Also includes:
- VOD provider cascade in stream_vod() — iterates all M3U relations by
  priority when first provider is at capacity
- Defensive null-safety: custom_sid: None → "" in get_live_streams,
  get_vod_streams, get_vod_info, get_series_info (fixes iPlayTV crash on
  JSON null for string fields)
- Timeshift settings UI (timezone selector, debug toggle)
- StreamConnectionCard violet TIMESHIFT badge
- Orphan cleanup skips timeshift_* virtual channels
2026-05-27 13:13:20 +02:00
Nick Sandstrom
284ba87fe7 Minor formatting changes 2026-05-25 18:15:18 -07:00
Nick Sandstrom
fee8913824 Added tests for components 2026-05-25 18:08:41 -07:00
Nick Sandstrom
e766c4dd54 Refactored components 2026-05-25 18:08:41 -07:00
Nick Sandstrom
688ca2b405 Updated Guide component and utils 2026-05-25 18:08:41 -07:00
Nick Sandstrom
275a93b9b5 Added functionality to dateTimeUtils.js 2026-05-25 18:08:41 -07:00
Nick Sandstrom
1dd0446701 Added tests for utils 2026-05-25 18:08:40 -07:00
Nick Sandstrom
6021bdf741 Extracted utils 2026-05-25 18:08:40 -07:00
Jonathan Caicedo
94c8bd36bf perf: replace per-request DB connections with geventpool 2026-05-25 11:12:46 -04:00
Kanishk Sachdev
2070f9e281 docker: split base image into builder and runtime stages
Keeps compilers in the builder; runtime stage copies only the venv
and NumPy wheel.
2026-05-25 04:31:42 -04:00
mwhit
ca6ab0cd02 fix(epg): address third round of reviewer feedback 2026-05-24 16:49:12 +00:00
Seth Van Niekerk
0db557384a
configurable per-page, sticky pagination footer, fix update sort order and disabled button badge color 2026-05-24 10:59:53 -04:00
SergeantPanda
c4b2fae85a
Merge pull request #1255 from JCBird1012:fix/stats-503-intermittent
Some checks failed
CI Pipeline / prepare (push) Has been cancelled
Build and Push Multi-Arch Docker Image / build-and-push (push) Has been cancelled
Frontend Tests / test (push) Has been cancelled
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Has been cancelled
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Has been cancelled
CI Pipeline / create-manifest (push) Has been cancelled
perf: reduce intermittent 503s on stats page and API requests
2026-05-23 21:47:25 -05:00
SergeantPanda
fb260356aa changelog: Update changelog for stats PR. 2026-05-23 21:45:49 -05:00
SergeantPanda
61c187fc72 Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into pr/JCBird1012/1255 2026-05-23 21:43:13 -05:00
SergeantPanda
92d3068be0 fix: ensure migrations run automatically after restoring backups to prevent missing schema issues 2026-05-23 21:25:44 -05:00
Goldenfreddy0703
bb9b95b4a4 Refactor connection pools to manual ServerGroups with profile rotation.
Drop auto-fingerprint migration and restore per-profile selection for live/VOD.
Enforce shared limits on reserve using login-scoped group counters, and add
Server Groups UI for manual account assignment per maintainer feedback (#1137).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-23 20:18:45 -04:00
GitHub Actions
5ea194059b Release v0.25.1
Some checks failed
CI Pipeline / prepare (push) Waiting to run
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Blocked by required conditions
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
CI Pipeline / create-manifest (push) Blocked by required conditions
Build and Push Multi-Arch Docker Image / build-and-push (push) Has been cancelled
2026-05-23 19:17:36 +00:00
SergeantPanda
5cfea5892a
Merge pull request #1262 from Dispatcharr/dev
Dispatcharr - v0.25.1
2026-05-23 14:16:52 -05:00
SergeantPanda
812d25b987 fix: resolve SynchronousOnlyOperation in ORM calls by allowing async unsafe operations 2026-05-23 13:54:41 -05:00
Jonathan Caicedo
0d1d1f2722 fix: revert nginx timeouts; fire stats fetch on mount regardless of interval 2026-05-23 14:20:13 -04:00
SergeantPanda
137241f873 Bug Fix: Fix auto sync migration. (Fixes #1259)
Some checks are pending
CI Pipeline / prepare (push) Waiting to run
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Blocked by required conditions
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
CI Pipeline / create-manifest (push) Blocked by required conditions
Build and Push Multi-Arch Docker Image / build-and-push (push) Waiting to run
2026-05-22 13:53:00 -05:00
SergeantPanda
59587cbe66 Fix XC stream URL format output handling and improve M3U playlist generation performance. Removed unused imports in apps\output 2026-05-22 11:51:16 -05:00
GitHub Actions
e3269a21ce Release v0.25.0
Some checks failed
Build and Push Multi-Arch Docker Image / build-and-push (push) Has been cancelled
Frontend Tests / test (push) Has been cancelled
2026-05-21 22:33:35 +00:00
SergeantPanda
af8e993814
Merge pull request #1257 from Dispatcharr/dev
Release - v0.25.0
2026-05-21 17:32:57 -05:00
SergeantPanda
1ab1f638a3 tests: Fix frontend test for sidebar.
Some checks failed
CI Pipeline / prepare (push) Waiting to run
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Blocked by required conditions
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
CI Pipeline / create-manifest (push) Blocked by required conditions
Build and Push Multi-Arch Docker Image / build-and-push (push) Waiting to run
Frontend Tests / test (push) Has been cancelled
2026-05-21 17:08:01 -05:00
SergeantPanda
9c22a52c14 chore: remove python-gnupg dependency from project
Some checks failed
Build and Push Multi-Arch Docker Image / build-and-push (push) Waiting to run
Base Image Build / prepare (push) Has been cancelled
Base Image Build / docker (amd64, ubuntu-24.04) (push) Has been cancelled
Base Image Build / docker (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Base Image Build / create-manifest (push) Has been cancelled
2026-05-21 16:14:28 -05:00
SergeantPanda
7e0ea5eae0 Enhancement: add caching for plugin detail responses and implement cache invalidation on repo refresh.
Some checks failed
CI Pipeline / prepare (push) Waiting to run
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Blocked by required conditions
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
CI Pipeline / create-manifest (push) Blocked by required conditions
Build and Push Multi-Arch Docker Image / build-and-push (push) Waiting to run
Frontend Tests / test (push) Waiting to run
Base Image Build / prepare (push) Has been cancelled
Base Image Build / docker (amd64, ubuntu-24.04) (push) Has been cancelled
Base Image Build / docker (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Base Image Build / create-manifest (push) Has been cancelled
Bug Fix: The plugin detail endpoint called GPG via `subprocess.Popen` to verify per-plugin manifest signatures. Replaced with a `_gpg_run()` helper that uses `os.posix_spawn`, matching the pattern used by the ffmpeg and script-handler fixes.
2026-05-21 16:12:31 -05:00
SergeantPanda
2f66b7c183 chore: remove python-gnupg dependency from project 2026-05-21 16:01:10 -05:00
SergeantPanda
f416c7c251 Enhancement: add About modal with version info and community links; refactor SVG icons into separate module 2026-05-21 16:00:52 -05:00
SergeantPanda
17e6e8c238 chore: Cleanup unused code. 2026-05-21 10:13:28 -05:00
Jonathan Caicedo
a2c69be861 fix: update Stats tests to expect single mount fetch after removing duplicate useEffect
Tests were asserting fetchActiveChannelStats/getVODStats were called twice
on mount, encoding React strict mode's double-invoke behavior rather than
testing actual application logic. Update all affected call count assertions
to reflect the correct single-fetch behavior.
2026-05-20 22:23:11 -04:00