Commit graph

3550 commits

Author SHA1 Message Date
R3XCHRIS
ff60bbec1a fix(vod_proxy): fall back to stream_id when content UUID is dead
Issue: When `process_movie_batch` / `process_series_batch`
(apps/vod/tasks.py) creates duplicate vod_movie / vod_episode records
during a refresh, existing M3U*Relation rows get repointed to the new
records. The old UUIDs that external players (Emby / Jellyfin /
ChannelsDVR) cached in `.strm` URLs are left orphaned, and the proxy
404s on every subsequent request — even though the same request
already carries a stable `stream_id` that uniquely identifies a live
relation.

This patch makes `_get_content_and_relation` use a soft UUID lookup
and, if it misses, fall back to resolving content via
`M3UMovieRelation.stream_id` / `M3UEpisodeRelation.stream_id`. The
fallback respects the strictest match first: when
`preferred_m3u_account_id` is also present, that account is queried
first; otherwise the highest-priority active relation matching the
stream_id wins (same ordering the existing relation-selection logic
uses).

This is read-side graceful degradation, complementary to the
write-side root fix proposed in closed #973 (re-use the relation's
existing movie/series during refresh rather than rematching by TMDB
ID). The two PRs together would fully resolve #961: #973 prevents new
orphaning, this PR makes any URL that ships a stream_id survive past
orphaning. URLs without a stream_id (e.g. XC-compat
`/movie/<user>/<pass>/<id>.mkv`) are NOT covered by this patch — they
need the root fix.

Series-UUID lookups (`/proxy/vod/series/<UUID>`) are left UUID-only by
design — players cache episode and movie URLs, not series URLs. Same
pattern can be added as a follow-up if needed.

Tests: 7 new mock-based regression tests covering both branches,
verified against `:dev`. UUID-first happy path is unchanged
(M3U*Relation table never queried when the UUID resolves).

Related: #961 (open), closed #973 (root fix abandoned for inactivity).
2026-06-02 19:29:58 +01:00
SergeantPanda
36896d7a45
Merge pull request #938 from FiveBoroughs/feature/epg-channel-preview
EPG program preview in channel form
2026-06-01 19:44:27 -05:00
SergeantPanda
1fd37b9a51 feat(channel-form): reorganize channel edit form into three semantic columns for improved layout and usability 2026-06-01 19:34:39 -05:00
SergeantPanda
f2a4c1f665 changelog: Update changelog for EPG pgrogram preview PR. 2026-06-01 19:01:48 -05:00
SergeantPanda
8e03427844 Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into pr/FiveBoroughs/938 2026-06-01 18:58:14 -05:00
SergeantPanda
ec06a52fd4 refactor(epg): change logger level from info to debug for building byte-offset index 2026-06-01 18:58:00 -05:00
SergeantPanda
c081354150 feat(websocket): enhance connection handling with cached IP lookup 2026-05-31 19:28:19 -05:00
SergeantPanda
ac2eb2e3ad
Merge pull request #1308 from sv-dispatcharr:feat/disable-public-ip
feat: blur public IP display, add IP lookup toggle with env var override, make lookup non-blocking
2026-05-31 18:54:55 -05:00
SergeantPanda
b26d4815f1 tests: Fix frontend sidebar and settings tests. 2026-05-31 18:50:44 -05:00
SergeantPanda
aad604c655 changelog: add missing issue reference. 2026-05-31 18:16:35 -05:00
SergeantPanda
df3e6a0ebc changelog: Update changelog for ip pr. 2026-05-31 18:06:00 -05:00
SergeantPanda
f403004769 fix(environment): harden IP lookup, add WebSocket push, improve sidebar UX
- Fix socket leak in local IP detection using try/finally; replace 8.8.8.8
  with RFC 5737 test address 203.0.113.1
- Validate ipify response with ipaddress.ip_address() before using in URL
- Push ip_lookup_complete WebSocket event when background lookup finishes,
  eliminating frontend polling entirely
