UNPKG

media-trimmer

Version:

A simple WebM and MP4 video trimmer using the WebCodecs API

3 lines (2 loc) 1.87 kB
import{createEffectScope as t,ref as s}from"fine-jsx";import{H as e,s as i,r,V as a,t as o}from"./trim-DO2ilh10.js";const n=["source","start","end","mute"];class h extends e{static observedAttributes=n;#t=t();#s=s();#e=s({start:0,end:0,mute:!1});#i;#r;progress=0;#a=!1;duration=0;hasAudio=!1;get source(){return this.#s.value}set source(t){this.#s.value=t}get start(){return this.#e.value.start}set start(t){this.#e.value={...this.#e.value,start:t}}get end(){return this.#e.value.end}set end(t){this.#e.value={...this.#e.value,end:t}}get mute(){return this.#e.value.mute}set mute(t){this.#e.value={...this.#e.value,mute:t}}attributeChangedCallback(t,s,e){this[t]=e}connectedCallback(){clearTimeout(this.#r),this.#i||(this.classList.add(i.host),this.#i=this.#t.run(()=>r(a,{source:this.#s,state:this.#e,onLoad:this.#o.bind(this),onChange:this.#n.bind(this),onError:this.#h.bind(this)},this)))}disconnectedCallback(){this.#r=setTimeout(()=>{this.#i?.(),this.#i=void 0},500)}async toBlob(){const{source:t,start:s,end:e,mute:i}=this;if(this.#a)throw new Error("[media-trimmer] Trim is already in progress.");if(null==t||""===t)throw new Error("[media-trimmer]: Source media wasn't set.");if(!this.duration)throw new Error("[media-trimmer] Source isn't ready yet");this.#a=!0;const{duration:r,hasAudio:a}=this;try{return 0!==s||e!==r||a&&i?await o(t,{start:s,end:e,mute:i,onProgress:t=>{this.progress=t,this.#u("progress")}}):"string"==typeof t?await fetch(t).then(t=>t.blob()):t}finally{this.#a=!1,this.progress=0}}#o(t){this.duration=t.duration,this.hasAudio=t.hasAudio,this.#u("load")}#n(t){this.#e.value=t,this.#u("change")}#h(t){this.dispatchEvent(new ErrorEvent("error",{error:t}))}#u(t){this.dispatchEvent(new u(t,this))}}class u extends Event{constructor(t,s){super(t),this.trimmer=s}}export{h as M,u as T}; //# sourceMappingURL=media-trimmer-element-D51mu4Ok.js.map