Fix live HLS streaming with dynamic quality playlist URLs
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:
@@ -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}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user