From 7e3605a8f17ecba2a0a1f804970fc9b7464e87a2 Mon Sep 17 00:00:00 2001 From: Cesar Mendivil Date: Sun, 15 Feb 2026 16:03:07 -0700 Subject: [PATCH] Refactor M3U8 playlist generation for improved readability and maintainability --- src/video.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/video.js b/src/video.js index a2361dd..7d2047f 100644 --- a/src/video.js +++ b/src/video.js @@ -527,25 +527,24 @@ function video( channelService, fillerDB, db, programmingService, activeChannelS var data = "#EXTM3U\n" - data += `#EXT-X-VERSION:3 - #EXT-X-MEDIA-SEQUENCE:0 - #EXT-X-ALLOW-CACHE:YES - #EXT-X-TARGETDURATION:60 - #EXT-X-PLAYLIST-TYPE:VOD\n`; + data += `#EXT-X-VERSION:3\n#EXT-X-MEDIA-SEQUENCE:0\n#EXT-X-ALLOW-CACHE:YES\n#EXT-X-TARGETDURATION:60\n#EXT-X-PLAYLIST-TYPE:VOD\n`; let ffmpegSettings = db['ffmpeg-settings'].find()[0] - cur ="59.0"; + // Duration to advertise for each pseudo-segment (seconds). Keep slightly + // below TARGETDURATION to avoid premature reloads. + let cur = "59.0"; + + function addSegment(url) { + data += `#EXTINF:${cur},\n${url}\n`; + } if ( ffmpegSettings.enableFFMPEGTranscoding === true) { - //data += `#EXTINF:${cur},\n`; - data += `${req.protocol}://${req.get('host')}/stream?channel=${channelNum}&first=0&m3u8=1&session=${sessionId}\n`; + addSegment(`${req.protocol}://${req.get('host')}/stream?channel=${channelNum}&first=0&m3u8=1&session=${sessionId}`) } - //data += `#EXTINF:${cur},\n`; - data += `${req.protocol}://${req.get('host')}/stream?channel=${channelNum}&first=1&m3u8=1&session=${sessionId}\n` + addSegment(`${req.protocol}://${req.get('host')}/stream?channel=${channelNum}&first=1&m3u8=1&session=${sessionId}`) for (var i = 0; i < maxStreamsToPlayInARow - 1; i++) { - //data += `#EXTINF:${cur},\n`; - data += `${req.protocol}://${req.get('host')}/stream?channel=${channelNum}&m3u8=1&session=${sessionId}\n` + addSegment(`${req.protocol}://${req.get('host')}/stream?channel=${channelNum}&m3u8=1&session=${sessionId}`) } res.send(data)