- Show Skeleton placeholder in sidebar while IP lookup is pending
- Replace hover-to-reveal blur with click-to-toggle for mobile support
- Fix copy button propagating click to blur toggle via stopPropagation
- Add missing city field to null-env fallback in settings store
- Add setEnvironmentFields() store action for WebSocket-driven updates
- Remove unused imports from api_views.py
2026-05-31 17:56:52 -05:00
SergeantPanda
1d07b26a01 Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into pr/sethwv/1308 2026-05-31 16:38:41 -05:00
SergeantPanda
ddd1105d5b security: Remove post body from response. 2026-05-31 16:20:55 -05:00
Five Boroughs
374c05952b
test(epg): cover real EPG source formats and index lookup edge cases 2026-05-31 22:26:39 +02:00
Five Boroughs
f8919b0d98
fix(epg): handle attr-spacing and named entities in index lookup, unblock boot rebuild 2026-05-31 21:57:26 +02:00
Five Boroughs
10d558f136
perf(epg): async index build, defer index column, tight build lock, channel-id canonicalization, retry-on-error 2026-05-31 17:13:11 +02:00
Five Boroughs
9903f0b75d
refactor(frontend): extract useEpgPreview to its own hook file 2026-05-31 17:13:11 +02:00
Five Boroughs
2cfea1df0f
perf(epg): per-channel interleaved tracking, defer first-preview build
Also renames the migration to `0023_` to resolve collision with
upstream `0022_alter_epgdata_name`. Rationale in #938.
2026-05-31 17:13:11 +02:00
Five Boroughs
a7b9523352
test(frontend): update channel form mocks after preview rebase 2026-05-31 17:13:11 +02:00
SergeantPanda
1e9fd28653
perf(epg): defer loading of programme_index in EPGSourceViewSet for performance improvement
Co-authored-by: Copilot <copilot@github.com>
2026-05-31 17:13:11 +02:00
SergeantPanda
690fa10be4
refactor(epg): remove redundant current time retrieval in CurrentProgramsAPIView 2026-05-31 17:13:11 +02:00
Five Boroughs
7c0c513f8f
test(epg,frontend): add coverage for current-program lookup and preview behavior 2026-05-31 17:13:11 +02:00
Five Boroughs
dd6c4df62b
Store programme index in DB and add interleaved XMLTV file support 2026-05-31 17:13:11 +02:00
Five Boroughs
3c5032ee71
Batch ProgramData query and invalidate index on EPG refresh
- Replace per-entry ProgramData DB query with single batch fetch
- Pass pre-loaded EPGData objects to find_current_program_for_tvg_id
  to avoid redundant select_related re-fetch
- Delete Redis programme index before XMLTV download so stale byte
  offsets are never used during the refresh window
2026-05-31 17:13:11 +02:00
Five Boroughs
8f1dd2ffeb
Revert unintended whitespace changes in apps.py and Channel.jsx 2026-05-31 17:13:11 +02:00
Five Boroughs
4ecfbb237e
Remove dev-only django.views.static.serve routes from urls.py 2026-05-31 17:13:11 +02:00
Five Boroughs
2bf4e8cd0f
WIP: EPG channel preview with byte-offset index lookup 2026-05-31 17:13:11 +02:00
FiveBoroughs
4594cce47a
Revert unintended linter style changes in api_views.py 2026-05-31 17:13:11 +02:00
FiveBoroughs
ef1518a8dd
Fix: Auto-parse EPG programs for unlinked channels on preview
When selecting an EPG channel in the channel form, if that EPG entry's
programs had never been parsed, the preview showed "No current program".
This was because parse_programs_for_tvg_id requires a linked channel.

