Spaces:
Paused
Paused
| 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); | |
| } | |