@omnimedia/omnitool
Version:
open source video processing tools
61 lines (49 loc) • 1.24 kB
text/typescript
import {MapG} from "@e280/stz"
import {Id} from "../parts/basics.js"
import {Media} from "../parts/media.js"
import {Effect, Item, Kind} from "../parts/item.js"
export class O {
#nextId = 0
#items = new MapG<Id, Item.Any>()
#getId() {
return this.#nextId++
}
register(item: Item.Any) {
if (!this.#items.has(item.id))
this.#items.set(item.id, item)
return item.id
}
get items() {
return [...this.#items.values()]
}
sequence = (...items: Item.Any[]): Item.Sequence => ({
id: this.#getId(),
kind: Kind.Sequence,
children: items.map(item => this.register(item)),
})
stack = (...items: Item.Any[]): Item.Stack => ({
id: this.#getId(),
kind: Kind.Stack,
children: items.map(item => this.register(item)),
})
clip = (media: Media, start?: number, duration?: number): Item.Clip => ({
id: this.#getId(),
kind: Kind.Clip,
mediaHash: media.datafile.checksum.hash,
start: start ?? 0,
duration: duration ?? media.duration,
})
text = (content: string): Item.Text => ({
id: this.#getId(),
kind: Kind.Text,
content,
})
transition = {
crossfade: (duration: number): Item.Transition => ({
id: this.#getId(),
kind: Kind.Transition,
effect: Effect.Crossfade,
duration,
}),
}
}