12 changed files with 371 additions and 64 deletions
@ -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 @@ |
|||||||
|
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