94 lines
2.4 KiB
TypeScript

import mime from "mime";
import { addItem } from "$lib/state/queen-bee/queue";
import type { CobaltPipelineItem } from "$lib/types/workers";
import type { CobaltLocalProcessingResponse } from "$lib/types/api";
export const getMediaType = (type: string) => {
const kind = type.split('/')[0];
// can't use .includes() here for some reason
if (kind === "video" || kind === "audio" || kind === "image") {
return kind;
}
}
export const createRemuxPipeline = (file: File) => {
// chopped khia
const parentId = crypto.randomUUID();
const mediaType = getMediaType(file.type);
const pipeline: CobaltPipelineItem[] = [{
worker: "remux",
workerId: crypto.randomUUID(),
parentId,
workerArgs: {
files: [file],
ffargs: [
"-c", "copy",
"-map", "0"
],
output: {
type: file.type,
extension: file.name.split(".").pop(),
},
filename: file.name,
},
}];
if (mediaType) {
addItem({
id: parentId,
state: "waiting",
pipeline,
filename: file.name,
mediaType,
})
}
}
export const createSavePipeline = (info: CobaltLocalProcessingResponse) => {
const parentId = crypto.randomUUID();
const pipeline: CobaltPipelineItem[] = [];
// reverse is needed for audio (second item) to be downloaded first
const tunnels = info.tunnel.reverse();
for (const tunnel of tunnels) {
pipeline.push({
worker: "fetch",
workerId: crypto.randomUUID(),
parentId,
workerArgs: {
url: tunnel,
},
})
}
pipeline.push({
worker: "remux",
workerId: crypto.randomUUID(),
parentId,
workerArgs: {
ffargs: [
"-c:v", "copy",
"-c:a", "copy"
],
output: {
// TODO: return mime type from api to avoid dragging a big ass package into web build
type: mime.getType(info.filename) || undefined,
extension: info.filename.split(".").pop(),
},
filename: info.filename,
},
})
addItem({
id: parentId,
state: "waiting",
pipeline,
filename: info.filename,
mediaType: "video",
})
}