Commit Graph

263 Commits

Author SHA1 Message Date
f2effe0832 Merge remote-tracking branch 'origin/main' into codex/enigma2-integration
# Conflicts:
#	public/index.html
2026-10-13 17:48:52 -07:00
2550fd404d Merge pull request #166 from technomancer702/codex/ad-break-audio
Recover Chromium HLS audio at commercial transitions
2026-10-13 17:41:09 -07:00
a2c4b4a5c5 Preserve HLS subtitle and closed-caption cues across recovery 2026-10-13 17:26:25 -07:00
b9dad30f06 Recover Chromium HLS audio at ad discontinuities 2026-10-13 17:23:00 -07:00
700f63da90 Add Enigma2/OpenWebif M3U support: program mapping and zap-before-streaming
- Parse #EXTVLCOPT:program=N from M3U playlists (both full and streaming
  parsers, per channel, strict mode) and store it on playlist items
- Transcode multi-program MPEG-TS streams by mapping only the selected
  program's first video and audio stream (DVB teletext/subtitles in the
  program otherwise make FFmpeg fail to produce HLS)
- Optional per-source "zap before streaming" with configurable delay:
  POST /api/openwebif/zap takes sourceId + streamId, requires an enabled,
  zap-enabled M3U source containing that channel, derives the receiver
  from the configured source URL (never from the client), validates the
  Enigma2 service reference, uses a timeout without redirects and does
  not echo the receiver response
- Live TV: Stop button, and stop playback when leaving the page
- Tests for ordinary and program-tagged playlists and the zap endpoint

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:01:38 +01:00
035667cfba Merge pull request #164 from technomancer702/codex/release-only-packages
Publish container images only for published GitHub releases
2026-10-12 23:39:17 -07:00
4dece33dcc Publish container packages only for published releases 2026-10-12 23:36:57 -07:00
19d7ffdc52 Merge pull request #163 from technomancer702/codex/subtitle-track-menu
Fix duplicate subtitle choices and bump app version to 2.2.1
2026-10-12 23:16:36 -07:00
57e4acb7da Set release version to 2.2.1 2026-10-12 23:14:26 -07:00
ab1f46fa10 Bump app version to 2.2.0 for the reliability and security updates 2026-10-12 23:10:12 -07:00
d72d9cb59f Fix duplicate and inactive subtitle menu entries in both players 2026-10-12 17:45:22 -07:00
d03adab5a1 Merge pull request #162 from technomancer702/codex/playback-session-lifecycle
Release superseded playback sessions and preserve VOD seek time
2026-10-12 17:13:46 -07:00
e30978d1e2 Retire cancelled playback sessions and preserve VOD content time
Adapted from MikaelKW/nodecast-tv-plus playback lease work beginning at 43a58c7685f541498663b827c4b9d6b3753e7202. Reject superseded requests, release on cancellation, bound live restart attempts and await FFmpeg close before deleting cache.

Co-authored-by: Mikael <mikaelkwessel@gmail.com>
2026-10-12 17:11:13 -07:00
5041b1338d Merge pull request #161 from technomancer702/codex/media-authentication
Authenticate media requests with durable HttpOnly cookies and account isolation
2026-10-12 16:56:35 -07:00
1f665dcb11 Authenticate browser media with durable HttpOnly login cookies
Adapted cookie, origin, URL validation and secret handling from MikaelKW/nodecast-tv-plus. Protect API roles, revoke logins across restart, preserve existing accounts, and isolate transcode sessions by account.

Co-authored-by: Mikael <mikaelkwessel@gmail.com>
2026-10-12 16:53:15 -07:00
5598b44e12 Merge pull request #160 from technomancer702/codex/vod-duration
Display total movie and episode duration reliably
2026-10-12 16:44:27 -07:00
2999d6542f Display total VOD duration from provider metadata and stream probes
Adapted from MikaelKW/nodecast-tv-plus commit 9c6416cdba40813d44d21c8d76e31e4d9ab3155f.

