1!function(){try{var e="u">typeof window?window:"u">typeof global?global:"u">typeof globalThis?globalThis:"u">typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="8d0ade58-7fcf-4a32-be82-31ba137a63e2",e._sentryDebugIdIdentifier="sentry-dbid-8d0ade58-7fcf-4a32-be82-31ba137a63e2")}catch(e){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3616],{1007:(e,t,r)=>{r.d(t,{DX:()=>l,_b:()=>a._,dT:()=>c,mR:()=>s});var o=r(92714),a=r(6609);let n={id:a._,name:"Interesting Content Compilation",shortLabel:"Default rare-photo template",description:"Turns Reddit photo and short-video descriptions into short, punchy narration built for fast vertical compilation edits.",stylePrompt:"Write like a fast faceless short about rare, strange, or visually striking media. The line should sound like a confident narrator, not a Reddit title, and it should be vivid, clean, factual, and easy to say out loud.",rewritePrompt:"Condense each source description into one short narration line. Front-load the unusual detail, cut first-person wording, filler, emojis, and Reddit framing, and usually land between 7 and 16 spoken words. Keep dates, places, counts, and proper nouns only when they make the line more interesting.",voiceoverPrompt:"Voiceover timing decides scene timing. Each line should normally speak in about 3.5 to 7.5 seconds, captions should usually mirror the final voiceover line, and media should trim to the finished voiceover with a little extra padding on each side.",rewriteExamples:[{sourceText:"This large chicken egg",rewrittenText:"An oversized chicken egg."},{sourceText:"The two halves of my orange in different colors",rewrittenText:"Two halves of an orange that are different colors."},{sourceText:"Found a 140 year old coin in my purse",rewrittenText:"A 140-year-old coin found in someone's purse."},{sourceText:"An Apple in an Apple",rewrittenText:"An apple growing inside another apple."},{sourceText:"This very old slate gate stoop is being slowly swallowed by the tree - nature doing its thing!",rewrittenText:"An old slate gate stoop slowly being swallowed by a tree."},{sourceText:"Fixing a powerline from a helicopter",rewrittenText:"Fixing a powerline while hanging from a helicopter."},{sourceText:"The stages of an Osprey as it dives into the water to hunt.",rewrittenText:"An osprey's graceful dive as it plunges into the water to hunt."},{sourceText:"A 12 million year old praying mantis encased in amber",rewrittenText:"A 12-million-year-old praying mantis perfectly preserved in amber."},{sourceText:"Nearly 400 Years old & Survived Hiroshima. Gifted To the US in 1976",rewrittenText:"This tree, nearly 400 years old, survived Hiroshima and was gifted to the US in 1976."},{sourceText:"Daguerreotype of a man wearing tinted glasses and holding a cat, c. 1850. These photos show the oldest generation of people to be photographed.",rewrittenText:"1850: A man with tinted glasses and a cat. One of the earliest generations photographed."},{sourceText:"In August 2023, archaeologists excavating the Templo Mayor in Mexico City uncovered an extraordinary Aztec stone chest. Inside were 15 anthropomorphic figurines.",rewrittenText:"August 2023: Archaeologists at Mexico City's Templo Mayor uncovered an Aztec chest with 15 figurines."},{sourceText:"What it would look like if Jupiter replaced our moon.",rewrittenText:"If Jupiter replaced our moon, this would be the view."}],rewriteMode:"automatic",autoRewriteOnImport:!0,autoGenerateVoiceover:!0,autoGenerateCaptions:!0,voiceoverSettings:{mode:"random-free"},sceneTiming:{targetDurationSeconds:5.5,minDurationSeconds:3.5,maxDurationSeconds:7.5,voiceoverPaddingSeconds:.35}};function i(e){return e?e.replace(/^Post by u\/[^:]+:\s*/i,"").replace(/\[(.*?)\]\((.*?)\)/g,"$1").replace(/^ð¥+\s*/u,"").replace(/\s*\(\d{3,5}x\d{3,5}\)\s*$/i,"").replace(/\s+/g," ").trim():""}function s(e){return{...n,...e,voiceoverSettings:{...n.voiceoverSettings,...e?.voiceoverSettings??{}},sceneTiming:{...n.sceneTiming,...e?.sceneTiming??{}}}}function c(e){if(e.existingScript)return{...e.existingScript,sourceText:i(e.existingScript.sourceText),rewrittenText:i(e.existingScript.rewrittenText),voiceoverText:i(e.existingScript.voiceoverText),captionText:i(e.existingScript.captionText),updatedAt:e.existingScript.updatedAt??Date.now()};let t=s(e.templateSettings),r=i(e.sourceText)||i(e.title),o=t.autoRewriteOnImport?function(e){let t=i(e);if(!t)return"";let r=t.split(/(?<=[.!?])\s+/)[0]?.trim()||t,o=r.split(/\s+/).filter(
1Boolean);if(o.length>16)return/[.!?]$/.test(r)?r:`${r}.`;let a=o.slice(0,16).join(" ").trim();return a?/[.!?]$/.test(a)?a:`${a}.`:""}(r):"",a=o||r;return{sourceText:r,rewrittenText:o,voiceoverText:a,captionText:a,status:o?"drafted":"source",updatedAt:Date.now()}}function l(e){var t;let r,a,n,i,l,d,u,p,g="video"===e.mediaType,f=s(e.templateSettings),m=g?Math.max(e.mediaDuration||f.sceneTiming.targetDurationSeconds,1):f.sceneTiming.targetDurationSeconds,h=(t=e.sequenceIndex,r=Math.max(m||5.5,1),a=t%4,i=Math.min(1.18,(n=1.04+t%3*.01)+.08),l=0,d=0,u=0,p=0,0===a?(l=-.08,d=.08):1===a?(u=.07,p=-.07):2===a?(l=.06,d=-.04,u=-.04,p=.04):(l=-.05,d=.05,u=-.03,p=.05),{transform:{userZoom:n,panX:l,panY:u,rotation:0},automation:{userZoom:{propertyId:"userZoom",interpolation:"linear",keyframes:[{id:`kf-zoom-start-${t}`,time:0,value:n},{id:`kf-zoom-end-${t}`,time:r,value:i}]},panX:{propertyId:"panX",interpolation:"linear",keyframes:[{id:`kf-panx-start-${t}`,time:0,value:l},{id:`kf-panx-end-${t}`,time:r,value:d}]},panY:{propertyId:"panY",interpolation:"linear",keyframes:[{id:`kf-pany-start-${t}`,time:0,value:u},{id:`kf-pany-end-${t}`,time:r,value:p}]}}}),y=c({title:e.title,sourceText:e.sourceText,templateSettings:f}),v=[{id:`interesting-compilation-blur-${e.sceneId}`,type:"CANVAS_BLUR",params:{amount:o.Hu},enabled:!0}];return{text:y.voiceoverText||y.rewrittenText||y.sourceText,script:y,transform:h.transform,automation:h.automation,effects:v,transition:{type:"CROSSFADE",duration:.35,enabled:!0},media:e.mediaType?g?{duration:m,trim:{start:0,end:m}}:{duration:m}:void 0}}},14648:(e,t,r)=>{r.d(t,{w:()=>c});var o=r(1934);let a="mediaBinArchive_";function n(e){return!!e.media&&!(!e.media.assetRef&&!e.media.storageKey&&!e.media.storedUrl&&(!e.media.originalUrl||e.media.originalUrl.startsWith("blob:"))&&(!e.media.url||e.media.url.startsWith("blob:")||e.media.url.startsWith("local://")))}function i(e){let t={id:e.id,url:e.url,text:e.text||"",source:e.source??{platform:"unknown"},createdAt:e.createdAt??Date.now()};if(e.media){let r=e.media.storedUrl||e.media.url||"",o=e.media.originalUrl||"",a=r.startsWith("blob:")?"":r,n=o&&!o.startsWith("blob:")?o:void 0,i=e.media.thumbnailUrl&&!e.media.thumbnailUrl.startsWith("blob:")?e.media.thumbnailUrl:void 0;t.media={type:e.media.type,url:a,thumbnailUrl:i,width:e.media.width,height:e.media.height,duration:e.media.duration,storageKey:e.media.storageKey,storedUrl:e.media.storedUrl,originalUrl:n,contentType:e.media.contentType,trim:e.media.trim,mediaAspectRatio:e.media.mediaAspectRatio,mediaOriginalWidth:e.media.mediaOriginalWidth,mediaOriginalHeight:e.media.mediaOriginalHeight,assetRef:e.media.assetRef}}return t}function s(e,t){let r=new Date().toISOString();try{let o=`${a}${e}`,n=t.map(i),s=JSON.stringify(n);console.log(`[MediaBinStore ${r}] Saving to localStorage:`,{key:o,sceneCount:t.length,sceneIds:t.map(e=>e.id),jsonLength:s.length}),localStorage.setItem(o,s),console.log(`[MediaBinStore ${r}] â
Saved successfully`)}catch(e){console.error(`[MediaBinStore ${r}] â Failed to save to localStorage:`,e)}}let c=(0,o.v)((e,t)=>({archivedByProject:{},activeProjectId:null,setActiveProject:r=>{if(void 0===t().archivedByProject[r]){let t=function(e){let t=new Date().toISOString();try{let r=`${a}${e}`,o=localStorage.getItem(r);if(console.log(`[MediaBinStore ${t}] Loading from localStorage:`,{key:r,found:o?"yes":"no",dataLength:o?.length||0}),o){let e=JSON.parse(o);if(Array.isArray(e)){let o=e.map(e=>i(e)).filter(n);return o.length!==e.length&&(localStorage.setItem(r,JSON.stringify(o)),console.log(`[MediaBinStore ${t}] ð§¹ Removed ${e.length-o.length} unrecoverable archived scenes`)),console.log(`[MediaBinStore ${t}] â
Loaded ${o.length} archived scenes:`,o.map(e=>e.id)),o}}}catch(e){console.error(`[MediaBinStore ${t}] â Failed to load from localStorage:`,e)}return[]}(r);e(e=>({activeProjectId:r,archivedByProject:{...e.archivedByProject,[r]:t}}))}else e({activeProjectId:r})},getArchivedScenes:e=>{let r=e??t().activeProjectId;return r&&t().archivedByProject[r]||[]},archiveScene:(r,o)=>{let a=t().activeProjectId;a?(t().archivedByProject[a]||[]).some(e=>e.id===r.id)||e(e=>{let t=e.archivedByProject[a]||[];if(t.some(e=>e.id===r.id))return e;let o=[...t,i(r)];return s(a,o),{archivedByProject:{...e.archivedByProject,[a]:o}}}
1):console.warn("[MediaBinStore] Cannot archive: no active project")},removeArchivedScene:r=>{let o=t().activeProjectId;o&&e(e=>{let t=(e.archivedByProject[o]||[]).filter(e=>e.id!==r);return s(o,t),{archivedByProject:{...e.archivedByProject,[o]:t}}})},clearProjectArchive:t=>{e(e=>(s(t,[]),{archivedByProject:{...e.archivedByProject,[t]:[]}}))},isArchived:e=>{let r=t().activeProjectId;return!!r&&(t().archivedByProject[r]||[]).some(t=>t.id===e)}}))},33616:(e,t,r)=>{let o;r.d(t,{vz:()=>eC,ProjectProvider:()=>eD,By:()=>ex});var a=r(95155),n=r(12115),i=r(73321),s=r(29822),c=r.n(s),l=r(54921),d=r(63557),u=r(99269),p=r(85331),g=r(43574),f=r(65706),m=r(60668),h=r(10615);let y="/api/v1/storage/",v="api/v1/storage/";function _(e){return e.startsWith("blob:")||e.startsWith("data:")||e.startsWith("localBlob://")}function S(e){try{return decodeURIComponent(e)}catch{return e}}function j(e){let t=e.split("?")[0].split("#")[0].replace(/^\/+/,"");return t?t.split("/").map(S).join("/"):null}function w(e){if(!e||"string"!=typeof e)return null;let t=e.trim();if(!t||_(t))return null;if(t.startsWith("r2://"))return j(t.slice(5));let r=t.indexOf(y);return -1!==r?j(t.slice(r+y.length)):t.startsWith(v)?j(t.slice(v.length)):null}function E(e){if(e&&"r2"===e.type){let t=[];return e.storageKey&&t.push(e.storageKey),e.thumbnailStorageKey&&t.push(e.thumbnailStorageKey),t}return[]}function P(e){let t=new Set,r=e=>{let r=function(e){if(!e||"string"!=typeof e)return null;let t=e.trim();return!t||_(t)?null:t.startsWith("r2://")||t.includes(y)||t.startsWith(v)?w(t):/^https?:\/\//i.test(t)?null:j(t)}(e);r&&t.add(r)},o=e=>{let r=w(e);r&&t.add(r)};for(let t of e.scenes||[]){let e=t.media;e&&(r(e.storageKey),E(e.assetRef).forEach(r),o(e.url),o(e.storedUrl),o(e.thumbnailUrl),o(e.originalUrl));let a=t.audio;a&&(r(a.storageKey),r(a.storage_key),E(a.assetRef).forEach(r),o(a.audio_url),o(a.persistentUrl))}for(let t of[...e.audio||[],...e.voiceovers||[]])r(t.storageKey),E(t.assetRef).forEach(r),o(t.url);return Array.from(t)}var k=r(92575);async function T(e){let t=Array.from(new Set((e||[]).filter(e=>"string"==typeof e&&e.trim())));return 0===t.length?{success:!0,data:{requested:0,deleted:0,skipped:0,protected:0,failed:0,deleted_keys:[],skipped_keys:[],protected_keys:[],failed_keys:[]}}:(0,k.fetchAPI)("/storage/batch-delete",{method:"POST",body:JSON.stringify({keys:t})})}var b=r(96412),R=r(83421),A=r(56511),I=r(82571),O=r(74640),$=r(46699);let C=["auto-shorts-projects-list","auto-shorts-last-created-project-id"];function D(){let e=0;try{let t=[];for(let e=0;e<window.localStorage.length;e++){let r=window.localStorage.key(e);r&&r.startsWith("auto-shorts-project-")&&t.push(r)}for(let e of C)null!==window.localStorage.getItem(e)&&t.push(e);for(let r of t)window.localStorage.removeItem(r),e++;e>0&&console.log(`[legacyProjectCacheCleanup] Removed ${e} retired project-cache localStorage entries.`)}catch{}return e}var x=r(41870);async function L(e){var t,r;await x.E.cloudProjectSaveOutbox.put({id:(t=e.ownerId,r=e.projectId,`${t}:${r}`),ownerId:e.ownerId,projectId:e.projectId,idempotencyKey:e.pendingSave.idempotencyKey,requestBody:e.pendingSave.requestBody,pendingProjectJson:JSON.stringify(e.pendingSave.project),latestProjectJson:e.latestProject?JSON.stringify(e.latestProject):void 0,updatedAt:Date.now()})}async function M(e,t){await x.E.cloudProjectSaveOutbox.delete(`${e}:${t}`)}async function U(e){await x.E.cloudProjectSaveOutbox.where("ownerId").equals(e).delete()}async function N(e){let t=await x.E.cloudProjectSaveOutbox.where("ownerId").equals(e).toArray(),r=[];for(let e of t)try{r.push(function(e){let t=JSON.parse(e.pendingProjectJson),r=e.latestProjectJson?JSON.parse(e.latestProjectJson):void 0;if(!t?.id||t.id!==e.projectId)throw Error("Cloud project save outbox record has an invalid project snapshot.");if(r&&r.id!==e.projectId)throw Error("Cloud project save outbox record has an invalid queued snapshot.");return{ownerId:e.ownerId,projectId:e.projectId,pendingSave:{project:t,idempotencyKey:e.idempotencyKey,requestBody:e.requestBody},latestProject:r}}(e))}catch{await x.E.cloudProjectSaveOutbox.delete(e.id)}return r}let B=[500,1500,3e3];function F(e){if(!e||"SESSION_EXPIRED"===e.error_code)return!1;if("PROJECT_SAVE_IN_PROGRESS"===e.error_code||"PROJECT_SAVE_CONFLICT"===e.error_code)return!0;let t=e.status_code;return 0===t||408===t||429===t||t>=500}async function G(e,t){let r=t?.delaysMs??B,o=t?.delay??(e=>new Promise(t=>setTimeout(t,e))),a=1,n=await e();for(;!n.success&&F(n.error)&&a<=r.length;){let i=r[a-1];t?.onRetry?.({attempt:a+1,delayMs:i,error:n.error}),await o(i),n=await e(),a+=1}return{response:n,attempts:a,confirmed:n.success,recovered:n.success&&a>1,transientFailure:!n.success&&F(n.error)}}let J=[15e3,3e4,6e4,12e4];class q{constructor(e=J){if(this.retryDelaysMs=e,this.projectStates=new Map,this.activeSaveChains=new Map,this.outboxWriteChains=new Map,this.restoredOutboxOwners=new Set,0===e.length)throw Error("CloudProjectSaveCoordinator requires at least one retry delay.")}state(e){let t=this.projectStates.get(e);if(t)return t;let r={retryRound:0};return this.projectStates.set(e,r),r}reserveSave(e){let t;if(!e)return{waitForTurn:Promise.resolve(),release:()=>void 0};let r=this.activeSaveChains.get(e)??Promise.resolve(),o=new Promise(e=>{t=e}),a=r.catch(()=>void 0).then(()=>o);this.activeSaveChains.set(e,a);let n=!1;return{waitForTurn:r.catch(()=>void 0),release:()=>{n||(n=!0,t(),this.activeSaveChains.get(e)===a&&this.activeSaveChains.delete(e))}}}async waitForSave(e){await this.activeSaveChains.get(e)?.catch(()=>void 0)}async serializeOutboxWrite(e,t){let r=(this.outboxWriteChains.get(e)??Promise.resolve()).catch(()=>void 0).then(t),o=r.then(()=>void 0,()=>void 0);this.outboxWriteChains.set(e,o);try{return await r}finally{this.outboxWriteChains.get(e)===o&&this.outboxWriteChains.delete(e)}}peekForcedRequest(e){return this.projectStates.get(e)?.forcedRequest}clearForcedRequest(e){let t=this.projectStates.get(e);t&&(t.forcedRequest=void 0)}peekBlockingRequest(e){let t=this.projectStates.get(e);return t?.pendingRetry??t?.activeRequest}peekOutstandingRetryRequest(e){let t=this.projectStates.get(e);return t?.pendingRetry??t?.forcedRequest}setActiveRequest(e,t){this.state(e).activeRequest=t}clearActiveRequest(e){let t=this.projectStates.get(e);t&&(t.activeRequest=void 0)}queueLatestProject(e,t){this.state(e).queuedLatestProject=t}peekQueuedLatestProject(e){return this.projectStates.get(e)?.queuedLatestProject}rememberLatestProject(e,t){this.state(e).latestProject=t}peekLatestProject(e){return this.projectStates.get(e)?.latestProject}forgetLatestProject(e){let t=this.projectStates.get(e);t&&(t.latestProject=void 0)}async scheduleRetry(e,t,r,o){let a=e.project.id;if(!a)return;let n=this.state(a);if(n.pendingRetry=e,await o.persistOutbox(e,n.queuedLatestProject),o.isPaused(a)||null!=n.retryTimer)return;let i=this.retryDelaysMs[Math.min(n.retryRound,this.retryDelaysMs.length-1)];n.retryRound+=1,o.onScheduled({projectId:a,attempts:t,retryRound:n.retryRound,retryDelayMs:i,error:r}),n.retryTimer=setTimeout(()=>{if(n.retryTimer=void 0,o.isPaused(a)||!n.pendingRetry)return;let e=n.pendingRetry;n.pendingRetry=void 0,n.forcedRequest=e,o.requestSave(e.project)},i)}cancelRetryTimer(e){let t=this.projectStates.get(e);t?.retryTimer!=null&&(clearTimeout(t.retryTimer),t.retryTimer=void 0)}flushPendingRetries(e){for(let[t,r]of this.projectStates.entries()){if(!r.pendingRetry||e.isPau
1sed(t))continue;this.cancelRetryTimer(t);let o=r.pendingRetry;r.pendingRetry=void 0,r.forcedRequest=o,e.requestSave(o.project)}}restoreOutboxEntry(e){let t=this.state(e.projectId);t.pendingRetry=e.pendingSave,t.forcedRequest=e.pendingSave,e.latestProject&&(t.queuedLatestProject=e.latestProject,t.latestProject=e.latestProject)}hasRestoredOutboxOwner(e){return this.restoredOutboxOwners.has(e)}markOutboxOwnerRestored(e){this.restoredOutboxOwners.add(e)}forgetOutboxOwner(e){this.restoredOutboxOwners.delete(e)}clearRetry(e){let t=this.projectStates.get(e);if(!t)return;this.cancelRetryTimer(e);let r=t.pendingRetry?.project.user_id??t.forcedRequest?.project.user_id;return t.retryRound=0,t.pendingRetry=void 0,t.activeRequest=void 0,t.queuedLatestProject=void 0,t.forcedRequest=void 0,r}hasPendingWork(){if(this.activeSaveChains.size>0)return!0;for(let e of this.projectStates.values())if(e.pendingRetry||e.queuedLatestProject)return!0;return!1}clearAllRetryState(){for(let e of this.projectStates.values())null!=e.retryTimer&&clearTimeout(e.retryTimer),e.retryTimer=void 0,e.retryRound=0,e.pendingRetry=void 0,e.queuedLatestProject=void 0,e.latestProject=void 0,e.forcedRequest=void 0}dispose(){for(let e of this.projectStates.values())null!=e.retryTimer&&clearTimeout(e.retryTimer),e.retryTimer=void 0,e.pendingRetry=void 0,e.activeRequest=void 0,e.queuedLatestProject=void 0,e.latestProject=void 0,e.forcedRequest=void 0}}function W(e){if(!e.success)return null;let t=e.data;return t&&"object"==typeof t&&"success"in t&&"data"in t?t.data:t??null}async function K(e,t){let r=0;for(;;){r+=1;let o=await (0,d.fetchAPI)(e,t);if(o.success||r>=3||!function(e){if(!e||"SESSION_EXPIRED"===e.error_code)return!1;let t=e.status_code;return 0===t||408===t||t>=500}(o.error))return{response:o,attempts:r};let a=500*Math.pow(2,r-1);await new Promise(e=>setTimeout(e,a))}}function z(){return"u"<typeof navigator||"boolean"!=typeof navigator.onLine?null:navigator.onLine}function V(e,t){return{http_status:e?.status_code??null,error_code:e?.error_code??null,error_message:e?.message?String(e.message).slice(0,240):null,attempts:t,network_online:z()}}function H(e,t){return{http_status:null,error_code:e instanceof Error?e.name:"UnknownError",error_message:e instanceof Error?e.message.slice(0,240):String(e),attempts:t,network_online:z()}}function Y(e){return e?401===e.status_code||"SESSION_EXPIRED"===e.error_code?"session_expired":0===e.status_code?"network_error":408===e.status_code?"timeout":e.status_code>=500?"server_error":"unexpected_response":"unexpected_response"}function X(e){if("string"!=typeof e)return null;let t=e.trim();return t.length>0?t:null}function Z(e){let t=X(e.user_id);return null===t||"local-user"===t}function Q(e,t){return t&&e.user_id===t||Z(e)}function ee(e,t){return t&&Z(e)?{...e,user_id:t}:e}let et=new Set;class er extends Error{constructor(e,t,r,o){super(e),this.name="CloudProjectSaveError",this.apiError=t,this.attempts=r,this.pendingSave=o}}function eo(){let[e,t]=(0,n.useState)([]),[a,i]=(0,n.useState)(!0),[s,c]=(0,n.useState)(!1),[u,y]=(0,n.useState)(null),[v,_]=(0,n.useState)(null),[S,j]=(0,n.useState)(null),{data:w}=(0,l.wV)(),E=(0,n.useRef)(new Map),k=X(w?.user?.id),C=(0,n.useRef)(null),x=(0,n.useRef)(null),B=(0,n.useRef)(null),[J]=(0,n.useState)(()=>o??=new q),eo=(0,n.useCallback)(async(e,t)=>{let r=X(e.project.user_id),o=e.project.id;if(!r||!o)return!1;let a=`${r}:${o}`;return J.serializeOutboxWrite(a,async()=>{try{return await L({ownerId:r,projectId:o,pendingSave:e,latestProject:t}),!0}catch(e){return(0,b.trackEvent)("project_save_outbox_persist_failed",{project_id:o,error_name:e instanceof Error?e.name:"UnknownError",error_message:e instanceof Error?e.message.slice(0,240):String(e)}),!1}})},[J]),ea=(0,n.useCallback)(async(e,t,r)=>{let o=J.clearRetry(e),a=t??X(o);if(!r?.keepPersistentEntry&&a)try{await M(a,e)}catch(t){(0,b.trackEvent)("project_save_outbox_delete_failed",{project_id:e,error_name:t instanceof Error?t.name:"UnknownError",error_message:t instanceof Error?t.message.slice(0,240):String(t)})}},[J]),en=(0,n.useCallback)(async(e,t,r)=>{await J.scheduleRetry(e,t,r,{persistOutbox:eo,isPaused:O.FD,onScheduled:({projectId:e,attempts:t,retryRound:r,retryDelayMs:o,error:a})=>{(0,b.trackEvent)("project_save_retry_scheduled",{project_id:e,attempts:t,retry_round:r,retry_delay_ms:o,http_status:a?.status_code??null,error_code:a?.error_code??null,error_message:a?.message?.slice(0,240)??null,
1network_online:z()})},requestSave:e=>{B.current?.(e)}})},[J,eo]);(0,n.useEffect)(()=>{D()},[]);let ei=(0,n.useCallback)(async e=>{i(!0),_(null),j(null);let r=X(e)??k,o=null,a=!1;try{(0,b.trackEvent)("project_list_load_started",{hasUser:!!r});let e=e=>Q(e,r),n=[];try{let t=(await h.Kn.listProjects()).map(e=>h.Kn.getProject(e.id)),o=await Promise.all(t);n=(await Promise.all(o.map(async e=>{if(!e)return null;let t=ee(e,r);return t!==e&&await h.Kn.saveProject(t),t}))).filter(e=>null!==e).filter(e)}catch(e){a=!0,o="Projects saved in this browser could not be loaded. Try again without clearing your browser data.",console.warn("[useProjectPersistence] Failed to load local projects:",e),(0,b.trackEvent)("project_list_local_load_failed",{errorName:e instanceof Error?e.name:"UnknownError",errorMessage:e instanceof Error?e.message.slice(0,240):String(e)})}let i=[];if(r)try{let{response:t,attempts:r}=await K("/api/v1/projects",{method:"GET"}),a=t?.success===!1&&t?.error?.status_code===403,n=t?.success===!1&&(t?.error?.status_code===401||t?.error?.error_code==="SESSION_EXPIRED"),s=W(t);n?(console.warn("[useProjectPersistence] Session expired (401). User needs to sign in again."),(0,b.trackEvent)("project_list_cloud_load_failed",{reason:"session_expired",statusCode:t?.error?.status_code??401,...V(t?.error,r)}),_("SESSION_EXPIRED"),o="SESSION_EXPIRED",i=[]):Array.isArray(s)?(i=s.map(e=>{let t=(0,m.transformBackendProject)(e);return t.mode="cloud",t}).filter(e),(0,b.trackEvent)("project_list_cloud_load_succeeded",{count:i.length,attempts:r})):a?((0,b.trackEvent)("project_list_cloud_load_failed",{reason:"access_denied",statusCode:403,...V(t?.error,r)}),i=[]):(console.warn("[useProjectPersistence] Failed to fetch projects from backend or backend response was not successful.",t?.data?.message),(0,b.trackEvent)("project_list_cloud_load_failed",{reason:Y(t?.error),statusCode:t?.error?.status_code,errorMessage:t?.error?.message?.slice(0,240)??t?.data?.message?.slice(0,240),...V(t?.error,r)}),i=[],_("Failed to load projects from the server."),o="Failed to load projects from the server.")}catch(e){console.warn("[useProjectPersistence] Error fetching cloud projects:",e),(0,b.trackEvent)("project_list_cloud_load_failed",{reason:"exception",errorName:e instanceof Error?e.name:"UnknownError",errorMessage:e instanceof Error?e.message.slice(0,240):String(e),...H(e,null)}),i=[],_("Failed to load projects from the server."),o="Failed to load projects from the server."}let s=(0,O.iV)([...n,...i]);return s.sort((e,t)=>(t.updatedAt||0)-(e.updatedAt||0)),t(s),j(o?{ownerId:r,message:o}:null),console.log(`[useProjectPersistence] Total projects: ${s.length} (${n.length} local, ${i.length} cloud)`),(0,b.trackEvent)(a?"project_list_load_incomplete":"project_list_load_completed",{totalCount:s.length,localCount:n.length,cloudCount:i.length}),s}catch(e){return console.error("[useProjectPersistence] Error in loadProjectsList:",e),(0,b.trackEvent)("project_list_load_failed",{errorName:e instanceof Error?e.name:"UnknownError",errorMessage:e instanceof Error?e.message.slice(0,240):String(e),...H(e,null)}),_("Failed to load projects."),j({ownerId:r,message:"Failed to load projects."}),t([]),null}finally{i(!1)}},[k]),es=(0,n.useCallback)(async e=>{{let t=window.__PLAYWRIGHT_TEST_MODE__||"true"===localStorage.getItem("autoShorts_testMode"),r=e?.mode==="local";if(t&&!r)return void console.log("[useProjectPersistence] \uD83E\uDDEA TEST MODE: Blocking save to preserve project state");if(t&&r&&console.log("[useProjectPersistence] \uD83E\uDDEA TEST MODE: Allowing save for LOCAL project"),window.__AUTOSHORTS_UPLOADING__){if(C.current=e,null==x.current){let e=()=>{if(window.__AUTOSHORTS_UPLOADING__){x.current=setTimeout(e,500);return}x.current=null;let t=C.current;C.current=null,t&&B.current?.(t)};x.current=setTimeout(e,500)}console.log("[useProjectPersistence] â³ UPLOAD IN PROGRESS: deferring save; will retry when upload completes");return}}if(!e){console.warn("No project provided to save"),_("Attempted to save a null project.");return}if(e.id&&(0,O.FD)(e.id))return void console.log(`[useProjectPersistence] Ski
1pping stale save for deleted project ${e.id}`);if(e=(0,p.ne)(e),"local"===(e=(0,f.z)(e)).mode){c(!0),_(null);try{let r=ee(e,k);await h.Kn.saveProject(r);let o=Date.now();y(o),t(e=>{let t=e.findIndex(e=>e.id===r.id);if(-1===t)return[...e,r];{let o=[...e];return o[t]=r,o}}),console.log("[useProjectPersistence] Local project saved to IndexedDB:",r.id)}catch(e){console.error("[useProjectPersistence] Failed to save local project:",e),_("Failed to save local project.")}finally{c(!1)}return}let r=X(w?.user?.id),o=Z(e)?null:X(e.user_id),a=r??o;if(!a){console.error("[useProjectPersistence] No user session found. Cannot save cloud project with user_id."),_("User not authenticated. Cannot save cloud project.");return}r||console.warn("[useProjectPersistence] Session missing; saving cloud project with its own user_id and cached auth token.",{projectId:e.id});let n={...e,user_id:a,mode:"cloud"},i=n.id??null,s=i?J.peekForcedRequest(i):void 0,l=(s&&i?J.peekQueuedLatestProject(i)??J.peekLatestProject(i):null)??n;i&&J.rememberLatestProject(i,l),t(e=>{let t=e.findIndex(e=>e.id===l.id);if(-1===t)return[...e,l];let r=[...e];return r[t]=l,r}),c(!0),_(null);let u=i?J.peekBlockingRequest(i):void 0;if(i&&u&&!s){J.queueLatestProject(i,n),_(await eo(u,n)?"The server has not confirmed an earlier save yet. Later edits are queued safely.":"The newest edit is still open, but its recovery copy could not be updated. Keep this tab open and free some browser storage.");return}let g=J.reserveSave(i);await g.waitForTurn;let m=!1;try{if(n.id)try{let e=n.id,t=J.peekBlockingRequest(e);if(!s&&t){J.queueLatestProject(e,n);let r=await eo(t,n);_(r?"The server has not confirmed an earlier save yet. Later edits are queued safely.":"The newest edit is still open, but its recovery copy could not be updated. Keep this tab open and free some browser storage.");return}if((0,O.FD)(e))return;J.clearForcedRequest(e);let r=s??(()=>{let t,r,o=(0,A.$)(n);if(Array.isArray(o.scenes)&&0===o.scenes.length){let t=E.current.get(e),r=t?.project?.scenes??[],a=r.length,n=t?Date.now()-t.fetchedAt:1/0,i=new Set((0,I.no)()),s=a>0&&r.every(e=>e?.id&&i.has(e.id));a>0&&n<6e4&&!s&&(console.warn(`[useProjectPersistence] WIPE GUARD: refusing to save empty scenes for project ${e} (fetched ${Math.round(n/1e3)}s ago with ${a} scenes). Omitting scenes from this save.`),(0,b.trackEvent)("project_save_empty_scenes_blocked",{projectId:e,serverSceneCount:a,msSinceFetch:n}),delete o.scenes)}return{project:n,idempotencyKey:(r=(t="u">typeof globalThis?globalThis.crypto:void 0)&&"function"==typeof t.randomUUID?t.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,14)}`,`project-save:${e}:${r}`.slice(0,128)),requestBody:JSON.stringify(o)}})();if(!await eo(r,J.peekQueuedLatestProject(e)))throw new er("This save was not sent because the browser could not create its recovery copy. Free some browser storage and try again.",null,0,r);J.setActiveRequest(e,r);let o=await G(()=>(0,d.fetchAPI)(`/projects/${e}`,{method:"PATCH",headers:{"Idempotency-Key":r.idempotencyKey},body:r.requestBody}),{onRetry:({attempt:t,delayMs:r,error:o})=>{(0,b.trackEvent)("project_save_retry_attempted",{project_id:e,attempt:t,retry_delay_ms:r,http_status:o.status_code,error_code:o.error_code??null,error_message:o.message?.slice(0,240)??null,network_online:z()})}}),i=W(o.response);if(!o.response.success||!i){J.clearActiveRequest(e),console.error("[useProjectPersistence] Backend PATCH failed:",o.response.error);let t=new er(o.response.error?.message||"Backend update failed",o.response.error??null,o.attempts,r);throw F(t.apiError)?await en(t.pendingSave,t.attempts,t.apiError):(t.apiError?.status_code===404||(0,O.FD)(e))&&await ea(e,a),t}J.clearActiveRequest(e),(o.recovered||s)&&(0,b.trackEvent)("project_save_recovered",{project_id:e,attempts:o.attempts,recovery_source:s?"durable_outbox":"foreground_retry",network_online:z()}),m=!0;let c=J.peekQueuedLatestProject(e);await ea(e,a,{keepPersistentEntry:!!c}),_(null),c&&!(0,O.FD)(e)&&Promise.resolve().then(()=>B.current?.(c))}catch(a){n.id&&J.clearActiveRequest(n.id),console.error("[useProjectPersistence] Failed to sync project update with backend via PATCH:",a);let e=a instanceof er?a:null,t=!!e&&F(e.apiError),r=!!(s&&e?.apiError?.status_code===404),o={project_id:n.id,attempts:e?.attempts??1,transient:t,http_status:e?.apiError?.status_code??null,error_code:e?.apiError?.error_code??null,error_message:(e?.message??String(a)).slice(0,240),network_online:z()};r?((0,b.trackEvent)("project_save_outbox_discarded",{...o,reason:"resource_not_found"}),_(null)):((0,b.trackEvent)("project_save_failed",o),_(t?"The server has not confirmed this save yet. Retrying automatically.":e?.message||"Failed to save project to the server."))}else console.warn(`[useProjectPersistence] Project ID missing for project "${n.title}", skipping backend PATCH sync.`);m&&y(Date.now())}finally{g.release(),J.hasPendingWork()||c(!1)}},[ea,J,k,eo,en,w?.user?.id]);(0,n.useEffect)(()=>{B.current=es},[es]),(0,n.useEffect)(()=>
1{if(!k||J.hasRestoredOutboxOwner(k))return;let e=!1,t=async()=>{if(!J.hasRestoredOutboxOwner(k)&&!et.has(k)){et.add(k);try{let t=await N(k);for(let r of(J.markOutboxOwnerRestored(k),t)){if(e)break;let{projectId:t,pendingSave:o}=r;if((0,O.FD)(t)){await M(k,t);continue}J.restoreOutboxEntry(r),c(!0),_("Restoring an unconfirmed cloud save safely."),await B.current?.(o.project)}}catch(e){(0,b.trackEvent)("project_save_outbox_restore_failed",{error_name:e instanceof Error?e.name:"UnknownError",error_message:e instanceof Error?e.message.slice(0,240):String(e)})}finally{et.delete(k)}}},r=()=>{"visible"===document.visibilityState&&t()};return window.addEventListener("online",t),window.addEventListener("focus",t),document.addEventListener("visibilitychange",r),t(),()=>{e=!0,window.removeEventListener("online",t),window.removeEventListener("focus",t),document.removeEventListener("visibilitychange",r)}},[J,k]),(0,n.useEffect)(()=>{let e=()=>{J.flushPendingRetries({isPaused:O.FD,requestSave:e=>{B.current?.(e)}})},t=()=>{"visible"===document.visibilityState&&e()};return window.addEventListener("online",e),window.addEventListener("focus",e),document.addEventListener("visibilitychange",t),()=>{window.removeEventListener("online",e),window.removeEventListener("focus",e),document.removeEventListener("visibilitychange",t)}},[J]),(0,n.useEffect)(()=>()=>{null!=x.current&&(clearTimeout(x.current),x.current=null)},[J,!0]);let ec=(0,n.useCallback)(async e=>{(0,$.bE)(e),_(null);try{if(await h.Kn.projectExists(e)){console.log(`[useProjectPersistence] Loading local project: ${e}`);let t=await h.Kn.getProject(e);if(t){if(!Q(t,k)){let t=k??"guest";return console.warn(`[useProjectPersistence] Access denied to local project ${e} for user scope '${t}'.`),_(`Access denied. Local project ${e} does not belong to the current user.`),null}console.log("[useProjectPersistence] Rehydrating local project media...");let{project:r,scenesNeedingPermission:o}=await (0,h.ZS)(t),a=ee(r,k);return a!==r&&await h.Kn.saveProject(a),o.length>0&&console.log(`[useProjectPersistence] ${o.length} scenes need permission restoration`),(0,g.Gl)((0,f.z)(a))}console.warn(`[useProjectPersistence] Local project ${e} exists but failed to load`)}}catch(e){console.warn("[useProjectPersistence] Error checking local project:",e)}if(!k)return console.warn(`[useProjectPersistence] loadProject: No current user session. Cannot load cloud project ${e} securely.`),(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"missing_user_session",...V(null,null)}),_("User not authenticated. Cannot load cloud project."),null;if(!(0,R.Ak)(e))return(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"local_only_id_not_found",...V(null,null)}),_("Project not found"),null;try{let t=Date.now(),o=E.current.get(e);if(o&&t-o.fetchedAt<3e4&&o.project.user_id===k){let e=JSON.parse(JSON.stringify(o.project));return e.mode=e.mode||"cloud",e}try{let{response:t,attempts:o}=await K(`/projects/${e}`,{method:"GET"});if(!t.success){let r=t.error;if(r?.status_code===403)return console.warn(`[useProjectPersistence] loadProject: Access denied to project ${e} for user ${k}.`),(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"access_denied",statusCode:403,errorMessage:r.message?.slice(0,240),...V(r,o)}),_(`Access denied. Project ${e} does not belong to the current user.`),null;if(r?.status_code===404)return console.warn(`[useProjectPersistence] loadProject: Project ${e} is unavailable to the current account.`),(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"not_found",classification:"missing_or_inaccessible",statusCode:404,errorMessage:r.message?.slice(0,240),...V(r,o)}),(0,$.JG)(e),_("Project unavailable"),null;{let t=r?.message||`Failed to load project ${e}`;return console.error("[useProjectPersistence] loadProject: API error:",r),(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:Y(r),statusCode:r?.status_code,errorCode:r?.error_code,errorMessage:t.slice(0,240),...V(r,o)}),_(t),null}}let a=t.data,n=a?.data??a;if(!n)return(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"empty_response",...V(null,o)}),_(`Project ${e} not found.`),null;{let{staleScenes:t}
1=function(e,t=Date.now()){let r=Array.isArray(e?.scenes)?e.scenes:[],o=[],a=[];for(let e of r){let r="string"==typeof e?.id&&e.id?e.id:"string"==typeof e?._id&&e._id?e._id:null;if(r&&("uploading"===e.status||e.media?.status==="uploading")){let o=function(e){let t=e.createdAt??e.created_at;if("number"==typeof t&&Number.isFinite(t))return t;if("string"==typeof t&&t){let e=Date.parse(/(?:Z|[+-]\d{2}:?\d{2})$/i.test(t)?t:`${t}Z`);return Number.isNaN(e)?null:e}return null}(e);if(null!==o){let n=t-o;if(n>18e5){a.push({id:r,ageMs:n,storageKey:function(e){let t=e.media?.storage_key??e.media?.storageKey??e.storage_key;return"string"==typeof t&&t?t:null}(e)});continue}}}o.push(e)}return{keptScenes:o,staleScenes:a}}(n);if(t.length>0){let o=new Set;try{let{getCachedMediaBlob:e}=await r.e(6886).then(r.bind(r,94505)),a=await Promise.all(t.map(async t=>t.storageKey&&await e(t.storageKey)?t.id:null));o=new Set(a.filter(e=>!!e))}catch{}o.size>0&&(0,b.trackEvent)("media_import_stale_scene_spared_resumable",{projectId:e,scene_count:o.size});let a=t.filter(e=>!o.has(e.id));if(a.length>0){let t=new Set(a.map(e=>e.id)),o=Array.isArray(n.scenes)?n.scenes:[];n.scenes=o.filter(e=>{let r="string"==typeof e?.id?e.id:"string"==typeof e?._id?e._id:null;return!r||!t.has(r)}),(0,b.trackEvent)("media_import_stale_scene_removed",{projectId:e,scene_count:a.length,oldest_age_ms:Math.max(...a.map(e=>e.ageMs))}),r.e(2304).then(r.bind(r,12304)).then(({deleteScene:t})=>Promise.allSettled(a.map(r=>t(e,r.id)))).catch(()=>{}),r.e(6609).then(r.bind(r,66609)).then(({toast:e})=>e.warning(1===a.length?"An unfinished upload was removed":`${a.length} unfinished uploads were removed`,{description:"The file never finished uploading (interrupted connection or closed tab). Import it again to use it.",duration:1e4})).catch(()=>{})}}let a=(0,g.Gl)((0,f.z)((0,m.transformBackendProject)(n)));if(a.mode="cloud",a.user_id!==k)return console.warn(`[useProjectPersistence] loadProject: API returned project ${e} but user_id (${a.user_id}) does NOT match current session user_id (${k}). Access denied.`),_(`Access denied. Project ${e} does not belong to the current user.`),(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"ownership_mismatch",...V(null,o)}),null;return E.current.set(e,{fetchedAt:Date.now(),project:JSON.parse(JSON.stringify(a))}),(0,b.trackEvent)("project_load_backend_succeeded",{projectId:e,sceneCount:a.scenes?.length??0,attempts:o}),a}}catch(t){return console.error(`[useProjectPersistence] loadProject: API error for project ${e}:`,t),(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"network_or_exception",errorName:t instanceof Error?t.name:"UnknownError",errorMessage:t instanceof Error?t.message.slice(0,240):String(t),...H(t,null)}),_(`Failed to load project ${e}: Network error`),null}}catch(t){return console.error(`Failed to load project ${e}:`,t),(0,b.trackEvent)("project_load_backend_failed",{projectId:e,reason:"exception",errorName:t instanceof Error?t.name:"UnknownError",errorMessage:t instanceof Error?t.message.slice(0,240):String(t),...H(t,null)}),_(t instanceof Error?t.message:String(t)),null}},[k]),el=(0,n.useCallback)(async e=>{_(null);try{if(await h.Kn.projectExists(e)){let o=await h.Kn.getProject(e);if(o&&!Q(o,k)){let t=k??"guest",r=`Access denied. Local project ${e} does not belong to user scope '${t}'.`;console.warn(`[useProjectPersistence] ${r}`),_(r);return}console.log(`[useProjectPersistence] Deleting local project: ${e}`),(0,O.UO)(e);try{if(o){let t=P(o);if(t.length>0){let r=await T(t);r.success?console.log(`[useProjectPersistence] R2 cleanup for local project ${e}:`,r.data):console.warn(`[useProjectPersistence] R2 cleanup failed for local project ${e} (continuing with local delete):`,r.error)}}}catch(t){console.warn(`[useProjectPersistence] R2 cleanup threw for local project ${e} (continuing with local delete):`,t)}await (0,h.JJ)(e),console.log(`[useProjectPersistence] Deleted file handles for project: ${e}`),await (0,h.uU)(e),r.e(6886).then(r.bind(r,94505)).then(({evictCachedMediaForProject:t})=>t(e)).catch(()=>{}),await h.Kn.deleteProject(e),t(t=>t.filter(t=>t.id!==e)),console.log(`[useProjectPersistence] Local project ${e} deleted successfully`);return}}catch(e){console.warn("[useProjectPersistence] Error checking/deleting local project:",e)}try{(0,O.UO)(e),J.cancelRetryTimer(e),await J.waitForSave(e),J.cancelRetryTimer(e);let o=await (0,d.fetchAPI)(`/projects/${e}`,{method:"DELETE"});
1if(!o.success){let t=o.error?.status_code;if(404===t)console.log(`Project ${e} already deleted (404), treating as success.`);else{let t=`Failed to delete project ${e} from backend`;if(o.error&&(t=o.error.message||t,o.error.status_code&&(t=`${t} (Status: ${o.error.status_code})`),o.error.error_code&&(t=`${t} (Code: ${o.error.error_code})`),o.error.details)){let e="";e="string"==typeof o.error.details?o.error.details:"object"==typeof o.error.details&&null!==o.error.details?o.error.details.message||JSON.stringify(o.error.details):String(o.error.details),t=`${t}. Details: ${e}`}throw console.error(t),Error(t)}}await ea(e,k),J.forgetLatestProject(e),E.current.delete(e),t(t=>t.filter(t=>t.id!==e)),r.e(6886).then(r.bind(r,94505)).then(({evictCachedMediaForProject:t})=>t(e)).catch(()=>{}),console.log(`Project ${e} fully deleted via hook.`)}catch(o){(0,O.iy)(e);let t=J.peekOutstandingRetryRequest(e);t&&await en(t,0,null);let r=o instanceof Error?o.message:String(o);throw console.error(`Failed to delete project ${e}: ${r}`),_(`Failed to delete project ${e}: ${r}`),o}},[ea,J,k,en]),ed=(0,n.useCallback)(async()=>{_(null);try{let e=await h.Kn.listProjects(),t=(await Promise.all(e.map(e=>h.Kn.getProject(e.id)))).filter(e=>null!==e&&Q(e,k));for(let e of t){try{let t=P(e);t.length>0&&await T(t)}catch(t){console.warn(`[useProjectPersistence] R2 cleanup threw for local project ${e.id} during delete-all (continuing):`,t)}await (0,h.JJ)(e.id),await (0,h.uU)(e.id),await h.Kn.deleteProject(e.id)}console.log(`[useProjectPersistence] Deleted ${t.length} local projects from IndexedDB for user scope '${k??"guest"}'`)}catch(e){console.warn("[useProjectPersistence] Error deleting local projects:",e)}try{let e=await (0,d.fetchAPI)("/api/v1/projects/all-for-user",{method:"DELETE"});if(!e.success){let t=e.error?.message||"Failed to delete all projects from backend (request unsuccessful).";throw console.error("[useProjectPersistence] deleteAllProjects backend error:",t,e.error),_(t),Error(t)}let o=e.data,a=o.data.deleted_count||0,n=o.data.failed_projects?.length||0;console.log(`[useProjectPersistence] deleteAllProjects backend call successful. Deleted: ${a}, Failed: ${n}`),n>0&&(console.warn("[useProjectPersistence] Some projects failed to delete on the backend:",o.data.failed_projects),_(`Backend deleted ${a} projects, but ${n} failed. Local data will be cleared.`)),0===n&&k&&(J.clearAllRetryState(),await U(k)),D(),r.e(6886).then(r.bind(r,94505)).then(({clearMediaCache:e})=>e()).catch(()=>{}),E.current.clear(),t(e=>e.filter(e=>"local"===e.mode&&!Q(e,k))),y(Date.now()),console.log("[useProjectPersistence] deleteAllProjects: Cleared in-memory projects list."),n>0&&!v?_("Some projects failed to delete on the server. Local data cleared."):0===n&&a>0&&_(null)}catch(t){console.error("[useProjectPersistence] Error in deleteAllProjects catch block:",t);let e=t instanceof Error?t.message:"An unknown error occurred during deleteAllProjects.";v||_(e)}},[J,k,v]),eu=(0,n.useCallback)(async e=>{try{let t=await h.Kn.getProject(e);if(t)return Q(t,k);if(!k||!(0,R.Ak)(e))return!1;let r=await (0,d.fetchAPI)(`/projects/${e}`,{method:"GET"});return r.success&&null!=W(r)}catch(t){return console.error(`Failed to check existence for project ${e}:`,t),!1}},[k]),ep=(0,n.useCallback)(async()=>{j(null),console.log("[useProjectPersistence] Clearing persisted user data.");try{D(),E.current.clear(),J.clearAllRetryState(),k&&J.forgetOutboxOwner(k),t([]),console.log("[useProjectPersistence] Cleared in-memory projects array via setProjects([]).")}catch(e){console.error("[useProjectPersistence] Error clearing persisted user data:",e)}},[J,k,t]);return{projects:e,isLoadingProjects:a,isSavingProject:s,lastSavedTimestamp:u,persistenceError:v,projectListError:S?.ownerId===k?S.message:null,loadProjectsList:ei,saveProject:es,loadProject:ec,deleteProject:el,deleteAllProjects:ed,projectExists:eu,clearPersistedUserData:ep}}var ea=r(14648),en=r(76496),ei=r(79884);function es(e,t){if(e)try{window.localStorage.setItem(`project_render_mode:${e}`,t)}catch(e){console.warn("[useProjectCore] Failed to persist default render mode:",e)}}let ec=new Map;function el(e,t){let r=e.error?.status_code||t?.error?.status_code,o=e.error?.message||t?.error?.message||t?.message;return 401===r?o||"Your session expired. Please sign in again, then retry creating the project.":o||"Failed to create project. Please try again."}var ed=r(57396),eu=r(79627),ep=r(1007),eg=r(67705),ef=r(44847);function em(){let e=new Map,t=!1;return{has(r){if(e.has(r))return e.get(r);let o=!1;if(!t)try{o="true"===window.sessionStorage.getItem(r)}catch{}return e.set(r,o),o},mark(t){e.set(t,!0);try{window.sessionStorage.setItem(t,"true")}catch{}},remove(t){e.set(t,!1);try{window.sessionStorage.removeItem(t)}catch{}},clear(){e.clear(),t=!0;try{let e=window.sessionStorage;
1for(let t of Object.keys(e))t.startsWith("auto-shorts-initialized-")&&e.removeItem(t)}catch{}}}}var eh=r(52481),ey=r(53029);let ev=!1,e_=0,eS=[],ej=0,ew=0,eE=0,eP=0,ek=0,eT="";function eb(e,t){if(!e.length)return null;let r=Math.max(0,Math.min(e.length-1,Math.round((e.length-1)*t)));return e[r]}function eR(e,t=2){let r=10**t;return Math.round(e*r)/r}function eA(e){if(!(eP>=10))try{fetch("http://127.0.0.1:1025/ingest/marketing-perf",{method:"POST",headers:{"Content-Type":"text/plain"},body:JSON.stringify(e),keepalive:!0}).then(()=>{eP=0}).catch(()=>{eP+=1})}catch{eP+=1}}function eI(e){if(e_>0){let t=e-e_;t>0&&t<1e4&&eS.length<1e3&&eS.push(t)}e_=e,requestAnimationFrame(eI)}let eO=(e,t,r,o="default",a)=>e?e.startsWith("http")||e.startsWith("/api/")?e:`/api/v1/storage/${e.split("/").map(e=>encodeURIComponent(e)).join("/")}`:"";function e$(e,t){switch(t.type){case"CREATE_PROJECT":{let r={id:(0,en.$C)(),title:t.payload.title,scenes:[],createdAt:Date.now(),updatedAt:Date.now(),lastModified:Date.now(),status:"draft",aspectRatio:"9:16",showLetterboxing:!1,user_id:"",masterPreviewSize:{width:960,height:540},use_webgl2:!0};return{...e,projects:[...e.projects,r],currentProject:r,error:null}}case"CREATE_PROJECT_SUCCESS":{let r=t.payload.project;if(e.projects.some(e=>e.id===r.id))return e;return{...e,projects:[r,...e.projects],error:null}}case"SET_ERROR":return{...e,error:t.payload.error};case"CLEAR_ERROR":return{...e,error:null};case"SET_LOADING":return{...e,isLoading:t.payload.isLoading};case"LOAD_PROJECTS":return{...e,projects:t.payload.projects,error:null};case"SET_SAVING":return{...e,isSaving:t.payload.isSaving};case"SET_LAST_SAVED":return{...e,lastSaved:t.payload.timestamp};case"LOAD_PROJECT_SUCCESS":case"DUPLICATE_PROJECT_SUCCESS":return{...e,isLoading:!1,error:null};case"DELETE_PROJECT":{let r=e.projects.filter(e=>e.id!==t.payload.projectId),o=e.currentProject?.id===t.payload.projectId;return{...e,projects:r,currentProject:o?null:e.currentProject,isLoading:!1,error:null}}case"CLEAR_ALL_PROJECTS":return{...e,projects:[],currentProject:null,isLoading:!1,error:null};case"SET_MODE":return{...e,mode:t.payload.mode};case"FORCE_UPDATE":return console.log("[ProjectReducer] Forcing update"),{...e};case"SET_SCENE_STORAGE_STATUS":{if(!e.currentProject)return e;let{sceneId:r,isStoringMedia:o,storageError:a}=t.payload,n=e.currentProject.scenes.map(e=>e.id===r?{...e,isStoringMedia:o,storageError:a,updatedAt:Date.now()}:e);return{...e,currentProject:{...e.currentProject,scenes:n,updatedAt:Date.now()}}}case"SET_SCENE_STORAGE_SUCCESS":{if(!e.currentProject)return e;let{sceneId:r,storageKey:o,thumbnailStorageKey:a,contentType:n,fileSize:i}=t.payload,s=e.currentProject.scenes.map(t=>{if(t.id===r){let s={...t.media||{type:"video",url:""},storageKey:o,storedUrl:eO(o,e.currentProject.id,r),thumbnailUrl:(a?eO(a,e.currentProject.id,r):void 0)||t.media?.thumbnailUrl,isStorageBacked:!0,contentType:n||t.media?.contentType,fileSize:i||t.media?.fileSize,storedAt:Date.now()};return{...t,media:s,isStoringMedia:!1,storageError:null,updatedAt:Date.now()}}return t});return{...e,currentProject:{...e.currentProject,scenes:s,updatedAt:Date.now()}}}case"RESET_USER_SESSION":return console.log("[ProjectReducer] Processing action: RESET_USER_SESSION"),{...en.ue};case"SET_PROJECTS":return console.log("[ProjectReducer] Processing action: SET_PROJECTS, Count:",t.payload.projects.length),{...e,projects:t.payload.projects,isLoading:!1,error:null};case"SET_SCENE_SCALE":if(!e.currentProject)return e;return{...e,currentProject:{...e.currentProject,sceneScale:t.payload.scale,updatedAt:Date.now()}};default:return console.warn(`[ProjectReducer] Unhandled action type: ${t.type}`),e}}let eC=(0,n.createContext)(void 0);function eD({children:e}){var t,o;let s,p,g,f,y,v,[_,S]=(0,n.useReducer)(e$,en.ue),j=(0,i.useRouter)(),w=(0,i.usePathname)(),E=(0,n.useRef)(w),{data:P,status:k}=(0,l.wV)(),T=(0,n.useMemo)(()=>P?.user?.id,[P]),{loadProjectsList:R,projectListError:A,saveProject:O,isSavingProject:$,deleteProject:C,deleteAllProjects:D,clearPersistedUserData:x}=eo(),L=(0,n.useRef)($);L.current=$;let{currentProject:M,createProject:U,setCurrentProject:N,loadProject:B,setProjectTitle:F,setProjectAspectRatio:G,updateCoreProjectState:J,projectId:q}
1=function(e,t,r){let[o,a]=(0,n.useState)(()=>t.currentProject),i=(0,n.useRef)(`useProjectCore-${Math.random().toString(36).substring(2,9)}`),s=(0,n.useRef)(0),{loadProject:c,saveProject:l}=eo(),u=(0,n.useCallback)(async r=>{let n=++s.current;i.current,(0,b.trackEvent)("project_load_started",{projectId:r,alreadyLoaded:o?.id===r}),t.isLoading||e({type:"SET_LOADING",payload:{isLoading:!0}});try{if(o&&o.id===r)return s.current===n&&e({type:"SET_LOADING",payload:{isLoading:!1}}),(0,b.trackEvent)("project_load_succeeded",{projectId:r,source:"memory",mode:o.mode,sceneCount:o.scenes?.length??0}),o;let t=await c(r);if(!t){if(s.current!==n)return null;return(0,b.trackEvent)("project_load_failed",{projectId:r,reason:"not_found_or_empty"}),e({type:"SET_ERROR",payload:{error:`Project ${r} not found or failed to load`}}),a(null),null}let i=JSON.parse(JSON.stringify(t));if(s.current!==n)return null;return(0,b.trackEvent)("project_load_succeeded",{projectId:r,source:"persistence",mode:i.mode,sceneCount:i.scenes?.length??0}),a(i),i}catch(t){if(s.current!==n)return null;return(0,b.trackEvent)("project_load_failed",{projectId:r,reason:"exception",errorName:t instanceof Error?t.name:"UnknownError",errorMessage:t instanceof Error?t.message.slice(0,240):String(t)}),e({type:"SET_ERROR",payload:{error:`Failed to load project ${r}`}}),a(null),null}finally{s.current===n&&e({type:"SET_LOADING",payload:{isLoading:!1}})}},[e,c,o,t.isLoading]),p=(0,n.useCallback)(e=>{i.current,e?u(e).catch(e=>{}):(s.current+=1,a(null))},[e,u]),g=(0,n.useCallback)(async(t,r,o="cloud")=>{let n=`[${i.current}][createProject]`;console.log(`${n} Called with title: '${t}', userId: '${r}', mode: '${o}'`),e({type:"SET_LOADING",payload:{isLoading:!0}}),(0,b.trackEvent)("project_create_started",{mode:o,titleLength:t.length});try{if("local"===o){let i=Date.now(),s={id:(0,en.$C)(),title:t,description:"",user_id:r||"local-user",scenes:[],audio:[],createdAt:i,updatedAt:i,lastModified:i,status:"draft",aspectRatio:"9:16",showLetterboxing:!0,mode:"local",mediaBinWidth:452},c=await h.Kn.createProject(s);return console.log(`${n} Local project created in IndexedDB: ${c.id}`),es(c.id,(0,ei.W)()),a(c),p(c.id),e({type:"CREATE_PROJECT_SUCCESS",payload:{project:c}}),(0,b.trackEvent)("project_create_succeeded",{projectId:c.id,mode:o}),c}let i=await (0,d.fetchAPI)("/api/v1/projects",{method:"POST",body:JSON.stringify({title:t,user_id:r,description:null,scenes:[]}),headers:{"Content-Type":"application/json"}});if(!i?.success)throw Error(el(i));let s=i?.data;if(console.log(`${n} Checking apiResponse.success:`,s?.success),console.log(`${n} Checking apiResponse.data.id:`,s?.data?.id),!s||!s.success||!s.data||!s.data.id)throw console.error(`${n} Project creation backend call did not indicate success or returned invalid data structure. Full raw response:`,JSON.stringify(i,null,2)),Error(el(i,s));let c=s.data,u=(0,m.transformBackendProject)(c);return u.mode="cloud",null==u.mediaBinWidth&&(u.mediaBinWidth=452),es(u.id,"webgpu"),await l(u),console.log(`${n} Called saveProject (to persistence - localStorage & PATCH) for project ID: ${u.id}`),a(u),p(u.id),console.log(`${n} Project creation process complete. Returning project ID: ${u.id}`),e({type:"CREATE_PROJECT_SUCCESS",payload:{project:u}}),(0,b.trackEvent)("project_create_succeeded",{projectId:u.id,mode:o}),u}catch(r){console.error(`${n} Error during project creation:`,r);let t="Failed to create project";throw r instanceof Error&&(t=r.message),(0,b.trackEvent)("project_create_failed",{mode:o,errorName:r instanceof Error?r.name:"UnknownError",errorMessage:t.slice(0,240)}),e({type:"SET_ERROR",payload:{error:t}}),Error(t)}finally{e({type:"SET_LOADING",payload:{isLoading:!1}})}},[l,e,p]),f=(0,n.useCallback)((e,t,r="cloud")=>{let o=`${t}|${r}|${e}`,a=ec.get(o);if(a)return console.log(`[${i.current}][createProject] Joining in-flight duplicate creation`),a;let n=g(e,t,r).finally(()=>{ec.delete(o)});return ec.set(o,n),n},[g]),y=(0,n.useCallback)(t=>{if(i.current,!o)return;let r={...o,title:t,updatedAt:Date.now()};a(r),l(r).catch(t=>{a(o),e({type:"SET_ERROR",payload:{error:"Failed to save title"}})})},[o,l,e]),v=(0,n.useCallback)(t=>{if(i.current,!o)return;let r={...o,aspectRatio:t,updatedAt:Date.now()};
1a(r),l(r).catch(t=>{a(o),e({type:"SET_ERROR",payload:{error:"Failed to save aspect ratio"}})})},[o,l,e]),_=(0,n.useCallback)(e=>{i.current,a(e)},[]);return{currentProject:o,projectId:o?.id,createProject:f,setCurrentProject:p,loadProject:u,setProjectTitle:y,setProjectAspectRatio:v,updateCoreProjectState:_}}(S,_,_.projects),W=(t={currentProject:M},s=(0,n.useRef)(t.currentProject),p=(0,n.useRef)(`useGetLatestProjectState-${Math.random().toString(36).substring(2,9)}`).current,(0,n.useEffect)(()=>{let e=s.current?.scenes?.map(e=>e.id)||[],r=t.currentProject?.scenes?.map(e=>e.id)||[];JSON.stringify(e)!==JSON.stringify(r)||(s.current?.id,t.currentProject?.id),s.current=t.currentProject},[t.currentProject,p]),(0,n.useCallback)(()=>s.current,[p])),K=(0,n.useRef)(null),z=(0,n.useRef)(null),[V]=(0,n.useState)(em);(0,n.useEffect)(()=>{if(!ev&&(window.__MARKETING_PERF_STREAM__||window.location.hash.includes("marketingPerf"))){ev=!0,eT=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`,ey.fu.enabled=!0,(0,ey.MT)();try{new PerformanceObserver(e=>{for(let t of e.getEntries())ej+=1,ew+=t.duration,t.duration>eE&&(eE=t.duration)}).observe({entryTypes:["longtask"]})}catch{}requestAnimationFrame(eI),window.setInterval(()=>{let e,t,r,o,a,n,i,s,c;return eA((e=eS,eS=[],t=[...e].sort((e,t)=>e-t),r=e.filter(e=>e>33.4).length,o=e.filter(e=>e>100).length,a={calls:ey.fu.calls,totalMs:eR(ey.fu.totalMs),maxMs:eR(ey.fu.maxMs,3),maxKeyframes:ey.fu.maxKeyframes,normalizeMisses:ey.fu.normalizeMisses},(0,ey.MT)(),n={count:ej,totalMs:eR(ew),maxMs:eR(eE)},ej=0,ew=0,eE=0,i=performance.memory,s=(()=>{try{return window.masterVC?.state??null}catch{return null}})(),ek+=1,c={kind:"perf-summary",session:eT,seq:ek,at:new Date().toISOString(),visibility:"u">typeof document?document.visibilityState:null,engineState:s,frames:{count:e.length,p50:eR(eb(t,.5)??0),p95:eR(eb(t,.95)??0),max:eR(eb(t,1)??0),over33:r,over100:o},longTasks:n,curves:a,heapMB:i?eR(i.usedJSHeapSize/1048576,1):null,engine:function(){try{let e=window.__WEBGPU_OUTPUT_STATS__;if(!e||"object"!=typeof e)return null;let t={},r=0;for(let o of Object.keys(e)){if(r>=16)break;let a=e[o];"number"==typeof a&&Number.isFinite(a)&&/fps|frame|draw|decoder|seek|black|stall|present/i.test(o)&&(t[o]=eR(a,2),r+=1)}return r>0?t:null}catch{return null}}()},ek%5==1&&(c.project=function(){try{let e=window.masterVC,t=e?.scenes;if(!Array.isArray(t))return null;let r=0,o=0,a=0,n=0,i=0,s=0;for(let e of t){e?.kind==="video"&&(i+=1),e?.kind==="image"&&(s+=1),a+=Array.isArray(e?.effects)?e.effects.length:0,e?.transition&&(n+=1);let t=e?.automation||e?.sceneData?.scene?.automation;if(t&&"object"==typeof t){let e=0;for(let r of Object.keys(t)){let o=t[r]?.keyframes;Array.isArray(o)&&(e+=o.length)}r+=e,e>o&&(o=e)}}return{scenes:t.length,videoScenes:i,imageScenes:s,keyframesTotal:r,keyframesMaxPerScene:o,effectsTotal:a,transitionsTotal:n,durationSec:"number"==typeof e?.duration?eR(e.duration,1):null}}catch{return null}}()),c))},2e3),eA({kind:"perf-stream-start",session:eT,at:new Date().toISOString(),url:window.location.pathname,ua:navigator.userAgent})}},[]);let H=(0,n.useRef)({}),[Y,X]=(0,n.useState)(0),Z=(0,n.useRef)({}),Q=(0,n.useRef)({}),ee=(0,n.useRef)({});(0,n.useEffect)(()=>{(async()=>{if(console.log("[ProjectProvider] Auth/User Effect Triggered.",{localSessionStatus:k,localCurrentUserId:T,prevSessionStatus:z.current,prevUserId:K.current}),"loading"===k)return console.log("[ProjectProvider] Session status is loading, skipping effect.");let e=T?`auto-shorts-initialized-${T}`:"auto-shorts-initialized-guest",t=V.has(e);if("authenticated"===k&&T&&null!==K.current&&T!==K.current){console.log(`[ProjectProvider] New user detected. Old: ${K.current}, New: ${T}. Clearing data and loading new projects.`),K.current&&V.remove(`auto-shorts-initialized-${K.current}`),S({type:"SET_LOADING",payload:{isLoading:!0}});try{await x(),S({type:"RESET_USER_SESSION"});let t=await R(T);S({type:"LOAD_PROJECTS",payload:{projects:t||[]}}),V.mark(e)}catch(e){if((0,ef.r$)(e,"project-list-account-switch"))return;console.error(`[ProjectProvider] Error during new user login/data load for ${T}:`,e),S({type:"SET_ERROR",payload:{error:"Failed to load projects for new user."}})}finally{S({type:"SET_LOADING",payload:{isLoading:!1}})}}else if("unauthenticated"===k&&"authenticated"===z.current){console.log("[ProjectProvider] User logged out. Clearing user data."),V.clear(),S({type:"SET_LOADING",payload:{isLoading:!0}});try{await x(),S({type:"RESET_USER_SESSION"}),S({type:"LOAD_PROJECTS",payload:{projects:[]}})}catch(e){console.error("[ProjectProvider] Error during logout/data clear:",e),S({type:"SET_ERROR",payload:{error:"Failed to clear data on logout."}})}finally{S({type:"SET_LOADING",payload:{isLoading:!1}})}}else if("unauthenticated"!==k||t){if("authenticated"===k&&T&&!t){console.log(`[ProjectProvider] Initial authenticated session for user ${T}. Loading projects.`),S({type:"SET_LOADING",payload:{isLoading:!0}});try{S({type:"RESET_USER_SESSION"});let t=await R(T);S({type:"LOAD_PROJECTS",payload:{projects:t||[]}}),V.mark(e)}catch(e){if((0,ef.r$)(e,"project-list-authenticated-load"))return;console.error(`[ProjectProvider] Error during initial authenticated load for ${T}:`,e),S({type:"SET_ERROR",payload:{error:"Failed to load projects for authenticated user."}})}finally{S({type:"SET_LOADING",payload:{isLoading:!1}})}}else if(console.log("[ProjectProvider] Session already initialized, skipping RESET_USER_SESSION. Just ensuring projects are loaded."),"authenticated"===k&&T&&0===_.projects.length){console.log("[ProjectProvider] No projects in state, loading them without reset."),S({type:"SET_LOADING",payload:{isLoading:!0}});try{let e=await R(T);S({type:"LOAD_PROJECTS",payload:{projects:e||[]}})}catch(e){if((0,ef.r$)(e,"project-list-refresh"))return;console.error("[ProjectProvider] Error loading projects:",e),S({type:"SET_ERROR",payload:{error:"Failed to load projects."}})}finally{S({type:"SET_LOADING",payload:{isLoading:!1}})}}}else{console.log("[ProjectProvider] Initial unauthenticated session. Loading projects."),S({type:"SET_LOADING",payload:{isLoading:!0}});try{S({type:"RESET_USER_SESSION"});let t=await R(T);S({type:"LOAD_PROJECTS",payload:{projects:t||[]}}),V.mark(e)}catch(e){if((0,ef.r$)(e,"project-list-guest-load"))return;console.error("[ProjectProvider] Error during initial unauthenticated load:",e),S({type:"SET_ERROR",payload:{error:"Failed to load projects for unauthenticated session."}})}finally{S({type:"SET_LOADING",payload:{isLoading:!1}})}}K.current=T,z.current=k})()},[k,T,R,x,V]);let et=(0,n.useCallback)(e=>{let t=eh.zC.getState().blocks,r=new Set((e.scenes??[]).map(e=>e.id)),o=t.filter(e=>"caption"===e.type&&(!e.sceneId||r.has(e.sceneId))).map(e=>({id:e.id,sourceCaptionId:e.sourceCaptionId,start:e.start,duration:e.duration,inOffset:e.inOffset,outOffset:e.outOffset,fullDuration:e.fullDuration,trackId:e.trackId,sceneId:e.sceneId,captionText:e.captionText,captionBox:e.captionBox,captionStyle:e.captionStyle,captionHighlightEnabled:e.captionHighlightEnabled,captionHighlightStyle:e.captionHighlightStyle,captionWords:e.captionWords,captionCues:e.captionCues,captionDisplayMode:e.captionDisplayMode,captionDisplayWindowSize:e.captionDisplayWindowSize,captionPunctuationMode:e.captionPunctuationMode,alignmentProvider:e.alignmentProvider,source:e.source??"auto"}
1)),a=window.__AUTOSHORTS_MARKERS_HYDRATED_PROJECT__===e.id?eh.zC.getState().markers:e.timelineMarkers;return{...e,captionBlocks:o,...void 0!==a?{timelineMarkers:a}:{}}},[]),er=(0,n.useCallback)(async(e,t)=>{let r="[ProjectProvider][updateSceneMedia]",o=W();if(!o){console.error(`${r} Error: No current project found in core state.`),S({type:"SET_ERROR",payload:{error:"No active project to update media for."}});return}let a=o.scenes.findIndex(t=>t.id===e);if(-1===a){console.error(`${r} Error: Scene ID ${e} not found in project ${o.id}.`),S({type:"SET_ERROR",payload:{error:`Scene not found for media update: ${e}`}});return}let n=[...o.scenes],i=n[a],s={...i.media||{},...t};n[a]={...i,media:s,updatedAt:Date.now()};let c={...o,scenes:n,updatedAt:Date.now()};try{J(c),await O(et(c)),console.log(`${r} Successfully saved updates for scene ${e}`)}catch(e){console.error(`${r} Failed to save scene media:`,e),S({type:"SET_ERROR",payload:{error:"Failed to save media change"}}),J(o)}},[S,O,J,W,et]),e_=(0,n.useCallback)(async(e,t)=>{let r="[ProjectProvider][updateScenePosition]",o=W();if(!o)return void console.error(`${r} Error: No current project found in core state.`);let a=o.scenes.findIndex(t=>t.id===e);if(-1===a)return void console.error(`${r} Error: Scene ID ${e} not found.`);let n=[...o.scenes],i=n[a];n[a]={...i,...void 0!==t.timelineStart&&{timelineStart:t.timelineStart},...void 0!==t.trackId&&{trackId:t.trackId},updatedAt:Date.now()};let s={...o,scenes:n,updatedAt:Date.now()};try{J(s),await O(et(s)),console.log(`${r} Successfully updated position for scene ${e}:`,t)}catch(e){console.error(`${r} Failed to save scene position:`,e),S({type:"SET_ERROR",payload:{error:"Failed to save position change"}}),J(o)}},[S,O,J,W,et]),eP=(0,n.useCallback)(async(e,t,r)=>{let o="[ProjectProvider][updateSceneVolume]",a=W();if(!a)return void console.error(`${o} Error: No current project found in core state.`);let n=a.scenes.findIndex(t=>t.id===e);if(-1===n)return void console.error(`${o} Error: Scene ID ${e} not found.`);let i=[...a.scenes],s=i[n];i[n]={...s,volume:t,...void 0!==r&&{muted:r},updatedAt:Date.now()};let c={...a,scenes:i,updatedAt:Date.now()};try{J(c),await O(et(c)),console.log(`${o} Successfully updated volume for scene ${e}:`,{volume:t,muted:r})}catch(e){console.error(`${o} Failed to save scene volume:`,e),S({type:"SET_ERROR",payload:{error:"Failed to save volume change"}}),J(a)}},[S,O,J,W,et]),eO=(0,n.useRef)({}),{storeMedia:ex}=function(){let[e,t]=(0,n.useState)(!1),[r,o]=(0,n.useState)(null);return{storeMedia:(0,n.useCallback)(async e=>{t(!0),o(null);try{let t={project_id:e.projectId,scene_id:e.sceneId,url:e.url,media_type:e.media_type,create_thumbnail:e.create_thumbnail,download_source_override:e.download_source_override},r=await (0,d.storeMediaContent)(t);if(r.error){let e=Error(r.error.message||"API error storing media");throw o(e),e}return r}catch(t){console.error("Error in useMediaStorage hook:",t);let e=t instanceof Error?t:Error("Failed to store media");throw r||o(e),e}finally{t(!1)}},[r]),isLoading:e,error:r}}(),eM=n.useRef(null),eU=function({sessionStatus:e,userId:t,isLoading:r,loadProjectsList:o,dispatch:a}){let i=(0,n.useRef)(!1);return(0,n.useCallback)(async()=>{if("loading"!==e&&!r&&!i.current&&("authenticated"!==e||t)){i.current=!0,a({type:"SET_LOADING",payload:{isLoading:!0}});try{let e=await o(t)||[];a({type:"LOAD_PROJECTS",payload:{projects:e}})}catch(e){console.error("[ProjectProvider] Error refreshing projects list:",e),a({type:"SET_ERROR",payload:{error:"Failed to refresh projects list."}})}finally{i.current=!1,a({type:"SET_LOADING",payload:{isLoading:!1}})}}},[e,t,r,o,a])}({sessionStatus:k,userId:T,isLoading:_.isLoading,loadProjectsList:R,dispatch:S}),eN=(0,n.useMemo)(()=>c()(e=>{if(window.__PLAYWRIGHT_TEST_MODE__||"true"===localStorage.getItem("autoShorts_testMode"))return void console.log("[ProjectProvider] TEST MODE: Skipping debounced save to preserve project state");if(window.__AUTOSHORTS_UPLOADING__)return void console.log("[ProjectProvider] â³ UPLOAD IN PROGRESS: Skipping debounced save to prevent race condition");let t=W();if(!t)return void console.log("[ProjectProvider] debouncedSaveProject: No project to save");if(e&&e.id!==t.id)return void console.log("[ProjectProvider] debouncedSaveProject: Project changed, skipping stale save");console.log(`[ProjectProvider] Debounced auto-save executing for project: ${t.id}`),console.log(`[ProjectProvider] debouncedSaveProject: Saving project ${t.id} with ${t.scenes?.length||0} scenes.`);let r=JSON.parse(JSON.stringify(et(t)));S({type:"SET_SAVING",payload:{isSaving:!0}}),O(r).then(()=>{S({type:"SET_LAST_SAVED",payload:{timestamp:Date.now()}})}).catch(e=>{console.error("[ProjectProvider] Error saving project:",e),(0,b.trackEvent)("project_save_failed",{project_id:t.id,lane:"debounced",sce
1ne_count:t.scenes?.length??0,error:e instanceof Error?e.message.slice(0,300):String(e).slice(0,300)}),S({type:"SET_ERROR",payload:{error:"Failed to save project"}})}).finally(()=>{S({type:"SET_SAVING",payload:{isSaving:!1}})})},15e3),[S,O,W,et]),eB=(0,n.useCallback)(async e=>{eN.cancel();let t=e??W();{let e=window.__PLAYWRIGHT_TEST_MODE__||"true"===localStorage.getItem("autoShorts_testMode"),r=t?.mode==="local";if(e&&!r)return void console.log("[ProjectProvider] TEST MODE: Skipping save to preserve project template");if(e&&r&&console.log("[ProjectProvider] TEST MODE: Allowing save for LOCAL project"),window.__AUTOSHORTS_UPLOADING__)return void console.log("[ProjectProvider] â³ UPLOAD IN PROGRESS: Skipping save to prevent race condition")}let r=(0,I.$M)(),o=Date.now()-r.timestamp;if(t&&(r.sceneIds.length>0||(t.facelessStoryboard?.detachedPlanSceneIds?.length??0)>0)&&(o<3e4||(t.facelessStoryboard?.detachedPlanSceneIds?.length??0)>0)){let e=new Set((t.facelessStoryboard?.detachedPlanSceneIds??[]).filter(e=>"string"==typeof e&&e.trim().length>0)),o=new Set(r.sceneIds);for(let r of t.scenes){let t=r.facelessPlanSceneId;"string"==typeof t&&e.has(t)&&o.add(r.id)}let a=t.scenes.length,n=t.scenes.filter(e=>!o.has(e.id)),i=(t.audio??[]).filter(e=>!o.has(e.id)&&!o.has(e.sourceSceneId??"")&&!o.has(e.sceneId??"")),s=(t.captionBlocks??[]).filter(e=>!o.has(e.sceneId??""));(n.length!==a||i.length!==(t.audio??[]).length||s.length!==(t.captionBlocks??[]).length)&&(console.log(`[ProjectProvider] Filtered ${a-n.length} recently-deleted scenes from save`),t={...t,scenes:n,audio:i,captionBlocks:s})}if(!t)return void console.warn("[ProjectProvider] Attempted to save but no current project found.");console.log(`[ProjectProvider] saveCurrentProjectWrapper: Triggered for project ${t.id}.`),console.log(`[DEBUG][ProjectProvider] Saving project ${t.id}. Trim data:`,t.scenes.map(e=>({id:e.id,trim:e.media?.trim}))),console.log(`[DEBUG][ProjectProvider] Saving project ${t.id}. Track data:`,t.scenes.map(e=>({id:e.id,trackId:e.trackId,timelineStart:e.timelineStart})));let a=et(t);S({type:"SET_SAVING",payload:{isSaving:!0}});try{await O(a),S({type:"SET_LAST_SAVED",payload:{timestamp:Date.now()}})}catch(e){console.error("[ProjectProvider] Error saving project:",e),(0,b.trackEvent)("project_save_failed",{project_id:a.id,lane:"immediate",scene_count:a.scenes?.length??0,error:e instanceof Error?e.message.slice(0,300):String(e).slice(0,300)}),S({type:"SET_ERROR",payload:{error:"Failed to save project"}})}finally{S({type:"SET_SAVING",payload:{isSaving:!1}})}},[W,O,S,eN,et]),eF=(0,n.useRef)(eB);eF.current=eB;let eG=(0,n.useRef)(null);eG.current||(o={isSaveInFlight:()=>L.current,runSave:e=>eF.current(e)},g=null,f=!1,y=async e=>{if(f||o.isSaveInFlight())return g={override:e},"queued";f=!0;try{await o.runSave(e)}finally{f=!1,v()}return"saved"},v=()=>{if(!g||f||o.isSaveInFlight())return;let e=g;g=null,y(e.override)},eG.current={request:y,flush:v,hasPending:()=>null!==g});let eJ=(0,n.useCallback)(async e=>{await eG.current.request(e)},[]);(0,n.useEffect)(()=>{$||eG.current?.flush()},[$]),(0,n.useEffect)(()=>{let e=()=>{eN.flush(),eG.current?.flush()};return window.addEventListener("pagehide",e),()=>{window.removeEventListener("pagehide",e)}},[eN]);let eq=(0,n.useCallback)(e=>{if(!M)return;let t={...M,viewMode:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),eW=(0,n.useCallback)(e=>{if(!M)return;let t={...M,isMasterOnlyMode:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),eK=(0,n.useCallback)(e=>{if(!e)return!0;let t=e.scenes&&e.scenes.length>0,r=e.audio&&e.audio.length>0||e.voiceovers&&e.voiceovers.length>0,o=!!e.facelessStoryboard?.plan||e.facelessStoryboard?.sceneJobs?.length>0||!!e.facelessSettings||"generate"===e.aiWorkspaceTab;return!t&&!r&&!o},[]);(0,n.useEffect)(()=>{if(!M){eM.current=null;return}return eK(M)?void console.log(`[ProjectProvider] Skipping save for empty project ${M.id} (no content uploaded)`):(M.id&&eM.current!==M.id?(console.log(`[ProjectProvider] New project ${M.id} detected. Triggering initial immediate save.`),eJ(),eM.current=M.id):(console.log(`[ProjectProvider] Auto-save useEffect triggered for project ${M.id}
1. Queueing debounced save.`),eN(M)),()=>{eN.cancel()})},[M,eN,eJ,eK]),(0,n.useEffect)(()=>{if(E.current!==w){let e="/projects"===w||"/dashboard/projects"===w,t=E.current?.startsWith("/projects/")&&"/projects/create"!==E.current,r=t&&M&&eK(M),o=r?M.id:null;(async()=>{if(t&&!r&&eN.flush(),r&&o&&C){console.log(`[ProjectProvider] Navigating away from empty project ${o}. Deleting...`),S({type:"DELETE_PROJECT",payload:{projectId:o}});try{if(await C(o),console.log(`[ProjectProvider] Empty project ${o} deleted successfully.`),(0,b.trackEvent)("project_deleted",{projectId:o,source:"empty_project_cleanup"}),e){console.log("[ProjectProvider] Forcing router refresh after empty project deletion."),j.refresh();return}}catch(e){console.error("Failed to delete empty project:",e)}}w&&"authenticated"===k&&T&&e?(console.log(`[ProjectProvider] Navigated to projects page (Path: ${w}). Session authenticated for user ${T}. Refreshing projects list.`),eU()):w&&e&&console.log(`[ProjectProvider] Navigated to projects page (Path: ${w}), but session not fully authenticated or user ID missing. Status: ${k}, UserID: ${T}. Skipping immediate refresh.`)})(),E.current=w}},[w,eU,k,T,M,eK,C,eN]);let ez=(0,n.useCallback)(async()=>{if(!M)return S({type:"SET_ERROR",payload:{error:"No active project to store media for"}}),null;let e={...M};try{let{storeAllProjectMedia:t}=await Promise.resolve().then(r.bind(r,99269)),o=async(e,t)=>{await er(e,t)};return await t(e,o)}catch(e){return S({type:"SET_ERROR",payload:{error:e instanceof Error?e.message:"Unknown error storing media"}}),null}},[M,er]);(0,n.useEffect)(()=>{if(!M||!M.scenes||0===M.scenes.length||"local"===M.mode)return;let e=M.id;M.scenes.forEach(t=>{let r=t.media?.url,o=!!r&&!r.startsWith("blob:")&&!r.startsWith("data:")&&!r.startsWith("/");!t.media?.url||!o||t.media.isStorageBacked||eO.current[t.id]||H.current[t.id]||(eO.current[t.id]=!0,console.log(`[Media Storage Effect] Initiating storage for scene ${t.id} with URL ${t.media.url}`),ex({projectId:e,sceneId:t.id,url:t.media.url,media_type:t.media.type,create_thumbnail:!0,download_source_override:t.media.downloadSourceOverride}).then(e=>{if(e.success&&e.data&&e.data.task_id){let r=e.data.task_id;console.log(`[Media Storage Effect] Backend acknowledged storage initiation for scene ${t.id}. Task ID: ${r}`),H.current[t.id]=r,console.log("[Media Storage Effect] Stored task mapping:",H.current),X(e=>e+1),S({type:"SET_SCENE_STORAGE_STATUS",payload:{sceneId:t.id,isStoringMedia:!0,storageError:null}}),delete eO.current[t.id],console.log(`[Media Storage Effect] Success - removed scene ${t.id} from processing ref.`)}else console.error(`[Media Storage Effect] Storage initiation for scene ${t.id} succeeded but response lacked task_id.`),S({type:"SET_SCENE_STORAGE_STATUS",payload:{sceneId:t.id,isStoringMedia:!1,storageError:"Failed to get task ID from backend"}}),console.log(`[Media Storage Effect] Failed (no task_id) - keeping scene ${t.id} locked to prevent retry loop.`)}).catch(e=>{console.error(`[Media Storage Effect] Error initiating storage for scene ${t.id}:`,e),S({type:"SET_SCENE_STORAGE_STATUS",payload:{sceneId:t.id,isStoringMedia:!1,storageError:e instanceof Error?e.message:"Failed to start storage"}}),console.log(`[Media Storage Effect] Error - keeping scene ${t.id} locked to prevent retry loop.`)}))})},[M,ex,er]),(0,n.useEffect)(()=>{let e={},t=async(t,r)=>{console.log(`[Polling Effect] Checking status for task ${r} (Scene: ${t})`);try{let o=await (0,d.CB)(r);if(o.success&&o.data){let{status:a,result:n,error:i}=o.data;console.log(`[Polling Effect] Task ${r} status: ${a}`),"SUCCESS"===a?(console.log(`[Polling Effect] Task ${r} succeeded. Result:`,n),S({type:"SET_SCENE_STORAGE_SUCCESS",payload:{sceneId:t,storageKey:n?.storage_key,thumbnailStorageKey:n?.thumbnail_storage_key,contentType:n?.content_type,fileSize:n?.file_size}}),e[t]&&clearInterval(e[t]),delete e[t],delete H.current[t],console.log(`[Polling Effect] Cleared interval and mapping for completed task ${r}`)):"FAILURE"===a?(console.error(`[Polling Effect] Task ${r} failed. Error: ${i}`,n),S({type:"SET_SCENE_STORAGE_STATUS",payload:{sceneId:t,isStoringMedia:!1,storageError:i||"Task failed without specific error message"}}),e[t]&&clearInterval(e[t]),delete e[t],delete H.current[t],console.log(`[Polling Effect] Cleared interval and mapping for failed task ${r}`)):console.log(`[Polling Effect] Task ${r} still in progress (${a}). Waiting...`)}else console.error(`[Polling Effect] API call to check task ${r} status failed:`,o.error)}catch(o){console.error(`[Polling Effect] Exception while checking task ${r} status:`,o),e[t]&&clearInterval(e[t]),delete e[t],delete H.current[t],console.log(`[Polling Effect] Cleared interval and mapping for task ${r} due to exception.`)}};return Object.entries(H.current).forEach(([r,o])=>{o&&!e[r]&&(console.log(`[Polling Effect] Setting up interval for existing task ${o} (Scene: ${r})`),t(r,o),e[r]=setInterval(()=>t(r,o),5e3))}),()=>{console.log("[Polling Effect] Cleaning up polling intervals."),Object.values(e).forEach(clearInterval)}},[S,Y]);let eV=(0,n.useCallback)(async(e,t)=>{let{trace:o,traceError:a,captureTraceEvent:n}=await Promise.all([r.e(1453),r.e(2826),r.e(9304),r.e(4715),r.e(1464)]).then(r.bind(r,41464));if(o("add_scene","start",{method:"url",url:e,templatePreset:t?.applyTemplatePreset}),!M)return void S({type:"SET_ERROR",payload:{error:"No active project to add scene to"}});let i={...M},s=i.id,c=(0,en.$C)(),l=async(e,t)=>{var r,o;let a=t.media;if(!a?.url||(r=a.url)&&(r.startsWith("blob:")||r.startsWith("localBlob://")||r.startsWith("local://")))return t;try{let r,n,i=await fetch(a.url);if(!i.ok)throw Error(`Media download failed (${i.status})`);let s=i.headers.get("content-type")?.split(";")[0].trim(),c=await i.blob(),l=s||c.type||a.contentType||("video"===a.type?"video/mp4":"image/jpeg"),d=(o=a.type,r=l?.split(";
1")[0].trim().toLowerCase(),n={"image/jpeg":"jpg","image/jpg":"jpg","image/png":"png","image/webp":"webp","image/gif":"gif","video/mp4":"mp4","video/webm":"webm","video/quicktime":"mov","video/x-matroska":"mkv"},r&&n[r]?n[r]:"video"===o?"mp4":"jpg"),u=`scene-${t.id}.${d}`,p=new File([c],u,{type:l,lastModified:Date.now()}),g=await (0,h.D_)(e,p),f=URL.createObjectURL(p);return{...t,media:{...a,url:f,thumbnailUrl:"image"===a.type?f:a.thumbnailUrl,assetRef:{type:"blob",blobId:g.id,filename:g.filename,size:g.size,lastModified:g.lastModified,mimeType:g.mimeType},originalUrl:a.originalUrl||a.url,contentType:l,fileSize:c.size,storageKey:void 0,storedUrl:void 0,isStorageBacked:!1,storedAt:void 0}}}catch(e){return console.warn("[ProjectProvider] Failed to persist local scene media:",{sceneId:t.id,url:a.url,error:e instanceof Error?e.message:String(e)}),t}};try{let r,p=await (0,d.HQ)(e);if(p.error)throw Error(p.error.message||"Failed to extract content");let g=p.data.data;if(!g)throw Error("No content data returned from API");let f=null,m=null;if(g.metadata?.has_media&&g.media_url){f=g.media_type||"image",m=g.media_url;try{let e=localStorage.getItem("reddit-download-source");("page"===e||"media"===e)&&(r=e)}catch{}}let y=Array.isArray(g.metadata?.gallery_items)?g.metadata.gallery_items.filter(e=>"string"==typeof e&&e.trim()):[];if("gallery"===g.media_type&&y.length>1){o("add_scene","gallery_expansion",{imageCount:y.length,url:e});let d=y.map((o,a)=>{let n=0===a?c:(0,en.$C)(),s={id:n,url:e,title:g.title,text:0===a&&g.text||"",media:{type:"image",url:o,thumbnailUrl:0===a?g.thumbnail_url:void 0,width:g.width||g.metadata?.width,height:g.height||g.metadata?.height,downloadSourceOverride:r},source:{platform:"reddit",author:g.author,subreddit:g.subreddit},compliance:{contentOrigin:"reddit-import",importMode:t?.redditImportMode??"direct-url",rightsGateVersion:"reddit-legal-gate-v1",rightsGateAcceptedAt:Date.now(),exportWarningRequired:!0},createdAt:Date.now(),isLoading:!1};if(t?.applyTemplatePreset===ep._b){let e=(0,ep.DX)({sceneId:n,sequenceIndex:i.scenes.length+a,mediaType:"image",mediaDuration:void 0,title:g.title,sourceText:g.title||"",templateSettings:t?.templateSettings});if(e)return{...s,...e,media:s.media?{...s.media,...e.media??{}}:s.media}}return s}),u=[...i.scenes,...d],p={...i,scenes:u,updatedAt:Date.now()};if(await O(p),o("add_scene","gallery_project_saved",{projectId:p.id,sceneCount:d.length}),J(p),"local"===p.mode){let e=await Promise.all(d.map(e=>l(p.id,e))),t=new Map(e.map(e=>[e.id,e])),r={...p,scenes:p.scenes.map(e=>t.get(e.id)??e),updatedAt:Date.now()};await O(r),J(r)}else for(let e of d)if(e.media?.url)try{let t=await ex({projectId:s,sceneId:e.id,url:e.media.url,media_type:"image",download_source_override:r});t.error&&a("add_scene","gallery_download:error",t.error,{sceneId:e.id})}catch(t){a("add_scene","gallery_download:exception",t,{sceneId:e.id})}try{await n("add_scene","capture_after_gallery_add",{url:e})}catch{}return}"gallery"===f&&(f="image");let v="video"===f&&m?(0,u.q9)(m):null,_={id:c,url:e,title:g.title,text:g.text||"",media:m&&f?{type:f,url:m,thumbnailUrl:g.thumbnail_url,width:g.width||g.metadata?.width,height:g.height||g.metadata?.height,duration:g.metadata?.duration||g.duration,downloadSourceOverride:r}:void 0,...v?{audio:{audio_url:v}}:{},source:{platform:"reddit",author:g.author,subreddit:g.subreddit},compliance:{contentOrigin:"reddit-import",importMode:t?.redditImportMode??"direct-url",rightsGateVersion:"reddit-legal-gate-v1",rightsGateAcceptedAt:Date.now(),exportWarningRequired:!0},createdAt:Date.now(),isLoading:!1},S=t?.applyTemplatePreset===ep._b?(0,ep.DX)({sceneId:c,sequenceIndex:i.scenes.length,mediaType:_.media?.type,mediaDuration:_.media?.duration,title:g.title,sourceText:g.title||"",templateSettings:t?.templateSettings}):void 0,j=S?.media&&_.media?{..._.media,...S.media}:_.media,w=S?{..._,...S,media:j}:_,E=i.scenes.some(e=>e.id===c)?i.scenes.map(e=>e.id===c?w:e):[...i.scenes,w],P={...i,scenes:E,updatedAt:Date.now()};if(await O(P),o("add_scene","project_saved",{projectId:P.id,sceneId:c}),(0,eu.s)(P.id,{source:"add_scene",sceneCount:E.length,mediaType:_.media?.type}),J(P),"video"===f&&m&&(e.includes("reddit.com")||e.includes("redd.it"))&&m){o("add_scene","stream_download:start",{sceneId:c,mediaUrl:m});try{let{blob:t,filename:r}=await (0,d.ND)(e,(e,t)=>{o("add_scene","stream_download:progress",{sceneId:c,loaded:e,total:t,pct:t?Math.round(e/t*100):null})}),a=new File([t],r,{type:"video/mp4",lastModified:Date.now()}
1),n=await (0,h.D_)(P.id,a),i=URL.createObjectURL(a),s={...w,media:{...w.media,url:i,assetRef:{type:"blob",blobId:n.id,filename:n.filename,size:n.size,lastModified:n.lastModified,mimeType:n.mimeType},originalUrl:m,contentType:"video/mp4",fileSize:t.size,storageKey:void 0,storedUrl:void 0,isStorageBacked:!1}},l={...P,scenes:P.scenes.map(e=>e.id===s.id?s:e),updatedAt:Date.now()};await O(l),J(l),o("add_scene","stream_download:complete",{sceneId:c,blobSize:t.size})}catch(e){a("add_scene","stream_download:error",e,{sceneId:c}),o("add_scene","stream_download:fallback_to_r2",{sceneId:c});try{let e;try{let t=localStorage.getItem("reddit-download-source");("page"===t||"media"===t)&&(e=t)}catch{}await ex({projectId:s,sceneId:c,url:m,media_type:f??void 0,download_source_override:e})}catch(e){a("add_scene","fallback_r2:error",e,{sceneId:c})}}}else if(m&&f&&"local"!==P.mode){o("add_scene","download_task:queue",{sceneId:c,mediaUrl:m,mediaType:f});try{let e;try{let t=localStorage.getItem("reddit-download-source");("page"===t||"media"===t)&&(e=t)}catch{}let t=await ex({projectId:s,sceneId:c,url:m,media_type:f,download_source_override:e});t.error?a("add_scene","download_task:error",t.error,{sceneId:c}):o("add_scene","download_task:queued",{sceneId:c,task:t.data})}catch(e){a("add_scene","download_task:exception",e,{sceneId:c})}}else if(m&&f&&"local"===P.mode){o("add_scene","local_project_persist_remote_media:start",{sceneId:c,mediaUrl:m});let e=await l(P.id,w);if(e!==w){let t={...P,scenes:P.scenes.map(t=>t.id===e.id?e:t),updatedAt:Date.now()};await O(t),J(t),o("add_scene","local_project_persist_remote_media:complete",{sceneId:c,assetType:e.media?.assetRef?.type})}else o("add_scene","local_project_persist_remote_media:skipped",{sceneId:c,mediaUrl:m})}}catch(t){a("add_scene","error",t,{url:e}),S({type:"SET_ERROR",payload:{error:`Failed to add scene: ${t instanceof Error?t.message:String(t)}`}})}try{await n("add_scene","capture_after_add",{url:e})}catch{}},[M,S,O,ex,er,W]),eH=(0,n.useCallback)(async e=>{let t=W();if(!t)return void S({type:"SET_ERROR",payload:{error:"No active project to remove scene from"}});try{(0,I.g_)([e]);let r=t.scenes.find(t=>t.id===e);if(r){let{archiveScene:o,setActiveProject:a}=ea.w.getState();a(t.id),o(r,"ProjectProvider.removeScene"),console.log("[ProjectProvider] Scene archived to MediaBin before removal:",e)}let o=t.scenes.filter(t=>t.id!==e),a=r?.facelessPlanSceneId,n=t.facelessStoryboard,i=n&&"string"==typeof a&&a?{...n,detachedPlanSceneIds:Array.from(new Set([...n.detachedPlanSceneIds??[],a]))}:n,s=t.audio??t.voiceovers??[],c=new Set(s.filter(t=>t.id===e||t.sourceSceneId===e||t.sceneId===e).map(e=>e.id)),l=s.filter(e=>!c.has(e.id)),d=(t.captionBlocks??[]).filter(t=>t.sceneId!==e),u={...t,scenes:o,audio:l,voiceovers:l,captionBlocks:d,...i!==n?{facelessStoryboard:i}:{},updatedAt:Date.now()};(0,b.trackEvent)("timeline_scene_removed",{projectId:t.id,sceneCountAfter:o.length,hadMedia:!!(r?.media?.url||r?.media?.storedUrl)}),J(u);let p=eh.zC.getState();p.setBlocks(p.blocks.filter(t=>t.sceneId!==e&&!c.has(t.id))),S({type:"SET_SAVING",payload:{isSaving:!0}}),await O(et(u)),S({type:"SET_LAST_SAVED",payload:{timestamp:Date.now()}}),S({type:"SET_SAVING",payload:{isSaving:!1}})}catch(e){S({type:"SET_SAVING",payload:{isSaving:!1}}),S({type:"SET_ERROR",payload:{error:`Error removing scene: ${e instanceof Error?e.message:"Unknown error"}`}})}},[W,S,O,J,et]),eY=(0,n.useCallback)(async e=>{if(!M)return void console.warn("[ProjectProvider] reorderScenes: coreCurrentProject is null. Cannot reorder.");console.log("[ProjectProvider] reorderScenes: Requested order:",e),console.log("[ProjectProvider] reorderScenes: Scenes BEFORE reorder in coreCurrentProject:",M.scenes?.map(e=>({id:e.id,text:e.text?.substring(0,15)})));let t=M.scenes,r=e.map(e=>t.find(t=>t.id===e)).filter(Boolean),o=0,a=r.map((e,t)=>{let r=e.media?.trim?e.media.trim.end-e.media.trim.start:e.media?.duration||0,a={...e,sequenceIndex:t,timelineStart:o};return o+=r,a});if(r.length===t.length){let e={...M,scenes:a,updatedAt:Date.now()};J(e),O(et(e)),console.log("[ProjectProvider] reorderScenes: Core state updated and immediate save triggered. New scene order:",r.map(e=>({id:e.id,text:e.text?.substring(0,15)})))}else console.error("[ProjectProvider] Scene ID mismatch during reorder")},[M,J,O,et]),eX=(0,n.useCallback)((e,t,r,o)=>{let a=W();if(!a)return console.warn("[ProjectProvider] duplicateScene: No active project"),null;let n=a.scenes.find(t=>
1t.id===e);if(!n)return console.warn(`[ProjectProvider] duplicateScene: Scene ${e} not found`),null;let i=(0,en.$C)(),s={...JSON.parse(JSON.stringify(n)),id:i,createdAt:Date.now(),updatedAt:Date.now(),timelineStart:o?.timelineStart,trackId:o?.trackId??n.trackId};t&&s.media&&(s.media={...s.media,...t});let c=a.scenes.findIndex(t=>t.id===e),l=a.scenes.map((e,t)=>t===c&&r&&e.media?{...e,media:{...e.media,...r},updatedAt:Date.now()}:e);l.splice(c+1,0,s);let d=l.map((e,t)=>({...e,sequenceIndex:t})),u={...a,scenes:d,updatedAt:Date.now()};return console.log(`[ProjectProvider] duplicateScene: Created ${i.slice(0,8)} from ${e.slice(0,8)}`,r?`| Original trimmed to ${r.trim?.start?.toFixed(2)}-${r.trim?.end?.toFixed(2)}`:"",t?`| New trimmed to ${t.trim?.start?.toFixed(2)}-${t.trim?.end?.toFixed(2)}`:""),J(u),O(et(u)),s},[W,J,O,et]),eZ=(0,n.useCallback)(e=>{let t=W();if(!t||0===e.length)return console.warn("[ProjectProvider] duplicateScenes: No active project or empty selection"),null;let r=function(e,t){let r=new Set(t);if(0===r.size)return null;let o=(void 0)??Date.now(),a=(void 0)??en.$C,n=[],i=[];for(let t of e.scenes??[]){if(i.push(t),!r.has(t.id))continue;let e={...JSON.parse(JSON.stringify(t)),id:a(),createdAt:o,updatedAt:o,timelineStart:void 0,trackId:t.trackId};n.push(e),i.push(e)}if(0===n.length)return null;let s=i.map((e,t)=>({...e,sequenceIndex:t}));return{updatedProject:{...e,scenes:s,updatedAt:o},newScenes:n}}(t,e);return r?(console.log(`[ProjectProvider] duplicateScenes: Created ${r.newScenes.length} duplicates in one update`),J(r.updatedProject),O(et(r.updatedProject)),{newScenes:r.newScenes,updatedScenes:r.updatedProject.scenes}):(console.warn("[ProjectProvider] duplicateScenes: No matching scenes to duplicate"),null)},[W,J,O,et]),eQ=(0,n.useCallback)(async(e,t)=>{if(!M)return;let r=M.scenes.map(r=>r.id===e?{...r,text:t}:r),o={...M,scenes:r,updatedAt:Date.now()};try{await O(et(o)),J(o)}catch{S({type:"SET_ERROR",payload:{error:"Failed to save text change"}})}},[M,S,O,J,et]),e0=(0,n.useCallback)(async(e,t,r)=>{let o=W();if(!o)return;console.log(`[updateSceneAudio] Triggered for scene: ${e}`,{incomingAudioData:t,incomingVoiceSettings:r});let a=o.scenes.map(o=>{if(o.id===e){console.log(`[updateSceneAudio] Found scene ${e}. Original scene.audio:`,o.audio),console.log("[updateSceneAudio] Original scene.voice_settings:",o.voice_settings);let a=eL({},o.audio||{},t||{});a.extracted_video_audio&&(a.extracted?a.extracted={...a.extracted,...a.extracted_video_audio}:a.extracted={...a.extracted_video_audio}),delete a.extracted_video_audio,r&&(a.voice_settings=eL({},a.voice_settings||{},r));let n=a.voice_settings,i=ee.current[e];if(void 0!==i){let e=a.elevenlabs_voiceover||{};void 0===e.voiceover_start_time&&(e.voiceover_start_time=i),a.elevenlabs_voiceover={...e}}if(a.extracted){let e=a.extracted;(void 0===e.volume||null===e.volume)&&(e.volume=1)}return{...o,audio:a,voice_settings:n}}return o}),n={...o,scenes:a,updatedAt:Date.now()};try{await O(et(n)),J(n),console.log(`[updateSceneAudio] Successfully saved project and updated core state for scene ${e}`)}catch{S({type:"SET_ERROR",payload:{error:"Failed to save audio change"}})}},[W,S,O,J,et]);(0,n.useEffect)(()=>{if(!M?.id||"local"===M.mode)return;let e=M.id;M.scenes.forEach(t=>{let r=t.audio?.extracted,o=r?.task_id||Z.current[t.id],a=r?.status==="ready"||!!r?.url,n=r?.status==="processing";if(t.source?.platform!=="reddit"||t.media?.type!=="video"||!t.media?.url||a||n||o){o&&(Z.current[t.id]=o);return}Q.current[t.id]||(Q.current[t.id]=!0,(0,d.XY)(e,t.id).then(async e=>{if(e.success&&e.data?.task_id){let r=e.data.task_id;Z.current[t.id]=r,await e0(t.id,{extracted:{status:"processing",task_id:r}},t.voice_settings||t.audio?.voice_settings||{})}else console.error(`[Audio Extraction] Failed to queue audio for scene ${t.id}`,e.error)}).catch(e=>{console.error(`[Audio Extraction] Error queueing audio for scene ${t.id}`,e)}).finally(()=>{delete Q.current[t.id]}))})},[M,e0]),(0,n.useEffect)(()=>{if(!M?.id||"local"===M.mode)return;let e=M.id,t={},r=async(r,o,a)=>{try{let n=a||{},i=await (0,d.CB)(o);if(i.success&&i.data){let{status:a,result:s,error:c}=i.data;if("SUCCESS"===a){let a=await (0,ed.z)(e,r);a.error&&console.warn(`[Audio Extraction] URL lookup failed for scene ${r}:`,a.error);let i={extracted:{status:"ready",task_id:o}};
1s?.r2_key&&(i.extracted.r2_key=s.r2_key),a.url&&(i.extracted.url=a.url),await e0(r,i,n),delete Z.current[r],t[r]&&(clearInterval(t[r]),delete t[r])}else"FAILURE"===a&&(await e0(r,{extracted:{status:"error",errorMessage:c||"Audio download failed"}},n),delete Z.current[r],t[r]&&(clearInterval(t[r]),delete t[r]))}}catch(e){console.error(`[Audio Extraction] Error checking task ${o} for scene ${r}`,e)}};return M.scenes.forEach(e=>{let o=e.audio?.extracted,a=o?.task_id||Z.current[e.id],n=o?.status;if(!a||"ready"===n||"error"===n)return;let i=Z.current[e.id]!==a;Z.current[e.id]=a;let s=e.voice_settings||e.audio?.voice_settings;i&&r(e.id,a,s),t[e.id]=setInterval(()=>r(e.id,a,s),5e3)}),()=>{Object.values(t).forEach(clearInterval)}},[M,e0,J]);let e1=(0,n.useCallback)(async(e,t)=>{if(!M)return;let r=M.scenes.map(r=>{if(r.id===e){let e=r.audio||{},o=e.elevenlabs_voiceover||{};return{...r,audio:{...e,elevenlabs_voiceover:{...o,voiceover_start_time:t}}}}return r}),o={...M,scenes:r,updatedAt:Date.now()};J(o),ee.current[e]=t,console.log(`[ProjectProvider][updateSceneVoiceoverStartTime] Immediate save for scene ${e} startTime=${t}`);try{await O(et(o))}catch(e){console.error("[ProjectProvider][updateSceneVoiceoverStartTime] â Immediate save failed",e)}eN(o)},[M,S,J,eN,O,et]),e4=(0,n.useCallback)((e,t,r)=>{if(!M)return;let o=M.scenes.map(r=>r.id===e?{...r,transform:t,updatedAt:Date.now()}:r),a={...M,scenes:o,updatedAt:Date.now()};J(a),r?(eN.cancel(),O(et(a)).catch(e=>console.error("[ProjectProvider] Transform immediate save failed:",e))):eN(a)},[M,J,eN,O,et]),e2=(0,n.useCallback)((e,t,r)=>{if(!M)return;let o=M.scenes.map(r=>r.id!==e?r:{...r,automation:t,updatedAt:Date.now()}),a={...M,scenes:o,updatedAt:Date.now()};J(a),r?(eN.cancel(),O(et(a)).catch(e=>console.error("[ProjectProvider] Scene automation immediate save failed:",e))):eN(a)},[M,J,eN,O,et]),e5=(0,n.useCallback)(async e=>{let t,o=W();if(!o?.id)return void console.warn("[ProjectProvider] addAudioBlock: No current project");let a=o.id,n=null;try{let{fetchAPI:e}=await Promise.resolve().then(r.bind(r,63557)),{transformBackendProject:t}=await Promise.resolve().then(r.bind(r,60668)),o=await e(`/projects/${a}`,{method:"GET"});if(o.success&&o.data){let e=o.data.data?o.data.data:o.data;n=t(e),console.log(`[ProjectProvider] addAudioBlock: Fetched fresh project with ${n.scenes?.length||0} scenes`)}}catch(e){console.warn("[ProjectProvider] addAudioBlock: Failed to fetch fresh project, using local state",e)}let i=(0,eg.E)(o,n),s=i.audio||i.voiceovers||[],c=s.findIndex(t=>t.id===e.id);-1!==c?(t=s.map((t,r)=>r===c?{...t,...e,updatedAt:Date.now()}:t),console.log(`[ProjectProvider] addAudioBlock: Updated existing audio block ${e.id}`)):(t=[...s,e],console.log(`[ProjectProvider] addAudioBlock: Added new audio block ${e.id}`));let l={...i,audio:t,voiceovers:t,updatedAt:Date.now()};J(l);try{await O(et(l)),console.log(`[ProjectProvider] addAudioBlock: Saved audio block ${e.id} to database`)}catch(e){console.error("[ProjectProvider] addAudioBlock: Failed to save audio block",e)}},[W,J,O,et]),e6=(0,n.useCallback)(async(e,t)=>{let r=W();if(!r)return void console.warn("[ProjectProvider] updateAudioBlock: No current project");let o=r.audio||r.voiceovers||[],a=o.findIndex(t=>t.id===e);if(-1===a)return void console.warn(`[ProjectProvider] updateAudioBlock: Audio block ${e} not found`);let n=o.map((e,r)=>r===a?{...e,...t,updatedAt:Date.now()}:e),i={...r,audio:n,voiceovers:n,updatedAt:Date.now()};J(i),eN(i),console.log(`[ProjectProvider] updateAudioBlock: Updated audio block ${e}`)},[W,J,eN]),e3=(0,n.useCallback)(async e=>{let t=W();if(!t)return void console.warn("[ProjectProvider] removeAudioBlock: No current project");let r=(t.audio||t.voiceovers||[]).filter(t=>t.id!==e),o={...t,audio:r,voiceovers:r,updatedAt:Date.now()};J(o);try{await O(et(o)),console.log(`[ProjectProvider] removeAudioBlock: Removed audio block ${e}`)}catch(e){console.error("[ProjectProvider] removeAudioBlock: Failed to save after removal",e)}},[W,J,O,et]),e8=(0,n.useCallback)(async()=>{S({type:"SET_LOADING",payload:{isLoading:!0}});try{await D(),S({type:"CLEAR_ALL_PROJECTS"}),j.push("/projects")}catch(e){console.error("Error deleting all projects:",e),S({type:"SET_ERROR",payload:{error:"Failed to delete all projects"}})}finally{S({type:"SET_LOADING",payload:{isLoading:!1}})}},[D,j,S]),e7=(0,n.useCallback)(async e=>{if(!M)return;let t={...M,showLetterboxing:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),e9=(0,n.useCallback)(e=>{if(!M)return;let t={width:Math.max(1,Math.round(e.width)),height:Math.max(1,Math.round(e.height))},r={...M,masterPreviewSize:t,updatedAt:Date.now()};J(r),eN(r)},[M,J,eN]),te=(0,n.useCallback)(e=>{if(!M)return;let t={...M,masterPreviewLocked:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),tt=(0,n.useCallback)(e=>{if(!M)return;let t={...M,sceneScale:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),tr=(0,n.useCallback)(e=>{if(!M)return;let t={...M,masterTimelineZoomLevel:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),to=(0,n.useCallback)(e=>{if(!M||!Number.isFinite(e))return;let t=Math.max(0,e),r={...M,masterTimelineViewportStart:t,updatedAt:Date.now()};J(r),eN(r)},[M,J,eN]),ta=(0,n.useCallback)(e=>{if(!M)return;let t={...M,masterTimelineLoopRegion:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),tn=(0,n.useCallback)(e=>{if(!M)return;let t={...M,trackSettings:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),ti=(0,n.useCallback)(e=>{if(!M)return;let t={...M,trackControlsPanelWidth:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),ts=(0,n.useCallback)(e=>{if(!M)return;let t={...M,mediaBinWidth:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),tc=(0,n.useCallback)(e=>{if(!M)return;let t={...M,waveformMode:e,updatedAt:Date.now()};J(t),eN(t)},[M,J,eN]),{uiMode:tl,setMode:td,nextMode:tu,previousMode:tp}
1=function(e,t="organization"){let[r,o]=(0,n.useState)(t),a=(0,n.useCallback)(t=>{console.log(`Setting UI mode to: ${t}`),o(t),e&&e({type:"SET_MODE",payload:{mode:t}})},[e]);return{uiMode:r,setMode:a,nextMode:(0,n.useCallback)(()=>{o(t=>{let r="organization"===t?"voice-enabled":"voice-enabled"===t?"preview":"organization";return e&&e({type:"SET_MODE",payload:{mode:r}}),r})},[e]),previousMode:(0,n.useCallback)(()=>{o(t=>{let r="preview"===t?"voice-enabled":"voice-enabled"===t?"organization":"preview";return e&&e({type:"SET_MODE",payload:{mode:r}}),r})},[e])}}(S,_.mode),tg=(0,n.useCallback)(async e=>{try{await C(e),console.log(`[ProjectProvider] Successfully deleted project ${e} from backend/persistence.`),(0,b.trackEvent)("project_deleted",{projectId:e,source:"user_delete"}),S({type:"DELETE_PROJECT",payload:{projectId:e}})}catch(t){throw console.error(`[ProjectProvider] Error deleting project ${e}:`,t),S({type:"SET_ERROR",payload:{error:`Failed to delete project: ${t instanceof Error?t.message:String(t)}`}}),t}},[C]),tf=(0,n.useMemo)(()=>({projects:_.projects,currentProject:M,projectId:q,isLoading:_.isLoading,error:_.error??("/projects"===w?A:null)??null,lastSaved:_.lastSaved,isSaving:_.isSaving}),[_.projects,M,q,_.isLoading,_.error,A,w,_.lastSaved,_.isSaving]),tm=(0,n.useCallback)(async(e,t,r="cloud")=>{if("cloud"===r&&("authenticated"!==k||!P?.user?.id))return console.error("User is not authenticated, cannot create cloud project."),S({type:"SET_ERROR",payload:{error:"Your session has expired. Please sign in again to create a cloud project."}}),null;let o=P?.user?.id||"local-user",a=await U(e,o,r);return a?(console.log(`[ProjectProvider] createProject successful (mode: ${r}), dispatching CREATE_PROJECT_SUCCESS`),(0,b.trackEvent)("project_created",{projectId:a.id,mode:r}),S({type:"CREATE_PROJECT_SUCCESS",payload:{project:a}}),a):null},[U,P,S,k]),th=(0,n.useMemo)(()=>({createProject:tm,setCurrentProject:N,updateCoreProjectState:J,getLatestProjectState:W,addScene:eV,removeScene:eH,reorderScenes:eY,duplicateScene:eX,duplicateScenes:eZ,updateSceneText:eQ,updateSceneAudio:e0,updateSceneMedia:er,updateScenePosition:e_,updateSceneVolume:eP,setProjectTitle:F,saveCurrentProject:eJ,loadProject:B,deleteProject:tg,deleteAllProjects:e8,refreshProjects:eU,uiMode:tl,setMode:td,nextMode:tu,previousMode:tp,storeAllMedia:ez,toggleLetterboxing:e7,isStoringMedia:!1,setProjectAspectRatio:G,debouncedSaveProject:eN,updateSceneVoiceoverStartTime:e1,updateSceneTransform:e4,updateSceneAutomation:e2,updateMasterPreviewSize:e9,updateMasterPreviewLocked:te,setSceneScale:tt,setMasterTimelineZoomLevel:tr,setMasterTimelineViewportStart:to,setMasterTimelineLoopRegion:ta,setTrackSettings:tn,setTrackControlsPanelWidth:ti,setMediaBinWidth:ts,setWaveformMode:tc,setViewMode:eq,setIsMasterOnlyMode:eW,addVoiceover:e5,updateVoiceover:e6,removeVoiceover:e3}),[tm,N,J,W,eV,eH,eY,eX,eZ,eQ,e0,er,e_,eP,F,eJ,B,tg,e8,eU,tl,td,tu,tp,ez,e7,G,eN,e1,e4,e2,e9,te,tt,tr,to,ta,tn,ti,ts,tc,eq,eW,e5,e6,e3]),ty=(0,n.useMemo)(()=>({...tf,...th}),[tf,th]);return(0,a.jsx)(eC.Provider,{value:ty,children:e})}function ex(){let e=(0,n.useContext)(eC);if(void 0===e)throw Error("useProject must be used within a ProjectProvider");return{...e,_debug:()=>({currentProject:e.currentProject,isLoading:e.isLoading,error:e.error,isSaving:e.isSaving})}}function eL(e,...t){for(let r of t)if(r)for(let t of Object.keys(r)){let o=r[t],a=e[t];null!=o&&(o&&"object"==typeof o&&!Array.isArray(o)?e[t]=eL(a&&"object"==typeof a&&!Array.isArray(a)?a:{},o):e[t]=o)}return e}},34467:(e,t,r)=>{r.d(t,{M:()=>o});function o(){window.location.reload()}},44847:(e,t,r)=>{r.d(t,{Kb:()=>p,Yv:()=>u,r$:()=>d});var o=r(34467);let a="fc-chunk-error-reloaded",n=/(Loading chunk [\w-]+ failed|ChunkLoadError|Failed to fetch dynamically imported module|Importing a module script failed)/i,i=!1,s=null;function c(e){return e instanceof Error?e.message:"string"==typeof e?e:e&&"object"==typeof e&&"message"in e?String(e.message??""):String(e??"")}function l(e,t){if(i)return!1;i=!0;try{if("1"===sessionStorage.getItem(a))return!1;sessionStorage.setItem(a,"1")}catch{return!1}return console.warn(`[ChunkErrorRecovery] Stale chunk detected via ${e} (${t.slice(0,120)}); reloading for the current deploy.`),(0,o.M)(),!0}function d(e,t){if(!("ChunkLoadError"===(e&&"object"==typeof e&&"name"in e?String(e.name??""):"")||n.test(c(e))))return!1;let r=c(e);return"u">typeof navigator&&!1===navigator.onLine?(s=r,!0):l(t,r)}function u(){if(null===s)return;let e=s;s=null,l("online-after-offline-chunk-failure",e)}
1function p(){try{sessionStorage.removeItem(a)}catch{}}},46699:(e,t,r)=>{function o(){return window.__AUTOSHORTS_UNAVAILABLE_PROJECTS__||(window.__AUTOSHORTS_UNAVAILABLE_PROJECTS__=new Set),window.__AUTOSHORTS_UNAVAILABLE_PROJECTS__}function a(e){e&&o().add(e)}function n(e){e&&o().delete(e)}function i(e){return!!e&&o().has(e)}r.d(t,{Ed:()=>i,JG:()=>a,bE:()=>n})},57396:(e,t,r)=>{r.d(t,{R:()=>i,z:()=>n});var o=r(40554);async function a(){let e=await (0,o.getMediaAuthToken)();return e?{Authorization:`Bearer ${e}`}:{}}async function n(e,t){try{let r=await fetch(`/api/v1/voice/audio/${e}/${t}?audio_type=extracted_video_audio`,{headers:await a(),credentials:"include"});if(r.ok){let e=await r.json();return{url:e.exists&&e.url?e.url:null,error:null}}let o=`Extracted-audio lookup failed: HTTP ${r.status} ${r.statusText}`;return console.warn("[SCENE-AUDIO]",o,{sceneId:t?.slice(-8)}),{url:null,error:o}}catch(r){let e=`Extracted-audio lookup failed: ${r instanceof Error?r.message:"Unknown error"}`;return console.warn("[SCENE-AUDIO]",e,{sceneId:t?.slice(-8)}),{url:null,error:e}}}async function i(e,t){try{let{fetchAPI:o}=await Promise.resolve().then(r.bind(r,92575)),a=await o(`/projects/${e}/scenes/${t}/extract-audio`,{method:"POST"},6e4);if(!a.success){let e=a.error?.message||"Failed to extract audio";return console.error("[EXTRACT-AUDIO] API error:",e),{success:!1,message:e}}return a.data}catch(e){return console.error("[EXTRACT-AUDIO] Request failed:",e),{success:!1,message:e instanceof Error?e.message:"Failed to extract audio"}}}},67705:(e,t,r)=>{r.d(t,{E:()=>i,I:()=>s});var o=r(82571);function a(e){return"string"==typeof e&&e.startsWith("blob:")}function n(e){let t=e.media;return[t?.storedUrl,t?.url,e.url,t?.originalUrl].find(e=>"string"==typeof e&&!a(e))}function i(e,t){let r;if(!t||t.id!==e.id)return e;let i=0===(r=(0,o.$M)()).sceneIds.length||Date.now()-r.timestamp>=o.Rs?new Set:new Set(r.sceneIds),s=e.scenes??[],c=new Set(s.map(e=>e.id)),l=[...s];(t.scenes??[]).forEach((e,t)=>{if(!e?.id)return;if(c.has(e.id)){let t,r,o,i,s,c,d=l.findIndex(t=>t.id===e.id),u=l[d];u&&(t=u.media,r=!0===u.isLoading||t?.status==="uploading"||t?.isStorageBacked===!1&&[u.url,t?.url,t?.originalUrl].some(a),o=!0!==e.isLoading&&e.media?.status!=="uploading"&&!!(e.media?.storageKey||n(e)),r&&o)&&(l[d]=(i=n(e),s=e.media,c=u.media?{...u.media,...s,url:s?.url??s?.storedUrl??i??u.media.url,originalUrl:s?.originalUrl??i,status:s?.status??"ready",isStorageBacked:s?.isStorageBacked??!0}:s,{...u,url:e.url??i??u.url,media:c,isLoading:!1,error:e.error,updatedAt:e.updatedAt??u.updatedAt}));return}if(i.has(e.id))return;let r=Math.min(Math.max(t,0),l.length);l.splice(r,0,e),c.add(e.id)});let d=e.audio??e.voiceovers??[],u=t.audio??t.voiceovers??[],p=new Set(d.map(e=>e.id)),g=[...d,...u.filter(e=>!(!e?.id||p.has(e.id)||i.has(e.id)||i.has(e.sourceSceneId??"")||i.has(e.sceneId??"")))];return{...e,scenes:l,audio:g,voiceovers:g}}function s(e,t,r){let o=t?.id===e.id?i(t,e):e;return{...o,isMasterOnlyMode:r.isMasterOnlyMode??o.isMasterOnlyMode,viewMode:r.viewMode??o.viewMode}}},74640:(e,t,r)=>{r.d(t,{FD:()=>c,UO:()=>i,iV:()=>l,iy:()=>s});let o="autoShorts_recentlyDeletedProjects";function a(e){window.__AUTOSHORTS_RECENTLY_DELETED_PROJECTS__=e;try{sessionStorage.setItem(o,JSON.stringify(e))}catch{}}function n(){window.__AUTOSHORTS_RECENTLY_DELETED_PROJECTS__||(window.__AUTOSHORTS_RECENTLY_DELETED_PROJECTS__=function(){try{let e=sessionStorage.getItem(o);if(!e)return null;let t=JSON.parse(e);if(!t||"object"!=typeof t||Array.isArray(t))return null;let r={};for(let[e,o]of Object.entries(t))"number"==typeof o&&(r[e]=o);return r}catch{return null}}()??{});var e=window.__AUTOSHORTS_RECENTLY_DELETED_PROJECTS__;let t=Date.now(),r={};for(let[o,a]of Object.entries(e))t-a<6e5&&(r[o]=a);return r}function i(e){if(!e)return;let t=n();t[e]=Date.now(),a(t)}function s(e){if(!e)return;let t=n();e in t&&(delete t[e],a(t))}function c(e){return!!e&&e in n()}function l(e){if(0===e.length)return e;let t=n();return 0===Object.keys(t).length?e:e.filter(e=>!(e.id in t))}},76496:(e,t,r)=>{r.d(t,{$C:()=>o.generateId,mN:()=>a,ue:()=>n});var o=r(12458);let a={userZoom:1,panX:0,panY:0,rotation:0},n={projects:[],currentProject:null,error:null,isLoading:!1,isSaving:!1,lastSaved:null,mode:"organization"}},79884:(e,t,r)=>{r.d(t,{W:()=>o});function o(e="u"<typeof navigator?"":navigator.userAgent||"",t="u"<typeof navigator?"":navigator?.userAgentData?.platform||navigator.platform||"",r="u"<typeof navigator||"number"!=typeof navigator.maxTouchPoints?0:navigator.maxTouchPoints){let a=e.toLowerCase(),n=t.toLowerCase(),i=`${n} ${a}`,s=a.includes("safari")&&!a.includes("chrome")&&!a.includes("chromium")&&!a.includes("crios")&&!a.includes("edg")&&!a.includes("opr");return a||n?/android|iphone|ipad|ipod/.test(a)||a.includes("macintosh")&&r>1||/\bmobi/.test(a)?"html5":i.includes("windows")||i.includes("win32")||i.includes("win64")?"webgpu":i.includes("linux")||i.includes("x11")||s?"html5":"webgpu":"webgpu"}},99269:(e,t,r)=>{r.d(t,{q9:()=>o,storeAllProjectMedia:()=>n}),r(71701);let o=e=>{if(!e||!e.includes("v.redd.it"))return null;try{let t=e.match(/v\.redd\.it\/([^/]+)/);if(!t)return null;let r=t[1],o=e.includes("/CMAF_"),a=`https://v.redd.it/${r}/${o?"CMAF_AUDIO_128.mp4":"DASH_audio.mp4"}`;return`/api/proxy-audio?url=${encodeURIComponent(a)}`}catch{return null}},a=async(e,t,o)=>{try{let a;if(console.log(`[MEDIA-DEBUG] ========== Starting media storage for scene ${e.id} ==========`),!e||!e.id||!e.media||!e.media.url)return console.error("[MEDIA-DEBUG] Cannot store media: Missing scene data, ID, or media URL"),!1;if(e.media.isStorageBacked||e.media.storageKey)return console.log(`[MEDIA-DEBUG] Media already stored in R2 (isStorageBacked: ${!!e.media.isStorageBacked}, storageKey: ${e.media.storageKey}), skipping storage operation`),!0;let n=e.media.url;console.log(`[MEDIA-DEBUG] Storing media for scene ${e.id} from URL: ${n}`),console.log("[MEDIA-DEBUG] Current media state:",JSON.stringify({type:e.media.type,isStorageBacked:e.media.isStorageBacked,storageKey:e.media.storageKey,storedUrl:e.media.storedUrl}));let i=e.media.type||(a=n.split(/[?#]/)[0].toLowerCase(),[".jpg",".jpeg",".png",".gif",".webp"].some(e=>a.endsWith(e))?"image":[".mp4",".webm",".mov"].some(e=>a.endsWith(e))?"video":null);if(!i)return console.error(`[MEDIA-DEBUG] Cannot determine media type for URL: ${n}`),!1;console.log(`[MEDIA-DEBUG] Determined media type: ${i}`);let{storeMediaContent:s}=await Promise.resolve().then(r.bind(r,63557));console.log("[MEDIA-DEBUG] Imported storeMediaContent function"),console.log("[MEDIA-DEBUG] Calling API to store media with params:",JSON.stringify({url:n,project_id:t,scene_id:e.id,media_type:i,create_thumbnail:!0}));let c=await s({url:n,project_id:t,scene_id:e.id,media_type:i,create_thumbnail:!0});if(c.error||!c.data)return console.error("[MEDIA-DEBUG] Failed to store media content:",c.error),!1;let l=c.data;console.log("[MEDIA-DEBUG] Media stored successfully. Response:",JSON.stringify(l)),console.log("[MEDIA-DEBUG] Status URL received:",l.status_url);let d={...e.media,storageTaskId:l.task_id,storageStatusUrl:l.status_url,isStorageBacked:!1,storedAt:void 0};return console.log("[MEDIA-DEBUG] Updating scene with media data:",JSON.stringify(d)),console.log("[MEDIA-DEBUG] New URL to be used for media:",d.url),o(e.id,d),console.log(`[MEDIA-DEBUG] ========== Media storage completed for scene ${e.id} ==========`),!0}catch(e){return console.error("[MEDIA-DEBUG] Error storing scene media:",e),!1}},n=async(e,t)=>{if(!e||!e.id||!e.scenes||!Array.isArray(e.scenes))return console.error("Invalid project data for media storage"),{total:0,success:0,failed:0};let r=e.id,o=e.scenes.filter(e=>e&&e.id&&e.media&&e.media.url&&!e.media.isStorageBacked&&!e.media.storageKey);if(console.log(`Processing ${o.length} scenes with unstored media in project ${r}`),0===o.length)return{total:0,success:0,failed:0};let n=0,i=0;for(let e of o)try{console.log(`Processing scene ${e.id} with media URL: ${e.media.url}`),await a(e,r,t)?(n++,console.log(`Successfully stored media for scene ${e.id} (${n}/${o.length})`)):(i++,console.warn(`Failed to store media for scene ${e.id}`)),await new Promise(e=>setTimeout(e,1e3))}catch(t){i++,console.error(`Error processing scene ${e.id}:`,t)}let s={total:o.length,success:n,failed:i};return console.log("Completed media storage process. Results:",s),s}}}]);
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.