PageSourceSearch

https://cinesignal.com/assets/RenditionSewnAudioPlayer-BaZ64_h2.js

js cinesignal.com collected 2026-10-04 07:40:57 UTC 10,456 bytes, 1 lines download raw bytes

1import{r as o,j as n}from"./jsx-runtime-CAOzMBF_.js";function W(l){if(!l||!Number.isFinite(l))return"--:--";const u=Math.max(0,Math.floor(l/1e3)),p=Math.floor(u/60),f=u%60;return`${p}:${f.toString().padStart(2,"0")}`}function le(l){if(!l)return"–";const u=new Date(l);return Number.isNaN(u.getTime())?"–":u.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function de(l,u=160){return l?l.length>u?`${l.slice(0,u-1)}…`:l:""}function ce(l,u){if(!l)return null;const p=l.tracks;return Array.isArray(p)&&p.length>0?u?p.find(f=>f.id===u)??p[0]:p[0]:l.audio_url&&l.sync_points?{id:u??"dialogue",kind:"dialogue",title:"Dialogue",audio_url:l.audio_url,duration_ms:l.duration_ms,cues:l.sync_points.map(f=>({screenplay_audio_id:f.line_id,line_id:f.line_id,start_ms:f.start_ms,end_ms:f.end_ms,text:f.text,metadata:null})),metadata:l.metadata??{}}:null}const me=({manifest:l,trackId:u,onProgress:p,className:f="",onControlsReady:$,onPlayingStateChange:k,screenplayTitle:P})=>{const t=o.useMemo(()=>ce(l,u),[l,u]),r=o.useMemo(()=>(t==null?void 0:t.cues)??[],[t==null?void 0:t.cues]),c=o.useMemo(()=>{if(t!=null&&t.duration_ms&&Number.isFinite(t.duration_ms))return t.duration_ms;if(r.length>0){const e=r[r.length-1];return(e==null?void 0:e.end_ms)??r.reduce((s,a)=>Math.max(s,a.end_ms??0),0)}},[t==null?void 0:t.duration_ms,r]),b=o.useRef(null),[R,M]=o.useState(null),[v,T]=o.useState(!1),[D,F]=o.useState(0),[m,N]=o.useState(0),[E,I]=o.useState(!1),[G,A]=o.useState(null),j=o.useRef({play:()=>{},pause:()=>{},next:()=>{},previous:()=>{},goToFirst:()=>{},goToIndex:()=>{}});o.useEffect(()=>{N(0),F(0),T(!1),A(null),I(!1)},[t==null?void 0:t.id]),o.useEffect(()=>{if(!t){M(null);return}if(!t.audio_url){M(null);return}const e=t.audio_url;let s=!1;async function a(){var d;try{const x=await fetch("/api/sign-audio-urls",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({urls:[e],expiresIn:7200})});if(!x.ok)throw new Error("Failed to sign audio url");const w=await x.json();s||M(((d=w.signed)==null?void 0:d[e])??e)}catch(x){console.error("Failed to sign audio url:",x),s||M(e)}}return a(),()=>{s=!0}},[t]),o.useEffect(()=>{const e=b.current;if(!e)return;const s=()=>{const w=e.currentTime*1e3;if(F(w),r.length>0){const y=r.findIndex(S=>{const K=S.start_ms??0,oe=S.end_ms??K;return w>=K&&w<oe}),U=y>=0?y:r.length-1;N(S=>S!==U?U:S)}},a=()=>{T(!1),F(c??D),N(r.length>0?r.length-1:0)},d=()=>T(!0),x=()=>T(!1);return e.addEventListener("timeupdate",s),e.addEventListener("ended",a),e.addEventListener("play",d),e.addEventListener("pause",x),()=>{e.removeEventListener("timeupdate",s),e.removeEventListener("ended",a),e.removeEventListener("play",d),e.removeEventListener("pause",x)}},[r,c,D]),o.useEffect(()=>{if(!p||r.length===0)return;const e=r[m];if(!e)return;const s=e.metadata&&typeof e.metadata=="object"&&"scene_no"in e.metadata?String(e.metadata.scene_no??""):e.scene_no!=null?String(e.scene_no):void 0,a=e.line_no??void 0,d=e.metadata&&typeof e.metadata=="object"?e.metadata:null,x=e.line_id??(d&&typeof d.line_id=="string"?d.line_id:void 0);p({scene:s,line:a??void 0,lineId:x})},[m,r,p]);const h=o.useCallback(e=>{b.current&&(b.current.currentTime=Math.max(0,e)/1e3)},[]),C=o.useCallback(()=>{b.current&&b.current.play()},[]),O=o.useCallback(()=>{b.current&&b.current.pause()},[]),_=o.useCallback(e=>{if(!r.length)return;const s=Math.max(0,Math.min(e,r.length-1)),a=r[s],d=(a==null?void 0:a.start_ms)??(a==null?void 0:a.end_ms)??0;N(s),h(d)},[r,h]),J=o.useCallback(()=>{_(0)},[_]),V=o.useCallback(()=>{if(r.length===0){c&&h(c);return}const e=Math.min(r.length-1,m+1);if(e===m){const s=r[e],a=(s==null?void 0:s.end_ms)??c??(s==null?void 0:s.start_ms)??0;h(a);return}_(e)},[r,m,_,h,c]),X=o.useCallback(()=>{if(r.length===0){h(0),N(0);return}const e=Math.max(0,m-1);if(m===0){h(0),N(0);return}_(e)},[r.length,m,_,h]),ee=o.useCallback(e=>{if(!c)return;const s=e.currentTarget.getBoundingClientRect(),a=e.clientX-s.left,d=Math.min(1,Math.max(0,a/s.width));h(c*d)},[h,c]);if(o.useEffect(()=>{j.current.play=()=>{C()},j.current.pause=O,j.current.next=V,j.current.previous=X,j.current.goToFirst=J,j.current.goToIndex=_},[C,O,V,X,J,_]),o.useEffect(()=>{$&&$(j.current)},[$]),o.useEffect(()=>{k&&k(v)},[v,k]),!t)return n.jsx("div",{className:`glass-card p-6 text-body ${f}`,children:"Your stitched ReadAlong mix will appear here once audio rendering is complete."});const i=r[m]??null,te=W(D),ne=W(c),z=!!R,Y=!t.audio_url||!R,L=r.length,g=l&&typeof l.metadata=="object"?l.metadata:void 0;(()=>{const e=(g==null?void 0:g.schema_version)??(l==null?void 0:l.schema_version);return typeof e=="string"?e:void 0})();const se=(()=>{const e=g==null?void 0:g.generated_at;return typeof e=="string"?e:void 0})();(()=>{const e=g==null?void 0:g.provider;return typeof e=="string"?e:void 0})();const re=Y?"Preparing audio…":v?"Playing":"Ready to play",B=(i==null?void 0:i.scene_no)??(i!=null&&i.metadata&&typeof i.metadata=="object"&&"scene_no"in i.metadata?i.metadata.scene_no:void 0),Z=typeof B=="number"||typeof B=="str
1ing"?String(B):void 0,q=i!=null&&i.line_no&&Number.isFinite(i.line_no)?i.line_no:void 0;(i==null?void 0:i.line_id)??(i==null||i.screenplay_audio_id);const ie=o.useMemo(()=>r.length===0?c??0:m+1<r.length?r[m+1].start_ms??r[m+1].end_ms??c??0:c??(i==null?void 0:i.end_ms)??0,[r,m,c,i==null?void 0:i.end_ms]),H=o.useMemo(()=>{if(!(t!=null&&t.audio_url))return"mp3";try{const s=(t.audio_url.split("?")[0]??t.audio_url).split(".").pop();if(s&&/^[a-zA-Z0-9]+$/.test(s))return s.toLowerCase()}catch{}return"mp3"},[t==null?void 0:t.audio_url]),Q=o.useMemo(()=>`${(P&&P.trim()||(t==null?void 0:t.title)&&t.title.trim()||"readalong").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-").slice(0,80)||"readalong"}-cinesignal-readalong.${H}`,[H,P,t==null?void 0:t.title]),ae=o.useCallback(async()=>{if(!(!(t!=null&&t.audio_url)||E)){I(!0),A(null);try{const e=new FormData;e.append("audioUrl",t.audio_url),e.append("fileName",Q);const s=await fetch("/api/download-rendition-audio",{method:"POST",body:e}),a=await s.json().catch(()=>null);if(!s.ok||!(a!=null&&a.signedUrl)){const U=(a==null?void 0:a.error)||"Unable to prepare download. Please try again.";throw new Error(U)}const d=await fetch(a.signedUrl,{mode:"cors"});if(!d.ok)throw new Error("Failed to retrieve audio file for download.");const x=await d.blob(),w=URL.createObjectURL(x),y=document.createElement("a");y.href=w,y.download=Q,y.style.display="none",document.body.appendChild(y),y.click(),document.body.removeChild(y),URL.revokeObjectURL(w)}catch(e){const s=e instanceof Error?e.message:String(e??"Unknown error");A(s)}finally{I(!1)}}},[Q,E,t==null?void 0:t.audio_url]);return n.jsxs("div",{className:`glass-card p-6 shadow-xl space-y-5 ${f}`,children:[n.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-start md:justify-between",children:[n.jsxs("div",{className:"space-y-1 min-w-0",children:[n.jsx("h3",{className:"text-md font-semibold text-white uppercase",children:"ReadAlong Playback"}),n.jsxs("div",{className:"flex flex-wrap gap-2 text-xs text-gray-300",children:[n.jsxs("span",{className:"mt-2 inline-flex items-center gap-1 rounded-full bg-dark-700/60 px-3 py-1",children:[n.jsx("i",{className:"i-uil:music","aria-hidden":!0})," ",re]}),n.jsxs("span",{className:"mt-2 inline-flex items-center gap-1 rounded-full bg-dark-700/60 px-3 py-1",children:[n.jsx("i",{className:"i-uil:list-ol","aria-hidden":!0})," ",L," line",L===1?"":"s"]})]})]}),n.jsxs("div",{className:"text-xs text-gray-500 space-y-1 text-right",children:[n.jsxs("div",{children:["Line ",Math.min(m+1,L||1)," of"," ",L||1]}),n.jsxs("div",{children:["Generated: ",le(se)]})]})]}),n.jsxs("div",{children:[n.jsx("div",{className:"w-full h-4 bg-dark-700/60 rounded cursor-pointer overflow-hidden flex",onClick:ee,children:r.map((e,s)=>{const a=Math.max(1,(e.end_ms??e.start_ms??0)-(e.start_ms??0)),d=c?a/c*100:100/r.length,x=s===m;return n.jsx("div",{className:`h-full transition-all ${x?"bg-primary-cine":"bg-dark-500/70"}`,style:{width:`${d}%`}},s)})}),n.jsxs("div",{className:"flex items-center justify-between mt-1 text-xs text-gray-400",children:[n.jsx("span",{children:te}),n.jsx("span",{children:ne})]})]}),Y&&n.jsx("div",{className:"text-sm text-gray-400",children:"Preparing stitched audio…"}),n.jsxs("div",{className:"flex flex-col gap-3 md:grid md:grid-cols-[1fr_auto] md:items-center",children:[n.jsxs("div",{className:"flex items-center justify-center gap-4 md:justify-self-center",children:[n.jsx("button",{className:"w-12 h-12 rounded-full bg-dark-600 hover:bg-dark-500 text-white/90 flex items-center justify-center text-lg shadow-sm transition",onClick:()=>h(0),type:"button","aria-label":"Restart",disabled:!z,children:n.jsx("i",{className:"i-uil:history","aria-hidden":!0})}),n.jsx("button",{className:"w-14 h-14 rounded-full bg-primary-cine hover:bg-primary-cine/90 text-white flex items-center justify-center text-xl shadow-md",onClick:()=>v?O():C(),type:"button","aria-label":v?"Pause":"Play",disabled:!z,children:n.jsx("i",{className:v?"i-uil:pause":"i-uil:play","aria-hidden":!0})}),n.jsx("button",{className:"w-12 h-12 rounded-full bg-stone-700 hover:bg-stone-600 text-white/90 flex items-center justify-center text-lg shadow-sm",onClick:()=>h(ie??0),type:"button","aria-label":"Skip",disabled:!z,children:n.jsx("i",{className:"i-uil:angle-right","aria-hidden":!0})})]}),t!=null&&t.audio_url?n.jsxs("div",{className:"flex flex-col items-center gap-2 md:items-end md:justify-self-end",children:[n.jsxs("button",{type:"button",onClick:ae,className:`btn-view inline-flex items-center gap-2 ${E?"pointer-events-none opacity-60":""}`,disabled:E,children:[n.jsx("i",{className:"i-uil:download-alt","aria-hidden":!0}),E?"Preparing...":"Download audio"]}),G?n.jsx("p",{className:"max-w-xs text-center text-xs text-rose-400 md:text-right",children:G}):null]}):null]}),(i==null?void 0:i.text)&&n.jsxs("div",{className:"mt-2 p-4 bg-dark-700/50 rounded-lg text-sm text-white/90 shadow-inner border border-dark-500/40",children:[n.jsxs("div",{className:"flex items-center justify-start text-xs text-gray-400 gap-2 mb-1",children:[n.jsx("span",{children:Z?`Scene ${Z}`:"Current line"}),n.jsx("span",{children:q?`Line ${q}`:"—"})]}),n.jsx("p",{className:"whitespace-pre-wrap leading-relaxed",children:de(i.text??"")})]}),n.jsx("audio",{ref:b,src:R??void 0,preload:"metadata",controls:!1})]})};export{me as R};

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.