feat: 完善视频任务与 KOC 资源库
This commit is contained in:
45
lib/video-file.ts
Normal file
45
lib/video-file.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
const MP4_BRANDS = new Set([
|
||||
"avc1",
|
||||
"dash",
|
||||
"isom",
|
||||
"M4A ",
|
||||
"M4B ",
|
||||
"M4P ",
|
||||
"M4V ",
|
||||
"mp41",
|
||||
"mp42",
|
||||
"MSNV",
|
||||
]);
|
||||
|
||||
function fourCharacters(bytes: Uint8Array, offset: number) {
|
||||
return String.fromCharCode(...bytes.slice(offset, offset + 4));
|
||||
}
|
||||
|
||||
function isMp4Brand(brand: string) {
|
||||
return (
|
||||
MP4_BRANDS.has(brand) ||
|
||||
/^iso[2-9]$/.test(brand) ||
|
||||
/^3g[2p]$/.test(brand.slice(0, 3))
|
||||
);
|
||||
}
|
||||
|
||||
/** Rejects HTML/JSON/error payloads and non-MP4 containers before download. */
|
||||
export function hasMp4FileSignature(input: ArrayBuffer | Uint8Array) {
|
||||
const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
|
||||
if (bytes.byteLength < 12 || fourCharacters(bytes, 4) !== "ftyp") {
|
||||
return false;
|
||||
}
|
||||
const declaredSize = new DataView(
|
||||
bytes.buffer,
|
||||
bytes.byteOffset,
|
||||
bytes.byteLength,
|
||||
).getUint32(0);
|
||||
const boxEnd = Math.min(
|
||||
bytes.byteLength,
|
||||
declaredSize >= 12 ? declaredSize : bytes.byteLength,
|
||||
);
|
||||
for (let offset = 8; offset + 4 <= boxEnd; offset += 4) {
|
||||
if (isMp4Brand(fourCharacters(bytes, offset))) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user