diff --git a/packages/chrome/assets/index.ts-BGLNJwsP.js b/packages/chrome/assets/index.ts-BGLNJwsP.js deleted file mode 100644 index 04f2aec..0000000 --- a/packages/chrome/assets/index.ts-BGLNJwsP.js +++ /dev/null @@ -1 +0,0 @@ -import{b as w}from"./browser-polyfill-CZ_dLIqp.js";import{i as o,n as h}from"./downloadIntent-Dv31jC2S.js";const p=8e3,e=new Map;function m(){const r=Date.now();for(const[n,t]of e.entries())t<=r&&e.delete(n)}async function i(r,n){const t=h(r,window.location.href);if(!t)return!1;if(m(),e.has(t))return!0;e.set(t,Date.now()+p);try{if((await w.runtime.sendMessage({type:"capture-link-download",url:t,referer:n||document.referrer||window.location.href}))?.ok)return!0}catch{}return e.delete(t),!1}function u(r){return r?r instanceof HTMLAnchorElement?r:r instanceof Element?r.closest("a[href]"):null:null}function a(r){return!!(r.metaKey||r.ctrlKey||r.shiftKey||r.altKey)}async function d(r){if(r.defaultPrevented||a(r))return;const n=u(r.target);if(!n)return;const t=n.href||"";!t||!o(t,window.location.href)||(r.preventDefault(),r.stopImmediatePropagation(),r.stopPropagation(),await i(t,document.referrer||window.location.href))}function l(r){const n=u(r.target);if(!n)return;const t=n.href||"";!t||!o(t,window.location.href)||a(r)||(r.preventDefault(),r.stopImmediatePropagation(),r.stopPropagation(),i(t,document.referrer||window.location.href))}document.addEventListener("pointerdown",r=>{r.button===0&&l(r)},!0);document.addEventListener("mousedown",r=>{r.button===0&&l(r)},!0);document.addEventListener("click",r=>{r.button===0&&d(r)},!0);document.addEventListener("keydown",r=>{if(r.key!=="Enter"||r.defaultPrevented||a(r))return;const n=u(r.target);if(!n)return;const t=n.href||"";!t||!o(t,window.location.href)||(r.preventDefault(),r.stopImmediatePropagation(),r.stopPropagation(),i(t,document.referrer||window.location.href))},!0);document.addEventListener("auxclick",r=>{r.button===1&&d(r)},!0);function g(){try{const r=window.open.bind(window);window.open=function(t,f,s){const c=String(t||"").trim();return c&&o(c,window.location.href)?(i(c,window.location.href),null):r(t,f,s)}}catch{}try{const r=HTMLAnchorElement.prototype.click;HTMLAnchorElement.prototype.click=function(){const t=this.href||this.getAttribute("href")||"";if(t&&o(t,window.location.href)){i(t,document.referrer||window.location.href);return}r.call(this)}}catch{}}g(); diff --git a/packages/chrome/assets/index.ts-U2ACoZ75.js b/packages/chrome/assets/index.ts-U2ACoZ75.js deleted file mode 100644 index 6951940..0000000 --- a/packages/chrome/assets/index.ts-U2ACoZ75.js +++ /dev/null @@ -1 +0,0 @@ -import{b as i}from"./browser-polyfill-CZ_dLIqp.js";import{n as E,a as B}from"./downloadIntent-Dv31jC2S.js";import{g as m}from"./settings-Bo6W9Drl.js";const N="org.gdown.nativehost";async function W(e){return i.runtime.sendNativeMessage(N,{action:"addUri",...e})}async function Y(){return i.runtime.sendNativeMessage(N,{action:"focus"})}const b="history";async function K(){const t=(await i.storage.local.get([b]))[b];return Array.isArray(t)?t:[]}async function Q(e){await i.storage.local.set({[b]:e.slice(0,300)})}async function V(e){const t=await K(),n=t.findIndex(r=>r.gid===e.gid);n>=0?t[n]=e:t.unshift(e),await Q(t)}function F(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 X(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 j(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 P(e,t){const n=X(t);return n!=="unknown"?n:j(e)}function J(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=F(e,"content-type");return P(e.url,o)!=="unknown"}function Z(e,t=""){const n=F(e,"content-type"),r=String(e?.url||""),o=P(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 y="media_candidates",ee=200;async function G(){const t=(await i.storage.local.get([y]))[y];return Array.isArray(t)?t:[]}async function te(e){const t=[...e].sort((n,r)=>r.detectedAt-n.detectedAt);await i.storage.local.set({[y]:t.slice(0,ee)})}async function ne(e,t){const n=await G(),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 te(n)}async function re(){await i.storage.local.set({[y]:[]})}const h=8e3,oe=7e3,C="gomdown-helper-download-context-menu-option",l=new Map,v=new Map,M=new Map,x=new Map,f=new Map,I=new Map,L=new Map;let T=!1,D=!1,$=!1,c=null;function S(e){try{const t=new URL(e),n=(t.pathname||"/").replace(/\/+$/,"")||"/";return`${t.protocol}//${t.host}${n}`.toLowerCase()}catch{return String(e||"").toLowerCase()}}function u(e){const t=Date.now();for(const[n,r]of e.entries())r<=t&&e.delete(n)}function O(e){const t=Date.now()+h;v.set(E(e),t),M.set(S(e),t)}function z(e){!Number.isInteger(e)||(e??-1)<0||I.set(e,Date.now()+h)}function ie(e){u(v),u(M);const t=E(e);return v.has(t)||M.has(S(e))}function se(e){return u(I),!Number.isInteger(e)||(e??-1)<0?!1:I.has(e)}function ae(e){return u(x),x.has(S(e))}function ue(e){x.set(S(e),Date.now()+oe)}function ce(e){return u(f),!!e&&f.has(e)}function le(e){e&&f.set(e,Date.now()+h)}function de(e){u(L);const t=q(e);return L.has(t)}function fe(e){L.set(q(e),Date.now()+h)}async function pe(){try{await Y()}catch{}}async function U(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){if(ae(e))return{ok:!1,error:"duplicate transfer suppressed"};const o=await m();if(!o.extensionStatus)return{ok:!1,error:"extension disabled"};if(!o.motrixAPIkey)return{ok:!1,error:"motrixAPIkey is not set"};try{const s=await W({url:e,rpcPort:o.motrixPort,rpcSecret:o.motrixAPIkey,referer:t,split:64,extractor:n==="yt-dlp"?"yt-dlp":void 0,format:n==="yt-dlp"?r||"bestvideo*+bestaudio/best":void 0});if(!s?.ok)return{ok:!1,error:s?.error||"native host addUri failed"};o.activateAppOnDownload&&await pe(),ue(e);const a=String(s?.gid||s?.requestId||`pending-${Date.now()}`),g=(()=>{try{return new URL(e).pathname}catch{return""}})().split("/").filter(Boolean).pop()||e;return await V({gid:a,downloader:"native",startTime:new Date().toISOString(),icon:"/images/32.png",name:decodeURIComponent(g),path:null,status:s?.pending?"queued":"downloading",size:0,downloaded:0}),o.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(s){return{ok:!1,error:String(s)}}}async function me(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 m();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{await w();const t=e,n=t.finalUrl||t.url||"";!ie(n)&&!se(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 A(){T||(T=!0,i.webRequest.onSendHeaders.addListener(e=>{l.set(e.requestId,e)},{urls:[""]},["requestHeaders","extraHeaders"]),i.webRequest.onErrorOccurred.addListener(e=>{l.delete(e.requestId),f.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onCompleted.addListener(e=>{l.delete(e.requestId),f.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onHeadersReceived.addListener(e=>{we(e),ge(e)},{urls:[""]},["responseHeaders"]))}async function _(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)!==C)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 U("다운로드 가능한 URL을 찾지 못했습니다.");return}const k=!r&&!!o,g=await d(a,String(e?.pageUrl||t?.url||""),k?"yt-dlp":"aria2");if(!g.ok){await U(`전송 실패: ${g.error||"unknown error"}`);return}await U(k?"페이지 URL을 yt-dlp로 gdown에 전송했습니다.":"gdown으로 전송했습니다.")}function ye(){if(typeof chrome>"u"||!chrome.contextMenus?.create){i.contextMenus.create({id:C,title:"Download with Gomdown",visible:!0,contexts:["all"]});return}chrome.contextMenus.create({id:C,title:"Download with Gomdown",contexts:["all"]},()=>{chrome.runtime.lastError})}function H(){$||(typeof chrome<"u"&&chrome.contextMenus?.onClicked?chrome.contextMenus.onClicked.addListener((e,t)=>{_(e,t)}):i.contextMenus.onClicked.addListener((e,t)=>{_(e,t)}),$=!0)}async function he(){const e=await m();if(!e.extensionStatus||!e.showContextOption){await i.contextMenus.removeAll().catch(()=>null);return}await i.contextMenus.removeAll().catch(()=>null),ye()}function p(){return c||(c=he().finally(()=>{c=null}),c)}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&&(O(n),z(r)),o))}if(e?.type==="media:list")return G().then(n=>({ok:!0,items:n}));if(e?.type==="media:clear")return re().then(()=>({ok:!0}));if(e?.type==="media:enqueue"){const n=String(e?.url||"").trim();return n?d(n,String(e?.referer||"")).then(r=>r):Promise.resolve({ok:!1,error:"url is empty"})}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"}})});i.runtime.onInstalled.addListener(()=>{console.log("[gomdown-helper] onInstalled"),A(),R(),H(),p(),w()});i.runtime.onStartup.addListener(()=>{console.log("[gomdown-helper] onStartup"),A(),R(),H(),p(),w()});i.storage.onChanged.addListener((e,t)=>{t==="sync"&&((e.hideChromeBar||e.useNativeHost||e.extensionStatus)&&(w(),p()),e.showContextOption&&p())});A();R();H();p();w();console.log("[gomdown-helper] service worker initialized"); diff --git a/packages/chrome/assets/index.ts-loader-DMyyuf2n.js b/packages/chrome/assets/index.ts-loader-DMyyuf2n.js deleted file mode 100644 index 6401162..0000000 --- a/packages/chrome/assets/index.ts-loader-DMyyuf2n.js +++ /dev/null @@ -1,13 +0,0 @@ -(function () { - 'use strict'; - - const injectTime = performance.now(); - (async () => { - const { onExecute } = await import( - /* @vite-ignore */ - chrome.runtime.getURL("assets/index.ts-BGLNJwsP.js") - ); - onExecute?.({ perf: { injectTime, loadTime: performance.now() - injectTime } }); - })().catch(console.error); - -})();