12 changed files with 371 additions and 64 deletions
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
import { RunOutput } from "@movie-web/providers"; |
||||
|
||||
import { |
||||
SourceFileStream, |
||||
SourceQuality, |
||||
SourceSliceSource, |
||||
} from "@/stores/player/utils/qualities"; |
||||
|
||||
const allowedQualitiesMap: Record<SourceQuality, SourceQuality> = { |
||||
"1080": "1080", |
||||
"480": "480", |
||||
"360": "360", |
||||
"720": "720", |
||||
unknown: "unknown", |
||||
}; |
||||
const allowedQualities = Object.keys(allowedQualitiesMap); |
||||
const allowedFileTypes = ["mp4"]; |
||||
|
||||
function isAllowedQuality(inp: string): inp is SourceQuality { |
||||
return allowedQualities.includes(inp); |
||||
} |
||||
|
||||
export function convertRunoutputToSource(out: RunOutput): SourceSliceSource { |
||||
if (out.stream.type === "hls") { |
||||
return { |
||||
type: "hls", |
||||
url: out.stream.playlist, |
||||
}; |
||||
} |
||||
if (out.stream.type === "file") { |
||||
const qualities: Partial<Record<SourceQuality, SourceFileStream>> = {}; |
||||
Object.entries(out.stream.qualities).forEach((entry) => { |
||||
if (!isAllowedQuality(entry[0])) { |
||||
console.warn(`unrecognized quality: ${entry[0]}`); |
||||
return; |
||||
} |
||||
if (!allowedFileTypes.includes(entry[1].type)) { |
||||
console.warn(`unrecognized file type: ${entry[1].type}`); |
||||
return; |
||||
} |
||||
qualities[entry[0]] = { |
||||
type: entry[1].type, |
||||
url: entry[1].url, |
||||
}; |
||||
}); |
||||
return { |
||||
type: "file", |
||||
qualities, |
||||
}; |
||||
} |
||||
throw new Error("unrecognized type"); |
||||
} |
||||
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
export type SourceQuality = "unknown" | "360" | "480" | "720" | "1080"; |
||||
|
||||
export type StreamType = "hls" | "mp4"; |
||||
|
||||
export type SourceFileStream = { |
||||
type: "mp4"; |
||||
url: string; |
||||
}; |
||||
|
||||
export type LoadableSource = { |
||||
type: StreamType; |
||||
url: string; |
||||
}; |
||||
|
||||
export type SourceSliceSource = |
||||
| { |
||||
type: "file"; |
||||
qualities: Partial<Record<SourceQuality, SourceFileStream>>; |
||||
} |
||||
| { |
||||
type: "hls"; |
||||
url: string; |
||||
}; |
||||
|
||||
export function selectQuality(source: SourceSliceSource): { |
||||
stream: LoadableSource; |
||||
quality: null | SourceQuality; |
||||
} { |
||||
if (source.type === "hls") |
||||
return { |
||||
stream: source, |
||||
quality: null, |
||||
}; |
||||
if (source.type === "file") { |
||||
const firstQuality = Object.keys( |
||||
source.qualities |
||||
)[0] as keyof typeof source.qualities; |
||||
const stream = source.qualities[firstQuality]; |
||||
if (stream) { |
||||
return { stream, quality: firstQuality }; |
||||
} |
||||
} |
||||
throw new Error("couldn't select quality"); |
||||
} |
||||
|
||||
const qualityMap: Record<SourceQuality, string> = { |
||||
"1080": "1080p", |
||||
"360": "360p", |
||||
"480": "480p", |
||||
"720": "720p", |
||||
unknown: "unknown", |
||||
}; |
||||
|
||||
export const allQualities = Object.keys(qualityMap); |
||||
|
||||
export function qualityToString(quality: SourceQuality): string { |
||||
return qualityMap[quality]; |
||||
} |
||||
Loading…
Reference in new issue