import type { CanvasRenderer } from "../canvas-renderer"; import { mediaTimeToSeconds } from "opencut-wasm"; import { VisualNode, type VisualNodeParams } from "./visual-node"; import { videoCache } from "@/services/video-cache/service"; export interface VideoNodeParams extends VisualNodeParams { url: string; file: File; mediaId: string; } export class VideoNode extends VisualNode { async render({ renderer, time }: { renderer: CanvasRenderer; time: number }) { await super.render({ renderer, time }); if (!this.isInRange({ time })) { return; } const videoTimeTicks = this.getSourceLocalTime({ time }); const videoTimeSeconds = mediaTimeToSeconds({ time: videoTimeTicks }); const frame = await videoCache.getFrameAt({ mediaId: this.params.mediaId, file: this.params.file, time: videoTimeSeconds, }); if (frame) { this.renderVisual({ renderer, source: frame.canvas, sourceWidth: frame.canvas.width, sourceHeight: frame.canvas.height, timelineTime: time, }); } } }