- Add force parameter to parse_programs_for_tvg_id to bypass channel check
- Auto-trigger parsing from current-programs API when no programs exist
- Check Redis task lock to prevent duplicate parse tasks from concurrent requests
- Frontend retries up to 3 times with 10s delay to pick up parsed results
- Skip parsing for dummy EPG sources
2026-05-31 17:13:11 +02:00
FiveBoroughs
e733b9872f
Refactor: Extract shared ProgramPreview component and fix EPG preview bugs
- Extract ProgramPreview component from duplicated code in Channel.jsx
  and StreamConnectionCard.jsx (~80+ lines each)
- Fix watch('epg_data_id') called directly in useEffect dependency array,
  which could cause infinite re-renders
- Add request cancellation for rapid EPG selection changes in channel form
- Remove unused imports (Radio, Progress, ChevronDown, ChevronRight)
2026-05-31 17:13:11 +02:00
FiveBoroughs
9367d76dac
Add EPG program preview to channel edit/create modal
- Extended CurrentProgramsAPIView to accept epg_data_ids parameter
- Added getCurrentProgramForEpg() API method in frontend
- Added UI in Channel form showing current program with tooltip
- Shows loading state, no program state, and program details
- Includes expandable description, progress bar with elapsed/remaining time
- Matches stats page 'Now Playing' feature behavior
2026-05-31 17:13:11 +02:00
Seth Van Niekerk
4e5ecc80aa
add city to flag hover 2026-05-31 10:27:55 -04:00
Seth Van Niekerk
a9b729c3f5
blur just the first two octets/four segments 2026-05-31 10:24:28 -04:00
SergeantPanda
450b384419 fix(vod_proxy): Fix stream_vod to handle session_id in path for VOD proxy URLs 2026-05-30 20:48:17 -05:00
SergeantPanda
50f0c37fa5 refactor(backups): simplify PostgreSQL engine check in _is_postgresql function 2026-05-30 20:18:50 -05:00
SergeantPanda
ae3c839812 feat(backups): refactor SQLite backup and restore methods for improved reliability 2026-05-30 20:15:08 -05:00
SergeantPanda
ae16e1202c feat(views): import build_absolute_uri_with_port in views.py 2026-05-30 17:58:01 -05:00
SergeantPanda
20f54b2bf6 feat(utils): move get_host_and_port and build_absolute_uri_with_port to core/utils.py 2026-05-30 17:26:58 -05:00
SergeantPanda
2196660aec feat(debian_install): switch from Gunicorn to uWSGI and update installation script 2026-05-30 14:46:15 -05:00
SergeantPanda
d388f45137 feat(nginx): add X-Forwarded-Port header to proxy settings 2026-05-30 14:16:35 -05:00
SergeantPanda
569dce1ba4 changelog: Update for playlist deletion pr. 2026-05-30 12:51:38 -05:00
SergeantPanda
2156ea6283
Merge pull request #1284 from nemesbak:fix/delete-last-playlist-error
fix(frontend): clean up profiles state when playlists are deleted
2026-05-30 12:49:26 -05:00
SergeantPanda
df6f98a806 tests: Add tests for playlist deletion. 2026-05-30 12:43:41 -05:00
Seth Van Niekerk
16cb9edcbd
blur public IP in sidebar, add ip lookup toggle and env var, make lookup non-blocking 2026-05-30 13:07:07 -04:00
SergeantPanda
36968631a6 tests: Fix frontend series and vod tests. 2026-05-30 11:28:07 -05:00
SergeantPanda
72d1520400 feat(auth): add QueryParamJWTAuthentication for token retrieval via query parameters
feat(vod): include token in stream URL for episode and movie requests (Fixes #1224)
2026-05-30 11:14:59 -05:00
SergeantPanda
effa03b2a5 Enhancementvod): optimize xc_get_series for performance and reduce API response time 2026-05-30 09:08:54 -05:00
SergeantPanda
97bfc6f802 changelog: Update for refactor pr. 2026-05-30 08:49:02 -05:00
SergeantPanda
157c87ce4d feat(vod): optimize xc_get_vod_streams for performance and reduce API response time 2026-05-29 22:12:55 -05:00