Co-authored-by: Mikael <mikaelkwessel@gmail.com>
2026-10-12 16:42:23 -07:00
fc400af313 Merge pull request #159 from technomancer702/codex/container-health
Add container readiness checks and exclude local state from images
2026-10-12 16:41:44 -07:00
bd8365efc8 Add container readiness checks and exclude local state from images
Adapted from MikaelKW/nodecast-tv-plus readiness and container context work.

Co-authored-by: MikaelKW <87399352+MikaelKW@users.noreply.github.com>
2026-10-12 16:39:31 -07:00
7ce5f4693d Merge pull request #158 from technomancer702/codex/epg-refresh
Preserve complete EPG data through failed refreshes and channel ID collisions
2026-10-12 16:19:02 -07:00
4ed22af9e5 Preserve the guide until a complete EPG refresh can activate
Adapted from MikaelKW/nodecast-tv-plus commits c267d98d734753a09b08d267c8ec2c3fa11c33f5, b761690bac7626a3cc5ddf754d96b14a02f506fe, and 5524fdaffed5c6a44ae69474e7eaa2f18d428c75. Preserve every parser batch, decode gzip once, and retain live channel metadata.

Co-authored-by: Mikael <mikaelkwessel@gmail.com>
2026-10-12 16:16:48 -07:00
9c4b24d4cb Merge pull request #157 from technomancer702/codex/aac-remux
Remux AAC tracks correctly without filtering other audio codecs
2026-10-12 16:13:46 -07:00
788d43a4cb Apply AAC remux filters only to matching audio tracks
Adapted from MikaelKW/nodecast-tv-plus commit 25f7cb636a07a3efb2c409ff182920ae0fbe01bd.

Co-authored-by: Mikael <mikaelkwessel@gmail.com>
2026-10-12 16:11:34 -07:00
859bf02dbf Merge pull request #156 from technomancer702/codex/proxy-streaming
Stream proxied media without buffering whole video files
2026-10-12 16:09:34 -07:00
e646e36869 fix(proxy): stream binary media with cancellation and bounded HLS buffers
Adapted from MikaelKW/nodecast-tv-plus commit 011b634417b2ecd2a2844df9808b42de831ba194. Use awaited pipeline, abort upstream on disconnect, avoid retries after headers, preserve real range support, and rewrite bounded manifests using relative proxy paths. Cover interrupted streams, first-byte delivery, ranges, redirects, split signatures, and invalid inputs.

Co-authored-by: Mikael <mikaelkwessel@gmail.com>
2026-10-12 16:06:52 -07:00
dff5c43548 Merge pull request #155 from technomancer702/codex/db-mutation-concurrency
Preserve concurrent source and account changes
2026-10-12 16:06:05 -07:00
12080ba0a6 fix(db): serialize complete JSON mutations and preserve concurrent edits
Adapted from MikaelKW/nodecast-tv-plus commit 55cb8de23a37eb5683459bffed9b64c6c5dd73ae. Queue reads, validations, and writes together; return write errors to callers; preserve existing IDs and metadata; route source/user edits through the atomic operations. Cover concurrent writes, stale edits, queue recovery, and administrator races.

