import{b as i,g as h}from"./settings-CgBxHrrF.js";import{n as P,a as j}from"./downloadIntent-Dv31jC2S.js";const z="org.gdown.nativehost";async function J(e){return i.runtime.sendNativeMessage(z,{action:"addUri",...e})}async function Z(){return i.runtime.sendNativeMessage(z,{action:"focus"})}const C="history";async function ee(){const t=(await i.storage.local.get([C]))[C];return Array.isArray(t)?t:[]}async function te(e){await i.storage.local.set({[C]:e.slice(0,300)})}async function ne(e){const t=await ee(),n=t.findIndex(r=>r.gid===e.gid);n>=0?t[n]=e:t.unshift(e),await te(t)}function G(e,t){const n=Array.isArray(e?.responseHeaders)?e.responseHeaders:[],r=t.toLowerCase(),o=n.find(s=>String(s?.name||"").toLowerCase()===r);return String(o?.value||"")}function re(e){const t=e.toLowerCase();return t?t.includes("application/vnd.apple.mpegurl")||t.includes("application/x-mpegurl")||t.includes("audio/mpegurl")?"m3u8":t.includes("video/mp4")?"mp4":t.includes("application/octet-stream")&&t.includes("m3u8")?"m3u8":t.includes("hls")?"hls":"unknown":"unknown"}function oe(e){const t=String(e||"").toLowerCase();return t.includes(".m3u8")?"m3u8":t.includes(".m3u")?"m3u":t.includes(".mp4")?"mp4":t.includes("m3u8")?"m3u8":t.includes("hls")?"hls":"unknown"}function B(e,t){const n=re(t);return n!=="unknown"?n:oe(e)}function ie(e){if(!e?.url)return!1;const t=String(e?.method||"").toUpperCase();if(t&&t!=="GET")return!1;const n=Number(e?.statusCode||0);if(n>0&&(n<200||n>299))return!1;const r=String(e?.type||"");if(!["xmlhttprequest","media","other","main_frame","sub_frame","fetch"].includes(r))return!1;const o=G(e,"content-type");return B(e.url,o)!=="unknown"}function se(e,t=""){const n=G(e,"content-type"),r=String(e?.url||""),o=B(r,n),s=Number.isInteger(e?.tabId)?Number(e.tabId):-1,a=Date.now();return{id:`${a}:${s}:${o}:${r}`,url:r,kind:o,tabId:s,pageUrl:String(e?.documentUrl||e?.initiator||""),referer:String(t||e?.documentUrl||e?.initiator||""),contentType:n,detectedAt:a}}function q(e){try{const t=new URL(e);return`${t.protocol}//${t.host}${t.pathname}`.toLowerCase()}catch{return String(e||"").toLowerCase()}}const b="media_candidates",ae=200;async function W(){const t=(await i.storage.local.get([b]))[b];return Array.isArray(t)?t:[]}async function ue(e){const t=[...e].sort((n,r)=>r.detectedAt-n.detectedAt);await i.storage.local.set({[b]:t.slice(0,ae)})}async function ce(e,t){const n=await W(),r=n.findIndex(o=>{try{const s=new URL(o.url);return`${s.protocol}//${s.host}${s.pathname}`.toLowerCase()===t}catch{return o.url.toLowerCase()===t}});r>=0?n[r]={...n[r],...e,detectedAt:Date.now()}:n.unshift(e),await ue(n)}async function le(){await i.storage.local.set({[b]:[]})}const k=8e3,de=7e3,U="gomdown-helper-download-context-menu-option",m=new Map,M=new Map,I=new Map,L=new Map,w=new Map,R=new Map,A=new Map;let $=!1,E=!1,_=!1,p=null;const K="bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/best",fe=[{hosts:["youtube.com","www.youtube.com","m.youtube.com","youtu.be"],extractor:"yt-dlp",format:K}];function x(e){try{const t=new URL(e),n=(t.pathname||"/").replace(/\/+$/,"")||"/";return`${t.protocol}//${t.host}${n}`.toLowerCase()}catch{return String(e||"").toLowerCase()}}function f(e){const t=Date.now();for(const[n,r]of e.entries())r<=t&&e.delete(n)}function Y(e){const t=Date.now()+k;M.set(P(e),t),I.set(x(e),t)}function Q(e){!Number.isInteger(e)||(e??-1)<0||R.set(e,Date.now()+k)}function pe(e){f(M),f(I);const t=P(e);return M.has(t)||I.has(x(e))}function me(e){return f(R),!Number.isInteger(e)||(e??-1)<0?!1:R.has(e)}function we(e){return f(L),L.has(x(e))}function ge(e){L.set(x(e),Date.now()+de)}function he(e){return f(w),!!e&&w.has(e)}function ye(e){e&&w.set(e,Date.now()+k)}function Se(e){f(A);const t=q(e);return A.has(t)}function be(e){A.set(q(e),Date.now()+k)}async function ke(){try{await Z()}catch{}}async function v(e){await i.notifications.create(`gomdown-notice-${Date.now()}`,{type:"basic",iconUrl:"/images/icon-large.png",title:"Gomdown Helper",message:e}).catch(()=>null)}async function d(e,t="",n,r,o,s){if(we(e))return{ok:!1,error:"duplicate transfer suppressed"};const a=await h();if(!a.extensionStatus)return{ok:!1,error:"extension disabled"};if(!a.motrixAPIkey)return{ok:!1,error:"motrixAPIkey is not set"};try{const u=await J({url:e,rpcPort:a.motrixPort,rpcSecret:a.motrixAPIkey,referer:t,split:64,out:o?.trim()||void 0,cookie:s?.cookie?.trim()||void 0,userAgent:s?.userAgent?.trim()||void 0,authorization:s?.authorization?.trim()||void 0,proxy:s?.proxy?.trim()||void 0,extractor:n==="yt-dlp"?"yt-dlp":void 0,format:n==="yt-dlp"?r||K:void 0});if(!u?.ok)return{ok:!1,error:u?.error||"native host addUri failed"};a.activateAppOnDownload&&await ke(),ge(e);const c=String(u?.gid||u?.requestId||`pending-${Date.now()}`),l=(()=>{try{return new URL(e).pathname}catch{return""}})().split("/").filter(Boolean).pop()||e;return await ne({gid:c,downloader:"native",startTime:new Date().toISOString(),icon:"/images/32.png",name:decodeURIComponent(l),path:null,status:u?.pending?"queued":"downloading",size:0,downloaded:0}),a.enableNotifications&&await i.notifications.create(`gomdown-transfer-${Date.now()}`,{type:"basic",iconUrl:"/images/icon-large.png",title:"Gomdown Helper",message:"Download sent to gdown"}),{ok:!0}}catch(u){return{ok:!1,error:String(u)}}}function F(e){try{return new URL(e).hostname.toLowerCase()}catch{return""}}function V(e,t="",n=""){const r=[F(e),F(t)].filter(Boolean);for(const s of fe)if(r.some(a=>s.hosts.includes(a)))return{extractor:s.extractor,format:s.format};const o=n.toLowerCase();return o==="m3u8"||o==="m3u"||o==="hls"?{extractor:"yt-dlp",format:"best"}:o==="mp4"?{extractor:"aria2"}:{extractor:"aria2"}}function O(e,t){const n=t.toLowerCase(),r=e.find(o=>String(o?.name||"").toLowerCase()===n);return String(r?.value||"").trim()}async function xe(e){if(e.type!=="main_frame"||(e.method||"").toUpperCase()!=="GET"||typeof e.statusCode=="number"&&(e.statusCode<200||e.statusCode>299))return!1;const t=await h();if(!t.extensionStatus||!t.motrixAPIkey)return!1;const n=String(Array.isArray(e?.responseHeaders)&&e.responseHeaders.find(o=>String(o?.name||"").toLowerCase()==="content-length")?.value||""),r=Number(n||0);return t.minFileSize>0&&r>0&&r=0){const X=await i.tabs.get(u.tabId).catch(()=>null);c=String(X?.title||"").trim()}const S=Ie(u.url,u.kind,c),l={...u,pageTitle:c||void 0,cookie:s||void 0,userAgent:a||void 0,suggestedOut:S||void 0};await ce(l,q(l.url)),be(l.url),l.tabId>=0&&await i.tabs.sendMessage(l.tabId,{type:"media:captured",kind:l.kind,url:l.url,suggestedOut:l.suggestedOut||""}).catch(()=>null)}function Ue(e){let t=e.trim().replace(/[\\/:*?"<>|]/g,"_").replace(/\s+/g," ").replace(/^\.+/,"").replace(/\.+$/,"");return t.length>180&&(t=t.slice(0,180).trim()),t}function Me(e){try{return new URL(e).pathname.toLowerCase().match(/\.([a-z0-9]{2,6})(?:$|[?#])/)?.[1]||""}catch{return""}}function Ie(e,t,n){const r=Ue(n||""),s=Me(e)||(t==="mp4"||t==="m3u8"||t==="m3u"||t==="hls"?"mp4":"");return r?!s||r.toLowerCase().endsWith(`.${s}`)?r:`${r}.${s}`:""}async function y(){const e=i.downloads;if(!e.setShelfEnabled)return;const t=await h();if(!t.extensionStatus)return;const n=t.useNativeHost?!1:!t.hideChromeBar;await e.setShelfEnabled(n)}function H(){E||(E=!0,i.downloads.onCreated.addListener(async e=>{await y();const t=e,n=t.finalUrl||t.url||"";!pe(n)&&!me(t.tabId)||(await i.downloads.cancel(e.id).catch(()=>null),await i.downloads.erase({id:e.id}).catch(()=>null),await i.downloads.removeFile(e.id).catch(()=>null))}))}function T(){$||($=!0,i.webRequest.onSendHeaders.addListener(e=>{m.set(e.requestId,e)},{urls:[""]},["requestHeaders","extraHeaders"]),i.webRequest.onErrorOccurred.addListener(e=>{m.delete(e.requestId),w.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onCompleted.addListener(e=>{m.delete(e.requestId),w.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onHeadersReceived.addListener(e=>{ve(e),Ce(e)},{urls:[""]},["responseHeaders"]))}async function N(e,t){console.log("[gomdown-helper] context menu clicked",{menuItemId:e?.menuItemId,linkUrl:e?.linkUrl,srcUrl:e?.srcUrl,frameUrl:e?.frameUrl,pageUrl:e?.pageUrl,tabUrl:t?.url});const n=e?.menuItemId;if(n!=null&&String(n)!==U)return;const r=String(e?.linkUrl||e?.srcUrl||"").trim(),o=String(e?.frameUrl||e?.pageUrl||t?.url||"").trim(),a=String(r||o||"").trim();if(!a||/^(about:|chrome:|chrome-extension:|edge:|brave:)/i.test(a)){await v("다운로드 가능한 URL을 찾지 못했습니다.");return}const u=V(a,String(e?.pageUrl||t?.url||""),""),c=await d(a,String(e?.pageUrl||t?.url||""),u.extractor,u.format);if(!c.ok){await v(`전송 실패: ${c.error||"unknown error"}`);return}await v(u.extractor==="yt-dlp"?"페이지 URL을 yt-dlp로 gdown에 전송했습니다.":"gdown으로 전송했습니다.")}function Le(){if(typeof chrome>"u"||!chrome.contextMenus?.create){i.contextMenus.create({id:U,title:"Download with Gomdown",visible:!0,contexts:["all"]});return}chrome.contextMenus.create({id:U,title:"Download with Gomdown",contexts:["all"]},()=>{chrome.runtime.lastError})}function D(){_||(typeof chrome<"u"&&chrome.contextMenus?.onClicked?chrome.contextMenus.onClicked.addListener((e,t)=>{N(e,t)}):i.contextMenus.onClicked.addListener((e,t)=>{N(e,t)}),_=!0)}async function Re(){const e=await h();if(!e.extensionStatus||!e.showContextOption){await i.contextMenus.removeAll().catch(()=>null);return}await i.contextMenus.removeAll().catch(()=>null),Le()}function g(){return p||(p=Re().finally(()=>{p=null}),p)}i.runtime.onMessage.addListener((e,t)=>{if(e?.type==="capture-link-download"){const n=String(e?.url||"").trim();if(!n)return Promise.resolve({ok:!1,error:"url is empty"});const r=Number(t?.tab?.id);return d(n,String(e?.referer||"")).then(o=>(o.ok&&(Y(n),Q(r)),o))}if(e?.type==="media:list")return W().then(n=>({ok:!0,items:n}));if(e?.type==="media:clear")return le().then(()=>({ok:!0}));if(e?.type==="media:enqueue"){const n=String(e?.url||"").trim(),r=String(e?.kind||"").trim(),o=String(e?.suggestedOut||"").trim(),s=String(e?.referer||"").trim(),a=String(e?.cookie||"").trim(),u=String(e?.userAgent||"").trim();if(!n)return Promise.resolve({ok:!1,error:"url is empty"});const c=V(n,s,r);return d(n,s,c.extractor,c.format,o,{cookie:a,userAgent:u}).then(S=>S)}if(e?.type==="page:enqueue-ytdlp")return i.tabs.query({active:!0,currentWindow:!0}).then(async n=>{const r=n[0],o=String(r?.url||"").trim();return o?d(o,o,"yt-dlp"):{ok:!1,error:"active tab url is empty"}});if(e?.type==="page:enqueue-ytdlp-url"){const n=String(e?.url||"").trim(),r=String(e?.referer||n).trim();return n?d(n,r||n,"yt-dlp"):Promise.resolve({ok:!1,error:"url is empty"})}});i.runtime.onInstalled.addListener(()=>{console.log("[gomdown-helper] onInstalled"),T(),H(),D(),g(),y()});i.runtime.onStartup.addListener(()=>{console.log("[gomdown-helper] onStartup"),T(),H(),D(),g(),y()});i.storage.onChanged.addListener((e,t)=>{t==="sync"&&((e.hideChromeBar||e.useNativeHost||e.extensionStatus)&&(y(),g()),e.showContextOption&&g())});T();H();D();g();y();console.log("[gomdown-helper] service worker initialized");