Fix live HLS streaming with dynamic quality playlist URLs
Some checks are pending
GPU Worker CI/CD / test (push) Waiting to run
GPU Worker CI/CD / deploy (push) Blocked by required conditions

The problem: HLS.js caches quality playlist URLs from the master playlist.
Even when we update the master playlist CID, HLS.js keeps polling the same
static quality CID URL, so it never sees new segments.

The fix:
- Store quality-level CIDs in database (quality_playlists JSONB column)
- Generate master playlist with dynamic URLs (/runs/{id}/quality/{name}/playlist.m3u8)
- Add quality endpoint that fetches LATEST CID from database
- HLS.js now polls our dynamic endpoints which return fresh content

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
giles
2026-02-04 21:07:29 +00:00
parent 4647dd52c8
commit 2f56ffc472
4 changed files with 150 additions and 23 deletions

View File

@@ -334,7 +334,13 @@ def run_stream(
task_logger.warning(f"DEBUG: streaming:make-video-source is now: {type(interp.primitives.get('streaming:make-video-source'))}")
# Set up callback to update database when IPFS playlist is created (for live HLS redirect)
def on_playlist_update(playlist_cid):
def on_playlist_update(playlist_cid, quality_playlists=None):
"""Update database with playlist CID and quality info.
Args:
playlist_cid: Master playlist CID
quality_playlists: Dict of quality name -> {cid, width, height, bitrate}
"""
global _resolve_loop, _db_initialized
import asyncio
import database
@@ -346,8 +352,8 @@ def run_stream(
if not _db_initialized:
_resolve_loop.run_until_complete(database.init_db())
_db_initialized = True
_resolve_loop.run_until_complete(database.update_pending_run_playlist(run_id, playlist_cid))
logger.info(f"Updated pending run {run_id} with IPFS playlist: {playlist_cid}")
_resolve_loop.run_until_complete(database.update_pending_run_playlist(run_id, playlist_cid, quality_playlists))
logger.info(f"Updated pending run {run_id} with IPFS playlist: {playlist_cid}, qualities: {list(quality_playlists.keys()) if quality_playlists else []}")
except Exception as e:
logger.error(f"Failed to update playlist CID in database: {e}")