mirror of https://github.com/VERT-sh/VERT.git
feat: preliminary mediabunny (sorry maya)
This commit is contained in:
parent
9154213868
commit
7f888e3f43
|
|
@ -0,0 +1,98 @@
|
|||
import { VertFile } from "$lib/types";
|
||||
import {
|
||||
ALL_FORMATS,
|
||||
BufferTarget,
|
||||
Conversion,
|
||||
Input,
|
||||
MkvOutputFormat,
|
||||
MovOutputFormat,
|
||||
Mp4InputFormat,
|
||||
Mp4OutputFormat,
|
||||
Output,
|
||||
ReadableStreamSource,
|
||||
WebMInputFormat,
|
||||
WebMOutputFormat,
|
||||
} from "mediabunny";
|
||||
import { Converter, FormatInfo, type WorkerStatus } from "./converter.svelte";
|
||||
import { ToastManager } from "$lib/util/toast.svelte";
|
||||
|
||||
export class MediabunnyConverter extends Converter {
|
||||
public name = "mediabunny";
|
||||
public status: WorkerStatus = $state("ready");
|
||||
|
||||
public supportedFormats: FormatInfo[] = [
|
||||
new FormatInfo("mp4", true, true),
|
||||
new FormatInfo("mkv", false, true),
|
||||
new FormatInfo("webm", true, true),
|
||||
new FormatInfo("mov", false, true),
|
||||
];
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
public async convert(file: VertFile, to: string): Promise<VertFile> {
|
||||
const stream = file.file.stream(); // ReadableStream<Uint8Array<ArrayBuffer>>
|
||||
const input = new Input({
|
||||
formats: [new Mp4InputFormat(), new WebMInputFormat()],
|
||||
source: new ReadableStreamSource(stream),
|
||||
});
|
||||
|
||||
const toFormat = to.startsWith(".") ? to.slice(1) : to;
|
||||
const originalName = file.file.name.split(".").slice(0, -1).join(".");
|
||||
|
||||
const output = new Output({
|
||||
format: this.format(to),
|
||||
target: new BufferTarget(),
|
||||
});
|
||||
|
||||
const conversion = await Conversion.init({
|
||||
input,
|
||||
output,
|
||||
});
|
||||
|
||||
if (!conversion.isValid) {
|
||||
for (const discarded of conversion.discardedTracks) {
|
||||
ToastManager.add({
|
||||
type: "error",
|
||||
message: `Mediabunny discarded unsupported track: ${discarded.reason}`,
|
||||
});
|
||||
}
|
||||
|
||||
throw new Error(`Mediabunny conversion not valid`);
|
||||
}
|
||||
|
||||
await conversion.execute();
|
||||
|
||||
if (!output.target.buffer) {
|
||||
throw new Error("Mediabunny conversion failed: no output buffer");
|
||||
}
|
||||
|
||||
const f = new File(
|
||||
[output.target.buffer],
|
||||
`${originalName}.${toFormat}`,
|
||||
{
|
||||
type: "application/octet-stream",
|
||||
},
|
||||
);
|
||||
|
||||
return new VertFile(f, toFormat);
|
||||
}
|
||||
|
||||
private format(ext: string) {
|
||||
switch (ext) {
|
||||
case ".mp4":
|
||||
return new Mp4OutputFormat();
|
||||
case ".mkv":
|
||||
return new MkvOutputFormat();
|
||||
case ".webm":
|
||||
return new WebMOutputFormat();
|
||||
case ".mov":
|
||||
return new MovOutputFormat();
|
||||
default:
|
||||
throw new Error(`Unsupported format: ${ext}`);
|
||||
}
|
||||
}
|
||||
|
||||
public async cancel(input: VertFile): Promise<void> {}
|
||||
}
|
||||
Loading…
Reference in New Issue