Spaces:
Running
Running
import HLS from "hls-parser"; | |
import { createInternalStream } from "./manage.js"; | |
function getURL(url) { | |
try { | |
return new URL(url); | |
} catch { | |
return null; | |
} | |
} | |
function transformObject(streamInfo, hlsObject) { | |
if (hlsObject === undefined) { | |
return (object) => transformObject(streamInfo, object); | |
} | |
let fullUrl; | |
if (getURL(hlsObject.uri)) { | |
fullUrl = hlsObject.uri; | |
} else { | |
fullUrl = new URL(hlsObject.uri, streamInfo.url); | |
} | |
hlsObject.uri = createInternalStream(fullUrl.toString(), streamInfo); | |
if (hlsObject.map) { | |
hlsObject.map = transformObject(streamInfo, hlsObject.map); | |
} | |
return hlsObject; | |
} | |
function transformMasterPlaylist(streamInfo, hlsPlaylist) { | |
const makeInternalStream = transformObject(streamInfo); | |
const makeInternalVariants = (variant) => { | |
variant = transformObject(streamInfo, variant); | |
variant.video = variant.video.map(makeInternalStream); | |
variant.audio = variant.audio.map(makeInternalStream); | |
return variant; | |
}; | |
hlsPlaylist.variants = hlsPlaylist.variants.map(makeInternalVariants); | |
return hlsPlaylist; | |
} | |
function transformMediaPlaylist(streamInfo, hlsPlaylist) { | |
const makeInternalSegments = transformObject(streamInfo); | |
hlsPlaylist.segments = hlsPlaylist.segments.map(makeInternalSegments); | |
hlsPlaylist.prefetchSegments = hlsPlaylist.prefetchSegments.map(makeInternalSegments); | |
return hlsPlaylist; | |
} | |
const HLS_MIME_TYPES = ["application/vnd.apple.mpegurl", "audio/mpegurl", "application/x-mpegURL"]; | |
export function isHlsRequest (req) { | |
return HLS_MIME_TYPES.includes(req.headers['content-type']); | |
} | |
export async function handleHlsPlaylist(streamInfo, req, res) { | |
let hlsPlaylist = await req.body.text(); | |
hlsPlaylist = HLS.parse(hlsPlaylist); | |
hlsPlaylist = hlsPlaylist.isMasterPlaylist | |
? transformMasterPlaylist(streamInfo, hlsPlaylist) | |
: transformMediaPlaylist(streamInfo, hlsPlaylist); | |
hlsPlaylist = HLS.stringify(hlsPlaylist); | |
res.send(hlsPlaylist); | |
} | |