Skip to content

v2.3.8

Latest

Choose a tag to compare

@Divarion-D Divarion-D released this 09 Aug 17:22

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 $rServerID on the channel-less branch in
    live.php.

🧱 Stream pipeline refactor (behaviour-preserving)

  • Replaced startStream()'s ~180-line inline ffmpeg-command assembly with a
    single pure buildLive() 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 structured while loops; 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 --force now 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_asn handling 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 ConnectionTracker query helpers for the on-demand killer and simplified
    its Redis/DB stat collection.

🛠️ Build, CI & dependencies

  • Re-synced the committed production vendor/ with composer.lock and 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 into make and 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

Full Changelog: 2.3.7...2.3.8