PageSourceSearch

https://savemate.io/build/assets/TransmuxTest-DvqKbI96.js

js savemate.io collected 2026-10-02 01:59:59 UTC 14,819 bytes, 2 lines download raw bytes

1import{d as me,g as b,h as A,c as k,o as c,e as s,b as a,u as t,i as ve,a as C,j as h,w as l,f as o,n as K,F as Y,y as ce,t as R}from"./app-0PJhe5DC.js";import{_ as ge}from"./AppNavbar.vue_vue_type_script_setup_true_lang-ul8dUNi_.js";import{_ as D}from"./Card.vue_vue_type_script_setup_true_lang-SYfvvHop.js";import{_ as N}from"./CardContent.vue_vue_type_script_setup_true_lang-DhfhnlUA.js";import{_ as Z}from"./CardDescription.vue_vue_type_script_setup_true_lang-BCB8zI3y.js";import{e as ee,_ as P}from"./AppLogoIcon.vue_vue_type_script_setup_true_lang-BEyrTT7l.js";import{_ as te,a as se}from"./CardTitle.vue_vue_type_script_setup_true_lang-C2YtpRxA.js";import{_ as z}from"./Input.vue_vue_type_script_setup_true_lang-DK7ZCxp6.js";import{_ as V}from"./Label.vue_vue_type_script_setup_true_lang-C7IqeM0s.js";import{_ as pe}from"./Checkbox.vue_vue_type_script_setup_true_lang-DQchpluN.js";import{_ as fe}from"./Progress.vue_vue_type_script_setup_true_lang-CpNrxtg5.js";import{u as xe}from"./useTransmuxWorker-MCUWpIq4.js";import{F as ye}from"./file-video-GZ9SxVkJ.js";import{T as _e}from"./trash-2-CGye7UQN.js";import{P as we}from"./plus-DNggNinW.js";import{L as be}from"./loader-circle-CI-53K5i.js";import{P as he}from"./play-C7Z_l1_Q.js";import{C as Ue}from"./circle-alert-DqSLPgVL.js";import{C as ke}from"./circle-check-DOY_xJaC.js";import{D as Se}from"./download-BaLxPfz0.js";import"./VisuallyHidden-DOE0LBs2.js";import"./index-foRn8X4S.js";import"./isValueEqualOrExist-C_7OvCLx.js";import"./ohash.D__AXeF1-Cq3NGnZa.js";import"./CollapsibleTrigger-Bs1m62KF.js";import"./index-BCq9ta0T.js";import"./chevron-down-Bq4-Oz8l.js";import"./DialogTitle-Cu-J1fC3.js";import"./DialogTrigger-DqfXnONs.js";import"./newspaper-DxgZFlzm.js";import"./history-BM2I6RI9.js";import"./index-CxeiT8PA.js";import"./useFormControl-B-gWlB4A.js";import"./RovingFocusItem-B3oACWX8.js";import"./RovingFocusGroup-DZ1ZY1Vs.js";import"./VisuallyHiddenInput-BwWHgXkY.js";import"./check-BkEXRJ2-.js";const Pe={class:"min-h-screen bg-background text-foreground flex flex-col"},Ve={class:"flex-1 container mx-auto px-4 py-8 max-w-3xl"},Le={class:"space-y-4"},Te={class:"flex gap-2"},Re={class:"flex items-center space-x-4 mb-4"},$e={class:"flex bg-muted p-1 rounded-lg"},Ae={class:"flex items-center gap-2 mb-4 p-3 bg-muted rounded-lg"},Ce={key:0,class:"space-y-4"},ze={class:"space-y-2"},Me={class:"space-y-2"},Ie={key:1,class:"space-y-3"},Fe={key:2,class:"space-y-3"},Be={key:3,class:"space-y-3 p-3 border border-dashed rounded-lg"},Ee={class:"grid gap-2"},Oe={key:4,class:"space-y-2"},We={class:"text-sm text-muted-foreground text-center"},De={class:"flex gap-3"},Ne={class:"flex gap-3 text-destructive"},je={class:"text-sm opacity-90"},He={class:"grid grid-cols-2 gap-4"},Qe={class:"p-4 bg-muted/50 rounded-lg text-center"},Xe={class:"text-2xl font-semibold text-primary"},qe={class:"p-4 bg-muted/50 rounded-lg text-center"},Je={class:"text-2xl font-semibold text-primary"},Ge={key:0,class:"space-y-2"},Ke=["src"],It=me({__name:"TransmuxTest",setup(Ye){const x=b([""]),B=b(""),d=b(""),j=b(!1),E=b(""),O=b(""),_=async i=>{if(j.value){const e=`/test/proxy?url=${encodeURIComponent(i)}`;return fetch(e)}return fetch(i)},r=xe({fileName:"test_video"}),H=A(()=>(r.bytesWritten.value??0)>0?ee(r.bytesWritten.value??0):null),g=A(()=>d.value!==""||r.isActive.value),Q=A(()=>d.value?d.value:r.isActive.value?`Processing: ${r.segmentsProcessed.value??0} segments`:"Transmux"),w=b(null),y=b("playlist"),L=b(""),M=b(""),I=A(()=>y.value==="segments"?x.value.filter(i=>i.trim().length>0):L.value?[L.value]:[]),ae=()=>{x.value.length<10&&x.value.push("")},le=i=>{x.value.length>1&&x.value.splice(i,1)},X=(i,e)=>{try{return new URL(e,i).href}catch{return e}},re=async()=>{if(!(y.value==="segments"&&I.value.length===0)&&!(y.value==="playlist"&&!L.value)){d.value="Starting...",w.value=null;try{await ne()}catch(i){d.value="",console.error(i),alert(i instanceof Error?i.message:"Error during transmux")}}},ne=async()=>{try{if(d.value="Starting progressive transmux...",!await r.start())throw new Error("Failed to start progressive transmux");let e,n;if(y.value==="playlist"){const v=async m=>{const U=await _(m);if(!U.ok)throw new Error(`Failed to fetch playlist: ${U.status}`);const f=(await U.text()).split(`
2`),S=[];let $=null;for(const de of f){const F=de.trim();if(F)if(F.startsWith("#EXT-X-MAP:URI=")){const G=F.match(/URI="([^"]+)"/);G&&($=X(m,G[1]))}else F.startsWith("#")||S.push(X(m,F))}return{segmentUrls:S,initSegmentUrl:$}},{segmentUrls:u,initSegmentUrl:T}=await v(L.value);if(T){d.value="Fetching video init segment...";const m=await _(T);m.ok&&(e=new Uint8Array(await m.arrayBuffer()),r.setVideoInitSegment(e))}if(M.value.trim()){const{segmentUrls:m,initSegmentUrl:U}=await v(M.value);if(U){d.value="Fetching audio init segment...";const f=await _(U);f.ok&&(n=new Uint8Array(await f.arrayBuffer()),r.setAudioInitSegment(n))}const W=Math.max(u.length,m.length);for(let f=0;f<W;
2f++){if(f<u.length){d.value=`Processing video segment ${f+1}/${u.length}...`;const S=await _(u[f]);if(S.ok){const $=new Uint8Array(await S.arrayBuffer());await r.addVideoSegment($)}}if(f<m.length){d.value=`Processing audio segment ${f+1}/${m.length}...`;const S=await _(m[f]);if(S.ok){const $=new Uint8Array(await S.arrayBuffer());await r.addAudioSegment($)}}}}else for(let m=0;m<u.length;m++){d.value=`Processing segment ${m+1}/${u.length}...`;const U=await _(u[m]);if(U.ok){const W=new Uint8Array(await U.arrayBuffer());await r.addVideoSegment(W)}}}else{if(E.value.trim()){d.value="Fetching video init segment...";const u=await _(E.value);u.ok&&(e=new Uint8Array(await u.arrayBuffer()),r.setVideoInitSegment(e))}if(O.value.trim()){d.value="Fetching audio init segment...";const u=await _(O.value);u.ok&&(n=new Uint8Array(await u.arrayBuffer()),r.setAudioInitSegment(n))}const v=I.value;for(let u=0;u<v.length;u++){d.value=`Processing video segment ${u+1}/${v.length}...`;const T=await _(v[u]);if(T.ok){const m=new Uint8Array(await T.arrayBuffer());await r.addVideoSegment(m)}}if(B.value.trim()){d.value="Processing audio segment...";const u=await _(B.value);if(u.ok){const T=new Uint8Array(await u.arrayBuffer());await r.addAudioSegment(T)}}}d.value="Finalizing...";const p=await r.finalize();p&&(w.value=p,console.log(`Progressive transmux complete: ${p.size} bytes`)),d.value=""}catch(i){d.value="",console.error(i),alert(i instanceof Error?i.message:"Error in progressive transmux"),await r.reset()}},oe=()=>{if(!w.value)return;const i=URL.createObjectURL(w.value),e=document.createElement("a");e.href=i,e.download="transmuxed_video.mp4",e.click(),URL.revokeObjectURL(i)},ie=()=>{x.value=[""],L.value="",M.value="",d.value="",w.value=null,r.reset()},q=A(()=>w.value?URL.createObjectURL(w.value):null),J=A(()=>w.value!==null),ue=()=>{x.value=["https://test-streams.mux.dev/x36xhzz/url_0/193039199_mp4_h264_aac_hd_7.ts","https://test-streams.mux.dev/x36xhzz/url_0/193039199_mp4_h264_aac_hd_8.ts","https://test-streams.mux.dev/x36xhzz/url_0/193039199_mp4_h264_aac_hd_9.ts"]};return(i,e)=>(c(),k(Y,null,[s(t(ve),{title:"Transmux Test - TS to MP4"}),a("div",Pe,[s(ge,{class:"border-b bg-card sticky top-0 z-50"}),a("main",Ve,[s(t(D),{class:"mb-6"},{default:l(()=>[s(t(te),null,{default:l(()=>[s(t(se),{class:"flex items-center gap-2"},{default:l(()=>[s(t(ye),{class:"h-6 w-6 text-primary"}),e[10]||(e[10]=o(" TS → MP4 Multi-Segment Transmux Test "))]),_:1}),s(t(Z),null,{default:l(()=>e[11]||(e[11]=[o(" Add multiple TS segment URLs to test combining and transmuxing into a single MP4. The result should play in QuickTime/VLC. ")])),_:1})]),_:1}),s(t(N),null,{default:l(()=>[a("div",Le,[a("div",Te,[J.value?h("",!0):(c(),C(t(P),{key:0,variant:"ghost",size:"sm",onClick:ue,disabled:g.value},{default:l(()=>e[12]||(e[12]=[o(" Load Sample URLs ")])),_:1},8,["disabled"]))]),a("div",Re,[s(t(V),null,{default:l(()=>e[13]||(e[13]=[o("Input Mode:")])),_:1}),a("div",$e,[s(t(P),{variant:"ghost",size:"sm",class:K(["px-3 py-1 h-auto rounded-md",y.value==="segments"?"bg-background shadow text-foreground hover:bg-background":"text-muted-foreground"]),onClick:e[0]||(e[0]=n=>y.value="segments")},{default:l(()=>e[14]||(e[14]=[o(" Direct Segments ")])),_:1},8,["class"]),s(t(P),{variant:"ghost",size:"sm",class:K(["px-3 py-1 h-auto rounded-md",y.value==="playlist"?"bg-background shadow text-foreground hover:bg-background":"text-muted-foreground"]),onClick:e[1]||(e[1]=n=>y.value="playlist")},{default:l(()=>e[15]||(e[15]=[o(" HLS Playlist ")])),_:1},8,["class"])])]),a("div",Ae,[s(t(pe),{id:"useProxy",checked:j.value,"onUpdate:checked":e[2]||(e[2]=n=>j.value=n)},null,8,["checked"]),s(t(V),{for:"useProxy",class:"cursor-pointer"},{default:l(()=>e[16]||(e[16]=[o(" Use proxy (bypass CORS for external URLs like Twitch) ")])),_:1})]),y.value==="playlist"?(c(),k("div",Ce,[a("div",ze,[s(t(V),null,{default:l(()=>e[17]||(e[17]=[o("Video Media Playlist URL (.m3u8)")])),_:1}),s(t(z),{modelValue:L.value,"onUpdate:modelValue":e[3]||(e[3]=n=>L.value=n),type:"url",placeholder:"https://example.com/video_1080p.m3u8",disabled:g.value},null,8,["modelValue","disabled"]),e[18]||(e[18]=a("p",{class:"text-xs text-muted-foreground"},[o(" Must be a "),a("strong",null,"Media Playlist"),o(" containing segments, NOT a Master Playlist. ")],-1))]),a("div",Me,[s(t(V),null,{default:l(()=>e[19]||(e[19]=[o("Audio Media Playlist URL (.m3u8) (Optional)")])),_:1}),s(t(z),{modelValue:M.value,"onUpdate:modelValue":e[4]||(e[4]=n=>M.value=n),type:"url",placeholder:"https://example.com/audio_eng.m3u8",disabled:g.value},null,8,["modelValue","disabled"])])])):h("",!0),y.value==="segments"?(c(),k("div",Ie,[s(t(V),null,{default:l(()=>e[20]||(e[20]=[o("TS Segment URLs")])),_:1}),(c(!0),k(Y,null,ce(x.value,(n,p)=>(c(),k("div",{key:p,class:"flex gap-2"},[s(t(z),{modelValue:x.value[p],"onUpdate:modelValue":v=>x.value[p]=v,type:"url",placeholder:`Segment ${p+1} URL (e.g., .ts file)`,disabled:g.value,class:"flex-1"},null,8,["modelValue","onUpdate:modelValue","placeholder","disabled"]),x.value.length>1?(c(),C(t(P),{key:0,variant:"ghost",size:"icon",onClick:v=>le(p),disabled:g.value},{default:l(()=>[s(t(_e),{class:"h-4 w-4 text-muted-foreground"})]),_:2},1032,["onClick","disabled"])):h("",!0)]))),128)),s(t(P),{variant:"outline",size:"sm",onClick:ae,disabled:g.value||x.value.length>=10},{default:l(()=>[s(t(we),{class:"h-4 w-4 mr-1"}),e[21]||(e[21]=o(" Add Segment "))]),_:1},8,["disabled"]),e[22]||(e[22]=a("p",{class:"text-xs text-muted-foreground"}," Add 2-3 consecutive .ts segments from an HLS stream to test multi-segment transmuxing. ",-1))])):h("",!0),y.value==="segments"?(c(),k("div",Fe,[s(t(V),null,{default:l(()=>e[23]||(e[23]=[o("Optional Audio Segment URL")])),_:1}),s(t(z),{modelValue:B.value,"onUpdate:modelValue":e[5]||(e[5]=n=>B.value=n),type:"url",placeholder:"Separate audio segment URL (e.g. .aac, .m4s)",disabled:g.value},null,8,["modelValue","disabled"])])):h("",!0),y.value==="segments"?(c(),k("div",Be,[s(t(V),{class:"flex items-center gap-2"},{default:l(()=>e[24]||(e[24]=[a("span",null,"🔧",-1),o(" Init Segment URLs (for fMP4/m4s) ")])),_:1}),e[25]||(e[25]=a("p",{class:"text-xs text-muted-foreground"}," If using fMP4 segments (like Twitch .mp4), provide the init segment URL. ",-1)),a("div",Ee,[s(t(z),{modelValue:E.value,"onUpdate:modelValue":e[6]||(e[6]=n=>E.value=n),type:"url",placeholder:"Video init segment URL (init.mp4 or map.mp4)",disabled:g.value},null,8,["modelValue","disabled"]),s(t(z),{modelValue:O.value,"onUpdate:modelValue":e[7]||
2(e[7]=n=>O.value=n),type:"url",placeholder:"Audio init segment URL (optional)",disabled:g.value},null,8,["modelValue","disabled"])])])):h("",!0),g.value||d.value?(c(),k("div",Oe,[s(t(fe),{"model-value":(t(r).segmentsProcessed.value??0)*10},null,8,["model-value"]),a("p",We,R(Q.value),1)])):h("",!0),a("div",De,[s(t(P),{onClick:re,disabled:g.value||I.value.length===0},{default:l(()=>[g.value?(c(),C(t(be),{key:0,class:"h-4 w-4 mr-2 animate-spin"})):(c(),C(t(he),{key:1,class:"h-4 w-4 mr-2"})),o(" "+R(g.value?Q.value:`Transmux ${I.value.length} Segment(s)`),1)]),_:1},8,["disabled"]),s(t(P),{variant:"outline",onClick:ie,disabled:g.value},{default:l(()=>e[26]||(e[26]=[o(" Reset ")])),_:1},8,["disabled"])])])]),_:1})]),_:1}),t(r).error.value?(c(),C(t(D),{key:0,class:"mb-6 border-destructive/50"},{default:l(()=>[s(t(N),{class:"pt-6"},{default:l(()=>[a("div",Ne,[s(t(Ue),{class:"h-5 w-5 shrink-0 mt-0.5"}),a("div",null,[e[27]||(e[27]=a("h5",{class:"font-medium mb-1"},"Transmux Failed",-1)),a("p",je,R(t(r).error.value),1)])])]),_:1})]),_:1})):h("",!0),J.value?(c(),C(t(D),{key:1,class:"border-green-500/50"},{default:l(()=>[s(t(te),null,{default:l(()=>[s(t(se),{class:"flex items-center gap-2 text-green-600"},{default:l(()=>[s(t(ke),{class:"h-5 w-5"}),e[28]||(e[28]=o(" Transmux Successful "))]),_:1}),s(t(Z),null,{default:l(()=>[o(R(I.value.length)+" segment(s) combined into a single MP4. ",1)]),_:1})]),_:1}),s(t(N),{class:"space-y-4"},{default:l(()=>{var n;return[a("div",He,[a("div",Qe,[e[29]||(e[29]=a("p",{class:"text-xs text-muted-foreground uppercase tracking-wide"}," Output Size ",-1)),a("p",Xe,R(H.value||((n=w.value)!=null&&n.size?t(ee)(w.value.size):"--")),1)]),a("div",qe,[e[30]||(e[30]=a("p",{class:"text-xs text-muted-foreground uppercase tracking-wide"}," Segments ",-1)),a("p",Je,R(t(r).segmentsProcessed.value??0),1)]),e[31]||(e[31]=a("div",{class:"p-4 bg-muted/50 rounded-lg text-center col-span-2"},[a("p",{class:"text-xs text-muted-foreground uppercase tracking-wide"}," Engine "),a("p",{class:"text-lg font-semibold text-green-500"}," 🚀 Progressive (Mediabunny) ")],-1))]),q.value?(c(),k("div",Ge,[s(t(V),null,{default:l(()=>e[32]||(e[32]=[o("Preview")])),_:1}),a("video",{src:q.value,controls:"",class:"w-full rounded-lg border bg-black aspect-video",onError:e[8]||(e[8]=p=>{var v;return console.error("Video error:",(v=p.target)==null?void 0:v.error)}),onLoadedmetadata:e[9]||(e[9]=p=>{var v;return console.log("Loaded metadata, duration:",(v=p.target)==null?void 0:v.duration)})},null,40,Ke)])):h("",!0),s(t(P),{onClick:oe,class:"w-full",size:"lg"},{default:l(()=>[s(t(Se),{class:"h-4 w-4 mr-2"}),o(" Download MP4 ("+R(H.value)+") ",1)]),_:1})]}),_:1})]),_:1})):h("",!0),s(t(D),{class:"mt-6"},{default:l(()=>[s(t(N),{class:"pt-6"},{default:l(()=>e[33]||(e[33]=[a("h4",{class:"font-medium mb-2"},"How it works",-1),a("ul",{class:"text-sm text-muted-foreground space-y-1 list-disc list-inside"},[a("li",null,[a("strong",null,"hls.js internals"),o(" demux TS segments and remux to MP4 ")]),a("li",null," Multiple segments are fetched and combined before transmuxing "),a("li",null," Uses pure JavaScript – no WASM or server required "),a("li",null," Creates proper standalone MP4 compatible with QuickTime, VLC, and all players ")],-1)])),_:1})]),_:1})])])],64))}});export{It as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.