diff --git a/CHANGELOG.md b/CHANGELOG.md index b743fec3..676c307a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/lang/zh-CN/ ## [Unreleased] +## [6.5.3](../../compare/v6.5.2...v6.5.3) - 2026-10-17 + +### 新增 + +- 详情页新增独立的“详情鉴定快捷键”插件,可为屏蔽、收藏、已下载和已观看录制单键或 Ctrl / Alt / Shift / Meta 组合键,鉴定按钮内显示对应按键。 +- 设置新增“快捷键”面板,支持冲突提示、清除和即时保存;面板入口随插件开关显示或隐藏,配置可随备份导入和恢复。 +- 从列表打开详情弹窗后,启用的快捷键插件自动聚焦详情 iframe;输入框和可见弹窗内不触发鉴定快捷键。 + ## [6.5.2](../../compare/v6.5.1...v6.5.2) - 2026-10-16 ### 新增 @@ -672,7 +680,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/lang/zh-CN/ - 增加 `escapeHtml()` 修复多处 XSS 风险。 - 加密存储敏感凭据。 -[Unreleased]: ../../compare/v6.5.1...HEAD +[Unreleased]: ../../compare/v6.5.3...HEAD [6.2.1]: ../../compare/v6.2.0...v6.2.1 [6.2.0]: ../../compare/v6.1.1...v6.2.0 [6.1.1]: ../../compare/v6.1.0...v6.1.1 diff --git a/JHS.user.js b/JHS.user.js index ae6ae9c9..1ec05d0c 100644 --- a/JHS.user.js +++ b/JHS.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name JHS // @namespace https://sleazyfork.org/zh-CN/scripts/578503-jhs-ya -// @version 6.5.2 +// @version 6.5.3 // @author JHS Contributors // @description JAV Helper Suite:为 JavDB / JavBus 提供浏览、收藏、筛选、资源检索、数据备份与统计增强。 // @license MIT @@ -70,14 +70,14 @@ // @updateURL https://raw.githubusercontent.com/Teamper/JHS/main/JHS.user.js // ==/UserScript== -(()=>{var Ro=Object.defineProperty;var zd=(o,e,t)=>e in o?Ro(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var d=(o,e)=>Ro(o,"name",{value:e,configurable:!0});var dt=(o,e,t)=>zd(o,typeof e!="symbol"?e+"":e,t);var Nr=class Nr{constructor(e,t={}){if(!e)throw new TypeError("LifecycleScope id is required");this.id=e,this.controller=new AbortController,this.cleanups=new Set,this.requestConsumers=new Set,this.observerCleanups=new Map,this.listenerCount=0,this.observerCount=0,this.disposed=!1,this.generation=0,this.onChange=t.onChange??null}get signal(){return this.controller.signal}listen(e,t,s,a){return this.assertActive(),e.addEventListener(t,s,a),this.listenerCount+=1,this.addCleanup(()=>{e.removeEventListener(t,s,a),this.listenerCount-=1})}ownObserver(e){this.assertActive();let t=this.observerCleanups.get(e);if(t)return t;this.observerCount+=1;let s=this.addCleanup(()=>{e.disconnect(),this.observerCount-=1,this.observerCleanups.delete(e)});return this.observerCleanups.set(e,s),s}releaseObserver(e){this.observerCleanups.get(e)?.()}observe(e,t,s){this.assertActive();let a=new MutationObserver(t);return a.observe(e,s),this.ownObserver(a),a}ownTimeout(e){return this.addCleanup(()=>clearTimeout(e))}ownRequestConsumer(e){return this.assertActive(),this.requestConsumers.add(e),this.emitChange(),this.addCleanup(()=>{this.requestConsumers.delete(e)&&e.release()})}addCleanup(e){this.assertActive();let t=!0,s=d(()=>{t&&(t=!1,this.cleanups.delete(s),e(),this.emitChange())},"wrapped");return this.cleanups.add(s),this.emitChange(),s}nextGeneration(){return this.assertActive(),this.generation+=1,this.generation}canCommit(e){return!this.disposed&&e===this.generation}dispose(){if(!this.disposed){this.disposed=!0,this.controller.abort();for(let e of[...this.cleanups].reverse())e();this.emitChange()}}assertActive(){if(this.disposed)throw new DOMException(`LifecycleScope ${this.id} is disposed`,"AbortError")}snapshot(){return Object.freeze({id:this.id,disposed:this.disposed,listeners:this.listenerCount,observers:this.observerCount,requestConsumers:this.requestConsumers.size,generation:this.generation})}emitChange(){this.onChange?.(this.snapshot())}};d(Nr,"LifecycleScope");var te=Nr;var gs=new WeakSet;function kt(o={},e={}){if(gs.has(o)||gs.has(o.success))return o;let{ui:t,...s}=o,a=["scroll","table","media"].includes(t?.body)?t.body:"scroll";t?.size&&e.getDialogArea&&(s.area=e.getDialogArea(t.size));let r,i=s.success,n=s.end;return s.success=function(l,c){let h=l?.nodeType===1?l:l?.[0]||globalThis.document?.getElementById(`layui-layer${c}`);if(h?.classList){h.classList.add("jhs-dialog","jhs-ui"),h.dataset.jhsDialogBody=a,r=new te(`dialog-shell-${c}`);let u=h.querySelector(".layui-layer-close");u&&(u.setAttribute("role","button"),u.setAttribute("tabindex","0"),u.setAttribute("aria-label","关闭弹窗"),r.listen(u,"keydown",g=>{let m=g.key;(m==="Enter"||m===" ")&&(g.preventDefault(),u.click())}));let p=d(()=>{if(t?.size&&e.getDialogArea){let[m,f]=e.getDialogArea(t.size);Object.assign(h.style,{width:m,height:f});let v=h.querySelector(".layui-layer-content"),b=h.querySelector("iframe");if(b&&v){let w=h.querySelector(".layui-layer-title")?.getBoundingClientRect().height||0;v.style.height=`${Math.max(0,parseFloat(f)-w)}px`,b.style.height=v.style.height}}h.style.maxWidth=`${Math.max(0,window.innerWidth-16)}px`,h.style.maxHeight=`${Math.max(0,window.innerHeight-16)}px`;let g=h.getBoundingClientRect();(t?.size||g.right>window.innerWidth-8||g.left<8)&&(h.style.left=`${h.offsetLeft+Math.max(8,(window.innerWidth-g.width)/2)-g.left}px`),(t?.size||g.bottom>window.innerHeight-8||g.top<8)&&(h.style.top=`${h.offsetTop+Math.max(8,(window.innerHeight-g.height)/2)-g.top}px`)},"resize");r.listen(window,"resize",p),p()}try{return i?.call(this,l,c)}catch(u){throw r?.dispose(),u}},s.end=function(...l){return r?.dispose(),n?.apply(this,l)},gs.add(s),gs.add(s.success),s}d(kt,"prepareDialogOptions");var Fd=/^(?:[a-z0-9-]+\.)?javdb(?:[a-z0-9-]*)\.com$/i,Vd=["javbus","javsee","seejav"];function Lr(o=window.location){return o instanceof URL?o:typeof o=="string"?new URL(o):new URL(o.href||`${o.protocol}//${o.hostname}${o.pathname||"/"}${o.search||""}`)}d(Lr,"normalizeLocation");function Ct(o=window.location){let t=Lr(o).hostname.toLowerCase().replace(/\.$/,""),s=Fd.test(t),a=Vd.some((c=>t.includes(c))),r=t==="123pan.com"||t.endsWith(".123pan.com"),i=t==="javtrailers.com"||t.endsWith(".javtrailers.com"),n=t==="subtitlecat.com"||t.endsWith(".subtitlecat.com");return{site:s?"javdb":a?"javbus":r?"123pan":i?"javtrailers":n?"subtitlecat":"unknown",hostname:t,isJavDB:s,isJavBus:a,is123Pan:r,isJavTrailers:i,isSubtitleCat:n}}d(Ct,"detectSite");function je(o=window.location){let e=Lr(o),t=e.pathname,s=e.searchParams;return t==="/rankings/movies"?{kind:"movie-ranking",period:s.get("p")||"daily",category:s.get("t")||"censored"}:t==="/rankings/playback"?{kind:"playback-ranking",period:s.get("p")||"daily",filter:s.get("t")||"high_score"}:t==="/rankings/top"?{kind:"top250-ranking",selection:s.get("t")||"all",page:Math.max(1,Number(s.get("page"))||1)}:t==="/rankings/actors"?{kind:"actor-ranking"}:t==="/rankings/fanza_award"?{kind:"award-ranking"}:t==="/tags/fc2"?{kind:s.get("jhs_source")==="123av"?"external-fc2-catalog":"fc2-catalog"}:t==="/search_advanced"?{kind:"advanced-search"}:{kind:"other"}}d(je,"classifyJavDbPage");function Io(o){let e=Lr(o);if(e.pathname!=="/advanced_search")return null;let t=e.searchParams,s=new URL(e.href);if(t.get("handlePlayback")==="1"){s.pathname="/rankings/playback",s.search="";let a=t.get("period")||"daily";s.searchParams.set("p",["daily","weekly","monthly"].includes(a)?a:"daily"),s.searchParams.set("t","high_score")}else if(t.get("handleTop")==="1"){s.pathname="/rankings/top",s.search="";let a=t.get("handleType"),r=t.get("type_value")||"";a==="year"&&/^\d{4}$/.test(r)&&s.searchParams.set("t",`y${r}`),a==="video_type"&&/^[0-3]$/.test(r)&&s.searchParams.set("t",r);let i=Math.max(1,Number.parseInt(t.get("page")||"1",10)||1),n=Math.floor((i-1)*50/40)+1;n>1&&s.searchParams.set("page",String(n)),["0","1"].includes(t.get("has_cnsub")||"")&&s.searchParams.set("jhs_subtitle",t.get("has_cnsub")==="1"?"with":"without")}else if(t.get("type")==="100"&&t.get("released_start")==="2099-09"){s.pathname="/tags/fc2",s.search="",s.searchParams.set("c10","1"),s.searchParams.set("jhs_source","123av");for(let a of["keyword","page"])t.has(a)&&s.searchParams.set(a,t.get(a)||"")}else s.pathname="/search_advanced";return s.href}d(Io,"resolveLegacyJavDbUrl");var qd=Object.defineProperty,Mr=d(o=>{throw TypeError(o)},"a"),P=d((o,e,t)=>((s,a,r)=>a in s?qd(s,a,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[a]=r)(o,typeof e!="symbol"?e+"":e,t),"i"),Br=d((o,e,t)=>(((s,a,r)=>{a.has(s)||Mr("Cannot "+r)})(o,e,"access private method"),t),"s"),X="",Or={site:"unknown",hostname:"",isJavDB:!1,isJavBus:!1,is123Pan:!1,isJavTrailers:!1,isSubtitleCat:!1},M=!1,B=!1,ms=!1,ce="filter",ue="favorite",pe="hasDown",me="hasWatch",Le="屏蔽",tt="已屏蔽";var Me="收藏",st="已收藏";var fe="已下载";var ve="已观看";var ne="no",E="yes",Be="javdb",Se="javbus",Oe="actor",at="actress",Je="censored",Ke="uncensored",rt=[{id:"video-mhb",quality:"dmb_w",text:"旧视频源-中画质宽版 (404p)",canSelect:!1},{id:"video-mhb",quality:"sm_s",text:"旧视频源-低画质 (240p)",canSelect:!1},{id:"video-mhb",quality:"dm_s",text:"旧视频源-中画质 (360p)",canSelect:!1},{id:"video-mhb",quality:"dmb_s",text:"旧视频源-中画质 (480p)",canSelect:!1},{id:"video-mhb",quality:"mhb_w",text:"旧视频源-高画质宽版 (404p)",canSelect:!1},{id:"video-mmb",quality:"mmb",text:"中画质 (432p)",canSelect:!0},{id:"video-mhb",quality:"mhb",text:"高画质 (576p)",canSelect:!0},{id:"video-hmb",quality:"hmb",text:"HD (720p)",canSelect:!0},{id:"video-hhb",quality:"hhb",text:"FullHD (1080p)",canSelect:!0},{id:"video-hhbs",quality:"hhbs",text:"FullHD (1080p60fps)",canSelect:!0},{id:"video-4k",quality:"4k",text:"4K (2160p)",canSelect:!0},{id:"video-4ks",quality:"4ks",text:"4K (2160p60fps)",canSelect:!0}];function Eo(o=window.location){let e=Ct(o);return X=o.href,Or=e,M=e.isJavDB,B=e.isJavBus,ms=X.includes("/search?q")||X.includes("/search/")||X.includes("/users/"),e}d(Eo,"initializeRuntimeConstants");function T(o){let e=document.createElement("span");return e.textContent=o,e.innerHTML.replaceAll('"',""").replaceAll("'","'")}d(T,"escapeHtml");var fs=3;function C(o){if(typeof o!="string")return null;let e=o.trim();return!e||["undefined","null"].includes(e.toLowerCase())?null:(e=e.normalize("NFKC").replace(/[‐‑‒–—―﹘﹣-]/g,"-").replace(/[\s_]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toUpperCase(),e?Wd(e):null)}d(C,"normalizeCarNum");var Hd=new Set(["ABC","ABP","ADN","ATID","BF","CAWD","DLDSS","DVAJ","FSDSS","HEYZO","HMN","IPX","IPZZ","JUQ","JUL","JUX","MEYD","MIAA","MIDE","MIDV","MIMK","MIRD","NIMA","PRED","RBD","SDDE","SONE","SSIS","SSNI","STARS","URE","VEC","WAAA","WANZ","XVSR"]);function Wd(o){let e=String(o||"").match(/^([A-Z]{2,8})(\d{2,7})$/);return e&&Hd.has(e[1])?`${e[1]}-${e[2]}`:o}d(Wd,"tryCanonicalizeSimpleCarNum");function Do(...o){for(let e of o){let t=C(e);if(t)return t}return null}d(Do,"firstValidCarNum");function No(o){if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("getPageInfo() contract broken: expected object");return o}d(No,"assertPageInfoContract");function Lo(){return window.location.href.includes("hideNav=1")?` +(()=>{var Bo=Object.defineProperty;var Gd=(o,e,t)=>e in o?Bo(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var d=(o,e)=>Bo(o,"name",{value:e,configurable:!0});var Ge=(o,e,t)=>Gd(o,typeof e!="symbol"?e+"":e,t);var zr=class zr{constructor(e,t={}){if(!e)throw new TypeError("LifecycleScope id is required");this.id=e,this.controller=new AbortController,this.cleanups=new Set,this.requestConsumers=new Set,this.observerCleanups=new Map,this.listenerCount=0,this.observerCount=0,this.disposed=!1,this.generation=0,this.onChange=t.onChange??null}get signal(){return this.controller.signal}listen(e,t,s,a){return this.assertActive(),e.addEventListener(t,s,a),this.listenerCount+=1,this.addCleanup(()=>{e.removeEventListener(t,s,a),this.listenerCount-=1})}ownObserver(e){this.assertActive();let t=this.observerCleanups.get(e);if(t)return t;this.observerCount+=1;let s=this.addCleanup(()=>{e.disconnect(),this.observerCount-=1,this.observerCleanups.delete(e)});return this.observerCleanups.set(e,s),s}releaseObserver(e){this.observerCleanups.get(e)?.()}observe(e,t,s){this.assertActive();let a=new MutationObserver(t);return a.observe(e,s),this.ownObserver(a),a}ownTimeout(e){return this.addCleanup(()=>clearTimeout(e))}ownRequestConsumer(e){return this.assertActive(),this.requestConsumers.add(e),this.emitChange(),this.addCleanup(()=>{this.requestConsumers.delete(e)&&e.release()})}addCleanup(e){this.assertActive();let t=!0,s=d(()=>{t&&(t=!1,this.cleanups.delete(s),e(),this.emitChange())},"wrapped");return this.cleanups.add(s),this.emitChange(),s}nextGeneration(){return this.assertActive(),this.generation+=1,this.generation}canCommit(e){return!this.disposed&&e===this.generation}dispose(){if(!this.disposed){this.disposed=!0,this.controller.abort();for(let e of[...this.cleanups].reverse())e();this.emitChange()}}assertActive(){if(this.disposed)throw new DOMException(`LifecycleScope ${this.id} is disposed`,"AbortError")}snapshot(){return Object.freeze({id:this.id,disposed:this.disposed,listeners:this.listenerCount,observers:this.observerCount,requestConsumers:this.requestConsumers.size,generation:this.generation})}emitChange(){this.onChange?.(this.snapshot())}};d(zr,"LifecycleScope");var te=zr;var bs=new WeakSet;function _t(o={},e={}){if(bs.has(o)||bs.has(o.success))return o;let{ui:t,...s}=o,a=["scroll","table","media"].includes(t?.body)?t.body:"scroll";t?.size&&e.getDialogArea&&(s.area=e.getDialogArea(t.size));let r,i=s.success,n=s.end;return s.success=function(l,c){let h=l?.nodeType===1?l:l?.[0]||globalThis.document?.getElementById(`layui-layer${c}`);if(h?.classList){h.classList.add("jhs-dialog","jhs-ui"),h.dataset.jhsDialogBody=a,r=new te(`dialog-shell-${c}`);let u=h.querySelector(".layui-layer-close");u&&(u.setAttribute("role","button"),u.setAttribute("tabindex","0"),u.setAttribute("aria-label","关闭弹窗"),r.listen(u,"keydown",g=>{let m=g.key;(m==="Enter"||m===" ")&&(g.preventDefault(),u.click())}));let p=d(()=>{if(t?.size&&e.getDialogArea){let[m,f]=e.getDialogArea(t.size);Object.assign(h.style,{width:m,height:f});let v=h.querySelector(".layui-layer-content"),b=h.querySelector("iframe");if(b&&v){let w=h.querySelector(".layui-layer-title")?.getBoundingClientRect().height||0;v.style.height=`${Math.max(0,parseFloat(f)-w)}px`,b.style.height=v.style.height}}h.style.maxWidth=`${Math.max(0,window.innerWidth-16)}px`,h.style.maxHeight=`${Math.max(0,window.innerHeight-16)}px`;let g=h.getBoundingClientRect();(t?.size||g.right>window.innerWidth-8||g.left<8)&&(h.style.left=`${h.offsetLeft+Math.max(8,(window.innerWidth-g.width)/2)-g.left}px`),(t?.size||g.bottom>window.innerHeight-8||g.top<8)&&(h.style.top=`${h.offsetTop+Math.max(8,(window.innerHeight-g.height)/2)-g.top}px`)},"resize");r.listen(window,"resize",p),p()}try{return i?.call(this,l,c)}catch(u){throw r?.dispose(),u}},s.end=function(...l){return r?.dispose(),n?.apply(this,l)},bs.add(s),bs.add(s.success),s}d(_t,"prepareDialogOptions");var Qd=/^(?:[a-z0-9-]+\.)?javdb(?:[a-z0-9-]*)\.com$/i,Yd=["javbus","javsee","seejav"];function Fr(o=window.location){return o instanceof URL?o:typeof o=="string"?new URL(o):new URL(o.href||`${o.protocol}//${o.hostname}${o.pathname||"/"}${o.search||""}`)}d(Fr,"normalizeLocation");function $t(o=window.location){let t=Fr(o).hostname.toLowerCase().replace(/\.$/,""),s=Qd.test(t),a=Yd.some((c=>t.includes(c))),r=t==="123pan.com"||t.endsWith(".123pan.com"),i=t==="javtrailers.com"||t.endsWith(".javtrailers.com"),n=t==="subtitlecat.com"||t.endsWith(".subtitlecat.com");return{site:s?"javdb":a?"javbus":r?"123pan":i?"javtrailers":n?"subtitlecat":"unknown",hostname:t,isJavDB:s,isJavBus:a,is123Pan:r,isJavTrailers:i,isSubtitleCat:n}}d($t,"detectSite");function je(o=window.location){let e=Fr(o),t=e.pathname,s=e.searchParams;return t==="/rankings/movies"?{kind:"movie-ranking",period:s.get("p")||"daily",category:s.get("t")||"censored"}:t==="/rankings/playback"?{kind:"playback-ranking",period:s.get("p")||"daily",filter:s.get("t")||"high_score"}:t==="/rankings/top"?{kind:"top250-ranking",selection:s.get("t")||"all",page:Math.max(1,Number(s.get("page"))||1)}:t==="/rankings/actors"?{kind:"actor-ranking"}:t==="/rankings/fanza_award"?{kind:"award-ranking"}:t==="/tags/fc2"?{kind:s.get("jhs_source")==="123av"?"external-fc2-catalog":"fc2-catalog"}:t==="/search_advanced"?{kind:"advanced-search"}:{kind:"other"}}d(je,"classifyJavDbPage");function Oo(o){let e=Fr(o);if(e.pathname!=="/advanced_search")return null;let t=e.searchParams,s=new URL(e.href);if(t.get("handlePlayback")==="1"){s.pathname="/rankings/playback",s.search="";let a=t.get("period")||"daily";s.searchParams.set("p",["daily","weekly","monthly"].includes(a)?a:"daily"),s.searchParams.set("t","high_score")}else if(t.get("handleTop")==="1"){s.pathname="/rankings/top",s.search="";let a=t.get("handleType"),r=t.get("type_value")||"";a==="year"&&/^\d{4}$/.test(r)&&s.searchParams.set("t",`y${r}`),a==="video_type"&&/^[0-3]$/.test(r)&&s.searchParams.set("t",r);let i=Math.max(1,Number.parseInt(t.get("page")||"1",10)||1),n=Math.floor((i-1)*50/40)+1;n>1&&s.searchParams.set("page",String(n)),["0","1"].includes(t.get("has_cnsub")||"")&&s.searchParams.set("jhs_subtitle",t.get("has_cnsub")==="1"?"with":"without")}else if(t.get("type")==="100"&&t.get("released_start")==="2099-09"){s.pathname="/tags/fc2",s.search="",s.searchParams.set("c10","1"),s.searchParams.set("jhs_source","123av");for(let a of["keyword","page"])t.has(a)&&s.searchParams.set(a,t.get(a)||"")}else s.pathname="/search_advanced";return s.href}d(Oo,"resolveLegacyJavDbUrl");var Zd=Object.defineProperty,Vr=d(o=>{throw TypeError(o)},"a"),P=d((o,e,t)=>((s,a,r)=>a in s?Zd(s,a,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[a]=r)(o,typeof e!="symbol"?e+"":e,t),"i"),qr=d((o,e,t)=>(((s,a,r)=>{a.has(s)||Vr("Cannot "+r)})(o,e,"access private method"),t),"s"),X="",Hr={site:"unknown",hostname:"",isJavDB:!1,isJavBus:!1,is123Pan:!1,isJavTrailers:!1,isSubtitleCat:!1},M=!1,B=!1,ws=!1,ce="filter",ue="favorite",pe="hasDown",me="hasWatch",Be="屏蔽",at="已屏蔽";var Oe="收藏",rt="已收藏";var fe="已下载";var ve="已观看";var ne="no",E="yes",Ue="javdb",Se="javbus",ze="actor",it="actress",Qe="censored",Ye="uncensored",nt=[{id:"video-mhb",quality:"dmb_w",text:"旧视频源-中画质宽版 (404p)",canSelect:!1},{id:"video-mhb",quality:"sm_s",text:"旧视频源-低画质 (240p)",canSelect:!1},{id:"video-mhb",quality:"dm_s",text:"旧视频源-中画质 (360p)",canSelect:!1},{id:"video-mhb",quality:"dmb_s",text:"旧视频源-中画质 (480p)",canSelect:!1},{id:"video-mhb",quality:"mhb_w",text:"旧视频源-高画质宽版 (404p)",canSelect:!1},{id:"video-mmb",quality:"mmb",text:"中画质 (432p)",canSelect:!0},{id:"video-mhb",quality:"mhb",text:"高画质 (576p)",canSelect:!0},{id:"video-hmb",quality:"hmb",text:"HD (720p)",canSelect:!0},{id:"video-hhb",quality:"hhb",text:"FullHD (1080p)",canSelect:!0},{id:"video-hhbs",quality:"hhbs",text:"FullHD (1080p60fps)",canSelect:!0},{id:"video-4k",quality:"4k",text:"4K (2160p)",canSelect:!0},{id:"video-4ks",quality:"4ks",text:"4K (2160p60fps)",canSelect:!0}];function Uo(o=window.location){let e=$t(o);return X=o.href,Hr=e,M=e.isJavDB,B=e.isJavBus,ws=X.includes("/search?q")||X.includes("/search/")||X.includes("/users/"),e}d(Uo,"initializeRuntimeConstants");function T(o){let e=document.createElement("span");return e.textContent=o,e.innerHTML.replaceAll('"',""").replaceAll("'","'")}d(T,"escapeHtml");var ys=3;function C(o){if(typeof o!="string")return null;let e=o.trim();return!e||["undefined","null"].includes(e.toLowerCase())?null:(e=e.normalize("NFKC").replace(/[‐‑‒–—―﹘﹣-]/g,"-").replace(/[\s_]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toUpperCase(),e?eh(e):null)}d(C,"normalizeCarNum");var Xd=new Set(["ABC","ABP","ADN","ATID","BF","CAWD","DLDSS","DVAJ","FSDSS","HEYZO","HMN","IPX","IPZZ","JUQ","JUL","JUX","MEYD","MIAA","MIDE","MIDV","MIMK","MIRD","NIMA","PRED","RBD","SDDE","SONE","SSIS","SSNI","STARS","URE","VEC","WAAA","WANZ","XVSR"]);function eh(o){let e=String(o||"").match(/^([A-Z]{2,8})(\d{2,7})$/);return e&&Xd.has(e[1])?`${e[1]}-${e[2]}`:o}d(eh,"tryCanonicalizeSimpleCarNum");function zo(...o){for(let e of o){let t=C(e);if(t)return t}return null}d(zo,"firstValidCarNum");function Fo(o){if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("getPageInfo() contract broken: expected object");return o}d(Fo,"assertPageInfoContract");function Vo(){return window.location.href.includes("hideNav=1")?` .navbar-default { display: none !important; } body { padding-top:0px!important; } - `:""}d(Lo,"getJavBusHiddenNavCss");function Mo(){return window.location.href.includes("hideNav=1")?` + `:""}d(Vo,"getJavBusHiddenNavCss");function qo(){return window.location.href.includes("hideNav=1")?` .main-nav,#search-bar-container { display: none !important; } @@ -85,7 +85,7 @@ html { padding-top:0px!important; } - `:""}d(Mo,"getJavDbHiddenNavCss");function Bo(o){if(o)if(o.includes(" -`}d(Oo,"buildThemeCss");function Ht(o="light"){let e="light";o==="dark"?e="dark":o==="auto"&&(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),document.documentElement.setAttribute("data-jhs-theme",e)}d(Ht,"applyThemeMode");function Uo(o){let e=window.matchMedia("(prefers-color-scheme: dark)");o.listen(e,"change",()=>{let t=globalThis.settingsService?.snapshot?.().themeMode??storageManager.getSettingSync("themeMode","light");t==="auto"&&Ht(t)})}d(Uo,"initializeThemeRuntime");function zo(){return` +`}d(Wo,"buildThemeCss");function Jt(o="light"){let e="light";o==="dark"?e="dark":o==="auto"&&(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),document.documentElement.setAttribute("data-jhs-theme",e)}d(Jt,"applyThemeMode");function Jo(o){let e=window.matchMedia("(prefers-color-scheme: dark)");o.listen(e,"change",()=>{let t=globalThis.settingsService?.snapshot?.().themeMode??storageManager.getSettingSync("themeMode","light");t==="auto"&&Jt(t)})}d(Jo,"initializeThemeRuntime");function Ko(){return` `}d(zo,"buildUiPrimitivesCss");function Ue(o,{type:e="empty",title:t="",description:s="",actionLabel:a="",onAction:r=null}={}){let i=o?.jquery?o:$(o),n=$('
').addClass(`jhs-state--${e}`).attr("role",e==="error"?"alert":"status"),l=$('
');return t&&l.append($('

').text(t)),s&&l.append($('

').text(s)),a&&typeof r=="function"&&l.append($('').text(a).on("click",r)),n.append(l),i.empty().append(n),n}d(Ue,"renderStateView");function Fo(o){if(!o||typeof o.observe!="function")throw new TypeError("UI accessibility requires an app LifecycleScope");let e="button.jhs-btn, a.jhs-btn[role='button'], .card-btn, .jhs-icon-btn, [class*='jhs-'] button, [class*='jhs-'] a[role='button']",t=d(i=>{let n=i.nodeType===Node.ELEMENT_NODE&&i.matches?.(e)?[i]:[],l=i.querySelectorAll?[...i.querySelectorAll(e)]:[];[...n,...l].forEach((c=>{if(c.hasAttribute("aria-label")||c.hasAttribute("aria-labelledby")||c.textContent.trim())return;let h=c.getAttribute("title")||c.getAttribute("data-tip");h&&c.setAttribute("aria-label",h)}))},"enhance");t(document);let s=new Set,a=!1,r=d(()=>{a=!1;let i=[...s],n=i.filter((l=>!i.some((c=>c!==l&&c.contains?.(l)))));s.clear(),n.forEach(t)},"flush");return o.observe(document.documentElement,(i=>{i.forEach((n=>n.addedNodes.forEach((l=>{l.nodeType===Node.ELEMENT_NODE&&s.add(l)})))),s.size&&!a&&(a=!0,queueMicrotask(r))}),{childList:!0,subtree:!0})}d(Fo,"initializeUiAccessibility");var ie=class ie{static _ensureGlobalClickHandler(){ie._globalClickBound||(ie._globalClickBound=!0,$(document).on("click.jhsSelect",(e=>{$(e.target).closest(".jhs-select-control").length||ie.closeAll()})))}constructor(e){if(this.source=$(e),!this.source.length)return;let t=ie.instances.get(this.source[0]);if(t)return t;let s=this.source.hasClass("jhs-is-hidden")||this.source[0].style.display==="none";this.control=$('
'),this.trigger=$(''),this.menu=$(''),this.source.wrap(this.control),this.control=this.source.parent(),this.control.append(this.trigger,this.menu),this.source.addClass("jhs-select-source-native").attr({"aria-hidden":"true",tabindex:"-1"}),s&&this.control.addClass("jhs-is-hidden"),ie.instances.set(this.source[0],this),this.render(),this.bind(),this.refresh()}static enhance(e=document){let t=$(e),s=t.is("select.jhs-select-source")?t:t.find("select.jhs-select-source");return s.each(((a,r)=>new ie(r))),s}static get(e){let t=$(e)[0];return t?ie.instances.get(t)||new ie(t):null}static setValue(e,t,s=!1){let a=ie.get(e);a&&(a.source.val(t),s?a.emitChange():a.refresh())}static refresh(e){ie.get(e)?.refresh()}static refreshAll(e=document){ie.enhance(e),$(e).find("select.jhs-select-source").each(((t,s)=>ie.refresh(s)))}static setVisible(e,t){ie.get(e)?.control.toggleClass("jhs-is-hidden",!t)}static closeAll(e=null){$(".jhs-select-control.is-open").each(((t,s)=>{let a=$(s).children("select.jhs-select-source")[0],r=a&&ie.instances.get(a);r&&r!==e&&r.close()}))}render(){this.menu.empty();let e=d((t,s)=>{let a=$('');a.attr({"data-value":t.value,"aria-checked":t.selected?"true":"false"}).prop("disabled",t.disabled).text(t.text),s.append(a)},"appendOption");this.source.children().each(((t,s)=>{if(s.tagName==="OPTGROUP"){let a=$('
').attr("aria-label",s.label),r=$('
').text(s.label);a.append(r),$(s).children("option").each(((i,n)=>e(n,a))),this.menu.append(a)}else s.tagName==="OPTION"&&e(s,this.menu)}))}bind(){this.trigger.on("click",(e=>{e.preventDefault(),e.stopPropagation(),this.source.prop("disabled")||(this.control.hasClass("is-open")?this.close():this.open())})).on("keydown",(e=>{["ArrowDown","ArrowUp","Home","End"].includes(e.key)&&(e.preventDefault(),this.open(e.key==="ArrowUp"||e.key==="End"?"last":e.key==="Home"?"first":"selected"))})),this.menu.on("click",".jhs-select-option",(e=>{e.preventDefault(),this.choose($(e.currentTarget))})).on("keydown",".jhs-select-option",(e=>{let t=this.options(),s=t.index(e.currentTarget);if(e.key==="Escape")return e.preventDefault(),e.stopPropagation(),this.close(!0);if(e.key==="Tab")return void this.close(!0);if(["Enter"," "].includes(e.key))return e.preventDefault(),this.choose($(e.currentTarget));if(!["ArrowDown","ArrowUp","Home","End"].includes(e.key))return;e.preventDefault();let a=e.key==="Home"?0:e.key==="End"?t.length-1:e.key==="ArrowDown"?(s+1)%t.length:(s-1+t.length)%t.length;t.eq(a).trigger("focus")})),this.source.on("change.jhsSelect",(()=>this.refresh())),ie._ensureGlobalClickHandler()}options(){return this.menu.find(".jhs-select-option:not(:disabled)")}open(e="selected"){ie.closeAll(this),this.control.addClass("is-open"),this.menu.addClass("is-open"),this.trigger.attr("aria-expanded","true");let t=this.options(),s=t.filter('[aria-checked="true"]');(e==="last"?t.last():e==="first"?t.first():s.length?s.first():t.first()).trigger("focus")}close(e=!1){this.control.removeClass("is-open"),this.menu.removeClass("is-open"),this.trigger.attr("aria-expanded","false"),e&&this.trigger.trigger("focus")}choose(e){e.prop("disabled")||(this.source.val(e.attr("data-value")),this.emitChange(),this.close(!0))}emitChange(){this.source[0]?.dispatchEvent(new Event("change",{bubbles:!0}))}refresh(){let e=this.source.find("option:selected").first(),t=this.source.val();this.trigger.find(".jhs-select-value").text(e.text()),this.trigger.prop("disabled",this.source.prop("disabled")),this.menu.find(".jhs-select-option").attr("aria-checked","false").filter(((s,a)=>$(a).attr("data-value")===String(t??""))).attr("aria-checked","true")}};d(ie,"JhsSelect"),dt(ie,"instances",new WeakMap),dt(ie,"_globalClickBound",!1);var K=ie;function Jd(){return` +`}d(Ko,"buildUiPrimitivesCss");function Fe(o,{type:e="empty",title:t="",description:s="",actionLabel:a="",onAction:r=null}={}){let i=o?.jquery?o:$(o),n=$('
').addClass(`jhs-state--${e}`).attr("role",e==="error"?"alert":"status"),l=$('
');return t&&l.append($('

').text(t)),s&&l.append($('

').text(s)),a&&typeof r=="function"&&l.append($('').text(a).on("click",r)),n.append(l),i.empty().append(n),n}d(Fe,"renderStateView");function Go(o){if(!o||typeof o.observe!="function")throw new TypeError("UI accessibility requires an app LifecycleScope");let e="button.jhs-btn, a.jhs-btn[role='button'], .card-btn, .jhs-icon-btn, [class*='jhs-'] button, [class*='jhs-'] a[role='button']",t=d(i=>{let n=i.nodeType===Node.ELEMENT_NODE&&i.matches?.(e)?[i]:[],l=i.querySelectorAll?[...i.querySelectorAll(e)]:[];[...n,...l].forEach((c=>{if(c.hasAttribute("aria-label")||c.hasAttribute("aria-labelledby")||c.textContent.trim())return;let h=c.getAttribute("title")||c.getAttribute("data-tip");h&&c.setAttribute("aria-label",h)}))},"enhance");t(document);let s=new Set,a=!1,r=d(()=>{a=!1;let i=[...s],n=i.filter((l=>!i.some((c=>c!==l&&c.contains?.(l)))));s.clear(),n.forEach(t)},"flush");return o.observe(document.documentElement,(i=>{i.forEach((n=>n.addedNodes.forEach((l=>{l.nodeType===Node.ELEMENT_NODE&&s.add(l)})))),s.size&&!a&&(a=!0,queueMicrotask(r))}),{childList:!0,subtree:!0})}d(Go,"initializeUiAccessibility");var ie=class ie{static _ensureGlobalClickHandler(){ie._globalClickBound||(ie._globalClickBound=!0,$(document).on("click.jhsSelect",(e=>{$(e.target).closest(".jhs-select-control").length||ie.closeAll()})))}constructor(e){if(this.source=$(e),!this.source.length)return;let t=ie.instances.get(this.source[0]);if(t)return t;let s=this.source.hasClass("jhs-is-hidden")||this.source[0].style.display==="none";this.control=$('
'),this.trigger=$(''),this.menu=$(''),this.source.wrap(this.control),this.control=this.source.parent(),this.control.append(this.trigger,this.menu),this.source.addClass("jhs-select-source-native").attr({"aria-hidden":"true",tabindex:"-1"}),s&&this.control.addClass("jhs-is-hidden"),ie.instances.set(this.source[0],this),this.render(),this.bind(),this.refresh()}static enhance(e=document){let t=$(e),s=t.is("select.jhs-select-source")?t:t.find("select.jhs-select-source");return s.each(((a,r)=>new ie(r))),s}static get(e){let t=$(e)[0];return t?ie.instances.get(t)||new ie(t):null}static setValue(e,t,s=!1){let a=ie.get(e);a&&(a.source.val(t),s?a.emitChange():a.refresh())}static refresh(e){ie.get(e)?.refresh()}static refreshAll(e=document){ie.enhance(e),$(e).find("select.jhs-select-source").each(((t,s)=>ie.refresh(s)))}static setVisible(e,t){ie.get(e)?.control.toggleClass("jhs-is-hidden",!t)}static closeAll(e=null){$(".jhs-select-control.is-open").each(((t,s)=>{let a=$(s).children("select.jhs-select-source")[0],r=a&&ie.instances.get(a);r&&r!==e&&r.close()}))}render(){this.menu.empty();let e=d((t,s)=>{let a=$('');a.attr({"data-value":t.value,"aria-checked":t.selected?"true":"false"}).prop("disabled",t.disabled).text(t.text),s.append(a)},"appendOption");this.source.children().each(((t,s)=>{if(s.tagName==="OPTGROUP"){let a=$('
').attr("aria-label",s.label),r=$('
').text(s.label);a.append(r),$(s).children("option").each(((i,n)=>e(n,a))),this.menu.append(a)}else s.tagName==="OPTION"&&e(s,this.menu)}))}bind(){this.trigger.on("click",(e=>{e.preventDefault(),e.stopPropagation(),this.source.prop("disabled")||(this.control.hasClass("is-open")?this.close():this.open())})).on("keydown",(e=>{["ArrowDown","ArrowUp","Home","End"].includes(e.key)&&(e.preventDefault(),this.open(e.key==="ArrowUp"||e.key==="End"?"last":e.key==="Home"?"first":"selected"))})),this.menu.on("click",".jhs-select-option",(e=>{e.preventDefault(),this.choose($(e.currentTarget))})).on("keydown",".jhs-select-option",(e=>{let t=this.options(),s=t.index(e.currentTarget);if(e.key==="Escape")return e.preventDefault(),e.stopPropagation(),this.close(!0);if(e.key==="Tab")return void this.close(!0);if(["Enter"," "].includes(e.key))return e.preventDefault(),this.choose($(e.currentTarget));if(!["ArrowDown","ArrowUp","Home","End"].includes(e.key))return;e.preventDefault();let a=e.key==="Home"?0:e.key==="End"?t.length-1:e.key==="ArrowDown"?(s+1)%t.length:(s-1+t.length)%t.length;t.eq(a).trigger("focus")})),this.source.on("change.jhsSelect",(()=>this.refresh())),ie._ensureGlobalClickHandler()}options(){return this.menu.find(".jhs-select-option:not(:disabled)")}open(e="selected"){ie.closeAll(this),this.control.addClass("is-open"),this.menu.addClass("is-open"),this.trigger.attr("aria-expanded","true");let t=this.options(),s=t.filter('[aria-checked="true"]');(e==="last"?t.last():e==="first"?t.first():s.length?s.first():t.first()).trigger("focus")}close(e=!1){this.control.removeClass("is-open"),this.menu.removeClass("is-open"),this.trigger.attr("aria-expanded","false"),e&&this.trigger.trigger("focus")}choose(e){e.prop("disabled")||(this.source.val(e.attr("data-value")),this.emitChange(),this.close(!0))}emitChange(){this.source[0]?.dispatchEvent(new Event("change",{bubbles:!0}))}refresh(){let e=this.source.find("option:selected").first(),t=this.source.val();this.trigger.find(".jhs-select-value").text(e.text()),this.trigger.prop("disabled",this.source.prop("disabled")),this.menu.find(".jhs-select-option").attr("aria-checked","false").filter(((s,a)=>$(a).attr("data-value")===String(t??""))).attr("aria-checked","true")}};d(ie,"JhsSelect"),Ge(ie,"instances",new WeakMap),Ge(ie,"_globalClickBound",!1);var K=ie;function th(){return` `}d(Jd,"buildJavBusCss");function Kd(){return` +`}d(th,"buildJavBusCss");function sh(){return` `}d(Kd,"buildJavDbCss");var Gd=` +`}d(sh,"buildJavDbCss");var ah=` `,Vo=!1;function qo(o,e=""){if(Vo)return;let t=d((s,a)=>o?.register?o.register(s,a.replace(/^\s*`,Qo=!1;function Yo(o,e=""){if(Qo)return;let t=d((s,a)=>o?.register?o.register(s,a.replace(/^\s* - `),window.showImageViewer=function(n,l="",c={}){let h=null,u=!1;if(typeof n=="string"||n instanceof String){let z=document.createElement("div"),Z=document.createElement("img");z.className="temporary-container jhs-layout-c8be1ccb",Z.src=String(n),Z.alt=String(l),z.appendChild(Z),document.body.appendChild(z),h=$(z),u=!0}else h=$(n);let p=h.is("img")?h[0]:h.find("img")[0],g=p?.closest(".jhs-fc2-workspace"),m=g?.querySelector('[data-jhs-slot="gallery"]'),f=m?.contains(p)?$(m):c.galleryRoot?$(c.galleryRoot):null,v=f?.length?f:h,b=v.find("img").addBack("img").toArray(),w=Math.max(0,b.indexOf(p)),S=b.length>1;if(!p||!v.length||!p.isConnected||o.disposed)return void(u&&h.remove());i?.close(!1);let j=p.closest(".layui-layer"),k=p.closest("button,a,[tabindex]")||document.activeElement,x=g&&j?.querySelector(".layui-layer-content"),_=new te("ui:image-viewer"),R=document.documentElement.style.overflow,L=document.body.style.overflow,N,A,O,U,q=g?.inert,Q=x?.classList.contains("jhs-image-viewer-owner"),se={close(z=!0){if(!_.disposed){_.dispose(),A?.();try{N?.destroy()}finally{O?.remove(),x&&(x.classList.toggle("jhs-image-viewer-owner",Q),g.inert=q),u&&h.remove(),i===se&&(i=null,document.documentElement.style.overflow=document.querySelector(".layui-layer-shade")?"hidden":j?"":R,document.body.style.overflow=L,z&&k?.isConnected&&k.focus?.({preventScroll:!0}))}}}};i=se,A=o.addCleanup(()=>se.close(!1));let ge=[...document.querySelectorAll(".layui-layer")].reduce((z,Z)=>{let re=window.getComputedStyle(Z),xt=Number(re.zIndex);return re.display!=="none"&&Number.isFinite(xt)?Math.max(z,xt+1):z},J.viewer);if(x){O=document.createElement("div"),O.className="jhs-image-viewer-host",O.style.zIndex=String(ge);let z=document.createElement("div");z.hidden=!0,b.forEach(Z=>{let re=document.createElement("img");re.src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1' height='1'/%3E",re.setAttribute("data-jhs-viewer-source",Z.currentSrc||Z.src),re.alt=Z.alt,z.appendChild(re)}),O.appendChild(z),x.classList.add("jhs-image-viewer-owner"),x.appendChild(O),g.inert=!0,v=$(z)}let De=d(z=>z<0?N?.prev(!!g):N?.next(!!g),"navigate"),Ne={zIndex:ge,...g?{className:`jhs-fc2-image-viewer jhs-ui${x?" viewer-in":""}`,inline:!!x,zIndexInline:ge,minWidth:0,minHeight:0,button:!1,transition:!1,initialCoverage:.9,ready:d(()=>{if(_.disposed||!N?.viewer)return;let z=N.viewer,Z=document.createElement("div");Z.className="jhs-image-viewer-toolbar",z.setAttribute("role","dialog"),z.setAttribute("aria-label","图片预览");let re=d((ye,Md,Bd,Od,Ud=z)=>{let ct=document.createElement("button");return ct.type="button",ct.className=`jhs-btn jhs-btn--secondary ${Bd}`,ct.setAttribute("aria-label",ye),ct.textContent=Md,_.listen(ct,"click",Po=>{Po.preventDefault(),Po.stopPropagation(),Od()}),Ud.appendChild(ct),ct},"button"),xt=re("关闭图片","×","jhs-image-viewer-close",()=>se.close());S&&(re("上一张","‹","jhs-image-viewer-nav jhs-image-viewer-prev",()=>De(-1)),re("下一张","›","jhs-image-viewer-nav jhs-image-viewer-next",()=>De(1))),re("放大图片","放大","",()=>N.zoom(.1),Z),re("缩小图片","缩小","",()=>N.zoom(-.1),Z),re("适应窗口","适应","",()=>N.reset(),Z),U=document.createElement("span"),U.className="jhs-image-viewer-count",U.setAttribute("aria-live","polite"),Z.appendChild(U),N.footer.appendChild(Z);let ps=-1/0;if(_.listen(z,"wheel",ye=>{!S||ye.ctrlKey||!ye.deltaY||(ye.preventDefault(),ye.stopPropagation(),!(ye.timeStamp-ps<180)&&(ps=ye.timeStamp,De(Math.sign(ye.deltaY))))},{passive:!1}),x&&typeof ResizeObserver<"u"){let ye=new ResizeObserver(()=>{N?.ready&&!_.disposed&&N.resize()});ye.observe(O),_.ownObserver(ye)}xt.focus({preventScroll:!0})},"bindFc2Controls")}:{},...x?{url:"data-jhs-viewer-source"}:{},navbar:!1,initialViewIndex:w,zoomOnWheel:!1,zoomRatio:.1,toggleOnDblclick:!1,toolbar:g?!1:{prev:S?1:0,zoomIn:1,zoomOut:1,reset:1,next:S?1:0,rotateLeft:0,rotateRight:0,flipHorizontal:0,flipVertical:0},title:!1,keyboard:!1,viewed(){if(_.disposed)return;if(g){N.resize(),U&&(U.textContent=`${N.index+1} / ${b.length}`);return}N.zoomTo(1.4);let z=(N.viewerData.width-N.imageData.width)/2,Z=(N.viewerData.height-N.imageData.height)/2;N.moveTo(z,Z)},shown(){_.disposed||(document.documentElement.style.overflow="hidden",document.body.style.overflow="hidden")},hidden(){se.close()}};try{_.listen(document,"keydown",z=>{if(S&&z.key==="ArrowLeft")return z.preventDefault(),z.stopPropagation(),void De(-1);if(S&&z.key==="ArrowRight")return z.preventDefault(),z.stopPropagation(),void De(1);if(g&&z.key==="Tab"&&N?.viewer){let Z=[...N.viewer.querySelectorAll("button")],re=Z.indexOf(document.activeElement);z.preventDefault(),Z[(re+(z.shiftKey?-1:1)+Z.length)%Z.length]?.focus();return}(z.key==="Escape"||!g&&z.key===" ")&&(z.preventDefault(),z.stopPropagation(),se.close())},!0),_.observe(document.body,()=>{(!p.isConnected||j&&!j.isConnected)&&se.close(!1)},{childList:!0,subtree:!0}),N=new Viewer(v[0],Ne),N.show()}catch(z){throw se.close(!1),z}}})(),window.ImageHoverPreview=class{constructor(i={}){this.scope=new te(`ui:image-hover:${Date.now()}`),this.config={selector:".hover-preview",dataAttribute:"data-full",maxWidth:1e3,maxHeight:1e3,offsetX:20,offsetY:20,zIndex:J.hoverPreview,owner:null,resolveOwner:null,zIndexStrategy:"fixed",transition:.2,hideDelay:100,loadedUrlLimit:128,autoAdjustPosition:!0,...i},this.config.loadedUrlLimit=Math.max(1,Number(this.config.loadedUrlLimit)||128),this.preview=null,this.currentTarget=null,this.timer=null,this.imgElement=null,this.pendingImage=null,this.placement=null,this.pointer=null,this.animationFrame=null,this.loadGeneration=0,this.destroyed=!1,this.currentUrl=null,this.pendingUrl=null,this.loadedUrls=new Map,this.eventsBound=!1,this.overlayObserver=null,this.onMouseEnter=n=>this.handleMouseEnter(n),this.onMouseLeave=n=>this.handleMouseLeave(n),this.onMouseMove=n=>this.handleMouseMove(n),this.onDocumentOver=n=>this.handleDocumentOver(n),this.onDocumentOut=n=>this.handleDocumentOut(n),this.onDocumentMove=n=>this.handleDocumentMove(n),this.onDocumentScroll=()=>this.handleDocumentScroll(),this.suppressUntilMouseMove=!1,this.init()}init(){utils.isMobileMode()||(this.injectStyles(),this.createPreviewElement(),this.bindEvents())}injectStyles(){if(document.getElementById("jhs-image-hover-preview-style"))return;let i=document.createElement("style");i.id="jhs-image-hover-preview-style",i.textContent=` + `),window.showImageViewer=function(n,l="",c={}){let h=null,u=!1;if(typeof n=="string"||n instanceof String){let z=document.createElement("div"),Z=document.createElement("img");z.className="temporary-container jhs-layout-c8be1ccb",Z.src=String(n),Z.alt=String(l),z.appendChild(Z),document.body.appendChild(z),h=$(z),u=!0}else h=$(n);let p=h.is("img")?h[0]:h.find("img")[0],g=p?.closest(".jhs-fc2-workspace"),m=g?.querySelector('[data-jhs-slot="gallery"]'),f=m?.contains(p)?$(m):c.galleryRoot?$(c.galleryRoot):null,v=f?.length?f:h,b=v.find("img").addBack("img").toArray(),w=Math.max(0,b.indexOf(p)),S=b.length>1;if(!p||!v.length||!p.isConnected||o.disposed)return void(u&&h.remove());i?.close(!1);let j=p.closest(".layui-layer"),k=p.closest("button,a,[tabindex]")||document.activeElement,x=g&&j?.querySelector(".layui-layer-content"),_=new te("ui:image-viewer"),I=document.documentElement.style.overflow,L=document.body.style.overflow,N,A,O,U,q=g?.inert,Q=x?.classList.contains("jhs-image-viewer-owner"),se={close(z=!0){if(!_.disposed){_.dispose(),A?.();try{N?.destroy()}finally{O?.remove(),x&&(x.classList.toggle("jhs-image-viewer-owner",Q),g.inert=q),u&&h.remove(),i===se&&(i=null,document.documentElement.style.overflow=document.querySelector(".layui-layer-shade")?"hidden":j?"":I,document.body.style.overflow=L,z&&k?.isConnected&&k.focus?.({preventScroll:!0}))}}}};i=se,A=o.addCleanup(()=>se.close(!1));let ge=[...document.querySelectorAll(".layui-layer")].reduce((z,Z)=>{let re=window.getComputedStyle(Z),Ct=Number(re.zIndex);return re.display!=="none"&&Number.isFinite(Ct)?Math.max(z,Ct+1):z},J.viewer);if(x){O=document.createElement("div"),O.className="jhs-image-viewer-host",O.style.zIndex=String(ge);let z=document.createElement("div");z.hidden=!0,b.forEach(Z=>{let re=document.createElement("img");re.src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1' height='1'/%3E",re.setAttribute("data-jhs-viewer-source",Z.currentSrc||Z.src),re.alt=Z.alt,z.appendChild(re)}),O.appendChild(z),x.classList.add("jhs-image-viewer-owner"),x.appendChild(O),g.inert=!0,v=$(z)}let Le=d(z=>z<0?N?.prev(!!g):N?.next(!!g),"navigate"),Me={zIndex:ge,...g?{className:`jhs-fc2-image-viewer jhs-ui${x?" viewer-in":""}`,inline:!!x,zIndexInline:ge,minWidth:0,minHeight:0,button:!1,transition:!1,initialCoverage:.9,ready:d(()=>{if(_.disposed||!N?.viewer)return;let z=N.viewer,Z=document.createElement("div");Z.className="jhs-image-viewer-toolbar",z.setAttribute("role","dialog"),z.setAttribute("aria-label","图片预览");let re=d((ye,Hd,Wd,Jd,Kd=z)=>{let ht=document.createElement("button");return ht.type="button",ht.className=`jhs-btn jhs-btn--secondary ${Wd}`,ht.setAttribute("aria-label",ye),ht.textContent=Hd,_.listen(ht,"click",Mo=>{Mo.preventDefault(),Mo.stopPropagation(),Jd()}),Kd.appendChild(ht),ht},"button"),Ct=re("关闭图片","×","jhs-image-viewer-close",()=>se.close());S&&(re("上一张","‹","jhs-image-viewer-nav jhs-image-viewer-prev",()=>Le(-1)),re("下一张","›","jhs-image-viewer-nav jhs-image-viewer-next",()=>Le(1))),re("放大图片","放大","",()=>N.zoom(.1),Z),re("缩小图片","缩小","",()=>N.zoom(-.1),Z),re("适应窗口","适应","",()=>N.reset(),Z),U=document.createElement("span"),U.className="jhs-image-viewer-count",U.setAttribute("aria-live","polite"),Z.appendChild(U),N.footer.appendChild(Z);let vs=-1/0;if(_.listen(z,"wheel",ye=>{!S||ye.ctrlKey||!ye.deltaY||(ye.preventDefault(),ye.stopPropagation(),!(ye.timeStamp-vs<180)&&(vs=ye.timeStamp,Le(Math.sign(ye.deltaY))))},{passive:!1}),x&&typeof ResizeObserver<"u"){let ye=new ResizeObserver(()=>{N?.ready&&!_.disposed&&N.resize()});ye.observe(O),_.ownObserver(ye)}Ct.focus({preventScroll:!0})},"bindFc2Controls")}:{},...x?{url:"data-jhs-viewer-source"}:{},navbar:!1,initialViewIndex:w,zoomOnWheel:!1,zoomRatio:.1,toggleOnDblclick:!1,toolbar:g?!1:{prev:S?1:0,zoomIn:1,zoomOut:1,reset:1,next:S?1:0,rotateLeft:0,rotateRight:0,flipHorizontal:0,flipVertical:0},title:!1,keyboard:!1,viewed(){if(_.disposed)return;if(g){N.resize(),U&&(U.textContent=`${N.index+1} / ${b.length}`);return}N.zoomTo(1.4);let z=(N.viewerData.width-N.imageData.width)/2,Z=(N.viewerData.height-N.imageData.height)/2;N.moveTo(z,Z)},shown(){_.disposed||(document.documentElement.style.overflow="hidden",document.body.style.overflow="hidden")},hidden(){se.close()}};try{_.listen(document,"keydown",z=>{if(S&&z.key==="ArrowLeft")return z.preventDefault(),z.stopPropagation(),void Le(-1);if(S&&z.key==="ArrowRight")return z.preventDefault(),z.stopPropagation(),void Le(1);if(g&&z.key==="Tab"&&N?.viewer){let Z=[...N.viewer.querySelectorAll("button")],re=Z.indexOf(document.activeElement);z.preventDefault(),Z[(re+(z.shiftKey?-1:1)+Z.length)%Z.length]?.focus();return}(z.key==="Escape"||!g&&z.key===" ")&&(z.preventDefault(),z.stopPropagation(),se.close())},!0),_.observe(document.body,()=>{(!p.isConnected||j&&!j.isConnected)&&se.close(!1)},{childList:!0,subtree:!0}),N=new Viewer(v[0],Me),N.show()}catch(z){throw se.close(!1),z}}})(),window.ImageHoverPreview=class{constructor(i={}){this.scope=new te(`ui:image-hover:${Date.now()}`),this.config={selector:".hover-preview",dataAttribute:"data-full",maxWidth:1e3,maxHeight:1e3,offsetX:20,offsetY:20,zIndex:J.hoverPreview,owner:null,resolveOwner:null,zIndexStrategy:"fixed",transition:.2,hideDelay:100,loadedUrlLimit:128,autoAdjustPosition:!0,...i},this.config.loadedUrlLimit=Math.max(1,Number(this.config.loadedUrlLimit)||128),this.preview=null,this.currentTarget=null,this.timer=null,this.imgElement=null,this.pendingImage=null,this.placement=null,this.pointer=null,this.animationFrame=null,this.loadGeneration=0,this.destroyed=!1,this.currentUrl=null,this.pendingUrl=null,this.loadedUrls=new Map,this.eventsBound=!1,this.overlayObserver=null,this.onMouseEnter=n=>this.handleMouseEnter(n),this.onMouseLeave=n=>this.handleMouseLeave(n),this.onMouseMove=n=>this.handleMouseMove(n),this.onDocumentOver=n=>this.handleDocumentOver(n),this.onDocumentOut=n=>this.handleDocumentOut(n),this.onDocumentMove=n=>this.handleDocumentMove(n),this.onDocumentScroll=()=>this.handleDocumentScroll(),this.suppressUntilMouseMove=!1,this.init()}init(){utils.isMobileMode()||(this.injectStyles(),this.createPreviewElement(),this.bindEvents())}injectStyles(){if(document.getElementById("jhs-image-hover-preview-style"))return;let i=document.createElement("style");i.id="jhs-image-hover-preview-style",i.textContent=` .image-hover-preview { position: fixed; display: block; @@ -1982,8 +1982,8 @@ .console-logger-controls button,.console-logger-scroll-to-bottom { transition:background-color var(--jhs-motion-fast) ease; } .console-logger-filter { transition:background-color var(--jhs-motion-fast) ease,border-color var(--jhs-motion-fast) ease; } @media (prefers-reduced-motion:reduce) { .console-logger-toggle,.console-logger-toggle::after,.console-logger-window,.console-logger-controls button,.console-logger-filter,.console-logger-scroll-to-bottom { transition:none; } } - `);let i={base:{label:"信息",background:"var(--jhs-status-fav-tint)",borderLeftColor:"var(--jhs-accent)"},warn:{label:"警告",background:"var(--jhs-status-watch-tint)",borderLeftColor:"var(--jhs-status-watch)"},error:{label:"错误",background:"var(--jhs-status-filter-tint)",borderLeftColor:"var(--jhs-status-filter)"},debug:{label:"调试",background:"var(--jhs-surface-2)",borderLeftColor:"var(--jhs-border-strong)"}},n={base:["base","warn","error"],warn:["warn"],error:["error"],debug:["base","warn","error","debug"]},l=t,c="jhs_clog_maximize",h="jhs_clog_expand",u="jhs_clog_filter",g=class g{constructor(){let f=localStorage.getItem(u);this.currentFilter=f&&i[f]?f:"base",this.logs=[],this.isInitialized=!1,this.userScrolledUp=!1}tryInitialize(){return document.readyState!=="loading"&&(this.isInitialized||(this.init(),this.isInitialized=!0),!0)}init(){this.createContainer(),this.bindEvents(),this.checkInitialMaximizeState(),this.checkInitialCollapseState()}createContainer(){this.container=document.createElement("div"),this.container.className="console-logger-container jhs-ui",this.container.style.display="none",this.toggleBtn=document.createElement("button"),this.toggleBtn.type="button",this.toggleBtn.setAttribute("aria-label","展开或收起运行日志"),this.toggleBtn.className="console-logger-toggle collapsed",this.container.appendChild(this.toggleBtn),window.matchMedia?.("(max-width: 767px)").matches&&(this.toggleBtn.hidden=!0,this.toggleBtn.style.display="none"),this.window=document.createElement("div"),this.window.className="console-logger-window collapsed";let f=document.createElement("div");f.className="console-logger-header";let v=document.createElement("div");v.className="console-logger-title",v.textContent="JHS Console";let b=document.createElement("div");b.className="console-logger-controls",this.maximizeBtn=document.createElement("button"),this.maximizeBtn.textContent="",this.maximizeBtn.classList.add("console-logger-maximize-toggle"),b.appendChild(this.maximizeBtn);let w=document.createElement("button");w.textContent="清空",w.addEventListener("click",(()=>this.clear())),b.appendChild(w),f.appendChild(v),f.appendChild(b),this.filtersContainer=document.createElement("div"),this.filtersContainer.className="console-logger-filters",this.filterButtonGroup=document.createElement("div"),this.filterButtonGroup.className="console-logger-filter-group",this.filtersContainer.appendChild(this.filterButtonGroup),this.scrollToBottomBtn=document.createElement("button"),this.scrollToBottomBtn.className="console-logger-scroll-to-bottom",this.scrollToBottomBtn.textContent="到底部",this.filtersContainer.appendChild(this.scrollToBottomBtn),this.content=document.createElement("div"),this.content.className="console-logger-content jhs-scrollbar",this.window.appendChild(f),this.window.appendChild(this.filtersContainer),this.window.appendChild(this.content),this.container.appendChild(this.window),document.body.appendChild(this.container),Object.keys(i).forEach((S=>{let j=document.createElement("button");j.type="button",j.className="jhs-btn console-logger-filter",S===this.currentFilter&&j.classList.add("active"),j.textContent=i[S].label,j.dataset.type=S,j.addEventListener("click",(()=>this.setFilter(S))),this.filterButtonGroup.appendChild(j)}))}bindEvents(){this.toggleBtn.addEventListener("click",(()=>{this.toggleExpandCollapsed()})),this.maximizeBtn.addEventListener("click",(()=>this.toggleMaximize())),this.scrollToBottomBtn.addEventListener("click",(()=>{this.content.scrollTop=this.content.scrollHeight,this.userScrolledUp=!1})),this.content.addEventListener("scroll",(()=>{let f=this.content.scrollHeight-this.content.clientHeight<=this.content.scrollTop+5;this.userScrolledUp=!f})),this.content.addEventListener("wheel",(f=>{let v=this.content.scrollTop===0,b=this.content.scrollHeight-this.content.clientHeight<=this.content.scrollTop+1;(v&&f.deltaY<0||b&&f.deltaY>0)&&(f.preventDefault(),f.stopPropagation())}),{passive:!1})}toggleExpandCollapsed(){let f=this.window.classList.toggle("collapsed");this.toggleBtn.classList.toggle("collapsed"),f?localStorage.setItem(h,"no"):(localStorage.setItem(h,"yes"),this.reRenderAllLogs())}checkInitialCollapseState(){let f=localStorage.getItem(h);f&&f!=="no"?(this.window.classList.toggle("collapsed"),this.toggleBtn.classList.toggle("collapsed"),setTimeout((()=>{this.content.scrollTop=this.content.scrollHeight}),0)):(this.window.classList.add("collapsed"),this.toggleBtn.classList.add("collapsed"))}checkInitialMaximizeState(){localStorage.getItem(c)==="maximized"&&(this.window.classList.add("maximized"),this.maximizeBtn.classList.add("active"))}toggleMaximize(){let f=this.window.classList.toggle("maximized");this.maximizeBtn.classList.toggle("active",f),f?localStorage.setItem(c,"maximized"):localStorage.setItem(c,"minimized"),this.window.classList.contains("collapsed")||(this.content.scrollTop=this.content.scrollHeight)}addLog(f,v="base",...b){return this._appendLog(!1,f,v,...b)}addHtmlLog(f,v="base",...b){return this._appendLog(!0,f,v,...b)}_appendLog(f,v,b="base",...w){let S=this.tryInitialize(),j,k=[];i[b]?(j=b,k=w):(j="base",k=[b,...w]),j=i[j]?j:"base";let x=[v,...k],_="msg",R=[];x.forEach((A=>{if(Object.prototype.toString.call(A)==="[object Error]")R.push(String(A));else if(typeof A=="object"&&A!==null)try{R.push("
"+JSON.stringify(A,null,2)),_="json"}catch{R.push(String(A)),_="msg"}else R.push(String(A))}));let L=R.join(" ");f&&(L=L.replace(/(?:(?:https?|ftp):\/\/|www\.|(?:\/\/))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]/gi,(A=>{let O=A.startsWith("http")||A.startsWith("ftp"),U=A.startsWith("//"),q=A.startsWith("www."),Q=A;return U?Q=`http:${A}`:!O&&q&&(Q=`http://${A}`),`${T(A)}`})));let N={message:L,messageType:_,type:j,html:f,timestamp:new Date,id:Date.now()+Math.random()};if(this.logs.push(N),this.logs.length>l){this.logs.shift();let A=this.content.querySelector(".console-logger-entry");A&&A.remove()}S&&this.renderLog(N)}log(...f){let[v,...b]=f;setTimeout((()=>{this.addLog(v,"base",...b)}),0)}html(...f){let[v,...b]=f;setTimeout((()=>{this.addHtmlLog(v,"base",...b)}),0)}htmlDebug(...f){let[v,...b]=f;setTimeout((()=>{this.addHtmlLog(v,"debug",...b)}),0)}error(...f){let[v,...b]=f;console.error(...f),setTimeout((()=>{this.addLog(v,"error",...b)}),0)}warn(...f){let[v,...b]=f;setTimeout((()=>{this.addLog(v,"warn",...b)}),0)}debug(...f){let[v,...b]=f;setTimeout((()=>{this.addLog(v,"debug",...b)}),0)}renderLog(f){if(this.container.style.display==="none"||this.window.classList.contains("collapsed")||!(n[this.currentFilter]||[]).includes(f.type))return;let v=this._createLogElement(f);this.content.appendChild(v),this.window.classList.contains("collapsed")||this.userScrolledUp||(this.content.scrollTop=this.content.scrollHeight)}reRenderAllLogs(){this.container.style.display!=="none"&&(this.window.classList.contains("collapsed")||setTimeout((()=>{if(this.content.innerHTML="",this.logs.length===0)return;let f=n[this.currentFilter]||[],v=document.createDocumentFragment();this.logs.forEach((b=>{if(f.includes(b.type)){let w=this._createLogElement(b);v.appendChild(w)}})),this.content.appendChild(v),this.content.scrollTop=this.content.scrollHeight}),0))}_createLogElement(f){let v=document.createElement("div");v.className="console-logger-entry",v.dataset.type=f.type,v.dataset.id=f.id;let b=i[f.type]||i.base;v.style.borderLeft="3px solid "+b.borderLeftColor,v.style.background=b.background;let w=(f.timestamp instanceof Date?f.timestamp:new Date(f.timestamp)).toTimeString().split(" ")[0],S=document.createElement("span");S.className="console-logger-timestamp",S.textContent=`[${w}]`;let j=document.createElement("span");if(j.className="console-logger-message",j.dataset.type=f.messageType,f.html)j.innerHTML=f.message;else{let k=f.message.replace(//gi,` -`),x=/(?:(?:https?|ftp):\/\/|www\.|(?:\/\/))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]/gi,_=0,R;for(;R=x.exec(k);){R.index>_&&j.appendChild(document.createTextNode(k.slice(_,R.index)));let L=R[0],N=L;L.startsWith("//")?N=`http:${L}`:L.startsWith("www.")&&(N=`http://${L}`);let A=document.createElement("a");A.href=N,A.target="_blank",A.textContent=L,j.appendChild(A),_=R.index+R[0].length}_{v.dataset.type===f?v.classList.add("active"):v.classList.remove("active")})),this.reRenderAllLogs())}clear(){this.logs=[],this.content.innerHTML=""}openDialog(){if(!this.tryInitialize()||!this.window||typeof layer>"u")return;let f=document.createElement("div"),v=this.window.parentNode,b=this.window.getAttribute("style");f.className="jhs-ui jhs-logger-dialog",f.style.height="100%",this.window.classList.remove("collapsed","maximized"),Object.assign(this.window.style,{width:"100%",height:"100%",border:"0",borderRadius:"0",boxShadow:"none"}),this.reRenderAllLogs(),layer.open({type:1,title:"JHS 运行日志",content:f.outerHTML,area:utils.getDialogArea("md"),anim:-1,success:d(w=>{$(w).find(".jhs-logger-dialog")[0]?.appendChild(this.window),this.content.scrollTop=this.content.scrollHeight},"success"),end:d(()=>{v?.appendChild(this.window),b==null?this.window.removeAttribute("style"):this.window.setAttribute("style",b),this.window.classList.add("collapsed"),this.toggleBtn.classList.add("collapsed")},"end")})}show(){(this.isInitialized&&this.container||this.tryInitialize()&&this.container)&&(this.container.style.display="",this.reRenderAllLogs())}hide(){this.isInitialized&&this.container&&(this.container.style.display="none")}lowZIndex(){this.isInitialized&&this.container&&(this.container.style.zIndex=String(J.debugLow))}highZIndex(){this.isInitialized&&this.container&&(this.container.style.zIndex=String(J.debug))}};d(g,"o");let p=g;try{unsafeWindow.parent!==unsafeWindow&&unsafeWindow.parent.clog&&typeof unsafeWindow.parent.clog.log=="function"?s=unsafeWindow.parent.clog:s=new p}catch(m){console.error("创建日志控制台出现异常",m),s=new p}(function(){let m=d(()=>window.clog||console,"resolveClog");o.listen(window,"error",(function(f){let v=f.filename,b=f.message;typeof v=="string"&&(v.includes("javdb")||v.includes("javbus"))||m().error(`[全局 Error 异常捕获] ${b} 来源: ${v??"未知"}`)})),o.listen(window,"unhandledrejection",(function(f){let v=m(),b=f.reason,w=b?.message??"";if(["NotAllowedError","AbortError","NotSupportedError"].includes(b?.name)||w.includes("play()")||w.includes("The element has no supported sources"))return v.warn("[全局媒体播放异常] 当前媒体源无法播放",b),void f.preventDefault();if(w.includes("1005")&&w.includes("fc2ppvdb"))return;let S=`[全局 Promise 异常捕获] ${b.message||b}`;v.error(S,b),f.preventDefault()}))})(),o.listen(document,"mousedown",(m=>{let f=window.clog;if(!f.isInitialized||!f.container)return;let v=m.target,b=[".console-logger-container",".layui-layer-shade",".loading-container"].join(",");v.closest(b)?f.highZIndex():f.lowZIndex()}))})(),(function(){function i(l,c,h){let u=(function(R){let L=document.createElement("div");L.classList.add("js-tooltip");let N=document.createElement("div");return N.innerHTML=T(R),L.appendChild(N),document.body.appendChild(L),L})(c);u.style.display="block";let p=l.getBoundingClientRect(),g=u.getBoundingClientRect();u.style.display="none";let m=window.innerWidth,f=window.innerHeight,v,b,w=h,S=d(R=>R>=8&&R+g.height<=f-8,"h"),j=d(R=>R>=8&&R+g.width<=m-8,"g"),k=p.left+p.width/2-g.width/2,x=p.top+p.height/2-g.height/2;switch(h){case"top":b=p.top-g.height-0,b<8&&S(p.bottom+0)&&(b=p.bottom+0,w="bottom");break;case"bottom":b=p.bottom+0,b+g.height>f-8&&S(p.top-g.height-0)&&(b=p.top-g.height-0,w="top");break;case"left":v=p.left-g.width-0,v<8&&j(p.right+0)&&(v=p.right+0,w="right");break;case"right":v=p.right+0,v+g.width>m-8&&j(p.left-g.width-0)&&(v=p.left-g.width-0,w="left")}w==="top"||w==="bottom"?(v=k,v<8?v=8:v+g.width>m-8&&(v=m-g.width-8)):(w==="left"||w==="right")&&(b=x,b<8?b=8:b+g.height>f-8&&(b=f-g.height-8)),u.style.left=`${v}px`,u.style.top=`${b}px`,u.classList.add("is-active"),l.tooltipElement=u}d(i,"e"),document.head.insertAdjacentHTML("beforeend",` + `);let i={base:{label:"信息",background:"var(--jhs-status-fav-tint)",borderLeftColor:"var(--jhs-accent)"},warn:{label:"警告",background:"var(--jhs-status-watch-tint)",borderLeftColor:"var(--jhs-status-watch)"},error:{label:"错误",background:"var(--jhs-status-filter-tint)",borderLeftColor:"var(--jhs-status-filter)"},debug:{label:"调试",background:"var(--jhs-surface-2)",borderLeftColor:"var(--jhs-border-strong)"}},n={base:["base","warn","error"],warn:["warn"],error:["error"],debug:["base","warn","error","debug"]},l=t,c="jhs_clog_maximize",h="jhs_clog_expand",u="jhs_clog_filter",g=class g{constructor(){let f=localStorage.getItem(u);this.currentFilter=f&&i[f]?f:"base",this.logs=[],this.isInitialized=!1,this.userScrolledUp=!1}tryInitialize(){return document.readyState!=="loading"&&(this.isInitialized||(this.init(),this.isInitialized=!0),!0)}init(){this.createContainer(),this.bindEvents(),this.checkInitialMaximizeState(),this.checkInitialCollapseState()}createContainer(){this.container=document.createElement("div"),this.container.className="console-logger-container jhs-ui",this.container.style.display="none",this.toggleBtn=document.createElement("button"),this.toggleBtn.type="button",this.toggleBtn.setAttribute("aria-label","展开或收起运行日志"),this.toggleBtn.className="console-logger-toggle collapsed",this.container.appendChild(this.toggleBtn),window.matchMedia?.("(max-width: 767px)").matches&&(this.toggleBtn.hidden=!0,this.toggleBtn.style.display="none"),this.window=document.createElement("div"),this.window.className="console-logger-window collapsed";let f=document.createElement("div");f.className="console-logger-header";let v=document.createElement("div");v.className="console-logger-title",v.textContent="JHS Console";let b=document.createElement("div");b.className="console-logger-controls",this.maximizeBtn=document.createElement("button"),this.maximizeBtn.textContent="",this.maximizeBtn.classList.add("console-logger-maximize-toggle"),b.appendChild(this.maximizeBtn);let w=document.createElement("button");w.textContent="清空",w.addEventListener("click",(()=>this.clear())),b.appendChild(w),f.appendChild(v),f.appendChild(b),this.filtersContainer=document.createElement("div"),this.filtersContainer.className="console-logger-filters",this.filterButtonGroup=document.createElement("div"),this.filterButtonGroup.className="console-logger-filter-group",this.filtersContainer.appendChild(this.filterButtonGroup),this.scrollToBottomBtn=document.createElement("button"),this.scrollToBottomBtn.className="console-logger-scroll-to-bottom",this.scrollToBottomBtn.textContent="到底部",this.filtersContainer.appendChild(this.scrollToBottomBtn),this.content=document.createElement("div"),this.content.className="console-logger-content jhs-scrollbar",this.window.appendChild(f),this.window.appendChild(this.filtersContainer),this.window.appendChild(this.content),this.container.appendChild(this.window),document.body.appendChild(this.container),Object.keys(i).forEach((S=>{let j=document.createElement("button");j.type="button",j.className="jhs-btn console-logger-filter",S===this.currentFilter&&j.classList.add("active"),j.textContent=i[S].label,j.dataset.type=S,j.addEventListener("click",(()=>this.setFilter(S))),this.filterButtonGroup.appendChild(j)}))}bindEvents(){this.toggleBtn.addEventListener("click",(()=>{this.toggleExpandCollapsed()})),this.maximizeBtn.addEventListener("click",(()=>this.toggleMaximize())),this.scrollToBottomBtn.addEventListener("click",(()=>{this.content.scrollTop=this.content.scrollHeight,this.userScrolledUp=!1})),this.content.addEventListener("scroll",(()=>{let f=this.content.scrollHeight-this.content.clientHeight<=this.content.scrollTop+5;this.userScrolledUp=!f})),this.content.addEventListener("wheel",(f=>{let v=this.content.scrollTop===0,b=this.content.scrollHeight-this.content.clientHeight<=this.content.scrollTop+1;(v&&f.deltaY<0||b&&f.deltaY>0)&&(f.preventDefault(),f.stopPropagation())}),{passive:!1})}toggleExpandCollapsed(){let f=this.window.classList.toggle("collapsed");this.toggleBtn.classList.toggle("collapsed"),f?localStorage.setItem(h,"no"):(localStorage.setItem(h,"yes"),this.reRenderAllLogs())}checkInitialCollapseState(){let f=localStorage.getItem(h);f&&f!=="no"?(this.window.classList.toggle("collapsed"),this.toggleBtn.classList.toggle("collapsed"),setTimeout((()=>{this.content.scrollTop=this.content.scrollHeight}),0)):(this.window.classList.add("collapsed"),this.toggleBtn.classList.add("collapsed"))}checkInitialMaximizeState(){localStorage.getItem(c)==="maximized"&&(this.window.classList.add("maximized"),this.maximizeBtn.classList.add("active"))}toggleMaximize(){let f=this.window.classList.toggle("maximized");this.maximizeBtn.classList.toggle("active",f),f?localStorage.setItem(c,"maximized"):localStorage.setItem(c,"minimized"),this.window.classList.contains("collapsed")||(this.content.scrollTop=this.content.scrollHeight)}addLog(f,v="base",...b){return this._appendLog(!1,f,v,...b)}addHtmlLog(f,v="base",...b){return this._appendLog(!0,f,v,...b)}_appendLog(f,v,b="base",...w){let S=this.tryInitialize(),j,k=[];i[b]?(j=b,k=w):(j="base",k=[b,...w]),j=i[j]?j:"base";let x=[v,...k],_="msg",I=[];x.forEach((A=>{if(Object.prototype.toString.call(A)==="[object Error]")I.push(String(A));else if(typeof A=="object"&&A!==null)try{I.push("
"+JSON.stringify(A,null,2)),_="json"}catch{I.push(String(A)),_="msg"}else I.push(String(A))}));let L=I.join(" ");f&&(L=L.replace(/(?:(?:https?|ftp):\/\/|www\.|(?:\/\/))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]/gi,(A=>{let O=A.startsWith("http")||A.startsWith("ftp"),U=A.startsWith("//"),q=A.startsWith("www."),Q=A;return U?Q=`http:${A}`:!O&&q&&(Q=`http://${A}`),`${T(A)}`})));let N={message:L,messageType:_,type:j,html:f,timestamp:new Date,id:Date.now()+Math.random()};if(this.logs.push(N),this.logs.length>l){this.logs.shift();let A=this.content.querySelector(".console-logger-entry");A&&A.remove()}S&&this.renderLog(N)}log(...f){let[v,...b]=f;setTimeout((()=>{this.addLog(v,"base",...b)}),0)}html(...f){let[v,...b]=f;setTimeout((()=>{this.addHtmlLog(v,"base",...b)}),0)}htmlDebug(...f){let[v,...b]=f;setTimeout((()=>{this.addHtmlLog(v,"debug",...b)}),0)}error(...f){let[v,...b]=f;console.error(...f),setTimeout((()=>{this.addLog(v,"error",...b)}),0)}warn(...f){let[v,...b]=f;setTimeout((()=>{this.addLog(v,"warn",...b)}),0)}debug(...f){let[v,...b]=f;setTimeout((()=>{this.addLog(v,"debug",...b)}),0)}renderLog(f){if(this.container.style.display==="none"||this.window.classList.contains("collapsed")||!(n[this.currentFilter]||[]).includes(f.type))return;let v=this._createLogElement(f);this.content.appendChild(v),this.window.classList.contains("collapsed")||this.userScrolledUp||(this.content.scrollTop=this.content.scrollHeight)}reRenderAllLogs(){this.container.style.display!=="none"&&(this.window.classList.contains("collapsed")||setTimeout((()=>{if(this.content.innerHTML="",this.logs.length===0)return;let f=n[this.currentFilter]||[],v=document.createDocumentFragment();this.logs.forEach((b=>{if(f.includes(b.type)){let w=this._createLogElement(b);v.appendChild(w)}})),this.content.appendChild(v),this.content.scrollTop=this.content.scrollHeight}),0))}_createLogElement(f){let v=document.createElement("div");v.className="console-logger-entry",v.dataset.type=f.type,v.dataset.id=f.id;let b=i[f.type]||i.base;v.style.borderLeft="3px solid "+b.borderLeftColor,v.style.background=b.background;let w=(f.timestamp instanceof Date?f.timestamp:new Date(f.timestamp)).toTimeString().split(" ")[0],S=document.createElement("span");S.className="console-logger-timestamp",S.textContent=`[${w}]`;let j=document.createElement("span");if(j.className="console-logger-message",j.dataset.type=f.messageType,f.html)j.innerHTML=f.message;else{let k=f.message.replace(//gi,` +`),x=/(?:(?:https?|ftp):\/\/|www\.|(?:\/\/))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]/gi,_=0,I;for(;I=x.exec(k);){I.index>_&&j.appendChild(document.createTextNode(k.slice(_,I.index)));let L=I[0],N=L;L.startsWith("//")?N=`http:${L}`:L.startsWith("www.")&&(N=`http://${L}`);let A=document.createElement("a");A.href=N,A.target="_blank",A.textContent=L,j.appendChild(A),_=I.index+I[0].length}_{v.dataset.type===f?v.classList.add("active"):v.classList.remove("active")})),this.reRenderAllLogs())}clear(){this.logs=[],this.content.innerHTML=""}openDialog(){if(!this.tryInitialize()||!this.window||typeof layer>"u")return;let f=document.createElement("div"),v=this.window.parentNode,b=this.window.getAttribute("style");f.className="jhs-ui jhs-logger-dialog",f.style.height="100%",this.window.classList.remove("collapsed","maximized"),Object.assign(this.window.style,{width:"100%",height:"100%",border:"0",borderRadius:"0",boxShadow:"none"}),this.reRenderAllLogs(),layer.open({type:1,title:"JHS 运行日志",content:f.outerHTML,area:utils.getDialogArea("md"),anim:-1,success:d(w=>{$(w).find(".jhs-logger-dialog")[0]?.appendChild(this.window),this.content.scrollTop=this.content.scrollHeight},"success"),end:d(()=>{v?.appendChild(this.window),b==null?this.window.removeAttribute("style"):this.window.setAttribute("style",b),this.window.classList.add("collapsed"),this.toggleBtn.classList.add("collapsed")},"end")})}show(){(this.isInitialized&&this.container||this.tryInitialize()&&this.container)&&(this.container.style.display="",this.reRenderAllLogs())}hide(){this.isInitialized&&this.container&&(this.container.style.display="none")}lowZIndex(){this.isInitialized&&this.container&&(this.container.style.zIndex=String(J.debugLow))}highZIndex(){this.isInitialized&&this.container&&(this.container.style.zIndex=String(J.debug))}};d(g,"o");let p=g;try{unsafeWindow.parent!==unsafeWindow&&unsafeWindow.parent.clog&&typeof unsafeWindow.parent.clog.log=="function"?s=unsafeWindow.parent.clog:s=new p}catch(m){console.error("创建日志控制台出现异常",m),s=new p}(function(){let m=d(()=>window.clog||console,"resolveClog");o.listen(window,"error",(function(f){let v=f.filename,b=f.message;typeof v=="string"&&(v.includes("javdb")||v.includes("javbus"))||m().error(`[全局 Error 异常捕获] ${b} 来源: ${v??"未知"}`)})),o.listen(window,"unhandledrejection",(function(f){let v=m(),b=f.reason,w=b?.message??"";if(["NotAllowedError","AbortError","NotSupportedError"].includes(b?.name)||w.includes("play()")||w.includes("The element has no supported sources"))return v.warn("[全局媒体播放异常] 当前媒体源无法播放",b),void f.preventDefault();if(w.includes("1005")&&w.includes("fc2ppvdb"))return;let S=`[全局 Promise 异常捕获] ${b.message||b}`;v.error(S,b),f.preventDefault()}))})(),o.listen(document,"mousedown",(m=>{let f=window.clog;if(!f.isInitialized||!f.container)return;let v=m.target,b=[".console-logger-container",".layui-layer-shade",".loading-container"].join(",");v.closest(b)?f.highZIndex():f.lowZIndex()}))})(),(function(){function i(l,c,h){let u=(function(I){let L=document.createElement("div");L.classList.add("js-tooltip");let N=document.createElement("div");return N.innerHTML=T(I),L.appendChild(N),document.body.appendChild(L),L})(c);u.style.display="block";let p=l.getBoundingClientRect(),g=u.getBoundingClientRect();u.style.display="none";let m=window.innerWidth,f=window.innerHeight,v,b,w=h,S=d(I=>I>=8&&I+g.height<=f-8,"h"),j=d(I=>I>=8&&I+g.width<=m-8,"g"),k=p.left+p.width/2-g.width/2,x=p.top+p.height/2-g.height/2;switch(h){case"top":b=p.top-g.height-0,b<8&&S(p.bottom+0)&&(b=p.bottom+0,w="bottom");break;case"bottom":b=p.bottom+0,b+g.height>f-8&&S(p.top-g.height-0)&&(b=p.top-g.height-0,w="top");break;case"left":v=p.left-g.width-0,v<8&&j(p.right+0)&&(v=p.right+0,w="right");break;case"right":v=p.right+0,v+g.width>m-8&&j(p.left-g.width-0)&&(v=p.left-g.width-0,w="left")}w==="top"||w==="bottom"?(v=k,v<8?v=8:v+g.width>m-8&&(v=m-g.width-8)):(w==="left"||w==="right")&&(b=x,b<8?b=8:b+g.height>f-8&&(b=f-g.height-8)),u.style.left=`${v}px`,u.style.top=`${b}px`,u.classList.add("is-active"),l.tooltipElement=u}d(i,"e"),document.head.insertAdjacentHTML("beforeend",` - `);let n="[data-tip-top], [data-tip-bottom], [data-tip-left], [data-tip-right], [data-tip]";o.listen(document,"mouseover",(l=>{let c=l.target.closest(n);if(c&&!c.tooltipElement){let h,u="top";if(c.hasAttribute("data-tip-bottom")?(h=c.getAttribute("data-tip-bottom"),u="bottom"):c.hasAttribute("data-tip-left")?(h=c.getAttribute("data-tip-left"),u="left"):c.hasAttribute("data-tip-right")?(h=c.getAttribute("data-tip-right"),u="right"):c.hasAttribute("data-tip-top")?(h=c.getAttribute("data-tip-top"),u="top"):c.hasAttribute("data-tip")&&(h=c.getAttribute("data-tip"),u="top"),!h)return;c.hoverTimeout=setTimeout((()=>{c.matches(":hover")&&!c.tooltipElement&&i(c,h,u)}),50)}})),o.listen(document,"mouseout",(l=>{let c=l.target.closest(n);var h;c&&(c.hoverTimeout&&(clearTimeout(c.hoverTimeout),c.hoverTimeout=null),c.contains(l.relatedTarget)||c.tooltipElement&&((h=c.tooltipElement)&&h.parentNode&&h.remove(),c.tooltipElement=null))}))})();let a=window.loading,r=window.show;return ut=Object.freeze({loading:a,show:r,clog:s}),window.loading=ut.loading,window.show=ut.show,window.clog=ut.clog,ut}d(ll,"initializeLoggerRuntime");function cl(o=window){let e={$:o.jQuery,Tabulator:o.Tabulator,layer:o.layer,md5:o.md5,Toastify:o.Toastify,localforage:o.localforage,Viewer:o.Viewer},t=Object.entries(e).filter(([,s])=>s==null).map(([s])=>s);if(t.length)throw new Error(`Missing userscript vendor runtime: ${t.join(", ")}`);return Object.freeze(e)}d(cl,"getVendorRuntime");var ph=new Set(["star","genre","maker","actress","series","tag","search","director","studio","label"]),ti=class ti{constructor(e=document,t=window.location){this.site="javbus",this.document=e,this.location=t}resolveFirstPageUrl(e){try{let t=new URL(e),s=t.pathname.split("/").filter(Boolean),a=s[s.length-1],r=s[s.length-2];if(s.length>=2&&/^\d+$/.test(a)&&(r==="page"||s.length>=3&&ph.has(s[s.length-3]))){let n=r==="page"?s.slice(0,-2):s.slice(0,-1);t.pathname=n.length?"/"+n.join("/"):"/"}return t.href}catch{return e}}detectRoute(){return this.locateNativeMagnets()?"detail":this.locateListRoot()?"list":"other"}readMovieRef(){let e=this.document.querySelector(".info p span, [data-car-number]")?.textContent?.trim()??null;return e?Object.freeze({carNum:e,url:this.location.href,site:"javbus"}):null}locateListRoot(){return this.document.querySelector(".masonry")}locateListItems(){return[...this.locateListRoot()?.querySelectorAll(":scope > .item, :scope > .movie-box")??[]]}getListContainer(){return this.locateListRoot()?.parentElement??null}getListLayoutContainer(){return this.document.querySelector(".container-fluid .row")}createOwnedListRoot(e=[]){let t=this.document.createElement("div");return t.classList.add("masonry",...e),t}locateDetailRoot(){return this.locateNativeMagnets()?.closest(".container")??this.document.querySelector(".container .row.movie")?.parentElement??null}locateDetailSlots(){let e=this.locateDetailRoot();return Object.freeze({summary:e?.querySelector('[data-jhs-slot="summary-actions"]')??e?.querySelector(".row.movie")??null,resources:this.locateNativeMagnets(),reviews:e?.querySelector('[data-jhs-slot="reviews"]')??this.document.querySelector("#reviews"),related:e?.querySelector('[data-jhs-slot="related"]')})}locateNativeGallery(){return this.document.querySelector("#sample-waterfall, .sample-box")}locateNativeMagnets(){return this.document.querySelector("#magnet-table")}getDetailResourceBoundary(){let e=this.locateNativeMagnets(),t=this.locateDetailRoot();return!t||!e?null:Object.freeze({site:"javbus",hostRoot:t,controller:e,observeRoot:e.parentElement,resourceRoot:e,resourceRegion:[...t.children].find(s=>s===e||s.contains(e))||e,rows:d(()=>[...e.querySelectorAll("tr")].filter(s=>s.querySelector('td a[href^="magnet:"],td a[href^="ed2k:"]')),"rows"),sortSelect:null,getResource:d(s=>s.querySelector('td a[href^="magnet:"],td a[href^="ed2k:"]')?.getAttribute("href")||"","getResource"),getTitleTarget:d(s=>s.querySelector("td:first-child a:first-child"),"getTitleTarget"),hasSubtitleTag:d(s=>[...s.querySelectorAll("td:first-child a")].slice(1).some(a=>a.textContent?.includes("字幕")),"hasSubtitleTag"),getActionTarget(s){let a=[...s.querySelectorAll(".buttons,.actions,.btn-group")].filter(n=>n.closest("td")).at(-1);return a||s.querySelector('td a[href^="magnet:"],td a[href^="ed2k:"]')?.closest("td")||null},actionTargetRequiresWrapper:d(s=>![...s.querySelectorAll(".buttons,.actions,.btn-group")].some(a=>a.closest("td")),"actionTargetRequiresWrapper")})}};d(ti,"JavBusHostAdapter");var _s=ti;var gh=new Set(["ABC","ABP","ADN","ATID","BF","CAWD","DLDSS","DVAJ","FSDSS","HEYZO","HMN","IPX","IPZZ","JUQ","JUL","JUX","MEYD","MIAA","MIDE","MIDV","MIMK","MIRD","NIMA","PRED","RBD","SDDE","SONE","SSIS","SSNI","STARS","URE","VEC","WAAA","WANZ","XVSR"]);function ee(o){if(typeof o!="string")return null;let e=o.trim();if(!e||["undefined","null"].includes(e.toLowerCase()))return null;e=e.normalize("NFKC").replace(/[‐‑‒–—―﹘﹣-]/g,"-").replace(/[\s_]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toUpperCase();let t=e.match(/^([A-Z]{2,8})(\d{2,7})$/);return t&&gh.has(t[1])?`${t[1]}-${t[2]}`:e||null}d(ee,"normalizeMovieCarNum");function dl(o,e="https://javdb.com"){try{return new URL(String(o||""),e).pathname.match(/^\/v\/([^/]+)\/?$/)?.[1]||null}catch{return null}}d(dl,"extractJavDbMovieId");var si=class si{constructor(e=document,t=window.location){this.site="javdb",this.document=e,this.location=t}resolveFirstPageUrl(e){try{let t=new URL(e);return t.searchParams.delete("page"),t.href}catch{return e}}detectRoute(){return this.location.pathname.startsWith("/v/")||this.location.pathname.startsWith("/movies/")?"detail":this.location.pathname==="/users/collection_codes"?"owned-detail":["actor-ranking","award-ranking"].includes(this.getPageContext().kind)?"other":this.locateListRoot()?"list":"other"}getPageContext(){return je(this.location)}getTop250FilterContainer(){return this.document.querySelector("section .container")??this.getListContainer()}locateTop250SubtitleCards(){return this.locateListItems()}mountTop250SubtitleControls(e){let t=this.locateListRoot();t?.parentElement?.insertBefore(e,t)}mountExternalFc2Catalog(e){let t=this.getListContainer();if(!t)throw new Error("JavDB 列表容器不可用");t.querySelector(":scope > .box")?.remove(),t.querySelector(":scope > .tool-box")?.remove(),this.mountOwnedListRoot(t,e)}syncTop250SubtitleLinks(e){let t=this.getTop250FilterContainer();if(t)for(let s of t.querySelectorAll('a[href^="/rankings/top"],select[data-url^="/rankings/top"]')){let a=s.matches("select")?"data-url":"href",r=s.getAttribute(a);if(!r)continue;let i=new URL(r,this.location.origin);e==="all"?i.searchParams.delete("jhs_subtitle"):i.searchParams.set("jhs_subtitle",e),s.setAttribute(a,`${i.pathname}${i.search}`)}}readMovieRef(){let e=this.document.querySelector(".panel-block.first-block .value, [data-car-number]")?.textContent?.trim()??null;return e?Object.freeze({carNum:e,url:this.location.href,site:"javdb"}):null}locateListRoot(){return this.document.querySelector(".movie-list")}locateListItems(){return[...this.locateListRoot()?.querySelectorAll(":scope > .item")??[]]}getListContainer(){return this.locateListRoot()?.parentElement??null}getListLayoutContainer(){return this.document.querySelector("section .container")}createOwnedListRoot(e=[]){let t=this.document.createElement("div");return t.classList.add("movie-list","h","cols-4","vcols-8",...e),t}mountOwnedListRoot(e,t){for(let s of[...e.children])s.matches(".movie-list, nav.pagination")&&s.remove();e.append(t)}locateDetailRoot(){return this.document.querySelector(".video-detail")??this.document.querySelector(".movie-panel-info")?.closest(".container")??this.document.querySelector("main")}locateDetailSlots(){let e=this.locateDetailRoot();return Object.freeze({summary:e?.querySelector('[data-jhs-slot="summary-actions"]')??this.document.querySelector(".movie-panel-info"),resources:this.document.querySelector("#magnets-content"),reviews:e?.querySelector('[data-jhs-slot="reviews"]')??this.document.querySelector("#reviews"),related:e?.querySelector('[data-jhs-slot="related"]')})}locateNativeGallery(){return this.document.querySelector(".tile-images, .preview-images")}locateNativeMagnets(){return this.document.querySelector("#magnets-content")}getDetailResourceBoundary(){let e=this.locateNativeMagnets(),t=e?.closest('[data-controller="magnet-sort"]'),s=this.locateDetailRoot();if(!s||!t||!e)return null;let a=[...s.children].find(r=>r===t||r.contains(t))||t;return Object.freeze({site:"javdb",hostRoot:s,controller:t,observeRoot:t,resourceRoot:e,resourceRegion:a,rows:d(()=>[...e.children].filter(r=>r.matches(".item")),"rows"),sortSelect:t.querySelector('select[data-action*="magnet-sort#sort"]'),prepareLayout(){e.setAttribute("data-jhs-magnets","true"),a.setAttribute("data-jhs-host-region","resources");let r=e.closest(".message.video-panel, .video-panel")||t;r.setAttribute("data-jhs-resource-surface","true");let i=e.closest(".message-body");i&&r.contains(i)&&i.setAttribute("data-jhs-resource-body","true");for(let n of e.children){if(!n.matches(".item"))continue;let l=n.querySelector(":scope > .magnet-name"),c=n.querySelector(":scope > .date"),h=n.querySelector(":scope > .buttons");!l||!h||(n.setAttribute("data-jhs-magnet-row","true"),l.setAttribute("data-jhs-magnet-part","info"),c?.setAttribute("data-jhs-magnet-part","date"),h.setAttribute("data-jhs-magnet-part","actions"))}},getResource(r){return r.querySelector('.copy-to-clipboard[data-clipboard-text^="magnet:"]')?.getAttribute("data-clipboard-text")||r.querySelector('.magnet-name a[href^="magnet:"]')?.getAttribute("href")||""},getActionTarget:d(r=>r.querySelector(":scope > .buttons"),"getActionTarget"),actionTargetRequiresWrapper:d(()=>!1,"actionTargetRequiresWrapper"),getTitleTarget:d(r=>r.querySelector(".name"),"getTitleTarget"),hasSubtitleTag:d(()=>!1,"hasSubtitleTag")})}parseActorMovies(e,t){if(typeof e!="string")throw new TypeError("JavDB actor page must be HTML text");let s=new DOMParser().parseFromString(e,"text/html"),a=s.querySelector("title")?.textContent??s.body?.textContent??"";if(/Just a moment|cf-chl-|Cloudflare/i.test(a))throw new TypeError("JavDB actor page is a challenge page");let r=[...s.querySelectorAll(".movie-list .item")];return Object.freeze(r.flatMap(i=>{let n=i.querySelector(".video-title"),l=n?.querySelector("strong")?.textContent?.trim()??"",c=ee(l);if(!c)return[];let h=i.querySelector("img")?.getAttribute("src")??"",u=i.querySelector("a[href]")?.getAttribute("href")??"",p=i.querySelector(".score .value, .score")?.textContent?.trim()??"",g=i.querySelector(".score .count, .meta .count")?.textContent?.trim()??"";return[Object.freeze({carNum:c,title:(n?.textContent??"").replace(l,"").trim(),coverUrl:h?new URL(h,t).href.replace("thumbs","covers"):null,url:u?new URL(u,t).href:null,publishTime:i.querySelector(".meta")?.textContent?.trim()||null,score:Number.parseFloat(p)||0,voteCount:Number.parseInt(g.replace(/[^\d]/g,""))||0})]}))}parseActorCollection(e,t){if(typeof e!="string")throw new TypeError("JavDB actor collection must be HTML text");let s=new DOMParser().parseFromString(e,"text/html"),a=s.querySelector("title")?.textContent??s.body?.textContent??"";if(/Just a moment|cf-chl-|Cloudflare/i.test(a))return Object.freeze({state:"challenge",isEmpty:!1,actors:Object.freeze([]),nextUrl:null});let r=s.querySelector("#actors");if(!r)return Object.freeze({state:"invalid",isEmpty:!1,actors:Object.freeze([]),nextUrl:null});try{let i=[...r.querySelectorAll(".actor-box")],n=i.map(h=>{let u=h.querySelector("a[title][href]"),p=u?.getAttribute("title")??"",g=u?.getAttribute("href")??"",m=u?.querySelector("img")?.getAttribute("src")??"",f=p.split(",").map(w=>w.trim()).filter(Boolean),v=new URL(g,t),b=v.pathname.split("/").filter(Boolean).pop()??"";if(!b||!f.length)throw new TypeError("演员卡身份字段无效");return Object.freeze({starId:b,name:f[0],allName:Object.freeze(f),avatar:m?new URL(m,t).href:null,actressType:u?.querySelector(".info")?.textContent?.trim().includes("無碼")?"uncensored":"censored",lastCheckTime:null,lastUpdateTime:null})}),l=s.querySelector(".pagination-next")?.getAttribute("href"),c=l?new URL(l,t).href:null;return Object.freeze({state:"valid",isEmpty:i.length===0,actors:Object.freeze(n),nextUrl:c})}catch{return Object.freeze({state:"invalid",isEmpty:!1,actors:Object.freeze([]),nextUrl:null})}}};d(si,"JavDbHostAdapter");var $s=si;var mh=new Set(["system","feature"]),fh=new Set(["eager","idle","on-command","on-demand"]),vh=new Set(["builtin-public","custom-public","user-local"]),bh=new Set(["bronze","silver"]);function pt(o,e){if(typeof o!="string"||o.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}d(pt,"requireNonEmptyString");function hl(o,e){if(!Array.isArray(o))throw new TypeError(`${e} must be an array`)}d(hl,"requireArray");function Pt(o,e){hl(o,e);let t=o;for(let s of t)pt(s,`${e} item`);if(new Set(t).size!==t.length)throw new TypeError(`${e} cannot contain duplicates`)}d(Pt,"requireUniqueStrings");function ai(o,e){hl(o,e);let t=o;if(t.some(s=>typeof s!="symbol"))throw new TypeError(`${e} must contain dependency tokens`);if(new Set(t).size!==t.length)throw new TypeError(`${e} cannot contain duplicate tokens`)}d(ai,"requireUniqueTokens");function Ee(o){if(pt(o.id,"Feature id"),!mh.has(String(o.kind)))throw new TypeError("Feature kind must be system or feature");if(!fh.has(String(o.startup)))throw new TypeError("Feature startup mode is invalid");for(let e of["sites","routes","contributes","providesCommands"])Pt(o[e],e);if(ai(o.requires,"requires"),typeof o.activate!="function")throw new TypeError("Feature activate must be a function");if(typeof o.disableable!="boolean")throw new TypeError("Feature disableable must be explicit");if(o.kind==="system"&&o.disableable!==!1)throw new TypeError("System features cannot be disableable");return Object.freeze({...o})}d(Ee,"defineFeature");function ul(o){if(pt(o.id,"Contribution id"),pt(o.featureId,"Contribution featureId"),pt(o.legacyPluginId,"Contribution legacyPluginId"),Pt(o.sites,"sites"),Pt(o.routes,"routes"),Pt(o.surfaces,"surfaces"),ai(o.requires,"requires"),typeof o.plugin!="function")throw new TypeError("Contribution plugin must be a class");if(!o.order||typeof o.order!="object")throw new TypeError("Contribution order must be explicit");return Object.freeze({...o,sites:Object.freeze([...o.sites]),routes:Object.freeze([...o.routes]),surfaces:Object.freeze([...o.surfaces]),order:Object.freeze({...o.order})})}d(ul,"defineContribution");function W(o){if(pt(o.id,"Integration id"),!vh.has(String(o.trustClass)))throw new TypeError("Integration trustClass is invalid");if(!bh.has(String(o.quality)))throw new TypeError("Integration quality is invalid");Pt(o.hosts,"hosts"),Pt(o.capabilities,"capabilities"),ai(o.requires,"requires");let e=o.hosts,t=o.capabilities;if(e.length===0||t.length===0)throw new TypeError("Integration hosts and capabilities cannot be empty");for(let s of e){let a=String(s);if(a!==a.toLowerCase()||new URL(`https://${a}`).hostname!==a)throw new TypeError(`Integration host is invalid: ${a}`)}if(o.cachePolicy===void 0)throw new TypeError("Integration cachePolicy must be explicit");if(o.cachePolicy!=="none"){if(!o.cachePolicy||typeof o.cachePolicy!="object"||Array.isArray(o.cachePolicy))throw new TypeError("Integration cachePolicy must be none or a capability map");let s=o.cachePolicy,a=t.filter(i=>!Object.hasOwn(s,String(i))),r=Object.keys(s).filter(i=>!t.includes(i));if(a.length||r.length)throw new TypeError(`Integration cachePolicy mismatch (missing: ${a.join(", ")||"none"}; extra: ${r.join(", ")||"none"})`);for(let[i,n]of Object.entries(s))pt(n,`cachePolicy.${i}`)}if(typeof o.createClient!="function"||typeof o.createAdapter!="function")throw new TypeError("Integration client and adapter factories are required");if(o.createHostAdapter!==null&&typeof o.createHostAdapter!="function")throw new TypeError("Integration createHostAdapter must be a function or explicit null");return Object.freeze({...o})}d(W,"defineIntegration");function G(o,e){return Symbol.for(`jhs.${o}.${e}`)}d(G,"createToken");var Y=Object.freeze({navigation:G("port","navigation"),http:G("port","http"),storage:G("port","storage"),dialog:G("port","dialog"),style:G("port","style"),host:G("port","host"),javdbHost:G("port","javdb-host"),javbusHost:G("port","javbus-host")}),y=Object.freeze({diagnostics:G("service","diagnostics"),urlPolicy:G("service","url-policy"),navigation:G("service","navigation"),http:G("service","http"),storage:G("service","storage"),webdav:G("service","webdav"),credential:G("service","credential"),dialog:G("service","dialog"),settings:G("service","settings"),movie:G("service","movie"),actressInfo:G("service","actress-info"),imageSearch:G("service","image-search"),review:G("service","review"),related:G("service","related"),magnet:G("service","magnet"),screenshot:G("service","screenshot"),translation:G("service","translation"),subtitle:G("service","subtitle"),account:G("service","account"),offline:G("service","offline"),cache:G("service","cache"),state:G("service","state"),profile:G("service","profile")}),Qe=Object.freeze({command:G("registry","command"),feature:G("registry","feature"),provider:G("registry","provider"),settings:G("registry","settings"),integration:G("registry","integration")}),ke=Object.freeze({externalDetail:"external-detail-v1"});var ri=class ri{constructor(e){this.hostAdapter=e,this.root=null,this.slots=Object.freeze({}),this.mounted=new Map,this.created=new Set}mount(){return this.root=this.hostAdapter.locateDetailRoot(),this.root&&this.ensureOwnedSlots(),this.slots=Object.freeze({...this.hostAdapter.locateDetailSlots()}),this}ensureOwnedSlots(){if(!this.root)return;let e=this.root.ownerDocument,t=this.root.querySelector(':scope > [data-jhs-slot="summary-actions"]');t||(t=e.createElement("div"),t.className="jhs-detail-owned-slot jhs-detail-owned-slot--summary-actions",t.setAttribute("data-jhs-slot","summary-actions"),this.root.append(t),this.created.add(t));let s=this.root.querySelector(':scope > [data-jhs-slot-group="post-resource"]');s||(s=e.createElement("div"),s.className="jhs-detail-post-resource",s.setAttribute("data-jhs-slot-group","post-resource"),this.root.append(s),this.created.add(s));for(let a of["reviews","related"]){if(s.querySelector(`[data-jhs-slot="${a}"]`))continue;let r=e.createElement("section");r.className=`jhs-detail-owned-slot jhs-detail-owned-slot--${a}`,r.setAttribute("data-jhs-slot",a),s.append(r),this.created.add(r)}}mountPanel(e,t){let s=this.slots[e];return s?(s.append(t),this.mounted.set(e,t),!0):!1}dispose(){for(let e of this.mounted.values())e.remove();for(let e of this.created)e.remove();this.mounted.clear(),this.created.clear(),this.root=null,this.slots=Object.freeze({})}};d(ri,"HostedDetailSurface");var Ts=ri;var ii=class ii{constructor(e){this.hostAdapter=e.hostAdapter,this.scope=e.scope,this.enabledContributions=new Set(e.enabledContributions),this.surface=new Ts(this.hostAdapter),this.movieRef=null}start(){return this.scope.assertActive(),this.surface.mount(),this.movieRef=this.hostAdapter.readMovieRef(),Object.freeze({movieRef:this.movieRef,contributions:[...this.enabledContributions]})}dispose(){this.surface.dispose(),this.scope.dispose()}};d(ii,"DetailController");var As=ii;var pl=Ee({id:"detail",kind:"feature",disableable:!0,sites:["javdb","javbus"],routes:["detail","owned-detail"],startup:"eager",requires:[Y.host,y.movie,y.review,y.related,y.magnet,y.screenshot],contributes:["detail.javdb-native","detail.javbus-native","detail.workspace","detail.fc2-owned","detail.fc2-navigation","detail.fc2-lookup","detail.cover-state-actions","detail.page-state-actions","detail.javdb-preview","detail.javbus-images","detail.javbus-preview","detail.reviews","detail.related","detail.native-magnets","detail.external-magnets","detail.screenshot","detail.external-sites"],providesCommands:[],activate:d((o,e)=>{if(e.route==="owned-detail")return{dispose:d(()=>{},"dispose")};let t=new As({hostAdapter:o[Y.host],scope:e.scope,enabledContributions:e.enabledContributions});return t.start(),{dispose:d(()=>t.dispose(),"dispose")}},"activate")});var Rt=d((o,e,t)=>Ee({id:o,kind:"feature",disableable:!0,sites:e,routes:[],startup:"eager",requires:[],contributes:t,providesCommands:[],activate:d(()=>({}),"activate")}),"feature"),gl=Object.freeze([Rt("list",["javdb","javbus"],["list.core","list.auto-page","list.fold-category","list.actions"]),Rt("library",["javdb","javbus"],["library.history","library.keyword-filter","library.state-actions","library.blacklist","library.favorite-actresses"]),Rt("discovery",["javdb","javbus"],["discovery.hit-show","discovery.top250","discovery.new-video","discovery.scheduler"]),Rt("external-bridge",["javdb","javbus","123pan","javtrailers","subtitlecat"],["external-bridge.translation","external-bridge.115-match","external-bridge.offline","external-bridge.123pan","external-bridge.javtrailers","external-bridge.subtitle"]),Rt("identity",["javdb","javbus"],["identity.javdb-navigation","identity.javbus-navigation","identity.image-search","identity.actress-info"]),Rt("compatibility",["javdb","javbus"],["compatibility.enhancements"])]);var gt=null;function ml(o){if(typeof o!="function")throw new TypeError("Settings UI owner must be a function");if(gt&>!==o)throw new Error("Settings UI owner is already registered");return gt=o,()=>{gt===o&&(gt=null)}}d(ml,"registerSettingsUiOwner");function fl(o){if(!gt)throw new Error("Settings UI owner is not ready");return gt(o)}d(fl,"openSettingsUi");var vl=Object.freeze([Ee({id:"settings",kind:"system",disableable:!1,sites:[],routes:[],startup:"on-command",requires:[y.diagnostics,y.profile],contributes:["settings.core"],providesCommands:["settings.open"],activate:d(()=>({commands:{"settings.open":d(()=>fl(),"settings.open")}}),"activate")}),Ee({id:"diagnostics",kind:"system",disableable:!1,sites:[],routes:[],startup:"eager",requires:[y.diagnostics],contributes:[],providesCommands:["diagnostics.export"],activate:d(o=>({commands:{"diagnostics.export":d(()=>o[y.diagnostics].exportSnapshot(),"diagnostics.export")}}),"activate")}),Ee({id:"responsive-shell",kind:"system",disableable:!1,sites:[],routes:[],startup:"eager",requires:[y.profile],contributes:["responsive-shell.bottom-bar"],providesCommands:[],activate:d(o=>({profile:o[y.profile].current()}),"activate")}),Ee({id:"stats",kind:"system",disableable:!1,sites:["javdb","javbus"],routes:[],startup:"idle",requires:[y.diagnostics],contributes:["stats.dashboard"],providesCommands:[],activate:d(o=>({diagnostics:o[y.diagnostics]}),"activate")})]);var bl=Object.freeze([...vl,pl,...gl]);var wl=Object.freeze({AutoPagePlugin:["ListPagePlugin"],BlacklistPlugin:["TaskPlugin","SettingPlugin","ListPagePlugin"],BusNavBarPlugin:["SearchByImagePlugin"],CompatibilityEnhancementsPlugin:["ListPagePlugin"],CoverButtonPlugin:["ListPagePlugin","ScreenShotPlugin"],DetailPageButtonPlugin:["DetailWorkspacePlugin","MagnetHubPlugin","HighlightMagnetPlugin"],Fc2NavigationPlugin:["Fc2Plugin"],Fc2Plugin:["DetailPageButtonPlugin","MagnetHubPlugin","FilterTitleKeywordPlugin","OtherSitePlugin","Fc2By123AvPlugin","ScreenShotPlugin"],Fc2By123AvPlugin:["ListPagePlugin"],HistoryPlugin:["UnifiedOfflinePlugin","ListPagePlugin","Fc2Plugin"],ListPageButtonPlugin:["NewVideoPlugin","BlacklistPlugin","ListPagePlugin"],ListPagePlugin:["HistoryPlugin","ListPageButtonPlugin","CoverButtonPlugin","AutoPagePlugin","BusImgPlugin","Fc2Plugin"],MobileBottomBarPlugin:["ListPagePlugin","DetailPageButtonPlugin","ListPageButtonPlugin","NewVideoPlugin","BlacklistPlugin","SettingPlugin","HighlightMagnetPlugin","MagnetHubPlugin","HistoryPlugin"],NavBarPlugin:["SearchByImagePlugin"],NewVideoPlugin:["TaskPlugin","SettingPlugin"],PreviewVideoPlugin:["DetailPageButtonPlugin"],SettingPlugin:["CoverButtonPlugin","TaskPlugin","OtherSitePlugin","ListPagePlugin","TranslatePlugin","ActressInfoPlugin","ScreenShotPlugin","NewVideoPlugin","BlacklistPlugin","BusImgPlugin"],StatsPlugin:["NewVideoPlugin","ListPagePlugin"],TaskPlugin:["BlacklistPlugin"],TranslatePlugin:["ListPagePlugin"],UnifiedOfflinePlugin:["OneTwoThreeOfflinePlugin"]});var ni=class ni extends I{constructor(){super(...arguments),this._generation=0}getName(){return"ActressInfoPlugin"}async handle(){let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")(),s=d(a=>{a.detail?.names?.includes("enableLoadActressInfo")&&(e.snapshot().enableLoadActressInfo==="no"?this.unmount():this.mount().catch((i=>clog.error("演员信息重新挂载失败",i))))},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>e.removeEventListener("settings.changed",s))),await this.mount()}async mount(){if(this.getRuntimeService("settings").snapshot().enableLoadActressInfo==="no")return;this._generation++;let e=window.location.pathname;e.startsWith("/v/")||e.startsWith("/movies/")?await this.handleDetailPage():e.startsWith("/actors/")&&await this.handleStarPage()}unmount(){this._generation++,$(".actress-info").remove()}isStillActive(e){return e===this._generation&&this.getRuntimeService("settings").snapshot().enableLoadActressInfo!=="no"}async initCss(){return``}async handleDetailPage(){if($(".actress-info").length>0)return;let e=this._generation,t=$(".female"),s=t.prev().map(((n,l)=>$(l).text().trim())).get();if(!s.length)return;let a=[];for(let n of s){let l=null;try{l=await this.searchInfo(n)}catch(h){clog.error("演员资料查询失败",n,h)}if(!this.isStillActive(e))return;let c=$('
');if(l){c.append($("").text(`${n}:`));let h=$("").attr({href:l.url,target:"_blank",rel:"noopener noreferrer"}).addClass("jhs-layout-9813a0dd");h.append($("").addClass("info-tag").text(`${l.birthday} ${l.age}`.trim()),$("").addClass("info-tag").text(`${l.height} ${l.weight}`.trim()),$("").addClass("info-tag").text(`${l.threeSizeText} ${l.braSize}`.trim())),c.append(h)}else{let h=this.getRuntimeService("actressInfo").profileUrl(n);c.append($("").attr({href:h,target:"_blank",rel:"noopener noreferrer"}).append($("").text(`${n}:`)))}a.push(c)}if(!this.isStillActive(e))return;let r=$("strong").filter(((n,l)=>/^(?:演員|演员)\s*:?$/.test($(l).text().trim()))).first().parent(),i=t.first().closest(".panel-block");r.length?r.after(...a):i.after(...a)}async handleStarPage(){if($(".actress-info").length>0)return;let e=this._generation,t=[],s=$(".actor-section-name");s.length&&s.text().trim().split(",").forEach((l=>t.push(l.trim())));let a=$(".section-meta:not(:contains('影片'))");if(a.length&&a.text().trim().split(",").forEach((l=>t.push(l.trim()))),!t.length)return;let r=null;for(let l of t){try{r=await this.searchInfo(l)}catch(c){clog.error("演员资料查询失败",l,c)}if(!this.isStillActive(e))return;if(r)break}let i=$('
');if(!r)i.text("无此相关演员信息");else{let l=$('
'),c=$('
');l.append($("").addClass("jhs-layout-dd5a75f6").text(`出生日期: ${r.birthday}`),$("").addClass("jhs-layout-d4a09a0d").text(`年龄: ${r.age}`),$("").addClass("jhs-layout-d4a09a0d").text(`身高: ${r.height}`)),c.append($("").addClass("jhs-layout-dd5a75f6").text(`体重: ${r.weight}`),$("").addClass("jhs-layout-d4a09a0d").text(`三围: ${r.threeSizeText}`),$("").addClass("jhs-layout-d4a09a0d").text(`罩杯: ${r.braSize}`)),i.append(l,c)}if(!this.isStillActive(e))return;let n=r?$("").addClass("actress-info").attr({href:r.url,target:"_blank",rel:"noopener noreferrer"}).append(i):i.addClass("actress-info");s.parent().append(n)}async searchInfo(e){let t=await this.getRuntimeService("scope")();return this.getRuntimeService("actressInfo").lookup(e,{scope:t})}};d(ni,"ActressInfoPlugin");var Ps=ni;var oi=class oi extends I{constructor(){super(...arguments),P(this,"isUploading",!1)}getName(){return"SearchByImagePlugin"}async initCss(){return` + `}async handleDetailPage(){if($(".actress-info").length>0)return;let e=this._generation,t=$(".female"),s=t.prev().map(((n,l)=>$(l).text().trim())).get();if(!s.length)return;let a=[];for(let n of s){let l=null;try{l=await this.searchInfo(n)}catch(h){clog.error("演员资料查询失败",n,h)}if(!this.isStillActive(e))return;let c=$('
');if(l){c.append($("").text(`${n}:`));let h=$("").attr({href:l.url,target:"_blank",rel:"noopener noreferrer"}).addClass("jhs-layout-9813a0dd");h.append($("").addClass("info-tag").text(`${l.birthday} ${l.age}`.trim()),$("").addClass("info-tag").text(`${l.height} ${l.weight}`.trim()),$("").addClass("info-tag").text(`${l.threeSizeText} ${l.braSize}`.trim())),c.append(h)}else{let h=this.getRuntimeService("actressInfo").profileUrl(n);c.append($("").attr({href:h,target:"_blank",rel:"noopener noreferrer"}).append($("").text(`${n}:`)))}a.push(c)}if(!this.isStillActive(e))return;let r=$("strong").filter(((n,l)=>/^(?:演員|演员)\s*:?$/.test($(l).text().trim()))).first().parent(),i=t.first().closest(".panel-block");r.length?r.after(...a):i.after(...a)}async handleStarPage(){if($(".actress-info").length>0)return;let e=this._generation,t=[],s=$(".actor-section-name");s.length&&s.text().trim().split(",").forEach((l=>t.push(l.trim())));let a=$(".section-meta:not(:contains('影片'))");if(a.length&&a.text().trim().split(",").forEach((l=>t.push(l.trim()))),!t.length)return;let r=null;for(let l of t){try{r=await this.searchInfo(l)}catch(c){clog.error("演员资料查询失败",l,c)}if(!this.isStillActive(e))return;if(r)break}let i=$('
');if(!r)i.text("无此相关演员信息");else{let l=$('
'),c=$('
');l.append($("").addClass("jhs-layout-dd5a75f6").text(`出生日期: ${r.birthday}`),$("").addClass("jhs-layout-d4a09a0d").text(`年龄: ${r.age}`),$("").addClass("jhs-layout-d4a09a0d").text(`身高: ${r.height}`)),c.append($("").addClass("jhs-layout-dd5a75f6").text(`体重: ${r.weight}`),$("").addClass("jhs-layout-d4a09a0d").text(`三围: ${r.threeSizeText}`),$("").addClass("jhs-layout-d4a09a0d").text(`罩杯: ${r.braSize}`)),i.append(l,c)}if(!this.isStillActive(e))return;let n=r?$("").addClass("actress-info").attr({href:r.url,target:"_blank",rel:"noopener noreferrer"}).append(i):i.addClass("actress-info");s.parent().append(n)}async searchInfo(e){let t=await this.getRuntimeService("scope")();return this.getRuntimeService("actressInfo").lookup(e,{scope:t})}};d(ui,"ActressInfoPlugin");var Ds=ui;var pi=class pi extends R{constructor(){super(...arguments),P(this,"isUploading",!1)}getName(){return"SearchByImagePlugin"}async initCss(){return` - `}d(Fl,"buildSettingCss");async function kh(o=null,e){if($("#verticalImgStyle").remove(),(e===void 0?await storageManager.getSetting("enableVerticalModel",ne):e)===E){let s="100% 50% !important";window.location.pathname==="/tags/fc2"&&new URLSearchParams(window.location.search).get("jhs_source")==="123av"&&(s="50% 50% !important");let a=` + `}d(Gl,"buildSettingCss");async function Ih(o=null,e){if($("#verticalImgStyle").remove(),(e===void 0?await storageManager.getSetting("enableVerticalModel",ne):e)===E){let s="100% 50% !important";window.location.pathname==="/tags/fc2"&&new URLSearchParams(window.location.search).get("jhs_source")==="123av"&&(s="50% 50% !important");let a=` .cover { aspect-ratio: 3 / 4.26; overflow: hidden !important; @@ -2569,7 +2569,7 @@ object-fit: contain !important; object-position: top; } - `).appendTo("head")}d(kh,"applyImageMode");async function vi(o={},{busImgPlugin:e=null,hostAdapter:t=null}={}){let s=o.enableVerticalModel===void 0?ne:o.enableVerticalModel;await kh(e,s);let a=globalThis.utils?.isMobileMode?.()??!1,r=a?1:Number(o.containerColumns??5)||5,i=a?100:Number(o.containerWidth??100)||100;if(B&&e?.logImageHeightsByRow&&await e.logImageHeightsByRow({vertical:s,columns:r}),t){let n=t.locateListRoot?.();n&&(n.style.gridTemplateColumns=`repeat(${r}, minmax(0, 1fr))`);let l=t.getListLayoutContainer?.();l&&(l.style.minWidth=`${i}%`)}}d(vi,"applyLayoutFromSettings");var bi=new WeakMap;function yi(o){let e=bi.get(o);return e||(e=new wi(o),bi.set(o,e)),e}d(yi,"getSettingBindingHub");function Vl({root:o,selector:e,key:t,getValue:s,setValue:a,fallback:r=void 0,label:i=t,settings:n,onChange:l=null}){let c=yi(n),h=o.find(e);if(!h.length)return null;let u={setValue(p,g){p===t&&a(g)},dispose(){h.off(".jhsSettingBinding"),c._dropBinding(u)}};return c.bindings.add(u),h.off(".jhsSettingBinding").on("change.jhsSettingBinding",()=>{let p=s();l?.(t,p),c.userChanged(t,p,r,i)}),u.setValue(t,c.desiredValue(t,n.snapshot()[t]??r)),{sync(p){Object.prototype.hasOwnProperty.call(p,t)&&a(p[t])},flush:d(p=>c.flush(p),"flush"),dispose:d(()=>u.dispose(),"dispose")}}d(Vl,"bindSettingControl");function Ve({settings:o,key:e,fallback:t=void 0,apply:s,onError:a=d(()=>{},"onError")}){let r=0;return async i=>{let n=++r;s(i);try{await o.set(e,i)}catch(l){n===r&&(s(o.snapshot()[e]??t),a(l))}}}d(Ve,"createLatestSettingWriter");var ji=class ji{constructor(e){this.settings=e,this.bindings=new Set,this.pending=new Map,this.revision=0,this._onSettingsChanged=this._onSettingsChanged.bind(this),this.settings.addEventListener("settings.changed",this._onSettingsChanged)}_onSettingsChanged(e){let t=e.detail||{},s=t.snapshot??this.settings.snapshot(),a=Array.isArray(t.names)?t.names:Object.keys(s);for(let r of a){let i=this.pending.get(r);this.syncAll(r,i?i.value:s[r])}}syncAll(e,t){for(let s of this.bindings)s.setValue(e,t)}desiredValue(e,t){let s=this.pending.get(e);return s?s.value:t}userChanged(e,t,s,a){this.syncAll(e,t);let i={token:++this.revision,value:t,promise:Promise.resolve()},n=this.settings.set(e,t).then(()=>{this.pending.get(e)===i&&(this.pending.delete(e),this._maybeDispose())},l=>{if(this.pending.get(e)===i){this.pending.delete(e),i.error=l;let c=this.settings.snapshot()[e]??s;this.syncAll(e,c),this._maybeDispose(),typeof globalThis.show?.error=="function"?globalThis.show.error(`${a||e}保存失败,已恢复原设置`):typeof globalThis.clog?.error=="function"&&globalThis.clog.error(`${a||e}保存失败,已恢复原设置`,l)}});return i.promise=n,this.pending.set(e,i),n}async flush({throwOnFailure:e=!1}={}){let t=[...this.pending.values()];if(await Promise.all(t.map(s=>s.promise)),await this.settings.waitForIdle(),e){let s=t.filter(a=>a.error).map(a=>a.error);if(s.length>0){let a=new Error("部分实时设置保存失败");throw a.cause=s[0],a.liveSettingFailures=s,a}}}_dropBinding(e){this.bindings.delete(e),this._maybeDispose()}_maybeDispose(){this.bindings.size===0&&this.pending.size===0&&(this.settings.removeEventListener("settings.changed",this._onSettingsChanged),bi.delete(this.settings))}};d(ji,"SettingBindingHub");var wi=ji;function Si(o,e){return be(e,!1)}d(Si,"normalizeBooleanValue");function ql(o,e={}){let t=globalThis.$,s=e.value??o.defaultValue,a=e.onChange??null,r;if(o.type==="boolean")return r=t('').prop("checked",Si(o.key,s)),r.on("change",()=>{a?.(r.is(":checked")?"yes":"no")}),{root:r,getValue:d(()=>r.is(":checked")?"yes":"no","getValue"),setValue:d(i=>r.prop("checked",Si(o.key,i)),"setValue")};if(o.type==="select"){let i=Array.isArray(o.options)?o.options:[];return r=t(''),i.forEach(n=>{let l=n&&typeof n=="object"?n:{value:n,label:String(n)};r.append(t("").attr("value",l.value).text(l.label??String(l.value)))}),r.val(String(s??"")),r.on("change",()=>a?.(r.val())),{root:r,getValue:d(()=>r.val(),"getValue"),setValue:d(n=>r.val(String(n??"")),"setValue")}}return o.type==="number"?(r=t('').val(s==null?"":String(s)),r.on("change",()=>a?.(Number(r.val())||0)),{root:r,getValue:d(()=>Number(r.val())||0,"getValue"),setValue:d(i=>r.val(i==null?"":String(i)),"setValue")}):(r=t('').val(s==null?"":String(s)),r.on("change",()=>a?.(r.val())),{root:r,getValue:d(()=>r.val(),"getValue"),setValue:d(i=>r.val(i==null?"":String(i)),"setValue")})}d(ql,"renderSettingControl");function Os(o,e={}){let t=globalThis.$,s=ql(o,{value:e.value,onChange:e.onChange}),a=t('').append(t('').text(o.label)).append(t('').text(o.description||"")),r=t('').append(s.root);return{row:t('').attr("data-jhs-setting",o.key).attr("data-jhs-setting-effect",o.effect||"live").toggleClass("jhs-setting-row--indent",o.indent===!0).append(a,r),root:s.root,getValue:s.getValue,setValue:s.setValue}}d(Os,"renderSettingRow");function Hl(o,e={}){let t=globalThis.$,s=t('
');for(let a of o.list({surfaces:["quick"],disabledContributions:e.disabledContributions})){let{row:r}=Os(a);s.append(r)}return s}d(Hl,"buildQuickSettingsHtml");function ts(o,e,{settings:t,onChanged:s=null}){let a=yi(t),r=new xi(o,e,{settings:t,hub:a,onChanged:s});return{sync:d(i=>r.sync(i),"sync"),flush:d(i=>a.flush(i),"flush"),dispose:d(()=>r.dispose(),"dispose"),setters:r.setters}}d(ts,"bindSettingRows");var ki=class ki{constructor(e,t,{settings:s,hub:a,onChanged:r=null}){this.root=e,this.settings=s,this.hub=a,this.onChanged=r,this.setters={},this.controls=new Map,a.bindings.add(this);for(let i of t)this._bindDescriptor(i)}_bindDescriptor(e){let t=e.key,s=this.root.find(`[data-jhs-setting="${t}"]`).first();if(!s.length)return;let a=s.find(".jhs-setting-row__control"),r=a.children().first();if(!r.length){let h=ql(e);a.append(h.root),r=h.root}let i=e.type||(r.is("select")?"select":r.is('input[type="checkbox"]')?"boolean":r.is('input[type="number"]')?"number":"text"),n=Ch(i,r),l=_h(i,r),c=e.defaultValue;r.off(".jhsSettingBinding").on("change.jhsSettingBinding",()=>{let h=l(),u=typeof e.normalize=="function"?e.normalize(h):h;n(u),this.onChanged?.(t,u),(e.effect||"live")==="live"&&this.hub.userChanged(t,u,c,e.label||t)}),this.controls.set(t,{element:r,setValue:n}),this.setters[t]=n,this.setValue(t,this.hub.desiredValue(t,this.settings.snapshot()[t]??c))}setValue(e,t){let s=this.controls.get(e);s&&s.setValue(t)}sync(e){for(let t of this.controls.keys()){let s=Object.prototype.hasOwnProperty.call(e,t)?e[t]:this.settings.snapshot()[t];this.setValue(t,s)}}dispose(){for(let e of this.controls.values())e.element.off(".jhsSettingBinding");this.hub._dropBinding(this)}};d(ki,"RowBinding");var xi=ki;function Ch(o,e){return o==="boolean"?t=>e.prop("checked",Si("",t)):o==="select"?t=>{e.val(String(t??"")),K.refresh(e)}:o==="number"?t=>e.val(t==null?"":String(t)):t=>e.val(t==null?"":String(t))}d(Ch,"makeSetValue");function _h(o,e){return o==="boolean"?()=>e.is(":checked")?"yes":"no":o==="select"?()=>e.val():o==="number"?()=>{let t=e.val();if(t==null||String(t).trim()==="")return Number.NaN;let s=Number(t);return Number.isFinite(s)?s:Number.NaN}:()=>e.val()}d(_h,"makeGetValue");var Ci=Object.freeze(["videoQuality","reviewCount","tagPosition","waitCheckCount","highlightedTagNumber","highlightedTagColor","checkConcurrencyCount","checkRequestSleep","enableCheckBlacklist","checkBlacklist_intervalTime","checkBlacklist_ruleTime","enableCheckFavoriteActress","checkFavoriteActress_IntervalTime","enableCheckNewVideo","checkNewVideo_intervalTime","checkNewVideo_ruleTime","httpTimeout","httpRetryCount","circuitBreakerThreshold","circuitBreakerCooldown","clogMsgCount","webDavUrl","webDavUsername","webDavPassword","missAvUrl","jableUrl","avgleUrl","javTrailersUrl","av123Url","javDbUrl","javBusUrl","supJavUrl","enableTitleSelectFilter","enableFavoriteActresses","enableSaveActressCarInfo","autoRemoveNewVideoMarkAfterBrowse"]),$h=Object.freeze({videoQuality:"#videoQuality",reviewCount:"#reviewCount",tagPosition:"#tagPosition",waitCheckCount:"#waitCheckCount",highlightedTagNumber:"#highlightedTagNumber",highlightedTagColor:"#highlightedTagColor",checkConcurrencyCount:"#checkConcurrencyCount",checkRequestSleep:"#checkRequestSleep",enableCheckBlacklist:"#enableCheckBlacklist",checkBlacklist_intervalTime:"#checkBlacklist_intervalTime",checkBlacklist_ruleTime:"#checkBlacklist_ruleTime",enableCheckFavoriteActress:"#enableCheckFavoriteActress",checkFavoriteActress_IntervalTime:"#checkFavoriteActress_IntervalTime",enableCheckNewVideo:"#enableCheckNewVideo",checkNewVideo_intervalTime:"#checkNewVideo_intervalTime",checkNewVideo_ruleTime:"#checkNewVideo_ruleTime",httpTimeout:"#httpTimeout",httpRetryCount:"#httpRetryCount",circuitBreakerThreshold:"#circuitBreakerThreshold",circuitBreakerCooldown:"#circuitBreakerCooldownSec",clogMsgCount:"#clogMsgCount",webDavUrl:"#webDavUrl",webDavUsername:"#webDavUsername",webDavPassword:"#webDavPassword",missAvUrl:"#missAvUrl",jableUrl:"#jableUrl",avgleUrl:"#avgleUrl",javTrailersUrl:"#javTrailersUrl",av123Url:"#av123Url",javDbUrl:"#javDbUrl",javBusUrl:"#javBusUrl",supJavUrl:"#supJavUrl",enableTitleSelectFilter:"#enableTitleSelectFilter",enableFavoriteActresses:"#enableFavoriteActresses",enableSaveActressCarInfo:"#enableSaveActressCarInfo",autoRemoveNewVideoMarkAfterBrowse:"#autoRemoveNewVideoMarkAfterBrowse"});function Th(o){let e=new Set;o.data("jhsDirtyManualKeys",e);for(let t of Ci){let s=$h[t];s&&o.find(s).off(".jhsDirty").on("change.jhsDirty",()=>e.add(t))}}d(Th,"bindManualDirtyTracking");function Jl(o){return o?globalThis.$(o):globalThis.$(document)}d(Jl,"formRoot");async function Kl(o,e=null){let t=Jl(e),s=o.settings.snapshot();t.find("#videoQuality").val(s.videoQuality),t.find("#reviewCount").val(s.reviewCount||20),t.find("#tagPosition").val(s.tagPosition||"rightTop"),t.find("#autoRemoveNewVideoMarkAfterBrowse").prop("checked",!!s.autoRemoveNewVideoMarkAfterBrowse&&s.autoRemoveNewVideoMarkAfterBrowse===E),t.find("#waitCheckCount").val(s.waitCheckCount||5),t.find("#checkConcurrencyCount").val(ae(s.checkConcurrencyCount,2,{min:2,max:5})),t.find("#checkRequestSleep").val(ae(s.checkRequestSleep,100,{min:0,max:3e3})),t.find("#enableCheckBlacklist").val(s.enableCheckBlacklist||E),t.find("#checkBlacklist_intervalTime").val(s.checkBlacklist_intervalTime||12),t.find("#checkBlacklist_ruleTime").val(ae(s.checkBlacklist_ruleTime,8760,{min:0})),t.find("#enableCheckFavoriteActress").val(s.enableCheckFavoriteActress||E),t.find("#checkFavoriteActress_IntervalTime").val(s.checkFavoriteActress_IntervalTime||24),t.find("#enableCheckNewVideo").val(s.enableCheckNewVideo||E),t.find("#checkNewVideo_intervalTime").val(s.checkNewVideo_intervalTime||12),t.find("#checkNewVideo_ruleTime").val(ae(s.checkNewVideo_ruleTime,8760,{min:0}));let a=s.highlightedTagNumber||1,r=s.highlightedTagColor||"#ce2222";t.find("#highlightedTagNumber").val(s.highlightedTagNumber||1),t.find("#highlightedTagColor").val(s.highlightedTagColor||"#ce2222"),t.find("#highlightedTagLabel").css("border",`${a}px solid ${r}`),t.find("#clogMsgCount").val(s.clogMsgCount||2e3),t.find("#httpTimeout").val(s.httpTimeout||5e3),t.find("#httpRetryCount").val(s.httpRetryCount||3),t.find("#webDavUrl").val(s.webDavUrl||""),t.find("#webDavUsername").val(s.webDavUsername||"");let i=o.webdav,n=i?.getProfile?await i.getProfile():{url:s.webDavUrl,username:s.webDavUsername,password:""};t.find("#webDavUrl").val(n.url||""),t.find("#webDavUsername").val(n.username||""),t.find("#webDavPassword").val(n.password||""),t.find("#enableTitleSelectFilter").prop("checked",!s.enableTitleSelectFilter||s.enableTitleSelectFilter===E),t.find("#enableFavoriteActresses").prop("checked",!s.enableFavoriteActresses||s.enableFavoriteActresses===E),t.find("#enableSaveActressCarInfo").prop("checked",!!s.enableSaveActressCarInfo&&s.enableSaveActressCarInfo===E);let l=o.movie;t.find("#missAvUrl").val(l.externalSiteOrigin("missAvBtn",s)),t.find("#jableUrl").val(l.externalSiteOrigin("jableBtn",s)),t.find("#avgleUrl").val(l.externalSiteOrigin("avgleBtn",s)),t.find("#javTrailersUrl").val(l.externalSiteOrigin("javTrailersBtn",s)),t.find("#av123Url").val(l.providerOrigin("av123")||""),t.find("#javDbUrl").val(l.externalSiteOrigin("javDbBtn",s)),t.find("#javBusUrl").val(l.externalSiteOrigin("javBusBtn",s)),t.find("#supJavUrl").val(l.externalSiteOrigin("supJavBtn",s));let c=await storageManager.getReviewFilterKeywordList(),h=await storageManager.getTitleFilterKeyword();["#reviewKeywordContainer","#filterKeywordContainer"].forEach(u=>{t.find(`${u} .tag-box`).empty(),t.find(`${u} .add-tag-btn`).off(".jhsKeywordBind"),t.find(`${u} .keyword-input`).off(".jhsKeywordBind")}),c&&c.forEach(u=>{_i("#reviewKeywordContainer",u,t)}),h&&h.forEach(u=>{_i("#filterKeywordContainer",u,t)}),["#reviewKeywordContainer","#filterKeywordContainer"].forEach(u=>{t.find(`${u} .add-tag-btn`).on("click.jhsKeywordBind",(p=>Wl(p,u,t))),t.find(`${u} .keyword-input`).on("keypress.jhsKeywordBind",(p=>{p.key==="Enter"&&Wl(p,u,t)}))}),Th(t),Ph(t),Ah(t,o.busImg,o.host,o.settings)}d(Kl,"loadSettingForm");function Ah(o,e,t,s){o.find("#containerColumns").off(".jhsSetting").on("input.jhsSetting",(()=>{ss(o,t,"containerColumns",o.find("#containerColumns").val())})),o.find("#containerWidth").off(".jhsSetting").on("input.jhsSetting",(a=>{ss(o,t,"containerWidth",parseInt($(a.target).val())+70)}))}d(Ah,"bindLayoutRangeEvents");function ss(o,e,t,s){if(t==="containerColumns"){let n=Math.min(10,Math.max(2,Math.round(Number(s)||5)));o.find("#containerColumns").val(String(n)),o.find("#showContainerColumns").text(String(n));let l=e?.locateListRoot?.();l&&(l.style.gridTemplateColumns=`repeat(${n}, minmax(0, 1fr))`);return}let a=Math.min(100,Math.max(70,Math.round(Number(s)||100))),r=`${a}%`;o.find("#containerWidth").val(String(a-70)),o.find("#showContainerWidth").text(r);let i=e?.getListLayoutContainer?.();i&&(i.style.minWidth=r)}d(ss,"applyLayoutRangeValue");function et(o){let e=$(o);e.data("jhsQuickSettingBinding")?.dispose?.(),e.removeData("jhsQuickSettingBinding"),e.empty().hide()}d(et,"disposeQuickSettingHost");async function Us(o,e,t,s){let a=$(s);if(!a.length)throw new Error("Quick setting root is required");let r=o.settingsRegistry;if(!r)return;let i=r.list({surfaces:["quick"]}),n=ts(a,i,{settings:o.settings});a.data("jhsQuickSettingBinding",n),a.find("#moreBtn").off(".jhsQuickSetting").on("click.jhsQuickSetting",(async l=>{l.preventDefault(),l.stopPropagation(),await a.data("jhsQuickSettingBinding")?.flush?.(),et(a),await t("base-panel")}))}d(Us,"initQuickSettingForm");async function Gl(o,e=null){let t=Jl(e),s=t.data("jhsDirtyManualKeys")||null,a=null,r=null;if(!s||s.has("webDavUrl")){if(a=String(t.find("#webDavUrl").val()||"").trim(),a)try{let g=new URL(a);if(!["http:","https:"].includes(g.protocol))throw new Error("protocol");r=g.origin}catch{throw new Error("WebDAV 地址必须是有效的 HTTP/HTTPS URL")}let p=new Set(Array.isArray(o.settings.snapshot().trustedLocalOrigins)?o.settings.snapshot().trustedLocalOrigins:[]);if(r&&!p.has(r)&&!await new Promise(m=>utils.q(null,`仅授权 WebDAV 精确来源:${r},是否继续?`,()=>m(!0),()=>m(!1))))return{canceled:!0}}(!s||["webDavUrl","webDavUsername","webDavPassword"].some(p=>s.has(p)))&&o.webdav?.saveProfile&&await o.webdav.saveProfile({...!s||s.has("webDavUrl")?{url:String(t.find("#webDavUrl").val()||"").trim()}:{},...!s||s.has("webDavUsername")?{username:String(t.find("#webDavUsername").val()||"")}:{},...!s||s.has("webDavPassword")?{password:String(t.find("#webDavPassword").val()||"")}:{}});let n=await Rh(t,s);await o.settings.update(p=>{if(Object.assign(p,n),r){let g=new Set(Array.isArray(p.trustedLocalOrigins)?p.trustedLocalOrigins:[]);g.add(r),p.trustedLocalOrigins=[...g]}}),t.data("jhsDirtyManualKeys",new Set);let l=[],c=t.data("jhsDirtyReviewKeywords")===!0,h=t.data("jhsDirtyTitleKeywords")===!0;if(c)try{let p=[...new Set(t.find("#reviewKeywordContainer .keyword-label").toArray().map(g=>$(g).text().replaceAll("×","").replace(/[\r\n]+/g," ").replace(/\s{2,}/g," ").trim()).filter(Boolean))];await storageManager.saveReviewFilterKeyword(p)}catch(p){l.push(p)}if(h)try{let p=[...new Set(t.find("#filterKeywordContainer .keyword-label").toArray().map(g=>$(g).text().replaceAll("×","").replace(/[\r\n]+/g," ").replace(/\s{2,}/g," ").trim()).filter(Boolean))];await storageManager.saveTitleFilterKeyword(p)}catch(p){l.push(p)}if(l.length){let p=new Error("部分设置保存失败,请重试");throw p.partialFailure=!0,p.cause=l[0],p}t.data("jhsDirtyReviewKeywords",!1),t.data("jhsDirtyTitleKeywords",!1);let u=[["filter rules",async()=>{if(!V)throw new Error("EventBus 尚未初始化");await V.emit("filter-rules-changed",{scope:"title-keyword"})}],["new-video status",()=>o.newVideo?.resetBtnTip?.()],["blacklist status",()=>o.blacklist?.resetBtnTip?.()],["blacklist table",()=>o.blacklist?.reloadTable?.()]];for(let[p,g]of u)try{await g()}catch(m){typeof globalThis.clog?.error=="function"&&globalThis.clog.error(`设置保存后 ${p} 刷新失败(已忽略)`,m)}return{ok:!0}}d(Gl,"saveSettingForm");function Ph(o){o.data("jhsDirtyReviewKeywords",!1),o.data("jhsDirtyTitleKeywords",!1)}d(Ph,"bindKeywordDirtyTracking");async function Rh(o,e=null){let t=d((n,l,c,h)=>Math.min(h,Math.max(c,Number(n)||l)),"clamp"),s=d((n,{allowLocalHttp:l=!1}={})=>{let c=String(n||"").trim().replace(/\/$/,"");if(!c)return"";let h;try{h=new URL(c)}catch{throw new TypeError(`无效 URL:${c}`)}let u=["localhost","127.0.0.1","[::1]"].includes(h.hostname);if(h.protocol!=="https:"&&!(l&&u&&h.protocol==="http:"))throw new TypeError(`仅允许 HTTPS URL${l?"(本机地址可使用 HTTP)":""}:${c}`);return h.href.replace(/\/$/,"")},"configuredUrl"),a={videoQuality:d(()=>o.find("#videoQuality").val(),"videoQuality"),reviewCount:d(()=>o.find("#reviewCount").val(),"reviewCount"),tagPosition:d(()=>o.find("#tagPosition").val(),"tagPosition"),autoRemoveNewVideoMarkAfterBrowse:d(()=>o.find("#autoRemoveNewVideoMarkAfterBrowse").is(":checked")?E:ne,"autoRemoveNewVideoMarkAfterBrowse"),waitCheckCount:d(()=>o.find("#waitCheckCount").val(),"waitCheckCount"),highlightedTagNumber:d(()=>o.find("#highlightedTagNumber").val(),"highlightedTagNumber"),highlightedTagColor:d(()=>o.find("#highlightedTagColor").val(),"highlightedTagColor"),checkConcurrencyCount:d(()=>o.find("#checkConcurrencyCount").val(),"checkConcurrencyCount"),checkRequestSleep:d(()=>o.find("#checkRequestSleep").val(),"checkRequestSleep"),enableCheckBlacklist:d(()=>o.find("#enableCheckBlacklist").val(),"enableCheckBlacklist"),checkBlacklist_intervalTime:d(()=>o.find("#checkBlacklist_intervalTime").val(),"checkBlacklist_intervalTime"),checkBlacklist_ruleTime:d(()=>o.find("#checkBlacklist_ruleTime").val(),"checkBlacklist_ruleTime"),enableCheckFavoriteActress:d(()=>o.find("#enableCheckFavoriteActress").val(),"enableCheckFavoriteActress"),checkFavoriteActress_IntervalTime:d(()=>o.find("#checkFavoriteActress_IntervalTime").val(),"checkFavoriteActress_IntervalTime"),enableCheckNewVideo:d(()=>o.find("#enableCheckNewVideo").val(),"enableCheckNewVideo"),checkNewVideo_intervalTime:d(()=>o.find("#checkNewVideo_intervalTime").val(),"checkNewVideo_intervalTime"),checkNewVideo_ruleTime:d(()=>o.find("#checkNewVideo_ruleTime").val(),"checkNewVideo_ruleTime"),httpTimeout:d(()=>t(o.find("#httpTimeout").val(),5e3,1e3,12e4),"httpTimeout"),httpRetryCount:d(()=>t(o.find("#httpRetryCount").val(),3,1,10),"httpRetryCount"),circuitBreakerThreshold:d(()=>t(o.find("#circuitBreakerThreshold").val(),3,1,20),"circuitBreakerThreshold"),circuitBreakerCooldown:d(()=>t(Number(o.find("#circuitBreakerCooldownSec").val())*1e3,6e4,1e3,36e5),"circuitBreakerCooldown"),clogMsgCount:d(()=>o.find("#clogMsgCount").val(),"clogMsgCount"),webDavUrl:d(()=>s(o.find("#webDavUrl").val(),{allowLocalHttp:!0}),"webDavUrl"),webDavUsername:d(()=>String(o.find("#webDavUsername").val()||""),"webDavUsername"),missAvUrl:d(()=>s(o.find("#missAvUrl").val()),"missAvUrl"),jableUrl:d(()=>s(o.find("#jableUrl").val()),"jableUrl"),avgleUrl:d(()=>s(o.find("#avgleUrl").val()),"avgleUrl"),javTrailersUrl:d(()=>s(o.find("#javTrailersUrl").val()),"javTrailersUrl"),av123Url:d(()=>s(o.find("#av123Url").val()),"av123Url"),javDbUrl:d(()=>s(o.find("#javDbUrl").val()),"javDbUrl"),javBusUrl:d(()=>s(o.find("#javBusUrl").val()),"javBusUrl"),supJavUrl:d(()=>s(o.find("#supJavUrl").val()),"supJavUrl"),enableTitleSelectFilter:d(()=>o.find("#enableTitleSelectFilter").is(":checked")?E:ne,"enableTitleSelectFilter"),enableFavoriteActresses:d(()=>o.find("#enableFavoriteActresses").is(":checked")?E:ne,"enableFavoriteActresses"),enableSaveActressCarInfo:d(()=>o.find("#enableSaveActressCarInfo").is(":checked")?E:ne,"enableSaveActressCarInfo")},r=e instanceof Set?Ci.filter(n=>e.has(n)).filter(n=>!["webDavUrl","webDavUsername","webDavPassword"].includes(n)):Ci.filter(n=>!["webDavUrl","webDavUsername","webDavPassword"].includes(n)),i={};for(let n of r){let l=a[n];l&&(i[n]=await l())}return i}d(Rh,"collectManualSettingPatch");function _i(o,e,t){let s=t.find(`${o} .tag-box`),a=String(e),r;/^[a-z]{2,}-/i.test(a)&&M?r=$("").addClass("keyword-label keyword-label--link").attr("data-keyword",a).attr("href",`/video_codes/${a.replace("-","")}`).attr("target","_blank"):r=$("
").addClass("keyword-label").attr("data-keyword",a),r.append(document.createTextNode(a)),r.append($("").addClass("keyword-remove").text("×"));let i=o==="#reviewKeywordContainer"?"jhsDirtyReviewKeywords":"jhsDirtyTitleKeywords";r.find(".keyword-remove").click((n=>{n.stopPropagation(),n.preventDefault();let l=$(n.currentTarget),c=l.closest(".keyword-label").attr("data-keyword").split(" ")[0];utils.q(n,`是否移除屏蔽词 ${T(c)}?`,(async()=>{l.parent().remove(),t.data(i,!0)}))})),s.append(r)}d(_i,"addLabelTag");function Wl(o,e,t){let s=t.find(`${e} .keyword-input`),a=s.val().trim();if(!a)return;t.find(`${e} .keyword-label`).toArray().some((i=>$(i).text().replaceAll("×","").trim()===a))||_i(e,a,t),s.val(""),t.data(e==="#reviewKeywordContainer"?"jhsDirtyReviewKeywords":"jhsDirtyTitleKeywords",!0)}d(Wl,"addKeyword");function Ql(){let o={SettingPlugin:["设置中心","core"],StatsPlugin:["统计中心","core"],MobileBottomBarPlugin:["工具栏与移动操作","core"],ListPagePlugin:["列表状态处理","list"],NavBarPlugin:["JavDB 导航","list"],BusNavBarPlugin:["JavBus 导航","list"],ListPageButtonPlugin:["列表操作","list"],HighlightMagnetPlugin:["磁力标记","list"],FoldCategoryPlugin:["分类折叠","list"],AutoPagePlugin:["自动翻页","list"],HitShowPlugin:["热播榜单","list"],TOP250Plugin:["TOP 250","list"],DetailPagePlugin:["JavDB 详情页","detail"],BusDetailPagePlugin:["JavBus 详情页","detail"],DetailPageButtonPlugin:["详情操作","detail"],ReviewPlugin:["评论","detail"],RelatedPlugin:["相关影片","detail"],TranslatePlugin:["标题翻译","detail"],WantAndWatchedVideosPlugin:["想看与看过","detail"],CoverButtonPlugin:["封面快捷操作","media"],PreviewVideoPlugin:["JavDB 预览视频","media"],BusPreviewVideoPlugin:["JavBus 预览视频","media"],ScreenShotPlugin:["剧照","media"],BusImgPlugin:["JavBus 图片适配","media"],ActressInfoPlugin:["演员资料","media"],SearchByImagePlugin:["以图搜图","media"],HistoryPlugin:["鉴定记录","data"],BlacklistPlugin:["黑名单","data"],FilterTitleKeywordPlugin:["关键词筛选","data"],FavoriteActressesPlugin:["演员收藏","data"],NewVideoPlugin:["新作品检测","data"],TaskPlugin:["定时任务","data"],OtherSitePlugin:["外部站点","network"],Fc2Plugin:["FC2 详情","network"],Fc2By123AvPlugin:["FC2 123AV","network"],MagnetHubPlugin:["磁力聚合","network"],JavTrailersPlugin:["预告片","network"],SubTitleCatPlugin:["字幕搜索","network"],OneTwoThreeOfflinePlugin:["123 云盘离线","network"]},e=d((t,s)=>({label:s,plugins:Object.entries(o).filter((a=>a[1][1]===t)).map((a=>a[0]))}),"group");return{categories:{core:e("core","基础核心"),list:e("list","列表页"),detail:e("detail","详情页"),media:e("media","媒体"),data:e("data","数据"),network:e("network","网络")},pluginMeta:o}}d(Ql,"getPluginCategories");function Ih(o){return o.map(e=>` + `).appendTo("head")}d(Ih,"applyImageMode");async function xi(o={},{busImgPlugin:e=null,hostAdapter:t=null}={}){let s=o.enableVerticalModel===void 0?ne:o.enableVerticalModel;await Ih(e,s);let a=globalThis.utils?.isMobileMode?.()??!1,r=a?1:Number(o.containerColumns??5)||5,i=a?100:Number(o.containerWidth??100)||100;if(B&&e?.logImageHeightsByRow&&await e.logImageHeightsByRow({vertical:s,columns:r}),t){let n=t.locateListRoot?.();n&&(n.style.gridTemplateColumns=`repeat(${r}, minmax(0, 1fr))`);let l=t.getListLayoutContainer?.();l&&(l.style.minWidth=`${i}%`)}}d(xi,"applyLayoutFromSettings");var ki=new WeakMap;function _i(o){let e=ki.get(o);return e||(e=new Ci(o),ki.set(o,e)),e}d(_i,"getSettingBindingHub");function Ql({root:o,selector:e,key:t,getValue:s,setValue:a,fallback:r=void 0,label:i=t,settings:n,onChange:l=null}){let c=_i(n),h=o.find(e);if(!h.length)return null;let u={setValue(p,g){p===t&&a(g)},dispose(){h.off(".jhsSettingBinding"),c._dropBinding(u)}};return c.bindings.add(u),h.off(".jhsSettingBinding").on("change.jhsSettingBinding",()=>{let p=s();l?.(t,p),c.userChanged(t,p,r,i)}),u.setValue(t,c.desiredValue(t,n.snapshot()[t]??r)),{sync(p){Object.prototype.hasOwnProperty.call(p,t)&&a(p[t])},flush:d(p=>c.flush(p),"flush"),dispose:d(()=>u.dispose(),"dispose")}}d(Ql,"bindSettingControl");function He({settings:o,key:e,fallback:t=void 0,apply:s,onError:a=d(()=>{},"onError")}){let r=0;return async i=>{let n=++r;s(i);try{await o.set(e,i)}catch(l){n===r&&(s(o.snapshot()[e]??t),a(l))}}}d(He,"createLatestSettingWriter");var $i=class $i{constructor(e){this.settings=e,this.bindings=new Set,this.pending=new Map,this.revision=0,this._onSettingsChanged=this._onSettingsChanged.bind(this),this.settings.addEventListener("settings.changed",this._onSettingsChanged)}_onSettingsChanged(e){let t=e.detail||{},s=t.snapshot??this.settings.snapshot(),a=Array.isArray(t.names)?t.names:Object.keys(s);for(let r of a){let i=this.pending.get(r);this.syncAll(r,i?i.value:s[r])}}syncAll(e,t){for(let s of this.bindings)s.setValue(e,t)}desiredValue(e,t){let s=this.pending.get(e);return s?s.value:t}userChanged(e,t,s,a){this.syncAll(e,t);let i={token:++this.revision,value:t,promise:Promise.resolve()},n=this.settings.set(e,t).then(()=>{this.pending.get(e)===i&&(this.pending.delete(e),this._maybeDispose())},l=>{if(this.pending.get(e)===i){this.pending.delete(e),i.error=l;let c=this.settings.snapshot()[e]??s;this.syncAll(e,c),this._maybeDispose(),typeof globalThis.show?.error=="function"?globalThis.show.error(`${a||e}保存失败,已恢复原设置`):typeof globalThis.clog?.error=="function"&&globalThis.clog.error(`${a||e}保存失败,已恢复原设置`,l)}});return i.promise=n,this.pending.set(e,i),n}async flush({throwOnFailure:e=!1}={}){let t=[...this.pending.values()];if(await Promise.all(t.map(s=>s.promise)),await this.settings.waitForIdle(),e){let s=t.filter(a=>a.error).map(a=>a.error);if(s.length>0){let a=new Error("部分实时设置保存失败");throw a.cause=s[0],a.liveSettingFailures=s,a}}}_dropBinding(e){this.bindings.delete(e),this._maybeDispose()}_maybeDispose(){this.bindings.size===0&&this.pending.size===0&&(this.settings.removeEventListener("settings.changed",this._onSettingsChanged),ki.delete(this.settings))}};d($i,"SettingBindingHub");var Ci=$i;function Ti(o,e){return be(e,!1)}d(Ti,"normalizeBooleanValue");function Yl(o,e={}){let t=globalThis.$,s=e.value??o.defaultValue,a=e.onChange??null,r;if(o.type==="boolean")return r=t('').prop("checked",Ti(o.key,s)),r.on("change",()=>{a?.(r.is(":checked")?"yes":"no")}),{root:r,getValue:d(()=>r.is(":checked")?"yes":"no","getValue"),setValue:d(i=>r.prop("checked",Ti(o.key,i)),"setValue")};if(o.type==="select"){let i=Array.isArray(o.options)?o.options:[];return r=t(''),i.forEach(n=>{let l=n&&typeof n=="object"?n:{value:n,label:String(n)};r.append(t("").attr("value",l.value).text(l.label??String(l.value)))}),r.val(String(s??"")),r.on("change",()=>a?.(r.val())),{root:r,getValue:d(()=>r.val(),"getValue"),setValue:d(n=>r.val(String(n??"")),"setValue")}}return o.type==="number"?(r=t('').val(s==null?"":String(s)),r.on("change",()=>a?.(Number(r.val())||0)),{root:r,getValue:d(()=>Number(r.val())||0,"getValue"),setValue:d(i=>r.val(i==null?"":String(i)),"setValue")}):(r=t('').val(s==null?"":String(s)),r.on("change",()=>a?.(r.val())),{root:r,getValue:d(()=>r.val(),"getValue"),setValue:d(i=>r.val(i==null?"":String(i)),"setValue")})}d(Yl,"renderSettingControl");function Vs(o,e={}){let t=globalThis.$,s=Yl(o,{value:e.value,onChange:e.onChange}),a=t('').append(t('').text(o.label)).append(t('').text(o.description||"")),r=t('').append(s.root);return{row:t('').attr("data-jhs-setting",o.key).attr("data-jhs-setting-effect",o.effect||"live").toggleClass("jhs-setting-row--indent",o.indent===!0).append(a,r),root:s.root,getValue:s.getValue,setValue:s.setValue}}d(Vs,"renderSettingRow");function Zl(o,e={}){let t=globalThis.$,s=t('
');for(let a of o.list({surfaces:["quick"],disabledContributions:e.disabledContributions})){let{row:r}=Vs(a);s.append(r)}return s}d(Zl,"buildQuickSettingsHtml");function as(o,e,{settings:t,onChanged:s=null}){let a=_i(t),r=new Ai(o,e,{settings:t,hub:a,onChanged:s});return{sync:d(i=>r.sync(i),"sync"),flush:d(i=>a.flush(i),"flush"),dispose:d(()=>r.dispose(),"dispose"),setters:r.setters}}d(as,"bindSettingRows");var Pi=class Pi{constructor(e,t,{settings:s,hub:a,onChanged:r=null}){this.root=e,this.settings=s,this.hub=a,this.onChanged=r,this.setters={},this.controls=new Map,a.bindings.add(this);for(let i of t)this._bindDescriptor(i)}_bindDescriptor(e){let t=e.key,s=this.root.find(`[data-jhs-setting="${t}"]`).first();if(!s.length)return;let a=s.find(".jhs-setting-row__control"),r=a.children().first();if(!r.length){let h=Yl(e);a.append(h.root),r=h.root}let i=e.type||(r.is("select")?"select":r.is('input[type="checkbox"]')?"boolean":r.is('input[type="number"]')?"number":"text"),n=Eh(i,r),l=Dh(i,r),c=e.defaultValue;r.off(".jhsSettingBinding").on("change.jhsSettingBinding",()=>{let h=l(),u=typeof e.normalize=="function"?e.normalize(h):h;n(u),this.onChanged?.(t,u),(e.effect||"live")==="live"&&this.hub.userChanged(t,u,c,e.label||t)}),this.controls.set(t,{element:r,setValue:n}),this.setters[t]=n,this.setValue(t,this.hub.desiredValue(t,this.settings.snapshot()[t]??c))}setValue(e,t){let s=this.controls.get(e);s&&s.setValue(t)}sync(e){for(let t of this.controls.keys()){let s=Object.prototype.hasOwnProperty.call(e,t)?e[t]:this.settings.snapshot()[t];this.setValue(t,s)}}dispose(){for(let e of this.controls.values())e.element.off(".jhsSettingBinding");this.hub._dropBinding(this)}};d(Pi,"RowBinding");var Ai=Pi;function Eh(o,e){return o==="boolean"?t=>e.prop("checked",Ti("",t)):o==="select"?t=>{e.val(String(t??"")),K.refresh(e)}:o==="number"?t=>e.val(t==null?"":String(t)):t=>e.val(t==null?"":String(t))}d(Eh,"makeSetValue");function Dh(o,e){return o==="boolean"?()=>e.is(":checked")?"yes":"no":o==="select"?()=>e.val():o==="number"?()=>{let t=e.val();if(t==null||String(t).trim()==="")return Number.NaN;let s=Number(t);return Number.isFinite(s)?s:Number.NaN}:()=>e.val()}d(Dh,"makeGetValue");var Ri=Object.freeze(["videoQuality","reviewCount","tagPosition","waitCheckCount","highlightedTagNumber","highlightedTagColor","checkConcurrencyCount","checkRequestSleep","enableCheckBlacklist","checkBlacklist_intervalTime","checkBlacklist_ruleTime","enableCheckFavoriteActress","checkFavoriteActress_IntervalTime","enableCheckNewVideo","checkNewVideo_intervalTime","checkNewVideo_ruleTime","httpTimeout","httpRetryCount","circuitBreakerThreshold","circuitBreakerCooldown","clogMsgCount","webDavUrl","webDavUsername","webDavPassword","missAvUrl","jableUrl","avgleUrl","javTrailersUrl","av123Url","javDbUrl","javBusUrl","supJavUrl","enableTitleSelectFilter","enableFavoriteActresses","enableSaveActressCarInfo","autoRemoveNewVideoMarkAfterBrowse"]),Nh=Object.freeze({videoQuality:"#videoQuality",reviewCount:"#reviewCount",tagPosition:"#tagPosition",waitCheckCount:"#waitCheckCount",highlightedTagNumber:"#highlightedTagNumber",highlightedTagColor:"#highlightedTagColor",checkConcurrencyCount:"#checkConcurrencyCount",checkRequestSleep:"#checkRequestSleep",enableCheckBlacklist:"#enableCheckBlacklist",checkBlacklist_intervalTime:"#checkBlacklist_intervalTime",checkBlacklist_ruleTime:"#checkBlacklist_ruleTime",enableCheckFavoriteActress:"#enableCheckFavoriteActress",checkFavoriteActress_IntervalTime:"#checkFavoriteActress_IntervalTime",enableCheckNewVideo:"#enableCheckNewVideo",checkNewVideo_intervalTime:"#checkNewVideo_intervalTime",checkNewVideo_ruleTime:"#checkNewVideo_ruleTime",httpTimeout:"#httpTimeout",httpRetryCount:"#httpRetryCount",circuitBreakerThreshold:"#circuitBreakerThreshold",circuitBreakerCooldown:"#circuitBreakerCooldownSec",clogMsgCount:"#clogMsgCount",webDavUrl:"#webDavUrl",webDavUsername:"#webDavUsername",webDavPassword:"#webDavPassword",missAvUrl:"#missAvUrl",jableUrl:"#jableUrl",avgleUrl:"#avgleUrl",javTrailersUrl:"#javTrailersUrl",av123Url:"#av123Url",javDbUrl:"#javDbUrl",javBusUrl:"#javBusUrl",supJavUrl:"#supJavUrl",enableTitleSelectFilter:"#enableTitleSelectFilter",enableFavoriteActresses:"#enableFavoriteActresses",enableSaveActressCarInfo:"#enableSaveActressCarInfo",autoRemoveNewVideoMarkAfterBrowse:"#autoRemoveNewVideoMarkAfterBrowse"});function Lh(o){let e=new Set;o.data("jhsDirtyManualKeys",e);for(let t of Ri){let s=Nh[t];s&&o.find(s).off(".jhsDirty").on("change.jhsDirty",()=>e.add(t))}}d(Lh,"bindManualDirtyTracking");function ec(o){return o?globalThis.$(o):globalThis.$(document)}d(ec,"formRoot");async function tc(o,e=null){let t=ec(e),s=o.settings.snapshot();t.find("#videoQuality").val(s.videoQuality),t.find("#reviewCount").val(s.reviewCount||20),t.find("#tagPosition").val(s.tagPosition||"rightTop"),t.find("#autoRemoveNewVideoMarkAfterBrowse").prop("checked",!!s.autoRemoveNewVideoMarkAfterBrowse&&s.autoRemoveNewVideoMarkAfterBrowse===E),t.find("#waitCheckCount").val(s.waitCheckCount||5),t.find("#checkConcurrencyCount").val(ae(s.checkConcurrencyCount,2,{min:2,max:5})),t.find("#checkRequestSleep").val(ae(s.checkRequestSleep,100,{min:0,max:3e3})),t.find("#enableCheckBlacklist").val(s.enableCheckBlacklist||E),t.find("#checkBlacklist_intervalTime").val(s.checkBlacklist_intervalTime||12),t.find("#checkBlacklist_ruleTime").val(ae(s.checkBlacklist_ruleTime,8760,{min:0})),t.find("#enableCheckFavoriteActress").val(s.enableCheckFavoriteActress||E),t.find("#checkFavoriteActress_IntervalTime").val(s.checkFavoriteActress_IntervalTime||24),t.find("#enableCheckNewVideo").val(s.enableCheckNewVideo||E),t.find("#checkNewVideo_intervalTime").val(s.checkNewVideo_intervalTime||12),t.find("#checkNewVideo_ruleTime").val(ae(s.checkNewVideo_ruleTime,8760,{min:0}));let a=s.highlightedTagNumber||1,r=s.highlightedTagColor||"#ce2222";t.find("#highlightedTagNumber").val(s.highlightedTagNumber||1),t.find("#highlightedTagColor").val(s.highlightedTagColor||"#ce2222"),t.find("#highlightedTagLabel").css("border",`${a}px solid ${r}`),t.find("#clogMsgCount").val(s.clogMsgCount||2e3),t.find("#httpTimeout").val(s.httpTimeout||5e3),t.find("#httpRetryCount").val(s.httpRetryCount||3),t.find("#webDavUrl").val(s.webDavUrl||""),t.find("#webDavUsername").val(s.webDavUsername||"");let i=o.webdav,n=i?.getProfile?await i.getProfile():{url:s.webDavUrl,username:s.webDavUsername,password:""};t.find("#webDavUrl").val(n.url||""),t.find("#webDavUsername").val(n.username||""),t.find("#webDavPassword").val(n.password||""),t.find("#enableTitleSelectFilter").prop("checked",!s.enableTitleSelectFilter||s.enableTitleSelectFilter===E),t.find("#enableFavoriteActresses").prop("checked",!s.enableFavoriteActresses||s.enableFavoriteActresses===E),t.find("#enableSaveActressCarInfo").prop("checked",!!s.enableSaveActressCarInfo&&s.enableSaveActressCarInfo===E);let l=o.movie;t.find("#missAvUrl").val(l.externalSiteOrigin("missAvBtn",s)),t.find("#jableUrl").val(l.externalSiteOrigin("jableBtn",s)),t.find("#avgleUrl").val(l.externalSiteOrigin("avgleBtn",s)),t.find("#javTrailersUrl").val(l.externalSiteOrigin("javTrailersBtn",s)),t.find("#av123Url").val(l.providerOrigin("av123")||""),t.find("#javDbUrl").val(l.externalSiteOrigin("javDbBtn",s)),t.find("#javBusUrl").val(l.externalSiteOrigin("javBusBtn",s)),t.find("#supJavUrl").val(l.externalSiteOrigin("supJavBtn",s));let c=await storageManager.getReviewFilterKeywordList(),h=await storageManager.getTitleFilterKeyword();["#reviewKeywordContainer","#filterKeywordContainer"].forEach(u=>{t.find(`${u} .tag-box`).empty(),t.find(`${u} .add-tag-btn`).off(".jhsKeywordBind"),t.find(`${u} .keyword-input`).off(".jhsKeywordBind")}),c&&c.forEach(u=>{Ii("#reviewKeywordContainer",u,t)}),h&&h.forEach(u=>{Ii("#filterKeywordContainer",u,t)}),["#reviewKeywordContainer","#filterKeywordContainer"].forEach(u=>{t.find(`${u} .add-tag-btn`).on("click.jhsKeywordBind",(p=>Xl(p,u,t))),t.find(`${u} .keyword-input`).on("keypress.jhsKeywordBind",(p=>{p.key==="Enter"&&Xl(p,u,t)}))}),Lh(t),Bh(t),Mh(t,o.busImg,o.host,o.settings)}d(tc,"loadSettingForm");function Mh(o,e,t,s){o.find("#containerColumns").off(".jhsSetting").on("input.jhsSetting",(()=>{rs(o,t,"containerColumns",o.find("#containerColumns").val())})),o.find("#containerWidth").off(".jhsSetting").on("input.jhsSetting",(a=>{rs(o,t,"containerWidth",parseInt($(a.target).val())+70)}))}d(Mh,"bindLayoutRangeEvents");function rs(o,e,t,s){if(t==="containerColumns"){let n=Math.min(10,Math.max(2,Math.round(Number(s)||5)));o.find("#containerColumns").val(String(n)),o.find("#showContainerColumns").text(String(n));let l=e?.locateListRoot?.();l&&(l.style.gridTemplateColumns=`repeat(${n}, minmax(0, 1fr))`);return}let a=Math.min(100,Math.max(70,Math.round(Number(s)||100))),r=`${a}%`;o.find("#containerWidth").val(String(a-70)),o.find("#showContainerWidth").text(r);let i=e?.getListLayoutContainer?.();i&&(i.style.minWidth=r)}d(rs,"applyLayoutRangeValue");function st(o){let e=$(o);e.data("jhsQuickSettingBinding")?.dispose?.(),e.removeData("jhsQuickSettingBinding"),e.empty().hide()}d(st,"disposeQuickSettingHost");async function qs(o,e,t,s){let a=$(s);if(!a.length)throw new Error("Quick setting root is required");let r=o.settingsRegistry;if(!r)return;let i=r.list({surfaces:["quick"]}),n=as(a,i,{settings:o.settings});a.data("jhsQuickSettingBinding",n),a.find("#moreBtn").off(".jhsQuickSetting").on("click.jhsQuickSetting",(async l=>{l.preventDefault(),l.stopPropagation(),await a.data("jhsQuickSettingBinding")?.flush?.(),st(a),await t("base-panel")}))}d(qs,"initQuickSettingForm");async function sc(o,e=null){let t=ec(e),s=t.data("jhsDirtyManualKeys")||null,a=null,r=null;if(!s||s.has("webDavUrl")){if(a=String(t.find("#webDavUrl").val()||"").trim(),a)try{let g=new URL(a);if(!["http:","https:"].includes(g.protocol))throw new Error("protocol");r=g.origin}catch{throw new Error("WebDAV 地址必须是有效的 HTTP/HTTPS URL")}let p=new Set(Array.isArray(o.settings.snapshot().trustedLocalOrigins)?o.settings.snapshot().trustedLocalOrigins:[]);if(r&&!p.has(r)&&!await new Promise(m=>utils.q(null,`仅授权 WebDAV 精确来源:${r},是否继续?`,()=>m(!0),()=>m(!1))))return{canceled:!0}}(!s||["webDavUrl","webDavUsername","webDavPassword"].some(p=>s.has(p)))&&o.webdav?.saveProfile&&await o.webdav.saveProfile({...!s||s.has("webDavUrl")?{url:String(t.find("#webDavUrl").val()||"").trim()}:{},...!s||s.has("webDavUsername")?{username:String(t.find("#webDavUsername").val()||"")}:{},...!s||s.has("webDavPassword")?{password:String(t.find("#webDavPassword").val()||"")}:{}});let n=await Oh(t,s);await o.settings.update(p=>{if(Object.assign(p,n),r){let g=new Set(Array.isArray(p.trustedLocalOrigins)?p.trustedLocalOrigins:[]);g.add(r),p.trustedLocalOrigins=[...g]}}),t.data("jhsDirtyManualKeys",new Set);let l=[],c=t.data("jhsDirtyReviewKeywords")===!0,h=t.data("jhsDirtyTitleKeywords")===!0;if(c)try{let p=[...new Set(t.find("#reviewKeywordContainer .keyword-label").toArray().map(g=>$(g).text().replaceAll("×","").replace(/[\r\n]+/g," ").replace(/\s{2,}/g," ").trim()).filter(Boolean))];await storageManager.saveReviewFilterKeyword(p)}catch(p){l.push(p)}if(h)try{let p=[...new Set(t.find("#filterKeywordContainer .keyword-label").toArray().map(g=>$(g).text().replaceAll("×","").replace(/[\r\n]+/g," ").replace(/\s{2,}/g," ").trim()).filter(Boolean))];await storageManager.saveTitleFilterKeyword(p)}catch(p){l.push(p)}if(l.length){let p=new Error("部分设置保存失败,请重试");throw p.partialFailure=!0,p.cause=l[0],p}t.data("jhsDirtyReviewKeywords",!1),t.data("jhsDirtyTitleKeywords",!1);let u=[["filter rules",async()=>{if(!V)throw new Error("EventBus 尚未初始化");await V.emit("filter-rules-changed",{scope:"title-keyword"})}],["new-video status",()=>o.newVideo?.resetBtnTip?.()],["blacklist status",()=>o.blacklist?.resetBtnTip?.()],["blacklist table",()=>o.blacklist?.reloadTable?.()]];for(let[p,g]of u)try{await g()}catch(m){typeof globalThis.clog?.error=="function"&&globalThis.clog.error(`设置保存后 ${p} 刷新失败(已忽略)`,m)}return{ok:!0}}d(sc,"saveSettingForm");function Bh(o){o.data("jhsDirtyReviewKeywords",!1),o.data("jhsDirtyTitleKeywords",!1)}d(Bh,"bindKeywordDirtyTracking");async function Oh(o,e=null){let t=d((n,l,c,h)=>Math.min(h,Math.max(c,Number(n)||l)),"clamp"),s=d((n,{allowLocalHttp:l=!1}={})=>{let c=String(n||"").trim().replace(/\/$/,"");if(!c)return"";let h;try{h=new URL(c)}catch{throw new TypeError(`无效 URL:${c}`)}let u=["localhost","127.0.0.1","[::1]"].includes(h.hostname);if(h.protocol!=="https:"&&!(l&&u&&h.protocol==="http:"))throw new TypeError(`仅允许 HTTPS URL${l?"(本机地址可使用 HTTP)":""}:${c}`);return h.href.replace(/\/$/,"")},"configuredUrl"),a={videoQuality:d(()=>o.find("#videoQuality").val(),"videoQuality"),reviewCount:d(()=>o.find("#reviewCount").val(),"reviewCount"),tagPosition:d(()=>o.find("#tagPosition").val(),"tagPosition"),autoRemoveNewVideoMarkAfterBrowse:d(()=>o.find("#autoRemoveNewVideoMarkAfterBrowse").is(":checked")?E:ne,"autoRemoveNewVideoMarkAfterBrowse"),waitCheckCount:d(()=>o.find("#waitCheckCount").val(),"waitCheckCount"),highlightedTagNumber:d(()=>o.find("#highlightedTagNumber").val(),"highlightedTagNumber"),highlightedTagColor:d(()=>o.find("#highlightedTagColor").val(),"highlightedTagColor"),checkConcurrencyCount:d(()=>o.find("#checkConcurrencyCount").val(),"checkConcurrencyCount"),checkRequestSleep:d(()=>o.find("#checkRequestSleep").val(),"checkRequestSleep"),enableCheckBlacklist:d(()=>o.find("#enableCheckBlacklist").val(),"enableCheckBlacklist"),checkBlacklist_intervalTime:d(()=>o.find("#checkBlacklist_intervalTime").val(),"checkBlacklist_intervalTime"),checkBlacklist_ruleTime:d(()=>o.find("#checkBlacklist_ruleTime").val(),"checkBlacklist_ruleTime"),enableCheckFavoriteActress:d(()=>o.find("#enableCheckFavoriteActress").val(),"enableCheckFavoriteActress"),checkFavoriteActress_IntervalTime:d(()=>o.find("#checkFavoriteActress_IntervalTime").val(),"checkFavoriteActress_IntervalTime"),enableCheckNewVideo:d(()=>o.find("#enableCheckNewVideo").val(),"enableCheckNewVideo"),checkNewVideo_intervalTime:d(()=>o.find("#checkNewVideo_intervalTime").val(),"checkNewVideo_intervalTime"),checkNewVideo_ruleTime:d(()=>o.find("#checkNewVideo_ruleTime").val(),"checkNewVideo_ruleTime"),httpTimeout:d(()=>t(o.find("#httpTimeout").val(),5e3,1e3,12e4),"httpTimeout"),httpRetryCount:d(()=>t(o.find("#httpRetryCount").val(),3,1,10),"httpRetryCount"),circuitBreakerThreshold:d(()=>t(o.find("#circuitBreakerThreshold").val(),3,1,20),"circuitBreakerThreshold"),circuitBreakerCooldown:d(()=>t(Number(o.find("#circuitBreakerCooldownSec").val())*1e3,6e4,1e3,36e5),"circuitBreakerCooldown"),clogMsgCount:d(()=>o.find("#clogMsgCount").val(),"clogMsgCount"),webDavUrl:d(()=>s(o.find("#webDavUrl").val(),{allowLocalHttp:!0}),"webDavUrl"),webDavUsername:d(()=>String(o.find("#webDavUsername").val()||""),"webDavUsername"),missAvUrl:d(()=>s(o.find("#missAvUrl").val()),"missAvUrl"),jableUrl:d(()=>s(o.find("#jableUrl").val()),"jableUrl"),avgleUrl:d(()=>s(o.find("#avgleUrl").val()),"avgleUrl"),javTrailersUrl:d(()=>s(o.find("#javTrailersUrl").val()),"javTrailersUrl"),av123Url:d(()=>s(o.find("#av123Url").val()),"av123Url"),javDbUrl:d(()=>s(o.find("#javDbUrl").val()),"javDbUrl"),javBusUrl:d(()=>s(o.find("#javBusUrl").val()),"javBusUrl"),supJavUrl:d(()=>s(o.find("#supJavUrl").val()),"supJavUrl"),enableTitleSelectFilter:d(()=>o.find("#enableTitleSelectFilter").is(":checked")?E:ne,"enableTitleSelectFilter"),enableFavoriteActresses:d(()=>o.find("#enableFavoriteActresses").is(":checked")?E:ne,"enableFavoriteActresses"),enableSaveActressCarInfo:d(()=>o.find("#enableSaveActressCarInfo").is(":checked")?E:ne,"enableSaveActressCarInfo")},r=e instanceof Set?Ri.filter(n=>e.has(n)).filter(n=>!["webDavUrl","webDavUsername","webDavPassword"].includes(n)):Ri.filter(n=>!["webDavUrl","webDavUsername","webDavPassword"].includes(n)),i={};for(let n of r){let l=a[n];l&&(i[n]=await l())}return i}d(Oh,"collectManualSettingPatch");function Ii(o,e,t){let s=t.find(`${o} .tag-box`),a=String(e),r;/^[a-z]{2,}-/i.test(a)&&M?r=$("
").addClass("keyword-label keyword-label--link").attr("data-keyword",a).attr("href",`/video_codes/${a.replace("-","")}`).attr("target","_blank"):r=$("
").addClass("keyword-label").attr("data-keyword",a),r.append(document.createTextNode(a)),r.append($("").addClass("keyword-remove").text("×"));let i=o==="#reviewKeywordContainer"?"jhsDirtyReviewKeywords":"jhsDirtyTitleKeywords";r.find(".keyword-remove").click((n=>{n.stopPropagation(),n.preventDefault();let l=$(n.currentTarget),c=l.closest(".keyword-label").attr("data-keyword").split(" ")[0];utils.q(n,`是否移除屏蔽词 ${T(c)}?`,(async()=>{l.parent().remove(),t.data(i,!0)}))})),s.append(r)}d(Ii,"addLabelTag");function Xl(o,e,t){let s=t.find(`${e} .keyword-input`),a=s.val().trim();if(!a)return;t.find(`${e} .keyword-label`).toArray().some((i=>$(i).text().replaceAll("×","").trim()===a))||Ii(e,a,t),s.val(""),t.data(e==="#reviewKeywordContainer"?"jhsDirtyReviewKeywords":"jhsDirtyTitleKeywords",!0)}d(Xl,"addKeyword");var Ne=Object.freeze({blocked:{id:"filterBtn",label:"屏蔽"},favorite:{id:"favoriteBtn",label:"收藏"},downloaded:{id:"hasDownBtn",label:"已下载"},watched:{id:"hasWatchBtn",label:"已观看"}});function Hs(o=new KeyboardEvent("keydown")){return o.isComposing||o.repeat||!o.code||/^(Control|Shift|Alt|Meta)/.test(o.code)||["Escape","Tab","Unidentified"].includes(o.code)?null:{code:o.code,ctrl:o.ctrlKey,alt:o.altKey,shift:o.shiftKey,meta:o.metaKey}}d(Hs,"shortcutFromEvent");function is(o=Object.create(null)){if(!o||typeof o.code!="string")return"";let e=o.code.replace(/^Key(?=[A-Z]$)|^Digit(?=\d$)/g,"");return[o.ctrl&&"Ctrl",o.alt&&"Alt",o.shift&&"Shift",o.meta&&"Meta",e].filter(Boolean).join("+")}d(is,"shortcutLabel");function ns(o=Object.create(null),e=Object.create(null)){return!!o&&!!e&&o.code===e.code&&["ctrl","alt","shift","meta"].every(t=>!!o[t]==!!e[t])}d(ns,"shortcutMatches");function yt(o=Object.create(null)){return!o||typeof o!="object"||Array.isArray(o)?Object.create(null):Object.fromEntries(Object.keys(Ne).filter(e=>{let t=o[e];return t&&typeof t.code=="string"&&/^[A-Za-z][A-Za-z0-9]*$/.test(t.code)&&!/^(Control|Shift|Alt|Meta)/.test(t.code)&&!["Escape","Tab","Unidentified"].includes(t.code)}).map(e=>[e,o[e]]))}d(yt,"readDetailShortcuts");function ac(){let o={SettingPlugin:["设置中心","core"],StatsPlugin:["统计中心","core"],MobileBottomBarPlugin:["工具栏与移动操作","core"],DetailShortcutPlugin:["详情鉴定快捷键","detail"],ListPagePlugin:["列表状态处理","list"],NavBarPlugin:["JavDB 导航","list"],BusNavBarPlugin:["JavBus 导航","list"],ListPageButtonPlugin:["列表操作","list"],HighlightMagnetPlugin:["磁力标记","list"],FoldCategoryPlugin:["分类折叠","list"],AutoPagePlugin:["自动翻页","list"],HitShowPlugin:["热播榜单","list"],TOP250Plugin:["TOP 250","list"],DetailPagePlugin:["JavDB 详情页","detail"],BusDetailPagePlugin:["JavBus 详情页","detail"],DetailPageButtonPlugin:["详情操作","detail"],ReviewPlugin:["评论","detail"],RelatedPlugin:["相关影片","detail"],TranslatePlugin:["标题翻译","detail"],WantAndWatchedVideosPlugin:["想看与看过","detail"],CoverButtonPlugin:["封面快捷操作","media"],PreviewVideoPlugin:["JavDB 预览视频","media"],BusPreviewVideoPlugin:["JavBus 预览视频","media"],ScreenShotPlugin:["剧照","media"],BusImgPlugin:["JavBus 图片适配","media"],ActressInfoPlugin:["演员资料","media"],SearchByImagePlugin:["以图搜图","media"],HistoryPlugin:["鉴定记录","data"],BlacklistPlugin:["黑名单","data"],FilterTitleKeywordPlugin:["关键词筛选","data"],FavoriteActressesPlugin:["演员收藏","data"],NewVideoPlugin:["新作品检测","data"],TaskPlugin:["定时任务","data"],OtherSitePlugin:["外部站点","network"],Fc2Plugin:["FC2 详情","network"],Fc2By123AvPlugin:["FC2 123AV","network"],MagnetHubPlugin:["磁力聚合","network"],JavTrailersPlugin:["预告片","network"],SubTitleCatPlugin:["字幕搜索","network"],OneTwoThreeOfflinePlugin:["123 云盘离线","network"]},e=d((t,s)=>({label:s,plugins:Object.entries(o).filter((a=>a[1][1]===t)).map((a=>a[0]))}),"group");return{categories:{core:e("core","基础核心"),list:e("list","列表页"),detail:e("detail","详情页"),media:e("media","媒体"),data:e("data","数据"),network:e("network","网络")},pluginMeta:o}}d(ac,"getPluginCategories");function Uh(o){return o.map(e=>`
${e.text}
@@ -2581,11 +2581,12 @@
- `).join("")}d(Ih,"buildCacheItemsHtml");function Eh(){let o="";return rt.forEach(e=>{e.canSelect&&(o+=``)}),o}d(Eh,"buildVideoQualityOptions");function Yl(o,e){let t=Ih(e),s=Eh();return` + `).join("")}d(Uh,"buildCacheItemsHtml");function zh(){let o="";return nt.forEach(e=>{e.canSelect&&(o+=``)}),o}d(zh,"buildVideoQualityOptions");function rc(o,e){let t=Uh(e),s=zh();return`
- `}d(Yl,"buildSettingDialogHtml");function Zl(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="health-panel"]').length&&o.append('');let e=$(".content-panel").parent();e.length&&!$("#health-panel").length&&e.append(` + `}d(rc,"buildSettingDialogHtml");function ic(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="health-panel"]').length&&o.append('');let e=$(".content-panel").parent();e.length&&!$("#health-panel").length&&e.append(`

数据体检

检查本地数据并在备份后修复异常。

@@ -3051,7 +3058,7 @@
点击重新体检查看结果
- `)}d(Zl,"injectHealthPanel");function Xl(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="plugin-mgmt-panel"]').length&&o.append('');let e=$(".content-panel").parent();if(!e.length||$("#plugin-mgmt-panel").length)return;e.append(`
+ `)}d(ic,"injectHealthPanel");function nc(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="plugin-mgmt-panel"]').length&&o.append('');let e=$(".content-panel").parent();if(!e.length||$("#plugin-mgmt-panel").length)return;e.append(`

插件管理

按功能查看插件状态、耗时和错误记录。

0总插件数
@@ -3065,7 +3072,7 @@

错误日志

无错误记录

缓存命中率

-
`)}d(Xl,"injectPluginMgmtPanel");function ec(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="snapshot-panel"]').length&&o.append('');let e=$(".content-panel").parent();if(!e.length||$("#snapshot-panel").length)return;e.append('

恢复点

创建、下载或恢复本地数据快照。

快照保存当前全部数据状态,可用于恢复。最多保留 10 个,超出自动清理最旧的。

')}d(ec,"injectSnapshotPanel");function tc(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="network-panel"]').length&&o.append('');let e=$(".content-panel").parent();if(!e.length||$("#network-panel").length)return;e.append(`
+
`)}d(nc,"injectPluginMgmtPanel");function oc(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="snapshot-panel"]').length&&o.append('');let e=$(".content-panel").parent();if(!e.length||$("#snapshot-panel").length)return;e.append('

恢复点

创建、下载或恢复本地数据快照。

快照保存当前全部数据状态,可用于恢复。最多保留 10 个,超出自动清理最旧的。

')}d(oc,"injectSnapshotPanel");function lc(){let o=$(".side-menu-item").parent();o.length&&!o.find('[data-panel="network-panel"]').length&&o.append('');let e=$(".content-panel").parent();if(!e.length||$("#network-panel").length)return;e.append(`

外部请求

配置熔断规则并查看站点健康状态。

熔断器配置

连续请求失败达到阈值后,自动停止对该站点的请求,避免拖慢整体体验。

熔断阈值(次):
@@ -3073,14 +3080,14 @@

站点健康状态

各外部站点的熔断状态和请求统计。

域名使用统计

脚本实际请求过的域名及次数。

-
`)}d(tc,"injectNetworkPanel");function sc(){if($("#resource-sources-panel").length)return;$(".content-panel").last().after(`
+
`)}d(lc,"injectNetworkPanel");function cc(){if($("#resource-sources-panel").length)return;$(".content-panel").last().after(`

磁力来源

聚合多个来源搜索磁力结果,优先级数字越小越靠前。

自定义来源

磁力规则

使用可视化规则为结果添加标签或过滤低质量内容。

标签规则

过滤规则

截图来源

自动选择会按优先级依次尝试可用来源。

高级 · 导入 / 导出配置

高级功能:错误修改可能导致自定义来源不可用,保存前会校验配置。

统一离线服务

115 状态:未知

服务不可用时会在提交前显示原因。
-

番号列表导入

支持换行、空格、逗号分隔番号。必须先解析预览,再确认导入。

`),$(".jhs-mobile-sidebar,.setting-sidebar").first().append('')}d(sc,"injectResourceSourcesPanel");function zs(o=void 0,e={}){let t=o?Hl(o,e):null;return` +

番号列表导入

支持换行、空格、逗号分隔番号。必须先解析预览,再确认导入。

`),$(".jhs-mobile-sidebar,.setting-sidebar").first().append('')}d(cc,"injectResourceSourcesPanel");function Ws(o=void 0,e={}){let t=o?Zl(o,e):null;return`
${t?t.prop("outerHTML"):'
'} @@ -3088,7 +3095,7 @@
-
`}d(zs,"buildQuickSettingHtml");async function Dt(o){let e=o.getNetworkDiagnostics(),t=e.circuitBreakers,s=e.domainStats,a=await storageManager.getSetting("circuitBreakerThreshold",3),r=await storageManager.getSetting("circuitBreakerCooldown",6e4);$("#circuitBreakerThreshold").each(((l,c)=>{c.dataset.jhsHydrated||(c.value=String(a),c.dataset.jhsHydrated="1")})),$("#circuitBreakerCooldownSec").each(((l,c)=>{c.dataset.jhsHydrated||(c.value=String(Math.round(r/1e3)),c.dataset.jhsHydrated="1")}));let i=Object.entries(t);if(i.length){let l='';for(let[c,h]of i){let u=h.state==="open"?"熔断":h.state==="half-open"?"半开":"正常",p=h.state==="open"?`剩余${Math.ceil((Number(h.cooldownMs)-(Date.now()-Number(h.openTime)))/1e3)}秒`:"";l+=``}l+="
域名状态失败次数操作
${T(c)}${u} ${p}${Number(h.failCount)||0}
",$("#site-health-table").html(l)}else $("#site-health-table").html('

暂无熔断记录

');let n=Object.entries(s).sort(((l,c)=>c[1].count-l[1].count));if(n.length){let l='';for(let[c,h]of n){let u=h.lastUsed?new Date(h.lastUsed).toLocaleTimeString():"-";l+=``}l+="
域名请求数错误数最后使用
${T(c)}${h.count}${h.errors}${u}
",l+=`

共 ${n.length} 个域名

`,$("#domain-stats-table").html(l)}else $("#domain-stats-table").html('

暂无统计数据

');$(".reset-breaker").off("click").on("click",(l=>{let c=$(l.target).data("domain");o.resetCircuitBreaker(c),show.ok(`已重置 ${c} 的熔断状态`),Dt(o)})),$("#resetAllBreakersBtn").off("click").on("click",(()=>{o.resetAllCircuitBreakers(),show.ok("已重置全部熔断状态"),Dt(o)})),$("#clearDomainStatsBtn").off("click").on("click",(()=>{o.clearDomainStats(),show.ok("已清空域名统计"),Dt(o)}))}d(Dt,"renderNetworkPanel");async function as(){let o=await storageManager.getSnapshotList(),e={manual:"手动创建","auto-import":"导入前自动","auto-repair":"修复前自动","auto-restore":"恢复前自动"};if(o.length===0)return void $("#snapshot-list").html('
暂无快照,点击上方按钮创建
');$("#snapshot-list").find(".tabulator").length&&$("#snapshot-list").empty();let t=ze(globalThis.Tabulator,"#snapshot-list",{pagination:!1,layout:"fitColumns",placeholder:"暂无数据",data:o,columnDefaults:{headerHozAlign:"center",hozAlign:"center"},columns:[{title:"名称",field:"name",width:200,headerSort:!1},{title:"来源",field:"source",width:100,headerSort:!1,formatter:d(s=>e[s.getValue()]||s.getValue(),"formatter")},{title:"时间",field:"time",width:170,headerSort:!1},{title:"数据量",field:"itemCount",width:80,headerSort:!1},{title:"操作",minWidth:220,headerSort:!1,formatter:d((s,a,r)=>{let i=s.getData();return r((()=>{let n=s.getElement().querySelector(".snap-restore"),l=s.getElement().querySelector(".snap-download"),c=s.getElement().querySelector(".snap-delete");n&&n.addEventListener("click",(async h=>{utils.q(h,`恢复到快照「${T(i.name)}」? 当前数据会自动备份。`,(async()=>{let u=loading();try{await storageManager.restoreSnapshot(i.id),show.ok("恢复成功, 页面将刷新"),setTimeout(()=>location.reload(),1e3)}catch(p){clog.error(p),show.error("恢复失败: "+(p instanceof Error?p.message:String(p)))}finally{u.close()}}))})),l&&l.addEventListener("click",(async h=>{let u=loading();try{let p=await storageManager.getSnapshot(i.id);if(!p)throw new Error("快照不存在");utils.download(JSON.stringify(p.data),`snapshot_${String(i.name||"snapshot").replace(/[\\/:*?"<>|]/g,"_")}.json`),show.ok("下载成功")}catch(p){show.error("下载失败: "+(p instanceof Error?p.message:String(p)))}finally{u.close()}})),c&&c.addEventListener("click",(async h=>{utils.q(h,`删除快照「${T(i.name)}」?`,(async()=>{try{await storageManager.deleteSnapshot(i.id),show.ok("已删除"),as()}catch(u){clog.error(u),show.error("删除失败: "+(u instanceof Error?u.message:String(u)))}}))}))})),' '},"formatter")}]})}d(as,"renderSnapshotPanel");function ac(o,e,t=null,s){let a=o.summary,r=[];for(let[c,h]of Object.entries(o.stores)){if(h.status==="unchanged")continue;let u={store:c,status:h.status,oldCount:h.oldCount,newCount:h.newCount,added:h.added.length,removed:h.removed.length,modified:h.modified.length};r.push(u)}let i='
';if(i+='
',i+=`
${a.added}新增数据源
`,i+=`
${a.removed}缺失数据源
`,i+=`
${a.modified}有变更
`,i+=`
${a.unchanged}无变化
`,i+="
",r.length>0){i+='
';let c={added:"新增",removed:"缺失",modified:"变更",unchanged:"无变化"};for(let h of r)i+=``;i+="
数据源状态当前导入新增删除修改
${T(h.store)}${c[h.status]||h.status}${h.oldCount}${h.newCount}${h.added||"-"}${h.removed||"-"}${h.modified||"-"}
"}else i+='
数据完全一致,无需导入
';i+='
导入将覆盖当前数据,建议先创建快照备份
',i+="
";let n=r.length>0,l=s.open({type:1,title:"数据差异预览",content:i,area:utils.getResponsiveArea(["700px","auto"]),btn:n?["确认导入","取消"]:["知道了","取消"],anim:-1,yes:d(async c=>{if(!n)return void s.close(c);let h=loading();try{await storageManager.createSnapshot("导入前自动备份","auto-import"),t?(await storageManager.importData(t),show.ok("导入成功!"),setTimeout(()=>location.reload(),1e3)):e&&(await storageManager.importData(e),show.ok("导入成功!"),setTimeout(()=>location.reload(),1e3))}catch(u){clog.error(u),show.error("导入失败: "+(u instanceof Error?u.message:String(u)))}finally{h.close()}},"yes")})}d(ac,"showDiffPreview");async function $i(o,e=null){let t=o.exportSnapshot(),s=Ge(await storageManager.getSetting("disabledPlugins","[]")),a=t.legacyPlugins,r=d(S=>{let j=new Set(S);return a.filter((k=>j.has(k)||j.has(Tt(k))))},"effectiveDisabledNames"),{categories:i,pluginMeta:n}=Ql(),l=new Map((t.legacyPluginDescriptors||[]).map(S=>[S.name,S])),c=new Set(a),h="";for(let[S,j]of Object.entries(i)){let k=j.plugins.filter(x=>c.has(x));if(k.length){h+='
',h+=`

${T(j.label)}

`;for(let x of k){let _=l.get(x)?.disableable===!1,R=s.includes(Tt(x)),L=n[x]?.[0]||x;h+='
',h+=`${T(L)}`,_?h+='核心':h+=``,h+="
"}h+="
"}}$("#plugin-mgmt-list").html(h);let u=r(s),p=a.length-u.length;$("#pm-total").text(a.length),$("#pm-enabled").text(p),$("#pm-disabled").text(u.length),$(".pm-toggle").off("change").on("change",async S=>{let j=$(S.target),k=j.data("plugin"),x=j.is(":checked"),_=!x,R=Ge(await storageManager.getSetting("disabledPlugins","[]")),L=Tt(k);if(x?R=R.filter(A=>A!==k&&A!==L):R.includes(L)||R.push(L),!e)throw new Error("SettingsService is unavailable");let N=d(A=>{let O=t.legacyPlugins,U=r(A);$("#pm-total").text(O.length),$("#pm-enabled").text(O.length-U.length),$("#pm-disabled").text(U.length)},"renderState");N(R);try{await e.set("disabledPlugins",JSON.stringify(R)),show.ok(`插件 "${k}" 已${x?"启用":"禁用"},刷新后生效`)}catch(A){j.prop("checked",_);let O=Ge(await storageManager.getSetting("disabledPlugins","[]"));N(O),clog.error("插件状态保存失败,已恢复",A),show.error(`插件 "${k}" 状态保存失败,已恢复`)}});let g=t.legacyStartup,m=t.legacyTimings,f=d(S=>Number.isFinite(S)?S.toFixed(1):"0.0","formatMs"),v=g?`
就绪: ${f(g.readyMs)} ms注册: ${f(g.registrationMs)} ms样式: ${f(g.cssMs)} ms即时插件: ${f(g.immediateMs)} ms空闲任务: ${g.idleCompleted}/${g.idleCompleted+g.idlePending}

就绪耗时不包含 @require 下载及浏览器脚本解析时间。

`:"";if(m.length){let S=[...m].sort(((k,x)=>x.elapsed-k.elapsed)),j='';for(let k of S){let x=k.status==="disabled"?"is-muted":k.elapsed>500?"is-slow":k.elapsed>200?"is-warning":"",_=k.status==="disabled"?"已禁用":k.status==="error"?"错误":k.status==="pending-idle"?"等待空闲":k.status==="skipped-mobile"?"移动端跳过":"正常";j+=``}j+="
插件阶段耗时(ms)状态
${T(k.name)}${k.startupMode==="idle"?"空闲":"即时"}${k.elapsed.toFixed(1)}${_}
",$("#plugin-timing-table").html(v+j)}else $("#plugin-timing-table").html(v+'

暂无数据,刷新页面后自动采集。

');let b=t.errors.filter(S=>S.source==="legacy-plugin");if(b.length){let S='';for(let j of[...b].reverse())S+=``;S+="
时间插件阶段错误信息
${T(String(j.timestamp||"").substring(11,19))}${T(j.plugin)}${T(j.phase)}${T(j.message)}
",$("#plugin-error-log").html(S)}else $("#plugin-error-log").text("无错误记录");let w=storageManager.getCacheHitStats();$("#cache-hit-stats").html(`
命中: ${w.hits}未命中: ${w.misses}总计: ${w.total}命中率: ${w.rate}
`)}d($i,"renderPluginMgmtPanel");async function rs(){let o=$("#health-data-display");if(o.length){o.text("体检中...");try{let e=await storageManager.inspectDataHealth(),t=e.fixable.reduce(((r,i)=>r+i.count),0),s=e.readonly.reduce(((r,i)=>r+i.count),0),a=d(r=>r.length?r.map((i=>`
  • ${T(i.message)}:${i.count}
  • `)).join(""):"
  • 无
  • ","i");o.html(` +
    `}d(Ws,"buildQuickSettingHtml");async function Lt(o){let e=o.getNetworkDiagnostics(),t=e.circuitBreakers,s=e.domainStats,a=await storageManager.getSetting("circuitBreakerThreshold",3),r=await storageManager.getSetting("circuitBreakerCooldown",6e4);$("#circuitBreakerThreshold").each(((l,c)=>{c.dataset.jhsHydrated||(c.value=String(a),c.dataset.jhsHydrated="1")})),$("#circuitBreakerCooldownSec").each(((l,c)=>{c.dataset.jhsHydrated||(c.value=String(Math.round(r/1e3)),c.dataset.jhsHydrated="1")}));let i=Object.entries(t);if(i.length){let l='';for(let[c,h]of i){let u=h.state==="open"?"熔断":h.state==="half-open"?"半开":"正常",p=h.state==="open"?`剩余${Math.ceil((Number(h.cooldownMs)-(Date.now()-Number(h.openTime)))/1e3)}秒`:"";l+=``}l+="
    域名状态失败次数操作
    ${T(c)}${u} ${p}${Number(h.failCount)||0}
    ",$("#site-health-table").html(l)}else $("#site-health-table").html('

    暂无熔断记录

    ');let n=Object.entries(s).sort(((l,c)=>c[1].count-l[1].count));if(n.length){let l='';for(let[c,h]of n){let u=h.lastUsed?new Date(h.lastUsed).toLocaleTimeString():"-";l+=``}l+="
    域名请求数错误数最后使用
    ${T(c)}${h.count}${h.errors}${u}
    ",l+=`

    共 ${n.length} 个域名

    `,$("#domain-stats-table").html(l)}else $("#domain-stats-table").html('

    暂无统计数据

    ');$(".reset-breaker").off("click").on("click",(l=>{let c=$(l.target).data("domain");o.resetCircuitBreaker(c),show.ok(`已重置 ${c} 的熔断状态`),Lt(o)})),$("#resetAllBreakersBtn").off("click").on("click",(()=>{o.resetAllCircuitBreakers(),show.ok("已重置全部熔断状态"),Lt(o)})),$("#clearDomainStatsBtn").off("click").on("click",(()=>{o.clearDomainStats(),show.ok("已清空域名统计"),Lt(o)}))}d(Lt,"renderNetworkPanel");async function os(){let o=await storageManager.getSnapshotList(),e={manual:"手动创建","auto-import":"导入前自动","auto-repair":"修复前自动","auto-restore":"恢复前自动"};if(o.length===0)return void $("#snapshot-list").html('
    暂无快照,点击上方按钮创建
    ');$("#snapshot-list").find(".tabulator").length&&$("#snapshot-list").empty();let t=Ve(globalThis.Tabulator,"#snapshot-list",{pagination:!1,layout:"fitColumns",placeholder:"暂无数据",data:o,columnDefaults:{headerHozAlign:"center",hozAlign:"center"},columns:[{title:"名称",field:"name",width:200,headerSort:!1},{title:"来源",field:"source",width:100,headerSort:!1,formatter:d(s=>e[s.getValue()]||s.getValue(),"formatter")},{title:"时间",field:"time",width:170,headerSort:!1},{title:"数据量",field:"itemCount",width:80,headerSort:!1},{title:"操作",minWidth:220,headerSort:!1,formatter:d((s,a,r)=>{let i=s.getData();return r((()=>{let n=s.getElement().querySelector(".snap-restore"),l=s.getElement().querySelector(".snap-download"),c=s.getElement().querySelector(".snap-delete");n&&n.addEventListener("click",(async h=>{utils.q(h,`恢复到快照「${T(i.name)}」? 当前数据会自动备份。`,(async()=>{let u=loading();try{await storageManager.restoreSnapshot(i.id),show.ok("恢复成功, 页面将刷新"),setTimeout(()=>location.reload(),1e3)}catch(p){clog.error(p),show.error("恢复失败: "+(p instanceof Error?p.message:String(p)))}finally{u.close()}}))})),l&&l.addEventListener("click",(async h=>{let u=loading();try{let p=await storageManager.getSnapshot(i.id);if(!p)throw new Error("快照不存在");utils.download(JSON.stringify(p.data),`snapshot_${String(i.name||"snapshot").replace(/[\\/:*?"<>|]/g,"_")}.json`),show.ok("下载成功")}catch(p){show.error("下载失败: "+(p instanceof Error?p.message:String(p)))}finally{u.close()}})),c&&c.addEventListener("click",(async h=>{utils.q(h,`删除快照「${T(i.name)}」?`,(async()=>{try{await storageManager.deleteSnapshot(i.id),show.ok("已删除"),os()}catch(u){clog.error(u),show.error("删除失败: "+(u instanceof Error?u.message:String(u)))}}))}))})),' '},"formatter")}]})}d(os,"renderSnapshotPanel");function dc(o,e,t=null,s){let a=o.summary,r=[];for(let[c,h]of Object.entries(o.stores)){if(h.status==="unchanged")continue;let u={store:c,status:h.status,oldCount:h.oldCount,newCount:h.newCount,added:h.added.length,removed:h.removed.length,modified:h.modified.length};r.push(u)}let i='
    ';if(i+='
    ',i+=`
    ${a.added}新增数据源
    `,i+=`
    ${a.removed}缺失数据源
    `,i+=`
    ${a.modified}有变更
    `,i+=`
    ${a.unchanged}无变化
    `,i+="
    ",r.length>0){i+='
    ';let c={added:"新增",removed:"缺失",modified:"变更",unchanged:"无变化"};for(let h of r)i+=``;i+="
    数据源状态当前导入新增删除修改
    ${T(h.store)}${c[h.status]||h.status}${h.oldCount}${h.newCount}${h.added||"-"}${h.removed||"-"}${h.modified||"-"}
    "}else i+='
    数据完全一致,无需导入
    ';i+='
    导入将覆盖当前数据,建议先创建快照备份
    ',i+="
    ";let n=r.length>0,l=s.open({type:1,title:"数据差异预览",content:i,area:utils.getResponsiveArea(["700px","auto"]),btn:n?["确认导入","取消"]:["知道了","取消"],anim:-1,yes:d(async c=>{if(!n)return void s.close(c);let h=loading();try{await storageManager.createSnapshot("导入前自动备份","auto-import"),t?(await storageManager.importData(t),show.ok("导入成功!"),setTimeout(()=>location.reload(),1e3)):e&&(await storageManager.importData(e),show.ok("导入成功!"),setTimeout(()=>location.reload(),1e3))}catch(u){clog.error(u),show.error("导入失败: "+(u instanceof Error?u.message:String(u)))}finally{h.close()}},"yes")})}d(dc,"showDiffPreview");async function Ei(o,e=null){let t=o.exportSnapshot(),s=Ee(await storageManager.getSetting("disabledPlugins","[]")),a=t.legacyPlugins,r=d(S=>{let j=new Set(S);return a.filter((k=>j.has(k)||j.has(Pt(k))))},"effectiveDisabledNames"),{categories:i,pluginMeta:n}=ac(),l=new Map((t.legacyPluginDescriptors||[]).map(S=>[S.name,S])),c=new Set(a),h="";for(let[S,j]of Object.entries(i)){let k=j.plugins.filter(x=>c.has(x));if(k.length){h+='
    ',h+=`

    ${T(j.label)}

    `;for(let x of k){let _=l.get(x)?.disableable===!1,I=s.includes(Pt(x)),L=n[x]?.[0]||x;h+='
    ',h+=`${T(L)}`,_?h+='核心':h+=``,h+="
    "}h+="
    "}}$("#plugin-mgmt-list").html(h);let u=r(s),p=a.length-u.length;$("#pm-total").text(a.length),$("#pm-enabled").text(p),$("#pm-disabled").text(u.length),$(".pm-toggle").off("change").on("change",async S=>{let j=$(S.target),k=j.data("plugin"),x=j.is(":checked"),_=!x,I=Ee(await storageManager.getSetting("disabledPlugins","[]")),L=Pt(k);if(x?I=I.filter(A=>A!==k&&A!==L):I.includes(L)||I.push(L),!e)throw new Error("SettingsService is unavailable");let N=d(A=>{let O=t.legacyPlugins,U=r(A);$("#pm-total").text(O.length),$("#pm-enabled").text(O.length-U.length),$("#pm-disabled").text(U.length)},"renderState");N(I);try{await e.set("disabledPlugins",JSON.stringify(I)),show.ok(`插件 "${k}" 已${x?"启用":"禁用"},刷新后生效`)}catch(A){j.prop("checked",_);let O=Ee(await storageManager.getSetting("disabledPlugins","[]"));N(O),clog.error("插件状态保存失败,已恢复",A),show.error(`插件 "${k}" 状态保存失败,已恢复`)}});let g=t.legacyStartup,m=t.legacyTimings,f=d(S=>Number.isFinite(S)?S.toFixed(1):"0.0","formatMs"),v=g?`
    就绪: ${f(g.readyMs)} ms注册: ${f(g.registrationMs)} ms样式: ${f(g.cssMs)} ms即时插件: ${f(g.immediateMs)} ms空闲任务: ${g.idleCompleted}/${g.idleCompleted+g.idlePending}

    就绪耗时不包含 @require 下载及浏览器脚本解析时间。

    `:"";if(m.length){let S=[...m].sort(((k,x)=>x.elapsed-k.elapsed)),j='';for(let k of S){let x=k.status==="disabled"?"is-muted":k.elapsed>500?"is-slow":k.elapsed>200?"is-warning":"",_=k.status==="disabled"?"已禁用":k.status==="error"?"错误":k.status==="pending-idle"?"等待空闲":k.status==="skipped-mobile"?"移动端跳过":"正常";j+=``}j+="
    插件阶段耗时(ms)状态
    ${T(k.name)}${k.startupMode==="idle"?"空闲":"即时"}${k.elapsed.toFixed(1)}${_}
    ",$("#plugin-timing-table").html(v+j)}else $("#plugin-timing-table").html(v+'

    暂无数据,刷新页面后自动采集。

    ');let b=t.errors.filter(S=>S.source==="legacy-plugin");if(b.length){let S='';for(let j of[...b].reverse())S+=``;S+="
    时间插件阶段错误信息
    ${T(String(j.timestamp||"").substring(11,19))}${T(j.plugin)}${T(j.phase)}${T(j.message)}
    ",$("#plugin-error-log").html(S)}else $("#plugin-error-log").text("无错误记录");let w=storageManager.getCacheHitStats();$("#cache-hit-stats").html(`
    命中: ${w.hits}未命中: ${w.misses}总计: ${w.total}命中率: ${w.rate}
    `)}d(Ei,"renderPluginMgmtPanel");async function ls(){let o=$("#health-data-display");if(o.length){o.text("体检中...");try{let e=await storageManager.inspectDataHealth(),t=e.fixable.reduce(((r,i)=>r+i.count),0),s=e.readonly.reduce(((r,i)=>r+i.count),0),a=d(r=>r.length?r.map((i=>`
  • ${T(i.message)}:${i.count}
  • `)).join(""):"
  • 无
  • ","i");o.html(`
    番号记录:${e.totals.carList}
    收藏演员:${e.totals.favoriteActresses}
    @@ -3100,7 +3107,7 @@

    可安全修复

      ${a(e.fixable)}

    仅报告

      ${a(e.readonly)}
    - `)}catch(e){clog.error(e),o.text("体检失败: "+e)}}}d(rs,"renderDataHealthPanel");async function rc(){let o=JSON.stringify(await storageManager.exportData()),e=`health-backup-${utils.getNowStr("_","_")}.json`;utils.download(o,e);let t=await storageManager.repairDataHealth();show.ok(`已修复 ${t.fixedGroups} 组数据问题,修复前备份已下载`),await rs()}d(rc,"repairDataHealthWithBackup");var Ti=class Ti extends I{constructor(){super(...arguments),P(this,"folderName","JHS-数据备份"),P(this,"resourceSettings",new ot),P(this,"pendingCarImport",null),P(this,"taskStatusUnsubscribe",null),P(this,"_desktopSettingNavMounted",!1),P(this,"_settingScope",null),P(this,"_settingNavResizeCleanup",null),P(this,"_desktopNavGeneration",0),P(this,"_settingsDialogGeneration",0),P(this,"_fullSettingBinding",null),P(this,"_cloudSettingBinding",null),P(this,"cacheItems",[{key:"jhs_dmm_video",text:"预览视频缓存",title:"预览视频缓存"},{key:"jhs_other_site",text:"第三方站点缓存",title:"第三方站点资源检测结果, 如missav,123Av等"},{key:"jhs_screenShot",text:"缩略图缓存",title:"缩略图缓存"},{key:"jhs_translate",text:"标题翻译",title:"标题翻译"},{key:"jhs_actress_info",text:"演员信息",title:"演员的年龄三围等数据信息"},{key:"jhs_score_info",text:"Top250|热播 评分数据",title:"Top250及热播的评分数据"},{key:"third_party_ttl_cache",text:"第三方TTL缓存",title:"评论、相关清单、磁力搜索、缩略图等请求缓存"},{key:"_circuitBreaker",text:"熔断状态",title:"各站点的熔断计数和状态"},{key:"_domainStats",text:"域名请求统计",title:"各域名的请求次数和错误统计"}])}getName(){return"SettingPlugin"}getFormDependencies(){return Object.freeze({otherSite:this.getOptionalDependency("OtherSitePlugin"),listPage:this.getOptionalDependency("ListPagePlugin"),translate:this.getOptionalDependency("TranslatePlugin"),actressInfo:this.getOptionalDependency("ActressInfoPlugin"),screenshot:this.getOptionalDependency("ScreenShotPlugin"),newVideo:this.getOptionalDependency("NewVideoPlugin"),blacklist:this.getOptionalDependency("BlacklistPlugin"),busImg:this.getOptionalDependency("BusImgPlugin"),host:this.getRuntimeService("host"),movie:this.getRuntimeService("movie"),settings:this.getRuntimeService("settings"),settingsRegistry:this.getRuntimeService("settingsRegistry"),webdav:this.getRuntimeService("webdav")})}async initCss(){let e=this.getRuntimeService("settings").snapshot(),t=e?.containerWidth??"100";utils.isMobileMode()&&(t="100");let s=utils.isMobileMode()?1:e?.containerColumns??5;return vi(e,{busImgPlugin:this.getOptionalDependency("BusImgPlugin"),hostAdapter:this.getRuntimeService("host")}).catch((a=>clog.error("[JHS] applyLayoutFromSettings failed:",a))),Fl(t,s,B,M)}async handle(){let e=this.getRuntimeService("settings");this.resourceSettings=new ot({getSetting:d(async(i=null,n)=>i===null?e.snapshot():Object.prototype.hasOwnProperty.call(e.snapshot(),i)?e.snapshot()[i]:n,"getSetting"),saveSettingItem:d((i,n)=>e.set(i,n),"saveSettingItem"),updateSetting:d(i=>e.update(i),"updateSetting"),patch:d(i=>e.patch(i),"patch")}),await storageManager.getSetting("enableClog",E)===E&&clog.show();let t=await this.getRuntimeService("scope")();this._settingScope=t;let s=this.getRuntimeService("settings"),a=d(i=>{let n=i.detail?.names||[];n.length&&(n.includes("themeMode")&&Ht(s.snapshot().themeMode),n.includes("enableClog")&&(s.snapshot().enableClog==="yes"?clog.show():clog.hide()),n.some(l=>["mobileMode","enableVerticalModel","containerColumns","containerWidth"].includes(l))&&vi(s.snapshot(),{busImgPlugin:this.getOptionalDependency("BusImgPlugin"),hostAdapter:this.getRuntimeService("host")}).catch(l=>clog.error("布局设置应用失败",l)))},"onSettingsChanged");s.addEventListener("settings.changed",a),t.addCleanup((()=>s.removeEventListener("settings.changed",a)));let r=d(async(i="backup-panel")=>{try{return await this.openSettingDialog(i)}catch(n){throw clog.error("设置中心打开失败",n),show.error("设置中心打开失败"),n}},"openSettings");t.addCleanup(ml(r)),t.listen(document,"click",(i=>{i.target instanceof Element&&i.target.closest("#setting-btn, #mini-setting-btn")&&(i.preventDefault(),$(".simple-setting, .mini-simple-setting").each((l,c)=>et(c)),clog.lowZIndex(),r().catch((()=>{})))})),t.addCleanup((()=>this.unmountDesktopSettingNav())),this.syncDesktopSettingNav(this.getRuntimeService("profile").current()==="compact")}syncDesktopSettingNav(e){e?this.unmountDesktopSettingNav():this.mountDesktopSettingNav()}mountDesktopSettingNav(){if(this._desktopSettingNavMounted)return;let e=this._settingScope;if(!e)return;this._desktopSettingNavMounted=!0;let t=this._desktopNavGeneration;if(M){let s=d(function(){$(".navbar-search").is(":hidden")?($(".mini-setting-box").hide(),$(".setting-box").show()):($(".mini-setting-box").show(),$(".setting-box").hide())},"e");$("#navbar-menu-user .navbar-end").prepend(` - `)}),1,1e4,!1,e)),$(".main-nav, .container-fluid").off("mouseenter.jhsSettingQuick mouseleave.jhsSettingQuick").on("mouseenter.jhsSettingQuick",".setting-box",(async s=>{let a=$(s.currentTarget).find(".simple-setting");et(a),a.html(zs(this.getRuntimeService("settingsRegistry"))).show();try{await Us(this.getFormDependencies(),this.getSelector.bind(this),this.openSettingDialog.bind(this),a)}catch(r){clog.warn("桌面快捷设置初始化失败",r)}clog.lowZIndex()})).on("mouseleave.jhsSettingQuick",".setting-box",(s=>{et($(s.currentTarget).find(".simple-setting"))})).on("mouseenter.jhsSettingQuick",".mini-setting-box",(async s=>{let a=$(s.currentTarget).find(".mini-simple-setting");et(a),a.html(zs(this.getRuntimeService("settingsRegistry"))).show();try{await Us(this.getFormDependencies(),this.getSelector.bind(this),this.openSettingDialog.bind(this),a)}catch(r){clog.warn("迷你快捷设置初始化失败",r)}clog.lowZIndex()})).on("mouseleave.jhsSettingQuick",".mini-setting-box",(s=>{et($(s.currentTarget).find(".mini-simple-setting"))}))}unmountDesktopSettingNav(){this._desktopNavGeneration++,this._desktopSettingNavMounted=!1,this._settingNavResizeCleanup?.(),this._settingNavResizeCleanup=null,$(".simple-setting, .mini-simple-setting").each((e,t)=>et(t)),$(".jhs-setting-nav-item, .jhs-mini-setting-box, .jhs-setting-anchor, .jhs-setting-detail-anchor").remove(),$(".main-nav, .container-fluid").off("mouseenter.jhsSettingQuick mouseleave.jhsSettingQuick")}async openQuickSetting(){$("#jhs-quick-setting-backdrop, #jhs-quick-setting-sheet").remove();let e=document.activeElement;await this.getRuntimeService("settings").waitForIdle();let t=!1,s=d((n=!0)=>{if(t)return;t=!0,$(document).off("keydown.jhsQuickSetting");let l=$("#jhs-quick-setting-sheet .jhs-quick-setting");et(l),$("#jhs-quick-setting-backdrop, #jhs-quick-setting-sheet").remove(),n&&e?.isConnected&&typeof e.focus=="function"&&e.focus()},"closeQuickSetting"),a=$('
    '),r=$(``),i=r.find(".jhs-quick-setting");i.html(Ws(this.getRuntimeService("settingsRegistry"))),$("body").append(a,r),clog.lowZIndex(),a.on("click.jhsQuickSetting",(()=>s())),r.on("click.jhsQuickSetting",".jhs-quick-setting__close",(()=>s())),$(document).off("keydown.jhsQuickSetting").on("keydown.jhsQuickSetting",(n=>{if(n.key==="Escape")return n.preventDefault(),s();if(n.key!=="Tab")return;let l=r.find('a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])').filter(((u,p)=>!p.hidden&&p.getAttribute("aria-hidden")!=="true"));if(!l.length)return void n.preventDefault();let c=l[0],h=l[l.length-1];n.shiftKey&&document.activeElement===c?(n.preventDefault(),h.focus()):!n.shiftKey&&document.activeElement===h&&(n.preventDefault(),c.focus())}));try{await qs(this.getFormDependencies(),this.getSelector.bind(this),(n=>{s(!1),this.openSettingDialog(n).catch((l=>clog.error("完整设置打开失败",l)))}),i),r.find(".jhs-quick-setting__close").trigger("focus")}catch(n){s(),clog.error("快捷设置初始化失败",n),show.error("快捷设置加载失败")}}async openSettingDialog(e="backup-panel",t){await this.getRuntimeService("settings").waitForIdle();let s=rc(e,this.cacheItems);this.getRuntimeService("dialog").open({type:1,title:"设置",content:s,ui:{size:"lg",body:"scroll"},area:utils.getDialogArea("lg"),scrollbar:!1,success:d(async(a,r)=>{let i=++this._settingsDialogGeneration,n=$(a);this._settingsFocusCleanup?.(),this._settingsFocusCleanup=utils.trapFocus(n[0]),n.data("jhsSettingsGeneration",i),n.find(".layui-layer-content").css("position","relative"),this.renderTaskStatuses(n),ic(),nc(),oc(),lc(),cc();let l=this.hydrateLiveSettings(n);this._fullSettingBinding=l,this._shortcutRecorderCleanup?.(),this.bindClick(n),this._shortcutRecorderCleanup=uc(n,this.getRuntimeService("settings"),this._settingScope??void 0),n.find(".side-menu-item.active").attr("aria-current","page"),utils.setupEscClose(r),t&&t(),this.renderTaskStatuses(n),this.taskStatusUnsubscribe?.(),this.taskStatusUnsubscribe=V.on("task-status-changed",(()=>this.renderTaskStatuses(n))),utils.isMobileMode()&&this.collapseAdvancedTabs(n);let c=await Promise.allSettled([this.hydrateSettingForm(a,i),this.loadResourceSettings(a,i)]),h=c[1];K.refreshAll(a),h.status==="rejected"&&(clog.error("resource-settings 加载失败",h.reason),this.getRuntimeService("diagnostics").recordError({source:"resource-settings",message:h.reason?.message||String(h.reason)}),show.error("资源设置加载失败,基本设置仍可保存"))},"success"),end:d(()=>{this._settingsDialogGeneration++,this._shortcutRecorderCleanup?.(),this._shortcutRecorderCleanup=null,this._fullSettingBinding?.dispose?.(),this._fullSettingBinding=null,this._cloudSettingBinding?.dispose?.(),this._cloudSettingBinding=null,this._settingsFocusCleanup?.(),this._settingsFocusCleanup=null,this.taskStatusUnsubscribe?.(),this.taskStatusUnsubscribe=null,this.getOptionalDependency("CoverButtonPlugin")?.enableSvgBtn?.()},"end")})}hydrateLiveSettings(e){let t=$(e),s=t.find("#jhs-live-settings"),a=this.getRuntimeService("settingsRegistry"),r=this.getRuntimeService("settings"),i=this.getRuntimeService("host"),n=new Set(["needClosePage","themeMode","mobileMode","enableClog","containerColumns","containerWidth"]),l=a.list({surfaces:["full"]}).filter(p=>(p.effect||"live")==="live"&&p.section!=="cloud"&&!n.has(p.key));s.length&&l.forEach(p=>{let{row:g}=Vs(p,{value:r.snapshot()[p.key]??p.defaultValue});s.append(g)});let c=s.length?as(s,l,{settings:r}):null,h=[],u=d(p=>{let g=Ql({settings:r,root:t,...p});g&&h.push(g)},"registerStatic");return u({selector:"#needClosePageBasic",key:"needClosePage",getValue:d(()=>t.find("#needClosePageBasic").is(":checked")?"yes":"no","getValue"),setValue:d(p=>t.find("#needClosePageBasic").prop("checked",p==="yes"||p===!0),"setValue"),fallback:"yes",label:"鉴定后立即关闭"}),u({selector:"#themeMode",key:"themeMode",getValue:d(()=>t.find("#themeMode").val(),"getValue"),setValue:d(p=>t.find("#themeMode").val(String(p??"")),"setValue"),fallback:"light",label:"主题"}),u({selector:"#mobileMode",key:"mobileMode",getValue:d(()=>t.find("#mobileMode").val(),"getValue"),setValue:d(p=>t.find("#mobileMode").val(String(p??"")),"setValue"),fallback:"auto",label:"移动模式"}),u({selector:"#enableClog",key:"enableClog",getValue:d(()=>t.find("#enableClog").val(),"getValue"),setValue:d(p=>t.find("#enableClog").val(String(p??"")),"setValue"),fallback:"yes",label:"日志"}),u({selector:"#containerColumns",key:"containerColumns",getValue:d(()=>Number(t.find("#containerColumns").val())||5,"getValue"),setValue:d(p=>rs(t,i,"containerColumns",p),"setValue"),fallback:5,label:"列表列数"}),u({selector:"#containerWidth",key:"containerWidth",getValue:d(()=>Number(t.find("#containerWidth").val())+70,"getValue"),setValue:d(p=>rs(t,i,"containerWidth",p),"setValue"),fallback:100,label:"列表宽度"}),u({selector:"#defaultQuickFilterTab",key:"defaultQuickFilterTab",getValue:d(()=>_e(t.find("#defaultQuickFilterTab").val()),"getValue"),setValue:d(p=>t.find("#defaultQuickFilterTab").val(_e(p)),"setValue"),fallback:"waitCheck",label:"列表默认筛选"}),!c&&!h.length?null:{sync:d(p=>{c?.sync?.(p);for(let g of h)g.sync?.(p)},"sync"),flush:d(async p=>{await c?.flush?.(p),await Promise.all(h.map(g=>g.flush?.(p)))},"flush"),dispose:d(()=>{c?.dispose?.();for(let p of h)p.dispose()},"dispose"),setters:c?.setters??{}}}async hydrateSettingForm(e,t){let s=$(e).find("#saveBtn"),a=$(e).find("#settings-hydration-status");s.attr("data-jhs-settings-ready","false").prop("disabled",!0).attr("title","正在加载设置…"),a.empty().text("正在加载设置…");let r=$(e);try{return await tc(this.getFormDependencies(),r),!s[0]?.isConnected||t!==this._settingsDialogGeneration||r.data("jhsSettingsGeneration")!==t?!1:(K.refreshAll(e),s.attr("data-jhs-settings-ready","true").prop("disabled",!1).removeAttr("title"),a.empty().text("设置已加载"),!0)}catch(i){if(!s[0]?.isConnected||t!==this._settingsDialogGeneration||r.data("jhsSettingsGeneration")!==t)return!1;clog.error("settings-form 加载失败",i),this.getRuntimeService("diagnostics").recordError({source:"settings-form",message:i?.message||String(i)});let n=$('').on("click",(()=>{this.hydrateSettingForm(e,t)}));return a.empty().append(document.createTextNode("表单加载失败,已禁止保存。"),n),show.error("设置表单加载失败,保存已禁用"),!1}}renderTaskStatuses(e=null){let t=e?$(e).find("#setting-task-status-list"):$("#setting-task-status-list");if(!t.length)return;let s=this.getOptionalDependency("TaskPlugin");if(!s?.getTaskStatusSnapshot)return void t.empty();let a={blacklist:"黑名单",favoriteActress:"演员同步",newVideo:"新作品"},r={idle:"正常",running:"运行中",pending:"等待下一次任务检查",due:"待运行"},i=d(n=>n?new Date(n).toLocaleString():"无","format");t.empty(),["blacklist","favoriteActress","newVideo"].forEach((n=>{let l=s.getTaskStatusSnapshot(n),c=$('
    ');c.append($('').text(`${a[n]}:${r[l.state]}`)),c.append($('').text(`上次完成 ${i(l.completedAt)};下次检查 ${l.nextAt?i(l.nextAt):"立即"}`)),t.append(c)}))}collapseAdvancedTabs(e=null){let t=[{id:"health-panel",label:"数据体检",render:d(()=>ls(this.getRuntimeService("diagnostics")),"render")},{id:"plugin-mgmt-panel",label:"插件管理",render:d(()=>Ei(this.getRuntimeService("diagnostics"),this.getRuntimeService("settings")),"render")},{id:"snapshot-panel",label:"恢复点",render:os},{id:"network-panel",label:"外部请求",render:d(()=>Lt(this.getRuntimeService("diagnostics")),"render")}],s=$(".jhs-mobile-sidebar"),a=$(".content-panel").parent();if(!s.length||!a.length||(t.forEach(l=>{s.find(`[data-panel="${l.id}"]`).remove()}),s.find('[data-panel="more-tools-panel"]').length||s.append(''),$("#more-tools-panel").length))return;let r=t.map((l,c)=>``).join(""),i=t.map((l,c)=>`
    `).join(""),n=`
    ${r}
    ${i}
    - `;a.append(n),t.forEach(l=>{let c=$(`#${l.id}`);c.length&&(c.children().appendTo(`#sub-${l.id}`),c.remove(),$(`#sub-${l.id}`).attr("data-rendered","true"))}),s.on("click",'[data-panel="more-tools-panel"]',function(){$(".side-menu-item").removeClass("active").attr("aria-current","false"),$(this).addClass("active").attr("aria-current","page"),$(".content-panel").hide(),$("#more-tools-panel").show(),$("#saveBtn").show(),$("#clean-all").addClass("jhs-is-hidden")}),$("#more-tools-panel").on("click",".jhs-sub-tab",function(){let l=$(this).data("sub-panel");$("#more-tools-panel .jhs-sub-tab").removeClass("active").attr({"aria-selected":"false",tabindex:"-1"}),$(this).addClass("active").attr({"aria-selected":"true",tabindex:"0"}),$("#more-tools-panel .jhs-sub-panel").removeClass("active"),$(`#sub-${l}`).addClass("active"),$(`#sub-${l}`).attr("data-rendered")!=="true"&&$(`#sub-${l}`).attr("data-rendered","true");let c=t.find(h=>h.id===l);c&&c.render&&c.render()}).on("keydown",".jhs-sub-tab",function(l){if(!["ArrowLeft","ArrowRight","Home","End"].includes(l.key))return;l.preventDefault();let c=$("#more-tools-panel .jhs-sub-tab"),h=c.index(this),u=l.key==="Home"?0:l.key==="End"?c.length-1:l.key==="ArrowRight"?(h+1)%c.length:(h-1+c.length)%c.length;c.eq(u).trigger("click").trigger("focus")})}bindClick(e=null){let t=this,s=this.getRuntimeService("webdav"),a=this.getRuntimeService("dialog"),r=this.getRuntimeService("diagnostics"),i=this.getRuntimeService("storage"),n=this.getRuntimeService("translation"),l=d((m,f,v=null)=>ac(m,f,v,a),"previewDiff"),c=e?$(e):$(document);c.find("#saveBtn").attr("data-jhs-settings-ready","false").prop("disabled",!0).attr("title","正在加载设置…"),c.find(".side-menu-item").on("click",(function(){c.find(".side-menu-item").removeClass("active").attr("aria-current","false"),$(this).addClass("active").attr("aria-current","page"),c.find(".content-panel").hide();let m=$(this).data("panel");c.find("#"+m).show(),m==="cache-panel"?(c.find("#saveBtn").hide(),c.find("#clean-all").removeClass("jhs-is-hidden")):(c.find("#saveBtn").show(),c.find("#clean-all").addClass("jhs-is-hidden")),m==="health-panel"&&(c.find("#saveBtn").hide(),c.find("#clean-all").addClass("jhs-is-hidden"),rs()),m==="plugin-mgmt-panel"&&(c.find("#saveBtn").hide(),c.find("#clean-all").addClass("jhs-is-hidden"),$i(t.getRuntimeService("diagnostics"),t.getRuntimeService("settings"))),m==="snapshot-panel"&&(c.find("#saveBtn").hide(),c.find("#clean-all").addClass("jhs-is-hidden"),as()),m==="network-panel"&&(c.find("#saveBtn").hide(),c.find("#clean-all").addClass("jhs-is-hidden"),Dt(r))})),c.find("#importBtn").on("click",(m=>Ml(l))),c.find("#exportBtn").on("click",(m=>zl())),c.find("#preview-car-number-import").on("click",(()=>this.previewCarNumbers(c))),c.find("#confirm-car-number-import").on("click",(async m=>this.confirmCarNumbers(m,c))),c.find("#webdavBackupBtn").on("click",(m=>Bl(this.folderName,s))),c.find("#webdavBackupListBtn").on("click",(m=>Ol(this.folderName,(f,v,b)=>Ul(f,v,b,this.folderName,l,a),s))),c.find("#saveBtn").on("click",(async m=>{let f=$(m.currentTarget);if(!(f.data("jhsBusy")||f.attr("data-jhs-settings-ready")!=="true")){f.data("jhsBusy",!0).prop("disabled",!0).attr("aria-busy","true");try{if(await this._fullSettingBinding?.flush?.({throwOnFailure:!0}),(await Gl(this.getFormDependencies(),c))?.canceled)return;show.ok("保存成功")}catch(v){v?.partialFailure?show.error("部分设置保存失败,请重试"):show.error("设置保存失败"),clog.error("设置保存失败",v)}finally{f.removeData("jhsBusy").prop("disabled",f.attr("data-jhs-settings-ready")!=="true").removeAttr("aria-busy")}}})),c.find("#runHealthCheckBtn").on("click",(()=>rs())),c.find("#repairHealthBtn").on("click",(m=>{utils.q(m,"修复前会自动下载备份,是否继续?",(()=>rc()))})),c.find("#pm-clear-log").on("click",(()=>{this.getRuntimeService("diagnostics").clearErrors(),c.find("#plugin-error-log").text("无错误记录"),show.ok("错误日志已清空")})),c.find("#createSnapshotBtn").on("click",(async()=>{let m=loading();try{await storageManager.createSnapshot("手动快照","manual"),show.ok("快照创建成功"),as()}catch(f){clog.error(f),show.error("创建快照失败: "+f.message)}finally{m.close()}})),c.find(".clean-btn").on("click",(async m=>{let f=$(m.currentTarget).data("key"),v=this.cacheItems.find((b=>b.key===f));f===storageManager.third_party_cache_key?(await storageManager.clearThirdPartyCache(),await this.getRuntimeService("cache").clearNamespace("external-detail-v1")):f==="_circuitBreaker"?r.resetAllCircuitBreakers():f==="_domainStats"?r.clearDomainStats():f==="jhs_translate"?await n.clearCache():f==="jhs_actress_info"?(await this.getRuntimeService("cache").clearNamespace("actress-info"),await i.removeLocal(f)):f==="jhs_screenShot"?(await this.getRuntimeService("cache").clearNamespace("screenshot"),await i.removeLocal(f)):i.removeLocal(f),show.ok(`${v.text} 清理成功`),c.find("#cache-data-display").addClass("jhs-is-hidden"),f==="jhs_dmm_video"&&i.removeLocal("jhs_other_site_dmm")})),c.find("#clean-all").on("click",(async()=>{this.cacheItems.forEach((m=>m.key!=="jhs_translate"&&i.removeLocal(m.key))),await n.clearCache(),await this.getRuntimeService("cache").clearAll(),show.ok("全部缓存已清理"),c.find("#cache-data-display").addClass("jhs-is-hidden"),i.removeLocal("jhs_other_site_dmm"),await storageManager.clearThirdPartyCache()})),c.find(".view-btn").on("click",(async m=>{let f=$(m.currentTarget).data("key"),v;f===storageManager.third_party_cache_key?v=JSON.stringify(await storageManager.getThirdPartyCache()):f==="_circuitBreaker"?v=JSON.stringify(r.getNetworkDiagnostics().circuitBreakers):f==="_domainStats"?v=JSON.stringify(r.getNetworkDiagnostics().domainStats):f==="jhs_translate"?v=JSON.stringify(await n.inspectCache()):v=i.getLocal(f);let b=c.find("#cache-data-display"),w=b.find("pre");if(b.removeClass("jhs-is-hidden"),v)try{let S=JSON.parse(v);w.text(JSON.stringify(S,null,2))}catch{w.text(v)}else w.text("无数据")}));let h=c.find("#highlightedTagNumber"),u=c.find("#highlightedTagColor"),p=c.find("#highlightedTagLabel");function g(){let m=h.val(),f=u.val();p.css("border",`${m}px solid ${f}`)}d(g,"updatePreview"),h.on("input",g),u.on("input",g)}async loadResourceSettings(e=null,t=this._settingsDialogGeneration){let s=e?$(e):$(document),[a,r,i,n,l,c]=await Promise.all([this.resourceSettings.getMagnetSources(),this.resourceSettings.getMagnetTagRules(),this.resourceSettings.getMagnetFilterRules(),this.resourceSettings.getBuiltInSources(),this.resourceSettings.getScreenshotSettings(),this.resourceSettings.getCloudSettings()]);if(e&&(!s[0]?.isConnected||t!==this._settingsDialogGeneration))return;let h=[...Ls,...this.getRuntimeService("magnet").getBuiltInSources()];this.resourceState={custom:a,tags:r,filters:i,builtIn:h.map((u=>({...u,...n.find((p=>p.id===u.id))||{}}))),screenshot:{mode:l.mode,providers:Ms.map((u=>{let p={...u,...l.providers.find((g=>g.id===u.id))||{}};return u.implemented===!1?{...p,enabled:!1}:p}))}},this.renderResourceSettings(s),this.renderCloudSettings(s,c),s.find("#resource-sources-panel").off("change.jhsResource",'input[name="screenshotMode"]').on("change.jhsResource",'input[name="screenshotMode"]',(u=>{let p=this.resourceState.screenshot.mode;this.resourceState.screenshot.mode=u.currentTarget.value,this.resourceSettings.saveScreenshotMode(this.resourceState.screenshot.mode).catch(g=>{this.resourceState.screenshot.mode=p,s.find(`input[name="screenshotMode"][value="${p}"]`).prop("checked",!0),clog.error("截图模式保存失败",g),show.error("截图模式保存失败,已恢复原设置")})})),s.find("#add-custom-magnet-source").off("click.jhsResource").on("click.jhsResource",(()=>this.openSourceDialog(null,s))),s.find("#add-magnet-tag-rule").off("click.jhsResource").on("click.jhsResource",(()=>this.openRuleDialog("tag",null,s))),s.find("#add-magnet-filter-rule").off("click.jhsResource").on("click.jhsResource",(()=>this.openRuleDialog("filter",null,s))),s.find("#export-resource-config").off("click.jhsResource").on("click.jhsResource",(async()=>{let u=JSON.stringify(await this.resourceSettings.exportConfig(),null,2);s.find("#advanced-resource-json").val(u).prop("readonly",!0)})),s.find("#edit-resource-config").off("click.jhsResource").on("click.jhsResource",(()=>s.find("#advanced-resource-json").prop("readonly",!1).trigger("focus"))),s.find("#import-resource-config").off("click.jhsResource").on("click.jhsResource",(async()=>{try{await this.resourceSettings.importConfig(s.find("#advanced-resource-json").val()),show.ok("资源配置导入成功"),await this.loadResourceSettings(s,t),K.refreshAll()}catch(u){show.error(u.message)}})),s.find("#car-number-import,#car-number-import-status").off("input.jhsResource change.jhsResource").on("input.jhsResource change.jhsResource",(()=>{this.pendingCarImport=null,s.find("#confirm-car-number-import").prop("disabled",!0).text("确认导入")})),s.find("#check-one-one-five-login").off("click.jhsResource").on("click.jhsResource",(()=>this.checkOneOneFiveLogin(s)))}renderCloudSettings(e,t){let s=e.find("#cloud-settings-catalog");if(!s.length)return;this._cloudSettingBinding?.dispose?.();let a=this.getRuntimeService("settingsRegistry"),r=this.getRuntimeService("settings"),i=a.list({surfaces:["full"]}).filter(l=>l.section==="cloud");s.empty();let n=d(l=>l==="offlineProviderMode"?t.providerMode:l==="oneOneFiveConcurrency"?t.concurrency:l==="oneOneFiveCacheMinutes"?t.cacheMinutes:t[l],"valueFor");i.forEach(l=>{let c=Os(l,{value:n(l.key)});c.root.attr("id",l.key),s.append(c.row)}),this._cloudSettingBinding=ts(s,i,{settings:r})}renderResourceSettings(e=$(document)){let t=d((s,a,r)=>{let i=$('
    ');i.append($('
    ').append($("
    ").append($("").text(s.name),s.experimental?'实验性':"",$("").text(`${s.type||"截图来源"} · ${s.domain||(()=>{try{return new URL(s.searchUrlTemplate).hostname}catch{return"未配置域名"}})()} · 优先级 ${s.priority}`)),$('').prop("checked",s.enabled)));let n=$('
    ').append('');return a&&n.append(''),i.append(n),i.on("change",".jhs-source-toggle",async l=>{let c=!l.currentTarget.checked;s.enabled=l.currentTarget.checked;try{r==="screenshot"?await this.resourceSettings.updateArray("screenshotProviders",h=>{let u=h.find((p=>p.id===s.id));return u?u.enabled=s.enabled:h.push({id:s.id,enabled:s.enabled}),h}):a?await this.resourceSettings.updateArray("customMagnetSources",h=>{let u=h.find((p=>p.id===s.id));return u&&(u.enabled=s.enabled),h}):await this.resourceSettings.updateArray("magnetBuiltInSources",h=>{let u=h.find((p=>p.id===s.id));return u?u.enabled=s.enabled:h.push({id:s.id,enabled:s.enabled}),h}),this.renderResourceSettings(e)}catch{s.enabled=c,$(l.currentTarget).prop("checked",c),show.error("来源设置保存失败,已恢复原设置")}}),i.on("click",".jhs-source-test",l=>this.testSource(l.currentTarget,s.baseUrl||s.searchUrlTemplate?.replace("{keyword}","test"),{custom:a,source:s})),a&&i.on("click",".jhs-source-edit",(()=>this.openSourceDialog(s,e))).on("click",".jhs-source-delete",(l=>utils.q(l,`确认删除来源「${T(s.name)}」?`,(async()=>{try{await this.resourceSettings.updateArray("customMagnetSources",c=>c.filter((h=>h.id!==s.id))),this.resourceState.custom=await this.resourceSettings.getMagnetSources(),this.renderResourceSettings(e)}catch(c){show.error(c.message)}})))),i},"card");e.find("#builtin-magnet-source-list").empty().append(this.resourceState.builtIn.map((s=>t(s,!1,"magnet")))),e.find("#custom-magnet-source-list").empty().append(this.resourceState.custom.length?this.resourceState.custom.map((s=>t(s,!0,"magnet"))):'

    暂无自定义来源

    '),e.find("#screenshot-source-list").empty().append(this.resourceState.screenshot.providers.map((s=>t(s,!1,"screenshot")))),this.resourceState.screenshot.providers.forEach(((s,a)=>{s.implemented===!1&&e.find("#screenshot-source-list .jhs-resource-card").eq(a).find(".jhs-source-toggle").prop("disabled",!0).end().find("strong").after('未实现').end().find(".jhs-source-test").remove()})),e.find(`input[name="screenshotMode"][value="${this.resourceState.screenshot.mode}"]`).prop("checked",!0),this.renderRules("tag",e),this.renderRules("filter",e)}renderRules(e,t=$(document)){let s=e==="tag"?this.resourceState.tags:this.resourceState.filters,a=t.find("#magnet-"+e+"-rule-list").empty();s.length||a.append('

    暂无规则

    '),s.forEach((r=>{let i=$('
    ').append($("").text(r.name),$("

    ").text(`${r.type==="regex"?"正则":"包含"}:${r.pattern}${e==="tag"?` · 权重 ${Number(r.weight)>=0?"+":""}${r.weight||0}`:` · ${r.action==="hide"?"隐藏":`降权 ${r.penalty||-20}`}`}`),'
    ');i.on("click",".jhs-rule-edit",(()=>this.openRuleDialog(e,r,t))).on("click",".jhs-rule-delete",(n=>utils.q(n,`确认删除规则「${T(r.name)}」?`,(async()=>{try{await this.resourceSettings.updateArray(e==="tag"?"magnetTagRules":"magnetFilterRules",l=>l.filter((c=>c.id!==r.id))),this.resourceState[e==="tag"?"tags":"filters"]=await this.resourceSettings.getArray(e==="tag"?"magnetTagRules":"magnetFilterRules"),this.renderRules(e,t)}catch(l){show.error(l.message)}})))),a.append(i)}))}openSourceDialog(e=null,t=null){let s=this.getRuntimeService("dialog"),a=["rowSelector","titleSelector","magnetSelector","sizeSelector","dateSelector","seedersSelector","leechersSelector","resultsPath","titlePath","magnetPath","hashPath","sizePath","datePath","seedersPath"],r=$('
    '),i=d(()=>{let n=r.find('[name="parserType"]').val(),l=n==="torrent-table"?a.slice(0,7):n==="json"?a.slice(7):[];r.find(".jhs-parser-fields").html(l.map((c=>``)).join("")),l.forEach((c=>r.find(`[name="${c}"]`).val(e?.[c]||"")))},"renderFields");Object.entries(e||{enabled:!0,priority:100,parserType:"magnet-links"}).forEach(([n,l])=>{let c=r.find(`[name="${n}"]`);c.attr("type")==="checkbox"?c.prop("checked",l):c.val(l)}),r.on("change",'[name="parserType"]',i),i(),r.appendTo("body").hide(),s.open({type:1,title:e?"编辑自定义磁力源":"添加自定义磁力源",content:r,ui:{size:"md",body:"scroll"},area:utils.getDialogArea("md"),btn:["保存","取消"],success:d(()=>r.show(),"success"),end:d(()=>r.remove(),"end"),yes:d(async n=>{let l=Object.fromEntries(r.find("input,select").map(((c,h)=>[h.name,h.type==="checkbox"?h.checked:h.value])).get());try{let c=$l(l,e);await this.resourceSettings.updateArray("customMagnetSources",h=>{let u=e?h.findIndex((p=>p.id===e.id)):-1;return u>=0?h.splice(u,1,c):h.push(c),h}),this.resourceState.custom=await this.resourceSettings.getMagnetSources(),s.close(n),t&&this.renderResourceSettings(t)}catch(c){show.error(c.message)}},"yes")})}openRuleDialog(e,t=null,s=null){let a=this.getRuntimeService("dialog"),r=e==="tag",i=$(`
    ${r?"":''}${r?'':''}
    `);Object.entries(t||{enabled:!0,type:"contains",weight:0,action:"hide",penalty:-20}).forEach(([n,l])=>{let c=i.find(`[name="${n}"]`);c.attr("type")==="checkbox"?c.prop("checked",l):c.val(l)}),i.appendTo("body").hide(),a.open({type:1,title:`${t?"编辑":"新建"}${r?"标签":"过滤"}规则`,content:i,ui:{size:"sm",body:"scroll"},area:utils.getDialogArea("sm"),btn:["保存","取消"],success:d(()=>i.show(),"success"),end:d(()=>i.remove(),"end"),yes:d(async n=>{let l=Object.fromEntries(i.find("input,select").map(((c,h)=>[h.name,h.type==="checkbox"?h.checked:h.value])).get());l.id=t?.id||`rule-${Date.now()}`,l.weight=Number(l.weight),l.penalty=Number(l.penalty);try{Et(l),await this.resourceSettings.updateArray(r?"magnetTagRules":"magnetFilterRules",c=>{let h=t?c.findIndex((u=>u.id===t.id)):-1;return h>=0?c.splice(h,1,l):c.push(l),c}),this.resourceState[r?"tags":"filters"]=await this.resourceSettings.getArray(r?"magnetTagRules":"magnetFilterRules"),a.close(n),s&&this.renderRules(e,s)}catch(c){show.error(c.message)}},"yes")})}async saveCloudSettings(e=$(document)){await this.resourceSettings.saveCloudSettings({enable123Offline:e.find("#enable123Offline").is(":checked"),enable115Offline:e.find("#enable115Offline").is(":checked"),providerMode:e.find("#offlineProviderMode").val(),enable115Match:e.find("#enable115Match").is(":checked"),enable115LoginRedirect:e.find("#enable115LoginRedirect").is(":checked"),concurrency:Number(e.find("#oneOneFiveConcurrency").val()),cacheMinutes:Number(e.find("#oneOneFiveCacheMinutes").val())})}async checkOneOneFiveLogin(e=$(document)){let t=e.find("#one-one-five-state").text("检测中");try{let s=await this.getRuntimeService("scope")(),a=await this.getRuntimeService("offline").checkAccount("one115",{scope:s});t.text(a.authenticated?"已登录":"未登录")}catch{t.text("检测失败")}}async testSource(e,t,s={}){if(!t)return show.info("本站来源无需跨站测试");let a=$(e).prop("disabled",!0),r=a.siblings(".jhs-source-test-state").length?a.siblings(".jhs-source-test-state"):$('').insertAfter(a);r.text("检测中");try{let i=new URL(t),n=await this.getRuntimeService("scope")(),l=await this.getRuntimeService("http").request({providerId:`settings-source-${s.source?.id||"unknown"}`,method:"GET",url:i.href,responseType:"text",cacheScope:"none",urlPolicy:s.custom?{trustClass:"custom-public"}:{trustClass:"builtin-public",hosts:[s.source?.domain||i.hostname]}},n);r.text(l.data?"200 · 可解析":"空响应")}catch(i){r.text(i?.code==="NOT_FOUND"?"404":i?.code==="RATE_LIMITED"?"限流":i?.code==="AUTH_REQUIRED"?"需要授权":"请求失败")}finally{a.prop("disabled",!1).text("测试")}}previewCarNumbers(e=$(document)){let t=jl(e.find("#car-number-import").val()),s=e.find("#car-number-import-status").val();this.pendingCarImport=s&&t.values.length?{...t,actionType:s}:null,e.find("#car-number-import-preview").text(`识别 ${t.recognized} 条 · 有效 ${t.values.length} · 重复 ${Math.max(0,t.recognized-t.values.length-t.invalid.length)} · 无效 ${t.invalid.length}${t.invalid.length?` · 异常示例:${t.invalid.slice(0,5).join("、")}`:""}`),e.find("#confirm-car-number-import").prop("disabled",!this.pendingCarImport).text(this.pendingCarImport?`确认导入 ${t.values.length} 条`:"确认导入"),s||show.info("请选择导入状态")}async confirmCarNumbers(e,t=$(document)){if(!this.pendingCarImport)return show.info("请先解析预览");let s=this.pendingCarImport;utils.q(e,`确认导入 ${s.values.length} 条记录?`,(async()=>{let a=new Map((await storageManager.getCarList()).map((h=>[C(h.carNum),h]))),r={added:0,updated:0,failed:0},i=Ce(s.actionType),n=this.getRuntimeService("state"),l=s.values.map(h=>{let u=C(h),p=a.get(u);return u?{carNum:u,url:p?.url||Sl(u),names:p?.names||"",publishTime:p?.publishTime||""}:null}).filter(Boolean),c=75;for(let h=0;hp.carNum),{[i]:!0},{type:"manual-car-number-import",records:u}),u.forEach(p=>a.has(p.carNum)?r.updated++:r.added++)}catch(p){r.failed+=u.length,clog.warn("番号批量导入块失败",p)}}this.pendingCarImport=null,t.find("#confirm-car-number-import").prop("disabled",!0),show.ok(`导入完成:新增 ${r.added},更新 ${r.updated},失败 ${r.failed}`)}))}};d(Ti,"SettingPlugin");var Fs=Ti;async function qe(o,e,t){let s=new URL(e,window.location.href),a=await o.request({providerId:"host-page",method:"GET",url:s.href,responseType:"text",cacheScope:"none",urlPolicy:{trustClass:"builtin-public",hosts:[window.location.hostname],expectedOrigin:window.location.origin}},t);return String(a.data??a.responseText??"")}d(qe,"requestHostPage");function ic(o){let e=globalThis.$,t=o?.jquery?o:e(o),s=[];return t.find('.tags a[href^="/actors/"]').each((a,r)=>{let i=e(r).text().trim();i&&s.push(i)}),t.find('span[onmouseover*="star_"] a').each((a,r)=>{let i=e(r).text().trim();i&&s.push(i)}),[...new Set(s)].join(" ")}d(ic,"readCardNames");function $e(o){let e=globalThis.$,t=o?.jquery?o:e(o),s=t.find("a"),a=t.attr("data-jhs-original-url")||s.attr("href"),r=t.find(".video-title"),i,n,l;if(r.length){let h=r.find("strong");h.length&&(i=h.text().trim()),n=s.attr("title")?s.attr("title").trim():i?r.text().replace(i,"").trim():r.text().trim(),l=t.find(".meta").text().trim()}if(!i){let h=t.find("img");h.length&&(n=h.attr("title")?.trim()||h.attr("data-title")?.trim()||n);let u=t.find("date").map((p,g)=>e(g).text().trim()).get();l=u.find(p=>/^\d{4}-\d{1,2}-\d{1,2}$/.test(p)),i=u.find(p=>!/^\d{4}-\d{1,2}-\d{1,2}$/.test(p))}let c=ee(i);if(!c)throw new TypeError("提取番号信息失败");return Object.freeze({carNum:c,aHref:a,url:a,title:n,publishTime:l,fc2Source:["fc2","123av"].includes(t.attr("data-jhs-fc2-source"))?t.attr("data-jhs-fc2-source"):"fc2"})}d($e,"readListItem");function Ai(o,e,t){for(let s of o)if(e.includes(s)||t.startsWith(s))return s;return null}d(Ai,"findMatchedTitleKeyword");function is(o={}){return{titleKeywords:Array.isArray(o.titleKeywords)?o.titleKeywords:[],carMap:o.carMap instanceof Map?o.carMap:new Map,actorCarNumToNameMap:o.actorCarNumToNameMap instanceof Map?o.actorCarNumToNameMap:new Map,actressCarNumToNameMap:o.actressCarNumToNameMap instanceof Map?o.actressCarNumToNameMap:new Map,recentCarNums:o.recentCarNums instanceof Set?o.recentCarNums:new Set,settings:o.settings??{}}}d(is,"createListEvaluationContext");function ns(o,e,{filter:t="waitCheck"}={}){let s=o?.carNum,a=s?e.carMap.get(s):null,r=H(a?.stateFlags),n={keyword:!!(e.titleKeywords.length&&s?Ai(e.titleKeywords,o.title||"",s):null),actorBlacklist:s?e.actorCarNumToNameMap.has(s):!1,actressBlacklist:s?e.actressCarNumToNameMap.has(s):!1},l=s?e.recentCarNums.has(s):!1,c=ft(r,n);return{flags:r,visibilityReasons:n,recent:l,hardHidden:c,matchesCurrentFilter:li(t,r,{visibilityReasons:n,recent:l})}}d(ns,"evaluateListItem");function nc(o){return o.replace(/\/+$/,"")}d(nc,"stripTrailingSlashes");function oc(o,e){try{let t=new URL(o),s=new URL(e);return t.origin===s.origin&&nc(t.pathname)===nc(s.pathname)&&t.search===s.search}catch{return o===e}}d(oc,"isSamePageUrl");async function Vs({startDom:o,itemSelector:e,nextPageSelector:t,fetchHtml:s,parseItem:a,evaluate:r,isCancelled:i=d(()=>!1,"isCancelled"),onProgress:n=d(()=>{},"onProgress"),pageDelayMs:l=500,maxPages:c=200,currentUrl:h=null,firstPageUrl:u=null}){let p=[],g=new Set,m=o,f=1,v=0;if(u&&h&&!oc(u,h)){if(i())return p;let b=await s(u);if(i())return p;let w=new DOMParser().parseFromString(b,"text/html");m=$(w)}for(;m&&m.length&&!i();){n({page:f,scanned:v,matched:p.length});let b=m.find(e).toArray();for(let k of b){if(i())break;let x=null;try{x=a($(k))}catch{continue}if(!x?.carNum)continue;v++;let _=r(x);_?.matchesCurrentFilter&&!g.has(x.carNum)&&(g.add(x.carNum),p.push({...x,flags:_.flags,visibilityReasons:_.visibilityReasons,hardHidden:_.hardHidden}))}let w=m.find(t).attr("href");if(!w||i()||f>=c||(l&&await new Promise(k=>setTimeout(k,l)),i()))break;let S=await s(w),j=new DOMParser().parseFromString(S,"text/html");m=$(j),f++}return p}d(Vs,"scanAllPages");var Nt=null;function qs(){if(Nt)return null;let o={id:Symbol("batch-run"),cancelRequested:!1};return Nt=o,o}d(qs,"tryBeginBatchRun");function Lt(o){return Nt===o}d(Lt,"isActiveBatchRun");function lc(o){return!!o?.cancelRequested||!Lt(o)}d(lc,"isBatchRunCancelled");function cc(o){Nt===o&&o&&(o.cancelRequested=!0)}d(cc,"requestCancelBatchRun");function Hs(o){Nt===o&&(Nt=null)}d(Hs,"endBatchRun");function Ws(o,e){let t=o.find("title, body").text(),s=/Just a moment|cf-chl-|Cloudflare/i.test(t),a=o.find(e.boxSelector).length>0;return{state:s?"challenge":a?"valid":"invalid",items:a?o.find(e.requestDomItemSelector):null,isEmpty:a&&o.find(e.requestDomItemSelector).length===0}}d(Ws,"parseDetailPage");function dc(){if(!V)throw new Error("Blacklist EventBus 未初始化");return V}d(dc,"getBlacklistEventBus");var Pi=class Pi extends I{constructor(){super(...arguments),this.blacklistSearchDebounced=null,this.taskStatusUnsubscribe=null}getName(){return"BlacklistPlugin"}async initCss(){return``}async addBlacklist(e){let t={clientX:e.clientX,clientY:e.clientY+80},s=$("#addBlacklistBtn span").text().includes("已加入"),a,r;if(X.includes("/tags")){let p=new URL(X);p.searchParams.delete("page");let g=$("#jhs-check-tag").text().trim();a={starId:"no-"+g,name:"虚拟演员-"+g,allName:["虚拟演员"],role:"虚拟演员",movieType:g,blacklistUrl:p.toString()},r=`是否将分类 ${T(g)} 加入到黑名单中?`,s&&(r=`分类 ${T(g)} 已在黑名单中, 是否从当前页开始追加屏蔽?`)}else a=this.getActressPageInfo(),r=`是否将该演员 ${T(a.name)} 加入到黑名单中?`,s&&(r=`演员 ${T(a.name)} 已在黑名单中, 是否从当前页开始追加屏蔽?`);let{starId:i,name:n,allName:l,role:c,movieType:h,blacklistUrl:u}=a;if(X.includes("page")&&!X.includes("page=1")&&(r+="
    注意: 当前页面非第一页, 屏蔽数据将从此页面开始"),B){let p=X.split("/star/")[1].split("/");p.length>1&&parseInt(p[1])>1&&(r+="
    注意: 当前页面非第一页, 屏蔽数据将从此页面开始")}utils.q(t,r,(async()=>{let p=this.getOptionalDependency("TaskPlugin");if(!p)return void show.error("后台任务功能已禁用,无法执行黑名单抓取");navigator.locks.request(p.singleTaskKey,{ifAvailable:!0},(async g=>{if(clog.debug("获取锁",g),g){this.loadObj=loading();try{await storageManager.addBlacklistItem({starId:i,name:n,allName:l,role:c,movieType:h,url:u}),await this.filterActorVideo(n,i,null,B?Se:Be);let m=show.ok(`屏蔽结束,是否跳转到最后一页: ${this.lastPageLink}`,{duration:-1,close:!0,onClick:d(()=>{m.closeShow(),window.location.href=this.lastPageLink},"onClick")})}catch(m){clog.error(m);let f=show.error("发生错误, 是否填转到解析失败的那一页? (点击并跳转)",{duration:-1,close:!0,onClick:d(()=>{f.closeShow(),window.location.href=this.nextPageLink},"onClick")})}finally{this.loadObj.close()}}else show.error("当前有定时任务在后台执行中, 无法发起此操作")})).catch((g=>{clog.error("锁任务出现错误:",g)}))}))}async resetBtnTip(){let e=this.getOptionalDependency("TaskPlugin"),t=e?this.getRuntimeService("storage").getLocal(e.lastCheckBlacklistTimeKey)||"无":"任务已禁用",s=await storageManager.getSetting("checkBlacklist_intervalTime",12);this.checkBlacklist_ruleTime=await storageManager.getSetting("checkBlacklist_ruleTime",8760),(this.blacklistRoot||$()).find("#checkBlacklistBtn").attr("data-tip",`上次整批检测: ${t}; 检测间隔时间: ${s}小时`)}async openBlacklistDialog(){let e=this.getOptionalDependency("TaskPlugin"),t=await storageManager.getSetting(),a=` + `}async addBlacklist(e){let t={clientX:e.clientX,clientY:e.clientY+80},s=$("#addBlacklistBtn span").text().includes("已加入"),a,r;if(X.includes("/tags")){let p=new URL(X);p.searchParams.delete("page");let g=$("#jhs-check-tag").text().trim();a={starId:"no-"+g,name:"虚拟演员-"+g,allName:["虚拟演员"],role:"虚拟演员",movieType:g,blacklistUrl:p.toString()},r=`是否将分类 ${T(g)} 加入到黑名单中?`,s&&(r=`分类 ${T(g)} 已在黑名单中, 是否从当前页开始追加屏蔽?`)}else a=this.getActressPageInfo(),r=`是否将该演员 ${T(a.name)} 加入到黑名单中?`,s&&(r=`演员 ${T(a.name)} 已在黑名单中, 是否从当前页开始追加屏蔽?`);let{starId:i,name:n,allName:l,role:c,movieType:h,blacklistUrl:u}=a;if(X.includes("page")&&!X.includes("page=1")&&(r+="
    注意: 当前页面非第一页, 屏蔽数据将从此页面开始"),B){let p=X.split("/star/")[1].split("/");p.length>1&&parseInt(p[1])>1&&(r+="
    注意: 当前页面非第一页, 屏蔽数据将从此页面开始")}utils.q(t,r,(async()=>{let p=this.getOptionalDependency("TaskPlugin");if(!p)return void show.error("后台任务功能已禁用,无法执行黑名单抓取");navigator.locks.request(p.singleTaskKey,{ifAvailable:!0},(async g=>{if(clog.debug("获取锁",g),g){this.loadObj=loading();try{await storageManager.addBlacklistItem({starId:i,name:n,allName:l,role:c,movieType:h,url:u}),await this.filterActorVideo(n,i,null,B?Se:Ue);let m=show.ok(`屏蔽结束,是否跳转到最后一页: ${this.lastPageLink}`,{duration:-1,close:!0,onClick:d(()=>{m.closeShow(),window.location.href=this.lastPageLink},"onClick")})}catch(m){clog.error(m);let f=show.error("发生错误, 是否填转到解析失败的那一页? (点击并跳转)",{duration:-1,close:!0,onClick:d(()=>{f.closeShow(),window.location.href=this.nextPageLink},"onClick")})}finally{this.loadObj.close()}}else show.error("当前有定时任务在后台执行中, 无法发起此操作")})).catch((g=>{clog.error("锁任务出现错误:",g)}))}))}async resetBtnTip(){let e=this.getOptionalDependency("TaskPlugin"),t=e?this.getRuntimeService("storage").getLocal(e.lastCheckBlacklistTimeKey)||"无":"任务已禁用",s=await storageManager.getSetting("checkBlacklist_intervalTime",12);this.checkBlacklist_ruleTime=await storageManager.getSetting("checkBlacklist_ruleTime",8760),(this.blacklistRoot||$()).find("#checkBlacklistBtn").attr("data-tip",`上次整批检测: ${t}; 检测间隔时间: ${s}小时`)}async openBlacklistDialog(){let e=this.getOptionalDependency("TaskPlugin"),t=await storageManager.getSetting(),a=`
    @@ -3179,11 +3186,11 @@
    - `;this.getRuntimeService("dialog").open({type:1,title:"演员黑名单",ui:{body:"table"},content:a,scrollbar:!1,area:utils.getDialogArea("xl"),anim:-1,success:d(async r=>{let i=$(r).find(".layui-layer-content > div").first().addClass("jhs-blacklist-layout").removeAttr("style");this.blacklistRoot=i;let n=i.children("div").first().addClass("jhs-blacklist-toolbar").removeAttr("style");n.children("div").addClass("jhs-blacklist-toolbar__group").removeAttr("style"),n.find("select,input,a").removeAttr("style"),i.find("#table-container").removeAttr("style"),i.find("#table-container").before('
    '),K.enhance(r),e||i.find("#checkBlacklistBtn").prop("disabled",!0).attr("title","后台任务功能已禁用"),this.renderTaskStatus(),this.taskStatusUnsubscribe?.(),this.taskStatusUnsubscribe=dc().on("task-status-changed",(()=>this.renderTaskStatus())),await this.loadTableData();let l=$(r).find(".layui-layer-content"),c=l.find("#searchValue");this.blacklistSearchDebounced=utils.debounce((()=>{this.reloadTable()}),200),l.on("click","#cleanQueryBtn",(async()=>{c.val(""),K.setValue(this.blacklistRoot.find("#dataType"),"",!1),K.setValue(this.blacklistRoot.find("#statusType"),"",!1),K.setValue(this.blacklistRoot.find("#urlType"),"",!1),await this.reloadTable()})).on("input","#searchValue",this.blacklistSearchDebounced).on("change","#dataType,#statusType,#urlType",(async()=>{await this.reloadTable()})).on("click","#toSetting",(()=>{this.getOptionalDependency("SettingPlugin")?.openSettingDialog?.("task-panel",(()=>{$("#setting-blacklist").css({border:"1px solid var(--jhs-status-filter)"})}))})).on("click",".open-url",(h=>{h.preventDefault();let u=$(h.currentTarget),p=u.attr("data-url"),g=u.attr("data-name");utils.openPage(p,g,!0,h)})).on("click","#checkBlacklistBtn",(h=>{let u=$(h.currentTarget),p=u.find("span").last(),g=p.text();!e||u.attr("aria-busy")==="true"||(u.attr("aria-busy","true").prop("disabled",!0),p.text("检测中…"),navigator.locks.request(e.singleTaskKey,{ifAvailable:!0},(async m=>{m?await e.checkBlacklist(!0):show.error("后台任务正在运行,请稍后再试")})).catch((m=>{clog.error("锁任务出现错误:",m),e.isNetworkBlocked(m)&&show.error(m.message||"任务执行失败")})).finally((()=>{u.removeAttr("aria-busy").prop("disabled",!1),p.text(g)})))}))},"success"),end:d(async()=>{this.blacklistRoot=null,this.blacklistSearchDebounced?.cancel?.(),this.blacklistSearchDebounced=null,this.taskStatusUnsubscribe?.(),this.taskStatusUnsubscribe=null,this.tableObj&&(this.tableObj.destroy(),this.tableObj=null),await dc().emit("blacklist-rules-changed")},"end")})}renderTaskStatus(){let e=(this.blacklistRoot||$()).find("#blacklist-task-status");if(!e.length)return;let t=this.getOptionalDependency("TaskPlugin");if(!t)return void e.empty().text("后台任务功能已禁用");let s=t.getTaskStatusSnapshot("blacklist"),a={idle:"正常",running:"运行中",pending:"等待下一次任务检查",due:"待运行"},r=d(n=>n?new Date(n).toLocaleString():"无","format"),i=s.state;e.empty().append($('').text(`黑名单:${a[i]||a.idle}`),$('').text(`上次完成 ${r(s.completedAt)};下次检查 ${s.nextAt?r(s.nextAt):"立即"}`))}async reloadTable(){if(!this.tableObj)return;let e=await this.getTableData();this.tableObj.setData(e)}async getTableData(){let e=this.blacklistRoot||$(),t=await storageManager.getBlacklist(),s=await storageManager.getBlacklistCarList(),a=String(e.find("#searchValue").val()||"").trim().toLocaleLowerCase(),r=e.find("#statusType").val(),i=e.find("#dataType"),n=i.val(),l=e.find("#urlType").val(),c=t.length,h=0,u=0,p=t.map(f=>{f.role===Oe?h++:f.role===at&&u++;let v=!1;return v=mt(f.lastPublishTime,this.checkBlacklist_ruleTime),{...f,isUnCheck:v}}).filter(f=>{let v=Array.isArray(f.allName)?f.allName.join(" "):f.allName||"",b=`${f.name||""} ${v} ${f.starId||""}`.toLocaleLowerCase(),w=!a||b.includes(a),S=!r||r==="normal"&&!f.isUnCheck||r==="stop"&&f.isUnCheck,j=!n||f.role===n,k=f.url.includes("t=");return w&&S&&j&&(!l||l==="hasT"&&k||l==="noT"&&!k)});i.html(` + `;this.getRuntimeService("dialog").open({type:1,title:"演员黑名单",ui:{body:"table"},content:a,scrollbar:!1,area:utils.getDialogArea("xl"),anim:-1,success:d(async r=>{let i=$(r).find(".layui-layer-content > div").first().addClass("jhs-blacklist-layout").removeAttr("style");this.blacklistRoot=i;let n=i.children("div").first().addClass("jhs-blacklist-toolbar").removeAttr("style");n.children("div").addClass("jhs-blacklist-toolbar__group").removeAttr("style"),n.find("select,input,a").removeAttr("style"),i.find("#table-container").removeAttr("style"),i.find("#table-container").before('
    '),K.enhance(r),e||i.find("#checkBlacklistBtn").prop("disabled",!0).attr("title","后台任务功能已禁用"),this.renderTaskStatus(),this.taskStatusUnsubscribe?.(),this.taskStatusUnsubscribe=bc().on("task-status-changed",(()=>this.renderTaskStatus())),await this.loadTableData();let l=$(r).find(".layui-layer-content"),c=l.find("#searchValue");this.blacklistSearchDebounced=utils.debounce((()=>{this.reloadTable()}),200),l.on("click","#cleanQueryBtn",(async()=>{c.val(""),K.setValue(this.blacklistRoot.find("#dataType"),"",!1),K.setValue(this.blacklistRoot.find("#statusType"),"",!1),K.setValue(this.blacklistRoot.find("#urlType"),"",!1),await this.reloadTable()})).on("input","#searchValue",this.blacklistSearchDebounced).on("change","#dataType,#statusType,#urlType",(async()=>{await this.reloadTable()})).on("click","#toSetting",(()=>{this.getOptionalDependency("SettingPlugin")?.openSettingDialog?.("task-panel",(()=>{$("#setting-blacklist").css({border:"1px solid var(--jhs-status-filter)"})}))})).on("click",".open-url",(h=>{h.preventDefault();let u=$(h.currentTarget),p=u.attr("data-url"),g=u.attr("data-name");utils.openPage(p,g,!0,h)})).on("click","#checkBlacklistBtn",(h=>{let u=$(h.currentTarget),p=u.find("span").last(),g=p.text();!e||u.attr("aria-busy")==="true"||(u.attr("aria-busy","true").prop("disabled",!0),p.text("检测中…"),navigator.locks.request(e.singleTaskKey,{ifAvailable:!0},(async m=>{m?await e.checkBlacklist(!0):show.error("后台任务正在运行,请稍后再试")})).catch((m=>{clog.error("锁任务出现错误:",m),e.isNetworkBlocked(m)&&show.error(m.message||"任务执行失败")})).finally((()=>{u.removeAttr("aria-busy").prop("disabled",!1),p.text(g)})))}))},"success"),end:d(async()=>{this.blacklistRoot=null,this.blacklistSearchDebounced?.cancel?.(),this.blacklistSearchDebounced=null,this.taskStatusUnsubscribe?.(),this.taskStatusUnsubscribe=null,this.tableObj&&(this.tableObj.destroy(),this.tableObj=null),await bc().emit("blacklist-rules-changed")},"end")})}renderTaskStatus(){let e=(this.blacklistRoot||$()).find("#blacklist-task-status");if(!e.length)return;let t=this.getOptionalDependency("TaskPlugin");if(!t)return void e.empty().text("后台任务功能已禁用");let s=t.getTaskStatusSnapshot("blacklist"),a={idle:"正常",running:"运行中",pending:"等待下一次任务检查",due:"待运行"},r=d(n=>n?new Date(n).toLocaleString():"无","format"),i=s.state;e.empty().append($('').text(`黑名单:${a[i]||a.idle}`),$('').text(`上次完成 ${r(s.completedAt)};下次检查 ${s.nextAt?r(s.nextAt):"立即"}`))}async reloadTable(){if(!this.tableObj)return;let e=await this.getTableData();this.tableObj.setData(e)}async getTableData(){let e=this.blacklistRoot||$(),t=await storageManager.getBlacklist(),s=await storageManager.getBlacklistCarList(),a=String(e.find("#searchValue").val()||"").trim().toLocaleLowerCase(),r=e.find("#statusType").val(),i=e.find("#dataType"),n=i.val(),l=e.find("#urlType").val(),c=t.length,h=0,u=0,p=t.map(f=>{f.role===ze?h++:f.role===it&&u++;let v=!1;return v=ft(f.lastPublishTime,this.checkBlacklist_ruleTime),{...f,isUnCheck:v}}).filter(f=>{let v=Array.isArray(f.allName)?f.allName.join(" "):f.allName||"",b=`${f.name||""} ${v} ${f.starId||""}`.toLocaleLowerCase(),w=!a||b.includes(a),S=!r||r==="normal"&&!f.isUnCheck||r==="stop"&&f.isUnCheck,j=!n||f.role===n,k=f.url.includes("t=");return w&&S&&j&&(!l||l==="hasT"&&k||l==="noT"&&!k)});i.html(` - `),K.setValue(i,n,!1);let g=new Map;for(let f of s){let v=f.starId;g.has(v)||g.set(v,[]),g.get(v).push(f)}let m=p.map(f=>{let v=f.starId,b=g.get(v)||[];return{...f,carList:b,count:b.length}});return this.currentCarCount=m.reduce(((f,v)=>f+(v.count||0)),0),m}async loadTableData(){this.checkBlacklist_ruleTime=ae(await storageManager.getSetting("checkBlacklist_ruleTime"),8760,{min:0});let e=await this.getTableData(),t=document.createElement("div");Ue(t,{type:"empty",title:"没有符合当前筛选条件的黑名单记录"});let s=(this.blacklistRoot||$()).find("#table-container").get(0);this.tableObj=ze(globalThis.Tabulator,s,{layout:"fitColumns",placeholder:t,virtualDom:!0,data:e,pagination:!0,paginationMode:"local",paginationSize:20,paginationSizeSelector:[20,50,100,1e3],paginationCounter:d((a,r,i,n,l)=>`演员: ${n}    番号总数: ${this.currentCarCount} `,"paginationCounter"),responsiveLayout:"collapse",responsiveLayoutCollapse:!0,columnDefaults:{headerHozAlign:"center",hozAlign:"center"},index:"starId",columns:[{title:"演员",field:"name",sorter:"string",minWidth:100,responsive:0,headerSort:!1,formatter:d((a,r,i)=>{let n=a.getData(),l=Ye(n.url),c=document.createElement("a");return c.className="open-url",c.textContent=String(n.name||""),c.dataset.name=String(n.name||""),l?(c.href=l,c.dataset.url=l,c.target="_blank",c.rel="noopener noreferrer"):(c.href="#",c.setAttribute("aria-disabled","true")),c},"formatter")},{title:"性别角色",field:"role",sorter:"string",width:120,responsive:5,formatter:d((a,r,i)=>{let n=a.getData().role,l=n;return n===Oe?l="男演员":n===at&&(l="女演员"),l},"formatter")},{title:"影视类别",field:"movieType",sorter:"string",width:120,responsive:5,formatter:d((a,r,i)=>{let n=a.getData().movieType,l=n;return n===Je?l="有码":n===Ke&&(l="无码"),l},"formatter")},{title:"屏蔽类型",field:"url",sorter:"string",minWidth:120,responsive:4,visible:M,formatter:d((a,r,i)=>{let n=a.getData().url.includes("t=");return`${n?"按所选分类屏蔽":"未筛选分类"}`},"formatter")},{title:"番号数量",field:"count",sorter:"number",width:170,responsive:1},{title:"创建时间",field:"createTime",sorter:"string",width:170,responsive:5},{title:"最后发行时间",field:"lastPublishTime",sorter:"string",width:170,responsive:1},{title:"状态",field:"isUnCheck",sorter:"string",width:120,responsive:1,formatter:d((a,r,i)=>{let n="",l="继续检测";return a.getData().isUnCheck&&(n=`停更${this.checkBlacklist_ruleTime/24/365}年以上, 下轮任务不再进行检测`,l="停更跳过"),`${l}`},"formatter")},{title:"操作",sorter:"string",cssClass:"action-cell-dropdown",minWidth:150,responsive:0,headerSort:!1,formatter:d((a,r,i)=>{let n=a.getData();return i((()=>{var l,c;(l=a.getElement().querySelector(".delete-btn"))==null||l.addEventListener("click",(h=>{let u=n.name,p=n.starId;u?p?utils.q(h,`是否移除对 ${T(u)} 的屏蔽?`,(async()=>{await storageManager.removeBlacklistCarList(p),await storageManager.deleteBlacklistItem(p),show.info("操作成功"),await this.reloadTable()})):show.error("获取starId失败"):show.error("获取名称失败")})),(c=a.getElement().querySelector(".keyword-btn"))==null||c.addEventListener("click",(h=>{let u=n.carList.reduce(((g,m)=>{let f=m.carNum.split("-")[0]+"-";return g[f]=(g[f]||0)+1,g}),{}),p=Object.entries(u).map((([g,m])=>({prefix:g,count:m}))).sort(((g,m)=>m.count-g.count));clog.debug(p)}))})),''},"formatter")}],initialSort:[{column:"createTime",dir:"desc"}]})}async filterAllVideo(e,{filter:t=this.getOptionalDependency("ListPagePlugin")?.activeQuickFilter||"waitCheck",confirm:s=!0,root:a=null}={}){let r=_e(t),i=Pe[r],n=r==="all"?"将处理当前搜索全部分页的所有作品(包括屏蔽项)并加入黑名单。":`将处理当前搜索全部分页中符合「${i}」筛选的作品并加入黑名单。`;if(s&&!await new Promise(u=>utils.q(null,n,()=>u(!0),()=>u(!1))))return{cancelled:!0};let l=qs();if(!l)return show.error("已有批量任务正在执行"),{cancelled:!0,busy:!0};let c=d(()=>(this.blacklistRoot||$()).find("#checkBlacklistMsg"),"statusHost");try{$("#favoriteAllVideo, #hasDownAllVideo, #filterAllVideo").attr("aria-disabled","true").addClass("jhs-batch-busy");let h=await this.getRuntimeService("scope")(),u=this.getOptionalDependency("ListPagePlugin"),p=typeof u?.createEvaluationContext=="function"?await u.createEvaluationContext():is({}),g=d(()=>!Lt(l)||!!h?.disposed,"isCancelled"),m=await Vs({startDom:a?$(a):$(document),currentUrl:a?null:window.location.href,firstPageUrl:a?null:this.getRuntimeService("host")?.resolveFirstPageUrl?.(window.location.href)??window.location.href,itemSelector:this.getSelector().requestDomItemSelector,nextPageSelector:this.getSelector().nextPageSelector,fetchHtml:d(async b=>qe(this.getRuntimeService("http"),b,h),"fetchHtml"),parseItem:d(b=>$e(b),"parseItem"),evaluate:d(b=>ns({carNum:b.carNum,title:b.title||""},p,{filter:r}),"evaluate"),isCancelled:g,onProgress:d(({page:b,scanned:w,matched:S})=>{let j=c();j.length&&j.text(`正在扫描第 ${b} 页 · 已扫描 ${w} · 匹配 ${S} 个番号`)},"onProgress")});if(g())return{cancelled:!0};let f=0;for(let b=0;bS.carNum),{blocked:!0},{type:"actor-page-block",records:w.map(S=>({carNum:S.carNum,url:S.url||"",names:e,publishTime:S.publishTime||"",fc2Source:S.fc2Source}))}),f+=w.length,clog.log("一键屏蔽进度",`已屏蔽 ${f}/${m.length} 个番号`)}let v=c();return v.length&&v.text(`处理完成 · 共屏蔽 ${f} 个番号`),{matched:m.length,updated:f}}finally{Lt(l)&&Hs(l),$("#favoriteAllVideo, #hasDownAllVideo, #filterAllVideo").removeAttr("aria-disabled").removeClass("jhs-batch-busy")}}async filterActorVideo(e,t,s,a=B?Se:Be,r=1,i=0,n=new Set){let{nextPageLink:l,recordCount:c}=await this.parseAndSaveFilterInfo(s,e,t,a);if(i+=c,(this.blacklistRoot||$()).find("#checkBlacklistMsg").text(`正在处理第 ${r} 页 · 已屏蔽 ${i} 个番号`),this.nextPageLink=l,l&&r<200&&!n.has(l)){n.add(l);let h;this.lastPageLink=l,clog.log("正在请求下一页内容:",l);let u=await this.getRuntimeService("scope")(),p=await qe(this.getRuntimeService("http"),l,u);h=utils.htmlTo$dom(p),await this.filterActorVideo(e,t,h,a,r+1,i,n)}else r>=200?((this.blacklistRoot||$()).find("#checkBlacklistMsg").text(`已达到页数上限(200 页),已停止 · 已屏蔽 ${i} 个番号`),clog.warn("演员视频分页扫描已达上限,已停止")):(this.blacklistRoot||$()).find("#checkBlacklistMsg").text(`处理完成 · ${r} 页 · 新增 ${i} 个番号`)}async parseAndSaveFilterInfo(e,t,s,a){if(![Be,Se].includes(a))throw new Error(`未知黑名单来源站点: ${a}`);let r=e||$(document),i=this.getSelector(a);a===Se&&r.find(".avatar-box").length>0&&r.find(".avatar-box").parent().remove();let n=Ws(r,{boxSelector:a===Se?`${i.boxSelector}, #waterfall`:i.boxSelector,requestDomItemSelector:e?i.requestDomItemSelector:i.itemSelector}),l=r.find(i.nextPageSelector).attr("href");if(n.state!=="valid")throw new Error(`黑名单作品页面无效: ${n.state}`);if(n.isEmpty&&l)throw new Error("黑名单作品空页面包含下一页");let c=[],h=[];for(let u of n.items){let p=$(u),{carNum:g,url:m,publishTime:f}=$e(p);f&&h.push(f),m&&g&&c.push({carNum:g,url:m,names:t,actionType:ce,starId:s,publishTime:f})}return await storageManager.batchSaveBlacklistCarList(c),{nextPageLink:l,lastPublishTime:Qt(h),recordCount:c.length}}};d(Pi,"BlacklistPlugin");var Js=Pi;var Ri=class Ri extends I{getName(){return"FilterTitleKeywordPlugin"}async handle(){isDetailPage&&await this.bindDetailRoot(document)}async bindDetailRoot(e,{layerIndex:t=null}={}){if(await storageManager.getSetting("enableTitleSelectFilter",E)!==E)return;let s=$(e),a=M?".title strong, .current-title":B?"h3":".current-title, .origin-title, .jhs-detail-title";s.off("contextmenu.jhsTitleFilter",a).on("contextmenu.jhsTitleFilter",a,(r=>{let i=window.getSelection()?.toString()||"";if(i){r.preventDefault();let n={clientX:r.clientX,clientY:r.clientY+80};utils.q(n,`是否屏蔽标题关键词 ${T(i)}?`,(async()=>{let l=i.replace(/\r?\n+/g," ").replace(/\s{2,}/g," ").trim().slice(0,120);l&&await storageManager.saveTitleFilterKeyword(l),await V?.emit("filter-rules-changed",{scope:"title-keyword"}),utils.closePage({root:s,layerIndex:t})}))}}))}};d(Ri,"FilterTitleKeywordPlugin");var Ks=Ri;function Gs(o,{retry:e=null,tone:t="neutral",extraClass:s=""}={}){let a=globalThis.$,r=a('
    ').text(o);return s&&r.addClass(s),t==="error"&&r.addClass("is-error"),e&&r.append(" ",a('').on("click",e)),r}d(Gs,"createPanelState");function hc(o="正在加载…"){return Gs(o)}d(hc,"createPanelLoading");function uc(o,e=null){return Gs(o,{retry:e,tone:"error"})}d(uc,"createPanelError");function Ii(o){try{let e=new URL(String(o||""));return["http:","https:"].includes(e.protocol)?e.href:null}catch{return null}}d(Ii,"normalizeUrl");function he(o,e,t=null){let s=globalThis.$,a=s(o).empty(),r=Gs(e,{retry:t,tone:t?"error":"neutral",extraClass:"jhs-fc2-state"});a.append(r)}d(he,"renderFc2State");function os(o,e,t=null){let s=globalThis.$,a=[...new Set((e||[]).map(Ii).filter(Boolean))],r=o.root.find('[data-jhs-role="gallery-grid"]').empty(),i=o.root.find('[data-jhs-role="main-preview"]').empty();o.galleryUrls=new Set(a);let n=Ii(t);if(n&&i.append(s("").attr({src:n,alt:`${o.carNum} 概览`,loading:"eager"})),!a.length)return he(r,"暂无剧照");a.forEach((c,h)=>r.append(s('').attr("aria-label",`查看剧照 ${h+1}`).append(s("").addClass("jhs-fc2-gallery__image").attr({src:c,alt:`剧照 ${h+1}`,loading:"lazy"}))));let l=o.root.find('[data-jhs-role="screenshot"]');l.find("img").each((c,h)=>{let u=h.getAttribute("src");u&&o.galleryUrls.has(u)&&l.empty()})}d(os,"renderFc2Gallery");function Qs(o,e){let t=globalThis.$,s=t(''),a=e.sourceUrls({carNum:o.carNum},["fc2ppvdb","fc2content"]);return[[o.source==="123av"?"123AV 原页面":"JavDB 原页面",Ii(o.url)],...a.map(i=>[i.providerId==="fc2ppvdb"?"FC2PPVDB":"FC2 市场",i.url])].forEach(([i,n])=>n&&s.append(t("
    ").addClass("jhs-btn jhs-btn--ghost jhs-btn--sm").attr({href:n,target:"_blank",rel:"noopener noreferrer"}).text(i))),s}d(Qs,"createFc2SourceLinks");var Ei=class Ei extends I{constructor(){super(...arguments),this.$contentBox=null,this.$listRoot=null,this.urlParams=new URLSearchParams(window.location.search),this.currentPage=Math.max(1,parseInt(this.urlParams.get("page")||"1",10)||1),this.maxPage=null,this._queryGeneration=0,this.keyword=this.urlParams.get("keyword")||null}getName(){return"Fc2By123AvPlugin"}async resolveMovieId(e){let t=await this.getRuntimeService("scope")();return(await this.getRuntimeService("movie").resolve({carNum:e},{scope:t}))?.movieId||null}async handle(){let e=document.querySelector('#navbar-menu-hero a[href^="/tags/fc2"]');if(e&&!document.querySelector("#jhs-123av-nav")){let t=document.createElement("a");t.id="jhs-123av-nav",t.className="navbar-item",t.href="/tags/fc2?c10=1&jhs_source=123av",t.textContent="123AV · FC2片库",e.after(t)}je(window.location).kind==="external-fc2-catalog"&&(this.hookPage(),await this.handleQuery())}hookPage(){let e=this.getRuntimeService("host"),t=e.locateListRoot?.(),s=e.getListContainer?.();if(!t||!s)throw new Error("JavDB 列表容器不可用");this.$contentBox=$(s),this.$listRoot=$(e.createOwnedListRoot(["jhs-123av-list","jhs-layout-d2c171b1"]));let a=this.$contentBox.find("h2.section-title").first();a.length||(a=$("

    ").addClass("section-title").prependTo(this.$contentBox)),a.text("123AV · FC2片库"),a.css("marginBottom","0"),a.append(` + `),K.setValue(i,n,!1);let g=new Map;for(let f of s){let v=f.starId;g.has(v)||g.set(v,[]),g.get(v).push(f)}let m=p.map(f=>{let v=f.starId,b=g.get(v)||[];return{...f,carList:b,count:b.length}});return this.currentCarCount=m.reduce(((f,v)=>f+(v.count||0)),0),m}async loadTableData(){this.checkBlacklist_ruleTime=ae(await storageManager.getSetting("checkBlacklist_ruleTime"),8760,{min:0});let e=await this.getTableData(),t=document.createElement("div");Fe(t,{type:"empty",title:"没有符合当前筛选条件的黑名单记录"});let s=(this.blacklistRoot||$()).find("#table-container").get(0);this.tableObj=Ve(globalThis.Tabulator,s,{layout:"fitColumns",placeholder:t,virtualDom:!0,data:e,pagination:!0,paginationMode:"local",paginationSize:20,paginationSizeSelector:[20,50,100,1e3],paginationCounter:d((a,r,i,n,l)=>`演员: ${n}    番号总数: ${this.currentCarCount} `,"paginationCounter"),responsiveLayout:"collapse",responsiveLayoutCollapse:!0,columnDefaults:{headerHozAlign:"center",hozAlign:"center"},index:"starId",columns:[{title:"演员",field:"name",sorter:"string",minWidth:100,responsive:0,headerSort:!1,formatter:d((a,r,i)=>{let n=a.getData(),l=Xe(n.url),c=document.createElement("a");return c.className="open-url",c.textContent=String(n.name||""),c.dataset.name=String(n.name||""),l?(c.href=l,c.dataset.url=l,c.target="_blank",c.rel="noopener noreferrer"):(c.href="#",c.setAttribute("aria-disabled","true")),c},"formatter")},{title:"性别角色",field:"role",sorter:"string",width:120,responsive:5,formatter:d((a,r,i)=>{let n=a.getData().role,l=n;return n===ze?l="男演员":n===it&&(l="女演员"),l},"formatter")},{title:"影视类别",field:"movieType",sorter:"string",width:120,responsive:5,formatter:d((a,r,i)=>{let n=a.getData().movieType,l=n;return n===Qe?l="有码":n===Ye&&(l="无码"),l},"formatter")},{title:"屏蔽类型",field:"url",sorter:"string",minWidth:120,responsive:4,visible:M,formatter:d((a,r,i)=>{let n=a.getData().url.includes("t=");return`${n?"按所选分类屏蔽":"未筛选分类"}`},"formatter")},{title:"番号数量",field:"count",sorter:"number",width:170,responsive:1},{title:"创建时间",field:"createTime",sorter:"string",width:170,responsive:5},{title:"最后发行时间",field:"lastPublishTime",sorter:"string",width:170,responsive:1},{title:"状态",field:"isUnCheck",sorter:"string",width:120,responsive:1,formatter:d((a,r,i)=>{let n="",l="继续检测";return a.getData().isUnCheck&&(n=`停更${this.checkBlacklist_ruleTime/24/365}年以上, 下轮任务不再进行检测`,l="停更跳过"),`${l}`},"formatter")},{title:"操作",sorter:"string",cssClass:"action-cell-dropdown",minWidth:150,responsive:0,headerSort:!1,formatter:d((a,r,i)=>{let n=a.getData();return i((()=>{var l,c;(l=a.getElement().querySelector(".delete-btn"))==null||l.addEventListener("click",(h=>{let u=n.name,p=n.starId;u?p?utils.q(h,`是否移除对 ${T(u)} 的屏蔽?`,(async()=>{await storageManager.removeBlacklistCarList(p),await storageManager.deleteBlacklistItem(p),show.info("操作成功"),await this.reloadTable()})):show.error("获取starId失败"):show.error("获取名称失败")})),(c=a.getElement().querySelector(".keyword-btn"))==null||c.addEventListener("click",(h=>{let u=n.carList.reduce(((g,m)=>{let f=m.carNum.split("-")[0]+"-";return g[f]=(g[f]||0)+1,g}),{}),p=Object.entries(u).map((([g,m])=>({prefix:g,count:m}))).sort(((g,m)=>m.count-g.count));clog.debug(p)}))})),''},"formatter")}],initialSort:[{column:"createTime",dir:"desc"}]})}async filterAllVideo(e,{filter:t=this.getOptionalDependency("ListPagePlugin")?.activeQuickFilter||"waitCheck",confirm:s=!0,root:a=null}={}){let r=_e(t),i=Pe[r],n=r==="all"?"将处理当前搜索全部分页的所有作品(包括屏蔽项)并加入黑名单。":`将处理当前搜索全部分页中符合「${i}」筛选的作品并加入黑名单。`;if(s&&!await new Promise(u=>utils.q(null,n,()=>u(!0),()=>u(!1))))return{cancelled:!0};let l=Gs();if(!l)return show.error("已有批量任务正在执行"),{cancelled:!0,busy:!0};let c=d(()=>(this.blacklistRoot||$()).find("#checkBlacklistMsg"),"statusHost");try{$("#favoriteAllVideo, #hasDownAllVideo, #filterAllVideo").attr("aria-disabled","true").addClass("jhs-batch-busy");let h=await this.getRuntimeService("scope")(),u=this.getOptionalDependency("ListPagePlugin"),p=typeof u?.createEvaluationContext=="function"?await u.createEvaluationContext():cs({}),g=d(()=>!Bt(l)||!!h?.disposed,"isCancelled"),m=await Ks({startDom:a?$(a):$(document),currentUrl:a?null:window.location.href,firstPageUrl:a?null:this.getRuntimeService("host")?.resolveFirstPageUrl?.(window.location.href)??window.location.href,itemSelector:this.getSelector().requestDomItemSelector,nextPageSelector:this.getSelector().nextPageSelector,fetchHtml:d(async b=>We(this.getRuntimeService("http"),b,h),"fetchHtml"),parseItem:d(b=>$e(b),"parseItem"),evaluate:d(b=>ds({carNum:b.carNum,title:b.title||""},p,{filter:r}),"evaluate"),isCancelled:g,onProgress:d(({page:b,scanned:w,matched:S})=>{let j=c();j.length&&j.text(`正在扫描第 ${b} 页 · 已扫描 ${w} · 匹配 ${S} 个番号`)},"onProgress")});if(g())return{cancelled:!0};let f=0;for(let b=0;bS.carNum),{blocked:!0},{type:"actor-page-block",records:w.map(S=>({carNum:S.carNum,url:S.url||"",names:e,publishTime:S.publishTime||"",fc2Source:S.fc2Source}))}),f+=w.length,clog.log("一键屏蔽进度",`已屏蔽 ${f}/${m.length} 个番号`)}let v=c();return v.length&&v.text(`处理完成 · 共屏蔽 ${f} 个番号`),{matched:m.length,updated:f}}finally{Bt(l)&&Qs(l),$("#favoriteAllVideo, #hasDownAllVideo, #filterAllVideo").removeAttr("aria-disabled").removeClass("jhs-batch-busy")}}async filterActorVideo(e,t,s,a=B?Se:Ue,r=1,i=0,n=new Set){let{nextPageLink:l,recordCount:c}=await this.parseAndSaveFilterInfo(s,e,t,a);if(i+=c,(this.blacklistRoot||$()).find("#checkBlacklistMsg").text(`正在处理第 ${r} 页 · 已屏蔽 ${i} 个番号`),this.nextPageLink=l,l&&r<200&&!n.has(l)){n.add(l);let h;this.lastPageLink=l,clog.log("正在请求下一页内容:",l);let u=await this.getRuntimeService("scope")(),p=await We(this.getRuntimeService("http"),l,u);h=utils.htmlTo$dom(p),await this.filterActorVideo(e,t,h,a,r+1,i,n)}else r>=200?((this.blacklistRoot||$()).find("#checkBlacklistMsg").text(`已达到页数上限(200 页),已停止 · 已屏蔽 ${i} 个番号`),clog.warn("演员视频分页扫描已达上限,已停止")):(this.blacklistRoot||$()).find("#checkBlacklistMsg").text(`处理完成 · ${r} 页 · 新增 ${i} 个番号`)}async parseAndSaveFilterInfo(e,t,s,a){if(![Ue,Se].includes(a))throw new Error(`未知黑名单来源站点: ${a}`);let r=e||$(document),i=this.getSelector(a);a===Se&&r.find(".avatar-box").length>0&&r.find(".avatar-box").parent().remove();let n=Ys(r,{boxSelector:a===Se?`${i.boxSelector}, #waterfall`:i.boxSelector,requestDomItemSelector:e?i.requestDomItemSelector:i.itemSelector}),l=r.find(i.nextPageSelector).attr("href");if(n.state!=="valid")throw new Error(`黑名单作品页面无效: ${n.state}`);if(n.isEmpty&&l)throw new Error("黑名单作品空页面包含下一页");let c=[],h=[];for(let u of n.items){let p=$(u),{carNum:g,url:m,publishTime:f}=$e(p);f&&h.push(f),m&&g&&c.push({carNum:g,url:m,names:t,actionType:ce,starId:s,publishTime:f})}return await storageManager.batchSaveBlacklistCarList(c),{nextPageLink:l,lastPublishTime:Zt(h),recordCount:c.length}}};d(Li,"BlacklistPlugin");var Zs=Li;var Mi=class Mi extends R{getName(){return"FilterTitleKeywordPlugin"}async handle(){isDetailPage&&await this.bindDetailRoot(document)}async bindDetailRoot(e,{layerIndex:t=null}={}){if(await storageManager.getSetting("enableTitleSelectFilter",E)!==E)return;let s=$(e),a=M?".title strong, .current-title":B?"h3":".current-title, .origin-title, .jhs-detail-title";s.off("contextmenu.jhsTitleFilter",a).on("contextmenu.jhsTitleFilter",a,(r=>{let i=window.getSelection()?.toString()||"";if(i){r.preventDefault();let n={clientX:r.clientX,clientY:r.clientY+80};utils.q(n,`是否屏蔽标题关键词 ${T(i)}?`,(async()=>{let l=i.replace(/\r?\n+/g," ").replace(/\s{2,}/g," ").trim().slice(0,120);l&&await storageManager.saveTitleFilterKeyword(l),await V?.emit("filter-rules-changed",{scope:"title-keyword"}),utils.closePage({root:s,layerIndex:t})}))}}))}};d(Mi,"FilterTitleKeywordPlugin");var Xs=Mi;function ea(o,{retry:e=null,tone:t="neutral",extraClass:s=""}={}){let a=globalThis.$,r=a('
    ').text(o);return s&&r.addClass(s),t==="error"&&r.addClass("is-error"),e&&r.append(" ",a('').on("click",e)),r}d(ea,"createPanelState");function wc(o="正在加载…"){return ea(o)}d(wc,"createPanelLoading");function yc(o,e=null){return ea(o,{retry:e,tone:"error"})}d(yc,"createPanelError");function Bi(o){try{let e=new URL(String(o||""));return["http:","https:"].includes(e.protocol)?e.href:null}catch{return null}}d(Bi,"normalizeUrl");function he(o,e,t=null){let s=globalThis.$,a=s(o).empty(),r=ea(e,{retry:t,tone:t?"error":"neutral",extraClass:"jhs-fc2-state"});a.append(r)}d(he,"renderFc2State");function hs(o,e,t=null){let s=globalThis.$,a=[...new Set((e||[]).map(Bi).filter(Boolean))],r=o.root.find('[data-jhs-role="gallery-grid"]').empty(),i=o.root.find('[data-jhs-role="main-preview"]').empty();o.galleryUrls=new Set(a);let n=Bi(t);if(n&&i.append(s("").attr({src:n,alt:`${o.carNum} 概览`,loading:"eager"})),!a.length)return he(r,"暂无剧照");a.forEach((c,h)=>r.append(s('').attr("aria-label",`查看剧照 ${h+1}`).append(s("").addClass("jhs-fc2-gallery__image").attr({src:c,alt:`剧照 ${h+1}`,loading:"lazy"}))));let l=o.root.find('[data-jhs-role="screenshot"]');l.find("img").each((c,h)=>{let u=h.getAttribute("src");u&&o.galleryUrls.has(u)&&l.empty()})}d(hs,"renderFc2Gallery");function ta(o,e){let t=globalThis.$,s=t(''),a=e.sourceUrls({carNum:o.carNum},["fc2ppvdb","fc2content"]);return[[o.source==="123av"?"123AV 原页面":"JavDB 原页面",Bi(o.url)],...a.map(i=>[i.providerId==="fc2ppvdb"?"FC2PPVDB":"FC2 市场",i.url])].forEach(([i,n])=>n&&s.append(t("").addClass("jhs-btn jhs-btn--ghost jhs-btn--sm").attr({href:n,target:"_blank",rel:"noopener noreferrer"}).text(i))),s}d(ta,"createFc2SourceLinks");var Oi=class Oi extends R{constructor(){super(...arguments),this.$contentBox=null,this.$listRoot=null,this.urlParams=new URLSearchParams(window.location.search),this.currentPage=Math.max(1,parseInt(this.urlParams.get("page")||"1",10)||1),this.maxPage=null,this._queryGeneration=0,this.keyword=this.urlParams.get("keyword")||null}getName(){return"Fc2By123AvPlugin"}async resolveMovieId(e){let t=await this.getRuntimeService("scope")();return(await this.getRuntimeService("movie").resolve({carNum:e},{scope:t}))?.movieId||null}async handle(){let e=document.querySelector('#navbar-menu-hero a[href^="/tags/fc2"]');if(e&&!document.querySelector("#jhs-123av-nav")){let t=document.createElement("a");t.id="jhs-123av-nav",t.className="navbar-item",t.href="/tags/fc2?c10=1&jhs_source=123av",t.textContent="123AV · FC2片库",e.after(t)}je(window.location).kind==="external-fc2-catalog"&&(this.hookPage(),await this.handleQuery())}hookPage(){let e=this.getRuntimeService("host"),t=e.locateListRoot?.(),s=e.getListContainer?.();if(!t||!s)throw new Error("JavDB 列表容器不可用");this.$contentBox=$(s),this.$listRoot=$(e.createOwnedListRoot(["jhs-123av-list","jhs-layout-d2c171b1"]));let a=this.$contentBox.find("h2.section-title").first();a.length||(a=$("

    ").addClass("section-title").prependTo(this.$contentBox)),a.text("123AV · FC2片库"),a.css("marginBottom","0"),a.append(`
    @@ -3195,7 +3202,7 @@
      - `),$(document).on("click",".pagination-link",(r=>{r.preventDefault(),this.currentPage=parseInt($(r.target).data("page")),utils.setHrefParam("page",this.currentPage),this.renderPagination(),this.handleQuery()})),$(".pagination-previous").on("click",(r=>{r.preventDefault(),this.currentPage>1&&(this.currentPage--,utils.setHrefParam("page",this.currentPage),this.renderPagination(),this.handleQuery())})),$(".pagination-next").on("click",(r=>{r.preventDefault(),this.currentPage<(this.maxPage??0)&&(this.currentPage++,utils.setHrefParam("page",this.currentPage),this.renderPagination(),this.handleQuery())}))}renderPagination(){let e=$(".pagination-list");e.empty();let t=this.maxPage??1,s=Math.max(1,this.currentPage-2),a=Math.min(t,this.currentPage+2);this.currentPage<=3?a=Math.min(6,t):this.currentPage>=t-2&&(s=Math.max(t-5,1)),s>1&&(e.append('
    • '),s>2&&e.append('
    • …
    • '));for(let r=s;r<=a;r++){let i=r===this.currentPage?" is-current":"";e.append(`
    • `)}a…'),e.append(`
    • `))}async handleQuery(){let e=loading(),t=++this._queryGeneration;try{$(".page-box").show();let s=await this.getRuntimeService("scope")();if(t!==this._queryGeneration)return;let a=await this.getRuntimeService("movie").catalog("av123",{page:this.currentPage,keyword:this.keyword||""},{scope:s});if(t!==this._queryGeneration)return;let r=a.items;this.maxPage=Math.max(1,Number(a.maxPage)||1),this.currentPage=Math.min(Math.max(1,this.currentPage),this.maxPage),this.renderPagination(),r.length===0&&(clog.log(r),show.error("无结果"),clog.error("123AV 获取数据失败"));let i=this.markDataListHtml(r);this.$listRoot?.html(i);let n=this.getOptionalDependency("ListPagePlugin");n&&this.$listRoot&&await n.processAddedItems?.(this.$listRoot.find(".item").toArray()),await utils.smoothScrollToTop()}catch(s){clog.error(s)}finally{e.close()}}async loadDetail(e,t){let s=this.loadSummary(e,t),a=this.getImgList(e.carNum),r=this.getActressInfo(e.carNum);a.then((i=>e.isAlive()&&os(e,i,null))).catch((i=>e.isAlive()&&he(e.root.find('[data-jhs-role="gallery-grid"]'),"剧照加载失败",(()=>{this.reloadImages(e)})))),r.then((async i=>{await s.catch((()=>null)),e.isAlive()&&this.render123AvActress(e,i)})).catch((i=>clog.error("FC2 演员信息加载失败",i))),await Promise.allSettled([s,a,r])}async loadSummary(e,t){try{let s=await this.get123AvVideoInfo(e.carNum,t);return e.isAlive()?(this.render123AvSummary(e,s),s):null}catch(s){throw e.isAlive()&&he(e.root.find('[data-jhs-role="summary-content"]'),"影片信息加载失败",(()=>{this.loadSummary(e,t)})),clog.error("123AV 详情加载失败",s),s}}render123AvSummary(e,t){let s=e.root.find('[data-jhs-role="summary-content"]').empty(),a=$('

      ');a.find("strong").text(t.title||"无标题"),s.append(a,$('
      ').append($("").text(`番号:${e.carNum}`),$("").text(`发行:${t.publishDate||"未知"}`)),'
      主演:正在加载演员…
      ','
      ',Qs(e,this.getRuntimeService("movie")),$('').text(t.publishDate||""))}async get123AvVideoInfo(e,t){let s=await this.getRuntimeService("scope")(),a=await this.getRuntimeService("movie").detail({carNum:e,url:t,providerId:"av123"},{scope:s});return{title:a?.title||"",publishDate:a?.releaseDate||"",moviePoster:null}}async getActressInfo(e){let t=await this.getRuntimeService("scope")();return this.getRuntimeService("movie").people("fc2ppvdb",{carNum:e},{scope:t})}async getImgList(e){let t=await this.getRuntimeService("scope")();return(await this.getRuntimeService("movie").images("fc2content",{carNum:e},{scope:t})).map((s=>s.url))}async reloadImages(e){try{let t=await this.getImgList(e.carNum);e.isAlive()&&os(e,t,null)}catch{e.isAlive()&&he(e.root.find('[data-jhs-role="gallery-grid"]'),"剧照加载失败",(()=>{this.reloadImages(e)}))}}render123AvActress(e,t){let s=e.root.find('[data-jhs-role="actors"]').empty().append("主演:");t.actors.length?t.actors.forEach((a=>s.append($("").addClass("jhs-fc2-actor").attr({href:a.url,target:"_blank",rel:"noopener noreferrer"}).text(a.name)))):s.append($("").text("暂无演员信息")),e.root.find('[data-jhs-role="actress-data"]').remove(),e.root.find(".jhs-fc2-summary__body").append($('').text(t.actors.map((a=>a.name)).join(" "))),t.seller&&e.root.find('[data-jhs-role="seller"]').empty().append("卖家:",t.seller.url?$("").attr({href:t.seller.url,target:"_blank",rel:"noopener noreferrer"}).text(t.seller.name):document.createTextNode(t.seller.name))}markDataListHtml(e){let t="";return e.forEach((s=>{let a=Ye(s.url),r=Ye(s.imageUrl);a&&(t+=` + `),$(document).on("click",".pagination-link",(r=>{r.preventDefault(),this.currentPage=parseInt($(r.target).data("page")),utils.setHrefParam("page",this.currentPage),this.renderPagination(),this.handleQuery()})),$(".pagination-previous").on("click",(r=>{r.preventDefault(),this.currentPage>1&&(this.currentPage--,utils.setHrefParam("page",this.currentPage),this.renderPagination(),this.handleQuery())})),$(".pagination-next").on("click",(r=>{r.preventDefault(),this.currentPage<(this.maxPage??0)&&(this.currentPage++,utils.setHrefParam("page",this.currentPage),this.renderPagination(),this.handleQuery())}))}renderPagination(){let e=$(".pagination-list");e.empty();let t=this.maxPage??1,s=Math.max(1,this.currentPage-2),a=Math.min(t,this.currentPage+2);this.currentPage<=3?a=Math.min(6,t):this.currentPage>=t-2&&(s=Math.max(t-5,1)),s>1&&(e.append('
    • '),s>2&&e.append('
    • …
    • '));for(let r=s;r<=a;r++){let i=r===this.currentPage?" is-current":"";e.append(`
    • `)}a…'),e.append(`
    • `))}async handleQuery(){let e=loading(),t=++this._queryGeneration;try{$(".page-box").show();let s=await this.getRuntimeService("scope")();if(t!==this._queryGeneration)return;let a=await this.getRuntimeService("movie").catalog("av123",{page:this.currentPage,keyword:this.keyword||""},{scope:s});if(t!==this._queryGeneration)return;let r=a.items;this.maxPage=Math.max(1,Number(a.maxPage)||1),this.currentPage=Math.min(Math.max(1,this.currentPage),this.maxPage),this.renderPagination(),r.length===0&&(clog.log(r),show.error("无结果"),clog.error("123AV 获取数据失败"));let i=this.markDataListHtml(r);this.$listRoot?.html(i);let n=this.getOptionalDependency("ListPagePlugin");n&&this.$listRoot&&await n.processAddedItems?.(this.$listRoot.find(".item").toArray()),await utils.smoothScrollToTop()}catch(s){clog.error(s)}finally{e.close()}}async loadDetail(e,t){let s=this.loadSummary(e,t),a=this.getImgList(e.carNum),r=this.getActressInfo(e.carNum);a.then((i=>e.isAlive()&&hs(e,i,null))).catch((i=>e.isAlive()&&he(e.root.find('[data-jhs-role="gallery-grid"]'),"剧照加载失败",(()=>{this.reloadImages(e)})))),r.then((async i=>{await s.catch((()=>null)),e.isAlive()&&this.render123AvActress(e,i)})).catch((i=>clog.error("FC2 演员信息加载失败",i))),await Promise.allSettled([s,a,r])}async loadSummary(e,t){try{let s=await this.get123AvVideoInfo(e.carNum,t);return e.isAlive()?(this.render123AvSummary(e,s),s):null}catch(s){throw e.isAlive()&&he(e.root.find('[data-jhs-role="summary-content"]'),"影片信息加载失败",(()=>{this.loadSummary(e,t)})),clog.error("123AV 详情加载失败",s),s}}render123AvSummary(e,t){let s=e.root.find('[data-jhs-role="summary-content"]').empty(),a=$('

      ');a.find("strong").text(t.title||"无标题"),s.append(a,$('
      ').append($("").text(`番号:${e.carNum}`),$("").text(`发行:${t.publishDate||"未知"}`)),'
      主演:正在加载演员…
      ','
      ',ta(e,this.getRuntimeService("movie")),$('').text(t.publishDate||""))}async get123AvVideoInfo(e,t){let s=await this.getRuntimeService("scope")(),a=await this.getRuntimeService("movie").detail({carNum:e,url:t,providerId:"av123"},{scope:s});return{title:a?.title||"",publishDate:a?.releaseDate||"",moviePoster:null}}async getActressInfo(e){let t=await this.getRuntimeService("scope")();return this.getRuntimeService("movie").people("fc2ppvdb",{carNum:e},{scope:t})}async getImgList(e){let t=await this.getRuntimeService("scope")();return(await this.getRuntimeService("movie").images("fc2content",{carNum:e},{scope:t})).map((s=>s.url))}async reloadImages(e){try{let t=await this.getImgList(e.carNum);e.isAlive()&&hs(e,t,null)}catch{e.isAlive()&&he(e.root.find('[data-jhs-role="gallery-grid"]'),"剧照加载失败",(()=>{this.reloadImages(e)}))}}render123AvActress(e,t){let s=e.root.find('[data-jhs-role="actors"]').empty().append("主演:");t.actors.length?t.actors.forEach((a=>s.append($("").addClass("jhs-fc2-actor").attr({href:a.url,target:"_blank",rel:"noopener noreferrer"}).text(a.name)))):s.append($("").text("暂无演员信息")),e.root.find('[data-jhs-role="actress-data"]').remove(),e.root.find(".jhs-fc2-summary__body").append($('').text(t.actors.map((a=>a.name)).join(" "))),t.seller&&e.root.find('[data-jhs-role="seller"]').empty().append("卖家:",t.seller.url?$("").attr({href:t.seller.url,target:"_blank",rel:"noopener noreferrer"}).text(t.seller.name):document.createTextNode(t.seller.name))}markDataListHtml(e){let t="";return e.forEach((s=>{let a=Xe(s.url),r=Xe(s.imageUrl);a&&(t+=` - `)})),t}};d(Ei,"Fc2By123AvPlugin");var Ys=Ei;var Dh=Object.freeze({blocked:{id:"filterBtn",tone:"filter",label:Le},favorite:{id:"favoriteBtn",tone:"fav",label:Me},downloaded:{id:"hasDownBtn",tone:"down",label:fe},watched:{id:"hasWatchBtn",tone:"watch",label:ve}});function Mt({actions:o=["blocked","favorite","downloaded","watched"],ids:e={}}={}){let t=globalThis.$,s=t('
      ');s.attr("data-jhs-state-count",String(o.length));for(let a of o){let r=Dh[a];if(!r)continue;let i=t('');i.attr("id",e[a]||r.id).addClass(`jhs-btn--${r.tone}`).find("span").text(r.label),s.children().append(i)}return s}d(Mt,"createStateActions");var gc={blocked:{selector:"#filterBtn",inactive:d(()=>Le,"inactive"),active:d(()=>tt,"active")},favorite:{selector:"#favoriteBtn",inactive:d(()=>Me,"inactive"),active:d(()=>st,"active")},downloaded:{selector:"#hasDownBtn",inactive:d(()=>fe,"inactive"),active:d(()=>"已标记下载","active")},watched:{selector:"#hasWatchBtn",inactive:d(()=>ve,"inactive"),active:d(()=>"已标记观看","active")}};function pc(){return Object.entries(gc)}d(pc,"stateButtonEntries");var Di=class Di{constructor(e){this.stateService=e}bind({root:e=document,closeRoot:t=e,layerIndex:s=null,carNum:a,getRecord:r=null,activityType:i="detail-state",selectors:n={}}){let l={root:e,closeRoot:t,layerIndex:s,carNum:C(a),getRecord:r,activityType:i,selectors:n};for(let[c,h]of pc()){let u=n[c]||h.selector;$(e).find(u).off("click.jhsDetailState").on("click.jhsDetailState",(p=>{p.preventDefault(),p.stopPropagation(),this.requestToggle(l,c,p)}))}return this.render(l),l}async requestToggle(e,t,s=null){if(!e.carNum)return void show.error("番号不可用,无法更新状态");let a=await storageManager.getCar(e.carNum),r=H(a?.stateFlags);return t==="blocked"&&!r.blocked?void utils.q(s,`是否屏蔽${e.carNum}?`,(()=>this.toggle(e,t,s))):this.toggle(e,t,s)}async toggle(e,t,s=null){if(!e.carNum)return void show.error("番号不可用,无法更新状态");let a=e.selectors[t]||gc[t].selector,r=s?.currentTarget?$(s.currentTarget):$(e.root).find(a);if(!r.prop("disabled")){r.prop("disabled",!0).attr("aria-busy","true");try{let i=typeof e.getRecord=="function"?await e.getRecord():e.getRecord||{carNum:e.carNum};await this.stateService.toggle(e.carNum,t,{type:e.activityType,record:i}),await this.render(e),await utils.closePage({layerIndex:e.layerIndex,root:e.closeRoot||e.root})}catch(i){clog.error("详情状态更新失败",i),show.error("操作失败")}finally{r[0]?.isConnected&&r.prop("disabled",!1).removeAttr("aria-busy")}}}async render({root:e=document,carNum:t,selectors:s={}}){let a=await storageManager.getCar(C(t)),r=H(a?.stateFlags);for(let[i,n]of pc()){let l=$(e).find(s[i]||n.selector),c=!!r[i];l.attr("aria-pressed",String(c)).each((h,u)=>$(u).find("span").first().text(c?n.active():n.inactive()))}return r}};d(Di,"DetailStateController");var Bt=Di;var fc="https://jdforrepam.com/api",mc=0,Zs="",ls=new Map;async function vc(){let o=globalThis;if(o.credentialService?.get)return o.credentialService.get("jhs_appAuthorization");let e=localStorage.getItem("jhs_appAuthorization");return e?Xe(e):""}d(vc,"readJavDbToken");function Nh(o){return o&&typeof o=="object"?o:{}}d(Nh,"asResponseRecord");function bc(){let o=Math.floor(Date.now()/1e3);return Zs&&o-mc<=20||(mc=o,Zs=`${o}.lpw6vgqzsp.${md5(`${o}71cf27bb3c0bcdf207b64abecddc970098c7421ee7203b9cdae54478478a199e7d5a6e1a57691123c1a931c057842fb73ba3b3c83bcd69c17ccf174081e3d8aa`)}`),Zs}d(bc,"O");async function wc(o){let e=String(o||"").trim(),t=await vc();if(!t)throw Object.assign(new Error("请先登录 JavDB 账号"),{code:"LOGIN_REQUIRED"});if(!e)throw new Error("JavDB 影片 ID 无效");let s="----jhs-javdb-want-watch",a=[["status","want_watch"],["score","0"],["content",""]].map((([r,i])=>`--${s}\r + `)})),t}};d(Oi,"Fc2By123AvPlugin");var sa=Oi;var Fh=Object.freeze({blocked:{id:"filterBtn",tone:"filter",label:Be},favorite:{id:"favoriteBtn",tone:"fav",label:Oe},downloaded:{id:"hasDownBtn",tone:"down",label:fe},watched:{id:"hasWatchBtn",tone:"watch",label:ve}});function Ot({actions:o=["blocked","favorite","downloaded","watched"],ids:e={}}={}){let t=globalThis.$,s=t('
      ');s.attr("data-jhs-state-count",String(o.length));for(let a of o){let r=Fh[a];if(!r)continue;let i=t('');i.attr("id",e[a]||r.id).addClass(`jhs-btn--${r.tone}`).find("span").text(r.label),s.children().append(i)}return s}d(Ot,"createStateActions");var Sc={blocked:{selector:"#filterBtn",inactive:d(()=>Be,"inactive"),active:d(()=>at,"active")},favorite:{selector:"#favoriteBtn",inactive:d(()=>Oe,"inactive"),active:d(()=>rt,"active")},downloaded:{selector:"#hasDownBtn",inactive:d(()=>fe,"inactive"),active:d(()=>"已标记下载","active")},watched:{selector:"#hasWatchBtn",inactive:d(()=>ve,"inactive"),active:d(()=>"已标记观看","active")}};function jc(){return Object.entries(Sc)}d(jc,"stateButtonEntries");var Ui=class Ui{constructor(e){this.stateService=e}bind({root:e=document,closeRoot:t=e,layerIndex:s=null,carNum:a,getRecord:r=null,activityType:i="detail-state",selectors:n={}}){let l={root:e,closeRoot:t,layerIndex:s,carNum:C(a),getRecord:r,activityType:i,selectors:n};for(let[c,h]of jc()){let u=n[c]||h.selector;$(e).find(u).off("click.jhsDetailState").on("click.jhsDetailState",(p=>{p.preventDefault(),p.stopPropagation(),this.requestToggle(l,c,p)}))}return this.render(l),l}async requestToggle(e,t,s=null){if(!e.carNum)return void show.error("番号不可用,无法更新状态");let a=await storageManager.getCar(e.carNum),r=H(a?.stateFlags);return t==="blocked"&&!r.blocked?void utils.q(s,`是否屏蔽${e.carNum}?`,(()=>this.toggle(e,t,s))):this.toggle(e,t,s)}async toggle(e,t,s=null){if(!e.carNum)return void show.error("番号不可用,无法更新状态");let a=e.selectors[t]||Sc[t].selector,r=s?.currentTarget?$(s.currentTarget):$(e.root).find(a);if(!r.prop("disabled")){r.prop("disabled",!0).attr("aria-busy","true");try{let i=typeof e.getRecord=="function"?await e.getRecord():e.getRecord||{carNum:e.carNum};await this.stateService.toggle(e.carNum,t,{type:e.activityType,record:i}),await this.render(e),await utils.closePage({layerIndex:e.layerIndex,root:e.closeRoot||e.root})}catch(i){clog.error("详情状态更新失败",i),show.error("操作失败")}finally{r[0]?.isConnected&&r.prop("disabled",!1).removeAttr("aria-busy")}}}async render({root:e=document,carNum:t,selectors:s={}}){let a=await storageManager.getCar(C(t)),r=H(a?.stateFlags);for(let[i,n]of jc()){let l=$(e).find(s[i]||n.selector),c=!!r[i];l.attr("aria-pressed",String(c)).each((h,u)=>$(u).find("span").first().text(c?n.active():n.inactive()))}return r}};d(Ui,"DetailStateController");var Ut=Ui;var kc="https://jdforrepam.com/api",xc=0,aa="",us=new Map;async function Cc(){let o=globalThis;if(o.credentialService?.get)return o.credentialService.get("jhs_appAuthorization");let e=localStorage.getItem("jhs_appAuthorization");return e?tt(e):""}d(Cc,"readJavDbToken");function Vh(o){return o&&typeof o=="object"?o:{}}d(Vh,"asResponseRecord");function _c(){let o=Math.floor(Date.now()/1e3);return aa&&o-xc<=20||(xc=o,aa=`${o}.lpw6vgqzsp.${md5(`${o}71cf27bb3c0bcdf207b64abecddc970098c7421ee7203b9cdae54478478a199e7d5a6e1a57691123c1a931c057842fb73ba3b3c83bcd69c17ccf174081e3d8aa`)}`),aa}d(_c,"O");async function $c(o){let e=String(o||"").trim(),t=await Cc();if(!t)throw Object.assign(new Error("请先登录 JavDB 账号"),{code:"LOGIN_REQUIRED"});if(!e)throw new Error("JavDB 影片 ID 无效");let s="----jhs-javdb-want-watch",a=[["status","want_watch"],["score","0"],["content",""]].map((([r,i])=>`--${s}\r Content-Disposition: form-data; name="${r}"\r \r ${i}\r `)).join("")+`--${s}--\r -`;try{let r=await gmHttp.gmRequest("POST",`${fc}/v1/movies/${encodeURIComponent(e)}/reviews`,a,{},{"user-agent":"Dart/3.5 (dart:io)","accept-language":"zh-TW",authorization:`Bearer ${t}`,jdsignature:await bc(),"content-type":`multipart/form-data; boundary=${s}`});if(r?.success===0)throw r;return await storageManager.deleteCachedRequest(`movie-detail:${e}`),ls.set(e,!0),r}catch(r){let i=Nh(r);if(i.status===401||i.action==="JWTVerificationError"||/未登录|登录|unauthorized|jwt/i.test(i.message||"")){let n=globalThis;throw n.credentialService?.remove?await n.credentialService.remove("jhs_appAuthorization"):localStorage.removeItem("jhs_appAuthorization"),Object.assign(new Error("JavDB 登录已失效,请重新登录"),{code:"LOGIN_REQUIRED"})}throw r instanceof Error?r:new Error(i.message||"加入 JavDB 想看失败")}}d(wc,"markJavDbWantWatch");async function yc(o){let e=String(o||"").trim(),t=await vc();if(!t)return null;if(!e)throw new Error("JavDB 影片 ID 无效");if(ls.has(e))return ls.get(e);let s=48;for(let a=1;a<=100;a++){let r=`${fc}/v2/users/review_movies?status=want_watch&type=0&sort_by=create&order_by=desc&page=${a}&limit=${s}`,i=await gmHttp.gmRequest("GET",r,null,{},{"user-agent":"Dart/3.5 (dart:io)","accept-language":"zh-TW",authorization:`Bearer ${t}`,jdsignature:await bc()}),n=i?.data?.movies??i?.movies;if(!Array.isArray(n))throw new Error("JavDB 想看状态响应无效");if(n.some(l=>String(l.id)===e))return ls.set(e,!0),!0;if(n.length
      ',success:d((r,i)=>{$(r).find("#loginBtn").on("click",async()=>{let n=String($(r).find("#username").val()||""),l=String($(r).find("#password").val()||"");if(!n||!l)return void show.error("请输入用户名和密码");let c=loading();try{let h=await e.login("javdb",{username:n,password:l},{scope:await s()});if(!h.success)return void show.error(h.message);if(!t?.set)throw new Error("凭证服务不可用");await t.set("jhs_appAuthorization",h.token),show.ok("登录成功"),o.close(i),await a?.()}catch(h){clog.error("登录异常:",h),show.error(h instanceof Error?h.message:String(h))}finally{c.close()}})},"success"),end:d(()=>{Xs=!1},"end")})}catch(r){throw Xs=!1,r}}d(jc,"openJavDbLoginDialog");async function ea(o){if(o.isActive&&o.isActive()===!1)return;let e=globalThis.$,t=o.root?e(o.root):e(document),s=t.find(".origin-title").first();if(s.length||(s=t.find(".current-title").first()),s.length||(s=t.find("h3").first()),!s.length)return;let a=s.text().trim();if(!a)throw new TypeError("获取标题失败, 无法进行翻译");let r=s.nextAll(".translated-title").first();r.length||(r=e('
      ').insertAfter(s)),r.removeClass("is-error").text("翻译中...");try{let i=await o.translation.translate(a,{cacheAlias:o.carNum,scope:o.scope});if(o.isActive&&!o.isActive()||!s[0]?.isConnected||!r[0]?.isConnected)return;r.text(i)}catch(i){if(o.isActive&&!o.isActive()||!s[0]?.isConnected||!r[0]?.isConnected)return;let n=i instanceof Error?i.message:String(i);globalThis.clog?.error("翻译失败:",i),r.addClass("is-error").text(`翻译失败: ${n}`)}}d(ea,"renderTranslatedTitle");function Lh(o){try{let e=new URL(String(o||""));return e.protocol==="https:"?e.href:null}catch{return null}}d(Lh,"normalizeImageUrl");function Mh(o,e,t){let s=globalThis.$,a=Lh(e);if(!a)return null;let r=s("").attr({src:a,alt:t,loading:"lazy"}).addClass("jhs-fc2-gallery__image"),i=s('').attr("aria-label",`查看${t}大图`).append(r);return o.empty().append(i).off("click.jhsScreenshot").on("click.jhsScreenshot",".jhs-fc2-screenshot-thumbnail",n=>{n.preventDefault(),n.stopPropagation(),globalThis.showImageViewer(r[0])}),a}d(Mh,"renderImage");async function ta(o){let e=globalThis.$,t=e(o.target),s=o.isActive??(()=>!0),a=o.providerId??"javstore";if(!t.length||!o.screenshot.isEnabled(o.settings))return t.empty(),null;let{mode:r}=o.screenshot.getScreenshotSettings(o.settings),i=o.screenshot.getEnabledProviders(o.settings);if(r!=="manual"&&!i.some(u=>u.id===a))return t.empty(),null;if(!i.length)return t.empty().append(e('
      没有可用截图来源
      ')),t;let n=d(async(u=t,p=a)=>{u.empty().append(hc("正在加载缩略图…"));try{let g=await o.screenshot.resolve({carNum:o.carNum},{providerId:p,scope:o.scope,settings:o.settings});if(!s())return null;let m=Array.isArray(g)?g[0]:g;return!m?.url||o.isDuplicate?.(m.url)?(u.empty(),null):Mh(u,m.url,"缩略图")}catch(g){return s()&&(u.empty().append(uc("缩略图加载失败 ",()=>{n(u,p)})),globalThis.clog?.error("缩略图加载失败",g)),null}},"load");if(r!=="manual")return n();let l=e('
      '),c=`jhs-screenshot-result-${String(o.carNum).replace(/[^a-z0-9_-]/gi,"-")}`,h=e('
      ').attr("id",c).text("请选择截图来源");return i.forEach((u,p)=>{let g=e('').attr({"aria-controls":c,tabindex:p===0?"0":"-1"}).text(u.name);g.on("click",async()=>{l.find("[role='tab']").attr({"aria-selected":"false",tabindex:"-1"}),g.attr({"aria-selected":"true",tabindex:"0"}),await n(h,u.id)}),l.append(g)}),l.on("keydown","[role='tab']",(u=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(u.key))return;u.preventDefault();let p=l.find("[role='tab']"),g=p.index(u.currentTarget),m=u.key==="Home"?0:u.key==="End"?p.length-1:u.key==="ArrowRight"?(g+1)%p.length:(g-1+p.length)%p.length;p.eq(m).trigger("focus").trigger("click")})),t.empty().append(l,h),t}d(ta,"renderScreenshotPanel");var Ni=class Ni{constructor(e){this.related=e.related,this.settings=e.settings,this.scope=e.scope}async show(e,t,s={}){let a=globalThis.$,r=s.isActive??(()=>!0);if(!t)throw new TypeError("未传入movieId");if(!r()||!e?.length)return a();let i=e.children('[data-jhs-panel="related"]').filter((b,w)=>a(w).attr("data-jhs-movie-id")===String(t)).first();if(i.length)return i;let n=a('').attr("data-jhs-movie-id",String(t)),l=a('

      相关清单

      '),c=a(''),h=await this.scope(),u=new te(`related:${t}`);if(!r()||h?.disposed)return a();let p=h?.addCleanup?.(()=>u.dispose());s.ownCleanup?.(()=>{u.dispose(),p?.()});let g={movieId:t,panel:n,panelScope:u,floorIndex:1,loaded:!1,loading:!1,page:1,enabled:!1,generation:0,isActive:d(()=>!u.disposed&&r(),"isActive"),requestScope:null};l.append(c),s.ownedSection?s.ownedSection.find('[data-jhs-section-actions="related"]').first().append(c):n.append(l),n.append('',''),e.append(n);let m=(this.settings.snapshot().enableLoadRelated??"no")==="yes",f=d(b=>{if(!g.isActive())return;let w=b==="yes";if(g.enabled!==w&&(g.enabled=w,g.generation++,w||(g.requestScope?.dispose(),g.loading=!1)),this.updateToggle(c,w),n.find(".jhs-related-container, .jhs-related-footer").toggle(w),g.loading||n.find(".jhs-related-load-more").prop("disabled",!1).text("加载更多清单"),w&&!g.loaded&&!g.loading)return this.fetch(g)},"applyExpanded");this.settings.addEventListener&&u.listen(this.settings,"settings.changed",b=>{b.detail?.names?.includes("enableLoadRelated")&&f(this.settings.snapshot().enableLoadRelated??"no")});let v=Ve({settings:this.settings,key:"enableLoadRelated",fallback:"no",apply:d(b=>{f(b)},"apply"),onError:d(b=>{globalThis.clog?.error("相关清单展开设置保存失败,已恢复",b),globalThis.show?.error?.("相关清单展开设置保存失败,已恢复原设置")},"onError")});return c.on("click",b=>{b.preventDefault(),b.stopPropagation(),v(g.enabled?"no":"yes")}),u.addCleanup(()=>{g.requestScope?.dispose(),c.off("click"),n.find("button").off("click")}),await f(m?"yes":"no"),n}updateToggle(e,t){e.attr("aria-expanded",String(t)),e.find(".toggle-text").text(t?"折叠":"展开"),e.find(".toggle-icon").text(t?"▲":"▼")}async fetch(e){if(e.loading||!e.enabled||!e.isActive())return;e.loading=!0;let t=e.panel.find(".jhs-related-container"),s=e.panel.find(".jhs-related-footer");t.empty().append(globalThis.$("
      ").addClass("jhs-panel-state").text("获取清单中...")),s.empty();let a=e.generation,r=new te(`related:${e.movieId}:page:1`),i=e.panelScope.addCleanup(()=>r.dispose());e.requestScope=r;try{let n=await this.related.list({movieId:e.movieId},{page:1,limit:20,scope:r});if(!e.isActive()||r.signal.aborted||a!==e.generation||!e.enabled)return;if(e.loading=!1,e.loaded=!0,t.empty(),!n.length)return void t.append(globalThis.$("
      ").addClass("jhs-panel-state").text("无清单"));this.display(e,n,t),n.length===20?this.bindLoadMore(e,t,s):s.append(globalThis.$("
      ").addClass("jhs-panel-end").text("已加载全部清单"))}catch(n){if(a===e.generation&&(e.loading=!1),!e.isActive()||r.signal.aborted||a!==e.generation||!e.enabled)return;globalThis.clog?.error("获取清单失败:",n),this.renderRetry(t,()=>{this.fetch(e)})}finally{i(),e.requestScope===r&&(e.requestScope=null)}}renderRetry(e,t){let s=globalThis.$;e.empty().append(s('
      ').append(document.createTextNode("获取清单失败 "),s('').on("click",t)))}bindLoadMore(e,t,s){let a=globalThis.$,r=a(''),i=a('').hide();s.empty().append(r,i),r.on("click",async()=>{if(!e.enabled||!e.isActive()||e.loading)return;let n=e.page+1,l=e.generation,c=new te(`related:${e.movieId}:page:${n}`),h=e.panelScope.addCleanup(()=>c.dispose());e.loading=!0,e.requestScope=c,r.text("加载中...").prop("disabled",!0);try{let u=await this.related.list({movieId:e.movieId},{page:n,limit:20,scope:c});if(!e.isActive()||c.signal.aborted||l!==e.generation||!e.enabled)return;e.page=n,this.display(e,u,t),u.length<20?(r.remove(),i.show()):r.text("加载更多清单").prop("disabled",!1)}catch(u){if(!e.isActive()||c.signal.aborted||l!==e.generation||!e.enabled)return;globalThis.clog?.error("加载更多清单失败:",u),r.text("加载失败,请重试").prop("disabled",!1)}finally{h(),l===e.generation&&(e.loading=!1),e.requestScope===c&&(e.requestScope=null)}})}display(e,t,s){let a=globalThis.$;t.forEach(r=>{let i=a("").addClass("jhs-related-title").attr({href:`/lists/${encodeURIComponent(r.id)}`,target:"_blank",rel:"noopener noreferrer"}).text(r.name||"未命名清单"),n=a('').append(a("").addClass("jhs-related-index").text(`#${e.floorIndex++}`),i),l=a(''),c=r.createdAt?globalThis.utils.formatDate(r.createdAt):"未知";l.append(a("").text(`视频:${Number(r.movieCount)||0}`),a("").text(`收藏:${Number(r.collectionCount)||0}`),a("").text(`查看:${Number(r.viewCount)||0}`),a('').text(`创建时间:${c}`)),s.append(a('').append(n,l))})}};d(Ni,"RelatedPanel");var Ot=Ni;var Li=class Li{constructor(e){this.review=e.review,this.settings=e.settings,this.storage=e.storage,this.scope=e.scope}async show(e,t,s={}){let a=globalThis.$,r=s.isActive??(()=>!0);if(!r()||!t?.length)return a();let i=t.children('[data-jhs-panel="reviews"]').filter((b,w)=>a(w).attr("data-jhs-movie-id")===String(e)).first();if(i.length)return i;let n=a('
      ').attr("data-jhs-movie-id",String(e)),l=a('

      评论

      '),c=a(''),h=await this.scope(),u=new te(`reviews:${e}`);if(!r()||h?.disposed)return a();let p=h?.addCleanup?.(()=>u.dispose());s.ownCleanup?.(()=>{u.dispose(),p?.()});let g={movieId:e,panel:n,panelScope:u,floorIndex:1,loaded:!1,loading:!1,page:1,enabled:!1,generation:0,isActive:d(()=>!u.disposed&&r(),"isActive"),requestScope:null};l.append(c),s.ownedSection?s.ownedSection.find('[data-jhs-section-actions="reviews"]').first().append(c):n.append(l),n.append('
      ',''),t.append(n),this.bindFilter(n);let m=(this.settings.snapshot().enableLoadReview??"yes")==="yes",f=d(b=>{if(!g.isActive())return;let w=b==="yes";if(g.enabled!==w&&(g.enabled=w,g.generation++,w||(g.requestScope?.dispose(),g.loading=!1)),this.updateToggle(c,w),n.find(".jhs-review-container, .jhs-review-footer").toggle(w),n.find(".jhs-review-load-more").prop("disabled",!1).text("加载更多评论"),w&&!g.loaded&&!g.loading)return this.fetch(g)},"applyExpanded");this.settings.addEventListener&&u.listen(this.settings,"settings.changed",b=>{b.detail?.names?.includes("enableLoadReview")&&f(this.settings.snapshot().enableLoadReview??"yes")});let v=Ve({settings:this.settings,key:"enableLoadReview",fallback:"yes",apply:d(b=>{f(b)},"apply"),onError:d(b=>{globalThis.clog?.error("评论面板展开设置保存失败,已恢复",b),globalThis.show?.error?.("评论面板展开设置保存失败,已恢复原设置")},"onError")});return c.on("click",b=>{b.preventDefault(),b.stopPropagation();let S=c.find(".toggle-text").text()==="展开"?"yes":"no";v(S)}),u.addCleanup(()=>{g.requestScope?.dispose(),c.off("click"),n.off("contextmenu.jhsReviewFilter")}),await f(m?"yes":"no"),n}updateToggle(e,t){e.attr("aria-expanded",String(t)),e.find(".toggle-text").text(t?"折叠":"展开"),e.find(".toggle-icon").text(t?"▲":"▼")}async fetch(e){if(e.loading||!e.enabled||!e.isActive())return;let t=globalThis.$,s=e.panel.find(".jhs-review-container"),a=e.panel.find(".jhs-review-footer");e.loading=!0,s.empty().append(t('
      ').text("获取评论中...")),a.empty();let r=Number(this.settings.snapshot().reviewCount)||20,i=e.generation,n=new te(`reviews:${e.movieId}:page:1`),l=e.panelScope.addCleanup(()=>n.dispose());e.requestScope=n;try{let c=await this.review.list({movieId:e.movieId},{page:1,limit:r,scope:n});if(!e.isActive()||n.signal.aborted||i!==e.generation||!e.enabled)return;let h=await this.getKeywords();if(!e.isActive()||n.signal.aborted||i!==e.generation||!e.enabled)return;if(e.loading=!1,e.loaded=!0,s.empty(),!c.length)return void s.append(t('
      ').text("无评论"));await this.display(e,c,s,h),c.length===r?this.bindLoadMore(e,r,h,s,a):a.append(t('
      ').text("已加载全部评论"))}catch(c){if(i===e.generation&&(e.loading=!1),!e.isActive()||n?.signal?.aborted)return;globalThis.clog?.error("获取评论失败:",c),this.renderRetry(s,"获取评论失败",()=>{this.fetch(e)})}finally{l(),e.requestScope===n&&(e.requestScope=null)}}async getKeywords(){return Kt(this.storage)}async saveKeyword(e){await Kt(this.storage,e)}renderRetry(e,t,s){let a=globalThis.$;e.empty().append(a('
      ').append(document.createTextNode(`${t} `),a('').on("click",s)))}bindLoadMore(e,t,s,a,r){let i=globalThis.$,n=i(''),l=i('
      已加载全部评论
      ').hide();r.empty().append(n,l),n.on("click",async()=>{if(!e.enabled||!e.isActive()||e.loading)return;let c=e.page+1,h=e.generation,u=new te(`reviews:${e.movieId}:page:${c}`),p=e.panelScope.addCleanup(()=>u.dispose());e.requestScope=u,e.loading=!0,n.text("加载中...").prop("disabled",!0);try{let g=await this.review.list({movieId:e.movieId},{page:c,limit:t,scope:u});if(!e.isActive()||u.signal.aborted||h!==e.generation||!e.enabled)return;e.page=c,await this.display(e,g,a,s),g.lengthn.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")):null;for(let n of t){let l=String(n.content||"");if(i?.test(l))continue;let c=r('
      '),h=r('
      '),u=r('
      ');h.append(r("").addClass("jhs-review-author").text(n.author||"匿名用户"));let p=r(''),g=Math.max(0,Math.min(5,Number(n.score)||0));for(let f=0;f');let m=globalThis.utils.formatDate(n.createdAt);h.append(p,r("").text(m),r("").text(`点赞:${Number(n.likes)||0}`),r("").addClass("jhs-review-floor").text(`#${e.floorIndex++}楼`)),this.appendContent(u,l),c.append(h,u),s.append(c)}}appendContent(e,t){let s=/ed2k:\/\/\|file\|[^|]+\|\d+\|[a-fA-F0-9]{32}\|\/|magnet:\?[^\s"'<>`,;\u4e00-\u9fa5,。?!()【】]+|https?:\/\/[^\s"'<>`,;\u4e00-\u9fa5,。?!()【】]+/g,a=0,r;for(;r=s.exec(t);)r.index>a&&e.append(document.createTextNode(t.slice(a,r.index))),this.appendLink(e,r[0]),a=r.index+r[0].length;a':''),c=s(''),h=a?s('').text(i).on("click",()=>globalThis.utils.copyToClipboard(i,t)):s("").addClass("jhs-review-link").attr({href:t,target:"_blank",rel:"noopener noreferrer"}).text(i),u=s('').on("click",()=>globalThis.utils.copyToClipboard(i,t));c.append(h,u),l.append(c),n&&l.append(s('').append(s('').attr("data-resource",t))),e.append(l)}bindFilter(e){e.off("contextmenu.jhsReviewFilter",".review-content").on("contextmenu.jhsReviewFilter",".review-content",async t=>{if((this.settings.snapshot().enableTitleSelectFilter??"yes")!=="yes")return;let s=String(window.getSelection()?.toString()||"");s&&(t.preventDefault(),await globalThis.utils.q(t,`是否将 '${T(s)}' 加入评论区关键词?`,async()=>{await this.saveKeyword(s),globalThis.show.ok("操作成功, 刷新页面后生效")}))})}};d(Li,"ReviewPanel");var Ut=Li;function Bh(o,e="other"){if(!o||typeof o!="object"||Array.isArray(o))return null;let t=o,s=C(t.carNum);return s?Object.freeze({...t,carNum:s,movieId:typeof t.movieId=="string"&&t.movieId.trim()?t.movieId.trim():t.movieId??null,surface:t.surface||e}):null}d(Bh,"normalizeWorkspaceMovieContext");function Sc({carNum:o="",source:e="fc2",mode:t="dialog"}={}){let s=$('
      ').attr({"data-jhs-fc2-source":e,"data-jhs-fc2-mode":t,"data-jhs-car-num":C(o)||""});return[["summary","影片概览"],["gallery","预览与剧照"],["resources","资源"],["reviews","评论"],["related","相关清单"]].forEach((([r,i])=>{let n=$('
      ').attr("data-jhs-section",r),l=$('
      '),c=$("

      ").text(i),h=$('
      ').attr("data-jhs-section-actions",r);n.append(l.append(c,h),$('
      ').attr("data-jhs-slot",r)),s.append(n)})),s}d(Sc,"createFc2DetailShell");function xc(o,e={}){let t=$(o).is(".jhs-fc2-workspace")?$(o):$(o).find(".jhs-fc2-workspace").first(),s=!1,a=`.jhsFc2Detail${Date.now()}${Math.random().toString(36).slice(2)}`,r=new Set,i=e.mode==="dialog"?"fc2-dialog":"native-detail",n=Bh({...e,carNum:e.carNum||t.attr("data-jhs-car-num"),detailUrl:e.url,surface:i},i),l={...e,movieContext:n,root:t,workspace:t,namespace:a,observers:r,getSlot:d(c=>t.find(`[data-jhs-slot="${c}"]`).first(),"getSlot"),getSection:d(c=>t.find(`[data-jhs-section="${c}"]`).first(),"getSection"),isAlive:d(()=>!s&&t[0]?.isConnected!==!1,"isAlive"),addObserver(c){return c&&r.add(c),c},destroy(){s||(s=!0,t.off(a).find("*").off(a),r.forEach((c=>c.disconnect?.())),r.clear(),t.removeData("jhsFc2Context"))}};return t.data("jhsFc2Context",l).attr("data-jhs-surface",i),n&&t.data("jhsMovieContext",n),l}d(xc,"createFc2DetailContext");function Oh(o){return dl(o,window.location.origin)}d(Oh,"parseExplicitJavDbMovieId");var Mi=class Mi extends I{constructor(){super(...arguments),this.detailStateController=null,this.translationGeneration=0}getName(){return"Fc2Plugin"}getDetailStateController(){return this.detailStateController||(this.detailStateController=new Bt(this.getRuntimeService("state")))}async resolveMovieId(e){let t=await this.getRuntimeService("scope")();return(await this.getRuntimeService("movie").resolve({carNum:e},{scope:t}))?.movieId||null}async resolveMovieIdForRecord(e,t=""){return Oh(t)||this.resolveMovieId(e)}async initCss(){return``}async handle(){if(!X.includes("collection_codes?movieId"))return;let e=new URLSearchParams(window.location.search),t=e.get("movieId"),s=e.get("carNum"),a=e.get("url"),r=e.get("source"),i=$("section").first().empty();if(!s||!a)return void i.append($('
      ').text("FC2 详情参数不完整"));let n=t&&t!=="search"?t:await this.resolveMovieIdForRecord(s,a),l=["fc2","123av"].includes(r||"")?r:await this.resolveFc2Source({url:a}),c=this.mountFc2Detail(i,{movieId:n,carNum:s,url:a,source:l,mode:"page"});$(window).off("pagehide.jhsFc2Detail").one("pagehide.jhsFc2Detail",(()=>c.destroy()))}openFc2Dialog(e,t,s,{source:a=""}={}){a=["fc2","123av"].includes(a)?a:"";let r=null;return this.getRuntimeService("dialog").open({type:1,title:t,content:'
      ',ui:{size:"workspace",body:"scroll"},area:utils.getDialogArea("workspace"),skin:"movie-detail-layer",scrollbar:!1,shadeClose:!0,success:d((i,n)=>{r=this.mountFc2Detail($(i).find(".jhs-fc2-dialog-host"),{movieId:e,carNum:t,url:s,source:a,layerIndex:n,mode:"dialog"}),utils.setupEscClose(n)},"success"),end:d(()=>r?.destroy(),"end")})}mountFc2Detail(e,t){let s=$(e);s.data("jhsFc2Context")?.destroy?.(),s.empty();let r=Sc(t).appendTo(s),i=xc(r,t);return s.data("jhsFc2Context",i),i.translationGeneration=0,i.screenshotGeneration=0,i.otherSiteGeneration=0,this.initializeWorkspace(i),this.bindFc2FeatureLifecycle(i),i}initializeWorkspace(e){let t=$('
      正在加载影片信息…
      '),s=$('');s.append(Mt()),s.append('','',''),t.find(".jhs-fc2-summary__body").append(s),e.getSlot("summary").append(t);let a=$(''),r=$('
      ');a.on(`click${e.namespace}`,".jhs-fc2-gallery-item",(f=>{let v=$(f.currentTarget).find("img")[0];v&&globalThis.showImageViewer(v,"",{galleryRoot:a[0]})})),e.getSlot("gallery").append(a,r);let i=$('
      '),n=this.createResourceGroup("站内磁力","native-magnets"),l=this.createResourceGroup("第三方站点","other-sites"),c=this.createResourceGroup("更多磁力来源","magnet-hub"),h=$(''),u=null;c.find('[data-jhs-role="magnet-hub"]').append(h,'
      '),i.append(n,l,c),e.getSlot("resources").append(i),s.on(`click${e.namespace}`,'[data-jhs-action="subtitlecat"]',(f=>{let v=this.getRuntimeService("movie").sourceUrls({carNum:e.carNum},["subtitlecat"])[0]?.url;v&&utils.openPage(v,e.carNum,!1,f)}));let p=this.getOptionalDependency("DetailPageButtonPlugin");p?s.on(`click${e.namespace}`,'[data-jhs-action="xunlei"]',(()=>p.searchXunLeiSubtitle(e.carNum))):s.find('[data-jhs-action="xunlei"]').remove();let g=this.getOptionalDependency("MagnetHubPlugin");g||c.remove(),h.on(`click${e.namespace}`,(async()=>{if(!g||!e.isAlive())return;let f=c.find('[data-jhs-role="magnet-hub-content"]');if(h.attr("aria-expanded")==="true")return c.addClass("is-collapsed"),void h.attr("aria-expanded","false").text("展开磁力搜索");u||(u=g.createMagnetHub({movieContext:e.movieContext,root:e.root}));let b=await u;e.isAlive()&&!f.children().length&&f.append(b),e.isAlive()&&(c.removeClass("is-collapsed"),h.attr("aria-expanded","true").text("收起磁力搜索"),f[0]?.scrollIntoView?.({block:"nearest"}))})),this.getDetailStateController().bind({root:e.root,layerIndex:e.layerIndex??null,carNum:e.carNum,activityType:"fc2-state",getRecord:d(()=>({carNum:e.carNum,url:e.url,fc2Source:e.source,names:e.root.find('[data-jhs-role="actress-data"]').text(),publishTime:e.root.find('[data-jhs-role="publish-time"]').text()}),"getRecord")}),e.source==="123av"?this.load123AvDetail(e):this.loadNativeDetail(e);let m=this.getOptionalDependency("FilterTitleKeywordPlugin");m&&Promise.resolve().then((()=>m.bindDetailRoot(e.root,{layerIndex:e.layerIndex??null}))).catch((f=>clog.error("FC2 关键词过滤初始化失败",f))),this.mountFc2OtherSites(e,l,this.getOptionalDependency("OtherSitePlugin")),this.loadFc2Screenshot(e)}bindFc2FeatureLifecycle(e){let t=this.getRuntimeService("settings"),s=d(a=>{let r=a.detail?.names;if(r?.length&&(r.includes("enableLoadScreenShot")&&(t.snapshot().enableLoadScreenShot==="no"?(e.screenshotGeneration=(e.screenshotGeneration||0)+1,this.unmountFc2Screenshot(e)):this.loadFc2Screenshot(e)),r.includes("translateTitle")&&((t.snapshot().translateTitle??E)===E?this.applyFc2Translation(e):(e.translationGeneration=(e.translationGeneration||0)+1,this.revertFc2Translation(e))),r.includes("enableMagnetsFilter")&&e.magnetFilterApply?.((t.snapshot().enableMagnetsFilter??E)===E),r.includes("enableLoadOtherSite"))){let i=e.getSection("resources").find('[data-jhs-role="other-sites"]').closest(".jhs-fc2-resource-group");t.snapshot().enableLoadOtherSite==="no"?(e.otherSiteGeneration=(e.otherSiteGeneration||0)+1,this.unmountFc2OtherSites(e,i)):this.mountFc2OtherSites(e,i,this.getOptionalDependency("OtherSitePlugin"))}},"handler");t.addEventListener("settings.changed",s),e.addObserver({disconnect:d(()=>t.removeEventListener("settings.changed",s),"disconnect")})}loadFc2Screenshot(e){let t=this.getRuntimeService("screenshot"),s=this.getRuntimeService("settings"),a=e.root.find('[data-jhs-role="screenshot"]');if(!t.isEnabled(s.snapshot()))return void a.empty();let r=(e.screenshotGeneration||0)+1;e.screenshotGeneration=r,Promise.resolve().then((()=>this.getRuntimeService("scope")())).then(i=>ta({target:a,carNum:e.carNum.replace("FC2-",""),screenshot:t,settings:s.snapshot(),scope:i,isActive:d(()=>e.isAlive()&&s.snapshot().enableLoadScreenShot!=="no"&&r===e.screenshotGeneration,"isActive"),isDuplicate:d(n=>!!e.galleryUrls?.has(n),"isDuplicate")})).then(i=>{if(!(!e.isAlive()||r!==e.screenshotGeneration)&&s.snapshot().enableLoadScreenShot==="no")return void a.empty()}).catch(i=>{!e.isAlive()||r!==e.screenshotGeneration||(a.empty(),clog.error("FC2 剧照初始化失败",i))})}unmountFc2Screenshot(e){e.screenshotGeneration=(e.screenshotGeneration||0)+1,e.root.find('[data-jhs-role="screenshot"]').empty()}applyFc2Translation(e){let t=this.getRuntimeService("settings");if(!e.isAlive()||(t.snapshot().translateTitle??E)!==E)return;let s=(e.translationGeneration||0)+1;e.translationGeneration=s,Promise.resolve().then((()=>this.getRuntimeService("scope")())).then(a=>ea({root:e.root,carNum:e.carNum,translation:this.getRuntimeService("translation"),scope:a,isActive:d(()=>e.isAlive()&&(t.snapshot().translateTitle??E)===E&&s===e.translationGeneration,"isActive")})).catch((a=>clog.error("FC2 标题翻译失败",a)))}revertFc2Translation(e){e.root.find(".translated-title").remove()}mountFc2OtherSites(e,t,s){if(!s)return void t.remove();let a=this.getRuntimeService("settings"),r=(e.otherSiteGeneration||0)+1;e.otherSiteGeneration=r,t.length&&t.show(),Promise.resolve().then((()=>s.loadOtherSite(e.carNum.replace("FC2-",""),e.carNum,{root:e.root,target:t.find('[data-jhs-role="other-sites"]'),autoDetect:!1,isActive:d(()=>e.isAlive()&&a.snapshot().enableLoadOtherSite!=="no"&&r===e.otherSiteGeneration,"isActive")}))).then(i=>{!e.isAlive()||r!==e.otherSiteGeneration||(i?t.show():t.hide())}).catch(i=>{!e.isAlive()||r!==e.otherSiteGeneration||(t.show(),he(e.root.find('[data-jhs-role="other-sites"]'),"外部站点加载失败"),clog.error("FC2 外部站点加载失败",i))})}unmountFc2OtherSites(e,t){e.otherSiteGeneration=(e.otherSiteGeneration||0)+1,e.root.find("[data-jhs-other-site-box],[data-jhs-other-site-settings]").remove(),t.length&&t.hide()}createResourceGroup(e,t){return $('

      ').find("h3").text(e).end().find("div").attr("data-jhs-role",t).end()}async loadNativeDetail(e){let t=Promise.resolve(e.movieId);this.configureJavDbWantButton(e,t),await Promise.allSettled([this.fetchAndRenderNativeDetail(e),this.fetchAndRenderNativeMagnets(e),this.mountPanels(e,t)]),e.isAlive()&&this.applyFc2Translation(e)}async load123AvDetail(e){let t=this.getOptionalDependency("Fc2By123AvPlugin");if(!t)return void he(e.getSlot("summary"),"123AV 详情功能已禁用");let s=t.resolveMovieId(e.carNum);this.configureJavDbWantButton(e,s),this.mountPanels(e,s),s.then((a=>{if(e.isAlive())return this.fetchAndRenderNativeMagnets(e,a)})).catch((a=>{e.isAlive()&&he(e.root.find('[data-jhs-role="native-magnets"]'),"站内磁力关联失败",(()=>{this.load123AvMagnets(e)})),clog.error("123AV 磁力关联失败",a)})),await t.loadDetail(e,e.url),e.isAlive()&&this.applyFc2Translation(e)}async load123AvMagnets(e){let t=this.getOptionalDependency("Fc2By123AvPlugin");if(!t)throw new Error("123AV 详情功能已禁用");let s=await t.resolveMovieId(e.carNum);return this.fetchAndRenderNativeMagnets(e,s)}async configureJavDbWantButton(e,t){let s=e.root.find('[data-jhs-action="javdb-want"]');try{let a=await t;if(!e.isAlive())return;if(!a)return void s.prop("disabled",!0).text("JavDB 暂无对应作品");try{let r=await yc(a);if(!e.isAlive())return;if(r)return void s.prop("disabled",!0).attr("aria-pressed","true").text("已在 JavDB 想看")}catch(r){clog.warn("读取 JavDB 想看状态失败,保留手动操作",r)}s.prop("disabled",!1).text("JavDB 想看").off(`click${e.namespace}`).on(`click${e.namespace}`,(()=>{this.submitJavDbWant(e,a,s)}))}catch(a){e.isAlive()&&s.prop("disabled",!1).text("JavDB 关联失败,重试").off(`click${e.namespace}`).on(`click${e.namespace}`,(()=>{this.configureJavDbWantButton(e,this.resolveMovieId(e.carNum))})),clog.error("FC2 JavDB 想看关联失败",a)}}async submitJavDbWant(e,t,s){if(!(!e.isAlive()||s.data("jhsBusy")||s.attr("aria-pressed")==="true")){s.data("jhsBusy",!0).attr({"aria-busy":"true","aria-disabled":"true"}).text("正在加入想看…");try{if(await wc(t),!e.isAlive())return;s.attr({"aria-pressed":"true","aria-disabled":"false"}).text("已加入 JavDB 想看"),show.ok("已加入 JavDB 想看")}catch(a){if(!e.isAlive())return;let r=a;if(r?.code==="LOGIN_REQUIRED")return s.attr("aria-disabled","false").text("JavDB 想看"),jc({dialog:this.getRuntimeService("dialog"),account:this.getRuntimeService("account"),credential:this.getRuntimeService("credential"),getScope:this.getRuntimeService("scope"),onSuccess:d(()=>this.submitJavDbWant(e,t,s),"onSuccess")});s.attr("aria-disabled","false").text("JavDB 想看"),show.error(r?.message||"加入 JavDB 想看失败"),clog.error("加入 JavDB 想看失败",a)}finally{e.isAlive()&&s.removeData("jhsBusy").removeAttr("aria-busy")}}}async fetchAndRenderNativeDetail(e){try{let t=await this.getRuntimeService("scope")(),s=await this.getRuntimeService("movie").detail({movieId:e.movieId,carNum:e.carNum,providerId:"javdb"},{scope:t});if(!s)throw new Error("JavDB 影片详情不存在");if(!e.isAlive())return;this.renderSummary(e,s),os(e,s.imageUrls||[],s.coverUrl||null)}catch(t){e.isAlive()&&he(e.root.find('[data-jhs-role="summary-content"]'),"影片信息加载失败",(()=>{this.fetchAndRenderNativeDetail(e)})),clog.error("FC2 详情加载失败",t)}}renderSummary(e,t){let s=e.root.find('[data-jhs-role="summary-content"]').empty(),a=$('

      ');a.find("strong").text(t.title||"无标题"),s.append(a),t.originalTitle&&t.originalTitle!==t.title&&s.append($('
      ').text(t.originalTitle));let r=$('
      ');[`番号:${t.carNum||e.carNum}`,`发行:${t.releaseDate||"未知"}`,`评分:${Number.isFinite(Number(t.score))?t.score:"无"}`,`时长:${Number.isFinite(Number(t.duration))?t.duration+" 分钟":"无"}`].forEach((l=>r.append($("").text(l)))),s.append(r);let i=[],n=$('
      主演:
      ');(t.actors||[]).forEach((l=>{n.append($("").addClass("jhs-fc2-actor").attr({href:`/actors/${encodeURIComponent(l.id)}`,target:"_blank",rel:"noopener noreferrer"}).text(l.name||"未知演员")),l.gender===0&&i.push(l.name)})),t.actors?.length||n.append($("").text("暂无演员信息")),s.append(n,Qs(e,this.getRuntimeService("movie")),$('').text(i.join(" ")),$('').text(t.releaseDate||""))}async fetchAndRenderNativeMagnets(e,t=e.movieId){let s=e.root.find('[data-jhs-role="native-magnets"]');he(s,"正在加载站内磁力…");try{if(!t)return he(s,"JavDB 暂无对应作品");let a=await this.getRuntimeService("scope")(),r=await this.getRuntimeService("magnet").listNative({movieId:t,providerId:"javdb"},{scope:a});if(!e.isAlive())return;if(s.empty(),!r.length)return he(s,"暂无站内磁力");let i=[],n=this.getRuntimeService("magnet");r.forEach((l=>{let c=yl(l.hash);if(!c)return;let h=`magnet:?xt=urn:btih:${c}`,u=n.assess({title:l.title,hasHdTag:l.hasHdTag,hasSubtitleTag:l.hasSubtitleTag,date:l.createdAt,seeders:l.seeders}),p=$('
      ').attr("data-jhs-high-quality",String(u.highQuality)),g=$('
      '),m=$('
      '),f=$('
      ');i.push(u),f.append($("").addClass("jhs-badge").attr("title",`磁力质量评分 ${u.score.total}`).text(`${u.grade} ${u.score.total}`)),l.hasHdTag&&f.append('高清'),l.hasSubtitleTag&&f.append('字幕'),g.append($("").attr("href",h).text(l.title||h),$("
      ").addClass("jhs-fc2-meta").text(`${(Number(l.sizeMb||0)/1024).toFixed(2)} GB · ${Number(l.fileCount)||0} 个文件${l.createdAt?` · ${l.createdAt}`:""}`),f),m.append($('').attr("data-clipboard-text",h),$('').attr({"data-resource":h,"data-jhs-offline-owner":"fc2"})),s.append(p.append(g,m))})),await this.bindNativeMagnetFilter(e,s,i.some((l=>l.highQuality)))}catch(a){e.isAlive()&&he(s,"站内磁力加载失败",(()=>{this.fetchAndRenderNativeMagnets(e,t)})),clog.error("FC2 磁力加载失败",a)}}async bindNativeMagnetFilter(e,t,s){let a=e.getSection("resources"),r=a.find(".jhs-fc2-section__actions");r.find('[data-jhs-action="filter-native-magnets"]').remove();let n=$(''),l=d(u=>{t.find(".jhs-fc2-magnet-item").show(),u&&s&&t.find('.jhs-fc2-magnet-item[data-jhs-high-quality="false"]').hide(),n.attr("aria-pressed",String(u&&s)).text(s?u?"显示全部磁力":"过滤低质量":"暂无可过滤项").prop("disabled",!s)},"apply"),c=this.getRuntimeService("settings"),h=Ve({settings:c,key:"enableMagnetsFilter",fallback:"no",apply:d(u=>l(u===E),"apply"),onError:d(u=>{clog.error("磁力过滤设置保存失败,已恢复",u),show.error("磁力过滤设置保存失败,已恢复原设置")},"onError")});e.magnetFilterApply=l,r.append(n),l((c.snapshot().enableMagnetsFilter??E)===E),n.on(`click${e.namespace}`,(async()=>{let u=n.attr("aria-pressed")!=="true";await h(u?E:"no")}))}async mountPanels(e,t){try{let s=await t;if(!e.isAlive())return;if(!s)return this.clearOwnedPanel(e,"reviews"),this.clearOwnedPanel(e,"related"),he(e.getSlot("reviews"),"JavDB 暂无对应作品"),he(e.getSlot("related"),"JavDB 暂无对应作品");this.clearOwnedPanel(e,"reviews"),this.clearOwnedPanel(e,"related");let a=d(()=>this.getRuntimeService("scope")(),"scope"),r=new Ot({related:this.getRuntimeService("related"),settings:this.getRuntimeService("settings"),scope:a}),i=new Ut({review:this.getRuntimeService("review"),settings:this.getRuntimeService("settings"),storage:this.getRuntimeService("storage"),scope:a});await Promise.allSettled([i.show(s,e.getSlot("reviews"),{ownedSection:e.getSection("reviews"),isActive:e.isAlive,ownCleanup:d(n=>e.addObserver({disconnect:n}),"ownCleanup")}),r.show(e.getSlot("related"),s,{ownedSection:e.getSection("related"),isActive:e.isAlive,ownCleanup:d(n=>e.addObserver({disconnect:n}),"ownCleanup")})])}catch(s){if(!e.isAlive())return;this.clearOwnedPanel(e,"reviews"),this.clearOwnedPanel(e,"related");let a=d(()=>{this.mountPanels(e,this.resolveMovieId(e.carNum))},"retry");he(e.getSlot("reviews"),"评论关联失败",a),he(e.getSlot("related"),"相关清单关联失败",a),clog.error("FC2 JavDB 关联失败",s)}}clearOwnedPanel(e,t){e.getSlot(t).empty(),e.getSection(t).find(".jhs-fc2-section__actions").empty()}async resolveFc2Source(e={}){if(e.fc2Source&&["fc2","123av"].includes(e.fc2Source))return e.fc2Source;try{let t=new URL(e.url||"",window.location.origin);return this.getRuntimeService("movie").matchesProviderUrl("av123",t.href)?"123av":t.origin===window.location.origin?"fc2":""}catch{return""}}createFc2PageUrl(e,t,s,{source:a=""}={}){if(!String(e||"").trim())throw new TypeError("FC2 owned detail requires movieId");let r=new URL("/users/collection_codes",window.location.origin);return r.searchParams.set("movieId",String(e).trim()),r.searchParams.set("carNum",t),r.searchParams.set("url",s),r.searchParams.set("source",a),r.href}async openFc2Page(e,t,s,a={newTab:!0},{source:r=""}={}){r=["fc2","123av"].includes(r)?r:"";let i=String(e||"").trim();if(!i)return void utils.openPage(s,t,!0,a);utils.openPage(this.createFc2PageUrl(i,t,s,{source:r}),t,!0,a)}};d(Mi,"Fc2Plugin");var sa=Mi;var Bi=class Bi extends I{getName(){return"HitShowPlugin"}async handle(){let e=je(window.location);if(e.kind!=="playback-ranking")return;let t=this.getRuntimeService("host").locateListRoot?.();t&&(t.setAttribute("data-jhs-ranking","playback"),t.setAttribute("data-jhs-ranking-period",e.period),t.setAttribute("data-jhs-ranking-filter",e.filter))}};d(Bi,"HitShowPlugin");var aa=Bi;var Oi=class Oi extends I{getName(){return"JavTrailersPlugin"}constructor(){super(),this.hasBand=!1}async handle(){let e=window.location.href;if(!e.includes("handle=1"))return;if($("h1:contains('Page not found')").length){clog.log("番号无法匹配, 跳搜索");let a=e.split("?")[0].split("video/")[1].toLowerCase().replace("00","-");return void(window.location.href="/search/"+encodeURIComponent(a)+window.location.search)}let t=$(".videos-list .video-link").toArray();if(t.length){let a=e.split("?")[0].split("search/")[1].toLowerCase(),r=t.find((i=>$(i).find(".vid-title").text().toLowerCase().includes(a)));if(r)return void(window.location.href=$(r).attr("href")+window.location.search)}let s=await this.getRuntimeService("scope")();this.handlePlayJavTrailers(s),this.bindPlaybackControls(s)}bindPlaybackControls(e){let t=$("#videoPlayerContainer"),s=d(()=>this.handlePlayJavTrailers(e),"replay");t.off("click.jhsJavTrailers").on("click.jhsJavTrailers",s),e.addCleanup((()=>t.off("click.jhsJavTrailers",s))),e.listen(window,"message",(()=>{let a=document.getElementById("vjs_video_3_html5_api");a&&(a.currentTime+=5)}))}handlePlayJavTrailers(e){if(this.hasBand||e.signal.aborted)return;let t=utils.loopDetector((()=>$("#vjs_video_3_html5_api").length!==0),(()=>{e.signal.aborted||e.ownTimeout(setTimeout((()=>{if(e.signal.aborted)return;this.hasBand=!0;let a=document.getElementById("vjs_video_3_html5_api");a&&(clog.debug(a),de(a,{context:"JavTrailers 预览"}),a.currentTime=5,e.listen(a,"timeupdate",(function(){a.currentTime>=14&&a.currentTime<16&&(a.currentTime+=2)})),$("#vjs_video_3_html5_api").css({position:"fixed",width:"100vw",height:"100vh",objectFit:"cover",zIndex:String(J.debug)}),$(".vjs-control-bar").css({position:"fixed",bottom:"20px",zIndex:String(J.debug)}))}),100))}),20,1e4,!0,e),s=utils.loopDetector((()=>$("#vjs_video_3 canvas").length>0),(()=>{e.signal.aborted||$("#vjs_video_3 canvas").length!==0&&$("#vjs_video_3 canvas").css({position:"fixed",width:"100vw",height:"100vh",objectFit:"cover",top:"0",right:"0",zIndex:String(J.debug-1)})}),20,1e4,!0,e);e.addCleanup(t),e.addCleanup(s)}};d(Oi,"JavTrailersPlugin");var ra=Oi;var ia=Object.freeze({magnet:216e5,screenshot:6048e5,screenshotNegative:432e5,match115:36e5,externalDetail:864e5}),Ui=class Ui extends Error{constructor(e,t,s,a={}){super(s,{cause:a.cause}),this.name="ProviderError",this.provider=e,this.code=t,this.status=a.status||0,this.url=a.url||"",this.retryable=!!a.retryable}};d(Ui,"ProviderError");var we=Ui;function cs(o){let e=0,t=Number(o.seeders)||0,s=t>=50?35:t>=10?25:t>=1?15:3;e+=s;let a=String(o.title||"").toLowerCase(),r=String(o.resolution||"").toLowerCase(),i=/4k|2160p/.test(r)||/4k|2160p/.test(a)?25:/1080p/.test(r)||/1080p/.test(a)?20:/720p/.test(r)||/720p/.test(a)?15:5;e+=i;let n=o.hasSubtitle||/-c\b|-uc\b|chinese|中字|字幕/.test(a)?20:0;e+=n;let l=Uh(o.date),c=l<=7?15:l<=30?12:l<=90?8:3;e+=c;let h=/sample|预告|trailer/.test(a)?-15:0;return e+=h,{total:Math.max(0,Math.min(100,e)),seeders:s,resolution:i,subtitle:n,freshness:c,completeness:h}}d(cs,"calcMagnetScore");function Uh(o){try{let e=new Date(String(o||""));return Number.isNaN(e.getTime())?999:Math.max(0,Math.floor((Date.now()-e.getTime())/864e5))}catch{return 999}}d(Uh,"daysSince");function zi(o,e=!1){let t=String(o||"").toLowerCase(),s=/(?:4k|2160p|1080p|720p)/.exec(t)?.[0]||"",a=e||/(?:-c\b|-u(?:c)?\b|chinese|中字|字幕)/.test(t);return{resolution:s,subtitle:a,recognized:!!s||a,highQuality:s==="4k"||s==="2160p"||a}}d(zi,"getMagnetQualitySignals");function kc({title:o="",hasHdTag:e=!1,hasSubtitleTag:t=!1,date:s=null,seeders:a=0}={}){let r=zi(o,t),i=e||r.highQuality,n=cs({title:o,date:s,seeders:a,resolution:e&&!r.resolution?"1080p":r.resolution,hasSubtitle:r.subtitle});return{...r,highQuality:i,score:n,grade:n.total>=70?"高":n.total>=40?"中":"低"}}d(kc,"assessMagnetQuality");function wt(o,e="other"){if(!o||typeof o!="object"||Array.isArray(o))return null;let t=o,s=C(t.carNum);return s?Object.freeze({...t,carNum:s,movieId:typeof t.movieId=="string"&&t.movieId.trim()?t.movieId.trim():null,surface:t.surface||e}):null}d(wt,"normalizeMovieContext");function Cc(o,e="other"){let t=wt(o,e);if(!t)throw new TypeError("Movie context requires a valid carNum");return t}d(Cc,"createMovieContext");function na(o){let e=o?.nodeType?o:o?.[0]||null;for(;e;){let s=(typeof globalThis.$=="function"?globalThis.$(e):null)?.data?.("jhsMovieContext")||e.__jhsMovieContext,a=wt(s);if(a)return a;e=e.parentElement||null}return null}d(na,"readOwnedMovieContext");function Fi(o={}){let e=wt(o.explicitContext);if(e)return{context:e,source:"explicit"};let t=wt(o.ownedResolver?.()??na(o.trigger),"other");if(t)return{context:t,source:t.surface==="fc2-dialog"?"fc2-workspace":"owned-surface"};let s=wt(o.listResolver?.(),"list-item");if(s)return{context:s,source:"list-item"};let a=wt(o.nativeResolver?.(),"native-detail");if(a)return{context:a,source:"native-detail"};let r=wt(o.legacyResolver?.(),"other");return r?(o.logger?.("movie-context source=legacy-fallback",r),{context:r,source:"legacy-fallback"}):{context:null,source:"missing"}}d(Fi,"resolveMovieContext");var Vi=class Vi extends I{constructor(){super(...arguments),this.sourceRegistry=new Yt,this.searchEngines=[]}async initializeSources(){let e=new ot,t=this.getRuntimeService("magnet"),s=await e.getBuiltInSources(),a=await e.getMagnetSources(),r=t.getBuiltInSources(),i=[...Ls,...r],n=d(h=>({...i.find(u=>u.id===h)||{},...s.find(u=>u.id===h)||{}}),"configured"),l=r.map((h=>{let u=n(h.id),p=String(u.baseUrl||h.baseUrl).replace(/\/$/,"");return{...h,...u,search:d(async g=>t.searchSource(h.id,g,{baseUrl:p,scope:await this.getRuntimeService("scope")()}),"search"),targetUrl:d(g=>t.getSourceTargetUrl(h.id,g,{baseUrl:p}),"targetUrl")}}));this.sourceRegistry=new Yt([{name:"JavDB 本站",id:"native-javdb",applicable:M,enabled:M,priority:1,search:d(async(h,u=document)=>di(u?.jquery?u[0]:u,"javdb"),"search"),targetUrl:d(()=>window.location.href,"targetUrl")},{name:"JavBus 本站",id:"native-javbus",applicable:B,enabled:B,priority:2,search:d(async(h,u=document)=>di(u?.jquery?u[0]:u,"javbus"),"search"),targetUrl:d(()=>window.location.href,"targetUrl")},...l].map((h=>{let u=n(h.id),p=h.applicable??!0;return{...h,...u,enabled:p&&(u.enabled??h.enabled??!0),search:h.search,targetUrl:h.targetUrl}}))),a.filter(h=>h.enabled).forEach(h=>this.sourceRegistry.register({...h,id:`custom:${h.id}`,search:d(u=>this.searchCustomSource(h,u),"search"),targetUrl:d(u=>h.targetUrlTemplate.replaceAll("{keyword}",encodeURIComponent(u)),"targetUrl")}));let c=this.sourceRegistry.getEnabledSources().map((h=>({...h,targetPage:h.targetUrl("{keyword}").replace("%7Bkeyword%7D","{keyword}")})));this.searchEngines=c.length?[{id:"all",name:"全部",priority:0,targetPage:"#",targetUrl:d(()=>"#","targetUrl"),search:d(h=>this.searchAllSources(c,h),"search")},...c]:[]}getName(){return"MagnetHubPlugin"}async initCss(){return``}async handle(){if(!X.includes("collection_codes?movieId"))return;let e=new URLSearchParams(window.location.search),t=e.get("movieId"),s=e.get("carNum"),a=e.get("url"),r=e.get("source"),i=$("section").first().empty();if(!s||!a)return void i.append($('
      ').text("FC2 详情参数不完整"));let n=t&&t!=="search"?t:await this.resolveMovieIdForRecord(s,a),l=["fc2","123av"].includes(r||"")?r:await this.resolveFc2Source({url:a}),c=this.mountFc2Detail(i,{movieId:n,carNum:s,url:a,source:l,mode:"page"});$(window).off("pagehide.jhsFc2Detail").one("pagehide.jhsFc2Detail",(()=>c.destroy()))}openFc2Dialog(e,t,s,{source:a=""}={}){a=["fc2","123av"].includes(a)?a:"";let r=null;return this.getRuntimeService("dialog").open({type:1,title:t,content:'
      ',ui:{size:"workspace",body:"scroll"},area:utils.getDialogArea("workspace"),skin:"movie-detail-layer",scrollbar:!1,shadeClose:!0,success:d((i,n)=>{r=this.mountFc2Detail($(i).find(".jhs-fc2-dialog-host"),{movieId:e,carNum:t,url:s,source:a,layerIndex:n,mode:"dialog"}),utils.setupEscClose(n)},"success"),end:d(()=>r?.destroy(),"end")})}mountFc2Detail(e,t){let s=$(e);s.data("jhsFc2Context")?.destroy?.(),s.empty();let r=Pc(t).appendTo(s),i=Rc(r,t);return s.data("jhsFc2Context",i),i.translationGeneration=0,i.screenshotGeneration=0,i.otherSiteGeneration=0,this.initializeWorkspace(i),this.bindFc2FeatureLifecycle(i),i}initializeWorkspace(e){let t=$('
      正在加载影片信息…
      '),s=$('');s.append(Ot()),s.append('','',''),t.find(".jhs-fc2-summary__body").append(s),e.getSlot("summary").append(t);let a=$(''),r=$('
      ');a.on(`click${e.namespace}`,".jhs-fc2-gallery-item",(f=>{let v=$(f.currentTarget).find("img")[0];v&&globalThis.showImageViewer(v,"",{galleryRoot:a[0]})})),e.getSlot("gallery").append(a,r);let i=$('
      '),n=this.createResourceGroup("站内磁力","native-magnets"),l=this.createResourceGroup("第三方站点","other-sites"),c=this.createResourceGroup("更多磁力来源","magnet-hub"),h=$(''),u=null;c.find('[data-jhs-role="magnet-hub"]').append(h,'
      '),i.append(n,l,c),e.getSlot("resources").append(i),s.on(`click${e.namespace}`,'[data-jhs-action="subtitlecat"]',(f=>{let v=this.getRuntimeService("movie").sourceUrls({carNum:e.carNum},["subtitlecat"])[0]?.url;v&&utils.openPage(v,e.carNum,!1,f)}));let p=this.getOptionalDependency("DetailPageButtonPlugin");p?s.on(`click${e.namespace}`,'[data-jhs-action="xunlei"]',(()=>p.searchXunLeiSubtitle(e.carNum))):s.find('[data-jhs-action="xunlei"]').remove();let g=this.getOptionalDependency("MagnetHubPlugin");g||c.remove(),h.on(`click${e.namespace}`,(async()=>{if(!g||!e.isAlive())return;let f=c.find('[data-jhs-role="magnet-hub-content"]');if(h.attr("aria-expanded")==="true")return c.addClass("is-collapsed"),void h.attr("aria-expanded","false").text("展开磁力搜索");u||(u=g.createMagnetHub({movieContext:e.movieContext,root:e.root}));let b=await u;e.isAlive()&&!f.children().length&&f.append(b),e.isAlive()&&(c.removeClass("is-collapsed"),h.attr("aria-expanded","true").text("收起磁力搜索"),f[0]?.scrollIntoView?.({block:"nearest"}))})),this.getDetailStateController().bind({root:e.root,layerIndex:e.layerIndex??null,carNum:e.carNum,activityType:"fc2-state",getRecord:d(()=>({carNum:e.carNum,url:e.url,fc2Source:e.source,names:e.root.find('[data-jhs-role="actress-data"]').text(),publishTime:e.root.find('[data-jhs-role="publish-time"]').text()}),"getRecord")}),e.source==="123av"?this.load123AvDetail(e):this.loadNativeDetail(e);let m=this.getOptionalDependency("FilterTitleKeywordPlugin");m&&Promise.resolve().then((()=>m.bindDetailRoot(e.root,{layerIndex:e.layerIndex??null}))).catch((f=>clog.error("FC2 关键词过滤初始化失败",f))),this.mountFc2OtherSites(e,l,this.getOptionalDependency("OtherSitePlugin")),this.loadFc2Screenshot(e)}bindFc2FeatureLifecycle(e){let t=this.getRuntimeService("settings"),s=d(a=>{let r=a.detail?.names;if(r?.length&&(r.includes("enableLoadScreenShot")&&(t.snapshot().enableLoadScreenShot==="no"?(e.screenshotGeneration=(e.screenshotGeneration||0)+1,this.unmountFc2Screenshot(e)):this.loadFc2Screenshot(e)),r.includes("translateTitle")&&((t.snapshot().translateTitle??E)===E?this.applyFc2Translation(e):(e.translationGeneration=(e.translationGeneration||0)+1,this.revertFc2Translation(e))),r.includes("enableMagnetsFilter")&&e.magnetFilterApply?.((t.snapshot().enableMagnetsFilter??E)===E),r.includes("enableLoadOtherSite"))){let i=e.getSection("resources").find('[data-jhs-role="other-sites"]').closest(".jhs-fc2-resource-group");t.snapshot().enableLoadOtherSite==="no"?(e.otherSiteGeneration=(e.otherSiteGeneration||0)+1,this.unmountFc2OtherSites(e,i)):this.mountFc2OtherSites(e,i,this.getOptionalDependency("OtherSitePlugin"))}},"handler");t.addEventListener("settings.changed",s),e.addObserver({disconnect:d(()=>t.removeEventListener("settings.changed",s),"disconnect")})}loadFc2Screenshot(e){let t=this.getRuntimeService("screenshot"),s=this.getRuntimeService("settings"),a=e.root.find('[data-jhs-role="screenshot"]');if(!t.isEnabled(s.snapshot()))return void a.empty();let r=(e.screenshotGeneration||0)+1;e.screenshotGeneration=r,Promise.resolve().then((()=>this.getRuntimeService("scope")())).then(i=>na({target:a,carNum:e.carNum.replace("FC2-",""),screenshot:t,settings:s.snapshot(),scope:i,isActive:d(()=>e.isAlive()&&s.snapshot().enableLoadScreenShot!=="no"&&r===e.screenshotGeneration,"isActive"),isDuplicate:d(n=>!!e.galleryUrls?.has(n),"isDuplicate")})).then(i=>{if(!(!e.isAlive()||r!==e.screenshotGeneration)&&s.snapshot().enableLoadScreenShot==="no")return void a.empty()}).catch(i=>{!e.isAlive()||r!==e.screenshotGeneration||(a.empty(),clog.error("FC2 剧照初始化失败",i))})}unmountFc2Screenshot(e){e.screenshotGeneration=(e.screenshotGeneration||0)+1,e.root.find('[data-jhs-role="screenshot"]').empty()}applyFc2Translation(e){let t=this.getRuntimeService("settings");if(!e.isAlive()||(t.snapshot().translateTitle??E)!==E)return;let s=(e.translationGeneration||0)+1;e.translationGeneration=s,Promise.resolve().then((()=>this.getRuntimeService("scope")())).then(a=>ia({root:e.root,carNum:e.carNum,translation:this.getRuntimeService("translation"),scope:a,isActive:d(()=>e.isAlive()&&(t.snapshot().translateTitle??E)===E&&s===e.translationGeneration,"isActive")})).catch((a=>clog.error("FC2 标题翻译失败",a)))}revertFc2Translation(e){e.root.find(".translated-title").remove()}mountFc2OtherSites(e,t,s){if(!s)return void t.remove();let a=this.getRuntimeService("settings"),r=(e.otherSiteGeneration||0)+1;e.otherSiteGeneration=r,t.length&&t.show(),Promise.resolve().then((()=>s.loadOtherSite(e.carNum.replace("FC2-",""),e.carNum,{root:e.root,target:t.find('[data-jhs-role="other-sites"]'),autoDetect:!1,isActive:d(()=>e.isAlive()&&a.snapshot().enableLoadOtherSite!=="no"&&r===e.otherSiteGeneration,"isActive")}))).then(i=>{!e.isAlive()||r!==e.otherSiteGeneration||(i?t.show():t.hide())}).catch(i=>{!e.isAlive()||r!==e.otherSiteGeneration||(t.show(),he(e.root.find('[data-jhs-role="other-sites"]'),"外部站点加载失败"),clog.error("FC2 外部站点加载失败",i))})}unmountFc2OtherSites(e,t){e.otherSiteGeneration=(e.otherSiteGeneration||0)+1,e.root.find("[data-jhs-other-site-box],[data-jhs-other-site-settings]").remove(),t.length&&t.hide()}createResourceGroup(e,t){return $('

      ').find("h3").text(e).end().find("div").attr("data-jhs-role",t).end()}async loadNativeDetail(e){let t=Promise.resolve(e.movieId);this.configureJavDbWantButton(e,t),await Promise.allSettled([this.fetchAndRenderNativeDetail(e),this.fetchAndRenderNativeMagnets(e),this.mountPanels(e,t)]),e.isAlive()&&this.applyFc2Translation(e)}async load123AvDetail(e){let t=this.getOptionalDependency("Fc2By123AvPlugin");if(!t)return void he(e.getSlot("summary"),"123AV 详情功能已禁用");let s=t.resolveMovieId(e.carNum);this.configureJavDbWantButton(e,s),this.mountPanels(e,s),s.then((a=>{if(e.isAlive())return this.fetchAndRenderNativeMagnets(e,a)})).catch((a=>{e.isAlive()&&he(e.root.find('[data-jhs-role="native-magnets"]'),"站内磁力关联失败",(()=>{this.load123AvMagnets(e)})),clog.error("123AV 磁力关联失败",a)})),await t.loadDetail(e,e.url),e.isAlive()&&this.applyFc2Translation(e)}async load123AvMagnets(e){let t=this.getOptionalDependency("Fc2By123AvPlugin");if(!t)throw new Error("123AV 详情功能已禁用");let s=await t.resolveMovieId(e.carNum);return this.fetchAndRenderNativeMagnets(e,s)}async configureJavDbWantButton(e,t){let s=e.root.find('[data-jhs-action="javdb-want"]');try{let a=await t;if(!e.isAlive())return;if(!a)return void s.prop("disabled",!0).text("JavDB 暂无对应作品");try{let r=await Tc(a);if(!e.isAlive())return;if(r)return void s.prop("disabled",!0).attr("aria-pressed","true").text("已在 JavDB 想看")}catch(r){clog.warn("读取 JavDB 想看状态失败,保留手动操作",r)}s.prop("disabled",!1).text("JavDB 想看").off(`click${e.namespace}`).on(`click${e.namespace}`,(()=>{this.submitJavDbWant(e,a,s)}))}catch(a){e.isAlive()&&s.prop("disabled",!1).text("JavDB 关联失败,重试").off(`click${e.namespace}`).on(`click${e.namespace}`,(()=>{this.configureJavDbWantButton(e,this.resolveMovieId(e.carNum))})),clog.error("FC2 JavDB 想看关联失败",a)}}async submitJavDbWant(e,t,s){if(!(!e.isAlive()||s.data("jhsBusy")||s.attr("aria-pressed")==="true")){s.data("jhsBusy",!0).attr({"aria-busy":"true","aria-disabled":"true"}).text("正在加入想看…");try{if(await $c(t),!e.isAlive())return;s.attr({"aria-pressed":"true","aria-disabled":"false"}).text("已加入 JavDB 想看"),show.ok("已加入 JavDB 想看")}catch(a){if(!e.isAlive())return;let r=a;if(r?.code==="LOGIN_REQUIRED")return s.attr("aria-disabled","false").text("JavDB 想看"),Ac({dialog:this.getRuntimeService("dialog"),account:this.getRuntimeService("account"),credential:this.getRuntimeService("credential"),getScope:this.getRuntimeService("scope"),onSuccess:d(()=>this.submitJavDbWant(e,t,s),"onSuccess")});s.attr("aria-disabled","false").text("JavDB 想看"),show.error(r?.message||"加入 JavDB 想看失败"),clog.error("加入 JavDB 想看失败",a)}finally{e.isAlive()&&s.removeData("jhsBusy").removeAttr("aria-busy")}}}async fetchAndRenderNativeDetail(e){try{let t=await this.getRuntimeService("scope")(),s=await this.getRuntimeService("movie").detail({movieId:e.movieId,carNum:e.carNum,providerId:"javdb"},{scope:t});if(!s)throw new Error("JavDB 影片详情不存在");if(!e.isAlive())return;this.renderSummary(e,s),hs(e,s.imageUrls||[],s.coverUrl||null)}catch(t){e.isAlive()&&he(e.root.find('[data-jhs-role="summary-content"]'),"影片信息加载失败",(()=>{this.fetchAndRenderNativeDetail(e)})),clog.error("FC2 详情加载失败",t)}}renderSummary(e,t){let s=e.root.find('[data-jhs-role="summary-content"]').empty(),a=$('

      ');a.find("strong").text(t.title||"无标题"),s.append(a),t.originalTitle&&t.originalTitle!==t.title&&s.append($('
      ').text(t.originalTitle));let r=$('
      ');[`番号:${t.carNum||e.carNum}`,`发行:${t.releaseDate||"未知"}`,`评分:${Number.isFinite(Number(t.score))?t.score:"无"}`,`时长:${Number.isFinite(Number(t.duration))?t.duration+" 分钟":"无"}`].forEach((l=>r.append($("").text(l)))),s.append(r);let i=[],n=$('
      主演:
      ');(t.actors||[]).forEach((l=>{n.append($("").addClass("jhs-fc2-actor").attr({href:`/actors/${encodeURIComponent(l.id)}`,target:"_blank",rel:"noopener noreferrer"}).text(l.name||"未知演员")),l.gender===0&&i.push(l.name)})),t.actors?.length||n.append($("").text("暂无演员信息")),s.append(n,ta(e,this.getRuntimeService("movie")),$('').text(i.join(" ")),$('').text(t.releaseDate||""))}async fetchAndRenderNativeMagnets(e,t=e.movieId){let s=e.root.find('[data-jhs-role="native-magnets"]');he(s,"正在加载站内磁力…");try{if(!t)return he(s,"JavDB 暂无对应作品");let a=await this.getRuntimeService("scope")(),r=await this.getRuntimeService("magnet").listNative({movieId:t,providerId:"javdb"},{scope:a});if(!e.isAlive())return;if(s.empty(),!r.length)return he(s,"暂无站内磁力");let i=[],n=this.getRuntimeService("magnet");r.forEach((l=>{let c=$l(l.hash);if(!c)return;let h=`magnet:?xt=urn:btih:${c}`,u=n.assess({title:l.title,hasHdTag:l.hasHdTag,hasSubtitleTag:l.hasSubtitleTag,date:l.createdAt,seeders:l.seeders}),p=$('
      ').attr("data-jhs-high-quality",String(u.highQuality)),g=$('
      '),m=$('
      '),f=$('
      ');i.push(u),f.append($("").addClass("jhs-badge").attr("title",`磁力质量评分 ${u.score.total}`).text(`${u.grade} ${u.score.total}`)),l.hasHdTag&&f.append('高清'),l.hasSubtitleTag&&f.append('字幕'),g.append($("").attr("href",h).text(l.title||h),$("
      ").addClass("jhs-fc2-meta").text(`${(Number(l.sizeMb||0)/1024).toFixed(2)} GB · ${Number(l.fileCount)||0} 个文件${l.createdAt?` · ${l.createdAt}`:""}`),f),m.append($('').attr("data-clipboard-text",h),$('').attr({"data-resource":h,"data-jhs-offline-owner":"fc2"})),s.append(p.append(g,m))})),await this.bindNativeMagnetFilter(e,s,i.some((l=>l.highQuality)))}catch(a){e.isAlive()&&he(s,"站内磁力加载失败",(()=>{this.fetchAndRenderNativeMagnets(e,t)})),clog.error("FC2 磁力加载失败",a)}}async bindNativeMagnetFilter(e,t,s){let a=e.getSection("resources"),r=a.find(".jhs-fc2-section__actions");r.find('[data-jhs-action="filter-native-magnets"]').remove();let n=$(''),l=d(u=>{t.find(".jhs-fc2-magnet-item").show(),u&&s&&t.find('.jhs-fc2-magnet-item[data-jhs-high-quality="false"]').hide(),n.attr("aria-pressed",String(u&&s)).text(s?u?"显示全部磁力":"过滤低质量":"暂无可过滤项").prop("disabled",!s)},"apply"),c=this.getRuntimeService("settings"),h=He({settings:c,key:"enableMagnetsFilter",fallback:"no",apply:d(u=>l(u===E),"apply"),onError:d(u=>{clog.error("磁力过滤设置保存失败,已恢复",u),show.error("磁力过滤设置保存失败,已恢复原设置")},"onError")});e.magnetFilterApply=l,r.append(n),l((c.snapshot().enableMagnetsFilter??E)===E),n.on(`click${e.namespace}`,(async()=>{let u=n.attr("aria-pressed")!=="true";await h(u?E:"no")}))}async mountPanels(e,t){try{let s=await t;if(!e.isAlive())return;if(!s)return this.clearOwnedPanel(e,"reviews"),this.clearOwnedPanel(e,"related"),he(e.getSlot("reviews"),"JavDB 暂无对应作品"),he(e.getSlot("related"),"JavDB 暂无对应作品");this.clearOwnedPanel(e,"reviews"),this.clearOwnedPanel(e,"related");let a=d(()=>this.getRuntimeService("scope")(),"scope"),r=new zt({related:this.getRuntimeService("related"),settings:this.getRuntimeService("settings"),scope:a}),i=new Ft({review:this.getRuntimeService("review"),settings:this.getRuntimeService("settings"),storage:this.getRuntimeService("storage"),scope:a});await Promise.allSettled([i.show(s,e.getSlot("reviews"),{ownedSection:e.getSection("reviews"),isActive:e.isAlive,ownCleanup:d(n=>e.addObserver({disconnect:n}),"ownCleanup")}),r.show(e.getSlot("related"),s,{ownedSection:e.getSection("related"),isActive:e.isAlive,ownCleanup:d(n=>e.addObserver({disconnect:n}),"ownCleanup")})])}catch(s){if(!e.isAlive())return;this.clearOwnedPanel(e,"reviews"),this.clearOwnedPanel(e,"related");let a=d(()=>{this.mountPanels(e,this.resolveMovieId(e.carNum))},"retry");he(e.getSlot("reviews"),"评论关联失败",a),he(e.getSlot("related"),"相关清单关联失败",a),clog.error("FC2 JavDB 关联失败",s)}}clearOwnedPanel(e,t){e.getSlot(t).empty(),e.getSection(t).find(".jhs-fc2-section__actions").empty()}async resolveFc2Source(e={}){if(e.fc2Source&&["fc2","123av"].includes(e.fc2Source))return e.fc2Source;try{let t=new URL(e.url||"",window.location.origin);return this.getRuntimeService("movie").matchesProviderUrl("av123",t.href)?"123av":t.origin===window.location.origin?"fc2":""}catch{return""}}createFc2PageUrl(e,t,s,{source:a=""}={}){if(!String(e||"").trim())throw new TypeError("FC2 owned detail requires movieId");let r=new URL("/users/collection_codes",window.location.origin);return r.searchParams.set("movieId",String(e).trim()),r.searchParams.set("carNum",t),r.searchParams.set("url",s),r.searchParams.set("source",a),r.href}async openFc2Page(e,t,s,a={newTab:!0},{source:r=""}={}){r=["fc2","123av"].includes(r)?r:"";let i=String(e||"").trim();if(!i)return void utils.openPage(s,t,!0,a);utils.openPage(this.createFc2PageUrl(i,t,s,{source:r}),t,!0,a)}};d(Vi,"Fc2Plugin");var oa=Vi;var qi=class qi extends R{getName(){return"HitShowPlugin"}async handle(){let e=je(window.location);if(e.kind!=="playback-ranking")return;let t=this.getRuntimeService("host").locateListRoot?.();t&&(t.setAttribute("data-jhs-ranking","playback"),t.setAttribute("data-jhs-ranking-period",e.period),t.setAttribute("data-jhs-ranking-filter",e.filter))}};d(qi,"HitShowPlugin");var la=qi;var Hi=class Hi extends R{getName(){return"JavTrailersPlugin"}constructor(){super(),this.hasBand=!1}async handle(){let e=window.location.href;if(!e.includes("handle=1"))return;if($("h1:contains('Page not found')").length){clog.log("番号无法匹配, 跳搜索");let a=e.split("?")[0].split("video/")[1].toLowerCase().replace("00","-");return void(window.location.href="/search/"+encodeURIComponent(a)+window.location.search)}let t=$(".videos-list .video-link").toArray();if(t.length){let a=e.split("?")[0].split("search/")[1].toLowerCase(),r=t.find((i=>$(i).find(".vid-title").text().toLowerCase().includes(a)));if(r)return void(window.location.href=$(r).attr("href")+window.location.search)}let s=await this.getRuntimeService("scope")();this.handlePlayJavTrailers(s),this.bindPlaybackControls(s)}bindPlaybackControls(e){let t=$("#videoPlayerContainer"),s=d(()=>this.handlePlayJavTrailers(e),"replay");t.off("click.jhsJavTrailers").on("click.jhsJavTrailers",s),e.addCleanup((()=>t.off("click.jhsJavTrailers",s))),e.listen(window,"message",(()=>{let a=document.getElementById("vjs_video_3_html5_api");a&&(a.currentTime+=5)}))}handlePlayJavTrailers(e){if(this.hasBand||e.signal.aborted)return;let t=utils.loopDetector((()=>$("#vjs_video_3_html5_api").length!==0),(()=>{e.signal.aborted||e.ownTimeout(setTimeout((()=>{if(e.signal.aborted)return;this.hasBand=!0;let a=document.getElementById("vjs_video_3_html5_api");a&&(clog.debug(a),de(a,{context:"JavTrailers 预览"}),a.currentTime=5,e.listen(a,"timeupdate",(function(){a.currentTime>=14&&a.currentTime<16&&(a.currentTime+=2)})),$("#vjs_video_3_html5_api").css({position:"fixed",width:"100vw",height:"100vh",objectFit:"cover",zIndex:String(J.debug)}),$(".vjs-control-bar").css({position:"fixed",bottom:"20px",zIndex:String(J.debug)}))}),100))}),20,1e4,!0,e),s=utils.loopDetector((()=>$("#vjs_video_3 canvas").length>0),(()=>{e.signal.aborted||$("#vjs_video_3 canvas").length!==0&&$("#vjs_video_3 canvas").css({position:"fixed",width:"100vw",height:"100vh",objectFit:"cover",top:"0",right:"0",zIndex:String(J.debug-1)})}),20,1e4,!0,e);e.addCleanup(t),e.addCleanup(s)}};d(Hi,"JavTrailersPlugin");var ca=Hi;var da=Object.freeze({magnet:216e5,screenshot:6048e5,screenshotNegative:432e5,match115:36e5,externalDetail:864e5}),Wi=class Wi extends Error{constructor(e,t,s,a={}){super(s,{cause:a.cause}),this.name="ProviderError",this.provider=e,this.code=t,this.status=a.status||0,this.url=a.url||"",this.retryable=!!a.retryable}};d(Wi,"ProviderError");var we=Wi;function ps(o){let e=0,t=Number(o.seeders)||0,s=t>=50?35:t>=10?25:t>=1?15:3;e+=s;let a=String(o.title||"").toLowerCase(),r=String(o.resolution||"").toLowerCase(),i=/4k|2160p/.test(r)||/4k|2160p/.test(a)?25:/1080p/.test(r)||/1080p/.test(a)?20:/720p/.test(r)||/720p/.test(a)?15:5;e+=i;let n=o.hasSubtitle||/-c\b|-uc\b|chinese|中字|字幕/.test(a)?20:0;e+=n;let l=Kh(o.date),c=l<=7?15:l<=30?12:l<=90?8:3;e+=c;let h=/sample|预告|trailer/.test(a)?-15:0;return e+=h,{total:Math.max(0,Math.min(100,e)),seeders:s,resolution:i,subtitle:n,freshness:c,completeness:h}}d(ps,"calcMagnetScore");function Kh(o){try{let e=new Date(String(o||""));return Number.isNaN(e.getTime())?999:Math.max(0,Math.floor((Date.now()-e.getTime())/864e5))}catch{return 999}}d(Kh,"daysSince");function Ji(o,e=!1){let t=String(o||"").toLowerCase(),s=/(?:4k|2160p|1080p|720p)/.exec(t)?.[0]||"",a=e||/(?:-c\b|-u(?:c)?\b|chinese|中字|字幕)/.test(t);return{resolution:s,subtitle:a,recognized:!!s||a,highQuality:s==="4k"||s==="2160p"||a}}d(Ji,"getMagnetQualitySignals");function Ic({title:o="",hasHdTag:e=!1,hasSubtitleTag:t=!1,date:s=null,seeders:a=0}={}){let r=Ji(o,t),i=e||r.highQuality,n=ps({title:o,date:s,seeders:a,resolution:e&&!r.resolution?"1080p":r.resolution,hasSubtitle:r.subtitle});return{...r,highQuality:i,score:n,grade:n.total>=70?"高":n.total>=40?"中":"低"}}d(Ic,"assessMagnetQuality");function jt(o,e="other"){if(!o||typeof o!="object"||Array.isArray(o))return null;let t=o,s=C(t.carNum);return s?Object.freeze({...t,carNum:s,movieId:typeof t.movieId=="string"&&t.movieId.trim()?t.movieId.trim():null,surface:t.surface||e}):null}d(jt,"normalizeMovieContext");function Ec(o,e="other"){let t=jt(o,e);if(!t)throw new TypeError("Movie context requires a valid carNum");return t}d(Ec,"createMovieContext");function ha(o){let e=o?.nodeType?o:o?.[0]||null;for(;e;){let s=(typeof globalThis.$=="function"?globalThis.$(e):null)?.data?.("jhsMovieContext")||e.__jhsMovieContext,a=jt(s);if(a)return a;e=e.parentElement||null}return null}d(ha,"readOwnedMovieContext");function Ki(o={}){let e=jt(o.explicitContext);if(e)return{context:e,source:"explicit"};let t=jt(o.ownedResolver?.()??ha(o.trigger),"other");if(t)return{context:t,source:t.surface==="fc2-dialog"?"fc2-workspace":"owned-surface"};let s=jt(o.listResolver?.(),"list-item");if(s)return{context:s,source:"list-item"};let a=jt(o.nativeResolver?.(),"native-detail");if(a)return{context:a,source:"native-detail"};let r=jt(o.legacyResolver?.(),"other");return r?(o.logger?.("movie-context source=legacy-fallback",r),{context:r,source:"legacy-fallback"}):{context:null,source:"missing"}}d(Ki,"resolveMovieContext");var Gi=class Gi extends R{constructor(){super(...arguments),this.sourceRegistry=new Xt,this.searchEngines=[]}async initializeSources(){let e=new ct,t=this.getRuntimeService("magnet"),s=await e.getBuiltInSources(),a=await e.getMagnetSources(),r=t.getBuiltInSources(),i=[...Us,...r],n=d(h=>({...i.find(u=>u.id===h)||{},...s.find(u=>u.id===h)||{}}),"configured"),l=r.map((h=>{let u=n(h.id),p=String(u.baseUrl||h.baseUrl).replace(/\/$/,"");return{...h,...u,search:d(async g=>t.searchSource(h.id,g,{baseUrl:p,scope:await this.getRuntimeService("scope")()}),"search"),targetUrl:d(g=>t.getSourceTargetUrl(h.id,g,{baseUrl:p}),"targetUrl")}}));this.sourceRegistry=new Xt([{name:"JavDB 本站",id:"native-javdb",applicable:M,enabled:M,priority:1,search:d(async(h,u=document)=>fi(u?.jquery?u[0]:u,"javdb"),"search"),targetUrl:d(()=>window.location.href,"targetUrl")},{name:"JavBus 本站",id:"native-javbus",applicable:B,enabled:B,priority:2,search:d(async(h,u=document)=>fi(u?.jquery?u[0]:u,"javbus"),"search"),targetUrl:d(()=>window.location.href,"targetUrl")},...l].map((h=>{let u=n(h.id),p=h.applicable??!0;return{...h,...u,enabled:p&&(u.enabled??h.enabled??!0),search:h.search,targetUrl:h.targetUrl}}))),a.filter(h=>h.enabled).forEach(h=>this.sourceRegistry.register({...h,id:`custom:${h.id}`,search:d(u=>this.searchCustomSource(h,u),"search"),targetUrl:d(u=>h.targetUrlTemplate.replaceAll("{keyword}",encodeURIComponent(u)),"targetUrl")}));let c=this.sourceRegistry.getEnabledSources().map((h=>({...h,targetPage:h.targetUrl("{keyword}").replace("%7Bkeyword%7D","{keyword}")})));this.searchEngines=c.length?[{id:"all",name:"全部",priority:0,targetPage:"#",targetUrl:d(()=>"#","targetUrl"),search:d(h=>this.searchAllSources(c,h),"search")},...c]:[]}getName(){return"MagnetHubPlugin"}async initCss(){return``}async createMagnetHub(e,t={}){await this.initializeSources();let s=typeof e=="string"?null:e,a=typeof e=="string"?Cc({carNum:e}):s?.movieContext;if(!a?.carNum)return $('
      ').append($('
      ').text("无法确定影片身份,未加载磁力"));let r=a.carNum.replace("FC2-",""),i=t.root??s?.root?$(t.root??s?.root):$(document),n=[...this.searchEngines],l=this.getRuntimeService("storage"),c=$('
      '),h=$('
      '),u="jhs_magnetHub_selectedEngine",p=l.getLocal(u);c.data("jhsMovieContext",a);let g=$('
      '),m=n.find((w=>w.id===p))||n[0];if(!m)return c.append($('
      ').text("暂无可用磁力来源,请前往设置启用来源"));let f=m;n.forEach((w=>g.append($('').attr("data-engine",w.id).text(w.name).toggleClass("active",w.id===f.id))));let v=$('原网页').attr("href",(f.targetPage||"#").replace("{keyword}",encodeURIComponent(r))).toggle(f.id!=="all");h.append(g),h.append(v),g.find(".magnet-tab.active").attr({"aria-selected":"true",tabindex:"0"}),c.append(h);let b=$('
      ');return c.append(b),c.on("click",".magnet-tab",(w=>{let S=$(w.target).data("engine");f=n.find((j=>j.id===S))||f,f&&(c.find('[data-jhs-role="magnet-target"]').attr("href",(f.targetPage||"#").replace("{keyword}",encodeURIComponent(r))).toggle(f.id!=="all"),l.setLocal(u,S),c.find(".magnet-tab").removeClass("active").attr({"aria-selected":"false",tabindex:"-1"}),$(w.target).addClass("active").attr({"aria-selected":"true",tabindex:"0"}),this.searchEngine(b,f,r,i))})),c.on("keydown",".magnet-tab",(w=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(w.key))return;w.preventDefault();let S=c.find(".magnet-tab"),j=S.index(w.currentTarget),k=w.key==="Home"?0:w.key==="End"?S.length-1:w.key==="ArrowRight"?(j+1)%S.length:(j-1+S.length)%S.length;S.eq(k).trigger("click").trigger("focus")})),this.searchEngine(b,f,r,i),c}async searchEngine(e,t,s,a=$(document)){e.html(`
      正在从 ${T(t.name)} 搜索 "${T(s)}"...
      `);let r=`${t.name}_${s}`;if(t.search)try{return void this.displayResults(e,await this.applyRuntimeRules(Ds(await t.search(s,a))),t.name)}catch(i){return clog.error(`磁力源 ${t.name} 请求失败`,i),void e.html(`
      ${T(t.name)} 请求失败
      `)}if(t.parseHtml)try{let i=t.url.replace("{keyword}",encodeURIComponent(s)),n=await this.requestSource(t.id,i,{ttlMs:216e5}),l=t.parseHtml.call(this,n,s);return void this.displayResults(e,l,t.name)}catch(i){return void e.html(`
      解析 ${T(t.name)} 结果失败: ${T(i instanceof Error?i.message:String(i))}
      `)}t.parseJson&&await t.parseJson.call(this,e,t,s,r)}async searchCustomSources(e){let s=JSON.parse(await storageManager.getSetting("customMagnetSources","[]")).filter(r=>r.enabled).map(bt),a=await Ae(s,4,(async r=>{let i=r.searchUrlTemplate.replaceAll("{keyword}",encodeURIComponent(e));try{let n=await this.requestSource(r.id,i,{ttlMs:ia.magnet,custom:!0,responseType:r.parserType==="json"?"json":"text"}),l=r.parserType==="json"&&typeof n=="string"?JSON.parse(n):n;return hi(r,l,r.id)}catch(n){let l=n;return clog.error(`自定义磁力源 ${r.name} 失败`,new we(r.id,l.code||"HTTP_ERROR",l.message||String(n),{cause:n,url:i,status:l.status,retryable:l.retryable})),[]}}));return Ds(a.flat())}async searchCustomSource(e,t){let s=e.searchUrlTemplate.replaceAll("{keyword}",encodeURIComponent(t)),a=await this.requestSource(e.id,s,{ttlMs:ia.magnet,custom:!0,responseType:e.parserType==="json"?"json":"text"});return hi(e,e.parserType==="json"&&typeof a=="string"?JSON.parse(a):a,e.id)}async searchAllSources(e,t){let s=await Ae(e,3,(async a=>{try{return await a.search(t)}catch(r){return clog.warn(`磁力源 ${a.name} 聚合失败`,r),[]}}));return Ds(s.flat())}async requestSource(e,t,s={}){let a=await this.getRuntimeService("scope")();return(await this.getRuntimeService("http").request({providerId:`magnet:${e}`,method:s.method||"GET",url:t,body:s.body,headers:s.headers,responseType:s.responseType||"text",cacheScope:s.method&&s.method!=="GET"?"none":"public",ttlMs:s.ttlMs??ia.magnet,urlPolicy:s.custom?{trustClass:"custom-public"}:{trustClass:"builtin-public",hosts:s.hosts||[new URL(t).hostname]}},a)).data}async applyRuntimeRules(e){let t=new ot,[s,a]=await Promise.all([t.getMagnetTagRules(),t.getMagnetFilterRules()]);return e.map((r=>_l(r,s,a.filter((i=>(i.target||"title")==="title")),a.filter((i=>i.target==="file"))))).filter((r=>!r.hidden))}async displayResults(e,t,s){function a(r){let i=r.text();r.addClass("copied").text("已复制"),setTimeout((()=>{r.removeClass("copied").text(i)}),2e3)}d(a,"a"),e.empty(),t.length!==0?(t.forEach((r=>{let i=this.calcMagnetScore(r);r._score={...i,total:Math.max(0,Math.min(100,i.total+(r.customTagWeight||0)+(r.filterPenalty||0)))}})),t.sort(((r,i)=>i._score.total-r._score.total)),t.forEach((r=>{let i=r._score?r._score.total:0,n=i>=80?"高":i>=60?"中":"低",l=r._score?`做种:${r._score.seeders}/35 分辨率:${r._score.resolution}/25 字幕:${r._score.subtitle}/20 新鲜度:${r._score.freshness}/15 完整性:${r._score.completeness}/5`:"",c=T(r.title),h=T(r.magnet),u=T(String(r.size||"未知")),p=T(String(r.date||"未知")),g=$(` + `}async createMagnetHub(e,t={}){await this.initializeSources();let s=typeof e=="string"?null:e,a=typeof e=="string"?Ec({carNum:e}):s?.movieContext;if(!a?.carNum)return $('
      ').append($('
      ').text("无法确定影片身份,未加载磁力"));let r=a.carNum.replace("FC2-",""),i=t.root??s?.root?$(t.root??s?.root):$(document),n=[...this.searchEngines],l=this.getRuntimeService("storage"),c=$('
      '),h=$('
      '),u="jhs_magnetHub_selectedEngine",p=l.getLocal(u);c.data("jhsMovieContext",a);let g=$('
      '),m=n.find((w=>w.id===p))||n[0];if(!m)return c.append($('
      ').text("暂无可用磁力来源,请前往设置启用来源"));let f=m;n.forEach((w=>g.append($('').attr("data-engine",w.id).text(w.name).toggleClass("active",w.id===f.id))));let v=$('原网页').attr("href",(f.targetPage||"#").replace("{keyword}",encodeURIComponent(r))).toggle(f.id!=="all");h.append(g),h.append(v),g.find(".magnet-tab.active").attr({"aria-selected":"true",tabindex:"0"}),c.append(h);let b=$('
      ');return c.append(b),c.on("click",".magnet-tab",(w=>{let S=$(w.target).data("engine");f=n.find((j=>j.id===S))||f,f&&(c.find('[data-jhs-role="magnet-target"]').attr("href",(f.targetPage||"#").replace("{keyword}",encodeURIComponent(r))).toggle(f.id!=="all"),l.setLocal(u,S),c.find(".magnet-tab").removeClass("active").attr({"aria-selected":"false",tabindex:"-1"}),$(w.target).addClass("active").attr({"aria-selected":"true",tabindex:"0"}),this.searchEngine(b,f,r,i))})),c.on("keydown",".magnet-tab",(w=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(w.key))return;w.preventDefault();let S=c.find(".magnet-tab"),j=S.index(w.currentTarget),k=w.key==="Home"?0:w.key==="End"?S.length-1:w.key==="ArrowRight"?(j+1)%S.length:(j-1+S.length)%S.length;S.eq(k).trigger("click").trigger("focus")})),this.searchEngine(b,f,r,i),c}async searchEngine(e,t,s,a=$(document)){e.html(`
      正在从 ${T(t.name)} 搜索 "${T(s)}"...
      `);let r=`${t.name}_${s}`;if(t.search)try{return void this.displayResults(e,await this.applyRuntimeRules(Bs(await t.search(s,a))),t.name)}catch(i){return clog.error(`磁力源 ${t.name} 请求失败`,i),void e.html(`
      ${T(t.name)} 请求失败
      `)}if(t.parseHtml)try{let i=t.url.replace("{keyword}",encodeURIComponent(s)),n=await this.requestSource(t.id,i,{ttlMs:216e5}),l=t.parseHtml.call(this,n,s);return void this.displayResults(e,l,t.name)}catch(i){return void e.html(`
      解析 ${T(t.name)} 结果失败: ${T(i instanceof Error?i.message:String(i))}
      `)}t.parseJson&&await t.parseJson.call(this,e,t,s,r)}async searchCustomSources(e){let s=JSON.parse(await storageManager.getSetting("customMagnetSources","[]")).filter(r=>r.enabled).map(wt),a=await Ae(s,4,(async r=>{let i=r.searchUrlTemplate.replaceAll("{keyword}",encodeURIComponent(e));try{let n=await this.requestSource(r.id,i,{ttlMs:da.magnet,custom:!0,responseType:r.parserType==="json"?"json":"text"}),l=r.parserType==="json"&&typeof n=="string"?JSON.parse(n):n;return vi(r,l,r.id)}catch(n){let l=n;return clog.error(`自定义磁力源 ${r.name} 失败`,new we(r.id,l.code||"HTTP_ERROR",l.message||String(n),{cause:n,url:i,status:l.status,retryable:l.retryable})),[]}}));return Bs(a.flat())}async searchCustomSource(e,t){let s=e.searchUrlTemplate.replaceAll("{keyword}",encodeURIComponent(t)),a=await this.requestSource(e.id,s,{ttlMs:da.magnet,custom:!0,responseType:e.parserType==="json"?"json":"text"});return vi(e,e.parserType==="json"&&typeof a=="string"?JSON.parse(a):a,e.id)}async searchAllSources(e,t){let s=await Ae(e,3,(async a=>{try{return await a.search(t)}catch(r){return clog.warn(`磁力源 ${a.name} 聚合失败`,r),[]}}));return Bs(s.flat())}async requestSource(e,t,s={}){let a=await this.getRuntimeService("scope")();return(await this.getRuntimeService("http").request({providerId:`magnet:${e}`,method:s.method||"GET",url:t,body:s.body,headers:s.headers,responseType:s.responseType||"text",cacheScope:s.method&&s.method!=="GET"?"none":"public",ttlMs:s.ttlMs??da.magnet,urlPolicy:s.custom?{trustClass:"custom-public"}:{trustClass:"builtin-public",hosts:s.hosts||[new URL(t).hostname]}},a)).data}async applyRuntimeRules(e){let t=new ct,[s,a]=await Promise.all([t.getMagnetTagRules(),t.getMagnetFilterRules()]);return e.map((r=>El(r,s,a.filter((i=>(i.target||"title")==="title")),a.filter((i=>i.target==="file"))))).filter((r=>!r.hidden))}async displayResults(e,t,s){function a(r){let i=r.text();r.addClass("copied").text("已复制"),setTimeout((()=>{r.removeClass("copied").text(i)}),2e3)}d(a,"a"),e.empty(),t.length!==0?(t.forEach((r=>{let i=this.calcMagnetScore(r);r._score={...i,total:Math.max(0,Math.min(100,i.total+(r.customTagWeight||0)+(r.filterPenalty||0)))}})),t.sort(((r,i)=>i._score.total-r._score.total)),t.forEach((r=>{let i=r._score?r._score.total:0,n=i>=80?"高":i>=60?"中":"低",l=r._score?`做种:${r._score.seeders}/35 分辨率:${r._score.resolution}/25 字幕:${r._score.subtitle}/20 新鲜度:${r._score.freshness}/15 完整性:${r._score.completeness}/5`:"",c=T(r.title),h=T(r.magnet),u=T(String(r.size||"未知")),p=T(String(r.date||"未知")),g=$(`
      ${n} ${i} @@ -3284,7 +3291,7 @@ ${i}\r
      - `);r.tags?.length&&g.find(".magnet-info").after($("
      ").addClass("magnet-tags").append(r.tags.map((f=>$("").addClass("jhs-badge").text(f)))));let m=g.find(".magnet-copy");g.find(".copy-btn").removeClass("magnet-hub-btn").addClass("jhs-btn--secondary"),m.append(``),g.appendTo(e)})),e.on("click",".copy-btn",(async r=>{let i=$(r.currentTarget),n=i.data("magnet");await utils.copyToClipboard("磁力链接",n)&&a(i)}))):e.append('
      没有找到相关结果
      ')}calcMagnetScore(e){return cs(e)}};d(Vi,"MagnetHubPlugin");var oa=Vi;var qi=class qi extends I{constructor(){super(...arguments),this.mountGeneration=0,this._mountGenerations=new WeakMap,this.siteConfigs=[{id:"javTrailersBtn"},{id:"123AvBtn",providerId:"av123"},{id:"jableBtn"},{id:"avgleBtn"},{id:"missAvBtn"},{id:"supJavBtn"},{id:"javDbBtn",condition:d(()=>B,"condition")},{id:"javBusBtn",condition:d(e=>!!(M&&e&&!e.includes("FC2")),"condition")},{id:"fanzaBtn",providerId:"dmm",noHandle:!0,condition:d(e=>!!(e&&!e.includes("FC2")),"condition")}]}getName(){return"OtherSitePlugin"}async getSiteConfigs(){let e=await this.getSettingCache(),t=this.getRuntimeService("movie").externalSites(e);return this.siteConfigs.map(s=>({...t.find((a=>a.id===s.id))||{},...s}))}async initCss(){return` + `);r.tags?.length&&g.find(".magnet-info").after($("
      ").addClass("magnet-tags").append(r.tags.map((f=>$("").addClass("jhs-badge").text(f)))));let m=g.find(".magnet-copy");g.find(".copy-btn").removeClass("magnet-hub-btn").addClass("jhs-btn--secondary"),m.append(``),g.appendTo(e)})),e.on("click",".copy-btn",(async r=>{let i=$(r.currentTarget),n=i.data("magnet");await utils.copyToClipboard("磁力链接",n)&&a(i)}))):e.append('
      没有找到相关结果
      ')}calcMagnetScore(e){return ps(e)}};d(Gi,"MagnetHubPlugin");var ua=Gi;var Qi=class Qi extends R{constructor(){super(...arguments),this.mountGeneration=0,this._mountGenerations=new WeakMap,this.siteConfigs=[{id:"javTrailersBtn"},{id:"123AvBtn",providerId:"av123"},{id:"jableBtn"},{id:"avgleBtn"},{id:"missAvBtn"},{id:"supJavBtn"},{id:"javDbBtn",condition:d(()=>B,"condition")},{id:"javBusBtn",condition:d(e=>!!(M&&e&&!e.includes("FC2")),"condition")},{id:"fanzaBtn",providerId:"dmm",noHandle:!0,condition:d(e=>!!(e&&!e.includes("FC2")),"condition")}]}getName(){return"OtherSitePlugin"}async getSiteConfigs(){let e=await this.getSettingCache(),t=this.getRuntimeService("movie").externalSites(e);return this.siteConfigs.map(s=>({...t.find((a=>a.id===s.id))||{},...s}))}async initCss(){return` `}async handle(){let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")(),s=d(a=>{a.detail?.names?.includes("enableLoadOtherSite")&&(e.snapshot().enableLoadOtherSite==="no"?this.unmount():this.mount().catch((i=>clog.error("外部站点重新挂载失败",i))))},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>e.removeEventListener("settings.changed",s))),await this.mount()}async mount(){isDetailPage&&this.getRuntimeService("settings").snapshot().enableLoadOtherSite!=="no"&&await this.loadOtherSite(null,null,{autoDetect:!1})}unmount(){this.mountGeneration++,this._mountGenerations.set(document,(this._mountGenerations.get(document)||0)+1),$("[data-jhs-other-site-box],[data-jhs-other-site-settings]").remove()}async loadOtherSite(e,t,s={}){let a=this.getRuntimeService("settings");if(a.snapshot().enableLoadOtherSite==="no")return;let r=s.root?.[0]||null,i=r?(this._mountGenerations.get(r)||0)+1:++this.mountGeneration;r&&this._mountGenerations.set(r,i);let n=d(()=>(r?i===this._mountGenerations.get(r):i===this.mountGeneration)&&(typeof s.isActive=="function"?s.isActive():!0)&&a.snapshot().enableLoadOtherSite!=="no","isActive"),l=s.root?$(s.root):$(document),c=s.target?$(s.target):$(this.getRuntimeService("host").locateDetailSlots().summary);if(!c.length||!n())return;l.find("#otherSiteBox,#settingsArea,[data-jhs-other-site-box],[data-jhs-other-site-settings]").remove(),e=C(e)||this.getPageInfo().carNum;let h=this.getEnabledSites(),u=(await this.getSiteConfigs()).map((v=>({...v,sourceCarNum:t})));if(!n())return;let p={root:l,target:c,configs:u,carNum:e,isActive:n},g=$('
      '),m=g.find(".jhs-site-list"),f=$('
      ');if(u.forEach((v=>{if(v.condition&&v.condition(v.sourceCarNum)===!1)return;let b=$('').attr("data-jhs-site-id",v.id).toggleClass("jhs-is-hidden",!h.includes(v.id));b.find("span").text(v.id.replace("Btn","")),m.append(b)})),m.append('',''),c.append(g,f),p.box=g,p.settings=f,!e)return g.find(".site-btn").removeAttr("href").attr({"aria-disabled":"true",title:"番号不可用"}),g.find('[data-jhs-role="detect-sites"]').prop("disabled",!0),this.renderSettingsArea(p),this.setupEventListeners(p),void clog.warn("跳过第三方站点解析:番号不可用");if(g.find('[data-jhs-site-id="javTrailersBtn"]').on("click",(v=>{v.preventDefault();let b=$(v.currentTarget).attr("href"),w=v.ctrlKey||v.metaKey?b:b+"?handle=1";utils.openPage(w,e,!1,v)})),await Ae(u,4,(async v=>{v.condition&&v.condition(v.sourceCarNum)===!1||await this.prepareSiteLink(e,v,p)})),!!n())return this.renderSettingsArea(p),this.setupEventListeners(p),g.find('[data-jhs-role="detect-sites"]').off("click").on("click",(v=>{v.preventDefault(),this.detectOtherSites(e,p)})),s.autoDetect&&await this.detectOtherSites(e,p),g}async prepareSiteLink(e,t,s={root:$(document),configs:[],isActive:d(()=>!0,"isActive")}){let a=s.root.find(`[data-jhs-site-id="${t.id}"],#${t.id}`).first();if(!(e=C(e)))return a.removeAttr("href").attr({"aria-disabled":"true",title:"番号不可用"}),void this.setSiteState(a,"idle");if(t.providerId){let r=this.getRuntimeService("movie").searchUrl(t.providerId,{carNum:e});return void(r?(a.attr("href",r),a.attr("title","点击前往外部搜索页"),this.setSiteState(a,"idle")):(a.attr("title","外部站点地址不可用"),this.setSiteState(a,"domain-error")))}try{s.isActive?.()!==!1&&t.searchUrl&&(a.attr("href",t.searchUrl(e)),a.attr("title","点击前往外部搜索页;点击检测按钮后才自动检测"),this.setSiteState(a,"idle"))}catch{s.isActive?.()!==!1&&(a.attr("title","外部站点地址未配置或不可用"),this.setSiteState(a,"domain-error"))}}async detectOtherSites(e,t={root:$(document),configs:this.siteConfigs,isActive:d(()=>!0,"isActive")}){let s=t.root.find('[data-jhs-role="detect-sites"],#detectOtherSiteBtn').first(),a=s.text();return(e=C(e))?(s.text("检测中").prop("disabled",!0).addClass("is-checking"),await Ae(t.configs,4,(async r=>{r.condition&&r.condition(r.sourceCarNum)===!1||await this.handleSite(e,r,t)})),t.isActive?.()!==!1&&s.text(a).prop("disabled",!1).removeClass("is-checking")):(s.prop("disabled",!0),void clog.warn("跳过第三方站点检测:番号不可用"))}setSiteState(e,t){e.removeClass("is-checking is-available is-unavailable is-domain-error"),t!=="idle"&&e.addClass(`is-${t}`)}async handleSite(e,t,s={root:$(document),configs:[],isActive:d(()=>!0,"isActive")}){let a=s.root.find(`[data-jhs-site-id="${t.id}"],#${t.id}`).first();if(a.removeAttr("href").find(".site-tag").remove(),this.setSiteState(a,"checking"),t.noHandle&&t.noHandle===!0){a.attr("href",this.getRuntimeService("movie").searchUrl(t.providerId,{carNum:e})||"");let r="jhs_other_site_dmm",i=this.getRuntimeService("storage").getLocal(r),n=null;try{let l=i?JSON.parse(i):{};n=l&&typeof l=="object"?l[e]:null}catch{n=null}n?(a.attr("href",n.url),n.type==="multiple"&&a.append('多结果'),this.setSiteState(a,"available")):this.setSiteState(a,"idle")}else if(t.providerId)try{let r=await this.getRuntimeService("scope")(),i=await this.getRuntimeService("movie").resolve({carNum:e,providerId:t.providerId},{scope:r});if(s.isActive?.()===!1)return;let n=this.getRuntimeService("movie").searchUrl(t.providerId,{carNum:e});a.attr("href",i?.url||n||""),this.setSiteState(a,i?.url?"available":"unavailable"),i?.url||a.attr("title","未查询到, 点击前往搜索页")}catch{s.isActive?.()!==!1&&(a.attr("title","请求失败。"),this.setSiteState(a,"unavailable"),clog.warn(`检测第三方资源失败, ${t.id.replace("Btn","")}`))}else try{if(a.attr("href"))return void this.setSiteState(a,"idle");if(utils.isHidden(a))return;let r="jhs_other_site",i=this.getRuntimeService("storage"),n=i.getLocal(r),l=n?JSON.parse(n):{},c=e+"_"+t.id.replace("Btn",""),h=l[c],u=Date.now();if(h&&h.time&&u-h.time<864e5)return a.attr("href",h.url),h.type==="multiple"&&a.append('多结果'),void this.setSiteState(a,"available");let p=await this.getRuntimeService("scope")(),g=await this.getRuntimeService("movie").searchExternalSite(t.id,e,{settings:await this.getSettingCache(),scope:p}),m=g.searchUrl;if(a.attr("href",m),s.isActive?.()===!1)return;let f=g.matches,v="",b=null;if(f.length===1){let w=f[0];a.attr("href",w),this.setSiteState(a,"available"),b={type:"single",url:w,time:u}}else f.length>1?(a.attr("href",m),v+='多结果',this.setSiteState(a,"available"),b={type:"multiple",url:m,time:u}):(a.attr("href",m),a.attr("title","未查询到, 点击前往搜索页"),this.setSiteState(a,"unavailable"));if(b){let w=i.getLocal(r),S=w?JSON.parse(w):{};S[c]=b,i.setLocal(r,JSON.stringify(S))}v&&a.append(v)}catch(r){let i=String(r),n=t.id.replace("Btn",""),l=r?.code;l==="CIRCUIT_OPEN"?(a.attr("title",i),this.setSiteState(a,"domain-error"),clog.warn(`检测第三方资源跳过, ${n} 已熔断`)):l==="CF_BLOCKED"?(a.attr("title","请求失败:Cloudflare 安全检查。"),this.setSiteState(a,"domain-error"),clog.warn(`检测第三方资源失败, ${n} 需Cloudflare安全检查`)):l==="INVALID_URL"?(a.attr("title","域名失效"),this.setSiteState(a,"domain-error"),clog.warn(`检测第三方资源失败, ${n} 域名或重定向无效`)):l==="NOT_FOUND"?(a.attr("title","未查询到, 点击前往搜索页"),this.setSiteState(a,"unavailable")):(clog.error(r),a.attr("title","请求失败。"),this.setSiteState(a,"unavailable"),clog.warn(`检测第三方资源失败, ${n}`))}}async getSettingCache(){return this.getRuntimeService("settings").snapshot()}async getMissAvUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="missAvBtn")?.baseUrl||""}async getjableUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="jableBtn")?.baseUrl||""}async getAvgleUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="avgleBtn")?.baseUrl||""}async getJavTrailersUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="javTrailersBtn")?.baseUrl||""}async getAv123Url(){return this.getRuntimeService("movie").providerOrigin("av123")||""}async getJavDbUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="javDbBtn")?.baseUrl||""}async getJavBusUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="javBusBtn")?.baseUrl||""}async getSupJavUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="supJavBtn")?.baseUrl||""}getEnabledSites(){let e=this.siteConfigs.map((t=>t.id));try{let t=this.getRuntimeService("storage").getLocal("jhs_enabled_sites");if(!t)return e;let s=JSON.parse(t);return Array.isArray(s)?s.filter((a=>e.includes(a))):e}catch(t){return clog.warn("外部站点配置损坏,已回退默认值",t),e}}saveEnabledSites(e){this.getRuntimeService("storage").setLocal("jhs_enabled_sites",JSON.stringify(e))}renderSettingsArea(e={root:$(document),configs:this.siteConfigs}){let t=this.getEnabledSites(),s=e.root.find('[data-jhs-role="site-checkboxes"],#siteCheckboxes').first().empty();e.configs.forEach((a=>{let r=$('').attr("data-site-id",a.id).prop("checked",t.includes(a.id));s.append($('').append(r,$("").text(a.id.replace("Btn",""))))}))}setupEventListeners(e={root:$(document),configs:this.siteConfigs,carNum:null}){let t=e.root.find("[data-jhs-other-site-settings],#settingsArea").first();e.root.find('[data-jhs-role="site-settings"],#settingSiteBtn').off("click.jhsOtherSite").on("click.jhsOtherSite",(()=>{t.toggleClass("jhs-is-hidden")})),t.off("change.jhsOtherSite").on("change.jhsOtherSite",'input[type="checkbox"]',(async s=>{let a=$(s.currentTarget).attr("data-site-id");try{if(s.currentTarget.checked){e.root.find(`[data-jhs-site-id="${a}"],#${a}`).removeClass("jhs-is-hidden");let r=e.carNum||this.getPageInfo().carNum,i=e.configs.find((n=>n.id===a));i&&await this.prepareSiteLink(r,i,e)}else e.root.find(`[data-jhs-site-id="${a}"],#${a}`).addClass("jhs-is-hidden");this.saveEnabledSites(t.find('input[type="checkbox"]:checked').map(((r,i)=>$(i).attr("data-site-id"))).get())}catch(r){clog.warn(`外部站点 ${a||"unknown"} 状态更新失败`,r)}}))}};d(qi,"OtherSitePlugin");var la=qi;var Hi=class Hi extends I{getName(){return"RelatedPlugin"}async handle(){if(!window.isDetailPage||!M)return;let e=new URL(window.location.href).pathname.split("/").filter(Boolean).pop();e&&await this.showRelated(this.getHostedSlot("related"),e)}getHostedSlot(e){let t=this.getRuntimeService("host").locateDetailSlots()[e];return t?$(t):$()}async showRelated(e,t,s={}){return new Ot({related:this.getRuntimeService("related"),settings:this.getRuntimeService("settings"),scope:d(()=>this.getRuntimeService("scope")(),"scope")}).show(e?.length?e:this.getHostedSlot("related"),t,s)}};d(Hi,"RelatedPlugin");var ca=Hi;var Wi=class Wi extends I{getName(){return"ReviewPlugin"}async handle(){if(window.isDetailPage){if(M){let e=this.parseMovieId(window.location.href);await this.showReview(e,this.getHostedSlot("reviews"))}if(B){let e=this.getPageInfo().carNum;if(!e)return void clog.warn("跳过 JavBus 评论解析:番号不可用");let t=await this.getRuntimeService("scope")(),s=this.getRuntimeService("settings"),a=!1,r=d(async()=>{if(!(a||t?.disposed||s.snapshot().enableLoadReview==="no")){a=!0;try{let i=await this.getRuntimeService("movie").resolve({carNum:e},{scope:t});i?.movieId&&!t?.disposed&&s.snapshot().enableLoadReview!=="no"&&await this.showReview(i.movieId,this.getHostedSlot("reviews"))}finally{a=!1}}},"mount");t?.listen?.(s,"settings.changed",i=>{i.detail?.names?.includes("enableLoadReview")&&r().catch(n=>clog.error("加载评论失败",n))}),await r()}}}getHostedSlot(e){let t=this.getRuntimeService("host").locateDetailSlots()[e];return t?$(t):$()}async showReview(e,t,s={}){return new Ut({review:this.getRuntimeService("review"),settings:this.getRuntimeService("settings"),storage:this.getRuntimeService("storage"),scope:d(()=>this.getRuntimeService("scope")(),"scope")}).show(e,t?.length?t:this.getHostedSlot("reviews"),s)}};d(Wi,"ReviewPlugin");var da=Wi;function zh(o){return[...o.querySelectorAll(".tags .tag")].some(e=>/中字磁[链鏈]/u.test(e.textContent||""))}d(zh,"hasChineseSubtitleMagnet");var ua=class ua extends I{getName(){return"TOP250Plugin"}async initCss(){return""}async handle(){if(je(window.location).kind!=="top250-ranking")return;let e=this.getRuntimeService("host"),t=e.locateListRoot?.(),s=e.getTop250FilterContainer?.();if(!t||!s||s.querySelector(".jhs-top250-subtitle"))return;let a=document.createElement("div");a.className="jhs-top250-subtitle",a.setAttribute("role","group"),a.setAttribute("aria-label","TOP250 已加载条目筛选");for(let[i,n]of[["all","已加载条目:全部"],["with","已加载条目:含中字磁链"],["without","已加载条目:无中字磁链"]]){let l=document.createElement("button");l.type="button",l.className="jhs-btn jhs-btn--secondary",l.dataset.jhsSubtitle=i,l.textContent=n,a.append(l)}e.mountTop250SubtitleControls(a);let r=new URLSearchParams(window.location.search).get("jhs_subtitle");this.applySubtitleFilter(["with","without"].includes(r||"")?r:"all",a),a.addEventListener("click",i=>{let l=i.target?.closest("button[data-jhs-subtitle]")?.getAttribute("data-jhs-subtitle");if(!["all","with","without"].includes(l||""))return;let c=new URL(window.location.href);l==="all"?c.searchParams.delete("jhs_subtitle"):c.searchParams.set("jhs_subtitle",l),window.history.replaceState(window.history.state,"",c.href),this.applySubtitleFilter(l,a)})}applySubtitleFilter(e,t){let s=this.getRuntimeService("host");for(let a of s.locateTop250SubtitleCards()){let r=zh(a);a.classList.toggle("jhs-top250-subtitle-hidden",e==="with"?!r:e==="without"&&r)}t.querySelectorAll("button[data-jhs-subtitle]").forEach(a=>{let r=a.getAttribute("data-jhs-subtitle")===e;a.setAttribute("aria-pressed",String(r)),a.classList.toggle("active",r)}),s.syncTop250SubtitleLinks?.(e)}};d(ua,"Top250Plugin"),dt(ua,"legacyPluginId","TOP250Plugin");var ha=ua;var Ji=class Ji extends I{getName(){return"FavoriteActressesPlugin"}getStartupMode(){return"idle"}bindImmediateEvents(){this.bindEvent()}async handle(){await this.highlightActress(),this.replaceActressAvatar()}async highlightActress(){if(!isDetailPage||await storageManager.getSetting("enableFavoriteActresses",E)!==E)return;let e=await storageManager.getFavoriteActressList();if(!e||e.length===0)return;let t=new Set;e.forEach((s=>{s.starId&&t.add(String(s.starId).trim())})),t.size!==0&&$(".female").prev().each(((s,a)=>{let r=$(a),i=r.attr("href"),n=null;if(i){let c=(i.endsWith("/")?i.slice(0,-1):i).split("/"),h=c[c.length-1];h&&(n=h.trim())}let l=!1;n&&(l=t.has(n)),l&&(r.addClass("highlighted"),r.attr("title","高亮已收藏演员, 可在设置-基础配置中关闭"))}))}async removeActorFromStorage(e){await storageManager.removeFavoriteActress(e)&&(clog.log("移除演员成功"),document.dispatchEvent(new CustomEvent("actress-state-changed",{detail:{starId:String(e)}})))}bindEvent(){let e=/\/actors\/(\w+)\/(collect|uncollect)/;$(document).on("confirm:complete",'a[href*="/actors/"][href*="/uncollect"]',(async t=>{let[s]=t.detail;if(!s)return;let a=$(t.currentTarget).attr("href").match(e),r=a?a[1]:null;r&&await this.removeActorFromStorage(r)})),$("#button-collect-actor").click((async t=>{let s=$("#button-collect-actor").attr("href").match(e),a=s?s[1]:null,r=[],i=$(".actor-section-name");i.length&&i.text().trim().split(",").forEach((u=>{r.push(u.trim())}));let n=$(".section-meta:not(:contains('影片'))");if(n.length&&n.text().trim().split(",").forEach((u=>{r.push(u.trim())})),!r.length)return void clog.error("获取演员名称失败");let l=r[0];if(!a)return void clog.error("无法获取演员ID进行收藏操作。");let c=($(".avatar").first().css("background-image")||"").replace(/^url\(["']?|["']?\)$/g,""),h={starId:a,name:l,allName:r,avatar:c};await storageManager.addFavoriteActressList([h])===1?(clog.log(`收藏演员成功: ${l} (ID: ${a})`),document.dispatchEvent(new CustomEvent("actress-state-changed",{detail:{starId:String(a)}}))):clog.log(`收藏演员失败: ${l} (ID: ${a})`)})),$("#button-uncollect-actor").click((async t=>{let s=$("#button-uncollect-actor").attr("href").match(e),a=s?s[1]:null;a?await this.removeActorFromStorage(a):clog.error("无法获取演员ID进行取消收藏操作。")}))}async replaceActressAvatar(){let e=this.getActressId();if(!e)return;let t=(await storageManager.getFavoriteActressList()).find((s=>s.starId===e));if(t&&t.avatar){let s=`url('${t.avatar}')`,a=$(".avatar").first();if(a.length===0&&($(".section-columns").prepend('
      '),a=$(".avatar").first()),a.length===0)return;a.css("background-image").trim().toLowerCase()!==s.trim().toLowerCase()&&(a.css("background-image",s),a.css("background-size","cover"),a.css("background-position","top center"),a.css("background-repeat","no-repeat"))}}};d(Ji,"FavoriteActressesPlugin");var pa=Ji;var Ki=class Ki extends I{getName(){return"BusImgPlugin"}handle(){}async getVisibleImageItems(e,t){let s=[],a=document.querySelectorAll(e);for(let r of a)if(!utils.isHidden(r)){let i=r.querySelector(t);if(!(i instanceof HTMLImageElement))continue;i.style.removeProperty("height");let n=i.offsetHeight;n>0&&s.push({element:r,imgElement:i,height:n})}return s}async logImageHeightsByRow(e={}){let t=e.vertical??e.enableVerticalModel??await storageManager.getSetting("enableVerticalModel",ne),s=e.columns??e.containerColumns??await storageManager.getSetting("containerColumns",5);if(t===E)return;let a=this.getSelector().itemSelector,r=Number(s)||5,i=await this.getVisibleImageItems(a,"img");if(i.length===0)return;let n=[];for(let l=0;l{let h=l.map((m=>m.height));if(h.length<2)return;let u=Math.min(...h),p=Math.max(...h),g=0;p-u>50&&(g=u,l.forEach((m=>{if(m.height!==g){let f=`${g}px`;m.imgElement.style.setProperty("height",f,"important")}})))}))}};d(Ki,"BusImgPlugin");var ga=Ki;var zt=d((o,e)=>{if(!o||o.length===0)return null;let t=new Set(o);if(e&&t.has(e))return e;let s=rt.map((a=>a.quality)).reverse();for(let a of s)if(t.has(a))return a;return o[0]||null},"Z"),Gi="jhs_dmm_video",Fh=30*864e5,_c=500;function Qi(o){if(!o)return{};try{let e=JSON.parse(o);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}d(Qi,"parseJsonMap");function Yi(o){let e=Date.now();for(let s of Object.keys(o)){let a=o[s];(!a||a.time&&e-a.time>Fh)&&delete o[s]}let t=Object.keys(o);if(t.length>_c){t.sort(((s,a)=>(o[s].time||0)-(o[a].time||0)));for(let s of t.slice(0,t.length-_c))delete o[s]}return o}d(Yi,"pruneDmmCache");function Re(o){return o?.enablePreviewVideo!=="no"}d(Re,"isPreviewEnabled");function ds(o){return o?.enableLoadPreviewVideo!=="no"}d(ds,"isDmmEnabled");function $c(o){return Re(o)}d($c,"canUsePreview");function Ft(o){return Re(o)&&ds(o)}d(Ft,"canUseDmmPreview");function ma(o){return Ft(o)}d(ma,"canUseCardPreview");var en=class en{constructor(e,t,s,a){this.carNum=e||"",this.storage=t,this.movie=s,this.scope=a,this.lastError=null}_checkCache(){let e=Yi(Qi(this.storage.getLocal(Gi)));return e[this.carNum]?(clog.debug("缓存中存在预览视频信息",e[this.carNum]),e[this.carNum]):null}_updateCache(e){let t=Yi(Qi(this.storage.getLocal(Gi)));t[this.carNum]={...e,time:Date.now()},clog.debug("成功解析出预览视频并已缓存:",e),this.storage.setLocal(Gi,JSON.stringify(t))}async _fetchRemote(){let e=await this.movie.preview("dmm",{carNum:this.carNum},{scope:this.scope}),t=$("#fanzaBtn");if(!e.sources)return clog.warn("所有关键词尝试均未找到匹配的Content ID, 解析Dmm视频失败"),t.attr("href",e.searchUrl).attr("title","未查询到, 点击前往搜索页").css("backgroundColor","var(--jhs-status-filter)"),null;t.attr("href",e.pageUrl).css("backgroundColor","var(--jhs-status-down)"),e.matchType==="multiple"&&t.append('多结果');let s="jhs_other_site_dmm",a=Yi(Qi(this.storage.getLocal(s)));return a[this.carNum]={type:e.matchType,url:e.pageUrl,time:Date.now()},this.storage.setLocal(s,JSON.stringify(a)),e.sources}async fetchVideo(){let e=C(this.carNum);if(!e)return clog.warn("跳过 DMM 解析:番号不可用"),null;this.carNum=e;let t=this._checkCache();if(t)return t;try{let s=this.carNum.toLowerCase();if(s.startsWith("heyzo")||/^(n\d+|\d+(-\d+)*)$/.test(s)||/^n\d+$/.test(s))return clog.debug("无码番号类型,取消 DMM 解析"),null;if(this.carNum.includes("VR-"))return clog.debug("VR 类型,取消 DMM 解析"),null;let a=await this._fetchRemote();return a?(this._updateCache(a),a):null}catch(s){let a=s;this.lastError=s instanceof we?s:new we("dmm",a?.code||"PARSE_ERROR",a?.message||String(s),{cause:s,retryable:a?.retryable===!0}),clog.error("DMM API 搜索失败:",this.lastError);let r=$("#fanzaBtn");return r.attr("href",this.movie.searchUrl("dmm",{carNum:this.carNum})),r.attr("title","未查询到, 点击前往搜索页"),r.css("backgroundColor","var(--jhs-status-filter)"),null}}};d(en,"DmmPreviewParser");var Zi=en;async function Xi(o,e,t,s){let a=new Zi(o,e,t,s);return{sources:await a.fetchVideo(),error:a.lastError}}d(Xi,"fetchDmmPreview");async function fa(o,e,t,s,a){return ds(a)?Xi(o,e,t,s):{sources:null,error:null}}d(fa,"fetchDmmPreviewIfEnabled");var tn=class tn extends I{constructor(){super(...arguments),this._busPreviewGeneration=0}getName(){return"BusPreviewVideoPlugin"}async initCss(){return` + `}async handle(){let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")(),s=d(a=>{a.detail?.names?.includes("enableLoadOtherSite")&&(e.snapshot().enableLoadOtherSite==="no"?this.unmount():this.mount().catch((i=>clog.error("外部站点重新挂载失败",i))))},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>e.removeEventListener("settings.changed",s))),await this.mount()}async mount(){isDetailPage&&this.getRuntimeService("settings").snapshot().enableLoadOtherSite!=="no"&&await this.loadOtherSite(null,null,{autoDetect:!1})}unmount(){this.mountGeneration++,this._mountGenerations.set(document,(this._mountGenerations.get(document)||0)+1),$("[data-jhs-other-site-box],[data-jhs-other-site-settings]").remove()}async loadOtherSite(e,t,s={}){let a=this.getRuntimeService("settings");if(a.snapshot().enableLoadOtherSite==="no")return;let r=s.root?.[0]||null,i=r?(this._mountGenerations.get(r)||0)+1:++this.mountGeneration;r&&this._mountGenerations.set(r,i);let n=d(()=>(r?i===this._mountGenerations.get(r):i===this.mountGeneration)&&(typeof s.isActive=="function"?s.isActive():!0)&&a.snapshot().enableLoadOtherSite!=="no","isActive"),l=s.root?$(s.root):$(document),c=s.target?$(s.target):$(this.getRuntimeService("host").locateDetailSlots().summary);if(!c.length||!n())return;l.find("#otherSiteBox,#settingsArea,[data-jhs-other-site-box],[data-jhs-other-site-settings]").remove(),e=C(e)||this.getPageInfo().carNum;let h=this.getEnabledSites(),u=(await this.getSiteConfigs()).map((v=>({...v,sourceCarNum:t})));if(!n())return;let p={root:l,target:c,configs:u,carNum:e,isActive:n},g=$('
      '),m=g.find(".jhs-site-list"),f=$('
      ');if(u.forEach((v=>{if(v.condition&&v.condition(v.sourceCarNum)===!1)return;let b=$('').attr("data-jhs-site-id",v.id).toggleClass("jhs-is-hidden",!h.includes(v.id));b.find("span").text(v.id.replace("Btn","")),m.append(b)})),m.append('',''),c.append(g,f),p.box=g,p.settings=f,!e)return g.find(".site-btn").removeAttr("href").attr({"aria-disabled":"true",title:"番号不可用"}),g.find('[data-jhs-role="detect-sites"]').prop("disabled",!0),this.renderSettingsArea(p),this.setupEventListeners(p),void clog.warn("跳过第三方站点解析:番号不可用");if(g.find('[data-jhs-site-id="javTrailersBtn"]').on("click",(v=>{v.preventDefault();let b=$(v.currentTarget).attr("href"),w=v.ctrlKey||v.metaKey?b:b+"?handle=1";utils.openPage(w,e,!1,v)})),await Ae(u,4,(async v=>{v.condition&&v.condition(v.sourceCarNum)===!1||await this.prepareSiteLink(e,v,p)})),!!n())return this.renderSettingsArea(p),this.setupEventListeners(p),g.find('[data-jhs-role="detect-sites"]').off("click").on("click",(v=>{v.preventDefault(),this.detectOtherSites(e,p)})),s.autoDetect&&await this.detectOtherSites(e,p),g}async prepareSiteLink(e,t,s={root:$(document),configs:[],isActive:d(()=>!0,"isActive")}){let a=s.root.find(`[data-jhs-site-id="${t.id}"],#${t.id}`).first();if(!(e=C(e)))return a.removeAttr("href").attr({"aria-disabled":"true",title:"番号不可用"}),void this.setSiteState(a,"idle");if(t.providerId){let r=this.getRuntimeService("movie").searchUrl(t.providerId,{carNum:e});return void(r?(a.attr("href",r),a.attr("title","点击前往外部搜索页"),this.setSiteState(a,"idle")):(a.attr("title","外部站点地址不可用"),this.setSiteState(a,"domain-error")))}try{s.isActive?.()!==!1&&t.searchUrl&&(a.attr("href",t.searchUrl(e)),a.attr("title","点击前往外部搜索页;点击检测按钮后才自动检测"),this.setSiteState(a,"idle"))}catch{s.isActive?.()!==!1&&(a.attr("title","外部站点地址未配置或不可用"),this.setSiteState(a,"domain-error"))}}async detectOtherSites(e,t={root:$(document),configs:this.siteConfigs,isActive:d(()=>!0,"isActive")}){let s=t.root.find('[data-jhs-role="detect-sites"],#detectOtherSiteBtn').first(),a=s.text();return(e=C(e))?(s.text("检测中").prop("disabled",!0).addClass("is-checking"),await Ae(t.configs,4,(async r=>{r.condition&&r.condition(r.sourceCarNum)===!1||await this.handleSite(e,r,t)})),t.isActive?.()!==!1&&s.text(a).prop("disabled",!1).removeClass("is-checking")):(s.prop("disabled",!0),void clog.warn("跳过第三方站点检测:番号不可用"))}setSiteState(e,t){e.removeClass("is-checking is-available is-unavailable is-domain-error"),t!=="idle"&&e.addClass(`is-${t}`)}async handleSite(e,t,s={root:$(document),configs:[],isActive:d(()=>!0,"isActive")}){let a=s.root.find(`[data-jhs-site-id="${t.id}"],#${t.id}`).first();if(a.removeAttr("href").find(".site-tag").remove(),this.setSiteState(a,"checking"),t.noHandle&&t.noHandle===!0){a.attr("href",this.getRuntimeService("movie").searchUrl(t.providerId,{carNum:e})||"");let r="jhs_other_site_dmm",i=this.getRuntimeService("storage").getLocal(r),n=null;try{let l=i?JSON.parse(i):{};n=l&&typeof l=="object"?l[e]:null}catch{n=null}n?(a.attr("href",n.url),n.type==="multiple"&&a.append('多结果'),this.setSiteState(a,"available")):this.setSiteState(a,"idle")}else if(t.providerId)try{let r=await this.getRuntimeService("scope")(),i=await this.getRuntimeService("movie").resolve({carNum:e,providerId:t.providerId},{scope:r});if(s.isActive?.()===!1)return;let n=this.getRuntimeService("movie").searchUrl(t.providerId,{carNum:e});a.attr("href",i?.url||n||""),this.setSiteState(a,i?.url?"available":"unavailable"),i?.url||a.attr("title","未查询到, 点击前往搜索页")}catch{s.isActive?.()!==!1&&(a.attr("title","请求失败。"),this.setSiteState(a,"unavailable"),clog.warn(`检测第三方资源失败, ${t.id.replace("Btn","")}`))}else try{if(a.attr("href"))return void this.setSiteState(a,"idle");if(utils.isHidden(a))return;let r="jhs_other_site",i=this.getRuntimeService("storage"),n=i.getLocal(r),l=n?JSON.parse(n):{},c=e+"_"+t.id.replace("Btn",""),h=l[c],u=Date.now();if(h&&h.time&&u-h.time<864e5)return a.attr("href",h.url),h.type==="multiple"&&a.append('多结果'),void this.setSiteState(a,"available");let p=await this.getRuntimeService("scope")(),g=await this.getRuntimeService("movie").searchExternalSite(t.id,e,{settings:await this.getSettingCache(),scope:p}),m=g.searchUrl;if(a.attr("href",m),s.isActive?.()===!1)return;let f=g.matches,v="",b=null;if(f.length===1){let w=f[0];a.attr("href",w),this.setSiteState(a,"available"),b={type:"single",url:w,time:u}}else f.length>1?(a.attr("href",m),v+='多结果',this.setSiteState(a,"available"),b={type:"multiple",url:m,time:u}):(a.attr("href",m),a.attr("title","未查询到, 点击前往搜索页"),this.setSiteState(a,"unavailable"));if(b){let w=i.getLocal(r),S=w?JSON.parse(w):{};S[c]=b,i.setLocal(r,JSON.stringify(S))}v&&a.append(v)}catch(r){let i=String(r),n=t.id.replace("Btn",""),l=r?.code;l==="CIRCUIT_OPEN"?(a.attr("title",i),this.setSiteState(a,"domain-error"),clog.warn(`检测第三方资源跳过, ${n} 已熔断`)):l==="CF_BLOCKED"?(a.attr("title","请求失败:Cloudflare 安全检查。"),this.setSiteState(a,"domain-error"),clog.warn(`检测第三方资源失败, ${n} 需Cloudflare安全检查`)):l==="INVALID_URL"?(a.attr("title","域名失效"),this.setSiteState(a,"domain-error"),clog.warn(`检测第三方资源失败, ${n} 域名或重定向无效`)):l==="NOT_FOUND"?(a.attr("title","未查询到, 点击前往搜索页"),this.setSiteState(a,"unavailable")):(clog.error(r),a.attr("title","请求失败。"),this.setSiteState(a,"unavailable"),clog.warn(`检测第三方资源失败, ${n}`))}}async getSettingCache(){return this.getRuntimeService("settings").snapshot()}async getMissAvUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="missAvBtn")?.baseUrl||""}async getjableUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="jableBtn")?.baseUrl||""}async getAvgleUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="avgleBtn")?.baseUrl||""}async getJavTrailersUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="javTrailersBtn")?.baseUrl||""}async getAv123Url(){return this.getRuntimeService("movie").providerOrigin("av123")||""}async getJavDbUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="javDbBtn")?.baseUrl||""}async getJavBusUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="javBusBtn")?.baseUrl||""}async getSupJavUrl(){return(await this.getSiteConfigs()).find(e=>e.id==="supJavBtn")?.baseUrl||""}getEnabledSites(){let e=this.siteConfigs.map((t=>t.id));try{let t=this.getRuntimeService("storage").getLocal("jhs_enabled_sites");if(!t)return e;let s=JSON.parse(t);return Array.isArray(s)?s.filter((a=>e.includes(a))):e}catch(t){return clog.warn("外部站点配置损坏,已回退默认值",t),e}}saveEnabledSites(e){this.getRuntimeService("storage").setLocal("jhs_enabled_sites",JSON.stringify(e))}renderSettingsArea(e={root:$(document),configs:this.siteConfigs}){let t=this.getEnabledSites(),s=e.root.find('[data-jhs-role="site-checkboxes"],#siteCheckboxes').first().empty();e.configs.forEach((a=>{let r=$('').attr("data-site-id",a.id).prop("checked",t.includes(a.id));s.append($('').append(r,$("").text(a.id.replace("Btn",""))))}))}setupEventListeners(e={root:$(document),configs:this.siteConfigs,carNum:null}){let t=e.root.find("[data-jhs-other-site-settings],#settingsArea").first();e.root.find('[data-jhs-role="site-settings"],#settingSiteBtn').off("click.jhsOtherSite").on("click.jhsOtherSite",(()=>{t.toggleClass("jhs-is-hidden")})),t.off("change.jhsOtherSite").on("change.jhsOtherSite",'input[type="checkbox"]',(async s=>{let a=$(s.currentTarget).attr("data-site-id");try{if(s.currentTarget.checked){e.root.find(`[data-jhs-site-id="${a}"],#${a}`).removeClass("jhs-is-hidden");let r=e.carNum||this.getPageInfo().carNum,i=e.configs.find((n=>n.id===a));i&&await this.prepareSiteLink(r,i,e)}else e.root.find(`[data-jhs-site-id="${a}"],#${a}`).addClass("jhs-is-hidden");this.saveEnabledSites(t.find('input[type="checkbox"]:checked').map(((r,i)=>$(i).attr("data-site-id"))).get())}catch(r){clog.warn(`外部站点 ${a||"unknown"} 状态更新失败`,r)}}))}};d(Qi,"OtherSitePlugin");var pa=Qi;var Yi=class Yi extends R{getName(){return"RelatedPlugin"}async handle(){if(!window.isDetailPage||!M)return;let e=new URL(window.location.href).pathname.split("/").filter(Boolean).pop();e&&await this.showRelated(this.getHostedSlot("related"),e)}getHostedSlot(e){let t=this.getRuntimeService("host").locateDetailSlots()[e];return t?$(t):$()}async showRelated(e,t,s={}){return new zt({related:this.getRuntimeService("related"),settings:this.getRuntimeService("settings"),scope:d(()=>this.getRuntimeService("scope")(),"scope")}).show(e?.length?e:this.getHostedSlot("related"),t,s)}};d(Yi,"RelatedPlugin");var ga=Yi;var Zi=class Zi extends R{getName(){return"ReviewPlugin"}async handle(){if(window.isDetailPage){if(M){let e=this.parseMovieId(window.location.href);await this.showReview(e,this.getHostedSlot("reviews"))}if(B){let e=this.getPageInfo().carNum;if(!e)return void clog.warn("跳过 JavBus 评论解析:番号不可用");let t=await this.getRuntimeService("scope")(),s=this.getRuntimeService("settings"),a=!1,r=d(async()=>{if(!(a||t?.disposed||s.snapshot().enableLoadReview==="no")){a=!0;try{let i=await this.getRuntimeService("movie").resolve({carNum:e},{scope:t});i?.movieId&&!t?.disposed&&s.snapshot().enableLoadReview!=="no"&&await this.showReview(i.movieId,this.getHostedSlot("reviews"))}finally{a=!1}}},"mount");t?.listen?.(s,"settings.changed",i=>{i.detail?.names?.includes("enableLoadReview")&&r().catch(n=>clog.error("加载评论失败",n))}),await r()}}}getHostedSlot(e){let t=this.getRuntimeService("host").locateDetailSlots()[e];return t?$(t):$()}async showReview(e,t,s={}){return new Ft({review:this.getRuntimeService("review"),settings:this.getRuntimeService("settings"),storage:this.getRuntimeService("storage"),scope:d(()=>this.getRuntimeService("scope")(),"scope")}).show(e,t?.length?t:this.getHostedSlot("reviews"),s)}};d(Zi,"ReviewPlugin");var ma=Zi;function Gh(o){return[...o.querySelectorAll(".tags .tag")].some(e=>/中字磁[链鏈]/u.test(e.textContent||""))}d(Gh,"hasChineseSubtitleMagnet");var va=class va extends R{getName(){return"TOP250Plugin"}async initCss(){return""}async handle(){if(je(window.location).kind!=="top250-ranking")return;let e=this.getRuntimeService("host"),t=e.locateListRoot?.(),s=e.getTop250FilterContainer?.();if(!t||!s||s.querySelector(".jhs-top250-subtitle"))return;let a=document.createElement("div");a.className="jhs-top250-subtitle",a.setAttribute("role","group"),a.setAttribute("aria-label","TOP250 已加载条目筛选");for(let[i,n]of[["all","已加载条目:全部"],["with","已加载条目:含中字磁链"],["without","已加载条目:无中字磁链"]]){let l=document.createElement("button");l.type="button",l.className="jhs-btn jhs-btn--secondary",l.dataset.jhsSubtitle=i,l.textContent=n,a.append(l)}e.mountTop250SubtitleControls(a);let r=new URLSearchParams(window.location.search).get("jhs_subtitle");this.applySubtitleFilter(["with","without"].includes(r||"")?r:"all",a),a.addEventListener("click",i=>{let l=i.target?.closest("button[data-jhs-subtitle]")?.getAttribute("data-jhs-subtitle");if(!["all","with","without"].includes(l||""))return;let c=new URL(window.location.href);l==="all"?c.searchParams.delete("jhs_subtitle"):c.searchParams.set("jhs_subtitle",l),window.history.replaceState(window.history.state,"",c.href),this.applySubtitleFilter(l,a)})}applySubtitleFilter(e,t){let s=this.getRuntimeService("host");for(let a of s.locateTop250SubtitleCards()){let r=Gh(a);a.classList.toggle("jhs-top250-subtitle-hidden",e==="with"?!r:e==="without"&&r)}t.querySelectorAll("button[data-jhs-subtitle]").forEach(a=>{let r=a.getAttribute("data-jhs-subtitle")===e;a.setAttribute("aria-pressed",String(r)),a.classList.toggle("active",r)}),s.syncTop250SubtitleLinks?.(e)}};d(va,"Top250Plugin"),Ge(va,"legacyPluginId","TOP250Plugin");var fa=va;var Xi=class Xi extends R{getName(){return"FavoriteActressesPlugin"}getStartupMode(){return"idle"}bindImmediateEvents(){this.bindEvent()}async handle(){await this.highlightActress(),this.replaceActressAvatar()}async highlightActress(){if(!isDetailPage||await storageManager.getSetting("enableFavoriteActresses",E)!==E)return;let e=await storageManager.getFavoriteActressList();if(!e||e.length===0)return;let t=new Set;e.forEach((s=>{s.starId&&t.add(String(s.starId).trim())})),t.size!==0&&$(".female").prev().each(((s,a)=>{let r=$(a),i=r.attr("href"),n=null;if(i){let c=(i.endsWith("/")?i.slice(0,-1):i).split("/"),h=c[c.length-1];h&&(n=h.trim())}let l=!1;n&&(l=t.has(n)),l&&(r.addClass("highlighted"),r.attr("title","高亮已收藏演员, 可在设置-基础配置中关闭"))}))}async removeActorFromStorage(e){await storageManager.removeFavoriteActress(e)&&(clog.log("移除演员成功"),document.dispatchEvent(new CustomEvent("actress-state-changed",{detail:{starId:String(e)}})))}bindEvent(){let e=/\/actors\/(\w+)\/(collect|uncollect)/;$(document).on("confirm:complete",'a[href*="/actors/"][href*="/uncollect"]',(async t=>{let[s]=t.detail;if(!s)return;let a=$(t.currentTarget).attr("href").match(e),r=a?a[1]:null;r&&await this.removeActorFromStorage(r)})),$("#button-collect-actor").click((async t=>{let s=$("#button-collect-actor").attr("href").match(e),a=s?s[1]:null,r=[],i=$(".actor-section-name");i.length&&i.text().trim().split(",").forEach((u=>{r.push(u.trim())}));let n=$(".section-meta:not(:contains('影片'))");if(n.length&&n.text().trim().split(",").forEach((u=>{r.push(u.trim())})),!r.length)return void clog.error("获取演员名称失败");let l=r[0];if(!a)return void clog.error("无法获取演员ID进行收藏操作。");let c=($(".avatar").first().css("background-image")||"").replace(/^url\(["']?|["']?\)$/g,""),h={starId:a,name:l,allName:r,avatar:c};await storageManager.addFavoriteActressList([h])===1?(clog.log(`收藏演员成功: ${l} (ID: ${a})`),document.dispatchEvent(new CustomEvent("actress-state-changed",{detail:{starId:String(a)}}))):clog.log(`收藏演员失败: ${l} (ID: ${a})`)})),$("#button-uncollect-actor").click((async t=>{let s=$("#button-uncollect-actor").attr("href").match(e),a=s?s[1]:null;a?await this.removeActorFromStorage(a):clog.error("无法获取演员ID进行取消收藏操作。")}))}async replaceActressAvatar(){let e=this.getActressId();if(!e)return;let t=(await storageManager.getFavoriteActressList()).find((s=>s.starId===e));if(t&&t.avatar){let s=`url('${t.avatar}')`,a=$(".avatar").first();if(a.length===0&&($(".section-columns").prepend('
      '),a=$(".avatar").first()),a.length===0)return;a.css("background-image").trim().toLowerCase()!==s.trim().toLowerCase()&&(a.css("background-image",s),a.css("background-size","cover"),a.css("background-position","top center"),a.css("background-repeat","no-repeat"))}}};d(Xi,"FavoriteActressesPlugin");var ba=Xi;var en=class en extends R{getName(){return"BusImgPlugin"}handle(){}async getVisibleImageItems(e,t){let s=[],a=document.querySelectorAll(e);for(let r of a)if(!utils.isHidden(r)){let i=r.querySelector(t);if(!(i instanceof HTMLImageElement))continue;i.style.removeProperty("height");let n=i.offsetHeight;n>0&&s.push({element:r,imgElement:i,height:n})}return s}async logImageHeightsByRow(e={}){let t=e.vertical??e.enableVerticalModel??await storageManager.getSetting("enableVerticalModel",ne),s=e.columns??e.containerColumns??await storageManager.getSetting("containerColumns",5);if(t===E)return;let a=this.getSelector().itemSelector,r=Number(s)||5,i=await this.getVisibleImageItems(a,"img");if(i.length===0)return;let n=[];for(let l=0;l{let h=l.map((m=>m.height));if(h.length<2)return;let u=Math.min(...h),p=Math.max(...h),g=0;p-u>50&&(g=u,l.forEach((m=>{if(m.height!==g){let f=`${g}px`;m.imgElement.style.setProperty("height",f,"important")}})))}))}};d(en,"BusImgPlugin");var wa=en;var Vt=d((o,e)=>{if(!o||o.length===0)return null;let t=new Set(o);if(e&&t.has(e))return e;let s=nt.map((a=>a.quality)).reverse();for(let a of s)if(t.has(a))return a;return o[0]||null},"Z"),tn="jhs_dmm_video",Qh=30*864e5,Dc=500;function sn(o){if(!o)return{};try{let e=JSON.parse(o);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}d(sn,"parseJsonMap");function an(o){let e=Date.now();for(let s of Object.keys(o)){let a=o[s];(!a||a.time&&e-a.time>Qh)&&delete o[s]}let t=Object.keys(o);if(t.length>Dc){t.sort(((s,a)=>(o[s].time||0)-(o[a].time||0)));for(let s of t.slice(0,t.length-Dc))delete o[s]}return o}d(an,"pruneDmmCache");function Re(o){return o?.enablePreviewVideo!=="no"}d(Re,"isPreviewEnabled");function gs(o){return o?.enableLoadPreviewVideo!=="no"}d(gs,"isDmmEnabled");function Nc(o){return Re(o)}d(Nc,"canUsePreview");function qt(o){return Re(o)&&gs(o)}d(qt,"canUseDmmPreview");function ya(o){return qt(o)}d(ya,"canUseCardPreview");var on=class on{constructor(e,t,s,a){this.carNum=e||"",this.storage=t,this.movie=s,this.scope=a,this.lastError=null}_checkCache(){let e=an(sn(this.storage.getLocal(tn)));return e[this.carNum]?(clog.debug("缓存中存在预览视频信息",e[this.carNum]),e[this.carNum]):null}_updateCache(e){let t=an(sn(this.storage.getLocal(tn)));t[this.carNum]={...e,time:Date.now()},clog.debug("成功解析出预览视频并已缓存:",e),this.storage.setLocal(tn,JSON.stringify(t))}async _fetchRemote(){let e=await this.movie.preview("dmm",{carNum:this.carNum},{scope:this.scope}),t=$("#fanzaBtn");if(!e.sources)return clog.warn("所有关键词尝试均未找到匹配的Content ID, 解析Dmm视频失败"),t.attr("href",e.searchUrl).attr("title","未查询到, 点击前往搜索页").css("backgroundColor","var(--jhs-status-filter)"),null;t.attr("href",e.pageUrl).css("backgroundColor","var(--jhs-status-down)"),e.matchType==="multiple"&&t.append('多结果');let s="jhs_other_site_dmm",a=an(sn(this.storage.getLocal(s)));return a[this.carNum]={type:e.matchType,url:e.pageUrl,time:Date.now()},this.storage.setLocal(s,JSON.stringify(a)),e.sources}async fetchVideo(){let e=C(this.carNum);if(!e)return clog.warn("跳过 DMM 解析:番号不可用"),null;this.carNum=e;let t=this._checkCache();if(t)return t;try{let s=this.carNum.toLowerCase();if(s.startsWith("heyzo")||/^(n\d+|\d+(-\d+)*)$/.test(s)||/^n\d+$/.test(s))return clog.debug("无码番号类型,取消 DMM 解析"),null;if(this.carNum.includes("VR-"))return clog.debug("VR 类型,取消 DMM 解析"),null;let a=await this._fetchRemote();return a?(this._updateCache(a),a):null}catch(s){let a=s;this.lastError=s instanceof we?s:new we("dmm",a?.code||"PARSE_ERROR",a?.message||String(s),{cause:s,retryable:a?.retryable===!0}),clog.error("DMM API 搜索失败:",this.lastError);let r=$("#fanzaBtn");return r.attr("href",this.movie.searchUrl("dmm",{carNum:this.carNum})),r.attr("title","未查询到, 点击前往搜索页"),r.css("backgroundColor","var(--jhs-status-filter)"),null}}};d(on,"DmmPreviewParser");var rn=on;async function nn(o,e,t,s){let a=new rn(o,e,t,s);return{sources:await a.fetchVideo(),error:a.lastError}}d(nn,"fetchDmmPreview");async function ja(o,e,t,s,a){return gs(a)?nn(o,e,t,s):{sources:null,error:null}}d(ja,"fetchDmmPreviewIfEnabled");var ln=class ln extends R{constructor(){super(...arguments),this._busPreviewGeneration=0}getName(){return"BusPreviewVideoPlugin"}async initCss(){return` .bus-preview-modal { position:fixed; inset:0; z-index:var(--jhs-z-modal); display:flex; align-items:center; justify-content:center; visibility:hidden; opacity:0; background:rgba(0,0,0,.95); transition:opacity var(--jhs-motion-base) var(--jhs-ease); } .bus-preview-modal.is-open { visibility:visible; opacity:1; } .bus-preview-modal-content { position:relative; display:flex; max-width:95%; max-height:95%; flex-direction:column; align-items:center; gap:var(--jhs-space-3); } @@ -3311,7 +3318,7 @@ ${i}\r
      - `);let t=$("#bus-preview-modal");t.on("click",(s=>{s.target instanceof Element&&s.target.id==="bus-preview-modal"&&this.closeVideoModal()})),e.listen(document,"keydown",(s=>{s instanceof KeyboardEvent&&s.key==="Escape"&&t.hasClass("is-open")&&this.closeVideoModal()})),e.addCleanup((()=>{t.off(),t.remove()}))}}closeVideoModal(){let e=$("#preview-video");e.length>0&&e[0].pause(),$("#bus-preview-modal").removeClass("is-open")}unmountPreview(){this._busPreviewMounted=!1,this.closeVideoModal(),$("#bus-preview-modal").remove(),$(".preview-video-container").off("click.jhsBusPreview").remove()}async handle(){if(!isDetailPage)return;let e=this.getRuntimeService("settings");if(this._busScope||(this._busScope=await this.getRuntimeService("scope")()),!this._settingsListenerBound){this._settingsListenerBound=!0;let t=d(s=>{s.detail?.names?.some(r=>r==="enablePreviewVideo"||r==="enableLoadPreviewVideo")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",t),this._busScope.addCleanup((()=>{e.removeEventListener("settings.changed",t),this._settingsListenerBound=!1}))}this.reconfigure()}reconfigure(){this._busPreviewGeneration++;let e=this.getRuntimeService("settings").snapshot();if(!Ft(e))return void this.unmountPreview();this.mountPreview()}mountPreview(){if(this._busPreviewMounted)return;this._busPreviewMounted=!0;let e=this._busScope;this.initModal(e);let t=$("#sample-waterfall .sample-box .photo-frame img:first").attr("src"),s=$(` + `);let t=$("#bus-preview-modal");t.on("click",(s=>{s.target instanceof Element&&s.target.id==="bus-preview-modal"&&this.closeVideoModal()})),e.listen(document,"keydown",(s=>{s instanceof KeyboardEvent&&s.key==="Escape"&&t.hasClass("is-open")&&this.closeVideoModal()})),e.addCleanup((()=>{t.off(),t.remove()}))}}closeVideoModal(){let e=$("#preview-video");e.length>0&&e[0].pause(),$("#bus-preview-modal").removeClass("is-open")}unmountPreview(){this._busPreviewMounted=!1,this.closeVideoModal(),$("#bus-preview-modal").remove(),$(".preview-video-container").off("click.jhsBusPreview").remove()}async handle(){if(!isDetailPage)return;let e=this.getRuntimeService("settings");if(this._busScope||(this._busScope=await this.getRuntimeService("scope")()),!this._settingsListenerBound){this._settingsListenerBound=!0;let t=d(s=>{s.detail?.names?.some(r=>r==="enablePreviewVideo"||r==="enableLoadPreviewVideo")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",t),this._busScope.addCleanup((()=>{e.removeEventListener("settings.changed",t),this._settingsListenerBound=!1}))}this.reconfigure()}reconfigure(){this._busPreviewGeneration++;let e=this.getRuntimeService("settings").snapshot();if(!qt(e))return void this.unmountPreview();this.mountPreview()}mountPreview(){if(this._busPreviewMounted)return;this._busPreviewMounted=!0;let e=this._busScope;this.initModal(e);let t=$("#sample-waterfall .sample-box .photo-frame img:first").attr("src"),s=$(`
      - `);$("#sample-waterfall").prepend(s);let a=!1,r=$(".preview-video-container");r.on("click",(async i=>{if(i.preventDefault(),i.stopPropagation(),a)show.info("正在加载中, 勿重复点击");else{a=!0;try{await this.handleVideo()}finally{a=!1}}})),window.location.href.includes("autoPlay=1")&&r.trigger("click")}async handleVideo(){let e=this._busPreviewGeneration,t=$("#bus-preview-modal"),s=t.find(".bus-preview-modal-content"),a=$("#preview-video");if(e!==this._busPreviewGeneration||!Re(this.getRuntimeService("settings").snapshot()))return;if(a.length>0)return t.addClass("is-open"),void await de(a[0],{context:"JavBus 预览视频",notify:!0});let r=this.getPageInfo().carNum,i=await this.getRuntimeService("scope")(),{sources:n,error:l}=await fa(r,this.getRuntimeService("storage"),this.getRuntimeService("movie"),i,this.getRuntimeService("settings").snapshot());e!==this._busPreviewGeneration||!Re(this.getRuntimeService("settings").snapshot())||(n&&Object.keys(n).length!==0?(await this.createVideoPlayerAndControls(n,s),a=$("#preview-video"),a.length>0?(t.addClass("is-open"),await de(a[0],{context:"JavBus 预览视频",notify:!0,message:l?.code==="REGION_BLOCKED"?l.message:"当前视频源无法播放"})):show.error("视频播放器创建失败。")):show.error(l?.code==="REGION_BLOCKED"?l.message:"未找到可用的视频源。"))}async createVideoPlayerAndControls(e,t){let s=this.getRuntimeService("settings").snapshot().videoQuality;s=zt(Object.keys(e),s);let a=e[s],r=$('
      '),i=$(''),n=$(document.createElement("source")).attr("src",a),l=$('
      ');i.append(n),r.append(i),t.empty().append(r,l);let c=$("#preview-video"),h=c.find("source"),u=t.find(".jhs-video-quality-list");if(!c.length||!h.length)return;let p=this.getRuntimeService("settings"),g=c[0],m=p.snapshot().videoMuted;g.muted=m==null||m===!0,c.off("volumechange.jhsVideo").on("volumechange.jhsVideo",(()=>{p.set("videoMuted",g.muted).catch((v=>clog.error("保存视频静音设置失败",v)))})),rt.forEach((v=>{let b=e[v.quality];if(b){let w=s===v.quality,S=$('');w&&S.addClass("active"),S.attr({"data-quality":v.quality,"data-video-src":b,"aria-pressed":w?"true":"false"}).text(v.text),u.append(S)}}));let f=u.find(".jhs-video-quality-btn");u.off("click.jhsVideo").on("click.jhsVideo",".jhs-video-quality-btn",(async v=>{try{let b=$(v.currentTarget);if(b.hasClass("active"))return;let w=b.attr("data-video-src");h.attr("src",w);let S=g.currentTime;g.load(),g.currentTime=S,await de(g,{context:"JavBus 画质切换",notify:!0})&&(f.removeClass("active").attr("aria-pressed","false"),b.addClass("active").attr("aria-pressed","true"))}catch(b){clog.error("切换画质失败:",b)}}))}};d(tn,"BusPreviewVideoPlugin");var va=tn;var sn=class sn extends I{constructor(){super(...arguments),this.previewGeneration=0}getName(){return"CoverButtonPlugin"}async initCss(){return` + `);$("#sample-waterfall").prepend(s);let a=!1,r=$(".preview-video-container");r.on("click",(async i=>{if(i.preventDefault(),i.stopPropagation(),a)show.info("正在加载中, 勿重复点击");else{a=!0;try{await this.handleVideo()}finally{a=!1}}})),window.location.href.includes("autoPlay=1")&&r.trigger("click")}async handleVideo(){let e=this._busPreviewGeneration,t=$("#bus-preview-modal"),s=t.find(".bus-preview-modal-content"),a=$("#preview-video");if(e!==this._busPreviewGeneration||!Re(this.getRuntimeService("settings").snapshot()))return;if(a.length>0)return t.addClass("is-open"),void await de(a[0],{context:"JavBus 预览视频",notify:!0});let r=this.getPageInfo().carNum,i=await this.getRuntimeService("scope")(),{sources:n,error:l}=await ja(r,this.getRuntimeService("storage"),this.getRuntimeService("movie"),i,this.getRuntimeService("settings").snapshot());e!==this._busPreviewGeneration||!Re(this.getRuntimeService("settings").snapshot())||(n&&Object.keys(n).length!==0?(await this.createVideoPlayerAndControls(n,s),a=$("#preview-video"),a.length>0?(t.addClass("is-open"),await de(a[0],{context:"JavBus 预览视频",notify:!0,message:l?.code==="REGION_BLOCKED"?l.message:"当前视频源无法播放"})):show.error("视频播放器创建失败。")):show.error(l?.code==="REGION_BLOCKED"?l.message:"未找到可用的视频源。"))}async createVideoPlayerAndControls(e,t){let s=this.getRuntimeService("settings").snapshot().videoQuality;s=Vt(Object.keys(e),s);let a=e[s],r=$('
      '),i=$(''),n=$(document.createElement("source")).attr("src",a),l=$('
      ');i.append(n),r.append(i),t.empty().append(r,l);let c=$("#preview-video"),h=c.find("source"),u=t.find(".jhs-video-quality-list");if(!c.length||!h.length)return;let p=this.getRuntimeService("settings"),g=c[0],m=p.snapshot().videoMuted;g.muted=m==null||m===!0,c.off("volumechange.jhsVideo").on("volumechange.jhsVideo",(()=>{p.set("videoMuted",g.muted).catch((v=>clog.error("保存视频静音设置失败",v)))})),nt.forEach((v=>{let b=e[v.quality];if(b){let w=s===v.quality,S=$('');w&&S.addClass("active"),S.attr({"data-quality":v.quality,"data-video-src":b,"aria-pressed":w?"true":"false"}).text(v.text),u.append(S)}}));let f=u.find(".jhs-video-quality-btn");u.off("click.jhsVideo").on("click.jhsVideo",".jhs-video-quality-btn",(async v=>{try{let b=$(v.currentTarget);if(b.hasClass("active"))return;let w=b.attr("data-video-src");h.attr("src",w);let S=g.currentTime;g.load(),g.currentTime=S,await de(g,{context:"JavBus 画质切换",notify:!0})&&(f.removeClass("active").attr("aria-pressed","false"),b.addClass("active").attr("aria-pressed","true"))}catch(b){clog.error("切换画质失败:",b)}}))}};d(ln,"BusPreviewVideoPlugin");var Sa=ln;var cn=class cn extends R{constructor(){super(...arguments),this.previewGeneration=0}getName(){return"CoverButtonPlugin"}async initCss(){return` `}async handle(){if(!window.isListPage)return;let e=await this.getRuntimeService("scope")(),t=this.getRuntimeService("settings"),s=d(a=>{let r=a.detail?.names||[];r.some(i=>i==="enablePreviewVideo"||i==="enableLoadPreviewVideo")&&(this.previewGeneration++,ma(t.snapshot())?this.addSvgBtn().catch((i=>clog.error("卡片预览重新挂载失败",i))):($('[id$="_preview_video"]').each((i,n)=>{n.pause?.(),$(n).parent().remove()}),this.enableSvgBtn())),r.some(i=>["enableScreenSvg","enableVideoSvg","enableHandleSvg","enableSiteSvg","enableCopySvg"].includes(i))&&this.enableSvgBtn()},"onSettingsChanged");this._settingsListenerBound||(this._settingsListenerBound=!0,t.addEventListener("settings.changed",s),e.addCleanup((()=>{t.removeEventListener("settings.changed",s),this._settingsListenerBound=!1}))),this.addSvgBtn(),await this.bindClick(e)}buildToolBox(){return` + `}async handle(){if(!window.isListPage)return;let e=await this.getRuntimeService("scope")(),t=this.getRuntimeService("settings"),s=d(a=>{let r=a.detail?.names||[];r.some(i=>i==="enablePreviewVideo"||i==="enableLoadPreviewVideo")&&(this.previewGeneration++,ya(t.snapshot())?this.addSvgBtn().catch((i=>clog.error("卡片预览重新挂载失败",i))):($('[id$="_preview_video"]').each((i,n)=>{n.pause?.(),$(n).parent().remove()}),this.enableSvgBtn())),r.some(i=>["enableScreenSvg","enableVideoSvg","enableHandleSvg","enableSiteSvg","enableCopySvg"].includes(i))&&this.enableSvgBtn()},"onSettingsChanged");this._settingsListenerBound||(this._settingsListenerBound=!0,t.addEventListener("settings.changed",s),e.addCleanup((()=>{t.removeEventListener("settings.changed",s),this._settingsListenerBound=!1}))),this.addSvgBtn(),await this.bindClick(e)}buildToolBox(){return`
      @@ -3347,8 +3354,8 @@ ${i}\r
      @@ -3368,7 +3375,7 @@ ${i}\r
      -
      `}async addSvgBtn(e=null){this.getOptionalDependency("ListPagePlugin")&&((e?$(e).toArray():$(this.getSelector().itemSelector).toArray()).forEach((t=>{let s=$(t);if(s.find(".tool-box").length||B&&s.find(".avatar-box").length)return;let a=M?s.find(".tags").first():s.find(".photo-info").first();a.length&&a.append(this.buildToolBox())})),this.enableSvgBtn(e))}async enableSvgBtn(e=null){let t=this.getRuntimeService("settings").snapshot(),{enableScreenSvg:s=E,enableVideoSvg:a=E,enablePreviewVideo:r=E,enableHandleSvg:i=E,enableSiteSvg:n=E,enableCopySvg:l=E}=t,c=e?$(e):$(document);[{selector:".screenSvg",enabled:s===E&&this.getOptionalDependency("ScreenShotPlugin")?E:"no"},{selector:".videoSvg",enabled:a===E&&ma(t)?E:"no"},{selector:".handleSvg",enabled:i},{selector:".siteSvg",enabled:n},{selector:".copySvg",enabled:l}].forEach((({selector:h,enabled:u})=>{c.find(h).toggle(u===E)}))}closeCardMenus(e=!1){let t=$(".jhs-card-menu.is-open"),s=t.siblings(".jhs-card-menu-trigger");t.removeClass("is-open"),s.attr("aria-expanded","false"),e&&s.first().trigger("focus")}async bindClick(e){this.getSelector();let t=this.getOptionalDependency("ListPagePlugin");if(!t)return;let s=$(document);s.off(".jhsCoverButton"),e.addCleanup((()=>s.off(".jhsCoverButton"))),s.on("click.jhsCoverButton",".jhs-card-menu-trigger",(h=>{h.preventDefault(),h.stopPropagation();let u=$(h.currentTarget),p=u.siblings(".jhs-card-menu"),g=!p.hasClass("is-open");this.closeCardMenus(),p.toggleClass("is-open",g),u.attr("aria-expanded",String(g)),g&&p.children().first().trigger("focus")})).on("keydown.jhsCoverButton",".jhs-card-menu [role='menuitem']",(h=>{let u=$(h.currentTarget).closest(".jhs-card-menu"),p=u.find("[role='menuitem']"),g=p.index(h.currentTarget);if(h.key==="Escape")return h.preventDefault(),this.closeCardMenus(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(h.key))return;h.preventDefault();let m=h.key==="Home"?0:h.key==="End"?p.length-1:h.key==="ArrowDown"?(g+1)%p.length:(g-1+p.length)%p.length;p.eq(m).trigger("focus")})).on("click.jhsCoverButton",(h=>{$(h.target).closest(".more-tools-container").length||this.closeCardMenus()})),s.on("click.jhsCoverButton",".videoSvg",(h=>{h.preventDefault(),$('.videoSvg[title!="播放视频"]').each(((g,m)=>{let f=$(m),v=f.closest(".item"),b=v.find("img"),{carNum:w}=t.findCarNumAndHref(v);this.showImg(f,b,w),f.html(this.videoSvg).attr({title:"播放视频","aria-label":"播放视频"})}));let u=$(h.target).closest(".item"),p=u.find(".videoSvg");if(p.attr("title")==="播放视频"){p.html(this.recoveryVideoSvg).attr({title:"切回封面","aria-label":"切回封面"});let{carNum:g}=t.findCarNumAndHref(u),m=u.find("img");if(!m.length)return void show.error("没有找到图片");this.showVideo(p,m,g).catch((f=>clog.error("卡片预览视频打开失败",f)))}})),s.on("click.jhsCoverButton",".screenSvg",(async h=>{h.preventDefault();let u=loading();try{let p=$(h.currentTarget).closest(".item"),{carNum:g}=t.findCarNumAndHref(p);g=g.replace("FC2-","");let m=this.getOptionalDependency("ScreenShotPlugin");if(!m)throw new Error("剧照功能已禁用");let f=await m.getScreenshot(g,{allowWhenDisabled:!0});u.close(),globalThis.showImageViewer(f)}catch(p){clog.error("图片预览出错:",p),show.error("图片预览出错:"+p)}finally{u.close()}})),s.on("click.jhsCoverButton",".filterBtn, .favoriteBtn, .hasDownBtn, .hasWatchBtn",(h=>{h.preventDefault(),h.stopPropagation();try{let u=$(h.currentTarget),p=u.closest(".item"),{carNum:g,url:m,publishTime:f,fc2Source:v}=t.findCarNumAndHref(p),b=d(async w=>{try{let S=await t.parseActressName(m),j=Ce(w);if(!j)throw new Error("不支持的状态操作");await this.getRuntimeService("state").patch(g,{[j]:!0},{type:"list-card-state",record:{carNum:g,url:m,names:S,publishTime:f,fc2Source:v}}),show.ok("操作成功")}catch(S){clog.error("保存操作失败:",S),show.error("操作失败")}},"r");u.hasClass("filterBtn")?utils.q(h,`是否屏蔽${T(g)}?`,(()=>b(ce))):u.hasClass("favoriteBtn")?b(ue):u.hasClass("hasDownBtn")?b(pe):u.hasClass("hasWatchBtn")&&b(me),this.closeCardMenus()}catch(u){clog.error("按钮点击处理失败:",u)}}));let a=this.getRuntimeService("settings").snapshot(),r=this.getRuntimeService("movie"),i=r.externalSiteOrigin("missAvBtn",a),n=r.externalSiteOrigin("jableBtn",a),l=r.externalSiteOrigin("avgleBtn",a),c=r.providerOrigin("av123")||"";$(this.getSelector().itemSelector).each(((h,u)=>{let p=$(u),{carNum:g}=t.findCarNumAndHref(p);p.find(".site-jable").attr({href:`${n}/search/${g}/`,target:"_blank",rel:"noopener noreferrer"}),p.find(".site-avgle").attr({href:`${l}/vod/search.html?wd=${g}`,target:"_blank",rel:"noopener noreferrer"}),p.find(".site-miss-av").attr({href:`${i}/search/${g}`,target:"_blank",rel:"noopener noreferrer"}),p.find(".site-123-av").attr({href:`${c}/cn/search?keyword=${encodeURIComponent(g)}`,target:"_blank",rel:"noopener noreferrer"})})),s.on("click.jhsCoverButton",".site-jable, .site-avgle, .site-miss-av, .site-123-av",(h=>{try{h.preventDefault(),h.stopPropagation();let u=$(h.currentTarget),p=u.closest(".item"),{carNum:g}=t.findCarNumAndHref(p),m=null;if(u.hasClass("site-jable")?m=`${n}/search/${g}/`:u.hasClass("site-avgle")?m=`${l}/vod/search.html?wd=${g}`:u.hasClass("site-miss-av")?m=`${i}/search/${g}`:u.hasClass("site-123-av")&&(m=`${c}/cn/search?keyword=${encodeURIComponent(g)}`),!m)return;h.ctrlKey||h.metaKey?GM_openInTab(m,{insert:0}):window.open(m),this.closeCardMenus()}catch(u){clog.error("站点按钮处理失败:",u)}})),s.on("click.jhsCoverButton",".titleSvg, .carNumSvg, .downSvg",(h=>{h.preventDefault(),h.stopPropagation();let u=$(h.currentTarget).closest(".item"),{carNum:p,title:g}=t.findCarNumAndHref(u),m=u.find(B?".photo-frame img":".cover img");$(h.currentTarget).hasClass("titleSvg")?utils.copyToClipboard("标题",g):$(h.currentTarget).hasClass("carNumSvg")?utils.copyToClipboard("番号",p):$(h.currentTarget).hasClass("downSvg")&&fetch(m.attr("src")).then((f=>f.blob())).then((f=>utils.download(f,p+" "+g+".jpg"))),this.closeCardMenus()}))}showImg(e,t,s){e.html(this.videoSvg).attr({title:"播放视频","aria-label":"播放视频"});let a=$(`#${`${s}_preview_video`}`);a.length>0&&(a[0].pause(),a.parent().hide()),t.show(),t.removeClass("loading"),t.next(".loading-spinner").remove()}async showVideo(e,t,s){let a=this.getRuntimeService("settings").snapshot();if(!ma(a))return show.error("预览视频已关闭");let r=this.previewGeneration,i=`${s}_preview_video`,n=$(`#${i}`);if(n.length>0)return n.parent().show(),await de(n[0],{context:"列表卡片预览",notify:!0}),void t.hide();t.addClass("loading"),t.after('
      ');let l=t.attr("data-full")||t.attr("src"),c=await this.getRuntimeService("scope")(),{sources:h,error:u}=await fa(s,this.getRuntimeService("storage"),this.getRuntimeService("movie"),c,a);if(r!==this.previewGeneration||!Re(this.getRuntimeService("settings").snapshot()))return void this.showImg(e,t,s);if(!h)return show.error(u?.code==="REGION_BLOCKED"?u.message:"未解析到视频"),void this.showImg(e,t,s);let p=this.getRuntimeService("settings").snapshot().videoQuality;p=zt(Object.keys(h),p);let g=h[p],m=document.createElement("div"),f=document.createElement("video");B||(m.className="jhs-layout-d543acf8"),f.src=g,f.poster=l||"",f.id=i,f.controls=!0,f.loop=!0,f.muted=!0,f.playsInline=!0,f.className="jhs-layout-a38a0e50",m.appendChild(f),t.parent().append(m),t.hide(),t.removeClass("loading"),t.next(".loading-spinner").remove(),n=$(f);let v=n[0];v.load(),v.muted=!1,await de(v,{context:"列表卡片预览",notify:!0,message:u?.code==="REGION_BLOCKED"?u.message:"当前视频源无法播放"}),n.trigger("focus")}};d(sn,"CoverButtonPlugin");var ba=sn;var an=class an extends I{constructor(){super(...arguments),this.previewGeneration=0,this.previewSession=null}getName(){return"PreviewVideoPlugin"}async initCss(){return".jhs-dmm-preview-player{display:none;width:100%;height:auto}.jhs-dmm-preview-player.is-active{display:block}.jhs-native-preview-hidden{display:none!important}"}async handle(){if(!isDetailPage)return;let e=this.getRuntimeService("settings");if(this.lifecycleScope||(this.lifecycleScope=await this.getRuntimeService("scope")()),!this._settingsListenerBound){this._settingsListenerBound=!0;let t=d(s=>{s.detail?.names?.some(r=>r==="enablePreviewVideo"||r==="enableLoadPreviewVideo")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",t),this.lifecycleScope.addCleanup((()=>{e.removeEventListener("settings.changed",t),this._settingsListenerBound=!1,this.unmountPreview()}))}this.reconfigure()}reconfigure(){this.previewGeneration++;let e=this.getRuntimeService("settings").snapshot();if(!$c(e))return void this.unmountPreview();this.mountPreview(),Ft(e)?this.initDmm(this.lifecycleScope).catch((t=>clog.error("预加载 DMM 失败",t))):(this.unmountDmmPlayer(),$(".fancybox-content #preview-video").length&&!$("#video-bottom-toolbar").length&&this.handleVideo().catch(t=>clog.error("恢复原生预览操作失败",t)))}mountPreview(){if(this._previewMounted)return;this._previewMounted=!0,$(".preview-video-container").removeClass("jhs-native-preview-hidden");let e=$(".preview-video-container"),t=d(()=>{this.cancelOpenWait?.(),this.cancelOpenWait=utils.loopDetector((()=>$(".fancybox-content #preview-video").length>0),(()=>{this.handleVideo().catch((a=>clog.error("预览视频处理失败",a)))}),20,1e4,!0,this.lifecycleScope)},"openVideo");e.off("click.jhsVideo").on("click.jhsVideo",t),this.lifecycleScope.addCleanup((()=>e.off("click.jhsVideo",t)));let s=window.location.href;(s.includes("gallery-1")||s.includes("gallery-2"))&&t(),s.includes("autoPlay=1")&&e.length>0&&e[0].click()}unmountDmmPlayer(){this.dmmRequestScope?.dispose(),$("[data-jhs-dmm-trigger]").remove();let e=$("#jhs-preview-video"),t=e[0],s=this.previewSession?.native;s&&t&&this.isSessionOpen(this.previewSession)&&(this.seekVideo(s,t.currentTime),!t.paused&&Re(this.getRuntimeService("settings").snapshot())?de(s,{context:"恢复原生预览",notify:!1}).then(()=>{this.previewSession?.native!==s&&s.pause()}):s.pause()),t&&(t.pause(),e.removeAttr("src"),t.load(),e.remove()),$("#video-bottom-toolbar .jhs-video-quality-list").empty(),$("#preview-video").removeClass("jhs-native-preview-hidden"),this.dmmPreviewPromise=null,this.previewSession&&!s&&this.disposePreviewSession()}unmountPreview(){this._previewMounted=!1,this.cancelOpenWait?.(),this.disposePreviewSession(),this.unmountDmmPlayer(),$("#video-bottom-toolbar").remove(),$(".preview-video-container").addClass("jhs-native-preview-hidden")}unmountJhsPreview(){this.disposePreviewSession(),$("[data-jhs-dmm-trigger]").remove();let e=$("#jhs-preview-video"),t=e[0];t&&(t.pause(),e.removeAttr("src"),t.load(),e.remove()),$("#video-bottom-toolbar").remove(),$("#preview-video").removeClass("jhs-native-preview-hidden"),$(".preview-video-container").addClass("jhs-native-preview-hidden")}async initDmm(e){let t=this.previewGeneration,s=this.getRuntimeService("settings");try{let{sources:a}=await this.getDmmPreview(e);if(t!==this.previewGeneration||e?.disposed||!Re(s.snapshot())||!ds(s.snapshot())||!a)return;if($(".fancybox-content #preview-video").length){await this.handleVideo();return}if($("#preview-video")[0])return;clog.debug("JavDB没有视频播放元素, 开始创建...");let n=$(".column-video-cover img").attr("src");if($("[data-jhs-dmm-trigger]").length)return;let l=$('');l.append($('').attr("src",n||"")),$(".preview-images").first().prepend(l),l.on("click.jhsVideo",()=>this.openDmmDialog())}catch(a){clog.error("预加载 DMM 失败:",a)}}getDmmPreview(e=this.lifecycleScope){if(this.dmmPreviewPromise)return this.dmmPreviewPromise;let t=new te("javdb-dmm-request");this.dmmRequestScope=t;let s,a=Promise.resolve(e||this.getRuntimeService("scope")()).then(r=>{if(r?.disposed||t.disposed)throw new Error("预览请求已取消");return s=r?.addCleanup?.(()=>t.dispose()),Xi(this.getPageInfo().carNum,this.getRuntimeService("storage"),this.getRuntimeService("movie"),t)}).then((r=>(this.dmmPreviewPromise===a&&(r.error?.retryable||r.error?.code==="HTTP_ERROR")&&(this.dmmPreviewPromise=null),r)),(r=>{throw this.dmmPreviewPromise===a&&(this.dmmPreviewPromise=null),r})).finally(()=>{t.dispose(),typeof s=="function"&&s()});return this.dmmPreviewPromise=a,a}createDmmPlayer(e){let t=e.length?e.parent():$(this.previewSession?.host),s=t.find("#jhs-preview-video");if(s.length)return s;let a=$('');return t.append(a),a}isSessionOpen(e){if(!e||e.scope.disposed||!e.host.isConnected||e.native&&!e.host.contains(e.native))return!1;for(let t=e.host;t;t=t.parentElement)if(t.getAttribute("aria-hidden")==="true"||getComputedStyle(t).display==="none")return!1;return!0}seekVideo(e,t){let s=d(()=>{try{e.currentTime=Math.max(0,Math.min(t||0,Number.isFinite(e.duration)?e.duration:1/0))}catch{}},"seek");s();let a=this.previewSession;if(a?.seekCleanups?.get(e)?.(),!e.readyState&&a){a.seekCleanups||(a.seekCleanups=new Map);let r=d(()=>{l(),this.isSessionOpen(a)&&s()},"loaded"),i=d(()=>l(),"failed"),n=setTimeout(i,5e3),l=a.scope.addCleanup(()=>{clearTimeout(n),e.removeEventListener("loadedmetadata",r),e.removeEventListener("error",i),a.seekCleanups.delete(e)});e.addEventListener("loadedmetadata",r,{once:!0}),e.addEventListener("error",i,{once:!0}),a.seekCleanups.set(e,l)}}disposePreviewSession(){let e=this.previewSession;if(this.previewSession=null,!e)return;this.dmmRequestScope?.dispose(),this.dmmPreviewPromise=null,e.scope.dispose(),$(e.host).find("#video-bottom-toolbar").remove();let t=e.host.querySelector("#jhs-preview-video");t&&(t.pause(),t.removeAttribute("src"),t.load(),t.remove()),e.native?.classList.remove("jhs-native-preview-hidden"),e.native?.pause(),e.dialogId!=null&&this.getRuntimeService("dialog").close(e.dialogId)}openDmmDialog(){if(!Ft(this.getRuntimeService("settings").snapshot())||this.previewSession)return;let e=$('
      ');this.getRuntimeService("dialog").open({type:1,title:"预告片",ui:{body:"media"},content:e,area:utils.getDialogArea("lg"),success:d((t,s)=>{this.handleVideo(e[0],s).catch(a=>clog.error("预览失败",a))},"success"),end:d(()=>{this.previewSession?.host===e[0]&&this.disposePreviewSession()},"end")})}waitForDmmReady(e){let t=this.previewSession?.scope.signal;return t?.aborted||e.error?Promise.resolve(!1):e.readyState>=3?Promise.resolve(!0):new Promise(s=>{let a=d(l=>{clearTimeout(n),e.removeEventListener("canplay",r),e.removeEventListener("error",i),t?.removeEventListener("abort",i),s(l)},"finish"),r=d(()=>a(!0),"loaded"),i=d(()=>a(!1),"failed"),n=setTimeout(i,1e4);e.addEventListener("canplay",r,{once:!0}),e.addEventListener("error",i,{once:!0}),t?.addEventListener("abort",i,{once:!0})})}async restoreNativePlayer(e,t,s=!1,a=!0){if(!t||!this.isSessionOpen(this.previewSession))return!1;let r=e.parent().find("#jhs-preview-video"),i=r[0];return i&&(i.pause(),r.removeAttr("src"),i.load(),r.remove()),e.removeClass("jhs-native-preview-hidden"),a?de(t,{context:"JavDB 原生预览回退",notify:s}):(t.pause(),!0)}async handleVideo(e=null,t=null){let s=$(".fancybox-content #preview-video"),a=e||s[0]?.closest(".fancybox-content");if(!a||!Re(this.getRuntimeService("settings").snapshot())||getComputedStyle(a).display==="none")return;if(this.previewSession?.host!==a){this.disposePreviewSession();let L=new te("javdb-preview");this.previewSession={host:a,native:s[0]||null,scope:L,dialogId:t},L.observe(document.body,()=>{this.previewSession?.host===a&&!this.isSessionOpen(this.previewSession)&&this.disposePreviewSession()},{childList:!0,subtree:!0,attributes:!0,attributeFilter:["class","style","aria-hidden"]})}let r=this.previewSession;if(r.generation===this.previewGeneration)return;r.generation=this.previewGeneration;let i=d(()=>this.previewSession===r&&this.isSessionOpen(r)&&u===this.previewGeneration&&Re(this.getRuntimeService("settings").snapshot()),"alive"),n=this.getRuntimeService("settings"),l=$(a),c=s[0],h=n.snapshot().videoMuted,u=this.previewGeneration,p=ds(this.getRuntimeService("settings").snapshot()),g=p?await this.getDmmPreview():{sources:null,error:null};if(!i())return;let{sources:m,error:f}=g,v=$("
      ").attr("id","video-bottom-toolbar").addClass("jhs-video-toolbar"),b=$("
      ").addClass("jhs-video-quality-list").attr({role:"group","aria-label":"视频画质"});l.find("#video-bottom-toolbar").remove();let w=!1,S=null,j=null;if(m){let L=this.getRuntimeService("settings").snapshot().videoQuality,N=zt(Object.keys(m),L),A=m[N],O=c?.currentTime||0,U=!c||!c.paused;S=this.createDmmPlayer(s),j=S[0],j.muted=h==null||h===!0,S.off("volumechange.jhsVideo").on("volumechange.jhsVideo",(()=>{n.set("videoMuted",j.muted).catch(Q=>clog.error("保存视频静音设置失败",Q))})),S.attr("src",A),j.load(),this.seekVideo(j,O),S.addClass("is-active");let q=await this.waitForDmmReady(j);if(!i()){j.pause();return}if(w=q&&(!U||await de(j,{context:"JavDB 高画质预览",notify:!1})),!i()){j.pause();return}if(q&&!w&&!j.muted&&(j.muted=!0,w=await de(j,{context:"JavDB 高画质预览静音重试",notify:!1})),!i()){j.pause();return}if(w?(c?.pause(),s.addClass("jhs-native-preview-hidden")):(S.removeClass("is-active"),await this.restoreNativePlayer(s,c,!0,U)),!i())return;if(!w&&!c){show.error("当前视频源无法播放"),this.disposePreviewSession();return}w&&rt.forEach((Q=>{let se=m[Q.quality];if(!se)return;let ge=w&&N===Q.quality;b.append($('').toggleClass("active",ge).attr({"data-quality":Q.quality,"data-video-src":se,"aria-pressed":String(ge)}).text(Q.text))}))}v.append(b);let k=$("
      ").addClass("jhs-toolbar");if(this.getOptionalDependency("DetailPageButtonPlugin")&&k.append(Mt({actions:["blocked","favorite"],ids:{blocked:"video-filterBtn",favorite:"video-favoriteBtn"}})),k.append(''),!i())return;v.append(k),l.append(v),v.off("click.jhsVideo").on("click.jhsVideo",".jhs-video-quality-btn",(async L=>{let N=$(L.currentTarget);if(!N.hasClass("active"))try{if(!j?.isConnected||!i())return;let A=j.currentTime,O=S.attr("src"),U=!j.paused;S.attr("src",N.data("video-src")),j.load(),this.seekVideo(j,A);let q=await this.waitForDmmReady(j);if(!i())return;let Q=q&&(!U||await de(j,{context:"JavDB 画质切换",notify:!1}));if(!i())return;if(Q)v.find(".jhs-video-quality-btn").removeClass("active").attr("aria-pressed","false"),N.addClass("active").attr("aria-pressed","true");else{O&&(S.attr("src",O),j.load(),j.currentTime=A);let se=O&&await this.waitForDmmReady(j)&&(!U||await de(j,{context:"JavDB 画质切换回退",notify:!1}));if(!i())return;se||await this.restoreNativePlayer(s,c,!0,U)}}catch(A){clog.error("切换画质失败:",A)}})),$("#speed-btn").off("click.jhsVideo").on("click.jhsVideo",(()=>{let L=l.find("#jhs-preview-video.is-active")[0]||c;L?.isConnected&&this.isSessionOpen(r)&&this.seekVideo(L,L.currentTime+10)})),v.off("contextmenu.jhsVideo").on("contextmenu.jhsVideo","#speed-btn",(L=>(L.preventDefault(),this.getOptionalDependency("DetailPageButtonPlugin")?.filterOne?.(L)))),$("#video-filterBtn").off("click.jhsVideo").on("click.jhsVideo",(L=>this.getOptionalDependency("DetailPageButtonPlugin")?.filterOne?.(L))),$("#video-favoriteBtn").off("click.jhsVideo").on("click.jhsVideo",(L=>this.getOptionalDependency("DetailPageButtonPlugin")?.favoriteOne?.(L)));let _=this.getOptionalDependency("DetailPageButtonPlugin"),R=_?.getDetailStateController?.();if(R){v.find("#video-filterBtn,#video-favoriteBtn").off("click.jhsVideo");let L=R.bind({root:v[0],closeRoot:document.documentElement,carNum:this.getPageInfo().carNum,layerIndex:utils.getOwningLayerIndex({root:document.documentElement}),getRecord:d(()=>_.getStateRecord(),"getRecord"),selectors:{blocked:"#video-filterBtn",favorite:"#video-favoriteBtn"}});r.stateCleanup?.(),r.stateCleanup=V?.on("car-state-changed",N=>{if(N.carNums?.includes(L.carNum)&&this.isSessionOpen(r))return R.render(L)}),r.stateCleanup&&r.scope.addCleanup(r.stateCleanup)}}};d(an,"PreviewVideoPlugin");var wa=an;function Tc(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelectorAll=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelectorAll=="function")return e;throw new TypeError("JavStore document is invalid")}d(Tc,"resolveDocument");function hs(o,e="https://javstore.net"){if(!o)return null;try{let t=new URL(String(o),e),s=t.hostname.toLowerCase();return["http:","https:"].includes(t.protocol)?(t.protocol==="http:"&&(s==="javstore.net"||s.endsWith(".javstore.net"))&&(t.protocol="https:"),t.href):null}catch{return null}}d(hs,"normalizeJavStoreAssetUrl");function Ac(o,e,t="https://javstore.net"){let s=ee(e);if(!s)return[];if(typeof o?.find=="function"){let a=globalThis.jQuery??globalThis.$??o.constructor;return o.find('a[href$="-pn.html"]').filter(((r,i)=>a(i).text().trim().toUpperCase().includes(s.toUpperCase()))).map(((r,i)=>new URL(a(i).attr("href"),t).href)).get()}return[...Tc(o).querySelectorAll('a[href$="-pn.html"]')].filter(a=>a.textContent?.trim().toUpperCase().includes(s.toUpperCase())).map(a=>new URL(a.getAttribute("href")||"",t).href)}d(Ac,"parseJavStoreSearch");function Pc(o,e){if(typeof o?.find=="function"){let a=globalThis.jQuery??globalThis.$??o.constructor,i=o.find("a").filter(((l,c)=>a(c).text().trim()==="CLICK HERE!")).first().attr("href");if(!i)return null;let n=hs(i,e);return n?n.replace(".th",""):null}let t=[...Tc(o).querySelectorAll("a")].find(a=>a.textContent?.trim()==="CLICK HERE!")?.getAttribute("href");if(!t)return null;let s=hs(t,e);return s?s.replace(".th",""):null}d(Pc,"parseJavStorePreview");var rn=class rn extends I{getName(){return"ScreenShotPlugin"}getScreenshotService(){return this.getRuntimeService("screenshot")}getSettingsSnapshot(){return this.getRuntimeService("settings")?.snapshot?.()??{}}async initCss(){return""}async handle(){if(!isDetailPage)return;let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")(),s=d(a=>{a.detail?.names?.includes("enableLoadScreenShot")&&(e.snapshot().enableLoadScreenShot==="no"?this.unmountHosted():this.loadScreenShot().catch(i=>clog.error("长缩略图重新加载失败",i)))},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>e.removeEventListener("settings.changed",s))),this.loadScreenShot().catch(a=>clog.error("长缩略图加载失败",a))}unmountHosted(){$(".screen-container, .jhs-screenshot-providers").remove()}async loadScreenShot(){if(!isDetailPage||!this.getScreenshotService().isEnabled(this.getSettingsSnapshot()))return;let t=this.getPageInfo().carNum;M&&$(".preview-images .tile-item").first().before('
      正在加载缩略图
      '),B&&$("#sample-waterfall .sample-box:first").after('
      正在加载缩略图
      ');try{let s=await this.getScreenshot(t);s?(this.addImg("缩略图",s),clog.log("加载缩略图:",s)):this.showErrorFallback(t,null)}catch(s){this.showErrorFallback(t,s)}}async getScreenshot(e){if(e=C(e),!e)throw clog.warn("跳过缩略图解析:番号不可用"),new Error("缩略图番号不可用");let t=arguments[1]||{},s=this.getScreenshotService(),a=this.getSettingsSnapshot();if(!t.allowWhenDisabled&&!s.isEnabled(a))return clog.warn("长缩略图功能已关闭,跳过请求"),null;let r=await this.getRuntimeService("scope")(),i=await s.resolve({carNum:e},{scope:r,settings:a,allowWhenDisabled:t.allowWhenDisabled===!0});return(Array.isArray(i)?i[0]:i)?.url||null}addImg(e,t){let s=hs(t);if(!s)return;let a=$(".screen-container").empty(),r=$("").attr({src:s,alt:e,loading:"lazy"});M&&a.append(r.addClass("jhs-layout-cad980f4")),B&&a.append($('
      ').append(r.attr("title",e).addClass("jhs-layout-d4a575e8"))),a.on("click",(i=>{i.stopPropagation(),i.preventDefault(),globalThis.showImageViewer(i.currentTarget)}))}showErrorFallback(e,t){let s=t instanceof Error?t.message:"";t&&clog.error("获取缩略图失败:",s.substring(0,100));let a=`jhs-screenshot-message${B?" jhs-screenshot-message--bus":""}`,r=C(e);if(!r)return void $(".screen-container").empty().append($("
      ").addClass(a).text("无法获取番号,缩略图未加载"));let i=this.getScreenshotService().getSearchUrl({carNum:r}),n=$(".screen-container").empty(),l=$("
      ").addClass(a).text(t instanceof Error?"获取缩略图失败":"暂无缩略图结果"),c=$('点击重试');n.append(l,$("
      "),c),i&&n.append(document.createTextNode(" 或 "),$('前往确认').attr("href",i)),n.off("click",".retry-link").off("click",".check-link").on("click",".retry-link",(async h=>{h.stopPropagation(),h.preventDefault(),n.empty().append($("
      ").addClass(a).text("正在重新加载..."));try{let u=await this.getScreenshot(r);u?this.addImg("缩略图",u):this.showErrorFallback(r,null)}catch(u){this.showErrorFallback(r,u)}})).on("click",".check-link",(h=>{h.stopPropagation(),h.preventDefault(),window.open(i,"_blank")}))}async loadInto(e,t,{isActive:s=d(()=>!0,"isActive")}={}){let a=$(e);if(!a.length||!this.getScreenshotService().isEnabled(this.getSettingsSnapshot()))return a.empty(),null;let r=await this.getRuntimeService("scope")();return ta({target:a,carNum:t,screenshot:this.getScreenshotService(),settings:this.getSettingsSnapshot(),scope:r,isActive:s})}renderInto(e,t,s){let a=$(e),r=$("").attr({src:hs(t),alt:s,loading:"lazy"}).addClass("jhs-fc2-gallery__image"),i=$('').attr("aria-label",`查看${s}大图`).append(r);a.empty().append(i).off("click.jhsScreenshot").on("click.jhsScreenshot",".jhs-fc2-screenshot-thumbnail",(n=>{n.preventDefault(),n.stopPropagation(),globalThis.showImageViewer(r[0])}))}};d(rn,"ScreenShotPlugin");var ya=rn;var Rc="jhs_img_cdn_index";function Vh(o,e,t,s=Date.now()){let a=new Map;for(let r of o)if(Array.isArray(r.newVideoList))for(let i of r.newVideoList){let n=typeof i=="object"?i:{},l=C(typeof i=="string"?i:i.carNum);if(!l)continue;let c=a.get(l)||{carNum:l,coverUrl:"",title:"",publishTime:"",actresses:[],starIds:[],categories:new Set,score:0,voteCount:0,url:"",isVr:!1};c.coverUrl||(c.coverUrl=n.coverUrl||""),c.title||(c.title=n.title||""),c.publishTime=[c.publishTime,n.publishTime||""].sort().at(-1),c.score=Math.max(c.score,Number(n.score)||0),c.voteCount=Math.max(c.voteCount,Number(n.voteCount)||0),c.url||(c.url=n.url||""),c.isVr||(c.isVr=n.isVr===!0||/(^|[^A-Z])VR([^A-Z]|$)/i.test(`${n.title||""} ${(n.tags||[]).join?.(" ")||""} ${(n.categories||[]).join?.(" ")||""}`)),r.name&&!c.actresses.includes(r.name)&&c.actresses.push(r.name),r.starId&&!c.starIds.includes(r.starId)&&c.starIds.push(r.starId),r.actressType&&c.categories.add(r.actressType),a.set(l,c)}return[...a.values()].map((r=>{let i=e.get(r.carNum),n=H(i?.stateFlags),l=t[r.carNum]||null,c=l?l.action==="snoozed"&&l.until&&Date.parse(l.until)<=s?"pending":l.action:"pending";return{...r,actressName:r.actresses.join("、"),starId:r.starIds[0]||"",categories:[...r.categories],flags:n,decision:l,decisionState:c}}))}d(Vh,"aggregateNewVideoRecords");var nn=class nn extends I{constructor(){super(...arguments),P(this,"currentPage",1),P(this,"pageSize",30),P(this,"nvCurrentPage",1),P(this,"nvPageSize",60),P(this,"nvFlatListCache",[]),P(this,"nvAllItemsMap",new Map),P(this,"nvActressesCache",[]),P(this,"nvCarMapCache",new Map),P(this,"nvSortBy","publishTime_desc"),P(this,"nvSelected",new Set),P(this,"nvDecisionsCache",{}),P(this,"nvCoverCache",new Map),P(this,"nvActorCoverRequests",new Map),P(this,"nvRenderGeneration",0),P(this,"nvSearchDebounced",null),P(this,"nvInvalidationTimer",null),P(this,"nvWorkspaceReloadPromise",null),P(this,"nvWorkspaceReloadDirty",!1),P(this,"nvWorkspaceMounted",!1),P(this,"nvEventUnsubscribe",null),P(this,"taskStatusUnsubscribe",null),P(this,"nvCoverPreview",null),P(this,"nvWorkspaceRoot",null),P(this,"nvJavDbUrl",""),P(this,"nvRuleTime",8760),P(this,"avatarSources",[]),P(this,"avatarSourceIndex",0),P(this,"nvWorkspaceFullReloadRequested",!1),P(this,"nvPendingRemovals",new Set),P(this,"nvRemovingCards",new Set)}getName(){return"NewVideoPlugin"}getStartupMode(){return"idle"}async initCss(){return` + `}async addSvgBtn(e=null){this.getOptionalDependency("ListPagePlugin")&&((e?$(e).toArray():$(this.getSelector().itemSelector).toArray()).forEach((t=>{let s=$(t);if(s.find(".tool-box").length||B&&s.find(".avatar-box").length)return;let a=M?s.find(".tags").first():s.find(".photo-info").first();a.length&&a.append(this.buildToolBox())})),this.enableSvgBtn(e))}async enableSvgBtn(e=null){let t=this.getRuntimeService("settings").snapshot(),{enableScreenSvg:s=E,enableVideoSvg:a=E,enablePreviewVideo:r=E,enableHandleSvg:i=E,enableSiteSvg:n=E,enableCopySvg:l=E}=t,c=e?$(e):$(document);[{selector:".screenSvg",enabled:s===E&&this.getOptionalDependency("ScreenShotPlugin")?E:"no"},{selector:".videoSvg",enabled:a===E&&ya(t)?E:"no"},{selector:".handleSvg",enabled:i},{selector:".siteSvg",enabled:n},{selector:".copySvg",enabled:l}].forEach((({selector:h,enabled:u})=>{c.find(h).toggle(u===E)}))}closeCardMenus(e=!1){let t=$(".jhs-card-menu.is-open"),s=t.siblings(".jhs-card-menu-trigger");t.removeClass("is-open"),s.attr("aria-expanded","false"),e&&s.first().trigger("focus")}async bindClick(e){this.getSelector();let t=this.getOptionalDependency("ListPagePlugin");if(!t)return;let s=$(document);s.off(".jhsCoverButton"),e.addCleanup((()=>s.off(".jhsCoverButton"))),s.on("click.jhsCoverButton",".jhs-card-menu-trigger",(h=>{h.preventDefault(),h.stopPropagation();let u=$(h.currentTarget),p=u.siblings(".jhs-card-menu"),g=!p.hasClass("is-open");this.closeCardMenus(),p.toggleClass("is-open",g),u.attr("aria-expanded",String(g)),g&&p.children().first().trigger("focus")})).on("keydown.jhsCoverButton",".jhs-card-menu [role='menuitem']",(h=>{let u=$(h.currentTarget).closest(".jhs-card-menu"),p=u.find("[role='menuitem']"),g=p.index(h.currentTarget);if(h.key==="Escape")return h.preventDefault(),this.closeCardMenus(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(h.key))return;h.preventDefault();let m=h.key==="Home"?0:h.key==="End"?p.length-1:h.key==="ArrowDown"?(g+1)%p.length:(g-1+p.length)%p.length;p.eq(m).trigger("focus")})).on("click.jhsCoverButton",(h=>{$(h.target).closest(".more-tools-container").length||this.closeCardMenus()})),s.on("click.jhsCoverButton",".videoSvg",(h=>{h.preventDefault(),$('.videoSvg[title!="播放视频"]').each(((g,m)=>{let f=$(m),v=f.closest(".item"),b=v.find("img"),{carNum:w}=t.findCarNumAndHref(v);this.showImg(f,b,w),f.html(this.videoSvg).attr({title:"播放视频","aria-label":"播放视频"})}));let u=$(h.target).closest(".item"),p=u.find(".videoSvg");if(p.attr("title")==="播放视频"){p.html(this.recoveryVideoSvg).attr({title:"切回封面","aria-label":"切回封面"});let{carNum:g}=t.findCarNumAndHref(u),m=u.find("img");if(!m.length)return void show.error("没有找到图片");this.showVideo(p,m,g).catch((f=>clog.error("卡片预览视频打开失败",f)))}})),s.on("click.jhsCoverButton",".screenSvg",(async h=>{h.preventDefault();let u=loading();try{let p=$(h.currentTarget).closest(".item"),{carNum:g}=t.findCarNumAndHref(p);g=g.replace("FC2-","");let m=this.getOptionalDependency("ScreenShotPlugin");if(!m)throw new Error("剧照功能已禁用");let f=await m.getScreenshot(g,{allowWhenDisabled:!0});u.close(),globalThis.showImageViewer(f)}catch(p){clog.error("图片预览出错:",p),show.error("图片预览出错:"+p)}finally{u.close()}})),s.on("click.jhsCoverButton",".filterBtn, .favoriteBtn, .hasDownBtn, .hasWatchBtn",(h=>{h.preventDefault(),h.stopPropagation();try{let u=$(h.currentTarget),p=u.closest(".item"),{carNum:g,url:m,publishTime:f,fc2Source:v}=t.findCarNumAndHref(p),b=d(async w=>{try{let S=await t.parseActressName(m),j=Ce(w);if(!j)throw new Error("不支持的状态操作");await this.getRuntimeService("state").patch(g,{[j]:!0},{type:"list-card-state",record:{carNum:g,url:m,names:S,publishTime:f,fc2Source:v}}),show.ok("操作成功")}catch(S){clog.error("保存操作失败:",S),show.error("操作失败")}},"r");u.hasClass("filterBtn")?utils.q(h,`是否屏蔽${T(g)}?`,(()=>b(ce))):u.hasClass("favoriteBtn")?b(ue):u.hasClass("hasDownBtn")?b(pe):u.hasClass("hasWatchBtn")&&b(me),this.closeCardMenus()}catch(u){clog.error("按钮点击处理失败:",u)}}));let a=this.getRuntimeService("settings").snapshot(),r=this.getRuntimeService("movie"),i=r.externalSiteOrigin("missAvBtn",a),n=r.externalSiteOrigin("jableBtn",a),l=r.externalSiteOrigin("avgleBtn",a),c=r.providerOrigin("av123")||"";$(this.getSelector().itemSelector).each(((h,u)=>{let p=$(u),{carNum:g}=t.findCarNumAndHref(p);p.find(".site-jable").attr({href:`${n}/search/${g}/`,target:"_blank",rel:"noopener noreferrer"}),p.find(".site-avgle").attr({href:`${l}/vod/search.html?wd=${g}`,target:"_blank",rel:"noopener noreferrer"}),p.find(".site-miss-av").attr({href:`${i}/search/${g}`,target:"_blank",rel:"noopener noreferrer"}),p.find(".site-123-av").attr({href:`${c}/cn/search?keyword=${encodeURIComponent(g)}`,target:"_blank",rel:"noopener noreferrer"})})),s.on("click.jhsCoverButton",".site-jable, .site-avgle, .site-miss-av, .site-123-av",(h=>{try{h.preventDefault(),h.stopPropagation();let u=$(h.currentTarget),p=u.closest(".item"),{carNum:g}=t.findCarNumAndHref(p),m=null;if(u.hasClass("site-jable")?m=`${n}/search/${g}/`:u.hasClass("site-avgle")?m=`${l}/vod/search.html?wd=${g}`:u.hasClass("site-miss-av")?m=`${i}/search/${g}`:u.hasClass("site-123-av")&&(m=`${c}/cn/search?keyword=${encodeURIComponent(g)}`),!m)return;h.ctrlKey||h.metaKey?GM_openInTab(m,{insert:0}):window.open(m),this.closeCardMenus()}catch(u){clog.error("站点按钮处理失败:",u)}})),s.on("click.jhsCoverButton",".titleSvg, .carNumSvg, .downSvg",(h=>{h.preventDefault(),h.stopPropagation();let u=$(h.currentTarget).closest(".item"),{carNum:p,title:g}=t.findCarNumAndHref(u),m=u.find(B?".photo-frame img":".cover img");$(h.currentTarget).hasClass("titleSvg")?utils.copyToClipboard("标题",g):$(h.currentTarget).hasClass("carNumSvg")?utils.copyToClipboard("番号",p):$(h.currentTarget).hasClass("downSvg")&&fetch(m.attr("src")).then((f=>f.blob())).then((f=>utils.download(f,p+" "+g+".jpg"))),this.closeCardMenus()}))}showImg(e,t,s){e.html(this.videoSvg).attr({title:"播放视频","aria-label":"播放视频"});let a=$(`#${`${s}_preview_video`}`);a.length>0&&(a[0].pause(),a.parent().hide()),t.show(),t.removeClass("loading"),t.next(".loading-spinner").remove()}async showVideo(e,t,s){let a=this.getRuntimeService("settings").snapshot();if(!ya(a))return show.error("预览视频已关闭");let r=this.previewGeneration,i=`${s}_preview_video`,n=$(`#${i}`);if(n.length>0)return n.parent().show(),await de(n[0],{context:"列表卡片预览",notify:!0}),void t.hide();t.addClass("loading"),t.after('
      ');let l=t.attr("data-full")||t.attr("src"),c=await this.getRuntimeService("scope")(),{sources:h,error:u}=await ja(s,this.getRuntimeService("storage"),this.getRuntimeService("movie"),c,a);if(r!==this.previewGeneration||!Re(this.getRuntimeService("settings").snapshot()))return void this.showImg(e,t,s);if(!h)return show.error(u?.code==="REGION_BLOCKED"?u.message:"未解析到视频"),void this.showImg(e,t,s);let p=this.getRuntimeService("settings").snapshot().videoQuality;p=Vt(Object.keys(h),p);let g=h[p],m=document.createElement("div"),f=document.createElement("video");B||(m.className="jhs-layout-d543acf8"),f.src=g,f.poster=l||"",f.id=i,f.controls=!0,f.loop=!0,f.muted=!0,f.playsInline=!0,f.className="jhs-layout-a38a0e50",m.appendChild(f),t.parent().append(m),t.hide(),t.removeClass("loading"),t.next(".loading-spinner").remove(),n=$(f);let v=n[0];v.load(),v.muted=!1,await de(v,{context:"列表卡片预览",notify:!0,message:u?.code==="REGION_BLOCKED"?u.message:"当前视频源无法播放"}),n.trigger("focus")}};d(cn,"CoverButtonPlugin");var xa=cn;var dn=class dn extends R{constructor(){super(...arguments),this.previewGeneration=0,this.previewSession=null}getName(){return"PreviewVideoPlugin"}async initCss(){return".jhs-dmm-preview-player{display:none;width:100%;height:auto}.jhs-dmm-preview-player.is-active{display:block}.jhs-native-preview-hidden{display:none!important}"}async handle(){if(!isDetailPage)return;let e=this.getRuntimeService("settings");if(this.lifecycleScope||(this.lifecycleScope=await this.getRuntimeService("scope")()),!this._settingsListenerBound){this._settingsListenerBound=!0;let t=d(s=>{s.detail?.names?.some(r=>r==="enablePreviewVideo"||r==="enableLoadPreviewVideo")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",t),this.lifecycleScope.addCleanup((()=>{e.removeEventListener("settings.changed",t),this._settingsListenerBound=!1,this.unmountPreview()}))}this.reconfigure()}reconfigure(){this.previewGeneration++;let e=this.getRuntimeService("settings").snapshot();if(!Nc(e))return void this.unmountPreview();this.mountPreview(),qt(e)?this.initDmm(this.lifecycleScope).catch((t=>clog.error("预加载 DMM 失败",t))):(this.unmountDmmPlayer(),$(".fancybox-content #preview-video").length&&!$("#video-bottom-toolbar").length&&this.handleVideo().catch(t=>clog.error("恢复原生预览操作失败",t)))}mountPreview(){if(this._previewMounted)return;this._previewMounted=!0,$(".preview-video-container").removeClass("jhs-native-preview-hidden");let e=$(".preview-video-container"),t=d(()=>{this.cancelOpenWait?.(),this.cancelOpenWait=utils.loopDetector((()=>$(".fancybox-content #preview-video").length>0),(()=>{this.handleVideo().catch((a=>clog.error("预览视频处理失败",a)))}),20,1e4,!0,this.lifecycleScope)},"openVideo");e.off("click.jhsVideo").on("click.jhsVideo",t),this.lifecycleScope.addCleanup((()=>e.off("click.jhsVideo",t)));let s=window.location.href;(s.includes("gallery-1")||s.includes("gallery-2"))&&t(),s.includes("autoPlay=1")&&e.length>0&&e[0].click()}unmountDmmPlayer(){this.dmmRequestScope?.dispose(),$("[data-jhs-dmm-trigger]").remove();let e=$("#jhs-preview-video"),t=e[0],s=this.previewSession?.native;s&&t&&this.isSessionOpen(this.previewSession)&&(this.seekVideo(s,t.currentTime),!t.paused&&Re(this.getRuntimeService("settings").snapshot())?de(s,{context:"恢复原生预览",notify:!1}).then(()=>{this.previewSession?.native!==s&&s.pause()}):s.pause()),t&&(t.pause(),e.removeAttr("src"),t.load(),e.remove()),$("#video-bottom-toolbar .jhs-video-quality-list").empty(),$("#preview-video").removeClass("jhs-native-preview-hidden"),this.dmmPreviewPromise=null,this.previewSession&&!s&&this.disposePreviewSession()}unmountPreview(){this._previewMounted=!1,this.cancelOpenWait?.(),this.disposePreviewSession(),this.unmountDmmPlayer(),$("#video-bottom-toolbar").remove(),$(".preview-video-container").addClass("jhs-native-preview-hidden")}unmountJhsPreview(){this.disposePreviewSession(),$("[data-jhs-dmm-trigger]").remove();let e=$("#jhs-preview-video"),t=e[0];t&&(t.pause(),e.removeAttr("src"),t.load(),e.remove()),$("#video-bottom-toolbar").remove(),$("#preview-video").removeClass("jhs-native-preview-hidden"),$(".preview-video-container").addClass("jhs-native-preview-hidden")}async initDmm(e){let t=this.previewGeneration,s=this.getRuntimeService("settings");try{let{sources:a}=await this.getDmmPreview(e);if(t!==this.previewGeneration||e?.disposed||!Re(s.snapshot())||!gs(s.snapshot())||!a)return;if($(".fancybox-content #preview-video").length){await this.handleVideo();return}if($("#preview-video")[0])return;clog.debug("JavDB没有视频播放元素, 开始创建...");let n=$(".column-video-cover img").attr("src");if($("[data-jhs-dmm-trigger]").length)return;let l=$('');l.append($('').attr("src",n||"")),$(".preview-images").first().prepend(l),l.on("click.jhsVideo",()=>this.openDmmDialog())}catch(a){clog.error("预加载 DMM 失败:",a)}}getDmmPreview(e=this.lifecycleScope){if(this.dmmPreviewPromise)return this.dmmPreviewPromise;let t=new te("javdb-dmm-request");this.dmmRequestScope=t;let s,a=Promise.resolve(e||this.getRuntimeService("scope")()).then(r=>{if(r?.disposed||t.disposed)throw new Error("预览请求已取消");return s=r?.addCleanup?.(()=>t.dispose()),nn(this.getPageInfo().carNum,this.getRuntimeService("storage"),this.getRuntimeService("movie"),t)}).then((r=>(this.dmmPreviewPromise===a&&(r.error?.retryable||r.error?.code==="HTTP_ERROR")&&(this.dmmPreviewPromise=null),r)),(r=>{throw this.dmmPreviewPromise===a&&(this.dmmPreviewPromise=null),r})).finally(()=>{t.dispose(),typeof s=="function"&&s()});return this.dmmPreviewPromise=a,a}createDmmPlayer(e){let t=e.length?e.parent():$(this.previewSession?.host),s=t.find("#jhs-preview-video");if(s.length)return s;let a=$('');return t.append(a),a}isSessionOpen(e){if(!e||e.scope.disposed||!e.host.isConnected||e.native&&!e.host.contains(e.native))return!1;for(let t=e.host;t;t=t.parentElement)if(t.getAttribute("aria-hidden")==="true"||getComputedStyle(t).display==="none")return!1;return!0}seekVideo(e,t){let s=d(()=>{try{e.currentTime=Math.max(0,Math.min(t||0,Number.isFinite(e.duration)?e.duration:1/0))}catch{}},"seek");s();let a=this.previewSession;if(a?.seekCleanups?.get(e)?.(),!e.readyState&&a){a.seekCleanups||(a.seekCleanups=new Map);let r=d(()=>{l(),this.isSessionOpen(a)&&s()},"loaded"),i=d(()=>l(),"failed"),n=setTimeout(i,5e3),l=a.scope.addCleanup(()=>{clearTimeout(n),e.removeEventListener("loadedmetadata",r),e.removeEventListener("error",i),a.seekCleanups.delete(e)});e.addEventListener("loadedmetadata",r,{once:!0}),e.addEventListener("error",i,{once:!0}),a.seekCleanups.set(e,l)}}disposePreviewSession(){let e=this.previewSession;if(this.previewSession=null,!e)return;this.dmmRequestScope?.dispose(),this.dmmPreviewPromise=null,e.scope.dispose(),$(e.host).find("#video-bottom-toolbar").remove();let t=e.host.querySelector("#jhs-preview-video");t&&(t.pause(),t.removeAttribute("src"),t.load(),t.remove()),e.native?.classList.remove("jhs-native-preview-hidden"),e.native?.pause(),e.dialogId!=null&&this.getRuntimeService("dialog").close(e.dialogId)}openDmmDialog(){if(!qt(this.getRuntimeService("settings").snapshot())||this.previewSession)return;let e=$('
      ');this.getRuntimeService("dialog").open({type:1,title:"预告片",ui:{body:"media"},content:e,area:utils.getDialogArea("lg"),success:d((t,s)=>{this.handleVideo(e[0],s).catch(a=>clog.error("预览失败",a))},"success"),end:d(()=>{this.previewSession?.host===e[0]&&this.disposePreviewSession()},"end")})}waitForDmmReady(e){let t=this.previewSession?.scope.signal;return t?.aborted||e.error?Promise.resolve(!1):e.readyState>=3?Promise.resolve(!0):new Promise(s=>{let a=d(l=>{clearTimeout(n),e.removeEventListener("canplay",r),e.removeEventListener("error",i),t?.removeEventListener("abort",i),s(l)},"finish"),r=d(()=>a(!0),"loaded"),i=d(()=>a(!1),"failed"),n=setTimeout(i,1e4);e.addEventListener("canplay",r,{once:!0}),e.addEventListener("error",i,{once:!0}),t?.addEventListener("abort",i,{once:!0})})}async restoreNativePlayer(e,t,s=!1,a=!0){if(!t||!this.isSessionOpen(this.previewSession))return!1;let r=e.parent().find("#jhs-preview-video"),i=r[0];return i&&(i.pause(),r.removeAttr("src"),i.load(),r.remove()),e.removeClass("jhs-native-preview-hidden"),a?de(t,{context:"JavDB 原生预览回退",notify:s}):(t.pause(),!0)}async handleVideo(e=null,t=null){let s=$(".fancybox-content #preview-video"),a=e||s[0]?.closest(".fancybox-content");if(!a||!Re(this.getRuntimeService("settings").snapshot())||getComputedStyle(a).display==="none")return;if(this.previewSession?.host!==a){this.disposePreviewSession();let L=new te("javdb-preview");this.previewSession={host:a,native:s[0]||null,scope:L,dialogId:t},L.observe(document.body,()=>{this.previewSession?.host===a&&!this.isSessionOpen(this.previewSession)&&this.disposePreviewSession()},{childList:!0,subtree:!0,attributes:!0,attributeFilter:["class","style","aria-hidden"]})}let r=this.previewSession;if(r.generation===this.previewGeneration)return;r.generation=this.previewGeneration;let i=d(()=>this.previewSession===r&&this.isSessionOpen(r)&&u===this.previewGeneration&&Re(this.getRuntimeService("settings").snapshot()),"alive"),n=this.getRuntimeService("settings"),l=$(a),c=s[0],h=n.snapshot().videoMuted,u=this.previewGeneration,p=gs(this.getRuntimeService("settings").snapshot()),g=p?await this.getDmmPreview():{sources:null,error:null};if(!i())return;let{sources:m,error:f}=g,v=$("
      ").attr("id","video-bottom-toolbar").addClass("jhs-video-toolbar"),b=$("
      ").addClass("jhs-video-quality-list").attr({role:"group","aria-label":"视频画质"});l.find("#video-bottom-toolbar").remove();let w=!1,S=null,j=null;if(m){let L=this.getRuntimeService("settings").snapshot().videoQuality,N=Vt(Object.keys(m),L),A=m[N],O=c?.currentTime||0,U=!c||!c.paused;S=this.createDmmPlayer(s),j=S[0],j.muted=h==null||h===!0,S.off("volumechange.jhsVideo").on("volumechange.jhsVideo",(()=>{n.set("videoMuted",j.muted).catch(Q=>clog.error("保存视频静音设置失败",Q))})),S.attr("src",A),j.load(),this.seekVideo(j,O),S.addClass("is-active");let q=await this.waitForDmmReady(j);if(!i()){j.pause();return}if(w=q&&(!U||await de(j,{context:"JavDB 高画质预览",notify:!1})),!i()){j.pause();return}if(q&&!w&&!j.muted&&(j.muted=!0,w=await de(j,{context:"JavDB 高画质预览静音重试",notify:!1})),!i()){j.pause();return}if(w?(c?.pause(),s.addClass("jhs-native-preview-hidden")):(S.removeClass("is-active"),await this.restoreNativePlayer(s,c,!0,U)),!i())return;if(!w&&!c){show.error("当前视频源无法播放"),this.disposePreviewSession();return}w&&nt.forEach((Q=>{let se=m[Q.quality];if(!se)return;let ge=w&&N===Q.quality;b.append($('').toggleClass("active",ge).attr({"data-quality":Q.quality,"data-video-src":se,"aria-pressed":String(ge)}).text(Q.text))}))}v.append(b);let k=$("
      ").addClass("jhs-toolbar");if(this.getOptionalDependency("DetailPageButtonPlugin")&&k.append(Ot({actions:["blocked","favorite"],ids:{blocked:"video-filterBtn",favorite:"video-favoriteBtn"}})),k.append(''),!i())return;v.append(k),l.append(v),v.off("click.jhsVideo").on("click.jhsVideo",".jhs-video-quality-btn",(async L=>{let N=$(L.currentTarget);if(!N.hasClass("active"))try{if(!j?.isConnected||!i())return;let A=j.currentTime,O=S.attr("src"),U=!j.paused;S.attr("src",N.data("video-src")),j.load(),this.seekVideo(j,A);let q=await this.waitForDmmReady(j);if(!i())return;let Q=q&&(!U||await de(j,{context:"JavDB 画质切换",notify:!1}));if(!i())return;if(Q)v.find(".jhs-video-quality-btn").removeClass("active").attr("aria-pressed","false"),N.addClass("active").attr("aria-pressed","true");else{O&&(S.attr("src",O),j.load(),j.currentTime=A);let se=O&&await this.waitForDmmReady(j)&&(!U||await de(j,{context:"JavDB 画质切换回退",notify:!1}));if(!i())return;se||await this.restoreNativePlayer(s,c,!0,U)}}catch(A){clog.error("切换画质失败:",A)}})),$("#speed-btn").off("click.jhsVideo").on("click.jhsVideo",(()=>{let L=l.find("#jhs-preview-video.is-active")[0]||c;L?.isConnected&&this.isSessionOpen(r)&&this.seekVideo(L,L.currentTime+10)})),v.off("contextmenu.jhsVideo").on("contextmenu.jhsVideo","#speed-btn",(L=>(L.preventDefault(),this.getOptionalDependency("DetailPageButtonPlugin")?.filterOne?.(L)))),$("#video-filterBtn").off("click.jhsVideo").on("click.jhsVideo",(L=>this.getOptionalDependency("DetailPageButtonPlugin")?.filterOne?.(L))),$("#video-favoriteBtn").off("click.jhsVideo").on("click.jhsVideo",(L=>this.getOptionalDependency("DetailPageButtonPlugin")?.favoriteOne?.(L)));let _=this.getOptionalDependency("DetailPageButtonPlugin"),I=_?.getDetailStateController?.();if(I){v.find("#video-filterBtn,#video-favoriteBtn").off("click.jhsVideo");let L=I.bind({root:v[0],closeRoot:document.documentElement,carNum:this.getPageInfo().carNum,layerIndex:utils.getOwningLayerIndex({root:document.documentElement}),getRecord:d(()=>_.getStateRecord(),"getRecord"),selectors:{blocked:"#video-filterBtn",favorite:"#video-favoriteBtn"}});r.stateCleanup?.(),r.stateCleanup=V?.on("car-state-changed",N=>{if(N.carNums?.includes(L.carNum)&&this.isSessionOpen(r))return I.render(L)}),r.stateCleanup&&r.scope.addCleanup(r.stateCleanup)}}};d(dn,"PreviewVideoPlugin");var ka=dn;function Lc(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelectorAll=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelectorAll=="function")return e;throw new TypeError("JavStore document is invalid")}d(Lc,"resolveDocument");function ms(o,e="https://javstore.net"){if(!o)return null;try{let t=new URL(String(o),e),s=t.hostname.toLowerCase();return["http:","https:"].includes(t.protocol)?(t.protocol==="http:"&&(s==="javstore.net"||s.endsWith(".javstore.net"))&&(t.protocol="https:"),t.href):null}catch{return null}}d(ms,"normalizeJavStoreAssetUrl");function Mc(o,e,t="https://javstore.net"){let s=ee(e);if(!s)return[];if(typeof o?.find=="function"){let a=globalThis.jQuery??globalThis.$??o.constructor;return o.find('a[href$="-pn.html"]').filter(((r,i)=>a(i).text().trim().toUpperCase().includes(s.toUpperCase()))).map(((r,i)=>new URL(a(i).attr("href"),t).href)).get()}return[...Lc(o).querySelectorAll('a[href$="-pn.html"]')].filter(a=>a.textContent?.trim().toUpperCase().includes(s.toUpperCase())).map(a=>new URL(a.getAttribute("href")||"",t).href)}d(Mc,"parseJavStoreSearch");function Bc(o,e){if(typeof o?.find=="function"){let a=globalThis.jQuery??globalThis.$??o.constructor,i=o.find("a").filter(((l,c)=>a(c).text().trim()==="CLICK HERE!")).first().attr("href");if(!i)return null;let n=ms(i,e);return n?n.replace(".th",""):null}let t=[...Lc(o).querySelectorAll("a")].find(a=>a.textContent?.trim()==="CLICK HERE!")?.getAttribute("href");if(!t)return null;let s=ms(t,e);return s?s.replace(".th",""):null}d(Bc,"parseJavStorePreview");var hn=class hn extends R{getName(){return"ScreenShotPlugin"}getScreenshotService(){return this.getRuntimeService("screenshot")}getSettingsSnapshot(){return this.getRuntimeService("settings")?.snapshot?.()??{}}async initCss(){return""}async handle(){if(!isDetailPage)return;let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")(),s=d(a=>{a.detail?.names?.includes("enableLoadScreenShot")&&(e.snapshot().enableLoadScreenShot==="no"?this.unmountHosted():this.loadScreenShot().catch(i=>clog.error("长缩略图重新加载失败",i)))},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>e.removeEventListener("settings.changed",s))),this.loadScreenShot().catch(a=>clog.error("长缩略图加载失败",a))}unmountHosted(){$(".screen-container, .jhs-screenshot-providers").remove()}async loadScreenShot(){if(!isDetailPage||!this.getScreenshotService().isEnabled(this.getSettingsSnapshot()))return;let t=this.getPageInfo().carNum;M&&$(".preview-images .tile-item").first().before('
      正在加载缩略图
      '),B&&$("#sample-waterfall .sample-box:first").after('
      正在加载缩略图
      ');try{let s=await this.getScreenshot(t);s?(this.addImg("缩略图",s),clog.log("加载缩略图:",s)):this.showErrorFallback(t,null)}catch(s){this.showErrorFallback(t,s)}}async getScreenshot(e){if(e=C(e),!e)throw clog.warn("跳过缩略图解析:番号不可用"),new Error("缩略图番号不可用");let t=arguments[1]||{},s=this.getScreenshotService(),a=this.getSettingsSnapshot();if(!t.allowWhenDisabled&&!s.isEnabled(a))return clog.warn("长缩略图功能已关闭,跳过请求"),null;let r=await this.getRuntimeService("scope")(),i=await s.resolve({carNum:e},{scope:r,settings:a,allowWhenDisabled:t.allowWhenDisabled===!0});return(Array.isArray(i)?i[0]:i)?.url||null}addImg(e,t){let s=ms(t);if(!s)return;let a=$(".screen-container").empty(),r=$("").attr({src:s,alt:e,loading:"lazy"});M&&a.append(r.addClass("jhs-layout-cad980f4")),B&&a.append($('
      ').append(r.attr("title",e).addClass("jhs-layout-d4a575e8"))),a.on("click",(i=>{i.stopPropagation(),i.preventDefault(),globalThis.showImageViewer(i.currentTarget)}))}showErrorFallback(e,t){let s=t instanceof Error?t.message:"";t&&clog.error("获取缩略图失败:",s.substring(0,100));let a=`jhs-screenshot-message${B?" jhs-screenshot-message--bus":""}`,r=C(e);if(!r)return void $(".screen-container").empty().append($("
      ").addClass(a).text("无法获取番号,缩略图未加载"));let i=this.getScreenshotService().getSearchUrl({carNum:r}),n=$(".screen-container").empty(),l=$("
      ").addClass(a).text(t instanceof Error?"获取缩略图失败":"暂无缩略图结果"),c=$('点击重试');n.append(l,$("
      "),c),i&&n.append(document.createTextNode(" 或 "),$('前往确认').attr("href",i)),n.off("click",".retry-link").off("click",".check-link").on("click",".retry-link",(async h=>{h.stopPropagation(),h.preventDefault(),n.empty().append($("
      ").addClass(a).text("正在重新加载..."));try{let u=await this.getScreenshot(r);u?this.addImg("缩略图",u):this.showErrorFallback(r,null)}catch(u){this.showErrorFallback(r,u)}})).on("click",".check-link",(h=>{h.stopPropagation(),h.preventDefault(),window.open(i,"_blank")}))}async loadInto(e,t,{isActive:s=d(()=>!0,"isActive")}={}){let a=$(e);if(!a.length||!this.getScreenshotService().isEnabled(this.getSettingsSnapshot()))return a.empty(),null;let r=await this.getRuntimeService("scope")();return na({target:a,carNum:t,screenshot:this.getScreenshotService(),settings:this.getSettingsSnapshot(),scope:r,isActive:s})}renderInto(e,t,s){let a=$(e),r=$("").attr({src:ms(t),alt:s,loading:"lazy"}).addClass("jhs-fc2-gallery__image"),i=$('').attr("aria-label",`查看${s}大图`).append(r);a.empty().append(i).off("click.jhsScreenshot").on("click.jhsScreenshot",".jhs-fc2-screenshot-thumbnail",(n=>{n.preventDefault(),n.stopPropagation(),globalThis.showImageViewer(r[0])}))}};d(hn,"ScreenShotPlugin");var Ca=hn;var Oc="jhs_img_cdn_index";function Yh(o,e,t,s=Date.now()){let a=new Map;for(let r of o)if(Array.isArray(r.newVideoList))for(let i of r.newVideoList){let n=typeof i=="object"?i:{},l=C(typeof i=="string"?i:i.carNum);if(!l)continue;let c=a.get(l)||{carNum:l,coverUrl:"",title:"",publishTime:"",actresses:[],starIds:[],categories:new Set,score:0,voteCount:0,url:"",isVr:!1};c.coverUrl||(c.coverUrl=n.coverUrl||""),c.title||(c.title=n.title||""),c.publishTime=[c.publishTime,n.publishTime||""].sort().at(-1),c.score=Math.max(c.score,Number(n.score)||0),c.voteCount=Math.max(c.voteCount,Number(n.voteCount)||0),c.url||(c.url=n.url||""),c.isVr||(c.isVr=n.isVr===!0||/(^|[^A-Z])VR([^A-Z]|$)/i.test(`${n.title||""} ${(n.tags||[]).join?.(" ")||""} ${(n.categories||[]).join?.(" ")||""}`)),r.name&&!c.actresses.includes(r.name)&&c.actresses.push(r.name),r.starId&&!c.starIds.includes(r.starId)&&c.starIds.push(r.starId),r.actressType&&c.categories.add(r.actressType),a.set(l,c)}return[...a.values()].map((r=>{let i=e.get(r.carNum),n=H(i?.stateFlags),l=t[r.carNum]||null,c=l?l.action==="snoozed"&&l.until&&Date.parse(l.until)<=s?"pending":l.action:"pending";return{...r,actressName:r.actresses.join("、"),starId:r.starIds[0]||"",categories:[...r.categories],flags:n,decision:l,decisionState:c}}))}d(Yh,"aggregateNewVideoRecords");var un=class un extends R{constructor(){super(...arguments),P(this,"currentPage",1),P(this,"pageSize",30),P(this,"nvCurrentPage",1),P(this,"nvPageSize",60),P(this,"nvFlatListCache",[]),P(this,"nvAllItemsMap",new Map),P(this,"nvActressesCache",[]),P(this,"nvCarMapCache",new Map),P(this,"nvSortBy","publishTime_desc"),P(this,"nvSelected",new Set),P(this,"nvDecisionsCache",{}),P(this,"nvCoverCache",new Map),P(this,"nvActorCoverRequests",new Map),P(this,"nvRenderGeneration",0),P(this,"nvSearchDebounced",null),P(this,"nvInvalidationTimer",null),P(this,"nvWorkspaceReloadPromise",null),P(this,"nvWorkspaceReloadDirty",!1),P(this,"nvWorkspaceMounted",!1),P(this,"nvEventUnsubscribe",null),P(this,"taskStatusUnsubscribe",null),P(this,"nvCoverPreview",null),P(this,"nvWorkspaceRoot",null),P(this,"nvJavDbUrl",""),P(this,"nvRuleTime",8760),P(this,"avatarSources",[]),P(this,"avatarSourceIndex",0),P(this,"nvWorkspaceFullReloadRequested",!1),P(this,"nvPendingRemovals",new Set),P(this,"nvRemovingCards",new Set)}getName(){return"NewVideoPlugin"}getStartupMode(){return"idle"}async initCss(){return` - `}async handle(){this.initializeLocalState(),this.nvEventUnsubscribe||(this.nvEventUnsubscribe=V.on("new-video-changed",(e=>this.scheduleWorkspaceReload(e)))),this.taskStatusUnsubscribe||(this.taskStatusUnsubscribe=V.on("task-status-changed",(()=>this.isWorkspaceMounted()&&this.renderTaskStatuses()))),await this.showNewVideoCount()}initializeLocalState(){this.avatarSources=this.getRuntimeService("actressInfo").getAvatarSources();let e=parseInt(this.getRuntimeService("storage").getLocal(Rc)||"0",10);this.avatarSourceIndex=Number.isInteger(e)&&e>=0&&e0}scheduleWorkspaceReload(e={}){let t=Array.isArray(e?.carNums)?e.carNums.map(C).filter(Boolean):[];["browse","state-handled","manual"].includes(e?.reason)&&t.length?t.forEach(s=>this.nvPendingRemovals.add(s)):this.nvWorkspaceFullReloadRequested=!0,this.nvWorkspaceReloadDirty=!0,this.nvInvalidationTimer||(this.nvInvalidationTimer=setTimeout((()=>{this.nvInvalidationTimer=null,this.flushWorkspaceReload()}),0))}async flushWorkspaceReload(){return this.nvWorkspaceReloadPromise?this.nvWorkspaceReloadPromise:(this.nvWorkspaceReloadPromise=(async()=>{do{let e=this.nvWorkspaceFullReloadRequested,t=new Set(this.nvPendingRemovals);this.nvWorkspaceFullReloadRequested=!1,this.nvPendingRemovals.clear(),this.nvWorkspaceReloadDirty=!1,await this.showNewVideoCount(),this.isWorkspaceMounted()&&(!e&&t.size&&this._viewMode==="list"&&$("#nv-grid").length?await this.applyNewVideoRemovals(t):await this.reloadNewVideoWorkspaceData({preservePage:!0}))}while(this.nvWorkspaceReloadDirty)})().catch((e=>clog.error("新作品数据刷新失败",e))).finally((()=>{this.nvWorkspaceReloadPromise=null})),this.nvWorkspaceReloadPromise)}async applyNewVideoRemovals(e){if(this.nvWorkspaceFullReloadRequested)return;let t=this.nvRenderGeneration,s=$("#new-video-list-container"),a=s[0],r=s.find(".nv-card").filter((l,c)=>e.has(C($(c).attr("data-car"))));e.forEach(l=>{this.nvAllItemsMap.delete(l),this.nvSelected.delete(l)}),this.nvFlatListCache=this.nvFlatListCache.filter(l=>!e.has(C(l.carNum))),this.nvCurrentPageItems=(this.nvCurrentPageItems||[]).filter(l=>!e.has(C(l.carNum))),this.nvActressesCache=this.nvActressesCache.map(l=>Array.isArray(l.newVideoList)?{...l,newVideoList:l.newVideoList.filter(c=>!e.has(C(typeof c=="string"?c:c?.carNum)))}:l),this.nvCoverPreview?.currentTarget&&r.toArray().some(l=>l.contains(this.nvCoverPreview.currentTarget))&&this.nvCoverPreview.hidePreview();let i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches?0:180;r.each((l,c)=>this.nvRemovingCards.add(c));try{await Promise.all(r.toArray().map(l=>new Promise(c=>{$(l).animate({opacity:0},i,c)})))}finally{r.each((l,c)=>this.nvRemovingCards.delete(c))}if(!this.isWorkspaceMounted()||t!==this.nvRenderGeneration||a!==$("#new-video-list-container")[0]||this.nvWorkspaceFullReloadRequested)return;let n=s.add(s.parentsUntil(this.nvWorkspaceRoot||".newVideoToolBox")).add(this.nvWorkspaceRoot||s.closest(".newVideoToolBox")).map((l,c)=>({element:c,top:c.scrollTop,left:c.scrollLeft})).get();await this.renderNewVideoList({incremental:!0}),this.isWorkspaceMounted()&&t===this.nvRenderGeneration&&a===$("#new-video-list-container")[0]&&n.forEach(({element:l,top:c,left:h})=>{l.scrollTop=c,l.scrollLeft=h})}getPendingNewVideoCount(e,t){return Array.isArray(e?.newVideoList)?new Set(e.newVideoList.map((s=>C(typeof s=="string"?s:s.carNum))).filter((s=>s&&!t.has(s)&&!this.isDecisionHidden(s)))).size:0}isDecisionHidden(e){let t=this.nvDecisionsCache[C(e)];return t?["ignored","dismissed"].includes(t.action)||t.action==="snoozed"&&(!t.until||Date.parse(t.until)>Date.now()):!1}async getPendingNewVideoTotal(){let e=await storageManager.getCarMap(),t=new Set;return this.nvDecisionsCache=await this.getRuntimeService("state").getNewVideoDecisions(),(await storageManager.getFavoriteActressList()).forEach((s=>Array.isArray(s.newVideoList)&&s.newVideoList.forEach((a=>{let r=C(typeof a=="string"?a:a.carNum);r&&!oe(H(e.get(r)?.stateFlags))&&!this.isDecisionHidden(r)&&t.add(r)})))),t.size}async showNewVideoCount(){let e=await this.getPendingNewVideoTotal();$("#newVideoCount").text(`${e}`)}async resetBtnTip(){let e=this.getRuntimeService("storage"),t=this.getOptionalDependency("TaskPlugin"),s=await storageManager.getSetting(),a=t?e.getLocal(t.lastCheckFavoriteActressTimeKey)||"无":"任务已禁用",r=s.checkFavoriteActress_IntervalTime,i=t?e.getLocal(t.lastCheckNewVideoTimeKey)||"无":"任务已禁用",n=s.checkNewVideo_intervalTime;$("#checkFavoriteActress").attr("data-tip",`上次完整同步: ${a}; 检测间隔时间: ${r}小时`),$("#checkNewVideo").attr("data-tip",`上次整批检测: ${i}; 检测间隔时间: ${n}小时`)}async openDialog(){let e=this.getRuntimeService("storage");this.cleanupNewVideoWorkspace(),this._viewMode=e.getLocal("jhs_newVideoViewMode")==="list"?"list":"actress",this.currentPage=1,this.nvCurrentPage=1,this.nvSelected=new Set,this.nvCoverCache=new Map,this.nvActorCoverRequests=new Map,this.nvRenderGeneration++;let t=this.getOptionalDependency("TaskPlugin"),s=await storageManager.getSetting(),a=t?e.getLocal(t.lastCheckFavoriteActressTimeKey)||"无":"任务已禁用",r=s.checkFavoriteActress_IntervalTime,i=t?e.getLocal(t.lastCheckNewVideoTimeKey)||"无":"任务已禁用",n=s.checkNewVideo_intervalTime,l=` + `}async handle(){this.initializeLocalState(),this.nvEventUnsubscribe||(this.nvEventUnsubscribe=V.on("new-video-changed",(e=>this.scheduleWorkspaceReload(e)))),this.taskStatusUnsubscribe||(this.taskStatusUnsubscribe=V.on("task-status-changed",(()=>this.isWorkspaceMounted()&&this.renderTaskStatuses()))),await this.showNewVideoCount()}initializeLocalState(){this.avatarSources=this.getRuntimeService("actressInfo").getAvatarSources();let e=parseInt(this.getRuntimeService("storage").getLocal(Oc)||"0",10);this.avatarSourceIndex=Number.isInteger(e)&&e>=0&&e0}scheduleWorkspaceReload(e={}){let t=Array.isArray(e?.carNums)?e.carNums.map(C).filter(Boolean):[];["browse","state-handled","manual"].includes(e?.reason)&&t.length?t.forEach(s=>this.nvPendingRemovals.add(s)):this.nvWorkspaceFullReloadRequested=!0,this.nvWorkspaceReloadDirty=!0,this.nvInvalidationTimer||(this.nvInvalidationTimer=setTimeout((()=>{this.nvInvalidationTimer=null,this.flushWorkspaceReload()}),0))}async flushWorkspaceReload(){return this.nvWorkspaceReloadPromise?this.nvWorkspaceReloadPromise:(this.nvWorkspaceReloadPromise=(async()=>{do{let e=this.nvWorkspaceFullReloadRequested,t=new Set(this.nvPendingRemovals);this.nvWorkspaceFullReloadRequested=!1,this.nvPendingRemovals.clear(),this.nvWorkspaceReloadDirty=!1,await this.showNewVideoCount(),this.isWorkspaceMounted()&&(!e&&t.size&&this._viewMode==="list"&&$("#nv-grid").length?await this.applyNewVideoRemovals(t):await this.reloadNewVideoWorkspaceData({preservePage:!0}))}while(this.nvWorkspaceReloadDirty)})().catch((e=>clog.error("新作品数据刷新失败",e))).finally((()=>{this.nvWorkspaceReloadPromise=null})),this.nvWorkspaceReloadPromise)}async applyNewVideoRemovals(e){if(this.nvWorkspaceFullReloadRequested)return;let t=this.nvRenderGeneration,s=$("#new-video-list-container"),a=s[0],r=s.find(".nv-card").filter((l,c)=>e.has(C($(c).attr("data-car"))));e.forEach(l=>{this.nvAllItemsMap.delete(l),this.nvSelected.delete(l)}),this.nvFlatListCache=this.nvFlatListCache.filter(l=>!e.has(C(l.carNum))),this.nvCurrentPageItems=(this.nvCurrentPageItems||[]).filter(l=>!e.has(C(l.carNum))),this.nvActressesCache=this.nvActressesCache.map(l=>Array.isArray(l.newVideoList)?{...l,newVideoList:l.newVideoList.filter(c=>!e.has(C(typeof c=="string"?c:c?.carNum)))}:l),this.nvCoverPreview?.currentTarget&&r.toArray().some(l=>l.contains(this.nvCoverPreview.currentTarget))&&this.nvCoverPreview.hidePreview();let i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches?0:180;r.each((l,c)=>this.nvRemovingCards.add(c));try{await Promise.all(r.toArray().map(l=>new Promise(c=>{$(l).animate({opacity:0},i,c)})))}finally{r.each((l,c)=>this.nvRemovingCards.delete(c))}if(!this.isWorkspaceMounted()||t!==this.nvRenderGeneration||a!==$("#new-video-list-container")[0]||this.nvWorkspaceFullReloadRequested)return;let n=s.add(s.parentsUntil(this.nvWorkspaceRoot||".newVideoToolBox")).add(this.nvWorkspaceRoot||s.closest(".newVideoToolBox")).map((l,c)=>({element:c,top:c.scrollTop,left:c.scrollLeft})).get();await this.renderNewVideoList({incremental:!0}),this.isWorkspaceMounted()&&t===this.nvRenderGeneration&&a===$("#new-video-list-container")[0]&&n.forEach(({element:l,top:c,left:h})=>{l.scrollTop=c,l.scrollLeft=h})}getPendingNewVideoCount(e,t){return Array.isArray(e?.newVideoList)?new Set(e.newVideoList.map((s=>C(typeof s=="string"?s:s.carNum))).filter((s=>s&&!t.has(s)&&!this.isDecisionHidden(s)))).size:0}isDecisionHidden(e){let t=this.nvDecisionsCache[C(e)];return t?["ignored","dismissed"].includes(t.action)||t.action==="snoozed"&&(!t.until||Date.parse(t.until)>Date.now()):!1}async getPendingNewVideoTotal(){let e=await storageManager.getCarMap(),t=new Set;return this.nvDecisionsCache=await this.getRuntimeService("state").getNewVideoDecisions(),(await storageManager.getFavoriteActressList()).forEach((s=>Array.isArray(s.newVideoList)&&s.newVideoList.forEach((a=>{let r=C(typeof a=="string"?a:a.carNum);r&&!oe(H(e.get(r)?.stateFlags))&&!this.isDecisionHidden(r)&&t.add(r)})))),t.size}async showNewVideoCount(){let e=await this.getPendingNewVideoTotal();$("#newVideoCount").text(`${e}`)}async resetBtnTip(){let e=this.getRuntimeService("storage"),t=this.getOptionalDependency("TaskPlugin"),s=await storageManager.getSetting(),a=t?e.getLocal(t.lastCheckFavoriteActressTimeKey)||"无":"任务已禁用",r=s.checkFavoriteActress_IntervalTime,i=t?e.getLocal(t.lastCheckNewVideoTimeKey)||"无":"任务已禁用",n=s.checkNewVideo_intervalTime;$("#checkFavoriteActress").attr("data-tip",`上次完整同步: ${a}; 检测间隔时间: ${r}小时`),$("#checkNewVideo").attr("data-tip",`上次整批检测: ${i}; 检测间隔时间: ${n}小时`)}async openDialog(){let e=this.getRuntimeService("storage");this.cleanupNewVideoWorkspace(),this._viewMode=e.getLocal("jhs_newVideoViewMode")==="list"?"list":"actress",this.currentPage=1,this.nvCurrentPage=1,this.nvSelected=new Set,this.nvCoverCache=new Map,this.nvActorCoverRequests=new Map,this.nvRenderGeneration++;let t=this.getOptionalDependency("TaskPlugin"),s=await storageManager.getSetting(),a=t?e.getLocal(t.lastCheckFavoriteActressTimeKey)||"无":"任务已禁用",r=s.checkFavoriteActress_IntervalTime,i=t?e.getLocal(t.lastCheckNewVideoTimeKey)||"无":"任务已禁用",n=s.checkNewVideo_intervalTime,l=`
      `;this.getRuntimeService("dialog").open({type:1,title:'新作品检测',content:l,scrollbar:!1,ui:{size:"workspace",body:"scroll"},area:utils.getDialogArea("workspace"),anim:-1,success:d(async(c,h)=>{this.nvWorkspaceMounted=!0,this.nvWorkspaceRoot=c,K.enhance(c),this.bindClick(),this.applyViewMode(),this.renderTaskStatuses(),await this.reloadNewVideoWorkspaceData(),utils.setupEscClose(h)},"success"),end:d(()=>this.cleanupNewVideoWorkspace(),"end")})}cleanupNewVideoWorkspace(){clearTimeout(this.nvInvalidationTimer),this.nvInvalidationTimer=null,this.nvWorkspaceReloadDirty=!1,this.nvWorkspaceFullReloadRequested=!1,this.nvPendingRemovals.clear(),this.nvSearchDebounced?.cancel?.(),this.nvSearchDebounced=null,this.nvWorkspaceMounted=!1,this.nvWorkspaceRoot=null,this.nvRenderGeneration++,this.nvSelected.clear(),this.nvCoverCache=new Map,this.nvActorCoverRequests=new Map,this.nvCoverPreview?.destroy?.(),this.nvCoverPreview=null,this.nvAllItemsMap.clear(),this.nvFlatListCache=[],this.nvActressesCache=[],this.nvCarMapCache=new Map,this.nvDecisionsCache={},this.nvCurrentPageItems=[],$(Array.from(this.nvRemovingCards)).stop(!0,!0),this.nvRemovingCards.clear()}bindClick(){let e=this.getOptionalDependency("TaskPlugin");e||$("#checkFavoriteActress,#checkNewVideo").prop("disabled",!0).attr("title","后台任务功能已禁用"),$("#reLoad").on("click",(()=>{this.reloadNewVideoWorkspaceData(),$("#checkNewVideoMsg").text("")})),$("#new-video-list-container").on("click",".nv-card__link",(async t=>{let s=$(t.currentTarget).closest(".nv-card").attr("data-car");if(s)try{if(await storageManager.getSetting("autoRemoveNewVideoMarkAfterBrowse",ne)!==E)return;await this.getRuntimeService("state").removeFromNewVideoList([s],"browse")}catch(a){clog.error("移除新作品标记失败:",a)}})),$("#toSetting").on("click",(t=>{this.getOptionalDependency("SettingPlugin")?.openSettingDialog?.("task-panel",(()=>{$("#setting-checkFavoriteActress").css({border:"1px solid var(--jhs-status-filter)"}),$("#setting-checkNewVideo").css({border:"1px solid var(--jhs-status-filter)"})}))})),$("#checkFavoriteActress").on("click",(t=>{this.runManualTask($(t.currentTarget),"同步中…",(async()=>{if(!$('a[href*="/users/profile"]').length)return void show.error("未登录 JavDB,同步失败");await e?.checkFavoriteActress?.(!0)}))})),$("#checkNewVideo").on("click",(t=>{this.runManualTask($(t.currentTarget),"检测中…",(()=>e?.checkNewVideo?.(!0)))})),$("#paramActressType").on("change",(t=>{this.currentPage=1,this.nvRenderGeneration++,this._viewMode==="actress"&&this.renderActressCards()})),$("#paramSortBy").on("change",(t=>{this.currentPage=1,this.nvRenderGeneration++,this._viewMode==="actress"&&this.renderActressCards()})),$("#nvSortBy").on("change",(t=>{this.nvSortBy=$("#nvSortBy").val(),this.nvCurrentPage=1,this.nvRenderGeneration++,this.renderNewVideoList()})),$("#nvCategoryFilter,#nvStateFilter,#nvDecisionFilter").on("change",(t=>{this.nvCurrentPage=1,this.nvRenderGeneration++,this._viewMode==="list"&&this.renderNewVideoList()})),this.nvSearchDebounced=utils.debounce((()=>{this.nvCurrentPage=1,this.nvRenderGeneration++,this._viewMode==="list"&&this.renderNewVideoList()}),200),$("#nvSearch").on("input",this.nvSearchDebounced),$(".jhs-new-video-view").on("click",'[role="tab"]',(t=>{this.setViewMode($(t.currentTarget).data("view"))})).on("keydown",'[role="tab"]',(t=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;t.preventDefault();let s=$(t.delegateTarget).find('[role="tab"]'),a=s.index(t.currentTarget),r=t.key==="Home"?0:t.key==="End"?s.length-1:t.key==="ArrowRight"?(a+1)%s.length:(a-1+s.length)%s.length;s.eq(r).trigger("click").trigger("focus")})),this.bindBatchActions()}async runManualTask(e,t,s){if(e.attr("aria-busy")==="true")return;let a=this.getOptionalDependency("TaskPlugin");if(!a)return void show.info("后台任务功能已禁用");let r=e.find("span").last(),i=r.text();e.attr("aria-busy","true").prop("disabled",!0),r.text(t);try{await navigator.locks.request(a.singleTaskKey,{ifAvailable:!0},(async n=>{if(!n)return void show.error("后台任务正在运行,请稍后再试");await s()}))}catch(n){clog.error("手动任务执行失败",n),a.isNetworkBlocked(n)&&show.error(n.message||"任务执行失败")}finally{e.removeAttr("aria-busy").prop("disabled",!1),r.text(i),this.renderTaskStatuses()}}setViewMode(e){!["actress","list"].includes(e)||e===this._viewMode||(this._viewMode=e,this.getRuntimeService("storage").setLocal("jhs_newVideoViewMode",e),e==="list"?this.nvCurrentPage=1:this.currentPage=1,this.nvRenderGeneration++,this.applyViewMode(),this.renderCurrentView())}applyViewMode(){let e=this._viewMode==="list";$("#nv-pagination-bar").toggle(e),$("#actress-card-container").toggle(!e),$("#actress-pagination").toggle(!e),$("#new-video-list-container").toggle(e),$("#new-video-list-footer").toggle(e),K.setVisible("#paramSortBy",!e),K.setVisible("#nvSortBy",e),K.setVisible("#paramActressType",!e),K.setVisible("#nvCategoryFilter",e),K.setVisible("#nvStateFilter",e),K.setVisible("#nvDecisionFilter",e),$("#nvSearch").toggleClass("jhs-is-hidden",!e),$(".jhs-new-video-view [role='tab']").each(((t,s)=>{let a=$(s).data("view")===this._viewMode;$(s).attr({"aria-selected":String(a),tabindex:a?"0":"-1"}).toggleClass("active",a)}))}renderCurrentView(){return this._viewMode==="list"?this.renderNewVideoList():this.renderActressCards()}loadData(){return this.currentPage=1,this.reloadNewVideoWorkspaceData()}async reloadNewVideoWorkspaceData({preservePage:e=!1}={}){if(!this.isWorkspaceMounted())return;let t=++this.nvRenderGeneration,s=this._viewMode==="list"?$("#new-video-list-container"):$("#actress-card-container");$("#nv-pagination-bar").remove(),Fe(s,{type:"loading",title:"加载中"});try{let a=await storageManager.getSetting(),[r,i,n,l]=await Promise.all([storageManager.getFavoriteActressList(),storageManager.getCarMap(),this.getRuntimeService("state").getNewVideoDecisions(),storageManager.getSetting("checkNewVideo_ruleTime",8760)]),c=this.getRuntimeService("movie").externalSiteOrigin("javDbBtn",a);if(!this.isWorkspaceMounted()||t!==this.nvRenderGeneration)return;this.nvActressesCache=r,this.nvCarMapCache=i,this.nvDecisionsCache=n,this.nvJavDbUrl=c,this.nvRuleTime=ae(l,8760,{min:0});let h=Yh(r,i,n),u=new Map;h.forEach((p=>u.set(C(p.carNum),{...p,carNum:C(p.carNum)}))),this.nvAllItemsMap=u,this.pruneNewVideoSelection(),e||(this.currentPage=1,this.nvCurrentPage=1),await this.renderCurrentView(),this.renderTaskStatuses()}catch(a){if(t!==this.nvRenderGeneration||!this.isWorkspaceMounted())return;clog.error("加载新作品工作区失败",a),Fe(s,{type:"error",title:"加载失败",description:a.message||String(a),actionLabel:"重试",onAction:d(()=>this.reloadNewVideoWorkspaceData({preservePage:!0}),"onAction")})}}renderTaskStatuses(){let e=$("#jhs-task-status-list");if(!e.length)return;let t=this.getOptionalDependency("TaskPlugin"),s={favoriteActress:"演员同步",newVideo:"新作品",blacklist:"黑名单"},a={idle:"正常",running:"运行中",pending:"等待下一次任务检查",due:"待运行"},r=d(i=>i?new Date(i).toLocaleString():"无","format");if(!t)return void e.empty().text("后台任务功能已禁用");e.empty(),["favoriteActress","newVideo","blacklist"].forEach((i=>{let n=t.getTaskStatusSnapshot(i),l=$('
      ');l.append($('').text(`${s[i]}:${a[n.state]}`)),l.append($('').text(`上次完成 ${r(n.completedAt)};下次检查 ${n.nextAt?r(n.nextAt):"立即"}`)),e.append(l)}))}async renderActressCards(){let e=$("#actress-card-container");if(!e.length)return;let t=[...this.nvActressesCache],s=$("#paramActressType").val();s!=="all"&&(t=t.filter((j=>j.actressType===s)));let a=this.nvCarMapCache,r=d(j=>this.getPendingNewVideoCount(j,a),"_newVideoCount"),i=$("#paramSortBy").val(),n={lastPublishTime_desc:[{key:"lastPublishTime",order:"desc"}],lastPublishTime_asc:[{key:"lastPublishTime",order:"asc"}],lastCheckTime_desc:[{key:"lastCheckTime",order:"desc"}],lastCheckTime_asc:[{key:"lastCheckTime",order:"asc"}],newVideoCount_desc:[{key:r,order:"desc"}],newVideoCount_asc:[{key:r,order:"asc"}]},l=[{key:r,order:"desc"},{key:"lastPublishTime",order:"desc"}],c=utils.genericSort(t,n[i]||l),h=c.length,u=Math.ceil(h/this.pageSize),p=(this.currentPage-1)*this.pageSize,g=p+this.pageSize;u>0&&this.currentPage>u&&(this.currentPage=u);let m=(this.currentPage-1)*this.pageSize,f=c.slice(m,m+this.pageSize),v=this.nvJavDbUrl,b=this.getOptionalDependency("TaskPlugin"),w=this.nvRuleTime;if(f.length===0)return Fe(e,{type:"empty",title:this.nvActressesCache.length?"没有符合当前筛选条件的演员":"暂无收藏演员"}),void this.renderPagination(h,u);let S=f.map((j=>{let k=Array.isArray(j.allName)?j.allName.join(","):"",x=String(j.name||""),_=String(j.remark||""),I=String(j.starId||""),L=this.getPendingNewVideoCount(j,a),N=j.lastPublishTime||"",A=Xe(`/actors/${encodeURIComponent(I)}?t=d`,v),O=Xe(j.avatar,v)||this.getRuntimeService("actressInfo").placeholderUrl("javdb"),U=ft(N,w),q="未知",Q="is-unknown";j.actressType===Ye?(q="无码",Q="is-uncensored"):j.actressType===Qe&&(q="有码",Q="is-censored");let se=String(N||"暂无记录"),ge=U?`停更 ${w/24/365} 年以上,下轮任务不再检测`:_||"暂无备注",Le=$('
      ').toggleClass("is-paused",U).attr("data-starId",I),dt=$('
      ');dt.append($('').attr("data-tip",`最新作品数量: ${L}`).text(`${L} 新`),$('').addClass(Q).text(q)),U&&dt.append('停更');let Me=$('').attr("href",A||"#"),z=$("").append($('').text(x),$('').attr("title",k).text(k||"暂无别名"));Me.append($('').attr({src:O,alt:k}),z);let Z=$('
      ').append($('
      最近作品
      ').append($("
      ").attr("title",se).text(se)),$('
      上次检测
      ').append($("
      ").text(String(j.lastCheckTime||"暂无记录")))),re=$('
      '),Ct=$('').attr("data-starId",I).prepend(this.checkSvg),vs=$('').attr({"aria-label":`取消收藏 ${x}`,"data-starId":I}).append(this.deleteSvg),ye=$('').attr("data-starId",I).prepend(this.editSvg);return re.append(Ct,vs,$('
      •••
      ').find(".actress-card__menu-popover").append(ye).end()),Le.append(dt,Me,Z,$('

      ').attr("title",ge).text(ge),re)[0]}));e.empty().append(S),$(".btn-delete-actress").off("click").on("click",(j=>{j.preventDefault();let k=$(j.currentTarget).attr("data-starId"),x=c.find((_=>_.starId===k));utils.q(j,`是否取消收藏 ${T(x.name)}?`,(async()=>{let _=this.getRuntimeService("movie").externalSiteOrigin("javDbBtn",await storageManager.getSetting()),I=document.querySelector("meta[name=csrf-token]").content,L=await this.getRuntimeService("actressInfo").uncollect("javdb",{actorId:k,baseUrl:_,csrfToken:I},{scope:await this.getRuntimeService("scope")()});L.success?(await storageManager.removeFavoriteActress(k),await V.emit("new-video-changed",{reason:"favorite-actress-removed"})):(show.error("移除失败"),clog.error("移除失败,返回值:",L))}))})),$(".btn-edit-actress").off("click").on("click",(j=>{j.preventDefault();let k=$(j.currentTarget).attr("data-starId"),x=c.find((_=>_.starId===k));x?this.editActress(x):show.error(`未找到 starId 为 ${k} 的女优记录。`)})),$(".btn-check-actress").off("click").on("click",(j=>{j.preventDefault();let k=$(j.currentTarget),x=k.attr("data-starId"),_=c.find((I=>I.starId===x));this.runManualTask(k,"检测中…",(()=>b?.checkOneNewVideo?.(_)))})),$(".actress-card__menu").on("keydown",(j=>{if(j.key!=="Escape")return;j.preventDefault(),$(j.currentTarget).prop("open",!1).find("summary").trigger("focus")})).on("click","[role='menuitem']",(j=>{$(j.currentTarget).closest("details").prop("open",!1)})),this.renderPagination(h,u)}async getNewVideoFlatList(){let e=$("#nvCategoryFilter").val()||"all",t=$("#nvStateFilter").val()||"pending",s=$("#nvDecisionFilter").val()||"pending",a=String($("#nvSearch").val()||"").trim().toUpperCase();return[...this.nvAllItemsMap.values()].filter((r=>{let i=e==="all"||e==="vr"?e==="all"||r.isVr:e==="unknown"?r.categories.length===0:r.categories.includes(e),n=t==="all"||t==="pending"?t==="all"||!oe(r.flags):!!r.flags[t],l=s==="all"||r.decisionState===s,c=!a||`${r.carNum} ${r.title} ${r.actressName}`.toUpperCase().includes(a);return i&&n&&l&&c})).sort(((r,i)=>(i.publishTime||"").localeCompare(r.publishTime||"")))}getActorCoverRequest(e,t){let s=t.get(e);if(s)return s;let a=this.getRuntimeService("scope")().then((r=>this.getRuntimeService("actressInfo").movies("javdb",{actorId:e,baseUrl:this.nvJavDbUrl},{scope:r}))).then((r=>{let i=new Map;return r.forEach((n=>n.carNum&&n.coverUrl&&i.set(C(n.carNum),{coverUrl:n.coverUrl,title:n.title}))),i})).finally((()=>{t.get(e)===a&&t.delete(e)}));return t.set(e,a),a}async loadCoverForItems(e,t=this.nvRenderGeneration){return this.hydrateVisibleCovers(e,t)}async hydrateVisibleCovers(e,t){let s=this.nvCoverCache,a=this.nvActorCoverRequests,r=[...new Set(e.filter((i=>!i.coverUrl&&!s.has(C(i.carNum))&&i.starId)).map((i=>i.starId)))];await Ae(r,3,(async i=>{try{let n=await this.getActorCoverRequest(i,a);if(t!==this.nvRenderGeneration||s!==this.nvCoverCache||!this.isWorkspaceMounted())return;n.forEach(((l,c)=>{s.set(C(c),l.coverUrl);let h=$(".nv-card").filter(((p,g)=>C($(g).attr("data-car"))===C(c)));if(!h.length)return;let u=$('').attr({src:l.coverUrl,"data-full":l.coverUrl}).on("error",(function(){$(this).addClass("jhs-is-hidden").siblings(".nv-card__empty").removeClass("jhs-is-hidden")}));h.find(".nv-placeholder").replaceWith(u),h.find(".nv-card__empty").addClass("jhs-is-hidden"),l.title&&h.attr("title",l.title)}))}catch(n){clog.warn(`获取演员封面失败: ${i}`,n)}}))}pruneNewVideoSelection(){for(let e of[...this.nvSelected])this.nvAllItemsMap.has(e)||this.nvSelected.delete(e)}async renderNewVideoList({incremental:e=!1}={}){let t=$("#new-video-list-container"),s=this.nvRenderGeneration;if(!t.length)return;let a=await this.getNewVideoFlatList();if(s!==this.nvRenderGeneration||!this.isWorkspaceMounted())return;this.pruneNewVideoSelection(),e||$("#nv-pagination-bar").remove(),this.nvFlatListCache=a,this.nvSortBy=$("#nvSortBy").val()||this.nvSortBy;let r=Math.ceil(a.length/this.nvPageSize);if(this.nvCurrentPage=r?Math.min(this.nvCurrentPage,r):1,!a.length){this.nvCurrentPageItems=[],$("#nv-pagination-bar").remove();let i=String($("#nvSearch").val()||"").trim(),n=["nvCategoryFilter","nvStateFilter","nvDecisionFilter"].some((l=>$("#"+l).val()!==(l==="nvCategoryFilter"?"all":"pending")));return this.nvAllItemsMap.size?i?Fe(t,{type:"empty",title:`没有找到“${i}”的作品`,actionLabel:"清除搜索",onAction:d(()=>{$("#nvSearch").val(""),this.nvCurrentPage=1,this.nvRenderGeneration++,this.renderNewVideoList()},"onAction")}):n?Fe(t,{type:"empty",title:"没有符合当前筛选条件的作品",actionLabel:"清除筛选",onAction:d(()=>{K.setValue("#nvCategoryFilter","all",!1),K.setValue("#nvStateFilter","pending",!1),K.setValue("#nvDecisionFilter","pending",!1),this.nvCurrentPage=1,this.nvRenderGeneration++,this.renderNewVideoList()},"onAction")}):Fe(t,{type:"empty",title:"暂无待处理的新作品"}):Fe(t,{type:"empty",title:"暂无新作品记录"}),void this.renderBatchBar()}this.nvRenderPage(s,{incremental:e}),this.renderBatchBar()}selectedItems(){return[...this.nvSelected].map((e=>this.nvAllItemsMap.get(C(e)))).filter(Boolean)}applyProcessedSelection(e){(e?.changed||[]).map(C).filter(Boolean).forEach((t=>this.nvSelected.delete(t))),this.renderBatchBar()}async runBatchMutation(e,t){let s=this.selectedItems();if(!s.length)return void show.info("请先选择作品");try{let a=await e(s);this.applyProcessedSelection(a),a?.changed?.length?show.ok(`${t} ${a.changed.length} 个番号`):show.info("没有需要更新的项目")}catch(a){clog.error("批量操作失败",a),show.error(`批量操作失败: ${a.message||a}`)}}bindBatchActions(){$("#new-video-list-footer").off(".jhsNvBatch").on("click.jhsNvBatch","#nvSelectPage",(()=>{(this.nvCurrentPageItems||[]).forEach((t=>this.nvSelected.add(C(t.carNum)))),$("#new-video-list-container .nv-select").prop("checked",!0),this.renderBatchBar()})).on("click.jhsNvBatch","#nvClearSelection",(()=>{this.nvSelected.clear(),$("#new-video-list-container .nv-select").prop("checked",!1),this.renderBatchBar()})).on("click.jhsNvBatch","#batchMarkFavorite,#batchMarkWatched,#batchMarkDownloaded",(t=>{let s={batchMarkFavorite:"favorite",batchMarkWatched:"watched",batchMarkDownloaded:"downloaded"}[t.currentTarget.id];this.runBatchMutation((a=>this.getRuntimeService("state").patch(a.map((r=>r.carNum)),{[s]:!0},{type:"new-video-batch-state",records:a.map((r=>({carNum:r.carNum,url:r.url||`/search?q=${encodeURIComponent(r.carNum)}`,names:r.actressName,publishTime:r.publishTime})))})),"已处理")})).on("click.jhsNvBatch","#batchIgnore",(()=>{this.runBatchMutation((t=>this.getRuntimeService("state").setNewVideoDecision(t.map((s=>s.carNum)),"ignored")),"已忽略")})).on("click.jhsNvBatch","#batchSnooze",(()=>{this.runBatchMutation((t=>this.getRuntimeService("state").setNewVideoDecision(t.map((s=>s.carNum)),"snoozed",new Date(Date.now()+7*864e5).toISOString())),"已暂缓")})).on("click.jhsNvBatch","#batchRestore",(()=>{this.runBatchMutation((t=>this.getRuntimeService("state").setNewVideoDecision(t.map((s=>s.carNum)),null)),"已恢复")})).on("click.jhsNvBatch","#batchRemoveFromNewVideo",(t=>{let s=this.selectedItems();s.length&&utils.q(t,`确认将 ${s.length} 个作品从新作列表移除?
      不会删除作品状态记录。`,(()=>{this.runBatchMutation((a=>this.getRuntimeService("state").removeFromNewVideoList(a.map((r=>r.carNum)),"manual")),"已移除")}))}))}renderBatchBar(){let e=$("#new-video-list-footer");if(!e.length)return;let t=new Set(this.nvFlatListCache.flatMap((r=>r.actresses||[r.actressName])).filter(Boolean)),s=this.nvSelected.size,a=this.nvFlatListCache.filter((r=>this.nvSelected.has(C(r.carNum)))).length;if(!s)return void e.html(`
      共 ${this.nvFlatListCache.length} 个番号,涉及 ${t.size} 位演员
      `);e.html(`
      已选择 ${s} 项${a!==s?`,当前结果中 ${a} 项`:""}
      更多 ▾
      `)}nvSortList(e){let t=this.nvSortBy||"publishTime_desc",[s,a]=t.split("_");return e.slice().sort(((r,i)=>{let n=0;switch(s){case"publishTime":n=(r.publishTime||"").localeCompare(i.publishTime||"");break;case"actress":n=(r.actressName||"").localeCompare(i.actressName||"");break;case"carNum":n=(r.carNum||"").localeCompare(i.carNum||"");break;case"voteCount":n=(r.voteCount||0)-(i.voteCount||0);break}return a==="desc"?-n:n}))}nvCardHtml(e){let t=this.nvJavDbUrl,s="",a=C(e.carNum),r=T(a),i=T(e.title||a),n=this.nvCoverCache.get(a),l=T((n||e.coverUrl||"").replace("thumbs","covers")),c=T(e.url||`${t}/search?q=${encodeURIComponent(a)}`),h=`番号: ${r}\\n演员: ${T(e.actressName)}\\n发行: ${T(String(e.publishTime||"未知"))}`;e.voteCount&&(h+=`\\n评价人数: ${e.voteCount}`);let u=e.voteCount?`${e.voteCount}人评价`:"";return s+=`",s}nvRenderPage(e=this.nvRenderGeneration,{incremental:t=!1}={}){if(e!==this.nvRenderGeneration)return;this.pruneNewVideoSelection();let s=this.nvFlatListCache;if(!s||s.length===0)return void this.renderNewVideoList();let a=this.nvSortList(s),r=this.nvPageSize,i=Math.ceil(a.length/r);this.nvCurrentPage=Math.max(1,Math.min(this.nvCurrentPage,i));let n=(this.nvCurrentPage-1)*r,l=n+r,c=a.slice(n,l);this.nvCurrentPageItems=c,$("#nv-pagination-bar").remove();let h=$("#new-video-list-container"),u=h.find("#nv-grid");t=t&&u.length>0;let p=t?new Map(u.children(".nv-card").toArray().map(b=>[C($(b).attr("data-car")),b])):new Map,g=$(document.activeElement).closest(".nv-card")[0],m=u.children(".nv-card").index(g),f="";f+='
      ';for(let b of c)(!t||!p.has(C(b.carNum)))&&(f+=this.nvCardHtml(b));if(f+="
      ",i>1){f+='
      ',this.nvCurrentPage>1&&(f+=``);let b=Math.max(1,this.nvCurrentPage-2),w=Math.min(i,b+4);w-b<4&&(b=Math.max(1,w-4));for(let S=b;S<=w;S++)f+=``;this.nvCurrentPage下一页`),f+=`第 ${this.nvCurrentPage}/${i} 页,共 ${a.length} 条`,f+="
      "}let v;if(t){let b=$(f),w=b.filter("#nv-grid").children(".nv-card"),S=new Set(c.map(x=>C(x.carNum))),j=new Map(w.toArray().map(x=>[C($(x).attr("data-car")),x]));u.children(".nv-card").filter((x,_)=>!S.has(C($(_).attr("data-car")))).remove();let k=u[0].firstElementChild;for(let x of c){let _=C(x.carNum),I=p.get(_)||j.get(_);I===k?k=k.nextElementSibling:u[0].insertBefore(I,k),$(I).find(".nv-select").prop("checked",this.nvSelected.has(_))}h.append(b.filter("#nv-pagination-bar")),v=w,m>=0&&!S.has(C($(g).attr("data-car")))&&u.children(".nv-card").eq(Math.min(m,c.length-1)).find(".nv-card__link")[0]?.focus({preventScroll:!0})}else h.html(f),v=h.find(".nv-card");v.find(".nv-cover-img").on("error",(function(){$(this).addClass("jhs-is-hidden").siblings(".nv-card__empty").removeClass("jhs-is-hidden")})),v.find(".nv-select").on("change",(b=>{let w=C(b.currentTarget.value);b.currentTarget.checked?this.nvSelected.add(w):this.nvSelected.delete(w),this.renderBatchBar()})),h.find(".pagination-btn").off("click").on("click",(b=>{let w=parseInt($(b.currentTarget).data("nvpage"));w>=1&&w<=i&&w!==this.nvCurrentPage&&(this.nvCurrentPage=w,this.nvRenderGeneration++,this.nvRenderPage(this.nvRenderGeneration),this.renderBatchBar(),h.scrollTop(0))})),h.find("#nv-pagination-bar").insertAfter(h),this.nvCoverPreview??(this.nvCoverPreview=new window.ImageHoverPreview({selector:".nv-cover-img",dataAttribute:"data-full",owner:this.nvWorkspaceRoot,resolveOwner:d(()=>this.nvWorkspaceRoot,"resolveOwner"),zIndexStrategy:"owner"})),this.hydrateVisibleCovers(c,e)}async editActress(e){let t=this.getRuntimeService("dialog"),s=null,a=String(e.name||""),r=Xe(e.avatar,this.nvJavDbUrl)||"",i=String(e.remark||""),n=Array.isArray(e.allName)?e.allName.join(","):"",l=Array.isArray(e.newVideoList)?e.newVideoList.map((g=>typeof g=="string"?g:g.carNum)).join(","):"",c=String(e.starId||""),h=e.actressType||"",u=d(g=>T(String(g||"")),"safe"),p=`
      Avatar Preview切换后将在下次搜索时使用所选来源。

      - `;t.open({type:1,title:"选择 CDN 源",area:utils.getResponsiveArea(["400px","auto"]),content:j,btn:["确定","取消"],success:d((k,x)=>{utils.setupEscClose(x)},"success"),yes:d(async k=>{let x=$('input[name="cdn-source"]:checked').val(),_=parseInt(x,10);_!==this.avatarSourceIndex&&this.avatarSources[_]&&(this.avatarSourceIndex=_,this.getRuntimeService("storage").setLocal(Rc,_.toString()),show.ok(`CDN 源已切换为: ${this.avatarSources[_].name}`)),t.close(k)},"yes")})})()})),utils.setupEscClose(m)},"success"),yes:d(async g=>{let m=s||$(document),f=m.find("#edit-actress-avatar").val().trim(),v=m.find("#edit-actress-name").val().trim(),b=m.find("#edit-actress-allname").val().trim(),w=m.find("#edit-actress-newvideolist").val().trim(),S=m.find("#edit-remark").val().trim(),j=m.find("#actressType").val();if(!v)return show.error("主名称不能为空"),!1;let k=b.split(/[\uff0c,]/).map((_=>_.trim())).filter((_=>_.length>0)),x=w.split(/[\uff0c,]/).map((_=>_.trim())).filter((_=>_.length>0));e.avatar=f,e.name=v,e.allName=k,e.newVideoList=x,e.actressType=j,e.remark=S;try{await storageManager.updateFavoriteActress(e),await V.emit("new-video-changed",{reason:"favorite-actress-edited"}),show.ok(`女优 ${v} 信息已更新`),t.close(g)}catch(_){show.error("修改失败: "+(_.message||_))}},"yes")})}renderPagination(e,t){let s=this.currentPage,a="",r=$("#actress-pagination");if(t===0)return a='共 0 条记录',void r.html(a);s>1&&t>5&&(a+=''),s>1&&(a+=``);let i=Math.max(1,s-Math.floor(2.5)),n=Math.min(t,i+5-1);n-i<4&&(i=Math.max(1,n-5+1));for(let l=i;l<=n;l++)a+=``;s下一页`),s5&&(a+=``),a+=`共 ${e} 条记录 (第 ${s}/${t} 页)`,r.html(a),r.find(".pagination-btn").off("click").on("click",(l=>{if($(l.currentTarget).is("[disabled]"))return;let c=parseInt($(l.currentTarget).data("page"));c>=1&&c<=t&&c!==this.currentPage&&(this.currentPage=c,this.renderActressCards())}))}async searchAvatar(){let e=this.getRuntimeService("dialog"),t=this._editActressRoot||$(document),s=t.find("#edit-actress-name"),a=t.find("#edit-actress-allname"),r=s.val().trim(),i=a.val().trim().split(/[\uff0c,]/).map((p=>p.trim())).filter((p=>p.length>0));if(r&&i.unshift(r),i.length===0)return void show.error("请先填写女优主名称或别名进行搜索。");let n=loading("正在搜索头像..."),l=[];try{let p=this.avatarSources[this.avatarSourceIndex],g=await this.getRuntimeService("scope")();l=p?await this.getRuntimeService("actressInfo").searchAvatars(i,p.id,{scope:g}):[]}catch(p){return void show.error(`头像数据加载或搜索失败: ${p.message||p}`)}finally{n.close()}if(l.length===0)return void show.error(`未找到与 '${i.join("、")}' 相关的头像。请检查名称。`);let c=$('

      ');c.find("#gfriends-prompt").text(`点击图片即可选择(初始共 ${l.length} 张)`);let h=c.find("#gfriends-image-list");l.forEach(((p,g)=>{let m=$('').attr({"data-url":p,"aria-label":`选择第 ${g+1} 张头像`});m.append($('').attr("src",p)),m.append($('载入中')),h.append(m)}));let u=0;e.open({type:1,title:`选择女优头像 (${l.length} 张)`,area:utils.getResponsiveArea(["900px","85%"]),content:c[0],btn:["关闭"],success:d((p,g)=>{let m=$(p),f=m.find(".gfriends-selectable-img"),v=m.find("#gfriends-prompt"),b=m.find(".gfriends-image-item-wrapper");f.each((function(){let w=$(this),S=w.closest(".gfriends-image-item-wrapper"),j=S.find(".gfriends-size-tag");w.on("load",(function(){j.text(`${this.naturalWidth} x ${this.naturalHeight}`)})),w.on("error",(function(){S.remove(),u++;let k=l.length-u;v.text(`点击图片即可选择(已移除 ${u} 张错误图片,剩余 ${k} 张)`),k===0&&(show.error("所有搜索到的头像链接均已失效,无法选择。"),e.close(g))})),this.complete&&(this.naturalWidth>0?w.trigger("load"):w.trigger("error"))})),b.on("click",(function(){let w=$(this),S=w.attr("data-url");t.find("#edit-actress-avatar").val(S),t.find("#edit-avatar-preview").attr("src",S),b.attr("aria-pressed","false"),w.attr("aria-pressed","true"),setTimeout((()=>{e.close(g)}),150)})),utils.setupEscClose(g)},"success")})}};d(nn,"NewVideoPlugin");var ja=nn;var on=class on{constructor(){this.queue=Promise.resolve()}addTask(e){let t=this.queue.then((()=>e()));return this.queue=t.catch((s=>{clog.error("执行异步队列任务失败:",s)})),t}async waitAllFinished(){return this.queue}};d(on,"StorageQueue");var Sa=on;var ln=class ln extends I{constructor(){super(...arguments),this.singleTaskKey="checkNewActressActorFilterCar",this.taskConfig=null,this.storageQueue=new Sa,this.lastCheckFavoriteActressTimeKey="jhs_time_checkFavoriteActress",this.lastCheckBlacklistTimeKey="jhs_time_checkBlacklist",this.lastCheckNewVideoTimeKey="jhs_time_checkNewVideo",this.lastCheckFavoriteActressAttemptKey="jhs_time_checkFavoriteActress_attempt",this.lastCheckFavoriteActressNextKey="jhs_time_checkFavoriteActress_next",this.lastCheckBlacklistAttemptKey="jhs_time_checkBlacklist_attempt",this.lastCheckBlacklistNextKey="jhs_time_checkBlacklist_next",this.lastCheckNewVideoAttemptKey="jhs_time_checkNewVideo_attempt",this.lastCheckNewVideoNextKey="jhs_time_checkNewVideo_next",this.taskTimer=null,this.taskRunning=!1,this.visibilityHandler=null,this.pageHideHandler=null,this.lifecycleScope=null,this.settingsHandler=null,this.taskConfigDirty=!1,this.configLoadPromise=null,this.configLoadQueued=!1,this.configRefreshPromise=null,this.configRefreshQueued=!1,this.activeTasks=new Set}getName(){return"TaskPlugin"}getStartupMode(){return"idle"}async limitConcurrency(e,t,s,a){let r=0,i=!1,n=Math.max(1,Math.min(t,e.length)),l=Array.from({length:n},(async()=>{for(;!i;){let u=r++;if(u>=e.length)return;try{await a(e[u])}catch(g){throw this.isNetworkBlocked(g)&&(i=!0),g}let p=e.length-r;p>0&&(clog.htmlDebug(`剩余任务数: ${p}`),await utils.sleep(s))}})),c=await Promise.allSettled(l),h=c.find(u=>u.status==="rejected");if(h)throw h.reason}isNetworkBlocked(e){return["CF_BLOCKED","CIRCUIT_OPEN","ABORTED"].includes(e?.code)||e?._cfBlocked===!0||e?._circuitBroken===!0}async requestHostPage(e,t){let s=new URL(e),a=t===Be?"javdb.com":t===Se?"javbus.com":null,i=a&&(s.hostname===a||s.hostname.endsWith(`.${a}`))?{trustClass:"builtin-public",hosts:[a],expectedOrigin:s.origin}:{trustClass:"custom-public",expectedOrigin:s.origin};try{let n=await this.getRuntimeService("http").request({providerId:`host-task:${t}`,method:"GET",url:s.href,responseType:"text",cacheScope:"none",timeout:this.taskConfig?.httpTimeout,retryCount:Math.max(0,(this.taskConfig?.httpRetryCount??1)-1),circuitThreshold:this.taskConfig?.circuitBreakerThreshold,circuitCooldownMs:this.taskConfig?.circuitBreakerCooldown,urlPolicy:i},await this.getRuntimeService("scope")());if(typeof n.data!="string")throw new TypeError("宿主页面响应不是 HTML 文本");return n.data}catch(n){let l=n;throw l._taskNetwork=!0,l}}createTaskResult(e={}){return{attempted:!1,completed:!1,fatal:!1,success:0,networkFailed:0,parseFailed:0,aborted:0,skippedInterval:0,skippedStopped:0,...e}}async runBackgroundTask(e,t){try{return await t()}catch(s){if(this.isNetworkBlocked(s))throw s;return clog.error(`${e}执行失败,继续后续后台任务`,s),this.createTaskResult({attempted:!0,error:s})}}isUnnecessaryCheck(e,t){if(!t)throw new Error("未传入checkIntervalTime");return t=parseInt(String(t)),utils.getHourDifference(new Date(e),new Date)a)}}getTaskStatusSnapshot(e){let t=this.getTaskScheduleState(e),s=Te(this.getRuntimeService("storage").getLocal(t.nextKey)),a=s??(t.pending&&t.attempt!=null?t.attempt+3e5:0),r=Date.now(),i="idle";return this.activeTasks.has(e)?i="running":t.pending&&r=a)&&(i="due"),{name:e,state:i,completedAt:t.completed,attemptAt:t.attempt,nextAt:a,isPending:t.pending,pendingUntil:t.pending?a:null}}async emitTaskStatus(e,t){try{await globalThis.jhsEventBus?.emit?.("task-status-changed",{taskName:e,phase:t},{broadcast:!1})}catch(s){clog.error(`任务状态通知失败: ${e}/${t}`,s)}}async emitNewVideoChanged(e,t=[]){try{await globalThis.jhsEventBus?.emit?.("new-video-changed",{reason:e,carNums:t.map(C).filter(Boolean)})}catch(s){clog.error("新作品状态通知失败",s)}}async withActiveTask(e,t){this.activeTasks.add(e);try{return await this.emitTaskStatus(e,"started"),await t()}finally{this.activeTasks.delete(e),await this.emitTaskStatus(e,"finished")}}async getLatestTaskInterval(e){let t=this.getTaskSchedule(e);return storageManager._invalidateCache?.(storageManager.setting_key),ae(await storageManager.getSetting(t.intervalSetting,t.defaultInterval),t.defaultInterval,{min:Number.EPSILON})}async shouldStartTask(e,t=!1){if(t)return!0;let s=this.getRuntimeService("storage"),a=this.getTaskSchedule(e),r=await this.getLatestTaskInterval(e),i=Te(s.getLocal(a.completedKey)),n=Te(s.getLocal(a.attemptKey)),l=Te(s.getLocal(a.nextKey));return l==null&&(l=n!=null&&(i==null||n>i)?n+3e5:i==null?0:i+36e5*r,s.setLocal(a.nextKey,String(l))),Date.now()>=l}beginTaskAttempt(e){let t=this.getRuntimeService("storage"),s=this.getTaskSchedule(e),a=Te(t.getLocal(s.completedKey)),r=Math.floor(Date.now()/1e3)*1e3,i=a==null?r:Math.max(r,a+1e3);return t.setLocal(s.attemptKey,String(i)),t.setLocal(s.nextKey,String(i+3e5)),i}async finalizeTask(e,t){let s=this.getRuntimeService("storage"),a=this.getTaskSchedule(e);if(!t)return s.setLocal(a.nextKey,String(Date.now()+3e5));let r=Te(s.getLocal(a.attemptKey))||0,i=Math.max(Math.floor(Date.now()/1e3)*1e3,r),n=await this.getLatestTaskInterval(e);s.setLocal(a.completedKey,utils.getNowStr("-",":",i)),s.setLocal(a.nextKey,String(i+36e5*n))}async recalculateSchedules(){await this.loadConfig();for(let[e,t]of[["blacklist",this.taskConfig.checkBlacklist_intervalTime],["favoriteActress",this.taskConfig.checkFavoriteActress_IntervalTime],["newVideo",this.taskConfig.checkNewVideo_intervalTime]]){let s=this.getTaskScheduleState(e);s.pending||this.getRuntimeService("storage").setLocal(s.nextKey,String(s.completed==null?Date.now():s.completed+36e5*t))}}async invalidateConfig(e=!1){if(this.taskConfigDirty=!0,!!e)return this.configRefreshPromise?(this.configRefreshQueued=!0,this.configRefreshPromise):(this.configRefreshPromise=(async()=>{do this.configRefreshQueued=!1,await this.recalculateSchedules();while(this.configRefreshQueued)})().finally((()=>{this.configRefreshPromise=null})),this.configRefreshPromise)}async handle(){if(window.isListPage)return this.lifecycleScope||(this.lifecycleScope=await this.getRuntimeService("scope")()),this.visibilityHandler||(this.visibilityHandler=()=>{document.hidden?this.clearSchedule():this.scheduleTask(0)},this.pageHideHandler=()=>this.clearSchedule(),this.lifecycleScope.listen(document,"visibilitychange",this.visibilityHandler),this.lifecycleScope.listen(window,"pagehide",this.pageHideHandler),this.lifecycleScope.addCleanup((()=>this.clearSchedule()))),this.settingsHandler||(this.settingsHandler=async()=>{try{storageManager._invalidateCache?.(storageManager.setting_key),await this.invalidateConfig(!0),this.scheduleTask(0)}catch(e){clog.error("任务设置刷新失败",e)}},this.lifecycleScope.addCleanup(globalThis.jhsEventBus?.on?.("settings-changed",this.settingsHandler)||(()=>{}))),document.hidden?void 0:this.runAndSchedule()}clearSchedule(){this.taskTimer&&(clearTimeout(this.taskTimer),this.taskTimer=null)}scheduleTask(e=3e5){if(!window.isListPage||document.hidden)return void this.clearSchedule();this.clearSchedule(),this.taskTimer=setTimeout((()=>{this.taskTimer=null,this.runAndSchedule()}),e)}async runAndSchedule(){if(!(this.taskRunning||!window.isListPage||document.hidden)){this.taskRunning=!0;try{await this.doTask()}finally{this.taskRunning=!1,this.scheduleTask()}}}async doTask(){if(window.isListPage)return await this.loadConfig(),this.javDbUrl=await this.getConfiguredSiteOrigin("javDbBtn"),navigator.locks.request(this.singleTaskKey,{ifAvailable:!0},(async e=>{e?window.isListPage&&(this.taskConfig.enableCheckBlacklist===E?await this.runBackgroundTask("黑名单整批检测",(()=>this.checkBlacklist())):clog.warn("自动检测屏蔽黑名单-禁用"),!B)&&(this.taskConfig.enableCheckFavoriteActress===E?$('a[href*="/users/profile"]').length>0?await this.runBackgroundTask("演员收藏同步",(()=>this.checkFavoriteActress())):clog.debug("未登录 JavDB,跳过自动同步演员"):clog.warn("自动同步已收藏的演员-禁用"),this.taskConfig.enableCheckNewVideo===E?await this.runBackgroundTask("新作品整批检测",(()=>this.checkNewVideo())):clog.warn("自动检测已收藏演员的最新作品-禁用")):clog.debug("争夺任务锁失败, 跳过执行")})).catch((e=>{this.isNetworkBlocked(e)?clog.warn(`后台检测已停止: ${e.message}`):clog.error("锁任务出现错误:",e)}))}async loadConfig(){return this.configLoadPromise?(this.configLoadQueued=!0,this.configLoadPromise):(this.configLoadPromise=(async()=>{do{this.configLoadQueued=!1;let e=await storageManager.getSetting(),t={checkConcurrencyCount:ae(e.checkConcurrencyCount,2,{min:2,max:5}),checkRequestSleep:ae(e.checkRequestSleep,100,{min:0,max:3e3}),enableCheckBlacklist:e.enableCheckBlacklist||E,checkBlacklist_intervalTime:ae(e.checkBlacklist_intervalTime,12,{min:Number.EPSILON}),checkBlacklist_ruleTime:ae(e.checkBlacklist_ruleTime,8760,{min:0}),enableCheckFavoriteActress:e.enableCheckFavoriteActress||E,checkFavoriteActress_IntervalTime:ae(e.checkFavoriteActress_IntervalTime,24,{min:Number.EPSILON}),enableCheckNewVideo:e.enableCheckNewVideo||E,checkNewVideo_intervalTime:ae(e.checkNewVideo_intervalTime,12,{min:Number.EPSILON}),checkNewVideo_ruleTime:ae(e.checkNewVideo_ruleTime,8760,{min:0}),httpTimeout:ae(e.httpTimeout,5e3,{min:1e3,max:12e4}),httpRetryCount:ae(e.httpRetryCount,3,{min:0,max:5}),circuitBreakerThreshold:ae(e.circuitBreakerThreshold,3,{min:1,max:20}),circuitBreakerCooldown:ae(e.circuitBreakerCooldown,6e4,{min:1e3,max:36e5})};this.taskConfig=t,this.taskConfigDirty=!1}while(this.configLoadQueued||this.taskConfigDirty);return this.taskConfig})().finally((()=>{this.configLoadPromise=null})),this.configLoadPromise)}async ensureReady(){if((!this.taskConfig||this.taskConfigDirty)&&await this.loadConfig(),this.javDbUrl||(this.javDbUrl=await this.getConfiguredSiteOrigin("javDbBtn")),!this.javDbUrl)throw new Error("JavDB 地址未配置")}async getConfiguredSiteOrigin(e){return this.getRuntimeService("movie").externalSiteOrigin(e,await storageManager.getSetting())}async resolveBlacklistSite(e){try{let t=new URL(e),[s,a]=await Promise.all([this.getConfiguredSiteOrigin("javDbBtn"),this.getConfiguredSiteOrigin("javBusBtn")]);for(let[i,n]of[[s,Be],[a,Se]])try{if(i&&t.hostname===new URL(i).hostname)return n}catch(l){clog.warn(`忽略无效的站点配置: ${i}`,l)}let{site:r}=Ct(e);return[Be,Se].includes(r)?r:null}catch{return null}}async checkBlacklist(e=!1){let t=this.createTaskResult({skippedHost:0}),s=this.getOptionalDependency("BlacklistPlugin");return s?(await this.ensureReady(),await this.shouldStartTask("blacklist",e)?(this.beginTaskAttempt("blacklist"),t.attempted=!0,this.withActiveTask("blacklist",async()=>{let a=null,r=!1;try{let i=await storageManager.getBlacklist();i=i.sort(((m,f)=>m.createTimef.createTime?-1:0));let n=this.taskConfig.checkConcurrencyCount,l=this.taskConfig.checkRequestSleep,c=this.taskConfig.checkBlacklist_intervalTime,h=this.taskConfig.checkBlacklist_ruleTime,u=[],p=new URL(window.location.href).hostname;for(let m of i){let f;try{f=new URL(m.url)}catch(v){t.parseFailed++,clog.error("黑名单地址无效:",m.url,v);continue}if(p!==f.hostname){t.skippedHost++;continue}if(!e&&m.checkTime&&this.isUnnecessaryCheck(m.checkTime,c))t.skippedInterval++;else if(mt(m.lastPublishTime,h))t.skippedStopped++;else{let v=await this.resolveBlacklistSite(f.href);v?u.push({item:m,site:v}):(t.parseFailed++,clog.error(`不支持的黑名单来源站点: ${f.hostname}`))}}clog.html(`检测屏蔽黑名单, 总任务数: ${u.length}, 并发限制:${n}, 请求间隔时间:${l}ms`);try{await this.limitConcurrency(u,n,l,(async m=>{let{item:f,site:v}=m,{starId:b,name:w,url:S}=f,j;try{clog.log("正在检屏黑名单演员:",w,S),$("#checkBlacklistMsg").text(`正在检屏黑名单演员: ${w} ${S}`),j=await this.requestHostPage(S,v)}catch(k){if(t.networkFailed++,this.isNetworkBlocked(k))throw k;return void clog.error("检测屏蔽演员网络错误:",S,k)}try{let k=utils.htmlTo$dom(j);await this.storageQueue.addTask((async()=>{let x=await s.parseAndSaveFilterInfo(k,w,b,v);await storageManager.updateBlacklistItem({starId:b,name:w,checkTime:utils.getNowStr(),lastPublishTime:x.lastPublishTime})})),t.success++}catch(k){t.parseFailed++,clog.error("解析或保存黑名单演员失败:",S,k)}})),await this.storageQueue.waitAllFinished()}catch(m){if(!this.isNetworkBlocked(m))throw m;a=m,t.aborted=Math.max(0,u.length-t.success-t.parseFailed-t.networkFailed)}let g=t.parseFailed+t.networkFailed+t.aborted===0;t.completed=g,t.fatal=!!a,await this.finalizeTask("blacklist",g),r=!0,this.renderBlacklistResult(t,g);try{await s.resetBtnTip()}catch(m){clog.error("刷新黑名单检测提示失败",m)}if(a)throw a;return t}catch(i){if(r||await this.finalizeTask("blacklist",!1),t.completed=!1,t.fatal=this.isNetworkBlocked(i),t.fatal)throw i;return t.parseFailed++,clog.error("黑名单整批检测失败",i),t}})):(clog.debug("检测黑名单未到整批执行时间"),t)):(clog.warn("黑名单功能已禁用,跳过自动检测"),t)}renderBlacklistResult(e,t){let s=t?"":",5 分钟后补偿未完成项",a=`黑名单整批检测:成功 ${e.success},解析/存储失败 ${e.parseFailed},网络失败 ${e.networkFailed},停更跳过 ${e.skippedStopped},间隔跳过 ${e.skippedInterval},异站跳过 ${e.skippedHost}${e.aborted?`,未执行 ${e.aborted}`:""}${s}`;$("#checkBlacklistMsg").text(a),clog.log(a)}async checkFavoriteActress(e=!1){await this.ensureReady();let t=this.createTaskResult({pages:0,actorCount:0});return await this.shouldStartTask("favoriteActress",e)?(this.beginTaskAttempt("favoriteActress"),t.attempted=!0,this.withActiveTask("favoriteActress",async()=>{try{let s=[],a=await this.scrapeActorInfo(`${this.javDbUrl}/users/collection_actors`,s);return s.length>0&&await storageManager.addFavoriteActressList(s),t.success=s.length,t.actorCount=s.length,t.pages=a.pages,await this.finalizeTask("favoriteActress",!0),t.completed=!0,clog.log("所有演员信息已收集, 总计数量:",s.length),$("#checkNewVideoMsg").text(`完整同步完成:演员 ${s.length},页面 ${a.pages}`),s.length>0&&await this.emitNewVideoChanged("favorite-actress-sync"),t}catch(s){let a=s;if(t.completed=!1,a?._taskNetwork?t.networkFailed++:t.parseFailed++,t.fatal=this.isNetworkBlocked(a),await this.finalizeTask("favoriteActress",!1),$("#checkNewVideoMsg").text("演员同步失败,5 分钟后重试整轮"),clog.error("同步收藏演员失败",a),t.fatal)throw s;return t}})):(clog.debug("同步收藏演员未到整批执行时间"),t)}async scrapeActorInfo(e,t=[]){let s=new URL("/users/collection_actors",this.javDbUrl),a=new Set,r=new URL(e,this.javDbUrl),i=0;for(;r;)try{if(r.origin!==s.origin||r.pathname!==s.pathname)throw new Error(`收藏演员分页地址越界: ${r.href}`);if(a.has(r.href))throw new Error(`收藏演员分页循环: ${r.href}`);if(i>=200)throw new Error("收藏演员分页超过 200 页");a.add(r.href),i++,clog.log(`正在抓取页面: ${r.href}`),$("#checkNewVideoMsg").text(`正在解析已收藏的演员: ${r.href}`);let n=await this.getRuntimeService("actressInfo").collection("javdb",{baseUrl:this.javDbUrl,pageUrl:r.href},{scope:await this.getRuntimeService("scope")()});if(n.state!=="valid")throw Object.assign(new Error(`收藏演员页面无效: ${n.state}`),{_taskParse:!0});if(n.isEmpty&&n.nextUrl)throw Object.assign(new Error("收藏演员空页面包含下一页"),{_taskParse:!0});t.push(...n.actors),r=n.nextUrl?new URL(n.nextUrl,r.href):null}catch(n){let l=["NETWORK_ERROR","TIMEOUT","AUTH_REQUIRED","RATE_LIMITED","CF_BLOCKED","CIRCUIT_OPEN","ABORTED"],c=n;throw l.includes(c?.code)&&(c._taskNetwork=!0),c._taskNetwork||Object.prototype.hasOwnProperty.call(c,"_taskParse")||(c._taskParse=!0),clog.error(`抓取 ${r?.href||e} 时发生错误,停止本轮同步:`,c),c}return{actors:t,pages:i}}async checkNewVideo(e=!1){await this.ensureReady();let t=this.createTaskResult();return await this.shouldStartTask("newVideo",e)?(this.beginTaskAttempt("newVideo"),t.attempted=!0,this.withActiveTask("newVideo",async()=>{let s=null,a=!1;try{let r=await storageManager.getFavoriteActressList(),i=utils.genericSort(r,[{key:d(g=>g.newVideoList?.length??0,"key"),order:"desc"},{key:"lastPublishTime",order:"desc"}]),n=this.taskConfig.checkConcurrencyCount,l=this.taskConfig.checkRequestSleep,c=this.taskConfig.checkNewVideo_intervalTime,h=this.taskConfig.checkNewVideo_ruleTime,u=[];for(let g of i)!e&&g.lastCheckTime&&this.isUnnecessaryCheck(g.lastCheckTime,c)?t.skippedInterval++:mt(g.lastPublishTime,h)?t.skippedStopped++:u.push(g);if(clog.html(`检测最新作品, 总任务数: ${u.length}, 并发限制:${n}, 请求间隔时间:${l}ms`),u.length>0){let g=await storageManager.getTitleFilterKeyword(),m=await storageManager.getBlacklistCarList(),f=new Set(m.map(v=>v.carNum));try{await this.limitConcurrency(u,n,l,(async v=>{let{name:b,starId:w}=v,S=`${this.javDbUrl}/actors/${w}?t=d`;try{clog.log("正在检测最新作品, 演员:",b,S),$("#checkNewVideoMsg").text(`正在检测最新作品, 演员: ${b}`);let j=await this.getRuntimeService("actressInfo").movies("javdb",{actorId:w,baseUrl:this.javDbUrl},{scope:await this.getRuntimeService("scope")(),ttlMs:0});try{await this.storageQueue.addTask((async()=>this.parseActorMovies(j,w,b,g,f))),t.success++}catch(k){t.parseFailed++,clog.error("解析或保存演员作品失败:",S,k)}}catch(j){if(this.isNetworkBlocked(j))throw t.networkFailed++,j;t.networkFailed++,clog.error("检测演员信息发生网络错误:",S,j)}})),await this.storageQueue.waitAllFinished()}catch(v){if(!this.isNetworkBlocked(v))throw v;s=v,t.fatal=!0,t.aborted=Math.max(0,u.length-t.success-t.parseFailed-t.networkFailed),clog.warn(`网络阻断,本轮停止,未执行 ${t.aborted}`)}}let p=t.parseFailed+t.networkFailed+t.aborted===0;if(t.completed=p,await this.finalizeTask("newVideo",p),a=!0,clog.html('检测最新作品---结束'),this.renderCheckResult(t,p?r.length?"整批检测结束":"收藏为空,整批检测完成":"整批检测未完成,5 分钟后补偿未完成项"),t.success>0&&await this.emitNewVideoChanged("task-completed"),s)throw s;return t}catch(r){if(a||await this.finalizeTask("newVideo",!1),t.completed=!1,t.fatal=this.isNetworkBlocked(r),t.fatal)throw r;return t.parseFailed++,this.renderCheckResult(t,"整批检测失败,5 分钟后补偿"),clog.error("新作品整批检测失败",r),t}})):(clog.debug("检测新作品未到整批执行时间"),t)}renderCheckResult(e,t="检测结束"){let s=`${t}:成功 ${e.success},解析/存储失败 ${e.parseFailed},网络失败 ${e.networkFailed},停更跳过 ${e.skippedStopped},间隔跳过 ${e.skippedInterval}${e.aborted?`,未执行 ${e.aborted}`:""}`;$("#checkNewVideoMsg").text(s),clog.log(s)}async parsePage(e,t,s,a,r,i){let n=this.getSelector(t);t===Se&&e.find(".avatar-box").length>0&&e.find(".avatar-box").parent().remove();let l=Ws(e,{boxSelector:t===Se?`${n.boxSelector}, #waterfall`:n.boxSelector,requestDomItemSelector:n.requestDomItemSelector});if(l.state!=="valid")throw clog.error("新作品检测-解析列表失败"),new Error("新作品检测-解析列表失败");let c=l.items,h=e.find(n.nextPageSelector).attr("href");if(c.length===0&&h)throw new Error("新作品检测-空列表包含下一页");if(c.length===0)return await storageManager.updateFavoriteActress({starId:s,lastCheckTime:utils.getNowStr(),newVideoList:[]}),0;let u=[],p=[];for(let w of c){let S=$(w),{carNum:j,url:k,title:x,publishTime:_}=$e(S);_&&p.push(_),j&&(r.find(R=>x.includes(R)||j.includes(R))||i.has(j)||(()=>{let R=S.find("img").attr("src")||"";R&&!R.startsWith("http")&&(R=R.startsWith("/")?this.javDbUrl+R:this.javDbUrl+"/"+R);let L=k||"";L&&!L.startsWith("http")&&(L=L.startsWith("/")?this.javDbUrl+L:this.javDbUrl+"/"+L);let N=S.find(".score .value, .score").text().trim(),A=parseFloat(N)||0,O=N.match(/由(\d+)人/),U=0;if(O)U=parseInt(O[1]);else{let q=S.find(".score .count, .meta .count").text().trim();U=parseInt(q.replace(/[^\d]/g,""))||0}u.push({carNum:j,coverUrl:R,title:x||"",publishTime:_||"",score:A,voteCount:U,url:L})})())}let g=Qt(p),m=await storageManager.getCarMap(),f=await this.getRuntimeService("state")?.getNewVideoDecisions?.()||{},v=u.filter(w=>!m.has(w.carNum)),b=v.filter(w=>f[w.carNum]?.action!=="dismissed");return b.length>0&&clog.html(`检测出新作品, ${T(a)}, 共${b.length}部`),await storageManager.updateFavoriteActress({starId:s,lastCheckTime:utils.getNowStr(),newVideoList:v,lastPublishTime:g}),b.length}async parseActorMovies(e,t,s,a,r){if(!e.length)return await storageManager.updateFavoriteActress({starId:t,lastCheckTime:utils.getNowStr(),newVideoList:[]}),0;let i=e.map(g=>g.publishTime).filter(Boolean),n=e.filter(g=>!g.carNum||r.has(g.carNum)?!1:!a.some(m=>g.title?.includes(m)||g.carNum.includes(m))).map(g=>({carNum:g.carNum,coverUrl:g.coverUrl||"",title:g.title||"",publishTime:g.publishTime||"",score:Number(g.score)||0,voteCount:Number(g.voteCount)||0,url:g.url||""})),l=Qt(i),c=await storageManager.getCarMap(),h=await this.getRuntimeService("state")?.getNewVideoDecisions?.()||{},u=n.filter(g=>!c.has(g.carNum)),p=u.filter(g=>h[g.carNum]?.action!=="dismissed");return p.length>0&&clog.html(`检测出新作品, ${T(s)}, 共${p.length}部`),await storageManager.updateFavoriteActress({starId:t,lastCheckTime:utils.getNowStr(),newVideoList:u,lastPublishTime:l}),p.length}async checkOneNewVideo(e){await this.ensureReady();let t=await storageManager.getTitleFilterKeyword(),s=await storageManager.getBlacklistCarList(),a=new Set(s.map(h=>h.carNum)),{lastCheckTime:r,name:i,starId:n}=e,l=`${this.javDbUrl}/actors/${n}?t=d`,c=$("#checkNewVideoMsg");try{clog.log("正在检测最新作品, 演员:",i,l),c.text(`正在检测最新作品, 演员: ${i}`);let h=await this.getRuntimeService("actressInfo").movies("javdb",{actorId:n,baseUrl:this.javDbUrl},{scope:await this.getRuntimeService("scope")(),ttlMs:0});await this.parseActorMovies(h,n,i,t,a),clog.html('检测最新作品---结束'),c.text("检测完毕"),await this.emitNewVideoChanged("single-actress-check")}catch(h){clog.error("检测屏蔽演员信息, 发生错误:",l,h),show.error("检测屏蔽演员信息, 发生错误:"+h,"bottom","right"),c.text(`检测屏蔽演员信息, 发生错误: ${l}`)}}};d(ln,"TaskPlugin");var xa=ln;function yt(o){if(!window.isDetailPage||typeof o?.getDetailResourceBoundary!="function")return null;let e=o.getDetailResourceBoundary();return e?{...e,hostRoot:$(e.hostRoot),controller:$(e.controller),observeRoot:$(e.observeRoot),resourceRoot:$(e.resourceRoot),resourceRegion:$(e.resourceRegion),sortSelect:$(e.sortSelect),getActionTarget(t){let s=$(e.getActionTarget(t));if(!s.length||!e.actionTargetRequiresWrapper?.(t))return s;let a=s.children(".jhs-offline-actions").first();return a.length||(a=$('').appendTo(s)),a}}:null}d(yt,"getDetailResourceAdapter");function qh(o){if(typeof Fi=="function")return Fi(o);let e=o.explicitContext;if(e?.carNum)return{context:e,source:"explicit"};let t=typeof na=="function"?na(o.trigger):null;if(t)return{context:t,source:"owned-surface"};for(let[s,a]of[["list-item",o.listResolver],["native-detail",o.nativeResolver],["legacy-fallback",o.legacyResolver]]){let r=a?.();if(r?.carNum)return{context:r,source:s}}return{context:null,source:"missing"}}d(qh,"resolveOfflineMovieContext");var dn=class dn{constructor(){this.providers=new Map,this.availabilityCache=new Map,this.unavailableReasons=[],this.positiveTtl=3e5,this.negativeTtl=2e4}register(e){if(!e?.id||!Array.isArray(e.capabilities)||typeof e.submit!="function"||typeof e.getAvailability!="function")throw new TypeError("Invalid offline provider");return this.providers.set(e.id,e),e}async getCandidates(e,{force:t=!1}={}){let s=/^ed2k:/i.test(e)?"ed2k":/^magnet:/i.test(e)?"magnet":"unknown",a=[],r=[];for(let i of this.providers.values()){if(!i.capabilities.includes(s)){r.push(`${i.name}:不支持 ${s==="unknown"?"该资源格式":s.toUpperCase()}`);continue}if(!await i.isEnabled()){r.push(`${i.name}:未启用`);continue}let n=await this.getAvailability(i,t);["ready","unknown"].includes(n.authState)?a.push({provider:i,availability:n}):r.push(`${i.name}:${n.reason||"授权不可用"}`)}return this.unavailableReasons=r,a}getUnavailableReason(){let e=[...this.unavailableReasons];return this.providers.has("123")||e.unshift("123 云盘:授权桥接插件未加载或已禁用"),e.join(";")||"离线服务插件未加载或已禁用"}async getAvailability(e,t=!1){let s=this.availabilityCache.get(e.id),a=s&&["ready","unknown"].includes(s.value.authState)?this.positiveTtl:this.negativeTtl;if(!t&&s&&Date.now()-s.time.jhs-offline-btn.loading{cursor:wait;opacity:.65}.jhs-offline-native{margin-left:6px;padding:3px 8px}"}async handle(){if(!(M||B))return;let e=await this.getRuntimeService("scope")();this.lifecycleScope=e,this.registerProviders(e),this.bindSubmit(),e.addCleanup((()=>$(document).off(".jhsUnifiedOffline"))),window.isDetailPage&&(this.injectNativeButtons(),V&&e.addCleanup(V.on("magnet-items-updated",(()=>this.injectNativeButtons()))))}registerProviders(e){let t=this.getOptionalDependency("OneTwoThreeOfflinePlugin"),s=this.getRuntimeService("offline");t&&this.registry.register({id:"123",name:"123 云盘",capabilities:["magnet"],retryPolicy:{automaticAttempts:0},isEnabled:d(async()=>be(this.getRuntimeService("settings").snapshot().enable123Offline??!0,!1),"isEnabled"),getAvailability:d(async()=>await t.getStoredToken()?{available:!0,authState:"ready",reason:"授权已同步"}:{available:!1,authState:"token-missing",reason:"尚未同步 123 授权"},"getAvailability"),submit:d(async(a,r,i={})=>{let n=await t.getStoredToken();if(e?.disposed||i.isActive?.()===!1)throw Object.assign(new Error("所属界面已关闭,未提交任务"),{code:"SUBMIT_CANCELLED"});if(!be(this.getRuntimeService("settings").snapshot().enable123Offline??!0,!1))throw Object.assign(new Error("123 离线服务已关闭,未提交任务"),{code:"SERVICE_DISABLED"});if(!n)throw Object.assign(new Error("尚未同步 123 授权"),{code:"TOKEN_MISSING"});return s.submitWithIntegration("pan123",a,{token:n,scope:e})},"submit"),openUrl:d(()=>s.getIntegrationHomeUrl("pan123"),"openUrl")}),this.registry.register({id:"115",name:"115",capabilities:["magnet","ed2k"],retryPolicy:{automaticAttempts:0},isEnabled:d(async()=>be(this.getRuntimeService("settings").snapshot().enable115Offline??!1,!1),"isEnabled"),getAvailability:d(async()=>({available:!0,authState:"unknown",reason:"提交时确认登录状态"}),"getAvailability"),submit:d(a=>s.submitWithIntegration("one115",a,{scope:e}),"submit"),openUrl:d(()=>s.getIntegrationHomeUrl("one115"),"openUrl")}),window.offlineProviderRegistry=this.registry}bindSubmit(){$(document).off("click.jhsUnifiedOffline",".jhs-offline-btn").on("click.jhsUnifiedOffline",".jhs-offline-btn",(async e=>{e.preventDefault(),e.stopPropagation();let t=$(e.currentTarget),s=t.attr("data-resource")||t.attr("data-magnet")||t.closest(".magnet-result,.item,td").find('a[href^="magnet:"],a[href^="ed2k:"]').first().attr("href");s?await this.submitResource(e,s,t):show.error("未找到可提交资源")}))}injectNativeButtons(){let e=yt(this.getRuntimeService("host"));e&&e.rows().forEach((t=>{let s=e.getResource(t),a=e.getActionTarget(t);if(!s||!a?.length||$(t).closest(".magnet-container,.jhs-review-panel,.movie-detail-container").length)return;let r=`native-${e.site}`,i=$(t).find(`.jhs-offline-btn[data-jhs-offline-owner="${r}"]`).first();$(t).find(`.jhs-offline-btn[data-jhs-offline-owner="${r}"]`).not(i).remove(),i.length||(i=$('').attr("data-jhs-offline-owner",r)),i.attr("data-resource",s),a.append(i)}))}async chooseCandidate(e,t){if(t.length===1)return t[0];let s=await storageManager.getSetting("offlineProviderMode","ask"),a=t.find((r=>r.provider.id===s));return a||new Promise((r=>{let i=this.getRuntimeService("dialog"),n=$('

      选择离线服务

      '),l=n.find(".jhs-toolbar");t.forEach((h=>l.append($('').text(`${h.provider.name} · ${h.availability.authState==="ready"?"已就绪":"状态未知"}`).on("click",(()=>{r(h),i.close(c)})))));let c=i.open({type:1,title:"选择离线服务",content:n,area:utils.getDialogArea("sm"),cancel:d(()=>r(null),"cancel"),end:d(()=>r(null),"end")})}))}getVideoInfo(e,t=null){let s=e?.[0]||e,a=this.getRuntimeService("host")?.locateListItems?.().find(i=>s&&i.contains(s));return qh({explicitContext:t,trigger:e,listResolver:d(()=>a?$e(a):null,"listResolver"),nativeResolver:d(()=>window.isDetailPage?this.getPageInfo():null,"nativeResolver"),legacyResolver:d(()=>this.getPageInfo?.(),"legacyResolver"),logger:d(i=>clog.warn(i),"logger")}).context}async markDownloadedAndClose(e,t){if(!e?.carNum)return!1;try{let s=this.getRuntimeService("state");await s.patch(e.carNum,{downloaded:!0},{type:"offline-mark-downloaded",record:{...e,names:e.actress||e.names||""}});let a=await s.getState?.(e.carNum);if(a&&a.stateFlags?.downloaded!==!0)throw new Error("状态回读未确认已下载")}catch(s){return clog.error("离线任务标记已下载失败",s),show.error("离线已提交,但标记已下载失败"),!1}try{let s=this.getRuntimeService("settings").snapshot().needClosePage??"yes";if(s!=="yes"&&s!==!0)return!0;if(!await utils.closePage(t))throw new Error("未找到可关闭的详情页");return!0}catch(s){return clog.error("离线任务完成后关闭详情页失败",s),show.error("已标记下载,但无法自动关闭"),!1}}async submitResource(e,t,s=$(),a=null,r=null,i={}){if(this.lifecycleScope?.disposed||s.hasClass("loading"))return;let n=s.text(),l=s[0]||e?.currentTarget,c=!!l?.isConnected,h=d(()=>{s.removeClass("loading").removeAttr("aria-busy aria-disabled").text(n)},"restoreButton"),u=!1,p=null,g=null;try{s.addClass("loading").attr({"aria-busy":"true","aria-disabled":"true"}).text("提交中");let m=await this.registry.getCandidates(t,{force:!!i.forceAvailabilityRefresh});if(!m.length&&!i.forceAvailabilityRefresh&&!this.lifecycleScope?.disposed&&(!c||l.isConnected)&&(m=await this.registry.getCandidates(t,{force:!0})),!m.length)return void show.error(`无法离线:${this.registry.getUnavailableReason?.()||"没有已启用且支持该资源的离线服务,请检查授权与设置"}`);if(this.lifecycleScope?.disposed||c&&!l.isConnected||(p=m.find((b=>b.provider.id===i.preferredProviderId))||await this.chooseCandidate(e,m),!p))return;if(!await p.provider.isEnabled())return void show.error("所选离线服务已关闭,未提交任务");if(this.lifecycleScope?.disposed||c&&!l.isConnected)return;g=this.getVideoInfo(s,a);let f=l||null;if(!g)return void show.error("无法确定影片身份,未执行离线操作");let v={root:f,layerIndex:utils.getOwningLayerIndex({root:f})};s.text("提交中"),await p.provider.submit(t,g,{isActive:d(()=>!this.lifecycleScope?.disposed&&(!c||l.isConnected),"isActive")}),u=!0,this.registry.updateAvailability(p.provider.id,{available:!0,authState:"ready",reason:"最近提交成功"});try{await this.getRuntimeService("state").appendOfflineHistory({providerId:p.provider.id,providerName:p.provider.name,resource:t,resourceType:/^ed2k:/i.test(t)?"ed2k":"magnet",carNum:g?.carNum,status:"submitted",retryOf:r})}catch(b){clog.error("离线任务已创建,但本地记录保存失败",b),show.error("任务已创建,但本地记录保存失败,请勿重复提交")}(!c||l.isConnected)&&(s.text("已提交"),show.ok(`${p.provider.name} 离线任务已创建`),utils.q(e,"是否将该作品标记为已下载?",(()=>{this.markDownloadedAndClose(g,v)})))}catch(m){if(u){clog.error("离线任务已创建,后续界面更新失败",m);return}let f=m,v=f?.code||(m==="TOKEN_EXPIRED"?"TOKEN_EXPIRED":"SUBMIT_FAILED"),b=f?.message||String(m);if(v==="SUBMIT_CANCELLED")return;if(v==="SERVICE_DISABLED")return void show.error(b);if(p){["AUTH_REQUIRED","LOGIN_REQUIRED","TOKEN_EXPIRED","TOKEN_MISSING"].includes(v)&&this.registry.updateAvailability(p.provider.id,{available:!1,authState:p.provider.id==="115"?"login-required":"token-missing",reason:b});try{await this.getRuntimeService("state").appendOfflineHistory({providerId:p.provider.id,providerName:p.provider.name,resource:t,resourceType:/^ed2k:/i.test(t)?"ed2k":"magnet",carNum:g?.carNum,status:"failed",errorCode:v,errorMessage:b,retryOf:r})}catch(w){clog.error("离线失败记录保存失败",w)}}show.error(`${p?.provider.name||""} 离线失败:${b}`)}finally{u?setTimeout(h,this.BUTTON_COOLDOWN_MS):h()}}};d(hn,"UnifiedOfflinePlugin");var ka=hn;function un(o){return C(o)?.replace(/^FC2-/i,"")||null}d(un,"normalize115Keyword");function pn(o){let e=Number(o)||0;if(!e)return"0 B";let t=["B","KB","MB","GB","TB"],s=Math.min(t.length-1,Math.floor(Math.log(e)/Math.log(1024)));return`${(e/1024**s).toFixed(s?2:0)} ${t[s]}`}d(pn,"format115Size");function Ic(o,e,t={}){let s=o.match(/\.[^.]+$/)?.[0]||"",a=o.match(/-(?:U|UC|C|4K|8K|H265|HEVC|CN|CHS|CHT)\b/gi)||[],r=t.uppercase===!1?e:e.toUpperCase();return t.keepTitle&&(r+=` ${o.replace(s,"").replace(/^.*?\s+/,"")}`),t.keepSuffix!==!1&&(r+=[...new Set(a.map((i=>i.toUpperCase())))].join("")),`${r.slice(0,t.maxLength||180)}${s}`}d(Ic,"preview115Rename");var gn=class gn extends I{constructor(){super(),this.observer=null,this.unsubscribeItems=null,this.pendingCards=new Set,this.flushTimer=null,this.lifecycleScope=null,this.concurrency=4,this.cacheMinutes=60}getName(){return"OneOneFiveMatchPlugin"}async handle(){this.parentScope=await this.getRuntimeService("scope")();let e=this.getRuntimeService("settings");this.parentScope.listen(e,"settings.changed",t=>{t.detail?.names?.some(s=>["enable115Match","oneOneFiveConcurrency","oneOneFiveCacheMinutes"].includes(s))&&this.configureMatching().catch(s=>clog.error("115 匹配设置更新失败",s))}),this.parentScope.addCleanup(()=>{this.matchGeneration++,this.stopMatching()}),await this.configureMatching()}async configureMatching(){let e=this.matchGeneration=(this.matchGeneration||0)+1;if(this.stopMatching(),!be(this.getRuntimeService("settings").snapshot().enable115Match,!1)||this.parentScope.disposed||e!==this.matchGeneration)return;let s=this.lifecycleScope=new te(`115-match:${e}`);this.releaseMatchScope=this.parentScope.addCleanup(()=>s.dispose()),await this.mountMatching(s)}stopMatching(){this.releaseMatchScope?.(),this.releaseMatchScope=null,this.lifecycleScope?.dispose(),this.lifecycleScope=null,this.unsubscribeItems?.(),this.unsubscribeItems=null,this.observer?.disconnect(),this.observer=null,this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=null,this.pendingCards.clear(),$(".jhs-115-match,.jhs-115-list-match").remove(),$("[data-jhs115-observed],[data-jhs115-state]").removeAttr("data-jhs115-observed data-jhs115-state")}async mountMatching(e){let t=this.getRuntimeService("host"),s=this.getRuntimeService("offline");if(!isDetailPage){if(await this.setupListMatching(t,e),e.disposed)return;e.ownObserver(this.observer),e.addCleanup((()=>{this.unsubscribeItems?.(),this.unsubscribeItems=null,this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=null,this.pendingCards.clear()}));return}let a=this.getPageInfo().carNum,r=un(a);if(!r)return;$(t.locateDetailSlots().summary).append('
      115匹配:匹配中
      ');try{let n=Math.max(1,Number(this.getRuntimeService("settings").snapshot().oneOneFiveCacheMinutes??60)||60);if(e.disposed||this.lifecycleScope!==e)return;let l=await s.searchFiles("one115",r,{scope:e,ttlMs:n*6e4});if(e.disposed||this.lifecycleScope!==e)return;let c=$(".jhs-115-match").empty().append("115匹配:");if(!l.length)return void c.append(document.createTextNode("未匹配 "),$('').on("click",(()=>location.reload())));l.forEach((h=>{let u=$(''),p=s.getPlayUrl("one115",h);p?u.append($("").addClass("jhs-btn jhs-btn--secondary").attr({href:p,target:"_blank"}).text(`${h.name} (${pn(h.size)})`)):u.append($("").text(`${h.name} (${pn(h.size)}) · 不可播放`)),h.fileId&&u.append($('').data("match",h)),c.append(u)})),c.on("click",".jhs-115-rename",(h=>this.renameWithPreview(h,$(h.currentTarget).data("match"),a)))}catch(n){if(e.disposed||this.lifecycleScope!==e)return;$(".jhs-115-match").empty().append("115匹配:",document.createTextNode("未登录或请求失败 ")).append($("").addClass("jhs-btn jhs-btn--ghost").attr({href:s.getIntegrationHomeUrl("one115"),target:"_blank"}).text("去登录"),$('').on("click",(()=>location.reload()))),clog.error("115 匹配失败",n)}}async setupListMatching(e,t){if(!V)throw new Error("JHS EventBus 尚未初始化");this.concurrency=Math.max(1,Math.min(10,Number(this.getRuntimeService("settings").snapshot().oneOneFiveConcurrency??4)||4)),this.cacheMinutes=Math.max(1,Number(this.getRuntimeService("settings").snapshot().oneOneFiveCacheMinutes??60)||60),!(t.disposed||this.lifecycleScope!==t)&&(this.observer=new IntersectionObserver((s=>{t.disposed||this.lifecycleScope!==t||(s.forEach((a=>a.isIntersecting&&(this.observer.unobserve(a.target),this.pendingCards.add(a.target)))),this.pendingCards.size&&this.scheduleFlush())}),{rootMargin:"200px"}),this.registerCards($(e.locateListRoot()).find(".item").get()),this.unsubscribeItems=V.on("list-items-added",(s=>this.registerCards(s.items||[]))))}registerCards(e){e.forEach((t=>{t.dataset.jhs115Observed!=="true"&&t.dataset.jhs115State!=="matched"&&(t.dataset.jhs115Observed="true",this.observer?.observe(t))}))}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout((async()=>{let e=[...this.pendingCards],t=this.lifecycleScope;this.pendingCards.clear(),this.flushTimer=null,await Ae(e,this.concurrency,(s=>t&&!t.disposed&&this.lifecycleScope===t?this.matchCard(s):void 0))}),50))}async matchCard(e,t=!1){let s=this.lifecycleScope;if(!s||s.disposed)return;let a=$(e),r=C(a.find(".video-title strong").first().text());if(!(!r||e.dataset.jhs115State==="pending"))try{e.dataset.jhs115State="pending";let i=this.getRuntimeService("offline"),n=await i.searchFiles("one115",un(r),{scope:s,ttlMs:this.cacheMinutes*6e4,force:t});if(s.disposed||this.lifecycleScope!==s||!e.isConnected)return;a.find(".jhs-115-list-match").remove();let l=$('').text(n.length?`匹配${n.length}个`:"未匹配").data("matches",n);a.find(".video-title").first().prepend(l),e.dataset.jhs115State="matched",l.on("click",(c=>{if(c.preventDefault(),c.stopPropagation(),s.disposed)return;if(!n.length)return this.matchCard(e,!0);if(n.length===1)return window.open(i.getPlayUrl("one115",n[0]),"_blank");let h=n.map((u=>`${T(u.name)}`)).join("
      ");this.getRuntimeService("dialog").open({type:1,title:`${r} 115匹配`,content:`
      ${h}
      `,area:utils.getResponsiveArea(["560px","auto"])})}))}catch(i){if(s.disposed||this.lifecycleScope!==s||!e.isConnected)return;e.dataset.jhs115State="failed",a.find(".jhs-115-list-match").remove(),a.find(".video-title").first().prepend($('').on("click",(n=>{n.preventDefault(),n.stopPropagation(),s.disposed||this.matchCard(e,!0)}))),clog.warn("115 单卡匹配失败",i)}}destroy(){this.matchGeneration=(this.matchGeneration||0)+1,this.stopMatching()}renameWithPreview(e,t,s){let a=Ic(t.name,s,{uppercase:!0,keepSuffix:!0});utils.q(e,`确认重命名?
      ${T(t.name)}
      → ${T(a)}`,(async()=>{try{await this.getRuntimeService("offline").renameFile("one115",t.fileId,a,{scope:this.lifecycleScope}),show.ok("重命名完成")}catch(r){clog.error("115 重命名失败",r),show.error("重命名失败:"+(r instanceof Error?r.message:String(r)))}}))}};d(gn,"OneOneFiveMatchPlugin");var Ca=gn;var mn=class mn extends I{constructor(){super(...arguments),this.tokenKey="jhs_123pan_author_token",this.tokenMetaKey="jhs_123pan_author_token_meta",this.syncTimer=null,this.syncFallbackMs=3e5,this.syncGeneration=0}getName(){return"OneTwoThreeOfflinePlugin"}async handle(){window.location.hostname==="yun.123pan.com"&&this.startTokenSync(await this.getRuntimeService("scope")())}startTokenSync(e){this.syncTokenOnce(),this.syncTimer&&clearInterval(this.syncTimer),this.syncTimer=setInterval((()=>this.syncTokenOnce()),this.syncFallbackMs);let t=d(()=>this.syncTokenOnce(),"e");e.addCleanup((()=>{this.syncTimer&&clearInterval(this.syncTimer),this.syncTimer=null})),e.listen(window,"storage",t),e.listen(window,"focus",t),e.listen(document,"visibilitychange",(()=>{document.hidden||this.syncTokenOnce()}))}getTokenFrom123Pan(){let e=this.getRuntimeService("storage"),t=(e.getLocal("authorToken")||"").trim();if(t)return{token:t,source:"authorToken"};try{let a=JSON.parse(e.getLocal("userInfo")||"{}");if(a.authorToken||a.token)return{token:(a.authorToken||a.token||"").trim(),source:a.authorToken?"userInfo.authorToken":"userInfo.token"}}catch(a){clog.debug("123 云盘历史用户信息解析失败,继续尝试其他凭证来源",a)}let s=document.cookie.split(";");for(let a of s){let r=a.indexOf("=");if(r<0)continue;let i=a.substring(0,r).trim(),n=a.substring(r+1);if(i&&/token/i.test(i)&&n)return{token:decodeURIComponent(n).trim(),source:`cookie.${i}`}}return{token:"",source:""}}async syncTokenOnce(){let e=++this.syncGeneration,t=this.getRuntimeService("storage"),s=this.getTokenFrom123Pan();if(!s.token)return;let a=`${this.tokenKey}_secret`,r=t.getValue(a,"");r||(r=crypto.randomUUID?.()||`${Date.now()}-${crypto.getRandomValues(new Uint32Array(4)).join("-")}`,t.setValue(a,r));let i=t.getValue(this.tokenKey,""),n=await this.getStoredToken(),l=t.getValue(this.tokenMetaKey,null);if(n===s.token&&i.startsWith("AES:")&&l&&l.source===s.source)return;let c="AES:"+await Xt(s.token,r),h=this.getTokenFrom123Pan();e!==this.syncGeneration||h.token!==s.token||h.source!==s.source||t.getValue(this.tokenKey,"")!==i||t.getValue(a,"")!==r||(t.setValue(this.tokenKey,c),t.setValue(this.tokenMetaKey,{source:s.source,updatedAt:new Date().toISOString()}),n!==s.token&&show.info(`123 云盘授权已更新:${s.source}`))}async getStoredToken(){let e=this.getRuntimeService("storage"),t=e.getValue(this.tokenKey,""),s=e.getValue(`${this.tokenKey}_secret`,"");if(typeof t!="string")return"";if(!t.startsWith("AES:"))return t;if(typeof s!="string"||!s)return"";try{return await Xe(t.slice(4),s,!1)}catch{return""}}clearStoredToken(e){this.syncGeneration++;let t=this.getRuntimeService("storage");t.setValue(this.tokenKey,""),t.setValue(this.tokenMetaKey,{source:"cleared",reason:e,updatedAt:new Date().toISOString()})}};d(mn,"OneTwoThreeOfflinePlugin");var _a=mn;function Ec(o){let e=0,t=0,s=0,a=0,r=0,i=0,n=0,l=0,c=0;for(let u of o??[]){let p=H(u?.stateFlags);e++;let g=p.blocked===!0;g&&t++;let m=!g;p.favorite&&(s++,m&&a++),p.downloaded&&(r++,m&&i++),p.watched&&(n++,m&&l++),!oe(p)&&c++}let h=e-t;return Object.freeze({total:e,blocked:t,unblocked:h,favoriteRaw:s,favoriteEffective:a,downloadedRaw:r,downloadedEffective:i,watchedRaw:n,watchedEffective:l,pending:c})}d(Ec,"computeLibraryStats");var fn=class fn{constructor(e){this.storage=e.storage,this.state=e.state}async loadLibrarySnapshot(){let[e,t,s,a]=await Promise.all([this.storage.getCarList(),this.storage.getFavoriteActressList(),this.storage.getBlacklist(),this.state.getActivityLog()]);return Object.freeze({cars:e,actresses:t,blacklist:s,activity:a})}};d(fn,"StatsRepository");var $a=fn;var vn=class vn extends I{constructor(){super(...arguments),this.statsRepository=null}getStatsRepository(){return this.statsRepository||(this.statsRepository=new $a({storage:storageManager,state:this.getRuntimeService("state")}))}getName(){return"StatsPlugin"}async initCss(){return` + `;t.open({type:1,title:"选择 CDN 源",area:utils.getResponsiveArea(["400px","auto"]),content:j,btn:["确定","取消"],success:d((k,x)=>{utils.setupEscClose(x)},"success"),yes:d(async k=>{let x=$('input[name="cdn-source"]:checked').val(),_=parseInt(x,10);_!==this.avatarSourceIndex&&this.avatarSources[_]&&(this.avatarSourceIndex=_,this.getRuntimeService("storage").setLocal(Oc,_.toString()),show.ok(`CDN 源已切换为: ${this.avatarSources[_].name}`)),t.close(k)},"yes")})})()})),utils.setupEscClose(m)},"success"),yes:d(async g=>{let m=s||$(document),f=m.find("#edit-actress-avatar").val().trim(),v=m.find("#edit-actress-name").val().trim(),b=m.find("#edit-actress-allname").val().trim(),w=m.find("#edit-actress-newvideolist").val().trim(),S=m.find("#edit-remark").val().trim(),j=m.find("#actressType").val();if(!v)return show.error("主名称不能为空"),!1;let k=b.split(/[\uff0c,]/).map((_=>_.trim())).filter((_=>_.length>0)),x=w.split(/[\uff0c,]/).map((_=>_.trim())).filter((_=>_.length>0));e.avatar=f,e.name=v,e.allName=k,e.newVideoList=x,e.actressType=j,e.remark=S;try{await storageManager.updateFavoriteActress(e),await V.emit("new-video-changed",{reason:"favorite-actress-edited"}),show.ok(`女优 ${v} 信息已更新`),t.close(g)}catch(_){show.error("修改失败: "+(_.message||_))}},"yes")})}renderPagination(e,t){let s=this.currentPage,a="",r=$("#actress-pagination");if(t===0)return a='共 0 条记录',void r.html(a);s>1&&t>5&&(a+=''),s>1&&(a+=``);let i=Math.max(1,s-Math.floor(2.5)),n=Math.min(t,i+5-1);n-i<4&&(i=Math.max(1,n-5+1));for(let l=i;l<=n;l++)a+=``;s下一页`),s5&&(a+=``),a+=`共 ${e} 条记录 (第 ${s}/${t} 页)`,r.html(a),r.find(".pagination-btn").off("click").on("click",(l=>{if($(l.currentTarget).is("[disabled]"))return;let c=parseInt($(l.currentTarget).data("page"));c>=1&&c<=t&&c!==this.currentPage&&(this.currentPage=c,this.renderActressCards())}))}async searchAvatar(){let e=this.getRuntimeService("dialog"),t=this._editActressRoot||$(document),s=t.find("#edit-actress-name"),a=t.find("#edit-actress-allname"),r=s.val().trim(),i=a.val().trim().split(/[\uff0c,]/).map((p=>p.trim())).filter((p=>p.length>0));if(r&&i.unshift(r),i.length===0)return void show.error("请先填写女优主名称或别名进行搜索。");let n=loading("正在搜索头像..."),l=[];try{let p=this.avatarSources[this.avatarSourceIndex],g=await this.getRuntimeService("scope")();l=p?await this.getRuntimeService("actressInfo").searchAvatars(i,p.id,{scope:g}):[]}catch(p){return void show.error(`头像数据加载或搜索失败: ${p.message||p}`)}finally{n.close()}if(l.length===0)return void show.error(`未找到与 '${i.join("、")}' 相关的头像。请检查名称。`);let c=$('

      ');c.find("#gfriends-prompt").text(`点击图片即可选择(初始共 ${l.length} 张)`);let h=c.find("#gfriends-image-list");l.forEach(((p,g)=>{let m=$('').attr({"data-url":p,"aria-label":`选择第 ${g+1} 张头像`});m.append($('').attr("src",p)),m.append($('载入中')),h.append(m)}));let u=0;e.open({type:1,title:`选择女优头像 (${l.length} 张)`,area:utils.getResponsiveArea(["900px","85%"]),content:c[0],btn:["关闭"],success:d((p,g)=>{let m=$(p),f=m.find(".gfriends-selectable-img"),v=m.find("#gfriends-prompt"),b=m.find(".gfriends-image-item-wrapper");f.each((function(){let w=$(this),S=w.closest(".gfriends-image-item-wrapper"),j=S.find(".gfriends-size-tag");w.on("load",(function(){j.text(`${this.naturalWidth} x ${this.naturalHeight}`)})),w.on("error",(function(){S.remove(),u++;let k=l.length-u;v.text(`点击图片即可选择(已移除 ${u} 张错误图片,剩余 ${k} 张)`),k===0&&(show.error("所有搜索到的头像链接均已失效,无法选择。"),e.close(g))})),this.complete&&(this.naturalWidth>0?w.trigger("load"):w.trigger("error"))})),b.on("click",(function(){let w=$(this),S=w.attr("data-url");t.find("#edit-actress-avatar").val(S),t.find("#edit-avatar-preview").attr("src",S),b.attr("aria-pressed","false"),w.attr("aria-pressed","true"),setTimeout((()=>{e.close(g)}),150)})),utils.setupEscClose(g)},"success")})}};d(un,"NewVideoPlugin");var _a=un;var pn=class pn{constructor(){this.queue=Promise.resolve()}addTask(e){let t=this.queue.then((()=>e()));return this.queue=t.catch((s=>{clog.error("执行异步队列任务失败:",s)})),t}async waitAllFinished(){return this.queue}};d(pn,"StorageQueue");var $a=pn;var gn=class gn extends R{constructor(){super(...arguments),this.singleTaskKey="checkNewActressActorFilterCar",this.taskConfig=null,this.storageQueue=new $a,this.lastCheckFavoriteActressTimeKey="jhs_time_checkFavoriteActress",this.lastCheckBlacklistTimeKey="jhs_time_checkBlacklist",this.lastCheckNewVideoTimeKey="jhs_time_checkNewVideo",this.lastCheckFavoriteActressAttemptKey="jhs_time_checkFavoriteActress_attempt",this.lastCheckFavoriteActressNextKey="jhs_time_checkFavoriteActress_next",this.lastCheckBlacklistAttemptKey="jhs_time_checkBlacklist_attempt",this.lastCheckBlacklistNextKey="jhs_time_checkBlacklist_next",this.lastCheckNewVideoAttemptKey="jhs_time_checkNewVideo_attempt",this.lastCheckNewVideoNextKey="jhs_time_checkNewVideo_next",this.taskTimer=null,this.taskRunning=!1,this.visibilityHandler=null,this.pageHideHandler=null,this.lifecycleScope=null,this.settingsHandler=null,this.taskConfigDirty=!1,this.configLoadPromise=null,this.configLoadQueued=!1,this.configRefreshPromise=null,this.configRefreshQueued=!1,this.activeTasks=new Set}getName(){return"TaskPlugin"}getStartupMode(){return"idle"}async limitConcurrency(e,t,s,a){let r=0,i=!1,n=Math.max(1,Math.min(t,e.length)),l=Array.from({length:n},(async()=>{for(;!i;){let u=r++;if(u>=e.length)return;try{await a(e[u])}catch(g){throw this.isNetworkBlocked(g)&&(i=!0),g}let p=e.length-r;p>0&&(clog.htmlDebug(`剩余任务数: ${p}`),await utils.sleep(s))}})),c=await Promise.allSettled(l),h=c.find(u=>u.status==="rejected");if(h)throw h.reason}isNetworkBlocked(e){return["CF_BLOCKED","CIRCUIT_OPEN","ABORTED"].includes(e?.code)||e?._cfBlocked===!0||e?._circuitBroken===!0}async requestHostPage(e,t){let s=new URL(e),a=t===Ue?"javdb.com":t===Se?"javbus.com":null,i=a&&(s.hostname===a||s.hostname.endsWith(`.${a}`))?{trustClass:"builtin-public",hosts:[a],expectedOrigin:s.origin}:{trustClass:"custom-public",expectedOrigin:s.origin};try{let n=await this.getRuntimeService("http").request({providerId:`host-task:${t}`,method:"GET",url:s.href,responseType:"text",cacheScope:"none",timeout:this.taskConfig?.httpTimeout,retryCount:Math.max(0,(this.taskConfig?.httpRetryCount??1)-1),circuitThreshold:this.taskConfig?.circuitBreakerThreshold,circuitCooldownMs:this.taskConfig?.circuitBreakerCooldown,urlPolicy:i},await this.getRuntimeService("scope")());if(typeof n.data!="string")throw new TypeError("宿主页面响应不是 HTML 文本");return n.data}catch(n){let l=n;throw l._taskNetwork=!0,l}}createTaskResult(e={}){return{attempted:!1,completed:!1,fatal:!1,success:0,networkFailed:0,parseFailed:0,aborted:0,skippedInterval:0,skippedStopped:0,...e}}async runBackgroundTask(e,t){try{return await t()}catch(s){if(this.isNetworkBlocked(s))throw s;return clog.error(`${e}执行失败,继续后续后台任务`,s),this.createTaskResult({attempted:!0,error:s})}}isUnnecessaryCheck(e,t){if(!t)throw new Error("未传入checkIntervalTime");return t=parseInt(String(t)),utils.getHourDifference(new Date(e),new Date)a)}}getTaskStatusSnapshot(e){let t=this.getTaskScheduleState(e),s=Te(this.getRuntimeService("storage").getLocal(t.nextKey)),a=s??(t.pending&&t.attempt!=null?t.attempt+3e5:0),r=Date.now(),i="idle";return this.activeTasks.has(e)?i="running":t.pending&&r=a)&&(i="due"),{name:e,state:i,completedAt:t.completed,attemptAt:t.attempt,nextAt:a,isPending:t.pending,pendingUntil:t.pending?a:null}}async emitTaskStatus(e,t){try{await globalThis.jhsEventBus?.emit?.("task-status-changed",{taskName:e,phase:t},{broadcast:!1})}catch(s){clog.error(`任务状态通知失败: ${e}/${t}`,s)}}async emitNewVideoChanged(e,t=[]){try{await globalThis.jhsEventBus?.emit?.("new-video-changed",{reason:e,carNums:t.map(C).filter(Boolean)})}catch(s){clog.error("新作品状态通知失败",s)}}async withActiveTask(e,t){this.activeTasks.add(e);try{return await this.emitTaskStatus(e,"started"),await t()}finally{this.activeTasks.delete(e),await this.emitTaskStatus(e,"finished")}}async getLatestTaskInterval(e){let t=this.getTaskSchedule(e);return storageManager._invalidateCache?.(storageManager.setting_key),ae(await storageManager.getSetting(t.intervalSetting,t.defaultInterval),t.defaultInterval,{min:Number.EPSILON})}async shouldStartTask(e,t=!1){if(t)return!0;let s=this.getRuntimeService("storage"),a=this.getTaskSchedule(e),r=await this.getLatestTaskInterval(e),i=Te(s.getLocal(a.completedKey)),n=Te(s.getLocal(a.attemptKey)),l=Te(s.getLocal(a.nextKey));return l==null&&(l=n!=null&&(i==null||n>i)?n+3e5:i==null?0:i+36e5*r,s.setLocal(a.nextKey,String(l))),Date.now()>=l}beginTaskAttempt(e){let t=this.getRuntimeService("storage"),s=this.getTaskSchedule(e),a=Te(t.getLocal(s.completedKey)),r=Math.floor(Date.now()/1e3)*1e3,i=a==null?r:Math.max(r,a+1e3);return t.setLocal(s.attemptKey,String(i)),t.setLocal(s.nextKey,String(i+3e5)),i}async finalizeTask(e,t){let s=this.getRuntimeService("storage"),a=this.getTaskSchedule(e);if(!t)return s.setLocal(a.nextKey,String(Date.now()+3e5));let r=Te(s.getLocal(a.attemptKey))||0,i=Math.max(Math.floor(Date.now()/1e3)*1e3,r),n=await this.getLatestTaskInterval(e);s.setLocal(a.completedKey,utils.getNowStr("-",":",i)),s.setLocal(a.nextKey,String(i+36e5*n))}async recalculateSchedules(){await this.loadConfig();for(let[e,t]of[["blacklist",this.taskConfig.checkBlacklist_intervalTime],["favoriteActress",this.taskConfig.checkFavoriteActress_IntervalTime],["newVideo",this.taskConfig.checkNewVideo_intervalTime]]){let s=this.getTaskScheduleState(e);s.pending||this.getRuntimeService("storage").setLocal(s.nextKey,String(s.completed==null?Date.now():s.completed+36e5*t))}}async invalidateConfig(e=!1){if(this.taskConfigDirty=!0,!!e)return this.configRefreshPromise?(this.configRefreshQueued=!0,this.configRefreshPromise):(this.configRefreshPromise=(async()=>{do this.configRefreshQueued=!1,await this.recalculateSchedules();while(this.configRefreshQueued)})().finally((()=>{this.configRefreshPromise=null})),this.configRefreshPromise)}async handle(){if(window.isListPage)return this.lifecycleScope||(this.lifecycleScope=await this.getRuntimeService("scope")()),this.visibilityHandler||(this.visibilityHandler=()=>{document.hidden?this.clearSchedule():this.scheduleTask(0)},this.pageHideHandler=()=>this.clearSchedule(),this.lifecycleScope.listen(document,"visibilitychange",this.visibilityHandler),this.lifecycleScope.listen(window,"pagehide",this.pageHideHandler),this.lifecycleScope.addCleanup((()=>this.clearSchedule()))),this.settingsHandler||(this.settingsHandler=async()=>{try{storageManager._invalidateCache?.(storageManager.setting_key),await this.invalidateConfig(!0),this.scheduleTask(0)}catch(e){clog.error("任务设置刷新失败",e)}},this.lifecycleScope.addCleanup(globalThis.jhsEventBus?.on?.("settings-changed",this.settingsHandler)||(()=>{}))),document.hidden?void 0:this.runAndSchedule()}clearSchedule(){this.taskTimer&&(clearTimeout(this.taskTimer),this.taskTimer=null)}scheduleTask(e=3e5){if(!window.isListPage||document.hidden)return void this.clearSchedule();this.clearSchedule(),this.taskTimer=setTimeout((()=>{this.taskTimer=null,this.runAndSchedule()}),e)}async runAndSchedule(){if(!(this.taskRunning||!window.isListPage||document.hidden)){this.taskRunning=!0;try{await this.doTask()}finally{this.taskRunning=!1,this.scheduleTask()}}}async doTask(){if(window.isListPage)return await this.loadConfig(),this.javDbUrl=await this.getConfiguredSiteOrigin("javDbBtn"),navigator.locks.request(this.singleTaskKey,{ifAvailable:!0},(async e=>{e?window.isListPage&&(this.taskConfig.enableCheckBlacklist===E?await this.runBackgroundTask("黑名单整批检测",(()=>this.checkBlacklist())):clog.warn("自动检测屏蔽黑名单-禁用"),!B)&&(this.taskConfig.enableCheckFavoriteActress===E?$('a[href*="/users/profile"]').length>0?await this.runBackgroundTask("演员收藏同步",(()=>this.checkFavoriteActress())):clog.debug("未登录 JavDB,跳过自动同步演员"):clog.warn("自动同步已收藏的演员-禁用"),this.taskConfig.enableCheckNewVideo===E?await this.runBackgroundTask("新作品整批检测",(()=>this.checkNewVideo())):clog.warn("自动检测已收藏演员的最新作品-禁用")):clog.debug("争夺任务锁失败, 跳过执行")})).catch((e=>{this.isNetworkBlocked(e)?clog.warn(`后台检测已停止: ${e.message}`):clog.error("锁任务出现错误:",e)}))}async loadConfig(){return this.configLoadPromise?(this.configLoadQueued=!0,this.configLoadPromise):(this.configLoadPromise=(async()=>{do{this.configLoadQueued=!1;let e=await storageManager.getSetting(),t={checkConcurrencyCount:ae(e.checkConcurrencyCount,2,{min:2,max:5}),checkRequestSleep:ae(e.checkRequestSleep,100,{min:0,max:3e3}),enableCheckBlacklist:e.enableCheckBlacklist||E,checkBlacklist_intervalTime:ae(e.checkBlacklist_intervalTime,12,{min:Number.EPSILON}),checkBlacklist_ruleTime:ae(e.checkBlacklist_ruleTime,8760,{min:0}),enableCheckFavoriteActress:e.enableCheckFavoriteActress||E,checkFavoriteActress_IntervalTime:ae(e.checkFavoriteActress_IntervalTime,24,{min:Number.EPSILON}),enableCheckNewVideo:e.enableCheckNewVideo||E,checkNewVideo_intervalTime:ae(e.checkNewVideo_intervalTime,12,{min:Number.EPSILON}),checkNewVideo_ruleTime:ae(e.checkNewVideo_ruleTime,8760,{min:0}),httpTimeout:ae(e.httpTimeout,5e3,{min:1e3,max:12e4}),httpRetryCount:ae(e.httpRetryCount,3,{min:0,max:5}),circuitBreakerThreshold:ae(e.circuitBreakerThreshold,3,{min:1,max:20}),circuitBreakerCooldown:ae(e.circuitBreakerCooldown,6e4,{min:1e3,max:36e5})};this.taskConfig=t,this.taskConfigDirty=!1}while(this.configLoadQueued||this.taskConfigDirty);return this.taskConfig})().finally((()=>{this.configLoadPromise=null})),this.configLoadPromise)}async ensureReady(){if((!this.taskConfig||this.taskConfigDirty)&&await this.loadConfig(),this.javDbUrl||(this.javDbUrl=await this.getConfiguredSiteOrigin("javDbBtn")),!this.javDbUrl)throw new Error("JavDB 地址未配置")}async getConfiguredSiteOrigin(e){return this.getRuntimeService("movie").externalSiteOrigin(e,await storageManager.getSetting())}async resolveBlacklistSite(e){try{let t=new URL(e),[s,a]=await Promise.all([this.getConfiguredSiteOrigin("javDbBtn"),this.getConfiguredSiteOrigin("javBusBtn")]);for(let[i,n]of[[s,Ue],[a,Se]])try{if(i&&t.hostname===new URL(i).hostname)return n}catch(l){clog.warn(`忽略无效的站点配置: ${i}`,l)}let{site:r}=$t(e);return[Ue,Se].includes(r)?r:null}catch{return null}}async checkBlacklist(e=!1){let t=this.createTaskResult({skippedHost:0}),s=this.getOptionalDependency("BlacklistPlugin");return s?(await this.ensureReady(),await this.shouldStartTask("blacklist",e)?(this.beginTaskAttempt("blacklist"),t.attempted=!0,this.withActiveTask("blacklist",async()=>{let a=null,r=!1;try{let i=await storageManager.getBlacklist();i=i.sort(((m,f)=>m.createTimef.createTime?-1:0));let n=this.taskConfig.checkConcurrencyCount,l=this.taskConfig.checkRequestSleep,c=this.taskConfig.checkBlacklist_intervalTime,h=this.taskConfig.checkBlacklist_ruleTime,u=[],p=new URL(window.location.href).hostname;for(let m of i){let f;try{f=new URL(m.url)}catch(v){t.parseFailed++,clog.error("黑名单地址无效:",m.url,v);continue}if(p!==f.hostname){t.skippedHost++;continue}if(!e&&m.checkTime&&this.isUnnecessaryCheck(m.checkTime,c))t.skippedInterval++;else if(ft(m.lastPublishTime,h))t.skippedStopped++;else{let v=await this.resolveBlacklistSite(f.href);v?u.push({item:m,site:v}):(t.parseFailed++,clog.error(`不支持的黑名单来源站点: ${f.hostname}`))}}clog.html(`检测屏蔽黑名单, 总任务数: ${u.length}, 并发限制:${n}, 请求间隔时间:${l}ms`);try{await this.limitConcurrency(u,n,l,(async m=>{let{item:f,site:v}=m,{starId:b,name:w,url:S}=f,j;try{clog.log("正在检屏黑名单演员:",w,S),$("#checkBlacklistMsg").text(`正在检屏黑名单演员: ${w} ${S}`),j=await this.requestHostPage(S,v)}catch(k){if(t.networkFailed++,this.isNetworkBlocked(k))throw k;return void clog.error("检测屏蔽演员网络错误:",S,k)}try{let k=utils.htmlTo$dom(j);await this.storageQueue.addTask((async()=>{let x=await s.parseAndSaveFilterInfo(k,w,b,v);await storageManager.updateBlacklistItem({starId:b,name:w,checkTime:utils.getNowStr(),lastPublishTime:x.lastPublishTime})})),t.success++}catch(k){t.parseFailed++,clog.error("解析或保存黑名单演员失败:",S,k)}})),await this.storageQueue.waitAllFinished()}catch(m){if(!this.isNetworkBlocked(m))throw m;a=m,t.aborted=Math.max(0,u.length-t.success-t.parseFailed-t.networkFailed)}let g=t.parseFailed+t.networkFailed+t.aborted===0;t.completed=g,t.fatal=!!a,await this.finalizeTask("blacklist",g),r=!0,this.renderBlacklistResult(t,g);try{await s.resetBtnTip()}catch(m){clog.error("刷新黑名单检测提示失败",m)}if(a)throw a;return t}catch(i){if(r||await this.finalizeTask("blacklist",!1),t.completed=!1,t.fatal=this.isNetworkBlocked(i),t.fatal)throw i;return t.parseFailed++,clog.error("黑名单整批检测失败",i),t}})):(clog.debug("检测黑名单未到整批执行时间"),t)):(clog.warn("黑名单功能已禁用,跳过自动检测"),t)}renderBlacklistResult(e,t){let s=t?"":",5 分钟后补偿未完成项",a=`黑名单整批检测:成功 ${e.success},解析/存储失败 ${e.parseFailed},网络失败 ${e.networkFailed},停更跳过 ${e.skippedStopped},间隔跳过 ${e.skippedInterval},异站跳过 ${e.skippedHost}${e.aborted?`,未执行 ${e.aborted}`:""}${s}`;$("#checkBlacklistMsg").text(a),clog.log(a)}async checkFavoriteActress(e=!1){await this.ensureReady();let t=this.createTaskResult({pages:0,actorCount:0});return await this.shouldStartTask("favoriteActress",e)?(this.beginTaskAttempt("favoriteActress"),t.attempted=!0,this.withActiveTask("favoriteActress",async()=>{try{let s=[],a=await this.scrapeActorInfo(`${this.javDbUrl}/users/collection_actors`,s);return s.length>0&&await storageManager.addFavoriteActressList(s),t.success=s.length,t.actorCount=s.length,t.pages=a.pages,await this.finalizeTask("favoriteActress",!0),t.completed=!0,clog.log("所有演员信息已收集, 总计数量:",s.length),$("#checkNewVideoMsg").text(`完整同步完成:演员 ${s.length},页面 ${a.pages}`),s.length>0&&await this.emitNewVideoChanged("favorite-actress-sync"),t}catch(s){let a=s;if(t.completed=!1,a?._taskNetwork?t.networkFailed++:t.parseFailed++,t.fatal=this.isNetworkBlocked(a),await this.finalizeTask("favoriteActress",!1),$("#checkNewVideoMsg").text("演员同步失败,5 分钟后重试整轮"),clog.error("同步收藏演员失败",a),t.fatal)throw s;return t}})):(clog.debug("同步收藏演员未到整批执行时间"),t)}async scrapeActorInfo(e,t=[]){let s=new URL("/users/collection_actors",this.javDbUrl),a=new Set,r=new URL(e,this.javDbUrl),i=0;for(;r;)try{if(r.origin!==s.origin||r.pathname!==s.pathname)throw new Error(`收藏演员分页地址越界: ${r.href}`);if(a.has(r.href))throw new Error(`收藏演员分页循环: ${r.href}`);if(i>=200)throw new Error("收藏演员分页超过 200 页");a.add(r.href),i++,clog.log(`正在抓取页面: ${r.href}`),$("#checkNewVideoMsg").text(`正在解析已收藏的演员: ${r.href}`);let n=await this.getRuntimeService("actressInfo").collection("javdb",{baseUrl:this.javDbUrl,pageUrl:r.href},{scope:await this.getRuntimeService("scope")()});if(n.state!=="valid")throw Object.assign(new Error(`收藏演员页面无效: ${n.state}`),{_taskParse:!0});if(n.isEmpty&&n.nextUrl)throw Object.assign(new Error("收藏演员空页面包含下一页"),{_taskParse:!0});t.push(...n.actors),r=n.nextUrl?new URL(n.nextUrl,r.href):null}catch(n){let l=["NETWORK_ERROR","TIMEOUT","AUTH_REQUIRED","RATE_LIMITED","CF_BLOCKED","CIRCUIT_OPEN","ABORTED"],c=n;throw l.includes(c?.code)&&(c._taskNetwork=!0),c._taskNetwork||Object.prototype.hasOwnProperty.call(c,"_taskParse")||(c._taskParse=!0),clog.error(`抓取 ${r?.href||e} 时发生错误,停止本轮同步:`,c),c}return{actors:t,pages:i}}async checkNewVideo(e=!1){await this.ensureReady();let t=this.createTaskResult();return await this.shouldStartTask("newVideo",e)?(this.beginTaskAttempt("newVideo"),t.attempted=!0,this.withActiveTask("newVideo",async()=>{let s=null,a=!1;try{let r=await storageManager.getFavoriteActressList(),i=utils.genericSort(r,[{key:d(g=>g.newVideoList?.length??0,"key"),order:"desc"},{key:"lastPublishTime",order:"desc"}]),n=this.taskConfig.checkConcurrencyCount,l=this.taskConfig.checkRequestSleep,c=this.taskConfig.checkNewVideo_intervalTime,h=this.taskConfig.checkNewVideo_ruleTime,u=[];for(let g of i)!e&&g.lastCheckTime&&this.isUnnecessaryCheck(g.lastCheckTime,c)?t.skippedInterval++:ft(g.lastPublishTime,h)?t.skippedStopped++:u.push(g);if(clog.html(`检测最新作品, 总任务数: ${u.length}, 并发限制:${n}, 请求间隔时间:${l}ms`),u.length>0){let g=await storageManager.getTitleFilterKeyword(),m=await storageManager.getBlacklistCarList(),f=new Set(m.map(v=>v.carNum));try{await this.limitConcurrency(u,n,l,(async v=>{let{name:b,starId:w}=v,S=`${this.javDbUrl}/actors/${w}?t=d`;try{clog.log("正在检测最新作品, 演员:",b,S),$("#checkNewVideoMsg").text(`正在检测最新作品, 演员: ${b}`);let j=await this.getRuntimeService("actressInfo").movies("javdb",{actorId:w,baseUrl:this.javDbUrl},{scope:await this.getRuntimeService("scope")(),ttlMs:0});try{await this.storageQueue.addTask((async()=>this.parseActorMovies(j,w,b,g,f))),t.success++}catch(k){t.parseFailed++,clog.error("解析或保存演员作品失败:",S,k)}}catch(j){if(this.isNetworkBlocked(j))throw t.networkFailed++,j;t.networkFailed++,clog.error("检测演员信息发生网络错误:",S,j)}})),await this.storageQueue.waitAllFinished()}catch(v){if(!this.isNetworkBlocked(v))throw v;s=v,t.fatal=!0,t.aborted=Math.max(0,u.length-t.success-t.parseFailed-t.networkFailed),clog.warn(`网络阻断,本轮停止,未执行 ${t.aborted}`)}}let p=t.parseFailed+t.networkFailed+t.aborted===0;if(t.completed=p,await this.finalizeTask("newVideo",p),a=!0,clog.html('检测最新作品---结束'),this.renderCheckResult(t,p?r.length?"整批检测结束":"收藏为空,整批检测完成":"整批检测未完成,5 分钟后补偿未完成项"),t.success>0&&await this.emitNewVideoChanged("task-completed"),s)throw s;return t}catch(r){if(a||await this.finalizeTask("newVideo",!1),t.completed=!1,t.fatal=this.isNetworkBlocked(r),t.fatal)throw r;return t.parseFailed++,this.renderCheckResult(t,"整批检测失败,5 分钟后补偿"),clog.error("新作品整批检测失败",r),t}})):(clog.debug("检测新作品未到整批执行时间"),t)}renderCheckResult(e,t="检测结束"){let s=`${t}:成功 ${e.success},解析/存储失败 ${e.parseFailed},网络失败 ${e.networkFailed},停更跳过 ${e.skippedStopped},间隔跳过 ${e.skippedInterval}${e.aborted?`,未执行 ${e.aborted}`:""}`;$("#checkNewVideoMsg").text(s),clog.log(s)}async parsePage(e,t,s,a,r,i){let n=this.getSelector(t);t===Se&&e.find(".avatar-box").length>0&&e.find(".avatar-box").parent().remove();let l=Ys(e,{boxSelector:t===Se?`${n.boxSelector}, #waterfall`:n.boxSelector,requestDomItemSelector:n.requestDomItemSelector});if(l.state!=="valid")throw clog.error("新作品检测-解析列表失败"),new Error("新作品检测-解析列表失败");let c=l.items,h=e.find(n.nextPageSelector).attr("href");if(c.length===0&&h)throw new Error("新作品检测-空列表包含下一页");if(c.length===0)return await storageManager.updateFavoriteActress({starId:s,lastCheckTime:utils.getNowStr(),newVideoList:[]}),0;let u=[],p=[];for(let w of c){let S=$(w),{carNum:j,url:k,title:x,publishTime:_}=$e(S);_&&p.push(_),j&&(r.find(I=>x.includes(I)||j.includes(I))||i.has(j)||(()=>{let I=S.find("img").attr("src")||"";I&&!I.startsWith("http")&&(I=I.startsWith("/")?this.javDbUrl+I:this.javDbUrl+"/"+I);let L=k||"";L&&!L.startsWith("http")&&(L=L.startsWith("/")?this.javDbUrl+L:this.javDbUrl+"/"+L);let N=S.find(".score .value, .score").text().trim(),A=parseFloat(N)||0,O=N.match(/由(\d+)人/),U=0;if(O)U=parseInt(O[1]);else{let q=S.find(".score .count, .meta .count").text().trim();U=parseInt(q.replace(/[^\d]/g,""))||0}u.push({carNum:j,coverUrl:I,title:x||"",publishTime:_||"",score:A,voteCount:U,url:L})})())}let g=Zt(p),m=await storageManager.getCarMap(),f=await this.getRuntimeService("state")?.getNewVideoDecisions?.()||{},v=u.filter(w=>!m.has(w.carNum)),b=v.filter(w=>f[w.carNum]?.action!=="dismissed");return b.length>0&&clog.html(`检测出新作品, ${T(a)}, 共${b.length}部`),await storageManager.updateFavoriteActress({starId:s,lastCheckTime:utils.getNowStr(),newVideoList:v,lastPublishTime:g}),b.length}async parseActorMovies(e,t,s,a,r){if(!e.length)return await storageManager.updateFavoriteActress({starId:t,lastCheckTime:utils.getNowStr(),newVideoList:[]}),0;let i=e.map(g=>g.publishTime).filter(Boolean),n=e.filter(g=>!g.carNum||r.has(g.carNum)?!1:!a.some(m=>g.title?.includes(m)||g.carNum.includes(m))).map(g=>({carNum:g.carNum,coverUrl:g.coverUrl||"",title:g.title||"",publishTime:g.publishTime||"",score:Number(g.score)||0,voteCount:Number(g.voteCount)||0,url:g.url||""})),l=Zt(i),c=await storageManager.getCarMap(),h=await this.getRuntimeService("state")?.getNewVideoDecisions?.()||{},u=n.filter(g=>!c.has(g.carNum)),p=u.filter(g=>h[g.carNum]?.action!=="dismissed");return p.length>0&&clog.html(`检测出新作品, ${T(s)}, 共${p.length}部`),await storageManager.updateFavoriteActress({starId:t,lastCheckTime:utils.getNowStr(),newVideoList:u,lastPublishTime:l}),p.length}async checkOneNewVideo(e){await this.ensureReady();let t=await storageManager.getTitleFilterKeyword(),s=await storageManager.getBlacklistCarList(),a=new Set(s.map(h=>h.carNum)),{lastCheckTime:r,name:i,starId:n}=e,l=`${this.javDbUrl}/actors/${n}?t=d`,c=$("#checkNewVideoMsg");try{clog.log("正在检测最新作品, 演员:",i,l),c.text(`正在检测最新作品, 演员: ${i}`);let h=await this.getRuntimeService("actressInfo").movies("javdb",{actorId:n,baseUrl:this.javDbUrl},{scope:await this.getRuntimeService("scope")(),ttlMs:0});await this.parseActorMovies(h,n,i,t,a),clog.html('检测最新作品---结束'),c.text("检测完毕"),await this.emitNewVideoChanged("single-actress-check")}catch(h){clog.error("检测屏蔽演员信息, 发生错误:",l,h),show.error("检测屏蔽演员信息, 发生错误:"+h,"bottom","right"),c.text(`检测屏蔽演员信息, 发生错误: ${l}`)}}};d(gn,"TaskPlugin");var Ta=gn;function St(o){if(!window.isDetailPage||typeof o?.getDetailResourceBoundary!="function")return null;let e=o.getDetailResourceBoundary();return e?{...e,hostRoot:$(e.hostRoot),controller:$(e.controller),observeRoot:$(e.observeRoot),resourceRoot:$(e.resourceRoot),resourceRegion:$(e.resourceRegion),sortSelect:$(e.sortSelect),getActionTarget(t){let s=$(e.getActionTarget(t));if(!s.length||!e.actionTargetRequiresWrapper?.(t))return s;let a=s.children(".jhs-offline-actions").first();return a.length||(a=$('').appendTo(s)),a}}:null}d(St,"getDetailResourceAdapter");function Zh(o){if(typeof Ki=="function")return Ki(o);let e=o.explicitContext;if(e?.carNum)return{context:e,source:"explicit"};let t=typeof ha=="function"?ha(o.trigger):null;if(t)return{context:t,source:"owned-surface"};for(let[s,a]of[["list-item",o.listResolver],["native-detail",o.nativeResolver],["legacy-fallback",o.legacyResolver]]){let r=a?.();if(r?.carNum)return{context:r,source:s}}return{context:null,source:"missing"}}d(Zh,"resolveOfflineMovieContext");var fn=class fn{constructor(){this.providers=new Map,this.availabilityCache=new Map,this.unavailableReasons=[],this.positiveTtl=3e5,this.negativeTtl=2e4}register(e){if(!e?.id||!Array.isArray(e.capabilities)||typeof e.submit!="function"||typeof e.getAvailability!="function")throw new TypeError("Invalid offline provider");return this.providers.set(e.id,e),e}async getCandidates(e,{force:t=!1}={}){let s=/^ed2k:/i.test(e)?"ed2k":/^magnet:/i.test(e)?"magnet":"unknown",a=[],r=[];for(let i of this.providers.values()){if(!i.capabilities.includes(s)){r.push(`${i.name}:不支持 ${s==="unknown"?"该资源格式":s.toUpperCase()}`);continue}if(!await i.isEnabled()){r.push(`${i.name}:未启用`);continue}let n=await this.getAvailability(i,t);["ready","unknown"].includes(n.authState)?a.push({provider:i,availability:n}):r.push(`${i.name}:${n.reason||"授权不可用"}`)}return this.unavailableReasons=r,a}getUnavailableReason(){let e=[...this.unavailableReasons];return this.providers.has("123")||e.unshift("123 云盘:授权桥接插件未加载或已禁用"),e.join(";")||"离线服务插件未加载或已禁用"}async getAvailability(e,t=!1){let s=this.availabilityCache.get(e.id),a=s&&["ready","unknown"].includes(s.value.authState)?this.positiveTtl:this.negativeTtl;if(!t&&s&&Date.now()-s.time.jhs-offline-btn.loading{cursor:wait;opacity:.65}.jhs-offline-native{margin-left:6px;padding:3px 8px}"}async handle(){if(!(M||B))return;let e=await this.getRuntimeService("scope")();this.lifecycleScope=e,this.registerProviders(e),this.bindSubmit(),e.addCleanup((()=>$(document).off(".jhsUnifiedOffline"))),window.isDetailPage&&(this.injectNativeButtons(),V&&e.addCleanup(V.on("magnet-items-updated",(()=>this.injectNativeButtons()))))}registerProviders(e){let t=this.getOptionalDependency("OneTwoThreeOfflinePlugin"),s=this.getRuntimeService("offline");t&&this.registry.register({id:"123",name:"123 云盘",capabilities:["magnet"],retryPolicy:{automaticAttempts:0},isEnabled:d(async()=>be(this.getRuntimeService("settings").snapshot().enable123Offline??!0,!1),"isEnabled"),getAvailability:d(async()=>await t.getStoredToken()?{available:!0,authState:"ready",reason:"授权已同步"}:{available:!1,authState:"token-missing",reason:"尚未同步 123 授权"},"getAvailability"),submit:d(async(a,r,i={})=>{let n=await t.getStoredToken();if(e?.disposed||i.isActive?.()===!1)throw Object.assign(new Error("所属界面已关闭,未提交任务"),{code:"SUBMIT_CANCELLED"});if(!be(this.getRuntimeService("settings").snapshot().enable123Offline??!0,!1))throw Object.assign(new Error("123 离线服务已关闭,未提交任务"),{code:"SERVICE_DISABLED"});if(!n)throw Object.assign(new Error("尚未同步 123 授权"),{code:"TOKEN_MISSING"});return s.submitWithIntegration("pan123",a,{token:n,scope:e})},"submit"),openUrl:d(()=>s.getIntegrationHomeUrl("pan123"),"openUrl")}),this.registry.register({id:"115",name:"115",capabilities:["magnet","ed2k"],retryPolicy:{automaticAttempts:0},isEnabled:d(async()=>be(this.getRuntimeService("settings").snapshot().enable115Offline??!1,!1),"isEnabled"),getAvailability:d(async()=>({available:!0,authState:"unknown",reason:"提交时确认登录状态"}),"getAvailability"),submit:d(a=>s.submitWithIntegration("one115",a,{scope:e}),"submit"),openUrl:d(()=>s.getIntegrationHomeUrl("one115"),"openUrl")}),window.offlineProviderRegistry=this.registry}bindSubmit(){$(document).off("click.jhsUnifiedOffline",".jhs-offline-btn").on("click.jhsUnifiedOffline",".jhs-offline-btn",(async e=>{e.preventDefault(),e.stopPropagation();let t=$(e.currentTarget),s=t.attr("data-resource")||t.attr("data-magnet")||t.closest(".magnet-result,.item,td").find('a[href^="magnet:"],a[href^="ed2k:"]').first().attr("href");s?await this.submitResource(e,s,t):show.error("未找到可提交资源")}))}injectNativeButtons(){let e=St(this.getRuntimeService("host"));e&&e.rows().forEach((t=>{let s=e.getResource(t),a=e.getActionTarget(t);if(!s||!a?.length||$(t).closest(".magnet-container,.jhs-review-panel,.movie-detail-container").length)return;let r=`native-${e.site}`,i=$(t).find(`.jhs-offline-btn[data-jhs-offline-owner="${r}"]`).first();$(t).find(`.jhs-offline-btn[data-jhs-offline-owner="${r}"]`).not(i).remove(),i.length||(i=$('').attr("data-jhs-offline-owner",r)),i.attr("data-resource",s),a.append(i)}))}async chooseCandidate(e,t){if(t.length===1)return t[0];let s=await storageManager.getSetting("offlineProviderMode","ask"),a=t.find((r=>r.provider.id===s));return a||new Promise((r=>{let i=this.getRuntimeService("dialog"),n=$('

      选择离线服务

      '),l=n.find(".jhs-toolbar");t.forEach((h=>l.append($('').text(`${h.provider.name} · ${h.availability.authState==="ready"?"已就绪":"状态未知"}`).on("click",(()=>{r(h),i.close(c)})))));let c=i.open({type:1,title:"选择离线服务",content:n,area:utils.getDialogArea("sm"),cancel:d(()=>r(null),"cancel"),end:d(()=>r(null),"end")})}))}getVideoInfo(e,t=null){let s=e?.[0]||e,a=this.getRuntimeService("host")?.locateListItems?.().find(i=>s&&i.contains(s));return Zh({explicitContext:t,trigger:e,listResolver:d(()=>a?$e(a):null,"listResolver"),nativeResolver:d(()=>window.isDetailPage?this.getPageInfo():null,"nativeResolver"),legacyResolver:d(()=>this.getPageInfo?.(),"legacyResolver"),logger:d(i=>clog.warn(i),"logger")}).context}async markDownloadedAndClose(e,t){if(!e?.carNum)return!1;try{let s=this.getRuntimeService("state");await s.patch(e.carNum,{downloaded:!0},{type:"offline-mark-downloaded",record:{...e,names:e.actress||e.names||""}});let a=await s.getState?.(e.carNum);if(a&&a.stateFlags?.downloaded!==!0)throw new Error("状态回读未确认已下载")}catch(s){return clog.error("离线任务标记已下载失败",s),show.error("离线已提交,但标记已下载失败"),!1}try{let s=this.getRuntimeService("settings").snapshot().needClosePage??"yes";if(s!=="yes"&&s!==!0)return!0;if(!await utils.closePage(t))throw new Error("未找到可关闭的详情页");return!0}catch(s){return clog.error("离线任务完成后关闭详情页失败",s),show.error("已标记下载,但无法自动关闭"),!1}}async submitResource(e,t,s=$(),a=null,r=null,i={}){if(this.lifecycleScope?.disposed||s.hasClass("loading"))return;let n=s.text(),l=s[0]||e?.currentTarget,c=!!l?.isConnected,h=d(()=>{s.removeClass("loading").removeAttr("aria-busy aria-disabled").text(n)},"restoreButton"),u=!1,p=null,g=null;try{s.addClass("loading").attr({"aria-busy":"true","aria-disabled":"true"}).text("提交中");let m=await this.registry.getCandidates(t,{force:!!i.forceAvailabilityRefresh});if(!m.length&&!i.forceAvailabilityRefresh&&!this.lifecycleScope?.disposed&&(!c||l.isConnected)&&(m=await this.registry.getCandidates(t,{force:!0})),!m.length)return void show.error(`无法离线:${this.registry.getUnavailableReason?.()||"没有已启用且支持该资源的离线服务,请检查授权与设置"}`);if(this.lifecycleScope?.disposed||c&&!l.isConnected||(p=m.find((b=>b.provider.id===i.preferredProviderId))||await this.chooseCandidate(e,m),!p))return;if(!await p.provider.isEnabled())return void show.error("所选离线服务已关闭,未提交任务");if(this.lifecycleScope?.disposed||c&&!l.isConnected)return;g=this.getVideoInfo(s,a);let f=l||null;if(!g)return void show.error("无法确定影片身份,未执行离线操作");let v={root:f,layerIndex:utils.getOwningLayerIndex({root:f})};s.text("提交中"),await p.provider.submit(t,g,{isActive:d(()=>!this.lifecycleScope?.disposed&&(!c||l.isConnected),"isActive")}),u=!0,this.registry.updateAvailability(p.provider.id,{available:!0,authState:"ready",reason:"最近提交成功"});try{await this.getRuntimeService("state").appendOfflineHistory({providerId:p.provider.id,providerName:p.provider.name,resource:t,resourceType:/^ed2k:/i.test(t)?"ed2k":"magnet",carNum:g?.carNum,status:"submitted",retryOf:r})}catch(b){clog.error("离线任务已创建,但本地记录保存失败",b),show.error("任务已创建,但本地记录保存失败,请勿重复提交")}(!c||l.isConnected)&&(s.text("已提交"),show.ok(`${p.provider.name} 离线任务已创建`),utils.q(e,"是否将该作品标记为已下载?",(()=>{this.markDownloadedAndClose(g,v)})))}catch(m){if(u){clog.error("离线任务已创建,后续界面更新失败",m);return}let f=m,v=f?.code||(m==="TOKEN_EXPIRED"?"TOKEN_EXPIRED":"SUBMIT_FAILED"),b=f?.message||String(m);if(v==="SUBMIT_CANCELLED")return;if(v==="SERVICE_DISABLED")return void show.error(b);if(p){["AUTH_REQUIRED","LOGIN_REQUIRED","TOKEN_EXPIRED","TOKEN_MISSING"].includes(v)&&this.registry.updateAvailability(p.provider.id,{available:!1,authState:p.provider.id==="115"?"login-required":"token-missing",reason:b});try{await this.getRuntimeService("state").appendOfflineHistory({providerId:p.provider.id,providerName:p.provider.name,resource:t,resourceType:/^ed2k:/i.test(t)?"ed2k":"magnet",carNum:g?.carNum,status:"failed",errorCode:v,errorMessage:b,retryOf:r})}catch(w){clog.error("离线失败记录保存失败",w)}}show.error(`${p?.provider.name||""} 离线失败:${b}`)}finally{u?setTimeout(h,this.BUTTON_COOLDOWN_MS):h()}}};d(vn,"UnifiedOfflinePlugin");var Aa=vn;function bn(o){return C(o)?.replace(/^FC2-/i,"")||null}d(bn,"normalize115Keyword");function wn(o){let e=Number(o)||0;if(!e)return"0 B";let t=["B","KB","MB","GB","TB"],s=Math.min(t.length-1,Math.floor(Math.log(e)/Math.log(1024)));return`${(e/1024**s).toFixed(s?2:0)} ${t[s]}`}d(wn,"format115Size");function Uc(o,e,t={}){let s=o.match(/\.[^.]+$/)?.[0]||"",a=o.match(/-(?:U|UC|C|4K|8K|H265|HEVC|CN|CHS|CHT)\b/gi)||[],r=t.uppercase===!1?e:e.toUpperCase();return t.keepTitle&&(r+=` ${o.replace(s,"").replace(/^.*?\s+/,"")}`),t.keepSuffix!==!1&&(r+=[...new Set(a.map((i=>i.toUpperCase())))].join("")),`${r.slice(0,t.maxLength||180)}${s}`}d(Uc,"preview115Rename");var yn=class yn extends R{constructor(){super(),this.observer=null,this.unsubscribeItems=null,this.pendingCards=new Set,this.flushTimer=null,this.lifecycleScope=null,this.concurrency=4,this.cacheMinutes=60}getName(){return"OneOneFiveMatchPlugin"}async handle(){this.parentScope=await this.getRuntimeService("scope")();let e=this.getRuntimeService("settings");this.parentScope.listen(e,"settings.changed",t=>{t.detail?.names?.some(s=>["enable115Match","oneOneFiveConcurrency","oneOneFiveCacheMinutes"].includes(s))&&this.configureMatching().catch(s=>clog.error("115 匹配设置更新失败",s))}),this.parentScope.addCleanup(()=>{this.matchGeneration++,this.stopMatching()}),await this.configureMatching()}async configureMatching(){let e=this.matchGeneration=(this.matchGeneration||0)+1;if(this.stopMatching(),!be(this.getRuntimeService("settings").snapshot().enable115Match,!1)||this.parentScope.disposed||e!==this.matchGeneration)return;let s=this.lifecycleScope=new te(`115-match:${e}`);this.releaseMatchScope=this.parentScope.addCleanup(()=>s.dispose()),await this.mountMatching(s)}stopMatching(){this.releaseMatchScope?.(),this.releaseMatchScope=null,this.lifecycleScope?.dispose(),this.lifecycleScope=null,this.unsubscribeItems?.(),this.unsubscribeItems=null,this.observer?.disconnect(),this.observer=null,this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=null,this.pendingCards.clear(),$(".jhs-115-match,.jhs-115-list-match").remove(),$("[data-jhs115-observed],[data-jhs115-state]").removeAttr("data-jhs115-observed data-jhs115-state")}async mountMatching(e){let t=this.getRuntimeService("host"),s=this.getRuntimeService("offline");if(!isDetailPage){if(await this.setupListMatching(t,e),e.disposed)return;e.ownObserver(this.observer),e.addCleanup((()=>{this.unsubscribeItems?.(),this.unsubscribeItems=null,this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=null,this.pendingCards.clear()}));return}let a=this.getPageInfo().carNum,r=bn(a);if(!r)return;$(t.locateDetailSlots().summary).append('
      115匹配:匹配中
      ');try{let n=Math.max(1,Number(this.getRuntimeService("settings").snapshot().oneOneFiveCacheMinutes??60)||60);if(e.disposed||this.lifecycleScope!==e)return;let l=await s.searchFiles("one115",r,{scope:e,ttlMs:n*6e4});if(e.disposed||this.lifecycleScope!==e)return;let c=$(".jhs-115-match").empty().append("115匹配:");if(!l.length)return void c.append(document.createTextNode("未匹配 "),$('').on("click",(()=>location.reload())));l.forEach((h=>{let u=$(''),p=s.getPlayUrl("one115",h);p?u.append($("").addClass("jhs-btn jhs-btn--secondary").attr({href:p,target:"_blank"}).text(`${h.name} (${wn(h.size)})`)):u.append($("").text(`${h.name} (${wn(h.size)}) · 不可播放`)),h.fileId&&u.append($('').data("match",h)),c.append(u)})),c.on("click",".jhs-115-rename",(h=>this.renameWithPreview(h,$(h.currentTarget).data("match"),a)))}catch(n){if(e.disposed||this.lifecycleScope!==e)return;$(".jhs-115-match").empty().append("115匹配:",document.createTextNode("未登录或请求失败 ")).append($("").addClass("jhs-btn jhs-btn--ghost").attr({href:s.getIntegrationHomeUrl("one115"),target:"_blank"}).text("去登录"),$('').on("click",(()=>location.reload()))),clog.error("115 匹配失败",n)}}async setupListMatching(e,t){if(!V)throw new Error("JHS EventBus 尚未初始化");this.concurrency=Math.max(1,Math.min(10,Number(this.getRuntimeService("settings").snapshot().oneOneFiveConcurrency??4)||4)),this.cacheMinutes=Math.max(1,Number(this.getRuntimeService("settings").snapshot().oneOneFiveCacheMinutes??60)||60),!(t.disposed||this.lifecycleScope!==t)&&(this.observer=new IntersectionObserver((s=>{t.disposed||this.lifecycleScope!==t||(s.forEach((a=>a.isIntersecting&&(this.observer.unobserve(a.target),this.pendingCards.add(a.target)))),this.pendingCards.size&&this.scheduleFlush())}),{rootMargin:"200px"}),this.registerCards($(e.locateListRoot()).find(".item").get()),this.unsubscribeItems=V.on("list-items-added",(s=>this.registerCards(s.items||[]))))}registerCards(e){e.forEach((t=>{t.dataset.jhs115Observed!=="true"&&t.dataset.jhs115State!=="matched"&&(t.dataset.jhs115Observed="true",this.observer?.observe(t))}))}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout((async()=>{let e=[...this.pendingCards],t=this.lifecycleScope;this.pendingCards.clear(),this.flushTimer=null,await Ae(e,this.concurrency,(s=>t&&!t.disposed&&this.lifecycleScope===t?this.matchCard(s):void 0))}),50))}async matchCard(e,t=!1){let s=this.lifecycleScope;if(!s||s.disposed)return;let a=$(e),r=C(a.find(".video-title strong").first().text());if(!(!r||e.dataset.jhs115State==="pending"))try{e.dataset.jhs115State="pending";let i=this.getRuntimeService("offline"),n=await i.searchFiles("one115",bn(r),{scope:s,ttlMs:this.cacheMinutes*6e4,force:t});if(s.disposed||this.lifecycleScope!==s||!e.isConnected)return;a.find(".jhs-115-list-match").remove();let l=$('').text(n.length?`匹配${n.length}个`:"未匹配").data("matches",n);a.find(".video-title").first().prepend(l),e.dataset.jhs115State="matched",l.on("click",(c=>{if(c.preventDefault(),c.stopPropagation(),s.disposed)return;if(!n.length)return this.matchCard(e,!0);if(n.length===1)return window.open(i.getPlayUrl("one115",n[0]),"_blank");let h=n.map((u=>`${T(u.name)}`)).join("
      ");this.getRuntimeService("dialog").open({type:1,title:`${r} 115匹配`,content:`
      ${h}
      `,area:utils.getResponsiveArea(["560px","auto"])})}))}catch(i){if(s.disposed||this.lifecycleScope!==s||!e.isConnected)return;e.dataset.jhs115State="failed",a.find(".jhs-115-list-match").remove(),a.find(".video-title").first().prepend($('').on("click",(n=>{n.preventDefault(),n.stopPropagation(),s.disposed||this.matchCard(e,!0)}))),clog.warn("115 单卡匹配失败",i)}}destroy(){this.matchGeneration=(this.matchGeneration||0)+1,this.stopMatching()}renameWithPreview(e,t,s){let a=Uc(t.name,s,{uppercase:!0,keepSuffix:!0});utils.q(e,`确认重命名?
      ${T(t.name)}
      → ${T(a)}`,(async()=>{try{await this.getRuntimeService("offline").renameFile("one115",t.fileId,a,{scope:this.lifecycleScope}),show.ok("重命名完成")}catch(r){clog.error("115 重命名失败",r),show.error("重命名失败:"+(r instanceof Error?r.message:String(r)))}}))}};d(yn,"OneOneFiveMatchPlugin");var Pa=yn;var jn=class jn extends R{constructor(){super(...arguments),this.tokenKey="jhs_123pan_author_token",this.tokenMetaKey="jhs_123pan_author_token_meta",this.syncTimer=null,this.syncFallbackMs=3e5,this.syncGeneration=0}getName(){return"OneTwoThreeOfflinePlugin"}async handle(){window.location.hostname==="yun.123pan.com"&&this.startTokenSync(await this.getRuntimeService("scope")())}startTokenSync(e){this.syncTokenOnce(),this.syncTimer&&clearInterval(this.syncTimer),this.syncTimer=setInterval((()=>this.syncTokenOnce()),this.syncFallbackMs);let t=d(()=>this.syncTokenOnce(),"e");e.addCleanup((()=>{this.syncTimer&&clearInterval(this.syncTimer),this.syncTimer=null})),e.listen(window,"storage",t),e.listen(window,"focus",t),e.listen(document,"visibilitychange",(()=>{document.hidden||this.syncTokenOnce()}))}getTokenFrom123Pan(){let e=this.getRuntimeService("storage"),t=(e.getLocal("authorToken")||"").trim();if(t)return{token:t,source:"authorToken"};try{let a=JSON.parse(e.getLocal("userInfo")||"{}");if(a.authorToken||a.token)return{token:(a.authorToken||a.token||"").trim(),source:a.authorToken?"userInfo.authorToken":"userInfo.token"}}catch(a){clog.debug("123 云盘历史用户信息解析失败,继续尝试其他凭证来源",a)}let s=document.cookie.split(";");for(let a of s){let r=a.indexOf("=");if(r<0)continue;let i=a.substring(0,r).trim(),n=a.substring(r+1);if(i&&/token/i.test(i)&&n)return{token:decodeURIComponent(n).trim(),source:`cookie.${i}`}}return{token:"",source:""}}async syncTokenOnce(){let e=++this.syncGeneration,t=this.getRuntimeService("storage"),s=this.getTokenFrom123Pan();if(!s.token)return;let a=`${this.tokenKey}_secret`,r=t.getValue(a,"");r||(r=crypto.randomUUID?.()||`${Date.now()}-${crypto.getRandomValues(new Uint32Array(4)).join("-")}`,t.setValue(a,r));let i=t.getValue(this.tokenKey,""),n=await this.getStoredToken(),l=t.getValue(this.tokenMetaKey,null);if(n===s.token&&i.startsWith("AES:")&&l&&l.source===s.source)return;let c="AES:"+await ts(s.token,r),h=this.getTokenFrom123Pan();e!==this.syncGeneration||h.token!==s.token||h.source!==s.source||t.getValue(this.tokenKey,"")!==i||t.getValue(a,"")!==r||(t.setValue(this.tokenKey,c),t.setValue(this.tokenMetaKey,{source:s.source,updatedAt:new Date().toISOString()}),n!==s.token&&show.info(`123 云盘授权已更新:${s.source}`))}async getStoredToken(){let e=this.getRuntimeService("storage"),t=e.getValue(this.tokenKey,""),s=e.getValue(`${this.tokenKey}_secret`,"");if(typeof t!="string")return"";if(!t.startsWith("AES:"))return t;if(typeof s!="string"||!s)return"";try{return await tt(t.slice(4),s,!1)}catch{return""}}clearStoredToken(e){this.syncGeneration++;let t=this.getRuntimeService("storage");t.setValue(this.tokenKey,""),t.setValue(this.tokenMetaKey,{source:"cleared",reason:e,updatedAt:new Date().toISOString()})}};d(jn,"OneTwoThreeOfflinePlugin");var Ra=jn;function zc(o){let e=0,t=0,s=0,a=0,r=0,i=0,n=0,l=0,c=0;for(let u of o??[]){let p=H(u?.stateFlags);e++;let g=p.blocked===!0;g&&t++;let m=!g;p.favorite&&(s++,m&&a++),p.downloaded&&(r++,m&&i++),p.watched&&(n++,m&&l++),!oe(p)&&c++}let h=e-t;return Object.freeze({total:e,blocked:t,unblocked:h,favoriteRaw:s,favoriteEffective:a,downloadedRaw:r,downloadedEffective:i,watchedRaw:n,watchedEffective:l,pending:c})}d(zc,"computeLibraryStats");var Sn=class Sn{constructor(e){this.storage=e.storage,this.state=e.state}async loadLibrarySnapshot(){let[e,t,s,a]=await Promise.all([this.storage.getCarList(),this.storage.getFavoriteActressList(),this.storage.getBlacklist(),this.state.getActivityLog()]);return Object.freeze({cars:e,actresses:t,blacklist:s,activity:a})}};d(Sn,"StatsRepository");var Ia=Sn;var xn=class xn extends R{constructor(){super(...arguments),this.statsRepository=null}getStatsRepository(){return this.statsRepository||(this.statsRepository=new Ia({storage:storageManager,state:this.getRuntimeService("state")}))}getName(){return"StatsPlugin"}async initCss(){return` `}async handle(){window.isListPage&&this.createBtn()}createBtn(){$("#newVideoBtn").after(''),$("#statsBtn").on("click",(()=>this.openDialog()))}async openDialog(){let e=this.getRuntimeService("diagnostics").exportSnapshot(),{cars:t,actresses:s,blacklist:a,activity:r}=await this.getStatsRepository().loadLibrarySnapshot(),i=Ec(t),n=i.total,l=new Map;t.forEach((A=>{let O=String(A.names||"").replace(/([一-鿿])\s+(?=[一-鿿])/g,"$1、").split(/[,,、]+/).map((U=>U.trim())).filter(Boolean);if(A.starId){let U=`id:${A.starId}`,q=l.get(U)||{starId:A.starId,name:O[0]||A.starId,count:0};q.count++,l.set(U,q)}else O.forEach((U=>{let q=`name:${U}`,Q=l.get(q)||{starId:"",name:U,count:0};Q.count++,l.set(q,Q)}))}));let c=[...l.values()].sort(((A,O)=>O.count-A.count||A.name.localeCompare(O.name))).slice(0,10),h=c[0]?.count||1,u=this.getRuntimeService("movie").externalSiteOrigin("javDbBtn",await storageManager.getSetting()),p=i.pending,g=this.getOptionalDependency("NewVideoPlugin"),m=this.getOptionalDependency("ListPagePlugin"),f=g?await g.getPendingNewVideoTotal():0,v=m?.getCurrentPageSummary?.()||{blockedItems:0},b=[{label:"总记录",value:n,action:null},{label:"收藏",value:i.favoriteRaw,action:null},{label:"下载",value:i.downloadedRaw,action:null},{label:"已看",value:i.watchedRaw,action:null},{label:"手动屏蔽",value:i.blocked,action:null},{label:"未鉴定",value:p,action:null},{label:"收藏演员",value:s.length,action:null},{label:"黑名单演员",value:a.length,action:null},{label:"新作品待处理",value:f,action:"new-video"},{label:"活跃功能",value:e.activeFeatures.length,action:null},{label:"运行错误",value:e.errors.length,action:null}],w=[["收藏",i.favoriteEffective,i.unblocked,"var(--jhs-status-fav)"],["下载",i.downloadedEffective,i.unblocked,"var(--jhs-status-down)"],["已看",i.watchedEffective,i.unblocked,"var(--jhs-status-watch)"],["手动屏蔽",i.blocked,i.total,"var(--jhs-status-filter)"],["未鉴定",i.pending,i.unblocked,"var(--jhs-border-strong)"]],S=d((A,O,U,q,Q="",se=!1)=>`
      ${Q?`${T(A)}`:`${T(A)}`}${O}${se&&U?` (${Math.round(O/U*100)}%)`:""}
      `,"row"),j=d(A=>{let O=Date.now()-A*864e5,U={identified:0,downloaded:0,watched:0};return r.entries.filter((q=>q.commitState==="committed"&&Date.parse(q.createdAt)>=O)).forEach((q=>q.changes.filter((Q=>Q.undoState!=="reverted")).forEach((Q=>{let se=H(Q.before?.stateFlags),ge=H(Q.after?.stateFlags);!oe(se)&&oe(ge)&&U.identified++,!se.downloaded&&ge.downloaded&&U.downloaded++,!se.watched&&ge.watched&&U.watched++})))),U},"trend"),k=j(7),x=j(30),_=r.coverageStart?`活动记录仅覆盖自 ${T(r.coverageStart)} 起`:"仅统计 6.4.0 及之后产生的操作记录",R=d(A=>A.action?``:`
      ${A.value}${A.label}
      `,"renderMetric"),L=`
      -

      全库概览

      ${b.map(R).join("")}
      -

      当前页面

      ${R({label:"屏蔽项",value:v.blockedItems,action:"filter",filter:"blockedItems"})}
      + `}async handle(){window.isListPage&&this.createBtn()}createBtn(){$("#newVideoBtn").after(''),$("#statsBtn").on("click",(()=>this.openDialog()))}async openDialog(){let e=this.getRuntimeService("diagnostics").exportSnapshot(),{cars:t,actresses:s,blacklist:a,activity:r}=await this.getStatsRepository().loadLibrarySnapshot(),i=zc(t),n=i.total,l=new Map;t.forEach((A=>{let O=String(A.names||"").replace(/([一-鿿])\s+(?=[一-鿿])/g,"$1、").split(/[,,、]+/).map((U=>U.trim())).filter(Boolean);if(A.starId){let U=`id:${A.starId}`,q=l.get(U)||{starId:A.starId,name:O[0]||A.starId,count:0};q.count++,l.set(U,q)}else O.forEach((U=>{let q=`name:${U}`,Q=l.get(q)||{starId:"",name:U,count:0};Q.count++,l.set(q,Q)}))}));let c=[...l.values()].sort(((A,O)=>O.count-A.count||A.name.localeCompare(O.name))).slice(0,10),h=c[0]?.count||1,u=this.getRuntimeService("movie").externalSiteOrigin("javDbBtn",await storageManager.getSetting()),p=i.pending,g=this.getOptionalDependency("NewVideoPlugin"),m=this.getOptionalDependency("ListPagePlugin"),f=g?await g.getPendingNewVideoTotal():0,v=m?.getCurrentPageSummary?.()||{blockedItems:0},b=[{label:"总记录",value:n,action:null},{label:"收藏",value:i.favoriteRaw,action:null},{label:"下载",value:i.downloadedRaw,action:null},{label:"已看",value:i.watchedRaw,action:null},{label:"手动屏蔽",value:i.blocked,action:null},{label:"未鉴定",value:p,action:null},{label:"收藏演员",value:s.length,action:null},{label:"黑名单演员",value:a.length,action:null},{label:"新作品待处理",value:f,action:"new-video"},{label:"活跃功能",value:e.activeFeatures.length,action:null},{label:"运行错误",value:e.errors.length,action:null}],w=[["收藏",i.favoriteEffective,i.unblocked,"var(--jhs-status-fav)"],["下载",i.downloadedEffective,i.unblocked,"var(--jhs-status-down)"],["已看",i.watchedEffective,i.unblocked,"var(--jhs-status-watch)"],["手动屏蔽",i.blocked,i.total,"var(--jhs-status-filter)"],["未鉴定",i.pending,i.unblocked,"var(--jhs-border-strong)"]],S=d((A,O,U,q,Q="",se=!1)=>`
      ${Q?`${T(A)}`:`${T(A)}`}${O}${se&&U?` (${Math.round(O/U*100)}%)`:""}
      `,"row"),j=d(A=>{let O=Date.now()-A*864e5,U={identified:0,downloaded:0,watched:0};return r.entries.filter((q=>q.commitState==="committed"&&Date.parse(q.createdAt)>=O)).forEach((q=>q.changes.filter((Q=>Q.undoState!=="reverted")).forEach((Q=>{let se=H(Q.before?.stateFlags),ge=H(Q.after?.stateFlags);!oe(se)&&oe(ge)&&U.identified++,!se.downloaded&&ge.downloaded&&U.downloaded++,!se.watched&&ge.watched&&U.watched++})))),U},"trend"),k=j(7),x=j(30),_=r.coverageStart?`活动记录仅覆盖自 ${T(r.coverageStart)} 起`:"仅统计 6.4.0 及之后产生的操作记录",I=d(A=>A.action?``:`
      ${A.value}${A.label}
      `,"renderMetric"),L=`
      +

      全库概览

      ${b.map(I).join("")}
      +

      当前页面

      ${I({label:"屏蔽项",value:v.blockedItems,action:"filter",filter:"blockedItems"})}

      状态分布

      ${w.map((A=>S(A[0],A[1],A[2],A[3],"",!0))).join("")}

      活动趋势

      ${_}

      ${k.identified}近 7 天新增鉴定
      ${k.downloaded}近 7 天标记下载
      ${k.watched}近 7 天标记观看
      ${x.identified}近 30 天新增鉴定
      ${x.downloaded}近 30 天标记下载
      ${x.watched}近 30 天标记观看
      ${c.length?`

      Top 10 演员

      ${c.map((A=>S(A.name,A.count,h,"var(--jhs-accent)",new URL(A.starId?`/actors/${encodeURIComponent(A.starId)}`:`/search?q=${encodeURIComponent(A.name)}`,u).href))).join("")}
      `:""} -
      `,N=this.getRuntimeService("dialog");N.open({type:1,title:"统计",content:L,scrollbar:!1,ui:{size:"lg",body:"scroll"},area:utils.getDialogArea("lg"),anim:-1,success:d((A,O)=>{$(A).find(".jhs-stats__bar").each(((U,q)=>{$(q).css({"--jhs-value":`${$(q).data("width")}%`,"--jhs-bar":$(q).data("color")})})),$(A).find("button.jhs-stats__metric[data-action]").on("click",(U=>{let q=$(U.currentTarget),Q=q.data("action");if(N.close(O),Q==="new-video")return g?.openDialog?.();Q==="filter"&&m?.setQuickFilter?.(q.data("filter"))})),utils.setupEscClose(O)},"success")})}};d(vn,"StatsPlugin");var Ta=vn;var bn=class bn extends I{constructor(){super(...arguments),this.preloadDistance=500,this.currentPage=this.getInitialPageNumber(),this.pageItems=[],this.started=!1,this.liveScope=null,this.generation=0,this.container=void 0,this.loader=void 0,this.nextUrl=null,this.hasMore=!1,this.isLoading=!1}getName(){return"AutoPagePlugin"}async initCss(){return` +
      `,N=this.getRuntimeService("dialog");N.open({type:1,title:"统计",content:L,scrollbar:!1,ui:{size:"lg",body:"scroll"},area:utils.getDialogArea("lg"),anim:-1,success:d((A,O)=>{$(A).find(".jhs-stats__bar").each(((U,q)=>{$(q).css({"--jhs-value":`${$(q).data("width")}%`,"--jhs-bar":$(q).data("color")})})),$(A).find("button.jhs-stats__metric[data-action]").on("click",(U=>{let q=$(U.currentTarget),Q=q.data("action");if(N.close(O),Q==="new-video")return g?.openDialog?.();Q==="filter"&&m?.setQuickFilter?.(q.data("filter"))})),utils.setupEscClose(O)},"success")})}};d(xn,"StatsPlugin");var Ea=xn;var kn=class kn extends R{constructor(){super(...arguments),this.preloadDistance=500,this.currentPage=this.getInitialPageNumber(),this.pageItems=[],this.started=!1,this.liveScope=null,this.generation=0,this.container=void 0,this.loader=void 0,this.nextUrl=null,this.hasMore=!1,this.isLoading=!1}getName(){return"AutoPagePlugin"}async initCss(){return` - `}async handle(){let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")(),s=d(a=>{a.detail?.names?.includes("autoPage")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>e.removeEventListener("settings.changed",s))),t.addCleanup((()=>this.stop())),this.reconfigure()}reconfigure(){return this.getRuntimeService("settings").snapshot().autoPage!=="no"?this.start():this.stop()}start(){return this.started?this.waterfallPromise||(this.waterfallPromise=this.waterfall().finally((()=>{this.waterfallPromise=null}))):(this.started=!0,this.liveScope?.dispose(),this.liveScope=new te("autopage:live"),this.generation++,this.waterfallPromise=this.waterfall().finally((()=>{this.waterfallPromise=null})),this.waterfallPromise)}stop(){this.started=!1,this.generation++,this.liveScope?.dispose(),this.liveScope=null,this.nextUrl=null,this.hasMore=!1,this.isLoading=!1,this.loader?.remove(),this.loader=void 0,this.container=void 0,this.pageItems=[]}getInitialPageNumber(){if(B){let e=X.match(/\/(page|star\/[^/]+)\/(\d+)/);return e?parseInt(e[2],10):1}if(M){let e=X.match(/[?&]page=(\d+)/);return e?parseInt(e[1],10):1}return 1}async waterfall(){if(!this.started||!this.liveScope||await this.shouldDisablePaging()||!this.started||!this.liveScope||this.liveScope.disposed)return;let e=this.liveScope,t=this.getSelector(),s=document.querySelector(t.boxSelector);if(!s||!s.parentNode)return void clog.error("没有找到容器节点,停止瀑布流!");this.container=s;let a=document.createElement("div");this.loader=a,a.className="jhs-scroll",s.parentNode.insertBefore(a,s.nextSibling),this.pageItems.push({page:this.currentPage,top:0,url:window.location.href}),a.addEventListener("click",(()=>{a.classList.contains("waterfall-error")&&this.loadNextPage().catch((i=>clog.error("瀑布流重试失败",i)))})),(()=>{let i=!1;e.listen(window,"scroll",(()=>{i||(i=!0,requestAnimationFrame((()=>{this.checkLoad(),this.checkScrollPosition(),i=!1})))}))})();let r=document.querySelector(t.nextPageSelector);this.nextUrl=r?.href??null,this.hasMore=!!this.nextUrl,e.ownTimeout(setTimeout((()=>{this.checkLoad()}),1e3)),this.hasMore||this.setState("waterfall-no-more","已经到底了")}async loadNextPage(){var e;if(!this.started)return;if(this.getRuntimeService("settings").snapshot().autoPage==="no")return void this.setState("waterfall-loading","");if(this.isLoading||!this.nextUrl||!this.container)return;let t=this.getOptionalDependency("ListPagePlugin");if(!t)return this.nextUrl=null,this.hasMore=!1,void this.setState("waterfall-error","列表功能已禁用,无法继续翻页");this.isLoading=!0,this.setState("waterfall-loading","加载中...");let s=this.getSelector(),a=this.generation,r=this.liveScope;try{if(!r||r.disposed||a!==this.generation)return;let i=await qe(this.getRuntimeService("http"),this.nextUrl,r);if(!this.started||!this.liveScope||this.liveScope.disposed||a!==this.generation)return;clog.log("请求下一页内容:",this.nextUrl);let n=utils.htmlTo$dom(i);B&&n.find(".avatar-box").length>0&&n.find(".avatar-box").parent().remove();let l=n.find(this.getSelector().requestDomItemSelector),c=this.getBoxCarInfoList(),h=this.getBoxCarInfoList(l);if(this.checkDuplicateCarNumbers(c,h))return this.nextUrl=null,this.hasMore=!1,void this.setState("waterfall-error","翻页内容出现重复数据, 页码受JavDB限制, 已停止瀑布流");if(!this.started||!this.liveScope||this.liveScope.disposed||a!==this.generation)return;let u=this.container.scrollHeight;this.pageItems.push({page:this.currentPage+1,top:u,url:this.nextUrl});let p=n.find(this.getSelector().coverImgSelector);t.replaceHdImg(p),$(this.getSelector().boxSelector).append(l),this.nextUrl=(e=n.find(s.nextPageSelector))==null?void 0:e.attr("href"),this.hasMore=!!this.nextUrl;let g=n.find(".pagination");$(".pagination").replaceWith(g),this.setState("waterfall-loading",""),this.hasMore||this.setState("waterfall-no-more","已经到底了")}catch(i){this.started&&this.loader&&this.setState("waterfall-error","加载失败,点击重试"),clog.error("加载失败:",i)}finally{this.isLoading=!1}}checkScrollPosition(){let e=window.scrollY;for(let t=this.pageItems.length-1;t>=0;t--){let s=this.pageItems[t];if(e>=s.top){this.currentPage!==s.page&&(this.currentPage=s.page,this.updatePageUrl(s.url));break}}}checkLoad(){this.loader&&(this.loader.classList.contains("waterfall-error")||this.loader.getBoundingClientRect().topclog.error("瀑布流自动加载失败",e))))}async shouldDisablePaging(){return window.isListPage?this.getRuntimeService("settings").snapshot().autoPage==="no"||["search?q","/rankings/movies","/rankings/playback","/rankings/top","/want_watch_videos","/watched_videos","jhs_source=123av"].some((t=>X.includes(t))):!0}updatePageUrl(e){window.history.replaceState({},"",e),B&&(document.title=document.title.replace(/第\d+頁/,`第${this.currentPage}頁`))}setState(e,t){this.loader&&(this.loader.className=`jhs-scroll ${e}`,this.loader.textContent=t)}};d(bn,"AutoPagePlugin");var Aa=bn;var wn=class wn extends I{getName(){return"BusDetailPagePlugin"}async initCss(){if(!window.isDetailPage)return"";$("h4:contains('推薦')").hide()}async handle(){if(window.location.href.includes("/star/")){let e=$(".avatar-box");if(e.length>0){let t=e.parent();t.css("position","initial"),t.insertBefore(t.parent())}}$(".genre a").each(((e,t)=>{let s=$(t),a=s.attr("href");if(a)try{["http:","https:"].includes(new URL(a,window.location.href).protocol)&&s.attr("target","_blank")}catch{}})),this.addCopyCarNumBtn()}addCopyCarNumBtn(){let e=null,t=document.querySelectorAll("span.header");for(let s of t)if(s.textContent.trim()==="識別碼:"){e=s;break}if(e){let s=e.nextElementSibling;if(s&&s.tagName==="SPAN"){let a=s.textContent.trim(),r=document.createElement("button");r.type="button",r.className="jhs-btn jhs-btn--secondary jhs-copy-car-number",r.textContent="复制",r.addEventListener("click",(async function(i){i.preventDefault(),await utils.copyToClipboard("番号",a)&&(this.textContent="已复制",setTimeout((()=>{this.textContent="复制"}),1500))})),s.parentNode?.insertBefore(r,s.nextSibling)}}}};d(wn,"BusDetailPagePlugin");var Pa=wn;var yn=class yn extends I{getName(){return"BusNavBarPlugin"}handle(){this.getOptionalDependency("SearchByImagePlugin")&&($("#navbar > div > div > span").append(` + `}async handle(){let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")(),s=d(a=>{a.detail?.names?.includes("autoPage")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>e.removeEventListener("settings.changed",s))),t.addCleanup((()=>this.stop())),this.reconfigure()}reconfigure(){return this.getRuntimeService("settings").snapshot().autoPage!=="no"?this.start():this.stop()}start(){return this.started?this.waterfallPromise||(this.waterfallPromise=this.waterfall().finally((()=>{this.waterfallPromise=null}))):(this.started=!0,this.liveScope?.dispose(),this.liveScope=new te("autopage:live"),this.generation++,this.waterfallPromise=this.waterfall().finally((()=>{this.waterfallPromise=null})),this.waterfallPromise)}stop(){this.started=!1,this.generation++,this.liveScope?.dispose(),this.liveScope=null,this.nextUrl=null,this.hasMore=!1,this.isLoading=!1,this.loader?.remove(),this.loader=void 0,this.container=void 0,this.pageItems=[]}getInitialPageNumber(){if(B){let e=X.match(/\/(page|star\/[^/]+)\/(\d+)/);return e?parseInt(e[2],10):1}if(M){let e=X.match(/[?&]page=(\d+)/);return e?parseInt(e[1],10):1}return 1}async waterfall(){if(!this.started||!this.liveScope||await this.shouldDisablePaging()||!this.started||!this.liveScope||this.liveScope.disposed)return;let e=this.liveScope,t=this.getSelector(),s=document.querySelector(t.boxSelector);if(!s||!s.parentNode)return void clog.error("没有找到容器节点,停止瀑布流!");this.container=s;let a=document.createElement("div");this.loader=a,a.className="jhs-scroll",s.parentNode.insertBefore(a,s.nextSibling),this.pageItems.push({page:this.currentPage,top:0,url:window.location.href}),a.addEventListener("click",(()=>{a.classList.contains("waterfall-error")&&this.loadNextPage().catch((i=>clog.error("瀑布流重试失败",i)))})),(()=>{let i=!1;e.listen(window,"scroll",(()=>{i||(i=!0,requestAnimationFrame((()=>{this.checkLoad(),this.checkScrollPosition(),i=!1})))}))})();let r=document.querySelector(t.nextPageSelector);this.nextUrl=r?.href??null,this.hasMore=!!this.nextUrl,e.ownTimeout(setTimeout((()=>{this.checkLoad()}),1e3)),this.hasMore||this.setState("waterfall-no-more","已经到底了")}async loadNextPage(){var e;if(!this.started)return;if(this.getRuntimeService("settings").snapshot().autoPage==="no")return void this.setState("waterfall-loading","");if(this.isLoading||!this.nextUrl||!this.container)return;let t=this.getOptionalDependency("ListPagePlugin");if(!t)return this.nextUrl=null,this.hasMore=!1,void this.setState("waterfall-error","列表功能已禁用,无法继续翻页");this.isLoading=!0,this.setState("waterfall-loading","加载中...");let s=this.getSelector(),a=this.generation,r=this.liveScope;try{if(!r||r.disposed||a!==this.generation)return;let i=await We(this.getRuntimeService("http"),this.nextUrl,r);if(!this.started||!this.liveScope||this.liveScope.disposed||a!==this.generation)return;clog.log("请求下一页内容:",this.nextUrl);let n=utils.htmlTo$dom(i);B&&n.find(".avatar-box").length>0&&n.find(".avatar-box").parent().remove();let l=n.find(this.getSelector().requestDomItemSelector),c=this.getBoxCarInfoList(),h=this.getBoxCarInfoList(l);if(this.checkDuplicateCarNumbers(c,h))return this.nextUrl=null,this.hasMore=!1,void this.setState("waterfall-error","翻页内容出现重复数据, 页码受JavDB限制, 已停止瀑布流");if(!this.started||!this.liveScope||this.liveScope.disposed||a!==this.generation)return;let u=this.container.scrollHeight;this.pageItems.push({page:this.currentPage+1,top:u,url:this.nextUrl});let p=n.find(this.getSelector().coverImgSelector);t.replaceHdImg(p),$(this.getSelector().boxSelector).append(l),this.nextUrl=(e=n.find(s.nextPageSelector))==null?void 0:e.attr("href"),this.hasMore=!!this.nextUrl;let g=n.find(".pagination");$(".pagination").replaceWith(g),this.setState("waterfall-loading",""),this.hasMore||this.setState("waterfall-no-more","已经到底了")}catch(i){this.started&&this.loader&&this.setState("waterfall-error","加载失败,点击重试"),clog.error("加载失败:",i)}finally{this.isLoading=!1}}checkScrollPosition(){let e=window.scrollY;for(let t=this.pageItems.length-1;t>=0;t--){let s=this.pageItems[t];if(e>=s.top){this.currentPage!==s.page&&(this.currentPage=s.page,this.updatePageUrl(s.url));break}}}checkLoad(){this.loader&&(this.loader.classList.contains("waterfall-error")||this.loader.getBoundingClientRect().topclog.error("瀑布流自动加载失败",e))))}async shouldDisablePaging(){return window.isListPage?this.getRuntimeService("settings").snapshot().autoPage==="no"||["search?q","/rankings/movies","/rankings/playback","/rankings/top","/want_watch_videos","/watched_videos","jhs_source=123av"].some((t=>X.includes(t))):!0}updatePageUrl(e){window.history.replaceState({},"",e),B&&(document.title=document.title.replace(/第\d+頁/,`第${this.currentPage}頁`))}setState(e,t){this.loader&&(this.loader.className=`jhs-scroll ${e}`,this.loader.textContent=t)}};d(kn,"AutoPagePlugin");var Da=kn;var Cn=class Cn extends R{getName(){return"BusDetailPagePlugin"}async initCss(){if(!window.isDetailPage)return"";$("h4:contains('推薦')").hide()}async handle(){if(window.location.href.includes("/star/")){let e=$(".avatar-box");if(e.length>0){let t=e.parent();t.css("position","initial"),t.insertBefore(t.parent())}}$(".genre a").each(((e,t)=>{let s=$(t),a=s.attr("href");if(a)try{["http:","https:"].includes(new URL(a,window.location.href).protocol)&&s.attr("target","_blank")}catch{}})),this.addCopyCarNumBtn()}addCopyCarNumBtn(){let e=null,t=document.querySelectorAll("span.header");for(let s of t)if(s.textContent.trim()==="識別碼:"){e=s;break}if(e){let s=e.nextElementSibling;if(s&&s.tagName==="SPAN"){let a=s.textContent.trim(),r=document.createElement("button");r.type="button",r.className="jhs-btn jhs-btn--secondary jhs-copy-car-number",r.textContent="复制",r.addEventListener("click",(async function(i){i.preventDefault(),await utils.copyToClipboard("番号",a)&&(this.textContent="已复制",setTimeout((()=>{this.textContent="复制"}),1500))})),s.parentNode?.insertBefore(r,s.nextSibling)}}}};d(Cn,"BusDetailPagePlugin");var Na=Cn;var _n=class _n extends R{getName(){return"BusNavBarPlugin"}handle(){this.getOptionalDependency("SearchByImagePlugin")&&($("#navbar > div > div > span").append(` - `),$("#search-img-btn").on("click",(()=>{this.getOptionalDependency("SearchByImagePlugin")?.open?.()})))}};d(yn,"BusNavBarPlugin");var Ra=yn;var jn=class jn extends I{getName(){return"CompatibilityEnhancementsPlugin"}getStartupMode(){return"idle"}async initCss(){return Or.isJavDB?``:""}bindImmediateEvents(){$(document).off("actress-state-changed.jhsActress").on("actress-state-changed.jhsActress",(async()=>{$(".jhs-actress-state-container").remove(),await this.decorateActresses()}))}async handle(){await this.decorateActresses(),isDetailPage&&await this.addRemoveRecord(),this.linkCommentImages()}async addRemoveRecord(){let e=this.getPageInfo().carNum;if(!e||!(await storageManager.getCarList()).some((s=>s.carNum===e)))return;let t=$('');$(".jhs-detail-btn-row,.movie-info-container,.container .info").first().append(t),t.on("click",(s=>utils.q(s,`确定移除 ${T(e)} 的鉴定记录?`,(async()=>{await this.getRuntimeService("state").remove(e),t.remove(),this.getOptionalDependency("ListPagePlugin")?.showCarNumBox?.(e),show.ok("鉴定记录已移除")}))))}async decorateActresses(){let e=new Set((await storageManager.getFavoriteActressList()).map((s=>String(s.starId)))),t=new Set((await storageManager.getBlacklist()).map((s=>String(s.starId||s.id))));this.decorateCurrentActressProfile(e,t),this.decorateActressCards(e,t)}decorateCurrentActressProfile(e,t){let s=window.location.pathname.match(/^\/(?:actors|star)\/([^/?#]+)\/?$/);if(!s)return;let a=$(".actor-section-name,.star-name,h1.title").first();a.length&&this.renderActressState(a,decodeURIComponent(s[1]),e,t,"jhs-actress-profile-state")}decorateActressCards(e,t){$(".actor-box a[href], .actress-card a[href], [data-actress-card] a[href]").each(((s,a)=>{let r=Hh(a);if(!r)return;let i=$(a).closest(".actor-box,.actress-card,[data-actress-card]");this.renderActressState(i,r.starId,e,t,"jhs-actress-card-state")}))}renderActressState(e,t,s,a,r){if(e.children(".jhs-actress-state-container").length)return;let i=$(``);s.has(t)&&i.append('已关注'),a.has(t)&&i.append('已拉黑'),i.children().length&&e.append(i)}linkCommentImages(){let e=$(".preview-images img,#sample-waterfall img,.movie-gallery img");e.length&&($(".review-content").each(((t,s)=>this.linkCommentImageTextNodes(s,e.length))),$(document).off("click.jhsCommentImage",".jhs-comment-image-link").on("click.jhsCommentImage",".jhs-comment-image-link",(t=>{t.preventDefault();let s=e.eq(Number($(t.currentTarget).data("image-index")));s.length&&globalThis.showImageViewer(s[0])})))}linkCommentImageTextNodes(e,t){let s=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),a=[];for(;s.nextNode();){let r=s.currentNode;!$(r.parentElement).closest("a,button,code,pre,textarea,.jhs-comment-image-link").length&&/(?:图|圖片|图片)\s*[一二三四五六七八九十\d]+/i.test(r.nodeValue||"")&&a.push(r)}a.forEach((r=>{let i=r.nodeValue||"",n=/(?:图|圖片|图片)\s*([一二三四五六七八九十\d]+)/gi,l=document.createDocumentFragment(),c=0,h;for(;h=n.exec(i);){h.index>c&&l.append(document.createTextNode(i.slice(c,h.index)));let u={一:1,二:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9,十:10},p=(u[h[1]]||Number(h[1]))-1;if(p>=0&&p{let s=this.getPageInfo().carNum;if(t.carNums?.includes(s))return this.showStatus(s)})||(()=>{}))}async autoRemoveNewVideoMark(){try{if(await storageManager.getSetting("autoRemoveNewVideoMarkAfterBrowse",ne)!==E)return;let t=this.getPageInfo();if(!t.carNum)return;await this.getRuntimeService("state").removeFromNewVideoList([t.carNum],"browse")}catch(e){clog.error("自动移除新作品标记失败:",e)}}async createMenuBtn(){let e=this.getPageInfo(),t=e.carNum,s=$(` + `:""}bindImmediateEvents(){$(document).off("actress-state-changed.jhsActress").on("actress-state-changed.jhsActress",(async()=>{$(".jhs-actress-state-container").remove(),await this.decorateActresses()}))}async handle(){await this.decorateActresses(),isDetailPage&&await this.addRemoveRecord(),this.linkCommentImages()}async addRemoveRecord(){let e=this.getPageInfo().carNum;if(!e||!(await storageManager.getCarList()).some((s=>s.carNum===e)))return;let t=$('');$(".jhs-detail-btn-row,.movie-info-container,.container .info").first().append(t),t.on("click",(s=>utils.q(s,`确定移除 ${T(e)} 的鉴定记录?`,(async()=>{await this.getRuntimeService("state").remove(e),t.remove(),this.getOptionalDependency("ListPagePlugin")?.showCarNumBox?.(e),show.ok("鉴定记录已移除")}))))}async decorateActresses(){let e=new Set((await storageManager.getFavoriteActressList()).map((s=>String(s.starId)))),t=new Set((await storageManager.getBlacklist()).map((s=>String(s.starId||s.id))));this.decorateCurrentActressProfile(e,t),this.decorateActressCards(e,t)}decorateCurrentActressProfile(e,t){let s=window.location.pathname.match(/^\/(?:actors|star)\/([^/?#]+)\/?$/);if(!s)return;let a=$(".actor-section-name,.star-name,h1.title").first();a.length&&this.renderActressState(a,decodeURIComponent(s[1]),e,t,"jhs-actress-profile-state")}decorateActressCards(e,t){$(".actor-box a[href], .actress-card a[href], [data-actress-card] a[href]").each(((s,a)=>{let r=Xh(a);if(!r)return;let i=$(a).closest(".actor-box,.actress-card,[data-actress-card]");this.renderActressState(i,r.starId,e,t,"jhs-actress-card-state")}))}renderActressState(e,t,s,a,r){if(e.children(".jhs-actress-state-container").length)return;let i=$(``);s.has(t)&&i.append('已关注'),a.has(t)&&i.append('已拉黑'),i.children().length&&e.append(i)}linkCommentImages(){let e=$(".preview-images img,#sample-waterfall img,.movie-gallery img");e.length&&($(".review-content").each(((t,s)=>this.linkCommentImageTextNodes(s,e.length))),$(document).off("click.jhsCommentImage",".jhs-comment-image-link").on("click.jhsCommentImage",".jhs-comment-image-link",(t=>{t.preventDefault();let s=e.eq(Number($(t.currentTarget).data("image-index")));s.length&&globalThis.showImageViewer(s[0])})))}linkCommentImageTextNodes(e,t){let s=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),a=[];for(;s.nextNode();){let r=s.currentNode;!$(r.parentElement).closest("a,button,code,pre,textarea,.jhs-comment-image-link").length&&/(?:图|圖片|图片)\s*[一二三四五六七八九十\d]+/i.test(r.nodeValue||"")&&a.push(r)}a.forEach((r=>{let i=r.nodeValue||"",n=/(?:图|圖片|图片)\s*([一二三四五六七八九十\d]+)/gi,l=document.createDocumentFragment(),c=0,h;for(;h=n.exec(i);){h.index>c&&l.append(document.createTextNode(i.slice(c,h.index)));let u={一:1,二:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9,十:10},p=(u[h[1]]||Number(h[1]))-1;if(p>=0&&p{let s=this.getPageInfo().carNum;if(t.carNums?.includes(s))return this.showStatus(s)})||(()=>{}))}async autoRemoveNewVideoMark(){try{if(await storageManager.getSetting("autoRemoveNewVideoMarkAfterBrowse",ne)!==E)return;let t=this.getPageInfo();if(!t.carNum)return;await this.getRuntimeService("state").removeFromNewVideoList([t.carNum],"browse")}catch(e){clog.error("自动移除新作品标记失败:",e)}}async createMenuBtn(){let e=this.getPageInfo(),t=e.carNum,s=$(`
      @@ -3589,16 +3596,16 @@ ${i}\r
      - `);s.find("[data-jhs-state-slot]").replaceWith(Mt());let a=this.getOptionalDependency("DetailWorkspacePlugin")?.getSlot?.("summary-actions");a?.length?a.append(s):M?$(".tabs").after(s):B&&$("#mag-submit-show").before(s),$("#magnetSearchBtn").on("click",(async()=>{let c=this.getOptionalDependency("MagnetHubPlugin");if(!c)return void show.info("磁力搜索功能已禁用");let h=await c.createMagnetHub(e.carNum);this.getRuntimeService("dialog").open({type:1,title:"磁力搜索 "+e.carNum,content:'
      ',area:utils.getResponsiveArea(["60%","80%"]),scrollbar:!1,success:d(()=>{$("#magnetHubBox").append(h)},"success")})}));let r=this.getOptionalDependency("HighlightMagnetPlugin"),i=this.getRuntimeService("settings"),n=i.snapshot().enableMagnetsFilter??E;r||$("#enable-magnets-filter").remove(),$("#magnets-span").text(n===E?"关闭磁力过滤":"开启磁力过滤"),n===E&&r?.doFilterMagnet?.();let l=Ve({settings:i,key:"enableMagnetsFilter",fallback:ne,apply:d(c=>{let h=c===E,u=$("#magnets-span");h?(r?.doFilterMagnet?.(),u.text("关闭磁力过滤")):(r?.showAll?.(),u.text("开启磁力过滤"))},"apply"),onError:d(c=>{clog.error("磁力过滤设置保存失败,已恢复",c),show.error("磁力过滤设置保存失败,已恢复原设置")},"onError")});if($("#enable-magnets-filter").on("click",(async c=>{if(!r)return;let h=$("#magnets-span").text()==="关闭磁力过滤";await l(h?ne:E)})),$("#search-subtitle-btn").on("click",(c=>{let h=this.getRuntimeService("movie").sourceUrls({carNum:t},["subtitlecat"])[0]?.url;h&&utils.openPage(h,t,!1,c)})),$("#xunLeiSubtitleBtn").on("click",(()=>this.searchXunLeiSubtitle(t))),!t)return $("#filterBtn, #favoriteBtn, #hasDownBtn, #hasWatchBtn, #magnetSearchBtn, #xunLeiSubtitleBtn, #search-subtitle-btn").prop("disabled",!0).attr("title","番号不可用"),void clog.warn("详情操作不可用:番号不可用");this.stateBinding=this.getDetailStateController().bind({root:document,carNum:t,activityType:"detail-state",getRecord:d(()=>this.getStateRecord(),"getRecord")})}async showStatus(e){return this.getDetailStateController().render({root:document,carNum:e})}getStateRecord(){let e=this.getPageInfo();return{carNum:e.carNum,url:e.url,names:e.actress,publishTime:e.publishTime}}getStateBinding(){if(this.stateBinding)return this.stateBinding;let e=this.getPageInfo();return this.stateBinding={root:document,layerIndex:null,carNum:C(e.carNum),getRecord:d(()=>this.getStateRecord(),"getRecord"),activityType:"detail-state",selectors:{}}}async favoriteOne(e){return this.getDetailStateController().requestToggle(this.getStateBinding(),"favorite",e)}async hasDownOne(e){return this.getDetailStateController().requestToggle(this.getStateBinding(),"downloaded",e)}async hasWatchOne(e){return this.getDetailStateController().requestToggle(this.getStateBinding(),"watched",e)}async searchXunLeiSubtitle(e){let t=this.getRuntimeService("dialog"),s=this.getRuntimeService("subtitle"),a=await this.getRuntimeService("scope")(),r=loading();try{let i=await s.search("xunlei",{carNum:e},{scope:a});i&&i.length!==0?t.open({type:1,title:"迅雷字幕",content:` + `);s.find("[data-jhs-state-slot]").replaceWith(Ot());let a=this.getOptionalDependency("DetailWorkspacePlugin")?.getSlot?.("summary-actions");a?.length?a.append(s):M?$(".tabs").after(s):B&&$("#mag-submit-show").before(s),$("#magnetSearchBtn").on("click",(async()=>{let c=this.getOptionalDependency("MagnetHubPlugin");if(!c)return void show.info("磁力搜索功能已禁用");let h=await c.createMagnetHub(e.carNum);this.getRuntimeService("dialog").open({type:1,title:"磁力搜索 "+e.carNum,content:'
      ',area:utils.getResponsiveArea(["60%","80%"]),scrollbar:!1,success:d(()=>{$("#magnetHubBox").append(h)},"success")})}));let r=this.getOptionalDependency("HighlightMagnetPlugin"),i=this.getRuntimeService("settings"),n=i.snapshot().enableMagnetsFilter??E;r||$("#enable-magnets-filter").remove(),$("#magnets-span").text(n===E?"关闭磁力过滤":"开启磁力过滤"),n===E&&r?.doFilterMagnet?.();let l=He({settings:i,key:"enableMagnetsFilter",fallback:ne,apply:d(c=>{let h=c===E,u=$("#magnets-span");h?(r?.doFilterMagnet?.(),u.text("关闭磁力过滤")):(r?.showAll?.(),u.text("开启磁力过滤"))},"apply"),onError:d(c=>{clog.error("磁力过滤设置保存失败,已恢复",c),show.error("磁力过滤设置保存失败,已恢复原设置")},"onError")});if($("#enable-magnets-filter").on("click",(async c=>{if(!r)return;let h=$("#magnets-span").text()==="关闭磁力过滤";await l(h?ne:E)})),$("#search-subtitle-btn").on("click",(c=>{let h=this.getRuntimeService("movie").sourceUrls({carNum:t},["subtitlecat"])[0]?.url;h&&utils.openPage(h,t,!1,c)})),$("#xunLeiSubtitleBtn").on("click",(()=>this.searchXunLeiSubtitle(t))),!t)return $("#filterBtn, #favoriteBtn, #hasDownBtn, #hasWatchBtn, #magnetSearchBtn, #xunLeiSubtitleBtn, #search-subtitle-btn").prop("disabled",!0).attr("title","番号不可用"),void clog.warn("详情操作不可用:番号不可用");this.stateBinding=this.getDetailStateController().bind({root:document,carNum:t,activityType:"detail-state",getRecord:d(()=>this.getStateRecord(),"getRecord")})}async showStatus(e){return this.getDetailStateController().render({root:document,carNum:e})}getStateRecord(){let e=this.getPageInfo();return{carNum:e.carNum,url:e.url,names:e.actress,publishTime:e.publishTime}}getStateBinding(){if(this.stateBinding)return this.stateBinding;let e=this.getPageInfo();return this.stateBinding={root:document,layerIndex:null,carNum:C(e.carNum),getRecord:d(()=>this.getStateRecord(),"getRecord"),activityType:"detail-state",selectors:{}}}async favoriteOne(e){return this.getDetailStateController().requestToggle(this.getStateBinding(),"favorite",e)}async hasDownOne(e){return this.getDetailStateController().requestToggle(this.getStateBinding(),"downloaded",e)}async hasWatchOne(e){return this.getDetailStateController().requestToggle(this.getStateBinding(),"watched",e)}async searchXunLeiSubtitle(e){let t=this.getRuntimeService("dialog"),s=this.getRuntimeService("subtitle"),a=await this.getRuntimeService("scope")(),r=loading();try{let i=await s.search("xunlei",{carNum:e},{scope:a});i&&i.length!==0?t.open({type:1,title:"迅雷字幕",content:`
      - `,scrollbar:!1,area:utils.getResponsiveArea(["60%","70%"]),anim:-1,success:d((n,l)=>{ze(globalThis.Tabulator,"#xunlei-table-container",{pagination:!1,layout:"fitColumns",placeholder:"暂无数据",virtualDom:!0,data:i,responsiveLayout:"collapse",responsiveLayoutCollapse:!0,columnDefaults:{headerHozAlign:"center",hozAlign:"center"},columns:[{title:"文件名",field:"name",headerSort:!1,responsive:0},{title:"类型",field:"extension",headerSort:!1,responsive:0},{title:"操作",responsive:0,headerSort:!1,formatter:d((c,h,u)=>{let p=c.getData();return u((()=>{let g=c.getElement().querySelector(".subtitle-preview-btn"),m=c.getElement().querySelector(".subtitle-download-btn");g&&g.addEventListener("click",(async f=>{let v=e+"."+p.extension;this.previewSubtitle(p,v)})),m&&m.addEventListener("click",(async f=>{let v=e+"."+p.extension,b=await s.download("xunlei",p,{scope:a});utils.download(b,v)}))})),` + `,scrollbar:!1,area:utils.getResponsiveArea(["60%","70%"]),anim:-1,success:d((n,l)=>{Ve(globalThis.Tabulator,"#xunlei-table-container",{pagination:!1,layout:"fitColumns",placeholder:"暂无数据",virtualDom:!0,data:i,responsiveLayout:"collapse",responsiveLayoutCollapse:!0,columnDefaults:{headerHozAlign:"center",hozAlign:"center"},columns:[{title:"文件名",field:"name",headerSort:!1,responsive:0},{title:"类型",field:"extension",headerSort:!1,responsive:0},{title:"操作",responsive:0,headerSort:!1,formatter:d((c,h,u)=>{let p=c.getData();return u((()=>{let g=c.getElement().querySelector(".subtitle-preview-btn"),m=c.getElement().querySelector(".subtitle-download-btn");g&&g.addEventListener("click",(async f=>{let v=e+"."+p.extension;this.previewSubtitle(p,v)})),m&&m.addEventListener("click",(async f=>{let v=e+"."+p.extension,b=await s.download("xunlei",p,{scope:a});utils.download(b,v)}))})),` `},"formatter")}]}),utils.setupEscClose(l)},"success")}):show.error("迅雷中找不到相关字幕!")}catch(i){clog.error(i),show.error(i)}finally{r.close()}}async filterOne(e,t){return e&&e.preventDefault(),this.getDetailStateController().requestToggle(this.getStateBinding(),"blocked",e)}hideVideoControls(e){let t=$(document);t.off("mouseenter.jhsDetailVideo").on("mouseenter.jhsDetailVideo","#preview-video",(s=>{$(s.currentTarget).prop("controls",!0)})),e.addCleanup((()=>t.off("mouseenter.jhsDetailVideo")))}async previewSubtitle(e,t){if(!e?.url)return void clog.error("未提供文件URL");let s=String(e.extension||"").toLowerCase();if(s==="ass"||s==="srt")try{let a=this.getRuntimeService("dialog"),r=await this.getRuntimeService("scope")(),i=await this.getRuntimeService("subtitle").download("xunlei",e,{scope:r}),n="字幕预览";s==="ass"?n="ASS字幕预览 - "+t:s==="srt"&&(n="SRT字幕预览 - "+t);let l=i.split(` `),c="",h=String(l.length).length;l.forEach(((p,g)=>{let m=String(g+1).padStart(h," ");c+=`${m}. ${T(p)} -`}));let u=c;a.open({type:1,title:n,area:utils.getResponsiveArea(["80%","80%"]),scrollbar:!1,content:`
      ${u}
      `,btn:["下载","关闭"],btn1:d(function(p,g,m){return utils.download(i,t),!1},"btn1")})}catch(a){show.error(`预览失败: ${a instanceof Error?a.message:String(a)}`),clog.error("预览字幕文件出错:",a)}else show.error("仅支持预览ASS和SRT字幕文件")}};d(Sn,"DetailPageButtonPlugin");var Ea=Sn;var xn=class xn extends I{getName(){return"DetailPagePlugin"}constructor(){super()}handle(){isDetailPage&&$(".video-meta-panel a").each(((e,t)=>{let s=$(t),a=s.attr("href");if(a)try{["http:","https:"].includes(new URL(a,window.location.href).protocol)&&s.attr("target","_blank")}catch{}}))}};d(xn,"DetailPagePlugin");var Da=xn;var kn=class kn extends I{constructor(){super(),this.hostRoot=null,this.resourceObserver=null,this.scheduledResourceFrame=null,this.cancelScheduledResourceFrame=null,this.lifecycleScope=null}getName(){return"DetailWorkspacePlugin"}async initCss(){return``}async handle(){if(!window.isDetailPage)return;this.lifecycleScope=await this.getRuntimeService("scope")();let e=utils.loopDetector((()=>!!this.getHostAdapter()),(()=>this.ensureWorkspace()),40,2500,!0,this.lifecycleScope);this.lifecycleScope.addCleanup(e),this.lifecycleScope.addCleanup((()=>{this.cancelScheduledResourceFrame?.(),this.scheduledResourceFrame=null,this.cancelScheduledResourceFrame=null}))}getHostAdapter(){let e=this.getRuntimeService("host"),t=e?.locateDetailRoot?.();return t?{site:e.site||"unknown",root:$(t)}:null}ensureWorkspace(){let e=this.getHostAdapter();if(!e)return $();let t=e.root;return t.attr("data-jhs-workspace-ready")||(t.attr({"data-jhs-workspace-ready":"true","data-jhs-workspace-site":e.site}).addClass("jhs-detail-host-workspace jhs-ui"),e.site==="javdb"?(t.children("h2,.video-meta-panel").attr("data-jhs-host-region","summary"),t.children(".columns").filter(((s,a)=>$(a).find(".tile-images,.preview-images").length>0)).attr("data-jhs-host-region","gallery"),t.children(".columns").filter(((s,a)=>$(a).find("#magnets-content").length>0)).attr("data-jhs-host-region","resources"),this.normalizeHostActions(t.find(".video-meta-panel").first())):(t.children("h3,.row.movie").attr("data-jhs-host-region","summary"),yt(this.getRuntimeService("host"))?.resourceRegion?.attr("data-jhs-host-region","resources"),t.children().filter(((a,r)=>$(r).is("#sample-waterfall")||$(r).find("#sample-waterfall").length>0)).attr("data-jhs-host-region","gallery"),this.normalizeHostActions(t.find(".info").first())),this.ensureOwnedSlots(t),this.adoptExistingOwnedPanels(t)),this.hostRoot=t,this.ensureOwnedSlots(t),this.placeOwnedSlots(),this.bindResourceLifecycle(),t}getSlot(e){return this.ensureWorkspace().find(`[data-jhs-slot="${e}"]`).first()}ensureOwnedSlots(e=this.hostRoot){if(!e?.length)return;e.children('[data-jhs-slot="summary-actions"]').length||e.append('
      ');let t=e.children('[data-jhs-slot-group="post-resource"]').first();t.length||(t=$('
      ').appendTo(e)),t.children('[data-jhs-slot="reviews"]').length||t.append('
      '),t.children('[data-jhs-slot="related"]').length||t.append('')}placeOwnedSlots(){let e=this.hostRoot,t=yt(this.getRuntimeService("host"));if(!e?.length)return;this.ensureOwnedSlots(e);let s=e.children('[data-jhs-slot="summary-actions"]').first(),a=e.children('[data-jhs-slot-group="post-resource"]').first(),r=e.attr("data-jhs-workspace-site")==="javdb"?e.children(".video-meta-panel").first():e.children(".row.movie").first();r.length&&s.insertAfter(r),t?.resourceRegion?.length&&a.insertAfter(t.resourceRegion)}adoptExistingOwnedPanels(e){[[".jhs-detail-btn-row","summary-actions"],[".jhs-related-panel","related"],[".jhs-review-panel","reviews"]].forEach((([t,s])=>{let a=e.find(`[data-jhs-slot="${s}"]`).first();e.find(t).filter(((r,i)=>!$(i).closest("[data-jhs-slot]").length)).each(((r,i)=>a.append(i)))}))}normalizeHostActions(e){let t=new Set(["想看","看过","看過","存入清单","存入清單","下载","下載","订正","訂正"]);e.find("a, button").filter(((s,a)=>!$(a).is(".jhs-btn, [id^='jhs-']")&&t.has($(a).text().replace(/\s+/g," ").trim()))).addClass("jhs-detail-host-action")}isJhsOnlyMutation(e){if($(e.target).closest(".jhs-offline-actions,.jhs-select-control,.jhs-magnet-score").length)return!0;let t=[...e.addedNodes,...e.removedNodes].filter((s=>s.nodeType===Node.ELEMENT_NODE));return t.length>0&&t.every((s=>{let a=s;return a.matches?.(".jhs-offline-btn,.jhs-offline-actions,.jhs-magnet-score,.jhs-select-control")||a.closest?.(".jhs-offline-actions,.jhs-select-control")}))}bindResourceLifecycle(){let e=yt(this.getRuntimeService("host"));if(!e)return;if(this.resourceObserver&&this.resourceObserver.root===e.observeRoot[0])return void this.scheduleResourceUpdate();if(this.resourceObserver&&this.lifecycleScope?.releaseObserver(this.resourceObserver),!this.lifecycleScope)return;let t=this.lifecycleScope.observe(e.observeRoot[0],(s=>{s.every((a=>this.isJhsOnlyMutation(a)))||this.scheduleResourceUpdate()}),{childList:!0,subtree:!0});t.root=e.observeRoot[0],this.resourceObserver=t,e.sortSelect.length&&e.sortSelect.addClass("jhs-select-source")&&K.enhance(e.controller),this.scheduleResourceUpdate()}scheduleResourceUpdate(){if(this.scheduledResourceFrame!==null)return;let e=typeof window.requestAnimationFrame=="function",t=e?window.requestAnimationFrame.bind(window):(s=>Number(setTimeout(s)));this.scheduledResourceFrame=t((()=>{this.scheduledResourceFrame=null,this.cancelScheduledResourceFrame=null;let s=yt(this.getRuntimeService("host"));s&&(s.prepareLayout?.(),this.placeOwnedSlots(),s.sortSelect.length&&(s.sortSelect.addClass("jhs-select-source"),K.enhance(s.controller),K.refresh(s.sortSelect)),V&&V.emit("magnet-items-updated",{site:s.site,resourceRoot:s.resourceRoot[0],rows:s.rows()},{broadcast:!1}))})),this.cancelScheduledResourceFrame=()=>{this.scheduledResourceFrame!==null&&(e?window.cancelAnimationFrame?.(this.scheduledResourceFrame):clearTimeout(this.scheduledResourceFrame))}}};d(kn,"DetailWorkspacePlugin");var Na=kn;var Cn=class Cn extends I{getName(){return"Fc2NavigationPlugin"}async handle(){if(!window.isListPage)return;let e=this.getOptionalDependency("Fc2Plugin");if(!e)return;let t=this.getRuntimeService("host"),s=await this.getRuntimeService("scope")(),a=t?.locateListRoot?.()??null,r=null,i=d(async()=>{let h=t?.locateListRoot?.();if(!h)return;let u=$(h).first();u.length&&(await this.protectFc2Navigation(u,e).catch(p=>clog.warn("FC2 导航保护初始化失败",p)),this.bindFc2Navigation(u,e),r!==h&&(r=h,s.addCleanup(()=>{u.off(".jhsFc2Navigation"),u.find('.item a[data-jhs-fc2-primary="true"]').off(".jhsFc2Navigation")})))},"ensureAttached");await i();let n=null,l=d(()=>{n==null&&(n=setTimeout(()=>{n=null,i().catch(h=>clog.warn("FC2 动态导航保护失败",h))},80))},"reprotect");s.addCleanup(()=>{n!=null&&(clearTimeout(n),n=null)});let c=V.on("list-items-added",h=>{h?.items?.length&&l()});s.addCleanup(c),a&&typeof MutationObserver<"u"&&s.observe(a,h=>{h.some(u=>u.addedNodes.length)&&l()},{childList:!0,subtree:!1})}async protectFc2Navigation(e,t){for(let s of e.find(".item").toArray()){let a=$(s);if(a.attr("data-jhs-fc2-protected")!=="true")try{let{carNum:r,aHref:i,fc2Source:n}=$e(a);if(!r?.includes("FC2-")||!i)continue;let l=n||await t.resolveFc2Source({url:i})||"",c=a.find("a").first();if(!c.length)continue;a.attr({"data-jhs-original-url":i,"data-jhs-fc2-source":l,"data-jhs-fc2-protected":"true"}),c.attr("data-jhs-fc2-primary","true")}catch(r){clog.warn("FC2 导航保护初始化失败",r)}}}bindFc2Navigation(e,t){let s='.item a[data-jhs-fc2-primary="true"]',a=d(async r=>{if(r.type==="auxclick"&&r.button!==1||r.type==="click"&&r.button&&r.button!==0||r.shiftKey||r.altKey||$(r.target).closest("div.meta-buttons,[class^='jhs-match-']").length)return;let i=$(r.currentTarget).closest(".item"),n=!!(r.ctrlKey||r.metaKey||r.button===1),l=d((p,g,m)=>{clog.error("打开 FC2 详情失败,回退原始链接",m),n?utils.openPage(p,g,!0,{event:r,newTab:!0}):window.location.href=p},"fallbackToNative"),c,h,u;try{let p=$e(i);c=p.carNum,h=i.attr("data-jhs-original-url")||p.aHref,u=p.fc2Source}catch(p){if(h=i.attr("data-jhs-original-url")||i.find("a").first().attr("href"),c=i.find(".video-title strong").first().text().trim(),!h)return;r.preventDefault(),r.stopPropagation(),l(h,c,p);return}if(!(!c?.includes("FC2-")||!h)){r.preventDefault(),r.stopPropagation();try{let p=await t.resolveMovieIdForRecord(c,h),g=u||await t.resolveFc2Source({url:h})||"";n?await t.openFc2Page(p,c,h,{event:r,newTab:!0},{source:g}):t.openFc2Dialog(p,c,h,{source:g})}catch(p){l(h,c,p)}}},"handleNavigation");e.off("click.jhsFc2Navigation auxclick.jhsFc2Navigation",s),e.find(s).each((r,i)=>{$(i).off("click.jhsFc2Navigation auxclick.jhsFc2Navigation").on("click.jhsFc2Navigation auxclick.jhsFc2Navigation",a)})}};d(Cn,"Fc2NavigationPlugin");var La=Cn;var _n=class _n extends I{getName(){return"FoldCategoryPlugin"}async initCss(){let e=await storageManager.getSetting();return` + `}async handle(){if(!window.isDetailPage)return;this.lifecycleScope=await this.getRuntimeService("scope")();let e=utils.loopDetector((()=>!!this.getHostAdapter()),(()=>this.ensureWorkspace()),40,2500,!0,this.lifecycleScope);this.lifecycleScope.addCleanup(e),this.lifecycleScope.addCleanup((()=>{this.cancelScheduledResourceFrame?.(),this.scheduledResourceFrame=null,this.cancelScheduledResourceFrame=null}))}getHostAdapter(){let e=this.getRuntimeService("host"),t=e?.locateDetailRoot?.();return t?{site:e.site||"unknown",root:$(t)}:null}ensureWorkspace(){let e=this.getHostAdapter();if(!e)return $();let t=e.root;return t.attr("data-jhs-workspace-ready")||(t.attr({"data-jhs-workspace-ready":"true","data-jhs-workspace-site":e.site}).addClass("jhs-detail-host-workspace jhs-ui"),e.site==="javdb"?(t.children("h2,.video-meta-panel").attr("data-jhs-host-region","summary"),t.children(".columns").filter(((s,a)=>$(a).find(".tile-images,.preview-images").length>0)).attr("data-jhs-host-region","gallery"),t.children(".columns").filter(((s,a)=>$(a).find("#magnets-content").length>0)).attr("data-jhs-host-region","resources"),this.normalizeHostActions(t.find(".video-meta-panel").first())):(t.children("h3,.row.movie").attr("data-jhs-host-region","summary"),St(this.getRuntimeService("host"))?.resourceRegion?.attr("data-jhs-host-region","resources"),t.children().filter(((a,r)=>$(r).is("#sample-waterfall")||$(r).find("#sample-waterfall").length>0)).attr("data-jhs-host-region","gallery"),this.normalizeHostActions(t.find(".info").first())),this.ensureOwnedSlots(t),this.adoptExistingOwnedPanels(t)),this.hostRoot=t,this.ensureOwnedSlots(t),this.placeOwnedSlots(),this.bindResourceLifecycle(),t}getSlot(e){return this.ensureWorkspace().find(`[data-jhs-slot="${e}"]`).first()}ensureOwnedSlots(e=this.hostRoot){if(!e?.length)return;e.children('[data-jhs-slot="summary-actions"]').length||e.append('
      ');let t=e.children('[data-jhs-slot-group="post-resource"]').first();t.length||(t=$('
      ').appendTo(e)),t.children('[data-jhs-slot="reviews"]').length||t.append('
      '),t.children('[data-jhs-slot="related"]').length||t.append('')}placeOwnedSlots(){let e=this.hostRoot,t=St(this.getRuntimeService("host"));if(!e?.length)return;this.ensureOwnedSlots(e);let s=e.children('[data-jhs-slot="summary-actions"]').first(),a=e.children('[data-jhs-slot-group="post-resource"]').first(),r=e.attr("data-jhs-workspace-site")==="javdb"?e.children(".video-meta-panel").first():e.children(".row.movie").first();r.length&&s.insertAfter(r),t?.resourceRegion?.length&&a.insertAfter(t.resourceRegion)}adoptExistingOwnedPanels(e){[[".jhs-detail-btn-row","summary-actions"],[".jhs-related-panel","related"],[".jhs-review-panel","reviews"]].forEach((([t,s])=>{let a=e.find(`[data-jhs-slot="${s}"]`).first();e.find(t).filter(((r,i)=>!$(i).closest("[data-jhs-slot]").length)).each(((r,i)=>a.append(i)))}))}normalizeHostActions(e){let t=new Set(["想看","看过","看過","存入清单","存入清單","下载","下載","订正","訂正"]);e.find("a, button").filter(((s,a)=>!$(a).is(".jhs-btn, [id^='jhs-']")&&t.has($(a).text().replace(/\s+/g," ").trim()))).addClass("jhs-detail-host-action")}isJhsOnlyMutation(e){if($(e.target).closest(".jhs-offline-actions,.jhs-select-control,.jhs-magnet-score").length)return!0;let t=[...e.addedNodes,...e.removedNodes].filter((s=>s.nodeType===Node.ELEMENT_NODE));return t.length>0&&t.every((s=>{let a=s;return a.matches?.(".jhs-offline-btn,.jhs-offline-actions,.jhs-magnet-score,.jhs-select-control")||a.closest?.(".jhs-offline-actions,.jhs-select-control")}))}bindResourceLifecycle(){let e=St(this.getRuntimeService("host"));if(!e)return;if(this.resourceObserver&&this.resourceObserver.root===e.observeRoot[0])return void this.scheduleResourceUpdate();if(this.resourceObserver&&this.lifecycleScope?.releaseObserver(this.resourceObserver),!this.lifecycleScope)return;let t=this.lifecycleScope.observe(e.observeRoot[0],(s=>{s.every((a=>this.isJhsOnlyMutation(a)))||this.scheduleResourceUpdate()}),{childList:!0,subtree:!0});t.root=e.observeRoot[0],this.resourceObserver=t,e.sortSelect.length&&e.sortSelect.addClass("jhs-select-source")&&K.enhance(e.controller),this.scheduleResourceUpdate()}scheduleResourceUpdate(){if(this.scheduledResourceFrame!==null)return;let e=typeof window.requestAnimationFrame=="function",t=e?window.requestAnimationFrame.bind(window):(s=>Number(setTimeout(s)));this.scheduledResourceFrame=t((()=>{this.scheduledResourceFrame=null,this.cancelScheduledResourceFrame=null;let s=St(this.getRuntimeService("host"));s&&(s.prepareLayout?.(),this.placeOwnedSlots(),s.sortSelect.length&&(s.sortSelect.addClass("jhs-select-source"),K.enhance(s.controller),K.refresh(s.sortSelect)),V&&V.emit("magnet-items-updated",{site:s.site,resourceRoot:s.resourceRoot[0],rows:s.rows()},{broadcast:!1}))})),this.cancelScheduledResourceFrame=()=>{this.scheduledResourceFrame!==null&&(e?window.cancelAnimationFrame?.(this.scheduledResourceFrame):clearTimeout(this.scheduledResourceFrame))}}};d(Rn,"DetailWorkspacePlugin");var za=Rn;var In=class In extends R{getName(){return"Fc2NavigationPlugin"}async handle(){if(!window.isListPage)return;let e=this.getOptionalDependency("Fc2Plugin");if(!e)return;let t=this.getRuntimeService("host"),s=await this.getRuntimeService("scope")(),a=t?.locateListRoot?.()??null,r=null,i=d(async()=>{let h=t?.locateListRoot?.();if(!h)return;let u=$(h).first();u.length&&(await this.protectFc2Navigation(u,e).catch(p=>clog.warn("FC2 导航保护初始化失败",p)),this.bindFc2Navigation(u,e),r!==h&&(r=h,s.addCleanup(()=>{u.off(".jhsFc2Navigation"),u.find('.item a[data-jhs-fc2-primary="true"]').off(".jhsFc2Navigation")})))},"ensureAttached");await i();let n=null,l=d(()=>{n==null&&(n=setTimeout(()=>{n=null,i().catch(h=>clog.warn("FC2 动态导航保护失败",h))},80))},"reprotect");s.addCleanup(()=>{n!=null&&(clearTimeout(n),n=null)});let c=V.on("list-items-added",h=>{h?.items?.length&&l()});s.addCleanup(c),a&&typeof MutationObserver<"u"&&s.observe(a,h=>{h.some(u=>u.addedNodes.length)&&l()},{childList:!0,subtree:!1})}async protectFc2Navigation(e,t){for(let s of e.find(".item").toArray()){let a=$(s);if(a.attr("data-jhs-fc2-protected")!=="true")try{let{carNum:r,aHref:i,fc2Source:n}=$e(a);if(!r?.includes("FC2-")||!i)continue;let l=n||await t.resolveFc2Source({url:i})||"",c=a.find("a").first();if(!c.length)continue;a.attr({"data-jhs-original-url":i,"data-jhs-fc2-source":l,"data-jhs-fc2-protected":"true"}),c.attr("data-jhs-fc2-primary","true")}catch(r){clog.warn("FC2 导航保护初始化失败",r)}}}bindFc2Navigation(e,t){let s='.item a[data-jhs-fc2-primary="true"]',a=d(async r=>{if(r.type==="auxclick"&&r.button!==1||r.type==="click"&&r.button&&r.button!==0||r.shiftKey||r.altKey||$(r.target).closest("div.meta-buttons,[class^='jhs-match-']").length)return;let i=$(r.currentTarget).closest(".item"),n=!!(r.ctrlKey||r.metaKey||r.button===1),l=d((p,g,m)=>{clog.error("打开 FC2 详情失败,回退原始链接",m),n?utils.openPage(p,g,!0,{event:r,newTab:!0}):window.location.href=p},"fallbackToNative"),c,h,u;try{let p=$e(i);c=p.carNum,h=i.attr("data-jhs-original-url")||p.aHref,u=p.fc2Source}catch(p){if(h=i.attr("data-jhs-original-url")||i.find("a").first().attr("href"),c=i.find(".video-title strong").first().text().trim(),!h)return;r.preventDefault(),r.stopPropagation(),l(h,c,p);return}if(!(!c?.includes("FC2-")||!h)){r.preventDefault(),r.stopPropagation();try{let p=await t.resolveMovieIdForRecord(c,h),g=u||await t.resolveFc2Source({url:h})||"";n?await t.openFc2Page(p,c,h,{event:r,newTab:!0},{source:g}):t.openFc2Dialog(p,c,h,{source:g})}catch(p){l(h,c,p)}}},"handleNavigation");e.off("click.jhsFc2Navigation auxclick.jhsFc2Navigation",s),e.find(s).each((r,i)=>{$(i).off("click.jhsFc2Navigation auxclick.jhsFc2Navigation").on("click.jhsFc2Navigation auxclick.jhsFc2Navigation",a)})}};d(In,"Fc2NavigationPlugin");var Fa=In;var En=class En extends R{getName(){return"FoldCategoryPlugin"}async initCss(){let e=await storageManager.getSetting();return` "}getName(){return"HighlightMagnetPlugin"}doFilterMagnet(){let e=this.getRuntimeService("host")?.getDetailResourceBoundary?.();if(!e)return void this.updateFilterHint(!1);let t=e.rows(),s=[],a=!1;t.forEach((r=>{let i=e.getTitleTarget(r);if(!i)return;let n=$(i),l=n.text().toLowerCase(),c=this.getQualitySignals(l,e.hasSubtitleTag(r));$(r).removeClass("high-quality").show().addClass("magnet-row"),l.includes("4k")&&n.css("color","var(--jhs-status-filter-text)"),c.highQuality&&(a=!0,$(r).addClass("high-quality")),this.injectScoreBadge(n,n.text()),s.push(r)})),a&&s.forEach((r=>$(r).hasClass("high-quality")||$(r).hide())),this.updateFilterHint(a)}injectScoreBadge(e,t){try{if(e.find(".jhs-magnet-score").length>0)return;let s=cs({title:t||"",seeders:0}),a=s.total,r=a>=70?"高":a>=40?"中":"低",i=a>=70?"var(--jhs-status-down)":a>=40?"var(--jhs-status-watch)":"var(--jhs-surface-2)",n=a>=70?"var(--jhs-status-down-on)":a>=40?"var(--jhs-status-watch-on)":"var(--jhs-text-muted)",l=`分辨率:${s.resolution}/25 字幕:${s.subtitle}/20 做种:${s.seeders}/35 新鲜度:${s.freshness}/15`,c=$(`${r} ${a}`).css({color:n,backgroundColor:i});e.append(c)}catch(s){clog.debug("磁力评分徽章注入失败,已忽略",s)}}getQualitySignals(e,t=!1){return zi(e,t)}updateFilterHint(e){$("#enable-magnets-filter").removeClass("do-hide").attr("data-tip",e?"仅显示识别到的高质量或字幕磁力":"未识别到可过滤项,当前未隐藏磁力")}showAll(){$("#enable-magnets-filter").removeClass("do-hide").removeAttr("data-tip");let e=this.getRuntimeService("host")?.getDetailResourceBoundary?.();e?.rows().forEach((t=>{$(t).removeClass("high-quality").show();let s=e.getTitleTarget(t);s&&$(s).css("color","").find(".jhs-magnet-score").remove()}))}};d($n,"HighlightMagnetPlugin");var Ba=$n;var Tn=class Tn extends EventTarget{constructor(e){super(),this.keyOf=e,this.mode="explicit",this.selected=new Set,this.excluded=new Set}set(e,t){let s=this.keyOf(e),a=this.mode==="all-filtered"?this.excluded:this.selected;this.mode==="all-filtered"?t?a.delete(s):a.add(s):t?a.add(s):a.delete(s),this.emit()}selectAllFiltered(){this.mode="all-filtered",this.selected.clear(),this.excluded.clear(),this.emit()}clear(){this.mode="explicit",this.selected.clear(),this.excluded.clear(),this.emit()}has(e){let t=this.keyOf(e);return this.mode==="all-filtered"?!this.excluded.has(t):this.selected.has(t)}values(e){return this.mode==="all-filtered"?e.filter(t=>!this.excluded.has(this.keyOf(t))):e.filter(t=>this.selected.has(this.keyOf(t)))}snapshot(){return Object.freeze({mode:this.mode,selected:[...this.selected],excluded:[...this.excluded]})}emit(){this.dispatchEvent(new CustomEvent("selection.changed",{detail:this.snapshot()}))}};d(Tn,"SelectionModel");var Oa=Tn;var An=class An extends Oa{constructor(){super(e=>ee(e?.carNum)??String(e?.id??""))}};d(An,"HistorySelectionModel");var Ua=An;var Pn=class Pn{constructor(e){this.storage=e.storage,this.state=e.state}list(){return this.storage.getCarList()}activity(){return this.state.getActivityLog()}offline(){return this.state.getOfflineHistory()}undo(e){return this.state.undoTransaction(e)}remove(e){return this.state.remove(e)}toggle(e,t,s){return this.state.toggle(e,t,s)}patch(e,t,s){return this.state.patch(e,t,s)}removeOffline(e){return this.state.removeOfflineHistory(e)}};d(Pn,"HistoryRepository");var za=Pn;function Wh(o){let e=String(o||""),t=e.indexOf("-");if(t===-1)return document.createTextNode(e);let s=document.createElement("span"),a=document.createElement("button");return a.type="button",a.className="jhs-btn jhs-btn--ghost jhs-btn--sm table-link-param",a.textContent=e.substring(0,t+1),s.appendChild(a),s.appendChild(document.createTextNode(e.substring(t+1))),s}d(Wh,"buildCarNumCell");function Jh(o){let e=document.createElement("span");return String(o||"").split(" ").filter(t=>t.trim()!=="").forEach(t=>{let s=document.createElement("button");s.type="button",s.className="jhs-btn jhs-btn--ghost jhs-btn--sm table-link-param",s.textContent=t,e.appendChild(s)}),e}d(Jh,"buildNamesCell");function Kh(o){let e=document.createElement("div");e.className="action-btns",e.dataset.carNum=String(o.carNum||""),e.dataset.href=o.url?String(o.url):"";let t=document.createElement("button");t.type="button",t.className="jhs-btn jhs-btn--secondary history-detailBtn";let s=document.createElement("span");s.textContent="查看",t.appendChild(s),e.appendChild(t);let a=document.createElement("div");a.className="sub-btns";let r=document.createElement("button");r.type="button",r.className="jhs-btn jhs-btn--ghost sub-btns-toggle",r.setAttribute("aria-haspopup","menu"),r.setAttribute("aria-expanded","false");let i=document.createElement("span");i.textContent="更多操作",r.appendChild(i),a.appendChild(r);let n=document.createElement("div");n.className="sub-btns-menu",n.setAttribute("role","menu");let l=[["history-editBtn","编辑",""],["history-deleteBtn","移除","jhs-btn--danger"],["history-hasWatchBtn",ve,""],["history-hasDownBtn",fe,""],["history-favoriteBtn",Me,""],["history-filterBtn",Le,""]];for(let[c,h,u]of l){let p=document.createElement("button");p.type="button",p.className=`jhs-btn jhs-btn--ghost ${c}`,p.setAttribute("role","menuitem"),u&&p.classList.add(u),p.textContent=h,n.appendChild(p)}return a.appendChild(n),e.appendChild(a),e}d(Kh,"buildActionButtons");function Gh(o){return` + `),e=$("section > div > div.box")),!e)return;let a=this.getRuntimeService("settings"),r=$(".jhs-fold-category-btn"),i=a.snapshot().foldCategoryCollapsed===!0,[n,l]=i?["展开","icon-angle-double-down"]:["折叠","icon-angle-double-up"];r.find("span").text(n).end().find("i").attr("class",l),window.location.href.includes("noFold=1")||e[i?"hide":"show"]();let c=He({settings:a,key:"foldCategoryCollapsed",fallback:!1,apply:d(h=>{i=h===!0;let[u,p]=i?["展开","icon-angle-double-down"]:["折叠","icon-angle-double-up"];r.find("span").text(u).end().find("i").attr("class",p),e[i?"hide":"show"]()},"apply"),onError:d(h=>{clog.error("分类折叠设置保存失败,已恢复",h),show.error("分类折叠设置保存失败,已恢复原设置")},"onError")});r.on("click",(async h=>{h.preventDefault(),await c(!i)}))}};d(En,"FoldCategoryPlugin");var Va=En;var Dn=class Dn extends R{async handle(){if(!window.isDetailPage)return;let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")();if(!this._settingsListenerBound){this._settingsListenerBound=!0;let s=d(a=>{a.detail?.names?.includes("enableMagnetsFilter")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>{e.removeEventListener("settings.changed",s),this._settingsListenerBound=!1}))}t.addCleanup(V?.on("magnet-items-updated",(()=>this.reconfigure()))||(()=>{})),this.reconfigure()}reconfigure(){let e=(this.getRuntimeService("settings").snapshot().enableMagnetsFilter??E)===E;e?this.doFilterMagnet():this.showAll(),$("#magnets-span").text(e?"关闭磁力过滤":"开启磁力过滤"),$("#enable-magnets-filter").attr("aria-pressed",String(e))}async initCss(){return""}getName(){return"HighlightMagnetPlugin"}doFilterMagnet(){let e=this.getRuntimeService("host")?.getDetailResourceBoundary?.();if(!e)return void this.updateFilterHint(!1);let t=e.rows(),s=[],a=!1;t.forEach((r=>{let i=e.getTitleTarget(r);if(!i)return;let n=$(i),l=n.text().toLowerCase(),c=this.getQualitySignals(l,e.hasSubtitleTag(r));$(r).removeClass("high-quality").show().addClass("magnet-row"),l.includes("4k")&&n.css("color","var(--jhs-status-filter-text)"),c.highQuality&&(a=!0,$(r).addClass("high-quality")),this.injectScoreBadge(n,n.text()),s.push(r)})),a&&s.forEach((r=>$(r).hasClass("high-quality")||$(r).hide())),this.updateFilterHint(a)}injectScoreBadge(e,t){try{if(e.find(".jhs-magnet-score").length>0)return;let s=ps({title:t||"",seeders:0}),a=s.total,r=a>=70?"高":a>=40?"中":"低",i=a>=70?"var(--jhs-status-down)":a>=40?"var(--jhs-status-watch)":"var(--jhs-surface-2)",n=a>=70?"var(--jhs-status-down-on)":a>=40?"var(--jhs-status-watch-on)":"var(--jhs-text-muted)",l=`分辨率:${s.resolution}/25 字幕:${s.subtitle}/20 做种:${s.seeders}/35 新鲜度:${s.freshness}/15`,c=$(`${r} ${a}`).css({color:n,backgroundColor:i});e.append(c)}catch(s){clog.debug("磁力评分徽章注入失败,已忽略",s)}}getQualitySignals(e,t=!1){return Ji(e,t)}updateFilterHint(e){$("#enable-magnets-filter").removeClass("do-hide").attr("data-tip",e?"仅显示识别到的高质量或字幕磁力":"未识别到可过滤项,当前未隐藏磁力")}showAll(){$("#enable-magnets-filter").removeClass("do-hide").removeAttr("data-tip");let e=this.getRuntimeService("host")?.getDetailResourceBoundary?.();e?.rows().forEach((t=>{$(t).removeClass("high-quality").show();let s=e.getTitleTarget(t);s&&$(s).css("color","").find(".jhs-magnet-score").remove()}))}};d(Dn,"HighlightMagnetPlugin");var qa=Dn;var Nn=class Nn extends EventTarget{constructor(e){super(),this.keyOf=e,this.mode="explicit",this.selected=new Set,this.excluded=new Set}set(e,t){let s=this.keyOf(e),a=this.mode==="all-filtered"?this.excluded:this.selected;this.mode==="all-filtered"?t?a.delete(s):a.add(s):t?a.add(s):a.delete(s),this.emit()}selectAllFiltered(){this.mode="all-filtered",this.selected.clear(),this.excluded.clear(),this.emit()}clear(){this.mode="explicit",this.selected.clear(),this.excluded.clear(),this.emit()}has(e){let t=this.keyOf(e);return this.mode==="all-filtered"?!this.excluded.has(t):this.selected.has(t)}values(e){return this.mode==="all-filtered"?e.filter(t=>!this.excluded.has(this.keyOf(t))):e.filter(t=>this.selected.has(this.keyOf(t)))}snapshot(){return Object.freeze({mode:this.mode,selected:[...this.selected],excluded:[...this.excluded]})}emit(){this.dispatchEvent(new CustomEvent("selection.changed",{detail:this.snapshot()}))}};d(Nn,"SelectionModel");var Ha=Nn;var Ln=class Ln extends Ha{constructor(){super(e=>ee(e?.carNum)??String(e?.id??""))}};d(Ln,"HistorySelectionModel");var Wa=Ln;var Mn=class Mn{constructor(e){this.storage=e.storage,this.state=e.state}list(){return this.storage.getCarList()}activity(){return this.state.getActivityLog()}offline(){return this.state.getOfflineHistory()}undo(e){return this.state.undoTransaction(e)}remove(e){return this.state.remove(e)}toggle(e,t,s){return this.state.toggle(e,t,s)}patch(e,t,s){return this.state.patch(e,t,s)}removeOffline(e){return this.state.removeOfflineHistory(e)}};d(Mn,"HistoryRepository");var Ja=Mn;function eu(o){let e=String(o||""),t=e.indexOf("-");if(t===-1)return document.createTextNode(e);let s=document.createElement("span"),a=document.createElement("button");return a.type="button",a.className="jhs-btn jhs-btn--ghost jhs-btn--sm table-link-param",a.textContent=e.substring(0,t+1),s.appendChild(a),s.appendChild(document.createTextNode(e.substring(t+1))),s}d(eu,"buildCarNumCell");function tu(o){let e=document.createElement("span");return String(o||"").split(" ").filter(t=>t.trim()!=="").forEach(t=>{let s=document.createElement("button");s.type="button",s.className="jhs-btn jhs-btn--ghost jhs-btn--sm table-link-param",s.textContent=t,e.appendChild(s)}),e}d(tu,"buildNamesCell");function su(o){let e=document.createElement("div");e.className="action-btns",e.dataset.carNum=String(o.carNum||""),e.dataset.href=o.url?String(o.url):"";let t=document.createElement("button");t.type="button",t.className="jhs-btn jhs-btn--secondary history-detailBtn";let s=document.createElement("span");s.textContent="查看",t.appendChild(s),e.appendChild(t);let a=document.createElement("div");a.className="sub-btns";let r=document.createElement("button");r.type="button",r.className="jhs-btn jhs-btn--ghost sub-btns-toggle",r.setAttribute("aria-haspopup","menu"),r.setAttribute("aria-expanded","false");let i=document.createElement("span");i.textContent="更多操作",r.appendChild(i),a.appendChild(r);let n=document.createElement("div");n.className="sub-btns-menu",n.setAttribute("role","menu");let l=[["history-editBtn","编辑",""],["history-deleteBtn","移除","jhs-btn--danger"],["history-hasWatchBtn",ve,""],["history-hasDownBtn",fe,""],["history-favoriteBtn",Oe,""],["history-filterBtn",Be,""]];for(let[c,h,u]of l){let p=document.createElement("button");p.type="button",p.className=`jhs-btn jhs-btn--ghost ${c}`,p.setAttribute("role","menuitem"),u&&p.classList.add(u),p.textContent=h,n.appendChild(p)}return a.appendChild(n),e.appendChild(a),e}d(su,"buildActionButtons");function au(o){return`
      @@ -3716,7 +3723,7 @@ ${i}\r
      - `}d(Gh,"buildEditRecordForm");var Rn=class Rn extends I{constructor(){super(...arguments),this.tableObj=null,this.historyRoot=null,this.historySelectionModel=new Ua,this._historyRepository=null,this.historySorters=[],this.historyFilteredCount=0,this.historySelectionSyncing=!1,this.allCount=0,this.filterCount=0,this.favoriteCount=0,this.hasDownCount=0,this.hasWatchCount=0,this.waitCheckCount=0}getName(){return"HistoryPlugin"}getSourceLabel(e){if(!e)return"";let t=this.getRuntimeService("movie"),s=this.getRuntimeService("settings").snapshot();if(t.matchesProviderUrl("av123",e))return"123AV";try{let a=new URL(e).origin;if(a===t.externalSiteOrigin("javDbBtn",s))return"JavDB";if(a===t.externalSiteOrigin("javBusBtn",s))return"JavBus"}catch{}return e.includes("javdb")?"JavDB":e.includes("javbus")?"JavBus":e.includes("123av")?"123AV":"其他"}get historyRepository(){return this._historyRepository||(this._historyRepository=new za({storage:storageManager,state:this.getRuntimeService("state")}))}async initCss(){return` + `}d(au,"buildEditRecordForm");var Bn=class Bn extends R{constructor(){super(...arguments),this.tableObj=null,this.historyRoot=null,this.historySelectionModel=new Wa,this._historyRepository=null,this.historySorters=[],this.historyFilteredCount=0,this.historySelectionSyncing=!1,this.allCount=0,this.filterCount=0,this.favoriteCount=0,this.hasDownCount=0,this.hasWatchCount=0,this.waitCheckCount=0}getName(){return"HistoryPlugin"}getSourceLabel(e){if(!e)return"";let t=this.getRuntimeService("movie"),s=this.getRuntimeService("settings").snapshot();if(t.matchesProviderUrl("av123",e))return"123AV";try{let a=new URL(e).origin;if(a===t.externalSiteOrigin("javDbBtn",s))return"JavDB";if(a===t.externalSiteOrigin("javBusBtn",s))return"JavBus"}catch{}return e.includes("javdb")?"JavDB":e.includes("javbus")?"JavBus":e.includes("123av")?"123AV":"其他"}get historyRepository(){return this._historyRepository||(this._historyRepository=new Ja({storage:storageManager,state:this.getRuntimeService("state")}))}async initCss(){return` "}constructor(){super(...arguments),this.currentPageFilterCount=0,this.currentPageFavoriteCount=0,this.currentPageHasDownCount=0,this.currentPageHasWatchCount=0,this.currentPageKeywordFilterCount=0,this.currentPageActorFilterCount=0,this.currentPageWaitCheckCount=0,this.currentPageTotalCount=0,this.filterContext=null,this.pendingItems=new Set,this.processTimer=null,this.hdImageObserver=null,this.hdPendingCleanups=new Map,this.hoverPreviewState=null,this.writeQueue=Promise.resolve(),this.itemIndex=new Map,this.recountFrame=null,this.$currentImage=null,this.translationGeneration=0,this.listGeneration=0,this.filterRevision=0,this.refreshRunning=!1,this.refreshDirty=!1,this.refreshAllRequested=!1,this.refreshVisibilityRequested=!1,this.refreshItems=new Set,this.refreshPromise=null}getName(){return"ListPagePlugin"}async handle(){if(!window.isListPage)return;let e=await this.getRuntimeService("scope")(),t=this.getRuntimeService("settings"),s=d(n=>{(n.detail?.names||[]).includes("hoverBigImg")&&this.configureHoverPreview(t.snapshot().hoverBigImg==="yes"?"yes":"no")},"onSettingsChanged");t.addEventListener("settings.changed",s),e.addCleanup((()=>t.removeEventListener("settings.changed",s)));let a=d(async(n={})=>{let l=n?.changedNames;l&&!l.some(c=>Yh.has(c))||await this.requestListRefresh({reason:"event-refresh",full:!0})},"refreshAll");["legacy-refresh","blacklist-rules-changed","filter-rules-changed","settings-changed"].forEach((n=>e.addCleanup(qa().on(n,a)))),e.addCleanup(qa().on("car-state-changed",(async n=>{let l=this.getIndexedItems(n.carNums||[]);await this.requestListRefresh({items:l,reason:"car-state-changed",full:!0})})));let r=t.snapshot().hoverBigImg;this.configureHoverPreview(r===E?"yes":"no"),this.cleanRepeatId(),this.replaceHdImg(),this.addJumpPageControl(),this.fixBusTitleBox();let i=this.advanceListGeneration();await this.doFilter(i),await this.createQuickFilter(),this.reconcileListItems(null,i),await this.bindClick(),this.rememberTagExpand(),$(this.getSelector().itemSelector).attr("data-jhs-processed","true"),this.rebuildItemIndex(),await qa().emit("list-items-added",{items:$(this.getSelector().itemSelector).toArray()},{broadcast:!1}),this.checkDom(e),e.addCleanup((()=>{this.processTimer&&clearTimeout(this.processTimer),this.processTimer=null,this.pendingItems.clear(),this.hdImageObserver?.disconnect(),this.hdImageObserver=null,this.hdPendingCleanups.forEach((n=>n())),this.hdPendingCleanups.clear(),this.configureHoverPreview("no"),this.recountFrame&&(globalThis.cancelAnimationFrame?.(this.recountFrame)??clearTimeout(this.recountFrame)),this.recountFrame=null,this.advanceListGeneration(),this.refreshDirty=!1,this.refreshAllRequested=!1,this.refreshVisibilityRequested=!1,this.refreshItems.clear(),$(this.getSelector().boxSelector).off(".jhsMovieDetail .jhsListVideo .jhsListMenu"),$("#jhs-quick-filter").off(),this.itemIndex.clear()}))}advanceListGeneration(){return this.listGeneration+=1,this.captureListRevision()}captureListRevision(){return`${this.listGeneration}:${this.filterRevision}`}isCurrentListGeneration(e){return e===this.captureListRevision()}recordListPhase(e,t=null){let s=globalThis.__jhsBrowserDiagnostics;if(!s)return;let a=s.listPhases||(s.listPhases=[]);a.push({phase:e,generation:this.listGeneration,filterRevision:this.filterRevision,activeQuickFilter:this.activeQuickFilter||"waitCheck",itemCount:t??$(this.getSelector().itemSelector).length}),a.length>200&&a.splice(0,a.length-200)}reconcileListItems(e,t){return this.isCurrentListGeneration(t)?(this.applyVisibility(e),!0):!1}requestListRefresh({items:e=null,reason:t="refresh",full:s=!1,visibilityOnly:a=!1}={}){if((s||e!==null)&&this.advanceListGeneration(),this.refreshDirty=!0,s?this.refreshAllRequested=!0:a?this.refreshVisibilityRequested=!0:(e||[]).forEach(i=>this.refreshItems.add(i)),this.recordListPhase("refresh-request:"+t),this.refreshRunning)return this.refreshPromise;this.refreshRunning=!0;let r=d(async()=>{try{for(;this.refreshDirty;){let i=this.refreshAllRequested,n=this.refreshVisibilityRequested&&!i,l=[...this.refreshItems];this.refreshDirty=!1,this.refreshAllRequested=!1,this.refreshVisibilityRequested=!1,this.refreshItems.clear();let c=this.captureListRevision();this.recordListPhase("refresh-start",i?null:l.length);let h;if(i?(this.filterContext=null,storageManager._invalidateCache(storageManager.car_list_key),h=await this.doFilter(c)):n?h=!0:h=await this.doFilterItems(l.filter(u=>u.isConnected),c),!this.isCurrentListGeneration(c)){this.refreshDirty=!0,this.refreshAllRequested=!0;continue}if(h!==!1&&this.reconcileListItems(i?null:l,c),i){let u=this.getOptionalDependency("HistoryPlugin");u?.tableObj&&u.tableObj.setData()}this.recordListPhase("refresh-end")}return!0}finally{this.refreshRunning=!1,this.refreshPromise=null}},"run");return this.refreshPromise=r()}async createQuickFilter(){if($("#jhs-quick-filter").length)return;let e=this.getSelector(),t=nt.map((c=>``)).join(""),s=It.map(((c,h)=>`${h===1?'':""}`)).join(""),a=`
      + `)}$("#waitCheckBtn > span").text("开始鉴定");let i=$("#newVideoCount").detach(),n=$("#newVideoBtn > span");n.length&&n.empty().append(document.createTextNode("新作品 ("),i,document.createTextNode(")"))}sortMenuHtml(e,t="选择列表排序方式"){let s={default:"默认",rateCount:"评价人数",date:"时间"},a=typeof e=="string"&&e in s?e:"default",r=s[a];return`
      `}bindEvent(){$("#waitCheckBtn").on("click",(s=>{this.openWaitCheck().catch((a=>clog.error("待鉴定列表打开失败",a)))})),$("#newVideoBtn").on("click",(s=>{this.getOptionalDependency("NewVideoPlugin")?.openDialog?.()})),$("#blacklistBtn").on("click",(s=>{this.getOptionalDependency("BlacklistPlugin")?.openBlacklistDialog?.()})),this.bindSortMenu();let e=this.getOptionalDependency("BlacklistPlugin"),t=this.getOptionalDependency("ListPagePlugin");$("#addBlacklistBtn").on("click",(async s=>{await e?.addBlacklist?.(s)})),$("#filterAllVideo").on("click",(async s=>{let a=M?$(".actor-section-name"):$(".avatar-box .photo-info .pb10");if(a.length===0)return void show.error("获取演员名称失败");let r=a.text().trim().split(",")[0];this.loadObj=loading();try{await e?.filterAllVideo?.(r)}catch(i){clog.error(i)}finally{this.loadObj.close()}})),$("#favoriteAllVideo").on("click",(async s=>{let a=this.buildBatchScope();this.loadObj=loading();try{await t?.batchSaveAllVideos?.(a,ue)}catch(r){clog.error(r)}finally{this.loadObj.close()}})),$("#hasDownAllVideo").on("click",(async s=>{let a=this.buildBatchScope();this.loadObj=loading();try{await t?.batchSaveAllVideos?.(a,pe)}catch(r){clog.error(r)}finally{this.loadObj.close()}}))}bindSortMenu(){let e=$(".jhs-sort-control");if(!e.length)return;let t=e.find("#sort-toggle-btn"),s=e.find(".jhs-sort-menu"),a=d((r=!1)=>{s.removeClass("is-open"),t.attr("aria-expanded","false"),r&&t.trigger("focus")},"close");t.on("click",(r=>{r.preventDefault(),r.stopPropagation();let i=!s.hasClass("is-open");s.toggleClass("is-open",i),t.attr("aria-expanded",String(i)),i&&s.find('[aria-checked="true"]').trigger("focus")})),s.on("click",".jhs-sort-option",(async r=>{let i=$(r.currentTarget),n=i.data("sort-method"),l=s.find('.jhs-sort-option[aria-checked="true"]').first(),c=$("#jhs-sort-current").text();s.find(".jhs-sort-option").attr("aria-checked","false"),i.attr("aria-checked","true"),$("#jhs-sort-current").text(i.text()),a(!0);try{await this.selectSortMethod(n)}catch(h){s.find(".jhs-sort-option").attr("aria-checked","false"),l.attr("aria-checked","true"),$("#jhs-sort-current").text(c),clog.error("排序设置保存失败,已恢复",h),show.error("排序设置保存失败,已恢复原设置")}})).on("keydown",".jhs-sort-option",(r=>{let i=s.find(".jhs-sort-option"),n=i.index(r.currentTarget);if(r.key==="Escape")return r.preventDefault(),a(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(r.key))return;r.preventDefault();let l=r.key==="Home"?0:r.key==="End"?i.length-1:r.key==="ArrowDown"?(n+1)%i.length:(n-1+i.length)%i.length;i.eq(l).trigger("focus")})),$(document).off("click.jhsSortMenu").on("click.jhsSortMenu",(r=>{$(r.target).closest(e).length||a()}))}async sortItems(e){let t=this.supportsLiveSorting();if(!this.supportsSorting())return;let s=this.getRuntimeService("settings").snapshot().autoPage??E;if(ws||s===E&&!t&&e!=="default")return;let a=e||this.activeSortMethod();if(!a)return;let r=this.getSelector(),i=$(r.boxSelector),n=$(r.itemSelector);n.each(((h,u)=>{$(u).attr("data-original-index")||$(u).attr("data-original-index",h)}));let l=n.get().map(((h,u)=>{let p=$(h),g=Number(p.attr("data-original-index"))||0;if(a==="default")return{element:h,key:g,originalIndex:g,index:u};if(a==="rateCount"){let v=Number(p.attr("data-jhs-rate-count")),b=p.find(".score").text().replaceAll(",","").match(/(?:由\s*)?(\d+)\s*人(?:评价)?/);return{element:h,key:Number.isFinite(v)?v:b?Number(b[1]):0,originalIndex:g,index:u}}let m=p.attr("data-jhs-publish-time")||p.find(".meta").text().trim()||p.find("date").filter(((v,b)=>/^\d{4}-\d{1,2}-\d{1,2}$/.test($(b).text().trim()))).first().text().trim(),f=Date.parse(m);return{element:h,key:Number.isFinite(f)?f:0,originalIndex:g,index:u}}));l.sort(((h,u)=>a==="default"?h.key-u.key:u.key-h.key||h.originalIndex-u.originalIndex||h.index-u.index));let c=l.map(h=>h.element);a==="default"?$(c).appendTo(i):i.empty().append(c)}isHitShowPage(){return je(window.location).kind==="playback-ranking"}isOwnedRankingPage(){return M&&["movie-ranking","playback-ranking","top250-ranking"].includes(je(window.location).kind)}isExternalFc2CatalogPage(){return M&&je(window.location).kind==="external-fc2-catalog"}getBatchActionTip(e){let t=this.isOwnedRankingPage()?"当前榜单页面":this.isExternalFc2CatalogPage()?"当前片库页面":"当前搜索全部分页";return e==="favorite"?`收藏${t}中符合当前筛选的作品`:`标记${t}中符合当前筛选的作品为已下载`}activeSortMethod(){return this.isOwnedRankingPage()?this.ownedRankingSortOverride||"default":this.getRuntimeService("settings").snapshot().sortMethod||"default"}async selectSortMethod(e){if(this.isOwnedRankingPage()){this.ownedRankingSortOverride=e,await this.sortItems(e);return}await this.getRuntimeService("settings").set("sortMethod",e),await this.sortItems()}isFc2ListPage(){return M&&window.location.pathname==="/search_advanced"&&new URLSearchParams(window.location.search).get("type")==="3"}supportsSorting(){return this.supportsLiveSorting()?!0:!(M&&window.location.pathname==="/search_advanced")}supportsLiveSorting(){return this.isOwnedRankingPage()||this.isFc2ListPage()}buildBatchScope(){if(!(M?X.includes("/actors/"):X.includes("/star/")))return{kind:"search",displayName:this.isOwnedRankingPage()?"当前榜单页面":this.isExternalFc2CatalogPage()?"当前片库页面":"当前搜索条件",recordName:""};let t=this.getActressPageInfo();return{kind:"actor",displayName:t?.name||"",recordName:t?.name||""}}async openWaitCheck(){let e=this.getSelector(),t=await storageManager.getSetting("waitCheckCount",5),s=0,a=this.getOptionalDependency("ListPagePlugin");if(!a)return void show.info("列表功能已禁用");for(let r of $(e.itemSelector).toArray()){if(s>=t)break;let i=$(r),n=H(JSON.parse(i.attr("data-jhs-flags")||"{}")),l=JSON.parse(i.attr("data-jhs-visibility")||"{}");oe(n)||vt(n,l)||(await a.openMovieDetail(i,{autoplay:!0,newTab:!1}),s++)}s===0&&show.info("没有需鉴定的视频")}};d(On,"ListPageButtonPlugin");var Ga=On;function Qa(){if(!V)throw new Error("List EventBus 未初始化");return V}d(Qa,"getListEventBus");function ru(o){return o?.jquery?o:$(o)}d(ru,"normalizeCard");var iu=new Set(["tagPosition","defaultQuickFilterTab"]),xt={IS_FILTERED:{text:at,color:"var(--jhs-status-filter)",on:"var(--jhs-status-filter-on)",reasonType:"单番号屏蔽",isCounted:!0,countKey:"currentPageFilterCount"},IS_FAVORITE:{text:rt,color:"var(--jhs-status-fav)",on:"var(--jhs-status-fav-on)",reasonType:"",isCounted:!0,countKey:"currentPageFavoriteCount"},IS_HAS_DOWN:{text:fe,color:"var(--jhs-status-down)",on:"var(--jhs-status-down-on)",reasonType:"",isCounted:!0,countKey:"currentPageHasDownCount"},IS_HAS_WATCH:{text:ve,color:"var(--jhs-status-watch)",on:"var(--jhs-status-watch-on)",reasonType:"",isCounted:!0,countKey:"currentPageHasWatchCount"},IS_KEYWORD_FILTER:{text:"关键词屏蔽",color:"var(--jhs-status-filter)",on:"var(--jhs-status-filter-on)",reasonType:"",isCounted:!0,countKey:"currentPageKeywordFilterCount"},IS_ACTOR_FILTER:{text:"男演员屏蔽",color:"var(--jhs-status-filter)",on:"var(--jhs-status-filter-on)",reasonType:"",isCounted:!0,countKey:"currentPageActorFilterCount"},IS_ACTRESS_FILTER:{text:"女演员屏蔽",color:"var(--jhs-status-filter)",on:"var(--jhs-status-filter-on)",reasonType:"",isCounted:!0,countKey:"currentPageActorFilterCount"},IS_WAIT_CHECK:{text:"",color:"",on:"",reasonType:"",isCounted:!0,countKey:"currentPageWaitCheckCount"}},Un=class Un extends R{async initCss(){return""}constructor(){super(...arguments),this.currentPageFilterCount=0,this.currentPageFavoriteCount=0,this.currentPageHasDownCount=0,this.currentPageHasWatchCount=0,this.currentPageKeywordFilterCount=0,this.currentPageActorFilterCount=0,this.currentPageWaitCheckCount=0,this.currentPageTotalCount=0,this.filterContext=null,this.pendingItems=new Set,this.processTimer=null,this.hdImageObserver=null,this.hdPendingCleanups=new Map,this.hoverPreviewState=null,this.writeQueue=Promise.resolve(),this.itemIndex=new Map,this.recountFrame=null,this.$currentImage=null,this.translationGeneration=0,this.listGeneration=0,this.filterRevision=0,this.refreshRunning=!1,this.refreshDirty=!1,this.refreshAllRequested=!1,this.refreshVisibilityRequested=!1,this.refreshItems=new Set,this.refreshPromise=null}getName(){return"ListPagePlugin"}async handle(){if(!window.isListPage)return;let e=await this.getRuntimeService("scope")(),t=this.getRuntimeService("settings"),s=d(n=>{(n.detail?.names||[]).includes("hoverBigImg")&&this.configureHoverPreview(t.snapshot().hoverBigImg==="yes"?"yes":"no")},"onSettingsChanged");t.addEventListener("settings.changed",s),e.addCleanup((()=>t.removeEventListener("settings.changed",s)));let a=d(async(n={})=>{let l=n?.changedNames;l&&!l.some(c=>iu.has(c))||await this.requestListRefresh({reason:"event-refresh",full:!0})},"refreshAll");["legacy-refresh","blacklist-rules-changed","filter-rules-changed","settings-changed"].forEach((n=>e.addCleanup(Qa().on(n,a)))),e.addCleanup(Qa().on("car-state-changed",(async n=>{let l=this.getIndexedItems(n.carNums||[]);await this.requestListRefresh({items:l,reason:"car-state-changed",full:!0})})));let r=t.snapshot().hoverBigImg;this.configureHoverPreview(r===E?"yes":"no"),this.cleanRepeatId(),this.replaceHdImg(),this.addJumpPageControl(),this.fixBusTitleBox();let i=this.advanceListGeneration();await this.doFilter(i),await this.createQuickFilter(),this.reconcileListItems(null,i),await this.bindClick(),this.rememberTagExpand(),$(this.getSelector().itemSelector).attr("data-jhs-processed","true"),this.rebuildItemIndex(),await Qa().emit("list-items-added",{items:$(this.getSelector().itemSelector).toArray()},{broadcast:!1}),this.checkDom(e),e.addCleanup((()=>{this.processTimer&&clearTimeout(this.processTimer),this.processTimer=null,this.pendingItems.clear(),this.hdImageObserver?.disconnect(),this.hdImageObserver=null,this.hdPendingCleanups.forEach((n=>n())),this.hdPendingCleanups.clear(),this.configureHoverPreview("no"),this.recountFrame&&(globalThis.cancelAnimationFrame?.(this.recountFrame)??clearTimeout(this.recountFrame)),this.recountFrame=null,this.advanceListGeneration(),this.refreshDirty=!1,this.refreshAllRequested=!1,this.refreshVisibilityRequested=!1,this.refreshItems.clear(),$(this.getSelector().boxSelector).off(".jhsMovieDetail .jhsListVideo .jhsListMenu"),$("#jhs-quick-filter").off(),this.itemIndex.clear()}))}advanceListGeneration(){return this.listGeneration+=1,this.captureListRevision()}captureListRevision(){return`${this.listGeneration}:${this.filterRevision}`}isCurrentListGeneration(e){return e===this.captureListRevision()}recordListPhase(e,t=null){let s=globalThis.__jhsBrowserDiagnostics;if(!s)return;let a=s.listPhases||(s.listPhases=[]);a.push({phase:e,generation:this.listGeneration,filterRevision:this.filterRevision,activeQuickFilter:this.activeQuickFilter||"waitCheck",itemCount:t??$(this.getSelector().itemSelector).length}),a.length>200&&a.splice(0,a.length-200)}reconcileListItems(e,t){return this.isCurrentListGeneration(t)?(this.applyVisibility(e),!0):!1}requestListRefresh({items:e=null,reason:t="refresh",full:s=!1,visibilityOnly:a=!1}={}){if((s||e!==null)&&this.advanceListGeneration(),this.refreshDirty=!0,s?this.refreshAllRequested=!0:a?this.refreshVisibilityRequested=!0:(e||[]).forEach(i=>this.refreshItems.add(i)),this.recordListPhase("refresh-request:"+t),this.refreshRunning)return this.refreshPromise;this.refreshRunning=!0;let r=d(async()=>{try{for(;this.refreshDirty;){let i=this.refreshAllRequested,n=this.refreshVisibilityRequested&&!i,l=[...this.refreshItems];this.refreshDirty=!1,this.refreshAllRequested=!1,this.refreshVisibilityRequested=!1,this.refreshItems.clear();let c=this.captureListRevision();this.recordListPhase("refresh-start",i?null:l.length);let h;if(i?(this.filterContext=null,storageManager._invalidateCache(storageManager.car_list_key),h=await this.doFilter(c)):n?h=!0:h=await this.doFilterItems(l.filter(u=>u.isConnected),c),!this.isCurrentListGeneration(c)){this.refreshDirty=!0,this.refreshAllRequested=!0;continue}if(h!==!1&&this.reconcileListItems(i?null:l,c),i){let u=this.getOptionalDependency("HistoryPlugin");u?.tableObj&&u.tableObj.setData()}this.recordListPhase("refresh-end")}return!0}finally{this.refreshRunning=!1,this.refreshPromise=null}},"run");return this.refreshPromise=r()}async createQuickFilter(){if($("#jhs-quick-filter").length)return;let e=this.getSelector(),t=lt.map((c=>``)).join(""),s=Dt.map(((c,h)=>`${h===1?'':""}`)).join(""),a=`
      ${t}
      -
      `;M?$(e.boxSelector).before(a):B&&$(".masonry").before(a);let r=$("#jhs-quick-filter"),i=r.find(".jhs-quick-filter__toggle"),n=r.find(".jhs-quick-filter__menu"),l=d((c=!1)=>{n.removeClass("is-open"),i.attr("aria-expanded","false"),c&&i.trigger("focus")},"closeMenu");r.on("click",".jhs-segmented__item",(c=>this.setQuickFilter($(c.currentTarget).data("jhs-filter")))).on("keydown",".jhs-segmented__item",(c=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(c.key))return;c.preventDefault();let h=r.find(".jhs-segmented__item"),u=h.index(c.currentTarget),p=c.key==="Home"?0:c.key==="End"?h.length-1:c.key==="ArrowRight"?(u+1)%h.length:(u-1+h.length)%h.length;h.eq(p).trigger("click").trigger("focus")})).on("click",".jhs-filter-option",(c=>{this.setQuickFilter($(c.currentTarget).data("jhs-filter")),l(!0)})).on("keydown",".jhs-filter-option",(c=>{let h=n.find(".jhs-filter-option"),u=h.index(c.currentTarget);if(c.key==="Escape")return c.preventDefault(),l(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(c.key))return;c.preventDefault();let p=c.key==="Home"?0:c.key==="End"?h.length-1:c.key==="ArrowDown"?(u+1)%h.length:(u-1+h.length)%h.length;h.eq(p).trigger("focus")})),i.on("click",(c=>{c.preventDefault(),c.stopPropagation();let h=!n.hasClass("is-open");n.toggleClass("is-open",h),i.attr("aria-expanded",String(h)),h&&(n.find('[aria-checked="true"]').first().length?n.find('[aria-checked="true"]').first():n.find(".jhs-filter-option").first()).trigger("focus")})),$(document).off("click.jhsQuickFilter").on("click.jhsQuickFilter",(c=>{$(c.target).closest(r).length||l()})),this.activeQuickFilter||(this.activeQuickFilter=_e(await storageManager.getSetting("defaultQuickFilterTab","waitCheck"))),this.applyVisibility(),this.syncQuickFilterUi()}applyVisibility(e=null){let t=this.activeQuickFilter||"waitCheck",s=this.getSelector().itemSelector,a=e?$(e):$(s);this.recordListPhase("applyVisibility",a.length),a.each(((r,i)=>{let n=$(i),l=H(JSON.parse(n.attr("data-jhs-flags")||"{}")),c=JSON.parse(n.attr("data-jhs-visibility")||"{}"),h=n.attr("data-jhs-recent")==="yes";xl({filter:t,flags:l,visibilityReasons:c,recent:h})?n.show():n.hide()}))}setQuickFilter(e,{syncUi:t=!0}={}){this.filterRevision+=1,this.activeQuickFilter=_e(e),this.recordListPhase("setQuickFilter"),this.requestListRefresh({reason:"quick-filter",visibilityOnly:!0})?.catch(s=>clog.error("列表筛选刷新失败",s)),this.reconcileListItems(null,this.captureListRevision()),t&&this.syncQuickFilterUi()}syncQuickFilterUi(){let e=_e(this.activeQuickFilter),t=nt.includes(e),s=$("#jhs-quick-filter"),a=s.find(".jhs-segmented__item"),r=s.find(".jhs-filter-option");a.removeClass("active").attr({"aria-selected":"false",tabindex:"-1"}),t?a.filter(`[data-jhs-filter="${e}"]`).addClass("active").attr({"aria-selected":"true",tabindex:"0"}):a.first().attr("tabindex","0"),r.attr("aria-checked","false").filter(`[data-jhs-filter="${e}"]`).attr("aria-checked","true"),s.find(".jhs-quick-filter__label").text(t?"更多筛选":`筛选:${Pe[e]}`),$(".jhs-mobile-filter-label").text(`筛选:${Pe[e]}`),$(".jhs-mobile-filter-option").attr("aria-checked","false").filter(`[data-jhs-filter="${e}"]`).attr("aria-checked","true")}rememberTagExpand(){if(!window.location.href.includes("actors"))return;let e=$(".tag-expand");if(e.length===0)return;let t=this.getRuntimeService("storage"),s="jhs_tag_expand",a=t.getLocal(s)==="true",r=$(".actor-tags .content");a&&r.hasClass("collapse")&&e[0].click(),e.on("click",(function(){let i=!$(".actor-tags .content").hasClass("collapse");clog.debug("触发"),t.setLocal(s,i.toString())}))}checkDom(e=null){if(!window.isListPage)return;let t=this.getSelector(),s=document.querySelector(t.boxSelector);if(!s)return void clog.error("没有找到容器节点!");e&&e.observe(s,(a=>{for(let r of a){this.removeIndexedItems(r.removedNodes),r.addedNodes.length&&(this.advanceListGeneration(),this.recordListPhase("dom-added",r.addedNodes.length));for(let i of r.addedNodes){if(i.nodeType!==Node.ELEMENT_NODE)continue;let n=i;n.matches?.(t.itemSelector)&&n.dataset.jhsProcessed!=="true"&&this.pendingItems.add(n),n.querySelectorAll?.(t.itemSelector).forEach(l=>{l.dataset.jhsProcessed!=="true"&&this.pendingItems.add(l)})}}this.pendingItems.size&&(this.processTimer&&clearTimeout(this.processTimer),this.processTimer=setTimeout((()=>{let r=[...this.pendingItems].filter(n=>n.isConnected&&n.dataset.jhsProcessed!=="true"),i=this.captureListRevision();this.pendingItems.clear(),this.processTimer=null,r.length&&this.processAddedItems(r,i).catch(n=>clog.error("列表增量处理失败",n))}),100))}),{childList:!0,subtree:!1})}async processAddedItems(e,t=this.captureListRevision()){let s=this.getSelector(),a=e.flatMap(i=>[...i.querySelectorAll(s.coverImgSelector)]);this.replaceHdImg(a),this.addJumpPageControl(),this.fixBusTitleBox(e),await this.requestListRefresh({items:e,reason:"dom-added"})&&(await this.getOptionalDependency("ListPageButtonPlugin")?.sortItems?.(),await this.getOptionalDependency("CoverButtonPlugin")?.addSvgBtn?.(e),e.forEach(i=>i.dataset.jhsProcessed="true"),this.indexItems(e),await qa().emit("list-items-added",{items:e},{broadcast:!1}),this.getOptionalDependency("AutoPagePlugin")?.checkLoad?.())}rebuildItemIndex(){this.itemIndex.clear();let e=$(this.getSelector().itemSelector).toArray();this.indexItems(e),this.recordListPhase("rebuildItemIndex",e.length)}indexItems(e){e.forEach(t=>{try{let s=C(this.findCarNumAndHref($(t)).carNum);if(!s)return;let a=this.itemIndex.get(s)||new Set;a.add(t),this.itemIndex.set(s,a)}catch(s){clog.debug("列表项索引跳过无效卡片",s)}})}removeIndexedItems(e){let t=new Set;Array.from(e||[]).forEach(s=>{let a=s;s.nodeType===Node.ELEMENT_NODE&&(t.add(a),a.querySelectorAll?.(this.getSelector().itemSelector).forEach(r=>t.add(r)))}),t.size&&this.itemIndex.forEach(((s,a)=>{s.forEach(r=>{t.has(r)&&s.delete(r)}),s.size||this.itemIndex.delete(a)}))}getIndexedItems(e){let t=new Set;return e.map(C).forEach(s=>{if(!s)return;let a=this.itemIndex.get(s);a?.forEach(r=>r.isConnected?t.add(r):a.delete(r)),a&&!a.size&&this.itemIndex.delete(s)}),[...t]}fixBusTitleBox(e=null){B&&(e?$(e).toArray():$(this.getSelector().itemSelector).toArray()).forEach(t=>{var s;let a=$(t);if(a.find(".avatar-box").length>0)return;let r=((s=a.find("img").attr("title"))==null?void 0:s.trim())||"";a.find(".photo-info span:first").contents().first().wrap(`${r}`),a.find("br").remove()})}cleanRepeatId(){if(!B)return;$("#waterfall_h").removeAttr("id").attr("id","no-page");let e=$('[id="waterfall"]');e.length!==0&&e.each(((t,s)=>{let a=$(s);a.hasClass("masonry")||(a.children().insertAfter(a),a.remove())}))}async doFilter(e=this.captureListRevision()){return this.doFilterItems(null,e)}async doFilterItems(e=null,t=this.captureListRevision()){if(!window.isListPage)return!1;let s=e?$(e).toArray():$(this.getSelector().itemSelector).toArray();if(!s.length)return!0;let a=await this.filterMovieList(s,t);return a&&B&&setTimeout((()=>{this.getOptionalDependency("BusImgPlugin")?.logImageHeightsByRow?.(this.getRuntimeService("settings").snapshot()).catch(r=>clog.error("JavBus图片高度修正失败",r))})),a}async yieldListFrame(){await new Promise(e=>{window.requestAnimationFrame?window.requestAnimationFrame((()=>setTimeout(e))):setTimeout(e)})}async createEvaluationContext(){return is(await this.getFilterContext())}async getFilterContext(){if(this.filterContext)return this.filterContext;let[e,t,s,a,r,i]=await Promise.all([storageManager.getTitleFilterKeyword(),storageManager.getBlacklistMap(),storageManager.getBlacklistCarList(),storageManager.getSetting(),storageManager.getCarMap(),this.getRuntimeService("state").getActivityLog()]),n=new Map,l=new Map,c=new Set,h=Date.now()-7*864e5;i.entries.filter(u=>u.commitState==="committed"&&Date.parse(u.createdAt)>=h).forEach(u=>{u.changes.filter(p=>p.undoState!=="reverted"&&p.fields?.some(g=>g.startsWith("stateFlags."))).forEach(p=>c.add(p.carNum))});for(let u of s){let p=t.get(u.starId)?.role;if(!p){clog.error("黑名单数据源丢失演员信息",u);continue}let g=p===Oe?n:l,m=C(u.carNum);g.has(m)||g.set(m,u.names)}return this.filterContext={titleKeywords:e,settings:a,carMap:r,recentCarNums:c,actorCarNumToNameMap:n,actressCarNumToNameMap:l}}collectCurrentPageSummary(){let e={total:0,pending:0,blockedItems:0,favorite:0,downloaded:0,watched:0,debug:{manualBlocked:0,keywordBlocked:0,actorBlocked:0,actressBlocked:0}};return $(this.getSelector().itemSelector).each(((t,s)=>{let a=$(s);if(B&&a.find(".avatar-box").length>0)return;let r=H(JSON.parse(a.attr("data-jhs-flags")||"{}")),i=JSON.parse(a.attr("data-jhs-visibility")||"{}"),n=ft(r,i);e.total++,r.favorite&&e.favorite++,r.downloaded&&e.downloaded++,r.watched&&e.watched++,n&&e.blockedItems++,!oe(r)&&!n&&e.pending++,r.blocked&&e.debug.manualBlocked++,i.keyword&&e.debug.keywordBlocked++,i.actorBlacklist&&e.debug.actorBlocked++,i.actressBlacklist&&e.debug.actressBlocked++})),e}getCurrentPageSummary(){return this.collectCurrentPageSummary()}recountStatuses(){let e=this.collectCurrentPageSummary();return this.currentPageFilterCount=e.debug.manualBlocked,this.currentPageFavoriteCount=e.favorite,this.currentPageHasDownCount=e.downloaded,this.currentPageHasWatchCount=e.watched,this.currentPageKeywordFilterCount=e.debug.keywordBlocked,this.currentPageActorFilterCount=e.debug.actorBlocked+e.debug.actressBlocked,this.currentPageWaitCheckCount=e.pending,this.currentPageTotalCount=e.total,e}scheduleRecount(){if(this.recountFrame)return;let e=window.requestAnimationFrame||(t=>setTimeout(t,0));this.recountFrame=e((()=>{this.recountFrame=null,this.recountStatuses()}))}async translateListItems(e){if((this.getRuntimeService("settings").snapshot().translateTitle??E)!==E)return;let t=0,s=null;await Ae(e,3,(async(a,r)=>{try{r>0&&r%8===0&&await this.yieldListFrame(),await this.translate(Qh(a))}catch(i){t++,s??(s=i)}})),t&&clog.error(`列表标题翻译失败 ${t} 项`,s)}async filterMovieList(e,t=this.captureListRevision()){if(this.recordListPhase("doFilter-start",e.length),!this.isCurrentListGeneration(t))return!1;let s=this.activeQuickFilter||"waitCheck";utils.time("累计耗费时间"),utils.time("读取数据耗时");let{titleKeywords:a,settings:r,carMap:i,recentCarNums:n,actorCarNumToNameMap:l,actressCarNumToNameMap:c}=await this.getFilterContext(),h=utils.time("读取数据耗时");if(!this.isCurrentListGeneration(t))return!1;let u=is({titleKeywords:a,settings:r,carMap:i,recentCarNums:n,actorCarNumToNameMap:l,actressCarNumToNameMap:c});utils.time("组装数据耗时");let p=utils.time("组装数据耗时"),g=r?.tagPosition||"rightTop";this.currentPageFilterCount=0,this.currentPageFavoriteCount=0,this.currentPageHasDownCount=0,this.currentPageHasWatchCount=0,this.currentPageKeywordFilterCount=0,this.currentPageActorFilterCount=0,this.currentPageWaitCheckCount=0,this.currentPageTotalCount=0,utils.time("处理页面耗时");let m=[];for(let b=0;b0&&b%12==0&&await this.yieldListFrame();let w=$(e[b]);if(B&&w.find(".avatar-box").length>0)continue;let{carNum:S,title:j}=this.findCarNumAndHref(w),{flags:k,visibilityReasons:x,hardHidden:_}=ns({carNum:S,title:j},u,{filter:s}),R=x.keyword?Ai(u.titleKeywords,j,S):null;w.attr("data-jhs-flags",JSON.stringify(k)).attr("data-jhs-visibility",JSON.stringify(x)).attr("data-jhs-recent",n.has(S)?E:ne).attr("data-jhs-tag-position",g);let L=JSON.stringify({flags:k,visibilityReasons:x,P:g});if(w.attr("data-jhs-state-signature")!==L){w.attr("data-jhs-state-signature",L),w.find(".jhs-status-tags").remove();let N=[[k.blocked,jt.IS_FILTERED,"单番号屏蔽"],[k.favorite,jt.IS_FAVORITE,""],[k.downloaded,jt.IS_HAS_DOWN,""],[k.watched,jt.IS_HAS_WATCH,""],[x.keyword,jt.IS_KEYWORD_FILTER,R||"未知"],[x.actorBlacklist,jt.IS_ACTOR_FILTER,l.get(S)||""],[x.actressBlacklist,jt.IS_ACTRESS_FILTER,c.get(S)||""]].filter(A=>A[0]);if(N.length){let A=$(``);if(N.forEach((([,O,U])=>{let q=$(`${T(O.text)}`);q.css({color:O.on,backgroundColor:O.color}),A.append(q)})),M)w.find(".tags").append(A);else if(B){let O=w.find(".item-tag");O.length?O.append(A):w.find(".photo-info > span > div").append(A)}}}_||m.push(w)}this.scheduleRecount(),this.translateListItems(m).catch(b=>clog.error("列表页翻译任务失败",b)),this.recordListPhase("doFilter-end",e.length);let f=utils.time("处理页面耗时"),v=utils.time("累计耗费时间");clog.html(` +
      `;M?$(e.boxSelector).before(a):B&&$(".masonry").before(a);let r=$("#jhs-quick-filter"),i=r.find(".jhs-quick-filter__toggle"),n=r.find(".jhs-quick-filter__menu"),l=d((c=!1)=>{n.removeClass("is-open"),i.attr("aria-expanded","false"),c&&i.trigger("focus")},"closeMenu");r.on("click",".jhs-segmented__item",(c=>this.setQuickFilter($(c.currentTarget).data("jhs-filter")))).on("keydown",".jhs-segmented__item",(c=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(c.key))return;c.preventDefault();let h=r.find(".jhs-segmented__item"),u=h.index(c.currentTarget),p=c.key==="Home"?0:c.key==="End"?h.length-1:c.key==="ArrowRight"?(u+1)%h.length:(u-1+h.length)%h.length;h.eq(p).trigger("click").trigger("focus")})).on("click",".jhs-filter-option",(c=>{this.setQuickFilter($(c.currentTarget).data("jhs-filter")),l(!0)})).on("keydown",".jhs-filter-option",(c=>{let h=n.find(".jhs-filter-option"),u=h.index(c.currentTarget);if(c.key==="Escape")return c.preventDefault(),l(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(c.key))return;c.preventDefault();let p=c.key==="Home"?0:c.key==="End"?h.length-1:c.key==="ArrowDown"?(u+1)%h.length:(u-1+h.length)%h.length;h.eq(p).trigger("focus")})),i.on("click",(c=>{c.preventDefault(),c.stopPropagation();let h=!n.hasClass("is-open");n.toggleClass("is-open",h),i.attr("aria-expanded",String(h)),h&&(n.find('[aria-checked="true"]').first().length?n.find('[aria-checked="true"]').first():n.find(".jhs-filter-option").first()).trigger("focus")})),$(document).off("click.jhsQuickFilter").on("click.jhsQuickFilter",(c=>{$(c.target).closest(r).length||l()})),this.activeQuickFilter||(this.activeQuickFilter=_e(await storageManager.getSetting("defaultQuickFilterTab","waitCheck"))),this.applyVisibility(),this.syncQuickFilterUi()}applyVisibility(e=null){let t=this.activeQuickFilter||"waitCheck",s=this.getSelector().itemSelector,a=e?$(e):$(s);this.recordListPhase("applyVisibility",a.length),a.each(((r,i)=>{let n=$(i),l=H(JSON.parse(n.attr("data-jhs-flags")||"{}")),c=JSON.parse(n.attr("data-jhs-visibility")||"{}"),h=n.attr("data-jhs-recent")==="yes";Pl({filter:t,flags:l,visibilityReasons:c,recent:h})?n.show():n.hide()}))}setQuickFilter(e,{syncUi:t=!0}={}){this.filterRevision+=1,this.activeQuickFilter=_e(e),this.recordListPhase("setQuickFilter"),this.requestListRefresh({reason:"quick-filter",visibilityOnly:!0})?.catch(s=>clog.error("列表筛选刷新失败",s)),this.reconcileListItems(null,this.captureListRevision()),t&&this.syncQuickFilterUi()}syncQuickFilterUi(){let e=_e(this.activeQuickFilter),t=lt.includes(e),s=$("#jhs-quick-filter"),a=s.find(".jhs-segmented__item"),r=s.find(".jhs-filter-option");a.removeClass("active").attr({"aria-selected":"false",tabindex:"-1"}),t?a.filter(`[data-jhs-filter="${e}"]`).addClass("active").attr({"aria-selected":"true",tabindex:"0"}):a.first().attr("tabindex","0"),r.attr("aria-checked","false").filter(`[data-jhs-filter="${e}"]`).attr("aria-checked","true"),s.find(".jhs-quick-filter__label").text(t?"更多筛选":`筛选:${Pe[e]}`),$(".jhs-mobile-filter-label").text(`筛选:${Pe[e]}`),$(".jhs-mobile-filter-option").attr("aria-checked","false").filter(`[data-jhs-filter="${e}"]`).attr("aria-checked","true")}rememberTagExpand(){if(!window.location.href.includes("actors"))return;let e=$(".tag-expand");if(e.length===0)return;let t=this.getRuntimeService("storage"),s="jhs_tag_expand",a=t.getLocal(s)==="true",r=$(".actor-tags .content");a&&r.hasClass("collapse")&&e[0].click(),e.on("click",(function(){let i=!$(".actor-tags .content").hasClass("collapse");clog.debug("触发"),t.setLocal(s,i.toString())}))}checkDom(e=null){if(!window.isListPage)return;let t=this.getSelector(),s=document.querySelector(t.boxSelector);if(!s)return void clog.error("没有找到容器节点!");e&&e.observe(s,(a=>{for(let r of a){this.removeIndexedItems(r.removedNodes),r.addedNodes.length&&(this.advanceListGeneration(),this.recordListPhase("dom-added",r.addedNodes.length));for(let i of r.addedNodes){if(i.nodeType!==Node.ELEMENT_NODE)continue;let n=i;n.matches?.(t.itemSelector)&&n.dataset.jhsProcessed!=="true"&&this.pendingItems.add(n),n.querySelectorAll?.(t.itemSelector).forEach(l=>{l.dataset.jhsProcessed!=="true"&&this.pendingItems.add(l)})}}this.pendingItems.size&&(this.processTimer&&clearTimeout(this.processTimer),this.processTimer=setTimeout((()=>{let r=[...this.pendingItems].filter(n=>n.isConnected&&n.dataset.jhsProcessed!=="true"),i=this.captureListRevision();this.pendingItems.clear(),this.processTimer=null,r.length&&this.processAddedItems(r,i).catch(n=>clog.error("列表增量处理失败",n))}),100))}),{childList:!0,subtree:!1})}async processAddedItems(e,t=this.captureListRevision()){let s=this.getSelector(),a=e.flatMap(i=>[...i.querySelectorAll(s.coverImgSelector)]);this.replaceHdImg(a),this.addJumpPageControl(),this.fixBusTitleBox(e),await this.requestListRefresh({items:e,reason:"dom-added"})&&(await this.getOptionalDependency("ListPageButtonPlugin")?.sortItems?.(),await this.getOptionalDependency("CoverButtonPlugin")?.addSvgBtn?.(e),e.forEach(i=>i.dataset.jhsProcessed="true"),this.indexItems(e),await Qa().emit("list-items-added",{items:e},{broadcast:!1}),this.getOptionalDependency("AutoPagePlugin")?.checkLoad?.())}rebuildItemIndex(){this.itemIndex.clear();let e=$(this.getSelector().itemSelector).toArray();this.indexItems(e),this.recordListPhase("rebuildItemIndex",e.length)}indexItems(e){e.forEach(t=>{try{let s=C(this.findCarNumAndHref($(t)).carNum);if(!s)return;let a=this.itemIndex.get(s)||new Set;a.add(t),this.itemIndex.set(s,a)}catch(s){clog.debug("列表项索引跳过无效卡片",s)}})}removeIndexedItems(e){let t=new Set;Array.from(e||[]).forEach(s=>{let a=s;s.nodeType===Node.ELEMENT_NODE&&(t.add(a),a.querySelectorAll?.(this.getSelector().itemSelector).forEach(r=>t.add(r)))}),t.size&&this.itemIndex.forEach(((s,a)=>{s.forEach(r=>{t.has(r)&&s.delete(r)}),s.size||this.itemIndex.delete(a)}))}getIndexedItems(e){let t=new Set;return e.map(C).forEach(s=>{if(!s)return;let a=this.itemIndex.get(s);a?.forEach(r=>r.isConnected?t.add(r):a.delete(r)),a&&!a.size&&this.itemIndex.delete(s)}),[...t]}fixBusTitleBox(e=null){B&&(e?$(e).toArray():$(this.getSelector().itemSelector).toArray()).forEach(t=>{var s;let a=$(t);if(a.find(".avatar-box").length>0)return;let r=((s=a.find("img").attr("title"))==null?void 0:s.trim())||"";a.find(".photo-info span:first").contents().first().wrap(`${r}`),a.find("br").remove()})}cleanRepeatId(){if(!B)return;$("#waterfall_h").removeAttr("id").attr("id","no-page");let e=$('[id="waterfall"]');e.length!==0&&e.each(((t,s)=>{let a=$(s);a.hasClass("masonry")||(a.children().insertAfter(a),a.remove())}))}async doFilter(e=this.captureListRevision()){return this.doFilterItems(null,e)}async doFilterItems(e=null,t=this.captureListRevision()){if(!window.isListPage)return!1;let s=e?$(e).toArray():$(this.getSelector().itemSelector).toArray();if(!s.length)return!0;let a=await this.filterMovieList(s,t);return a&&B&&setTimeout((()=>{this.getOptionalDependency("BusImgPlugin")?.logImageHeightsByRow?.(this.getRuntimeService("settings").snapshot()).catch(r=>clog.error("JavBus图片高度修正失败",r))})),a}async yieldListFrame(){await new Promise(e=>{window.requestAnimationFrame?window.requestAnimationFrame((()=>setTimeout(e))):setTimeout(e)})}async createEvaluationContext(){return cs(await this.getFilterContext())}async getFilterContext(){if(this.filterContext)return this.filterContext;let[e,t,s,a,r,i]=await Promise.all([storageManager.getTitleFilterKeyword(),storageManager.getBlacklistMap(),storageManager.getBlacklistCarList(),storageManager.getSetting(),storageManager.getCarMap(),this.getRuntimeService("state").getActivityLog()]),n=new Map,l=new Map,c=new Set,h=Date.now()-7*864e5;i.entries.filter(u=>u.commitState==="committed"&&Date.parse(u.createdAt)>=h).forEach(u=>{u.changes.filter(p=>p.undoState!=="reverted"&&p.fields?.some(g=>g.startsWith("stateFlags."))).forEach(p=>c.add(p.carNum))});for(let u of s){let p=t.get(u.starId)?.role;if(!p){clog.error("黑名单数据源丢失演员信息",u);continue}let g=p===ze?n:l,m=C(u.carNum);g.has(m)||g.set(m,u.names)}return this.filterContext={titleKeywords:e,settings:a,carMap:r,recentCarNums:c,actorCarNumToNameMap:n,actressCarNumToNameMap:l}}collectCurrentPageSummary(){let e={total:0,pending:0,blockedItems:0,favorite:0,downloaded:0,watched:0,debug:{manualBlocked:0,keywordBlocked:0,actorBlocked:0,actressBlocked:0}};return $(this.getSelector().itemSelector).each(((t,s)=>{let a=$(s);if(B&&a.find(".avatar-box").length>0)return;let r=H(JSON.parse(a.attr("data-jhs-flags")||"{}")),i=JSON.parse(a.attr("data-jhs-visibility")||"{}"),n=vt(r,i);e.total++,r.favorite&&e.favorite++,r.downloaded&&e.downloaded++,r.watched&&e.watched++,n&&e.blockedItems++,!oe(r)&&!n&&e.pending++,r.blocked&&e.debug.manualBlocked++,i.keyword&&e.debug.keywordBlocked++,i.actorBlacklist&&e.debug.actorBlocked++,i.actressBlacklist&&e.debug.actressBlocked++})),e}getCurrentPageSummary(){return this.collectCurrentPageSummary()}recountStatuses(){let e=this.collectCurrentPageSummary();return this.currentPageFilterCount=e.debug.manualBlocked,this.currentPageFavoriteCount=e.favorite,this.currentPageHasDownCount=e.downloaded,this.currentPageHasWatchCount=e.watched,this.currentPageKeywordFilterCount=e.debug.keywordBlocked,this.currentPageActorFilterCount=e.debug.actorBlocked+e.debug.actressBlocked,this.currentPageWaitCheckCount=e.pending,this.currentPageTotalCount=e.total,e}scheduleRecount(){if(this.recountFrame)return;let e=window.requestAnimationFrame||(t=>setTimeout(t,0));this.recountFrame=e((()=>{this.recountFrame=null,this.recountStatuses()}))}async translateListItems(e){if((this.getRuntimeService("settings").snapshot().translateTitle??E)!==E)return;let t=0,s=null;await Ae(e,3,(async(a,r)=>{try{r>0&&r%8===0&&await this.yieldListFrame(),await this.translate(ru(a))}catch(i){t++,s??(s=i)}})),t&&clog.error(`列表标题翻译失败 ${t} 项`,s)}async filterMovieList(e,t=this.captureListRevision()){if(this.recordListPhase("doFilter-start",e.length),!this.isCurrentListGeneration(t))return!1;let s=this.activeQuickFilter||"waitCheck";utils.time("累计耗费时间"),utils.time("读取数据耗时");let{titleKeywords:a,settings:r,carMap:i,recentCarNums:n,actorCarNumToNameMap:l,actressCarNumToNameMap:c}=await this.getFilterContext(),h=utils.time("读取数据耗时");if(!this.isCurrentListGeneration(t))return!1;let u=cs({titleKeywords:a,settings:r,carMap:i,recentCarNums:n,actorCarNumToNameMap:l,actressCarNumToNameMap:c});utils.time("组装数据耗时");let p=utils.time("组装数据耗时"),g=r?.tagPosition||"rightTop";this.currentPageFilterCount=0,this.currentPageFavoriteCount=0,this.currentPageHasDownCount=0,this.currentPageHasWatchCount=0,this.currentPageKeywordFilterCount=0,this.currentPageActorFilterCount=0,this.currentPageWaitCheckCount=0,this.currentPageTotalCount=0,utils.time("处理页面耗时");let m=[];for(let b=0;b0&&b%12==0&&await this.yieldListFrame();let w=$(e[b]);if(B&&w.find(".avatar-box").length>0)continue;let{carNum:S,title:j}=this.findCarNumAndHref(w),{flags:k,visibilityReasons:x,hardHidden:_}=ds({carNum:S,title:j},u,{filter:s}),I=x.keyword?Ni(u.titleKeywords,j,S):null;w.attr("data-jhs-flags",JSON.stringify(k)).attr("data-jhs-visibility",JSON.stringify(x)).attr("data-jhs-recent",n.has(S)?E:ne).attr("data-jhs-tag-position",g);let L=JSON.stringify({flags:k,visibilityReasons:x,P:g});if(w.attr("data-jhs-state-signature")!==L){w.attr("data-jhs-state-signature",L),w.find(".jhs-status-tags").remove();let N=[[k.blocked,xt.IS_FILTERED,"单番号屏蔽"],[k.favorite,xt.IS_FAVORITE,""],[k.downloaded,xt.IS_HAS_DOWN,""],[k.watched,xt.IS_HAS_WATCH,""],[x.keyword,xt.IS_KEYWORD_FILTER,I||"未知"],[x.actorBlacklist,xt.IS_ACTOR_FILTER,l.get(S)||""],[x.actressBlacklist,xt.IS_ACTRESS_FILTER,c.get(S)||""]].filter(A=>A[0]);if(N.length){let A=$(``);if(N.forEach((([,O,U])=>{let q=$(`${T(O.text)}`);q.css({color:O.on,backgroundColor:O.color}),A.append(q)})),M)w.find(".tags").append(A);else if(B){let O=w.find(".item-tag");O.length?O.append(A):w.find(".photo-info > span > div").append(A)}}}_||m.push(w)}this.scheduleRecount(),this.translateListItems(m).catch(b=>clog.error("列表页翻译任务失败",b)),this.recordListPhase("doFilter-end",e.length);let f=utils.time("处理页面耗时"),v=utils.time("累计耗费时间");clog.html(` @@ -3851,7 +3858,7 @@ ${i}\r
      ${h}${this.currentPageTotalCount}
      - `)}async batchSaveAllVideos(e,t,{filter:s=this.activeQuickFilter||"waitCheck",confirm:a=!0,root:r=null}={}){let i=Ce(t);if(!i)throw new TypeError(`不支持的状态操作: ${t}`);let n=_e(s),l=Pe[n],c=e?.kind==="actor",h=c?String(e.recordName||""):"",u=je(window.location).kind,p=["movie-ranking","playback-ranking","top250-ranking"].includes(u),g=u==="external-fc2-catalog",m=p||g,f=g?"当前片库页":"当前榜单页",v=m?n==="all"?`将处理${f}内的所有作品,包括屏蔽项。`:`将处理${f}内符合「${l}」筛选的作品。`:n==="all"?"将处理当前搜索全部分页的所有作品,包括屏蔽项。":`将处理当前搜索全部分页中符合「${l}」筛选的作品。`;if(a&&!await new Promise(x=>utils.q(null,v,()=>x(!0),()=>x(!1))))return{cancelled:!0};let b=qs();if(!b)return show.error("已有批量任务正在执行"),{cancelled:!0,busy:!0};let w,S=d(k=>{let x=w?.find(".jhs-batch-progress__label");x&&x.length?x.text(k):clog.debug(k)},"setProgress"),j=d(({page:k,scanned:x,matched:_})=>{S(`已扫描 ${k} 页 · 匹配 ${_} 项`),clog.debug(`批量扫描第 ${k} 页 · 已扫描 ${x} · 匹配 ${_}`)},"onProgress");try{let k=await this.getRuntimeService("scope")(),x=await this.createEvaluationContext(),_=d(()=>lc(b)||!!k?.disposed,"isCancelled");w=this.showBatchProgress(b),this.setBatchButtonsDisabled(!0);let R=await Vs({startDom:r?$(r):$(document),currentUrl:m||r?null:window.location.href,firstPageUrl:m||r?null:this.getRuntimeService("host")?.resolveFirstPageUrl?.(window.location.href)??window.location.href,itemSelector:this.getSelector().requestDomItemSelector,nextPageSelector:this.getSelector().nextPageSelector,maxPages:m?1:200,fetchHtml:d(async N=>qe(this.getRuntimeService("http"),N,k),"fetchHtml"),parseItem:d(N=>{let A=$e(N);return c?A:{...A,names:ic(N)}},"parseItem"),evaluate:d(N=>ns({carNum:N.carNum,title:N.title||""},x,{filter:n}),"evaluate"),isCancelled:_,onProgress:j});if(_())return w?.remove(),{cancelled:!0};w?.find("#jhs-batch-cancel").prop("disabled",!0).attr("title","正在写入,无法取消"),S("正在写入,无法取消…");let L=0;for(let N=0;NO.carNum),{[i]:!0},{type:"actor-page-batch-state",records:A.map(O=>({carNum:O.carNum,url:O.url||"",names:O.names??h,publishTime:O.publishTime||"",fc2Source:O.fc2Source}))}),L+=A.length,S(`已更新 ${L}/${R.length} 项`)}return S(`批量完成:匹配 ${R.length} 项 · 已更新 ${L} 项`),setTimeout(()=>w?.remove(),1800),{matched:R.length,updated:L}}catch(k){throw clog.error("批量操作失败:",k),S("批量操作失败"),w?.addClass("jhs-batch-progress--error"),setTimeout(()=>w?.remove(),2500),k}finally{Lt(b)&&Hs(b),this.setBatchButtonsDisabled(!1)}}setBatchButtonsDisabled(e){$("#favoriteAllVideo, #hasDownAllVideo, #filterAllVideo").attr("aria-disabled",String(e)).toggleClass("jhs-batch-busy",e)}showBatchProgress(e){let t=$("#jhs-batch-progress");return t.length||(t=$('
      ').appendTo("body"),t.append('')),t.find("#jhs-batch-cancel").off("click").on("click",()=>cc(e)),t.find(".jhs-batch-progress__label").remove().end().prepend($('').text("正在扫描…")),t}async bindClick(){let e=this.getSelector();this.bindMovieDetailNavigation(e.boxSelector),$(e.boxSelector).off("click.jhsListVideo").on("click.jhsListVideo",".item video",(async t=>{let s=t.currentTarget;s.paused?await de(s,{context:"列表视频",notify:!0}):s.pause(),t.preventDefault(),t.stopPropagation()})),$(e.boxSelector).off("contextmenu.jhsListMenu").on("contextmenu.jhsListMenu",".item img, .item video",(async t=>{try{t.preventDefault();let s=$(t.target).closest(".item"),{carNum:a,url:r,publishTime:i,fc2Source:n}=this.findCarNumAndHref(s),l=M?$(".actor-section-name"):$(".avatar-box .photo-info .pb10"),c="";l.length&&(c=l.text().trim().split(",")[0].replace("(無碼)","")),utils.q(t,`是否屏蔽番号 ${T(a)}?`,(async()=>{try{c||(c=await this.parseActressName(r)),await this.getRuntimeService("state").patch(a,{blocked:!0},{record:{carNum:a,url:r,names:c,publishTime:i,fc2Source:n}}),show.ok("操作成功")}catch(h){clog.error("屏蔽操作失败:",h),show.error("操作失败")}}))}catch(s){clog.error("右键菜单处理失败:",s)}}))}async openMovieDetail(e,{event:t=null,autoplay:s=!1,newTab:a=!1}={}){let r=e?.jquery?e:$(e),{carNum:i,aHref:n}=this.findCarNumAndHref(r);if(!i||!n)return;let l=a||!!t&&(t.ctrlKey||t.metaKey||t.button===1);if(i.includes("FC2-"))return;let c=new URL(n,window.location.origin);s&&c.searchParams.set("autoPlay","1"),utils.openPage(c.href,i,!0,{event:t,newTab:l}),this.$currentImage=null}bindMovieDetailNavigation(e){let t=$(e),s=".item img, .item .video-title";t.off("click.jhsMovieDetail auxclick.jhsMovieDetail",s).on("click.jhsMovieDetail auxclick.jhsMovieDetail",s,(a=>{a.type==="auxclick"&&a.button!==1||a.type==="click"&&a.button&&a.button!==0||a.shiftKey||a.altKey||$(a.target).closest("div.meta-buttons,[class^='jhs-match-']").length||(a.preventDefault(),a.stopPropagation(),this.openMovieDetail($(a.currentTarget).closest(".item"),{event:a}).catch((r=>clog.error("打开影片详情失败",r))))}))}async parseActressName(e){let t=null;if(await storageManager.getSetting("enableSaveActressCarInfo",ne)===E){clog.debug("鉴定补录演员信息-已启用, 开始解析详情页"),clog.debug("开始解析演员详情页",e);let s=await this.getRuntimeService("scope")(),a=await qe(this.getRuntimeService("http"),e,s),r=utils.htmlTo$dom(a);M?t=r.find(".female").prev().map(((i,n)=>$(n).text())).get().join(" "):B&&(t=r.find('span[onmouseover*="star_"] a').map(((i,n)=>$(n).text())).get().join(" ")),clog.debug("解析到名称:",t)}return t}findCarNumAndHref(e){try{return $e(e)}catch(t){throw show.error("提取番号信息失败"),t}}showCarNumBox(e){let t=this.getRuntimeService("host").locateListItems().find(s=>$(s).find(".video-title strong").text()===e);if(t){let s=$(t);s.attr("data-hide")==="yes"&&(s.show(),s.removeAttr("data-hide"))}}_replaceSingleHdImg(e){if(e.dataset.hdReplaced==="true")return;let t=e.currentSrc||e.src,s=e.dataset.full||t;if(M)/jdbstatic\.com|javdb\.com/i.test(t)&&(s=s.replace("thumbs","covers"),e.dataset.full=s,e.dataset.hdReplaced="true",e.title="");else if(B){let a=/\/(imgs|pics)\/(thumb|thumbs)\//,r=/(\.jpg|\.jpeg|\.png)$/i;a.test(t)?(s=s.replace(a,"/$1/cover/").replace(r,"_b$1"),e.dataset.full=s,e.dataset.hdReplaced="true",e.dataset.title=e.title,e.title=""):/ps(\.jpg|\.jpeg|\.png)$/i.test(t)&&(s=s.replace(/ps(\.jpg|\.jpeg|\.png)$/i,"pl$1"),e.dataset.full=s,e.dataset.hdReplaced="true",e.dataset.title=e.title,e.title="")}e.dataset.hdReplaced!=="true"||s===t||(e.src=s,e.onerror=function(){this.src!==t&&(this.src=t),this.onerror=null})}_scheduleHdUpgrade(e){if(e.dataset.hdReplaced==="true"||e.dataset.jhsHdPending==="true")return;if(e.complete)return void this._replaceSingleHdImg(e);e.dataset.jhsHdPending="true";let t=d(()=>{e.removeEventListener("load",t),e.removeEventListener("error",t),delete e.dataset.jhsHdPending,this.hdPendingCleanups.delete(e),this._replaceSingleHdImg(e)},"finish"),s=d(()=>{e.removeEventListener("load",t),e.removeEventListener("error",t),delete e.dataset.jhsHdPending},"cleanup");this.hdPendingCleanups.set(e,s),e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}replaceHdImg(e){if(e&&typeof e.jquery=="string"&&(e=e.toArray()),e||(e=document.querySelectorAll(this.getSelector().coverImgSelector)),!e.length)return;let t=Array.from(e).filter(s=>s.dataset.hdReplaced!=="true"&&s.dataset.jhsHdObserved!=="true");"IntersectionObserver"in window&&!this.hdImageObserver&&(this.hdImageObserver=new IntersectionObserver((s=>{s.forEach((a=>{let r=a.target;a.isIntersecting&&(this.hdImageObserver?.unobserve(r),delete r.dataset.jhsHdObserved,this._scheduleHdUpgrade(r))}))}),{rootMargin:"200px"}));for(let s of t)s.decoding="async",this.hdImageObserver?(s.dataset.jhsHdObserved="true",this.hdImageObserver.observe(s)):this._scheduleHdUpgrade(s)}configureHoverPreview(e){let t=window;this.hoverPreviewState===e&&(e==="no"||t.imageHoverPreviewObj)||(t.imageHoverPreviewObj&&(t.imageHoverPreviewObj.destroy?.(),t.imageHoverPreviewObj=null),e==="yes"&&(t.imageHoverPreviewObj=new ImageHoverPreview({selector:this.getSelector().coverImgSelector})),this.hoverPreviewState=e)}applyTranslatedTitle(e,t,s){let a=e.find(".video-title");M?(a.contents().each(((r,i)=>{i.nodeType!==3||(i.textContent||"").trim()===""||(i.textContent||"").includes(s)||(i.textContent=" "+t+" ")})),a.attr("title",t)):a.text(t),e.attr("data-jhs-translation-key",s)}invalidateTranslations(){this.translationGeneration++}async translate(e){let t=e?.jquery?e:$(e);if(!t.length)return;let s,a,r=t.find(".video-title");if(M?(s=r.contents().filter(((h,u)=>u.nodeType===3&&(u.textContent||"").trim()!=="")).text().trim(),a=t.find(".video-title strong").text().trim()):(s=(t.find("img").attr("data-title")||"").trim(),a=(t.find("a").attr("href")||"").split("/").filter(Boolean).pop()?.trim()),!s||!a)return;let i=this.translationGeneration,n=this.getRuntimeService("settings"),l=await this.getRuntimeService("scope")(),c=await this.getRuntimeService("translation").translate(s,{cacheAlias:a,scope:l});i!==this.translationGeneration||(n?.snapshot?.().translateTitle??E)!==E||this.applyTranslatedTitle(t,c,a)}async revertTranslation(){$(this.getSelector().itemSelector).toArray().forEach(e=>{let t=$(e),s=t.find(".box").attr("title")||t.find(".video-title").attr("title")||t.find("img").attr("data-title"),a;M&&(a=t.find(".video-title strong").text().trim());let r=t.find(".video-title");r.contents().each(((i,n)=>{n.nodeType!==3||!s||(n.textContent||"").trim()===""||a&&(n.textContent||"").includes(a)||(n.textContent=" "+s+" ")})),r.removeAttr("title")})}addJumpPageControl(){let e="gemini-jump-page-control";if($("#"+e).length>0||$(".pagination-link.is-current").length===0)return;let t=utils.getUrlParam(X,"page")||1,s=$('',{id:"jumpPageInput",placeholder:"页码",min:"1",value:t+1}),a=$('')),t.find("#jhs-batch-cancel").off("click").on("click",()=>vc(e)),t.find(".jhs-batch-progress__label").remove().end().prepend($('').text("正在扫描…")),t}async bindClick(){let e=this.getSelector();this.bindMovieDetailNavigation(e.boxSelector),$(e.boxSelector).off("click.jhsListVideo").on("click.jhsListVideo",".item video",(async t=>{let s=t.currentTarget;s.paused?await de(s,{context:"列表视频",notify:!0}):s.pause(),t.preventDefault(),t.stopPropagation()})),$(e.boxSelector).off("contextmenu.jhsListMenu").on("contextmenu.jhsListMenu",".item img, .item video",(async t=>{try{t.preventDefault();let s=$(t.target).closest(".item"),{carNum:a,url:r,publishTime:i,fc2Source:n}=this.findCarNumAndHref(s),l=M?$(".actor-section-name"):$(".avatar-box .photo-info .pb10"),c="";l.length&&(c=l.text().trim().split(",")[0].replace("(無碼)","")),utils.q(t,`是否屏蔽番号 ${T(a)}?`,(async()=>{try{c||(c=await this.parseActressName(r)),await this.getRuntimeService("state").patch(a,{blocked:!0},{record:{carNum:a,url:r,names:c,publishTime:i,fc2Source:n}}),show.ok("操作成功")}catch(h){clog.error("屏蔽操作失败:",h),show.error("操作失败")}}))}catch(s){clog.error("右键菜单处理失败:",s)}}))}async openMovieDetail(e,{event:t=null,autoplay:s=!1,newTab:a=!1}={}){let r=e?.jquery?e:$(e),{carNum:i,aHref:n}=this.findCarNumAndHref(r);if(!i||!n)return;let l=a||!!t&&(t.ctrlKey||t.metaKey||t.button===1);if(i.includes("FC2-"))return;let c=new URL(n,window.location.origin);s&&c.searchParams.set("autoPlay","1"),utils.openPage(c.href,i,!0,{event:t,newTab:l}),this.$currentImage=null}bindMovieDetailNavigation(e){let t=$(e),s=".item img, .item .video-title";t.off("click.jhsMovieDetail auxclick.jhsMovieDetail",s).on("click.jhsMovieDetail auxclick.jhsMovieDetail",s,(a=>{a.type==="auxclick"&&a.button!==1||a.type==="click"&&a.button&&a.button!==0||a.shiftKey||a.altKey||$(a.target).closest("div.meta-buttons,[class^='jhs-match-']").length||(a.preventDefault(),a.stopPropagation(),this.openMovieDetail($(a.currentTarget).closest(".item"),{event:a}).catch((r=>clog.error("打开影片详情失败",r))))}))}async parseActressName(e){let t=null;if(await storageManager.getSetting("enableSaveActressCarInfo",ne)===E){clog.debug("鉴定补录演员信息-已启用, 开始解析详情页"),clog.debug("开始解析演员详情页",e);let s=await this.getRuntimeService("scope")(),a=await We(this.getRuntimeService("http"),e,s),r=utils.htmlTo$dom(a);M?t=r.find(".female").prev().map(((i,n)=>$(n).text())).get().join(" "):B&&(t=r.find('span[onmouseover*="star_"] a').map(((i,n)=>$(n).text())).get().join(" ")),clog.debug("解析到名称:",t)}return t}findCarNumAndHref(e){try{return $e(e)}catch(t){throw show.error("提取番号信息失败"),t}}showCarNumBox(e){let t=this.getRuntimeService("host").locateListItems().find(s=>$(s).find(".video-title strong").text()===e);if(t){let s=$(t);s.attr("data-hide")==="yes"&&(s.show(),s.removeAttr("data-hide"))}}_replaceSingleHdImg(e){if(e.dataset.hdReplaced==="true")return;let t=e.currentSrc||e.src,s=e.dataset.full||t;if(M)/jdbstatic\.com|javdb\.com/i.test(t)&&(s=s.replace("thumbs","covers"),e.dataset.full=s,e.dataset.hdReplaced="true",e.title="");else if(B){let a=/\/(imgs|pics)\/(thumb|thumbs)\//,r=/(\.jpg|\.jpeg|\.png)$/i;a.test(t)?(s=s.replace(a,"/$1/cover/").replace(r,"_b$1"),e.dataset.full=s,e.dataset.hdReplaced="true",e.dataset.title=e.title,e.title=""):/ps(\.jpg|\.jpeg|\.png)$/i.test(t)&&(s=s.replace(/ps(\.jpg|\.jpeg|\.png)$/i,"pl$1"),e.dataset.full=s,e.dataset.hdReplaced="true",e.dataset.title=e.title,e.title="")}e.dataset.hdReplaced!=="true"||s===t||(e.src=s,e.onerror=function(){this.src!==t&&(this.src=t),this.onerror=null})}_scheduleHdUpgrade(e){if(e.dataset.hdReplaced==="true"||e.dataset.jhsHdPending==="true")return;if(e.complete)return void this._replaceSingleHdImg(e);e.dataset.jhsHdPending="true";let t=d(()=>{e.removeEventListener("load",t),e.removeEventListener("error",t),delete e.dataset.jhsHdPending,this.hdPendingCleanups.delete(e),this._replaceSingleHdImg(e)},"finish"),s=d(()=>{e.removeEventListener("load",t),e.removeEventListener("error",t),delete e.dataset.jhsHdPending},"cleanup");this.hdPendingCleanups.set(e,s),e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}replaceHdImg(e){if(e&&typeof e.jquery=="string"&&(e=e.toArray()),e||(e=document.querySelectorAll(this.getSelector().coverImgSelector)),!e.length)return;let t=Array.from(e).filter(s=>s.dataset.hdReplaced!=="true"&&s.dataset.jhsHdObserved!=="true");"IntersectionObserver"in window&&!this.hdImageObserver&&(this.hdImageObserver=new IntersectionObserver((s=>{s.forEach((a=>{let r=a.target;a.isIntersecting&&(this.hdImageObserver?.unobserve(r),delete r.dataset.jhsHdObserved,this._scheduleHdUpgrade(r))}))}),{rootMargin:"200px"}));for(let s of t)s.decoding="async",this.hdImageObserver?(s.dataset.jhsHdObserved="true",this.hdImageObserver.observe(s)):this._scheduleHdUpgrade(s)}configureHoverPreview(e){let t=window;this.hoverPreviewState===e&&(e==="no"||t.imageHoverPreviewObj)||(t.imageHoverPreviewObj&&(t.imageHoverPreviewObj.destroy?.(),t.imageHoverPreviewObj=null),e==="yes"&&(t.imageHoverPreviewObj=new ImageHoverPreview({selector:this.getSelector().coverImgSelector})),this.hoverPreviewState=e)}applyTranslatedTitle(e,t,s){let a=e.find(".video-title");M?(a.contents().each(((r,i)=>{i.nodeType!==3||(i.textContent||"").trim()===""||(i.textContent||"").includes(s)||(i.textContent=" "+t+" ")})),a.attr("title",t)):a.text(t),e.attr("data-jhs-translation-key",s)}invalidateTranslations(){this.translationGeneration++}async translate(e){let t=e?.jquery?e:$(e);if(!t.length)return;let s,a,r=t.find(".video-title");if(M?(s=r.contents().filter(((h,u)=>u.nodeType===3&&(u.textContent||"").trim()!=="")).text().trim(),a=t.find(".video-title strong").text().trim()):(s=(t.find("img").attr("data-title")||"").trim(),a=(t.find("a").attr("href")||"").split("/").filter(Boolean).pop()?.trim()),!s||!a)return;let i=this.translationGeneration,n=this.getRuntimeService("settings"),l=await this.getRuntimeService("scope")(),c=await this.getRuntimeService("translation").translate(s,{cacheAlias:a,scope:l});i!==this.translationGeneration||(n?.snapshot?.().translateTitle??E)!==E||this.applyTranslatedTitle(t,c,a)}async revertTranslation(){$(this.getSelector().itemSelector).toArray().forEach(e=>{let t=$(e),s=t.find(".box").attr("title")||t.find(".video-title").attr("title")||t.find("img").attr("data-title"),a;M&&(a=t.find(".video-title strong").text().trim());let r=t.find(".video-title");r.contents().each(((i,n)=>{n.nodeType!==3||!s||(n.textContent||"").trim()===""||a&&(n.textContent||"").includes(a)||(n.textContent=" "+s+" ")})),r.removeAttr("title")})}addJumpPageControl(){let e="gemini-jump-page-control";if($("#"+e).length>0||$(".pagination-link.is-current").length===0)return;let t=utils.getUrlParam(X,"page")||1,s=$('',{id:"jumpPageInput",placeholder:"页码",min:"1",value:t+1}),a=$('`,"item"),t=d(m=>`
      ${m}
      `,"group"),s='',a=!!this.getOptionalDependency("ListPageButtonPlugin"),r=!!this.getOptionalDependency("ListPagePlugin"),i=!!this.getOptionalDependency("NewVideoPlugin"),n=!!this.getOptionalDependency("BlacklistPlugin"),l=!!this.getOptionalDependency("SettingPlugin"),c=!!this.getOptionalDependency("DetailPageButtonPlugin"),h=!!this.getOptionalDependency("HighlightMagnetPlugin"),u=!!this.getOptionalDependency("MagnetHubPlugin"),p=!!this.getOptionalDependency("HistoryPlugin"),g;if(window.isListPage){let m=this.getOptionalDependency("ListPageButtonPlugin")?.activeSortMethod?.()??this.getRuntimeService("settings").snapshot().sortMethod,f={default:"默认",rateCount:"评价人数",date:"时间"},v=typeof m=="string"&&m in f?m:"default",b=f[v],w=_e(this.getOptionalDependency("ListPagePlugin")?.activeQuickFilter),S=[...nt,...It].map(((k,x)=>`${x===nt.length?'':""}`)).join(""),j=Object.entries(f).map((([k,x])=>``)).join("");g=t((a?e("check","开始鉴定"):"")+(i?e("newVideo","新作品"):"")+(n?e("blacklist","黑名单"):"")+(p?e("history","鉴定记录"):"")+(a?e("sort",`排序: ${b}`,'aria-haspopup="menu" aria-expanded="false"'):"")+(r?e("quickFilter",`筛选:${Pe[w]}`,'aria-haspopup="menu" aria-expanded="false"'):""))+s+t(e("logger","运行日志")+(l?e("setting","设置"):""))+(r?``:"")+(a?``:"")}else window.isDetailPage?g=t(c?[{action:"filter",icon:Le,label:"屏蔽",key:"filter"},{action:"fav",icon:Me,label:"收藏",key:"fav"},{action:"down",icon:fe,label:"已下载",key:"down"},{action:"watch",icon:ve,label:"已观看",key:"watch"}].map((f=>e(f.action,`${f.icon}`,`aria-label="${f.label}" aria-pressed="false" data-label="${f.label}"`))).join(""):"")+s+t((h?e("magnetFilter","磁力过滤"):"")+(u?e("magnet","磁力搜索"):"")+(c?e("subtitle","字幕"):""))+s+t(e("logger","运行日志")+(l?e("setting","设置"):"")):g=t(e("logger","运行日志")+(l?e("setting","设置"):""));return $(``)}async refreshDetailStatus(){try{let e=this.getCarNum();if(!e)return;let t=await storageManager.getCar(e),s=$(".jhs-fab-menu"),a={filter:"var(--jhs-status-filter)",fav:"var(--jhs-status-fav)",down:"var(--jhs-status-down)",watch:"var(--jhs-status-watch)"},r=H(t?.stateFlags),i=new Set;r.blocked&&i.add("filter"),r.favorite&&i.add("fav"),r.downloaded&&i.add("down"),r.watched&&i.add("watch"),s.find(".jhs-fab-status-dot").each(((n,l)=>{let c=String($(l).data("status-key")||""),h=$(l).closest(".jhs-fab-menu-item");i.has(c)?($(l).css({background:a[c]||"var(--jhs-border-strong)"}),h.attr("aria-pressed","true")):($(l).css({background:"var(--jhs-border-strong)"}),h.attr("aria-pressed","false"))}))}catch(e){clog.warn("移动端详情状态刷新失败",e)}}bindEvents(e,t){let s=$(".jhs-fab-menu"),a=s.find(".jhs-mobile-filter-menu"),r=s.find(".jhs-mobile-sort-menu"),i=s.find('[data-action="quickFilter"]'),n=s.find('[data-action="sort"]'),l=d((p=!1)=>{s.removeClass("jhs-fab-filter-open"),i.attr("aria-expanded","false"),p&&i.trigger("focus")},"closeFilterMenu"),c=d((p=!1)=>{s.removeClass("jhs-fab-sort-open"),n.attr("aria-expanded","false"),p&&n.trigger("focus")},"closeSortMenu"),h=d((p=!1)=>{this._fabGeneration++,l(),c(),e.removeClass("jhs-fab-open").attr("aria-expanded","false"),s.removeClass("jhs-fab-menu-open").attr("aria-hidden","true"),t.removeClass("jhs-fab-backdrop-visible"),s.find(".jhs-fab-menu-item").removeClass("jhs-fab-item-visible"),p&&e.trigger("focus")},"closeMenu"),u=d(()=>{if(e.hasClass("jhs-fab-open"))h();else{if(e.addClass("jhs-fab-open").attr("aria-expanded","true"),s.addClass("jhs-fab-menu-open").attr("aria-hidden","false"),t.addClass("jhs-fab-backdrop-visible"),window.isListPage){let v=this.getOptionalDependency("ListPageButtonPlugin")?.activeSortMethod?.()??this.getRuntimeService("settings").snapshot().sortMethod,b={default:"默认",rateCount:"评价人数",date:"时间"},w=typeof v=="string"&&v in b?v:"default",S=b[w];s.find('[data-action="sort"]').text(`排序: ${S}`),this.getOptionalDependency("ListPagePlugin")?.syncQuickFilterUi?.()}window.isDetailPage&&this.refreshDetailStatus().catch((v=>clog.warn("移动端详情状态刷新失败",v)));let g=++this._fabGeneration,m=this,f=s.find(".jhs-fab-menu-item");f.first().trigger("focus"),f.each(((v,b)=>{let w=$(b);setTimeout(()=>{g===m._fabGeneration&&w.addClass("jhs-fab-item-visible")},30+v*35)}))}},"toggleMenu");e.on("click",u),t.on("click",(()=>h(!0))),s.on("keydown",".jhs-fab-menu-item",(p=>{let g=s.find(".jhs-fab-menu-item"),m=g.index(p.currentTarget);if(p.key==="Escape")return p.preventDefault(),h(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();let f=p.key==="Home"?0:p.key==="End"?g.length-1:p.key==="ArrowDown"?(m+1)%g.length:(m-1+g.length)%g.length;g.eq(f).trigger("focus")})),a.on("keydown",".jhs-mobile-filter-option",(p=>{let g=a.find(".jhs-mobile-filter-option"),m=g.index(p.currentTarget);if(p.key==="Escape")return p.preventDefault(),l(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();let f=p.key==="Home"?0:p.key==="End"?g.length-1:p.key==="ArrowDown"?(m+1)%g.length:(m-1+g.length)%g.length;g.eq(f).trigger("focus")})).on("click",".jhs-mobile-filter-option",(p=>{p.stopPropagation(),this.getOptionalDependency("ListPagePlugin")?.setQuickFilter?.($(p.currentTarget).data("jhs-filter")),h(!0)})),r.on("keydown",".jhs-mobile-sort-option",(p=>{let g=r.find(".jhs-mobile-sort-option"),m=g.index(p.currentTarget);if(p.key==="Escape")return p.preventDefault(),c(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();let f=p.key==="Home"?0:p.key==="End"?g.length-1:p.key==="ArrowDown"?(m+1)%g.length:(m-1+g.length)%g.length;g.eq(f).trigger("focus")})).on("click",".jhs-mobile-sort-option",(async p=>{p.stopPropagation();let g=$(p.currentTarget).data("jhs-sort"),m=r.find('.jhs-mobile-sort-option[aria-checked="true"]').first();r.find(".jhs-mobile-sort-option").attr("aria-checked","false"),$(p.currentTarget).attr("aria-checked","true");try{await this.getOptionalDependency("ListPageButtonPlugin")?.selectSortMethod?.(g)}catch(v){r.find(".jhs-mobile-sort-option").attr("aria-checked","false"),m.attr("aria-checked","true"),clog.error("排序设置保存失败,已恢复",v),show.error("排序设置保存失败,已恢复原设置");return}let f={default:"默认",rateCount:"评价人数",date:"时间"};s.find('[data-action="sort"]').text(`排序: ${f[String(g)]??g}`),h(!0)})),s.on("click",".jhs-fab-menu-item",p=>{let g=$(p.currentTarget).data("action");if(g==="quickFilter"){p.stopPropagation(),s.addClass("jhs-fab-filter-open"),i.attr("aria-expanded","true");let m=a.find('[aria-checked="true"]');return void(m.length?m.first():a.find(".jhs-mobile-filter-option").first()).trigger("focus")}if(g==="sort"){p.stopPropagation(),s.addClass("jhs-fab-sort-open"),n.attr("aria-expanded","true");let m=r.find('[aria-checked="true"]');return void(m.length?m.first():r.find(".jhs-mobile-sort-option").first()).trigger("focus")}h(!0),this.handleAction(g).catch((m=>clog.error(`移动端操作 ${g||"unknown"} 失败`,m)))})}async handleAction(e){switch(e){case"check":await this.getOptionalDependency("ListPageButtonPlugin")?.openWaitCheck?.();break;case"newVideo":this.getOptionalDependency("NewVideoPlugin")?.openDialog?.();break;case"blacklist":this.getOptionalDependency("BlacklistPlugin")?.openBlacklistDialog?.();break;case"history":await this.getOptionalDependency("HistoryPlugin")?.openHistory?.();break;case"sort":break;case"filter":$("#filterBtn").length&&$("#filterBtn").click();break;case"fav":$("#favoriteBtn").length&&$("#favoriteBtn").click();break;case"down":$("#hasDownBtn").length&&$("#hasDownBtn").click();break;case"watch":$("#hasWatchBtn").length&&$("#hasWatchBtn").click();break;case"magnetFilter":$("#enable-magnets-filter").length&&$("#enable-magnets-filter").click();break;case"magnet":$("#magnetSearchBtn").length&&$("#magnetSearchBtn").click();break;case"subtitle":$("#search-subtitle-btn").length&&$("#search-subtitle-btn").click();break;case"setting":await this.getOptionalDependency("SettingPlugin")?.openQuickSetting();break;case"logger":clog.openDialog?.();break}}};d(Dn,"MobileBottomBarPlugin");var Wa=Dn;var Nn=class Nn extends I{getName(){return"NavBarPlugin"}async initCss(){return` +
      `),t=M?$(this.getSelector().boxSelector).first():$(".masonry").first();if(!t.length)return void clog.warn("JHS 页面工具栏未创建:列表容器尚未就绪");t.before(e),this.collectCommandControls(e)}getCarNum(){try{return this.getRuntimeService("host").readMovieRef?.()?.carNum||null}catch(e){clog.debug("移动端详情番号解析失败,已回退",e)}return null}createMenu(){let e=d((m,f,v="")=>``,"item"),t=d(m=>`
      ${m}
      `,"group"),s='',a=!!this.getOptionalDependency("ListPageButtonPlugin"),r=!!this.getOptionalDependency("ListPagePlugin"),i=!!this.getOptionalDependency("NewVideoPlugin"),n=!!this.getOptionalDependency("BlacklistPlugin"),l=!!this.getOptionalDependency("SettingPlugin"),c=!!this.getOptionalDependency("DetailPageButtonPlugin"),h=!!this.getOptionalDependency("HighlightMagnetPlugin"),u=!!this.getOptionalDependency("MagnetHubPlugin"),p=!!this.getOptionalDependency("HistoryPlugin"),g;if(window.isListPage){let m=this.getOptionalDependency("ListPageButtonPlugin")?.activeSortMethod?.()??this.getRuntimeService("settings").snapshot().sortMethod,f={default:"默认",rateCount:"评价人数",date:"时间"},v=typeof m=="string"&&m in f?m:"default",b=f[v],w=_e(this.getOptionalDependency("ListPagePlugin")?.activeQuickFilter),S=[...lt,...Dt].map(((k,x)=>`${x===lt.length?'':""}`)).join(""),j=Object.entries(f).map((([k,x])=>``)).join("");g=t((a?e("check","开始鉴定"):"")+(i?e("newVideo","新作品"):"")+(n?e("blacklist","黑名单"):"")+(p?e("history","鉴定记录"):"")+(a?e("sort",`排序: ${b}`,'aria-haspopup="menu" aria-expanded="false"'):"")+(r?e("quickFilter",`筛选:${Pe[w]}`,'aria-haspopup="menu" aria-expanded="false"'):""))+s+t(e("logger","运行日志")+(l?e("setting","设置"):""))+(r?``:"")+(a?``:"")}else window.isDetailPage?g=t(c?[{action:"filter",icon:Be,label:"屏蔽",key:"filter"},{action:"fav",icon:Oe,label:"收藏",key:"fav"},{action:"down",icon:fe,label:"已下载",key:"down"},{action:"watch",icon:ve,label:"已观看",key:"watch"}].map((f=>e(f.action,`${f.icon}`,`aria-label="${f.label}" aria-pressed="false" data-label="${f.label}"`))).join(""):"")+s+t((h?e("magnetFilter","磁力过滤"):"")+(u?e("magnet","磁力搜索"):"")+(c?e("subtitle","字幕"):""))+s+t(e("logger","运行日志")+(l?e("setting","设置"):"")):g=t(e("logger","运行日志")+(l?e("setting","设置"):""));return $(``)}async refreshDetailStatus(){try{let e=this.getCarNum();if(!e)return;let t=await storageManager.getCar(e),s=$(".jhs-fab-menu"),a={filter:"var(--jhs-status-filter)",fav:"var(--jhs-status-fav)",down:"var(--jhs-status-down)",watch:"var(--jhs-status-watch)"},r=H(t?.stateFlags),i=new Set;r.blocked&&i.add("filter"),r.favorite&&i.add("fav"),r.downloaded&&i.add("down"),r.watched&&i.add("watch"),s.find(".jhs-fab-status-dot").each(((n,l)=>{let c=String($(l).data("status-key")||""),h=$(l).closest(".jhs-fab-menu-item");i.has(c)?($(l).css({background:a[c]||"var(--jhs-border-strong)"}),h.attr("aria-pressed","true")):($(l).css({background:"var(--jhs-border-strong)"}),h.attr("aria-pressed","false"))}))}catch(e){clog.warn("移动端详情状态刷新失败",e)}}bindEvents(e,t){let s=$(".jhs-fab-menu"),a=s.find(".jhs-mobile-filter-menu"),r=s.find(".jhs-mobile-sort-menu"),i=s.find('[data-action="quickFilter"]'),n=s.find('[data-action="sort"]'),l=d((p=!1)=>{s.removeClass("jhs-fab-filter-open"),i.attr("aria-expanded","false"),p&&i.trigger("focus")},"closeFilterMenu"),c=d((p=!1)=>{s.removeClass("jhs-fab-sort-open"),n.attr("aria-expanded","false"),p&&n.trigger("focus")},"closeSortMenu"),h=d((p=!1)=>{this._fabGeneration++,l(),c(),e.removeClass("jhs-fab-open").attr("aria-expanded","false"),s.removeClass("jhs-fab-menu-open").attr("aria-hidden","true"),t.removeClass("jhs-fab-backdrop-visible"),s.find(".jhs-fab-menu-item").removeClass("jhs-fab-item-visible"),p&&e.trigger("focus")},"closeMenu"),u=d(()=>{if(e.hasClass("jhs-fab-open"))h();else{if(e.addClass("jhs-fab-open").attr("aria-expanded","true"),s.addClass("jhs-fab-menu-open").attr("aria-hidden","false"),t.addClass("jhs-fab-backdrop-visible"),window.isListPage){let v=this.getOptionalDependency("ListPageButtonPlugin")?.activeSortMethod?.()??this.getRuntimeService("settings").snapshot().sortMethod,b={default:"默认",rateCount:"评价人数",date:"时间"},w=typeof v=="string"&&v in b?v:"default",S=b[w];s.find('[data-action="sort"]').text(`排序: ${S}`),this.getOptionalDependency("ListPagePlugin")?.syncQuickFilterUi?.()}window.isDetailPage&&this.refreshDetailStatus().catch((v=>clog.warn("移动端详情状态刷新失败",v)));let g=++this._fabGeneration,m=this,f=s.find(".jhs-fab-menu-item");f.first().trigger("focus"),f.each(((v,b)=>{let w=$(b);setTimeout(()=>{g===m._fabGeneration&&w.addClass("jhs-fab-item-visible")},30+v*35)}))}},"toggleMenu");e.on("click",u),t.on("click",(()=>h(!0))),s.on("keydown",".jhs-fab-menu-item",(p=>{let g=s.find(".jhs-fab-menu-item"),m=g.index(p.currentTarget);if(p.key==="Escape")return p.preventDefault(),h(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();let f=p.key==="Home"?0:p.key==="End"?g.length-1:p.key==="ArrowDown"?(m+1)%g.length:(m-1+g.length)%g.length;g.eq(f).trigger("focus")})),a.on("keydown",".jhs-mobile-filter-option",(p=>{let g=a.find(".jhs-mobile-filter-option"),m=g.index(p.currentTarget);if(p.key==="Escape")return p.preventDefault(),l(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();let f=p.key==="Home"?0:p.key==="End"?g.length-1:p.key==="ArrowDown"?(m+1)%g.length:(m-1+g.length)%g.length;g.eq(f).trigger("focus")})).on("click",".jhs-mobile-filter-option",(p=>{p.stopPropagation(),this.getOptionalDependency("ListPagePlugin")?.setQuickFilter?.($(p.currentTarget).data("jhs-filter")),h(!0)})),r.on("keydown",".jhs-mobile-sort-option",(p=>{let g=r.find(".jhs-mobile-sort-option"),m=g.index(p.currentTarget);if(p.key==="Escape")return p.preventDefault(),c(!0);if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;p.preventDefault();let f=p.key==="Home"?0:p.key==="End"?g.length-1:p.key==="ArrowDown"?(m+1)%g.length:(m-1+g.length)%g.length;g.eq(f).trigger("focus")})).on("click",".jhs-mobile-sort-option",(async p=>{p.stopPropagation();let g=$(p.currentTarget).data("jhs-sort"),m=r.find('.jhs-mobile-sort-option[aria-checked="true"]').first();r.find(".jhs-mobile-sort-option").attr("aria-checked","false"),$(p.currentTarget).attr("aria-checked","true");try{await this.getOptionalDependency("ListPageButtonPlugin")?.selectSortMethod?.(g)}catch(v){r.find(".jhs-mobile-sort-option").attr("aria-checked","false"),m.attr("aria-checked","true"),clog.error("排序设置保存失败,已恢复",v),show.error("排序设置保存失败,已恢复原设置");return}let f={default:"默认",rateCount:"评价人数",date:"时间"};s.find('[data-action="sort"]').text(`排序: ${f[String(g)]??g}`),h(!0)})),s.on("click",".jhs-fab-menu-item",p=>{let g=$(p.currentTarget).data("action");if(g==="quickFilter"){p.stopPropagation(),s.addClass("jhs-fab-filter-open"),i.attr("aria-expanded","true");let m=a.find('[aria-checked="true"]');return void(m.length?m.first():a.find(".jhs-mobile-filter-option").first()).trigger("focus")}if(g==="sort"){p.stopPropagation(),s.addClass("jhs-fab-sort-open"),n.attr("aria-expanded","true");let m=r.find('[aria-checked="true"]');return void(m.length?m.first():r.find(".jhs-mobile-sort-option").first()).trigger("focus")}h(!0),this.handleAction(g).catch((m=>clog.error(`移动端操作 ${g||"unknown"} 失败`,m)))})}async handleAction(e){switch(e){case"check":await this.getOptionalDependency("ListPageButtonPlugin")?.openWaitCheck?.();break;case"newVideo":this.getOptionalDependency("NewVideoPlugin")?.openDialog?.();break;case"blacklist":this.getOptionalDependency("BlacklistPlugin")?.openBlacklistDialog?.();break;case"history":await this.getOptionalDependency("HistoryPlugin")?.openHistory?.();break;case"sort":break;case"filter":$("#filterBtn").length&&$("#filterBtn").click();break;case"fav":$("#favoriteBtn").length&&$("#favoriteBtn").click();break;case"down":$("#hasDownBtn").length&&$("#hasDownBtn").click();break;case"watch":$("#hasWatchBtn").length&&$("#hasWatchBtn").click();break;case"magnetFilter":$("#enable-magnets-filter").length&&$("#enable-magnets-filter").click();break;case"magnet":$("#magnetSearchBtn").length&&$("#magnetSearchBtn").click();break;case"subtitle":$("#search-subtitle-btn").length&&$("#search-subtitle-btn").click();break;case"setting":await this.getOptionalDependency("SettingPlugin")?.openQuickSetting();break;case"logger":clog.openDialog?.();break}}};d(zn,"MobileBottomBarPlugin");var Za=zn;var Fn=class Fn extends R{getName(){return"NavBarPlugin"}async initCss(){return` .highlight-red { /* 核心要求:高亮红色文本 */ color: var(--jhs-status-filter) !important; @@ -4065,9 +4072,9 @@ ${i}\r
      - `),$("#search-keyword").on("paste",(t=>{let s=t.originalEvent?.clipboardData?.items||[];for(let a=0;a{i.handleImageFile(r),i.resetSearchUI()})):void show.info("以图识图功能已禁用")}})).on("keypress",(t=>{t.key==="Enter"&&setTimeout((()=>{$("#search-btn").click()}),0)})),$("#search-btn").on("click",(t=>{let s=$("#search-keyword").val(),a=$("#search-type").val();s!==""&&(window.location.href.includes("/search")?window.location.href="/search?q="+encodeURIComponent(String(s))+"&f="+encodeURIComponent(String(a)):window.open("/search?q="+encodeURIComponent(String(s))+"&f="+encodeURIComponent(String(a))))})),e&&$("#search-img-btn").on("click",(()=>{this.getOptionalDependency("SearchByImagePlugin")?.open?.()}))}hookOldSearch(){let e=!!this.getOptionalDependency("SearchByImagePlugin");if(!e)return;let t=document.querySelector(".search-image");if(!t)return;let s=t.cloneNode(!0);t.parentNode?.replaceChild(s,t),$("#button-search-image").attr("data-tooltip","以图识图"),e&&$(".search-image").on("click",(a=>{this.getOptionalDependency("SearchByImagePlugin")?.open?.()}))}margeNav(){$('a[href*="/feedbacks/new"]').remove(),$('a[href*="theporndude.com"]').remove();let e=$(''),t=e.find(".navbar-dropdown");t.append($('反饋')),this.getRuntimeService("movie").externalNavigationLinks().forEach((s=>t.append($("").addClass("navbar-item").attr({href:s.url,rel:"nofollow noopener",target:"_blank"}).text(s.label)))),$('a.navbar-link[href="/makers"]').parent().after(e)}toggleOtherNavItem(){let e=$("#search-box"),t=$("#search-bar-container");$(window).width()>1600?(e.show(),t.hide()):(e.hide(),t.show())}};d(Nn,"NavBarPlugin");var Ja=Nn;var Ln=class Ln extends I{constructor(){super(...arguments),P(this,"flag",null)}getName(){return"WantAndWatchedVideosPlugin"}async handle(){window.location.href.includes("/want_watch_videos")&&($("h3").append(''),$("#wantWatchBtn").on("click",(e=>{this.flag="favorite",this.importWantWatchVideos(e,"是否将想看的影片导入到 JHS 收藏?")}))),window.location.href.includes("/watched_videos")&&($("h3").append(''),$("#wantWatchBtn").on("click",(e=>{this.flag="watched",this.importWantWatchVideos(e,"是否将看过的影片导入到 JHS 已观看?")})))}importWantWatchVideos(e,t){utils.q(null,`${t}
      执行此功能前请记得备份数据`,(async()=>{let s=loading();try{let a=await this.parseMovieList();show.ok(`导入完成:成功 ${a.imported},失败 ${a.failed},共 ${a.pages} 页`)}catch(a){clog.error(a),show.error(`导入失败:${a instanceof Error?a.message:String(a)}`)}finally{s.close()}}))}async parseMovieList(e=null,t={imported:0,failed:0,pages:0}){let s,a;e?(s=e.find(this.getSelector().itemSelector),a=e.find(".pagination-next").attr("href")):(s=$(this.getSelector().itemSelector),a=$(".pagination-next").attr("href")),t.pages++,show.info(`正在导入第 ${t.pages} 页`);for(let l of s){let c=$(l),h=c.find("a").attr("href"),u=c.find(".video-title strong").text().trim(),p=c.find(".meta").text().trim();if(h&&u)try{this.flag&&await this.getRuntimeService("state").patch(u,{[this.flag]:!0},{type:"javdb-list-import",record:{carNum:u,url:h,names:"",publishTime:p}}),t.imported++}catch(g){t.failed++,clog.error(`保存失败 [${u}]:`,g)}}if(!a)return t;await utils.sleep(1e3);let r=await this.getRuntimeService("scope")(),i=await qe(this.getRuntimeService("http"),new URL(a,window.location.href),r),n=utils.htmlTo$dom(i);return this.parseMovieList(n,t)}};d(Ln,"WantAndWatchedVideosPlugin");var Ka=Ln;var Mn=class Mn extends I{getName(){return"SubTitleCatPlugin"}handle(){$(".t-banner-inner").hide(),$("#navbar").hide();let e=(new URLSearchParams(window.location.search).get("search")||"").toLowerCase(),t=$(".sub-table tr td a").toArray(),s=0;t.forEach((i=>{let n=$(i);n.text().toLowerCase().includes(e)?s++:n.parent().parent().hide()})),s===0&&show.error("该番号无字幕!");let a=$(".sec-title"),r=String(a.html()||"").replace(/^\d+/,String(s));a.html(r)}};d(Mn,"SubTitleCatPlugin");var Ga=Mn;var Bn=class Bn extends I{getName(){return"TranslatePlugin"}async initCss(){return` + `),$("#search-keyword").on("paste",(t=>{let s=t.originalEvent?.clipboardData?.items||[];for(let a=0;a{i.handleImageFile(r),i.resetSearchUI()})):void show.info("以图识图功能已禁用")}})).on("keypress",(t=>{t.key==="Enter"&&setTimeout((()=>{$("#search-btn").click()}),0)})),$("#search-btn").on("click",(t=>{let s=$("#search-keyword").val(),a=$("#search-type").val();s!==""&&(window.location.href.includes("/search")?window.location.href="/search?q="+encodeURIComponent(String(s))+"&f="+encodeURIComponent(String(a)):window.open("/search?q="+encodeURIComponent(String(s))+"&f="+encodeURIComponent(String(a))))})),e&&$("#search-img-btn").on("click",(()=>{this.getOptionalDependency("SearchByImagePlugin")?.open?.()}))}hookOldSearch(){let e=!!this.getOptionalDependency("SearchByImagePlugin");if(!e)return;let t=document.querySelector(".search-image");if(!t)return;let s=t.cloneNode(!0);t.parentNode?.replaceChild(s,t),$("#button-search-image").attr("data-tooltip","以图识图"),e&&$(".search-image").on("click",(a=>{this.getOptionalDependency("SearchByImagePlugin")?.open?.()}))}margeNav(){$('a[href*="/feedbacks/new"]').remove(),$('a[href*="theporndude.com"]').remove();let e=$(''),t=e.find(".navbar-dropdown");t.append($('反饋')),this.getRuntimeService("movie").externalNavigationLinks().forEach((s=>t.append($("").addClass("navbar-item").attr({href:s.url,rel:"nofollow noopener",target:"_blank"}).text(s.label)))),$('a.navbar-link[href="/makers"]').parent().after(e)}toggleOtherNavItem(){let e=$("#search-box"),t=$("#search-bar-container");$(window).width()>1600?(e.show(),t.hide()):(e.hide(),t.show())}};d(Fn,"NavBarPlugin");var Xa=Fn;var Vn=class Vn extends R{constructor(){super(...arguments),P(this,"flag",null)}getName(){return"WantAndWatchedVideosPlugin"}async handle(){window.location.href.includes("/want_watch_videos")&&($("h3").append(''),$("#wantWatchBtn").on("click",(e=>{this.flag="favorite",this.importWantWatchVideos(e,"是否将想看的影片导入到 JHS 收藏?")}))),window.location.href.includes("/watched_videos")&&($("h3").append(''),$("#wantWatchBtn").on("click",(e=>{this.flag="watched",this.importWantWatchVideos(e,"是否将看过的影片导入到 JHS 已观看?")})))}importWantWatchVideos(e,t){utils.q(null,`${t}
      执行此功能前请记得备份数据`,(async()=>{let s=loading();try{let a=await this.parseMovieList();show.ok(`导入完成:成功 ${a.imported},失败 ${a.failed},共 ${a.pages} 页`)}catch(a){clog.error(a),show.error(`导入失败:${a instanceof Error?a.message:String(a)}`)}finally{s.close()}}))}async parseMovieList(e=null,t={imported:0,failed:0,pages:0}){let s,a;e?(s=e.find(this.getSelector().itemSelector),a=e.find(".pagination-next").attr("href")):(s=$(this.getSelector().itemSelector),a=$(".pagination-next").attr("href")),t.pages++,show.info(`正在导入第 ${t.pages} 页`);for(let l of s){let c=$(l),h=c.find("a").attr("href"),u=c.find(".video-title strong").text().trim(),p=c.find(".meta").text().trim();if(h&&u)try{this.flag&&await this.getRuntimeService("state").patch(u,{[this.flag]:!0},{type:"javdb-list-import",record:{carNum:u,url:h,names:"",publishTime:p}}),t.imported++}catch(g){t.failed++,clog.error(`保存失败 [${u}]:`,g)}}if(!a)return t;await utils.sleep(1e3);let r=await this.getRuntimeService("scope")(),i=await We(this.getRuntimeService("http"),new URL(a,window.location.href),r),n=utils.htmlTo$dom(i);return this.parseMovieList(n,t)}};d(Vn,"WantAndWatchedVideosPlugin");var er=Vn;var qn=class qn extends R{getName(){return"SubTitleCatPlugin"}handle(){$(".t-banner-inner").hide(),$("#navbar").hide();let e=(new URLSearchParams(window.location.search).get("search")||"").toLowerCase(),t=$(".sub-table tr td a").toArray(),s=0;t.forEach((i=>{let n=$(i);n.text().toLowerCase().includes(e)?s++:n.parent().parent().hide()})),s===0&&show.error("该番号无字幕!");let a=$(".sec-title"),r=String(a.html()||"").replace(/^\d+/,String(s));a.html(r)}};d(qn,"SubTitleCatPlugin");var tr=qn;var Hn=class Hn extends R{getName(){return"TranslatePlugin"}async initCss(){return` `}async handle(){let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")();if(!this._settingsListenerBound){this._settingsListenerBound=!0;let s=d(a=>{a.detail?.names?.includes("translateTitle")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>{e.removeEventListener("settings.changed",s),this._settingsListenerBound=!1}))}this.reconfigure()}reconfigure(){(this.getRuntimeService("settings").snapshot().translateTitle??E)===E?this.applyTranslation():(this.getOptionalDependency("ListPagePlugin")?.invalidateTranslations?.(),this.revertTranslation())}async applyTranslation(){if(isDetailPage)return this.translate();if(!window.isListPage)return;let e=this.getOptionalDependency("ListPagePlugin");if(!e?.translateListItems||typeof e.getSelector!="function")return;let t=$(e.getSelector().itemSelector).toArray();await e.translateListItems(t)}revertTranslation(){$(".translated-title").remove(),this.getOptionalDependency("ListPagePlugin")?.revertTranslation?.()}async translate(e,t=!0,s={}){let a=this.getRuntimeService("settings");if((a.snapshot().translateTitle??E)!==E)return;B&&(t=!1);let r=await this.getRuntimeService("scope")(),i=e??this.getPageInfo().carNum;await ea({root:s.root,carNum:i,translation:this.getRuntimeService("translation"),scope:r,isActive:d(()=>(a.snapshot().translateTitle??E)===E,"isActive")})}};d(Bn,"TranslatePlugin");var Qa=Bn;var F=d((o,e,t,s,a,r=[],i={})=>ul({id:o,featureId:e,legacyPluginId:t.legacyPluginId??t.name,plugin:t,sites:s,order:a,requires:r,routes:i.routes??(e==="detail"?["detail","owned-detail"]:[]),surfaces:i.surfaces??(e==="detail"?["detail-page"]:[])}),"manifest"),Ya=Object.freeze([F("list.core","list",Ha,["javdb","javbus"],{javdb:1,javbus:1},[Y.host,y.translation,y.http,y.storage,y.state,y.settings]),F("list.auto-page","list",Aa,["javdb","javbus"],{javdb:2,javbus:5},[y.http,y.settings]),F("detail.fc2-owned","detail",sa,["javdb"],{javdb:3},[y.movie,y.magnet,y.dialog,y.account,y.credential,y.translation,y.settings,y.storage,y.screenshot,y.review,y.related,y.state],{routes:["list","detail","owned-detail"],surfaces:["list-card","detail-page"]}),F("detail.fc2-navigation","detail",La,["javdb"],{javdb:4},[Y.host],{routes:["list"],surfaces:["list-card"]}),F("list.fold-category","list",Ma,["javdb"],{javdb:5},[y.settings]),F("list.actions","list",Va,["javdb","javbus"],{javdb:5,javbus:2},[y.settings]),F("library.history","library",Fa,["javdb","javbus"],{javdb:6,javbus:4},[y.dialog,y.movie,y.settings,y.state]),F("settings.core","settings",Fs,["javdb","javbus"],{javdb:7,javbus:3},[Y.host,y.diagnostics,y.profile,y.webdav,y.dialog,y.storage,y.settings,y.cache,y.http,y.offline,y.magnet,y.movie,y.state,y.translation,Qe.settings]),F("identity.javdb-navigation","identity",Ja,["javdb"],{javdb:8},[y.movie]),F("discovery.hit-show","discovery",aa,["javdb"],{javdb:9},[Y.host]),F("discovery.top250","discovery",ha,["javdb"],{javdb:10},[Y.host]),F("identity.image-search","identity",Rs,["javdb","javbus"],{javdb:11,javbus:6},[y.dialog,y.storage,y.imageSearch]),F("detail.cover-state-actions","detail",ba,["javdb","javbus"],{javdb:12,javbus:8},[y.storage,y.settings,y.movie,y.state],{routes:["list","detail","owned-detail"],surfaces:["list-card","detail-page"]}),F("detail.fc2-lookup","detail",Ys,["javdb"],{javdb:13},[Y.host,y.movie],{routes:["list","detail","owned-detail"],surfaces:["list-card","detail-page"]}),F("detail.javdb-native","detail",Da,["javdb"],{javdb:14}),F("detail.workspace","detail",Na,["javdb","javbus"],{javdb:15,javbus:11},[Y.host]),F("detail.reviews","detail",da,["javdb","javbus"],{javdb:16,javbus:13},[Y.host,y.review,y.movie,y.settings,y.storage]),F("detail.related","detail",ca,["javdb"],{javdb:17},[Y.host,y.related,y.settings]),F("detail.page-state-actions","detail",Ea,["javdb","javbus"],{javdb:18,javbus:12},[y.movie,y.dialog,y.subtitle,y.state,y.settings]),F("detail.native-magnets","detail",Ba,["javdb","javbus"],{javdb:19,javbus:15},[Y.host,y.settings]),F("detail.javdb-preview","detail",wa,["javdb"],{javdb:20},[y.storage,y.settings,y.movie,y.dialog]),F("library.keyword-filter","library",Ks,["javdb","javbus"],{javdb:21,javbus:14}),F("identity.actress-info","identity",Ps,["javdb"],{javdb:22},[y.actressInfo,y.settings]),F("detail.external-sites","detail",la,["javdb","javbus"],{javdb:23,javbus:19},[Y.host,y.movie,y.storage,y.settings]),F("external-bridge.translation","external-bridge",Qa,["javdb","javbus"],{javdb:24,javbus:20},[y.translation,y.settings]),F("library.state-actions","library",Ka,["javdb"],{javdb:25},[y.http,y.state]),F("detail.external-magnets","detail",oa,["javdb","javbus"],{javdb:26,javbus:17},[y.storage,y.http,y.magnet]),F("detail.screenshot","detail",ya,["javdb","javbus"],{javdb:27,javbus:18},[y.screenshot,y.settings]),F("library.blacklist","library",Js,["javdb","javbus"],{javdb:28,javbus:21},[Y.host,y.dialog,y.storage,y.http,y.state]),F("library.favorite-actresses","library",pa,["javdb"],{javdb:29}),F("discovery.new-video","discovery",ja,["javdb"],{javdb:30},[y.dialog,y.storage,y.actressInfo,y.movie,y.state]),F("discovery.scheduler","discovery",xa,["javdb","javbus"],{javdb:31,javbus:22},[y.storage,y.http,y.actressInfo,y.movie,y.state]),F("stats.dashboard","stats",Ta,["javdb","javbus"],{javdb:32,javbus:23},[y.diagnostics,y.dialog,y.movie,y.state]),F("responsive-shell.bottom-bar","responsive-shell",Wa,["javdb","javbus"],{javdb:33,javbus:24},[Y.host,y.settings,y.profile]),F("external-bridge.115-match","external-bridge",Ca,["javdb","javbus"],{javdb:34,javbus:25},[Y.host,y.dialog,y.offline,y.settings]),F("external-bridge.offline","external-bridge",ka,["javdb","javbus"],{javdb:35,javbus:26},[Y.host,y.dialog,y.offline,y.state,y.settings]),F("compatibility.enhancements","compatibility",Ia,["javdb","javbus"],{javdb:36,javbus:27},[y.state]),F("identity.javbus-navigation","identity",Ra,["javbus"],{javbus:7}),F("detail.javbus-images","detail",ga,["javbus"],{javbus:9}),F("detail.javbus-native","detail",Pa,["javbus"],{javbus:10}),F("detail.javbus-preview","detail",va,["javbus"],{javbus:16},[y.settings,y.storage,y.movie]),F("external-bridge.123pan","external-bridge",_a,["javdb","javbus","123pan"],{javdb:0,javbus:0,"123pan":1},[y.storage]),F("external-bridge.javtrailers","external-bridge",ra,["javtrailers"],{javtrailers:1}),F("external-bridge.subtitle","external-bridge",Ga,["subtitlecat"],{subtitlecat:1})]),Dc=new Set,Nc=new Set;for(let o of Ya){if(Dc.has(o.id))throw new Error(`Duplicate contribution id: ${o.id}`);if(Nc.has(o.legacyPluginId))throw new Error(`Duplicate legacy plugin contribution: ${o.legacyPluginId}`);Dc.add(o.id),Nc.add(o.legacyPluginId)}function Lc(o,e,t){o.setDependencyDeclarations(wl),e.setContributionManifests?.(Ya),o.setCatalogDescriptors(Ya.filter(s=>s.sites.includes(t)).map(s=>({name:s.legacyPluginId,disableable:e.isFeatureDisableable(s.featureId)}))),Ya.filter(s=>s.sites.includes(t)&&e.isContributionEnabled(s.featureId,s.id,s.legacyPluginId)).sort((s,a)=>Number(s.order[t])-Number(a.order[t])).forEach(s=>{let a=e.resolveDeclaredDependencies(s.requires),r={};r.scope=()=>e.getContributionScope(s.featureId,s.id,s.legacyPluginId);let i=new Map([[Y.host,"host"],[y.diagnostics,"diagnostics"],[y.review,"review"],[y.related,"related"],[y.movie,"movie"],[y.magnet,"magnet"],[y.settings,"settings"],[y.cache,"cache"],[y.http,"http"],[y.profile,"profile"],[y.actressInfo,"actressInfo"],[y.imageSearch,"imageSearch"],[y.screenshot,"screenshot"],[y.translation,"translation"],[y.subtitle,"subtitle"],[y.account,"account"],[y.webdav,"webdav"],[y.credential,"credential"],[y.storage,"storage"],[y.state,"state"],[y.offline,"offline"],[y.dialog,"dialog"],[Qe.settings,"settingsRegistry"]]);for(let n of s.requires){let l=i.get(n);if(!l)throw new Error(`Legacy contribution ${s.id} has no runtime name for ${String(n)}`);r[l]=a[n]}o.register(s.plugin,r,{disableable:e.isFeatureDisableable(s.featureId)})})}d(Lc,"registerSitePlugins");function Mc(o,e){for(let t of["pluginManager","utils","gmHttp","storageManager","stateService","jhsEventBus","clog","show","loading"]){if(o[t]==null)throw new Error(`Compatibility facade is missing ${t}`);e[t]=o[t]}return Object.freeze(Object.fromEntries(Object.keys(o).map(t=>[t,e[t]])))}d(Mc,"attachCompatibilityFacade");function He(o,e,t){if(!o||typeof o!="object")throw new TypeError(`${e} implementation is required`);for(let s of t)if(typeof o[s]!="function")throw new TypeError(`${e}.${s} is required`);return o}d(He,"assertPort");var We=Object.freeze({navigation:["open","assign","replace"],http:["request"],storage:["get","set","remove","keys","getLocal","setLocal","removeLocal","getValue","setValue","removeValue"],dialog:["open","close","confirm","alert"],style:["register","remove"]});var On=class On{constructor(e={}){this.location=e.location??window.location,this.openWindow=e.open??window.open.bind(window),He(this,"NavigationPort",We.navigation)}open(e,t={}){return t.newTab?this.openWindow(e,"_blank","noopener"):this.assign(e)}assign(e){this.location.assign(e)}replace(e){this.location.replace(e)}};d(On,"BrowserNavigationAdapter");var Za=On;var Un=class Un{constructor(e=document){this.document=e}register(e,t){if(this.document.getElementById(e))throw new Error(`Duplicate style: ${e}`);let s=this.document.createElement("style");return s.id=e,s.textContent=t,this.document.head.append(s),()=>s.remove()}remove(e){this.document.getElementById(e)?.remove()}};d(Un,"BrowserStyleAdapter");var Xa=Un;var zn=class zn{constructor(e,t,s,a,r=()=>{}){this.forage=e,this.localStore=t,this.gmGetValue=s,this.gmSetValue=a,this.gmDeleteValue=r}get(e){return this.forage.getItem(e)}async set(e,t){await this.forage.setItem(e,t)}async remove(e){await this.forage.removeItem(e)}keys(){return this.forage.keys()}getLocal(e){return this.localStore.getItem(e)}setLocal(e,t){this.localStore.setItem(e,t)}removeLocal(e){this.localStore.removeItem(e)}getValue(e,t){return this.gmGetValue(e,t)}setValue(e,t){this.gmSetValue(e,t)}removeValue(e){this.gmDeleteValue(e)}};d(zn,"IndexedDbStorageAdapter");var er=zn;var Fn=class Fn{constructor(e){this.layer=e}open(e){return this.layer.open(this.withDefaultLayer(e))}close(e){this.layer.close(e)}confirm(e,t,s){return this.layer.confirm(e,this.withDefaultLayer(t),s)}alert(e,t){return this.layer.alert(e,this.withDefaultLayer(t))}withDefaultLayer(e={}){let t={zIndex:J.layer,...e};return e.ui?kt(t,globalThis.utils):t}};d(Fn,"LayerDialogAdapter");var tr=Fn;var Vn=class Vn{constructor(e,t=globalThis.fetch?.bind(globalThis)??null){if(typeof e!="function")throw new TypeError("GM_xmlhttpRequest is required");this.requestImplementation=e,this.fetchImplementation=t}request(e){return e.transport==="native-fetch"&&this.fetchImplementation?this.requestWithNativeFetch(e).catch((t=>{if(t instanceof D&&t.code==="ABORTED")throw t;return this.requestWithUserscript(e)})):this.requestWithUserscript(e)}async requestWithNativeFetch(e){let t=new AbortController,s=!1,a=Math.max(0,Number(e.nativeTimeout)||0),r=d(()=>t.abort(),"onAbort"),i=a>0?setTimeout((()=>{s=!0,t.abort()}),a):null;e.signal?.addEventListener("abort",r,{once:!0});try{e.signal?.aborted&&t.abort();let n=await this.fetchImplementation(e.url,{method:e.method??"GET",headers:e.headers,body:e.body,signal:t.signal}),l=await n.text(),c=e.responseType==="json"?JSON.parse(l):l;return{status:n.status,data:c,responseText:l,finalUrl:n.url||e.url,responseHeaders:[...n.headers.entries()].map((h=>h.join(": "))).join(`\r -`)}}catch(n){throw e.signal?.aborted?new D("ABORTED","网络请求已取消",{source:"UserscriptHttpAdapter",cause:n}):s?new D("TIMEOUT","原生网络请求超时",{source:"UserscriptHttpAdapter",cause:n,retryable:!0}):new D("NETWORK_ERROR","原生网络请求失败",{source:"UserscriptHttpAdapter",cause:n,retryable:!0})}finally{i!==null&&clearTimeout(i),e.signal?.removeEventListener("abort",r)}}requestWithUserscript(e){return new Promise((t,s)=>{let a=!1,r,i=d((l,c)=>{a||(a=!0,e.signal?.removeEventListener("abort",n),l(c))},"finish"),n=d(()=>{r?.abort?.(),i(s,new D("ABORTED","网络请求已取消",{source:"UserscriptHttpAdapter"}))},"onAbort");r=this.requestImplementation({...e.requestOptions,method:e.method??"GET",url:e.url,headers:e.headers,data:e.body,responseType:e.responseType,timeout:e.timeout,onload:d(l=>i(t,{status:l.status,data:l.response??l.responseText,responseText:l.responseText??"",finalUrl:l.finalUrl||e.url,responseHeaders:l.responseHeaders??""}),"onload"),onerror:d(l=>i(s,new D("NETWORK_ERROR","网络请求失败",{source:"UserscriptHttpAdapter",cause:l,retryable:!0})),"onerror"),ontimeout:d(()=>i(s,new D("TIMEOUT","网络请求超时",{source:"UserscriptHttpAdapter",retryable:!0})),"ontimeout"),onabort:d(()=>i(s,new D("ABORTED","网络请求已取消",{source:"UserscriptHttpAdapter"})),"onabort")}),e.signal?.aborted?n():e.signal?.addEventListener("abort",n,{once:!0})})}};d(Vn,"UserscriptHttpAdapter");var sr=Vn;async function Bc(o){let e=await globalThis.crypto.subtle.digest("SHA-256",new TextEncoder().encode(o));return Array.from(new Uint8Array(e),(t=>t.toString(16).padStart(2,"0"))).join("")}d(Bc,"digestKey");var qn=class qn{constructor(e={}){this.namespaceVersion=e.namespaceVersion??2,this.diagnostics=e.diagnostics??null,this.storage=e.storage??null,this.publicCache=new Map,this.sessionCaches=new Map,this.publicReads=new Map,this.publicGenerations=new Map,this.publicNamespaces=new Set(["default"]),this.publicWritesSincePrune=0,this.pruneScheduled=!1,this.pruneRunning=!1,this.prunePromise=null}get publicGeneration(){return this.publicGenerations.get("default")||0}generation(e){return this.publicGenerations.get(e)||0}get publicPrefix(){return this._publicPrefix("default")}_publicPrefix(e="default"){return`jhs_http_public_cache:v${this.namespaceVersion}:${encodeURIComponent(e)}:`}storeFor(e,t=""){if(e==="public")return this.publicCache;if(e==="session"){if(!t)throw new TypeError("sessionScopeId is required for session cache");let s=this.sessionCaches.get(t);return s||this.sessionCaches.set(t,s=new Map),s}return null}async get(e,t,s){arguments.length===2&&(s=t,t=e,e="default"),e=String(e||"default"),this.publicNamespaces.add(e);let a=this.storeFor(s.scope,s.sessionScopeId),r=`${e}:${this.namespaceVersion}:${t}`,i=Date.now(),n=this.storage,l=a?.get(r);if(l&&l.expiresAt>i)return this.diagnostics?.recordCache(!0),{hit:!0,value:l.value,negative:l.negative};if(l&&a?.delete(r),s.scope!=="public"||!n)return this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1};let c=`${e}:${t}`,h=this.publicReads.get(c);if(h)return h;let u=this.generation(e),p=(async()=>{let g=this._publicPrefix(e)+await Bc(t),m;try{m=await n.get(g)}catch{return this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1}}if(m?.version!==this.namespaceVersion||!Number.isFinite(m?.expiresAt)||m.expiresAt<=i)return m&&await n.remove(g).catch(()=>{}),this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1};if(u!==this.generation(e))return this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1};let f={value:m.value,expiresAt:m.expiresAt,negative:m.negative===!0};return this.publicCache.set(r,f),this.diagnostics?.recordCache(!0),{hit:!0,value:f.value,negative:f.negative}})().finally(()=>{this.publicReads.get(c)===p&&this.publicReads.delete(c)});return this.publicReads.set(c,p),p}async set(e,t,s,a){arguments.length===3&&(a=s,s=t,t=e,e="default"),e=String(e||"default"),this.publicNamespaces.add(e);let r=Math.min(2592e6,Math.max(0,Number(a.ttlMs)||0));if(!r||a.scope==="public"&&a.generation!=null&&a.generation!==this.generation(e))return;let i={value:s,expiresAt:Date.now()+r,negative:a.negative??!1},n=this.storeFor(a.scope,a.sessionScopeId),l=`${e}:${this.namespaceVersion}:${t}`,c=this.storage;if(a.scope!=="public"||!c){n?.set(l,i);return}if(a.generation!=null&&a.generation!==this.generation(e))return;let h=this._publicPrefix(e)+await Bc(t);if(!(a.generation!=null&&a.generation!==this.generation(e)))try{if(a.generation!=null&&a.generation!==this.generation(e))return;if(await c.set(h,{version:this.namespaceVersion,...i,lastUsed:Date.now()}),a.generation!=null&&a.generation!==this.generation(e)){await c.remove(h).catch(()=>{});return}n?.set(l,i),this.publicWritesSincePrune++,this.schedulePublicPrune()}catch{}}schedulePublicPrune(){if(!this.storage||this.publicWritesSincePrune<64||this.pruneScheduled||this.pruneRunning)return this.prunePromise;this.pruneScheduled=!0;let e=d(async()=>{this.pruneScheduled=!1,this.pruneRunning=!0,this.publicWritesSincePrune=0;try{await this.prunePublic()}catch{}finally{this.pruneRunning=!1,this.prunePromise=null,this.schedulePublicPrune()}},"run");return this.prunePromise=Promise.resolve().then(e),this.prunePromise}async waitForPrune(){await this.prunePromise?.catch(()=>{})}async prunePublic(){if(!this.storage)return;let e;try{e=await this.storage.keys()}catch{return}let t=Date.now(),s=[];for(let a of e.filter(r=>r.startsWith("jhs_http_public_cache:v"))){let r=await this.storage.get(a).catch(()=>null);if(!r||r.version!==this.namespaceVersion||!Number.isFinite(r.expiresAt)||r.expiresAt<=t){await this.storage.remove(a).catch(()=>{});continue}s.push({key:a,lastUsed:Number(r.lastUsed)||0})}if(s.length>500){s.sort((a,r)=>a.lastUsed-r.lastUsed);for(let a of s.slice(0,s.length-500))await this.storage.remove(a.key).catch(()=>{})}}async clearNamespace(e){e=String(e||"default"),this.publicGenerations.set(e,this.generation(e)+1);for(let a of this.publicCache.keys())a.startsWith(`${e}:`)&&this.publicCache.delete(a);for(let a of this.publicReads.keys())a.startsWith(`${e}:`)&&this.publicReads.delete(a);await this.waitForPrune();let t=this.storage;if(!t)return;let s;try{s=await t.keys()}catch{return}await Promise.all(s.filter((a=>a.startsWith(this._publicPrefix(e)))).map((a=>t.remove(a).catch(()=>{}))))}async clearAll(){let e=new Set(this.publicNamespaces);for(let t of e)await this.clearNamespace(t);if(this.publicCache.clear(),this.publicReads.clear(),this.sessionCaches.clear(),this.storage)try{let t=this.storage,s=`jhs_http_public_cache:v${this.namespaceVersion}:`,a=await t.keys();await Promise.all(a.filter(r=>r.startsWith(s)).map(r=>t.remove(r).catch(()=>{})))}catch{}}async clearPublic(){return this.clearAll()}async invalidateNamespace(){return this.clearAll()}};d(qn,"CacheService");var ar=qn;var Hn=class Hn{constructor(e,t){this.integrations=e,this.cache=t}profileUrl(e){for(let t of this.integrations.list("person.actress-info")){let s=this.integrations.getAdapter(t.id);if(typeof s.profileUrl=="function")return s.profileUrl(e)}return""}async lookup(e,t={}){let s=String(e).trim()==="三上悠亞"?"三上悠亜":String(e).trim();if(!s)return null;let a=`actress-info:${s}`,r=await this.cache.get("actress-info",a,{scope:"public"});if(r.hit)return r.value;let i=this.cache.generation("actress-info");for(let n of this.integrations.list("person.actress-info")){let l=this.integrations.getAdapter(n.id);if(typeof l.lookup!="function")continue;let c=await l.lookup(s,t);return await this.cache.set("actress-info",a,c,{scope:"public",ttlMs:6048e5,negative:!c,generation:i}),c}return null}async movies(e,t,s={}){let a=this.integrations.list("actor.movies").find(i=>i.id===e);if(!a)return[];let r=this.integrations.getAdapter(a.id);return typeof r?.listActorMovies=="function"?r.listActorMovies(t,s):[]}async collection(e,t,s={}){let a=this.integrations.list("actor.collection").find(i=>i.id===e);if(!a)throw new TypeError(`Actor collection provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.listActorCollection!="function")throw new TypeError(`Actor collection is unavailable: ${e}`);return r.listActorCollection(t,s)}async uncollect(e,t,s={}){let a=this.integrations.list("actor.uncollect").find(i=>i.id===e);if(!a)throw new TypeError(`Actor provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.uncollectActor!="function")throw new TypeError(`Actor uncollect is unavailable: ${e}`);return r.uncollectActor(t,s)}getAvatarSources(){return Object.freeze(this.integrations.list("person.avatar-search").flatMap(e=>{let t=this.integrations.getAdapter(e.id);return typeof t?.getSources=="function"?t.getSources():[]}))}async searchAvatars(e,t,s={}){for(let a of this.integrations.list("person.avatar-search")){let r=this.integrations.getAdapter(a.id);if(r?.getSources?.().some(i=>i.id===t))return r.searchAvatars(e,{...s,sourceId:t})}return[]}placeholderUrl(e){let t=this.integrations.getAdapter(e);return typeof t?.actorPlaceholderUrl=="function"?t.actorPlaceholderUrl():""}};d(Hn,"ActressInfoService");var rr=Hn;var Zh=/^(?:authorization|cookie|set-cookie|password|token|secret|credential)$/i;function Wn(o,e=""){return Zh.test(e)?"[redacted]":Array.isArray(o)?o.map(t=>Wn(t)):o&&typeof o=="object"?Object.fromEntries(Object.entries(o).map(([t,s])=>[t,Wn(s,t)])):typeof o!="string"?o:o.replace(/(https?:\/\/)([^\s/@:]+):([^\s/@]+)@/gi,"$1[redacted]@")}d(Wn,"sanitize");var Jn=class Jn{constructor(e={}){this.startedAt=performance.now(),this.activeFeatures=new Set,this.activeContributions=new Set,this.startupTimings=new Map,this.scopes=new Map,this.requestStats={consumers:0,underlying:0},this.cacheStats={hits:0,misses:0},this.providerHealth=new Map,this.errors=[],this.browserMetadata=null,this.legacyPlugins=[],this.legacyPluginDescriptors=[],this.legacyStartup=null,this.legacyTimings=[],this.legacyHttp=e.legacyHttp??null,this.networkController=null}recordStartup(e,t){this.startupTimings.set(e,t)}setFeature(e,t){t?this.activeFeatures.add(e):this.activeFeatures.delete(e)}setContribution(e,t){t?this.activeContributions.add(e):this.activeContributions.delete(e)}updateScope(e){this.scopes.set(e.id,Object.freeze({...e}))}updateRequests(e,t){this.requestStats={consumers:e,underlying:t}}recordCache(e){e?this.cacheStats.hits+=1:this.cacheStats.misses+=1}updateProvider(e,t){this.providerHealth.set(e,Object.freeze({...t}))}recordError(e){let t=e&&typeof e=="object"&&"toJSON"in e&&typeof e.toJSON=="function"?e.toJSON():e instanceof Error?{message:e.message}:e&&typeof e=="object"?{...e}:{message:String(e)};this.errors.push({...Wn(t),timestamp:new Date().toISOString()}),this.errors.length>100&&this.errors.shift()}setBrowserMetadata(e){this.browserMetadata=Object.freeze({...e})}setLegacyRuntime(e,t,s){this.legacyPluginDescriptors=e.map(a=>Object.freeze({...a})),this.legacyPlugins=e.map(a=>a.name),this.legacyStartup=Object.freeze({...t}),this.legacyTimings=s.map(a=>Object.freeze({...a}))}clearErrors(){this.errors=[]}setNetworkController(e){this.networkController=e}getNetworkDiagnostics(){let e=this.networkController??this.legacyHttp;return Object.freeze({circuitBreakers:e?.getCircuitBreakerStatus?.()??{},domainStats:e?.getDomainStats?.()??{}})}resetCircuitBreaker(e){(this.networkController??this.legacyHttp)?.resetCircuitBreaker?.(e)}resetAllCircuitBreakers(){(this.networkController??this.legacyHttp)?.resetAllCircuitBreakers?.()}clearDomainStats(){(this.networkController??this.legacyHttp)?.clearDomainStats?.()}exportSnapshot(){let e=[...this.scopes.values()];return Object.freeze({activeFeatures:[...this.activeFeatures],activeContributions:[...this.activeContributions],startupTimings:Object.fromEntries(this.startupTimings),activeScopes:e,globalListeners:e.filter(t=>t.id==="app:root").reduce((t,s)=>t+Number(s.listeners??0),0),observers:e.reduce((t,s)=>t+Number(s.observers??0),0),requestConsumers:this.requestStats.consumers,underlyingRequests:this.requestStats.underlying,cacheHits:this.cacheStats.hits,cacheMisses:this.cacheStats.misses,providerHealth:Object.fromEntries(this.providerHealth),errors:this.errors.map(t=>({...t})),legacyPlugins:[...this.legacyPlugins],legacyPluginDescriptors:this.legacyPluginDescriptors.map(t=>({...t})),legacyStartup:this.legacyStartup,legacyTimings:this.legacyTimings.map(t=>({...t})),browser:this.browserMetadata,uptimeMs:performance.now()-this.startedAt})}};d(Jn,"DiagnosticsService");var ir=Jn;var Kn=class Kn{constructor(e){this.port=He(e,"DialogPort",We.dialog)}open(e){return this.port.open(e)}close(e){return this.port.close(e)}confirm(e,t,s){return this.port.confirm(e,t,s)}alert(e,t){return this.port.alert(e,t)}};d(Kn,"DialogService");var nr=Kn;var Xh=[/^10\./,/^127\./,/^169\.254\./,/^192\.168\./,/^172\.(?:1[6-9]|2\d|3[01])\./,/^0\./];function eu(o){let e=o.replace(/^\[|\]$/g,"").toLowerCase();return e==="localhost"||e.endsWith(".localhost")||e==="::1"?!0:e.includes(":")?e.startsWith("fc")||e.startsWith("fd")||e.startsWith("fe8")||e.startsWith("fe9")||e.startsWith("fea")||e.startsWith("feb"):Xh.some(t=>t.test(e))}d(eu,"isPrivateLiteral");var Gn=class Gn{constructor(e={}){this.localOrigins=new Set,this.replaceLocalOrigins(e.localOrigins??[])}authorizeLocalOrigin(e){this.localOrigins.add(new URL(e).origin)}replaceLocalOrigins(e){let t=new Set(e.map(s=>new URL(s).origin));this.localOrigins=t}assertAllowed(e,t){let s;try{s=e instanceof URL?e:new URL(e)}catch(a){throw new D("INVALID_URL","外部地址无效",{source:"ExternalUrlPolicy",cause:a})}if(!new Set(["http:","https:"]).has(s.protocol))throw new D("INVALID_URL","仅允许 HTTP/HTTPS 地址",{source:"ExternalUrlPolicy"});if(t.expectedOrigin&&s.origin!==new URL(t.expectedOrigin).origin)throw new D("INVALID_URL","地址离开已声明的精确 origin",{source:"ExternalUrlPolicy"});if(t.trustClass==="builtin-public"){if(s.protocol!=="https:"||!(t.hosts??[]).some(a=>s.hostname===a||s.hostname.endsWith(`.${a}`)))throw new D("INVALID_URL","地址不在 Integration manifest 允许范围",{source:"ExternalUrlPolicy"})}else if(t.trustClass==="custom-public"){if(s.protocol!=="https:"||eu(s.hostname))throw new D("INVALID_URL","自定义公开来源必须使用公网 HTTPS",{source:"ExternalUrlPolicy"})}else if(t.trustClass==="user-local"){let a=t.expectedOrigin?new URL(t.expectedOrigin).origin:s.origin;if(!this.localOrigins.has(a)||s.origin!==a)throw new D("INVALID_URL","本地来源未获得精确 origin 授权",{source:"ExternalUrlPolicy"})}else throw new D("INVALID_URL","未知 URL trust class",{source:"ExternalUrlPolicy"});return s}assertFinalUrl(e,t){return this.assertAllowed(e,t)}};d(Gn,"ExternalUrlPolicy");var or=Gn;function us(o){if(o==null||typeof o!="object")return JSON.stringify(o);if(Array.isArray(o))return`[${o.map(us).join(",")}]`;let e=o;return`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${us(e[t])}`).join(",")}}`}d(us,"stableSerialize");async function Oc(o){let e=new TextEncoder().encode(o),t=await crypto.subtle.digest("SHA-256",e);return[...new Uint8Array(t)].map(s=>s.toString(16).padStart(2,"0")).join("")}d(Oc,"sha256");function tu(o){let e=new URL(o),t=[...e.searchParams.entries()].sort(([s,a],[r,i])=>s.localeCompare(r)||a.localeCompare(i));e.search="";for(let[s,a]of t)e.searchParams.append(s,a);return e.hash="",e.href}d(tu,"canonicalizeUrl");function su(o,e=0){if(typeof o!="string"||!o)return!1;let t=o.toLowerCase(),s=/]*>\s*just a moment(?:\.\.\.)?\s*<\/title>/i.test(o),a=/id=["']challenge-form["']/i.test(o),r=t.includes("cf-chl-")||t.includes("cf_chl_opt"),i=t.includes("/cdn-cgi/challenge-platform/")||t.includes("challenge-platform");return s||a&&(r||i)||[403,429,503].includes(e)&&r&&i}d(su,"isCloudflareChallenge");function au(o,e){return o<=0?Promise.resolve():new Promise((t,s)=>{let r=setTimeout(d(()=>{e?.removeEventListener("abort",i),t()},"finish"),o),i=d(()=>{clearTimeout(r),s(new D("ABORTED","请求已取消",{source:"HttpService"}))},"onAbort");e?.addEventListener("abort",i,{once:!0}),Promise.resolve().then(()=>e?.aborted&&i())})}d(au,"waitForRetry");async function ru(o){let e=String(o.method??"GET").toUpperCase(),t=Object.fromEntries(Object.entries(o.headers??{}).map(([i,n])=>[i.toLowerCase(),String(n)])),s=[...new Set((o.varyHeaders??[]).map(i=>String(i).toLowerCase()))].sort(),a=Object.fromEntries(s.map(i=>[i,t[i]??""])),r={providerId:String(o.providerId),cacheNamespace:String(o.cacheNamespace??o.providerId??"default"),method:e,canonicalUrl:tu(o.url),bodyHash:await Oc(us(o.body??null)),responseType:String(o.responseType??"text"),cacheScope:String(o.cacheScope??"none"),varyHeadersHash:await Oc(us(a)),sessionScopeId:o.cacheScope==="session"?String(o.sessionScopeId??""):""};if(r.cacheScope==="session"&&!r.sessionScopeId)throw new TypeError("sessionScopeId is required for session requests");return Object.freeze(r)}d(ru,"createRequestKey");var Qn=class Qn{constructor(e,t,s={}){this.port=e,this.urlPolicy=t,this.diagnostics=s.diagnostics??null,this.cache=s.cache??null,this.settings=s.settings??null,this.inflight=new Map,this.circuitBreakers=new Map,this.domainStats=new Map}async request(e,t){t?.assertActive();let s=String(e.method??"GET").toUpperCase();if(this.settings){let m=this.settings.snapshot();e={...e,timeout:e.timeout??Math.max(1e3,Math.min(12e4,Number(m.httpTimeout)||5e3)),retryCount:e.retryCount??(["GET","HEAD"].includes(s)?Math.max(1,Math.min(10,Math.trunc(Number(m.httpRetryCount)||3)))-1:0),circuitThreshold:e.circuitThreshold??Number(m.circuitBreakerThreshold??3),circuitCooldownMs:e.circuitCooldownMs??Number(m.circuitBreakerCooldown??6e4)}}let a=e.cacheScope??"none";if(s!=="GET"&&a!=="none")throw new TypeError("Mutation requests cannot use generic cache/dedupe");let r=e.urlPolicy,i=this.urlPolicy.assertAllowed(e.url,r);if(s!=="GET"||a==="none")return this.executeUnderlying({...e,method:s,url:i.href,signal:t?.signal},r);let n=String(e.cacheNamespace??e.providerId??"default"),l=await ru({...e,method:s,url:i.href,cacheScope:a,cacheNamespace:n});t?.assertActive();let c=us(l),h={scope:a,sessionScopeId:e.sessionScopeId};if(s==="GET"&&a!=="none"&&this.cache){let m=await this.cache.get(n,c,h);if(t?.assertActive(),m.hit)return m.value}let u=a==="public"&&this.cache?this.cache.generation(n):void 0,p=JSON.stringify([c,u??null]),g=this.inflight.get(p);if(!g){let m=new AbortController;g={controller:m,consumers:0,promise:Promise.resolve()},g.promise=this.executeUnderlying({...e,method:s,url:i.href,signal:m.signal},r).then(async f=>(this.cache&&(u==null||u===this.cache.generation(n))&&await this.cache.set(n,c,f,{...h,ttlMs:e.ttlMs??0,negative:e.negative===!0,generation:u}),f)).finally(()=>{this.inflight.get(p)===g&&this.inflight.delete(p),this.updateDiagnostics()}),this.inflight.set(p,g)}return this.consume(g,t)}async executeUnderlying(e,t){let s=new URL(e.url).hostname,a=Math.max(0,Math.min(9,Math.trunc(Number(e.retryCount??0)||0))),r=new Set((e.acceptableStatuses??[]).map(c=>Number(c)).filter(Number.isFinite)),i=this.ensureCircuit(s,e),n=!1,l=null;for(let c=0;c<=a;c+=1){if(e.signal?.aborted){l=new D("ABORTED","请求已取消",{source:e.providerId});break}let h=n?null:this.checkCircuit(s);if(h){l=new D("CIRCUIT_OPEN",`站点 ${s} 已熔断,${h.remaining}秒后重试`,{source:e.providerId,details:{domain:s,remainingSeconds:h.remaining}});break}i.state==="half-open"&&(i.probing=!0,n=!0);try{let u=await this.port.request(e);if(this.urlPolicy.assertFinalUrl(u.finalUrl||e.url,t),su(u.responseText??u.data,u.status))throw new D("CF_BLOCKED",`Cloudflare challenge blocked: ${s}`,{source:e.providerId,details:{domain:s,status:Number(u.status)||0,contentLength:String(u.responseText??"").length}});if(r.has(Number(u.status)))return this.recordSuccess(s),u;if(u.status>=400){let p=[401,403].includes(u.status)?"AUTH_REQUIRED":u.status===404?"NOT_FOUND":u.status===429?"RATE_LIMITED":"NETWORK_ERROR";throw new D(p,`HTTP ${u.status}`,{source:e.providerId,retryable:u.status===429||u.status>=500,details:{status:u.status,domain:s}})}return this.recordSuccess(s),u}catch(u){let p=D.from(u,e.providerId);if(this.recordAttempt(s,!0),l=p,!p.retryable||c>=a||p.code==="CF_BLOCKED")break;try{await au(Number(e.retryDelayMs??250)*(c+1),e.signal)}catch(g){l=D.from(g,e.providerId);break}}}throw l&&["NETWORK_ERROR","TIMEOUT","CF_BLOCKED"].includes(l.code)&&this.recordBreakerFailure(s,e),n&&(i.probing=!1),this.diagnostics?.recordError(l),l}ensureCircuit(e,t={}){let s=this.circuitBreakers.get(e);return s?(t.circuitCooldownMs!=null&&(s.cooldownMs=Math.max(1e3,Number(t.circuitCooldownMs)||6e4)),t.circuitThreshold!=null&&(s.threshold=Math.max(1,Number(t.circuitThreshold)||3))):(s={state:"closed",failCount:0,openTime:0,cooldownMs:Math.max(1e3,Number(t.circuitCooldownMs??6e4)||6e4),threshold:Math.max(1,Number(t.circuitThreshold??3)||3),probing:!1},this.circuitBreakers.set(e,s)),s}checkCircuit(e){let t=this.circuitBreakers.get(e);if(!t)return null;if(t.state==="open"){let s=Date.now()-t.openTime;if(s=s.threshold)&&(s.state="open",s.openTime=Date.now(),s.probing=!1)}recordFailure(e,t={}){this.recordAttempt(e,!0),this.recordBreakerFailure(e,t)}getCircuitBreakerStatus(){return Object.fromEntries([...this.circuitBreakers].map(([e,t])=>[e,{...t}]))}getDomainStats(){return Object.fromEntries([...this.domainStats].map(([e,t])=>[e,{...t}]))}resetCircuitBreaker(e){this.circuitBreakers.delete(e)}resetAllCircuitBreakers(){this.circuitBreakers.clear()}clearDomainStats(){this.domainStats.clear()}consume(e,t){e.consumers+=1;let s=!1,a={release:d(()=>{s||(s=!0,e.consumers-=1,e.consumers===0&&!this.isSettled(e)&&e.controller.abort(),this.updateDiagnostics())},"release")},r;try{r=t?.ownRequestConsumer(a)}catch(l){throw a.release(),e.promise.catch(()=>{}),l}this.updateDiagnostics();let i=d(()=>{},"removeAbortListener");return(t?Promise.race([e.promise,new Promise((l,c)=>{let h=d(()=>c(new D("ABORTED","LifecycleScope 已释放",{source:t.id})),"onAbort");t.signal.addEventListener("abort",h,{once:!0}),i=d(()=>t.signal.removeEventListener("abort",h),"removeAbortListener")})]):e.promise).finally(()=>{i(),r?.(),a.release()})}isSettled(e){return![...this.inflight.values()].includes(e)}updateDiagnostics(){let e=[...this.inflight.values()].reduce((t,s)=>t+s.consumers,0);this.diagnostics?.updateRequests(e,this.inflight.size)}};d(Qn,"HttpService");var lr=Qn;var Yn=class Yn{constructor(e){this.integrations=e}async resolve(e,t={}){let s=this.integrations.list("image.search-targets")[0];if(!s)throw new D("UNSUPPORTED","以图识图 Integration 不可用",{source:"ImageSearchService"});let a=this.integrations.getAdapter(s.id),r=String(e||"");if(r.startsWith("data:"))r=await a.upload(r,t);else{let i;try{i=new URL(r)}catch(n){throw new D("INVALID_URL","图片 URL 无效",{source:"ImageSearchService",cause:n})}if(!["http:","https:"].includes(i.protocol))throw new D("INVALID_URL","图片 URL 必须使用 HTTP/HTTPS",{source:"ImageSearchService"});r=i.href}return Object.freeze({imageUrl:r,targets:a.createTargets(r)})}};d(Yn,"ImageSearchService");var cr=Yn;var Zn=class Zn{constructor(e){this.port=He(e,"NavigationPort",We.navigation)}open(e,t){return this.port.open(String(e),t)}assign(e){return this.port.assign(String(e))}replace(e){return this.port.replace(String(e))}};d(Zn,"NavigationService");var dr=Zn;var Xn=class Xn{constructor(e,t=null){this.providers=e,this.integrations=t}async search(e,t={}){let s=[];for(let a of await this.providers.getAvailable("magnet",t))try{let r=await a.search(e,t);this.providers.updateHealth(a.id,{ok:!0}),Array.isArray(r)&&s.push(...r)}catch(r){this.providers.updateHealth(a.id,{ok:!1,error:r instanceof Error?r.message:String(r)})}return s}async listNative(e,t={}){let s=typeof e.providerId=="string"?e.providerId:"javdb",a=(this.integrations?.list("movie.magnets")??[]).find(i=>i.id===s);if(!a)return[];let r=this.integrations?.getAdapter(a.id);return typeof r?.listMagnets=="function"?r.listMagnets(e,t):[]}getBuiltInSources(){return(this.integrations?.list("magnet.search")??[]).flatMap(e=>{let t=this.integrations?.getAdapter(e.id);return typeof t?.getSources=="function"?t.getSources():[]})}async searchSource(e,t,s={}){for(let a of this.integrations?.list("magnet.search")??[]){let r=this.integrations?.getAdapter(a.id);if(r?.getSources?.().some(i=>i.id===e))return r.search(e,t,s)}return[]}getSourceTargetUrl(e,t,s={}){for(let a of this.integrations?.list("magnet.search")??[]){let r=this.integrations?.getAdapter(a.id);if(r?.getSources?.().some(i=>i.id===e))return r.targetUrl(e,t,s)}return null}assess(e){return kc(e)}};d(Xn,"MagnetService");var hr=Xn;var eo=class eo{constructor(e=null){this.integrations=e}normalize(e){return ee(e)}firstValid(...e){for(let t of e){let s=this.normalize(t);if(s)return s}return null}async resolve(e,t={}){let s=this.normalize(e.carNum);if(!s)return null;let a=this.integrations?.list("movie.search")??[],r=typeof e.providerId=="string"?e.providerId:null,i=r?a.filter(n=>n.id===r):[...a].sort((n,l)=>+(l.id==="javdb")-+(n.id==="javdb"));for(let n of i){let l=this.integrations?.getAdapter(n.id);if(typeof l?.resolveMovie!="function")continue;let c=await l.resolveMovie({...e,carNum:s},t);if(c)return c}return Object.freeze({...e,carNum:s})}async detail(e,t={}){let s=this.integrations?.list("movie.detail")??[],a=typeof e.providerId=="string"?e.providerId:e.movieId?"javdb":null,r=a?s.filter(i=>i.id===a):s;for(let i of r){let n=this.integrations?.getAdapter(i.id);if(typeof n?.getDetail=="function")return n.getDetail(e,t)}return null}async rankings(e={}){return this.playbackRankings(e)}async playbackRankings(e={}){for(let t of this.integrations?.list("movie.ranking")??[]){let s=this.integrations?.getAdapter(t.id);if(typeof s?.listRankings=="function")return s.listRankings(e)}return[]}async catalog(e,t={},s={}){let a=(this.integrations?.list("movie.catalog")??[]).find(i=>i.id===e);if(!a)throw new TypeError(`Movie catalog provider is unavailable: ${e}`);let r=this.integrations?.getAdapter(a.id);if(typeof r?.listCatalog!="function")throw new TypeError(`Movie catalog operation is unavailable: ${e}`);return r.listCatalog(t,s)}async people(e,t,s={}){let a=(this.integrations?.list("movie.credits")??[]).find(i=>i.id===e);if(!a)return Object.freeze({actors:Object.freeze([]),seller:null});let r=this.integrations?.getAdapter(a.id);return typeof r?.getPeople=="function"?r.getPeople(t,s):Object.freeze({actors:Object.freeze([]),seller:null})}async images(e,t,s={}){let a=(this.integrations?.list("movie.images")??[]).find(i=>i.id===e);if(!a)return[];let r=this.integrations?.getAdapter(a.id);return typeof r?.getImages=="function"?r.getImages(t,s):[]}async preview(e,t,s={}){let a=(this.integrations?.list("movie.preview")??[]).find(i=>i.id===e);if(!a)throw new TypeError(`Movie preview provider is unavailable: ${e}`);let r=this.integrations?.getAdapter(a.id);if(typeof r?.getPreviewForMovie!="function")throw new TypeError(`Movie preview operation is unavailable: ${e}`);return r.getPreviewForMovie(t,s)}sourceUrls(e,t){return Object.freeze(t.map(s=>{try{let a=this.integrations?.getAdapter(s),r=typeof a?.detailUrl=="function"?a.detailUrl(e):null;return r?Object.freeze({providerId:s,url:r}):null}catch{return null}}).filter(Boolean))}searchUrl(e,t){try{let s=this.integrations?.getAdapter(e);return typeof s?.searchUrl=="function"?s.searchUrl(t):null}catch{return null}}providerOrigin(e){try{let t=this.integrations?.getAdapter(e);return typeof t?.origin=="function"?t.origin():null}catch{return null}}matchesProviderUrl(e,t){try{let s=this.integrations?.getAdapter(e);return typeof s?.matchesUrl=="function"&&s.matchesUrl(t)}catch{return!1}}externalSites(e={}){let t=(this.integrations?.list("movie.external-sites")??[])[0],s=t&&this.integrations?.getAdapter(t.id);return typeof s?.getSites=="function"?s.getSites(e):[]}externalSiteOrigin(e,t={}){return this.externalSites(t).find(s=>s.id===e)?.baseUrl||""}async searchExternalSite(e,t,s={}){let a=(this.integrations?.list("movie.external-sites")??[])[0],r=a&&this.integrations?.getAdapter(a.id);return typeof r?.searchSite!="function"?Object.freeze({searchUrl:"",matches:Object.freeze([])}):r.searchSite(e,t,s)}externalNavigationLinks(){let e=(this.integrations?.list("navigation.external")??[])[0],t=e&&this.integrations?.getAdapter(e.id);return typeof t?.getNavigationLinks=="function"?t.getNavigationLinks():[]}};d(eo,"MovieIdentityService");var ur=eo;var to=class to{constructor(e,t){this.providers=e,this.integrations=t}submitWithIntegration(e,t,s={}){let a=this.integrations.getAdapter(e);if(typeof a.submit!="function")throw new TypeError(`Integration ${e} does not support offline submission`);return a.submit(t,s)}checkAccount(e,t={}){let s=this.integrations.getAdapter(e);if(typeof s.checkAccount!="function")throw new TypeError(`Integration ${e} does not support account checks`);return s.checkAccount(t)}searchFiles(e,t,s={}){let a=this.integrations.getAdapter(e);if(typeof a.searchFiles!="function")throw new TypeError(`Integration ${e} does not support file search`);return a.searchFiles(t,s)}renameFile(e,t,s,a={}){let r=this.integrations.getAdapter(e);if(typeof r.renameFile!="function")throw new TypeError(`Integration ${e} does not support file rename`);return r.renameFile(t,s,a)}getPlayUrl(e,t){let s=this.integrations.getAdapter(e);return typeof s.getPlayUrl=="function"?s.getPlayUrl(t):null}getIntegrationHomeUrl(e){let t=this.integrations.getAdapter(e);if(typeof t.homeUrl!="string")throw new TypeError(`Integration ${e} does not declare a home URL`);return t.homeUrl}async submit(e,t={}){let s=await this.providers.getAvailable("offline",t),a=[];for(let r of s)try{let i=await r.submit(e,t);return this.providers.updateHealth(r.id,{ok:!0}),i}catch(i){a.push(i),this.providers.updateHealth(r.id,{ok:!1,error:i instanceof Error?i.message:String(i)})}throw new AggregateError(a,s.length?"所有离线 Provider 均失败":"没有可用的离线 Provider")}};d(to,"OfflineService");var pr=to;var so=class so extends EventTarget{constructor(e){super(),this.window=e.windowRuntime??window,this.scope=e.scope,this.settings=e.settings??null,this.coarseQuery=this.window.matchMedia("(any-pointer: coarse)"),this.profile=this.calculate(),this.started=!1}calculate(){let e=this.window.innerWidth,t=(this.settings?.snapshot()??{}).mobileMode;if(t==="on")return"compact";if(t==="off")return e>=1200?"wide":"regular";let s=Math.min(this.window.innerWidth,this.window.innerHeight);return e<=767||this.coarseQuery.matches&&s<=480?"compact":e>=1200?"wide":"regular"}start(){if(this.started)return;this.started=!0;let e=d(()=>{let t=this.calculate();if(t===this.profile)return;let s=this.profile;this.profile=t,this.dispatchEvent(new CustomEvent("profile.changed",{detail:Object.freeze({previous:s,profile:t})}))},"update");this.scope.listen(this.window,"resize",e,{passive:!0}),this.scope.listen(this.window,"orientationchange",e,{passive:!0}),this.scope.listen(this.coarseQuery,"change",e),this.settings&&this.scope.listen(this.settings,"settings.changed",e),e()}current(){return this.profile}};d(so,"ProfileService");var gr=so;var ao=class ao{constructor(e){this.integrations=e}async list(e,t={}){for(let s of this.integrations.list("movie.related")){let a=this.integrations.getAdapter(s.id);if(typeof a.listRelated=="function")return a.listRelated(e,t)}return[]}};d(ao,"RelatedService");var mr=ao;var ro=class ro{constructor(e){this.integrations=e}async list(e,t={}){for(let s of this.integrations.list("movie.reviews")){let a=this.integrations.getAdapter(s.id);if(typeof a.listReviews=="function")return a.listReviews(e,t)}return[]}};d(ro,"ReviewService");var fr=ro;var Vt="javstore",Uc=new Set([Vt]),io=class io{constructor(e,t=null){this.providers=e,this.integrations=t}isEnabled(e){return e?.enableLoadScreenShot!=="no"}parseScreenshotProviders(e){if(Array.isArray(e))return e;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}return[]}getScreenshotSettings(e){return{mode:e?.screenshotMode==="manual"?"manual":"auto",providers:this.parseScreenshotProviders(e?.screenshotProviders)}}getEnabledProviders(e){let t=this.parseScreenshotProviders(e?.screenshotProviders);return Ms.map(s=>({...s,...t.find(a=>a?.id===s.id)||{}})).filter(s=>s.enabled!==!1).sort((s,a)=>Number(s.priority??100)-Number(a.priority??100))}async resolve(e,t={}){if(t.settings&&!t.allowWhenDisabled&&!this.isEnabled(t.settings))return null;let s=t.settings?this.getEnabledProviders(t.settings):null,a=s?new Set(s.map(r=>r.id)):null;if(s&&!s.length)return null;if(t.providerId){if(a&&!a.has(t.providerId))return null;let r=this.providers.get?.(t.providerId);return r?r.enabled===!1||!r.capabilities?.includes("screenshot")?null:this.resolveFromProvider(r,e,t):this.resolveIntegration(t.providerId,e,t)}for(let r of await this.providers.getAvailable("screenshot",t)){if(a&&!a.has(r.id))continue;let i=await this.resolveFromProvider(r,e,t);if(i)return i}return a&&!a.has(Vt)?null:this.resolveIntegration(Vt,e,t)}async resolveFromProvider(e,t,s){try{let a=await e.resolve(t,s);if(this.providers.updateHealth(e.id,{ok:!0}),a)return a}catch(a){this.providers.updateHealth(e.id,{ok:!1,error:a instanceof Error?a.message:String(a)})}return null}async resolveIntegration(e,t,s){if(!Uc.has(e)||s.settings&&!s.allowWhenDisabled&&!this.isEnabled(s.settings))return null;let a=this.integrations?.list("movie.images")?.find(n=>n.id===e);if(!a)return null;let r=this.integrations?.getAdapter(a.id);if(typeof r?.getImages!="function")return null;let i=await r.getImages(t,s);return Array.isArray(i)&&i.length?i:null}getSearchUrl(e,t=null){if(!Uc.has(Vt)||t&&!this.isEnabled(t)||t&&!this.getEnabledProviders(t).some(s=>s.id===Vt))return null;for(let s of this.integrations?.list("movie.images")??[]){if(s.id!==Vt)continue;let a=this.integrations?.getAdapter(s.id);if(typeof a?.getSearchUrl=="function")return a.getSearchUrl(e)}return null}};d(io,"ScreenshotService");var vr=io;var no="translation_cache_v2",oo="translation:v1:",lo=class lo{constructor(e,t=null){this.integrations=e,this.storage=t,this.memoryCache=new Map,this.inflight=new Map,this.legacyCache=null,this.hydrationPromise=null,this.cacheGeneration=0,this.persistTimer=null}cacheKey(e,t,s){return`${oo}${t}:${s}:${e}`}readLegacyCache(){if(this.legacyCache!==null)return this.legacyCache;try{let e=JSON.parse(this.storage?.getLocal?.("jhs_translate")||"{}");this.legacyCache=e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{this.legacyCache={}}return this.legacyCache}hydrate(){if(this.hydrationPromise)return this.hydrationPromise;let e=this.cacheGeneration;return this.hydrationPromise=(async()=>{if(!this.storage)return;let t=this.storage,s=[],a=!1;try{let r=await t.get(no);for(let[n,l]of Object.entries(r?.entries||{}))e===this.cacheGeneration&&typeof l?.value=="string"&&Number(l.expiresAt)>Date.now()?this.memoryCache.set(n,{value:l.value,expiresAt:Number(l.expiresAt),lastUsed:Number(l.lastUsed)||Date.now()}):a=!0;let i=await t.keys();for(let n of i.filter((l=>l.startsWith(oo)))){let l=await t.get(n);e===this.cacheGeneration&&typeof l?.value=="string"&&Number(l.expiresAt)>Date.now()&&this.memoryCache.set(n,{value:l.value,expiresAt:Number(l.expiresAt),lastUsed:Number(l.lastUsed)||Date.now()}),s.push(n),a=!0}e===this.cacheGeneration&&(this.prune()||a)&&this.persistNow(e).then((()=>Promise.all(s.map((n=>t.remove(n)))))).catch((()=>{}))}catch{}})()}prune(){let e=Date.now(),t=!1;for(let[a,r]of this.memoryCache)r.expiresAt<=e&&(this.memoryCache.delete(a),t=!0);let s=this.memoryCache.size-1e3;if(s>0)for(let[a]of[...this.memoryCache].sort(((r,i)=>r[1].lastUsed-i[1].lastUsed)).slice(0,s))this.memoryCache.delete(a),t=!0;return t}schedulePersist(){if(!this.storage||this.persistTimer!==null)return;let e=this.cacheGeneration;this.persistTimer=setTimeout((()=>{this.persistTimer=null,this.persistNow(e).catch((()=>{}))}),300)}async persistNow(e=this.cacheGeneration){!this.storage||e!==this.cacheGeneration||(this.prune(),await this.storage.set(no,{version:2,entries:Object.fromEntries(this.memoryCache)}))}remember(e,t,s=this.cacheGeneration){if(s===this.cacheGeneration){let a=Date.now();this.memoryCache.set(e,{value:t,expiresAt:a+2592e6,lastUsed:a}),this.prune(),this.schedulePersist()}return t}async clearCache(){if(this.cacheGeneration+=1,this.persistTimer!==null&&clearTimeout(this.persistTimer),this.persistTimer=null,this.memoryCache.clear(),this.legacyCache={},this.storage?.removeLocal?.("jhs_translate"),this.storage){let e=this.storage;try{let t=await e.keys();await e.remove(no),await Promise.all(t.filter((s=>s.startsWith(oo))).map((s=>e.remove(s))))}catch{}}this.hydrationPromise=Promise.resolve()}async inspectCache(){return await this.hydrate(),this.prune(),{version:2,size:this.memoryCache.size,entries:Object.fromEntries(this.memoryCache)}}async translate(e,t={}){let s=t.sourceLanguage??"ja",a=t.targetLanguage??"zh-CN",r=this.cacheKey(e,s,a),i=this.cacheGeneration,n=this.memoryCache.get(r);if(n?.expiresAt>Date.now())return n.lastUsed=Date.now(),this.schedulePersist(),n.value;n&&this.memoryCache.delete(r);let l=t.cacheAlias&&this.readLegacyCache()[t.cacheAlias];if(s==="ja"&&a==="zh-CN"&&typeof l=="string"&&l)return this.remember(r,l,i);if(await this.hydrate(),n=this.memoryCache.get(r),n?.expiresAt>Date.now())return n.lastUsed=Date.now(),this.schedulePersist(),n.value;let c=this.inflight.get(r);if(c)return c;let h=(async()=>{let u=this.integrations.list("text.translate")[0],p=u&&this.integrations.getAdapter(u.id);if(typeof p?.translate!="function")throw new TypeError(u?`Translation operation is unavailable: ${u.id}`:"Translation provider is unavailable");let g=await p.translate(e,{...t,sourceLanguage:s,targetLanguage:a});return typeof g=="string"?this.remember(r,g,i):g})().finally((()=>this.inflight.delete(r)));return this.inflight.set(r,h),h}};d(lo,"TranslationService");var br=lo;var co=class co{constructor(e){this.integrations=e}async search(e,t,s={}){let a=this.integrations.list("subtitle.search").find(i=>i.id===e);if(!a)return[];let r=this.integrations.getAdapter(a.id);return typeof r?.search=="function"?r.search(t,s):[]}async download(e,t,s={}){let a=this.integrations.list("subtitle.download").find(i=>i.id===e);if(!a)throw new TypeError(`Subtitle provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.download!="function")throw new TypeError(`Subtitle download is unavailable: ${e}`);return r.download(t,s)}};d(co,"SubtitleService");var wr=co;var ho=class ho{constructor(e){this.integrations=e}async login(e,t,s={}){let a=this.integrations.list("account.login").find(i=>i.id===e);if(!a)throw new TypeError(`Account provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.login!="function")throw new TypeError(`Account login is unavailable: ${e}`);return r.login(t,s)}};d(ho,"AccountService");var yr=ho;var uo=class uo extends EventTarget{constructor(e,t={}){super(),this.storage=e,this.validators=t.validators??{},this.normalizers=t.normalizers??{},this.afterPersist=t.afterPersist??null,this.snapshotValue=Object.freeze({}),this.writeChain=Promise.resolve()}async load(e="setting"){return this._enqueue(()=>this._withSettingLock(()=>this._readSnapshot(e)))}async refresh(e="setting"){return this._enqueue(()=>this._withSettingLock(async()=>{let t=this.snapshotValue,s=await this._readSnapshot(e),r=[...new Set([...Object.keys(t),...Object.keys(s)])].filter(i=>t[i]!==s[i]);return r.length&&this.dispatchEvent(new CustomEvent("settings.changed",{detail:Object.freeze({name:r.length===1?r[0]:null,value:void 0,names:Object.freeze([...r]),snapshot:s})})),s}))}snapshot(){return this.snapshotValue}waitForIdle(){return this.writeChain}async set(e,t,s="setting"){return this.update(a=>{a[e]=t},s)}async patch(e,t="setting"){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("Settings patch must be an object");return this.update(s=>{Object.assign(s,e)},t)}async replace(e,t="setting"){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("Settings replacement must be an object");return this.update(s=>{for(let a of Object.keys(s))delete s[a];Object.assign(s,e)},t)}async unset(e,t="setting"){let s=Array.isArray(e)?e:[e];if(!s.every(a=>typeof a=="string"&&a))throw new TypeError("unset names must be non-empty strings");return this.update(a=>{for(let r of s)delete a[r]},t)}async update(e,t="setting"){if(typeof e!="function")throw new TypeError("Settings update mutator must be a function");return this._enqueue(()=>this._withSettingLock(async()=>{let s=await this.storage.get(t),a=s&&typeof s=="object"&&!Array.isArray(s)?s:{},r={...a},i=e(r);if(i&&typeof i=="object"&&typeof i.then=="function")throw new TypeError("Settings update mutator must be synchronous");for(let[h,u]of Object.entries(this.normalizers))Object.prototype.hasOwnProperty.call(r,h)&&typeof u=="function"&&(r[h]=u(r[h]));let n=Object.freeze(r),l=[...new Set([...Object.keys(a),...Object.keys(n)])].filter(h=>a[h]!==n[h]);for(let h of l){let u=this.validators[h];if(u&&Object.prototype.hasOwnProperty.call(n,h)&&!u(n[h]))throw new TypeError(`Invalid setting: ${h}`)}let c=Object.freeze([...l]);if(!c.length)return this.snapshotValue=n,n;if(await this.storage.set(t,n),this.snapshotValue=n,c.length){let h=c.length===1?c[0]:null;this.dispatchEvent(new CustomEvent("settings.changed",{detail:Object.freeze({name:h,value:h?n[h]:void 0,names:c,snapshot:n})}))}try{await this.afterPersist?.(n,c)}catch(h){typeof globalThis.clog?.error=="function"&&globalThis.clog.error("[settings] afterPersist failed (ignored)",h)}return n}))}async _readSnapshot(e){let t=await this.storage.get(e);return this.snapshotValue=Object.freeze(t&&typeof t=="object"&&!Array.isArray(t)?{...t}:{}),this.snapshotValue}_enqueue(e){let t=this.writeChain.then(e);return this.writeChain=t.then(()=>{},()=>{}),t}async _withSettingLock(e){let t=globalThis.navigator?.locks;return t?.request?t.request("jhs_setting_lock",()=>e()):e()}};d(uo,"SettingsService");var jr=uo;var po=class po{constructor(e){this.port=He(e,"StoragePort",We.storage)}get(e){return this.port.get(e)}set(e,t){return this.port.set(e,t)}remove(e){return this.port.remove(e)}keys(){return this.port.keys()}getLocal(e){return this.port.getLocal(e)}setLocal(e,t){return this.port.setLocal(e,t)}removeLocal(e){return this.port.removeLocal(e)}getValue(e,t){return this.port.getValue(e,t)}setValue(e,t){return this.port.setValue(e,t)}removeValue(e){return this.port.removeValue(e)}};d(po,"StorageService");var Sr=po;var mo=class mo{constructor(e,t,s,a){this.http=e,this.baseUrl=new URL(t.endsWith("/")?t:`${t}/`),this.username=s,this.password=a,this.folderName=null}authHeaders(){let e=new TextEncoder().encode(`${this.username}:${this.password}`),t="";for(let s of e)t+=String.fromCharCode(s);return{Authorization:`Basic ${btoa(t)}`,Depth:"1"}}async request(e,t,s={},a,r={}){let i=new URL(t.replace(/^\/+/,""),this.baseUrl),n=await this.http.request({providerId:"webdav",method:e,url:i.href,headers:{...this.authHeaders(),...s},body:a,responseType:"text",cacheScope:"none",...r,timeout:1e4,urlPolicy:{trustClass:"user-local",expectedOrigin:this.baseUrl.origin}});return n.data??n.responseText??""}async ensureFolder(e){await this.request("MKCOL",e,{},void 0,{acceptableStatuses:[405,409]})}async backup(e,t,s,a){let r=d(async(i,n,l)=>{let c=performance.now(),h="success",u,p;try{return await n()}catch(g){if(h="error",g&&typeof g=="object"){let m=g;u=typeof m.code=="string"?m.code:void 0,p=Number.isFinite(m.details?.status)?m.details.status:void 0}throw g}finally{try{a?.({stage:i,result:h,durationMs:Math.round(performance.now()-c),...l==null?{}:{bytes:l},...u?{code:u}:{},...p==null?{}:{status:p},timeoutMs:1e4})}catch{}}},"runStage");await r("建目录",()=>this.ensureFolder(e)),await r("上传",()=>this.request("PUT",`${e}/${t}`,{"Content-Type":"text/plain"},s),s.length)}async getFileList(e){let t=String(await this.request("PROPFIND",e,{"Content-Type":"application/xml"},'')),s=new DOMParser().parseFromString(t,"text/xml").getElementsByTagNameNS("DAV:","response"),a=[];for(let r=1;ri.getElementsByTagNameNS("DAV:",u)[0]?.textContent||"","node"),l=n("href"),c=n("displayname")||decodeURIComponent(l.replace(/\/$/,"").split("/").pop()||""),h=n("getcontentlength");h!=="0"&&a.push({fileId:c,name:c,size:Number(h),createTime:n("creationdate")||n("getlastmodified")})}return a.reverse()}async deleteFile(e){await this.request("DELETE",`${this.folderName}/${encodeURI(e)}`,{"Cache-Control":"no-cache"})}async getBackupList(e){return this.folderName=e,await this.ensureFolder(e),this.getFileList(e)}async getFileContent(e){return String(await this.request("GET",`${this.folderName}/${e}`,{Accept:"application/octet-stream"}))}};d(mo,"WebDavClient");var go=mo,fo=class fo{constructor(e,t=void 0,s=void 0){this.http=e,this.credential=t,this.settings=s}createClient(e){return new go(this.http,e.url,e.username,e.password)}async getProfile(){let e=this.settings?.snapshot?.()||{},t=this.credential?await this.credential.get("jhs_webdav_password"):"";return{url:String(e.webDavUrl||""),username:String(e.webDavUsername||""),password:t}}async saveProfile(e={}){if(!this.settings||!this.credential)throw new Error("WebDAV 配置服务未初始化");let t=await this.getProfile(),s=Object.prototype.hasOwnProperty.call(e,"password");s&&await this.credential.set("jhs_webdav_password",String(e.password||""));try{await this.settings.update(a=>{for(let r of["url","username"])Object.prototype.hasOwnProperty.call(e,r)&&(a[r==="url"?"webDavUrl":"webDavUsername"]=String(e[r]||""))})}catch(a){throw s&&await this.credential.set("jhs_webdav_password",t.password),a}return this.getProfile()}};d(fo,"WebDavService");var xr=fo;var Ie=Object.freeze({installationSecret:"jhs_credential_install_secret",webDavPassword:"jhs_webdav_password",javdbToken:"jhs_appAuthorization"}),vo=class vo{constructor(e,t=globalThis.localStorage){this.storage=e,this.legacyStorage=t,this.cleanupValues=new Map,this.cleanupTargets=new Map}async installationSecret(){return String(await this.storage.getValue(Ie.installationSecret,"")||this.legacyStorage?.getItem?.(Ie.installationSecret)||"x7k9p3")}generateSecret(){return btoa(String.fromCharCode(...crypto.getRandomValues(new Uint8Array(32))))}async decodeLegacy(e,t){let s=e.replace(/^AES:/,""),a=e.startsWith("AES:");try{a||(a=/^[A-Za-z0-9+/]+={0,2}$/.test(s)&&atob(s).length>=28)}catch{}return a?Xe(s,t||await this.installationSecret()):e}async decode(e){if(e&&typeof e=="object"){if(e.schema===2&&typeof e.id=="string"&&e.deleted===!0&&!Object.hasOwn(e,"secret")&&!Object.hasOwn(e,"ciphertext"))return"";if(e.schema!==2||typeof e.id!="string"||typeof e.secret!="string"||typeof e.ciphertext!="string")throw new Error("凭证格式无效");return Xe(e.ciphertext,e.secret,!1)}let t=String(e||"");return t?this.decodeLegacy(t):""}async get(e){try{return await this.decode(await this.storage.getValue(e,""))}catch{return""}}async set(e,t){let s=String(t||"");if(!s)return await this.remove(e),"";let a=this.generateSecret(),r={schema:2,id:crypto.randomUUID(),secret:a,ciphertext:await Xt(s,a)};await this.storage.setValue(e,r);let i=await this.storage.getValue(e,"");if(JSON.stringify(i)!==JSON.stringify(r)||await this.decode(i)!==s)throw new Error("凭证存储回读校验失败");return s}async remove(e){let t={schema:2,id:crypto.randomUUID(),deleted:!0};await this.storage.setValue(e,t);let s=await this.storage.getValue(e,"");if(JSON.stringify(s)!==JSON.stringify(t)||await this.decode(s)!=="")throw new Error("凭证删除回读校验失败")}async migrateLegacy(e,t={}){let s=this.legacyStorage?.getItem?.(Ie.installationSecret)||"",a=d(p=>this.decodeLegacy(p,s),"decodeLegacy"),r=[],i={},n=[],l=e?.snapshot?.()||{},c=this.legacyStorage?.getItem?.(Ie.javdbToken)||"",h=String(l.webDavPassword||"");for(let[p,g]of[[Ie.javdbToken,c],[Ie.webDavPassword,h]]){let m;try{m=await this.storage.getValue(p,"")}catch{r.push({key:p,code:"CREDENTIAL_MIGRATION_READ_FAILED"});continue}if(!m&&!g||m&&typeof m=="object"&&(p===Ie.javdbToken||!g||m.deleted===!0))continue;let f,v;try{f=m?await this.decode(m):await a(g),m&&typeof m=="string"&&p===Ie.javdbToken&&(f=await a(f)),v=g?await a(g):""}catch{r.push({key:p,code:"LEGACY_CREDENTIAL_UNREADABLE"});continue}try{(!m||typeof m=="string")&&await this.set(p,f)}catch{r.push({key:p,code:"CREDENTIAL_MIGRATION_WRITE_FAILED"});continue}g&&f===v&&await this.get(p)===f&&(this.cleanupTargets.set(p,f),p===Ie.webDavPassword&&(i.webDavPassword=g))}let u=await this.validateLegacyCleanup({settingKeys:Object.keys(i),settingValues:i,pageKeys:n});return t.deferCleanup||(u.settingKeys.length&&e?.update&&await e.update(p=>{for(let g of u.settingKeys)p[g]===i[g]&&delete p[g]}),await this.cleanupLegacyPageStorage(u.pageKeys,e)),{migrated:!!(c||h||s),cleanup:u,issues:r}}async validateLegacyCleanup(e){let t=[];if(!globalThis.navigator?.locks?.request)return{...e,settingKeys:t};for(let s of e.settingKeys||[])s==="webDavPassword"&&this.cleanupTargets.has(Ie.webDavPassword)&&await this.get(Ie.webDavPassword)===this.cleanupTargets.get(Ie.webDavPassword)&&t.push(s);return{...e,settingKeys:t}}async cleanupLegacyPageStorage(e=[],t=null){this.cleanupValues.clear(),this.cleanupTargets.clear()}};d(vo,"CredentialService");var kr=vo;var bo=class bo{constructor(e){this.port=He(e,"StylePort",We.style)}register(e,t){return this.port.register(e,t)}remove(e){return this.port.remove(e)}};d(bo,"StyleRegistry");var Cr=bo;var wo=class wo{constructor(){this.owners=new Map,this.handlers=new Map,this.activateOwner=null,this.ownerEnabled=new Map}setOwnerEnabled(e,t){if(!this.owners.has(e))throw new Error(`Unknown command owner: ${e}`);this.ownerEnabled.set(e,t)}isAvailable(e){return this.owners.has(e)&&this.ownerEnabled.get(e)!==!1}setActivator(e){this.activateOwner=e}registerOwner(e,t){let s=this.owners.get(e);if(s&&s!==t)throw new Error(`Duplicate command owner: ${e}`);this.owners.set(e,t)}registerHandler(e,t,s){if(this.owners.get(e)!==s)throw new Error(`Feature ${s} does not own command ${e}`);if(this.handlers.has(e))throw new Error(`Duplicate command handler: ${e}`);this.handlers.set(e,t)}async execute(e,...t){let s=this.owners.get(e);if(!s)throw new Error(`Unknown command: ${e}`);if(!this.handlers.has(e)){if(!this.activateOwner)throw new Error("Command activator is not configured");await this.activateOwner(s)}let a=this.handlers.get(e);if(!a)throw new Error(`Feature ${s} did not register ${e}`);return a(...t)}};d(wo,"CommandRegistry");var _r=wo;var yo=class yo{constructor(e=null){this.values=new Map,this.diagnostics=e}register(e,t){if(typeof e!="symbol")throw new TypeError("Dependency token must be a symbol");if(this.values.has(e)){let s=new D("DUPLICATE_TOKEN",`Duplicate dependency token: ${String(e)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(s),s}return this.values.set(e,t),this}resolveDeclared(e){let t=Object.create(null),s=new Set;for(let a of e){if(s.has(a)){let r=new D("DUPLICATE_TOKEN",`Duplicate declared dependency: ${String(a)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(r),r}if(s.add(a),!this.values.has(a)){let r=new D("MISSING_DEPENDENCY",`Missing declared dependency: ${String(a)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(r),r}Object.defineProperty(t,a,{value:this.values.get(a),enumerable:!0})}return Object.freeze(t),new Proxy(t,{get:d((a,r,i)=>{if((typeof r=="symbol"?Symbol.keyFor(r):null)?.startsWith("jhs.")&&!s.has(r)){let l=new D("UNDECLARED_DEPENDENCY",`Undeclared dependency access: ${String(r)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(l),l}return Reflect.get(a,r,i)},"get")})}};d(yo,"DependencyContainer");var $r=yo;var jo=class jo{constructor(e){this.container=e.container,this.commands=e.commands,this.diagnostics=e.diagnostics,this.disabled=new Set($t(e.disabled)),this.site=e.site??"unknown",this.route=e.route??"unknown",this.manifests=new Map,this.contributionOwners=new Map,this.contributionManifests=new Map,this.activations=new Map,this.contributionScopes=new Map,this.commands.setActivator(t=>this.activate(t).then(()=>{}))}setContributionManifests(e){this.contributionManifests=new Map(e.map(t=>[t.id,t]))}activeSurfaces(){return this.route==="list"?new Set(["global","list","list-page","list-card"]):this.route==="detail"||this.route==="owned-detail"?new Set(["global","detail","detail-page",this.route]):new Set(["global",this.route])}register(e){let t=Ee(e);if(this.manifests.has(t.id))throw new Error(`Duplicate feature: ${t.id}`);for(let s of t.contributes){let a=this.contributionOwners.get(s);if(a)throw new Error(`Duplicate contribution ownership: ${s} (${a}, ${t.id})`)}this.manifests.set(t.id,t);for(let s of t.contributes)this.contributionOwners.set(s,t.id);for(let s of t.providesCommands)this.commands.registerOwner(s,t.id),this.commands.setOwnerEnabled(s,this.isEligible(t))}isEligible(e){return!(e.kind!=="system"&&this.disabled.has(e.id)||e.sites.length&&!e.sites.includes(this.site)||e.routes.length&&!e.routes.includes(this.route))}isContributionEnabled(e,t,s){let a=this.manifests.get(e);if(!a||a.sites.length&&!a.sites.includes(this.site)||!a.contributes.includes(t)||a.kind!=="system"&&this.disabled.has(a.id))return!1;if(a.kind==="system")return!0;let r=this.contributionManifests.get(t);return r?.routes?.length&&!r.routes.includes(this.route)||r?.surfaces?.length&&!r.surfaces.some(i=>this.activeSurfaces().has(i))?!1:!this.disabled.has(t)&&!this.disabled.has(s)}isFeatureDisableable(e){let t=this.manifests.get(e);if(!t)throw new Error(`Unknown feature: ${e}`);return t.kind!=="system"&&t.disableable!==!1}resolveDeclaredDependencies(e){return this.container.resolveDeclared(e)}async getScope(e){return(await this.activate(e)).scope}getContributionScope(e,t,s){if(!this.isContributionEnabled(e,t,s))return Promise.reject(new Error(`Contribution is disabled or ineligible: ${t}`));let a=this.contributionScopes.get(t);return(!a||a.disposed)&&(a=new te(`contribution:${t}`,{onChange:d(r=>this.diagnostics.updateScope(r),"onChange")}),this.contributionScopes.set(t,a)),Promise.resolve(a)}activate(e){let t=this.activations.get(e);if(t)return t;let s=this.manifests.get(e);if(!s)return Promise.reject(new Error(`Unknown feature: ${e}`));if(!this.isEligible(s))return Promise.reject(new Error(`Feature is disabled or ineligible: ${e}`));let a=this.activateManifest(s);return this.activations.set(e,a),a.catch(()=>this.activations.delete(e)),a}async activateManifest(e){let t=performance.now(),s=new te(`feature:${e.id}`,{onChange:d(a=>this.diagnostics.updateScope(a),"onChange")});try{let a=this.container.resolveDeclared(e.requires),r=Object.freeze(e.contributes.filter(n=>!this.disabled.has(n))),i=await e.activate(a,Object.freeze({scope:s,enabledContributions:r,route:this.route}));for(let n of e.providesCommands){let l=i?.commands?.[n];if(typeof l!="function")throw new Error(`Feature ${e.id} did not provide command ${n}`);this.commands.registerHandler(n,l,e.id)}return this.diagnostics.setFeature(e.id,!0),r.forEach(n=>this.diagnostics.setContribution(n,!0)),this.diagnostics.recordStartup(e.id,performance.now()-t),Object.freeze({manifest:e,scope:s,enabledContributions:r,dispose:d(()=>{i?.dispose?.();for(let n of e.contributes){let l=this.contributionScopes.get(n);l&&(l.dispose(),this.contributionScopes.delete(n))}s.dispose(),this.diagnostics.setFeature(e.id,!1),r.forEach(n=>this.diagnostics.setContribution(n,!1)),this.activations.delete(e.id)},"dispose")})}catch(a){throw s.dispose(),this.diagnostics.recordError(a),a}}async start(){for(let e of this.manifests.values())this.isEligible(e)&&(e.startup==="eager"?await this.activate(e.id):e.startup==="idle"&&(globalThis.requestIdleCallback??(s=>setTimeout(s,0)))(()=>{this.activate(e.id).catch(()=>{})}))}getActiveFeatureIds(){return[...this.activations.keys()]}};d(jo,"FeatureRuntime");var Tr=jo;var So=class So{constructor(e=null){this.providers=new Map,this.health=new Map,this.diagnostics=e}register(e){if(!e||typeof e.id!="string"||!Array.isArray(e.capabilities))throw new TypeError("Provider requires id and capabilities");if(this.providers.has(e.id))throw new Error(`Duplicate provider: ${e.id}`);return this.providers.set(e.id,Object.freeze({priority:0,enabled:!0,...e})),e}get(e){return this.providers.get(e)??null}list(e){return[...this.providers.values()].filter(t=>t.enabled!==!1&&t.capabilities.includes(e)).sort((t,s)=>Number(s.priority??0)-Number(t.priority??0))}async getAvailable(e,t){let s=[];for(let a of this.list(e))(typeof a.isAvailable!="function"||await a.isAvailable(t))&&s.push(a);return s}updateHealth(e,t){if(!this.providers.has(e))throw new Error(`Unknown provider: ${e}`);this.health.set(e,Object.freeze({...t,updatedAt:Date.now()})),this.diagnostics?.updateProvider(e,t)}getHealth(e){return this.health.get(e)??null}};d(So,"ProviderRegistry");var Ar=So;var zc=Object.freeze({none:{cacheScope:"none",ttlMs:0},"public-1d":{cacheScope:"public",ttlMs:864e5},"public-5m":{cacheScope:"public",ttlMs:3e5},"public-7d":{cacheScope:"public",ttlMs:6048e5},"external-detail-v1":{cacheScope:"public",ttlMs:6048e5,cacheNamespace:"external-detail-v1"},"screenshot-7d":{cacheScope:"public",ttlMs:6048e5,cacheNamespace:"screenshot"},"session-configured":{cacheScope:"session",ttlMs:36e5},"source-configured":{cacheScope:"public",ttlMs:216e5,cacheNamespace:"source",getOnly:!0}});function iu(o,e,t={}){let s=o.cachePolicy==="none"?"none":o.cachePolicy?.[e],a={...zc[s]||zc.none};return a.getOnly&&String(t.method||"GET").toUpperCase()!=="GET"?Object.freeze({cacheScope:"none",ttlMs:0}):(delete a.getOnly,s==="session-configured"&&(a.sessionScopeId=String(t.sessionScopeId||`${o.id}-session`)),Object.freeze(a))}d(iu,"resolveIntegrationCachePolicy");function nu(o,e){let t=d((a,r={})=>iu(e,a,r),"policyFor"),s=d(a=>{if(a.capability&&e.capabilities.includes(a.capability))return a.capability;if(e.capabilities.length===1)return e.capabilities[0];let r=String(a.providerId||"");return e.capabilities.find(i=>r.includes(String(i).split(".").pop()||""))||e.capabilities[0]},"inferCapability");return Object.freeze({request(a,r,i){let n=typeof a=="string",l=n?a:s(a),c=n?r||{}:a||{},h=n?i:r;if(!e.capabilities.includes(l))throw new TypeError(`Integration ${e.id} does not declare capability ${l}`);let u=t(l,c),p={...c,...u};return delete p.capability,o.request(p,h)}})}d(nu,"createIntegrationRequestFacade");var xo=class xo{constructor(e,t){this.container=e,this.diagnostics=t,this.manifests=new Map,this.adapters=new Map}register(e){try{let t=W(e);if(this.manifests.has(t.id))throw new Error(`Duplicate integration: ${t.id}`);this.manifests.set(t.id,t)}catch(t){throw this.diagnostics.recordError(t),t}}list(e){return[...this.manifests.values()].filter(t=>t.capabilities.includes(e))}getAdapter(e){let t=this.adapters.get(e);if(t)return t;let s=this.manifests.get(e);if(!s)throw new Error(`Unknown integration: ${e}`);try{let a=this.container.resolveDeclared(s.requires),r=Object.create(null);for(let l of s.requires)Object.defineProperty(r,l,{value:l===y.http?nu(a[l],s):a[l],enumerable:!0});Object.freeze(r);let i=s.createClient(r),n=s.createAdapter(i,r);return this.adapters.set(e,n),n}catch(a){throw this.diagnostics.recordError(a),a}}};d(xo,"IntegrationRegistry");var Pr=xo;var ou=new Set(["live","nextNavigation","manual"]),lu=new Set(["boolean","select","number","text","password","json"]),cu=new Set(["full","quick"]);function du(o){if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("Setting descriptor must be an object");let e=String(o.key??o.id??"");if(!e)throw new TypeError("Setting descriptor requires key (or id)");if(!o.owner)throw new TypeError(`Setting descriptor requires owner: ${e}`);let t=String(o.type??(o.defaultValue!=null&&typeof o.defaultValue=="boolean"?"boolean":"text"));if(!lu.has(t))throw new TypeError(`Setting descriptor has invalid type: ${e} (${t})`);let s=o.effect??"live";if(!ou.has(s))throw new TypeError(`Setting descriptor has invalid effect: ${e} (${s})`);let a=Array.isArray(o.surfaces)?[...new Set(o.surfaces)].filter(r=>cu.has(r)):[];if(o.surfaces!=null&&!Array.isArray(o.surfaces))throw new TypeError(`Setting descriptor surfaces must be an array: ${e}`);return Object.freeze({...o,key:e,owner:String(o.owner),label:String(o.label??o.key??e),description:o.description==null?"":String(o.description),type:t,effect:s,surfaces:Object.freeze(a),validate:typeof o.validate=="function"?o.validate:null,normalize:typeof o.normalize=="function"?o.normalize:null,contribution:o.contribution==null?void 0:String(o.contribution)})}d(du,"normalizeSettingDescriptor");var ko=class ko{constructor(){this.descriptors=new Map}register(e){let t=du(e);if(this.descriptors.has(t.key))throw new Error(`Duplicate setting descriptor: ${t.key}`);return this.descriptors.set(t.key,t),this}list(e={}){let t=e.surfaces;return[...this.descriptors.values()].filter(s=>!(s.contribution&&e.disabledContributions?.has(s.contribution)||t&&t.length&&!s.surfaces.includes(t[0])&&!t.some(a=>s.surfaces.includes(a))))}get(e){return this.descriptors.get(e)??null}isValid(e,t){let s=this.descriptors.get(e);return s&&typeof s.validate=="function"?s.validate(t)===!0:!0}normalizers(){return Object.fromEntries([...this.descriptors.values()].filter(e=>typeof e.normalize=="function").map(e=>[e.key,e.normalize]))}};d(ko,"SettingsRegistry");var Rr=ko;function Fc(o){let e={type:"boolean",effect:"live"},t="yes",s="no",a=d((i,n,l,c={})=>o.register({key:i,owner:n,label:l,...e,defaultValue:c.defaultValue??t,...c}),"toggle"),r=d((i,n,l,c)=>{let h=Number(i);return Number.isFinite(h)?Math.min(c,Math.max(l,Math.round(h))):n},"normalizeInteger");a("enableScreenSvg","ScreenshotFeature","列表长缩略图",{description:"在列表卡片上显示长缩略图按钮;手动点击仍遵守截图来源白名单。",surfaces:["full"],defaultValue:t}),a("enableLoadScreenShot","ScreenshotFeature","长缩略图",{description:"在详情页与 FC2 页面自动加载长缩略图及对应截图来源请求。",surfaces:["full","quick"]}),a("enablePreviewVideo","PreviewVideoFeature","预览视频",{description:"预览视频总开关。关闭后 JavDB/JavBus 详情与列表卡片的预览入口、播放器与 DMM 请求全部消失。",surfaces:["full","quick"]}),a("enableLoadPreviewVideo","PreviewVideoFeature","DMM 高画质增强",{description:"解析更高画质的 DMM 预览视频;关闭后仍可使用宿主原生预览,但不发起 DMM 请求。",surfaces:["full","quick"],indent:!0}),a("enableVideoSvg","CoverButtonFeature","卡片播放视频",{description:"在列表卡片上显示播放视频按钮。",surfaces:["full"]}),a("enableHandleSvg","CoverButtonFeature","卡片鉴定处理",{description:"在列表卡片上显示鉴定处理菜单。",surfaces:["full"]}),a("enableSiteSvg","CoverButtonFeature","卡片第三方网站",{description:"在列表卡片上显示第三方网站菜单。",surfaces:["full"]}),a("enableCopySvg","CoverButtonFeature","卡片复制",{description:"在列表卡片上显示复制菜单。",surfaces:["full"]}),a("autoPage","AutoPageFeature","瀑布流",{description:"连续加载列表;启用后普通列表只支持默认排序。",surfaces:["full","quick"]}),a("translateTitle","TranslateFeature","标题翻译",{description:"翻译列表和详情页标题。",surfaces:["full","quick"]}),a("hoverBigImg","ListImageFeature","悬浮大图",{description:"鼠标悬停封面时显示大图。",surfaces:["full","quick"],defaultValue:s}),o.register({key:"defaultQuickFilterTab",owner:"ListPageFeature",label:"列表默认筛选",description:"进入列表页时默认选中的筛选标签,修改后下次进入列表生效。",type:"select",defaultValue:"waitCheck",effect:"nextNavigation",surfaces:["full"],options:Is}),a("enableLoadReview","ReviewFeature","评论",{description:"在详情页与 FC2 页面加载评论;显式关闭 no 时保持关闭。",surfaces:["full","quick"]}),a("enableLoadOtherSite","OtherSiteFeature","外部站点",{description:"在详情页提供第三方站点入口。",surfaces:["full","quick"]}),a("enableLoadActressInfo","ActressInfoFeature","演员信息",{description:"在详情页与演员页展示演员资料。",surfaces:["full","quick"]}),a("enableMagnetsFilter","MagnetFeature","磁力质量过滤",{description:"在资源列表中过滤低质量磁力。",surfaces:["full"]}),a("needClosePage","WorkflowFeature","鉴定后立即关闭",{description:"完成鉴定后关闭当前详情窗口。",surfaces:["full","quick"]}),a("enableVerticalModel","LayoutFeature","竖图模式",{description:"使用竖图比例的列表卡片布局。",surfaces:["full","quick"],defaultValue:s}),o.register({key:"mobileMode",owner:"LayoutFeature",label:"移动模式",type:"select",defaultValue:"auto",effect:"live",surfaces:["full"],options:Object.freeze([{value:"auto",label:"自动检测"},{value:"on",label:"强制开启"},{value:"off",label:"强制关闭"}])}),o.register({key:"themeMode",owner:"ThemeFeature",label:"主题",type:"select",defaultValue:"light",effect:"live",surfaces:["full"],options:Object.freeze([{value:"light",label:"浅色"},{value:"dark",label:"深色"},{value:"auto",label:"跟随系统"}])}),o.register({key:"containerColumns",owner:"LayoutFeature",label:"列表列数",type:"number",defaultValue:5,effect:"live",surfaces:["full"]}),o.register({key:"containerWidth",owner:"LayoutFeature",label:"列表宽度",type:"number",defaultValue:100,effect:"live",surfaces:["full"]}),o.register({key:"screenshotMode",owner:"ScreenshotFeature",label:"截图来源模式",type:"select",defaultValue:"auto",effect:"manual",surfaces:["full"],options:Object.freeze([{value:"auto",label:"自动选择"},{value:"manual",label:"手动选择"}])}),o.register({key:"screenshotProviders",owner:"ScreenshotFeature",label:"截图来源",type:"json",defaultValue:[],effect:"manual",surfaces:["full"]}),o.register({key:"enableClog",owner:"CoreFeature",label:"日志",type:"select",defaultValue:t,effect:"live",surfaces:["full"],options:Object.freeze([{value:t,label:"开启"},{value:s,label:"关闭"}])}),o.register({key:"videoMuted",owner:"PreviewVideoFeature",label:"视频默认静音",type:"boolean",defaultValue:!0,effect:"live",surfaces:[]}),a("enable123Offline","OfflineFeature","123 云盘离线",{description:"支持 Magnet,需要先在 123 云盘页面同步授权。",surfaces:["full"],section:"cloud",defaultValue:!0,normalize:d(i=>be(i,!1),"normalize")}),a("enable115Offline","OfflineFeature","115 离线下载",{description:"支持 Magnet 与 ED2K。",surfaces:["full"],section:"cloud",defaultValue:!1,normalize:d(i=>be(i,!1),"normalize")}),o.register({key:"offlineProviderMode",owner:"OfflineFeature",label:"默认服务",description:"选择离线提交时优先使用的服务。",type:"select",defaultValue:"ask",effect:"live",surfaces:["full"],section:"cloud",options:Object.freeze([{value:"ask",label:"每次询问"},{value:"123",label:"优先 123"},{value:"115",label:"优先 115"}]),normalize:d(i=>["ask","123","115"].includes(String(i))?String(i):"ask","normalize")}),a("enable115Match","OfflineFeature","115 文件匹配",{description:"根据当前番号查找网盘中已存在的视频。",surfaces:["full"],section:"cloud",defaultValue:!1,normalize:d(i=>be(i,!1),"normalize")}),a("enable115LoginRedirect","OfflineFeature","未登录时提供登录入口",{description:"提交失败时显示 115 登录地址。",surfaces:["full"],section:"cloud",defaultValue:!1,normalize:d(i=>be(i,!1),"normalize")}),o.register({key:"oneOneFiveConcurrency",owner:"OfflineFeature",label:"匹配并发数",description:"控制 115 文件匹配的并发请求数,范围 1–10。",type:"number",defaultValue:4,effect:"live",surfaces:["full"],section:"cloud",min:1,max:10,step:1,normalize:d(i=>r(i,4,1,10),"normalize")}),o.register({key:"oneOneFiveCacheMinutes",owner:"OfflineFeature",label:"匹配缓存(分钟)",description:"设置 115 匹配结果缓存时间,范围 1–1440 分钟。",type:"number",defaultValue:60,effect:"live",surfaces:["full"],section:"cloud",min:1,max:1440,step:1,normalize:d(i=>r(i,60,1,1440),"normalize")})}d(Fc,"registerDefaultSettings");function Vc(o){let e=new ir({legacyHttp:o.legacyHttp}),t=new te("app:root",{onChange:d(Ne=>e.updateScope(Ne),"onChange")}),s=new $r(e),a=new Za,r=new sr(o.gmRequest),i=new er(o.storageForage,o.localStorage,o.gmGetValue,o.gmSetValue,o.gmDeleteValue),n=new tr(o.layer),l=new Xa,c=new or({localOrigins:o.localOrigins}),h=new dr(a),u=new Sr(i),p=new ar({diagnostics:e,storage:u}),g=new nr(n),m=new Cr(l),f=new Rr;Fc(f);let v=new jr(u,{afterPersist:d(async(Ne,z)=>{o.legacyStorage?.invalidateSettingCache?.(),await o.eventBus?.emit?.("settings-changed",{changedNames:z,source:"service"})},"afterPersist"),normalizers:f.normalizers()}),b=new lr(r,c,{diagnostics:e,cache:p,settings:v});e.setNetworkController(b);let w=new kr(u,o.localStorage),S=new xr(b,w,v);t.listen(v,"settings.changed",Ne=>{if(!(Ne.detail?.names??[]).includes("trustedLocalOrigins"))return;let Z=v.snapshot().trustedLocalOrigins;c.replaceLocalOrigins(Array.isArray(Z)?Z:[])}),o.eventBus&&t.addCleanup(o.eventBus.on("settings-changed",async(Ne,z)=>{let Z=z.originId!==o.eventBus.originId,re=z.originId===o.eventBus.originId&&z.payload?.source==="legacy";!Z&&!re||(o.legacyStorage?.invalidateSettingCache?.(),await v.refresh())})),typeof window<"u"&&t.listen(window,"pageshow",async()=>{o.legacyStorage?.invalidateSettingCache?.(),await v.refresh()});let j=new gr({scope:t,settings:v}),k=new _r,x=new Ar(e),_=new Pr(s,e),R=new ur(_),L=new rr(_,p),N=new cr(_),A=new fr(_),O=new mr(_),U=new hr(x,_),q=new vr(x,_),Q=new br(_,u),se=new wr(_),ge=new yr(_),De=new pr(x,_);s.register(Y.navigation,a).register(Y.http,r).register(Y.storage,i).register(Y.dialog,n).register(Y.style,l).register(y.diagnostics,e).register(y.urlPolicy,c).register(y.navigation,h).register(y.http,b).register(y.storage,u).register(y.webdav,S).register(y.credential,w).register(y.dialog,g).register(y.settings,v).register(y.cache,p).register(y.profile,j).register(y.state,o.stateService).register(y.movie,R).register(y.actressInfo,L).register(y.imageSearch,N).register(y.review,A).register(y.related,O).register(y.magnet,U).register(y.screenshot,q).register(y.offline,De).register(y.translation,Q).register(y.subtitle,se).register(y.account,ge).register(Qe.command,k).register(Qe.provider,x).register(Qe.integration,_).register(Qe.settings,f),o.hostAdapter&&s.register(Y.host,o.hostAdapter),o.hostAdapters?.javdb&&s.register(Y.javdbHost,o.hostAdapters.javdb),o.hostAdapters?.javbus&&s.register(Y.javbusHost,o.hostAdapters.javbus);let lt=new Tr({container:s,commands:k,diagnostics:e,disabled:o.disabled,site:o.site,route:o.route});return s.register(Qe.feature,lt),Object.freeze({rootScope:t,container:s,ports:Object.freeze({navigationPort:a,httpPort:r,storagePort:i,dialogPort:n,stylePort:l}),services:Object.freeze({diagnostics:e,urlPolicy:c,navigation:h,http:b,storage:u,webdav:S,credential:w,dialog:g,styles:m,settings:v,cache:p,profile:j,state:o.stateService,movie:R,actressInfo:L,imageSearch:N,review:A,related:O,magnet:U,screenshot:q,translation:Q,subtitle:se,account:ge,offline:De}),registries:Object.freeze({commands:k,providers:x,integrations:_,settings:f,features:lt})})}d(Vc,"createAppContext");var Gk=Object.freeze({censored:"censored",uncensored:"uncensored"});function Ir(o){if(typeof o.carNum!="string"||!o.carNum)throw new TypeError("MovieRef.carNum is required");return Object.freeze({...o})}d(Ir,"defineMovieRef");function qt(o){if(typeof o.carNum!="string"||!o.carNum)throw new TypeError("MovieDetail.carNum is required");return Object.freeze({...o})}d(qt,"defineMovieDetail");function Co(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelectorAll=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelectorAll=="function")return e;throw new TypeError("123AV document is invalid")}d(Co,"resolveDocument");function _o(o,e="https://123av.com"){let t=new Map;if(typeof o?.find!="function"){for(let a of Co(o).querySelectorAll(".card")){let r=a.querySelector('a.card__link[href*="/cn/v/fc2-ppv-"]'),i=r?.getAttribute("href"),n=r?.textContent?.trim()??"",l=n.match(/FC2-PPV-(\d+)/i);if(!i||!l)continue;let c=`FC2-${l[1]}`,h=new URL(i,e);h.hash="",t.set(c,{imgSrc:a.querySelector("img.card__img[src]")?.getAttribute("src")||"",carNum:c,href:h.href,title:n.replace(/^FC2-PPV-\d+\s*[—–-]\s*/i,"").trim(),preview:a.querySelector(".card__poster[data-preview]")?.getAttribute("data-preview")||null})}return[...t.values()]}let s=globalThis.jQuery??globalThis.$??o.constructor;return o.find(".card").each(((a,r)=>{let i=s(r),n=i.find('a.card__link[href*="/cn/v/fc2-ppv-"]').first(),l=n.attr("href"),c=n.text().trim(),h=c.match(/FC2-PPV-(\d+)/i);if(!l||!h)return;let u=`FC2-${h[1]}`,p=new URL(l,e);p.hash="",t.set(u,{imgSrc:i.find("img.card__img[src]").first().attr("src")||"",carNum:u,href:p.href,title:c.replace(/^FC2-PPV-\d+\s*[—–-]\s*/i,"").trim(),preview:i.find(".card__poster[data-preview]").first().attr("data-preview")||null})})),[...t.values()]}d(_o,"parse123AvCards");function qc(o){let e=new Map;return o.flat().forEach((t=>e.set(t.carNum,t))),[...e.values()]}d(qc,"merge123AvCards");function Hc(o,e="https://123av.com"){if(typeof o?.find!="function"){let r=Co(o),i=r.querySelector('a[rel="last"]')?.getAttribute("href");if(i){let c=Number.parseInt(new URL(i,e).searchParams.get("page")??"",10);if(Number.isFinite(c))return c}let n=Number.parseInt(r.querySelector("input.pager__input[max]")?.getAttribute("max")??"",10);if(Number.isFinite(n))return n;let l=r.querySelector(".pager__total")?.textContent?.match(/(\d[\d,]*)/);return l?Number.parseInt(l[1].replaceAll(",",""),10):null}let t=o.find('a[rel="last"]').first().attr("href");if(t){let r=Number.parseInt(new URL(t,e).searchParams.get("page")??"",10);if(Number.isFinite(r))return r}let s=Number.parseInt(o.find("input.pager__input[max]").first().attr("max"),10);if(Number.isFinite(s))return s;let a=o.find(".pager__total").first().text().match(/(\d[\d,]*)/);return a?Number.parseInt(a[1].replaceAll(",",""),10):null}d(Hc,"parse123AvSourceMaxPage");function Wc(o,e){let t=new URL(e).pathname.match(/fc2-ppv-(\d+)/i),s=t?t[1]:null,a=typeof o?.find=="function"?null:Co(o),r=a?a.querySelector("h1.watch__title")?.textContent?.trim()??"":o.find("h1.watch__title").first().text().trim(),i=s?r.replace(new RegExp(`^FC2-PPV-${s}\\s*[—–-]\\s*`,"i"),"").trim():r,l=(a?a.body?.textContent??"":o.find("body").text()).match(/发布日期\s*(\d{4}-\d{2}-\d{2})/)?.[1]||"";return{id:s,publishDate:l,title:i,moviePoster:null}}d(Wc,"parse123AvVideoInfo");var Er="https://123av.com";function hu(o){try{let e=new URL(String(o||Er));return e.protocol!=="https:"?Er:e.origin}catch{return Er}}d(hu,"normalizeBaseOrigin");function uu(o,e=null){let t=d(()=>hu(e?.snapshot().av123Url),"baseOrigin"),s=d((a,r,i="movie.detail")=>{let n=new URL(a).origin,l=n===Er;return o.request({providerId:"av123",capability:i,method:"GET",url:a,responseType:"text",requestOptions:{cookiePartition:{topLevelSite:n}},urlPolicy:l?{trustClass:"builtin-public",hosts:["123av.com"],expectedOrigin:n}:{trustClass:"custom-public",expectedOrigin:n}},r)},"request");return Object.freeze({contracts:["MovieRef","MovieDetail"],origin:t,searchUrl(a){let r=ee(a?.carNum);return r?`${t()}/cn/search?keyword=${encodeURIComponent(r)}`:null},detailUrl(a){let r=ee(a.carNum)?.match(/^FC2-(\d+)$/)?.[1];return a.url?new URL(a.url).href:r?`${t()}/cn/v/fc2-ppv-${r}`:null},matchesUrl(a){try{let r=new URL(a);return r.origin===t()||/^\/cn\/v\/fc2-ppv-\d+\/?$/i.test(r.pathname)}catch{return!1}},async listCatalog(a={},r={}){let i=Math.max(1,Number(a.page)||1),n=String(a.keyword||"").trim(),c=(n?[i]:[i*2-1,i*2]).map(m=>n?`${t()}/cn/search?keyword=${encodeURIComponent(n)}&page=${m}`:`${t()}/cn/makers/fc2?page=${m}`),h=await Promise.all(c.map(m=>s(m,r.scope,n?"movie.search":"movie.catalog"))),u=h.map((m,f)=>_o(m.data,m.finalUrl||c[f])),p=qc(u).map(m=>Object.freeze({carNum:m.carNum,title:m.title,url:m.href,imageUrl:m.imgSrc?new URL(m.imgSrc,t()).href:null,previewUrl:m.preview?new URL(m.preview,t()).href:null,providerId:"av123"})),g=h.length?Hc(h[0].data,h[0].finalUrl||c[0]):null;return Object.freeze({items:p,maxPage:g?n?g:Math.ceil(g/2):null})},async resolveMovie(a,r={}){let i=ee(a.carNum);if(!i)return null;let n=this.searchUrl({carNum:i});if(!n)return null;let l=await s(n,r.scope,"movie.search"),c=_o(l.data,l.finalUrl||n).find(h=>ee(h.carNum)===i);return c?Ir({carNum:i,url:c.href,providerId:"av123"}):null},async getDetail(a,r={}){let i=ee(a.carNum),n=i?.match(/^FC2-(\d+)$/)?.[1];if(!i||!a.url&&!n)throw new TypeError("123AV movie reference is invalid");let l=new URL(a.url||`${t()}/cn/v/fc2-ppv-${n}`).href,c=await s(l,r.scope),h=Wc(c.data,c.finalUrl||l);if(!h.title)throw new TypeError("123AV detail is malformed");return qt({carNum:i,title:h.title,releaseDate:h.publishDate||null,url:c.finalUrl||l,providerId:"av123"})}})}d(uu,"create123AvAdapter");var Jc=W({id:"av123",trustClass:"builtin-public",hosts:["123av.com"],capabilities:["movie.search","movie.detail","movie.catalog"],requires:[y.http,y.settings],createClient:d(o=>Object.freeze({http:o[y.http],settings:o[y.settings]}),"createClient"),createAdapter:d(o=>uu(o.http,o.settings),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.search":"public-7d","movie.detail":ke.externalDetail,"movie.catalog":"public-7d"},quality:"silver"});function pu(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelector=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelector=="function")return e;throw new TypeError("DMM preview document is invalid")}d(pu,"resolveDocument");function Kc(o,e){let t=pu(o),s=t.querySelector("[data-video-url]")?.getAttribute("data-video-url")??t.querySelector("video source[src]")?.getAttribute("src");if(!s)throw new TypeError("DMM preview URL is missing");let a=new URL(s,e);if(a.protocol!=="https:")throw new TypeError("DMM preview must use HTTPS");return Object.freeze({url:a.href})}d(Kc,"parseDmmPreview");function Gc(o,e,t){if(o?.result?.result_count===0&&!Array.isArray(o.result.items))return Object.freeze([]);if(!o||typeof o!="object"||!o.result||!Array.isArray(o.result.items))throw new we("dmm","INVALID_RESPONSE","DMM API 返回结构无效");let s=e.toLowerCase(),a=s.replace(/-/g,""),r=t.toLowerCase().replace(/-/g,"");return Object.freeze(o.result.items.flatMap(i=>{let n=String(i?.content_id??""),l=String(i?.maker_product??"");return!n.toLowerCase().includes(r)&&l.toLowerCase()!==s&&!n.toLowerCase().includes(a)?[]:[Object.freeze({serviceCode:String(i.service_code??""),floorCode:String(i.floor_code??""),contentId:n,pageUrl:new URL(String(i.URL)).href})]}).slice(0,2))}d(Gc,"parseDmmItemCandidates");function Qc(o,e){if(typeof o!="string")throw new we("dmm","PARSE_ERROR","解析播放页内容失败, 非文本内容",{url:e});if(o.includes("このサービスはお住まいの地域からは"))throw new we("dmm","REGION_BLOCKED","DMM 预览源不可用,请将 DMM 域名分流到日本 IP",{url:e});let t=o.match(/const\s+args\s+=\s+(.*);/);if(!t)throw new we("dmm","PARSE_ERROR","未在脚本中找到 const args = ... 变量",{url:e});let s;try{({bitrates:s}=JSON.parse(t[1]))}catch(r){throw new we("dmm","PARSE_ERROR",`解析播放器脚本 JSON 失败: ${r instanceof Error?r.message:String(r)}`,{cause:r,url:e})}if(!Array.isArray(s))throw new we("dmm","PARSE_ERROR","解析画质链接失败: bitrates 字段不是一个数组或不存在",{url:e});let a={};for(let r of s){let i=r?.src;if(typeof i!="string"||!i.endsWith(".mp4"))continue;let n=new URL(i,e);if(n.protocol!=="https:")continue;let l=n.pathname.match(/\/([^/]+)\.mp4$/)?.[1];l&&!a[l]&&(a[l]=n.href)}if(Object.keys(a).length===0)throw new we("dmm","PARSE_ERROR","未找到匹配要求的预览画质视频",{url:e});return Object.freeze(a)}d(Qc,"parseDmmPlayerSources");var $o=["dmm.co.jp","dmm.com"];function gu(o){return Object.freeze({contracts:["MoviePreview"],searchUrl(e){return`https://www.dmm.co.jp/search/=/searchstr=${encodeURIComponent(String(e.carNum??""))}`},async getPreview(e,t={}){let s=new URL(e.url),a=await o.request({providerId:"dmm",capability:"movie.preview",method:"GET",url:s.href,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["dmm.co.jp"]}},t.scope);return Kc(a.data,a.finalUrl||s.href)},async getPreviewForMovie(e,t={}){let s=String(e.carNum),a=s.replace(/-/g,""),r=[s.replace("-","00"),s,a],i=this.searchUrl(e),n=[],l=null,c=!1;for(let p of r){let g=`https://api.dmm.com/affiliate/v3/ItemList?${new URLSearchParams({api_id:"UrwskPfkqQ0DuVry2gYL",affiliate_id:"10278-996",output:"json",site:"FANZA",sort:"match",keyword:p})}`;try{let m=await o.request({providerId:"dmm",capability:"movie.preview",method:"GET",url:g,responseType:"json",urlPolicy:{trustClass:"builtin-public",hosts:$o}},t.scope);if(n=Gc(m.data,s,p),c=!0,n.length)break}catch(m){l=m;break}}if(!n.length){if(!c&&l)throw l;return Object.freeze({sources:null,pageUrl:i,searchUrl:i,matchType:"none"})}let h=n.map(async p=>{let g=`https://www.dmm.co.jp/service/digitalapi/-/html5_player/=/cid=${encodeURIComponent(p.contentId)}/mtype=AhRVShI_/service=${encodeURIComponent(p.serviceCode)}/floor=${encodeURIComponent(p.floorCode)}/mode=/`,m=await o.request({providerId:"dmm",capability:"movie.preview",method:"GET",url:g,responseType:"text",headers:{"accept-language":"ja-JP,ja;q=0.9",Cookie:"age_check_done=1"},urlPolicy:{trustClass:"builtin-public",hosts:$o}},t.scope);return Qc(m.data,m.finalUrl||g)}),u;try{u=await Promise.any(h)}catch(p){let g=p instanceof AggregateError?p.errors:[p];throw g.find(m=>m?.code==="REGION_BLOCKED")??g[0]??p}return Object.freeze({sources:u,pageUrl:n.length>1?i:n[0].pageUrl,searchUrl:i,matchType:n.length>1?"multiple":"single"})}})}d(gu,"createDmmAdapter");var Yc=W({id:"dmm",trustClass:"builtin-public",hosts:$o,capabilities:["movie.preview"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>gu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.preview":"none"},quality:"silver"});var Zc=Object.freeze([Object.freeze({id:"javTrailersBtn",name:"javTrailers",settingKey:"javTrailersUrl",defaultBaseUrl:"https://javtrailers.com",itemSelector:".videos-list .video-link",textSelector:"p.card-text",hrefSelector:null,searchPath:d(o=>`/search/${o}`,"searchPath")}),Object.freeze({id:"jableBtn",name:"jable",settingKey:"jableUrl",defaultBaseUrl:"https://jable.tv",itemSelector:"#list_videos_videos_list_search_result .detail .title a",textSelector:null,hrefSelector:null,searchPath:d(o=>`/search/${o}/`,"searchPath")}),Object.freeze({id:"avgleBtn",name:"avgle",settingKey:"avgleUrl",defaultBaseUrl:"https://jav.rs",itemSelector:".text-secondary",textSelector:null,hrefSelector:null,searchPath:d(o=>`/vod/search.html?wd=${o}`,"searchPath")}),Object.freeze({id:"missAvBtn",name:"missAv",settingKey:"missAvUrl",defaultBaseUrl:"https://missav.live",itemSelector:".text-secondary",textSelector:null,hrefSelector:null,searchPath:d(o=>`/search/${o}`,"searchPath")}),Object.freeze({id:"supJavBtn",name:"supJav",settingKey:"supJavUrl",defaultBaseUrl:"https://supjav.com",itemSelector:".posts post",textSelector:null,hrefSelector:null,titleAttribute:!0,searchPath:d(o=>`/?s=${o}`,"searchPath")}),Object.freeze({id:"javDbBtn",name:"javDb",settingKey:"javDbUrl",defaultBaseUrl:"https://javdb.com",itemSelector:".movie-list .item",textSelector:".video-title",hrefSelector:"a",searchPath:d(o=>`/search?q=${o}`,"searchPath")}),Object.freeze({id:"javBusBtn",name:"javBus",settingKey:"javBusUrl",defaultBaseUrl:"https://www.javbus.com",itemSelector:".container h3",textSelector:null,hrefSelector:null,directDetail:!0,searchPath:d(o=>`/${o}`,"searchPath")})]);function Xc(o,e){let t=new URL(e[o.settingKey]||o.defaultBaseUrl).origin;return Object.freeze({id:o.id,name:o.name,baseUrl:t,searchUrl:d(s=>new URL(o.searchPath(encodeURIComponent(s)),`${t}/`).href,"searchUrl")})}d(Xc,"siteDefinition");function mu(o,e,t,s){if(typeof o!="string")throw new D("INVALID_RESPONSE","外部站点响应不是 HTML",{source:e.id});let a=new DOMParser().parseFromString(o,"text/html"),r=[];for(let i of a.querySelectorAll(e.itemSelector)){let n=e.textSelector?i.querySelector(e.textSelector):i;if((e.titleAttribute?i.getAttribute("title")||"":n?.textContent?.trim()||"").toLowerCase().includes(t.toLowerCase()))if(e.directDetail)r.push(new URL(`/${encodeURIComponent(t)}`,`${s}/`).href);else{let c=e.hrefSelector?i.querySelector(e.hrefSelector):i,h=c?.getAttribute("href");if(!h)throw new D("PARSE_ERROR","外部站点结果缺少链接",{source:e.id});r.push(new URL(h,`${s}/`).href)}}return Object.freeze([...new Set(r)])}d(mu,"parseExternalSiteResults");function fu(o){return Object.freeze({contracts:["ExternalSiteResult"],getSites(e={}){return Object.freeze(Zc.map(t=>Xc(t,e)))},getNavigationLinks:d(()=>Object.freeze([Object.freeze({id:"theporndude",label:"ThePornDude",url:"https://theporndude.com/zh"})]),"getNavigationLinks"),async searchSite(e,t,s={}){let a=Zc.find(u=>u.id===e);if(!a)throw new D("UNSUPPORTED",`未知外部站点:${e}`,{source:"external-sites"});let r=Xc(a,s.settings||{}),i=r.searchUrl(t),n=new URL(i),l=new URL(a.defaultBaseUrl).hostname.replace(/^www\./,""),c=n.hostname===l||n.hostname.endsWith(`.${l}`)?{trustClass:"builtin-public",hosts:[l],expectedOrigin:n.origin}:{trustClass:"custom-public",expectedOrigin:n.origin},h=await o.request({capability:"movie.external-sites",providerId:`external-site:${e}`,method:"GET",url:i,responseType:"text",urlPolicy:c},s.scope);return Object.freeze({searchUrl:i,matches:mu(h.data,a,t,r.baseUrl)})}})}d(fu,"createExternalSitesAdapter");var ed=W({id:"external-sites",trustClass:"builtin-public",hosts:["javtrailers.com","jable.tv","jav.rs","missav.live","supjav.com","javdb.com","javbus.com","theporndude.com"],capabilities:["movie.external-sites","navigation.external"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>fu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.external-sites":"public-1d","navigation.external":"none"},quality:"silver"});function td(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelector=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelector=="function")return e;throw new TypeError("FC2PPVDB detail document is invalid")}d(td,"resolveDocument");function sd(o,e){let t=new URL(e).pathname.match(/(?:articles?|videos?)\/(\d+)/i)?.[1],s=ee(t?`FC2-${t}`:""),a=td(o).querySelector("h1")?.textContent?.trim()??"";if(!s||!a)throw new TypeError("FC2PPVDB detail is malformed");return qt({carNum:s,title:a,url:new URL(e).href})}d(sd,"parseFc2PpvDbDetail");function ad(o,e){let t=td(o),s=new URL(e),a=[...t.querySelectorAll("div")],r=a.find(h=>h.textContent?.trim().startsWith("女優:")),i=a.find(h=>h.textContent?.trim().startsWith("販売者:")),n=[...r?.querySelectorAll("a[href]")??[]].map(h=>Object.freeze({name:h.textContent?.trim()||"",url:new URL(h.getAttribute("href")||"",s).href})).filter(h=>h.name),l=i?.querySelector("a[href]"),c=l?Object.freeze({name:l.textContent?.trim()||"",url:new URL(l.getAttribute("href")||"",s).href}):null;return Object.freeze({actors:Object.freeze(n),seller:c})}d(ad,"parseFc2PpvDbPeople");function vu(o){let e=d(s=>{let a=String(s.carNum||"").match(/^(?:FC2-)?(?:PPV-)?(\d+)$/i)?.[1];if(!a)throw new TypeError("FC2PPVDB movie identifier is invalid");return new URL(s.url||`https://fc2ppvdb.com/articles/${a}`)},"resolveUrl"),t=d((s,a,r="movie.detail")=>o.request({capability:r,providerId:"fc2ppvdb",method:"GET",url:s.href,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["fc2ppvdb.com"]}},a),"request");return Object.freeze({contracts:["MovieDetail","MovieCredits"],detailUrl(s){return e(s).href},async getDetail(s,a={}){let r=e(s),i=await t(r,a.scope,"movie.detail");return sd(i.data,i.finalUrl||r.href)},async getPeople(s,a={}){let r=e(s),i=await t(r,a.scope,"movie.credits");return ad(i.data,i.finalUrl||r.href)}})}d(vu,"createFc2PpvDbAdapter");var rd=W({id:"fc2ppvdb",trustClass:"builtin-public",hosts:["fc2ppvdb.com"],capabilities:["movie.detail","movie.credits"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>vu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.detail":ke.externalDetail,"movie.credits":ke.externalDetail},quality:"silver"});function id(o,e){let t=new DOMParser().parseFromString(o,"text/html"),s=new Set;for(let a of t.querySelectorAll(".items_article_SampleImagesArea img[src]")){let r=new URL(a.getAttribute("src")||"",e);r.protocol==="https:"&&s.add(r.href)}return Object.freeze([...s].map(a=>Object.freeze({url:a,providerId:"fc2content"})))}d(id,"parseFc2ContentImages");function bu(o){return Object.freeze({contracts:["Screenshot"],detailUrl(e){let t=String(e.carNum||"").match(/^(?:FC2-)?(?:PPV-)?(\d+)$/i)?.[1];return t?`https://adult.contents.fc2.com/article/${t}/`:null},async getImages(e,t={}){let s=String(e.carNum||"").match(/^(?:FC2-)?(?:PPV-)?(\d+)$/i)?.[1];if(!s)return[];let a=`https://adult.contents.fc2.com/article/${s}/`,r=await o.request({providerId:"fc2content",capability:"movie.images",method:"GET",url:a,responseType:"text",headers:{referer:a},urlPolicy:{trustClass:"builtin-public",hosts:["adult.contents.fc2.com"]}},t.scope);return id(r.data,r.finalUrl||a)}})}d(bu,"createFc2ContentAdapter");var nd=W({id:"fc2content",trustClass:"builtin-public",hosts:["adult.contents.fc2.com"],capabilities:["movie.images"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>bu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.images":ke.externalDetail},quality:"silver"});function od(o){if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("Translation response is invalid");let e=o.translation;if(typeof e!="string"||!e.trim())throw new TypeError("Translation text is missing");return e}d(od,"parseGoogleTranslation");var wu="https://translate-pa.googleapis.com/v1/translate";function yu(o){return Object.freeze({contracts:["Translation"],async translate(e,t={}){if(!String(e||"").trim())throw new TypeError("Translation text cannot be empty");let s=new URL(wu);s.search=new URLSearchParams({"params.client":"gtx",dataTypes:"TRANSLATION",key:"AIzaSyDLEeFI5OtFBwYBIoK_jj5m32rZK5CkCXA","query.sourceLanguage":t.sourceLanguage??"ja","query.targetLanguage":t.targetLanguage??"zh-CN","query.text":e}).toString();let a=await o.request({providerId:"google-translate",capability:"text.translate",method:"GET",url:s.href,responseType:"json",transport:"native-fetch",nativeTimeout:1500,timeout:5e3,urlPolicy:{trustClass:"builtin-public",hosts:["translate-pa.googleapis.com"]}},t.scope);return od(a.data)}})}d(yu,"createGoogleTranslateAdapter");var ld=W({id:"google-translate",trustClass:"builtin-public",hosts:["translate-pa.googleapis.com"],capabilities:["text.translate"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>yu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"text.translate":"none"},quality:"silver"});var To=Object.freeze([Object.freeze({id:"jsdelivr",name:"jsDelivr (全球CDN)",catalogUrl:"https://cdn.jsdelivr.net/gh/gfriends/gfriends/Filetree.json",contentBaseUrl:"https://cdn.jsdelivr.net/gh/gfriends/gfriends/Content/",recommended:!0}),Object.freeze({id:"github-raw",name:"GitHub Raw (备用)",catalogUrl:"https://raw.githubusercontent.com/gfriends/gfriends/master/Filetree.json",contentBaseUrl:"https://raw.githubusercontent.com/gfriends/gfriends/master/Content/",recommended:!1})]);function ju(o,e){let t=o?.Content;if(!t||typeof t!="object"||Array.isArray(t))throw new D("INVALID_RESPONSE","头像数据源缺少 Content",{source:"gfriends"});let s=new Map;for(let[a,r]of Object.entries(t))if(!(!r||typeof r!="object"||Array.isArray(r)))for(let[i,n]of Object.entries(r)){if(typeof n!="string")continue;let l=i.replace(/\.jpg$/i,"").split("-")[0];if(l.startsWith("AI-Fix-")&&(l=l.slice(7)),l=l.toLowerCase().trim(),!l)continue;let c=n.indexOf("?"),h=c>=0?n.slice(0,c):n,u=c>=0?n.slice(c):"",p=`${e}${encodeURIComponent(a)}/${encodeURIComponent(h)}${u}`,g=s.get(l)||[];g.includes(p)||g.push(p),s.set(l,g)}return s}d(ju,"parseGfriendsCatalog");function Su(o){return Object.freeze({contracts:["ActorAvatar"],getSources:d(()=>Object.freeze(To.map(e=>Object.freeze({id:e.id,name:e.name,recommended:e.recommended}))),"getSources"),async searchAvatars(e,t={}){let s=To.find(n=>n.id===(t.sourceId||To[0].id));if(!s)throw new D("UNSUPPORTED",`未知头像数据源:${t.sourceId}`,{source:"gfriends"});let a=await o.request({providerId:`gfriends:${s.id}`,capability:"person.avatar-search",method:"GET",url:s.catalogUrl,responseType:"json",timeout:2e4,urlPolicy:{trustClass:"builtin-public",hosts:[new URL(s.catalogUrl).hostname]}},t.scope),r=ju(a.data,s.contentBaseUrl),i=new Set;return e.map(n=>String(n).toLowerCase().trim()).filter(Boolean).forEach(n=>r.get(n)?.forEach(l=>i.add(l))),Object.freeze([...i])}})}d(Su,"createGfriendsAdapter");var cd=W({id:"gfriends",trustClass:"builtin-public",hosts:["cdn.jsdelivr.net","raw.githubusercontent.com"],capabilities:["person.avatar-search"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Su(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"person.avatar-search":"public-7d"},quality:"silver"});var dd=W({id:"host-list",trustClass:"builtin-public",hosts:["javdb.com","javbus.com"],capabilities:["host.list.parse"],requires:[],createClient:d(()=>Object.freeze({id:"host-list"}),"createClient"),createAdapter:d(()=>Object.freeze({contracts:["MovieRef"]}),"createAdapter"),createHostAdapter:null,cachePolicy:"none",quality:"bronze"});var xu="https://api.imgur.com/3/image",ku="d70305e7c3ac5c6",Cu=Object.freeze({trustClass:"builtin-public",hosts:["imgur.com","google.com","yandex.ru"]}),_u=Object.freeze([Object.freeze({id:"google-legacy",name:"Google旧版",urlTemplate:"https://www.google.com/searchbyimage?image_url={imageUrl}&client=firefox-b-d",iconUrl:"https://www.google.com/favicon.ico"}),Object.freeze({id:"google-lens",name:"Google",urlTemplate:"https://lens.google.com/uploadbyurl?url={imageUrl}",iconUrl:"https://www.google.com/favicon.ico"}),Object.freeze({id:"yandex",name:"Yandex",urlTemplate:"https://yandex.ru/images/search?rpt=imageview&url={imageUrl}",iconUrl:"https://yandex.ru/favicon.ico"})]);function $u(o){let e=o;if(typeof e=="string")try{e=JSON.parse(e)}catch(s){throw new D("INVALID_RESPONSE","Imgur 返回了无效 JSON",{source:"image-search",cause:s})}let t=e;if(t?.success&&typeof t?.data?.link=="string"&&/^https:\/\//i.test(t.data.link))return t.data.link;throw new D("INVALID_RESPONSE",String(t?.data?.error||"Imgur 上传响应无效"),{source:"image-search"})}d($u,"parseImgurUpload");function Tu(o){let e=o.match(/^data:(image\/[a-z0-9.+-]+);base64,([a-z0-9+/=\s]+)$/i);if(!e)throw new D("INVALID_RESPONSE","无效的 Base64 图片数据",{source:"image-search"});let t=atob(e[2].replace(/\s/g,"")),s=new Uint8Array(t.length);for(let r=0;rObject.freeze({id:s.id,name:s.name,url:s.urlTemplate.replace("{imageUrl}",t),iconUrl:s.iconUrl})))}})}d(Au,"createImageSearchAdapter");var hd=W({id:"image-search",trustClass:"builtin-public",hosts:["imgur.com","google.com","yandex.ru"],capabilities:["image.upload","image.search-targets"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Au(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"image.upload":"none","image.search-targets":"none"},quality:"silver"});var ud=0,Dr="";function Ao(){let o=Math.floor(Date.now()/1e3);if(Dr&&o-ud<=20)return Dr;let e=globalThis.md5;if(typeof e!="function")throw new Error("Missing userscript vendor runtime: md5");return ud=o,Dr=`${o}.lpw6vgqzsp.${e(`${o}71cf27bb3c0bcdf207b64abecddc970098c7421ee7203b9cdae54478478a199e7d5a6e1a57691123c1a931c057842fb73ba3b3c83bcd69c17ccf174081e3d8aa`)}`,Dr}d(Ao,"createJavDbSignature");var pd="https://jdforrepam.com";function Pu(o,e=Ao,t=null){let s=d(r=>{let i=new URL(r).origin,n=new URL(r).hostname;return n==="javdb.com"||n.endsWith(".javdb.com")?{trustClass:"builtin-public",hosts:["javdb.com"],expectedOrigin:i}:{trustClass:"custom-public",expectedOrigin:i}},"hostPolicy"),a=d(async(r,i,n={},l={},c="movie.detail")=>{let h=new URL(r,pd);return Object.entries(i).forEach(([p,g])=>h.searchParams.set(p,String(g))),(await o.request({providerId:"javdb",capability:c,method:"GET",url:h.href,responseType:"json",headers:{jdSignature:e(),...l},urlPolicy:{trustClass:"builtin-public",hosts:["jdforrepam.com"]}},n.scope)).data},"request");return Object.freeze({contracts:["MovieRef","MovieDetail","Actor","Magnet","Review","RelatedList","AccountSession"],actorPlaceholderUrl:d(()=>"https://c0.jdbstatic.com/images/actor_unknow.jpg","actorPlaceholderUrl"),async login(r,i={}){let n=new URL("/api/v1/sessions",pd);Object.entries({username:r.username,password:r.password,device_uuid:"04b9534d-5118-53de-9f87-2ddded77111e",device_name:"iPhone",device_model:"iPhone",platform:"ios",system_version:"17.4",app_version:"official",app_version_number:"1.9.29",app_channel:"official"}).forEach(([h,u])=>n.searchParams.set(h,u));let c=(await o.request({providerId:"javdb",capability:"account.login",method:"POST",url:n.href,responseType:"json",headers:{"user-agent":"Dart/3.5 (dart:io)","accept-language":"zh-TW","content-type":"multipart/form-data; boundary=--dio-boundary-2210433284",jdsignature:e()},urlPolicy:{trustClass:"builtin-public",hosts:["jdforrepam.com"]}},i.scope)).data;if(c?.success===0)return Object.freeze({success:!1,token:null,message:String(c.message||"登录失败")});if(c?.success!==1||typeof c?.data?.token!="string")throw new D("INVALID_RESPONSE",String(c?.message||"JavDB 登录响应无效"),{source:"javdb"});return Object.freeze({success:!0,token:c.data.token,message:String(c.message||"")})},async listActorMovies(r,i={}){let n=new URL(r.baseUrl||"https://javdb.com").origin,l=new URL(`/actors/${encodeURIComponent(r.actorId)}?t=d`,n),c=await o.request({providerId:"javdb-host",capability:"actor.movies",method:"GET",url:l.href,responseType:"text",urlPolicy:s(n)},i.scope);if(typeof t?.parseActorMovies!="function")throw new TypeError("JavDB HostAdapter parser is unavailable");return t.parseActorMovies(c.data,c.finalUrl||l.href)},async listActorCollection(r,i={}){let n=new URL(r.baseUrl||"https://javdb.com").origin,l=new URL(r.pageUrl||"/users/collection_actors",n),c=await o.request({providerId:"javdb-host",capability:"actor.collection",method:"GET",url:l.href,responseType:"text",urlPolicy:s(n)},i.scope);if(typeof t?.parseActorCollection!="function")throw new TypeError("JavDB HostAdapter collection parser is unavailable");return t.parseActorCollection(c.data,c.finalUrl||l.href)},async uncollectActor(r,i={}){let n=new URL(r.baseUrl||"https://javdb.com").origin,l=new URL(`/actors/${encodeURIComponent(r.actorId)}/uncollect`,n),c=await o.request({providerId:"javdb-host",capability:"actor.uncollect",method:"POST",url:l.href,body:"null",responseType:"text",headers:{"Content-Type":"application/json","x-csrf-token":r.csrfToken},urlPolicy:s(n)},i.scope);return Object.freeze({success:typeof c.data=="string"&&c.data.includes("removeClass")})},async resolveMovie(r,i={}){let n=ee(r.carNum);if(!n)return null;let l=await a("/api/v2/search",{q:n,page:1,type:"movie",limit:20,movie_type:"all",from_recent:"false",movie_filter_by:"all",movie_sort_by:"relevance"},i,{"user-agent":"Dart/3.5 (dart:io)","accept-language":"zh-TW",host:"jdforrepam.com"},"movie.search");if(!Array.isArray(l?.data?.movies))throw new Error(l?.message||"JavDB search response is invalid");let c=l.data.movies.find(h=>ee(h.number)===n);return c?.id?Object.freeze({carNum:n,movieId:String(c.id),providerId:"javdb"}):null},async getDetail(r,i={}){let n=String(r.movieId||"").trim();if(!n)throw new TypeError("JavDB movie id is required");let l=await a(`/api/v4/movies/${encodeURIComponent(n)}`,{},i,{},"movie.detail"),c=l?.data?.movie;if(!c?.number)throw new Error(l?.message||"JavDB detail response is invalid");let h=Array.isArray(c.preview_images)?c.preview_images.map(p=>String(p.large_url||"").replace(/https:\/\/[^/]+\/rhe951l4q/,"https://c0.jdbstatic.com")).filter(Boolean):[],u=c.cover_url?String(c.cover_url).replace(/https:\/\/[^/]+\/rhe951l4q/,"https://c0.jdbstatic.com"):"";return Object.freeze({movieId:String(c.id||n),carNum:ee(c.number),title:String(c.title||c.origin_title||""),originalTitle:String(c.origin_title||c.title||""),coverUrl:u||null,actors:Array.isArray(c.actors)?c.actors.map(p=>Object.freeze({id:String(p.id),name:String(p.name||""),gender:Number(p.gender)})):[],duration:Number(c.duration)||null,score:Number(c.score)||0,releaseDate:c.release_date||null,watchedCount:Number(c.watched_count)||0,imageUrls:Object.freeze(h),providerId:"javdb"})},async listMagnets(r,i={}){let n=String(r.movieId||"").trim();if(!n)return[];let l=await a(`/api/v1/movies/${encodeURIComponent(n)}/magnets`,{},i,{},"movie.magnets");if(!Array.isArray(l?.data?.magnets))throw new Error(l?.message||"JavDB magnet response is invalid");return l.data.magnets.map(c=>Object.freeze({hash:String(c.hash||""),title:String(c.name||""),hasHdTag:!!c.hd,hasSubtitleTag:!!c.cnsub,createdAt:c.created_at||null,seeders:Number(c.seeders)||0,sizeMb:Number(c.size)||0,fileCount:Number(c.files_count)||0,providerId:"javdb"}))},async listRankings(r={}){let i=await a("/api/v1/rankings/playback",{period:r.period||"daily",filter_by:r.filter||"high_score"},r,{},"movie.ranking");if(!Array.isArray(i?.data?.movies))throw new Error(i?.message||"JavDB ranking response is invalid");return i.data.movies.map(n=>Object.freeze({movieId:String(n.id),carNum:ee(n.number),title:String(n.origin_title||""),coverUrl:String(n.cover_url||"").replace(/https:\/\/[^/]+\/rhe951l4q/,"https://c0.jdbstatic.com"),releaseDate:n.release_date||null,hasSubtitle:!!n.has_cnsub,magnetCount:Number(n.magnets_count)||0,newMagnets:!!n.new_magnets,providerId:"javdb"}))},async listReviews(r,i={}){let n=String(r.movieId||"").trim();if(!n)return[];let l=await a(`/api/v1/movies/${encodeURIComponent(n)}/reviews`,{page:i.page??1,sort_by:"hotly",limit:i.limit??20},i,{},"movie.reviews");if(!Array.isArray(l?.data?.reviews))throw new Error(l?.message||"JavDB review response is invalid");return l.data.reviews.map(c=>Object.freeze({author:String(c.username||"匿名用户"),content:String(c.content||""),score:Number(c.score)||0,createdAt:c.created_at||null,likes:Number(c.likes_count)||0}))},async listRelated(r,i={}){let n=String(r.movieId||"").trim();if(!n)return[];let l=await a("/api/v1/lists/related",{movie_id:n,page:i.page??1,limit:i.limit??20},i,{},"movie.related");if(!Array.isArray(l?.data?.lists))throw new Error(l?.message||"JavDB related response is invalid");return l.data.lists.map(c=>Object.freeze({id:String(c.id),name:String(c.name||"未命名清单"),movieCount:Number(c.movies_count)||0,collectionCount:Number(c.collections_count)||0,viewCount:Number(c.views_count)||0,createdAt:c.created_at||null}))}})}d(Pu,"createJavDbAdapter");var gd=W({id:"javdb",trustClass:"builtin-public",hosts:["javdb.com","jdforrepam.com","c0.jdbstatic.com"],capabilities:["movie.search","movie.detail","movie.magnets","movie.ranking","movie.state","movie.reviews","movie.related","actor.lookup","actor.movies","actor.collection","actor.uncollect","actor.avatar-placeholder","account.login"],requires:[y.http,Y.javdbHost],createClient:d(o=>Object.freeze({http:o[y.http],hostAdapter:o[Y.javdbHost]}),"createClient"),createAdapter:d(o=>Pu(o.http,Ao,o.hostAdapter),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.search":"public-7d","movie.detail":ke.externalDetail,"movie.magnets":"public-1d","movie.ranking":"public-1d","movie.state":"none","movie.reviews":"public-1d","movie.related":"public-1d","actor.lookup":"none","actor.movies":"public-5m","actor.collection":"none","actor.uncollect":"none","actor.avatar-placeholder":"none","account.login":"none"},quality:"silver"});function md(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelector=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelector=="function")return e;throw new TypeError("JavBus document is invalid")}d(md,"resolveDocument");function Ru(o,e){if(typeof o?.find=="function")return ee(o.find("span.header:contains('識別碼:')").parent().text().replace("識別碼:",""))??ee(new URL(e).pathname.split("/").filter(Boolean).pop());let s=[...md(o).querySelectorAll("span.header")].find(a=>a.textContent?.includes("識別碼"));return ee(s?.parentElement?.textContent?.replace("識別碼:",""))??ee(new URL(e).pathname.split("/").filter(Boolean).pop())}d(Ru,"readMovieRef");function Iu(o,e){let t=Ru(o,e);if(!t)throw new TypeError("JavBus movie identifier is missing");return Ir({carNum:t,url:new URL(e).href})}d(Iu,"parseJavBusMovieRef");function fd(o,e){let t=Iu(o,e),s=typeof o?.find=="function"?null:md(o),a=s?s.querySelector("h3")?.textContent?.trim()||t.carNum:o.find("h3").first().text().trim()||t.carNum,r=s?s.querySelector(".bigImage img[src], a.bigImage img[src]")?.getAttribute("src"):o.find(".bigImage img[src], a.bigImage img[src]").first().attr("src");return qt({...t,title:a,coverUrl:r?new URL(r,e).href:null,providerId:"javbus"})}d(fd,"parseJavBusMovieDetail");function Eu(o){return Object.freeze({contracts:["MovieDetail","Screenshot"],async getDetail(e,t={}){let s=ee(e.carNum);if(!s)throw new TypeError("JavBus movie reference is invalid");let a=new URL(e.url||`https://www.javbus.com/${encodeURIComponent(s)}`).href,r=await o.request({providerId:"javbus",capability:"movie.detail",method:"GET",url:a,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["javbus.com"]}},t.scope);return fd(r.data,r.finalUrl||a)},async getImages(e,t={}){let s=await this.getDetail(e,t);return s.coverUrl?[Object.freeze({url:s.coverUrl,providerId:"javbus"})]:[]}})}d(Eu,"createJavBusAdapter");var vd=W({id:"javbus",trustClass:"builtin-public",hosts:["javbus.com"],capabilities:["movie.detail","movie.images"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Eu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.detail":ke.externalDetail,"movie.images":ke.externalDetail},quality:"silver"});function Du(o){let e=d((t,s)=>o.request({providerId:"javstore",capability:"movie.images",method:"GET",url:t,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["javstore.net"]}},s),"request");return Object.freeze({contracts:["Screenshot"],getSearchUrl(t){return`https://javstore.net/search?q=${encodeURIComponent(t.carNum||"")}`},async getImages(t,s={}){let a=this.getSearchUrl(t),r=await e(a,s.scope),i=Ac(r.data,t.carNum,r.finalUrl||a);if(!i.length)return[];for(let n of i)try{let l=await e(n,s.scope),c=Pc(l.data,l.finalUrl||n);if(c)return[Object.freeze({url:c,providerId:"javstore"})]}catch(l){if(!(l&&typeof l=="object"&&"code"in l&&l.code==="NOT_FOUND"))throw l}return[]}})}d(Du,"createJavStoreAdapter");var bd=W({id:"javstore",trustClass:"builtin-public",hosts:["javstore.net"],capabilities:["movie.images"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Du(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.images":"screenshot-7d"},quality:"silver"});var wd=W({id:"javtrailers",trustClass:"builtin-public",hosts:["javtrailers.com"],capabilities:["movie.preview"],requires:[Y.http,y.urlPolicy],createClient:d(()=>Object.freeze({id:"javtrailers"}),"createClient"),createAdapter:d(()=>Object.freeze({contracts:["MoviePreview"]}),"createAdapter"),createHostAdapter:null,cachePolicy:"none",quality:"bronze"});var Nu="https://115.com",Lu=Object.freeze({trustClass:"builtin-public",hosts:["115.com"]});function Mu(o){if(typeof o!="string")return o;try{return JSON.parse(o)}catch{return{state:!1,error_msg:/login|登录|sign in|未授权|授权|expire|expired|token|cookie/i.test(o)?"115 未登录":"115 返回异常响应"}}}d(Mu,"parsePayload");function Bu(o){let e=String(o).toLowerCase();return/未登录|请登录|登录|login|sign|授权|过期|token|cookie|uid|身份|auth|expire|needlogin|need login/i.test(e)?"AUTH_REQUIRED":/已存在|重复|exists|duplicate|already|same|conflict|exist/i.test(e)?"TASK_EXISTS":"OPERATION_FAILED"}d(Bu,"classify115OfflineError");function Ou(o){let e=o;if(!e||!Array.isArray(e.data))throw new D("INVALID_RESPONSE","115 文件搜索响应无效",{source:"one115"});return Object.freeze(e.data.map(t=>{let s=String(t.n||t.file_name||"");return Object.freeze({folderId:String(t.pid||t.cid||""),fileId:t.fid?String(t.fid):null,videoId:String(t.pc||t.pick_code||""),name:s,size:Number(t.s||t.size)||0,createTime:String(t.t||t.create_time||""),isVideo:/\.(mp4|mkv|avi|mov|flv|wmv|ts|m2ts)$/i.test(s)})}).filter(t=>t.isVideo))}d(Ou,"normalize115SearchResults");function Uu(o){let e=d((t,s={})=>o.request({providerId:"one115",capability:s.capability||"account.status",method:s.method||"GET",url:t,body:s.body,headers:s.headers,responseType:s.responseType||"json",urlPolicy:Lu},s.scope),"request");return Object.freeze({contracts:["AccountStatus","CloudFile","OfflineSubmission"],homeUrl:Nu,async checkAccount(t={}){let a=(await e("https://webapi.115.com/offine/downpath",{capability:"account.status",scope:t.scope})).data;return Object.freeze({authenticated:!!(a?.state&&a?.data?.length)})},async searchFiles(t,s={}){let a=new URL("https://webapi.115.com/files/search");a.searchParams.set("search_value",t),a.searchParams.set("offset",String(s.offset??0)),a.searchParams.set("limit",String(s.limit??50));let r=await e(a.href,{capability:"file.search",scope:s.scope,force:s.force});return Ou(r.data)},async submit(t,s={}){if(!/^magnet:/i.test(t)&&!/^ed2k:/i.test(t))throw new D("UNSUPPORTED","Unsupported offline URL",{source:"one115"});let r=(await e(`https://115.com/?ct=offline&ac=space&_=${Date.now()}`,{capability:"offline.submit",scope:s.scope})).data;if(!r?.sign)throw new D("AUTH_REQUIRED","115 未登录或离线空间信息获取失败",{source:"one115"});let i=new URLSearchParams({url:t,wp_path_id:s.folderId||"",uid:String(r.uid||""),sign:r.sign,time:String(r.time||"")}).toString(),n=await e("https://115.com/web/lixian/?ct=lixian&ac=add_task_url",{capability:"offline.submit",scope:s.scope,method:"POST",body:i,responseType:"text",headers:{"Content-Type":"application/x-www-form-urlencoded"}}),l=Mu(n.data);if(!l||l.state===!1||l.state===0){let c=String(l?.error_msg||l?.error||l?.msg||"115 离线任务创建失败"),h=Bu(c);throw new D(h,c,{source:"one115",details:{state:l?.state??null}})}if(l.state!==!0&&l.state!==1)throw new D("INVALID_RESPONSE","115 未返回明确的离线任务创建成功状态",{source:"one115"});return Object.freeze({success:!0,taskId:String(l.task_id||l.info_hash||"")})},async renameFile(t,s,a={}){let r=new URLSearchParams({fid:t,file_name:s}).toString(),n=(await e("https://webapi.115.com/files/edit",{capability:"file.rename",scope:a.scope,method:"POST",body:r,responseType:"json",headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;if(!n||n.state===!1||n.state===0)throw new D("OPERATION_FAILED",String(n?.error||n?.error_msg||"115 重命名失败"),{source:"one115"});return Object.freeze({success:!0})},getPlayUrl(t){return t?.videoId?`https://115.com/?ct=play&pickcode=${encodeURIComponent(t.videoId)}`:null}})}d(Uu,"createOne115Adapter");var yd=W({id:"one115",trustClass:"builtin-public",hosts:["115.com"],capabilities:["account.status","file.search","file.rename","offline.submit"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Uu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"account.status":"none","file.search":"none","file.rename":"none","offline.submit":"none"},quality:"silver"});var zu=Object.freeze({trustClass:"builtin-public",hosts:["123pan.com"]});function jd(o){let e=new Uint32Array(256);for(let s=0;s<256;s+=1){let a=s;for(let r=0;r<8;r+=1)a=a&1?3988292384^a>>>1:a>>>1;e[s]=a}let t=4294967295;for(let s=0;s>>8;return(t^4294967295)>>>0}d(jd,"crc32");function Fu(){let o=new Uint32Array(1);return crypto.getRandomValues(o),o[0]%1e7}d(Fu,"secureNonce");function Vu(o,e={}){let t=["a","d","e","f","g","h","l","m","y","i","j","n","o","p","k","q","r","s","t","u","b","c","v","w","s","z"],s=e.nonce??Fu(),a=e.now??new Date,r=new Date(a.getTime()+6e4*a.getTimezoneOffset()+288e5),n=[...`${r.getFullYear()}${String(r.getMonth()+1).padStart(2,"0")}${String(r.getDate()).padStart(2,"0")}${String(r.getHours()).padStart(2,"0")}${String(r.getMinutes()).padStart(2,"0")}`].map(p=>t[Number(p)]).join(""),l=jd(n),c=Math.floor(r.getTime()/1e3),h=new URL(o),u=jd(`${c}|${s}|${h.pathname}|web|3|${l}`);return h.searchParams.set(String(l),`${c}-${s}-${u}`),h.href}d(Vu,"signPan123Url");function Sd(o){if(typeof o!="string")return o;try{return JSON.parse(o)}catch(e){throw new D("PARSE_ERROR","123 云盘响应不是有效 JSON",{source:"pan123",cause:e})}}d(Sd,"parsePayload");function xd(o,e){if(!o||typeof o!="object")throw new D("INVALID_RESPONSE",`123 云盘${e}响应无效`,{source:"pan123"});if(o.code===0)return o;let t=String(o.message||o.msg||`${e}失败`);throw/token is expired|unauthorized|登录|授权/i.test(t)?new D("AUTH_REQUIRED",t,{source:"pan123"}):new D("INVALID_RESPONSE",t,{source:"pan123"})}d(xd,"assertSuccess");function qu(o,e={}){let t=d(async(s,a,r,i,n)=>{let l=Vu(`https://yun.123pan.com${s}`,{now:e.now?.(),nonce:e.nonce?.()});return o.request({providerId:"pan123",capability:n,method:"POST",url:l,body:JSON.stringify(a),responseType:"json",timeout:e.getTimeout?.()??5e3,headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`,"App-Version":"3",platform:"web",Origin:"https://yun.123pan.com",Referer:"https://yun.123pan.com/"},urlPolicy:zu},i)},"request");return Object.freeze({contracts:["OfflineResolvedResource","OfflineSubmission"],homeUrl:"https://yun.123pan.com",async resolve(s,a={}){let{token:r,scope:i}=a;if(!r)throw new D("AUTH_REQUIRED","尚未同步 123 授权",{source:"pan123"});let n=await t("/b/api/v2/offline_download/task/resolve",{urls:s},r,i,"offline.resolve"),l=xd(Sd(n.data),"解析"),c=l.data?.list?.[0];if(!c?.id||!Array.isArray(c.files))throw new D("INVALID_RESPONSE","123 云盘解析结果缺少资源文件",{source:"pan123"});return Object.freeze({id:c.id,files:Object.freeze(c.files.map(h=>Object.freeze({id:h.id,size:Number(h.size||0)})))})},async submitResolved(s,a={}){let{token:r,scope:i}=a;if(!r)throw new D("AUTH_REQUIRED","尚未同步 123 授权",{source:"pan123"});if(!s?.id||!Array.isArray(s.files)||s.files.length===0)throw new D("INVALID_RESPONSE","没有可建立离线的文件",{source:"pan123"});let n=s.files.map(h=>h.id),l=s.files.reduce((h,u)=>h+Number(u.size||0),0),c=await t("/b/api/v2/offline_download/task/submit",{resource_list:[{resource_id:s.id,select_file_id:n}]},r,i,"offline.submit");return xd(Sd(c.data),"提交"),Object.freeze({fileCount:n.length,totalSize:l})},async submit(s,a={}){let r=await this.resolve(s,a);return this.submitResolved(r,a)}})}d(qu,"createPan123Adapter");var kd=W({id:"pan123",trustClass:"builtin-public",hosts:["123pan.com"],capabilities:["offline.resolve","offline.submit"],requires:[y.http,y.settings],createClient:d(o=>Object.freeze({http:o[y.http],settings:o[y.settings]}),"createClient"),createAdapter:d(o=>qu(o.http,{getTimeout:d(()=>Number(o.settings.snapshot().httpTimeout??5e3),"getTimeout")}),"createAdapter"),createHostAdapter:null,cachePolicy:{"offline.resolve":"none","offline.submit":"none"},quality:"silver"});function Hu(){return Object.freeze({contracts:["Subtitle"],detailUrl(o){let e=String(o?.carNum||"").trim();if(!e)return null;let t=new URL("/index.php","https://subtitlecat.com");return t.searchParams.set("search",e),t.href}})}d(Hu,"createSubtitleCatAdapter");var Cd=W({id:"subtitlecat",trustClass:"builtin-public",hosts:["subtitlecat.com"],capabilities:["subtitle.search"],requires:[],createClient:d(()=>Object.freeze({id:"subtitlecat"}),"createClient"),createAdapter:d(()=>Hu(),"createAdapter"),createHostAdapter:null,cachePolicy:"none",quality:"bronze"});var _d=Object.freeze([Object.freeze({id:"u9a9",name:"U9A9",type:"网页来源",domain:"u9a9.com",baseUrl:"https://u9a9.com",priority:20,enabled:!0,searchPath:d(o=>`/?type=2&search=${encodeURIComponent(o)}`,"searchPath")}),Object.freeze({id:"u3c3",name:"U3C3",type:"网页来源",domain:"u3c3.com",baseUrl:"https://u3c3.com",priority:30,enabled:!0,searchPath:d(o=>`/?search2=a8lr16lo&search=${encodeURIComponent(o)}`,"searchPath")}),Object.freeze({id:"sukebei",name:"Sukebei",type:"网页来源",domain:"sukebei.nyaa.si",baseUrl:"https://sukebei.nyaa.si",priority:40,enabled:!0,searchPath:d(o=>`/?f=0&c=0_0&q=${encodeURIComponent(o)}`,"searchPath")}),Object.freeze({id:"btsow",name:"BTSOW",type:"API 来源",domain:"btsow.lol",baseUrl:"https://btsow.lol",priority:50,enabled:!0,searchPath:d(o=>`/search/${encodeURIComponent(o)}`,"searchPath")})]);function $d(o,e){let t=o,s=String(t?.magnet||"");return s.startsWith("magnet:")?Object.freeze({title:String(t.title||""),magnet:s,size:String(t.size||""),date:String(t.date||""),seeders:Number(t.seeders)||0,leechers:Number(t.leechers)||0,source:e,files:Object.freeze([])}):null}d($d,"normalizeMagnet");function Wu(o,e,t){if(typeof o!="string")throw new D("INVALID_RESPONSE","磁力来源响应不是 HTML",{source:t});let s=new DOMParser().parseFromString(o,"text/html"),a=`${s.title} ${s.body?.textContent||""}`;if(/Just a moment|cf-chl-|Cloudflare/i.test(a))throw new D("CF_BLOCKED","磁力来源被 Cloudflare 拦截",{source:t});return Object.freeze([...s.querySelectorAll(".torrent-list tbody tr")].flatMap(r=>{if(r.textContent?.includes("置顶"))return[];let i=r.querySelector("td:nth-child(2) a"),n=i?.getAttribute("title")||i?.textContent?.trim()||"";if(!n.toLowerCase().includes(e.toLowerCase()))return[];let l=$d({title:n,magnet:r.querySelector('td:nth-child(3) a[href^="magnet:"]')?.getAttribute("href"),size:r.querySelector("td:nth-child(4)")?.textContent?.trim(),date:r.querySelector("td:nth-child(5)")?.textContent?.trim(),seeders:r.querySelector("td:nth-child(6)")?.textContent?.trim(),leechers:r.querySelector("td:nth-child(7)")?.textContent?.trim()},t);return l?[l]:[]}))}d(Wu,"parseTorrentSource");function Ju(o){let e=o;if(typeof e=="string")try{e=JSON.parse(e)}catch(s){throw new D("INVALID_RESPONSE","BTSOW 返回了无效 JSON",{source:"btsow",cause:s})}let t=e?.data;if(!Array.isArray(t))throw new D("INVALID_RESPONSE","BTSOW 响应缺少结果数组",{source:"btsow"});return Object.freeze(t.flatMap(s=>{let a=Number(s.lastUpdateTime),r=Number.isFinite(a)?new Date(1e3*a).toISOString().slice(0,10):"",i=$d({title:s.name,magnet:`magnet:?xt=urn:btih:${s.hash}`,size:`${(Number(s.size)/1073741824).toFixed(2)} GB`,date:r},"btsow");return i?[i]:[]}))}d(Ju,"parseBtsowSource");function Ku(o){let e=d(t=>_d.find(s=>s.id===t),"find");return Object.freeze({contracts:["Magnet","MagnetSource"],getSources:d(()=>Object.freeze(_d.map(t=>Object.freeze({id:t.id,name:t.name,type:t.type,domain:t.domain,baseUrl:t.baseUrl,priority:t.priority,enabled:t.enabled}))),"getSources"),targetUrl(t,s,a={}){let r=e(t);if(!r)throw new D("UNSUPPORTED",`未知磁力来源:${t}`,{source:"torrent-sources"});return`${new URL(a.baseUrl||r.baseUrl).origin}${r.searchPath(s)}`},async search(t,s,a={}){let r=e(t);if(!r)throw new D("UNSUPPORTED",`未知磁力来源:${t}`,{source:"torrent-sources"});let i=new URL(a.baseUrl||r.baseUrl).origin,l=new URL(i).hostname!==r.domain?{trustClass:"custom-public",expectedOrigin:i}:{trustClass:"builtin-public",hosts:[r.domain],expectedOrigin:i};if(r.id==="btsow"){let u=await o.request({capability:"magnet.search",providerId:"magnet:btsow",method:"POST",url:`${i}/search`,body:JSON.stringify([{search:s},50,1]),headers:{"Content-Type":"application/json"},responseType:"json",urlPolicy:l},a.scope);return Ju(u.data)}let c=`${i}${r.searchPath(s)}`,h=await o.request({capability:"magnet.search",providerId:`magnet:${r.id}`,method:"GET",url:c,responseType:"text",urlPolicy:l},a.scope);return Wu(h.data,s,r.id)}})}d(Ku,"createTorrentSourcesAdapter");var Td=W({id:"torrent-sources",trustClass:"builtin-public",hosts:["u9a9.com","u3c3.com","sukebei.nyaa.si","btsow.lol"],capabilities:["magnet.search"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Ku(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"magnet.search":"source-configured"},quality:"silver"});function St(o){return o.replace(/\s+/g," ").trim()}d(St,"compact");function Ad(o,e){let t=new DOMParser().parseFromString(o,"text/html"),s=St(t.querySelector('a[title="誕生日"]')?.closest("tr")?.querySelector("td")?.textContent??""),a=[...t.querySelectorAll("th")].find(g=>g.textContent?.includes("現年齢"))?.parentElement?.querySelector("td"),r=t.querySelector('a[title="身長"]')?.closest("tr")?.querySelector("td"),i=t.querySelector('a[title="体重"]')?.closest("tr")?.querySelector("td"),n=t.querySelector('a[title="スリーサイズ"]')?.closest("tr")?.querySelector("td"),l=[...t.querySelectorAll("th")].find(g=>g.textContent?.includes("ブラサイズ"))?.nextElementSibling;if(!s&&!r&&!n)throw new TypeError("Wikipedia actress information is missing");let c=Number.parseInt(St(a?.textContent??""),10),h=St(r?.textContent??"").split(" ")[0],u=St(i?.textContent??"").split("/"),p=St(u.at(-1)??"").replace(/^―\s*kg$/,"");return Object.freeze({birthday:s,age:Number.isFinite(c)?`${c}岁`:"",height:h&&!h.endsWith("cm")?`${h}cm`:h,weight:p,threeSizeText:St(n?.textContent??"").replace("cm","").trim(),braSize:St(l?.textContent??""),url:new URL(e).href})}d(Ad,"parseWikipediaActressInfo");function Gu(o){return Object.freeze({contracts:["ActressInfo"],profileUrl(e){return new URL(`/wiki/${encodeURIComponent(String(e))}`,"https://ja.wikipedia.org").href},async lookup(e,t={}){let s=this.profileUrl(e),a=await o.request({providerId:"wikipedia",capability:"person.actress-info",method:"GET",url:s,responseType:"text",timeout:15e3,urlPolicy:{trustClass:"builtin-public",hosts:["ja.wikipedia.org"]}},t.scope);try{return Ad(a.data,a.finalUrl||s)}catch(r){if(r instanceof TypeError&&/actress information is missing/.test(r.message))return null;throw r}}})}d(Gu,"createWikipediaAdapter");var Pd=W({id:"wikipedia",trustClass:"builtin-public",hosts:["ja.wikipedia.org"],capabilities:["person.actress-info"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Gu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"person.actress-info":ke.externalDetail},quality:"silver"});function Rd(o){if(!o||typeof o!="object"||!Array.isArray(o.data))throw new D("INVALID_RESPONSE","迅雷字幕响应结构无效",{source:"xunlei"});return Object.freeze(o.data.flatMap(e=>{try{let t=new URL(String(e?.url??""));if(t.protocol!=="https:")return[];let s=String(e?.ext??"").toLowerCase().replace(/^\./,"");return s?[Object.freeze({name:String(e?.name??""),extension:s,url:t.href,providerId:"xunlei"})]:[]}catch{return[]}}))}d(Rd,"parseXunleiSubtitles");var Id=["xunlei.com"];function Qu(o){return Object.freeze({contracts:["Subtitle"],async search(e,t={}){let s=String(e.carNum??"").trim();if(!s)return[];let a=new URL("https://api-shoulei-ssl.xunlei.com/oracle/subtitle");a.searchParams.set("gcid",""),a.searchParams.set("cid",""),a.searchParams.set("name",s);let r=await o.request({providerId:"xunlei",capability:"subtitle.search",method:"GET",url:a.href,responseType:"json",urlPolicy:{trustClass:"builtin-public",hosts:Id}},t.scope);return Rd(r.data)},async download(e,t={}){let s=new URL(String(e.url??"")),a=await o.request({providerId:"xunlei",capability:"subtitle.download",method:"GET",url:s.href,responseType:"text",urlPolicy:{trustClass:"custom-public"}},t.scope);if(typeof a.data!="string")throw new TypeError("迅雷字幕正文不是文本");return a.data}})}d(Qu,"createXunleiAdapter");var Ed=W({id:"xunlei",trustClass:"builtin-public",hosts:Id,capabilities:["subtitle.search","subtitle.download"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Qu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"subtitle.search":"public-1d","subtitle.download":"public-1d"},quality:"silver"});var Dd=Object.freeze([Jc,Yc,ed,rd,nd,cd,ld,dd,hd,gd,vd,bd,wd,yd,kd,Cd,Td,Pd,Ed]);function Yu(o,e){let t=o.close;o.close=function(a){let r=t.call(this,a);return e?.releaseEscClose?.(a),setTimeout(()=>{let i=document.querySelectorAll(".layui-layer-shade").length;document.documentElement.style.overflow=i>0?"hidden":""},10),r};let s=o.open;o.open=function(a={}){a=kt(a,e);let r=a.success;return s.call(this,{...a,success(i,n){typeof r=="function"&&r.call(this,i,n),e.setupEscClose(n)}})}}d(Yu,"patchLayerRuntime");function Zu(o){for(let e of["https://cdn.jsdelivr.net/npm/layui-layer@1.0.9/layer.min.css","https://cdn.jsdelivr.net/npm/toastify-js@1.12.0/src/toastify.min.css","https://cdn.jsdelivr.net/npm/viewerjs@1.11.1/dist/viewer.min.css","https://cdn.jsdelivr.net/npm/tabulator-tables@6.3.1/dist/css/tabulator_semanticui.min.css"])o.importResource(e)}d(Zu,"importVendorStyles");async function Xu(o){let e=await o.getSetting("disabledPlugins","[]"),t=Ge(e),s=$t(t);return{migrated:s,needsMigration:JSON.stringify(t)!==JSON.stringify(s)}}d(Xu,"readDisabledPluginSettings");async function ep(o,e,t,s,a,r,i=null){await o.update(n=>{let l=Ge(typeof n.disabledPlugins=="string"?n.disabledPlugins:"[]"),c=$t(l);if(JSON.stringify(l)!==JSON.stringify(c)&&(n.disabledPlugins=JSON.stringify(c)),t.needsOrigin){let h=new Set(Array.isArray(n.trustedLocalOrigins)?n.trustedLocalOrigins:[]);for(let u of t.origins)h.add(u);n.trustedLocalOrigins=[...h]}t.needsNotice&&(n.localOriginTrustNoticeV1=!0),Object.prototype.hasOwnProperty.call(n,"enableLoadScreenShot")||(n.enableLoadScreenShot="yes"),Object.prototype.hasOwnProperty.call(n,"enableScreenSvg")||(n.enableScreenSvg=n.enableLoadScreenShot??"yes"),n.sortMethod==null&&["default","rateCount","date"].includes(s||"")&&(n.sortMethod=s),n.foldCategoryCollapsed==null&&["yes","no"].includes(a||"")&&(n.foldCategoryCollapsed=a==="yes"),n.videoMuted==null&&["yes","no"].includes(r||"")&&(n.videoMuted=r==="yes");for(let h of i?.cleanup?.settingKeys||[])n[h]===i.cleanup.settingValues?.[h]&&delete n[h]})}d(ep,"persistBootstrapMigration");async function tp(o){let e=await o.getSetting(),t=new Set(Array.isArray(e.trustedLocalOrigins)?e.trustedLocalOrigins:[]),s=null;try{e.webDavUrl&&(s=new URL(e.webDavUrl).origin)}catch{}return s&&!t.has(s)?(t.add(s),{origins:[...t],notice:`已按现有 WebDAV 配置授权本地来源:${s}`,needsOrigin:!0}):s&&!e.localOriginTrustNoticeV1?{origins:[...t],notice:`WebDAV 仅信任精确来源:${s}`,needsNotice:!0}:{origins:[...t],notice:null}}d(tp,"resolveLocalOrigins");async function Nd(){try{if(Ct(window.location).isJavDB){let R=Io(window.location);if(R)return void window.location.replace(R)}let o=performance.now(),e=globalThis.__jhsBrowserDiagnostics,t=d(R=>e&&((e.bootstrapPhases||(e.bootstrapPhases={}))[R]=performance.now()-o),"markPhase"),s=Eo(window.location),a=cl(),r=ol(),{utils:i,gmHttp:n,storageManager:l,stateService:c}=nl(r);t("legacy-runtime"),Object.assign(globalThis,{utils:i,gmHttp:n,storageManager:l,stateService:c,jhsEventBus:r}),["blacklist-rules-changed","filter-rules-changed","legacy-refresh"].forEach((R=>r.on(R,(()=>l._invalidateCache())))),r.on("car-state-changed",()=>l._invalidateCache(l.car_list_key)),Yu(a.layer,i),await Promise.resolve(),Zu(i),t("pre-settings");let h=await Xu(l),u=h.migrated,p=await tp(l),g=new $s,m=new _s,f=M?g:B?m:null,v=f?.detectRoute()??"other",b=Vc({gmRequest:globalThis.GM_xmlhttpRequest,gmGetValue:globalThis.GM_getValue,gmSetValue:globalThis.GM_setValue,gmDeleteValue:globalThis.GM_deleteValue,legacyHttp:n,legacyStorage:l,eventBus:r,storageForage:l.forage,localStorage:globalThis.localStorage,layer:a.layer,stateService:c,hostAdapter:f,hostAdapters:{javdb:g,javbus:m},site:s.site,route:v,disabled:u,localOrigins:p.origins});t("context"),qo(b.services.styles,Ho()),Object.assign(globalThis,{settingsService:b.services.settings,credentialService:b.services.credential}),await b.services.settings.load(),t("settings-load");let w=await b.services.credential.migrateLegacy(b.services.settings,{deferCleanup:!0});b.services.profile.start();let S=localStorage.getItem("jhs_sortMethod"),j=localStorage.getItem("jhs_foldCategory"),k=localStorage.getItem("jhs_videoMuted");w.cleanup=await b.services.credential.validateLegacyCleanup(w.cleanup),await ep(b.services.settings,h,p,S,j,k,w),await b.services.credential.cleanupLegacyPageStorage(w.cleanup?.pageKeys,b.services.settings),t("settings-migration");let x=ll(b.rootScope,{clogMsgCount:b.services.settings.snapshot().clogMsgCount});t("logger"),Uo(b.rootScope),Fo(b.rootScope),t("theme-ui"),b.services.diagnostics.setBrowserMetadata({userAgent:navigator.userAgent,platform:navigator.platform,...globalThis.__jhsBrowserTestMetadata??{}}),Object.assign(globalThis,x),w.issues?.length&&x.show.info("部分旧凭证未能安全迁移,已保留原数据,请重新保存对应凭证"),p.notice&&x.show.info(p.notice);let _=new ys({diagnostics:b.services.diagnostics});for(let R of Dd)b.registries.integrations.register(R);for(let R of bl)b.registries.features.register(R);return Lc(_,b.registries.features,s.site),t("registry"),Mc({pluginManager:_,utils:i,gmHttp:n,storageManager:l,stateService:c,jhsEventBus:r,clog:x.clog,show:x.show,loading:x.loading},globalThis.unsafeWindow),window.isDetailPage=v==="detail",window.isListPage=v==="list",await b.registries.features.start(),t("feature-runtime"),await ws(l),await l.getReviewFilterKeywordList(),await c.recoverPendingTransaction(),t("data-prepare"),await Promise.all([_.processCss(),Promise.resolve(Ht(b.services.settings.snapshot().themeMode))]),t("plugin-css"),M&&/(^|;)\s*locale\s*=\s*en\s*($|;)/i.test(document.cookie)&&x.show.error("请切换到中文语言下才可正常使用本脚本",{duration:-1}),await _.processPlugins(),t("plugin-runtime"),t("first-ready"),t("total"),b}catch(o){throw o instanceof D?o:new D("BOOTSTRAP_FAILED",o instanceof Error?o.message:"JHS 启动失败",{source:"bootstrap",cause:o})}}d(Nd,"bootstrapJhs");function Ld(o){if(console.error("[JHS] bootstrap failed:",o),globalThis.show?.error)return globalThis.show.error(o?.message||"JHS 启动失败",{duration:-1});let e=document.createElement("div");e.id="jhs-bootstrap-error",e.setAttribute("role","alert"),e.textContent=`JHS 启动失败:${o?.message||"未知错误"}`,Object.assign(e.style,{position:"fixed",inset:"12px 12px auto",zIndex:"2147483647",padding:"12px",background:"#7f1d1d",color:"white"}),document.documentElement.append(e)}d(Ld,"mountBootstrapError");Nd().catch(Ld);})(); + `}async handle(){let e=this.getRuntimeService("settings"),t=await this.getRuntimeService("scope")();if(!this._settingsListenerBound){this._settingsListenerBound=!0;let s=d(a=>{a.detail?.names?.includes("translateTitle")&&this.reconfigure()},"onSettingsChanged");e.addEventListener("settings.changed",s),t.addCleanup((()=>{e.removeEventListener("settings.changed",s),this._settingsListenerBound=!1}))}this.reconfigure()}reconfigure(){(this.getRuntimeService("settings").snapshot().translateTitle??E)===E?this.applyTranslation():(this.getOptionalDependency("ListPagePlugin")?.invalidateTranslations?.(),this.revertTranslation())}async applyTranslation(){if(isDetailPage)return this.translate();if(!window.isListPage)return;let e=this.getOptionalDependency("ListPagePlugin");if(!e?.translateListItems||typeof e.getSelector!="function")return;let t=$(e.getSelector().itemSelector).toArray();await e.translateListItems(t)}revertTranslation(){$(".translated-title").remove(),this.getOptionalDependency("ListPagePlugin")?.revertTranslation?.()}async translate(e,t=!0,s={}){let a=this.getRuntimeService("settings");if((a.snapshot().translateTitle??E)!==E)return;B&&(t=!1);let r=await this.getRuntimeService("scope")(),i=e??this.getPageInfo().carNum;await ia({root:s.root,carNum:i,translation:this.getRuntimeService("translation"),scope:r,isActive:d(()=>(a.snapshot().translateTitle??E)===E,"isActive")})}};d(Hn,"TranslatePlugin");var sr=Hn;var F=d((o,e,t,s,a,r=[],i={})=>wl({id:o,featureId:e,legacyPluginId:t.legacyPluginId??t.name,plugin:t,sites:s,order:a,requires:r,routes:i.routes??(e==="detail"?["detail","owned-detail"]:[]),surfaces:i.surfaces??(e==="detail"?["detail-page"]:[])}),"manifest"),ar=Object.freeze([F("list.core","list",Ya,["javdb","javbus"],{javdb:1,javbus:1},[Y.host,y.translation,y.http,y.storage,y.state,y.settings]),F("list.auto-page","list",Da,["javdb","javbus"],{javdb:2,javbus:5},[y.http,y.settings]),F("detail.fc2-owned","detail",oa,["javdb"],{javdb:3},[y.movie,y.magnet,y.dialog,y.account,y.credential,y.translation,y.settings,y.storage,y.screenshot,y.review,y.related,y.state],{routes:["list","detail","owned-detail"],surfaces:["list-card","detail-page"]}),F("detail.fc2-navigation","detail",Fa,["javdb"],{javdb:4},[Y.host],{routes:["list"],surfaces:["list-card"]}),F("list.fold-category","list",Va,["javdb"],{javdb:5},[y.settings]),F("list.actions","list",Ga,["javdb","javbus"],{javdb:5,javbus:2},[y.settings]),F("library.history","library",Ka,["javdb","javbus"],{javdb:6,javbus:4},[y.dialog,y.movie,y.settings,y.state]),F("settings.core","settings",Js,["javdb","javbus"],{javdb:7,javbus:3},[Y.host,y.diagnostics,y.profile,y.webdav,y.dialog,y.storage,y.settings,y.cache,y.http,y.offline,y.magnet,y.movie,y.state,y.translation,Ze.settings]),F("identity.javdb-navigation","identity",Xa,["javdb"],{javdb:8},[y.movie]),F("discovery.hit-show","discovery",la,["javdb"],{javdb:9},[Y.host]),F("discovery.top250","discovery",fa,["javdb"],{javdb:10},[Y.host]),F("identity.image-search","identity",Ns,["javdb","javbus"],{javdb:11,javbus:6},[y.dialog,y.storage,y.imageSearch]),F("detail.cover-state-actions","detail",xa,["javdb","javbus"],{javdb:12,javbus:8},[y.storage,y.settings,y.movie,y.state],{routes:["list","detail","owned-detail"],surfaces:["list-card","detail-page"]}),F("detail.fc2-lookup","detail",sa,["javdb"],{javdb:13},[Y.host,y.movie],{routes:["list","detail","owned-detail"],surfaces:["list-card","detail-page"]}),F("detail.javdb-native","detail",Ua,["javdb"],{javdb:14}),F("detail.workspace","detail",za,["javdb","javbus"],{javdb:15,javbus:11},[Y.host]),F("detail.reviews","detail",ma,["javdb","javbus"],{javdb:16,javbus:13},[Y.host,y.review,y.movie,y.settings,y.storage]),F("detail.related","detail",ga,["javdb"],{javdb:17},[Y.host,y.related,y.settings]),F("detail.page-state-actions","detail",Ba,["javdb","javbus"],{javdb:18,javbus:12},[y.movie,y.dialog,y.subtitle,y.state,y.settings]),F("detail.shortcuts","detail",Oa,["javdb","javbus"],{javdb:18.5,javbus:12.5},[y.settings]),F("detail.native-magnets","detail",qa,["javdb","javbus"],{javdb:19,javbus:15},[Y.host,y.settings]),F("detail.javdb-preview","detail",ka,["javdb"],{javdb:20},[y.storage,y.settings,y.movie,y.dialog]),F("library.keyword-filter","library",Xs,["javdb","javbus"],{javdb:21,javbus:14}),F("identity.actress-info","identity",Ds,["javdb"],{javdb:22},[y.actressInfo,y.settings]),F("detail.external-sites","detail",pa,["javdb","javbus"],{javdb:23,javbus:19},[Y.host,y.movie,y.storage,y.settings]),F("external-bridge.translation","external-bridge",sr,["javdb","javbus"],{javdb:24,javbus:20},[y.translation,y.settings]),F("library.state-actions","library",er,["javdb"],{javdb:25},[y.http,y.state]),F("detail.external-magnets","detail",ua,["javdb","javbus"],{javdb:26,javbus:17},[y.storage,y.http,y.magnet]),F("detail.screenshot","detail",Ca,["javdb","javbus"],{javdb:27,javbus:18},[y.screenshot,y.settings]),F("library.blacklist","library",Zs,["javdb","javbus"],{javdb:28,javbus:21},[Y.host,y.dialog,y.storage,y.http,y.state]),F("library.favorite-actresses","library",ba,["javdb"],{javdb:29}),F("discovery.new-video","discovery",_a,["javdb"],{javdb:30},[y.dialog,y.storage,y.actressInfo,y.movie,y.state]),F("discovery.scheduler","discovery",Ta,["javdb","javbus"],{javdb:31,javbus:22},[y.storage,y.http,y.actressInfo,y.movie,y.state]),F("stats.dashboard","stats",Ea,["javdb","javbus"],{javdb:32,javbus:23},[y.diagnostics,y.dialog,y.movie,y.state]),F("responsive-shell.bottom-bar","responsive-shell",Za,["javdb","javbus"],{javdb:33,javbus:24},[Y.host,y.settings,y.profile]),F("external-bridge.115-match","external-bridge",Pa,["javdb","javbus"],{javdb:34,javbus:25},[Y.host,y.dialog,y.offline,y.settings]),F("external-bridge.offline","external-bridge",Aa,["javdb","javbus"],{javdb:35,javbus:26},[Y.host,y.dialog,y.offline,y.state,y.settings]),F("compatibility.enhancements","compatibility",Ma,["javdb","javbus"],{javdb:36,javbus:27},[y.state]),F("identity.javbus-navigation","identity",La,["javbus"],{javbus:7}),F("detail.javbus-images","detail",wa,["javbus"],{javbus:9}),F("detail.javbus-native","detail",Na,["javbus"],{javbus:10}),F("detail.javbus-preview","detail",Sa,["javbus"],{javbus:16},[y.settings,y.storage,y.movie]),F("external-bridge.123pan","external-bridge",Ra,["javdb","javbus","123pan"],{javdb:0,javbus:0,"123pan":1},[y.storage]),F("external-bridge.javtrailers","external-bridge",ca,["javtrailers"],{javtrailers:1}),F("external-bridge.subtitle","external-bridge",tr,["subtitlecat"],{subtitlecat:1})]),Fc=new Set,Vc=new Set;for(let o of ar){if(Fc.has(o.id))throw new Error(`Duplicate contribution id: ${o.id}`);if(Vc.has(o.legacyPluginId))throw new Error(`Duplicate legacy plugin contribution: ${o.legacyPluginId}`);Fc.add(o.id),Vc.add(o.legacyPluginId)}function qc(o,e,t){o.setDependencyDeclarations(_l),e.setContributionManifests?.(ar),o.setCatalogDescriptors(ar.filter(s=>s.sites.includes(t)).map(s=>({name:s.legacyPluginId,disableable:e.isFeatureDisableable(s.featureId)}))),ar.filter(s=>s.sites.includes(t)&&e.isContributionEnabled(s.featureId,s.id,s.legacyPluginId)).sort((s,a)=>Number(s.order[t])-Number(a.order[t])).forEach(s=>{let a=e.resolveDeclaredDependencies(s.requires),r={};r.scope=()=>e.getContributionScope(s.featureId,s.id,s.legacyPluginId);let i=new Map([[Y.host,"host"],[y.diagnostics,"diagnostics"],[y.review,"review"],[y.related,"related"],[y.movie,"movie"],[y.magnet,"magnet"],[y.settings,"settings"],[y.cache,"cache"],[y.http,"http"],[y.profile,"profile"],[y.actressInfo,"actressInfo"],[y.imageSearch,"imageSearch"],[y.screenshot,"screenshot"],[y.translation,"translation"],[y.subtitle,"subtitle"],[y.account,"account"],[y.webdav,"webdav"],[y.credential,"credential"],[y.storage,"storage"],[y.state,"state"],[y.offline,"offline"],[y.dialog,"dialog"],[Ze.settings,"settingsRegistry"]]);for(let n of s.requires){let l=i.get(n);if(!l)throw new Error(`Legacy contribution ${s.id} has no runtime name for ${String(n)}`);r[l]=a[n]}o.register(s.plugin,r,{disableable:e.isFeatureDisableable(s.featureId)})})}d(qc,"registerSitePlugins");function Hc(o,e){for(let t of["pluginManager","utils","gmHttp","storageManager","stateService","jhsEventBus","clog","show","loading"]){if(o[t]==null)throw new Error(`Compatibility facade is missing ${t}`);e[t]=o[t]}return Object.freeze(Object.fromEntries(Object.keys(o).map(t=>[t,e[t]])))}d(Hc,"attachCompatibilityFacade");function Je(o,e,t){if(!o||typeof o!="object")throw new TypeError(`${e} implementation is required`);for(let s of t)if(typeof o[s]!="function")throw new TypeError(`${e}.${s} is required`);return o}d(Je,"assertPort");var Ke=Object.freeze({navigation:["open","assign","replace"],http:["request"],storage:["get","set","remove","keys","getLocal","setLocal","removeLocal","getValue","setValue","removeValue"],dialog:["open","close","confirm","alert"],style:["register","remove"]});var Wn=class Wn{constructor(e={}){this.location=e.location??window.location,this.openWindow=e.open??window.open.bind(window),Je(this,"NavigationPort",Ke.navigation)}open(e,t={}){return t.newTab?this.openWindow(e,"_blank","noopener"):this.assign(e)}assign(e){this.location.assign(e)}replace(e){this.location.replace(e)}};d(Wn,"BrowserNavigationAdapter");var rr=Wn;var Jn=class Jn{constructor(e=document){this.document=e}register(e,t){if(this.document.getElementById(e))throw new Error(`Duplicate style: ${e}`);let s=this.document.createElement("style");return s.id=e,s.textContent=t,this.document.head.append(s),()=>s.remove()}remove(e){this.document.getElementById(e)?.remove()}};d(Jn,"BrowserStyleAdapter");var ir=Jn;var Kn=class Kn{constructor(e,t,s,a,r=()=>{}){this.forage=e,this.localStore=t,this.gmGetValue=s,this.gmSetValue=a,this.gmDeleteValue=r}get(e){return this.forage.getItem(e)}async set(e,t){await this.forage.setItem(e,t)}async remove(e){await this.forage.removeItem(e)}keys(){return this.forage.keys()}getLocal(e){return this.localStore.getItem(e)}setLocal(e,t){this.localStore.setItem(e,t)}removeLocal(e){this.localStore.removeItem(e)}getValue(e,t){return this.gmGetValue(e,t)}setValue(e,t){this.gmSetValue(e,t)}removeValue(e){this.gmDeleteValue(e)}};d(Kn,"IndexedDbStorageAdapter");var nr=Kn;var Gn=class Gn{constructor(e){this.layer=e}open(e){return this.layer.open(this.withDefaultLayer(e))}close(e){this.layer.close(e)}confirm(e,t,s){return this.layer.confirm(e,this.withDefaultLayer(t),s)}alert(e,t){return this.layer.alert(e,this.withDefaultLayer(t))}withDefaultLayer(e={}){let t={zIndex:J.layer,...e};return e.ui?_t(t,globalThis.utils):t}};d(Gn,"LayerDialogAdapter");var or=Gn;var Qn=class Qn{constructor(e,t=globalThis.fetch?.bind(globalThis)??null){if(typeof e!="function")throw new TypeError("GM_xmlhttpRequest is required");this.requestImplementation=e,this.fetchImplementation=t}request(e){return e.transport==="native-fetch"&&this.fetchImplementation?this.requestWithNativeFetch(e).catch((t=>{if(t instanceof D&&t.code==="ABORTED")throw t;return this.requestWithUserscript(e)})):this.requestWithUserscript(e)}async requestWithNativeFetch(e){let t=new AbortController,s=!1,a=Math.max(0,Number(e.nativeTimeout)||0),r=d(()=>t.abort(),"onAbort"),i=a>0?setTimeout((()=>{s=!0,t.abort()}),a):null;e.signal?.addEventListener("abort",r,{once:!0});try{e.signal?.aborted&&t.abort();let n=await this.fetchImplementation(e.url,{method:e.method??"GET",headers:e.headers,body:e.body,signal:t.signal}),l=await n.text(),c=e.responseType==="json"?JSON.parse(l):l;return{status:n.status,data:c,responseText:l,finalUrl:n.url||e.url,responseHeaders:[...n.headers.entries()].map((h=>h.join(": "))).join(`\r +`)}}catch(n){throw e.signal?.aborted?new D("ABORTED","网络请求已取消",{source:"UserscriptHttpAdapter",cause:n}):s?new D("TIMEOUT","原生网络请求超时",{source:"UserscriptHttpAdapter",cause:n,retryable:!0}):new D("NETWORK_ERROR","原生网络请求失败",{source:"UserscriptHttpAdapter",cause:n,retryable:!0})}finally{i!==null&&clearTimeout(i),e.signal?.removeEventListener("abort",r)}}requestWithUserscript(e){return new Promise((t,s)=>{let a=!1,r,i=d((l,c)=>{a||(a=!0,e.signal?.removeEventListener("abort",n),l(c))},"finish"),n=d(()=>{r?.abort?.(),i(s,new D("ABORTED","网络请求已取消",{source:"UserscriptHttpAdapter"}))},"onAbort");r=this.requestImplementation({...e.requestOptions,method:e.method??"GET",url:e.url,headers:e.headers,data:e.body,responseType:e.responseType,timeout:e.timeout,onload:d(l=>i(t,{status:l.status,data:l.response??l.responseText,responseText:l.responseText??"",finalUrl:l.finalUrl||e.url,responseHeaders:l.responseHeaders??""}),"onload"),onerror:d(l=>i(s,new D("NETWORK_ERROR","网络请求失败",{source:"UserscriptHttpAdapter",cause:l,retryable:!0})),"onerror"),ontimeout:d(()=>i(s,new D("TIMEOUT","网络请求超时",{source:"UserscriptHttpAdapter",retryable:!0})),"ontimeout"),onabort:d(()=>i(s,new D("ABORTED","网络请求已取消",{source:"UserscriptHttpAdapter"})),"onabort")}),e.signal?.aborted?n():e.signal?.addEventListener("abort",n,{once:!0})})}};d(Qn,"UserscriptHttpAdapter");var lr=Qn;async function Wc(o){let e=await globalThis.crypto.subtle.digest("SHA-256",new TextEncoder().encode(o));return Array.from(new Uint8Array(e),(t=>t.toString(16).padStart(2,"0"))).join("")}d(Wc,"digestKey");var Yn=class Yn{constructor(e={}){this.namespaceVersion=e.namespaceVersion??2,this.diagnostics=e.diagnostics??null,this.storage=e.storage??null,this.publicCache=new Map,this.sessionCaches=new Map,this.publicReads=new Map,this.publicGenerations=new Map,this.publicNamespaces=new Set(["default"]),this.publicWritesSincePrune=0,this.pruneScheduled=!1,this.pruneRunning=!1,this.prunePromise=null}get publicGeneration(){return this.publicGenerations.get("default")||0}generation(e){return this.publicGenerations.get(e)||0}get publicPrefix(){return this._publicPrefix("default")}_publicPrefix(e="default"){return`jhs_http_public_cache:v${this.namespaceVersion}:${encodeURIComponent(e)}:`}storeFor(e,t=""){if(e==="public")return this.publicCache;if(e==="session"){if(!t)throw new TypeError("sessionScopeId is required for session cache");let s=this.sessionCaches.get(t);return s||this.sessionCaches.set(t,s=new Map),s}return null}async get(e,t,s){arguments.length===2&&(s=t,t=e,e="default"),e=String(e||"default"),this.publicNamespaces.add(e);let a=this.storeFor(s.scope,s.sessionScopeId),r=`${e}:${this.namespaceVersion}:${t}`,i=Date.now(),n=this.storage,l=a?.get(r);if(l&&l.expiresAt>i)return this.diagnostics?.recordCache(!0),{hit:!0,value:l.value,negative:l.negative};if(l&&a?.delete(r),s.scope!=="public"||!n)return this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1};let c=`${e}:${t}`,h=this.publicReads.get(c);if(h)return h;let u=this.generation(e),p=(async()=>{let g=this._publicPrefix(e)+await Wc(t),m;try{m=await n.get(g)}catch{return this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1}}if(m?.version!==this.namespaceVersion||!Number.isFinite(m?.expiresAt)||m.expiresAt<=i)return m&&await n.remove(g).catch(()=>{}),this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1};if(u!==this.generation(e))return this.diagnostics?.recordCache(!1),{hit:!1,value:void 0,negative:!1};let f={value:m.value,expiresAt:m.expiresAt,negative:m.negative===!0};return this.publicCache.set(r,f),this.diagnostics?.recordCache(!0),{hit:!0,value:f.value,negative:f.negative}})().finally(()=>{this.publicReads.get(c)===p&&this.publicReads.delete(c)});return this.publicReads.set(c,p),p}async set(e,t,s,a){arguments.length===3&&(a=s,s=t,t=e,e="default"),e=String(e||"default"),this.publicNamespaces.add(e);let r=Math.min(2592e6,Math.max(0,Number(a.ttlMs)||0));if(!r||a.scope==="public"&&a.generation!=null&&a.generation!==this.generation(e))return;let i={value:s,expiresAt:Date.now()+r,negative:a.negative??!1},n=this.storeFor(a.scope,a.sessionScopeId),l=`${e}:${this.namespaceVersion}:${t}`,c=this.storage;if(a.scope!=="public"||!c){n?.set(l,i);return}if(a.generation!=null&&a.generation!==this.generation(e))return;let h=this._publicPrefix(e)+await Wc(t);if(!(a.generation!=null&&a.generation!==this.generation(e)))try{if(a.generation!=null&&a.generation!==this.generation(e))return;if(await c.set(h,{version:this.namespaceVersion,...i,lastUsed:Date.now()}),a.generation!=null&&a.generation!==this.generation(e)){await c.remove(h).catch(()=>{});return}n?.set(l,i),this.publicWritesSincePrune++,this.schedulePublicPrune()}catch{}}schedulePublicPrune(){if(!this.storage||this.publicWritesSincePrune<64||this.pruneScheduled||this.pruneRunning)return this.prunePromise;this.pruneScheduled=!0;let e=d(async()=>{this.pruneScheduled=!1,this.pruneRunning=!0,this.publicWritesSincePrune=0;try{await this.prunePublic()}catch{}finally{this.pruneRunning=!1,this.prunePromise=null,this.schedulePublicPrune()}},"run");return this.prunePromise=Promise.resolve().then(e),this.prunePromise}async waitForPrune(){await this.prunePromise?.catch(()=>{})}async prunePublic(){if(!this.storage)return;let e;try{e=await this.storage.keys()}catch{return}let t=Date.now(),s=[];for(let a of e.filter(r=>r.startsWith("jhs_http_public_cache:v"))){let r=await this.storage.get(a).catch(()=>null);if(!r||r.version!==this.namespaceVersion||!Number.isFinite(r.expiresAt)||r.expiresAt<=t){await this.storage.remove(a).catch(()=>{});continue}s.push({key:a,lastUsed:Number(r.lastUsed)||0})}if(s.length>500){s.sort((a,r)=>a.lastUsed-r.lastUsed);for(let a of s.slice(0,s.length-500))await this.storage.remove(a.key).catch(()=>{})}}async clearNamespace(e){e=String(e||"default"),this.publicGenerations.set(e,this.generation(e)+1);for(let a of this.publicCache.keys())a.startsWith(`${e}:`)&&this.publicCache.delete(a);for(let a of this.publicReads.keys())a.startsWith(`${e}:`)&&this.publicReads.delete(a);await this.waitForPrune();let t=this.storage;if(!t)return;let s;try{s=await t.keys()}catch{return}await Promise.all(s.filter((a=>a.startsWith(this._publicPrefix(e)))).map((a=>t.remove(a).catch(()=>{}))))}async clearAll(){let e=new Set(this.publicNamespaces);for(let t of e)await this.clearNamespace(t);if(this.publicCache.clear(),this.publicReads.clear(),this.sessionCaches.clear(),this.storage)try{let t=this.storage,s=`jhs_http_public_cache:v${this.namespaceVersion}:`,a=await t.keys();await Promise.all(a.filter(r=>r.startsWith(s)).map(r=>t.remove(r).catch(()=>{})))}catch{}}async clearPublic(){return this.clearAll()}async invalidateNamespace(){return this.clearAll()}};d(Yn,"CacheService");var cr=Yn;var Zn=class Zn{constructor(e,t){this.integrations=e,this.cache=t}profileUrl(e){for(let t of this.integrations.list("person.actress-info")){let s=this.integrations.getAdapter(t.id);if(typeof s.profileUrl=="function")return s.profileUrl(e)}return""}async lookup(e,t={}){let s=String(e).trim()==="三上悠亞"?"三上悠亜":String(e).trim();if(!s)return null;let a=`actress-info:${s}`,r=await this.cache.get("actress-info",a,{scope:"public"});if(r.hit)return r.value;let i=this.cache.generation("actress-info");for(let n of this.integrations.list("person.actress-info")){let l=this.integrations.getAdapter(n.id);if(typeof l.lookup!="function")continue;let c=await l.lookup(s,t);return await this.cache.set("actress-info",a,c,{scope:"public",ttlMs:6048e5,negative:!c,generation:i}),c}return null}async movies(e,t,s={}){let a=this.integrations.list("actor.movies").find(i=>i.id===e);if(!a)return[];let r=this.integrations.getAdapter(a.id);return typeof r?.listActorMovies=="function"?r.listActorMovies(t,s):[]}async collection(e,t,s={}){let a=this.integrations.list("actor.collection").find(i=>i.id===e);if(!a)throw new TypeError(`Actor collection provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.listActorCollection!="function")throw new TypeError(`Actor collection is unavailable: ${e}`);return r.listActorCollection(t,s)}async uncollect(e,t,s={}){let a=this.integrations.list("actor.uncollect").find(i=>i.id===e);if(!a)throw new TypeError(`Actor provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.uncollectActor!="function")throw new TypeError(`Actor uncollect is unavailable: ${e}`);return r.uncollectActor(t,s)}getAvatarSources(){return Object.freeze(this.integrations.list("person.avatar-search").flatMap(e=>{let t=this.integrations.getAdapter(e.id);return typeof t?.getSources=="function"?t.getSources():[]}))}async searchAvatars(e,t,s={}){for(let a of this.integrations.list("person.avatar-search")){let r=this.integrations.getAdapter(a.id);if(r?.getSources?.().some(i=>i.id===t))return r.searchAvatars(e,{...s,sourceId:t})}return[]}placeholderUrl(e){let t=this.integrations.getAdapter(e);return typeof t?.actorPlaceholderUrl=="function"?t.actorPlaceholderUrl():""}};d(Zn,"ActressInfoService");var dr=Zn;var nu=/^(?:authorization|cookie|set-cookie|password|token|secret|credential)$/i;function Xn(o,e=""){return nu.test(e)?"[redacted]":Array.isArray(o)?o.map(t=>Xn(t)):o&&typeof o=="object"?Object.fromEntries(Object.entries(o).map(([t,s])=>[t,Xn(s,t)])):typeof o!="string"?o:o.replace(/(https?:\/\/)([^\s/@:]+):([^\s/@]+)@/gi,"$1[redacted]@")}d(Xn,"sanitize");var eo=class eo{constructor(e={}){this.startedAt=performance.now(),this.activeFeatures=new Set,this.activeContributions=new Set,this.startupTimings=new Map,this.scopes=new Map,this.requestStats={consumers:0,underlying:0},this.cacheStats={hits:0,misses:0},this.providerHealth=new Map,this.errors=[],this.browserMetadata=null,this.legacyPlugins=[],this.legacyPluginDescriptors=[],this.legacyStartup=null,this.legacyTimings=[],this.legacyHttp=e.legacyHttp??null,this.networkController=null}recordStartup(e,t){this.startupTimings.set(e,t)}setFeature(e,t){t?this.activeFeatures.add(e):this.activeFeatures.delete(e)}setContribution(e,t){t?this.activeContributions.add(e):this.activeContributions.delete(e)}updateScope(e){this.scopes.set(e.id,Object.freeze({...e}))}updateRequests(e,t){this.requestStats={consumers:e,underlying:t}}recordCache(e){e?this.cacheStats.hits+=1:this.cacheStats.misses+=1}updateProvider(e,t){this.providerHealth.set(e,Object.freeze({...t}))}recordError(e){let t=e&&typeof e=="object"&&"toJSON"in e&&typeof e.toJSON=="function"?e.toJSON():e instanceof Error?{message:e.message}:e&&typeof e=="object"?{...e}:{message:String(e)};this.errors.push({...Xn(t),timestamp:new Date().toISOString()}),this.errors.length>100&&this.errors.shift()}setBrowserMetadata(e){this.browserMetadata=Object.freeze({...e})}setLegacyRuntime(e,t,s){this.legacyPluginDescriptors=e.map(a=>Object.freeze({...a})),this.legacyPlugins=e.map(a=>a.name),this.legacyStartup=Object.freeze({...t}),this.legacyTimings=s.map(a=>Object.freeze({...a}))}clearErrors(){this.errors=[]}setNetworkController(e){this.networkController=e}getNetworkDiagnostics(){let e=this.networkController??this.legacyHttp;return Object.freeze({circuitBreakers:e?.getCircuitBreakerStatus?.()??{},domainStats:e?.getDomainStats?.()??{}})}resetCircuitBreaker(e){(this.networkController??this.legacyHttp)?.resetCircuitBreaker?.(e)}resetAllCircuitBreakers(){(this.networkController??this.legacyHttp)?.resetAllCircuitBreakers?.()}clearDomainStats(){(this.networkController??this.legacyHttp)?.clearDomainStats?.()}exportSnapshot(){let e=[...this.scopes.values()];return Object.freeze({activeFeatures:[...this.activeFeatures],activeContributions:[...this.activeContributions],startupTimings:Object.fromEntries(this.startupTimings),activeScopes:e,globalListeners:e.filter(t=>t.id==="app:root").reduce((t,s)=>t+Number(s.listeners??0),0),observers:e.reduce((t,s)=>t+Number(s.observers??0),0),requestConsumers:this.requestStats.consumers,underlyingRequests:this.requestStats.underlying,cacheHits:this.cacheStats.hits,cacheMisses:this.cacheStats.misses,providerHealth:Object.fromEntries(this.providerHealth),errors:this.errors.map(t=>({...t})),legacyPlugins:[...this.legacyPlugins],legacyPluginDescriptors:this.legacyPluginDescriptors.map(t=>({...t})),legacyStartup:this.legacyStartup,legacyTimings:this.legacyTimings.map(t=>({...t})),browser:this.browserMetadata,uptimeMs:performance.now()-this.startedAt})}};d(eo,"DiagnosticsService");var hr=eo;var to=class to{constructor(e){this.port=Je(e,"DialogPort",Ke.dialog)}open(e){return this.port.open(e)}close(e){return this.port.close(e)}confirm(e,t,s){return this.port.confirm(e,t,s)}alert(e,t){return this.port.alert(e,t)}};d(to,"DialogService");var ur=to;var ou=[/^10\./,/^127\./,/^169\.254\./,/^192\.168\./,/^172\.(?:1[6-9]|2\d|3[01])\./,/^0\./];function lu(o){let e=o.replace(/^\[|\]$/g,"").toLowerCase();return e==="localhost"||e.endsWith(".localhost")||e==="::1"?!0:e.includes(":")?e.startsWith("fc")||e.startsWith("fd")||e.startsWith("fe8")||e.startsWith("fe9")||e.startsWith("fea")||e.startsWith("feb"):ou.some(t=>t.test(e))}d(lu,"isPrivateLiteral");var so=class so{constructor(e={}){this.localOrigins=new Set,this.replaceLocalOrigins(e.localOrigins??[])}authorizeLocalOrigin(e){this.localOrigins.add(new URL(e).origin)}replaceLocalOrigins(e){let t=new Set(e.map(s=>new URL(s).origin));this.localOrigins=t}assertAllowed(e,t){let s;try{s=e instanceof URL?e:new URL(e)}catch(a){throw new D("INVALID_URL","外部地址无效",{source:"ExternalUrlPolicy",cause:a})}if(!new Set(["http:","https:"]).has(s.protocol))throw new D("INVALID_URL","仅允许 HTTP/HTTPS 地址",{source:"ExternalUrlPolicy"});if(t.expectedOrigin&&s.origin!==new URL(t.expectedOrigin).origin)throw new D("INVALID_URL","地址离开已声明的精确 origin",{source:"ExternalUrlPolicy"});if(t.trustClass==="builtin-public"){if(s.protocol!=="https:"||!(t.hosts??[]).some(a=>s.hostname===a||s.hostname.endsWith(`.${a}`)))throw new D("INVALID_URL","地址不在 Integration manifest 允许范围",{source:"ExternalUrlPolicy"})}else if(t.trustClass==="custom-public"){if(s.protocol!=="https:"||lu(s.hostname))throw new D("INVALID_URL","自定义公开来源必须使用公网 HTTPS",{source:"ExternalUrlPolicy"})}else if(t.trustClass==="user-local"){let a=t.expectedOrigin?new URL(t.expectedOrigin).origin:s.origin;if(!this.localOrigins.has(a)||s.origin!==a)throw new D("INVALID_URL","本地来源未获得精确 origin 授权",{source:"ExternalUrlPolicy"})}else throw new D("INVALID_URL","未知 URL trust class",{source:"ExternalUrlPolicy"});return s}assertFinalUrl(e,t){return this.assertAllowed(e,t)}};d(so,"ExternalUrlPolicy");var pr=so;function fs(o){if(o==null||typeof o!="object")return JSON.stringify(o);if(Array.isArray(o))return`[${o.map(fs).join(",")}]`;let e=o;return`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${fs(e[t])}`).join(",")}}`}d(fs,"stableSerialize");async function Jc(o){let e=new TextEncoder().encode(o),t=await crypto.subtle.digest("SHA-256",e);return[...new Uint8Array(t)].map(s=>s.toString(16).padStart(2,"0")).join("")}d(Jc,"sha256");function cu(o){let e=new URL(o),t=[...e.searchParams.entries()].sort(([s,a],[r,i])=>s.localeCompare(r)||a.localeCompare(i));e.search="";for(let[s,a]of t)e.searchParams.append(s,a);return e.hash="",e.href}d(cu,"canonicalizeUrl");function du(o,e=0){if(typeof o!="string"||!o)return!1;let t=o.toLowerCase(),s=/]*>\s*just a moment(?:\.\.\.)?\s*<\/title>/i.test(o),a=/id=["']challenge-form["']/i.test(o),r=t.includes("cf-chl-")||t.includes("cf_chl_opt"),i=t.includes("/cdn-cgi/challenge-platform/")||t.includes("challenge-platform");return s||a&&(r||i)||[403,429,503].includes(e)&&r&&i}d(du,"isCloudflareChallenge");function hu(o,e){return o<=0?Promise.resolve():new Promise((t,s)=>{let r=setTimeout(d(()=>{e?.removeEventListener("abort",i),t()},"finish"),o),i=d(()=>{clearTimeout(r),s(new D("ABORTED","请求已取消",{source:"HttpService"}))},"onAbort");e?.addEventListener("abort",i,{once:!0}),Promise.resolve().then(()=>e?.aborted&&i())})}d(hu,"waitForRetry");async function uu(o){let e=String(o.method??"GET").toUpperCase(),t=Object.fromEntries(Object.entries(o.headers??{}).map(([i,n])=>[i.toLowerCase(),String(n)])),s=[...new Set((o.varyHeaders??[]).map(i=>String(i).toLowerCase()))].sort(),a=Object.fromEntries(s.map(i=>[i,t[i]??""])),r={providerId:String(o.providerId),cacheNamespace:String(o.cacheNamespace??o.providerId??"default"),method:e,canonicalUrl:cu(o.url),bodyHash:await Jc(fs(o.body??null)),responseType:String(o.responseType??"text"),cacheScope:String(o.cacheScope??"none"),varyHeadersHash:await Jc(fs(a)),sessionScopeId:o.cacheScope==="session"?String(o.sessionScopeId??""):""};if(r.cacheScope==="session"&&!r.sessionScopeId)throw new TypeError("sessionScopeId is required for session requests");return Object.freeze(r)}d(uu,"createRequestKey");var ao=class ao{constructor(e,t,s={}){this.port=e,this.urlPolicy=t,this.diagnostics=s.diagnostics??null,this.cache=s.cache??null,this.settings=s.settings??null,this.inflight=new Map,this.circuitBreakers=new Map,this.domainStats=new Map}async request(e,t){t?.assertActive();let s=String(e.method??"GET").toUpperCase();if(this.settings){let m=this.settings.snapshot();e={...e,timeout:e.timeout??Math.max(1e3,Math.min(12e4,Number(m.httpTimeout)||5e3)),retryCount:e.retryCount??(["GET","HEAD"].includes(s)?Math.max(1,Math.min(10,Math.trunc(Number(m.httpRetryCount)||3)))-1:0),circuitThreshold:e.circuitThreshold??Number(m.circuitBreakerThreshold??3),circuitCooldownMs:e.circuitCooldownMs??Number(m.circuitBreakerCooldown??6e4)}}let a=e.cacheScope??"none";if(s!=="GET"&&a!=="none")throw new TypeError("Mutation requests cannot use generic cache/dedupe");let r=e.urlPolicy,i=this.urlPolicy.assertAllowed(e.url,r);if(s!=="GET"||a==="none")return this.executeUnderlying({...e,method:s,url:i.href,signal:t?.signal},r);let n=String(e.cacheNamespace??e.providerId??"default"),l=await uu({...e,method:s,url:i.href,cacheScope:a,cacheNamespace:n});t?.assertActive();let c=fs(l),h={scope:a,sessionScopeId:e.sessionScopeId};if(s==="GET"&&a!=="none"&&this.cache){let m=await this.cache.get(n,c,h);if(t?.assertActive(),m.hit)return m.value}let u=a==="public"&&this.cache?this.cache.generation(n):void 0,p=JSON.stringify([c,u??null]),g=this.inflight.get(p);if(!g){let m=new AbortController;g={controller:m,consumers:0,promise:Promise.resolve()},g.promise=this.executeUnderlying({...e,method:s,url:i.href,signal:m.signal},r).then(async f=>(this.cache&&(u==null||u===this.cache.generation(n))&&await this.cache.set(n,c,f,{...h,ttlMs:e.ttlMs??0,negative:e.negative===!0,generation:u}),f)).finally(()=>{this.inflight.get(p)===g&&this.inflight.delete(p),this.updateDiagnostics()}),this.inflight.set(p,g)}return this.consume(g,t)}async executeUnderlying(e,t){let s=new URL(e.url).hostname,a=Math.max(0,Math.min(9,Math.trunc(Number(e.retryCount??0)||0))),r=new Set((e.acceptableStatuses??[]).map(c=>Number(c)).filter(Number.isFinite)),i=this.ensureCircuit(s,e),n=!1,l=null;for(let c=0;c<=a;c+=1){if(e.signal?.aborted){l=new D("ABORTED","请求已取消",{source:e.providerId});break}let h=n?null:this.checkCircuit(s);if(h){l=new D("CIRCUIT_OPEN",`站点 ${s} 已熔断,${h.remaining}秒后重试`,{source:e.providerId,details:{domain:s,remainingSeconds:h.remaining}});break}i.state==="half-open"&&(i.probing=!0,n=!0);try{let u=await this.port.request(e);if(this.urlPolicy.assertFinalUrl(u.finalUrl||e.url,t),du(u.responseText??u.data,u.status))throw new D("CF_BLOCKED",`Cloudflare challenge blocked: ${s}`,{source:e.providerId,details:{domain:s,status:Number(u.status)||0,contentLength:String(u.responseText??"").length}});if(r.has(Number(u.status)))return this.recordSuccess(s),u;if(u.status>=400){let p=[401,403].includes(u.status)?"AUTH_REQUIRED":u.status===404?"NOT_FOUND":u.status===429?"RATE_LIMITED":"NETWORK_ERROR";throw new D(p,`HTTP ${u.status}`,{source:e.providerId,retryable:u.status===429||u.status>=500,details:{status:u.status,domain:s}})}return this.recordSuccess(s),u}catch(u){let p=D.from(u,e.providerId);if(this.recordAttempt(s,!0),l=p,!p.retryable||c>=a||p.code==="CF_BLOCKED")break;try{await hu(Number(e.retryDelayMs??250)*(c+1),e.signal)}catch(g){l=D.from(g,e.providerId);break}}}throw l&&["NETWORK_ERROR","TIMEOUT","CF_BLOCKED"].includes(l.code)&&this.recordBreakerFailure(s,e),n&&(i.probing=!1),this.diagnostics?.recordError(l),l}ensureCircuit(e,t={}){let s=this.circuitBreakers.get(e);return s?(t.circuitCooldownMs!=null&&(s.cooldownMs=Math.max(1e3,Number(t.circuitCooldownMs)||6e4)),t.circuitThreshold!=null&&(s.threshold=Math.max(1,Number(t.circuitThreshold)||3))):(s={state:"closed",failCount:0,openTime:0,cooldownMs:Math.max(1e3,Number(t.circuitCooldownMs??6e4)||6e4),threshold:Math.max(1,Number(t.circuitThreshold??3)||3),probing:!1},this.circuitBreakers.set(e,s)),s}checkCircuit(e){let t=this.circuitBreakers.get(e);if(!t)return null;if(t.state==="open"){let s=Date.now()-t.openTime;if(s=s.threshold)&&(s.state="open",s.openTime=Date.now(),s.probing=!1)}recordFailure(e,t={}){this.recordAttempt(e,!0),this.recordBreakerFailure(e,t)}getCircuitBreakerStatus(){return Object.fromEntries([...this.circuitBreakers].map(([e,t])=>[e,{...t}]))}getDomainStats(){return Object.fromEntries([...this.domainStats].map(([e,t])=>[e,{...t}]))}resetCircuitBreaker(e){this.circuitBreakers.delete(e)}resetAllCircuitBreakers(){this.circuitBreakers.clear()}clearDomainStats(){this.domainStats.clear()}consume(e,t){e.consumers+=1;let s=!1,a={release:d(()=>{s||(s=!0,e.consumers-=1,e.consumers===0&&!this.isSettled(e)&&e.controller.abort(),this.updateDiagnostics())},"release")},r;try{r=t?.ownRequestConsumer(a)}catch(l){throw a.release(),e.promise.catch(()=>{}),l}this.updateDiagnostics();let i=d(()=>{},"removeAbortListener");return(t?Promise.race([e.promise,new Promise((l,c)=>{let h=d(()=>c(new D("ABORTED","LifecycleScope 已释放",{source:t.id})),"onAbort");t.signal.addEventListener("abort",h,{once:!0}),i=d(()=>t.signal.removeEventListener("abort",h),"removeAbortListener")})]):e.promise).finally(()=>{i(),r?.(),a.release()})}isSettled(e){return![...this.inflight.values()].includes(e)}updateDiagnostics(){let e=[...this.inflight.values()].reduce((t,s)=>t+s.consumers,0);this.diagnostics?.updateRequests(e,this.inflight.size)}};d(ao,"HttpService");var gr=ao;var ro=class ro{constructor(e){this.integrations=e}async resolve(e,t={}){let s=this.integrations.list("image.search-targets")[0];if(!s)throw new D("UNSUPPORTED","以图识图 Integration 不可用",{source:"ImageSearchService"});let a=this.integrations.getAdapter(s.id),r=String(e||"");if(r.startsWith("data:"))r=await a.upload(r,t);else{let i;try{i=new URL(r)}catch(n){throw new D("INVALID_URL","图片 URL 无效",{source:"ImageSearchService",cause:n})}if(!["http:","https:"].includes(i.protocol))throw new D("INVALID_URL","图片 URL 必须使用 HTTP/HTTPS",{source:"ImageSearchService"});r=i.href}return Object.freeze({imageUrl:r,targets:a.createTargets(r)})}};d(ro,"ImageSearchService");var mr=ro;var io=class io{constructor(e){this.port=Je(e,"NavigationPort",Ke.navigation)}open(e,t){return this.port.open(String(e),t)}assign(e){return this.port.assign(String(e))}replace(e){return this.port.replace(String(e))}};d(io,"NavigationService");var fr=io;var no=class no{constructor(e,t=null){this.providers=e,this.integrations=t}async search(e,t={}){let s=[];for(let a of await this.providers.getAvailable("magnet",t))try{let r=await a.search(e,t);this.providers.updateHealth(a.id,{ok:!0}),Array.isArray(r)&&s.push(...r)}catch(r){this.providers.updateHealth(a.id,{ok:!1,error:r instanceof Error?r.message:String(r)})}return s}async listNative(e,t={}){let s=typeof e.providerId=="string"?e.providerId:"javdb",a=(this.integrations?.list("movie.magnets")??[]).find(i=>i.id===s);if(!a)return[];let r=this.integrations?.getAdapter(a.id);return typeof r?.listMagnets=="function"?r.listMagnets(e,t):[]}getBuiltInSources(){return(this.integrations?.list("magnet.search")??[]).flatMap(e=>{let t=this.integrations?.getAdapter(e.id);return typeof t?.getSources=="function"?t.getSources():[]})}async searchSource(e,t,s={}){for(let a of this.integrations?.list("magnet.search")??[]){let r=this.integrations?.getAdapter(a.id);if(r?.getSources?.().some(i=>i.id===e))return r.search(e,t,s)}return[]}getSourceTargetUrl(e,t,s={}){for(let a of this.integrations?.list("magnet.search")??[]){let r=this.integrations?.getAdapter(a.id);if(r?.getSources?.().some(i=>i.id===e))return r.targetUrl(e,t,s)}return null}assess(e){return Ic(e)}};d(no,"MagnetService");var vr=no;var oo=class oo{constructor(e=null){this.integrations=e}normalize(e){return ee(e)}firstValid(...e){for(let t of e){let s=this.normalize(t);if(s)return s}return null}async resolve(e,t={}){let s=this.normalize(e.carNum);if(!s)return null;let a=this.integrations?.list("movie.search")??[],r=typeof e.providerId=="string"?e.providerId:null,i=r?a.filter(n=>n.id===r):[...a].sort((n,l)=>+(l.id==="javdb")-+(n.id==="javdb"));for(let n of i){let l=this.integrations?.getAdapter(n.id);if(typeof l?.resolveMovie!="function")continue;let c=await l.resolveMovie({...e,carNum:s},t);if(c)return c}return Object.freeze({...e,carNum:s})}async detail(e,t={}){let s=this.integrations?.list("movie.detail")??[],a=typeof e.providerId=="string"?e.providerId:e.movieId?"javdb":null,r=a?s.filter(i=>i.id===a):s;for(let i of r){let n=this.integrations?.getAdapter(i.id);if(typeof n?.getDetail=="function")return n.getDetail(e,t)}return null}async rankings(e={}){return this.playbackRankings(e)}async playbackRankings(e={}){for(let t of this.integrations?.list("movie.ranking")??[]){let s=this.integrations?.getAdapter(t.id);if(typeof s?.listRankings=="function")return s.listRankings(e)}return[]}async catalog(e,t={},s={}){let a=(this.integrations?.list("movie.catalog")??[]).find(i=>i.id===e);if(!a)throw new TypeError(`Movie catalog provider is unavailable: ${e}`);let r=this.integrations?.getAdapter(a.id);if(typeof r?.listCatalog!="function")throw new TypeError(`Movie catalog operation is unavailable: ${e}`);return r.listCatalog(t,s)}async people(e,t,s={}){let a=(this.integrations?.list("movie.credits")??[]).find(i=>i.id===e);if(!a)return Object.freeze({actors:Object.freeze([]),seller:null});let r=this.integrations?.getAdapter(a.id);return typeof r?.getPeople=="function"?r.getPeople(t,s):Object.freeze({actors:Object.freeze([]),seller:null})}async images(e,t,s={}){let a=(this.integrations?.list("movie.images")??[]).find(i=>i.id===e);if(!a)return[];let r=this.integrations?.getAdapter(a.id);return typeof r?.getImages=="function"?r.getImages(t,s):[]}async preview(e,t,s={}){let a=(this.integrations?.list("movie.preview")??[]).find(i=>i.id===e);if(!a)throw new TypeError(`Movie preview provider is unavailable: ${e}`);let r=this.integrations?.getAdapter(a.id);if(typeof r?.getPreviewForMovie!="function")throw new TypeError(`Movie preview operation is unavailable: ${e}`);return r.getPreviewForMovie(t,s)}sourceUrls(e,t){return Object.freeze(t.map(s=>{try{let a=this.integrations?.getAdapter(s),r=typeof a?.detailUrl=="function"?a.detailUrl(e):null;return r?Object.freeze({providerId:s,url:r}):null}catch{return null}}).filter(Boolean))}searchUrl(e,t){try{let s=this.integrations?.getAdapter(e);return typeof s?.searchUrl=="function"?s.searchUrl(t):null}catch{return null}}providerOrigin(e){try{let t=this.integrations?.getAdapter(e);return typeof t?.origin=="function"?t.origin():null}catch{return null}}matchesProviderUrl(e,t){try{let s=this.integrations?.getAdapter(e);return typeof s?.matchesUrl=="function"&&s.matchesUrl(t)}catch{return!1}}externalSites(e={}){let t=(this.integrations?.list("movie.external-sites")??[])[0],s=t&&this.integrations?.getAdapter(t.id);return typeof s?.getSites=="function"?s.getSites(e):[]}externalSiteOrigin(e,t={}){return this.externalSites(t).find(s=>s.id===e)?.baseUrl||""}async searchExternalSite(e,t,s={}){let a=(this.integrations?.list("movie.external-sites")??[])[0],r=a&&this.integrations?.getAdapter(a.id);return typeof r?.searchSite!="function"?Object.freeze({searchUrl:"",matches:Object.freeze([])}):r.searchSite(e,t,s)}externalNavigationLinks(){let e=(this.integrations?.list("navigation.external")??[])[0],t=e&&this.integrations?.getAdapter(e.id);return typeof t?.getNavigationLinks=="function"?t.getNavigationLinks():[]}};d(oo,"MovieIdentityService");var br=oo;var lo=class lo{constructor(e,t){this.providers=e,this.integrations=t}submitWithIntegration(e,t,s={}){let a=this.integrations.getAdapter(e);if(typeof a.submit!="function")throw new TypeError(`Integration ${e} does not support offline submission`);return a.submit(t,s)}checkAccount(e,t={}){let s=this.integrations.getAdapter(e);if(typeof s.checkAccount!="function")throw new TypeError(`Integration ${e} does not support account checks`);return s.checkAccount(t)}searchFiles(e,t,s={}){let a=this.integrations.getAdapter(e);if(typeof a.searchFiles!="function")throw new TypeError(`Integration ${e} does not support file search`);return a.searchFiles(t,s)}renameFile(e,t,s,a={}){let r=this.integrations.getAdapter(e);if(typeof r.renameFile!="function")throw new TypeError(`Integration ${e} does not support file rename`);return r.renameFile(t,s,a)}getPlayUrl(e,t){let s=this.integrations.getAdapter(e);return typeof s.getPlayUrl=="function"?s.getPlayUrl(t):null}getIntegrationHomeUrl(e){let t=this.integrations.getAdapter(e);if(typeof t.homeUrl!="string")throw new TypeError(`Integration ${e} does not declare a home URL`);return t.homeUrl}async submit(e,t={}){let s=await this.providers.getAvailable("offline",t),a=[];for(let r of s)try{let i=await r.submit(e,t);return this.providers.updateHealth(r.id,{ok:!0}),i}catch(i){a.push(i),this.providers.updateHealth(r.id,{ok:!1,error:i instanceof Error?i.message:String(i)})}throw new AggregateError(a,s.length?"所有离线 Provider 均失败":"没有可用的离线 Provider")}};d(lo,"OfflineService");var wr=lo;var co=class co extends EventTarget{constructor(e){super(),this.window=e.windowRuntime??window,this.scope=e.scope,this.settings=e.settings??null,this.coarseQuery=this.window.matchMedia("(any-pointer: coarse)"),this.profile=this.calculate(),this.started=!1}calculate(){let e=this.window.innerWidth,t=(this.settings?.snapshot()??{}).mobileMode;if(t==="on")return"compact";if(t==="off")return e>=1200?"wide":"regular";let s=Math.min(this.window.innerWidth,this.window.innerHeight);return e<=767||this.coarseQuery.matches&&s<=480?"compact":e>=1200?"wide":"regular"}start(){if(this.started)return;this.started=!0;let e=d(()=>{let t=this.calculate();if(t===this.profile)return;let s=this.profile;this.profile=t,this.dispatchEvent(new CustomEvent("profile.changed",{detail:Object.freeze({previous:s,profile:t})}))},"update");this.scope.listen(this.window,"resize",e,{passive:!0}),this.scope.listen(this.window,"orientationchange",e,{passive:!0}),this.scope.listen(this.coarseQuery,"change",e),this.settings&&this.scope.listen(this.settings,"settings.changed",e),e()}current(){return this.profile}};d(co,"ProfileService");var yr=co;var ho=class ho{constructor(e){this.integrations=e}async list(e,t={}){for(let s of this.integrations.list("movie.related")){let a=this.integrations.getAdapter(s.id);if(typeof a.listRelated=="function")return a.listRelated(e,t)}return[]}};d(ho,"RelatedService");var jr=ho;var uo=class uo{constructor(e){this.integrations=e}async list(e,t={}){for(let s of this.integrations.list("movie.reviews")){let a=this.integrations.getAdapter(s.id);if(typeof a.listReviews=="function")return a.listReviews(e,t)}return[]}};d(uo,"ReviewService");var Sr=uo;var Ht="javstore",Kc=new Set([Ht]),po=class po{constructor(e,t=null){this.providers=e,this.integrations=t}isEnabled(e){return e?.enableLoadScreenShot!=="no"}parseScreenshotProviders(e){if(Array.isArray(e))return e;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}return[]}getScreenshotSettings(e){return{mode:e?.screenshotMode==="manual"?"manual":"auto",providers:this.parseScreenshotProviders(e?.screenshotProviders)}}getEnabledProviders(e){let t=this.parseScreenshotProviders(e?.screenshotProviders);return zs.map(s=>({...s,...t.find(a=>a?.id===s.id)||{}})).filter(s=>s.enabled!==!1).sort((s,a)=>Number(s.priority??100)-Number(a.priority??100))}async resolve(e,t={}){if(t.settings&&!t.allowWhenDisabled&&!this.isEnabled(t.settings))return null;let s=t.settings?this.getEnabledProviders(t.settings):null,a=s?new Set(s.map(r=>r.id)):null;if(s&&!s.length)return null;if(t.providerId){if(a&&!a.has(t.providerId))return null;let r=this.providers.get?.(t.providerId);return r?r.enabled===!1||!r.capabilities?.includes("screenshot")?null:this.resolveFromProvider(r,e,t):this.resolveIntegration(t.providerId,e,t)}for(let r of await this.providers.getAvailable("screenshot",t)){if(a&&!a.has(r.id))continue;let i=await this.resolveFromProvider(r,e,t);if(i)return i}return a&&!a.has(Ht)?null:this.resolveIntegration(Ht,e,t)}async resolveFromProvider(e,t,s){try{let a=await e.resolve(t,s);if(this.providers.updateHealth(e.id,{ok:!0}),a)return a}catch(a){this.providers.updateHealth(e.id,{ok:!1,error:a instanceof Error?a.message:String(a)})}return null}async resolveIntegration(e,t,s){if(!Kc.has(e)||s.settings&&!s.allowWhenDisabled&&!this.isEnabled(s.settings))return null;let a=this.integrations?.list("movie.images")?.find(n=>n.id===e);if(!a)return null;let r=this.integrations?.getAdapter(a.id);if(typeof r?.getImages!="function")return null;let i=await r.getImages(t,s);return Array.isArray(i)&&i.length?i:null}getSearchUrl(e,t=null){if(!Kc.has(Ht)||t&&!this.isEnabled(t)||t&&!this.getEnabledProviders(t).some(s=>s.id===Ht))return null;for(let s of this.integrations?.list("movie.images")??[]){if(s.id!==Ht)continue;let a=this.integrations?.getAdapter(s.id);if(typeof a?.getSearchUrl=="function")return a.getSearchUrl(e)}return null}};d(po,"ScreenshotService");var xr=po;var go="translation_cache_v2",mo="translation:v1:",fo=class fo{constructor(e,t=null){this.integrations=e,this.storage=t,this.memoryCache=new Map,this.inflight=new Map,this.legacyCache=null,this.hydrationPromise=null,this.cacheGeneration=0,this.persistTimer=null}cacheKey(e,t,s){return`${mo}${t}:${s}:${e}`}readLegacyCache(){if(this.legacyCache!==null)return this.legacyCache;try{let e=JSON.parse(this.storage?.getLocal?.("jhs_translate")||"{}");this.legacyCache=e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{this.legacyCache={}}return this.legacyCache}hydrate(){if(this.hydrationPromise)return this.hydrationPromise;let e=this.cacheGeneration;return this.hydrationPromise=(async()=>{if(!this.storage)return;let t=this.storage,s=[],a=!1;try{let r=await t.get(go);for(let[n,l]of Object.entries(r?.entries||{}))e===this.cacheGeneration&&typeof l?.value=="string"&&Number(l.expiresAt)>Date.now()?this.memoryCache.set(n,{value:l.value,expiresAt:Number(l.expiresAt),lastUsed:Number(l.lastUsed)||Date.now()}):a=!0;let i=await t.keys();for(let n of i.filter((l=>l.startsWith(mo)))){let l=await t.get(n);e===this.cacheGeneration&&typeof l?.value=="string"&&Number(l.expiresAt)>Date.now()&&this.memoryCache.set(n,{value:l.value,expiresAt:Number(l.expiresAt),lastUsed:Number(l.lastUsed)||Date.now()}),s.push(n),a=!0}e===this.cacheGeneration&&(this.prune()||a)&&this.persistNow(e).then((()=>Promise.all(s.map((n=>t.remove(n)))))).catch((()=>{}))}catch{}})()}prune(){let e=Date.now(),t=!1;for(let[a,r]of this.memoryCache)r.expiresAt<=e&&(this.memoryCache.delete(a),t=!0);let s=this.memoryCache.size-1e3;if(s>0)for(let[a]of[...this.memoryCache].sort(((r,i)=>r[1].lastUsed-i[1].lastUsed)).slice(0,s))this.memoryCache.delete(a),t=!0;return t}schedulePersist(){if(!this.storage||this.persistTimer!==null)return;let e=this.cacheGeneration;this.persistTimer=setTimeout((()=>{this.persistTimer=null,this.persistNow(e).catch((()=>{}))}),300)}async persistNow(e=this.cacheGeneration){!this.storage||e!==this.cacheGeneration||(this.prune(),await this.storage.set(go,{version:2,entries:Object.fromEntries(this.memoryCache)}))}remember(e,t,s=this.cacheGeneration){if(s===this.cacheGeneration){let a=Date.now();this.memoryCache.set(e,{value:t,expiresAt:a+2592e6,lastUsed:a}),this.prune(),this.schedulePersist()}return t}async clearCache(){if(this.cacheGeneration+=1,this.persistTimer!==null&&clearTimeout(this.persistTimer),this.persistTimer=null,this.memoryCache.clear(),this.legacyCache={},this.storage?.removeLocal?.("jhs_translate"),this.storage){let e=this.storage;try{let t=await e.keys();await e.remove(go),await Promise.all(t.filter((s=>s.startsWith(mo))).map((s=>e.remove(s))))}catch{}}this.hydrationPromise=Promise.resolve()}async inspectCache(){return await this.hydrate(),this.prune(),{version:2,size:this.memoryCache.size,entries:Object.fromEntries(this.memoryCache)}}async translate(e,t={}){let s=t.sourceLanguage??"ja",a=t.targetLanguage??"zh-CN",r=this.cacheKey(e,s,a),i=this.cacheGeneration,n=this.memoryCache.get(r);if(n?.expiresAt>Date.now())return n.lastUsed=Date.now(),this.schedulePersist(),n.value;n&&this.memoryCache.delete(r);let l=t.cacheAlias&&this.readLegacyCache()[t.cacheAlias];if(s==="ja"&&a==="zh-CN"&&typeof l=="string"&&l)return this.remember(r,l,i);if(await this.hydrate(),n=this.memoryCache.get(r),n?.expiresAt>Date.now())return n.lastUsed=Date.now(),this.schedulePersist(),n.value;let c=this.inflight.get(r);if(c)return c;let h=(async()=>{let u=this.integrations.list("text.translate")[0],p=u&&this.integrations.getAdapter(u.id);if(typeof p?.translate!="function")throw new TypeError(u?`Translation operation is unavailable: ${u.id}`:"Translation provider is unavailable");let g=await p.translate(e,{...t,sourceLanguage:s,targetLanguage:a});return typeof g=="string"?this.remember(r,g,i):g})().finally((()=>this.inflight.delete(r)));return this.inflight.set(r,h),h}};d(fo,"TranslationService");var kr=fo;var vo=class vo{constructor(e){this.integrations=e}async search(e,t,s={}){let a=this.integrations.list("subtitle.search").find(i=>i.id===e);if(!a)return[];let r=this.integrations.getAdapter(a.id);return typeof r?.search=="function"?r.search(t,s):[]}async download(e,t,s={}){let a=this.integrations.list("subtitle.download").find(i=>i.id===e);if(!a)throw new TypeError(`Subtitle provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.download!="function")throw new TypeError(`Subtitle download is unavailable: ${e}`);return r.download(t,s)}};d(vo,"SubtitleService");var Cr=vo;var bo=class bo{constructor(e){this.integrations=e}async login(e,t,s={}){let a=this.integrations.list("account.login").find(i=>i.id===e);if(!a)throw new TypeError(`Account provider is unavailable: ${e}`);let r=this.integrations.getAdapter(a.id);if(typeof r?.login!="function")throw new TypeError(`Account login is unavailable: ${e}`);return r.login(t,s)}};d(bo,"AccountService");var _r=bo;var wo=class wo extends EventTarget{constructor(e,t={}){super(),this.storage=e,this.validators=t.validators??{},this.normalizers=t.normalizers??{},this.afterPersist=t.afterPersist??null,this.snapshotValue=Object.freeze({}),this.writeChain=Promise.resolve()}async load(e="setting"){return this._enqueue(()=>this._withSettingLock(()=>this._readSnapshot(e)))}async refresh(e="setting"){return this._enqueue(()=>this._withSettingLock(async()=>{let t=this.snapshotValue,s=await this._readSnapshot(e),r=[...new Set([...Object.keys(t),...Object.keys(s)])].filter(i=>t[i]!==s[i]);return r.length&&this.dispatchEvent(new CustomEvent("settings.changed",{detail:Object.freeze({name:r.length===1?r[0]:null,value:void 0,names:Object.freeze([...r]),snapshot:s})})),s}))}snapshot(){return this.snapshotValue}waitForIdle(){return this.writeChain}async set(e,t,s="setting"){return this.update(a=>{a[e]=t},s)}async patch(e,t="setting"){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("Settings patch must be an object");return this.update(s=>{Object.assign(s,e)},t)}async replace(e,t="setting"){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("Settings replacement must be an object");return this.update(s=>{for(let a of Object.keys(s))delete s[a];Object.assign(s,e)},t)}async unset(e,t="setting"){let s=Array.isArray(e)?e:[e];if(!s.every(a=>typeof a=="string"&&a))throw new TypeError("unset names must be non-empty strings");return this.update(a=>{for(let r of s)delete a[r]},t)}async update(e,t="setting"){if(typeof e!="function")throw new TypeError("Settings update mutator must be a function");return this._enqueue(()=>this._withSettingLock(async()=>{let s=await this.storage.get(t),a=s&&typeof s=="object"&&!Array.isArray(s)?s:{},r={...a},i=e(r);if(i&&typeof i=="object"&&typeof i.then=="function")throw new TypeError("Settings update mutator must be synchronous");for(let[h,u]of Object.entries(this.normalizers))Object.prototype.hasOwnProperty.call(r,h)&&typeof u=="function"&&(r[h]=u(r[h]));let n=Object.freeze(r),l=[...new Set([...Object.keys(a),...Object.keys(n)])].filter(h=>a[h]!==n[h]);for(let h of l){let u=this.validators[h];if(u&&Object.prototype.hasOwnProperty.call(n,h)&&!u(n[h]))throw new TypeError(`Invalid setting: ${h}`)}let c=Object.freeze([...l]);if(!c.length)return this.snapshotValue=n,n;if(await this.storage.set(t,n),this.snapshotValue=n,c.length){let h=c.length===1?c[0]:null;this.dispatchEvent(new CustomEvent("settings.changed",{detail:Object.freeze({name:h,value:h?n[h]:void 0,names:c,snapshot:n})}))}try{await this.afterPersist?.(n,c)}catch(h){typeof globalThis.clog?.error=="function"&&globalThis.clog.error("[settings] afterPersist failed (ignored)",h)}return n}))}async _readSnapshot(e){let t=await this.storage.get(e);return this.snapshotValue=Object.freeze(t&&typeof t=="object"&&!Array.isArray(t)?{...t}:{}),this.snapshotValue}_enqueue(e){let t=this.writeChain.then(e);return this.writeChain=t.then(()=>{},()=>{}),t}async _withSettingLock(e){let t=globalThis.navigator?.locks;return t?.request?t.request("jhs_setting_lock",()=>e()):e()}};d(wo,"SettingsService");var $r=wo;var yo=class yo{constructor(e){this.port=Je(e,"StoragePort",Ke.storage)}get(e){return this.port.get(e)}set(e,t){return this.port.set(e,t)}remove(e){return this.port.remove(e)}keys(){return this.port.keys()}getLocal(e){return this.port.getLocal(e)}setLocal(e,t){return this.port.setLocal(e,t)}removeLocal(e){return this.port.removeLocal(e)}getValue(e,t){return this.port.getValue(e,t)}setValue(e,t){return this.port.setValue(e,t)}removeValue(e){return this.port.removeValue(e)}};d(yo,"StorageService");var Tr=yo;var So=class So{constructor(e,t,s,a){this.http=e,this.baseUrl=new URL(t.endsWith("/")?t:`${t}/`),this.username=s,this.password=a,this.folderName=null}authHeaders(){let e=new TextEncoder().encode(`${this.username}:${this.password}`),t="";for(let s of e)t+=String.fromCharCode(s);return{Authorization:`Basic ${btoa(t)}`,Depth:"1"}}async request(e,t,s={},a,r={}){let i=new URL(t.replace(/^\/+/,""),this.baseUrl),n=await this.http.request({providerId:"webdav",method:e,url:i.href,headers:{...this.authHeaders(),...s},body:a,responseType:"text",cacheScope:"none",...r,timeout:1e4,urlPolicy:{trustClass:"user-local",expectedOrigin:this.baseUrl.origin}});return n.data??n.responseText??""}async ensureFolder(e){await this.request("MKCOL",e,{},void 0,{acceptableStatuses:[405,409]})}async backup(e,t,s,a){let r=d(async(i,n,l)=>{let c=performance.now(),h="success",u,p;try{return await n()}catch(g){if(h="error",g&&typeof g=="object"){let m=g;u=typeof m.code=="string"?m.code:void 0,p=Number.isFinite(m.details?.status)?m.details.status:void 0}throw g}finally{try{a?.({stage:i,result:h,durationMs:Math.round(performance.now()-c),...l==null?{}:{bytes:l},...u?{code:u}:{},...p==null?{}:{status:p},timeoutMs:1e4})}catch{}}},"runStage");await r("建目录",()=>this.ensureFolder(e)),await r("上传",()=>this.request("PUT",`${e}/${t}`,{"Content-Type":"text/plain"},s),s.length)}async getFileList(e){let t=String(await this.request("PROPFIND",e,{"Content-Type":"application/xml"},'')),s=new DOMParser().parseFromString(t,"text/xml").getElementsByTagNameNS("DAV:","response"),a=[];for(let r=1;ri.getElementsByTagNameNS("DAV:",u)[0]?.textContent||"","node"),l=n("href"),c=n("displayname")||decodeURIComponent(l.replace(/\/$/,"").split("/").pop()||""),h=n("getcontentlength");h!=="0"&&a.push({fileId:c,name:c,size:Number(h),createTime:n("creationdate")||n("getlastmodified")})}return a.reverse()}async deleteFile(e){await this.request("DELETE",`${this.folderName}/${encodeURI(e)}`,{"Cache-Control":"no-cache"})}async getBackupList(e){return this.folderName=e,await this.ensureFolder(e),this.getFileList(e)}async getFileContent(e){return String(await this.request("GET",`${this.folderName}/${e}`,{Accept:"application/octet-stream"}))}};d(So,"WebDavClient");var jo=So,xo=class xo{constructor(e,t=void 0,s=void 0){this.http=e,this.credential=t,this.settings=s}createClient(e){return new jo(this.http,e.url,e.username,e.password)}async getProfile(){let e=this.settings?.snapshot?.()||{},t=this.credential?await this.credential.get("jhs_webdav_password"):"";return{url:String(e.webDavUrl||""),username:String(e.webDavUsername||""),password:t}}async saveProfile(e={}){if(!this.settings||!this.credential)throw new Error("WebDAV 配置服务未初始化");let t=await this.getProfile(),s=Object.prototype.hasOwnProperty.call(e,"password");s&&await this.credential.set("jhs_webdav_password",String(e.password||""));try{await this.settings.update(a=>{for(let r of["url","username"])Object.prototype.hasOwnProperty.call(e,r)&&(a[r==="url"?"webDavUrl":"webDavUsername"]=String(e[r]||""))})}catch(a){throw s&&await this.credential.set("jhs_webdav_password",t.password),a}return this.getProfile()}};d(xo,"WebDavService");var Ar=xo;var Ie=Object.freeze({installationSecret:"jhs_credential_install_secret",webDavPassword:"jhs_webdav_password",javdbToken:"jhs_appAuthorization"}),ko=class ko{constructor(e,t=globalThis.localStorage){this.storage=e,this.legacyStorage=t,this.cleanupValues=new Map,this.cleanupTargets=new Map}async installationSecret(){return String(await this.storage.getValue(Ie.installationSecret,"")||this.legacyStorage?.getItem?.(Ie.installationSecret)||"x7k9p3")}generateSecret(){return btoa(String.fromCharCode(...crypto.getRandomValues(new Uint8Array(32))))}async decodeLegacy(e,t){let s=e.replace(/^AES:/,""),a=e.startsWith("AES:");try{a||(a=/^[A-Za-z0-9+/]+={0,2}$/.test(s)&&atob(s).length>=28)}catch{}return a?tt(s,t||await this.installationSecret()):e}async decode(e){if(e&&typeof e=="object"){if(e.schema===2&&typeof e.id=="string"&&e.deleted===!0&&!Object.hasOwn(e,"secret")&&!Object.hasOwn(e,"ciphertext"))return"";if(e.schema!==2||typeof e.id!="string"||typeof e.secret!="string"||typeof e.ciphertext!="string")throw new Error("凭证格式无效");return tt(e.ciphertext,e.secret,!1)}let t=String(e||"");return t?this.decodeLegacy(t):""}async get(e){try{return await this.decode(await this.storage.getValue(e,""))}catch{return""}}async set(e,t){let s=String(t||"");if(!s)return await this.remove(e),"";let a=this.generateSecret(),r={schema:2,id:crypto.randomUUID(),secret:a,ciphertext:await ts(s,a)};await this.storage.setValue(e,r);let i=await this.storage.getValue(e,"");if(JSON.stringify(i)!==JSON.stringify(r)||await this.decode(i)!==s)throw new Error("凭证存储回读校验失败");return s}async remove(e){let t={schema:2,id:crypto.randomUUID(),deleted:!0};await this.storage.setValue(e,t);let s=await this.storage.getValue(e,"");if(JSON.stringify(s)!==JSON.stringify(t)||await this.decode(s)!=="")throw new Error("凭证删除回读校验失败")}async migrateLegacy(e,t={}){let s=this.legacyStorage?.getItem?.(Ie.installationSecret)||"",a=d(p=>this.decodeLegacy(p,s),"decodeLegacy"),r=[],i={},n=[],l=e?.snapshot?.()||{},c=this.legacyStorage?.getItem?.(Ie.javdbToken)||"",h=String(l.webDavPassword||"");for(let[p,g]of[[Ie.javdbToken,c],[Ie.webDavPassword,h]]){let m;try{m=await this.storage.getValue(p,"")}catch{r.push({key:p,code:"CREDENTIAL_MIGRATION_READ_FAILED"});continue}if(!m&&!g||m&&typeof m=="object"&&(p===Ie.javdbToken||!g||m.deleted===!0))continue;let f,v;try{f=m?await this.decode(m):await a(g),m&&typeof m=="string"&&p===Ie.javdbToken&&(f=await a(f)),v=g?await a(g):""}catch{r.push({key:p,code:"LEGACY_CREDENTIAL_UNREADABLE"});continue}try{(!m||typeof m=="string")&&await this.set(p,f)}catch{r.push({key:p,code:"CREDENTIAL_MIGRATION_WRITE_FAILED"});continue}g&&f===v&&await this.get(p)===f&&(this.cleanupTargets.set(p,f),p===Ie.webDavPassword&&(i.webDavPassword=g))}let u=await this.validateLegacyCleanup({settingKeys:Object.keys(i),settingValues:i,pageKeys:n});return t.deferCleanup||(u.settingKeys.length&&e?.update&&await e.update(p=>{for(let g of u.settingKeys)p[g]===i[g]&&delete p[g]}),await this.cleanupLegacyPageStorage(u.pageKeys,e)),{migrated:!!(c||h||s),cleanup:u,issues:r}}async validateLegacyCleanup(e){let t=[];if(!globalThis.navigator?.locks?.request)return{...e,settingKeys:t};for(let s of e.settingKeys||[])s==="webDavPassword"&&this.cleanupTargets.has(Ie.webDavPassword)&&await this.get(Ie.webDavPassword)===this.cleanupTargets.get(Ie.webDavPassword)&&t.push(s);return{...e,settingKeys:t}}async cleanupLegacyPageStorage(e=[],t=null){this.cleanupValues.clear(),this.cleanupTargets.clear()}};d(ko,"CredentialService");var Pr=ko;var Co=class Co{constructor(e){this.port=Je(e,"StylePort",Ke.style)}register(e,t){return this.port.register(e,t)}remove(e){return this.port.remove(e)}};d(Co,"StyleRegistry");var Rr=Co;var _o=class _o{constructor(){this.owners=new Map,this.handlers=new Map,this.activateOwner=null,this.ownerEnabled=new Map}setOwnerEnabled(e,t){if(!this.owners.has(e))throw new Error(`Unknown command owner: ${e}`);this.ownerEnabled.set(e,t)}isAvailable(e){return this.owners.has(e)&&this.ownerEnabled.get(e)!==!1}setActivator(e){this.activateOwner=e}registerOwner(e,t){let s=this.owners.get(e);if(s&&s!==t)throw new Error(`Duplicate command owner: ${e}`);this.owners.set(e,t)}registerHandler(e,t,s){if(this.owners.get(e)!==s)throw new Error(`Feature ${s} does not own command ${e}`);if(this.handlers.has(e))throw new Error(`Duplicate command handler: ${e}`);this.handlers.set(e,t)}async execute(e,...t){let s=this.owners.get(e);if(!s)throw new Error(`Unknown command: ${e}`);if(!this.handlers.has(e)){if(!this.activateOwner)throw new Error("Command activator is not configured");await this.activateOwner(s)}let a=this.handlers.get(e);if(!a)throw new Error(`Feature ${s} did not register ${e}`);return a(...t)}};d(_o,"CommandRegistry");var Ir=_o;var $o=class $o{constructor(e=null){this.values=new Map,this.diagnostics=e}register(e,t){if(typeof e!="symbol")throw new TypeError("Dependency token must be a symbol");if(this.values.has(e)){let s=new D("DUPLICATE_TOKEN",`Duplicate dependency token: ${String(e)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(s),s}return this.values.set(e,t),this}resolveDeclared(e){let t=Object.create(null),s=new Set;for(let a of e){if(s.has(a)){let r=new D("DUPLICATE_TOKEN",`Duplicate declared dependency: ${String(a)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(r),r}if(s.add(a),!this.values.has(a)){let r=new D("MISSING_DEPENDENCY",`Missing declared dependency: ${String(a)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(r),r}Object.defineProperty(t,a,{value:this.values.get(a),enumerable:!0})}return Object.freeze(t),new Proxy(t,{get:d((a,r,i)=>{if((typeof r=="symbol"?Symbol.keyFor(r):null)?.startsWith("jhs.")&&!s.has(r)){let l=new D("UNDECLARED_DEPENDENCY",`Undeclared dependency access: ${String(r)}`,{source:"DependencyContainer"});throw this.diagnostics?.recordError?.(l),l}return Reflect.get(a,r,i)},"get")})}};d($o,"DependencyContainer");var Er=$o;var To=class To{constructor(e){this.container=e.container,this.commands=e.commands,this.diagnostics=e.diagnostics,this.disabled=new Set(At(e.disabled)),this.site=e.site??"unknown",this.route=e.route??"unknown",this.manifests=new Map,this.contributionOwners=new Map,this.contributionManifests=new Map,this.activations=new Map,this.contributionScopes=new Map,this.commands.setActivator(t=>this.activate(t).then(()=>{}))}setContributionManifests(e){this.contributionManifests=new Map(e.map(t=>[t.id,t]))}activeSurfaces(){return this.route==="list"?new Set(["global","list","list-page","list-card"]):this.route==="detail"||this.route==="owned-detail"?new Set(["global","detail","detail-page",this.route]):new Set(["global",this.route])}register(e){let t=De(e);if(this.manifests.has(t.id))throw new Error(`Duplicate feature: ${t.id}`);for(let s of t.contributes){let a=this.contributionOwners.get(s);if(a)throw new Error(`Duplicate contribution ownership: ${s} (${a}, ${t.id})`)}this.manifests.set(t.id,t);for(let s of t.contributes)this.contributionOwners.set(s,t.id);for(let s of t.providesCommands)this.commands.registerOwner(s,t.id),this.commands.setOwnerEnabled(s,this.isEligible(t))}isEligible(e){return!(e.kind!=="system"&&this.disabled.has(e.id)||e.sites.length&&!e.sites.includes(this.site)||e.routes.length&&!e.routes.includes(this.route))}isContributionEnabled(e,t,s){let a=this.manifests.get(e);if(!a||a.sites.length&&!a.sites.includes(this.site)||!a.contributes.includes(t)||a.kind!=="system"&&this.disabled.has(a.id))return!1;if(a.kind==="system")return!0;let r=this.contributionManifests.get(t);return r?.routes?.length&&!r.routes.includes(this.route)||r?.surfaces?.length&&!r.surfaces.some(i=>this.activeSurfaces().has(i))?!1:!this.disabled.has(t)&&!this.disabled.has(s)}isFeatureDisableable(e){let t=this.manifests.get(e);if(!t)throw new Error(`Unknown feature: ${e}`);return t.kind!=="system"&&t.disableable!==!1}resolveDeclaredDependencies(e){return this.container.resolveDeclared(e)}async getScope(e){return(await this.activate(e)).scope}getContributionScope(e,t,s){if(!this.isContributionEnabled(e,t,s))return Promise.reject(new Error(`Contribution is disabled or ineligible: ${t}`));let a=this.contributionScopes.get(t);return(!a||a.disposed)&&(a=new te(`contribution:${t}`,{onChange:d(r=>this.diagnostics.updateScope(r),"onChange")}),this.contributionScopes.set(t,a)),Promise.resolve(a)}activate(e){let t=this.activations.get(e);if(t)return t;let s=this.manifests.get(e);if(!s)return Promise.reject(new Error(`Unknown feature: ${e}`));if(!this.isEligible(s))return Promise.reject(new Error(`Feature is disabled or ineligible: ${e}`));let a=this.activateManifest(s);return this.activations.set(e,a),a.catch(()=>this.activations.delete(e)),a}async activateManifest(e){let t=performance.now(),s=new te(`feature:${e.id}`,{onChange:d(a=>this.diagnostics.updateScope(a),"onChange")});try{let a=this.container.resolveDeclared(e.requires),r=Object.freeze(e.contributes.filter(n=>!this.disabled.has(n))),i=await e.activate(a,Object.freeze({scope:s,enabledContributions:r,route:this.route}));for(let n of e.providesCommands){let l=i?.commands?.[n];if(typeof l!="function")throw new Error(`Feature ${e.id} did not provide command ${n}`);this.commands.registerHandler(n,l,e.id)}return this.diagnostics.setFeature(e.id,!0),r.forEach(n=>this.diagnostics.setContribution(n,!0)),this.diagnostics.recordStartup(e.id,performance.now()-t),Object.freeze({manifest:e,scope:s,enabledContributions:r,dispose:d(()=>{i?.dispose?.();for(let n of e.contributes){let l=this.contributionScopes.get(n);l&&(l.dispose(),this.contributionScopes.delete(n))}s.dispose(),this.diagnostics.setFeature(e.id,!1),r.forEach(n=>this.diagnostics.setContribution(n,!1)),this.activations.delete(e.id)},"dispose")})}catch(a){throw s.dispose(),this.diagnostics.recordError(a),a}}async start(){for(let e of this.manifests.values())this.isEligible(e)&&(e.startup==="eager"?await this.activate(e.id):e.startup==="idle"&&(globalThis.requestIdleCallback??(s=>setTimeout(s,0)))(()=>{this.activate(e.id).catch(()=>{})}))}getActiveFeatureIds(){return[...this.activations.keys()]}};d(To,"FeatureRuntime");var Dr=To;var Ao=class Ao{constructor(e=null){this.providers=new Map,this.health=new Map,this.diagnostics=e}register(e){if(!e||typeof e.id!="string"||!Array.isArray(e.capabilities))throw new TypeError("Provider requires id and capabilities");if(this.providers.has(e.id))throw new Error(`Duplicate provider: ${e.id}`);return this.providers.set(e.id,Object.freeze({priority:0,enabled:!0,...e})),e}get(e){return this.providers.get(e)??null}list(e){return[...this.providers.values()].filter(t=>t.enabled!==!1&&t.capabilities.includes(e)).sort((t,s)=>Number(s.priority??0)-Number(t.priority??0))}async getAvailable(e,t){let s=[];for(let a of this.list(e))(typeof a.isAvailable!="function"||await a.isAvailable(t))&&s.push(a);return s}updateHealth(e,t){if(!this.providers.has(e))throw new Error(`Unknown provider: ${e}`);this.health.set(e,Object.freeze({...t,updatedAt:Date.now()})),this.diagnostics?.updateProvider(e,t)}getHealth(e){return this.health.get(e)??null}};d(Ao,"ProviderRegistry");var Nr=Ao;var Gc=Object.freeze({none:{cacheScope:"none",ttlMs:0},"public-1d":{cacheScope:"public",ttlMs:864e5},"public-5m":{cacheScope:"public",ttlMs:3e5},"public-7d":{cacheScope:"public",ttlMs:6048e5},"external-detail-v1":{cacheScope:"public",ttlMs:6048e5,cacheNamespace:"external-detail-v1"},"screenshot-7d":{cacheScope:"public",ttlMs:6048e5,cacheNamespace:"screenshot"},"session-configured":{cacheScope:"session",ttlMs:36e5},"source-configured":{cacheScope:"public",ttlMs:216e5,cacheNamespace:"source",getOnly:!0}});function pu(o,e,t={}){let s=o.cachePolicy==="none"?"none":o.cachePolicy?.[e],a={...Gc[s]||Gc.none};return a.getOnly&&String(t.method||"GET").toUpperCase()!=="GET"?Object.freeze({cacheScope:"none",ttlMs:0}):(delete a.getOnly,s==="session-configured"&&(a.sessionScopeId=String(t.sessionScopeId||`${o.id}-session`)),Object.freeze(a))}d(pu,"resolveIntegrationCachePolicy");function gu(o,e){let t=d((a,r={})=>pu(e,a,r),"policyFor"),s=d(a=>{if(a.capability&&e.capabilities.includes(a.capability))return a.capability;if(e.capabilities.length===1)return e.capabilities[0];let r=String(a.providerId||"");return e.capabilities.find(i=>r.includes(String(i).split(".").pop()||""))||e.capabilities[0]},"inferCapability");return Object.freeze({request(a,r,i){let n=typeof a=="string",l=n?a:s(a),c=n?r||{}:a||{},h=n?i:r;if(!e.capabilities.includes(l))throw new TypeError(`Integration ${e.id} does not declare capability ${l}`);let u=t(l,c),p={...c,...u};return delete p.capability,o.request(p,h)}})}d(gu,"createIntegrationRequestFacade");var Po=class Po{constructor(e,t){this.container=e,this.diagnostics=t,this.manifests=new Map,this.adapters=new Map}register(e){try{let t=W(e);if(this.manifests.has(t.id))throw new Error(`Duplicate integration: ${t.id}`);this.manifests.set(t.id,t)}catch(t){throw this.diagnostics.recordError(t),t}}list(e){return[...this.manifests.values()].filter(t=>t.capabilities.includes(e))}getAdapter(e){let t=this.adapters.get(e);if(t)return t;let s=this.manifests.get(e);if(!s)throw new Error(`Unknown integration: ${e}`);try{let a=this.container.resolveDeclared(s.requires),r=Object.create(null);for(let l of s.requires)Object.defineProperty(r,l,{value:l===y.http?gu(a[l],s):a[l],enumerable:!0});Object.freeze(r);let i=s.createClient(r),n=s.createAdapter(i,r);return this.adapters.set(e,n),n}catch(a){throw this.diagnostics.recordError(a),a}}};d(Po,"IntegrationRegistry");var Lr=Po;var mu=new Set(["live","nextNavigation","manual"]),fu=new Set(["boolean","select","number","text","password","json"]),vu=new Set(["full","quick"]);function bu(o){if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("Setting descriptor must be an object");let e=String(o.key??o.id??"");if(!e)throw new TypeError("Setting descriptor requires key (or id)");if(!o.owner)throw new TypeError(`Setting descriptor requires owner: ${e}`);let t=String(o.type??(o.defaultValue!=null&&typeof o.defaultValue=="boolean"?"boolean":"text"));if(!fu.has(t))throw new TypeError(`Setting descriptor has invalid type: ${e} (${t})`);let s=o.effect??"live";if(!mu.has(s))throw new TypeError(`Setting descriptor has invalid effect: ${e} (${s})`);let a=Array.isArray(o.surfaces)?[...new Set(o.surfaces)].filter(r=>vu.has(r)):[];if(o.surfaces!=null&&!Array.isArray(o.surfaces))throw new TypeError(`Setting descriptor surfaces must be an array: ${e}`);return Object.freeze({...o,key:e,owner:String(o.owner),label:String(o.label??o.key??e),description:o.description==null?"":String(o.description),type:t,effect:s,surfaces:Object.freeze(a),validate:typeof o.validate=="function"?o.validate:null,normalize:typeof o.normalize=="function"?o.normalize:null,contribution:o.contribution==null?void 0:String(o.contribution)})}d(bu,"normalizeSettingDescriptor");var Ro=class Ro{constructor(){this.descriptors=new Map}register(e){let t=bu(e);if(this.descriptors.has(t.key))throw new Error(`Duplicate setting descriptor: ${t.key}`);return this.descriptors.set(t.key,t),this}list(e={}){let t=e.surfaces;return[...this.descriptors.values()].filter(s=>!(s.contribution&&e.disabledContributions?.has(s.contribution)||t&&t.length&&!s.surfaces.includes(t[0])&&!t.some(a=>s.surfaces.includes(a))))}get(e){return this.descriptors.get(e)??null}isValid(e,t){let s=this.descriptors.get(e);return s&&typeof s.validate=="function"?s.validate(t)===!0:!0}normalizers(){return Object.fromEntries([...this.descriptors.values()].filter(e=>typeof e.normalize=="function").map(e=>[e.key,e.normalize]))}};d(Ro,"SettingsRegistry");var Mr=Ro;function Qc(o){let e={type:"boolean",effect:"live"},t="yes",s="no",a=d((i,n,l,c={})=>o.register({key:i,owner:n,label:l,...e,defaultValue:c.defaultValue??t,...c}),"toggle"),r=d((i,n,l,c)=>{let h=Number(i);return Number.isFinite(h)?Math.min(c,Math.max(l,Math.round(h))):n},"normalizeInteger");a("enableScreenSvg","ScreenshotFeature","列表长缩略图",{description:"在列表卡片上显示长缩略图按钮;手动点击仍遵守截图来源白名单。",surfaces:["full"],defaultValue:t}),a("enableLoadScreenShot","ScreenshotFeature","长缩略图",{description:"在详情页与 FC2 页面自动加载长缩略图及对应截图来源请求。",surfaces:["full","quick"]}),a("enablePreviewVideo","PreviewVideoFeature","预览视频",{description:"预览视频总开关。关闭后 JavDB/JavBus 详情与列表卡片的预览入口、播放器与 DMM 请求全部消失。",surfaces:["full","quick"]}),a("enableLoadPreviewVideo","PreviewVideoFeature","DMM 高画质增强",{description:"解析更高画质的 DMM 预览视频;关闭后仍可使用宿主原生预览,但不发起 DMM 请求。",surfaces:["full","quick"],indent:!0}),a("enableVideoSvg","CoverButtonFeature","卡片播放视频",{description:"在列表卡片上显示播放视频按钮。",surfaces:["full"]}),a("enableHandleSvg","CoverButtonFeature","卡片鉴定处理",{description:"在列表卡片上显示鉴定处理菜单。",surfaces:["full"]}),a("enableSiteSvg","CoverButtonFeature","卡片第三方网站",{description:"在列表卡片上显示第三方网站菜单。",surfaces:["full"]}),a("enableCopySvg","CoverButtonFeature","卡片复制",{description:"在列表卡片上显示复制菜单。",surfaces:["full"]}),a("autoPage","AutoPageFeature","瀑布流",{description:"连续加载列表;启用后普通列表只支持默认排序。",surfaces:["full","quick"]}),a("translateTitle","TranslateFeature","标题翻译",{description:"翻译列表和详情页标题。",surfaces:["full","quick"]}),a("hoverBigImg","ListImageFeature","悬浮大图",{description:"鼠标悬停封面时显示大图。",surfaces:["full","quick"],defaultValue:s}),o.register({key:"defaultQuickFilterTab",owner:"ListPageFeature",label:"列表默认筛选",description:"进入列表页时默认选中的筛选标签,修改后下次进入列表生效。",type:"select",defaultValue:"waitCheck",effect:"nextNavigation",surfaces:["full"],options:Ls}),a("enableLoadReview","ReviewFeature","评论",{description:"在详情页与 FC2 页面加载评论;显式关闭 no 时保持关闭。",surfaces:["full","quick"]}),a("enableLoadOtherSite","OtherSiteFeature","外部站点",{description:"在详情页提供第三方站点入口。",surfaces:["full","quick"]}),a("enableLoadActressInfo","ActressInfoFeature","演员信息",{description:"在详情页与演员页展示演员资料。",surfaces:["full","quick"]}),a("enableMagnetsFilter","MagnetFeature","磁力质量过滤",{description:"在资源列表中过滤低质量磁力。",surfaces:["full"]}),a("needClosePage","WorkflowFeature","鉴定后立即关闭",{description:"完成鉴定后关闭当前详情窗口。",surfaces:["full","quick"]}),a("enableVerticalModel","LayoutFeature","竖图模式",{description:"使用竖图比例的列表卡片布局。",surfaces:["full","quick"],defaultValue:s}),o.register({key:"mobileMode",owner:"LayoutFeature",label:"移动模式",type:"select",defaultValue:"auto",effect:"live",surfaces:["full"],options:Object.freeze([{value:"auto",label:"自动检测"},{value:"on",label:"强制开启"},{value:"off",label:"强制关闭"}])}),o.register({key:"themeMode",owner:"ThemeFeature",label:"主题",type:"select",defaultValue:"light",effect:"live",surfaces:["full"],options:Object.freeze([{value:"light",label:"浅色"},{value:"dark",label:"深色"},{value:"auto",label:"跟随系统"}])}),o.register({key:"containerColumns",owner:"LayoutFeature",label:"列表列数",type:"number",defaultValue:5,effect:"live",surfaces:["full"]}),o.register({key:"containerWidth",owner:"LayoutFeature",label:"列表宽度",type:"number",defaultValue:100,effect:"live",surfaces:["full"]}),o.register({key:"screenshotMode",owner:"ScreenshotFeature",label:"截图来源模式",type:"select",defaultValue:"auto",effect:"manual",surfaces:["full"],options:Object.freeze([{value:"auto",label:"自动选择"},{value:"manual",label:"手动选择"}])}),o.register({key:"screenshotProviders",owner:"ScreenshotFeature",label:"截图来源",type:"json",defaultValue:[],effect:"manual",surfaces:["full"]}),o.register({key:"enableClog",owner:"CoreFeature",label:"日志",type:"select",defaultValue:t,effect:"live",surfaces:["full"],options:Object.freeze([{value:t,label:"开启"},{value:s,label:"关闭"}])}),o.register({key:"videoMuted",owner:"PreviewVideoFeature",label:"视频默认静音",type:"boolean",defaultValue:!0,effect:"live",surfaces:[]}),a("enable123Offline","OfflineFeature","123 云盘离线",{description:"支持 Magnet,需要先在 123 云盘页面同步授权。",surfaces:["full"],section:"cloud",defaultValue:!0,normalize:d(i=>be(i,!1),"normalize")}),a("enable115Offline","OfflineFeature","115 离线下载",{description:"支持 Magnet 与 ED2K。",surfaces:["full"],section:"cloud",defaultValue:!1,normalize:d(i=>be(i,!1),"normalize")}),o.register({key:"offlineProviderMode",owner:"OfflineFeature",label:"默认服务",description:"选择离线提交时优先使用的服务。",type:"select",defaultValue:"ask",effect:"live",surfaces:["full"],section:"cloud",options:Object.freeze([{value:"ask",label:"每次询问"},{value:"123",label:"优先 123"},{value:"115",label:"优先 115"}]),normalize:d(i=>["ask","123","115"].includes(String(i))?String(i):"ask","normalize")}),a("enable115Match","OfflineFeature","115 文件匹配",{description:"根据当前番号查找网盘中已存在的视频。",surfaces:["full"],section:"cloud",defaultValue:!1,normalize:d(i=>be(i,!1),"normalize")}),a("enable115LoginRedirect","OfflineFeature","未登录时提供登录入口",{description:"提交失败时显示 115 登录地址。",surfaces:["full"],section:"cloud",defaultValue:!1,normalize:d(i=>be(i,!1),"normalize")}),o.register({key:"oneOneFiveConcurrency",owner:"OfflineFeature",label:"匹配并发数",description:"控制 115 文件匹配的并发请求数,范围 1–10。",type:"number",defaultValue:4,effect:"live",surfaces:["full"],section:"cloud",min:1,max:10,step:1,normalize:d(i=>r(i,4,1,10),"normalize")}),o.register({key:"oneOneFiveCacheMinutes",owner:"OfflineFeature",label:"匹配缓存(分钟)",description:"设置 115 匹配结果缓存时间,范围 1–1440 分钟。",type:"number",defaultValue:60,effect:"live",surfaces:["full"],section:"cloud",min:1,max:1440,step:1,normalize:d(i=>r(i,60,1,1440),"normalize")})}d(Qc,"registerDefaultSettings");function Yc(o){let e=new hr({legacyHttp:o.legacyHttp}),t=new te("app:root",{onChange:d(Me=>e.updateScope(Me),"onChange")}),s=new Er(e),a=new rr,r=new lr(o.gmRequest),i=new nr(o.storageForage,o.localStorage,o.gmGetValue,o.gmSetValue,o.gmDeleteValue),n=new or(o.layer),l=new ir,c=new pr({localOrigins:o.localOrigins}),h=new fr(a),u=new Tr(i),p=new cr({diagnostics:e,storage:u}),g=new ur(n),m=new Rr(l),f=new Mr;Qc(f);let v=new $r(u,{afterPersist:d(async(Me,z)=>{o.legacyStorage?.invalidateSettingCache?.(),await o.eventBus?.emit?.("settings-changed",{changedNames:z,source:"service"})},"afterPersist"),normalizers:f.normalizers()}),b=new gr(r,c,{diagnostics:e,cache:p,settings:v});e.setNetworkController(b);let w=new Pr(u,o.localStorage),S=new Ar(b,w,v);t.listen(v,"settings.changed",Me=>{if(!(Me.detail?.names??[]).includes("trustedLocalOrigins"))return;let Z=v.snapshot().trustedLocalOrigins;c.replaceLocalOrigins(Array.isArray(Z)?Z:[])}),o.eventBus&&t.addCleanup(o.eventBus.on("settings-changed",async(Me,z)=>{let Z=z.originId!==o.eventBus.originId,re=z.originId===o.eventBus.originId&&z.payload?.source==="legacy";!Z&&!re||(o.legacyStorage?.invalidateSettingCache?.(),await v.refresh())})),typeof window<"u"&&t.listen(window,"pageshow",async()=>{o.legacyStorage?.invalidateSettingCache?.(),await v.refresh()});let j=new yr({scope:t,settings:v}),k=new Ir,x=new Nr(e),_=new Lr(s,e),I=new br(_),L=new dr(_,p),N=new mr(_),A=new Sr(_),O=new jr(_),U=new vr(x,_),q=new xr(x,_),Q=new kr(_,u),se=new Cr(_),ge=new _r(_),Le=new wr(x,_);s.register(Y.navigation,a).register(Y.http,r).register(Y.storage,i).register(Y.dialog,n).register(Y.style,l).register(y.diagnostics,e).register(y.urlPolicy,c).register(y.navigation,h).register(y.http,b).register(y.storage,u).register(y.webdav,S).register(y.credential,w).register(y.dialog,g).register(y.settings,v).register(y.cache,p).register(y.profile,j).register(y.state,o.stateService).register(y.movie,I).register(y.actressInfo,L).register(y.imageSearch,N).register(y.review,A).register(y.related,O).register(y.magnet,U).register(y.screenshot,q).register(y.offline,Le).register(y.translation,Q).register(y.subtitle,se).register(y.account,ge).register(Ze.command,k).register(Ze.provider,x).register(Ze.integration,_).register(Ze.settings,f),o.hostAdapter&&s.register(Y.host,o.hostAdapter),o.hostAdapters?.javdb&&s.register(Y.javdbHost,o.hostAdapters.javdb),o.hostAdapters?.javbus&&s.register(Y.javbusHost,o.hostAdapters.javbus);let dt=new Dr({container:s,commands:k,diagnostics:e,disabled:o.disabled,site:o.site,route:o.route});return s.register(Ze.feature,dt),Object.freeze({rootScope:t,container:s,ports:Object.freeze({navigationPort:a,httpPort:r,storagePort:i,dialogPort:n,stylePort:l}),services:Object.freeze({diagnostics:e,urlPolicy:c,navigation:h,http:b,storage:u,webdav:S,credential:w,dialog:g,styles:m,settings:v,cache:p,profile:j,state:o.stateService,movie:I,actressInfo:L,imageSearch:N,review:A,related:O,magnet:U,screenshot:q,translation:Q,subtitle:se,account:ge,offline:Le}),registries:Object.freeze({commands:k,providers:x,integrations:_,settings:f,features:dt})})}d(Yc,"createAppContext");var v2=Object.freeze({censored:"censored",uncensored:"uncensored"});function Br(o){if(typeof o.carNum!="string"||!o.carNum)throw new TypeError("MovieRef.carNum is required");return Object.freeze({...o})}d(Br,"defineMovieRef");function Wt(o){if(typeof o.carNum!="string"||!o.carNum)throw new TypeError("MovieDetail.carNum is required");return Object.freeze({...o})}d(Wt,"defineMovieDetail");function Io(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelectorAll=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelectorAll=="function")return e;throw new TypeError("123AV document is invalid")}d(Io,"resolveDocument");function Eo(o,e="https://123av.com"){let t=new Map;if(typeof o?.find!="function"){for(let a of Io(o).querySelectorAll(".card")){let r=a.querySelector('a.card__link[href*="/cn/v/fc2-ppv-"]'),i=r?.getAttribute("href"),n=r?.textContent?.trim()??"",l=n.match(/FC2-PPV-(\d+)/i);if(!i||!l)continue;let c=`FC2-${l[1]}`,h=new URL(i,e);h.hash="",t.set(c,{imgSrc:a.querySelector("img.card__img[src]")?.getAttribute("src")||"",carNum:c,href:h.href,title:n.replace(/^FC2-PPV-\d+\s*[—–-]\s*/i,"").trim(),preview:a.querySelector(".card__poster[data-preview]")?.getAttribute("data-preview")||null})}return[...t.values()]}let s=globalThis.jQuery??globalThis.$??o.constructor;return o.find(".card").each(((a,r)=>{let i=s(r),n=i.find('a.card__link[href*="/cn/v/fc2-ppv-"]').first(),l=n.attr("href"),c=n.text().trim(),h=c.match(/FC2-PPV-(\d+)/i);if(!l||!h)return;let u=`FC2-${h[1]}`,p=new URL(l,e);p.hash="",t.set(u,{imgSrc:i.find("img.card__img[src]").first().attr("src")||"",carNum:u,href:p.href,title:c.replace(/^FC2-PPV-\d+\s*[—–-]\s*/i,"").trim(),preview:i.find(".card__poster[data-preview]").first().attr("data-preview")||null})})),[...t.values()]}d(Eo,"parse123AvCards");function Zc(o){let e=new Map;return o.flat().forEach((t=>e.set(t.carNum,t))),[...e.values()]}d(Zc,"merge123AvCards");function Xc(o,e="https://123av.com"){if(typeof o?.find!="function"){let r=Io(o),i=r.querySelector('a[rel="last"]')?.getAttribute("href");if(i){let c=Number.parseInt(new URL(i,e).searchParams.get("page")??"",10);if(Number.isFinite(c))return c}let n=Number.parseInt(r.querySelector("input.pager__input[max]")?.getAttribute("max")??"",10);if(Number.isFinite(n))return n;let l=r.querySelector(".pager__total")?.textContent?.match(/(\d[\d,]*)/);return l?Number.parseInt(l[1].replaceAll(",",""),10):null}let t=o.find('a[rel="last"]').first().attr("href");if(t){let r=Number.parseInt(new URL(t,e).searchParams.get("page")??"",10);if(Number.isFinite(r))return r}let s=Number.parseInt(o.find("input.pager__input[max]").first().attr("max"),10);if(Number.isFinite(s))return s;let a=o.find(".pager__total").first().text().match(/(\d[\d,]*)/);return a?Number.parseInt(a[1].replaceAll(",",""),10):null}d(Xc,"parse123AvSourceMaxPage");function ed(o,e){let t=new URL(e).pathname.match(/fc2-ppv-(\d+)/i),s=t?t[1]:null,a=typeof o?.find=="function"?null:Io(o),r=a?a.querySelector("h1.watch__title")?.textContent?.trim()??"":o.find("h1.watch__title").first().text().trim(),i=s?r.replace(new RegExp(`^FC2-PPV-${s}\\s*[—–-]\\s*`,"i"),"").trim():r,l=(a?a.body?.textContent??"":o.find("body").text()).match(/发布日期\s*(\d{4}-\d{2}-\d{2})/)?.[1]||"";return{id:s,publishDate:l,title:i,moviePoster:null}}d(ed,"parse123AvVideoInfo");var Or="https://123av.com";function wu(o){try{let e=new URL(String(o||Or));return e.protocol!=="https:"?Or:e.origin}catch{return Or}}d(wu,"normalizeBaseOrigin");function yu(o,e=null){let t=d(()=>wu(e?.snapshot().av123Url),"baseOrigin"),s=d((a,r,i="movie.detail")=>{let n=new URL(a).origin,l=n===Or;return o.request({providerId:"av123",capability:i,method:"GET",url:a,responseType:"text",requestOptions:{cookiePartition:{topLevelSite:n}},urlPolicy:l?{trustClass:"builtin-public",hosts:["123av.com"],expectedOrigin:n}:{trustClass:"custom-public",expectedOrigin:n}},r)},"request");return Object.freeze({contracts:["MovieRef","MovieDetail"],origin:t,searchUrl(a){let r=ee(a?.carNum);return r?`${t()}/cn/search?keyword=${encodeURIComponent(r)}`:null},detailUrl(a){let r=ee(a.carNum)?.match(/^FC2-(\d+)$/)?.[1];return a.url?new URL(a.url).href:r?`${t()}/cn/v/fc2-ppv-${r}`:null},matchesUrl(a){try{let r=new URL(a);return r.origin===t()||/^\/cn\/v\/fc2-ppv-\d+\/?$/i.test(r.pathname)}catch{return!1}},async listCatalog(a={},r={}){let i=Math.max(1,Number(a.page)||1),n=String(a.keyword||"").trim(),c=(n?[i]:[i*2-1,i*2]).map(m=>n?`${t()}/cn/search?keyword=${encodeURIComponent(n)}&page=${m}`:`${t()}/cn/makers/fc2?page=${m}`),h=await Promise.all(c.map(m=>s(m,r.scope,n?"movie.search":"movie.catalog"))),u=h.map((m,f)=>Eo(m.data,m.finalUrl||c[f])),p=Zc(u).map(m=>Object.freeze({carNum:m.carNum,title:m.title,url:m.href,imageUrl:m.imgSrc?new URL(m.imgSrc,t()).href:null,previewUrl:m.preview?new URL(m.preview,t()).href:null,providerId:"av123"})),g=h.length?Xc(h[0].data,h[0].finalUrl||c[0]):null;return Object.freeze({items:p,maxPage:g?n?g:Math.ceil(g/2):null})},async resolveMovie(a,r={}){let i=ee(a.carNum);if(!i)return null;let n=this.searchUrl({carNum:i});if(!n)return null;let l=await s(n,r.scope,"movie.search"),c=Eo(l.data,l.finalUrl||n).find(h=>ee(h.carNum)===i);return c?Br({carNum:i,url:c.href,providerId:"av123"}):null},async getDetail(a,r={}){let i=ee(a.carNum),n=i?.match(/^FC2-(\d+)$/)?.[1];if(!i||!a.url&&!n)throw new TypeError("123AV movie reference is invalid");let l=new URL(a.url||`${t()}/cn/v/fc2-ppv-${n}`).href,c=await s(l,r.scope),h=ed(c.data,c.finalUrl||l);if(!h.title)throw new TypeError("123AV detail is malformed");return Wt({carNum:i,title:h.title,releaseDate:h.publishDate||null,url:c.finalUrl||l,providerId:"av123"})}})}d(yu,"create123AvAdapter");var td=W({id:"av123",trustClass:"builtin-public",hosts:["123av.com"],capabilities:["movie.search","movie.detail","movie.catalog"],requires:[y.http,y.settings],createClient:d(o=>Object.freeze({http:o[y.http],settings:o[y.settings]}),"createClient"),createAdapter:d(o=>yu(o.http,o.settings),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.search":"public-7d","movie.detail":ke.externalDetail,"movie.catalog":"public-7d"},quality:"silver"});function ju(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelector=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelector=="function")return e;throw new TypeError("DMM preview document is invalid")}d(ju,"resolveDocument");function sd(o,e){let t=ju(o),s=t.querySelector("[data-video-url]")?.getAttribute("data-video-url")??t.querySelector("video source[src]")?.getAttribute("src");if(!s)throw new TypeError("DMM preview URL is missing");let a=new URL(s,e);if(a.protocol!=="https:")throw new TypeError("DMM preview must use HTTPS");return Object.freeze({url:a.href})}d(sd,"parseDmmPreview");function ad(o,e,t){if(o?.result?.result_count===0&&!Array.isArray(o.result.items))return Object.freeze([]);if(!o||typeof o!="object"||!o.result||!Array.isArray(o.result.items))throw new we("dmm","INVALID_RESPONSE","DMM API 返回结构无效");let s=e.toLowerCase(),a=s.replace(/-/g,""),r=t.toLowerCase().replace(/-/g,"");return Object.freeze(o.result.items.flatMap(i=>{let n=String(i?.content_id??""),l=String(i?.maker_product??"");return!n.toLowerCase().includes(r)&&l.toLowerCase()!==s&&!n.toLowerCase().includes(a)?[]:[Object.freeze({serviceCode:String(i.service_code??""),floorCode:String(i.floor_code??""),contentId:n,pageUrl:new URL(String(i.URL)).href})]}).slice(0,2))}d(ad,"parseDmmItemCandidates");function rd(o,e){if(typeof o!="string")throw new we("dmm","PARSE_ERROR","解析播放页内容失败, 非文本内容",{url:e});if(o.includes("このサービスはお住まいの地域からは"))throw new we("dmm","REGION_BLOCKED","DMM 预览源不可用,请将 DMM 域名分流到日本 IP",{url:e});let t=o.match(/const\s+args\s+=\s+(.*);/);if(!t)throw new we("dmm","PARSE_ERROR","未在脚本中找到 const args = ... 变量",{url:e});let s;try{({bitrates:s}=JSON.parse(t[1]))}catch(r){throw new we("dmm","PARSE_ERROR",`解析播放器脚本 JSON 失败: ${r instanceof Error?r.message:String(r)}`,{cause:r,url:e})}if(!Array.isArray(s))throw new we("dmm","PARSE_ERROR","解析画质链接失败: bitrates 字段不是一个数组或不存在",{url:e});let a={};for(let r of s){let i=r?.src;if(typeof i!="string"||!i.endsWith(".mp4"))continue;let n=new URL(i,e);if(n.protocol!=="https:")continue;let l=n.pathname.match(/\/([^/]+)\.mp4$/)?.[1];l&&!a[l]&&(a[l]=n.href)}if(Object.keys(a).length===0)throw new we("dmm","PARSE_ERROR","未找到匹配要求的预览画质视频",{url:e});return Object.freeze(a)}d(rd,"parseDmmPlayerSources");var Do=["dmm.co.jp","dmm.com"];function Su(o){return Object.freeze({contracts:["MoviePreview"],searchUrl(e){return`https://www.dmm.co.jp/search/=/searchstr=${encodeURIComponent(String(e.carNum??""))}`},async getPreview(e,t={}){let s=new URL(e.url),a=await o.request({providerId:"dmm",capability:"movie.preview",method:"GET",url:s.href,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["dmm.co.jp"]}},t.scope);return sd(a.data,a.finalUrl||s.href)},async getPreviewForMovie(e,t={}){let s=String(e.carNum),a=s.replace(/-/g,""),r=[s.replace("-","00"),s,a],i=this.searchUrl(e),n=[],l=null,c=!1;for(let p of r){let g=`https://api.dmm.com/affiliate/v3/ItemList?${new URLSearchParams({api_id:"UrwskPfkqQ0DuVry2gYL",affiliate_id:"10278-996",output:"json",site:"FANZA",sort:"match",keyword:p})}`;try{let m=await o.request({providerId:"dmm",capability:"movie.preview",method:"GET",url:g,responseType:"json",urlPolicy:{trustClass:"builtin-public",hosts:Do}},t.scope);if(n=ad(m.data,s,p),c=!0,n.length)break}catch(m){l=m;break}}if(!n.length){if(!c&&l)throw l;return Object.freeze({sources:null,pageUrl:i,searchUrl:i,matchType:"none"})}let h=n.map(async p=>{let g=`https://www.dmm.co.jp/service/digitalapi/-/html5_player/=/cid=${encodeURIComponent(p.contentId)}/mtype=AhRVShI_/service=${encodeURIComponent(p.serviceCode)}/floor=${encodeURIComponent(p.floorCode)}/mode=/`,m=await o.request({providerId:"dmm",capability:"movie.preview",method:"GET",url:g,responseType:"text",headers:{"accept-language":"ja-JP,ja;q=0.9",Cookie:"age_check_done=1"},urlPolicy:{trustClass:"builtin-public",hosts:Do}},t.scope);return rd(m.data,m.finalUrl||g)}),u;try{u=await Promise.any(h)}catch(p){let g=p instanceof AggregateError?p.errors:[p];throw g.find(m=>m?.code==="REGION_BLOCKED")??g[0]??p}return Object.freeze({sources:u,pageUrl:n.length>1?i:n[0].pageUrl,searchUrl:i,matchType:n.length>1?"multiple":"single"})}})}d(Su,"createDmmAdapter");var id=W({id:"dmm",trustClass:"builtin-public",hosts:Do,capabilities:["movie.preview"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Su(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.preview":"none"},quality:"silver"});var nd=Object.freeze([Object.freeze({id:"javTrailersBtn",name:"javTrailers",settingKey:"javTrailersUrl",defaultBaseUrl:"https://javtrailers.com",itemSelector:".videos-list .video-link",textSelector:"p.card-text",hrefSelector:null,searchPath:d(o=>`/search/${o}`,"searchPath")}),Object.freeze({id:"jableBtn",name:"jable",settingKey:"jableUrl",defaultBaseUrl:"https://jable.tv",itemSelector:"#list_videos_videos_list_search_result .detail .title a",textSelector:null,hrefSelector:null,searchPath:d(o=>`/search/${o}/`,"searchPath")}),Object.freeze({id:"avgleBtn",name:"avgle",settingKey:"avgleUrl",defaultBaseUrl:"https://jav.rs",itemSelector:".text-secondary",textSelector:null,hrefSelector:null,searchPath:d(o=>`/vod/search.html?wd=${o}`,"searchPath")}),Object.freeze({id:"missAvBtn",name:"missAv",settingKey:"missAvUrl",defaultBaseUrl:"https://missav.live",itemSelector:".text-secondary",textSelector:null,hrefSelector:null,searchPath:d(o=>`/search/${o}`,"searchPath")}),Object.freeze({id:"supJavBtn",name:"supJav",settingKey:"supJavUrl",defaultBaseUrl:"https://supjav.com",itemSelector:".posts post",textSelector:null,hrefSelector:null,titleAttribute:!0,searchPath:d(o=>`/?s=${o}`,"searchPath")}),Object.freeze({id:"javDbBtn",name:"javDb",settingKey:"javDbUrl",defaultBaseUrl:"https://javdb.com",itemSelector:".movie-list .item",textSelector:".video-title",hrefSelector:"a",searchPath:d(o=>`/search?q=${o}`,"searchPath")}),Object.freeze({id:"javBusBtn",name:"javBus",settingKey:"javBusUrl",defaultBaseUrl:"https://www.javbus.com",itemSelector:".container h3",textSelector:null,hrefSelector:null,directDetail:!0,searchPath:d(o=>`/${o}`,"searchPath")})]);function od(o,e){let t=new URL(e[o.settingKey]||o.defaultBaseUrl).origin;return Object.freeze({id:o.id,name:o.name,baseUrl:t,searchUrl:d(s=>new URL(o.searchPath(encodeURIComponent(s)),`${t}/`).href,"searchUrl")})}d(od,"siteDefinition");function xu(o,e,t,s){if(typeof o!="string")throw new D("INVALID_RESPONSE","外部站点响应不是 HTML",{source:e.id});let a=new DOMParser().parseFromString(o,"text/html"),r=[];for(let i of a.querySelectorAll(e.itemSelector)){let n=e.textSelector?i.querySelector(e.textSelector):i;if((e.titleAttribute?i.getAttribute("title")||"":n?.textContent?.trim()||"").toLowerCase().includes(t.toLowerCase()))if(e.directDetail)r.push(new URL(`/${encodeURIComponent(t)}`,`${s}/`).href);else{let c=e.hrefSelector?i.querySelector(e.hrefSelector):i,h=c?.getAttribute("href");if(!h)throw new D("PARSE_ERROR","外部站点结果缺少链接",{source:e.id});r.push(new URL(h,`${s}/`).href)}}return Object.freeze([...new Set(r)])}d(xu,"parseExternalSiteResults");function ku(o){return Object.freeze({contracts:["ExternalSiteResult"],getSites(e={}){return Object.freeze(nd.map(t=>od(t,e)))},getNavigationLinks:d(()=>Object.freeze([Object.freeze({id:"theporndude",label:"ThePornDude",url:"https://theporndude.com/zh"})]),"getNavigationLinks"),async searchSite(e,t,s={}){let a=nd.find(u=>u.id===e);if(!a)throw new D("UNSUPPORTED",`未知外部站点:${e}`,{source:"external-sites"});let r=od(a,s.settings||{}),i=r.searchUrl(t),n=new URL(i),l=new URL(a.defaultBaseUrl).hostname.replace(/^www\./,""),c=n.hostname===l||n.hostname.endsWith(`.${l}`)?{trustClass:"builtin-public",hosts:[l],expectedOrigin:n.origin}:{trustClass:"custom-public",expectedOrigin:n.origin},h=await o.request({capability:"movie.external-sites",providerId:`external-site:${e}`,method:"GET",url:i,responseType:"text",urlPolicy:c},s.scope);return Object.freeze({searchUrl:i,matches:xu(h.data,a,t,r.baseUrl)})}})}d(ku,"createExternalSitesAdapter");var ld=W({id:"external-sites",trustClass:"builtin-public",hosts:["javtrailers.com","jable.tv","jav.rs","missav.live","supjav.com","javdb.com","javbus.com","theporndude.com"],capabilities:["movie.external-sites","navigation.external"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>ku(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.external-sites":"public-1d","navigation.external":"none"},quality:"silver"});function cd(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelector=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelector=="function")return e;throw new TypeError("FC2PPVDB detail document is invalid")}d(cd,"resolveDocument");function dd(o,e){let t=new URL(e).pathname.match(/(?:articles?|videos?)\/(\d+)/i)?.[1],s=ee(t?`FC2-${t}`:""),a=cd(o).querySelector("h1")?.textContent?.trim()??"";if(!s||!a)throw new TypeError("FC2PPVDB detail is malformed");return Wt({carNum:s,title:a,url:new URL(e).href})}d(dd,"parseFc2PpvDbDetail");function hd(o,e){let t=cd(o),s=new URL(e),a=[...t.querySelectorAll("div")],r=a.find(h=>h.textContent?.trim().startsWith("女優:")),i=a.find(h=>h.textContent?.trim().startsWith("販売者:")),n=[...r?.querySelectorAll("a[href]")??[]].map(h=>Object.freeze({name:h.textContent?.trim()||"",url:new URL(h.getAttribute("href")||"",s).href})).filter(h=>h.name),l=i?.querySelector("a[href]"),c=l?Object.freeze({name:l.textContent?.trim()||"",url:new URL(l.getAttribute("href")||"",s).href}):null;return Object.freeze({actors:Object.freeze(n),seller:c})}d(hd,"parseFc2PpvDbPeople");function Cu(o){let e=d(s=>{let a=String(s.carNum||"").match(/^(?:FC2-)?(?:PPV-)?(\d+)$/i)?.[1];if(!a)throw new TypeError("FC2PPVDB movie identifier is invalid");return new URL(s.url||`https://fc2ppvdb.com/articles/${a}`)},"resolveUrl"),t=d((s,a,r="movie.detail")=>o.request({capability:r,providerId:"fc2ppvdb",method:"GET",url:s.href,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["fc2ppvdb.com"]}},a),"request");return Object.freeze({contracts:["MovieDetail","MovieCredits"],detailUrl(s){return e(s).href},async getDetail(s,a={}){let r=e(s),i=await t(r,a.scope,"movie.detail");return dd(i.data,i.finalUrl||r.href)},async getPeople(s,a={}){let r=e(s),i=await t(r,a.scope,"movie.credits");return hd(i.data,i.finalUrl||r.href)}})}d(Cu,"createFc2PpvDbAdapter");var ud=W({id:"fc2ppvdb",trustClass:"builtin-public",hosts:["fc2ppvdb.com"],capabilities:["movie.detail","movie.credits"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Cu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.detail":ke.externalDetail,"movie.credits":ke.externalDetail},quality:"silver"});function pd(o,e){let t=new DOMParser().parseFromString(o,"text/html"),s=new Set;for(let a of t.querySelectorAll(".items_article_SampleImagesArea img[src]")){let r=new URL(a.getAttribute("src")||"",e);r.protocol==="https:"&&s.add(r.href)}return Object.freeze([...s].map(a=>Object.freeze({url:a,providerId:"fc2content"})))}d(pd,"parseFc2ContentImages");function _u(o){return Object.freeze({contracts:["Screenshot"],detailUrl(e){let t=String(e.carNum||"").match(/^(?:FC2-)?(?:PPV-)?(\d+)$/i)?.[1];return t?`https://adult.contents.fc2.com/article/${t}/`:null},async getImages(e,t={}){let s=String(e.carNum||"").match(/^(?:FC2-)?(?:PPV-)?(\d+)$/i)?.[1];if(!s)return[];let a=`https://adult.contents.fc2.com/article/${s}/`,r=await o.request({providerId:"fc2content",capability:"movie.images",method:"GET",url:a,responseType:"text",headers:{referer:a},urlPolicy:{trustClass:"builtin-public",hosts:["adult.contents.fc2.com"]}},t.scope);return pd(r.data,r.finalUrl||a)}})}d(_u,"createFc2ContentAdapter");var gd=W({id:"fc2content",trustClass:"builtin-public",hosts:["adult.contents.fc2.com"],capabilities:["movie.images"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>_u(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.images":ke.externalDetail},quality:"silver"});function md(o){if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("Translation response is invalid");let e=o.translation;if(typeof e!="string"||!e.trim())throw new TypeError("Translation text is missing");return e}d(md,"parseGoogleTranslation");var $u="https://translate-pa.googleapis.com/v1/translate";function Tu(o){return Object.freeze({contracts:["Translation"],async translate(e,t={}){if(!String(e||"").trim())throw new TypeError("Translation text cannot be empty");let s=new URL($u);s.search=new URLSearchParams({"params.client":"gtx",dataTypes:"TRANSLATION",key:"AIzaSyDLEeFI5OtFBwYBIoK_jj5m32rZK5CkCXA","query.sourceLanguage":t.sourceLanguage??"ja","query.targetLanguage":t.targetLanguage??"zh-CN","query.text":e}).toString();let a=await o.request({providerId:"google-translate",capability:"text.translate",method:"GET",url:s.href,responseType:"json",transport:"native-fetch",nativeTimeout:1500,timeout:5e3,urlPolicy:{trustClass:"builtin-public",hosts:["translate-pa.googleapis.com"]}},t.scope);return md(a.data)}})}d(Tu,"createGoogleTranslateAdapter");var fd=W({id:"google-translate",trustClass:"builtin-public",hosts:["translate-pa.googleapis.com"],capabilities:["text.translate"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Tu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"text.translate":"none"},quality:"silver"});var No=Object.freeze([Object.freeze({id:"jsdelivr",name:"jsDelivr (全球CDN)",catalogUrl:"https://cdn.jsdelivr.net/gh/gfriends/gfriends/Filetree.json",contentBaseUrl:"https://cdn.jsdelivr.net/gh/gfriends/gfriends/Content/",recommended:!0}),Object.freeze({id:"github-raw",name:"GitHub Raw (备用)",catalogUrl:"https://raw.githubusercontent.com/gfriends/gfriends/master/Filetree.json",contentBaseUrl:"https://raw.githubusercontent.com/gfriends/gfriends/master/Content/",recommended:!1})]);function Au(o,e){let t=o?.Content;if(!t||typeof t!="object"||Array.isArray(t))throw new D("INVALID_RESPONSE","头像数据源缺少 Content",{source:"gfriends"});let s=new Map;for(let[a,r]of Object.entries(t))if(!(!r||typeof r!="object"||Array.isArray(r)))for(let[i,n]of Object.entries(r)){if(typeof n!="string")continue;let l=i.replace(/\.jpg$/i,"").split("-")[0];if(l.startsWith("AI-Fix-")&&(l=l.slice(7)),l=l.toLowerCase().trim(),!l)continue;let c=n.indexOf("?"),h=c>=0?n.slice(0,c):n,u=c>=0?n.slice(c):"",p=`${e}${encodeURIComponent(a)}/${encodeURIComponent(h)}${u}`,g=s.get(l)||[];g.includes(p)||g.push(p),s.set(l,g)}return s}d(Au,"parseGfriendsCatalog");function Pu(o){return Object.freeze({contracts:["ActorAvatar"],getSources:d(()=>Object.freeze(No.map(e=>Object.freeze({id:e.id,name:e.name,recommended:e.recommended}))),"getSources"),async searchAvatars(e,t={}){let s=No.find(n=>n.id===(t.sourceId||No[0].id));if(!s)throw new D("UNSUPPORTED",`未知头像数据源:${t.sourceId}`,{source:"gfriends"});let a=await o.request({providerId:`gfriends:${s.id}`,capability:"person.avatar-search",method:"GET",url:s.catalogUrl,responseType:"json",timeout:2e4,urlPolicy:{trustClass:"builtin-public",hosts:[new URL(s.catalogUrl).hostname]}},t.scope),r=Au(a.data,s.contentBaseUrl),i=new Set;return e.map(n=>String(n).toLowerCase().trim()).filter(Boolean).forEach(n=>r.get(n)?.forEach(l=>i.add(l))),Object.freeze([...i])}})}d(Pu,"createGfriendsAdapter");var vd=W({id:"gfriends",trustClass:"builtin-public",hosts:["cdn.jsdelivr.net","raw.githubusercontent.com"],capabilities:["person.avatar-search"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Pu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"person.avatar-search":"public-7d"},quality:"silver"});var bd=W({id:"host-list",trustClass:"builtin-public",hosts:["javdb.com","javbus.com"],capabilities:["host.list.parse"],requires:[],createClient:d(()=>Object.freeze({id:"host-list"}),"createClient"),createAdapter:d(()=>Object.freeze({contracts:["MovieRef"]}),"createAdapter"),createHostAdapter:null,cachePolicy:"none",quality:"bronze"});var Ru="https://api.imgur.com/3/image",Iu="d70305e7c3ac5c6",Eu=Object.freeze({trustClass:"builtin-public",hosts:["imgur.com","google.com","yandex.ru"]}),Du=Object.freeze([Object.freeze({id:"google-legacy",name:"Google旧版",urlTemplate:"https://www.google.com/searchbyimage?image_url={imageUrl}&client=firefox-b-d",iconUrl:"https://www.google.com/favicon.ico"}),Object.freeze({id:"google-lens",name:"Google",urlTemplate:"https://lens.google.com/uploadbyurl?url={imageUrl}",iconUrl:"https://www.google.com/favicon.ico"}),Object.freeze({id:"yandex",name:"Yandex",urlTemplate:"https://yandex.ru/images/search?rpt=imageview&url={imageUrl}",iconUrl:"https://yandex.ru/favicon.ico"})]);function Nu(o){let e=o;if(typeof e=="string")try{e=JSON.parse(e)}catch(s){throw new D("INVALID_RESPONSE","Imgur 返回了无效 JSON",{source:"image-search",cause:s})}let t=e;if(t?.success&&typeof t?.data?.link=="string"&&/^https:\/\//i.test(t.data.link))return t.data.link;throw new D("INVALID_RESPONSE",String(t?.data?.error||"Imgur 上传响应无效"),{source:"image-search"})}d(Nu,"parseImgurUpload");function Lu(o){let e=o.match(/^data:(image\/[a-z0-9.+-]+);base64,([a-z0-9+/=\s]+)$/i);if(!e)throw new D("INVALID_RESPONSE","无效的 Base64 图片数据",{source:"image-search"});let t=atob(e[2].replace(/\s/g,"")),s=new Uint8Array(t.length);for(let r=0;rObject.freeze({id:s.id,name:s.name,url:s.urlTemplate.replace("{imageUrl}",t),iconUrl:s.iconUrl})))}})}d(Mu,"createImageSearchAdapter");var wd=W({id:"image-search",trustClass:"builtin-public",hosts:["imgur.com","google.com","yandex.ru"],capabilities:["image.upload","image.search-targets"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Mu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"image.upload":"none","image.search-targets":"none"},quality:"silver"});var yd=0,Ur="";function Lo(){let o=Math.floor(Date.now()/1e3);if(Ur&&o-yd<=20)return Ur;let e=globalThis.md5;if(typeof e!="function")throw new Error("Missing userscript vendor runtime: md5");return yd=o,Ur=`${o}.lpw6vgqzsp.${e(`${o}71cf27bb3c0bcdf207b64abecddc970098c7421ee7203b9cdae54478478a199e7d5a6e1a57691123c1a931c057842fb73ba3b3c83bcd69c17ccf174081e3d8aa`)}`,Ur}d(Lo,"createJavDbSignature");var jd="https://jdforrepam.com";function Bu(o,e=Lo,t=null){let s=d(r=>{let i=new URL(r).origin,n=new URL(r).hostname;return n==="javdb.com"||n.endsWith(".javdb.com")?{trustClass:"builtin-public",hosts:["javdb.com"],expectedOrigin:i}:{trustClass:"custom-public",expectedOrigin:i}},"hostPolicy"),a=d(async(r,i,n={},l={},c="movie.detail")=>{let h=new URL(r,jd);return Object.entries(i).forEach(([p,g])=>h.searchParams.set(p,String(g))),(await o.request({providerId:"javdb",capability:c,method:"GET",url:h.href,responseType:"json",headers:{jdSignature:e(),...l},urlPolicy:{trustClass:"builtin-public",hosts:["jdforrepam.com"]}},n.scope)).data},"request");return Object.freeze({contracts:["MovieRef","MovieDetail","Actor","Magnet","Review","RelatedList","AccountSession"],actorPlaceholderUrl:d(()=>"https://c0.jdbstatic.com/images/actor_unknow.jpg","actorPlaceholderUrl"),async login(r,i={}){let n=new URL("/api/v1/sessions",jd);Object.entries({username:r.username,password:r.password,device_uuid:"04b9534d-5118-53de-9f87-2ddded77111e",device_name:"iPhone",device_model:"iPhone",platform:"ios",system_version:"17.4",app_version:"official",app_version_number:"1.9.29",app_channel:"official"}).forEach(([h,u])=>n.searchParams.set(h,u));let c=(await o.request({providerId:"javdb",capability:"account.login",method:"POST",url:n.href,responseType:"json",headers:{"user-agent":"Dart/3.5 (dart:io)","accept-language":"zh-TW","content-type":"multipart/form-data; boundary=--dio-boundary-2210433284",jdsignature:e()},urlPolicy:{trustClass:"builtin-public",hosts:["jdforrepam.com"]}},i.scope)).data;if(c?.success===0)return Object.freeze({success:!1,token:null,message:String(c.message||"登录失败")});if(c?.success!==1||typeof c?.data?.token!="string")throw new D("INVALID_RESPONSE",String(c?.message||"JavDB 登录响应无效"),{source:"javdb"});return Object.freeze({success:!0,token:c.data.token,message:String(c.message||"")})},async listActorMovies(r,i={}){let n=new URL(r.baseUrl||"https://javdb.com").origin,l=new URL(`/actors/${encodeURIComponent(r.actorId)}?t=d`,n),c=await o.request({providerId:"javdb-host",capability:"actor.movies",method:"GET",url:l.href,responseType:"text",urlPolicy:s(n)},i.scope);if(typeof t?.parseActorMovies!="function")throw new TypeError("JavDB HostAdapter parser is unavailable");return t.parseActorMovies(c.data,c.finalUrl||l.href)},async listActorCollection(r,i={}){let n=new URL(r.baseUrl||"https://javdb.com").origin,l=new URL(r.pageUrl||"/users/collection_actors",n),c=await o.request({providerId:"javdb-host",capability:"actor.collection",method:"GET",url:l.href,responseType:"text",urlPolicy:s(n)},i.scope);if(typeof t?.parseActorCollection!="function")throw new TypeError("JavDB HostAdapter collection parser is unavailable");return t.parseActorCollection(c.data,c.finalUrl||l.href)},async uncollectActor(r,i={}){let n=new URL(r.baseUrl||"https://javdb.com").origin,l=new URL(`/actors/${encodeURIComponent(r.actorId)}/uncollect`,n),c=await o.request({providerId:"javdb-host",capability:"actor.uncollect",method:"POST",url:l.href,body:"null",responseType:"text",headers:{"Content-Type":"application/json","x-csrf-token":r.csrfToken},urlPolicy:s(n)},i.scope);return Object.freeze({success:typeof c.data=="string"&&c.data.includes("removeClass")})},async resolveMovie(r,i={}){let n=ee(r.carNum);if(!n)return null;let l=await a("/api/v2/search",{q:n,page:1,type:"movie",limit:20,movie_type:"all",from_recent:"false",movie_filter_by:"all",movie_sort_by:"relevance"},i,{"user-agent":"Dart/3.5 (dart:io)","accept-language":"zh-TW",host:"jdforrepam.com"},"movie.search");if(!Array.isArray(l?.data?.movies))throw new Error(l?.message||"JavDB search response is invalid");let c=l.data.movies.find(h=>ee(h.number)===n);return c?.id?Object.freeze({carNum:n,movieId:String(c.id),providerId:"javdb"}):null},async getDetail(r,i={}){let n=String(r.movieId||"").trim();if(!n)throw new TypeError("JavDB movie id is required");let l=await a(`/api/v4/movies/${encodeURIComponent(n)}`,{},i,{},"movie.detail"),c=l?.data?.movie;if(!c?.number)throw new Error(l?.message||"JavDB detail response is invalid");let h=Array.isArray(c.preview_images)?c.preview_images.map(p=>String(p.large_url||"").replace(/https:\/\/[^/]+\/rhe951l4q/,"https://c0.jdbstatic.com")).filter(Boolean):[],u=c.cover_url?String(c.cover_url).replace(/https:\/\/[^/]+\/rhe951l4q/,"https://c0.jdbstatic.com"):"";return Object.freeze({movieId:String(c.id||n),carNum:ee(c.number),title:String(c.title||c.origin_title||""),originalTitle:String(c.origin_title||c.title||""),coverUrl:u||null,actors:Array.isArray(c.actors)?c.actors.map(p=>Object.freeze({id:String(p.id),name:String(p.name||""),gender:Number(p.gender)})):[],duration:Number(c.duration)||null,score:Number(c.score)||0,releaseDate:c.release_date||null,watchedCount:Number(c.watched_count)||0,imageUrls:Object.freeze(h),providerId:"javdb"})},async listMagnets(r,i={}){let n=String(r.movieId||"").trim();if(!n)return[];let l=await a(`/api/v1/movies/${encodeURIComponent(n)}/magnets`,{},i,{},"movie.magnets");if(!Array.isArray(l?.data?.magnets))throw new Error(l?.message||"JavDB magnet response is invalid");return l.data.magnets.map(c=>Object.freeze({hash:String(c.hash||""),title:String(c.name||""),hasHdTag:!!c.hd,hasSubtitleTag:!!c.cnsub,createdAt:c.created_at||null,seeders:Number(c.seeders)||0,sizeMb:Number(c.size)||0,fileCount:Number(c.files_count)||0,providerId:"javdb"}))},async listRankings(r={}){let i=await a("/api/v1/rankings/playback",{period:r.period||"daily",filter_by:r.filter||"high_score"},r,{},"movie.ranking");if(!Array.isArray(i?.data?.movies))throw new Error(i?.message||"JavDB ranking response is invalid");return i.data.movies.map(n=>Object.freeze({movieId:String(n.id),carNum:ee(n.number),title:String(n.origin_title||""),coverUrl:String(n.cover_url||"").replace(/https:\/\/[^/]+\/rhe951l4q/,"https://c0.jdbstatic.com"),releaseDate:n.release_date||null,hasSubtitle:!!n.has_cnsub,magnetCount:Number(n.magnets_count)||0,newMagnets:!!n.new_magnets,providerId:"javdb"}))},async listReviews(r,i={}){let n=String(r.movieId||"").trim();if(!n)return[];let l=await a(`/api/v1/movies/${encodeURIComponent(n)}/reviews`,{page:i.page??1,sort_by:"hotly",limit:i.limit??20},i,{},"movie.reviews");if(!Array.isArray(l?.data?.reviews))throw new Error(l?.message||"JavDB review response is invalid");return l.data.reviews.map(c=>Object.freeze({author:String(c.username||"匿名用户"),content:String(c.content||""),score:Number(c.score)||0,createdAt:c.created_at||null,likes:Number(c.likes_count)||0}))},async listRelated(r,i={}){let n=String(r.movieId||"").trim();if(!n)return[];let l=await a("/api/v1/lists/related",{movie_id:n,page:i.page??1,limit:i.limit??20},i,{},"movie.related");if(!Array.isArray(l?.data?.lists))throw new Error(l?.message||"JavDB related response is invalid");return l.data.lists.map(c=>Object.freeze({id:String(c.id),name:String(c.name||"未命名清单"),movieCount:Number(c.movies_count)||0,collectionCount:Number(c.collections_count)||0,viewCount:Number(c.views_count)||0,createdAt:c.created_at||null}))}})}d(Bu,"createJavDbAdapter");var Sd=W({id:"javdb",trustClass:"builtin-public",hosts:["javdb.com","jdforrepam.com","c0.jdbstatic.com"],capabilities:["movie.search","movie.detail","movie.magnets","movie.ranking","movie.state","movie.reviews","movie.related","actor.lookup","actor.movies","actor.collection","actor.uncollect","actor.avatar-placeholder","account.login"],requires:[y.http,Y.javdbHost],createClient:d(o=>Object.freeze({http:o[y.http],hostAdapter:o[Y.javdbHost]}),"createClient"),createAdapter:d(o=>Bu(o.http,Lo,o.hostAdapter),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.search":"public-7d","movie.detail":ke.externalDetail,"movie.magnets":"public-1d","movie.ranking":"public-1d","movie.state":"none","movie.reviews":"public-1d","movie.related":"public-1d","actor.lookup":"none","actor.movies":"public-5m","actor.collection":"none","actor.uncollect":"none","actor.avatar-placeholder":"none","account.login":"none"},quality:"silver"});function xd(o){if(typeof o=="string")return new DOMParser().parseFromString(o,"text/html");if(typeof o?.querySelector=="function")return o;let e=o?.[0]??o?.get?.(0);if(typeof e?.querySelector=="function")return e;throw new TypeError("JavBus document is invalid")}d(xd,"resolveDocument");function Ou(o,e){if(typeof o?.find=="function")return ee(o.find("span.header:contains('識別碼:')").parent().text().replace("識別碼:",""))??ee(new URL(e).pathname.split("/").filter(Boolean).pop());let s=[...xd(o).querySelectorAll("span.header")].find(a=>a.textContent?.includes("識別碼"));return ee(s?.parentElement?.textContent?.replace("識別碼:",""))??ee(new URL(e).pathname.split("/").filter(Boolean).pop())}d(Ou,"readMovieRef");function Uu(o,e){let t=Ou(o,e);if(!t)throw new TypeError("JavBus movie identifier is missing");return Br({carNum:t,url:new URL(e).href})}d(Uu,"parseJavBusMovieRef");function kd(o,e){let t=Uu(o,e),s=typeof o?.find=="function"?null:xd(o),a=s?s.querySelector("h3")?.textContent?.trim()||t.carNum:o.find("h3").first().text().trim()||t.carNum,r=s?s.querySelector(".bigImage img[src], a.bigImage img[src]")?.getAttribute("src"):o.find(".bigImage img[src], a.bigImage img[src]").first().attr("src");return Wt({...t,title:a,coverUrl:r?new URL(r,e).href:null,providerId:"javbus"})}d(kd,"parseJavBusMovieDetail");function zu(o){return Object.freeze({contracts:["MovieDetail","Screenshot"],async getDetail(e,t={}){let s=ee(e.carNum);if(!s)throw new TypeError("JavBus movie reference is invalid");let a=new URL(e.url||`https://www.javbus.com/${encodeURIComponent(s)}`).href,r=await o.request({providerId:"javbus",capability:"movie.detail",method:"GET",url:a,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["javbus.com"]}},t.scope);return kd(r.data,r.finalUrl||a)},async getImages(e,t={}){let s=await this.getDetail(e,t);return s.coverUrl?[Object.freeze({url:s.coverUrl,providerId:"javbus"})]:[]}})}d(zu,"createJavBusAdapter");var Cd=W({id:"javbus",trustClass:"builtin-public",hosts:["javbus.com"],capabilities:["movie.detail","movie.images"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>zu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.detail":ke.externalDetail,"movie.images":ke.externalDetail},quality:"silver"});function Fu(o){let e=d((t,s)=>o.request({providerId:"javstore",capability:"movie.images",method:"GET",url:t,responseType:"text",urlPolicy:{trustClass:"builtin-public",hosts:["javstore.net"]}},s),"request");return Object.freeze({contracts:["Screenshot"],getSearchUrl(t){return`https://javstore.net/search?q=${encodeURIComponent(t.carNum||"")}`},async getImages(t,s={}){let a=this.getSearchUrl(t),r=await e(a,s.scope),i=Mc(r.data,t.carNum,r.finalUrl||a);if(!i.length)return[];for(let n of i)try{let l=await e(n,s.scope),c=Bc(l.data,l.finalUrl||n);if(c)return[Object.freeze({url:c,providerId:"javstore"})]}catch(l){if(!(l&&typeof l=="object"&&"code"in l&&l.code==="NOT_FOUND"))throw l}return[]}})}d(Fu,"createJavStoreAdapter");var _d=W({id:"javstore",trustClass:"builtin-public",hosts:["javstore.net"],capabilities:["movie.images"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Fu(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"movie.images":"screenshot-7d"},quality:"silver"});var $d=W({id:"javtrailers",trustClass:"builtin-public",hosts:["javtrailers.com"],capabilities:["movie.preview"],requires:[Y.http,y.urlPolicy],createClient:d(()=>Object.freeze({id:"javtrailers"}),"createClient"),createAdapter:d(()=>Object.freeze({contracts:["MoviePreview"]}),"createAdapter"),createHostAdapter:null,cachePolicy:"none",quality:"bronze"});var Vu="https://115.com",qu=Object.freeze({trustClass:"builtin-public",hosts:["115.com"]});function Hu(o){if(typeof o!="string")return o;try{return JSON.parse(o)}catch{return{state:!1,error_msg:/login|登录|sign in|未授权|授权|expire|expired|token|cookie/i.test(o)?"115 未登录":"115 返回异常响应"}}}d(Hu,"parsePayload");function Wu(o){let e=String(o).toLowerCase();return/未登录|请登录|登录|login|sign|授权|过期|token|cookie|uid|身份|auth|expire|needlogin|need login/i.test(e)?"AUTH_REQUIRED":/已存在|重复|exists|duplicate|already|same|conflict|exist/i.test(e)?"TASK_EXISTS":"OPERATION_FAILED"}d(Wu,"classify115OfflineError");function Ju(o){let e=o;if(!e||!Array.isArray(e.data))throw new D("INVALID_RESPONSE","115 文件搜索响应无效",{source:"one115"});return Object.freeze(e.data.map(t=>{let s=String(t.n||t.file_name||"");return Object.freeze({folderId:String(t.pid||t.cid||""),fileId:t.fid?String(t.fid):null,videoId:String(t.pc||t.pick_code||""),name:s,size:Number(t.s||t.size)||0,createTime:String(t.t||t.create_time||""),isVideo:/\.(mp4|mkv|avi|mov|flv|wmv|ts|m2ts)$/i.test(s)})}).filter(t=>t.isVideo))}d(Ju,"normalize115SearchResults");function Ku(o){let e=d((t,s={})=>o.request({providerId:"one115",capability:s.capability||"account.status",method:s.method||"GET",url:t,body:s.body,headers:s.headers,responseType:s.responseType||"json",urlPolicy:qu},s.scope),"request");return Object.freeze({contracts:["AccountStatus","CloudFile","OfflineSubmission"],homeUrl:Vu,async checkAccount(t={}){let a=(await e("https://webapi.115.com/offine/downpath",{capability:"account.status",scope:t.scope})).data;return Object.freeze({authenticated:!!(a?.state&&a?.data?.length)})},async searchFiles(t,s={}){let a=new URL("https://webapi.115.com/files/search");a.searchParams.set("search_value",t),a.searchParams.set("offset",String(s.offset??0)),a.searchParams.set("limit",String(s.limit??50));let r=await e(a.href,{capability:"file.search",scope:s.scope,force:s.force});return Ju(r.data)},async submit(t,s={}){if(!/^magnet:/i.test(t)&&!/^ed2k:/i.test(t))throw new D("UNSUPPORTED","Unsupported offline URL",{source:"one115"});let r=(await e(`https://115.com/?ct=offline&ac=space&_=${Date.now()}`,{capability:"offline.submit",scope:s.scope})).data;if(!r?.sign)throw new D("AUTH_REQUIRED","115 未登录或离线空间信息获取失败",{source:"one115"});let i=new URLSearchParams({url:t,wp_path_id:s.folderId||"",uid:String(r.uid||""),sign:r.sign,time:String(r.time||"")}).toString(),n=await e("https://115.com/web/lixian/?ct=lixian&ac=add_task_url",{capability:"offline.submit",scope:s.scope,method:"POST",body:i,responseType:"text",headers:{"Content-Type":"application/x-www-form-urlencoded"}}),l=Hu(n.data);if(!l||l.state===!1||l.state===0){let c=String(l?.error_msg||l?.error||l?.msg||"115 离线任务创建失败"),h=Wu(c);throw new D(h,c,{source:"one115",details:{state:l?.state??null}})}if(l.state!==!0&&l.state!==1)throw new D("INVALID_RESPONSE","115 未返回明确的离线任务创建成功状态",{source:"one115"});return Object.freeze({success:!0,taskId:String(l.task_id||l.info_hash||"")})},async renameFile(t,s,a={}){let r=new URLSearchParams({fid:t,file_name:s}).toString(),n=(await e("https://webapi.115.com/files/edit",{capability:"file.rename",scope:a.scope,method:"POST",body:r,responseType:"json",headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;if(!n||n.state===!1||n.state===0)throw new D("OPERATION_FAILED",String(n?.error||n?.error_msg||"115 重命名失败"),{source:"one115"});return Object.freeze({success:!0})},getPlayUrl(t){return t?.videoId?`https://115.com/?ct=play&pickcode=${encodeURIComponent(t.videoId)}`:null}})}d(Ku,"createOne115Adapter");var Td=W({id:"one115",trustClass:"builtin-public",hosts:["115.com"],capabilities:["account.status","file.search","file.rename","offline.submit"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>Ku(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"account.status":"none","file.search":"none","file.rename":"none","offline.submit":"none"},quality:"silver"});var Gu=Object.freeze({trustClass:"builtin-public",hosts:["123pan.com"]});function Ad(o){let e=new Uint32Array(256);for(let s=0;s<256;s+=1){let a=s;for(let r=0;r<8;r+=1)a=a&1?3988292384^a>>>1:a>>>1;e[s]=a}let t=4294967295;for(let s=0;s>>8;return(t^4294967295)>>>0}d(Ad,"crc32");function Qu(){let o=new Uint32Array(1);return crypto.getRandomValues(o),o[0]%1e7}d(Qu,"secureNonce");function Yu(o,e={}){let t=["a","d","e","f","g","h","l","m","y","i","j","n","o","p","k","q","r","s","t","u","b","c","v","w","s","z"],s=e.nonce??Qu(),a=e.now??new Date,r=new Date(a.getTime()+6e4*a.getTimezoneOffset()+288e5),n=[...`${r.getFullYear()}${String(r.getMonth()+1).padStart(2,"0")}${String(r.getDate()).padStart(2,"0")}${String(r.getHours()).padStart(2,"0")}${String(r.getMinutes()).padStart(2,"0")}`].map(p=>t[Number(p)]).join(""),l=Ad(n),c=Math.floor(r.getTime()/1e3),h=new URL(o),u=Ad(`${c}|${s}|${h.pathname}|web|3|${l}`);return h.searchParams.set(String(l),`${c}-${s}-${u}`),h.href}d(Yu,"signPan123Url");function Pd(o){if(typeof o!="string")return o;try{return JSON.parse(o)}catch(e){throw new D("PARSE_ERROR","123 云盘响应不是有效 JSON",{source:"pan123",cause:e})}}d(Pd,"parsePayload");function Rd(o,e){if(!o||typeof o!="object")throw new D("INVALID_RESPONSE",`123 云盘${e}响应无效`,{source:"pan123"});if(o.code===0)return o;let t=String(o.message||o.msg||`${e}失败`);throw/token is expired|unauthorized|登录|授权/i.test(t)?new D("AUTH_REQUIRED",t,{source:"pan123"}):new D("INVALID_RESPONSE",t,{source:"pan123"})}d(Rd,"assertSuccess");function Zu(o,e={}){let t=d(async(s,a,r,i,n)=>{let l=Yu(`https://yun.123pan.com${s}`,{now:e.now?.(),nonce:e.nonce?.()});return o.request({providerId:"pan123",capability:n,method:"POST",url:l,body:JSON.stringify(a),responseType:"json",timeout:e.getTimeout?.()??5e3,headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`,"App-Version":"3",platform:"web",Origin:"https://yun.123pan.com",Referer:"https://yun.123pan.com/"},urlPolicy:Gu},i)},"request");return Object.freeze({contracts:["OfflineResolvedResource","OfflineSubmission"],homeUrl:"https://yun.123pan.com",async resolve(s,a={}){let{token:r,scope:i}=a;if(!r)throw new D("AUTH_REQUIRED","尚未同步 123 授权",{source:"pan123"});let n=await t("/b/api/v2/offline_download/task/resolve",{urls:s},r,i,"offline.resolve"),l=Rd(Pd(n.data),"解析"),c=l.data?.list?.[0];if(!c?.id||!Array.isArray(c.files))throw new D("INVALID_RESPONSE","123 云盘解析结果缺少资源文件",{source:"pan123"});return Object.freeze({id:c.id,files:Object.freeze(c.files.map(h=>Object.freeze({id:h.id,size:Number(h.size||0)})))})},async submitResolved(s,a={}){let{token:r,scope:i}=a;if(!r)throw new D("AUTH_REQUIRED","尚未同步 123 授权",{source:"pan123"});if(!s?.id||!Array.isArray(s.files)||s.files.length===0)throw new D("INVALID_RESPONSE","没有可建立离线的文件",{source:"pan123"});let n=s.files.map(h=>h.id),l=s.files.reduce((h,u)=>h+Number(u.size||0),0),c=await t("/b/api/v2/offline_download/task/submit",{resource_list:[{resource_id:s.id,select_file_id:n}]},r,i,"offline.submit");return Rd(Pd(c.data),"提交"),Object.freeze({fileCount:n.length,totalSize:l})},async submit(s,a={}){let r=await this.resolve(s,a);return this.submitResolved(r,a)}})}d(Zu,"createPan123Adapter");var Id=W({id:"pan123",trustClass:"builtin-public",hosts:["123pan.com"],capabilities:["offline.resolve","offline.submit"],requires:[y.http,y.settings],createClient:d(o=>Object.freeze({http:o[y.http],settings:o[y.settings]}),"createClient"),createAdapter:d(o=>Zu(o.http,{getTimeout:d(()=>Number(o.settings.snapshot().httpTimeout??5e3),"getTimeout")}),"createAdapter"),createHostAdapter:null,cachePolicy:{"offline.resolve":"none","offline.submit":"none"},quality:"silver"});function Xu(){return Object.freeze({contracts:["Subtitle"],detailUrl(o){let e=String(o?.carNum||"").trim();if(!e)return null;let t=new URL("/index.php","https://subtitlecat.com");return t.searchParams.set("search",e),t.href}})}d(Xu,"createSubtitleCatAdapter");var Ed=W({id:"subtitlecat",trustClass:"builtin-public",hosts:["subtitlecat.com"],capabilities:["subtitle.search"],requires:[],createClient:d(()=>Object.freeze({id:"subtitlecat"}),"createClient"),createAdapter:d(()=>Xu(),"createAdapter"),createHostAdapter:null,cachePolicy:"none",quality:"bronze"});var Dd=Object.freeze([Object.freeze({id:"u9a9",name:"U9A9",type:"网页来源",domain:"u9a9.com",baseUrl:"https://u9a9.com",priority:20,enabled:!0,searchPath:d(o=>`/?type=2&search=${encodeURIComponent(o)}`,"searchPath")}),Object.freeze({id:"u3c3",name:"U3C3",type:"网页来源",domain:"u3c3.com",baseUrl:"https://u3c3.com",priority:30,enabled:!0,searchPath:d(o=>`/?search2=a8lr16lo&search=${encodeURIComponent(o)}`,"searchPath")}),Object.freeze({id:"sukebei",name:"Sukebei",type:"网页来源",domain:"sukebei.nyaa.si",baseUrl:"https://sukebei.nyaa.si",priority:40,enabled:!0,searchPath:d(o=>`/?f=0&c=0_0&q=${encodeURIComponent(o)}`,"searchPath")}),Object.freeze({id:"btsow",name:"BTSOW",type:"API 来源",domain:"btsow.lol",baseUrl:"https://btsow.lol",priority:50,enabled:!0,searchPath:d(o=>`/search/${encodeURIComponent(o)}`,"searchPath")})]);function Nd(o,e){let t=o,s=String(t?.magnet||"");return s.startsWith("magnet:")?Object.freeze({title:String(t.title||""),magnet:s,size:String(t.size||""),date:String(t.date||""),seeders:Number(t.seeders)||0,leechers:Number(t.leechers)||0,source:e,files:Object.freeze([])}):null}d(Nd,"normalizeMagnet");function ep(o,e,t){if(typeof o!="string")throw new D("INVALID_RESPONSE","磁力来源响应不是 HTML",{source:t});let s=new DOMParser().parseFromString(o,"text/html"),a=`${s.title} ${s.body?.textContent||""}`;if(/Just a moment|cf-chl-|Cloudflare/i.test(a))throw new D("CF_BLOCKED","磁力来源被 Cloudflare 拦截",{source:t});return Object.freeze([...s.querySelectorAll(".torrent-list tbody tr")].flatMap(r=>{if(r.textContent?.includes("置顶"))return[];let i=r.querySelector("td:nth-child(2) a"),n=i?.getAttribute("title")||i?.textContent?.trim()||"";if(!n.toLowerCase().includes(e.toLowerCase()))return[];let l=Nd({title:n,magnet:r.querySelector('td:nth-child(3) a[href^="magnet:"]')?.getAttribute("href"),size:r.querySelector("td:nth-child(4)")?.textContent?.trim(),date:r.querySelector("td:nth-child(5)")?.textContent?.trim(),seeders:r.querySelector("td:nth-child(6)")?.textContent?.trim(),leechers:r.querySelector("td:nth-child(7)")?.textContent?.trim()},t);return l?[l]:[]}))}d(ep,"parseTorrentSource");function tp(o){let e=o;if(typeof e=="string")try{e=JSON.parse(e)}catch(s){throw new D("INVALID_RESPONSE","BTSOW 返回了无效 JSON",{source:"btsow",cause:s})}let t=e?.data;if(!Array.isArray(t))throw new D("INVALID_RESPONSE","BTSOW 响应缺少结果数组",{source:"btsow"});return Object.freeze(t.flatMap(s=>{let a=Number(s.lastUpdateTime),r=Number.isFinite(a)?new Date(1e3*a).toISOString().slice(0,10):"",i=Nd({title:s.name,magnet:`magnet:?xt=urn:btih:${s.hash}`,size:`${(Number(s.size)/1073741824).toFixed(2)} GB`,date:r},"btsow");return i?[i]:[]}))}d(tp,"parseBtsowSource");function sp(o){let e=d(t=>Dd.find(s=>s.id===t),"find");return Object.freeze({contracts:["Magnet","MagnetSource"],getSources:d(()=>Object.freeze(Dd.map(t=>Object.freeze({id:t.id,name:t.name,type:t.type,domain:t.domain,baseUrl:t.baseUrl,priority:t.priority,enabled:t.enabled}))),"getSources"),targetUrl(t,s,a={}){let r=e(t);if(!r)throw new D("UNSUPPORTED",`未知磁力来源:${t}`,{source:"torrent-sources"});return`${new URL(a.baseUrl||r.baseUrl).origin}${r.searchPath(s)}`},async search(t,s,a={}){let r=e(t);if(!r)throw new D("UNSUPPORTED",`未知磁力来源:${t}`,{source:"torrent-sources"});let i=new URL(a.baseUrl||r.baseUrl).origin,l=new URL(i).hostname!==r.domain?{trustClass:"custom-public",expectedOrigin:i}:{trustClass:"builtin-public",hosts:[r.domain],expectedOrigin:i};if(r.id==="btsow"){let u=await o.request({capability:"magnet.search",providerId:"magnet:btsow",method:"POST",url:`${i}/search`,body:JSON.stringify([{search:s},50,1]),headers:{"Content-Type":"application/json"},responseType:"json",urlPolicy:l},a.scope);return tp(u.data)}let c=`${i}${r.searchPath(s)}`,h=await o.request({capability:"magnet.search",providerId:`magnet:${r.id}`,method:"GET",url:c,responseType:"text",urlPolicy:l},a.scope);return ep(h.data,s,r.id)}})}d(sp,"createTorrentSourcesAdapter");var Ld=W({id:"torrent-sources",trustClass:"builtin-public",hosts:["u9a9.com","u3c3.com","sukebei.nyaa.si","btsow.lol"],capabilities:["magnet.search"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>sp(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"magnet.search":"source-configured"},quality:"silver"});function kt(o){return o.replace(/\s+/g," ").trim()}d(kt,"compact");function Md(o,e){let t=new DOMParser().parseFromString(o,"text/html"),s=kt(t.querySelector('a[title="誕生日"]')?.closest("tr")?.querySelector("td")?.textContent??""),a=[...t.querySelectorAll("th")].find(g=>g.textContent?.includes("現年齢"))?.parentElement?.querySelector("td"),r=t.querySelector('a[title="身長"]')?.closest("tr")?.querySelector("td"),i=t.querySelector('a[title="体重"]')?.closest("tr")?.querySelector("td"),n=t.querySelector('a[title="スリーサイズ"]')?.closest("tr")?.querySelector("td"),l=[...t.querySelectorAll("th")].find(g=>g.textContent?.includes("ブラサイズ"))?.nextElementSibling;if(!s&&!r&&!n)throw new TypeError("Wikipedia actress information is missing");let c=Number.parseInt(kt(a?.textContent??""),10),h=kt(r?.textContent??"").split(" ")[0],u=kt(i?.textContent??"").split("/"),p=kt(u.at(-1)??"").replace(/^―\s*kg$/,"");return Object.freeze({birthday:s,age:Number.isFinite(c)?`${c}岁`:"",height:h&&!h.endsWith("cm")?`${h}cm`:h,weight:p,threeSizeText:kt(n?.textContent??"").replace("cm","").trim(),braSize:kt(l?.textContent??""),url:new URL(e).href})}d(Md,"parseWikipediaActressInfo");function ap(o){return Object.freeze({contracts:["ActressInfo"],profileUrl(e){return new URL(`/wiki/${encodeURIComponent(String(e))}`,"https://ja.wikipedia.org").href},async lookup(e,t={}){let s=this.profileUrl(e),a=await o.request({providerId:"wikipedia",capability:"person.actress-info",method:"GET",url:s,responseType:"text",timeout:15e3,urlPolicy:{trustClass:"builtin-public",hosts:["ja.wikipedia.org"]}},t.scope);try{return Md(a.data,a.finalUrl||s)}catch(r){if(r instanceof TypeError&&/actress information is missing/.test(r.message))return null;throw r}}})}d(ap,"createWikipediaAdapter");var Bd=W({id:"wikipedia",trustClass:"builtin-public",hosts:["ja.wikipedia.org"],capabilities:["person.actress-info"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>ap(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"person.actress-info":ke.externalDetail},quality:"silver"});function Od(o){if(!o||typeof o!="object"||!Array.isArray(o.data))throw new D("INVALID_RESPONSE","迅雷字幕响应结构无效",{source:"xunlei"});return Object.freeze(o.data.flatMap(e=>{try{let t=new URL(String(e?.url??""));if(t.protocol!=="https:")return[];let s=String(e?.ext??"").toLowerCase().replace(/^\./,"");return s?[Object.freeze({name:String(e?.name??""),extension:s,url:t.href,providerId:"xunlei"})]:[]}catch{return[]}}))}d(Od,"parseXunleiSubtitles");var Ud=["xunlei.com"];function rp(o){return Object.freeze({contracts:["Subtitle"],async search(e,t={}){let s=String(e.carNum??"").trim();if(!s)return[];let a=new URL("https://api-shoulei-ssl.xunlei.com/oracle/subtitle");a.searchParams.set("gcid",""),a.searchParams.set("cid",""),a.searchParams.set("name",s);let r=await o.request({providerId:"xunlei",capability:"subtitle.search",method:"GET",url:a.href,responseType:"json",urlPolicy:{trustClass:"builtin-public",hosts:Ud}},t.scope);return Od(r.data)},async download(e,t={}){let s=new URL(String(e.url??"")),a=await o.request({providerId:"xunlei",capability:"subtitle.download",method:"GET",url:s.href,responseType:"text",urlPolicy:{trustClass:"custom-public"}},t.scope);if(typeof a.data!="string")throw new TypeError("迅雷字幕正文不是文本");return a.data}})}d(rp,"createXunleiAdapter");var zd=W({id:"xunlei",trustClass:"builtin-public",hosts:Ud,capabilities:["subtitle.search","subtitle.download"],requires:[y.http],createClient:d(o=>Object.freeze({http:o[y.http]}),"createClient"),createAdapter:d(o=>rp(o.http),"createAdapter"),createHostAdapter:null,cachePolicy:{"subtitle.search":"public-1d","subtitle.download":"public-1d"},quality:"silver"});var Fd=Object.freeze([td,id,ld,ud,gd,vd,fd,bd,wd,Sd,Cd,_d,$d,Td,Id,Ed,Ld,Bd,zd]);function ip(o,e){let t=o.close;o.close=function(a){let r=t.call(this,a);return e?.releaseEscClose?.(a),setTimeout(()=>{let i=document.querySelectorAll(".layui-layer-shade").length;document.documentElement.style.overflow=i>0?"hidden":""},10),r};let s=o.open;o.open=function(a={}){a=_t(a,e);let r=a.success;return s.call(this,{...a,success(i,n){typeof r=="function"&&r.call(this,i,n),e.setupEscClose(n)}})}}d(ip,"patchLayerRuntime");function np(o){for(let e of["https://cdn.jsdelivr.net/npm/layui-layer@1.0.9/layer.min.css","https://cdn.jsdelivr.net/npm/toastify-js@1.12.0/src/toastify.min.css","https://cdn.jsdelivr.net/npm/viewerjs@1.11.1/dist/viewer.min.css","https://cdn.jsdelivr.net/npm/tabulator-tables@6.3.1/dist/css/tabulator_semanticui.min.css"])o.importResource(e)}d(np,"importVendorStyles");async function op(o){let e=await o.getSetting("disabledPlugins","[]"),t=Ee(e),s=At(t);return{migrated:s,needsMigration:JSON.stringify(t)!==JSON.stringify(s)}}d(op,"readDisabledPluginSettings");async function lp(o,e,t,s,a,r,i=null){await o.update(n=>{let l=Ee(typeof n.disabledPlugins=="string"?n.disabledPlugins:"[]"),c=At(l);if(JSON.stringify(l)!==JSON.stringify(c)&&(n.disabledPlugins=JSON.stringify(c)),t.needsOrigin){let h=new Set(Array.isArray(n.trustedLocalOrigins)?n.trustedLocalOrigins:[]);for(let u of t.origins)h.add(u);n.trustedLocalOrigins=[...h]}t.needsNotice&&(n.localOriginTrustNoticeV1=!0),Object.prototype.hasOwnProperty.call(n,"enableLoadScreenShot")||(n.enableLoadScreenShot="yes"),Object.prototype.hasOwnProperty.call(n,"enableScreenSvg")||(n.enableScreenSvg=n.enableLoadScreenShot??"yes"),n.sortMethod==null&&["default","rateCount","date"].includes(s||"")&&(n.sortMethod=s),n.foldCategoryCollapsed==null&&["yes","no"].includes(a||"")&&(n.foldCategoryCollapsed=a==="yes"),n.videoMuted==null&&["yes","no"].includes(r||"")&&(n.videoMuted=r==="yes");for(let h of i?.cleanup?.settingKeys||[])n[h]===i.cleanup.settingValues?.[h]&&delete n[h]})}d(lp,"persistBootstrapMigration");async function cp(o){let e=await o.getSetting(),t=new Set(Array.isArray(e.trustedLocalOrigins)?e.trustedLocalOrigins:[]),s=null;try{e.webDavUrl&&(s=new URL(e.webDavUrl).origin)}catch{}return s&&!t.has(s)?(t.add(s),{origins:[...t],notice:`已按现有 WebDAV 配置授权本地来源:${s}`,needsOrigin:!0}):s&&!e.localOriginTrustNoticeV1?{origins:[...t],notice:`WebDAV 仅信任精确来源:${s}`,needsNotice:!0}:{origins:[...t],notice:null}}d(cp,"resolveLocalOrigins");async function Vd(){try{if($t(window.location).isJavDB){let I=Oo(window.location);if(I)return void window.location.replace(I)}let o=performance.now(),e=globalThis.__jhsBrowserDiagnostics,t=d(I=>e&&((e.bootstrapPhases||(e.bootstrapPhases={}))[I]=performance.now()-o),"markPhase"),s=Uo(window.location),a=fl(),r=gl(),{utils:i,gmHttp:n,storageManager:l,stateService:c}=pl(r);t("legacy-runtime"),Object.assign(globalThis,{utils:i,gmHttp:n,storageManager:l,stateService:c,jhsEventBus:r}),["blacklist-rules-changed","filter-rules-changed","legacy-refresh"].forEach((I=>r.on(I,(()=>l._invalidateCache())))),r.on("car-state-changed",()=>l._invalidateCache(l.car_list_key)),ip(a.layer,i),await Promise.resolve(),np(i),t("pre-settings");let h=await op(l),u=h.migrated,p=await cp(l),g=new Rs,m=new Ps,f=M?g:B?m:null,v=f?.detectRoute()??"other",b=Yc({gmRequest:globalThis.GM_xmlhttpRequest,gmGetValue:globalThis.GM_getValue,gmSetValue:globalThis.GM_setValue,gmDeleteValue:globalThis.GM_deleteValue,legacyHttp:n,legacyStorage:l,eventBus:r,storageForage:l.forage,localStorage:globalThis.localStorage,layer:a.layer,stateService:c,hostAdapter:f,hostAdapters:{javdb:g,javbus:m},site:s.site,route:v,disabled:u,localOrigins:p.origins});t("context"),Yo(b.services.styles,Zo()),Object.assign(globalThis,{settingsService:b.services.settings,credentialService:b.services.credential}),await b.services.settings.load(),t("settings-load");let w=await b.services.credential.migrateLegacy(b.services.settings,{deferCleanup:!0});b.services.profile.start();let S=localStorage.getItem("jhs_sortMethod"),j=localStorage.getItem("jhs_foldCategory"),k=localStorage.getItem("jhs_videoMuted");w.cleanup=await b.services.credential.validateLegacyCleanup(w.cleanup),await lp(b.services.settings,h,p,S,j,k,w),await b.services.credential.cleanupLegacyPageStorage(w.cleanup?.pageKeys,b.services.settings),t("settings-migration");let x=ml(b.rootScope,{clogMsgCount:b.services.settings.snapshot().clogMsgCount});t("logger"),Jo(b.rootScope),Go(b.rootScope),t("theme-ui"),b.services.diagnostics.setBrowserMetadata({userAgent:navigator.userAgent,platform:navigator.platform,...globalThis.__jhsBrowserTestMetadata??{}}),Object.assign(globalThis,x),w.issues?.length&&x.show.info("部分旧凭证未能安全迁移,已保留原数据,请重新保存对应凭证"),p.notice&&x.show.info(p.notice);let _=new ks({diagnostics:b.services.diagnostics});for(let I of Fd)b.registries.integrations.register(I);for(let I of Cl)b.registries.features.register(I);return qc(_,b.registries.features,s.site),t("registry"),Hc({pluginManager:_,utils:i,gmHttp:n,storageManager:l,stateService:c,jhsEventBus:r,clog:x.clog,show:x.show,loading:x.loading},globalThis.unsafeWindow),window.isDetailPage=v==="detail",window.isListPage=v==="list",await b.registries.features.start(),t("feature-runtime"),await xs(l),await l.getReviewFilterKeywordList(),await c.recoverPendingTransaction(),t("data-prepare"),await Promise.all([_.processCss(),Promise.resolve(Jt(b.services.settings.snapshot().themeMode))]),t("plugin-css"),M&&/(^|;)\s*locale\s*=\s*en\s*($|;)/i.test(document.cookie)&&x.show.error("请切换到中文语言下才可正常使用本脚本",{duration:-1}),await _.processPlugins(),t("plugin-runtime"),t("first-ready"),t("total"),b}catch(o){throw o instanceof D?o:new D("BOOTSTRAP_FAILED",o instanceof Error?o.message:"JHS 启动失败",{source:"bootstrap",cause:o})}}d(Vd,"bootstrapJhs");function qd(o){if(console.error("[JHS] bootstrap failed:",o),globalThis.show?.error)return globalThis.show.error(o?.message||"JHS 启动失败",{duration:-1});let e=document.createElement("div");e.id="jhs-bootstrap-error",e.setAttribute("role","alert"),e.textContent=`JHS 启动失败:${o?.message||"未知错误"}`,Object.assign(e.style,{position:"fixed",inset:"12px 12px auto",zIndex:"2147483647",padding:"12px",background:"#7f1d1d",color:"white"}),document.documentElement.append(e)}d(qd,"mountBootstrapError");Vd().catch(qd);})(); diff --git a/README.md b/README.md index 561c705d..cec4583f 100644 --- a/README.md +++ b/README.md @@ -19,15 +19,15 @@ JHS 将作品状态、演员收藏、新作追踪、外部检索、媒体预览 > 本项目仅提供网页信息整理与效率增强能力。请遵守所在地法律、目标网站条款及第三方服务规则,并仅处理你有权访问的内容。 -## 6.5.2 更新 +## 6.5.3 更新 -当前正式版为 **6.5.2**(2026-10-16)。这次主要更新: +当前版本为 **6.5.3**(2026-10-17)。这次主要更新: -- **全部未下载筛选**:“更多筛选”可以查看所有未下载且未被屏蔽的作品,包含待鉴定、收藏和已看内容。 -- **默认选项卡更完整**:设置可选择全部筛选,保留“屏蔽项”,加入“全部未下载”等智能筛选,下次进入列表页生效。 -- **新作品保持浏览位置**:打开作品后,已浏览卡片渐隐移除,后续作品自动补位;保留筛选、滚动位置和其他选择项。连续移除、切换筛选和关闭重开弹窗也能正确处理。 +- **详情鉴定快捷键**:屏蔽、收藏、已下载和已观看支持自定义单键及组合键,按钮内显示对应按键。 +- **按键录制设置**:在“设置 → 快捷键”录制或清除按键,重复配置会提示冲突,修改即时保存并支持备份恢复。 +- **独立插件开关**:在“插件管理 → 详情页”启停;禁用后隐藏设置入口,启用后从列表打开详情弹窗即可使用快捷键。 -完整内容见 [6.5.2 更新记录](CHANGELOG.md#652---2026-10-16)。 +完整内容见 [6.5.3 更新记录](CHANGELOG.md#653---2026-10-17)。 ## 功能概览 @@ -86,6 +86,8 @@ JHS 将作品状态、演员收藏、新作追踪、外部检索、媒体预览 移动端可从右下角悬浮菜单访问鉴定、新作品、黑名单、排序、筛选和设置。 +在“设置 → 快捷键”中录制屏蔽、收藏、已下载和已观看的单键或组合键,录制后自动保存,详情按钮显示对应键位。默认未设置;独立开关位于“插件管理 → 详情页 → 详情鉴定快捷键”,开关修改后刷新页面。输入内容或打开弹窗时不触发鉴定快捷键。 + 启用“浏览后自动移除新作品标记”后,新作品列表中的已浏览卡片会渐隐移除,并由后续作品补位,保留浏览位置、筛选和其他选择项;最后一页移空时回到上一页,全部移空时显示空状态;减少动态效果时直接完成补位。 列表“更多筛选”中的“全部未下载”显示所有未标记为已下载且未被屏蔽的作品,包括待鉴定、收藏和已看内容。 diff --git a/docs/architecture/feature-matrix.md b/docs/architecture/feature-matrix.md index e645c561..cb273043 100644 --- a/docs/architecture/feature-matrix.md +++ b/docs/architecture/feature-matrix.md @@ -2,6 +2,8 @@ 本矩阵冻结 Feature 的能力边界;独立启停单位以 Contribution ID 为准。FeatureRuntime 在注册时校验 Feature ID 与 Contribution owner 唯一性,旧 Plugin 名通过 `LEGACY_PLUGIN_CONTRIBUTION_MAP` 迁移。 +详情鉴定快捷键由 `detail.shortcuts` Contribution 独立启停,仅在详情页监听按键,设置录制面板使用 SettingsService 持久化 `detailShortcuts`,不注册列表页快捷键。 + | Feature | Kind | Sites / route | Startup | Contributions | | --- | --- | --- | --- | --- | | `settings` | system | all | on-command | `settings.core` | diff --git a/docs/sleazyfork.zh-CN.md b/docs/sleazyfork.zh-CN.md index 09c7f07e..348cd868 100644 --- a/docs/sleazyfork.zh-CN.md +++ b/docs/sleazyfork.zh-CN.md @@ -7,17 +7,17 @@ JHS(JAV Helper Suite)是一款面向 JavDB、JavBus 的 Tampermonkey 用户脚本,用于整理作品状态、追踪演员新作、聚合资源与媒体信息,并提供统一离线、备份和统计工具。 -> 当前稳定版本:**6.5.2**(2026-10-16) +> 当前版本:**6.5.3**(2026-10-17) > > [GitHub 项目](https://github.com/Teamper/JHS) · [完整更新记录](https://github.com/Teamper/JHS/blob/main/CHANGELOG.md) · [问题反馈](https://github.com/Teamper/JHS/issues) -## 6.5.2 更新了什么 +## 6.5.3 更新了什么 -- **全部未下载筛选**:“更多筛选”新增“全部未下载”,排除屏蔽项和已下载作品,保留未下载的待鉴定、收藏和已看内容。 -- **默认选项卡更完整**:设置支持全部筛选,保留“屏蔽项”,加入“全部未下载”等智能筛选,下次进入列表页生效。 -- **新作品保持浏览位置**:打开作品后,卡片渐隐移除,后续作品自动补位;保留筛选、浏览位置和其他选择项,连续移除、快速切换筛选和关闭重开弹窗也能正确处理。 +- **详情鉴定快捷键**:屏蔽、收藏、已下载和已观看支持自定义单键及 Ctrl / Alt / Shift / Meta 组合键,按钮内显示对应按键。 +- **按键录制设置**:在“设置 → 快捷键”录制或清除按键,支持冲突提示、即时保存及备份恢复。 +- **独立插件开关**:在“插件管理 → 详情页”启停;禁用后隐藏设置入口,启用后从列表打开详情弹窗即可使用快捷键。 -完整版本记录见 [6.5.2 更新说明](../CHANGELOG.md#652---2026-10-16)。 +完整版本记录见 [6.5.3 更新说明](../CHANGELOG.md#653---2026-10-17)。 ## 主要功能 @@ -29,6 +29,7 @@ JHS(JAV Helper Suite)是一款面向 JavDB、JavBus 的 Tampermonkey 用户 - 支持自动翻页、跨页批量收藏和标记已下载、鉴定记录、状态撤销和跨标签页同步。 - 桌面使用快捷筛选;移动端通过右下角悬浮菜单访问鉴定、筛选、排序和常用工具。 - 设置中的“默认显示选项卡”支持全部筛选,包括“屏蔽项”和“全部未下载”等智能筛选,下次进入列表页生效。 +- “设置 → 快捷键”支持录制四种详情鉴定操作的单键或组合键,自动保存并在按钮上显示键位;默认未设置,独立开关位于“插件管理 → 详情页 → 详情鉴定快捷键”,开关修改后刷新页面。输入内容或打开弹窗时不触发。 ### 演员与新作品 diff --git a/package-lock.json b/package-lock.json index 8ac83bcf..6b4d2f55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jhs-userscript", - "version": "6.5.2", + "version": "6.5.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jhs-userscript", - "version": "6.5.2", + "version": "6.5.3", "license": "MIT", "devDependencies": { "esbuild": "^0.28.0", diff --git a/package.json b/package.json index cd48bada..487e3558 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jhs-userscript", - "version": "6.5.2", + "version": "6.5.3", "description": "JAV Helper Suite for JavDB and JavBus", "private": true, "license": "MIT", diff --git a/scripts/regression-check.mjs b/scripts/regression-check.mjs index 7c6ac7e2..e64da94a 100644 --- a/scripts/regression-check.mjs +++ b/scripts/regression-check.mjs @@ -22,7 +22,7 @@ function extractContributionOrder(registrySource, site) { return registrySource.split(/\r?\n/).flatMap((line) => { const match = line.match(/manifest\("[^"]+",\s*"[^"]+",\s*(\w+),\s*\[([^\]]+)\],\s*\{([^}]+)\}(?:,\s*\[[^\]]*\])?(?:,\s*\{[^}]*\})?\)/); if (!match || !match[2].includes(`"${site}"`)) return []; - const order = match[3].match(new RegExp(`(?:^|,\\s*)\\s*(?:"${site}"|${site})\\s*:\\s*(\\d+)`)); + const order = match[3].match(new RegExp(`(?:^|,\\s*)\\s*(?:"${site}"|${site})\\s*:\\s*(\\d+(?:\\.\\d+)?)`)); assert(order, `Missing ${site} order for ${match[1]}`); return [{ plugin: match[1], order: Number(order[1]) }]; }).filter((item) => item.order > 0).sort((left, right) => left.order - right.order).map((item) => item.plugin); @@ -324,11 +324,11 @@ for (const [file, className, pluginName] of expectedPlugins) { const javdbPlugins = extractContributionOrder(registry, "javdb"); const javbusPlugins = extractContributionOrder(registry, "javbus"); assert( - javdbPlugins.join(",") === "ListPagePlugin,AutoPagePlugin,Fc2Plugin,Fc2NavigationPlugin,FoldCategoryPlugin,ListPageButtonPlugin,HistoryPlugin,SettingPlugin,NavBarPlugin,HitShowPlugin,Top250Plugin,SearchByImagePlugin,CoverButtonPlugin,Fc2By123AvPlugin,DetailPagePlugin,DetailWorkspacePlugin,ReviewPlugin,RelatedPlugin,DetailPageButtonPlugin,HighlightMagnetPlugin,PreviewVideoPlugin,FilterTitleKeywordPlugin,ActressInfoPlugin,OtherSitePlugin,TranslatePlugin,WantAndWatchedVideosPlugin,MagnetHubPlugin,ScreenShotPlugin,BlacklistPlugin,FavoriteActressesPlugin,NewVideoPlugin,TaskPlugin,StatsPlugin,MobileBottomBarPlugin,OneOneFiveMatchPlugin,UnifiedOfflinePlugin,CompatibilityEnhancementsPlugin", + javdbPlugins.join(",") === "ListPagePlugin,AutoPagePlugin,Fc2Plugin,Fc2NavigationPlugin,FoldCategoryPlugin,ListPageButtonPlugin,HistoryPlugin,SettingPlugin,NavBarPlugin,HitShowPlugin,Top250Plugin,SearchByImagePlugin,CoverButtonPlugin,Fc2By123AvPlugin,DetailPagePlugin,DetailWorkspacePlugin,ReviewPlugin,RelatedPlugin,DetailPageButtonPlugin,DetailShortcutPlugin,HighlightMagnetPlugin,PreviewVideoPlugin,FilterTitleKeywordPlugin,ActressInfoPlugin,OtherSitePlugin,TranslatePlugin,WantAndWatchedVideosPlugin,MagnetHubPlugin,ScreenShotPlugin,BlacklistPlugin,FavoriteActressesPlugin,NewVideoPlugin,TaskPlugin,StatsPlugin,MobileBottomBarPlugin,OneOneFiveMatchPlugin,UnifiedOfflinePlugin,CompatibilityEnhancementsPlugin", "JavDB plugin registration order changed" ); assert( - javbusPlugins.join(",") === "ListPagePlugin,ListPageButtonPlugin,SettingPlugin,HistoryPlugin,AutoPagePlugin,SearchByImagePlugin,BusNavBarPlugin,CoverButtonPlugin,BusImgPlugin,BusDetailPagePlugin,DetailWorkspacePlugin,DetailPageButtonPlugin,ReviewPlugin,FilterTitleKeywordPlugin,HighlightMagnetPlugin,BusPreviewVideoPlugin,MagnetHubPlugin,ScreenShotPlugin,OtherSitePlugin,TranslatePlugin,BlacklistPlugin,TaskPlugin,StatsPlugin,MobileBottomBarPlugin,OneOneFiveMatchPlugin,UnifiedOfflinePlugin,CompatibilityEnhancementsPlugin", + javbusPlugins.join(",") === "ListPagePlugin,ListPageButtonPlugin,SettingPlugin,HistoryPlugin,AutoPagePlugin,SearchByImagePlugin,BusNavBarPlugin,CoverButtonPlugin,BusImgPlugin,BusDetailPagePlugin,DetailWorkspacePlugin,DetailPageButtonPlugin,DetailShortcutPlugin,ReviewPlugin,FilterTitleKeywordPlugin,HighlightMagnetPlugin,BusPreviewVideoPlugin,MagnetHubPlugin,ScreenShotPlugin,OtherSitePlugin,TranslatePlugin,BlacklistPlugin,TaskPlugin,StatsPlugin,MobileBottomBarPlugin,OneOneFiveMatchPlugin,UnifiedOfflinePlugin,CompatibilityEnhancementsPlugin", "JavBus plugin registration order changed" ); assertIncludes(registry, 'OneTwoThreeOfflinePlugin, ["javdb", "javbus", "123pan"]', "shared registry"); diff --git a/src/app/feature-runtime.js b/src/app/feature-runtime.js index 9d3a7391..230dab7b 100644 --- a/src/app/feature-runtime.js +++ b/src/app/feature-runtime.js @@ -27,7 +27,7 @@ export class FeatureRuntime { this.commands.setActivator((featureId) => this.activate(featureId).then(() => undefined)); } - /** @param {Array>} manifests */ + /** @param {ReadonlyArray>} manifests */ setContributionManifests(manifests) { this.contributionManifests = new Map(manifests.map((item) => [item.id, item])); } activeSurfaces() { diff --git a/src/contracts/manifests.js b/src/contracts/manifests.js index 0df5e22b..eb7a13ee 100644 --- a/src/contracts/manifests.js +++ b/src/contracts/manifests.js @@ -44,7 +44,7 @@ export function defineFeature(manifest) { return Object.freeze({ ...manifest }); } -/** @param {Record} manifest */ +/** @template {Record & { sites: string[], routes: string[], surfaces: string[], order: Record }} T @param {T} manifest @returns {Readonly & { sites: readonly string[], routes: readonly string[], surfaces: readonly string[], order: Readonly> }>} */ export function defineContribution(manifest) { requireNonEmptyString(manifest.id, "Contribution id"); requireNonEmptyString(manifest.featureId, "Contribution featureId"); @@ -55,7 +55,7 @@ export function defineContribution(manifest) { requireUniqueTokens(manifest.requires, "requires"); if (typeof manifest.plugin !== "function") throw new TypeError("Contribution plugin must be a class"); if (!manifest.order || typeof manifest.order !== "object") throw new TypeError("Contribution order must be explicit"); - return Object.freeze({ ...manifest, sites: Object.freeze([...(/** @type {unknown[]} */ (manifest.sites))]), routes: Object.freeze([...(/** @type {unknown[]} */ (manifest.routes))]), surfaces: Object.freeze([...(/** @type {unknown[]} */ (manifest.surfaces))]), order: Object.freeze({ ...manifest.order }) }); + return Object.freeze({ ...manifest, sites: Object.freeze([...manifest.sites]), routes: Object.freeze([...manifest.routes]), surfaces: Object.freeze([...manifest.surfaces]), order: Object.freeze({ ...manifest.order }) }); } /** @param {Record} manifest */ diff --git a/src/core/detail-shortcuts.js b/src/core/detail-shortcuts.js new file mode 100644 index 00000000..97509fe4 --- /dev/null +++ b/src/core/detail-shortcuts.js @@ -0,0 +1,31 @@ +// @ts-check + +export const DETAIL_SHORTCUT_ACTIONS = Object.freeze({ + blocked: { id: "filterBtn", label: "屏蔽" }, + favorite: { id: "favoriteBtn", label: "收藏" }, + downloaded: { id: "hasDownBtn", label: "已下载" }, + watched: { id: "hasWatchBtn", label: "已观看" } +}); + +export function shortcutFromEvent(event = new KeyboardEvent("keydown")) { + if (event.isComposing || event.repeat || !event.code || /^(Control|Shift|Alt|Meta)/.test(event.code) || ["Escape", "Tab", "Unidentified"].includes(event.code)) return null; + return { code: event.code, ctrl: event.ctrlKey, alt: event.altKey, shift: event.shiftKey, meta: event.metaKey }; +} + +export function shortcutLabel(shortcut = Object.create(null)) { + if (!shortcut || typeof shortcut.code !== "string") return ""; + const key = shortcut.code.replace(/^Key(?=[A-Z]$)|^Digit(?=\d$)/g, ""); + return [shortcut.ctrl && "Ctrl", shortcut.alt && "Alt", shortcut.shift && "Shift", shortcut.meta && "Meta", key].filter(Boolean).join("+"); +} + +export function shortcutMatches(left = Object.create(null), right = Object.create(null)) { + return !!left && !!right && left.code === right.code && ["ctrl", "alt", "shift", "meta"].every(key => !!left[key] === !!right[key]); +} + +export function readDetailShortcuts(value = Object.create(null)) { + if (!value || typeof value !== "object" || Array.isArray(value)) return Object.create(null); + return Object.fromEntries(Object.keys(DETAIL_SHORTCUT_ACTIONS).filter(key => { + const item = value[key]; + return item && typeof item.code === "string" && /^[A-Za-z][A-Za-z0-9]*$/.test(item.code) && !/^(Control|Shift|Alt|Meta)/.test(item.code) && !["Escape", "Tab", "Unidentified"].includes(item.code); + }).map(key => [key, value[key]])); +} diff --git a/src/core/legacy-plugin-contributions.js b/src/core/legacy-plugin-contributions.js index ca8d4e9d..3515d3cd 100644 --- a/src/core/legacy-plugin-contributions.js +++ b/src/core/legacy-plugin-contributions.js @@ -25,6 +25,7 @@ export const LEGACY_PLUGIN_CONTRIBUTION_MAP = Object.freeze({ PreviewVideoPlugin: "detail.javdb-preview", CoverButtonPlugin: "detail.cover-state-actions", DetailPageButtonPlugin: "detail.page-state-actions", + DetailShortcutPlugin: "detail.shortcuts", HighlightMagnetPlugin: "detail.native-magnets", OtherSitePlugin: "detail.external-sites", SubTitleCatPlugin: "external-bridge.subtitle", diff --git a/src/features/detail/manifest.js b/src/features/detail/manifest.js index d42ec818..6ddb673a 100644 --- a/src/features/detail/manifest.js +++ b/src/features/detail/manifest.js @@ -7,7 +7,7 @@ import { DetailController } from "./detail-controller.js"; export default defineFeature({ id: "detail", kind: "feature", disableable: true, sites: ["javdb", "javbus"], routes: ["detail", "owned-detail"], startup: "eager", requires: [PORT.host, SERVICE.movie, SERVICE.review, SERVICE.related, SERVICE.magnet, SERVICE.screenshot], - contributes: ["detail.javdb-native", "detail.javbus-native", "detail.workspace", "detail.fc2-owned", "detail.fc2-navigation", "detail.fc2-lookup", "detail.cover-state-actions", "detail.page-state-actions", "detail.javdb-preview", "detail.javbus-images", "detail.javbus-preview", "detail.reviews", "detail.related", "detail.native-magnets", "detail.external-magnets", "detail.screenshot", "detail.external-sites"], + contributes: ["detail.javdb-native", "detail.javbus-native", "detail.workspace", "detail.fc2-owned", "detail.fc2-navigation", "detail.fc2-lookup", "detail.cover-state-actions", "detail.page-state-actions", "detail.shortcuts", "detail.javdb-preview", "detail.javbus-images", "detail.javbus-preview", "detail.reviews", "detail.related", "detail.native-magnets", "detail.external-magnets", "detail.screenshot", "detail.external-sites"], providesCommands: [], activate: (/** @type {any} */ deps, /** @type {any} */ runtime) => { if (runtime.route === "owned-detail") return { dispose: () => {} }; diff --git a/src/main.js b/src/main.js index 150662f6..1ac8d511 100644 --- a/src/main.js +++ b/src/main.js @@ -1,7 +1,7 @@ // ==UserScript== // @name JHS // @namespace https://sleazyfork.org/zh-CN/scripts/578503-jhs-ya -// @version 6.5.2 +// @version 6.5.3 // @author JHS Contributors // @description JAV Helper Suite:为 JavDB / JavBus 提供浏览、收藏、筛选、资源检索、数据备份与统计增强。 // @license MIT diff --git a/src/plugins/backup/setting-templates.js b/src/plugins/backup/setting-templates.js index 5a66d44d..add3ec39 100644 --- a/src/plugins/backup/setting-templates.js +++ b/src/plugins/backup/setting-templates.js @@ -3,6 +3,7 @@ import { L, r } from "../../core/constants.js"; import { DEFAULT_QUICK_FILTER_OPTIONS } from "../../features/list/list-filters.js"; import { buildQuickSettingsHtml } from "../../ui/settings/setting-control-renderer.js"; +import { DETAIL_SHORTCUT_ACTIONS } from "../../core/detail-shortcuts.js"; /** * Build the plugin categories configuration shared between inject and render. @@ -12,6 +13,7 @@ export function getPluginCategories() { /** @type {Record} */ const pluginMeta = { SettingPlugin:["设置中心","core"], StatsPlugin:["统计中心","core"], MobileBottomBarPlugin:["工具栏与移动操作","core"], + DetailShortcutPlugin:["详情鉴定快捷键","detail"], ListPagePlugin:["列表状态处理","list"], NavBarPlugin:["JavDB 导航","list"], BusNavBarPlugin:["JavBus 导航","list"], ListPageButtonPlugin:["列表操作","list"], HighlightMagnetPlugin:["磁力标记","list"], FoldCategoryPlugin:["分类折叠","list"], AutoPagePlugin:["自动翻页","list"], HitShowPlugin:["热播榜单","list"], TOP250Plugin:["TOP 250","list"], DetailPagePlugin:["JavDB 详情页","detail"], BusDetailPagePlugin:["JavBus 详情页","detail"], DetailPageButtonPlugin:["详情操作","detail"], ReviewPlugin:["评论","detail"], RelatedPlugin:["相关影片","detail"], TranslatePlugin:["标题翻译","detail"], WantAndWatchedVideosPlugin:["想看与看过","detail"], CoverButtonPlugin:["封面快捷操作","media"], PreviewVideoPlugin:["JavDB 预览视频","media"], BusPreviewVideoPlugin:["JavBus 预览视频","media"], ScreenShotPlugin:["剧照","media"], BusImgPlugin:["JavBus 图片适配","media"], ActressInfoPlugin:["演员资料","media"], SearchByImagePlugin:["以图搜图","media"], @@ -65,6 +67,7 @@ export function buildSettingDialogHtml(activePanel, cacheItems) {