pstream is dead; long live pstream
taciturnaxolotl.github.io/pstream-ng/
1import { Stream } from "@p-stream/providers";
2
3import {
4 SourceFileStream,
5 SourceQuality,
6 SourceSliceSource,
7} from "@/stores/player/utils/qualities";
8
9const allowedQualitiesMap: Record<SourceQuality, SourceQuality> = {
10 "4k": "4k",
11 "1080": "1080",
12 "480": "480",
13 "360": "360",
14 "720": "720",
15 unknown: "unknown",
16};
17const allowedQualities = Object.keys(allowedQualitiesMap);
18const allowedFileTypes = ["mp4"];
19
20function isAllowedQuality(inp: string): inp is SourceQuality {
21 return allowedQualities.includes(inp);
22}
23
24export function convertRunoutputToSource(out: {
25 stream: Stream;
26}): SourceSliceSource {
27 if (out.stream.type === "hls") {
28 return {
29 type: "hls",
30 url: out.stream.playlist,
31 headers: out.stream.headers,
32 preferredHeaders: out.stream.preferredHeaders,
33 };
34 }
35 if (out.stream.type === "file") {
36 const qualities: Partial<Record<SourceQuality, SourceFileStream>> = {};
37 Object.entries(out.stream.qualities).forEach((entry) => {
38 if (!isAllowedQuality(entry[0])) {
39 console.warn(`unrecognized quality: ${entry[0]}`);
40 return;
41 }
42 if (!allowedFileTypes.includes(entry[1].type)) {
43 console.warn(`unrecognized file type: ${entry[1].type}`);
44 return;
45 }
46 qualities[entry[0]] = {
47 type: entry[1].type,
48 url: entry[1].url,
49 };
50 });
51 return {
52 type: "file",
53 qualities,
54 headers: out.stream.headers,
55 preferredHeaders: out.stream.preferredHeaders,
56 };
57 }
58 throw new Error("unrecognized type");
59}