Co-authored-by: Mikael <mikaelkwessel@gmail.com>
2026-10-12 16:01:58 -07:00
8127d26f29 Merge pull request #154 from technomancer702/codex/remux-input-hardening
Restrict remux input protocols while preserving encrypted HLS
2026-10-12 15:45:38 -07:00
bdf00831f8 test: match application FFmpeg selection and report process signals 2026-10-12 15:44:11 -07:00
9fff0474e1 fix(remux): preserve encrypted HLS and test protocol restrictions
Allow nested crypto for encrypted HTTP HLS while rejecting top-level protocol wrappers and local-file access. Replace the HLS-only http_persistent option with HTTP multiple_requests across probe/remux/transcode paths, fixing the raw HTTP regression introduced by #124. Add real FFmpeg regression tests and PR CI.
2026-10-12 15:41:13 -07:00
138efd6007 fix(remux): validate stream URL scheme and restrict ffmpeg protocols (CWE-78)
The /api/remux endpoint passed the user-supplied 'url' query parameter
straight to 'ffmpeg -i <url>'. spawn() with an argv array prevented shell
injection, but ffmpeg itself accepts a wide set of protocol handlers
(file://, concat:, subfile:, data:, pipe:, crypto:, async:, cache:, ...)
that read from the local filesystem or compose existing protocols.
Because the resulting ffmpeg stdout is piped directly back to the
response, an attacker who could call /api/remux could read arbitrary
local files (e.g. ?url=file:///etc/passwd, concat:file://...).

Apply two layers of defence at the entry point only:

1. validateStreamUrl(): reject anything that is not a syntactically valid
   http:// or https:// URL, and reject any string containing control
   characters before parsing (so CR/LF/NUL cannot be silently stripped).

2. Pass -protocol_whitelist http,https,tls,tcp,hls to ffmpeg so that even
   if a future code path forwarded a different URL, ffmpeg would refuse
   to open file/concat/subfile/pipe/data/crypto/async/cache inputs.

Legitimate http/https stream URLs (including ports, userinfo, queries,
and HLS playlists) continue to work; only non-network schemes and
malformed inputs are rejected with HTTP 400.
2026-10-12 15:37:03 -07:00
98d2651e7b Merge pull request #124 from asandhu3/ffmpeg-fixes
Fix ffmpeg redirects. Fix max resolution setting.
2026-10-12 15:16:31 -07:00
c310e59ca1 Merge pull request #144 from andesyteoss/fix/cwe78-subtitle-url-abb1
fix(subtitle): prevent ffmpeg protocol/argument injection in /api/subtitle
2026-10-12 15:16:24 -07:00
01349d48e7 fix(subtitle): validate url scheme and index to prevent local file reads 2026-07-22 22:15:09 +01:00
f5e2c77d25 Fix ffmpeg redirects. Fix max resolution setting. 2026-04-24 15:19:19 -06:00
0e26a90dae Merge pull request #95 from okynorch/doc-update
Updated readme
2026-03-02 15:10:21 -08:00
fry
f3f9d79e8a init 2026-02-16 09:39:42 -08:00
50d337f87d chore: update plugin readme 2026-02-05 01:46:10 -08:00
de41aa04fd feat: enhance plugin system with async support and lifecycle hooks & reverted PR #79 due to Node.js v24 stream compatibility issues 2026-02-05 01:42:58 -08:00
72e14dca57 feat: enhance plugin system with async support and lifecycle hooks & reverted PR #79 due to Node.js v24 stream compatibility issues 2026-02-05 01:42:40 -08:00
6eafa871b5 Merge pull request #82 from leo3438/main
feat: add modular plugin system and developer documentation
2026-02-04 15:46:10 -08:00
31aafe4d37 Merge pull request #79 from avandeweghe/patch-1
Refactor parseStreaming to use pendingBatches array
2026-02-04 15:45:56 -08:00
146f7dd1b1 feat: add modular plugin system and documentation 2026-02-04 10:48:36 +00:00
bfc80738f4 Refactor parseStreaming to use pendingBatches array
Was running into an issue where epg wouldn't process passed the first batch. Refactored the batching to use an array and added backpressure to keep memory usage low.
2026-01-31 19:31:03 -05:00
80d2c4bfb3 fix: copy stream url bug (#69) 2026-01-31 11:09:39 -08:00
4e116d864b chore: update version number in package files 2026-01-31 11:00:43 -08:00
7006513aaf fix: remove deduplication logic from channel list 2026-01-31 10:59:28 -08:00
c8ca09011f fix: adjust timing for up next panel 2026-01-22 20:15:46 -08:00
c042ff37b1 fix: next episode modal not displaying after resume from homepage. 2026-01-22 18:55:06 -08:00
ac6c82e3fc fix: resume from homepage not correctly handling source_id 2026-01-22 18:23:48 -08:00