XC_VM 2.3.8
A maintenance release focused on streaming stability and a large internal
clean-up of the stream pipeline. A significant part of the streaming stack was
refactored without changing its external behaviour, alongside fixes for HLS, VOD,
LLOD, GeoIP and connection tracking. No breaking changes; no config or database
migration required.
๐ฅ Streaming fixes
- VOD subtitles โ import and map all configured subtitle tracks, not just
the first one. - LLOD / on-demand resilience โ reconnect an HTTP source that drops mid-stream
instead of exiting and forcing a watchdog restart. - On-demand start-up โ fill the prebuffer before the first MPEG-TS burst and
size it by duration rather than segment count, for a faster and steadier start. - Live delivery โ remove the per-read throttle in MPEG-TS output for smoother
streaming. - FFprobe cache โ read it under the same key it was written with, so the cache
actually hits instead of always missing. - Off-air path โ fix an undefined
$rServerIDon the channel-less branch in
live.php.
๐งฑ Stream pipeline refactor (behaviour-preserving)
- Replaced
startStream()'s ~180-line inline ffmpeg-command assembly with a
single purebuildLive()builder, and removed the transitional shadow-diff
scaffold once the two were proven byte-identical. - Extracted FFprobe, codec metadata, the AAC bitstream filter, HLS/FLV outputs,
source mapping, subtitles, failover and delay-resume into focused helpers. - Consolidated connection lookup / create / update / cleanup through
ConnectionTracker, and deduped the identical Redis/DB statistics collection. - Added dedicated helpers for on-demand process cleanup and PID tracking.
๐งน Monitor daemon clean-up
- Reconstructed the decompiled supervisor: all 62
gotos removed and the flow
rebuilt with structuredwhileloops; dead and no-op gotos dropped; the
if (true)obfuscation wrappers removed. - Renamed the obfuscated hash-based variables to meaningful names.
- Extracted codec, frame-rate, segment-duration and auto-restart logic into
dedicated functions. - Rewrote the class documentation in English and filled the missing docblocks.
๐ GeoIP & user information
cron:maxmind --forcenow genuinely re-downloads the MaxMind databases when
requested, instead of skipping when they look up to date.- Consolidated
getStreamingUserInfo()/getUserInfo()/getE2Info()onto one
GeoIP path and simplified their internals. - Fixed the
isp_asnhandling bug and skip the ISP-update write when no ISP was
detected.
๐ก Signals & on-demand handling
- Unified all deferred-work signalling behind a single
SignalQueue. - Added
ConnectionTrackerquery helpers for the on-demand killer and simplified
its Redis/DB stat collection.
๐ ๏ธ Build, CI & dependencies
- Re-synced the committed production
vendor/withcomposer.lockand regenerated
the PHPStan baseline against the pinned PHPStan 2.2.8. - Moved the PHPStan / PHP-CS-Fixer configuration out of the repo root into
build/; wired constants-stub regeneration intomakeand fixed the
procedural-use gate path. - CI now runs once per change with proper concurrency; added a path-filtered Pages
workflow and Composer support in Dependabot. - GitHub Actions bumps:
checkoutโ v7,upload-pages-artifactโ v5,
configure-pagesโ v6,deploy-pagesโ v5,add-to-projectโ v2.
๐ Docs & developer tooling
- Added the
tools/README index, agent issue-tracker/domain guides and a Claude
Agent Skills section; pruned redundant agent definitions and stale instructions. - Added
tools/stream_queue_check.py, a stream-queue integrity monitor
(developer-only โ not shipped in the panel).
What's Changed
- Refactor/monitor goto by @Divarion-D in #142
- ci: bump actions/deploy-pages from 4 to 5 by @dependabot[bot] in #147
- ci: bump actions/configure-pages from 5 to 6 by @dependabot[bot] in #143
- ci: bump actions/upload-pages-artifact from 3 to 5 by @dependabot[bot] in #144
- ci: bump actions/checkout from 4 to 7 by @dependabot[bot] in #145
- deps: bump the composer group in /src with 3 updates by @dependabot[bot] in #146
Full Changelog: 2.3.7...2.3.8