diff --git a/README.md b/README.md
index 472cfc0e..96ef2bbe 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,7 @@
# drpyS(drpy-node)
-
[](https://zread.ai/hjdhnx/drpy-node)
-[](https://deepwiki.com/hjdhnx/drpy-node)
-
+[](https://deepwiki.com/hjdhnx/drpy-node)
+
nodejs作为服务端的drpy实现。全面升级异步写法
~~积极开发中,每日一更~~,当前进度 `100%`
~~找工作中,随缘更新~~
@@ -36,6 +35,7 @@ nodejs作为服务端的drpy实现。全面升级异步写法
### 插件应用列表
+* [Admin 管理面板](/apps/admin)
* [DrPlayer](/apps/drplayer)
* [Websocket实时日志](/apps/websocket)
* [cookie管理插件](/apps/cookie-butler/index.html)
@@ -71,33 +71,25 @@ nodejs作为服务端的drpy实现。全面升级异步写法
## 更新记录
-### 20260314
-
-更新至V1.3.28
-
-### 20260301
-
-更新至V1.3.27
-
-### 20260228
+### 20260320
-更新至V1.3.26
+更新至V1.4.1
-### 20260225
+### 20260319
-更新至V1.3.25
+更新至V1.3.31
-### 20260214
+### 20260317
-更新至V1.3.24
+更新至V1.3.30
-### 20260212
+### 20260315
-更新至V1.3.23
+更新至V1.3.29
-### 20260208
+### 20260314
-更新至V1.3.22
+更新至V1.3.28
[点此查看完整更新记录](docs/updateRecord.md)
diff --git a/apps/admin/assets/ApiDocs-BtbZJGsl.css b/apps/admin/assets/ApiDocs-BtbZJGsl.css
new file mode 100644
index 00000000..0d1d89a7
--- /dev/null
+++ b/apps/admin/assets/ApiDocs-BtbZJGsl.css
@@ -0,0 +1 @@
+.apidocs-page[data-v-e8a883e4]{display:flex;flex-direction:column;height:calc(100vh - 12rem);min-height:500px}.apidocs-header[data-v-e8a883e4]{flex-shrink:0;padding-bottom:1rem}.apidocs-content[data-v-e8a883e4]{flex:1;overflow-y:auto;min-height:0}
diff --git a/apps/admin/assets/ApiDocs-WdRyZWIi.js b/apps/admin/assets/ApiDocs-WdRyZWIi.js
new file mode 100644
index 00000000..4acd6d94
--- /dev/null
+++ b/apps/admin/assets/ApiDocs-WdRyZWIi.js
@@ -0,0 +1 @@
+import{z as w,o as r,b as a,e,E as C,G as L,k as p,F as v,f as k,r as g,y as A,t as n,n as m}from"./vendor-B6xRL-fs.js";import{s as E}from"./system-CxybzrTo.js";import{_ as M}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./admin-DEAtY0pm.js";import"./ui-42ANG6Sg.js";const P={class:"apidocs-page"},j={class:"apidocs-header"},B={class:"card p-4 mt-4"},D={class:"relative w-full"},I={class:"apidocs-content"},T={key:0,class:"flex justify-center py-12"},F={key:1,class:"space-y-4"},U=["onClick"],V={class:"font-semibold text-gray-900 dark:text-gray-100"},z={key:0,class:"divide-y divide-gray-200 dark:divide-gray-700"},G={class:"flex items-start gap-4"},N={class:"flex-1 min-w-0"},O={class:"text-sm font-mono text-gray-900 dark:text-gray-100 break-all"},S={class:"text-sm text-gray-600 dark:text-gray-400 mt-1"},$={key:0,class:"mt-4"},q={class:"bg-gray-50 dark:bg-gray-900 rounded-lg p-3 space-y-2"},Q={class:"px-2 py-0.5 bg-gray-200 dark:bg-gray-700 rounded text-xs font-mono flex-shrink-0"},H={class:"flex-1 min-w-0"},J={class:"font-medium text-gray-900 dark:text-gray-100"},K={key:0,class:"ml-2 text-red-600 dark:text-red-400 text-xs"},R={class:"text-gray-600 dark:text-gray-400 mt-0.5"},W={__name:"ApiDocs",setup(X){const x=g([]),y=g(!1),u=g(null),d=g("");w(async()=>{await f()});const f=async()=>{y.value=!0;try{const s=await E.getApiList();x.value=s||[]}catch(s){console.error("Failed to load API list:",s)}finally{y.value=!1}},_=A(()=>d.value?x.value.map(s=>({...s,endpoints:s.endpoints.filter(t=>{var l,i,c;const o=d.value.toLowerCase();return((l=t.path)==null?void 0:l.toLowerCase().includes(o))||((i=t.description)==null?void 0:i.toLowerCase().includes(o))||((c=t.method)==null?void 0:c.toLowerCase().includes(o))})})).filter(s=>s.endpoints.length>0):x.value),h=s=>{u.value===s?u.value=null:u.value=s},b=s=>{switch(s==null?void 0:s.toUpperCase()){case"GET":return"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200";case"POST":return"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200";case"PUT":return"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200";case"DELETE":return"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200";case"ALL":return"bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200";default:return"bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300"}};return(s,t)=>(r(),a("div",P,[e("div",j,[t[3]||(t[3]=e("div",null,[e("h2",{class:"text-xl font-semibold"},"API 文档"),e("p",{class:"text-sm text-gray-500 dark:text-gray-400 mt-1"}," drpy-node 可用的 API 接口文档 ")],-1)),e("div",B,[e("div",D,[C(e("input",{"onUpdate:modelValue":t[0]||(t[0]=o=>d.value=o),type:"text",placeholder:"搜索 API 端点...",class:"input w-full pr-8"},null,512),[[L,d.value]]),d.value?(r(),a("button",{key:0,onClick:t[1]||(t[1]=o=>d.value=""),class:"absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"},[...t[2]||(t[2]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])):p("",!0)])])]),e("div",I,[y.value?(r(),a("div",T,[...t[4]||(t[4]=[e("div",{class:"animate-spin rounded-full h-12 w-12 border-b-2 border-primary-600"},null,-1)])])):(r(),a("div",F,[(r(!0),a(v,null,k(_.value,o=>(r(),a("div",{key:o.category,class:"card overflow-hidden"},[e("button",{onClick:l=>h(o.category),class:"w-full px-6 py-4 flex items-center justify-between hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"},[e("h3",V,n(o.category),1),(r(),a("svg",{class:m(["w-5 h-5 text-gray-500 transition-transform",{"rotate-180":u.value===o.category}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[5]||(t[5]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,U),u.value===o.category?(r(),a("div",z,[(r(!0),a(v,null,k(o.endpoints,l=>(r(),a("div",{key:l.path,class:"p-6"},[e("div",G,[e("span",{class:m(["px-2.5 py-1 rounded text-xs font-bold flex-shrink-0",b(l.method)])},n(l.method),3),e("div",N,[e("code",O,n(l.path),1),e("p",S,n(l.description),1),l.params&&Object.keys(l.params).length>0?(r(),a("div",$,[t[6]||(t[6]=e("h4",{class:"text-sm font-medium text-gray-700 dark:text-gray-300 mb-2"},"参数",-1)),e("div",q,[(r(!0),a(v,null,k(l.params,(i,c)=>(r(),a("div",{key:c,class:"flex items-start gap-3 text-sm"},[e("code",Q,n(i.type||c),1),e("div",H,[e("span",J,n(c),1),i.required?(r(),a("span",K,"*")):p("",!0),e("p",R,n(i.description),1)])]))),128))])])):p("",!0)])])]))),128))])):p("",!0)]))),128))]))])]))}},re=M(W,[["__scopeId","data-v-e8a883e4"]]);export{re as default};
diff --git a/apps/admin/assets/Backup-BzNwk845.css b/apps/admin/assets/Backup-BzNwk845.css
new file mode 100644
index 00000000..6d4f88e2
--- /dev/null
+++ b/apps/admin/assets/Backup-BzNwk845.css
@@ -0,0 +1 @@
+.backup-page[data-v-7ae98012]{display:flex;flex-direction:column;height:calc(100vh - 8rem);min-height:400px}.backup-header[data-v-7ae98012]{flex-shrink:0;padding-bottom:1rem}.backup-content[data-v-7ae98012]{flex:1;min-height:0}
diff --git a/apps/admin/assets/Backup-qwqZIMqv.js b/apps/admin/assets/Backup-qwqZIMqv.js
new file mode 100644
index 00000000..be974e90
--- /dev/null
+++ b/apps/admin/assets/Backup-qwqZIMqv.js
@@ -0,0 +1 @@
+import{z as F,o as n,b as l,e,j as g,t as i,F as _,f as C,k as f,r as m,n as R,L as S}from"./vendor-B6xRL-fs.js";import{a as y}from"./admin-DEAtY0pm.js";import{f as $}from"./file-D4KCgIsA.js";import{_ as E}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./ui-42ANG6Sg.js";const N={class:"backup-page"},T={class:"backup-header"},I={class:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4"},U={class:"flex items-center gap-4"},W={class:"hidden sm:flex flex-col text-xs text-gray-500 dark:text-gray-400 border-l border-gray-200 dark:border-gray-700 pl-4"},q={class:"flex gap-2"},G={class:"font-mono text-gray-900 dark:text-gray-300"},J={class:"flex gap-2"},K={class:"font-mono text-gray-900 dark:text-gray-300"},O={class:"flex flex-wrap items-center gap-2"},Q={class:"w-full sm:hidden flex justify-between text-xs text-gray-500 mb-2"},X={class:"font-mono text-gray-900 dark:text-gray-300"},Y={class:"font-mono text-gray-900 dark:text-gray-300"},Z=["disabled"],ee=["disabled"],te=["disabled"],se={class:"backup-content flex-1 flex flex-col lg:flex-row gap-4 min-h-0"},re={class:"card flex-1 flex flex-col min-h-0 min-h-[300px] lg:min-h-0"},ae={class:"flex-1 overflow-y-auto p-2"},oe={class:"bg-white dark:bg-gray-800 font-mono text-xs text-gray-600 dark:text-gray-400"},ne=["title"],le=["onClick"],ie={key:0,class:"py-8 text-center text-gray-400 flex flex-col items-center"},de={class:"card flex-1 flex flex-col min-h-0 min-h-[300px] lg:min-h-0"},ce={class:"px-4 py-3 border-b border-gray-200 dark:border-gray-700 font-semibold text-gray-700 dark:text-gray-200 text-sm bg-gray-50 dark:bg-gray-800/50 flex justify-between items-center"},ue={class:"text-xs font-normal text-gray-400"},ge={class:"flex-1 overflow-y-auto p-3 bg-gray-50/50 dark:bg-gray-900/50 font-mono text-xs"},me={class:"text-gray-400 select-none min-w-[70px] flex-shrink-0"},xe={key:0,class:"py-8 text-center text-gray-400 flex flex-col items-center"},fe={key:0,class:"fixed inset-0 z-50 overflow-y-auto","aria-labelledby":"modal-title",role:"dialog","aria-modal":"true"},ye={class:"flex items-center justify-center min-h-screen p-4 text-center sm:block sm:p-0"},pe={class:"inline-block align-middle bg-white dark:bg-gray-800 rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 max-w-lg w-full"},ve={class:"px-4 pt-5 pb-4 sm:p-6 sm:pb-4"},ke={class:"sm:flex sm:items-start"},he={class:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left w-full"},be={class:"mt-2 text-sm text-gray-500 dark:text-gray-400 font-mono mb-2 bg-gray-100 dark:bg-gray-700 p-2 rounded flex items-center"},we={class:"mt-2 border border-gray-200 dark:border-gray-700 rounded-md overflow-hidden h-64 overflow-y-auto"},_e={class:"divide-y divide-gray-200 dark:divide-gray-700"},Ce=["onClick"],Be={key:0,class:"w-5 h-5 text-yellow-400 mr-3",fill:"currentColor",viewBox:"0 0 20 20"},je={key:1,class:"w-5 h-5 text-gray-400 mr-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},De={class:"text-sm font-medium text-gray-900 dark:text-gray-100 flex-1 truncate"},Me=["onClick"],Ae={key:0,class:"px-4 py-4 text-center text-sm text-gray-500"},Le={__name:"Backup",setup(Ve){const o=m({paths:[]}),B=m(!1),d=m(!1),p=m([]),v=m(!1),c=m("."),k=m([]),x=m(["."]),a=(s,t="info")=>{p.value.unshift({time:new Date().toLocaleTimeString(),msg:s,type:t})},h=async()=>{B.value=!0;try{const s=await y.getBackupConfig();s.success?(o.value=s,o.value.paths||(o.value.paths=[])):a("加载配置失败: "+(s.message||"未知错误"),"error")}catch(s){a("加载配置失败: "+s.message,"error")}finally{B.value=!1}},j=async()=>{try{const s=await y.updateBackupConfig(o.value.paths);s.success?a("配置保存成功","success"):a("配置保存失败: "+s.message,"error")}catch(s){a("配置保存出错: "+s.message,"error")}},M=s=>{o.value.paths.splice(s,1),j()},A=async()=>{if(confirm("确定要重置包含文件为默认列表吗?")){d.value=!0,a("正在重置包含文件...","info");try{const s=await y.resetBackupConfig();s.success?(o.value.paths=s.paths,a("重置包含文件成功","success")):a("重置失败: "+s.message,"error")}catch(s){a("重置出错: "+s.message,"error")}finally{d.value=!1}}},L=async()=>{c.value=".",x.value=["."],await w(c.value),v.value=!0},b=()=>{v.value=!1},w=async s=>{try{const t=await $.listDirectory(s);t&&t.files&&(k.value=t.files.sort((r,u)=>r.isDirectory===u.isDirectory?r.name.localeCompare(u.name):r.isDirectory?-1:1))}catch(t){a("加载文件列表失败: "+t.message,"error")}},V=async s=>{const t=c.value==="."?s.name:`${c.value}/${s.name}`;x.value.push(t),c.value=t,await w(t)},H=async()=>{x.value.length>1&&(x.value.pop(),c.value=x.value[x.value.length-1],await w(c.value))},D=s=>{let t=s.path;t.startsWith("./")&&(t=t.substring(2)),o.value.paths.includes(t)||(o.value.paths.push(t),j()),b()},P=async()=>{if(confirm("确定要开始备份吗?")){d.value=!0,a("开始备份...","info");try{const s=await y.createBackup();s.success?(a("备份成功: "+s.message,"success"),s.details&&s.details.forEach(t=>a(t,"info")),await h()):a("备份失败: "+s.message,"error")}catch(s){a("备份出错: "+s.message,"error")}finally{d.value=!1}}},z=async()=>{if(confirm("⚠️ 确定要恢复备份吗?这将覆盖当前系统文件!")){d.value=!0,a("开始恢复...","warning");try{const s=await y.restoreBackup();s.success?(a("恢复成功: "+s.message,"success"),s.details&&s.details.forEach(t=>a(t,"info")),await h()):a("恢复失败: "+s.message,"error")}catch(s){a("恢复出错: "+s.message,"error")}finally{d.value=!1}}};return F(()=>{h(),a("系统准备就绪")}),(s,t)=>(n(),l("div",N,[e("div",T,[e("div",I,[e("div",U,[t[4]||(t[4]=e("div",null,[e("h2",{class:"text-xl font-semibold"},"系统备份与恢复"),e("p",{class:"text-sm text-gray-500 dark:text-gray-400 mt-1"}," 管理系统关键配置 ")],-1)),e("div",W,[e("div",q,[t[0]||(t[0]=e("span",{class:"w-16 text-right flex-shrink-0"},"上回备份:",-1)),t[1]||(t[1]=g()),e("span",G,i(o.value.lastBackupAt?new Date(o.value.lastBackupAt).toLocaleString():"从未"),1)]),e("div",J,[t[2]||(t[2]=e("span",{class:"w-16 text-right flex-shrink-0"},"上回恢复:",-1)),t[3]||(t[3]=g()),e("span",K,i(o.value.lastRestoreAt?new Date(o.value.lastRestoreAt).toLocaleString():"从未"),1)])])]),e("div",O,[e("div",Q,[e("span",null,[t[5]||(t[5]=g("备份: ",-1)),e("span",X,i(o.value.lastBackupAt?new Date(o.value.lastBackupAt).toLocaleDateString():"从未"),1)]),e("span",null,[t[6]||(t[6]=g("恢复: ",-1)),e("span",Y,i(o.value.lastRestoreAt?new Date(o.value.lastRestoreAt).toLocaleDateString():"从未"),1)])]),e("button",{onClick:P,disabled:d.value,class:"btn btn-success flex-1 sm:flex-none"},[...t[7]||(t[7]=[e("svg",{class:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})],-1),e("span",null,"立即备份",-1)])],8,Z),e("button",{onClick:z,disabled:d.value,class:"btn btn-secondary bg-orange-100 text-orange-700 hover:bg-orange-200 dark:bg-orange-900/30 dark:text-orange-300 dark:hover:bg-orange-900/50 flex-1 sm:flex-none"},[...t[8]||(t[8]=[e("svg",{class:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m-4-4v12"})],-1),e("span",null,"恢复备份",-1)])],8,ee),e("button",{onClick:A,disabled:d.value,class:"btn btn-secondary bg-red-50 text-red-600 hover:bg-red-100 dark:bg-red-900/30 dark:text-red-400 dark:hover:bg-red-900/50 border-red-200 dark:border-red-800/50 flex-1 sm:flex-none"},[...t[9]||(t[9]=[e("svg",{class:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1),e("span",null,"重置包含",-1)])],8,te)])])]),e("div",se,[e("div",re,[e("div",{class:"px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex justify-between items-center bg-gray-50 dark:bg-gray-800/50"},[t[11]||(t[11]=e("h3",{class:"text-sm font-semibold text-gray-700 dark:text-gray-200"},"包含文件",-1)),e("button",{onClick:L,class:"text-xs text-primary-600 hover:text-primary-700 dark:text-primary-400 font-medium flex items-center gap-1"},[...t[10]||(t[10]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),g(" 添加 ",-1)])])]),e("div",ae,[e("div",oe,[(n(!0),l(_,null,C(o.value.paths,(r,u)=>(n(),l("div",{key:r,class:"py-2 px-3 flex justify-between items-center border-b border-dashed border-gray-100 dark:border-gray-700 last:border-0 hover:bg-gray-50 dark:hover:bg-gray-700/50 rounded transition-colors"},[e("span",{class:"truncate break-all mr-2",title:r},i(r),9,ne),e("button",{onClick:He=>M(u),class:"text-gray-400 hover:text-red-500 p-1 flex-shrink-0 transition-colors",title:"删除"},[...t[12]||(t[12]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,le)]))),128)),!o.value.paths||o.value.paths.length===0?(n(),l("div",ie,[...t[13]||(t[13]=[e("svg",{class:"w-8 h-8 mb-2 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 13h6m-3-3v6m5 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1),g(" 暂无包含文件 ",-1)])])):f("",!0)])])]),e("div",de,[e("div",ce,[t[14]||(t[14]=e("span",null,"操作日志",-1)),e("span",ue,i(p.value.length)+" 条记录",1)]),e("div",ge,[(n(!0),l(_,null,C(p.value,(r,u)=>(n(),l("div",{key:u,class:"mb-2 flex gap-2 pb-1 border-b border-gray-100 dark:border-gray-800/50 last:border-0"},[e("span",me,i(r.time),1),e("span",{class:R(["break-words",{"text-green-600 dark:text-green-400":r.type==="success","text-red-600 dark:text-red-400":r.type==="error","text-orange-500":r.type==="warning","text-gray-700 dark:text-gray-300":r.type==="info"}])},i(r.msg),3)]))),128)),p.value.length===0?(n(),l("div",xe,[...t[15]||(t[15]=[e("svg",{class:"w-8 h-8 mb-2 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),g(" 暂无日志记录 ",-1)])])):f("",!0)])])]),v.value?(n(),l("div",fe,[e("div",ye,[e("div",{class:"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity",onClick:b}),t[20]||(t[20]=e("span",{class:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true"},"",-1)),e("div",pe,[e("div",ve,[e("div",ke,[e("div",he,[t[19]||(t[19]=e("h3",{class:"text-lg leading-6 font-medium text-gray-900 dark:text-gray-100",id:"modal-title"}," 选择文件或目录 ",-1)),e("div",be,[x.value.length>1?(n(),l("button",{key:0,onClick:H,class:"mr-2 text-primary-600 hover:text-primary-700"},[...t[16]||(t[16]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 19l-7-7m0 0l7-7m-7 7h18"})],-1)])])):f("",!0),g(" "+i(c.value),1)]),e("div",we,[e("ul",_e,[(n(!0),l(_,null,C(k.value,r=>(n(),l("li",{key:r.name,class:"hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},[e("div",{class:"flex items-center px-4 py-2 cursor-pointer",onClick:u=>r.isDirectory?V(r):D(r)},[r.isDirectory?(n(),l("svg",Be,[...t[17]||(t[17]=[e("path",{d:"M2 6a2 2 0 012-2h5l2 2h5a2 2 0 012 2v6a2 2 0 01-2 2H4a2 2 0 01-2-2V6z"},null,-1)])])):(n(),l("svg",je,[...t[18]||(t[18]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"},null,-1)])])),e("span",De,i(r.name),1),r.isDirectory?(n(),l("button",{key:2,onClick:S(u=>D(r),["stop"]),class:"ml-2 px-2 py-1 text-xs bg-primary-50 text-primary-600 dark:bg-primary-900/30 dark:text-primary-400 rounded hover:bg-primary-100 dark:hover:bg-primary-900/50 transition-colors"}," 选择此目录 ",8,Me)):f("",!0)],8,Ce)]))),128)),k.value.length===0?(n(),l("li",Ae," 空目录 ")):f("",!0)])])])])]),e("div",{class:"bg-gray-50 dark:bg-gray-700/50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse"},[e("button",{type:"button",class:"w-full inline-flex justify-center rounded-md border border-gray-300 dark:border-gray-600 shadow-sm px-4 py-2 bg-white dark:bg-gray-800 text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm",onClick:b}," 取消 ")])])])])):f("",!0)]))}},$e=E(Le,[["__scopeId","data-v-7ae98012"]]);export{$e as default};
diff --git a/apps/admin/assets/Config-B72N75gm.js b/apps/admin/assets/Config-B72N75gm.js
new file mode 100644
index 00000000..2626e9a9
--- /dev/null
+++ b/apps/admin/assets/Config-B72N75gm.js
@@ -0,0 +1 @@
+import{d as R,r as f,z as U,o as n,b as i,e as t,E as M,G as S,k as h,i as y,j as w,F as C,f as j,t as p,y as v,n as q}from"./vendor-B6xRL-fs.js";import{a as A}from"./admin-DEAtY0pm.js";import{_ as F}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./ui-42ANG6Sg.js";const O={async getConfig(){return await A.getConfig()},async updateConfig(g,o){return await A.updateConfig(g,o)},async getConfigValue(g){return await A.getConfig(g)}},N=R("config",()=>{const g=f(null),o=f(!1),l=f(null),c=async()=>{o.value=!0,l.value=null;try{g.value=await O.getConfig()}catch(d){l.value=d.message,console.error("Failed to fetch config:",d)}finally{o.value=!1}};return{config:g,loading:o,error:l,fetchConfig:c,updateConfig:async(d,b)=>{o.value=!0,l.value=null;try{await O.updateConfig(d,b),await c()}catch(k){throw l.value=k.message,console.error("Failed to update config:",k),k}finally{o.value=!1}}}}),$={class:"config-page"},E={class:"config-header"},G={class:"flex flex-col sm:flex-row sm:items-center justify-between gap-4"},J={class:"flex flex-col sm:flex-row items-center gap-3"},X={class:"relative w-full sm:w-64"},Y=["disabled"],Q={key:0,class:"w-4 h-4 mr-2 animate-spin",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},W={key:1,class:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Z={class:"mt-4 flex overflow-x-auto hide-scrollbar gap-2 pb-1"},ee=["onClick"],te={class:"config-content"},oe={key:0,class:"flex justify-center py-12"},se={key:1,class:"card p-6 border-red-200 dark:border-red-800"},re={class:"text-red-600 dark:text-red-400"},ae={key:2,class:"card p-12 flex flex-col items-center justify-center text-gray-500 dark:text-gray-400"},ne={key:3,class:"space-y-6 pb-6"},ie={class:"px-4 sm:px-6 py-3 sm:py-4 bg-gray-50 dark:bg-gray-700/50 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between"},le={class:"font-semibold text-gray-900 dark:text-gray-100 flex items-center gap-2"},de={class:"text-xs font-medium bg-gray-200 dark:bg-gray-600 text-gray-600 dark:text-gray-300 px-2 py-0.5 rounded-full"},ce={class:"divide-y divide-gray-100 dark:divide-gray-800"},ue={class:"flex flex-col sm:flex-row sm:items-start gap-4"},pe={class:"flex-1 min-w-0"},_e={class:"flex items-center gap-2 mb-1"},me={class:"text-base sm:text-lg opacity-80",title:"数据类型"},ge={class:"font-mono text-sm sm:text-base font-bold text-gray-900 dark:text-gray-100 break-all"},ye={key:0,class:"text-xs sm:text-sm text-gray-500 dark:text-gray-400 mb-3 pl-6 sm:pl-7"},fe={key:1,class:"pl-6 sm:pl-7 mt-2"},ke={class:"relative bg-gray-100 dark:bg-gray-800 rounded-md border border-gray-200 dark:border-gray-700 overflow-hidden group-hover:border-primary-300 dark:group-hover:border-primary-700 transition-colors"},be={class:"block p-3 text-xs sm:text-sm font-mono text-gray-800 dark:text-gray-200 break-all whitespace-pre-wrap max-h-32 overflow-y-auto custom-scrollbar"},xe={key:2,class:"pl-0 sm:pl-7 mt-3"},he={class:"bg-primary-50 dark:bg-primary-900/10 p-3 sm:p-4 rounded-lg border border-primary-200 dark:border-primary-800"},ve={class:"block text-xs font-medium text-primary-700 dark:text-primary-400 mb-2"},we=["placeholder"],Ce={class:"flex flex-wrap gap-3 mt-4"},je=["onClick"],Ae={key:0,class:"flex sm:flex-col gap-2 pl-6 sm:pl-0 mt-2 sm:mt-0 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity"},Be=["onClick"],Ke={__name:"Config",setup(g){const o=N(),l=f(null),c=f(""),_=f(""),d=f("全部"),b={quark_cookie:"夸克网盘 Cookie,用于夸克网盘资源解析",quark_token_cookie:"夸克网盘 Token",uc_cookie:"UC 网盘 Cookie",uc_token_cookie:"UC 网盘 Token",ali_token:"阿里云盘 Token",ali_refresh_token:"阿里云盘刷新令牌",pikpak_token:"PikPak Token",xun_username:"迅雷账号",xun_password:"迅雷密码",yun_account:"移动云盘账号",yun_cookie:"移动云盘 Cookie",bili_cookie:"Bilibili Cookie,用于 B站资源解析",spark_ai_authKey:"讯飞星火 AI 认证密钥",deepseek_apiKey:"DeepSeek API 密钥",kimi_apiKey:"Kimi API 密钥",now_ai:"当前使用的 AI 服务 (1=讯飞, 2=DeepSeek, 3=Kimi)",sparkBotObject:"讯飞机器人配置对象",enable_system_proxy:"启用系统代理 (0=禁用, 1=启用)",PROXY_AUTH:"代理认证密码",play_proxy_mode:"播放代理模式",play_local_proxy_type:"本地代理类型",enable_doh:"启用 DoH (0=禁用, 1=启用)",allow_ftp_cache_clear:"允许 FTP 缓存清理 (0=禁用, 1=启用)",allow_webdav_cache_clear:"允许 WebDAV 缓存清理 (0=禁用, 1=启用)",cloud_account:"云盘账号",cloud_password:"云盘密码",cloud_cookie:"云盘 Cookie",pan_passport:"网盘账号",pan_password:"网盘密码",pan_auth:"网盘认证令牌",thread:"并发线程数",api_pwd:"API 访问密码",allow_forward:"允许转发 (0=禁用, 1=启用)",link_url:"链接推送 URL",enable_link_data:"启用链接数据",enable_link_push:"启用链接推送",enable_link_jar:"启用 JAR 链接",mg_hz:"MG 赫兹设置",baidu_cookie:"百度 Cookie,用于百度网盘",enable_rule_name:"显示规则名称 (0=禁用, 1=启用)",must_sub_code:"强制订阅代码 (0=禁用, 1=启用)",enable_dr2:"启用 DR2 引擎 (0=禁用, 1=启用)",enable_py:"启用 Python 引擎 (0=禁用, 1=启用, 2=自动)",enable_php:"启用 PHP 引擎 (0=禁用, 1=启用)",enable_cat:"启用 CatVod 引擎 (0=禁用, 1=启用, 2=自动)",enable_old_config:"启用旧配置格式",show_curl:"显示 cURL 命令",show_req:"显示请求详情",hide_adult:"隐藏成人内容 (0=显示, 1=隐藏)",enable_self_jx:"启用自建解析",cat_sub_code:"CatVod 订阅代码"},k={云盘配置:["quark_cookie","quark_token_cookie","uc_cookie","uc_token_cookie","ali_token","ali_refresh_token","pikpak_token","cloud_account","cloud_password","cloud_cookie","yun_account","yun_cookie","pan_passport","pan_password","pan_auth","xun_username","xun_password"],视频平台:["bili_cookie","baidu_cookie"],"AI 服务":["spark_ai_authKey","deepseek_apiKey","kimi_apiKey","now_ai","sparkBotObject"],代理设置:["enable_system_proxy","PROXY_AUTH","play_proxy_mode","play_local_proxy_type","enable_doh","allow_forward","allow_ftp_cache_clear","allow_webdav_cache_clear"],引擎设置:["enable_dr2","enable_py","enable_php","enable_cat","enable_old_config","enable_self_jx"],其他设置:["thread","api_pwd","link_url","enable_link_data","enable_link_push","enable_link_jar","mg_hz","show_curl","show_req","enable_rule_name","hide_adult","cat_sub_code","must_sub_code"]},B=v(()=>{const s={...k};if(o.config){const e=new Set(Object.values(k).flat()),r=Object.keys(o.config).filter(m=>!e.has(m));r.length>0&&(s.未分类配置=r)}return s}),P=v(()=>["全部",...Object.keys(B.value)]),K=v(()=>{if(!o.config)return{};const s={},e=_.value.toLowerCase().trim();for(const[r,m]of Object.entries(B.value)){if(d.value!=="全部"&&d.value!==r)continue;const u={};for(const a of m)if(o.config){a in o.config&&String(o.config[a]);const x=b[a]||"";(!e||a.toLowerCase().includes(e)||x.toLowerCase().includes(e))&&(u[a]=a in o.config?o.config[a]:"")}Object.keys(u).length>0&&(s[r]=u)}return s}),V=v(()=>Object.keys(K.value).length>0);U(()=>{o.fetchConfig()});const z=(s,e)=>{l.value=s,c.value=typeof e=="object"?JSON.stringify(e,null,2):e},H=()=>{l.value=null,c.value=""},L=async s=>{try{await o.updateConfig(s,c.value),l.value=null,c.value=""}catch(e){alert("保存失败: "+e.message)}},T=(s,e)=>e&&(["cookie","token","password","authKey","apiKey","auth"].some(u=>s.toLowerCase().includes(u))&&typeof e=="string"&&e.length>8?e.substring(0,4)+"****"+e.substring(e.length-4):e),D=s=>s==="0"||s==="1"?"🔢":typeof s=="object"?"📦":"📝",I=s=>typeof s=="object"?JSON.stringify(s):String(s);return(s,e)=>(n(),i("div",$,[t("div",E,[t("div",G,[e[10]||(e[10]=t("div",null,[t("h2",{class:"text-xl font-semibold"},"环境变量配置"),t("p",{class:"text-sm text-gray-500 dark:text-gray-400 mt-1"}," 管理 drpy-node 的环境变量和配置项 ")],-1)),t("div",J,[t("div",X,[e[6]||(e[6]=t("div",{class:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"},[t("svg",{class:"h-4 w-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})])],-1)),M(t("input",{"onUpdate:modelValue":e[0]||(e[0]=r=>_.value=r),type:"text",class:"input pl-10 pr-8 w-full",placeholder:"搜索变量名或描述..."},null,512),[[S,_.value]]),_.value?(n(),i("button",{key:0,onClick:e[1]||(e[1]=r=>_.value=""),class:"absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"},[...e[5]||(e[5]=[t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])):h("",!0)]),t("button",{onClick:e[2]||(e[2]=r=>y(o).fetchConfig()),disabled:y(o).loading,class:"btn btn-secondary whitespace-nowrap shrink-0 w-full sm:w-auto justify-center"},[y(o).loading?(n(),i("svg",Q,[...e[7]||(e[7]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])])):(n(),i("svg",W,[...e[8]||(e[8]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])])),e[9]||(e[9]=w(" 刷新 ",-1))],8,Y)])]),t("div",Z,[(n(!0),i(C,null,j(P.value,r=>(n(),i("button",{key:r,onClick:m=>d.value=r,class:q(["px-4 py-2 rounded-lg text-sm font-medium whitespace-nowrap transition-colors",d.value===r?"bg-primary-100 text-primary-700 dark:bg-primary-900/30 dark:text-primary-400":"bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 border border-gray-200 dark:border-gray-700"])},p(r),11,ee))),128))])]),t("div",te,[y(o).loading&&!y(o).config?(n(),i("div",oe,[...e[11]||(e[11]=[t("div",{class:"animate-spin rounded-full h-12 w-12 border-b-2 border-primary-600"},null,-1)])])):y(o).error?(n(),i("div",se,[t("p",re,"加载配置失败: "+p(y(o).error),1)])):V.value?(n(),i("div",ne,[(n(!0),i(C,null,j(K.value,(r,m)=>(n(),i("div",{key:m,class:"card overflow-hidden shadow-sm"},[t("div",ie,[t("h3",le,[e[15]||(e[15]=t("span",{class:"w-1.5 h-4 bg-primary-500 rounded-full"},null,-1)),w(" "+p(m),1)]),t("span",de,p(Object.keys(r).length)+" 项 ",1)]),t("div",ce,[(n(!0),i(C,null,j(r,(u,a)=>(n(),i("div",{key:a,class:"p-4 sm:p-5 hover:bg-gray-50 dark:hover:bg-gray-700/30 transition-colors group"},[t("div",ue,[t("div",pe,[t("div",_e,[t("span",me,p(D(u)),1),t("h4",ge,p(a),1)]),b[a]?(n(),i("p",ye,p(b[a]),1)):h("",!0),l.value!==a?(n(),i("div",fe,[t("div",ke,[t("code",be,p(T(a,I(u))||" "),1)])])):(n(),i("div",xe,[t("div",he,[t("label",ve,"编辑 "+p(a),1),M(t("textarea",{"onUpdate:modelValue":e[4]||(e[4]=x=>c.value=x),class:"input min-h-[120px] font-mono text-sm w-full resize-y focus:ring-2 focus:ring-primary-500",placeholder:"输入 "+a+" 的值"},null,8,we),[[S,c.value]]),t("div",Ce,[t("button",{onClick:x=>L(a),class:"btn btn-primary text-sm flex-1 sm:flex-none justify-center"},[...e[16]||(e[16]=[t("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1),w(" 保存更改 ",-1)])],8,je),t("button",{onClick:H,class:"btn btn-secondary text-sm flex-1 sm:flex-none justify-center"}," 取消编辑 ")])])]))]),l.value!==a?(n(),i("div",Ae,[t("button",{onClick:x=>z(a,u),class:"flex items-center gap-1.5 px-3 py-1.5 sm:p-2 rounded-md bg-white sm:bg-transparent border border-gray-300 sm:border-transparent text-gray-700 dark:text-gray-300 hover:bg-primary-50 dark:hover:bg-gray-700 hover:text-primary-600 dark:hover:text-primary-400 transition-colors shadow-sm sm:shadow-none text-sm font-medium",title:"编辑此项"},[...e[17]||(e[17]=[t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"})],-1),t("span",{class:"sm:hidden"},"编辑",-1)])],8,Be)])):h("",!0)])]))),128))])]))),128))])):(n(),i("div",ae,[e[12]||(e[12]=t("svg",{class:"w-12 h-12 mb-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e[13]||(e[13]=t("p",{class:"text-lg font-medium text-gray-900 dark:text-gray-100"},"未找到匹配的配置项",-1)),e[14]||(e[14]=t("p",{class:"mt-1"},"请尝试更换搜索词或选择其他分类",-1)),_.value||d.value!=="全部"?(n(),i("button",{key:0,onClick:e[3]||(e[3]=r=>{_.value="",d.value="全部"}),class:"mt-4 text-primary-600 hover:text-primary-700 font-medium"}," 清除筛选 ")):h("",!0)]))])]))}},Ve=F(Ke,[["__scopeId","data-v-1086944a"]]);export{Ve as default};
diff --git a/apps/admin/assets/Config-CsAT4E8O.css b/apps/admin/assets/Config-CsAT4E8O.css
new file mode 100644
index 00000000..4917d826
--- /dev/null
+++ b/apps/admin/assets/Config-CsAT4E8O.css
@@ -0,0 +1 @@
+.config-page[data-v-1086944a]{display:flex;flex-direction:column;height:calc(100vh - 12rem);min-height:500px}.config-header[data-v-1086944a]{flex-shrink:0;padding-bottom:1rem}.config-content[data-v-1086944a]{flex:1;overflow-y:auto;min-height:0}.hide-scrollbar[data-v-1086944a]{-ms-overflow-style:none;scrollbar-width:none}.hide-scrollbar[data-v-1086944a]::-webkit-scrollbar{display:none}.custom-scrollbar[data-v-1086944a]::-webkit-scrollbar{width:6px;height:6px}.custom-scrollbar[data-v-1086944a]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-1086944a]::-webkit-scrollbar-thumb{background:#9ca3af80;border-radius:3px}.custom-scrollbar[data-v-1086944a]::-webkit-scrollbar-thumb:hover{background:#6b7280cc}
diff --git a/apps/admin/assets/Dashboard-CB7r-Nk7.js b/apps/admin/assets/Dashboard-CB7r-Nk7.js
new file mode 100644
index 00000000..08e8a54d
--- /dev/null
+++ b/apps/admin/assets/Dashboard-CB7r-Nk7.js
@@ -0,0 +1 @@
+import{u as V}from"./system-BaTh0baW.js";import{_ as H}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{z as S,v as z,o as u,b as p,e,n as x,j as N,t as a,i as o,k as L,g as d,h as i,r as _,D as A}from"./vendor-B6xRL-fs.js";import"./system-CxybzrTo.js";import"./admin-DEAtY0pm.js";import"./ui-42ANG6Sg.js";import"./spider-Bxy9e0gU.js";const U={class:"dashboard-page"},D={class:"dashboard-header"},I={class:"card p-6"},J={class:"flex items-center justify-between mb-4"},O={class:"flex items-center gap-3"},P=["disabled"],R={key:0,class:"w-4 h-4 mr-2 animate-spin",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},$={key:1,class:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},E={class:"flex items-center justify-between"},K={class:"flex items-center gap-3"},T={class:"text-gray-600 dark:text-gray-400"},W={key:0,class:"text-sm text-gray-500"},Y={class:"mt-4 pt-4 border-t border-gray-100 dark:border-gray-700 flex justify-between items-center text-sm"},q={class:"badge badge-info font-mono text-xs"},F={class:"dashboard-content flex flex-col gap-4"},G={class:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3"},Q={class:"card p-4"},X={class:"flex items-center justify-between"},Z={class:"text-xl font-bold text-gray-900 dark:text-gray-100 mt-0.5"},ee={class:"card p-4"},te={class:"flex items-center justify-between"},re={class:"text-xl font-bold text-gray-900 dark:text-gray-100 mt-0.5"},se={class:"card p-4"},oe={class:"flex items-center justify-between"},ae={class:"text-xl font-bold text-gray-900 dark:text-gray-100 mt-0.5"},le={class:"card p-4"},ne={class:"flex items-center justify-between"},de={class:"text-xl font-bold text-gray-900 dark:text-gray-100 mt-0.5"},ie={class:"card p-4"},ce={class:"flex items-center justify-between"},ge={class:"text-xl font-bold text-gray-900 dark:text-gray-100 mt-0.5"},ue={class:"card p-4"},pe={class:"flex items-center justify-between"},he={class:"text-xl font-bold text-gray-900 dark:text-gray-100 mt-0.5"},xe={class:"card p-5"},me={class:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3"},fe={__name:"Dashboard",setup(ke){const r=V(),h=_(null);S(async()=>{await r.checkHealth(),await r.fetchRoutes(),await r.fetchSources(),h.value=setInterval(()=>{r.checkHealth()},3e4)}),z(()=>{h.value&&clearInterval(h.value)});const M=l=>{switch(l){case"ok":case"healthy":return"badge-success";case"error":case"unhealthy":return"badge-error";default:return"badge-warning"}},g=_(!1),C=l=>{if(!l)return"0秒";const t=Math.floor(l/(3600*24)),s=Math.floor(l%(3600*24)/3600),n=Math.floor(l%3600/60);let c="";return t>0&&(c+=`${t}天`),(s>0||t>0)&&(c+=`${s}时`),c+=`${n}分`,c},B=async()=>{var l,t;if(confirm("确定要重启 drpy-node 服务吗?这将中断所有连接。")){g.value=!0;try{const s=await r.restartService();let n="操作已完成";try{(t=(l=s==null?void 0:s.content)==null?void 0:l[0])!=null&&t.text?n=JSON.parse(s.content[0].text).message||n:typeof s=="string"&&(n=JSON.parse(s).message||s)}catch{n="操作已完成,请检查服务状态"}alert(n)}catch(s){alert("重启失败: "+s.message)}finally{g.value=!1}}};return(l,t)=>{var n,c,m,f,k,v,y,b,w,j;const s=A("RouterLink");return u(),p("div",U,[e("div",D,[e("div",I,[e("div",J,[t[2]||(t[2]=e("h3",{class:"text-lg font-semibold"},"服务状态",-1)),e("div",O,[e("button",{onClick:B,disabled:g.value,class:x(["btn btn-secondary text-sm",{"opacity-50 cursor-not-allowed":g.value}])},[g.value?(u(),p("svg",R,[...t[0]||(t[0]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])])):(u(),p("svg",$,[...t[1]||(t[1]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])])),N(" "+a(g.value?"重启中...":"重启服务"),1)],10,P),e("span",{class:x(["badge",M(o(r).health.status)])},a(((n=o(r).health.status)==null?void 0:n.toUpperCase())||"UNKNOWN"),3)])]),e("div",E,[e("div",K,[e("div",{class:x(["w-3 h-3 rounded-full animate-pulse-slow",o(r).health.status==="ok"||o(r).health.status==="healthy"?"bg-green-500":"bg-red-500"])},null,2),e("span",T,a(o(r).health.status==="ok"||o(r).health.status==="healthy"?"服务运行正常":"服务异常"),1)]),o(r).health.uptime?(u(),p("span",W," 运行时长: "+a(C(o(r).health.uptime)),1)):L("",!0)]),e("div",Y,[t[3]||(t[3]=e("span",{class:"text-gray-500"},"系统版本",-1)),e("span",q,"v"+a(o(r).health.version||"Unknown"),1)])])]),e("div",F,[e("div",G,[e("div",Q,[e("div",X,[e("div",null,[t[4]||(t[4]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"JS 源",-1)),e("p",Z,a(((c=o(r).sources.js)==null?void 0:c.length)||0),1)]),t[5]||(t[5]=e("div",{class:"w-10 h-10 rounded-lg bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-blue-600 dark:text-blue-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})])],-1))])]),e("div",ee,[e("div",te,[e("div",null,[t[6]||(t[6]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"CatVod 源",-1)),e("p",re,a(((m=o(r).sources.catvod)==null?void 0:m.length)||0),1)]),t[7]||(t[7]=e("div",{class:"w-10 h-10 rounded-lg bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-purple-600 dark:text-purple-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"})])],-1))])]),e("div",se,[e("div",oe,[e("div",null,[t[8]||(t[8]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"PHP 源",-1)),e("p",ae,a(((f=o(r).sources.php)==null?void 0:f.length)||0),1)]),t[9]||(t[9]=e("div",{class:"w-10 h-10 rounded-lg bg-indigo-100 dark:bg-indigo-900/30 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-indigo-600 dark:text-indigo-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"})])],-1))])]),e("div",le,[e("div",ne,[e("div",null,[t[10]||(t[10]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"PY 源",-1)),e("p",de,a(((k=o(r).sources.py)==null?void 0:k.length)||0),1)]),t[11]||(t[11]=e("div",{class:"w-10 h-10 rounded-lg bg-yellow-100 dark:bg-yellow-900/30 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-yellow-600 dark:text-yellow-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})])],-1))])]),e("div",ie,[e("div",ce,[e("div",null,[t[12]||(t[12]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"总源数",-1)),e("p",ge,a((((v=o(r).sources.js)==null?void 0:v.length)||0)+(((y=o(r).sources.catvod)==null?void 0:y.length)||0)+(((b=o(r).sources.php)==null?void 0:b.length)||0)+(((w=o(r).sources.py)==null?void 0:w.length)||0)),1)]),t[13]||(t[13]=e("div",{class:"w-10 h-10 rounded-lg bg-orange-100 dark:bg-orange-900/30 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-orange-600 dark:text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 10h16M4 14h16M4 18h16"})])],-1))])]),e("div",ue,[e("div",pe,[e("div",null,[t[14]||(t[14]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"路由数",-1)),e("p",he,a(((j=o(r).routes.registered_controllers)==null?void 0:j.length)||0),1)]),t[15]||(t[15]=e("div",{class:"w-10 h-10 rounded-lg bg-green-100 dark:bg-green-900/30 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-green-600 dark:text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"})])],-1))])])]),e("div",xe,[t[26]||(t[26]=e("h3",{class:"text-base font-semibold mb-3"},"快捷操作",-1)),e("div",me,[d(s,{to:"/config",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[16]||(t[16]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z"})],-1),e("span",{class:"text-sm font-medium"},"环境配置",-1)])]),_:1}),d(s,{to:"/sources",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[17]||(t[17]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 10h16M4 14h16M4 18h16"})],-1),e("span",{class:"text-sm font-medium"},"源管理",-1)])]),_:1}),d(s,{to:"/map-manager",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[18]||(t[18]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"})],-1),e("span",{class:"text-sm font-medium"},"站源映射",-1)])]),_:1}),d(s,{to:"/parses",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[19]||(t[19]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})],-1),e("span",{class:"text-sm font-medium"},"解析管理",-1)])]),_:1}),d(s,{to:"/files",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[20]||(t[20]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"})],-1),e("span",{class:"text-sm font-medium"},"文件管理",-1)])]),_:1}),d(s,{to:"/database",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[21]||(t[21]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"})],-1),e("span",{class:"text-sm font-medium"},"数据库",-1)])]),_:1}),d(s,{to:"/api-docs",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[22]||(t[22]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1),e("span",{class:"text-sm font-medium"},"接口文档",-1)])]),_:1}),d(s,{to:"/logs",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[23]||(t[23]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),e("span",{class:"text-sm font-medium"},"日志查看",-1)])]),_:1}),d(s,{to:"/subscription",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[24]||(t[24]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"})],-1),e("span",{class:"text-sm font-medium"},"订阅管理",-1)])]),_:1}),d(s,{to:"/backup",class:"flex flex-col items-center justify-center gap-2 p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"},{default:i(()=>[...t[25]||(t[25]=[e("svg",{class:"w-6 h-6 text-primary-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1),e("span",{class:"text-sm font-medium"},"备份恢复",-1)])]),_:1})])])])])}}},Ce=H(fe,[["__scopeId","data-v-7050095a"]]);export{Ce as default};
diff --git a/apps/admin/assets/Dashboard-CDeJVBM_.css b/apps/admin/assets/Dashboard-CDeJVBM_.css
new file mode 100644
index 00000000..3f3e163d
--- /dev/null
+++ b/apps/admin/assets/Dashboard-CDeJVBM_.css
@@ -0,0 +1 @@
+.dashboard-page[data-v-7050095a]{display:flex;flex-direction:column;height:calc(100vh - 12rem);min-height:500px}.dashboard-header[data-v-7050095a]{flex-shrink:0;padding-bottom:1rem}.dashboard-content[data-v-7050095a]{flex:1;overflow-y:auto;min-height:0}
diff --git a/apps/admin/assets/Database-CBuEZ2qV.js b/apps/admin/assets/Database-CBuEZ2qV.js
new file mode 100644
index 00000000..ca1f627c
--- /dev/null
+++ b/apps/admin/assets/Database-CBuEZ2qV.js
@@ -0,0 +1 @@
+import{o as t,b as a,e,F as y,f as g,E,G as q,K as k,L as h,k as m,j as A,t as i,r as b}from"./vendor-B6xRL-fs.js";import{a as _}from"./admin-DEAtY0pm.js";import{_ as T}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./ui-42ANG6Sg.js";const C={async query(d){return(await _.executeQuery(d)).data},async getTables(){return(await _.getTables()).tables},async getTableSchema(d){return(await _.getTableSchema(d)).columns}},L={class:"database-page"},M={class:"database-header"},R={class:"card p-4"},S={class:"flex flex-wrap gap-2"},Q=["onClick"],j={class:"database-content"},B={class:"card overflow-hidden"},D={class:"p-4 border-b border-gray-200 dark:border-gray-700"},O=["onKeydown"],F={class:"flex items-center justify-between mt-3"},K=["disabled"],V={key:0,class:"w-4 h-4 mr-2 animate-spin",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},H={key:0,class:"p-4 bg-red-50 dark:bg-red-900/20 border-t border-red-200 dark:border-red-800"},I={class:"text-red-600 dark:text-red-400 font-mono text-sm"},N={key:1,class:"overflow-x-auto"},G={key:0,class:"min-w-full"},z={class:"w-full text-sm"},P={class:"bg-gray-50 dark:bg-gray-700/50"},U={class:"divide-y divide-gray-200 dark:divide-gray-700"},W={key:1,class:"p-8 text-center text-gray-500"},Y={key:2,class:"p-4 text-sm text-gray-500 dark:text-gray-400 border-t border-gray-200 dark:border-gray-700"},$={__name:"Database",setup(d){const l=b(""),s=b(null),u=b(!1),c=b(null),f=[{name:"查看所有表",sql:"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"},{name:"查看表结构",sql:"PRAGMA table_info(table_name);"},{name:"查询前10条记录",sql:"SELECT * FROM table_name LIMIT 10;"}],v=async()=>{if(l.value.trim()){u.value=!0,c.value=null,s.value=null;try{const n=await C.query(l.value);s.value=n}catch(n){c.value=n.message}finally{u.value=!1}}},w=n=>{l.value=n};return(n,r)=>(t(),a("div",L,[e("div",M,[r[2]||(r[2]=e("div",null,[e("h2",{class:"text-xl font-semibold"},"数据库查询"),e("p",{class:"text-sm text-gray-500 dark:text-gray-400 mt-1"}," 执行只读 SQL 查询 ")],-1)),e("div",R,[r[1]||(r[1]=e("h3",{class:"text-sm font-medium text-gray-700 dark:text-gray-300 mb-3"},"示例查询",-1)),e("div",S,[(t(),a(y,null,g(f,o=>e("button",{key:o.name,onClick:x=>w(o.sql),class:"px-3 py-1.5 text-sm rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors"},i(o.name),9,Q)),64))])])]),e("div",j,[e("div",B,[e("div",D,[E(e("textarea",{"onUpdate:modelValue":r[0]||(r[0]=o=>l.value=o),placeholder:"输入 SQL 查询语句...",class:"w-full min-h-[120px] p-3 bg-gray-50 dark:bg-gray-900 border border-gray-300 dark:border-gray-600 rounded-lg font-mono text-sm resize-none focus:outline-none focus:ring-2 focus:ring-primary-500",spellcheck:"false",onKeydown:[k(h(v,["ctrl"]),["enter"]),k(h(v,["meta"]),["enter"])]},null,40,O),[[q,l.value]]),e("div",F,[r[5]||(r[5]=e("span",{class:"text-xs text-gray-500"}," 按 Ctrl+Enter 执行查询 ",-1)),e("button",{onClick:v,disabled:u.value||!l.value.trim(),class:"btn btn-primary"},[u.value?(t(),a("svg",V,[...r[3]||(r[3]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])])):m("",!0),r[4]||(r[4]=A(" 执行查询 ",-1))],8,K)])]),c.value?(t(),a("div",H,[e("p",I,i(c.value),1)])):m("",!0),s.value?(t(),a("div",N,[Array.isArray(s.value)&&s.value.length>0?(t(),a("div",G,[e("table",z,[e("thead",P,[e("tr",null,[(t(!0),a(y,null,g(Object.keys(s.value[0]),o=>(t(),a("th",{key:o,class:"px-4 py-3 text-left font-medium text-gray-700 dark:text-gray-300 border-b border-gray-200 dark:border-gray-700"},i(o),1))),128))])]),e("tbody",U,[(t(!0),a(y,null,g(s.value,(o,x)=>(t(),a("tr",{key:x,class:"hover:bg-gray-50 dark:hover:bg-gray-700/30"},[(t(!0),a(y,null,g(Object.keys(s.value[0]),p=>(t(),a("td",{key:p,class:"px-4 py-3 font-mono text-gray-900 dark:text-gray-100"},i(o[p]),1))),128))]))),128))])])])):(t(),a("div",W," 查询成功,无结果返回 ")),s.value&&Array.isArray(s.value)?(t(),a("div",Y," 查询返回 "+i(s.value.length)+" 行结果 ",1)):m("",!0)])):m("",!0)])])]))}},te=T($,[["__scopeId","data-v-b4aae15e"]]);export{te as default};
diff --git a/apps/admin/assets/Database-VwOSuNal.css b/apps/admin/assets/Database-VwOSuNal.css
new file mode 100644
index 00000000..f7b41b98
--- /dev/null
+++ b/apps/admin/assets/Database-VwOSuNal.css
@@ -0,0 +1 @@
+.database-page[data-v-b4aae15e]{display:flex;flex-direction:column;height:calc(100vh - 12rem);min-height:500px}.database-header[data-v-b4aae15e]{flex-shrink:0;padding-bottom:1rem}.database-content[data-v-b4aae15e]{flex:1;overflow-y:auto;min-height:0}
diff --git a/apps/admin/assets/Files-67eeMvv5.js b/apps/admin/assets/Files-67eeMvv5.js
new file mode 100644
index 00000000..08b5eaf5
--- /dev/null
+++ b/apps/admin/assets/Files-67eeMvv5.js
@@ -0,0 +1 @@
+import{f as F}from"./file-D4KCgIsA.js";import{_ as N}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{z as A,o,b as r,e,F as D,f as E,k as h,t as i,I as T,r as p,y as P,n as _,j as V}from"./vendor-B6xRL-fs.js";import"./admin-DEAtY0pm.js";import"./ui-42ANG6Sg.js";const z={class:"files-page"},U={class:"files-header"},X={class:"card p-4"},O={class:"flex items-center gap-2 text-sm overflow-x-auto"},R=["onClick"],$={key:0,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},q={class:"files-content"},G={class:"grid grid-cols-1 lg:grid-cols-2 gap-6 h-full"},H={class:"card flex flex-col h-full overflow-hidden"},W={class:"divide-y divide-gray-200 dark:divide-gray-700 flex-1 overflow-y-auto"},J={key:0,class:"p-12 text-center"},K=["onClick"],Q={class:"text-xl"},Y={key:0,class:"badge badge-info text-xs shrink-0"},Z={key:1,class:"badge badge-gray text-xs shrink-0"},ee={key:2,class:"text-xs text-gray-500 shrink-0"},te={key:1,class:"p-12 text-center text-gray-500"},se={class:"card hidden lg:flex flex-col h-full overflow-hidden"},ae={key:0,class:"h-full flex flex-col"},oe={class:"px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between shrink-0"},re={class:"flex items-center gap-3 overflow-hidden"},le={class:"text-xl shrink-0"},ne={class:"min-w-0"},ie={class:"font-semibold truncate"},de={class:"text-xs text-gray-500 truncate"},ce={class:"flex-1 overflow-y-auto p-4 bg-gray-50 dark:bg-gray-900"},ue={key:0,class:"h-full flex items-center justify-center"},pe=["src","alt"],ve={key:2,class:"text-sm font-mono whitespace-pre-wrap break-words"},ge={key:1,class:"h-full flex items-center justify-center p-12 text-gray-500"},he={key:0,class:"fixed inset-0 z-50 flex lg:hidden items-center justify-center p-4 bg-black/50 backdrop-blur-sm"},me={class:"bg-white dark:bg-gray-800 rounded-xl shadow-xl w-full h-full max-h-[90vh] flex flex-col overflow-hidden"},xe={class:"px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between shrink-0"},ye={class:"flex items-center gap-3 overflow-hidden"},fe={class:"text-xl shrink-0"},ke={class:"min-w-0"},_e={class:"font-semibold truncate"},be={class:"text-xs text-gray-500 truncate"},we={class:"flex-1 overflow-y-auto p-4 bg-gray-50 dark:bg-gray-900"},je={key:0,class:"h-full flex items-center justify-center"},Ce=["src","alt"],Se={key:2,class:"text-sm font-mono whitespace-pre-wrap break-words"},Fe={__name:"Files",setup(De){const b=p("."),m=p([]),v=p(!1),n=p(null),d=p(""),u=p("text"),c=p(""),B=new Set(["js","json","md","txt","html","htm","css","scss","less","xml","py","php","ts","vue","jsx","tsx","yaml","yml","ini","conf","config","env","gitignore","eslintrc","prettierrc","babelrc","editorconfig","lock","csv","sql","sh","bat","cmd","ps1","log","out","err","c","cpp","h","hpp","cs","go","rs","rb","java","kt","dart","swift","properties","toml","pom","gradle"]),M=new Set(["png","jpg","jpeg","gif","svg","webp","ico","bmp","tiff","tif"]),L=new Set(["license","makefile","dockerfile","caddyfile","readme","changelog","authors"]),w=a=>{const t=a.toLowerCase();let s="";return t.includes(".")&&(s=t.split(".").pop()),s&&M.has(s)?"image":s&&B.has(s)||L.has(t)?"text":"unsupported"},j=a=>w(a)!=="unsupported",x=P(()=>{const a=b.value.split("/").filter(Boolean);return[{name:"根目录",path:"."},...a.map((t,s)=>({name:t,path:a.slice(0,s+1).join("/")}))]}),C=a=>!a.includes("..")&&!a.startsWith("~");A(()=>{y(".")});const y=async a=>{if(!C(a)){alert("不安全的路径");return}v.value=!0,b.value=a,n.value=null,d.value="",u.value="text",c.value="";try{const t=await F.listDirectory(a);m.value=t.files||[]}catch(t){alert("加载目录失败: "+t.message)}finally{v.value=!1}},I=async a=>{if(!C(a.path)){alert("不安全的路径");return}const t=w(a.name);if(t==="unsupported"){n.value=a,u.value="unsupported",d.value="",c.value="";return}v.value=!0;try{const s=await F.readFile(a.path);console.log("File read result:",typeof s,s),n.value=a,u.value=t,t==="image"?(typeof s=="string"?c.value=s:(s==null?void 0:s.type)==="image"&&s.dataUrl?c.value=s.dataUrl:c.value=s||"",d.value=""):(typeof s=="string"?d.value=s:(s==null?void 0:s.type)==="text"&&s.content?d.value=s.content:d.value=String(s||""),c.value="")}catch(s){console.error("Read file error:",s),alert("读取文件失败: "+s.message),n.value=null}finally{v.value=!1}},S=()=>{n.value=null,d.value="",u.value="text",c.value=""},f=a=>{var g;if(a.isDirectory)return"📁";const t=(g=a.name.split(".").pop())==null?void 0:g.toLowerCase();return{js:"📜",json:"📋",md:"📝",txt:"📄",html:"🌐",css:"🎨",png:"🖼️",jpg:"🖼️",svg:"🎭",gif:"🎞️"}[t]||"📄"};return(a,t)=>{var s,g;return o(),r("div",z,[e("div",U,[t[1]||(t[1]=e("div",null,[e("h2",{class:"text-xl font-semibold"},"文件管理"),e("p",{class:"text-sm text-gray-500 dark:text-gray-400 mt-1"}," 浏览和编辑项目文件 ")],-1)),e("div",X,[e("nav",O,[(o(!0),r(D,null,E(x.value,(l,k)=>(o(),r("button",{key:l.path,onClick:Ee=>y(l.path),class:_(["flex items-center gap-2 px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors whitespace-nowrap",{"font-medium":k===x.value.length-1}])},[V(i(l.name)+" ",1),k 暂不支持预览此文件类型 支持的文件类型:文本文件 (.js, .json, .md, .txt 等) 和 图片文件 (.png, .jpg, .svg 等) 暂不支持预览此文件类型 支持的文件类型:文本文件 和 图片文件 drpy-node/config/parses.conf
+ drpy-node 可用的 API 接口文档
+
+ {{ endpoint.description }}
+
+ {{ param.description }}
+
+ 管理系统关键配置
+
+ 管理 drpy-node 的环境变量和配置项
+ 加载配置失败: {{ configStore.error }} 未找到匹配的配置项 请尝试更换搜索词或选择其他分类
+ {{ configDescriptions[key] }}
+ JS 源
+ {{ systemStore.sources.js?.length || 0 }}
+ CatVod 源
+ {{ systemStore.sources.catvod?.length || 0 }}
+ PHP 源
+ {{ systemStore.sources.php?.length || 0 }}
+ PY 源
+ {{ systemStore.sources.py?.length || 0 }}
+ 总源数
+ {{ (systemStore.sources.js?.length || 0) + (systemStore.sources.catvod?.length || 0) + (systemStore.sources.php?.length || 0) + (systemStore.sources.py?.length || 0) }}
+ 路由数
+ {{ systemStore.routes.registered_controllers?.length || 0 }}
+
+ 执行只读 SQL 查询
+ {{ error }}
+ 浏览和编辑项目文件
+ {{ selectedFile.path }} 暂不支持预览此文件类型
+ 支持的文件类型:文本文件 和 图片文件
+
+ 实时查看应用运行日志
+ 点击"连接"按钮开始接收实时日志
+ 管理 config/map.txt 别名映射配置
+
+ 管理系统解析配置文件及 jx 目录下的解析脚本
+ drpy-node/config/parses.conf
+ {{ (file.size / 1024).toFixed(2) }} KB
+
+ {{ filePath }}
+
+ 管理和验证 drpy 源文件
+ {{ filteredSources.length }} 显示 {{ systemStore.sources.js?.length || 0 }} JS 源 {{ systemStore.sources.catvod?.length || 0 }} CatVod 源 {{ systemStore.sources.php?.length || 0 }} PHP 源 {{ systemStore.sources.py?.length || 0 }} HIPY 源 加载中...
+ {{ source.path }}
+
+ 编辑 public/sub 目录下的订阅文件 (sub.json) 和排序文件
+ i.value==="list"?X(l.value)!==a.value:r.value!==a.value),S=it(()=>({automaticLayout:!0,wordWrap:p.value?"on":"off",wordWrapColumn:80,wrappingIndent:"same",minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:14,lineNumbers:"on",renderWhitespace:"none",padding:{top:16,bottom:16}})),w=G(-1),y=G({source:"",params:"",alias:""}),O=G(!1);let H=0;const P=g=>{var x,be,nt;if(!g)return[];const u=g.split(`
+`),T=[];for(const he of u){const ye=he.trim();if(!ye)continue;if(ye.startsWith("//")||ye.startsWith("#")){T.push({id:H++,type:"comment",raw:he});continue}const Ye=ye.split("@@");Ye.length>=1?T.push({id:H++,type:"record",raw:he,source:((x=Ye[0])==null?void 0:x.trim())||"",params:((be=Ye[1])==null?void 0:be.trim())||"",alias:((nt=Ye[2])==null?void 0:nt.trim())||""}):T.push({id:H++,type:"raw",raw:he})}return T},X=g=>g.map(u=>{if(u.type==="record"){const T=[u.source];return(u.params||u.alias)&&T.push(u.params),u.alias&&T.push(u.alias),T.join("@@")}return u.raw}).join(`
+`),Y=async()=>{t.value=!0;try{const g=await Ct.readFile("config/map.txt");let u="";typeof g=="string"?u=g:(g==null?void 0:g.type)==="text"&&g.content||g!=null&&g.content?u=g.content:u=String(g||""),r.value=u,a.value=u,l.value=P(u)}catch(g){console.error("Load map.txt error:",g),g.message&&g.message.includes("not found")?(r.value="",a.value="",l.value=[]):alert("加载 map.txt 失败: "+g.message)}finally{t.value=!1}},oe=async()=>{if(confirm(`确定要保存对映射配置的修改吗?
+此操作将直接写入 config/map.txt 文件。`)){n.value=!0;try{i.value==="list"&&(r.value=X(l.value)),await Ct.writeFile("config/map.txt",r.value),a.value=r.value,i.value==="editor"&&(l.value=P(r.value)),alert("保存成功")}catch(g){alert("保存失败: "+g.message)}finally{n.value=!1}}};Kt(async()=>{await Y(),await ot(),i.value==="list"&&K()});const $=()=>{i.value==="list"?(r.value=X(l.value),i.value="editor",s.value&&(s.value.destroy(),s.value=null)):(l.value=P(r.value),i.value="list",ot(()=>{s.value||K()}))},K=()=>{const g=document.getElementById("map-records-list")||d.value;g&&!s.value&&i.value==="list"&&(s.value=new v(g,{animation:150,handle:".drag-handle",ghostClass:"bg-gray-100",onEnd:u=>{if(f.value)return;const T=u.item;u.newIndex!==u.oldIndex&&(u.oldIndex>u.newIndex?T.parentNode.insertBefore(T,T.parentNode.children[u.oldIndex+1]||null):T.parentNode.insertBefore(T,T.parentNode.children[u.oldIndex]||null));const x=l.value.splice(u.oldIndex,1)[0];l.value.splice(u.newIndex,0,x),l.value=[...l.value]}}))};Et(i,async g=>{g==="list"&&(await ot(),s.value||K())}),Et(f,g=>{s.value&&s.value.option("disabled",!!g)});const ie=it(()=>{if(!f.value)return l.value;const g=f.value.toLowerCase();return l.value.filter(u=>u.type!=="record"?!0:u.type!=="record"?!1:u.source&&u.source.toLowerCase().includes(g)||u.alias&&u.alias.toLowerCase().includes(g))}),R=g=>l.value.indexOf(g),pe=()=>{O.value=!0,w.value=-1,y.value={id:null,source:"",params:"",alias:""}},ee=g=>{O.value=!1,w.value=g;const u=l.value[g];y.value={...u}},ue=()=>{O.value=!1,w.value=-1},Q=()=>{if(!y.value.source.trim()){alert("站名不能为空");return}const g={id:O.value?H++:y.value.id,type:"record",source:y.value.source.trim(),params:y.value.params.trim(),alias:y.value.alias.trim()};O.value?l.value.push(g):w.value>=0&&(l.value[w.value]=g),ue()},re=g=>{confirm("确定要删除这条映射记录吗?")&&l.value.splice(g,1)};return(g,u)=>{const T=nn("vue-monaco-editor");return N(),F("div",Nn,[h("div",Fn,[h("div",Bn,[h("div",null,[h("h2",Rn,[u[7]||(u[7]=ke(" 站源映射管理 ",-1)),_.value?(N(),F("span",jn,"未保存")):Te("",!0)]),u[8]||(u[8]=h("p",{class:"text-sm text-gray-500 dark:text-gray-400 mt-1"}," 管理 config/map.txt 别名映射配置 ",-1))]),h("div",Xn,[i.value==="editor"?(N(),F("label",Yn,[Ie(h("input",{type:"checkbox","onUpdate:modelValue":u[0]||(u[0]=x=>p.value=x),class:"rounded border-gray-300 text-primary-600 focus:ring-primary-500"},null,512),[[Qt,p.value]]),u[9]||(u[9]=ke(" 自动换行 ",-1))])):Te("",!0),h("button",{onClick:$,class:"btn btn-secondary"},[i.value==="list"?(N(),F("svg",Ln,[...u[10]||(u[10]=[h("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"},null,-1)])])):(N(),F("svg",Hn,[...u[11]||(u[11]=[h("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 10h16M4 14h16M4 18h16"},null,-1)])])),ke(" "+we(i.value==="list"?"文本编辑模式":"列表模式"),1)]),h("button",{onClick:oe,disabled:n.value,class:"btn btn-primary"},[n.value?(N(),F("svg",zn,[...u[12]||(u[12]=[h("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])])):(N(),F("svg",Gn,[...u[13]||(u[13]=[h("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"},null,-1)])])),u[14]||(u[14]=ke(" 保存配置 ",-1))],8,Wn)])])]),h("div",Vn,[t.value?(N(),F("div",Un,[...u[15]||(u[15]=[h("div",{class:"animate-spin rounded-full h-8 w-8 border-b-2 border-primary-600"},null,-1)])])):i.value==="editor"?(N(),F("div",$n,[Zt(T,{value:r.value,"onUpdate:value":u[1]||(u[1]=x=>r.value=x),language:"plaintext",theme:Jt(e).isDark?"vs-dark":"vs",options:S.value,class:"flex-1 w-full"},null,8,["value","theme","options"])])):(N(),F("div",qn,[h("div",Kn,[h("button",{onClick:pe,class:"btn btn-primary whitespace-nowrap",disabled:O.value||w.value>=0},[...u[16]||(u[16]=[h("svg",{class:"w-4 h-4 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[h("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),ke(" 添加映射 ",-1)])],8,Qn),h("div",Zn,[Ie(h("input",{"onUpdate:modelValue":u[2]||(u[2]=x=>f.value=x),type:"text",class:"input w-full pl-9 pr-8",placeholder:"搜索站名或别名..."},null,512),[[Le,f.value]]),u[18]||(u[18]=h("svg",{class:"w-4 h-4 text-gray-400 absolute left-3 top-1/2 transform -translate-y-1/2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[h("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1)),f.value?(N(),F("button",{key:0,onClick:u[3]||(u[3]=x=>f.value=""),class:"absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"},[...u[17]||(u[17]=[h("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[h("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])):Te("",!0)])]),O.value||w.value>=0?(N(),F("div",Jn,[h("h3",eo,we(O.value?"添加映射记录":"编辑映射记录"),1),h("div",to,[h("div",no,[u[19]||(u[19]=h("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"站名 (必填)",-1)),Ie(h("input",{"onUpdate:modelValue":u[4]||(u[4]=x=>y.value.source=x),type:"text",class:"input w-full",placeholder:"例如: webdav[盘]"},null,512),[[Le,y.value.source]])]),h("div",oo,[u[20]||(u[20]=h("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"别名",-1)),Ie(h("input",{"onUpdate:modelValue":u[5]||(u[5]=x=>y.value.alias=x),type:"text",class:"input w-full",placeholder:"例如: WebDav[盘]"},null,512),[[Le,y.value.alias]])]),h("div",io,[u[21]||(u[21]=h("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"参数",-1)),Ie(h("textarea",{"onUpdate:modelValue":u[6]||(u[6]=x=>y.value.params=x),class:"input w-full resize-y min-h-[42px]",rows:"2",placeholder:"例如: ?render=1&type=url¶ms=..."},null,512),[[Le,y.value.params]])])]),h("div",{class:"flex justify-end gap-2"},[h("button",{onClick:ue,class:"btn btn-secondary"},"取消"),h("button",{onClick:Q,class:"btn btn-primary"},"确定")])])):Te("",!0),h("div",ro,[ie.value.length===0?(N(),F("div",ao," 暂无映射记录 ")):Te("",!0),h("div",{class:Dt(["overflow-auto flex-1 relative flex flex-col",{"overflow-hidden":ie.value.length===0}])},[h("div",lo,[u[25]||(u[25]=en('
parses.conf
0;)if(s=n[r],t===s.toLowerCase())return s;return null}const k=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Qe=e=>!H(e)&&e!==k;function he(){const{caseless:e,skipUndefined:t}=Qe(this)&&this||{},n={},r=(s,o)=>{if(o==="__proto__"||o==="constructor"||o==="prototype")return;const i=e&&Ge(n,o)||o;Y(n[i])&&Y(s)?n[i]=he(n[i],s):Y(s)?n[i]=he({},s):M(s)?n[i]=s.slice():(!t||!H(s))&&(n[i]=s)};for(let s=0,o=arguments.length;s=n.length;return i=!i&&a.isArray(s)?s.length:i,p?(a.hasOwnProp(s,i)?s[i]=[s[i],r]:s[i]=r,!c):((!s[i]||!a.isObject(s[i]))&&(s[i]=[]),t(n,r,s[i],o)&&a.isArray(s[i])&&(s[i]=wn(s[i])),!c)}if(a.isFormData(e)&&a.isFunction(e.entries)){const n={};return a.forEachEntry(e,(r,s)=>{t(bn(r),s,n,0)}),n}return null}function Rn(e,t,n){if(a.isString(e))try{return(t||JSON.parse)(e),a.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const K={transitional:Ee,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,o=a.isObject(t);if(o&&a.isHTMLForm(t)&&(t=new FormData(t)),a.isFormData(t))return s?JSON.stringify(st(t)):t;if(a.isArrayBuffer(t)||a.isBuffer(t)||a.isStream(t)||a.isFile(t)||a.isBlob(t)||a.isReadableStream(t))return t;if(a.isArrayBufferView(t))return t.buffer;if(a.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let c;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return yn(t,this.formSerializer).toString();if((c=a.isFileList(t))||r.indexOf("multipart/form-data")>-1){const p=this.env&&this.env.FormData;return ie(c?{"files[]":t}:t,p&&new p,this.formSerializer)}}return o||s?(n.setContentType("application/json",!1),Rn(t)):t}],transformResponse:[function(t){const n=this.transitional||K.transitional,r=n&&n.forcedJSONParsing,s=this.responseType==="json";if(a.isResponse(t)||a.isReadableStream(t))return t;if(t&&a.isString(t)&&(r&&!this.responseType||s)){const i=!(n&&n.silentJSONParsing)&&s;try{return JSON.parse(t,this.parseReviver)}catch(c){if(i)throw c.name==="SyntaxError"?y.from(c,y.ERR_BAD_RESPONSE,this,null,this.response):c}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:S.classes.FormData,Blob:S.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};a.forEach(["delete","get","head","post","put","patch"],e=>{K.headers[e]={}});const En=a.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),gn=e=>{const t={};let n,r,s;return e&&e.split(`
+`).forEach(function(i){s=i.indexOf(":"),n=i.substring(0,s).trim().toLowerCase(),r=i.substring(s+1).trim(),!(!n||t[n]&&En[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},De=Symbol("internals");function z(e){return e&&String(e).trim().toLowerCase()}function ee(e){return e===!1||e==null?e:a.isArray(e)?e.map(ee):String(e)}function Sn(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const On=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function fe(e,t,n,r,s){if(a.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!a.isString(t)){if(a.isString(r))return t.indexOf(r)!==-1;if(a.isRegExp(r))return r.test(t)}}function Tn(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function An(e,t){const n=a.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(s,o,i){return this[r].call(this,t,s,o,i)},configurable:!0})})}let C=class{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function o(c,p,f){const l=z(p);if(!l)throw new Error("header name must be a non-empty string");const h=a.findKey(s,l);(!h||s[h]===void 0||f===!0||f===void 0&&s[h]!==!1)&&(s[h||p]=ee(c))}const i=(c,p)=>a.forEach(c,(f,l)=>o(f,l,p));if(a.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(a.isString(t)&&(t=t.trim())&&!On(t))i(gn(t),n);else if(a.isObject(t)&&a.isIterable(t)){let c={},p,f;for(const l of t){if(!a.isArray(l))throw TypeError("Object iterator must return a key-value pair");c[f=l[0]]=(p=c[f])?a.isArray(p)?[...p,l[1]]:[p,l[1]]:l[1]}i(c,n)}else t!=null&&o(n,t,r);return this}get(t,n){if(t=z(t),t){const r=a.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return Sn(s);if(a.isFunction(n))return n.call(this,s,r);if(a.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=z(t),t){const r=a.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||fe(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function o(i){if(i=z(i),i){const c=a.findKey(r,i);c&&(!n||fe(r,r[c],c,n))&&(delete r[c],s=!0)}}return a.isArray(t)?t.forEach(o):o(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const o=n[r];(!t||fe(this,this[o],o,t,!0))&&(delete this[o],s=!0)}return s}normalize(t){const n=this,r={};return a.forEach(this,(s,o)=>{const i=a.findKey(r,o);if(i){n[i]=ee(s),delete n[o];return}const c=t?Tn(o):String(o).trim();c!==o&&delete n[o],n[c]=ee(s),r[c]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return a.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&a.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(`
+`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[De]=this[De]={accessors:{}}).accessors,s=this.prototype;function o(i){const c=z(i);r[c]||(An(s,i),r[c]=!0)}return a.isArray(t)?t.forEach(o):o(t),this}};C.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);a.reduceDescriptors(C.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});a.freezeMethods(C);function de(e,t){const n=this||K,r=t||n,s=C.from(r.headers);let o=r.data;return a.forEach(e,function(c){o=c.call(n,o,s.normalize(),t?t.status:void 0)}),s.normalize(),o}function ot(e){return!!(e&&e.__CANCEL__)}let v=class extends y{constructor(t,n,r){super(t??"canceled",y.ERR_CANCELED,n,r),this.name="CanceledError",this.__CANCEL__=!0}};function it(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new y("Request failed with status code "+n.status,[y.ERR_BAD_REQUEST,y.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function Cn(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function xn(e,t){e=e||10;const n=new Array(e),r=new Array(e);let s=0,o=0,i;return t=t!==void 0?t:1e3,function(p){const f=Date.now(),l=r[o];i||(i=f),n[s]=p,r[s]=f;let h=o,b=0;for(;h!==s;)b+=n[h++],h=h%e;if(s=(s+1)%e,s===o&&(o=(o+1)%e),f-i0)return;if(en){let t=en;for(en=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Zt;){let t=Zt;for(Zt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Ri(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function wi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Gs(s),al(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function ys(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ti(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ti(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===un)||(e.globalVersion=un,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!ys(e))))return;e.flags|=2;const t=e.dep,n=ce,s=Ve;ce=e,Ve=!0;try{Ri(e);const r=e.fn(e._value);(t.version===0||Ye(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ce=n,Ve=s,wi(e),e.flags&=-3}}function Gs(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Gs(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function al(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ve=!0;const Oi=[];function ut(){Oi.push(Ve),Ve=!1}function ft(){const e=Oi.pop();Ve=e===void 0?!0:e}function ur(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ce;ce=void 0;try{t()}finally{ce=n}}}let un=0;class dl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ws{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ce||!Ve||ce===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ce)n=this.activeLink=new dl(ce,this),ce.deps?(n.prevDep=ce.depsTail,ce.depsTail.nextDep=n,ce.depsTail=n):ce.deps=ce.depsTail=n,Pi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=ce.depsTail,n.nextDep=void 0,ce.depsTail.nextDep=n,ce.depsTail=n,ce.deps===n&&(ce.deps=s)}return n}trigger(t){this.version++,un++,this.notify(t)}notify(t){ks();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ks()}}}function Pi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Pi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Pn=new WeakMap,Pt=Symbol(""),bs=Symbol(""),fn=Symbol("");function me(e,t,n){if(Ve&&ce){let s=Pn.get(e);s||Pn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Ws),r.map=s,r.key=n),r.track()}}function ot(e,t,n,s,r,i){const o=Pn.get(e);if(!o){un++;return}const l=c=>{c&&c.trigger()};if(ks(),t==="clear")o.forEach(l);else{const c=H(e),a=c&&kn(n);if(c&&n==="length"){const u=Number(s);o.forEach((d,p)=>{(p==="length"||p===fn||!Ze(p)&&p>=u)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),a&&l(o.get(fn)),t){case"add":c?a&&l(o.get("length")):(l(o.get(Pt)),Bt(e)&&l(o.get(bs)));break;case"delete":c||(l(o.get(Pt)),Bt(e)&&l(o.get(bs)));break;case"set":Bt(e)&&l(o.get(Pt));break}}Ks()}function hl(e,t){const n=Pn.get(e);return n&&n.get(t)}function Lt(e){const t=X(e);return t===e?t:(me(t,"iterate",fn),Ne(e)?t:t.map(He))}function $n(e){return me(e=X(e),"iterate",fn),e}function ze(e,t){return at(e)?Kt(ct(e)?He(t):t):He(t)}const pl={__proto__:null,[Symbol.iterator](){return os(this,Symbol.iterator,e=>ze(this,e))},concat(...e){return Lt(this).concat(...e.map(t=>H(t)?Lt(t):t))},entries(){return os(this,"entries",e=>(e[1]=ze(this,e[1]),e))},every(e,t){return tt(this,"every",e,t,void 0,arguments)},filter(e,t){return tt(this,"filter",e,t,n=>n.map(s=>ze(this,s)),arguments)},find(e,t){return tt(this,"find",e,t,n=>ze(this,n),arguments)},findIndex(e,t){return tt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return tt(this,"findLast",e,t,n=>ze(this,n),arguments)},findLastIndex(e,t){return tt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return tt(this,"forEach",e,t,void 0,arguments)},includes(...e){return ls(this,"includes",e)},indexOf(...e){return ls(this,"indexOf",e)},join(e){return Lt(this).join(e)},lastIndexOf(...e){return ls(this,"lastIndexOf",e)},map(e,t){return tt(this,"map",e,t,void 0,arguments)},pop(){return qt(this,"pop")},push(...e){return qt(this,"push",e)},reduce(e,...t){return fr(this,"reduce",e,t)},reduceRight(e,...t){return fr(this,"reduceRight",e,t)},shift(){return qt(this,"shift")},some(e,t){return tt(this,"some",e,t,void 0,arguments)},splice(...e){return qt(this,"splice",e)},toReversed(){return Lt(this).toReversed()},toSorted(e){return Lt(this).toSorted(e)},toSpliced(...e){return Lt(this).toSpliced(...e)},unshift(...e){return qt(this,"unshift",e)},values(){return os(this,"values",e=>ze(this,e))}};function os(e,t,n){const s=$n(e),r=s[t]();return s!==e&&!Ne(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const gl=Array.prototype;function tt(e,t,n,s,r,i){const o=$n(e),l=o!==e&&!Ne(e),c=o[t];if(c!==gl[t]){const d=c.apply(e,i);return l?He(d):d}let a=n;o!==e&&(l?a=function(d,p){return n.call(this,ze(e,d),p,e)}:n.length>2&&(a=function(d,p){return n.call(this,d,p,e)}));const u=c.call(o,a,s);return l&&r?r(u):u}function fr(e,t,n,s){const r=$n(e),i=r!==e&&!Ne(e);let o=n,l=!1;r!==e&&(i?(l=s.length===0,o=function(a,u,d){return l&&(l=!1,a=ze(e,a)),n.call(this,a,ze(e,u),d,e)}):n.length>3&&(o=function(a,u,d){return n.call(this,a,u,d,e)}));const c=r[t](o,...s);return l?ze(e,c):c}function ls(e,t,n){const s=X(e);me(s,"iterate",fn);const r=s[t](...n);return(r===-1||r===!1)&&qn(n[0])?(n[0]=X(n[0]),s[t](...n)):r}function qt(e,t,n=[]){ut(),ks();const s=X(e)[t].apply(e,n);return Ks(),ft(),s}const ml=Fs("__proto__,__v_isRef,__isVue"),Ii=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ze));function _l(e){Ze(e)||(e=String(e));const t=X(this);return me(t,"has",e),t.hasOwnProperty(e)}class Ni{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?wl:Fi:i?Li:Di).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=H(t);if(!r){let c;if(o&&(c=pl[n]))return c;if(n==="hasOwnProperty")return _l}const l=Reflect.get(t,n,fe(t)?t:s);if((Ze(n)?Ii.has(n):ml(n))||(r||me(t,"get",n),i))return l;if(fe(l)){const c=o&&kn(n)?l:l.value;return r&&ne(c)?Ss(c):c}return ne(l)?r?Ss(l):yn(l):l}}class Mi extends Ni{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=H(t)&&kn(n);if(!this._isShallow){const a=at(i);if(!Ne(s)&&!at(s)&&(i=X(i),s=X(s)),!o&&fe(i)&&!fe(s))return a||(i.value=s),!0}const l=o?Number(n)检测结果
// 2. 如果推荐接口异常,检测一级分类接口
let categorySuccess = false;
if (homeResult.data && homeResult.data.class && homeResult.data.class.length > 0) {
- const firstCategory = homeResult.data.class[0];
- if (firstCategory.type_id) {
+ // 尝试检测前两个分类(容错机制)
+ const categoriesToCheck = homeResult.data.class.slice(0, 2);
+
+ for (let i = 0; i < categoriesToCheck.length; i++) {
+ const category = categoriesToCheck[i];
+ if (!category.type_id) continue;
+
const cateResult = await this.testApi(source.api, {
ac: 'list',
- t: firstCategory.type_id,
+ t: category.type_id,
pg: 1,
extend
});
- result.details.category = cateResult;
+
+ // 记录结果:如果是第一个,直接记录;如果是后续且成功了,也记录覆盖
+ if (i === 0 || (cateResult.success && this.isValidData(cateResult.data))) {
+ result.details.category = cateResult;
+ }
categorySuccess = cateResult.success && this.isValidData(cateResult.data);
if (categorySuccess) {
result.status = 'success';
- result.message = '分类接口正常';
- this.log(`${source.name}: 分类接口正常`, 'success');
+ result.message = `分类接口正常${i > 0 ? ' (容错:分类2)' : ''}`;
+ this.log(`${source.name}: 分类接口正常${i > 0 ? ' (容错:分类2)' : ''}`, 'success');
return;
+ } else {
+ // 如果是第一个失败且还有下一个,记录日志
+ if (i === 0 && categoriesToCheck.length > 1) {
+ this.log(`${source.name}: 分类1无数据,尝试容错检测分类2...`, 'warning');
+ }
}
}
}
diff --git a/config/map.txt b/config/map.txt
index 5919fc23..5e8d2390 100644
--- a/config/map.txt
+++ b/config/map.txt
@@ -18,6 +18,7 @@ emby@@{"server":"http://139.9.106.196:2345","username":"kid","password":""}@@小
采集之王[合]@@?type=url¶ms=../json/采集[密]静态.json$1$@@采王成人[密]
采集之王[合]@@?type=url¶ms=../json/采集2024静态.json$1$@@采王2024
采集之王[合]@@?type=url¶ms=../json/采集2025静态.json$1$@@采王2025
+采集之王[合]@@?type=url¶ms=../json/采集2026静态.json$1$@@采王2026
UC分享@@?type=url¶ms=../json/UC分享.json@@UC分享[盘]
16wMV[听]@@?type=url¶ms=../json/十六万歌曲.txt
点歌欢唱[B]@@?type=url¶ms=../json/十六万歌曲.txt
diff --git a/controllers/admin.js b/controllers/admin.js
new file mode 100644
index 00000000..95c7782f
--- /dev/null
+++ b/controllers/admin.js
@@ -0,0 +1,286 @@
+/**
+ * Admin Controller - 后台管理主控制器
+ * 重构版:移除 MCP 依赖,直接实现业务逻辑
+ */
+
+import path from 'path';
+import fs from '../utils/fsWrapper.js';
+import { validateBasicAuth } from '../utils/api_validate.js';
+
+// 导入子控制器
+import * as systemController from './admin/systemController.js';
+import * as logsController from './admin/logsController.js';
+import * as sourcesController from './admin/sourcesController.js';
+import * as filesController from './admin/filesController.js';
+import * as dbController from './admin/dbController.js';
+import * as subController from './admin/subController.js';
+import * as backupController from './admin/backupController.js';
+
+// 配置常量
+const CONFIG_PATH = path.join(process.cwd(), 'config/env.json');
+
+const FULL_ENV_TEMPLATE = {
+ "ali_token": "",
+ "ali_refresh_token": "",
+ "quark_cookie": "",
+ "quark_token_cookie": "",
+ "uc_cookie": "",
+ "uc_token_cookie": "",
+ "baidu_cookie": "",
+ "xun_username": "",
+ "xun_password": "",
+ "cloud_account": "",
+ "cloud_password": "",
+ "cloud_cookie": "",
+ "yun_account": "",
+ "yun_cookie": "",
+ "pan_passport": "",
+ "pan_password": "",
+ "pan_auth": "",
+ "pikpak_token": "",
+ "now_ai": "1",
+ "spark_ai_authKey": "",
+ "deepseek_apiKey": "",
+ "kimi_apiKey": "",
+ "sparkBotObject": {},
+ "thread": "6",
+ "api_pwd": "",
+ "hide_adult": "1",
+ "enable_old_config": "0",
+ "show_curl": "0",
+ "show_req": "0",
+ "enable_rule_name": "0",
+ "enable_dr2": "1",
+ "enable_py": "1",
+ "enable_php": "1",
+ "enable_cat": "1",
+ "enable_self_jx": "0",
+ "enable_system_proxy": "1",
+ "play_proxy_mode": "1",
+ "play_local_proxy_type": "1",
+ "PROXY_AUTH": "drpys",
+ "enable_doh": "0",
+ "allow_forward": "0",
+ "allow_ftp_cache_clear": "0",
+ "allow_webdav_cache_clear": "0",
+ "link_url": "",
+ "enable_link_data": "0",
+ "enable_link_push": "0",
+ "enable_link_jar": "0",
+ "cat_sub_code": "all",
+ "must_sub_code": "0",
+ "bili_cookie": "",
+ "mg_hz": "4"
+};
+
+// 导出路由配置
+export default async function adminController(fastify, options) {
+ // 注册 Basic Auth 验证钩子
+ fastify.addHook('preHandler', (request, reply, done) => {
+ // 只对 /api/admin/* 接口进行验证
+ if (request.url.startsWith('/api/admin')) {
+ validateBasicAuth(request, reply, done);
+ } else {
+ done();
+ }
+ });
+
+ // ==================== 系统管理 API ====================
+ fastify.get('/api/admin/health', systemController.getHealth);
+ fastify.post('/api/admin/restart', systemController.restartService);
+
+ // ==================== 日志 API ====================
+ fastify.get('/api/admin/logs', logsController.getLogs);
+
+ // ==================== 配置管理 API ====================
+ fastify.get('/api/admin/config', getConfig);
+ fastify.post('/api/admin/config', updateConfig);
+ fastify.get('/api/admin/env', getEnv);
+ fastify.get('/api/admin/version', getVersion);
+
+ // ==================== 源管理 API ====================
+ fastify.get('/api/admin/sources', sourcesController.listSources);
+ fastify.post('/api/admin/sources/validate', sourcesController.validateSpider);
+ fastify.post('/api/admin/sources/syntax', sourcesController.checkSyntax);
+ fastify.get('/api/admin/sources/template', sourcesController.getTemplate);
+ fastify.get('/api/admin/sources/libs', sourcesController.getLibsInfo);
+
+ // ==================== 文件管理 API ====================
+ fastify.get('/api/admin/files/list', filesController.listDirectory);
+ fastify.get('/api/admin/files/read', filesController.readFile);
+ fastify.post('/api/admin/files/write', filesController.writeFile);
+ fastify.delete('/api/admin/files/delete', filesController.deleteFile);
+
+ // ==================== 数据库 API ====================
+ fastify.post('/api/admin/db/query', dbController.executeQuery);
+ fastify.get('/api/admin/db/tables', dbController.getTables);
+ fastify.get('/api/admin/db/tables/:table/schema', dbController.getTableSchema);
+
+ // ==================== Sub文件管理 API ====================
+ fastify.get('/api/admin/sub/files', subController.getSubFiles);
+ fastify.get('/api/admin/sub/file', subController.getSubFileContent);
+ fastify.post('/api/admin/sub/file', subController.saveSubFileContent);
+
+ // ==================== 备份恢复 API ====================
+ fastify.get('/api/admin/backup/config', backupController.getBackupConfig);
+ fastify.post('/api/admin/backup/config', backupController.updateBackupConfig);
+ fastify.post('/api/admin/backup/config/reset', backupController.resetBackupConfig);
+ fastify.post('/api/admin/backup/create', backupController.createBackup);
+ fastify.post('/api/admin/backup/restore', backupController.restoreBackup);
+
+ // ==================== 路由信息 API ====================
+ fastify.get('/api/admin/routes', getRoutesInfo);
+ fastify.get('/api/admin/docs', systemController.getApiDocs);
+
+ // MCP 兼容层
+ const ENABLE_MCP_COMPAT = process.env.ENABLE_MCP_COMPAT !== 'false';
+ if (ENABLE_MCP_COMPAT) {
+ fastify.post('/admin/mcp', async (req, reply) => {
+ const { name, arguments: args } = req.body;
+ try {
+ // 仅作最低限度的兼容,或者提示用户升级
+ return reply.code(400).send({ error: 'MCP API 已弃用,请更新 drpy-node-admin 到最新版本' });
+ } catch (e) {
+ return reply.code(500).send({ error: e.message });
+ }
+ });
+ }
+}
+
+// ==================== 辅助函数 ====================
+
+async function getConfig(req, reply) {
+ try {
+ const { key } = req.query;
+
+ let config = {};
+ if (await fs.pathExists(CONFIG_PATH)) {
+ const configContent = await fs.readFile(CONFIG_PATH, 'utf-8');
+ try {
+ config = JSON.parse(configContent);
+ } catch (e) {
+ // ignore parse error
+ }
+ }
+
+ // Merge with template to ensure all keys exist
+ config = { ...FULL_ENV_TEMPLATE, ...config };
+
+ if (key) {
+ const keys = key.split('.');
+ let value = config;
+ for (const k of keys) {
+ value = value?.[k];
+ }
+ return reply.send(value !== undefined ? value : null);
+ }
+
+ return reply.send(config);
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+
+async function updateConfig(req, reply) {
+ try {
+ const { key, value } = req.body;
+
+ if (!key) {
+ return reply.code(400).send({ error: 'Key is required' });
+ }
+
+ if (!await fs.pathExists(CONFIG_PATH)) {
+ return reply.code(404).send({ error: 'Config file not found' });
+ }
+
+ const configContent = await fs.readFile(CONFIG_PATH, 'utf-8');
+ let config = JSON.parse(configContent);
+
+ // 设置嵌套值
+ const keys = key.split('.');
+ let target = config;
+ for (let i = 0; i < keys.length - 1; i++) {
+ if (!target[keys[i]]) {
+ target[keys[i]] = {};
+ }
+ target = target[keys[i]];
+ }
+
+ // 尝试解析为 JSON
+ let parsedValue = value;
+ try {
+ parsedValue = JSON.parse(value);
+ } catch {
+ // 保持字符串
+ }
+
+ target[keys[keys.length - 1]] = parsedValue;
+
+ // 写回文件
+ await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));
+
+ return reply.send({
+ success: true,
+ message: `配置项 ${key} 已更新`
+ });
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+
+async function getEnv(req, reply) {
+ try {
+ const envData = {};
+
+ // 从 process.env 读取关键配置
+ const keys = [
+ 'PORT', 'NODE_ENV', 'MAX_TEXT_SIZE', 'MAX_IMAGE_SIZE',
+ 'QUARK_COOKIE', 'ALI_TOKEN', 'bili_cookie'
+ ];
+
+ for (const key of keys) {
+ if (process.env[key]) {
+ envData[key] = process.env[key];
+ }
+ }
+
+ return reply.send(envData);
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+
+async function getVersion(req, reply) {
+ try {
+ const packageJson = await fs.readJson(path.join(process.cwd(), 'package.json'));
+ return reply.send({ version: packageJson.version });
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+
+async function getRoutesInfo(req, reply) {
+ try {
+ const indexControllerPath = path.join(process.cwd(), 'controllers/index.js');
+
+ if (!await fs.pathExists(indexControllerPath)) {
+ return reply.send({
+ file: 'controllers/index.js',
+ registered_controllers: []
+ });
+ }
+
+ const content = await fs.readFile(indexControllerPath, 'utf-8');
+ const lines = content.split('\n');
+ const registered = lines
+ .filter(l => l.trim().startsWith('fastify.register('))
+ .map(l => l.trim());
+
+ return reply.send({
+ file: 'controllers/index.js',
+ registered_controllers: registered
+ });
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
diff --git a/controllers/admin/backupController.js b/controllers/admin/backupController.js
new file mode 100644
index 00000000..9179b98c
--- /dev/null
+++ b/controllers/admin/backupController.js
@@ -0,0 +1,196 @@
+import path from 'path';
+import fs from '../../utils/fsWrapper.js';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const projectRootDir = path.resolve(__dirname, '../../');
+
+const BACKUP_PATHS = [
+ '.env',
+ '.plugins.js',
+ 'config/env.json',
+ 'config/map.txt',
+ 'config/parses.conf',
+ 'config/player.json',
+ 'scripts/cron',
+ 'plugins'
+];
+
+const BACKINFO_FILENAME = '.backinfo';
+
+const getBackupRootDir = () => {
+ return path.join(path.dirname(projectRootDir), path.basename(projectRootDir) + '-backup');
+};
+
+const getBackinfoPath = (backupDir) => {
+ return path.join(backupDir, BACKINFO_FILENAME);
+};
+
+const loadBackinfo = (backupDir) => {
+ const infoPath = getBackinfoPath(backupDir);
+ if (!fs.existsSync(infoPath)) {
+ return null;
+ }
+ try {
+ const content = fs.readFileSync(infoPath, 'utf-8');
+ return JSON.parse(content);
+ } catch (e) {
+ return null;
+ }
+};
+
+const saveBackinfo = (backupDir, data) => {
+ const infoPath = getBackinfoPath(backupDir);
+ fs.writeFileSync(infoPath, JSON.stringify(data, null, 2), 'utf-8');
+};
+
+const getEffectiveBackupPaths = (backupDir) => {
+ const info = loadBackinfo(backupDir);
+ if (info && Array.isArray(info.paths) && info.paths.length > 0) {
+ return { paths: info.paths, info };
+ }
+ return { paths: BACKUP_PATHS, info };
+};
+
+export const getBackupConfig = async (request, reply) => {
+ const backupDir = getBackupRootDir();
+ let paths;
+ let lastBackupAt = null;
+ let lastRestoreAt = null;
+
+ if (!fs.existsSync(backupDir)) {
+ paths = BACKUP_PATHS;
+ } else {
+ const result = getEffectiveBackupPaths(backupDir);
+ paths = result.paths;
+ if (result.info) {
+ lastBackupAt = result.info.lastBackupAt || null;
+ lastRestoreAt = result.info.lastRestoreAt || null;
+ }
+ }
+ return reply.send({ success: true, paths, lastBackupAt, lastRestoreAt });
+};
+
+export const updateBackupConfig = async (request, reply) => {
+ try {
+ const { paths } = request.body;
+ if (!Array.isArray(paths)) {
+ return reply.code(400).send({ success: false, message: 'paths must be an array' });
+ }
+
+ const backupDir = getBackupRootDir();
+ await fs.ensureDir(backupDir);
+
+ const info = loadBackinfo(backupDir) || {};
+ const backinfoData = {
+ ...info,
+ paths
+ };
+ saveBackinfo(backupDir, backinfoData);
+
+ return reply.send({ success: true, message: 'Backup configuration updated successfully', paths });
+ } catch (error) {
+ request.log.error(`Update backup config failed: ${error.message}`);
+ return reply.code(500).send({ success: false, message: 'Update backup config failed: ' + error.message });
+ }
+};
+
+export const resetBackupConfig = async (request, reply) => {
+ try {
+ const backupDir = getBackupRootDir();
+ await fs.ensureDir(backupDir);
+
+ const info = loadBackinfo(backupDir) || {};
+ const backinfoData = {
+ ...info,
+ paths: BACKUP_PATHS
+ };
+ saveBackinfo(backupDir, backinfoData);
+
+ return reply.send({ success: true, message: 'Backup configuration reset to defaults', paths: BACKUP_PATHS });
+ } catch (error) {
+ request.log.error(`Reset backup config failed: ${error.message}`);
+ return reply.code(500).send({ success: false, message: 'Reset backup config failed: ' + error.message });
+ }
+};
+
+export const createBackup = async (request, reply) => {
+ if (process.env.VERCEL) {
+ return reply.code(403).send({ success: false, message: 'Vercel environment does not support backup' });
+ }
+ try {
+ const backupDir = getBackupRootDir();
+ await fs.ensureDir(backupDir);
+
+ const { paths, info } = getEffectiveBackupPaths(backupDir);
+ const details = [];
+
+ for (const item of paths) {
+ const srcPath = path.join(projectRootDir, item);
+ const destPath = path.join(backupDir, item);
+
+ if (fs.existsSync(srcPath)) {
+ await fs.copy(srcPath, destPath, { overwrite: true });
+ details.push(`Backed up: ${item}`);
+ } else {
+ details.push(`Skipped (not found): ${item}`);
+ }
+ }
+
+ const now = new Date().toISOString();
+ const customPaths = info && Array.isArray(info.paths) && info.paths.length > 0 ? info.paths : [];
+ const backinfoData = {
+ paths: customPaths,
+ lastBackupAt: now,
+ lastRestoreAt: info && info.lastRestoreAt ? info.lastRestoreAt : null
+ };
+ saveBackinfo(backupDir, backinfoData);
+
+ return reply.send({ success: true, message: 'Backup completed successfully', backupDir, details });
+ } catch (error) {
+ request.log.error(`Backup failed: ${error.message}`);
+ return reply.code(500).send({ success: false, message: 'Backup failed: ' + error.message });
+ }
+};
+
+export const restoreBackup = async (request, reply) => {
+ if (process.env.VERCEL) {
+ return reply.code(403).send({ success: false, message: 'Vercel environment does not support restore' });
+ }
+ try {
+ const backupDir = getBackupRootDir();
+ if (!fs.existsSync(backupDir)) {
+ return reply.code(404).send({ success: false, message: 'Backup directory not found' });
+ }
+
+ const { paths, info } = getEffectiveBackupPaths(backupDir);
+ const details = [];
+
+ for (const item of paths) {
+ const srcPath = path.join(backupDir, item);
+ const destPath = path.join(projectRootDir, item);
+
+ if (fs.existsSync(srcPath)) {
+ await fs.copy(srcPath, destPath, { overwrite: true });
+ details.push(`Restored: ${item}`);
+ } else {
+ details.push(`Skipped (not found in backup): ${item}`);
+ }
+ }
+
+ const now = new Date().toISOString();
+ const customPaths = info && Array.isArray(info.paths) && info.paths.length > 0 ? info.paths : [];
+ const backinfoData = {
+ paths: customPaths,
+ lastBackupAt: info && info.lastBackupAt ? info.lastBackupAt : null,
+ lastRestoreAt: now
+ };
+ saveBackinfo(backupDir, backinfoData);
+
+ return reply.send({ success: true, message: 'Restore completed successfully', backupDir, details });
+ } catch (error) {
+ request.log.error(`Restore failed: ${error.message}`);
+ return reply.code(500).send({ success: false, message: 'Restore failed: ' + error.message });
+ }
+};
diff --git a/controllers/admin/dbController.js b/controllers/admin/dbController.js
new file mode 100644
index 00000000..baee64cb
--- /dev/null
+++ b/controllers/admin/dbController.js
@@ -0,0 +1,117 @@
+/**
+ * 数据库查询控制器
+ * 提供安全的只读 SQL 查询功能
+ */
+
+import sqlite3pkg from 'node-sqlite3-wasm';
+const { Database } = sqlite3pkg;
+import path from 'path';
+
+// 执行查询
+export async function executeQuery(req, reply) {
+ try {
+ const { sql, params } = req.body;
+
+ if (!sql || !sql.trim()) {
+ return reply.code(400).send({
+ error: 'SQL 查询不能为空'
+ });
+ }
+
+ // 只允许 SELECT 查询
+ const trimmedSql = sql.trim().toLowerCase();
+ if (!trimmedSql.startsWith('select') && !trimmedSql.startsWith('pragma')) {
+ return reply.code(403).send({
+ error: '只允许 SELECT 查询'
+ });
+ }
+
+ // 额外安全检查
+ const dangerousKeywords = [
+ 'drop', 'delete', 'insert', 'update', 'alter', 'create', 'truncate',
+ 'replace', 'grant', 'revoke', 'lock', 'unlock', 'reindex', 'vacuum'
+ ];
+
+ for (const keyword of dangerousKeywords) {
+ // Check for keyword surrounded by whitespace or non-word characters
+ // This prevents matching "update_time" but matches "update table" or "update\ntable"
+ const regex = new RegExp(`(^|[\\s\\W])${keyword}([\\s\\W]|$)`, 'i');
+ if (regex.test(trimmedSql)) {
+ return reply.code(403).send({
+ error: `不允许使用 ${keyword.toUpperCase()} 语句`
+ });
+ }
+ }
+
+ const dbPath = path.join(process.cwd(), 'database.db');
+ const db = new Database(dbPath);
+
+ try {
+ const rows = db.all(sql, params || []);
+ return reply.send({
+ success: true,
+ data: rows,
+ rows: rows.length
+ });
+ } finally {
+ db.close();
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: `SQL 错误: ${e.message}`
+ });
+ }
+}
+
+// 获取表结构
+export async function getTables(req, reply) {
+ try {
+ const dbPath = path.join(process.cwd(), 'database.db');
+ const db = new Database(dbPath);
+
+ try {
+ const tables = db.all("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name");
+ return reply.send({
+ success: true,
+ tables: tables.map(t => t.name)
+ });
+ } finally {
+ db.close();
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 获取表结构
+export async function getTableSchema(req, reply) {
+ try {
+ const { table } = req.params;
+
+ if (!table) {
+ return reply.code(400).send({
+ error: '表名不能为空'
+ });
+ }
+
+ const dbPath = path.join(process.cwd(), 'database.db');
+ const db = new Database(dbPath);
+
+ try {
+ const schema = db.all(`PRAGMA table_info(${table})`);
+ return reply.send({
+ success: true,
+ table,
+ columns: schema
+ });
+ } finally {
+ db.close();
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
diff --git a/controllers/admin/filesController.js b/controllers/admin/filesController.js
new file mode 100644
index 00000000..ad966014
--- /dev/null
+++ b/controllers/admin/filesController.js
@@ -0,0 +1,206 @@
+/**
+ * 文件管理控制器
+ * 提供文件列表、读取、写入、删除功能
+ */
+
+import fs from '../../utils/fsWrapper.js';
+import path from 'path';
+import mime from 'mime-types';
+
+// 列出目录
+export async function listDirectory(req, reply) {
+ try {
+ const dirPath = req.query.path || '.';
+
+ if (!isSafePath(dirPath)) {
+ return reply.code(403).send({
+ error: '访问被拒绝'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), dirPath);
+ const files = await fs.readdir(fullPath, { withFileTypes: true });
+
+ const result = files.map(f => {
+ const isDir = f.isDirectory();
+ return {
+ name: f.name,
+ path: dirPath === '.' ? f.name : `${dirPath}/${f.name}`,
+ isDirectory: isDir,
+ size: isDir ? undefined : 0 // fs.stat is expensive to do for all files, so omit size here unless needed
+ };
+ });
+
+ // 异步获取文件大小
+ for (let i = 0; i < result.length; i++) {
+ if (!result[i].isDirectory) {
+ try {
+ const stat = await fs.stat(path.join(fullPath, result[i].name));
+ result[i].size = stat.size;
+ } catch (e) {
+ // Ignore stat errors
+ }
+ }
+ }
+
+ return reply.send({ files: result });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 读取文件
+export async function readFile(req, reply) {
+ try {
+ const { path: filePath } = req.query;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(403).send({
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+
+ if (!await fs.pathExists(fullPath)) {
+ return reply.code(404).send({
+ error: '文件不存在'
+ });
+ }
+
+ const ext = path.extname(filePath).toLowerCase();
+ const imageExts = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.bmp', '.tiff', '.tif'];
+
+ if (imageExts.includes(ext)) {
+ // 图片文件 - 返回 base64
+ const buffer = await fs.readFile(fullPath);
+ const base64 = buffer.toString('base64');
+ const mimeType = mime.lookup(fullPath) || 'image/png';
+
+ return reply.send({
+ type: 'image',
+ mimeType,
+ dataUrl: `data:${mimeType};base64,${base64}`
+ });
+ }
+
+ // 文本文件
+ let content = await fs.readFile(fullPath, 'utf-8');
+
+ // 如果是 JS 文件,尝试解码
+ if (ext === '.js') {
+ try {
+ const { decodeDsSource } = await import('../../utils/dsHelper.js');
+ content = await decodeDsSource(content);
+ } catch (e) {
+ // 保持原样
+ }
+ }
+
+ return reply.send({
+ type: 'text',
+ content
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 写入文件
+export async function writeFile(req, reply) {
+ try {
+ const { path: filePath, content } = req.body;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(403).send({
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+
+ // 确保目录存在
+ await fs.ensureDir(path.dirname(fullPath));
+
+ // 写入文件
+ await fs.writeFile(fullPath, content, 'utf-8');
+
+ return reply.send({
+ success: true,
+ message: '文件保存成功'
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 删除文件
+export async function deleteFile(req, reply) {
+ try {
+ const { path: filePath } = req.query; // in fastify, DELETE params might be in query or we can use body depending on client
+
+ const fp = filePath || (req.body && req.body.path);
+
+ if (!fp || !isSafePath(fp)) {
+ return reply.code(403).send({
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), fp);
+
+ if (!await fs.pathExists(fullPath)) {
+ return reply.code(404).send({
+ error: '文件不存在'
+ });
+ }
+
+ await fs.remove(fullPath);
+
+ return reply.send({
+ success: true,
+ message: '文件删除成功'
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+function isSafePath(filePath) {
+ if (!filePath || typeof filePath !== 'string') return false;
+
+ // Prevent absolute paths from user input directly
+ if (path.isAbsolute(filePath)) return false;
+
+ // Resolve full path and check if it is within CWD
+ const fullPath = path.resolve(process.cwd(), filePath);
+ const cwd = process.cwd();
+
+ // Ensure the resolved path is inside the current working directory
+ if (!fullPath.startsWith(cwd)) return false;
+
+ // Blacklist check for sensitive files/directories
+ const blacklist = [
+ 'node_modules',
+ 'database.db',
+ '.git',
+ '.env',
+ 'package-lock.json',
+ 'yarn.lock'
+ ];
+
+ // Check if any part of the relative path matches the blacklist
+ // We check against the relative path to avoid matching parts of CWD
+ const relativePath = path.relative(cwd, fullPath);
+ if (blacklist.some(item => relativePath.includes(item))) return false;
+
+ return true;
+}
diff --git a/controllers/admin/logsController.js b/controllers/admin/logsController.js
new file mode 100644
index 00000000..a96197bc
--- /dev/null
+++ b/controllers/admin/logsController.js
@@ -0,0 +1,96 @@
+/**
+ * 日志管理控制器
+ * 提供日志读取
+ */
+
+import fs from '../../utils/fsWrapper.js';
+import path from 'path';
+
+// 读取日志
+export async function getLogs(req, reply) {
+ try {
+ const lines = parseInt(req.query.lines) || 50;
+ const logDir = path.join(process.cwd(), 'logs');
+
+ if (!await fs.pathExists(logDir)) {
+ return reply.send({
+ file: null,
+ content: '日志目录不存在'
+ });
+ }
+
+ const files = await fs.readdir(logDir);
+ const logFiles = files
+ .filter(f => f.endsWith('.log.txt'))
+ .sort()
+ .reverse();
+
+ if (logFiles.length === 0) {
+ return reply.send({
+ file: null,
+ content: '没有日志文件'
+ });
+ }
+
+ const latestLog = path.join(logDir, logFiles[0]);
+ const content = await fs.readFile(latestLog, 'utf-8');
+ const allLines = content.trim().split('\n');
+ const lastLines = allLines.slice(-lines);
+
+ return reply.send({
+ file: logFiles[0],
+ content: lastLines.join('\n')
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+
+
+async function streamLogs(socket, lines) {
+ try {
+ const logDir = path.join(process.cwd(), 'logs');
+ const files = await fs.readdir(logDir);
+ const logFiles = files
+ .filter(f => f.endsWith('.log.txt'))
+ .sort()
+ .reverse();
+
+ if (logFiles.length === 0) {
+ socket.send(JSON.stringify({
+ type: 'error',
+ message: '没有日志文件'
+ }));
+ return;
+ }
+
+ const latestLog = path.join(logDir, logFiles[0]);
+ const content = await fs.readFile(latestLog, 'utf-8');
+ const allLines = content.trim().split('\n');
+ const lastLines = allLines.slice(-lines);
+
+ // 发送现有日志
+ for (const line of lastLines) {
+ if (socket.readyState === WebSocket.OPEN) {
+ socket.send(JSON.stringify({
+ type: 'log',
+ timestamp: Date.now(),
+ content: line
+ }));
+ }
+ }
+
+ socket.send(JSON.stringify({
+ type: 'end',
+ message: `已读取 ${lastLines.length} 行日志`
+ }));
+ } catch (e) {
+ socket.send(JSON.stringify({
+ type: 'error',
+ message: e.message
+ }));
+ }
+}
diff --git a/controllers/admin/sourcesController.js b/controllers/admin/sourcesController.js
new file mode 100644
index 00000000..a2254948
--- /dev/null
+++ b/controllers/admin/sourcesController.js
@@ -0,0 +1,360 @@
+/**
+ * 源管理控制器
+ * 提供源列表、验证、语法检查、模板获取等功能
+ */
+
+import fs from '../../utils/fsWrapper.js';
+import path from 'path';
+import vm from 'vm';
+import { execFile } from 'child_process';
+import util from 'util';
+
+const execFileAsync = util.promisify(execFile);
+
+// 列出所有源
+export async function listSources(req, reply) {
+ try {
+ const jsPath = path.join(process.cwd(), 'spider/js');
+ const catvodPath = path.join(process.cwd(), 'spider/catvod');
+ const phpPath = path.join(process.cwd(), 'spider/php');
+ const pyPath = path.join(process.cwd(), 'spider/py');
+
+ let jsSources = [];
+ let catvodSources = [];
+ let phpSources = [];
+ let pySources = [];
+
+ if (await fs.pathExists(jsPath)) {
+ jsSources = (await fs.readdir(jsPath))
+ .filter(f => f.endsWith('.js') && !f.startsWith('_'))
+ .sort();
+ }
+
+ if (await fs.pathExists(catvodPath)) {
+ catvodSources = (await fs.readdir(catvodPath))
+ .filter(f => f.endsWith('.js') && !f.startsWith('_'))
+ .sort();
+ }
+
+ if (await fs.pathExists(phpPath)) {
+ phpSources = (await fs.readdir(phpPath))
+ .filter(f => f.endsWith('.php') && !f.startsWith('_'))
+ .sort();
+ }
+
+ if (await fs.pathExists(pyPath)) {
+ pySources = (await fs.readdir(pyPath))
+ .filter(f => f.endsWith('.py') && !f.startsWith('_'))
+ .sort();
+ }
+
+ return reply.send({
+ js: jsSources,
+ catvod: catvodSources,
+ php: phpSources,
+ py: pySources
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 验证源文件
+export async function validateSpider(req, reply) {
+ try {
+ const { path: filePath } = req.body;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(400).send({
+ isValid: false,
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+ if (!await fs.pathExists(fullPath)) {
+ return reply.code(404).send({
+ isValid: false,
+ error: '文件不存在'
+ });
+ }
+
+ let code = await fs.readFile(fullPath, 'utf-8');
+
+ // PHP 文件验证
+ if (filePath.endsWith('.php')) {
+ try {
+ await execFileAsync('php', ['-l', fullPath]);
+ return reply.send({
+ isValid: true,
+ message: 'PHP 语法检查通过 (结构验证暂不支持)'
+ });
+ } catch (e) {
+ return reply.send({
+ isValid: false,
+ error: `PHP 语法错误: ${e.message}`
+ });
+ }
+ }
+
+ // Python 文件验证
+ if (filePath.endsWith('.py')) {
+ try {
+ await execFileAsync('python', ['-m', 'py_compile', fullPath]);
+ return reply.send({
+ isValid: true,
+ message: 'Python 语法检查通过 (结构验证暂不支持)'
+ });
+ } catch (e) {
+ return reply.send({
+ isValid: false,
+ error: `Python 语法错误: ${e.message}`
+ });
+ }
+ }
+
+ // 如果是 JS 文件,尝试解码
+ if (filePath.endsWith('.js')) {
+ try {
+ const { decodeDsSource } = await import('../../utils/dsHelper.js');
+ code = await decodeDsSource(code);
+ } catch (e) {
+ // 解码失败,使用原始代码
+ }
+ }
+
+ // 创建沙箱执行
+ const sandbox = {
+ console: { log: () => {} },
+ require: () => {},
+ rule: null
+ };
+
+ try {
+ vm.createContext(sandbox);
+ new vm.Script(code).runInContext(sandbox);
+
+ if (!sandbox.rule) {
+ return reply.send({
+ isValid: false,
+ error: '源文件中缺少 rule 对象'
+ });
+ }
+
+ // 基本验证
+ const required = ['title', 'host', 'url'];
+ const missing = required.filter(k => !sandbox.rule[k]);
+
+ if (missing.length > 0) {
+ return reply.send({
+ isValid: false,
+ error: `rule 对象缺少必填字段: ${missing.join(', ')}`
+ });
+ }
+
+ return reply.send({
+ isValid: true,
+ message: '验证通过'
+ });
+ } catch (e) {
+ return reply.send({
+ isValid: false,
+ error: `执行错误: ${e.message}`
+ });
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 检查语法
+export async function checkSyntax(req, reply) {
+ try {
+ const { path: filePath } = req.body;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(400).send({
+ isValid: false,
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+
+ // PHP 语法检查
+ if (filePath.endsWith('.php')) {
+ try {
+ await execFileAsync('php', ['-l', fullPath]);
+ return reply.send({
+ isValid: true,
+ message: 'PHP 语法检查通过'
+ });
+ } catch (e) {
+ return reply.code(400).send({
+ isValid: false,
+ error: `PHP 语法错误: ${e.message}`
+ });
+ }
+ }
+
+ // Python 语法检查
+ if (filePath.endsWith('.py')) {
+ try {
+ await execAsync(`python -m py_compile "${fullPath}"`);
+ return reply.send({
+ isValid: true,
+ message: 'Python 语法检查通过'
+ });
+ } catch (e) {
+ return reply.code(400).send({
+ isValid: false,
+ error: `Python 语法错误: ${e.message}`
+ });
+ }
+ }
+
+ let code = await fs.readFile(fullPath, 'utf-8');
+
+ // 如果是 JS 文件,尝试解码
+ if (filePath.endsWith('.js')) {
+ try {
+ const { decodeDsSource } = await import('../../utils/dsHelper.js');
+ code = await decodeDsSource(code);
+ } catch (e) {
+ // 解码失败,使用原始代码
+ }
+ }
+
+ try {
+ new vm.Script(code);
+ return reply.send({
+ isValid: true,
+ message: '语法检查通过'
+ });
+ } catch (e) {
+ return reply.code(400).send({
+ isValid: false,
+ error: `语法错误: ${e.message}`
+ });
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 获取模板
+export async function getTemplate(req, reply) {
+ const template = `/*
+* @File : drpy-node spider template
+* @Author : user
+* @Date : ${new Date().toISOString().split('T')[0]}
+* @Comments :
+*/
+
+var rule = {
+ // 影视|漫画|小说
+ 类型: '影视',
+ // 源标题
+ title: 'Site Name',
+ // 源主域名
+ host: 'https://example.com',
+ // 源主页链接
+ homeUrl: '/latest/',
+ // 源一级列表链接
+ url: '/category/fyclass/page/fypage',
+ // 源搜索链接
+ searchUrl: '/search?wd=**&pg=fypage',
+ // 允许搜索、允许快搜、允许筛选
+ searchable: 2,
+ quickSearch: 0,
+ filterable: 1,
+ // 请求头
+ headers: {
+ 'User-Agent': 'MOBILE_UA',
+ },
+ // 超时时间
+ timeout: 5000,
+ // 静态分类
+ class_name: '电影&电视剧&综艺&动漫',
+ class_url: '1&2&3&4',
+
+ // 是否需要调用免嗅
+ play_parse: true,
+ // 免嗅lazy执行函数
+ lazy: '',
+ // 首页推荐数量
+ limit: 6,
+ // 是否双层列表
+ double: true,
+
+ // 推荐列表
+ 推荐: '.recommend .item;a&&title;img&&src;.remarks&&Text;a&&href',
+ // 一级列表
+ 一级: '.list .item;a&&title;img&&src;.remarks&&Text;a&&href',
+ // 二级详情
+ 二级: {
+ "title": "h1&&Text",
+ "img": ".poster img&&src",
+ "desc": ".desc&&Text",
+ "content": ".content&&Text",
+ "tabs": ".tabs span",
+ "lists": ".playlists ul"
+ },
+ // 搜索
+ 搜索: '.search-result .item;a&&title;img&&src;.remarks&&Text;a&&href',
+}`;
+
+ return reply.send({ template });
+}
+
+export async function getLibsInfo(req, reply) {
+ const info = {
+ globalObjects: [
+ "request(url, options) - HTTP Request",
+ "post(url, options) - HTTP POST Request",
+ "pdfa(html, rule) - Parse List",
+ "pdfh(html, rule) - Parse Single Node",
+ "pd(html, rule) - Parse URL",
+ "setItem(k, v) - Persistent storage",
+ "getItem(k) - Retrieve storage",
+ "clearItem(k) - Delete storage",
+ "urljoin(base, path) - Resolve URL"
+ ],
+ parsingRules: [
+ "Format: selector;attr1;attr2...",
+ "pdfa (list): Returns array",
+ "pdfh (single): Returns string",
+ "pd (url): Returns resolved URL string",
+ "Special Attrs: Text, Html, href, src, style, data-*",
+ "Syntax: && (nested), || (backup), :eq(n) (index), * (all)"
+ ]
+ };
+ return reply.send(info);
+}
+
+function isSafePath(filePath) {
+ if (!filePath || typeof filePath !== 'string') return false;
+
+ // Prevent absolute paths from user input directly
+ if (path.isAbsolute(filePath)) return false;
+
+ // Resolve full path and check if it is within CWD
+ const fullPath = path.resolve(process.cwd(), filePath);
+ const cwd = process.cwd();
+
+ // Ensure the resolved path is inside the current working directory
+ if (!fullPath.startsWith(cwd)) return false;
+
+ // Blacklist check
+ const blacklist = ['node_modules', 'database.db', '.git', '.env'];
+ const relativePath = path.relative(cwd, fullPath);
+ if (blacklist.some(item => relativePath.includes(item))) return false;
+
+ return true;
+}
diff --git a/controllers/admin/subController.js b/controllers/admin/subController.js
new file mode 100644
index 00000000..0eaca881
--- /dev/null
+++ b/controllers/admin/subController.js
@@ -0,0 +1,78 @@
+import path from 'path';
+import fs from '../../utils/fsWrapper.js';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const projectRootDir = path.resolve(__dirname, '../../');
+const subDir = path.join(projectRootDir, 'public/sub');
+
+// Ensure sub directory exists
+fs.ensureDirSync(subDir);
+
+export const getSubFiles = async (request, reply) => {
+ try {
+ const files = await fs.readdir(subDir);
+ const result = [];
+ for (const file of files) {
+ const filePath = path.join(subDir, file);
+ const stats = await fs.stat(filePath);
+ if (stats.isFile()) {
+ result.push({
+ name: file,
+ size: stats.size,
+ mtime: stats.mtime
+ });
+ }
+ }
+ return reply.send({ success: true, data: result });
+ } catch (error) {
+ request.log.error(error);
+ return reply.code(500).send({ success: false, message: error.message });
+ }
+};
+
+export const getSubFileContent = async (request, reply) => {
+ const { name } = request.query;
+ if (!name) {
+ return reply.code(400).send({ success: false, message: 'Filename is required' });
+ }
+
+ // Basic security check to prevent directory traversal
+ if (name.includes('..') || name.includes('/') || name.includes('\\')) {
+ return reply.code(400).send({ success: false, message: 'Invalid filename' });
+ }
+
+ const filePath = path.join(subDir, name);
+ try {
+ if (!await fs.pathExists(filePath)) {
+ return reply.code(404).send({ success: false, message: 'File not found' });
+ }
+ const content = await fs.readFile(filePath, 'utf-8');
+ return reply.send({ success: true, data: content });
+ } catch (error) {
+ request.log.error(error);
+ return reply.code(500).send({ success: false, message: error.message });
+ }
+};
+
+export const saveSubFileContent = async (request, reply) => {
+ const { name, content } = request.body;
+ if (!name) {
+ return reply.code(400).send({ success: false, message: 'Filename is required' });
+ }
+
+ // Basic security check
+ if (name.includes('..') || name.includes('/') || name.includes('\\')) {
+ return reply.code(400).send({ success: false, message: 'Invalid filename' });
+ }
+
+ const filePath = path.join(subDir, name);
+ try {
+ await fs.writeFile(filePath, content, 'utf-8');
+ return reply.send({ success: true, message: 'File saved successfully' });
+ } catch (error) {
+ request.log.error(error);
+ return reply.code(500).send({ success: false, message: error.message });
+ }
+};
diff --git a/controllers/admin/systemController.js b/controllers/admin/systemController.js
new file mode 100644
index 00000000..a0768c3a
--- /dev/null
+++ b/controllers/admin/systemController.js
@@ -0,0 +1,205 @@
+/**
+ * 系统管理控制器
+ * 提供健康检查、服务重启等系统级功能
+ */
+
+import os from 'os';
+import { exec } from 'child_process';
+import util from 'util';
+import path from 'path';
+import fs from '../../utils/fsWrapper.js';
+
+const execPromise = util.promisify(exec);
+
+// 健康检查
+export async function getHealth(req, reply) {
+ try {
+ const uptime = process.uptime();
+ const memory = process.memoryUsage();
+ const packageJson = await fs.readJson(path.join(process.cwd(), 'package.json'));
+
+ return reply.send({
+ status: 'ok',
+ uptime: Math.floor(uptime),
+ memory: {
+ used: Math.round(memory.heapUsed / 1024 / 1024),
+ total: Math.round(memory.heapTotal / 1024 / 1024),
+ rss: Math.round(memory.rss / 1024 / 1024)
+ },
+ version: packageJson.version,
+ platform: {
+ arch: os.arch(),
+ platform: os.platform(),
+ nodeVersion: process.version
+ },
+ timestamp: Date.now()
+ });
+ } catch (e) {
+ reply.code(500).send({
+ status: 'error',
+ error: e.message
+ });
+ }
+}
+
+// 服务重启
+export async function restartService(req, reply) {
+ try {
+ // 检查是否在 PM2 环境运行
+ try {
+ await execPromise('pm2 restart drpys');
+ return reply.send({
+ success: true,
+ message: '服务已通过 PM2 重启'
+ });
+ } catch (pm2Error) {
+ return reply.send({
+ success: false,
+ message: '当前未使用 PM2 运行。请在终端中手动重启服务:\n1. 按 Ctrl+C 停止当前服务\n2. 运行 npm run dev 重新启动'
+ });
+ }
+ } catch (e) {
+ reply.code(500).send({
+ success: false,
+ error: e.message
+ });
+ }
+}
+
+// API 文档
+export async function getApiDocs(req, reply) {
+ const apiDocs = [
+ {
+ category: "系统管理",
+ endpoints: [
+ {
+ path: "/api/admin/health",
+ method: "GET",
+ description: "获取系统健康状态,包括内存使用、运行时间、版本等信息"
+ },
+ {
+ path: "/api/admin/restart",
+ method: "POST",
+ description: "尝试重启服务(仅在 PM2 环境下有效)"
+ },
+ {
+ path: "/api/admin/docs",
+ method: "GET",
+ description: "获取 API 文档列表"
+ }
+ ]
+ },
+ {
+ category: "日志管理",
+ endpoints: [
+ {
+ path: "/api/admin/logs",
+ method: "GET",
+ description: "获取最近的系统日志"
+ },
+ {
+ path: "/ws",
+ method: "WS",
+ description: "WebSocket 实时日志流连接端点(全局)"
+ }
+ ]
+ },
+ {
+ category: "配置管理",
+ endpoints: [
+ {
+ path: "/api/admin/config",
+ method: "GET",
+ description: "获取系统配置,支持通过 key 参数获取特定配置项"
+ },
+ {
+ path: "/api/admin/config",
+ method: "POST",
+ description: "更新系统配置"
+ },
+ {
+ path: "/api/admin/env",
+ method: "GET",
+ description: "获取关键环境变量配置"
+ }
+ ]
+ },
+ {
+ category: "源管理",
+ endpoints: [
+ {
+ path: "/api/admin/sources",
+ method: "GET",
+ description: "获取所有 JS 和 CatVod 源列表"
+ },
+ {
+ path: "/api/admin/sources/validate",
+ method: "POST",
+ description: "验证源文件的格式和必要字段"
+ },
+ {
+ path: "/api/admin/sources/syntax",
+ method: "POST",
+ description: "检查源文件的语法正确性"
+ },
+ {
+ path: "/api/admin/sources/template",
+ method: "GET",
+ description: "获取标准源文件模板"
+ },
+ {
+ path: "/api/admin/sources/libs",
+ method: "GET",
+ description: "获取爬虫相关库函数和解析规则说明"
+ }
+ ]
+ },
+ {
+ category: "文件管理",
+ endpoints: [
+ {
+ path: "/api/admin/files/list",
+ method: "GET",
+ description: "列出指定目录下的文件和文件夹"
+ },
+ {
+ path: "/api/admin/files/read",
+ method: "GET",
+ description: "读取指定文件的内容"
+ },
+ {
+ path: "/api/admin/files/write",
+ method: "POST",
+ description: "写入内容到指定文件"
+ },
+ {
+ path: "/api/admin/files/delete",
+ method: "DELETE",
+ description: "删除指定的文件"
+ }
+ ]
+ },
+ {
+ category: "数据库管理",
+ endpoints: [
+ {
+ path: "/api/admin/db/query",
+ method: "POST",
+ description: "执行 SQL 查询语句"
+ },
+ {
+ path: "/api/admin/db/tables",
+ method: "GET",
+ description: "获取数据库所有表名"
+ },
+ {
+ path: "/api/admin/db/tables/:table/schema",
+ method: "GET",
+ description: "获取指定表的结构定义"
+ }
+ ]
+ }
+ ];
+
+ return reply.send(apiDocs);
+}
diff --git a/controllers/docs.js b/controllers/docs.js
index 723a2f13..62394779 100644
--- a/controllers/docs.js
+++ b/controllers/docs.js
@@ -6,8 +6,8 @@
import path from 'path';
import {existsSync, readFileSync} from 'fs';
import {getMimeType} from '../utils/mime-type.js';
-// import '../utils/marked.min.js'; // Markdown解析库
-import { marked } from "marked";
+import '../utils/marked.min.js'; // Markdown解析库
+// import { marked } from "marked";
import {validateBasicAuth} from "../utils/api_validate.js";
/**
diff --git a/controllers/fastify-spa-routes.js b/controllers/fastify-spa-routes.js
index 1ee3c681..01c175f6 100644
--- a/controllers/fastify-spa-routes.js
+++ b/controllers/fastify-spa-routes.js
@@ -13,7 +13,7 @@ async function addSPARoutes(fastify, options) {
for (const appName of spaApps) {
// 1. 处理根路径重定向
fastify.get(`/apps/${appName}`, async (request, reply) => {
- return reply.redirect(301, `/apps/${appName}/`);
+ return reply.redirect(`/apps/${appName}/`, 301);
});
// 2. 处理应用根路径
@@ -35,15 +35,16 @@ async function addSPARoutes(fastify, options) {
// 3. 设置404处理器来处理SPA路由回退
fastify.setNotFoundHandler(async (request, reply) => {
const url = request.url;
+ const pathname = url.split('?')[0];
// 检查是否是SPA应用的路由请求
for (const appName of spaApps) {
const appPrefix = `/apps/${appName}/`;
- if (url.startsWith(appPrefix)) {
+ if (pathname.startsWith(appPrefix)) {
// 检查是否是静态资源请求(有文件扩展名)
- const urlPath = url.replace(appPrefix, '');
- const hasExtension = /\.[a-zA-Z0-9]+(\?.*)?$/.test(urlPath);
+ const urlPath = pathname.replace(appPrefix, '');
+ const hasExtension = /\.[a-zA-Z0-9]+$/.test(urlPath);
if (!hasExtension) {
// 没有扩展名,可能是Vue路由,返回index.html
diff --git a/controllers/index.js b/controllers/index.js
index aa6f2853..a3324bfa 100644
--- a/controllers/index.js
+++ b/controllers/index.js
@@ -24,6 +24,7 @@ import m3u8ProxyController from './m3u8-proxy.js';
import unifiedProxyController from './unified-proxy.js';
import githubController from './github.js';
import websocketServerController from "./websocketServer.js";
+import adminController from './admin.js';
export const registerRoutes = (fastify, options) => {
fastify.register(formBody);
@@ -52,6 +53,7 @@ export const registerRoutes = (fastify, options) => {
fastify.register(m3u8ProxyController, options);
fastify.register(unifiedProxyController, options);
fastify.register(githubController, options);
+ fastify.register(adminController, options);
};
export const registerWsRoutes = (wsApp, options) => {
diff --git a/controllers/root.js b/controllers/root.js
index 6194cd16..30526ff0 100644
--- a/controllers/root.js
+++ b/controllers/root.js
@@ -1,7 +1,7 @@
import path from 'path';
import {readdirSync, readFileSync, writeFileSync, existsSync, createReadStream} from 'fs';
-// import '../utils/marked.min.js';
-import { marked } from "marked";
+import '../utils/marked.min.js';
+// import { marked } from "marked";
import {computeHash} from '../utils/utils.js';
import {validateBasicAuth} from "../utils/api_validate.js";
import {daemon} from "../utils/daemonManager.js";
diff --git a/controllers/static.js b/controllers/static.js
index 66493679..4a1a8cf9 100644
--- a/controllers/static.js
+++ b/controllers/static.js
@@ -46,7 +46,7 @@ export default (fastify, options, done) => {
fastify.register(addSPARoutes, {
appsDir: options.appsDir,
- spaApps: ['drplayer'] // 只有drplayer需要SPA路由支持
+ spaApps: ['drplayer', 'admin'] // 支持SPA路由的应用
});
// 注册JSON配置文件服务 - 用于存放各种JSON格式的配置文件
diff --git a/controllers/websocket.js b/controllers/websocket.js
index e5be100c..35ae8570 100644
--- a/controllers/websocket.js
+++ b/controllers/websocket.js
@@ -10,6 +10,15 @@ import {toBeijingTime} from "../utils/datetime-format.js";
// WebSocket 客户端管理
const wsClients = new Set();
+// 导出客户端管理函数
+export function addClient(client) {
+ wsClients.add(client);
+}
+
+export function removeClient(client) {
+ wsClients.delete(client);
+}
+
// 需要拦截的console方法列表
const CONSOLE_METHODS = [
'log', 'error', 'warn', 'info', 'debug',
diff --git a/data/source-checker/report.json b/data/source-checker/report.json
index 69685278..4f8aeb5a 100644
--- a/data/source-checker/report.json
+++ b/data/source-checker/report.json
@@ -1,10 +1,10 @@
{
- "exportTime": "2026-03-13T12:37:39.210Z",
+ "exportTime": "2026-03-14T05:07:55.462Z",
"configUrl": "http://localhost:5757/config/1?sub=all&healthy=0&pwd=dzyyds",
"totalSources": 299,
"summary": {
- "success": 247,
- "error": 52,
+ "success": 249,
+ "error": 50,
"pending": 0
},
"sources": [
@@ -17,10 +17,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%AE%BE%E7%BD%AE%E4%B8%AD%E5%BF%83?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -32,10 +30,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A4%AE%E8%A7%86%E5%A4%A7%E5%85%A8[%E5%AE%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -47,57 +43,34 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%85%BE%E4%BA%91%E9%A9%BE%E9%9B%BE[%E5%AE%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_IPTV四川[官]",
- "name": "IPTV四川[官](DS)",
+ "key": "drpyS_IPTV直播",
+ "name": "IPTV直播(DS)",
"api": "http://localhost:5757/api/直播转点播[合]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9B%B4%E6%92%AD%E8%BD%AC%E7%82%B9%E6%92%AD[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTz8ksSzVKzi3WLU7WAwkAANFSeAoYAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_番茄小说[书]",
- "name": "番茄小说[书](DS)",
- "api": "http://localhost:5757/api/番茄小说[书]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_番茄小说 ᵈᶻ[书]",
- "name": "番茄小说 ᵈᶻ[书](PHP)",
- "api": "http://localhost:5757/api/番茄小说 ᵈᶻ[书]?do=php&pwd=dzyyds",
+ "key": "drpyS_人人影视[优]",
+ "name": "人人影视[优](DS)",
+ "api": "http://localhost:5757/api/人人影视[优]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E5%B0%8F%E8%AF%B4%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E5%B0%8F%E8%AF%B4%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -108,72 +81,35 @@
"searchable": 1,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9F%AD%E5%89%A7%E8%81%9A%E5%90%88[%E7%9F%AD]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%9F%AD%E5%89%A7%E8%81%9A%E5%90%88[%E7%9F%AD]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_IPTV直播",
- "name": "IPTV直播(DS)",
+ "key": "drpyS_IPTV四川[官]",
+ "name": "IPTV四川[官](DS)",
"api": "http://localhost:5757/api/直播转点播[合]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9B%B4%E6%92%AD%E8%BD%AC%E7%82%B9%E6%92%AD[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTz8ksSzVKzi3WA%2FEAuuBHLxUAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_Emby[优]",
- "name": "Emby[优](DS)",
- "api": "http://localhost:5757/api/Emby[优]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Emby[%E4%BC%98]?pwd=dzyyds&extend=H4sIAAAAAAAAAx3NQU7DMBCF4bt4Tdyxx4k9uUHXSOxn7HFrQZOqcZEAcXcS9t97%2F4%2B5rls3s7n2ft%2Fm00lv8mWFl8vz1mxm82Kemz7OZScJNE0uS60OA0plEC1ZOaZEo5DbbV%2FfdTmogLiJWaOmAJgFiyOaSJLPSOB3WvSzZf0%2FVvYxc40D8eiG4IEGcTwOGINUhOxrLfsifzRd%2Bps%2BtrYekWDJgsWje%2BeLvrZvNTPC7x9iYTnC1AAAAA%3D%3D"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_人人影视[优]",
- "name": "人人影视[优](DS)",
- "api": "http://localhost:5757/api/人人影视[优]?pwd=dzyyds",
+ "key": "drpyS_剧海影视[优]",
+ "name": "剧海影视[优](DS)",
+ "api": "http://localhost:5757/api/剧海影视[优]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%BA%BA%E4%BA%BA%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_木兮[优]",
- "name": "木兮[优](DS)",
- "api": "http://localhost:5757/api/木兮[优]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%9C%A8%E5%85%AE[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -185,25 +121,21 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%98%9F%E8%BE%B0%E5%BD%B1%E9%99%A2[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_剧海影视[优]",
- "name": "剧海影视[优](DS)",
- "api": "http://localhost:5757/api/剧海影视[优]?pwd=dzyyds",
+ "key": "drpyS_木兮[优]",
+ "name": "木兮[优](DS)",
+ "api": "http://localhost:5757/api/木兮[优]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%89%A7%E6%B5%B7%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -215,10 +147,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%AF%92%E8%88%8C%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -230,10 +160,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%B0%8F%E8%8B%B9%E6%9E%9C[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -245,57 +173,34 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%A8%B1%E8%8A%B1%E5%8A%A8%E6%BC%AB[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_TG频道[优]",
- "name": "TG频道[优](DS)",
- "api": "http://localhost:5757/api/TG频道?pwd=dzyyds",
+ "key": "drpyS_热播影视[优]",
+ "name": "热播影视[优](DS)",
+ "api": "http://localhost:5757/api/热播影视[优]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/TG%E9%A2%91%E9%81%93?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTD3F%2FuWjiy8bJL1t7n%2B9dpwcSAwBCcG9sGwAAAA%3D%3D",
- "category": "http://localhost:5757/api/TG%E9%A2%91%E9%81%93?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTD3F%2FuWjiy8bJL1t7n%2B9dpwcSAwBCcG9sGwAAAA%3D%3D"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_短剧频道[优]",
- "name": "短剧频道[优](DS)",
- "api": "http://localhost:5757/api/TG频道?pwd=dzyyds",
+ "key": "drpyS_泥视频[优]",
+ "name": "泥视频[优](DS)",
+ "api": "http://localhost:5757/api/泥视频[优]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/TG%E9%A2%91%E9%81%93?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTD3F%2FPn%2Ft087lLxdNfNk4WQ8kBgDLqEoeGwAAAA%3D%3D",
- "category": "http://localhost:5757/api/TG%E9%A2%91%E9%81%93?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTD3F%2FPn%2Ft087lLxdNfNk4WQ8kBgDLqEoeGwAAAA%3D%3D"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_七味[优]",
- "name": "七味[优](DS)",
- "api": "http://localhost:5757/api/七味[优]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%B8%83%E5%91%B3[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -307,25 +212,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8B%AC%E6%92%AD%E5%BA%93[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_耐看点播[优]",
- "name": "耐看点播[优](DS)",
- "api": "http://localhost:5757/api/耐看点播[优]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%80%90%E7%9C%8B%E7%82%B9%E6%92%AD[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -337,56 +225,47 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%B2%A4%E6%BC%AB%E4%B9%8B%E5%AE%B6[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_泥视频[优]",
- "name": "泥视频[优](DS)",
- "api": "http://localhost:5757/api/泥视频[优]?pwd=dzyyds",
+ "key": "drpyS_耐看点播[优]",
+ "name": "耐看点播[优](DS)",
+ "api": "http://localhost:5757/api/耐看点播[优]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%B3%A5%E8%A7%86%E9%A2%91[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_瓜子[优]",
- "name": "瓜子[优](DS)",
- "api": "http://localhost:5757/api/瓜子[优]?pwd=dzyyds",
+ "key": "drpyS_永乐视频[优]",
+ "name": "永乐视频[优](DS)",
+ "api": "http://localhost:5757/api/永乐视频[优]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%93%9C%E5%AD%90[%E4%BC%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%93%9C%E5%AD%90[%E4%BC%98]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_荐片[优]",
- "name": "荐片[优](DS)",
- "api": "http://localhost:5757/api/荐片[优]?pwd=dzyyds",
+ "key": "drpyS_麻雀视频[优]",
+ "name": "麻雀视频[优](DS)",
+ "api": "http://localhost:5757/api/麻雀视频[优]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%8D%90%E7%89%87[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -398,70 +277,60 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%A3%9E%E5%BF%ABTV[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_热播影视[优]",
- "name": "热播影视[优](DS)",
- "api": "http://localhost:5757/api/热播影视[优]?pwd=dzyyds",
+ "key": "drpyS_追新影视[优]",
+ "name": "追新影视[优](DS)",
+ "api": "http://localhost:5757/api/追新影视[优]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%83%AD%E6%92%AD%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_追新影视[优]",
- "name": "追新影视[优](DS)",
- "api": "http://localhost:5757/api/追新影视[优]?pwd=dzyyds",
+ "key": "drpyS_傻样[盘]",
+ "name": "傻样[盘](DS)",
+ "api": "http://localhost:5757/api/傻样[盘]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%BF%BD%E6%96%B0%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_永乐视频[优]",
- "name": "永乐视频[优](DS)",
- "api": "http://localhost:5757/api/永乐视频[优]?pwd=dzyyds",
+ "key": "drpyS_夸克社[盘]",
+ "name": "夸克社[盘](DS)",
+ "api": "http://localhost:5757/api/夸克社[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%B0%B8%E4%B9%90%E8%A7%86%E9%A2%91[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_麻雀视频[优]",
- "name": "麻雀视频[优](DS)",
- "api": "http://localhost:5757/api/麻雀视频[优]?pwd=dzyyds",
+ "key": "drpyS_木偶[盘]",
+ "name": "木偶[盘](DS)",
+ "api": "http://localhost:5757/api/木偶[盘]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%BA%BB%E9%9B%80%E8%A7%86%E9%A2%91[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -473,381 +342,320 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A4%9A%E5%A4%9A[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_夸克影视[盘]",
- "name": "夸克影视[盘](DS)",
- "api": "http://localhost:5757/api/夸克影视[盘]?pwd=dzyyds",
+ "key": "drpyS_Emby[优]",
+ "name": "Emby[优](DS)",
+ "api": "http://localhost:5757/api/Emby[优]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A4%B8%E5%85%8B%E5%BD%B1%E8%A7%86[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_UC分享[盘]",
- "name": "UC分享[盘](DS)",
- "api": "http://localhost:5757/api/UC分享?pwd=dzyyds",
+ "key": "drpyS_爱看资源[盘]",
+ "name": "爱看资源[盘](DS)",
+ "api": "http://localhost:5757/api/爱看资源[盘]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "手动标记为正常",
- "testUrls": {
- "home": "http://localhost:5757/api/UC%E5%88%86%E4%BA%AB?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTD3V%2B2tH2ZNdqPRAPAKubOwMVAAAA",
- "category": "http://localhost:5757/api/UC%E5%88%86%E4%BA%AB?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTD3V%2B2tH2ZNdqPRAPAKubOwMVAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": true
- },
- {
- "key": "drpyS_WebDav影视[盘]",
- "name": "WebDav影视[盘](DS)",
- "api": "http://localhost:5757/api/webdav影视[盘]?pwd=dzyyds",
- "type": 4,
- "searchable": 0,
- "lang": "ds",
- "status": "success",
- "message": "手动标记为正常",
- "testUrls": {
- "home": "http://localhost:5757/api/webdav%E5%BD%B1%E8%A7%86[%E7%9B%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTL09NSkks0wOxASthelgTAAAA",
- "category": "http://localhost:5757/api/webdav%E5%BD%B1%E8%A7%86[%E7%9B%98]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTL09NSkks0wOxASthelgTAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": true
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
},
{
- "key": "drpyS_傻样[盘]",
- "name": "傻样[盘](DS)",
- "api": "http://localhost:5757/api/傻样[盘]?pwd=dzyyds",
+ "key": "drpyS_短剧网[盘]",
+ "name": "短剧网[盘](DS)",
+ "api": "http://localhost:5757/api/短剧网[盘]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%82%BB%E6%A0%B7[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_FTP[盘]",
- "name": "FTP[盘](DS)",
- "api": "http://localhost:5757/api/ftp[盘]?pwd=dzyyds",
+ "key": "drpyS_盘Ta[盘]",
+ "name": "盘Ta[盘](DS)",
+ "api": "http://localhost:5757/api/盘Ta[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "手动标记为正常",
- "testUrls": {
- "home": "http://localhost:5757/api/ftp[%E7%9B%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTTysp0AMxAIzjQSIQAAAA",
- "category": "http://localhost:5757/api/ftp[%E7%9B%98]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTTysp0AMxAIzjQSIQAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": true
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
},
{
- "key": "drpyS_WebDav[盘]",
- "name": "WebDav[盘](DS)",
- "api": "http://localhost:5757/api/webdav[盘]?pwd=dzyyds",
+ "key": "drpyS_立播[盘]",
+ "name": "立播[盘](DS)",
+ "api": "http://localhost:5757/api/立播[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "手动标记为正常",
- "testUrls": {
- "home": "http://localhost:5757/api/webdav[%E7%9B%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTL09NSkks0wOxASthelgTAAAA",
- "category": "http://localhost:5757/api/webdav[%E7%9B%98]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTL09NSkks0wOxASthelgTAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": true
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
},
{
- "key": "drpyS_WebDavZn[盘]",
- "name": "WebDavZn[盘](DS)",
- "api": "http://localhost:5757/api/webdav[盘]?pwd=dzyyds",
+ "key": "drpyS_欧哥[盘]",
+ "name": "欧哥[盘](DS)",
+ "api": "http://localhost:5757/api/欧哥[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "手动标记为正常",
- "testUrls": {
- "home": "http://localhost:5757/api/webdav[%E7%9B%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTL09NSkkse7p344vlbXogEQDz64JLGQAAAA%3D%3D",
- "category": "http://localhost:5757/api/webdav[%E7%9B%98]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTL09NSkkse7p344vlbXogEQDz64JLGQAAAA%3D%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": true
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
},
{
- "key": "drpyS_夸克社[盘]",
- "name": "夸克社[盘](DS)",
- "api": "http://localhost:5757/api/夸克社[盘]?pwd=dzyyds",
+ "key": "drpyS_番茄小说[书]",
+ "name": "番茄小说[书](DS)",
+ "api": "http://localhost:5757/api/番茄小说[书]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A4%B8%E5%85%8B%E7%A4%BE[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_木偶[盘]",
- "name": "木偶[盘](DS)",
- "api": "http://localhost:5757/api/木偶[盘]?pwd=dzyyds",
+ "key": "drpyS_荐片[优]",
+ "name": "荐片[优](DS)",
+ "api": "http://localhost:5757/api/荐片[优]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%9C%A8%E5%81%B6[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_短剧网[盘]",
- "name": "短剧网[盘](DS)",
- "api": "http://localhost:5757/api/短剧网[盘]?pwd=dzyyds",
+ "key": "php_番茄小说 ᵈᶻ[书]",
+ "name": "番茄小说 ᵈᶻ[书](PHP)",
+ "api": "http://localhost:5757/api/番茄小说 ᵈᶻ[书]?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "php",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9F%AD%E5%89%A7%E7%BD%91[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_盘Ta[盘]",
- "name": "盘Ta[盘](DS)",
- "api": "http://localhost:5757/api/盘Ta[盘]?pwd=dzyyds",
+ "key": "drpyS_TG频道[优]",
+ "name": "TG频道[优](DS)",
+ "api": "http://localhost:5757/api/TG频道?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9B%98Ta[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_爱看资源[盘]",
- "name": "爱看资源[盘](DS)",
- "api": "http://localhost:5757/api/爱看资源[盘]?pwd=dzyyds",
+ "key": "drpyS_瓜子[优]",
+ "name": "瓜子[优](DS)",
+ "api": "http://localhost:5757/api/瓜子[优]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E7%9C%8B%E8%B5%84%E6%BA%90[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_立播[盘]",
- "name": "立播[盘](DS)",
- "api": "http://localhost:5757/api/立播[盘]?pwd=dzyyds",
+ "key": "drpyS_短剧频道[优]",
+ "name": "短剧频道[优](DS)",
+ "api": "http://localhost:5757/api/TG频道?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%AB%8B%E6%92%AD[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_欧哥[盘]",
- "name": "欧哥[盘](DS)",
- "api": "http://localhost:5757/api/欧哥[盘]?pwd=dzyyds",
+ "key": "drpyS_蜡笔ᵐ[盘]",
+ "name": "蜡笔ᵐ[盘](DS)",
+ "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%AC%A7%E5%93%A5[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_蜡笔ᵐ[盘]",
- "name": "蜡笔ᵐ[盘](DS)",
- "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
+ "key": "drpyS_夸克影视[盘]",
+ "name": "夸克影视[盘](DS)",
+ "api": "http://localhost:5757/api/夸克影视[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5MWfh8zVTAI8Mua8gAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_虎斑ᵐ[盘]",
- "name": "虎斑ᵐ[盘](DS)",
- "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
+ "key": "drpyS_UC分享[盘]",
+ "name": "UC分享[盘](DS)",
+ "api": "http://localhost:5757/api/UC分享?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5MbPv2bSJAFZ8CcsgAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "drpyS_至臻[盘]",
- "name": "至臻[盘](DS)",
- "api": "http://localhost:5757/api/至臻[盘]?pwd=dzyyds",
+ "key": "drpyS_WebDav影视[盘]",
+ "name": "WebDav影视[盘](DS)",
+ "api": "http://localhost:5757/api/webdav影视[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 0,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%87%B3%E8%87%BB[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "drpyS_木偶ᵐ[盘]",
- "name": "木偶ᵐ[盘](DS)",
- "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
+ "key": "drpyS_七味[优]",
+ "name": "七味[优](DS)",
+ "api": "http://localhost:5757/api/七味[优]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5NmfF08ZtABDtdR4gAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "3/4 接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_虎斑[盘]",
- "name": "虎斑[盘](DS)",
- "api": "http://localhost:5757/api/虎斑[盘]?pwd=dzyyds",
+ "key": "drpyS_WebDav[盘]",
+ "name": "WebDav[盘](DS)",
+ "api": "http://localhost:5757/api/webdav[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 0,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%99%8E%E6%96%91[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "drpyS_至臻ᵐ[盘]",
- "name": "至臻ᵐ[盘](DS)",
- "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
+ "key": "drpyS_WebDavZn[盘]",
+ "name": "WebDavZn[盘](DS)",
+ "api": "http://localhost:5757/api/webdav[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 0,
"lang": "ds",
"status": "success",
- "message": "3/4 接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF50b75RftuAAWyZJQgAAAA",
- "category": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF50b75RftuAAWyZJQgAAAA",
- "search": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF50b75RftuAAWyZJQgAAAA",
- "detail": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=detail&ids=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF50b75RftuAAWyZJQgAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "drpyS_雷鲸小站[盘]",
- "name": "雷鲸小站[盘](DS)",
- "api": "http://localhost:5757/api/雷鲸小站[盘]?pwd=dzyyds",
+ "key": "drpyS_FTP[盘]",
+ "name": "FTP[盘](DS)",
+ "api": "http://localhost:5757/api/ftp[盘]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 0,
+ "lang": "ds",
+ "status": "success",
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
+ },
+ {
+ "key": "drpyS_至臻[盘]",
+ "name": "至臻[盘](DS)",
+ "api": "http://localhost:5757/api/至臻[盘]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9B%B7%E9%B2%B8%E5%B0%8F%E7%AB%99[%E7%9B%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_多多ᵐ[盘]",
- "name": "多多ᵐ[盘](DS)",
- "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
+ "key": "drpyS_虎斑[盘]",
+ "name": "虎斑[盘](DS)",
+ "api": "http://localhost:5757/api/虎斑[盘]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5umQWEAEA1%2BC5iSAAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_玩偶ᵐ[盘]",
- "name": "玩偶ᵐ[盘](DS)",
+ "key": "drpyS_木偶ᵐ[盘]",
+ "name": "木偶ᵐ[盘](DS)",
"api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF53rfyaeM2FUMAXj8hgiIAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_欧歌ᵐ[盘]",
- "name": "欧歌ᵐ[盘](DS)",
+ "key": "drpyS_多多ᵐ[盘]",
+ "name": "多多ᵐ[盘](DS)",
"api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
- "message": "4/4 接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5tmb5s7U9AIVJTBogAAAA",
- "category": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5tmb5s7U9AIVJTBogAAAA",
- "search": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5tmb5s7U9AIVJTBogAAAA",
- "detail": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=detail&ids=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5tmb5s7U9AIVJTBogAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -859,10 +667,8 @@
"lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/alist?do=cat&pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTT8zJLC7RAzEB657OqRIAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -874,73 +680,47 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%94%B5%E5%BD%B1%E6%B8%AF[%E7%A3%81]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_集百动漫[漫]",
- "name": "集百动漫[漫](DS)",
- "api": "http://localhost:5757/api/集百动漫[漫]?pwd=dzyyds",
+ "key": "drpyS_至臻ᵐ[盘]",
+ "name": "至臻ᵐ[盘](DS)",
+ "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9B%86%E7%99%BE%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_剧透社[盘]",
- "name": "剧透社[盘](hipy)",
- "api": "http://localhost:5757/api/剧透社[盘]?do=py&pwd=dzyyds",
+ "key": "drpyS_集百动漫[漫]",
+ "name": "集百动漫[漫](DS)",
+ "api": "http://localhost:5757/api/集百动漫[漫]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "hipy",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%89%A7%E9%80%8F%E7%A4%BE[%E7%9B%98]?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%89%A7%E9%80%8F%E7%A4%BE[%E7%9B%98]?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_樱漫[漫]",
- "name": "樱漫[漫](DS)",
- "api": "http://localhost:5757/api/樱漫[漫]?pwd=dzyyds",
+ "key": "php_星星短剧 ᵈᶻ[短]",
+ "name": "星星短剧 ᵈᶻ[短](PHP)",
+ "api": "http://localhost:5757/api/星星短剧 ᵈᶻ[短]?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%A8%B1%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%A8%B1%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_爱动漫[漫]",
- "name": "爱动漫[漫](DS)",
- "api": "http://localhost:5757/api/爱动漫[漫]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
+ "lang": "php",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%88%B1%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -952,73 +732,21 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8A%A8%E6%BC%AB%E8%B1%86[%E6%BC%AB]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_西饭短剧[短]",
- "name": "西饭短剧[短](DS)",
- "api": "http://localhost:5757/api/西饭短剧[短]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%A5%BF%E9%A5%AD%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E8%A5%BF%E9%A5%AD%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_星芽短剧[短]",
- "name": "星芽短剧[短](DS)",
- "api": "http://localhost:5757/api/星芽短剧[短]?pwd=dzyyds",
+ "key": "drpyS_360影视[官]",
+ "name": "360影视[官](DS)",
+ "api": "http://localhost:5757/api/360影视[官]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%98%9F%E8%8A%BD%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%98%9F%E8%8A%BD%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
- },
- {
- "key": "php_星星短剧 ᵈᶻ[短]",
- "name": "星星短剧 ᵈᶻ[短](PHP)",
- "api": "http://localhost:5757/api/星星短剧 ᵈᶻ[短]?do=php&pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "php",
- "status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%98%9F%E6%98%9F%E7%9F%AD%E5%89%A7%20%E1%B5%88%E1%B6%BB[%E7%9F%AD]?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_牛牛短剧[短]",
- "name": "牛牛短剧[短](DS)",
- "api": "http://localhost:5757/api/牛牛短剧[短]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%89%9B%E7%89%9B%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%89%9B%E7%89%9B%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1030,57 +758,21 @@
"lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%94%9C%E5%9C%88%E7%9F%AD%E5%89%A7[%E7%9F%AD]?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_七猫短剧[短]",
- "name": "七猫短剧[短](DS)",
- "api": "http://localhost:5757/api/七猫短剧[短]?pwd=dzyyds",
+ "key": "catvod_聚合短剧[短]",
+ "name": "聚合短剧[短](cat)",
+ "api": "http://localhost:5757/api/聚合短剧[短]?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_软鸭短剧[短]",
- "name": "软鸭短剧[短](DS)",
- "api": "http://localhost:5757/api/软鸭短剧[短]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%BD%AF%E9%B8%AD%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E8%BD%AF%E9%B8%AD%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_360影视[官]",
- "name": "360影视[官](DS)",
- "api": "http://localhost:5757/api/360影视[官]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
+ "lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/360%E5%BD%B1%E8%A7%86[%E5%AE%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1092,10 +784,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%88%91%E7%9A%84%E5%93%94%E5%93%A9[%E5%AE%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp5ytPJK5919D%2BbvUkPJAIADgS31hkAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1107,10 +797,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%88%91%E7%9A%84%E5%93%94%E5%93%A9[%E5%AE%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp5ytPJK59NnfmiaZMeSAQAgv7xPBkAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1122,10 +810,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%88%91%E7%9A%84%E5%93%94%E5%93%A9[%E5%AE%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp5ytPJK59umPi0Zb8eSAQAOsH08xkAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1137,60 +823,47 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%88%91%E7%9A%84%E5%93%94%E5%93%A9[%E5%AE%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp5ytPJK58uWf60dYUeSAQAZ2A%2BOBkAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_哔哩收藏[官]",
- "name": "哔哩收藏[官](DS)",
- "api": "http://localhost:5757/api/哔哩收藏[官]?pwd=dzyyds",
+ "key": "drpyS_哔哩大杂烩[官]",
+ "name": "哔哩大杂烩[官](DS)",
+ "api": "http://localhost:5757/api/我的哔哩[官]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%93%94%E5%93%A9%E6%94%B6%E8%97%8F[%E5%AE%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp5ytPJK59N2fZier8eSAQA1H95AxkAAAA%3D",
- "category": "http://localhost:5757/api/%E5%93%94%E5%93%A9%E6%94%B6%E8%97%8F[%E5%AE%98]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp5ytPJK59N2fZier8eSAQA1H95AxkAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_优酷[官]",
- "name": "优酷[官](DS)",
- "api": "http://localhost:5757/api/优酷[官]?pwd=dzyyds",
+ "key": "drpyS_斗鱼直播弹幕[官]",
+ "name": "斗鱼直播弹幕[官](DS)",
+ "api": "http://localhost:5757/api/斗鱼直播弹幕[官]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%BC%98%E9%85%B7[%E5%AE%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E4%BC%98%E9%85%B7[%E5%AE%98]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_奇珍异兽[官]",
- "name": "奇珍异兽[官](DS)",
- "api": "http://localhost:5757/api/奇珍异兽[官]?pwd=dzyyds",
+ "key": "hipy_py_剧透社[盘]",
+ "name": "剧透社[盘](hipy)",
+ "api": "http://localhost:5757/api/剧透社[盘]?do=py&pwd=dzyyds",
"type": 4,
- "searchable": 2,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "hipy",
"status": "success",
- "message": "2/4 接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A5%87%E7%8F%8D%E5%BC%82%E5%85%BD[%E5%AE%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%A5%87%E7%8F%8D%E5%BC%82%E5%85%BD[%E5%AE%98]?pwd=dzyyds&ac=list&t=1&pg=1",
- "search": "http://localhost:5757/api/%E5%A5%87%E7%8F%8D%E5%BC%82%E5%85%BD[%E5%AE%98]?pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95",
- "detail": "http://localhost:5757/api/%E5%A5%87%E7%8F%8D%E5%BC%82%E5%85%BD[%E5%AE%98]?pwd=dzyyds&ac=detail&ids=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1202,166 +875,281 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%93%94%E5%93%A9%E5%BD%B1%E8%A7%86[%E5%AE%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_聚合短剧[短]",
- "name": "聚合短剧[短](cat)",
- "api": "http://localhost:5757/api/聚合短剧[短]?do=cat&pwd=dzyyds",
+ "key": "drpyS_玩偶ᵐ[盘]",
+ "name": "玩偶ᵐ[盘](DS)",
+ "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%81%9A%E5%90%88%E7%9F%AD%E5%89%A7[%E7%9F%AD]?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_哔哩大杂烩[官]",
- "name": "哔哩大杂烩[官](DS)",
- "api": "http://localhost:5757/api/我的哔哩[官]?pwd=dzyyds",
+ "key": "drpyS_虎斑ᵐ[盘]",
+ "name": "虎斑ᵐ[盘](DS)",
+ "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%88%91%E7%9A%84%E5%93%94%E5%93%A9[%E5%AE%98]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp5ytPJK58uWf5sbtPz5pV6IEEAolZcGBwAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_斗鱼直播弹幕[官]",
- "name": "斗鱼直播弹幕[官](DS)",
- "api": "http://localhost:5757/api/斗鱼直播弹幕[官]?pwd=dzyyds",
+ "key": "drpyS_樱漫[漫]",
+ "name": "樱漫[漫](DS)",
+ "api": "http://localhost:5757/api/樱漫[漫]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%96%97%E9%B1%BC%E7%9B%B4%E6%92%AD%E5%BC%B9%E5%B9%95[%E5%AE%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_哩哩[官]",
- "name": "哩哩[官](cat)",
- "api": "http://localhost:5757/api/哩哩[官]?do=cat&pwd=dzyyds",
+ "key": "drpyS_星芽短剧[短]",
+ "name": "星芽短剧[短](DS)",
+ "api": "http://localhost:5757/api/星芽短剧[短]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "cat",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%93%A9%E5%93%A9[%E5%AE%98]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%93%A9%E5%93%A9[%E5%AE%98]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_百忙无果[官]",
- "name": "百忙无果[官](DS)",
- "api": "http://localhost:5757/api/百忙无果[官]?pwd=dzyyds",
+ "key": "drpyS_七猫短剧[短]",
+ "name": "七猫短剧[短](DS)",
+ "api": "http://localhost:5757/api/七猫短剧[短]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%99%BE%E5%BF%99%E6%97%A0%E6%9E%9C[%E5%AE%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%99%BE%E5%BF%99%E6%97%A0%E6%9E%9C[%E5%AE%98]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_菜狗[官]",
- "name": "菜狗[官](DS)",
- "api": "http://localhost:5757/api/菜狗[官]?pwd=dzyyds",
+ "key": "drpyS_牛牛短剧[短]",
+ "name": "牛牛短剧[短](DS)",
+ "api": "http://localhost:5757/api/牛牛短剧[短]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%8F%9C%E7%8B%97[%E5%AE%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E8%8F%9C%E7%8B%97[%E5%AE%98]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_央央[官]",
- "name": "央央[官](cat)",
- "api": "http://localhost:5757/api/央央[官]?do=cat&pwd=dzyyds",
+ "key": "drpyS_爱动漫[漫]",
+ "name": "爱动漫[漫](DS)",
+ "api": "http://localhost:5757/api/爱动漫[漫]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "cat",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A4%AE%E5%A4%AE[%E5%AE%98]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%A4%AE%E5%A4%AE[%E5%AE%98]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_果果 ᵈᶻ[官]",
- "name": "果果 ᵈᶻ[官](PHP)",
- "api": "http://localhost:5757/api/果果 ᵈᶻ[官]?do=php&pwd=dzyyds",
+ "key": "drpyS_西饭短剧[短]",
+ "name": "西饭短剧[短](DS)",
+ "api": "http://localhost:5757/api/西饭短剧[短]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "php",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%9E%9C%E6%9E%9C%20%E1%B5%88%E1%B6%BB[%E5%AE%98]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%9E%9C%E6%9E%9C%20%E1%B5%88%E1%B6%BB[%E5%AE%98]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_腾腾 ᵈᶻ[官]",
- "name": "腾腾 ᵈᶻ[官](PHP)",
- "api": "http://localhost:5757/api/腾腾 ᵈᶻ[官]?do=php&pwd=dzyyds",
+ "key": "drpyS_哔哩收藏[官]",
+ "name": "哔哩收藏[官](DS)",
+ "api": "http://localhost:5757/api/哔哩收藏[官]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "php",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%85%BE%E8%85%BE%20%E1%B5%88%E1%B6%BB[%E5%AE%98]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E8%85%BE%E8%85%BE%20%E1%B5%88%E1%B6%BB[%E5%AE%98]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_16wMV[听]",
- "name": "16wMV[听](DS)",
- "api": "http://localhost:5757/api/16wMV[听]?pwd=dzyyds",
+ "key": "drpyS_优酷[官]",
+ "name": "优酷[官](DS)",
+ "api": "http://localhost:5757/api/优酷[官]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_菜狗[官]",
+ "name": "菜狗[官](DS)",
+ "api": "http://localhost:5757/api/菜狗[官]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "php_果果 ᵈᶻ[官]",
+ "name": "果果 ᵈᶻ[官](PHP)",
+ "api": "http://localhost:5757/api/果果 ᵈᶻ[官]?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
+ "lang": "php",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_百忙无果[官]",
+ "name": "百忙无果[官](DS)",
+ "api": "http://localhost:5757/api/百忙无果[官]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/16wMV[%E5%90%AC]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTf9rb%2BLR17ZMd7c%2FW9jybvUmvpKIEABrNdgcbAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "catvod_哩哩[官]",
+ "name": "哩哩[官](cat)",
+ "api": "http://localhost:5757/api/哩哩[官]?do=cat&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "cat",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "catvod_央央[官]",
+ "name": "央央[官](cat)",
+ "api": "http://localhost:5757/api/央央[官]?do=cat&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "cat",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "php_腾腾 ᵈᶻ[官]",
+ "name": "腾腾 ᵈᶻ[官](PHP)",
+ "api": "http://localhost:5757/api/腾腾 ᵈᶻ[官]?do=php&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "php",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_软鸭短剧[短]",
+ "name": "软鸭短剧[短](DS)",
+ "api": "http://localhost:5757/api/软鸭短剧[短]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_番茄短剧[短]",
+ "name": "番茄短剧[短](DS)",
+ "api": "http://localhost:5757/api/番茄短剧[短]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "success",
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
+ },
+ {
+ "key": "catvod_奇奇[官]",
+ "name": "奇奇[官](cat)",
+ "api": "http://localhost:5757/api/奇奇[官]?do=cat&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "cat",
+ "status": "success",
+ "message": "分类接口正常 (容错:分类2)",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "php_奇奇 ᵈᶻ[官]",
+ "name": "奇奇 ᵈᶻ[官](PHP)",
+ "api": "http://localhost:5757/api/奇奇 ᵈᶻ[官]?do=php&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "php",
+ "status": "success",
+ "message": "分类接口正常 (容错:分类2)",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_奇珍异兽[官]",
+ "name": "奇珍异兽[官](DS)",
+ "api": "http://localhost:5757/api/奇珍异兽[官]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "success",
+ "message": "分类接口正常 (容错:分类2)",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1373,10 +1161,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/DJ%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1388,184 +1174,216 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%85%AD%E6%9C%88%E5%90%AC%E4%B9%A6[%E5%90%AC]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_30wMV[听]",
- "name": "30wMV[听](DS)",
- "api": "http://localhost:5757/api/30wMV[听]?pwd=dzyyds",
+ "key": "drpyS_16wMV[听]",
+ "name": "16wMV[听](DS)",
+ "api": "http://localhost:5757/api/16wMV[听]?pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/30wMV[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/30wMV[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_凤凰FM[听]",
- "name": "凤凰FM[听](DS)",
- "api": "http://localhost:5757/api/凤凰FM[听]?pwd=dzyyds",
+ "key": "catvod_听了么[听]",
+ "name": "听了么[听](cat)",
+ "api": "http://localhost:5757/api/听了么[听]?do=cat&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "cat",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "catvod_网抑云[听]",
+ "name": "网抑云[听](cat)",
+ "api": "http://localhost:5757/api/网抑云[听]?do=cat&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "cat",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_爱推图[画]",
+ "name": "爱推图[画](DS)",
+ "api": "http://localhost:5757/api/爱推图[画]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%87%A4%E5%87%B0FM[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%87%A4%E5%87%B0FM[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_博看听书[听]",
- "name": "博看听书[听](DS)",
- "api": "http://localhost:5757/api/博看听书[听]?pwd=dzyyds",
+ "key": "drpyS_包子漫画[画]",
+ "name": "包子漫画[画](DS)",
+ "api": "http://localhost:5757/api/包子漫画[画]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8D%9A%E7%9C%8B%E5%90%AC%E4%B9%A6[%E5%90%AC]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_果果[官]",
- "name": "果果[官](cat)",
- "api": "http://localhost:5757/api/果果[官]?do=cat&pwd=dzyyds",
+ "key": "drpyS_酷爱漫画[画]",
+ "name": "酷爱漫画[画](DS)",
+ "api": "http://localhost:5757/api/酷爱漫画[画]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "cat",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%9E%9C%E6%9E%9C[%E5%AE%98]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%9E%9C%E6%9E%9C[%E5%AE%98]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_布谷音乐[听]",
- "name": "布谷音乐[听](DS)",
- "api": "http://localhost:5757/api/布谷音乐[听]?pwd=dzyyds",
+ "key": "drpyS_番茄漫画[画]",
+ "name": "番茄漫画[画](DS)",
+ "api": "http://localhost:5757/api/番茄漫画[画]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "ds",
+ "status": "success",
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
+ },
+ {
+ "key": "drpyS_光社漫画[画]",
+ "name": "光社漫画[画](DS)",
+ "api": "http://localhost:5757/api/光社漫画[画]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%B8%83%E8%B0%B7%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%B8%83%E8%B0%B7%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_爱玩音乐[听]",
- "name": "爱玩音乐[听](DS)",
- "api": "http://localhost:5757/api/爱玩音乐[听]?pwd=dzyyds",
+ "key": "php_酷爱漫画 ᵈᶻ[画]",
+ "name": "酷爱漫画 ᵈᶻ[画](PHP)",
+ "api": "http://localhost:5757/api/酷爱漫画 ᵈᶻ[画]?do=php&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "php",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "catvod_果果[官]",
+ "name": "果果[官](cat)",
+ "api": "http://localhost:5757/api/果果[官]?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
+ "lang": "cat",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_30wMV[听]",
+ "name": "30wMV[听](DS)",
+ "api": "http://localhost:5757/api/30wMV[听]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 0,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E7%8E%A9%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%88%B1%E7%8E%A9%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_狗狗音乐[听]",
- "name": "狗狗音乐[听](DS)",
- "api": "http://localhost:5757/api/狗狗音乐[听]?pwd=dzyyds",
+ "key": "drpyS_凤凰FM[听]",
+ "name": "凤凰FM[听](DS)",
+ "api": "http://localhost:5757/api/凤凰FM[听]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8B%97%E7%8B%97%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_酷我听书[听]",
- "name": "酷我听书[听](DS)",
- "api": "http://localhost:5757/api/酷我听书[听]?pwd=dzyyds",
+ "key": "drpyS_爱玩音乐[听]",
+ "name": "爱玩音乐[听](DS)",
+ "api": "http://localhost:5757/api/爱玩音乐[听]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%85%B7%E6%88%91%E5%90%AC%E4%B9%A6[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%85%B7%E6%88%91%E5%90%AC%E4%B9%A6[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_米兔音乐[听]",
- "name": "米兔音乐[听](DS)",
- "api": "http://localhost:5757/api/米兔音乐[听]?pwd=dzyyds",
+ "key": "drpyS_博看听书[听]",
+ "name": "博看听书[听](DS)",
+ "api": "http://localhost:5757/api/博看听书[听]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%B1%B3%E5%85%94%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%B1%B3%E5%85%94%E9%9F%B3%E4%B9%90[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_爱听音乐[听]",
- "name": "爱听音乐[听](hipy)",
- "api": "http://localhost:5757/api/爱听音乐[听]?do=py&pwd=dzyyds",
+ "key": "drpyS_布谷音乐[听]",
+ "name": "布谷音乐[听](DS)",
+ "api": "http://localhost:5757/api/布谷音乐[听]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "hipy",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E5%90%AC%E9%9F%B3%E4%B9%90[%E5%90%AC]?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%88%B1%E5%90%AC%E9%9F%B3%E4%B9%90[%E5%90%AC]?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_音乐磁场[听]",
- "name": "音乐磁场[听](DS)",
- "api": "http://localhost:5757/api/音乐磁场[听]?pwd=dzyyds",
+ "key": "drpyS_狗狗音乐[听]",
+ "name": "狗狗音乐[听](DS)",
+ "api": "http://localhost:5757/api/狗狗音乐[听]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9F%B3%E4%B9%90%E7%A3%81%E5%9C%BA[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%9F%B3%E4%B9%90%E7%A3%81%E5%9C%BA[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1577,105 +1395,73 @@
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%9C%BB%E8%9C%93FM[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E8%9C%BB%E8%9C%93FM[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_番茄畅听[听]",
- "name": "番茄畅听[听](DS)",
- "api": "http://localhost:5757/api/番茄畅听[听]?pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E7%95%85%E5%90%AC[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E7%95%85%E5%90%AC[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_听了么[听]",
- "name": "听了么[听](cat)",
- "api": "http://localhost:5757/api/听了么[听]?do=cat&pwd=dzyyds",
+ "key": "catvod_青木倪壁纸[画]",
+ "name": "青木倪壁纸[画](cat)",
+ "api": "http://localhost:5757/api/青木倪壁纸[画]?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%90%AC%E4%BA%86%E4%B9%88[%E5%90%AC]?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_七猫小说[书]",
- "name": "七猫小说[书](DS)",
- "api": "http://localhost:5757/api/七猫小说[书]?pwd=dzyyds",
+ "key": "drpyS_酷我听书[听]",
+ "name": "酷我听书[听](DS)",
+ "api": "http://localhost:5757/api/酷我听书[听]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_网抑云[听]",
- "name": "网抑云[听](cat)",
- "api": "http://localhost:5757/api/网抑云[听]?do=cat&pwd=dzyyds",
+ "key": "php_包子漫画 ᵈᶻ[画]",
+ "name": "包子漫画 ᵈᶻ[画](PHP)",
+ "api": "http://localhost:5757/api/包子漫画 ᵈᶻ[画]?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "php",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E6%8A%91%E4%BA%91[%E5%90%AC]?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_阅读助手[书]",
- "name": "阅读助手[书](DS)",
- "api": "http://localhost:5757/api/阅读助手[书]?pwd=dzyyds",
+ "key": "drpyS_米兔音乐[听]",
+ "name": "米兔音乐[听](DS)",
+ "api": "http://localhost:5757/api/米兔音乐[听]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%98%85%E8%AF%BB%E5%8A%A9%E6%89%8B[%E4%B9%A6]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%98%85%E8%AF%BB%E5%8A%A9%E6%89%8B[%E4%B9%A6]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_爱玩音乐[听]",
- "name": "爱玩音乐[听](hipy)",
- "api": "http://localhost:5757/api/爱玩音乐[听]?do=py&pwd=dzyyds",
+ "key": "drpyS_七猫小说[书]",
+ "name": "七猫小说[书](DS)",
+ "api": "http://localhost:5757/api/七猫小说[书]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "hipy",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E7%8E%A9%E9%9F%B3%E4%B9%90[%E5%90%AC]?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%88%B1%E7%8E%A9%E9%9F%B3%E4%B9%90[%E5%90%AC]?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1687,108 +1473,99 @@
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8A%AA%E5%8A%AA%E4%B9%A6%E5%9D%8A[%E4%B9%A6]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%8A%AA%E5%8A%AA%E4%B9%A6%E5%9D%8A[%E4%B9%A6]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_七猫小说 ᵈᶻ[书]",
- "name": "七猫小说 ᵈᶻ[书](PHP)",
- "api": "http://localhost:5757/api/七猫小说 ᵈᶻ[书]?do=php&pwd=dzyyds",
+ "key": "drpyS_去读书[书]",
+ "name": "去读书[书](DS)",
+ "api": "http://localhost:5757/api/去读书[书]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E5%B0%8F%E8%AF%B4%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E5%B0%8F%E8%AF%B4%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_七猫小说[书]",
- "name": "七猫小说[书](hipy)",
- "api": "http://localhost:5757/api/七猫小说[书]?do=py&pwd=dzyyds",
+ "key": "drpyS_阅读助手[书]",
+ "name": "阅读助手[书](DS)",
+ "api": "http://localhost:5757/api/阅读助手[书]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "hipy",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E4%B8%83%E7%8C%AB%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_去读书[书]",
- "name": "去读书[书](DS)",
- "api": "http://localhost:5757/api/去读书[书]?pwd=dzyyds",
+ "key": "hipy_py_爱玩音乐[听]",
+ "name": "爱玩音乐[听](hipy)",
+ "api": "http://localhost:5757/api/爱玩音乐[听]?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "hipy",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8E%BB%E8%AF%BB%E4%B9%A6[%E4%B9%A6]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%8E%BB%E8%AF%BB%E4%B9%A6[%E4%B9%A6]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_顶点小说[书]",
- "name": "顶点小说[书](DS)",
- "api": "http://localhost:5757/api/顶点小说[书]?pwd=dzyyds",
+ "key": "drpyS_音乐磁场[听]",
+ "name": "音乐磁场[听](DS)",
+ "api": "http://localhost:5757/api/音乐磁场[听]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "3/4 接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%A1%B6%E7%82%B9%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%A1%B6%E7%82%B9%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds&ac=list&t=1&pg=1",
- "search": "http://localhost:5757/api/%E9%A1%B6%E7%82%B9%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95",
- "detail": "http://localhost:5757/api/%E9%A1%B6%E7%82%B9%E5%B0%8F%E8%AF%B4[%E4%B9%A6]?pwd=dzyyds&ac=detail&ids=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_酷爱漫画[画]",
- "name": "酷爱漫画[画](DS)",
- "api": "http://localhost:5757/api/酷爱漫画[画]?pwd=dzyyds",
+ "key": "php_去读书 ᵈᶻ[书]",
+ "name": "去读书 ᵈᶻ[书](PHP)",
+ "api": "http://localhost:5757/api/去读书 ᵈᶻ[书]?do=php&pwd=dzyyds",
"type": 4,
- "searchable": 2,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "php",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%85%B7%E7%88%B1%E6%BC%AB%E7%94%BB[%E7%94%BB]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_漫画大全[画]",
- "name": "漫画大全[画](DS)",
- "api": "http://localhost:5757/api/漫画大全[画]?pwd=dzyyds",
+ "key": "php_七猫小说 ᵈᶻ[书]",
+ "name": "七猫小说 ᵈᶻ[书](PHP)",
+ "api": "http://localhost:5757/api/七猫小说 ᵈᶻ[书]?do=php&pwd=dzyyds",
"type": 4,
- "searchable": 2,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "php",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%BC%AB%E7%94%BB%E5%A4%A7%E5%85%A8[%E7%94%BB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%BC%AB%E7%94%BB%E5%A4%A7%E5%85%A8[%E7%94%BB]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "hipy_py_爱听音乐[听]",
+ "name": "爱听音乐[听](hipy)",
+ "api": "http://localhost:5757/api/爱听音乐[听]?do=py&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "hipy",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1800,57 +1577,47 @@
"lang": "php",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%98%85%E8%AF%BB%E5%8A%A9%E6%89%8B%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%98%85%E8%AF%BB%E5%8A%A9%E6%89%8B%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_包子漫画[画]",
- "name": "包子漫画[画](DS)",
- "api": "http://localhost:5757/api/包子漫画[画]?pwd=dzyyds",
+ "key": "drpyS_漫画大全[画]",
+ "name": "漫画大全[画](DS)",
+ "api": "http://localhost:5757/api/漫画大全[画]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8C%85%E5%AD%90%E6%BC%AB%E7%94%BB[%E7%94%BB]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_爱推图[画]",
- "name": "爱推图[画](DS)",
- "api": "http://localhost:5757/api/爱推图[画]?pwd=dzyyds",
+ "key": "php_74P福利图 ᵈᵇ[画]",
+ "name": "74P福利图 ᵈᵇ[画](PHP)",
+ "api": "http://localhost:5757/api/74P福利图 ᵈᵇ[画]?do=php&pwd=dzyyds",
"type": 4,
- "searchable": 2,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "php",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E6%8E%A8%E5%9B%BE[%E7%94%BB]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_去读书 ᵈᶻ[书]",
- "name": "去读书 ᵈᶻ[书](PHP)",
- "api": "http://localhost:5757/api/去读书 ᵈᶻ[书]?do=php&pwd=dzyyds",
+ "key": "drpyS_顶点小说[书]",
+ "name": "顶点小说[书](DS)",
+ "api": "http://localhost:5757/api/顶点小说[书]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "php",
+ "searchable": 2,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8E%BB%E8%AF%BB%E4%B9%A6%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%8E%BB%E8%AF%BB%E4%B9%A6%20%E1%B5%88%E1%B6%BB[%E4%B9%A6]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1862,11 +1629,8 @@
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%BC%AB%E7%A5%9E[%E7%94%BB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%BC%AB%E7%A5%9E[%E7%94%BB]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1878,72 +1642,60 @@
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8A%A8%E6%BC%AB%E5%95%A6[%E7%94%BB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%8A%A8%E6%BC%AB%E5%95%A6[%E7%94%BB]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_光社漫画[画]",
- "name": "光社漫画[画](DS)",
- "api": "http://localhost:5757/api/光社漫画[画]?pwd=dzyyds",
+ "key": "catvod_酷酷[官]",
+ "name": "酷酷[官](cat)",
+ "api": "http://localhost:5757/api/酷酷[官]?do=cat&pwd=dzyyds",
"type": 4,
- "searchable": 2,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "cat",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%85%89%E7%A4%BE%E6%BC%AB%E7%94%BB[%E7%94%BB]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "php_酷爱漫画 ᵈᶻ[画]",
- "name": "酷爱漫画 ᵈᶻ[画](PHP)",
- "api": "http://localhost:5757/api/酷爱漫画 ᵈᶻ[画]?do=php&pwd=dzyyds",
+ "key": "hipy_py_七猫小说[书]",
+ "name": "七猫小说[书](hipy)",
+ "api": "http://localhost:5757/api/七猫小说[书]?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "hipy",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%85%B7%E7%88%B1%E6%BC%AB%E7%94%BB%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_74P福利图 ᵈᵇ[画]",
- "name": "74P福利图 ᵈᵇ[画](PHP)",
- "api": "http://localhost:5757/api/74P福利图 ᵈᵇ[画]?do=php&pwd=dzyyds",
+ "key": "drpyS_音乐聚合[听]",
+ "name": "音乐聚合[听](DS)",
+ "api": "http://localhost:5757/api/音乐聚合[听]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/74P%E7%A6%8F%E5%88%A9%E5%9B%BE%20%E1%B5%88%E1%B5%87[%E7%94%BB]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/74P%E7%A6%8F%E5%88%A9%E5%9B%BE%20%E1%B5%88%E1%B5%87[%E7%94%BB]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "php_包子漫画 ᵈᶻ[画]",
- "name": "包子漫画 ᵈᶻ[画](PHP)",
- "api": "http://localhost:5757/api/包子漫画 ᵈᶻ[画]?do=php&pwd=dzyyds",
+ "key": "php_74P福利图 ᵈᶻ[画]",
+ "name": "74P福利图 ᵈᶻ[画](PHP)",
+ "api": "http://localhost:5757/api/74P福利图 ᵈᶻ[画]?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "php",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8C%85%E5%AD%90%E6%BC%AB%E7%94%BB%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -1955,60 +1707,48 @@
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E8%93%9D%E9%B9%B0",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E8%93%9D%E9%B9%B0"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_74P福利图 ᵈᶻ[画]",
- "name": "74P福利图 ᵈᶻ[画](PHP)",
- "api": "http://localhost:5757/api/74P福利图 ᵈᶻ[画]?do=php&pwd=dzyyds",
+ "key": "php_动漫啦 ᵈᶻ[画]",
+ "name": "动漫啦 ᵈᶻ[画](PHP)",
+ "api": "http://localhost:5757/api/动漫啦 ᵈᶻ[画]?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "php",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/74P%E7%A6%8F%E5%88%A9%E5%9B%BE%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/74P%E7%A6%8F%E5%88%A9%E5%9B%BE%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_动漫啦 ᵈᶻ[画]",
- "name": "动漫啦 ᵈᶻ[画](PHP)",
- "api": "http://localhost:5757/api/动漫啦 ᵈᶻ[画]?do=php&pwd=dzyyds",
+ "key": "drpyS_番茄畅听[听]",
+ "name": "番茄畅听[听](DS)",
+ "api": "http://localhost:5757/api/番茄畅听[听]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8A%A8%E6%BC%AB%E5%95%A6%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%8A%A8%E6%BC%AB%E5%95%A6%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "catvod_青木倪壁纸[画]",
- "name": "青木倪壁纸[画](cat)",
- "api": "http://localhost:5757/api/青木倪壁纸[画]?do=cat&pwd=dzyyds",
+ "key": "drpyS_播客[听]",
+ "name": "播客[听](DS)",
+ "api": "http://localhost:5757/api/播客[听]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "cat",
+ "searchable": 0,
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9D%92%E6%9C%A8%E5%80%AA%E5%A3%81%E7%BA%B8[%E7%94%BB]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%9D%92%E6%9C%A8%E5%80%AA%E5%A3%81%E7%BA%B8[%E7%94%BB]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
"key": "php_番茄漫画 ᵈᶻ[画]",
@@ -2019,263 +1759,242 @@
"lang": "php",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E6%BC%AB%E7%94%BB%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E6%BC%AB%E7%94%BB%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_影视_Appget",
- "name": "影视[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_TG搜[搜]",
+ "name": "TG搜[搜](DS)",
+ "api": "http://localhost:5757/api/TG搜[搜]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "unknown",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%BD%B1%E8%A7%86",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%BD%B1%E8%A7%86"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_奇奇_Appget",
- "name": "奇奇[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_TG盘搜[搜]",
+ "name": "TG盘搜[搜](DS)",
+ "api": "http://localhost:5757/api/TG盘搜[搜]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "unknown",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%A5%87%E5%A5%87",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%A5%87%E5%A5%87"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_优兔_Appget",
- "name": "优兔[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_兄弟盘[搜]",
+ "name": "兄弟盘[搜](DS)",
+ "api": "http://localhost:5757/api/兄弟盘[搜]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "unknown",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BC%98%E5%85%94",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BC%98%E5%85%94"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_紫金_Appget",
- "name": "紫金[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_百度盘[搜]",
+ "name": "百度盘[搜](DS)",
+ "api": "http://localhost:5757/api/百度盘[搜]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "unknown",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%B4%AB%E9%87%91",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%B4%AB%E9%87%91"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_小猪_Appget",
- "name": "小猪[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_网盘资源[搜]",
+ "name": "网盘资源[搜](DS)",
+ "api": "http://localhost:5757/api/网盘资源[搜]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "unknown",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%B0%8F%E7%8C%AA",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%B0%8F%E7%8C%AA"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_五八_Appget",
- "name": "五八[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_iptv",
+ "name": "iptv(DS)",
+ "api": "http://localhost:5757/api/iptv?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "unknown",
+ "searchable": 0,
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BA%94%E5%85%AB",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BA%94%E5%85%AB"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_爱盈_Appget",
- "name": "爱盈[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "push_agent",
+ "name": "push_agent(DS)",
+ "api": "http://localhost:5757/api/push_agent?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "unknown",
+ "searchable": 0,
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%88%B1%E7%9B%88",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%88%B1%E7%9B%88"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_火狐_Appget",
- "name": "火狐[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_动作交互",
+ "name": "动作交互(DS)",
+ "api": "http://localhost:5757/api/动作交互?pwd=dzyyds",
+ "type": 4,
+ "searchable": 0,
+ "lang": "ds",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_动作测试新定标准版",
+ "name": "动作测试新定标准版(DS)",
+ "api": "http://localhost:5757/api/动作测试新定标准版?pwd=dzyyds",
+ "type": 4,
+ "searchable": 0,
+ "lang": "ds",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_点歌欢唱[B]",
+ "name": "点歌欢唱[B](DS)",
+ "api": "http://localhost:5757/api/点歌欢唱[B]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "unknown",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%81%AB%E7%8B%90",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%81%AB%E7%8B%90"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_火锅_Appget",
- "name": "火锅[M](GET)",
- "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
+ "key": "drpyS_梨园行[戏]",
+ "name": "梨园行[戏](DS)",
+ "api": "http://localhost:5757/api/梨园行[戏]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "unknown",
+ "lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%81%AB%E9%94%85",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%81%AB%E9%94%85"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_数字_Appget",
- "name": "数字[M](GET)",
+ "key": "drpyS_影视_Appget",
+ "name": "影视[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E6%95%B0%E5%AD%97",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E6%95%B0%E5%AD%97"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_金牌_Appget",
- "name": "金牌[M](GET)",
+ "key": "drpyS_小猪_Appget",
+ "name": "小猪[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E9%87%91%E7%89%8C",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E9%87%91%E7%89%8C"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_TG搜[搜]",
- "name": "TG搜[搜](DS)",
- "api": "http://localhost:5757/api/TG搜[搜]?pwd=dzyyds",
+ "key": "drpyS_奇奇_Appget",
+ "name": "奇奇[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/TG%E6%90%9C[%E6%90%9C]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_TG盘搜[搜]",
- "name": "TG盘搜[搜](DS)",
- "api": "http://localhost:5757/api/TG盘搜[搜]?pwd=dzyyds",
+ "key": "drpyS_爱壹帆",
+ "name": "爱壹帆(DS)",
+ "api": "http://localhost:5757/api/爱壹帆?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/TG%E7%9B%98%E6%90%9C[%E6%90%9C]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_兄弟盘[搜]",
- "name": "兄弟盘[搜](DS)",
- "api": "http://localhost:5757/api/兄弟盘[搜]?pwd=dzyyds",
+ "key": "drpyS_优兔_Appget",
+ "name": "优兔[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%85%84%E5%BC%9F%E7%9B%98[%E6%90%9C]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_百度盘[搜]",
- "name": "百度盘[搜](DS)",
- "api": "http://localhost:5757/api/百度盘[搜]?pwd=dzyyds",
+ "key": "drpyS_紫金_Appget",
+ "name": "紫金[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%99%BE%E5%BA%A6%E7%9B%98[%E6%90%9C]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_元咲动漫_Appget",
- "name": "元咲动漫[M](GET)",
+ "key": "drpyS_五八_Appget",
+ "name": "五八[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%85%83%E5%92%B2%E5%8A%A8%E6%BC%AB",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%85%83%E5%92%B2%E5%8A%A8%E6%BC%AB"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2287,151 +2006,112 @@
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%B8%AB%E4%B8%AB%E5%8A%A8%E6%BC%AB",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%B8%AB%E4%B8%AB%E5%8A%A8%E6%BC%AB"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_方舟动漫_Appget",
- "name": "方舟动漫[M](GET)",
+ "key": "drpyS_爱盈_Appget",
+ "name": "爱盈[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E6%96%B9%E8%88%9F%E5%8A%A8%E6%BC%AB",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E6%96%B9%E8%88%9F%E5%8A%A8%E6%BC%AB"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_番薯动漫_Appget",
- "name": "番薯动漫[M](GET)",
+ "key": "drpyS_元咲动漫_Appget",
+ "name": "元咲动漫[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%95%AA%E8%96%AF%E5%8A%A8%E6%BC%AB",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%95%AA%E8%96%AF%E5%8A%A8%E6%BC%AB"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_咕咕动漫_Appget",
- "name": "咕咕动漫[M](GET)",
+ "key": "drpyS_火狐_Appget",
+ "name": "火狐[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%92%95%E5%92%95%E5%8A%A8%E6%BC%AB",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%92%95%E5%92%95%E5%8A%A8%E6%BC%AB"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_网盘资源[搜]",
- "name": "网盘资源[搜](DS)",
- "api": "http://localhost:5757/api/网盘资源[搜]?pwd=dzyyds",
+ "key": "drpyS_数字_Appget",
+ "name": "数字[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98%E8%B5%84%E6%BA%90[%E6%90%9C]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_iptv",
- "name": "iptv(DS)",
- "api": "http://localhost:5757/api/iptv?pwd=dzyyds",
+ "key": "drpyS_APP模板配置",
+ "name": "APP模板配置(DS)",
+ "api": "http://localhost:5757/api/APP模板配置?pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/iptv?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "push_agent",
- "name": "push_agent(DS)",
- "api": "http://localhost:5757/api/push_agent?pwd=dzyyds",
+ "key": "drpyS_方舟动漫_Appget",
+ "name": "方舟动漫[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
- "searchable": 0,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/push_agent?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_APP模板配置",
- "name": "APP模板配置(DS)",
- "api": "http://localhost:5757/api/APP模板配置?pwd=dzyyds",
+ "key": "drpyS_番薯动漫_Appget",
+ "name": "番薯动漫[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "unknown",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/APP%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE?pwd=dzyyds",
- "category": "http://localhost:5757/api/APP%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_php测试",
- "name": "php测试(DS)",
- "api": "http://localhost:5757/api/php?pwd=dzyyds",
+ "key": "drpyS_金牌_Appget",
+ "name": "金牌[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "success",
- "message": "手动标记为正常",
- "testUrls": {
- "home": "http://localhost:5757/api/php?pwd=dzyyds&extend=H4sIAAAAAAAAA6tWysgvLlGyUsooKSkottLXLy8v10tKzEwp1UvOz1WqBQCTzRcDIAAAAA%3D%3D",
- "category": "http://localhost:5757/api/php?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA6tWysgvLlGyUsooKSkottLXLy8v10tKzEwp1UvOz1WqBQCTzRcDIAAAAA%3D%3D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": true
- },
- {
- "key": "drpyS_TVB云播",
- "name": "TVB云播(DS)",
- "api": "http://localhost:5757/api/TVB云播?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/TVB%E4%BA%91%E6%92%AD?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2443,102 +2123,73 @@
"lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%85%94%E5%B0%8F%E8%B4%9D[%E5%84%BF]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%85%94%E5%B0%8F%E8%B4%9D[%E5%84%BF]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_动作测试新定标准版",
- "name": "动作测试新定标准版(DS)",
- "api": "http://localhost:5757/api/动作测试新定标准版?pwd=dzyyds",
- "type": 4,
- "searchable": 0,
- "lang": "ds",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8A%A8%E4%BD%9C%E6%B5%8B%E8%AF%95%E6%96%B0%E5%AE%9A%E6%A0%87%E5%87%86%E7%89%88?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_动作交互",
- "name": "动作交互(DS)",
- "api": "http://localhost:5757/api/动作交互?pwd=dzyyds",
+ "key": "drpyS_开眼",
+ "name": "开眼(DS)",
+ "api": "http://localhost:5757/api/开眼?pwd=dzyyds",
"type": 4,
"searchable": 0,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8A%A8%E4%BD%9C%E4%BA%A4%E4%BA%92?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_点歌欢唱[B]",
- "name": "点歌欢唱[B](DS)",
- "api": "http://localhost:5757/api/点歌欢唱[B]?pwd=dzyyds",
+ "key": "drpyS_咕咕动漫_Appget",
+ "name": "咕咕动漫[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%82%B9%E6%AD%8C%E6%AC%A2%E5%94%B1[B]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTf9rb%2BLR17ZMd7c%2FW9jybvUmvpKIEABrNdgcbAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_梨园行[戏]",
- "name": "梨园行[戏](DS)",
- "api": "http://localhost:5757/api/梨园行[戏]?pwd=dzyyds",
+ "key": "drpyS_凡客TV",
+ "name": "凡客TV(DS)",
+ "api": "http://localhost:5757/api/凡客TV?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%A2%A8%E5%9B%AD%E8%A1%8C[%E6%88%8F]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_开眼",
- "name": "开眼(DS)",
- "api": "http://localhost:5757/api/开眼?pwd=dzyyds",
+ "key": "drpyS_php测试",
+ "name": "php测试(DS)",
+ "api": "http://localhost:5757/api/php?pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 1,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%BC%80%E7%9C%BC?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%BC%80%E7%9C%BC?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
+ "message": "手动标记为正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": true
},
{
- "key": "drpyS_爱壹帆",
- "name": "爱壹帆(DS)",
- "api": "http://localhost:5757/api/爱壹帆?pwd=dzyyds",
+ "key": "drpyS_王子_Appget",
+ "name": "王子[M](GET)",
+ "api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "unknown",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E5%A3%B9%E5%B8%86?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "2/4 接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2549,27 +2200,9 @@
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%9E%AB%E6%9E%97%E5%BD%B1%E8%A7%86?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_凡客TV",
- "name": "凡客TV(DS)",
- "api": "http://localhost:5757/api/凡客TV?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%87%A1%E5%AE%A2TV?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%87%A1%E5%AE%A2TV?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "3/4 接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2580,12 +2213,9 @@
"searchable": 2,
"lang": "ds",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E7%9C%8B%E6%9C%BA%E5%99%A8%E4%BA%BA[%E8%99%AB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%88%B1%E7%9C%8B%E6%9C%BA%E5%99%A8%E4%BA%BA[%E8%99%AB]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常 (容错:分类2)",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2597,10 +2227,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9B%B4%E6%92%AD%E8%BD%AC%E7%82%B9%E6%92%AD[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTz8ksSzVKzi3WzS3TAwkAAGomgm4YAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2612,10 +2240,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%B4%9D%E4%B9%90%E8%99%8E[%E5%84%BF]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2627,41 +2253,21 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8E%96%E6%9C%88%E5%BD%B1%E8%A7%86?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_采王道长[合]",
- "name": "采王道长[合](DS)",
+ "key": "drpyS_采王zy[密]",
+ "name": "采王zy[密](DS)",
"api": "http://localhost:5757/api/采集之王[合]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%87%87%E9%9B%86%E4%B9%8B%E7%8E%8B[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTf9ne%2FnJ228u5M581NOqBRFQMAcGPDNobAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_美颜怪[擦]",
- "name": "美颜怪[擦](DS)",
- "api": "http://localhost:5757/api/美颜怪[擦]?pwd=dzyyds",
- "type": 4,
- "searchable": 0,
- "lang": "ds",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BE%8E%E9%A2%9C%E6%80%AA[%E6%93%A6]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%BE%8E%E9%A2%9C%E6%80%AA[%E6%93%A6]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2673,133 +2279,73 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8E%8B%E5%AD%90TV?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_采王zy[密]",
- "name": "采王zy[密](DS)",
- "api": "http://localhost:5757/api/采集之王[合]?pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "ds",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%87%87%E9%9B%86%E4%B9%8B%E7%8E%8B[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTf9ne%2FnJ2W3RVZezLuTOfNTTqgURVDAGu%2FMCKHwAAAA%3D%3D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_短剧视频库",
- "name": "短剧视频库(DS)",
- "api": "http://localhost:5757/api/短剧视频库?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9F%AD%E5%89%A7%E8%A7%86%E9%A2%91%E5%BA%93?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_爱看高清",
- "name": "爱看高清(DS)",
- "api": "http://localhost:5757/api/爱看高清?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "success",
- "message": "3/4 接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E7%9C%8B%E9%AB%98%E6%B8%85?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%88%B1%E7%9C%8B%E9%AB%98%E6%B8%85?pwd=dzyyds&ac=list&t=1&pg=1",
- "search": "http://localhost:5757/api/%E7%88%B1%E7%9C%8B%E9%AB%98%E6%B8%85?pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95",
- "detail": "http://localhost:5757/api/%E7%88%B1%E7%9C%8B%E9%AB%98%E6%B8%85?pwd=dzyyds&ac=detail&ids=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_采王成人[密]",
- "name": "采王成人[密](DS)",
+ "key": "drpyS_采王道长[合]",
+ "name": "采王道长[合](DS)",
"api": "http://localhost:5757/api/采集之王[合]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%87%87%E9%9B%86%E4%B9%8B%E7%8E%8B[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTf9ne%2FnJ2W%2FTT9W2xL%2BfOfNbQqAcSVjFUAQAd5YgpIQAAAA%3D%3D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_麦田影院",
- "name": "麦田影院(DS)",
- "api": "http://localhost:5757/api/麦田影院?pwd=dzyyds",
+ "key": "drpyS_采王2024",
+ "name": "采王2024(DS)",
+ "api": "http://localhost:5757/api/采集之王[合]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%BA%A6%E7%94%B0%E5%BD%B1%E9%99%A2?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_飞牛影视",
- "name": "飞牛影视(DS)",
- "api": "http://localhost:5757/api/飞牛影视?pwd=dzyyds",
+ "key": "drpyS_采王成人[密]",
+ "name": "采王成人[密](DS)",
+ "api": "http://localhost:5757/api/采集之王[合]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%A3%9E%E7%89%9B%E5%BD%B1%E8%A7%86?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_鬼片之家",
- "name": "鬼片之家(DS)",
- "api": "http://localhost:5757/api/鬼片之家?pwd=dzyyds",
+ "key": "drpyS_飞牛影视",
+ "name": "飞牛影视(DS)",
+ "api": "http://localhost:5757/api/飞牛影视?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%AC%BC%E7%89%87%E4%B9%8B%E5%AE%B6?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_采王2024",
- "name": "采王2024(DS)",
- "api": "http://localhost:5757/api/采集之王[合]?pwd=dzyyds",
+ "key": "drpyS_麦田影院",
+ "name": "麦田影院(DS)",
+ "api": "http://localhost:5757/api/麦田影院?pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 2,
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%87%87%E9%9B%86%E4%B9%8B%E7%8E%8B[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTf9ne%2FnJ2m5GBkcnLuTOfNTTqgURVDFUAlKCu7yAAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2811,10 +2357,8 @@
"lang": "ds",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%87%87%E9%9B%86%E4%B9%8B%E7%8E%8B[%E5%90%88]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTf9ne%2FnJ2m5GBkenLuTOfNTTqgURVDFUAfHtVViAAAAA%3D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2826,10 +2370,34 @@
"lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/mtv60w[%E5%B7%AE]?do=cat&pwd=dzyyds&extend=music.db"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_爱看高清",
+ "name": "爱看高清(DS)",
+ "api": "http://localhost:5757/api/爱看高清?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_鬼片之家",
+ "name": "鬼片之家(DS)",
+ "api": "http://localhost:5757/api/鬼片之家?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2841,10 +2409,8 @@
"lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%B2%B3%E5%8D%97%E7%94%B5%E8%A7%86%E4%BB%A3%E7%90%86?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2856,73 +2422,60 @@
"lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8C%AB%E6%B5%8B%E8%AF%95?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_yikm[游戏]",
- "name": "yikm[游戏](cat)",
- "api": "http://localhost:5757/api/yikm[游戏]?do=cat&pwd=dzyyds",
+ "key": "catvod_月光影视",
+ "name": "月光影视(cat)",
+ "api": "http://localhost:5757/api/月光影视?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "cat",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/yikm[%E6%B8%B8%E6%88%8F]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/yikm[%E6%B8%B8%E6%88%8F]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_喜刷刷",
- "name": "喜刷刷(cat)",
- "api": "http://localhost:5757/api/喜刷刷?do=cat&pwd=dzyyds",
+ "key": "hipy_py_4K影视",
+ "name": "4K影视(hipy)",
+ "api": "http://localhost:5757/api/4K影视?do=py&pwd=dzyyds",
"type": 4,
- "searchable": 0,
- "lang": "cat",
+ "searchable": 1,
+ "lang": "hipy",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%96%9C%E5%88%B7%E5%88%B7?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%96%9C%E5%88%B7%E5%88%B7?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_爱玩音乐",
- "name": "爱玩音乐(cat)",
- "api": "http://localhost:5757/api/爱玩音乐?do=cat&pwd=dzyyds",
+ "key": "hipy_py_呀哩4K[AF]",
+ "name": "呀哩4K[AF](hipy)",
+ "api": "http://localhost:5757/api/AppFei?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "hipy",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E7%8E%A9%E9%9F%B3%E4%B9%90?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%88%B1%E7%8E%A9%E9%9F%B3%E4%B9%90?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_月光影视",
- "name": "月光影视(cat)",
- "api": "http://localhost:5757/api/月光影视?do=cat&pwd=dzyyds",
+ "key": "hipy_py_森林动漫[AF]",
+ "name": "森林动漫[AF](hipy)",
+ "api": "http://localhost:5757/api/AppFei?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%9C%88%E5%85%89%E5%BD%B1%E8%A7%86?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -2934,267 +2487,229 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/4KVM?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_荐片",
- "name": "荐片(cat)",
- "api": "http://localhost:5757/api/荐片?do=cat&pwd=dzyyds",
+ "key": "hipy_py_火猫影视[AFX]",
+ "name": "火猫影视[AFX](hipy)",
+ "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%8D%90%E7%89%87?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_海龟",
- "name": "海龟(cat)",
- "api": "http://localhost:5757/api/海龟?do=cat&pwd=dzyyds",
+ "key": "hipy_py_茉莉[AG¹]",
+ "name": "茉莉[AG¹](hipy)",
+ "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%B5%B7%E9%BE%9F?do=cat&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_4K影视",
- "name": "4K影视(hipy)",
- "api": "http://localhost:5757/api/4K影视?do=py&pwd=dzyyds",
+ "key": "hipy_py_魔方[AG¹]",
+ "name": "魔方[AG¹](hipy)",
+ "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/4K%E5%BD%B1%E8%A7%86?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_森林动漫[AF]",
- "name": "森林动漫[AF](hipy)",
- "api": "http://localhost:5757/api/AppFei?do=py&pwd=dzyyds",
+ "key": "hipy_py_五八[AG¹]",
+ "name": "五八[AG¹](hipy)",
+ "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFei?do=py&pwd=dzyyds&extend=https%3A%2F%2Fysa.yy-fun.cc%2Ffeiapp"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_呀哩4K[AF]",
- "name": "呀哩4K[AF](hipy)",
- "api": "http://localhost:5757/api/AppFei?do=py&pwd=dzyyds",
+ "key": "hipy_py_丫丫动漫[AG¹]",
+ "name": "丫丫动漫[AG¹](hipy)",
+ "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFei?do=py&pwd=dzyyds&extend=https%3A%2F%2Fysc.yy-fun.cc%2Ffeiapp"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_麒麟[AFX]",
- "name": "麒麟[AFX](hipy)",
- "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
+ "key": "catvod_荐片",
+ "name": "荐片(cat)",
+ "api": "http://localhost:5757/api/荐片?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "hipy",
+ "lang": "cat",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&extend=https%3A%2F%2Fqh.70qh.top",
- "category": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=https%3A%2F%2Fqh.70qh.top"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_TVB云播[AFX]",
- "name": "TVB云播[AFX](hipy)",
- "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
+ "key": "hipy_py_OMOfun[AG¹]",
+ "name": "OMOfun[AG¹](hipy)",
+ "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&extend=http%3A%2F%2Fapp.hktvyb.cc"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_粉象[AFX]",
- "name": "粉象[AFX](hipy)",
- "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
+ "key": "drpyS_美颜怪[擦]",
+ "name": "美颜怪[擦](DS)",
+ "api": "http://localhost:5757/api/美颜怪[擦]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "hipy",
+ "searchable": 0,
+ "lang": "ds",
"status": "success",
"message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&extend=http%3A%2F%2Fhost1.sopython.top%2Fhost.json",
- "category": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=http%3A%2F%2Fhost1.sopython.top%2Fhost.json"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_火猫影视[AFX]",
- "name": "火猫影视[AFX](hipy)",
- "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
+ "key": "hipy_py_雪豹视频[Hs]",
+ "name": "雪豹视频[Hs](hipy)",
+ "api": "http://localhost:5757/api/AppHs?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fcunchu8.obs.cn-north-4.myhuaweicloud.com%2Fconfig.json%22%2C%22parse%22%3A%7B%22JL4K%22%3A%22http%3A%2F%2F194.147.100.155%3A7891%2F%3Furl%3D%22%7D%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_拾光视频[Hs]",
- "name": "拾光视频[Hs](hipy)",
- "api": "http://localhost:5757/api/AppHs?do=py&pwd=dzyyds",
+ "key": "hipy_py_即看影视[AS]",
+ "name": "即看影视[AS](hipy)",
+ "api": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppHs?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fdy.jmzp.net.cn%22%2C%22app_id%22%3A%22shiguang%22%2C%22deviceid%22%3A%22%22%2C%22versionCode%22%3A%2210000%22%2C%22UMENG_CHANNEL%22%3A%22guan%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_五八[AG¹]",
- "name": "五八[AG¹](hipy)",
- "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ "key": "catvod_喜刷刷",
+ "name": "喜刷刷(cat)",
+ "api": "http://localhost:5757/api/喜刷刷?do=cat&pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "hipy",
+ "searchable": 0,
+ "lang": "cat",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fdy.58ys.vip%22%2C%22key%22%3A%22JEWibY1AgWF0V1xx%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_丫丫动漫[AG¹]",
- "name": "丫丫动漫[AG¹](hipy)",
- "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ "key": "catvod_yikm[游戏]",
+ "name": "yikm[游戏](cat)",
+ "api": "http://localhost:5757/api/yikm[游戏]?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "hipy",
+ "lang": "cat",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22http%3A%2F%2Ftv.yy-fun.cc%22%2C%22key%22%3A%22qkxnwkfjwpcnwycl%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_OMOfun[AG¹]",
- "name": "OMOfun[AG¹](hipy)",
- "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ "key": "catvod_爱玩音乐",
+ "name": "爱玩音乐(cat)",
+ "api": "http://localhost:5757/api/爱玩音乐?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "hipy",
+ "lang": "cat",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fapp.omofun1.top%22%2C%22key%22%3A%2266dc309cbeeca454%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
- {
- "key": "hipy_py_茉莉[AG¹]",
- "name": "茉莉[AG¹](hipy)",
- "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ {
+ "key": "hipy_py_麒麟[AFX]",
+ "name": "麒麟[AFX](hipy)",
+ "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fgitee.com%2Fwmmoliill%2Fwimg%2Fraw%2Fmaster%2Fimg%2Fbk%2F9.txt%22%2C%22key%22%3A%2288689667dce61725%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_雪豹视频[Hs]",
- "name": "雪豹视频[Hs](hipy)",
- "api": "http://localhost:5757/api/AppHs?do=py&pwd=dzyyds",
+ "key": "hipy_py_粉象[AFX]",
+ "name": "粉象[AFX](hipy)",
+ "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppHs?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fdy.jszdzs.com%22%2C%22app_id%22%3A%22xuebao%22%2C%22deviceid%22%3A%22%22%2C%22versionCode%22%3A%2221300%22%2C%22UMENG_CHANNEL%22%3A%22share%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_魔方[AG¹]",
- "name": "魔方[AG¹](hipy)",
- "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ "key": "catvod_海龟",
+ "name": "海龟(cat)",
+ "api": "http://localhost:5757/api/海龟?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "hipy",
+ "lang": "cat",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fsnysw.xyz%2Fmf4kzs327.txt%22%2C%22key%22%3A%221234567887654321%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_即看影视[AS]",
- "name": "即看影视[AS](hipy)",
- "api": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds",
+ "key": "hipy_py_拾光视频[Hs]",
+ "name": "拾光视频[Hs](hipy)",
+ "api": "http://localhost:5757/api/AppHs?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fskyappdata-1321528676.cos.accelerate.myqcloud.com%2F4kapp%2Fappipr.txt%22%2C%22key%22%3A%22ygcnbckhcuvygdyb%22%2C%22iv%22%3A%224023892775143708%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3206,40 +2721,34 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppToV5?do=py&pwd=dzyyds&extend=http%3A%2F%2F118.89.203.120%3A8762"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_紫云[AV¹]",
- "name": "紫云[AV¹](hipy)",
- "api": "http://localhost:5757/api/AppV1?do=py&pwd=dzyyds",
+ "key": "hipy_py_闪影[AV²]",
+ "name": "闪影[AV²](hipy)",
+ "api": "http://localhost:5757/api/AppV2²?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppV1?do=py&pwd=dzyyds&extend=http%3A%2F%2Fziyuncms.feifan12.xyz%2Fapi.php"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_皮皮虾[ATV⁵]",
- "name": "皮皮虾[ATV⁵](hipy)",
- "api": "http://localhost:5757/api/AppToV5?do=py&pwd=dzyyds",
+ "key": "hipy_py_紫云[AV¹]",
+ "name": "紫云[AV¹](hipy)",
+ "api": "http://localhost:5757/api/AppV1?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppToV5?do=py&pwd=dzyyds&extend=http%3A%2F%2F38.55.237.41%3A8762"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3251,10 +2760,8 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fkankelm.cn%3A2024%2Fappdomain.txt%22%2C%22key%22%3A%22ygcnbcvybqqckwqy%22%2C%22iv%22%3A%221583560747143708%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3266,115 +2773,99 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fdmsk.oss-rg-china-mainland.aliyuncs.com%2Fdmapp%2Fdmapi.txt%22%2C%22key%22%3A%22ygcnbcobcegtgigg%22%2C%22iv%22%3A%224058263969143708%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_闪影[AV²]",
- "name": "闪影[AV²](hipy)",
+ "key": "hipy_py_剧下饭[AV²]",
+ "name": "剧下饭[AV²](hipy)",
"api": "http://localhost:5757/api/AppV2²?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppV2%C2%B2?do=py&pwd=dzyyds&extend=http%3A%2F%2F38.47.213.61%3A41271"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_剧下饭[AV²]",
- "name": "剧下饭[AV²](hipy)",
- "api": "http://localhost:5757/api/AppV2²?do=py&pwd=dzyyds",
+ "key": "hipy_py_剧永久[AV⁶]",
+ "name": "剧永久[AV⁶](hipy)",
+ "api": "http://localhost:5757/api/AppV6?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppV2%C2%B2?do=py&pwd=dzyyds&extend=http%3A%2F%2Fjxfmax.juxiafan.com"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_剧永久[AV⁶]",
- "name": "剧永久[AV⁶](hipy)",
+ "key": "hipy_py_剧下饭[AV⁶]",
+ "name": "剧下饭[AV⁶](hipy)",
"api": "http://localhost:5757/api/AppV6?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppV6?do=py&pwd=dzyyds&extend=%7B%22api%22%3A%22http%3A%2F%2Fyjyi.juyongjiu.com%2Ficciu_api.php%2Fv1.vod%22%2C%22datasignkey%22%3A%226QQNUsP3PkD2ajJCPCY8%22%2C%22apisignkey%22%3A%22lvdoutv-1.0.0%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_Free影视[AS]",
- "name": "Free影视[AS](hipy)",
- "api": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds",
+ "key": "hipy_py_皮皮虾[ATV⁵]",
+ "name": "皮皮虾[ATV⁵](hipy)",
+ "api": "http://localhost:5757/api/AppToV5?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fsk.xiaoyaoys.top%2Fskkkkkkk.txt%22%2C%22key%22%3A%22ygcnbcczduwydmrs%22%2C%22iv%22%3A%224672921073143708%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_剧下饭[AV⁶]",
- "name": "剧下饭[AV⁶](hipy)",
- "api": "http://localhost:5757/api/AppV6?do=py&pwd=dzyyds",
+ "key": "hipy_py_依赖测试",
+ "name": "依赖测试(hipy)",
+ "api": "http://localhost:5757/api/依赖测试?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppV6?do=py&pwd=dzyyds&extend=http%3A%2F%2Fjxfmax.juxiafan.com%2Ficciu_api.php%2Fv1.vod"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_掌上追剧[AG³]",
- "name": "掌上追剧[AG³](hipy)",
- "api": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds",
+ "key": "hipy_py_动作代理测试",
+ "name": "动作代理测试(hipy)",
+ "api": "http://localhost:5757/api/动作代理测试?do=py&pwd=dzyyds",
"type": 4,
- "searchable": 1,
+ "searchable": 0,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22http%3A%2F%2Ftvb.yy-fun.cc%22%2C%22key%22%3A%22jcTz6Jda2aKrH8Tk%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_依赖测试",
- "name": "依赖测试(hipy)",
- "api": "http://localhost:5757/api/依赖测试?do=py&pwd=dzyyds",
+ "key": "hipy_py_掌上追剧[AG³]",
+ "name": "掌上追剧[AG³](hipy)",
+ "api": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%BE%9D%E8%B5%96%E6%B5%8B%E8%AF%95?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3386,10 +2877,8 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppYqk?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fgapi0320.3njzmrx1.com%2Fconfig.json%2Chttps%3A%2F%2Fgapi0320.lq0okex8.com%2Fconfig.json%2Chttps%3A%2F%2Fgapi0320.zabqs8xp.com%2Fconfig.json%2Chttps%3A%2F%2Fyappconfig-20250628-1318635097.cos.ap-shanghai.myqcloud.com%2Fconfig.json%2Chttps%3A%2F%2Fyconfig-20250628-1360051343.cos.ap-guangzhou.myqcloud.com%2Fconfig.json%22%2C%22appId%22%3A%22d6d520ea90904f1ba680ed6c9c9f9007%22%2C%22appkey%22%3A%2270af67d2b6cf47679b397ea4c1886877%22%2C%22udid%22%3A%22bfc18c00-c866-46cb-8d7b-121c39b942d4%22%2C%22bundlerId%22%3A%22com.flotimingo.ts%22%2C%22source%22%3A%221001_default%22%2C%22version%22%3A%221.3.10%22%2C%22versionCode%22%3A1104%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3401,40 +2890,34 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppYqk?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fgapi0725.5p8jcjc.com%2Fconfig.json%2Chttps%3A%2F%2Fgapi0725.olrv5gz.com%2Fconfig.json%2Chttps%3A%2F%2Fgapi0725.mvljeat.com%2Fconfig.json%2Chttps%3A%2F%2Fjzapp-1318635097.cos.ap-shanghai.myqcloud.com%2Fconfig.json%2Chttps%3A%2F%2Fjuzi-config-1360051343.cos.ap-shanghai.myqcloud.com%2Fconfig.json%22%2C%22appId%22%3A%22fea23e11fc1241409682880e15fb2851%22%2C%22appkey%22%3A%22f384b87cc9ef41e4842dda977bae2c7f%22%2C%22udid%22%3A%22bfc18c00-c866-46cb-8d7b-121c39b942d4%22%2C%22bundlerId%22%3A%22com.voraguzzee.ts%22%2C%22source%22%3A%221003_default%22%2C%22version%22%3A%221.0.1%22%2C%22versionCode%22%3A1000%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_动作代理测试",
- "name": "动作代理测试(hipy)",
- "api": "http://localhost:5757/api/动作代理测试?do=py&pwd=dzyyds",
+ "key": "hipy_py_懒懒视频",
+ "name": "懒懒视频(hipy)",
+ "api": "http://localhost:5757/api/懒懒视频?do=py&pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8A%A8%E4%BD%9C%E4%BB%A3%E7%90%86%E6%B5%8B%E8%AF%95?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_懒懒视频",
- "name": "懒懒视频(hipy)",
- "api": "http://localhost:5757/api/懒懒视频?do=py&pwd=dzyyds",
+ "key": "hipy_py_Free影视[AS]",
+ "name": "Free影视[AS](hipy)",
+ "api": "http://localhost:5757/api/AppSk?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%87%92%E6%87%92%E8%A7%86%E9%A2%91?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3445,26 +2928,22 @@
"searchable": 1,
"lang": "hipy",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "3/4 接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_新韩剧网",
- "name": "新韩剧网(hipy)",
- "api": "http://localhost:5757/api/新韩剧网?do=py&pwd=dzyyds",
+ "key": "hipy_py_热播APP",
+ "name": "热播APP(hipy)",
+ "api": "http://localhost:5757/api/热播APP?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%96%B0%E9%9F%A9%E5%89%A7%E7%BD%91?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3476,87 +2955,47 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%93%87%E5%93%87APP?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_欣欣影视",
- "name": "欣欣影视(hipy)",
- "api": "http://localhost:5757/api/欣欣影视?do=py&pwd=dzyyds",
+ "key": "hipy_py_新韩剧网",
+ "name": "新韩剧网(hipy)",
+ "api": "http://localhost:5757/api/新韩剧网?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%AC%A3%E6%AC%A3%E5%BD%B1%E8%A7%86?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "hipy_py_河马短剧",
- "name": "河马短剧(hipy)",
- "api": "http://localhost:5757/api/河马短剧?do=py&pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "hipy",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%B2%B3%E9%A9%AC%E7%9F%AD%E5%89%A7?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%B2%B3%E9%A9%AC%E7%9F%AD%E5%89%A7?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "hipy_py_兄弟影视",
- "name": "兄弟影视(hipy)",
- "api": "http://localhost:5757/api/兄弟影视?do=py&pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "hipy",
- "status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%85%84%E5%BC%9F%E5%BD%B1%E8%A7%86?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%85%84%E5%BC%9F%E5%BD%B1%E8%A7%86?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_热播APP",
- "name": "热播APP(hipy)",
- "api": "http://localhost:5757/api/热播APP?do=py&pwd=dzyyds",
+ "key": "hipy_py_欣欣影视",
+ "name": "欣欣影视(hipy)",
+ "api": "http://localhost:5757/api/欣欣影视?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%83%AD%E6%92%ADAPP?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_新浪资源",
- "name": "新浪资源(hipy)",
- "api": "http://localhost:5757/api/新浪资源?do=py&pwd=dzyyds",
+ "key": "hipy_py_看客TV",
+ "name": "看客TV(hipy)",
+ "api": "http://localhost:5757/api/看客TV?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%96%B0%E6%B5%AA%E8%B5%84%E6%BA%90?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3568,25 +3007,8 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8B%AC%E6%92%AD%E5%BA%93?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
- "manuallyMarked": false
- },
- {
- "key": "hipy_py_看客TV",
- "name": "看客TV(hipy)",
- "api": "http://localhost:5757/api/看客TV?do=py&pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "hipy",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%9C%8B%E5%AE%A2TV?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3598,147 +3020,86 @@
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%AB%AF%E6%9C%A8?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
- {
- "key": "hipy_py_资源管理",
- "name": "资源管理(hipy)",
- "api": "http://localhost:5757/api/资源管理?do=py&pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "hipy",
- "status": "success",
- "message": "手动标记为正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
- "manuallyMarked": true
- },
{
"key": "hipy_py_麻雀视频",
- "name": "麻雀视频(hipy)",
- "api": "http://localhost:5757/api/麻雀视频?do=py&pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "hipy",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%BA%BB%E9%9B%80%E8%A7%86%E9%A2%91?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
- "manuallyMarked": false
- },
- {
- "key": "hipy_py_麦田影院",
- "name": "麦田影院(hipy)",
- "api": "http://localhost:5757/api/麦田影院?do=py&pwd=dzyyds",
- "type": 4,
- "searchable": 1,
- "lang": "hipy",
- "status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%BA%A6%E7%94%B0%E5%BD%B1%E9%99%A2?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
- "manuallyMarked": false
- },
- {
- "key": "hipy_py_猎手APP",
- "name": "猎手APP(hipy)",
- "api": "http://localhost:5757/api/猎手APP?do=py&pwd=dzyyds",
+ "name": "麻雀视频(hipy)",
+ "api": "http://localhost:5757/api/麻雀视频?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8C%8E%E6%89%8BAPP?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_瓜子",
- "name": "瓜子(hipy)",
- "api": "http://localhost:5757/api/瓜子?do=py&pwd=dzyyds",
+ "key": "php_坚果视频 ᵈᶻ",
+ "name": "坚果视频 ᵈᶻ(PHP)",
+ "api": "http://localhost:5757/api/坚果视频 ᵈᶻ?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "hipy",
+ "lang": "php",
"status": "success",
- "message": "分类接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%93%9C%E5%AD%90?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%93%9C%E5%AD%90?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_爱瓜APP",
- "name": "爱瓜APP(hipy)",
- "api": "http://localhost:5757/api/爱瓜APP?do=py&pwd=dzyyds",
+ "key": "hipy_py_麦田影院",
+ "name": "麦田影院(hipy)",
+ "api": "http://localhost:5757/api/麦田影院?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%88%B1%E7%93%9CAPP?do=py&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_人人影视 ᵈᶻ",
- "name": "人人影视 ᵈᶻ(PHP)",
- "api": "http://localhost:5757/api/人人影视 ᵈᶻ?do=php&pwd=dzyyds",
+ "key": "php_金牌 ᵈᶻ",
+ "name": "金牌 ᵈᶻ(PHP)",
+ "api": "http://localhost:5757/api/金牌 ᵈᶻ?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "php",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%BA%BA%E4%BA%BA%E5%BD%B1%E8%A7%86%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_坚果视频 ᵈᶻ",
- "name": "坚果视频 ᵈᶻ(PHP)",
- "api": "http://localhost:5757/api/坚果视频 ᵈᶻ?do=php&pwd=dzyyds",
+ "key": "php_人人影视 ᵈᶻ",
+ "name": "人人影视 ᵈᶻ(PHP)",
+ "api": "http://localhost:5757/api/人人影视 ᵈᶻ?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "php",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%9D%9A%E6%9E%9C%E8%A7%86%E9%A2%91%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_山有木兮 ᵈᶻ",
- "name": "山有木兮 ᵈᶻ(PHP)",
- "api": "http://localhost:5757/api/山有木兮 ᵈᶻ?do=php&pwd=dzyyds",
+ "key": "hipy_py_猎手APP",
+ "name": "猎手APP(hipy)",
+ "api": "http://localhost:5757/api/猎手APP?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "hipy",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%B1%B1%E6%9C%89%E6%9C%A8%E5%85%AE%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -3750,357 +3111,305 @@
"lang": "php",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%BA%BB%E9%9B%80%E8%A7%86%E9%A2%91%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_B站 ᵈᶻ",
- "name": "B站 ᵈᶻ(PHP)",
- "api": "http://localhost:5757/api/B站 ᵈᶻ?do=php&pwd=dzyyds",
+ "key": "php_山有木兮 ᵈᶻ",
+ "name": "山有木兮 ᵈᶻ(PHP)",
+ "api": "http://localhost:5757/api/山有木兮 ᵈᶻ?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "php",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/B%E7%AB%99%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_荐片影视 ᵈᶻ",
- "name": "荐片影视 ᵈᶻ(PHP)",
- "api": "http://localhost:5757/api/荐片影视 ᵈᶻ?do=php&pwd=dzyyds",
+ "key": "php_B站 ᵈᶻ",
+ "name": "B站 ᵈᶻ(PHP)",
+ "api": "http://localhost:5757/api/B站 ᵈᶻ?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "php",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%8D%90%E7%89%87%E5%BD%B1%E8%A7%86%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_金牌 ᵈᶻ",
- "name": "金牌 ᵈᶻ(PHP)",
- "api": "http://localhost:5757/api/金牌 ᵈᶻ?do=php&pwd=dzyyds",
+ "key": "php_哇哇影视 ᵈᶻ",
+ "name": "哇哇影视 ᵈᶻ(PHP)",
+ "api": "http://localhost:5757/api/哇哇影视 ᵈᶻ?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "php",
"status": "success",
"message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%87%91%E7%89%8C%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_哇哇影视 ᵈᶻ",
- "name": "哇哇影视 ᵈᶻ(PHP)",
- "api": "http://localhost:5757/api/哇哇影视 ᵈᶻ?do=php&pwd=dzyyds",
+ "key": "hipy_py_河马短剧",
+ "name": "河马短剧(hipy)",
+ "api": "http://localhost:5757/api/河马短剧?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "hipy",
"status": "success",
- "message": "推荐接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%93%87%E5%93%87%E5%BD%B1%E8%A7%86%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_3Q影视[优]",
- "name": "3Q影视[优](DS)",
- "api": "http://localhost:5757/api/3Q影视[优]?pwd=dzyyds",
+ "key": "hipy_py_兄弟影视",
+ "name": "兄弟影视(hipy)",
+ "api": "http://localhost:5757/api/兄弟影视?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "error",
- "message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/3Q%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.210Z",
+ "lang": "hipy",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_二小[盘]",
- "name": "二小[盘](DS)",
- "api": "http://localhost:5757/api/二小[盘]?pwd=dzyyds",
+ "key": "hipy_py_爱瓜APP",
+ "name": "爱瓜APP(hipy)",
+ "api": "http://localhost:5757/api/爱瓜APP?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "error",
- "message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E4%BA%8C%E5%B0%8F[%E7%9B%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E4%BA%8C%E5%B0%8F[%E7%9B%98]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "lang": "hipy",
+ "status": "success",
+ "message": "推荐接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_玩偶哥哥DM[盘]",
- "name": "玩偶哥哥DM[盘](DS)",
- "api": "http://localhost:5757/api/玩偶哥哥DM[盘]?pwd=dzyyds",
+ "key": "hipy_py_瓜子",
+ "name": "瓜子(hipy)",
+ "api": "http://localhost:5757/api/瓜子?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "error",
- "message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8E%A9%E5%81%B6%E5%93%A5%E5%93%A5DM[%E7%9B%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%8E%A9%E5%81%B6%E5%93%A5%E5%93%A5DM[%E7%9B%98]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "lang": "hipy",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_玩偶哥哥[盘]",
- "name": "玩偶哥哥[盘](DS)",
- "api": "http://localhost:5757/api/玩偶哥哥[盘]?pwd=dzyyds",
+ "key": "hipy_py_资源管理",
+ "name": "资源管理(hipy)",
+ "api": "http://localhost:5757/api/资源管理?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "error",
- "message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%8E%A9%E5%81%B6%E5%93%A5%E5%93%A5[%E7%9B%98]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%8E%A9%E5%81%B6%E5%93%A5%E5%93%A5[%E7%9B%98]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "lang": "hipy",
+ "status": "success",
+ "message": "分类接口正常 (容错:分类2)",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_二小ᵐ[盘]",
- "name": "二小ᵐ[盘](DS)",
- "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
+ "key": "php_荐片影视 ᵈᶻ",
+ "name": "荐片影视 ᵈᶻ(PHP)",
+ "api": "http://localhost:5757/api/荐片影视 ᵈᶻ?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
- "status": "error",
- "message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5sqvn6YZ%2BAGwhNKsgAAAA",
- "category": "http://localhost:5757/api/%E7%BD%91%E7%9B%98[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=H4sIAAAAAAAAA9PT088qzs%2FTfzp%2F%2FtMJvS9be5%2FvXacHElF5sqvn6YZ%2BAGwhNKsgAAAA"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "lang": "php",
+ "status": "success",
+ "message": "分类接口正常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_NT动漫[漫]",
- "name": "NT动漫[漫](DS)",
- "api": "http://localhost:5757/api/NT动漫[漫]?pwd=dzyyds",
+ "key": "drpyS_啊哈DJ[听]",
+ "name": "啊哈DJ[听](DS)",
+ "api": "http://localhost:5757/api/啊哈DJ[听]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
- "status": "error",
- "message": "推荐和分类接口均异常",
+ "status": "success",
+ "message": "2/4 接口正常",
"testUrls": {
- "home": "http://localhost:5757/api/NT%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/NT%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds&ac=list&t=1&pg=1"
+ "home": "http://localhost:5757/api/%E5%95%8A%E5%93%88DJ[%E5%90%AC]?pwd=dzyyds",
+ "category": "http://localhost:5757/api/%E5%95%8A%E5%93%88DJ[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1",
+ "search": "http://localhost:5757/api/%E5%95%8A%E5%93%88DJ[%E5%90%AC]?pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95",
+ "detail": "http://localhost:5757/api/%E5%95%8A%E5%93%88DJ[%E5%90%AC]?pwd=dzyyds&ac=detail&ids=1"
},
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_嗷呜动漫[漫]",
- "name": "嗷呜动漫[漫](DS)",
- "api": "http://localhost:5757/api/嗷呜动漫[漫]?pwd=dzyyds",
+ "key": "drpyS_3Q影视[优]",
+ "name": "3Q影视[优](DS)",
+ "api": "http://localhost:5757/api/3Q影视[优]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
"testUrls": {
- "home": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds&ac=list&t=1&pg=1"
+ "home": "http://localhost:5757/api/3Q%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds",
+ "category": "http://localhost:5757/api/3Q%E5%BD%B1%E8%A7%86[%E4%BC%98]?pwd=dzyyds&ac=list&t=1&pg=1"
},
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_雪花电影[磁]",
- "name": "雪花电影[磁](DS)",
- "api": "http://localhost:5757/api/雪花电影[磁]?pwd=dzyyds",
+ "key": "drpyS_玩偶哥哥DM[盘]",
+ "name": "玩偶哥哥DM[盘](DS)",
+ "api": "http://localhost:5757/api/玩偶哥哥DM[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9B%AA%E8%8A%B1%E7%94%B5%E5%BD%B1[%E7%A3%81]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%9B%AA%E8%8A%B1%E7%94%B5%E5%BD%B1[%E7%A3%81]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_番茄短剧[短]",
- "name": "番茄短剧[短](DS)",
- "api": "http://localhost:5757/api/番茄短剧[短]?pwd=dzyyds",
+ "key": "drpyS_玩偶哥哥[盘]",
+ "name": "玩偶哥哥[盘](DS)",
+ "api": "http://localhost:5757/api/玩偶哥哥[盘]?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 1,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E7%9F%AD%E5%89%A7[%E7%9F%AD]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_围观短剧 ᵈᶻ[短]",
- "name": "围观短剧 ᵈᶻ[短](PHP)",
- "api": "http://localhost:5757/api/围观短剧 ᵈᶻ[短]?do=php&pwd=dzyyds",
+ "key": "drpyS_二小[盘]",
+ "name": "二小[盘](DS)",
+ "api": "http://localhost:5757/api/二小[盘]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "php",
+ "lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%9B%B4%E8%A7%82%E7%9F%AD%E5%89%A7%20%E1%B5%88%E1%B6%BB[%E7%9F%AD]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%9B%B4%E8%A7%82%E7%9F%AD%E5%89%A7%20%E1%B5%88%E1%B6%BB[%E7%9F%AD]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_嗷呜动漫[漫]",
- "name": "嗷呜动漫[漫](cat)",
- "api": "http://localhost:5757/api/嗷呜动漫[漫]?do=cat&pwd=dzyyds",
+ "key": "drpyS_二小ᵐ[盘]",
+ "name": "二小ᵐ[盘](DS)",
+ "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_奇奇[官]",
- "name": "奇奇[官](cat)",
- "api": "http://localhost:5757/api/奇奇[官]?do=cat&pwd=dzyyds",
+ "key": "drpyS_欧歌ᵐ[盘]",
+ "name": "欧歌ᵐ[盘](DS)",
+ "api": "http://localhost:5757/api/网盘[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A5%87%E5%A5%87[%E5%AE%98]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%A5%87%E5%A5%87[%E5%AE%98]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "php_奇奇 ᵈᶻ[官]",
- "name": "奇奇 ᵈᶻ[官](PHP)",
- "api": "http://localhost:5757/api/奇奇 ᵈᶻ[官]?do=php&pwd=dzyyds",
+ "key": "drpyS_NT动漫[漫]",
+ "name": "NT动漫[漫](DS)",
+ "api": "http://localhost:5757/api/NT动漫[漫]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "php",
+ "searchable": 2,
+ "lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%A5%87%E5%A5%87%20%E1%B5%88%E1%B6%BB[%E5%AE%98]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%A5%87%E5%A5%87%20%E1%B5%88%E1%B6%BB[%E5%AE%98]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "catvod_酷酷[官]",
- "name": "酷酷[官](cat)",
- "api": "http://localhost:5757/api/酷酷[官]?do=cat&pwd=dzyyds",
+ "key": "php_围观短剧 ᵈᶻ[短]",
+ "name": "围观短剧 ᵈᶻ[短](PHP)",
+ "api": "http://localhost:5757/api/围观短剧 ᵈᶻ[短]?do=php&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "cat",
+ "lang": "php",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%85%B7%E9%85%B7[%E5%AE%98]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%85%B7%E9%85%B7[%E5%AE%98]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_啊哈DJ[听]",
- "name": "啊哈DJ[听](DS)",
- "api": "http://localhost:5757/api/啊哈DJ[听]?pwd=dzyyds",
+ "key": "drpyS_嗷呜动漫[漫]",
+ "name": "嗷呜动漫[漫](DS)",
+ "api": "http://localhost:5757/api/嗷呜动漫[漫]?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
"testUrls": {
- "home": "http://localhost:5757/api/%E5%95%8A%E5%93%88DJ[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%95%8A%E5%93%88DJ[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
+ "home": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds",
+ "category": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB[%E6%BC%AB]?pwd=dzyyds&ac=list&t=1&pg=1"
},
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_音乐聚合[听]",
- "name": "音乐聚合[听](DS)",
- "api": "http://localhost:5757/api/音乐聚合[听]?pwd=dzyyds",
+ "key": "catvod_嗷呜动漫[漫]",
+ "name": "嗷呜动漫[漫](cat)",
+ "api": "http://localhost:5757/api/嗷呜动漫[漫]?do=cat&pwd=dzyyds",
"type": 4,
"searchable": 1,
- "lang": "ds",
+ "lang": "cat",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9F%B3%E4%B9%90%E8%81%9A%E5%90%88[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%9F%B3%E4%B9%90%E8%81%9A%E5%90%88[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_播客[听]",
- "name": "播客[听](DS)",
- "api": "http://localhost:5757/api/播客[听]?pwd=dzyyds",
+ "key": "drpyS_雪花电影[磁]",
+ "name": "雪花电影[磁](DS)",
+ "api": "http://localhost:5757/api/雪花电影[磁]?pwd=dzyyds",
"type": 4,
- "searchable": 0,
+ "searchable": 2,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E6%92%AD%E5%AE%A2[%E5%90%AC]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E6%92%AD%E5%AE%A2[%E5%90%AC]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_番茄漫画[画]",
- "name": "番茄漫画[画](DS)",
- "api": "http://localhost:5757/api/番茄漫画[画]?pwd=dzyyds",
+ "key": "drpyS_雷鲸小站[盘]",
+ "name": "雷鲸小站[盘](DS)",
+ "api": "http://localhost:5757/api/雷鲸小站[盘]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E6%BC%AB%E7%94%BB[%E7%94%BB]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E6%BC%AB%E7%94%BB[%E7%94%BB]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4112,11 +3421,8 @@
"lang": "php",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%BB%85%E5%A3%AB%E6%BC%AB%E7%94%BB%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%BB%85%E5%A3%AB%E6%BC%AB%E7%94%BB%20%E1%B5%88%E1%B6%BB[%E7%94%BB]?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4128,11 +3434,8 @@
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E6%BC%AB%E7%94%BB[%E7%94%BB]?do=cat&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E7%95%AA%E8%8C%84%E6%BC%AB%E7%94%BB[%E7%94%BB]?do=cat&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4144,11 +3447,8 @@
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BB%93%E9%BC%A0",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BB%93%E9%BC%A0"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4160,107 +3460,86 @@
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%92%96%E5%95%A1",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%92%96%E5%95%A1"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_云云_Appget",
- "name": "云云[M](GET)",
+ "key": "drpyS_鲸鱼_Appget",
+ "name": "鲸鱼[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BA%91%E4%BA%91",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E4%BA%91%E4%BA%91"
- },
- "checkTime": "2026-03-13T12:37:39.211Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_鲸鱼_Appget",
- "name": "鲸鱼[M](GET)",
+ "key": "drpyS_火锅_Appget",
+ "name": "火锅[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E9%B2%B8%E9%B1%BC",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E9%B2%B8%E9%B1%BC"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_王子_Appget",
- "name": "王子[M](GET)",
+ "key": "drpyS_旗星_Appget",
+ "name": "旗星[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%8E%8B%E5%AD%90",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%8E%8B%E5%AD%90"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_旗星_Appget",
- "name": "旗星[M](GET)",
+ "key": "drpyS_剧梦_Appget",
+ "name": "剧梦[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E6%97%97%E6%98%9F",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E6%97%97%E6%98%9F"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_剧梦_Appget",
- "name": "剧梦[M](GET)",
+ "key": "drpyS_顾我_Appget",
+ "name": "顾我[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%89%A7%E6%A2%A6",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E5%89%A7%E6%A2%A6"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_顾我_Appget",
- "name": "顾我[M](GET)",
+ "key": "drpyS_爆炸_Appget",
+ "name": "爆炸[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E9%A1%BE%E6%88%91",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E9%A1%BE%E6%88%91"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4272,27 +3551,34 @@
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%81%B5%E8%99%8E",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%81%B5%E8%99%8E"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_爆炸_Appget",
- "name": "爆炸[M](GET)",
+ "key": "drpyS_云云_Appget",
+ "name": "云云[M](GET)",
"api": "http://localhost:5757/api/Appget[模板]?pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "unknown",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%88%86%E7%82%B8",
- "category": "http://localhost:5757/api/Appget[%E6%A8%A1%E6%9D%BF]?pwd=dzyyds&ac=list&t=1&pg=1&extend=..%2Fjson%2FApp%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE.json%24%E7%88%86%E7%82%B8"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "drpyS_18av[密]",
+ "name": "18av[密](DS)",
+ "api": "http://localhost:5757/api/18av[密]?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "error",
+ "message": "推荐和分类接口均异常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4304,11 +3590,8 @@
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/55%E5%BD%B1%E8%A7%86?pwd=dzyyds",
- "category": "http://localhost:5757/api/55%E5%BD%B1%E8%A7%86?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4320,27 +3603,21 @@
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/999%E7%89%87?pwd=dzyyds",
- "category": "http://localhost:5757/api/999%E7%89%87?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_18av[密]",
- "name": "18av[密](DS)",
- "api": "http://localhost:5757/api/18av[密]?pwd=dzyyds",
+ "key": "drpyS_TVB云播",
+ "name": "TVB云播(DS)",
+ "api": "http://localhost:5757/api/TVB云播?pwd=dzyyds",
"type": 4,
"searchable": 2,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/18av[%E5%AF%86]?pwd=dzyyds",
- "category": "http://localhost:5757/api/18av[%E5%AF%86]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4352,27 +3629,8 @@
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E5%8D%AB%E6%98%9F%E5%BD%B1%E8%A7%86?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%8D%AB%E6%98%9F%E5%BD%B1%E8%A7%86?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
- "manuallyMarked": false
- },
- {
- "key": "drpyS_草榴社区[密]",
- "name": "草榴社区[密](DS)",
- "api": "http://localhost:5757/api/草榴社区[密]?pwd=dzyyds",
- "type": 4,
- "searchable": 2,
- "lang": "ds",
- "status": "error",
- "message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E8%8D%89%E6%A6%B4%E7%A4%BE%E5%8C%BA[%E5%AF%86]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E8%8D%89%E6%A6%B4%E7%A4%BE%E5%8C%BA[%E5%AF%86]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4384,27 +3642,21 @@
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9D%9E%E5%87%A1%E9%87%87%E9%9B%86[%E9%87%87]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%9D%9E%E5%87%A1%E9%87%87%E9%9B%86[%E9%87%87]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_麻豆社[密]",
- "name": "麻豆社[密](DS)",
- "api": "http://localhost:5757/api/麻豆社[密]?pwd=dzyyds",
+ "key": "drpyS_零度",
+ "name": "零度(DS)",
+ "api": "http://localhost:5757/api/零度?pwd=dzyyds",
"type": 4,
- "searchable": 2,
+ "searchable": 0,
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%BA%BB%E8%B1%86%E7%A4%BE[%E5%AF%86]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%BA%BB%E8%B1%86%E7%A4%BE[%E5%AF%86]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4416,43 +3668,47 @@
"lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%BB%91%E6%96%99%E4%B8%8D%E6%89%93%E7%83%8A[%E5%AF%86]?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%BB%91%E6%96%99%E4%B8%8D%E6%89%93%E7%83%8A[%E5%AF%86]?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "drpyS_零度",
- "name": "零度(DS)",
- "api": "http://localhost:5757/api/零度?pwd=dzyyds",
+ "key": "hipy_py_花柳影视[AFX]",
+ "name": "花柳影视[AFX](hipy)",
+ "api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
"type": 4,
- "searchable": 0,
- "lang": "ds",
+ "searchable": 1,
+ "lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9B%B6%E5%BA%A6?pwd=dzyyds",
- "category": "http://localhost:5757/api/%E9%9B%B6%E5%BA%A6?pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_花柳影视[AFX]",
- "name": "花柳影视[AFX](hipy)",
+ "key": "hipy_py_旗星[AG¹]",
+ "name": "旗星[AG¹](hipy)",
+ "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "hipy",
+ "status": "error",
+ "message": "推荐和分类接口均异常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "hipy_py_TVB云播[AFX]",
+ "name": "TVB云播[AFX](hipy)",
"api": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22http%3A%2F%2Fnico.oiio.fun%22%7D",
- "category": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22host%22%3A%22http%3A%2F%2Fnico.oiio.fun%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4464,11 +3720,8 @@
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22http%3A%2F%2Fwww.yezitv.top%2Fdtym.json%22%7D",
- "category": "http://localhost:5757/api/AppFox?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22host%22%3A%22http%3A%2F%2Fwww.yezitv.top%2Fdtym.json%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4480,61 +3733,63 @@
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppMuou?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/AppMuou?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_旗星[AG¹]",
- "name": "旗星[AG¹](hipy)",
- "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ "key": "drpyS_麻豆社[密]",
+ "name": "麻豆社[密](DS)",
+ "api": "http://localhost:5757/api/麻豆社[密]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "hipy",
+ "searchable": 2,
+ "lang": "ds",
"status": "error",
"message": "推荐和分类接口均异常",
"testUrls": {
- "home": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22http%3A%2F%2Fys.qist.top%22%2C%22key%22%3A%222SWSPFxugBLPPOKo%22%7D",
- "category": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22host%22%3A%22http%3A%2F%2Fys.qist.top%22%2C%22key%22%3A%222SWSPFxugBLPPOKo%22%7D"
+ "home": "http://localhost:5757/api/%E9%BA%BB%E8%B1%86%E7%A4%BE[%E5%AF%86]?pwd=dzyyds",
+ "category": "http://localhost:5757/api/%E9%BA%BB%E8%B1%86%E7%A4%BE[%E5%AF%86]?pwd=dzyyds&ac=list&t=1&pg=1"
},
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_玲珑[AG¹]",
- "name": "玲珑[AG¹](hipy)",
- "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
+ "key": "drpyS_草榴社区[密]",
+ "name": "草榴社区[密](DS)",
+ "api": "http://localhost:5757/api/草榴社区[密]?pwd=dzyyds",
"type": 4,
- "searchable": 1,
- "lang": "hipy",
+ "searchable": 2,
+ "lang": "ds",
"status": "error",
- "message": "仅 1/4 接口正常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fmac.555618.xyz%22%2C%22key%22%3A%22%23getapp%40TMD%402025%22%7D",
- "category": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22host%22%3A%22https%3A%2F%2Fmac.555618.xyz%22%2C%22key%22%3A%22%23getapp%40TMD%402025%22%7D",
- "search": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95&extend=%7B%22host%22%3A%22https%3A%2F%2Fmac.555618.xyz%22%2C%22key%22%3A%22%23getapp%40TMD%402025%22%7D",
- "detail": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds&ac=detail&ids=1&extend=%7B%22host%22%3A%22https%3A%2F%2Fmac.555618.xyz%22%2C%22key%22%3A%22%23getapp%40TMD%402025%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "message": "推荐和分类接口均异常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_好震惊[AV²]",
- "name": "好震惊[AV²](hipy)",
- "api": "http://localhost:5757/api/AppV2²?do=py&pwd=dzyyds",
+ "key": "drpyS_短剧视频库",
+ "name": "短剧视频库(DS)",
+ "api": "http://localhost:5757/api/短剧视频库?pwd=dzyyds",
+ "type": 4,
+ "searchable": 2,
+ "lang": "ds",
+ "status": "error",
+ "message": "Cannot set properties of null (setting 'textContent')",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "hipy_py_玲珑[AG¹]",
+ "name": "玲珑[AG¹](hipy)",
+ "api": "http://localhost:5757/api/AppGet?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppV2%C2%B2?do=py&pwd=dzyyds&extend=http%3A%2F%2Fv.lnhaozhenjin.cn",
- "category": "http://localhost:5757/api/AppV2%C2%B2?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=http%3A%2F%2Fv.lnhaozhenjin.cn"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4546,11 +3801,8 @@
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/AppV2%C2%B9?do=py&pwd=dzyyds",
- "category": "http://localhost:5757/api/AppV2%C2%B9?do=py&pwd=dzyyds&ac=list&t=1&pg=1"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4562,27 +3814,21 @@
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2F99.jl8.top%2F1.txt%22%2C%22key%22%3A%22xnybssspqtwotuwj%22%7D",
- "category": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22host%22%3A%22https%3A%2F%2F99.jl8.top%2F1.txt%22%2C%22key%22%3A%22xnybssspqtwotuwj%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_云云[AG³]",
- "name": "云云[AG³](hipy)",
+ "key": "hipy_py_鲸鱼影视[AG³]",
+ "name": "鲸鱼影视[AG³](hipy)",
"api": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fstaraugust123456.oss-cn-hangzhou.aliyuncs.com%2F2.txt%22%2C%22datakey%22%3A%22staraugust123456%22%2C%22api%22%3A2%7D",
- "category": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22host%22%3A%22https%3A%2F%2Fstaraugust123456.oss-cn-hangzhou.aliyuncs.com%2F2.txt%22%2C%22datakey%22%3A%22staraugust123456%22%2C%22api%22%3A2%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4594,27 +3840,34 @@
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/emby?do=py&pwd=dzyyds&extend=%7B%22server%22%3A%22http%3A%2F%2F139.9.106.196%3A2345%22%2C%22username%22%3A%22kid%22%2C%22password%22%3A%22%22%7D",
- "category": "http://localhost:5757/api/emby?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22server%22%3A%22http%3A%2F%2F139.9.106.196%3A2345%22%2C%22username%22%3A%22kid%22%2C%22password%22%3A%22%22%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
- "key": "hipy_py_鲸鱼影视[AG³]",
- "name": "鲸鱼影视[AG³](hipy)",
+ "key": "hipy_py_好震惊[AV²]",
+ "name": "好震惊[AV²](hipy)",
+ "api": "http://localhost:5757/api/AppV2²?do=py&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "hipy",
+ "status": "error",
+ "message": "推荐和分类接口均异常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "hipy_py_云云[AG³]",
+ "name": "云云[AG³](hipy)",
"api": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds",
"type": 4,
"searchable": 1,
"lang": "hipy",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds&extend=%7B%22host%22%3A%22https%3A%2F%2Fjingyu4k-1312635929.cos.ap-nanjing.myqcloud.com%2F1.json%22%2C%22datakey%22%3A%22AAdgrdghjfgswerA%22%2C%22api%22%3A2%7D",
- "category": "http://localhost:5757/api/getapp3.4.4?do=py&pwd=dzyyds&ac=list&t=1&pg=1&extend=%7B%22host%22%3A%22https%3A%2F%2Fjingyu4k-1312635929.cos.ap-nanjing.myqcloud.com%2F1.json%22%2C%22datakey%22%3A%22AAdgrdghjfgswerA%22%2C%22api%22%3A2%7D"
- },
- "checkTime": "2026-03-13T12:37:39.212Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4626,11 +3879,26 @@
"lang": "php",
"status": "error",
"message": "推荐和分类接口均异常",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
+ "manuallyMarked": false
+ },
+ {
+ "key": "hipy_py_新浪资源",
+ "name": "新浪资源(hipy)",
+ "api": "http://localhost:5757/api/新浪资源?do=py&pwd=dzyyds",
+ "type": 4,
+ "searchable": 1,
+ "lang": "hipy",
+ "status": "error",
+ "message": "仅 1/4 接口正常",
"testUrls": {
- "home": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds",
- "category": "http://localhost:5757/api/%E5%97%B7%E5%91%9C%E5%8A%A8%E6%BC%AB%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds&ac=list&t=1&pg=1"
+ "home": "http://localhost:5757/api/%E6%96%B0%E6%B5%AA%E8%B5%84%E6%BA%90?do=py&pwd=dzyyds",
+ "category": "http://localhost:5757/api/%E6%96%B0%E6%B5%AA%E8%B5%84%E6%BA%90?do=py&pwd=dzyyds&ac=list&t=1&pg=1",
+ "search": "http://localhost:5757/api/%E6%96%B0%E6%B5%AA%E8%B5%84%E6%BA%90?do=py&pwd=dzyyds&ac=list&wd=%E6%B5%8B%E8%AF%95",
+ "detail": "http://localhost:5757/api/%E6%96%B0%E6%B5%AA%E8%B5%84%E6%BA%90?do=py&pwd=dzyyds&ac=detail&ids=1"
},
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
},
{
@@ -4642,10 +3910,8 @@
"lang": "php",
"status": "error",
"message": "推荐和分类接口均异常",
- "testUrls": {
- "home": "http://localhost:5757/api/%E9%9B%B6%E5%BA%A6%E5%BD%B1%E8%A7%86%20%E1%B5%88%E1%B6%BB?do=php&pwd=dzyyds"
- },
- "checkTime": "2026-03-13T12:37:39.213Z",
+ "testUrls": {},
+ "checkTime": "2026-03-14T05:07:55.462Z",
"manuallyMarked": false
}
]
diff --git a/docs/updateRecord.md b/docs/updateRecord.md
index bc2c2bb7..533ce260 100644
--- a/docs/updateRecord.md
+++ b/docs/updateRecord.md
@@ -1,5 +1,40 @@
# drpyS更新记录
+### 20260320
+
+更新至V1.4.1
+
+1. 完善后台管理功能,精心打磨各个功能和页面
+2. 设置中心源增加快捷后台管理、DS仓库入口
+3. 修复node24以上运行代码出现的警告
+
+注意事项(node24以上存在兼容性问题,不是没法运行,而是类似APP模板这种源无法正常使用,还是推荐大家使用node23及以下版本)
+
+### 20260319
+
+更新至V1.3.31
+
+1. 增加后台管理插件,移除dns库,优化marked库
+2. 推荐使用node23版本,24以上会有兼容性问题
+
+### 20260317
+
+更新至V1.3.30
+
+1. 优化文件头处理工具,支持完美JSON5对象文件头识别,新增PHP文件头支持,提高文件头读写速度
+2. 修复夸克工具无限转存逻辑异常
+3. 新增源、并优化bundle打包逻辑
+4. 尝试处理了一些内存泄露问题
+
+### 20260315
+
+更新至V1.3.29
+
+1. 彻底解决ds代码问题导致的阻止程序退出
+2. 完善全局require处理,支持cjs文件里引入 `axios` 等对象不报错
+3. 彻底优化本地bundle包
+4. 更新迅雷网盘解析支持,设置中心推送里可以推送播放迅雷链接
+
### 20260314
更新至V1.3.28
@@ -7,6 +42,8 @@
1. 合并zy佬在mcp服务上做的一些更新
2. 优化 drpyS内存开销,杜绝无限内存增长,实测 pm2运行的ds经历多轮源可用性测试后仍旧可以 长期低于 400mb内存占用
3. 优化本地bundle包几乎完美
+4. 优化阿里和UC网盘解析
+5. 处理了一些失效的源
### 20260301
diff --git a/drpy-node-admin/.env.example b/drpy-node-admin/.env.example
new file mode 100644
index 00000000..c33d1953
--- /dev/null
+++ b/drpy-node-admin/.env.example
@@ -0,0 +1,9 @@
+# 后端服务器地址(可选)
+# 开发环境通常留空,使用 Vite 代理
+# 生产环境如果前后端分离部署,需要配置后端地址
+# 例如: VITE_BACKEND_URL=http://localhost:5757
+VITE_BACKEND_URL=
+
+# WebSocket 服务器地址(可选)
+# 如果与主服务器不同,可以单独配置
+# VITE_WS_URL=ws://localhost:5757
diff --git a/drpy-node-admin/.env.production.apps b/drpy-node-admin/.env.production.apps
new file mode 100644
index 00000000..78f581ff
--- /dev/null
+++ b/drpy-node-admin/.env.production.apps
@@ -0,0 +1,3 @@
+# .env.production.apps
+# 子目录部署配置 - 部署到 /apps/admin/ 目录
+VITE_BASE_PATH=/apps/admin/
diff --git a/drpy-node-admin/.gitignore b/drpy-node-admin/.gitignore
new file mode 100644
index 00000000..46eb96b8
--- /dev/null
+++ b/drpy-node-admin/.gitignore
@@ -0,0 +1,36 @@
+# Dependencies
+node_modules/
+.pnp/
+.pnp.js
+
+# Build outputs
+dist/
+dist-ssr/
+*.local
+
+# Editor directories and files
+.vscode/
+.idea/
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# Environment variables
+.env
+.env.local
+.env.*.local
+
+# Logs
+logs/
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+# OS files
+.DS_Store
+Thumbs.db
diff --git a/drpy-node-admin/API.md b/drpy-node-admin/API.md
new file mode 100644
index 00000000..a1723e49
--- /dev/null
+++ b/drpy-node-admin/API.md
@@ -0,0 +1,589 @@
+# drpy-node Admin API 文档
+
+## 概述
+
+drpy-node Admin API 是一套 RESTful API,用于后台管理面板与 drpy-node 服务之间的通信。
+
+**Base URL**: `http://localhost:5757/api/admin`
+
+**认证方式**: Basic Auth(与 /apps/ 相同)
+
+---
+
+## API 端点
+
+### 1. 系统管理
+
+#### 1.1 健康检查
+
+获取服务运行状态和系统信息。
+
+```http
+GET /api/admin/health
+```
+
+**响应**:
+```json
+{
+ "status": "ok",
+ "uptime": 123456,
+ "memory": {
+ "used": 128,
+ "total": 512,
+ "rss": 256
+ },
+ "version": "1.3.30",
+ "platform": {
+ "arch": "x64",
+ "platform": "win32",
+ "nodeVersion": "v18.17.0"
+ },
+ "timestamp": 1710907200000
+}
+```
+
+#### 1.2 重启服务
+
+尝试重启服务(需要 PM2 环境)。
+
+```http
+POST /api/admin/restart
+```
+
+**响应**:
+```json
+{
+ "success": true,
+ "message": "服务已通过 PM2 重启"
+}
+```
+
+或(非 PM2 环境):
+```json
+{
+ "success": false,
+ "message": "当前未使用 PM2 运行。请在终端中手动重启服务:\n1. 按 Ctrl+C 停止当前服务\n2. 运行 npm run dev 重新启动"
+}
+```
+
+---
+
+### 2. 日志管理
+
+#### 2.1 读取日志
+
+获取最近的日志内容。
+
+```http
+GET /api/admin/logs?lines=50
+```
+
+**查询参数**:
+- `lines` (可选): 读取的行数,默认 50
+
+**响应**:
+```json
+{
+ "file": "drpy-node-20250318.log.txt",
+ "content": "[2025-03-18 10:30:00] Server started on port 5757\n..."
+}
+```
+
+#### 2.2 实时日志流 (WebSocket)
+
+建立 WebSocket 连接以接收实时日志。
+
+```http
+WS /api/admin/logs/stream
+```
+
+**客户端发送**:
+```json
+{
+ "action": "subscribe",
+ "lines": 50
+}
+```
+
+**服务端推送**:
+```json
+{
+ "type": "log",
+ "timestamp": 1710907200000,
+ "content": "[INFO] Server started"
+}
+```
+
+**消息类型**:
+- `connected`: 连接成功
+- `log`: 日志内容
+- `error`: 错误信息
+- `end`: 日志读取完成
+- `cleared`: 日志已清空
+- `pong`: 心跳响应
+
+---
+
+### 3. 配置管理
+
+#### 3.1 获取配置
+
+获取配置值。
+
+```http
+GET /api/admin/config?key=section.key
+```
+
+**查询参数**:
+- `key` (可选): 配置键路径,使用点分隔
+
+**响应**:
+```json
+"配置值"
+```
+
+#### 3.2 更新配置
+
+更新配置值。
+
+```http
+POST /api/admin/config
+```
+
+**请求体**:
+```json
+{
+ "key": "section.key",
+ "value": "new value"
+}
+```
+
+**响应**:
+```json
+{
+ "success": true,
+ "message": "配置项 section.key 已更新"
+}
+```
+
+#### 3.3 获取环境变量
+
+获取当前环境变量。
+
+```http
+GET /api/admin/env
+```
+
+**响应**:
+```json
+{
+ "PORT": "5757",
+ "NODE_ENV": "development",
+ "MAX_TEXT_SIZE": "102400",
+ "QUARK_COOKIE": "..."
+}
+```
+
+---
+
+### 4. 源管理
+
+#### 4.1 列出所有源
+
+获取所有可用的源文件列表。
+
+```http
+GET /api/admin/sources
+```
+
+**响应**:
+```json
+{
+ "js": ["_test.js", "_qq.js", "_fq.js", ...],
+ "catvod": ["cat.js", ...]
+}
+```
+
+#### 4.2 验证源
+
+验证源文件的结构和必填字段。
+
+```http
+POST /api/admin/sources/validate
+```
+
+**请求体**:
+```json
+{
+ "path": "spider/js/_test.js"
+}
+```
+
+**响应**:
+```json
+{
+ "isValid": true,
+ "message": "验证通过"
+}
+```
+
+或(验证失败):
+```json
+{
+ "isValid": false,
+ "error": "rule 对象缺少必填字段: host"
+}
+```
+
+#### 4.3 检查语法
+
+检查源文件的 JavaScript 语法。
+
+```http
+POST /api/admin/sources/syntax
+```
+
+**请求体**:
+```json
+{
+ "path": "spider/js/_test.js"
+}
+```
+
+**响应**:
+```json
+{
+ "isValid": true,
+ "message": "语法检查通过"
+}
+```
+
+或(语法错误):
+```json
+{
+ "isValid": false,
+ "error": "Syntax Error: Unexpected token"
+}
+```
+
+#### 4.4 获取源模板
+
+获取空的源文件模板。
+
+```http
+GET /api/admin/sources/template
+```
+
+**响应**:
+```json
+{
+ "template": "var rule = {\n 类型: '影视',\n ...\n}"
+}
+```
+
+#### 4.5 获取 drpy 库信息
+
+获取 drpy 全局对象和规则语法说明。
+
+```http
+GET /api/admin/sources/libs
+```
+
+**响应**:
+```json
+{
+ "globalObjects": [
+ "request(url, options) - HTTP Request",
+ "pdfa(html, rule) - Parse List",
+ ...
+ ],
+ "parsingRules": [
+ "Format: selector;attr1;attr2...",
+ "pdfa (list): Returns array",
+ ...
+ ]
+}
+```
+
+---
+
+### 5. 文件管理
+
+#### 5.1 列出目录
+
+获取目录内容列表。
+
+```http
+GET /api/admin/files/list?path=spider/js
+```
+
+**查询参数**:
+- `path`: 目录路径,默认为当前目录 '.'
+
+**响应**:
+```json
+{
+ "files": [
+ {
+ "name": "_test.js",
+ "path": "spider/js/_test.js",
+ "isDirectory": false,
+ "size": 2048
+ },
+ {
+ "name": "lib",
+ "path": "spider/js/lib",
+ "isDirectory": true
+ }
+ ]
+}
+```
+
+#### 5.2 读取文件
+
+读取文件内容。
+
+```http
+GET /api/admin/files/read?path=spider/js/_test.js
+```
+
+**查询参数**:
+- `path`: 文件路径
+
+**文本文件响应**:
+```json
+{
+ "type": "text",
+ "content": "文件内容..."
+}
+```
+
+**图片文件响应**:
+```json
+{
+ "type": "image",
+ "mimeType": "image/png",
+ "dataUrl": "data:image/png;base64,iVBORw0KGgo..."
+}
+```
+
+#### 5.3 写入文件
+
+写入文件内容。
+
+```http
+POST /api/admin/files/write
+```
+
+**请求体**:
+```json
+{
+ "path": "spider/js/new_source.js",
+ "content": "文件内容..."
+}
+```
+
+**响应**:
+```json
+{
+ "success": true,
+ "message": "文件保存成功"
+}
+```
+
+#### 5.4 删除文件
+
+删除文件。
+
+```http
+DELETE /api/admin/files/delete?path=spider/js/old.js
+```
+
+**查询参数**:
+- `path`: 文件路径
+
+**响应**:
+```json
+{
+ "success": true,
+ "message": "文件删除成功"
+}
+```
+
+---
+
+### 6. 数据库查询
+
+#### 6.1 执行查询
+
+执行只读 SQL 查询。
+
+```http
+POST /api/admin/db/query
+```
+
+**请求体**:
+```json
+{
+ "sql": "SELECT * FROM sqlite_master WHERE type='table'"
+}
+```
+
+**响应**:
+```json
+{
+ "success": true,
+ "data": [
+ { "type": "table", "name": "sources", "tbl_name": "sources", ... }
+ ],
+ "rows": 10
+}
+```
+
+#### 6.2 获取所有表
+
+获取数据库中所有表。
+
+```http
+GET /api/admin/db/tables
+```
+
+**响应**:
+```json
+{
+ "success": true,
+ "tables": ["sources", "config", ...]
+}
+```
+
+#### 6.3 获取表结构
+
+获取表的字段信息。
+
+```http
+GET /api/admin/db/tables/{table}/schema
+```
+
+**响应**:
+```json
+{
+ "success": true,
+ "table": "sources",
+ "columns": [
+ { "cid": 0, "name": "id", "type": "INTEGER", "notnull": 1, "dflt_value": null },
+ ...
+ ]
+}
+```
+
+---
+
+### 7. 路由信息
+
+#### 7.1 获取路由列表
+
+获取已注册的控制器列表。
+
+```http
+GET /api/admin/routes
+```
+
+**响应**:
+```json
+{
+ "file": "controllers/index.js",
+ "registered_controllers": [
+ "fastify.register(websocketController, options);",
+ "fastify.register(staticController, options);",
+ ...
+ ]
+}
+```
+
+---
+
+## 错误响应格式
+
+所有 API 在发生错误时返回统一格式:
+
+```json
+{
+ "error": "错误描述信息"
+}
+```
+
+HTTP 状态码:
+- `200`: 成功
+- `400`: 请求参数错误
+- `403`: 访问被拒绝(路径不安全)
+- `404`: 资源不存在
+- `500`: 服务器内部错误
+
+---
+
+## 安全限制
+
+### 路径访问限制
+
+允许访问的目录:
+- `spider/js/`
+- `spider/js_dr2/`
+- `spider/catvod/`
+- `spider/py/`
+- `spider/xbpq/`
+- `config/`
+- `json/`
+- `docs/`
+
+禁止访问:
+- 包含 `..` 的路径(路径遍历)
+- 包含 `~` 的路径
+- 绝对路径(以 `/` 开头)
+- `node_modules/` 目录
+- `database.db` 文件
+
+### SQL 查询限制
+
+- 只允许 `SELECT` 查询
+- 禁止 `DROP`、`DELETE`、`INSERT`、`UPDATE`、`ALTER`、`CREATE`、`TRUNCATE`
+
+---
+
+## WebSocket 心跳
+
+为保持连接活跃,客户端应每 30 秒发送一次心跳:
+
+```javascript
+// 客户端代码示例
+setInterval(() => {
+ if (ws.readyState === WebSocket.OPEN) {
+ ws.send(JSON.stringify({ type: 'heartbeat' }));
+ }
+}, 30000);
+```
+
+服务端会响应:
+```json
+{ "type": "pong" }
+```
+
+---
+
+## 速率限制
+
+为防止滥用,建议实施以下速率限制:
+
+- 日志读取: 10 次/分钟
+- 文件操作: 20 次/分钟
+- 配置更新: 5 次/分钟
+- 数据库查询: 30 次/分钟
+
+---
+
+## 版本历史
+
+### v1.0.0 (2025-03-18)
+- 初始版本
+- 实现所有核心 API
+- WebSocket 实时日志支持
+- 移除 MCP 依赖
diff --git a/drpy-node-admin/IMPLEMENTATION.md b/drpy-node-admin/IMPLEMENTATION.md
new file mode 100644
index 00000000..9e47051e
--- /dev/null
+++ b/drpy-node-admin/IMPLEMENTATION.md
@@ -0,0 +1,1383 @@
+# drpy-node-admin 解耦实现细节
+
+## 1. 控制器实现示例
+
+### 1.1 systemController.js
+
+```javascript
+/**
+ * 系统管理控制器
+ * 提供健康检查、服务重启等系统级功能
+ */
+
+import os from 'os';
+import { exec } from 'child_process';
+import util from 'util';
+import path from 'path';
+import fs from 'fs-extra';
+
+const execPromise = util.promisify(exec);
+
+// 健康检查
+export async function getHealth(req, reply) {
+ try {
+ const uptime = process.uptime();
+ const memory = process.memoryUsage();
+ const packageJson = await fs.readJson(path.join(process.cwd(), 'package.json'));
+
+ return reply.send({
+ status: 'ok',
+ uptime: Math.floor(uptime),
+ memory: {
+ used: Math.round(memory.heapUsed / 1024 / 1024),
+ total: Math.round(memory.heapTotal / 1024 / 1024),
+ rss: Math.round(memory.rss / 1024 / 1024)
+ },
+ version: packageJson.version,
+ platform: {
+ arch: os.arch(),
+ platform: os.platform(),
+ nodeVersion: process.version
+ },
+ timestamp: Date.now()
+ });
+ } catch (e) {
+ reply.code(500).send({
+ status: 'error',
+ error: e.message
+ });
+ }
+}
+
+// 服务重启
+export async function restartService(req, reply) {
+ try {
+ // 检查是否在 PM2 环境运行
+ try {
+ await execPromise('pm2 restart drpys');
+ return reply.send({
+ success: true,
+ message: '服务已通过 PM2 重启'
+ });
+ } catch (pm2Error) {
+ return reply.send({
+ success: false,
+ message: '当前未使用 PM2 运行。请在终端中手动重启服务:\\n1. 按 Ctrl+C 停止当前服务\\n2. 运行 npm run dev 重新启动'
+ });
+ }
+ } catch (e) {
+ reply.code(500).send({
+ success: false,
+ error: e.message
+ });
+ }
+}
+```
+
+### 1.2 logsController.js
+
+```javascript
+/**
+ * 日志管理控制器
+ * 提供日志读取和 WebSocket 实时流式传输
+ */
+
+import fs from 'fs-extra';
+import path from 'path';
+import { WebSocket } from '@fastify/websocket';
+import { EventEmitter } from 'events';
+
+const logEmitter = new EventEmitter();
+const activeLogConnections = new Set();
+
+// 读取日志
+export async function getLogs(req, reply) {
+ try {
+ const lines = parseInt(req.query.lines) || 50;
+ const logDir = path.join(process.cwd(), 'logs');
+
+ if (!await fs.pathExists(logDir)) {
+ return reply.send({
+ file: null,
+ content: '日志目录不存在'
+ });
+ }
+
+ const files = await fs.readdir(logDir);
+ const logFiles = files
+ .filter(f => f.endsWith('.log.txt'))
+ .sort()
+ .reverse();
+
+ if (logFiles.length === 0) {
+ return reply.send({
+ file: null,
+ content: '没有日志文件'
+ });
+ }
+
+ const latestLog = path.join(logDir, logFiles[0]);
+ const content = await fs.readFile(latestLog, 'utf-8');
+ const allLines = content.trim().split('\\n');
+ const lastLines = allLines.slice(-lines);
+
+ return reply.send({
+ file: logFiles[0],
+ content: lastLines.join('\\n')
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// WebSocket 日志流处理
+export async function handleLogStream(connection, req) {
+ const socket = connection.socket;
+ activeLogConnections.add(socket);
+
+ // 发送欢迎消息
+ socket.send(JSON.stringify({
+ type: 'connected',
+ message: '已连接到日志流'
+ }));
+
+ // 心跳处理
+ const heartbeatInterval = setInterval(() => {
+ if (socket.readyState === WebSocket.OPEN) {
+ socket.send(JSON.stringify({ type: 'pong' }));
+ } else {
+ clearInterval(heartbeatInterval);
+ }
+ }, 30000);
+
+ socket.on('message', async (message) => {
+ try {
+ const data = JSON.parse(message);
+
+ if (data.action === 'subscribe') {
+ await streamLogs(socket, data.lines || 50);
+ } else if (data.action === 'clear') {
+ // 清空日志
+ socket.send(JSON.stringify({ type: 'cleared' }));
+ }
+ } catch (e) {
+ socket.send(JSON.stringify({
+ type: 'error',
+ message: e.message
+ }));
+ }
+ });
+
+ socket.on('close', () => {
+ clearInterval(heartbeatInterval);
+ activeLogConnections.delete(socket);
+ });
+}
+
+async function streamLogs(socket, lines) {
+ try {
+ const logDir = path.join(process.cwd(), 'logs');
+ const files = await fs.readdir(logDir);
+ const logFiles = files
+ .filter(f => f.endsWith('.log.txt'))
+ .sort()
+ .reverse();
+
+ if (logFiles.length === 0) {
+ socket.send(JSON.stringify({
+ type: 'error',
+ message: '没有日志文件'
+ }));
+ return;
+ }
+
+ const latestLog = path.join(logDir, logFiles[0]);
+ const content = await fs.readFile(latestLog, 'utf-8');
+ const allLines = content.trim().split('\\n');
+ const lastLines = allLines.slice(-lines);
+
+ // 发送现有日志
+ for (const line of lastLines) {
+ if (socket.readyState === WebSocket.OPEN) {
+ socket.send(JSON.stringify({
+ type: 'log',
+ timestamp: Date.now(),
+ content: line
+ }));
+ }
+ }
+
+ socket.send(JSON.stringify({
+ type: 'end',
+ message: `已读取 ${lastLines.length} 行日志`
+ }));
+ } catch (e) {
+ socket.send(JSON.stringify({
+ type: 'error',
+ message: e.message
+ }));
+ }
+}
+```
+
+### 1.3 sourcesController.js
+
+```javascript
+/**
+ * 源管理控制器
+ * 提供源列表、验证、语法检查、模板获取等功能
+ */
+
+import fs from 'fs-extra';
+import path from 'path';
+import vm from 'vm';
+import { resolvePath } from '../../utils/pathHelper.js';
+
+// 导入 drpy 工具
+let jsoup, req;
+try {
+ const htmlParser = await import('../../libs_drpy/htmlParser.js');
+ jsoup = htmlParser.jsoup;
+ const reqModule = await import('../../utils/req.js');
+ req = reqModule.default;
+} catch (e) {
+ console.warn('Failed to import project utils:', e.message);
+}
+
+// 列出所有源
+export async function listSources(req, reply) {
+ try {
+ const jsPath = path.join(process.cwd(), 'spider/js');
+ const catvodPath = path.join(process.cwd(), 'spider/catvod');
+
+ let jsSources = [];
+ let catvodSources = [];
+
+ if (await fs.pathExists(jsPath)) {
+ jsSources = (await fs.readdir(jsPath))
+ .filter(f => f.endsWith('.js'))
+ .sort();
+ }
+
+ if (await fs.pathExists(catvodPath)) {
+ catvodSources = (await fs.readdir(catvodPath))
+ .filter(f => f.endsWith('.js'))
+ .sort();
+ }
+
+ return reply.send({
+ js: jsSources,
+ catvod: catvodSources
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 验证源文件
+export async function validateSpider(req, reply) {
+ try {
+ const { path: filePath } = req.body;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(400).send({
+ isValid: false,
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+ if (!await fs.pathExists(fullPath)) {
+ return reply.code(404).send({
+ isValid: false,
+ error: '文件不存在'
+ });
+ }
+
+ let code = await fs.readFile(fullPath, 'utf-8');
+
+ // 如果是 JS 文件,尝试解码
+ if (filePath.endsWith('.js')) {
+ try {
+ const { decodeDsSource } = await import('../../utils/dsHelper.js');
+ code = await decodeDsSource(code);
+ } catch (e) {
+ // 解码失败,使用原始代码
+ }
+ }
+
+ // 创建沙箱执行
+ const sandbox = {
+ console: { log: () => {} },
+ require: () => {},
+ rule: null
+ };
+
+ try {
+ vm.createContext(sandbox);
+ new vm.Script(code).runInContext(sandbox);
+
+ if (!sandbox.rule) {
+ return reply.send({
+ isValid: false,
+ error: '源文件中缺少 rule 对象'
+ });
+ }
+
+ // 基本验证
+ const required = ['title', 'host', 'url'];
+ const missing = required.filter(k => !sandbox.rule[k]);
+
+ if (missing.length > 0) {
+ return reply.send({
+ isValid: false,
+ error: `rule 对象缺少必填字段: ${missing.join(', ')}`
+ });
+ }
+
+ return reply.send({
+ isValid: true,
+ message: '验证通过'
+ });
+ } catch (e) {
+ return reply.send({
+ isValid: false,
+ error: `执行错误: ${e.message}`
+ });
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 检查语法
+export async function checkSyntax(req, reply) {
+ try {
+ const { path: filePath } = req.body;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(400).send({
+ isValid: false,
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+ let code = await fs.readFile(fullPath, 'utf-8');
+
+ // 如果是 JS 文件,尝试解码
+ if (filePath.endsWith('.js')) {
+ try {
+ const { decodeDsSource } = await import('../../utils/dsHelper.js');
+ code = await decodeDsSource(code);
+ } catch (e) {
+ // 解码失败,使用原始代码
+ }
+ }
+
+ try {
+ new vm.Script(code);
+ return reply.send({
+ isValid: true,
+ message: '语法检查通过'
+ });
+ } catch (e) {
+ return reply.code(400).send({
+ isValid: false,
+ error: `语法错误: ${e.message}`
+ });
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 获取模板
+export async function getTemplate(req, reply) {
+ const template = `/*
+* @File : drpy-node spider template
+* @Author : user
+* @Date : ${new Date().toISOString().split('T')[0]}
+* @Comments :
+*/
+
+var rule = {
+ // 影视|漫画|小说
+ 类型: '影视',
+ // 源标题
+ title: 'Site Name',
+ // 源主域名
+ host: 'https://example.com',
+ // 源主页链接
+ homeUrl: '/latest/',
+ // 源一级列表链接
+ url: '/category/fyclass/page/fypage',
+ // 源搜索链接
+ searchUrl: '/search?wd=**&pg=fypage',
+ // 允许搜索、允许快搜、允许筛选
+ searchable: 2,
+ quickSearch: 0,
+ filterable: 1,
+ // 请求头
+ headers: {
+ 'User-Agent': 'MOBILE_UA',
+ },
+ // 超时时间
+ timeout: 5000,
+ // 静态分类
+ class_name: '电影&电视剧&综艺&动漫',
+ class_url: '1&2&3&4',
+
+ // 是否需要调用免嗅
+ play_parse: true,
+ // 免嗅lazy执行函数
+ lazy: '',
+ // 首页推荐数量
+ limit: 6,
+ // 是否双层列表
+ double: true,
+
+ // 推荐列表
+ 推荐: '.recommend .item;a&&title;img&&src;.remarks&&Text;a&&href',
+ // 一级列表
+ 一级: '.list .item;a&&title;img&&src;.remarks&&Text;a&&href',
+ // 二级详情
+ 二级: {
+ "title": "h1&&Text",
+ "img": ".poster img&&src",
+ "desc": ".desc&&Text",
+ "content": ".content&&Text",
+ "tabs": ".tabs span",
+ "lists": ".playlists ul"
+ },
+ // 搜索
+ 搜索: '.search-result .item;a&&title;img&&src;.remarks&&Text;a&&href',
+}`;
+
+ return reply.send({ template });
+}
+
+function isSafePath(filePath) {
+ return !filePath.includes('..') &&
+ !filePath.includes('~') &&
+ !filePath.startsWith('/') &&
+ !filePath.includes('node_modules');
+}
+```
+
+### 1.4 filesController.js
+
+```javascript
+/**
+ * 文件管理控制器
+ * 提供文件列表、读取、写入、删除功能
+ */
+
+import fs from 'fs-extra';
+import path from 'path';
+import mime from 'mime-types';
+
+// 列出目录
+export async function listDirectory(req, reply) {
+ try {
+ const dirPath = req.query.path || '.';
+
+ if (!isSafePath(dirPath)) {
+ return reply.code(403).send({
+ error: '访问被拒绝'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), dirPath);
+ const files = await fs.readdir(fullPath, { withFileTypes: true });
+
+ const result = files.map(f => ({
+ name: f.name,
+ path: dirPath === '.' ? f.name : `${dirPath}/${f.name}`,
+ isDirectory: f.isDirectory(),
+ size: f.isDirectory() ? undefined : (await fs.stat(path.join(fullPath, f.name))).size
+ }));
+
+ return reply.send({ files: result });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 读取文件
+export async function readFile(req, reply) {
+ try {
+ const { path: filePath } = req.query;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(403).send({
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+
+ if (!await fs.pathExists(fullPath)) {
+ return reply.code(404).send({
+ error: '文件不存在'
+ });
+ }
+
+ const ext = path.extname(filePath).toLowerCase();
+ const imageExts = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.bmp'];
+
+ if (imageExts.includes(ext)) {
+ // 图片文件 - 返回 base64
+ const buffer = await fs.readFile(fullPath);
+ const base64 = buffer.toString('base64');
+ const mimeType = mime.lookup(fullPath) || 'image/png';
+
+ return reply.send({
+ type: 'image',
+ mimeType,
+ dataUrl: `data:${mimeType};base64,${base64}`
+ });
+ }
+
+ // 文本文件
+ let content = await fs.readFile(fullPath, 'utf-8');
+
+ // 如果是 JS 文件,尝试解码
+ if (ext === '.js') {
+ try {
+ const { decodeDsSource } = await import('../../utils/dsHelper.js');
+ content = await decodeDsSource(content);
+ } catch (e) {
+ // 保持原样
+ }
+ }
+
+ return reply.send({
+ type: 'text',
+ content
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 写入文件
+export async function writeFile(req, reply) {
+ try {
+ const { path: filePath, content } = req.body;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(403).send({
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+
+ // 确保目录存在
+ await fs.ensureDir(path.dirname(fullPath));
+
+ // 写入文件
+ await fs.writeFile(fullPath, content, 'utf-8');
+
+ return reply.send({
+ success: true,
+ message: '文件保存成功'
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 删除文件
+export async function deleteFile(req, reply) {
+ try {
+ const { path: filePath } = req.body;
+
+ if (!filePath || !isSafePath(filePath)) {
+ return reply.code(403).send({
+ error: '无效的文件路径'
+ });
+ }
+
+ const fullPath = path.join(process.cwd(), filePath);
+
+ if (!await fs.pathExists(fullPath)) {
+ return reply.code(404).send({
+ error: '文件不存在'
+ });
+ }
+
+ await fs.remove(fullPath);
+
+ return reply.send({
+ success: true,
+ message: '文件删除成功'
+ });
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+function isSafePath(filePath) {
+ return !filePath.includes('..') &&
+ !filePath.includes('~') &&
+ !filePath.startsWith('/') &&
+ !filePath.includes('node_modules') &&
+ !filePath.includes('database.db');
+}
+```
+
+### 1.5 dbController.js
+
+```javascript
+/**
+ * 数据库查询控制器
+ * 提供安全的只读 SQL 查询功能
+ */
+
+import sqlite3pkg from 'node-sqlite3-wasm';
+const { Database } = sqlite3pkg;
+import path from 'path';
+
+// 执行查询
+export async function executeQuery(req, reply) {
+ try {
+ const { sql, params } = req.body;
+
+ if (!sql || !sql.trim()) {
+ return reply.code(400).send({
+ error: 'SQL 查询不能为空'
+ });
+ }
+
+ // 只允许 SELECT 查询
+ const trimmedSql = sql.trim().toLowerCase();
+ if (!trimmedSql.startsWith('select')) {
+ return reply.code(403).send({
+ error: '只允许 SELECT 查询'
+ });
+ }
+
+ // 额外安全检查
+ const dangerousKeywords = ['drop', 'delete', 'insert', 'update', 'alter', 'create', 'truncate'];
+ for (const keyword of dangerousKeywords) {
+ if (trimmedSql.includes(keyword)) {
+ return reply.code(403).send({
+ error: `不允许使用 ${keyword.toUpperCase()} 语句`
+ });
+ }
+ }
+
+ const dbPath = path.join(process.cwd(), 'database.db');
+ const db = new Database(dbPath);
+
+ try {
+ const rows = db.all(sql, params || []);
+ return reply.send({
+ success: true,
+ data: rows,
+ rows: rows.length
+ });
+ } finally {
+ db.close();
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: `SQL 错误: ${e.message}`
+ });
+ }
+}
+
+// 获取表结构
+export async function getTables(req, reply) {
+ try {
+ const dbPath = path.join(process.cwd(), 'database.db');
+ const db = new Database(dbPath);
+
+ try {
+ const tables = db.all("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name");
+ return reply.send({
+ success: true,
+ tables: tables.map(t => t.name)
+ });
+ } finally {
+ db.close();
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+
+// 获取表结构
+export async function getTableSchema(req, reply) {
+ try {
+ const { table } = req.params;
+
+ if (!table) {
+ return reply.code(400).send({
+ error: '表名不能为空'
+ });
+ }
+
+ const dbPath = path.join(process.cwd(), 'database.db');
+ const db = new Database(dbPath);
+
+ try {
+ const schema = db.all(`PRAGMA table_info(${table})`);
+ return reply.send({
+ success: true,
+ table,
+ columns: schema
+ });
+ } finally {
+ db.close();
+ }
+ } catch (e) {
+ reply.code(500).send({
+ error: e.message
+ });
+ }
+}
+```
+
+## 2. admin.js 重构
+
+```javascript
+/**
+ * Admin Controller - 后台管理主控制器
+ * 重构版:移除 MCP 依赖,直接实现业务逻辑
+ */
+
+import path from 'path';
+import fs from 'fs-extra';
+import fastifyStatic from '@fastify/static';
+import { websocketServerConnector } from '@fastify/websocket';
+
+// 导入子控制器
+import * as systemController from './admin/systemController.js';
+import * as logsController from './admin/logsController.js';
+import * as sourcesController from './admin/sourcesController.js';
+import * as filesController from './admin/filesController.js';
+import * as dbController from './admin/dbController.js';
+
+// 配置常量
+const CONFIG_PATH = path.join(process.cwd(), 'config/env.json');
+
+// 导出路由配置
+export default async function adminController(fastify, options, done) {
+ // 注册 WebSocket 插件
+ await fastify.register(websocketServerConnector);
+
+ // ==================== 静态文件服务 ====================
+ const adminDistPath = path.join(process.cwd(), 'apps/admin');
+
+ // 如果编译后的 admin 存在,提供静态文件服务
+ if (await fs.pathExists(adminDistPath)) {
+ fastify.log.info('Serving admin panel from ' + adminDistPath);
+
+ fastify.register(fastifyStatic, {
+ root: adminDistPath,
+ prefix: '/admin/',
+ decorateReply: false,
+ index: ['index.html'],
+ cacheControl: 3600, // 1 小时缓存
+ etag: true
+ });
+ }
+
+ // ==================== 系统管理 API ====================
+ fastify.get('/api/admin/health', systemController.getHealth);
+ fastify.post('/api/admin/restart', systemController.restartService);
+
+ // ==================== 日志 API ====================
+ fastify.get('/api/admin/logs', logsController.getLogs);
+ fastify.register(async function (fastify) {
+ fastify.get('/api/admin/logs/stream', { websocket: true }, logsController.handleLogStream);
+ });
+
+ // ==================== 配置管理 API ====================
+ fastify.get('/api/admin/config', getConfig);
+ fastify.post('/api/admin/config', updateConfig);
+ fastify.get('/api/admin/env', getEnv);
+
+ // ==================== 源管理 API ====================
+ fastify.get('/api/admin/sources', sourcesController.listSources);
+ fastify.post('/api/admin/sources/validate', sourcesController.validateSpider);
+ fastify.post('/api/admin/sources/syntax', sourcesController.checkSyntax);
+ fastify.get('/api/admin/sources/template', sourcesController.getTemplate);
+ fastify.get('/api/admin/sources/libs', sourcesController.getLibsInfo);
+
+ // ==================== 文件管理 API ====================
+ fastify.get('/api/admin/files/list', filesController.listDirectory);
+ fastify.get('/api/admin/files/read', filesController.readFile);
+ fastify.post('/api/admin/files/write', filesController.writeFile);
+ fastify.delete('/api/admin/files/delete', filesController.deleteFile);
+
+ // ==================== 数据库 API ====================
+ fastify.post('/api/admin/db/query', dbController.executeQuery);
+ fastify.get('/api/admin/db/tables', dbController.getTables);
+ fastify.get('/api/admin/db/tables/:table/schema', dbController.getTableSchema);
+
+ // ==================== 路由信息 API ====================
+ fastify.get('/api/admin/routes', getRoutesInfo);
+
+ done();
+}
+
+// ==================== 辅助函数 ====================
+
+async function getConfig(req, reply) {
+ try {
+ const { key } = req.query;
+
+ if (!await fs.pathExists(CONFIG_PATH)) {
+ return reply.send({});
+ }
+
+ const configContent = await fs.readFile(CONFIG_PATH, 'utf-8');
+ const config = JSON.parse(configContent);
+
+ if (key) {
+ const keys = key.split('.');
+ let value = config;
+ for (const k of keys) {
+ value = value?.[k];
+ }
+ return reply.send(value !== undefined ? value : null);
+ }
+
+ return reply.send(config);
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+
+async function updateConfig(req, reply) {
+ try {
+ const { key, value } = req.body;
+
+ if (!key) {
+ return reply.code(400).send({ error: 'Key is required' });
+ }
+
+ if (!await fs.pathExists(CONFIG_PATH)) {
+ return reply.code(404).send({ error: 'Config file not found' });
+ }
+
+ const configContent = await fs.readFile(CONFIG_PATH, 'utf-8');
+ let config = JSON.parse(configContent);
+
+ // 设置嵌套值
+ const keys = key.split('.');
+ let target = config;
+ for (let i = 0; i < keys.length - 1; i++) {
+ if (!target[keys[i]]) {
+ target[keys[i]] = {};
+ }
+ target = target[keys[i]];
+ }
+
+ // 尝试解析为 JSON
+ let parsedValue = value;
+ try {
+ parsedValue = JSON.parse(value);
+ } catch {
+ // 保持字符串
+ }
+
+ target[keys[keys.length - 1]] = parsedValue;
+
+ // 写回文件
+ await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));
+
+ return reply.send({
+ success: true,
+ message: `配置项 ${key} 已更新`
+ });
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+
+async function getEnv(req, reply) {
+ try {
+ const envData = {};
+
+ // 从 process.env 读取关键配置
+ const keys = [
+ 'PORT', 'NODE_ENV', 'MAX_TEXT_SIZE', 'MAX_IMAGE_SIZE',
+ 'QUARK_COOKIE', 'ALI_TOKEN', 'bili_cookie'
+ ];
+
+ for (const key of keys) {
+ if (process.env[key]) {
+ envData[key] = process.env[key];
+ }
+ }
+
+ return reply.send(envData);
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+
+async function getRoutesInfo(req, reply) {
+ try {
+ const indexControllerPath = path.join(process.cwd(), 'controllers/index.js');
+
+ if (!await fs.pathExists(indexControllerPath)) {
+ return reply.send({
+ file: 'controllers/index.js',
+ registered_controllers: []
+ });
+ }
+
+ const content = await fs.readFile(indexControllerPath, 'utf-8');
+ const lines = content.split('\n');
+ const registered = lines
+ .filter(l => l.trim().startsWith('fastify.register('))
+ .map(l => l.trim());
+
+ return reply.send({
+ file: 'controllers/index.js',
+ registered_controllers: registered
+ });
+ } catch (e) {
+ reply.code(500).send({ error: e.message });
+ }
+}
+```
+
+## 3. 前端 API 客户端
+
+### 3.1 src/api/admin.js
+
+```javascript
+/**
+ * Admin API 统一调用接口
+ * 所有后台管理 API 都通过这个模块调用
+ */
+
+import client from './client';
+
+export const adminApi = {
+ // ==================== 系统 ====================
+ async getHealth() {
+ return client.get('/api/admin/health');
+ },
+
+ async restartService() {
+ return client.post('/api/admin/restart');
+ },
+
+ // ==================== 日志 ====================
+ async getLogs(lines = 50) {
+ return client.get('/api/admin/logs', { params: { lines } });
+ },
+
+ // WebSocket 连接在组件中直接使用
+
+ // ==================== 配置 ====================
+ async getConfig(key) {
+ return client.get('/api/admin/config', { params: { key } });
+ },
+
+ async updateConfig(key, value) {
+ return client.post('/api/admin/config', { key, value });
+ },
+
+ async getEnv() {
+ return client.get('/api/admin/env');
+ },
+
+ // ==================== 源管理 ====================
+ async listSources() {
+ return client.get('/api/admin/sources');
+ },
+
+ async validateSource(path) {
+ return client.post('/api/admin/sources/validate', { path });
+ },
+
+ async checkSyntax(path) {
+ return client.post('/api/admin/sources/syntax', { path });
+ },
+
+ async getTemplate() {
+ return client.get('/api/admin/sources/template');
+ },
+
+ async getLibsInfo() {
+ return client.get('/api/admin/sources/libs');
+ },
+
+ // ==================== 文件管理 ====================
+ async listDirectory(path) {
+ return client.get('/api/admin/files/list', { params: { path } });
+ },
+
+ async readFile(path) {
+ return client.get('/api/admin/files/read', { params: { path } });
+ },
+
+ async writeFile(path, content) {
+ return client.post('/api/admin/files/write', { path, content });
+ },
+
+ async deleteFile(path) {
+ return client.delete('/api/admin/files/delete', { params: { path } });
+ },
+
+ // ==================== 数据库 ====================
+ async executeQuery(sql) {
+ return client.post('/api/admin/db/query', { sql });
+ },
+
+ async getTables() {
+ return client.get('/api/admin/db/tables');
+ },
+
+ async getTableSchema(table) {
+ return client.get(`/api/admin/db/tables/${table}/schema`);
+ },
+
+ // ==================== 路由信息 ====================
+ async getRoutes() {
+ return client.get('/api/admin/routes');
+ }
+};
+```
+
+### 3.2 其他 API 文件重构
+
+```javascript
+// src/api/system.js - 重构
+import { adminApi } from './admin';
+
+export const systemApi = {
+ async checkHealth() {
+ const result = await adminApi.getHealth();
+ return result;
+ },
+
+ async restartService() {
+ const result = await adminApi.restartService();
+ return result;
+ },
+
+ async fetchRoutes() {
+ const result = await adminApi.getRoutes();
+ return result;
+ },
+
+ async fetchSources() {
+ const result = await adminApi.listSources();
+ // 保持与原有格式兼容
+ return result;
+ }
+};
+
+// src/api/spider.js - 重构
+import { adminApi } from './admin';
+
+export const spiderApi = {
+ async listSources() {
+ const result = await adminApi.listSources();
+ // 保持与原有格式兼容
+ return {
+ js: result.js || [],
+ catvod: result.catvod || []
+ };
+ },
+
+ async validateSpider(path) {
+ const result = await adminApi.validateSource(path);
+ // 保持与原有格式兼容
+ if (result.isValid) {
+ return { isError: false, content: [{ text: result.message || '验证通过' }] };
+ } else {
+ return { isError: true, content: [{ text: result.error }] };
+ }
+ },
+
+ async checkSyntax(path) {
+ const result = await adminApi.checkSyntax(path);
+ // 保持与原有格式兼容
+ if (result.isValid) {
+ return { isError: false, content: [{ text: result.message || '语法正确' }] };
+ } else {
+ return { isError: true, content: [{ text: result.error }] };
+ }
+ },
+
+ async getTemplate() {
+ const result = await adminApi.getTemplate();
+ return result.template;
+ },
+
+ async debugRule(params) {
+ // 如果需要调试功能,需要额外实现
+ // 暂时返回不支持的提示
+ return {
+ isError: true,
+ content: [{ text: '调试功能暂未实现' }]
+ };
+ }
+};
+
+// src/api/file.js - 重构
+import { adminApi } from './admin';
+
+export const fileApi = {
+ async listDirectory(path = '.') {
+ const result = await adminApi.listDirectory(path);
+ // 保持与原有格式兼容
+ return result;
+ },
+
+ async readFile(path) {
+ const result = await adminApi.readFile(path);
+ return result;
+ },
+
+ async writeFile(path, content) {
+ const result = await adminApi.writeFile(path, content);
+ return result;
+ },
+
+ async deleteFile(path) {
+ const result = await adminApi.deleteFile(path);
+ return result;
+ }
+};
+
+// src/api/db.js - 新增
+import { adminApi } from './admin';
+
+export const dbApi = {
+ async query(sql) {
+ const result = await adminApi.executeQuery(sql);
+ return result.data;
+ },
+
+ async getTables() {
+ const result = await adminApi.getTables();
+ return result.tables;
+ },
+
+ async getTableSchema(table) {
+ const result = await adminApi.getTableSchema(table);
+ return result.columns;
+ }
+};
+```
+
+## 4. Vite 配置调整
+
+### 4.1 vite.config.js
+
+```javascript
+import { fileURLToPath } from 'url';
+import { defineConfig } from 'vite';
+import vue from '@vitejs/plugin-vue';
+import path from 'path';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
+export default defineConfig({
+ plugins: [vue()],
+
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, 'src')
+ }
+ },
+
+ // 构建配置
+ build: {
+ outDir: path.resolve(__dirname, '../apps/admin'),
+ emptyOutDir: true,
+ rollupOptions: {
+ output: {
+ manualChunks: {
+ 'vendor': ['vue', 'vue-router', 'pinia'],
+ 'ui': ['axios']
+ }
+ }
+ },
+ chunkSizeWarningLimit: 1000
+ },
+
+ // 开发服务器配置
+ server: {
+ port: 5174,
+ proxy: {
+ // 所有 API 请求代理到 drpy-node
+ '/api': {
+ target: 'http://localhost:5757',
+ changeOrigin: true
+ },
+ // WebSocket 代理
+ '/api/admin/logs/stream': {
+ target: 'ws://localhost:5757',
+ ws: true
+ }
+ }
+ },
+
+ // 基础路径
+ base: '/admin/'
+});
+```
+
+## 5. 测试计划
+
+### 5.1 API 测试用例
+
+```javascript
+// tests/api/admin.test.js
+import { describe, it, expect, beforeAll, afterAll } from 'vitest';
+import { build } from 'vite';
+import { fileURLToPath } from 'url';
+import { $fetch } from 'island-fetch';
+
+describe('Admin API', () => {
+ let baseUrl;
+
+ beforeAll(async () => {
+ // 启动测试服务器
+ baseUrl = 'http://localhost:5757/api/admin';
+ });
+
+ describe('GET /health', () => {
+ it('should return health status', async () => {
+ const response = await $fetch(`${baseUrl}/health`);
+ const data = await response.json();
+
+ expect(data.status).toBe('ok');
+ expect(data.version).toBeDefined();
+ });
+ });
+
+ describe('GET /sources', () => {
+ it('should return list of sources', async () => {
+ const response = await $fetch(`${baseUrl}/sources`);
+ const data = await response.json();
+
+ expect(data.js).toBeInstanceOf(Array);
+ expect(data.catvod).toBeInstanceOf(Array);
+ });
+ });
+
+ describe('POST /sources/syntax', () => {
+ it('should check syntax of spider file', async () => {
+ const response = await $fetch(`${baseUrl}/sources/syntax`, {
+ method: 'POST',
+ body: JSON.stringify({
+ path: 'spider/js/_test.js'
+ })
+ });
+ const data = await response.json();
+
+ expect(data.isValid).toBeDefined();
+ });
+ });
+
+ // 更多测试用例...
+});
+```
+
+## 6. 部署脚本
+
+### 6.1 构建脚本
+
+```javascript
+// scripts/build-admin.js
+import { execSync } from 'child_process';
+import fs from 'fs-extra';
+import path from 'path';
+
+console.log('🔨 开始构建 drpy-node-admin...');
+
+// 1. 进入 admin 目录
+process.chdir(path.join(process.cwd(), 'drpy-node-admin'));
+
+// 2. 安装依赖(如果需要)
+if (!fs.existsSync('node_modules')) {
+ console.log('📦 安装依赖...');
+ execSync('npm install', { stdio: 'inherit' });
+}
+
+// 3. 构建
+console.log('🏗️ 构建生产版本...');
+execSync('npm run build', { stdio: 'inherit' });
+
+// 4. 验证构建结果
+const adminDistPath = path.join(process.cwd(), '../apps/admin');
+if (!fs.existsSync(adminDistPath)) {
+ console.error('❌ 构建失败:未找到输出目录');
+ process.exit(1);
+}
+
+const indexHtml = path.join(adminDistPath, 'index.html');
+if (!fs.existsSync(indexHtml)) {
+ console.error('❌ 构建失败:未找到 index.html');
+ process.exit(1);
+}
+
+console.log('✅ 构建成功!');
+console.log(`📂 输出目录: ${adminDistPath}`);
+console.log('');
+console.log('现在可以通过以下地址访问管理面板:');
+console.log(' http://localhost:5757/admin/');
+```
+
+## 7. 兼容性过渡方案
+
+### 7.1 MCP 兼容层(可选)
+
+```javascript
+// 在 admin.js 中添加兼容层(可配置开关)
+const ENABLE_MCP_COMPAT = process.env.ENABLE_MCP_COMPAT === 'true';
+
+// 兼容 MCP 格式的接口
+if (ENABLE_MCP_COMPAT) {
+ fastify.post('/admin/mcp', async (req, reply) => {
+ const { name, arguments: args } = req.body;
+
+ // 映射到新 API
+ const apiMapping = {
+ 'read_logs': () => logsController.getLogs(req, reply),
+ 'restart_service': () => systemController.restartService(req, reply),
+ 'list_sources': () => sourcesController.listSources(req, reply),
+ // ... 其他映射
+ };
+
+ const handler = apiMapping[name];
+ if (handler) {
+ return handler();
+ }
+
+ return reply.code(404).send({ error: 'Tool not found' });
+ });
+}
+```
diff --git a/drpy-node-admin/README.md b/drpy-node-admin/README.md
new file mode 100644
index 00000000..3e3c6722
--- /dev/null
+++ b/drpy-node-admin/README.md
@@ -0,0 +1,197 @@
+# DRPY Node Admin
+
+drpy-node 后台管理界面 - 基于 Vue3 + Tailwind CSS 构建的现代化管理系统。
+
+## 功能特性
+
+- 🎨 现代化 UI 设计,支持亮色/暗色主题
+- 📱 完全响应式,适配 PC 和移动端
+- 🚀 基于 Vite 构建,快速开发体验
+- 🔧 环境变量可视化配置
+- 📦 源文件管理和验证
+- 📋 实时日志查看
+- 📚 API 文档查看
+- 📁 文件浏览和编辑
+- 🗄️ 数据库查询
+
+## 开发
+
+```bash
+# 安装依赖
+npm install
+
+# 启动开发服务器
+npm run dev
+
+# 构建生产版本
+npm run build
+
+# 预览生产构建
+npm run preview
+```
+
+## 技术栈
+
+- **Vue 3** - 渐进式 JavaScript 框架
+- **Vite** - 下一代前端构建工具
+- **Tailwind CSS** - 实用优先的 CSS 框架
+- **Vue Router** - 官方路由管理
+- **Pinia** - Vue 3 状态管理
+- **Axios** - HTTP 客户端
+
+## 项目结构
+
+```
+drpy-node-admin/
+├── src/
+│ ├── api/ # API 接口
+│ ├── components/ # 公共组件
+│ ├── router/ # 路由配置
+│ ├── stores/ # Pinia 状态管理
+│ ├── utils/ # 工具函数
+│ ├── views/ # 页面组件
+│ ├── App.vue # 根组件
+│ ├── main.js # 入口文件
+│ └── style.css # 全局样式
+├── public/ # 静态资源
+├── index.html # HTML 模板
+├── vite.config.js # Vite 配置
+├── tailwind.config.js # Tailwind 配置
+└── package.json # 项目配置
+```
+
+## SPA 集成与部署 (重要)
+
+本项目被设计为 drpy-node 的一个子应用 (SPA 插件),默认部署在 `/apps/admin/` 路径下。为了确保单页面应用(SPA)在子目录下正常运行并解决刷新 404 问题,采用了与 `drplayer` 一致的配置模式。
+
+### 1. 关键配置
+
+#### 环境变量 (.env.production.apps)
+用于指定生产构建时的基础路径:
+```env
+# 子目录部署配置 - 部署到 /apps/admin/ 目录
+VITE_BASE_PATH=/apps/admin/
+```
+
+#### Vite 配置 (vite.config.js)
+构建配置会自动读取环境变量中的 `VITE_BASE_PATH`:
+```javascript
+// 基础路径:优先使用环境变量 VITE_BASE_PATH,否则使用默认值
+base: mode.includes('production') ? (env.VITE_BASE_PATH || './') : '/'
+```
+
+#### 路由配置 (src/router/index.js)
+Vue Router 必须使用与 `base` 一致的 History 模式,否则会导致路由跳转失效或刷新白屏:
+```javascript
+const router = createRouter({
+ // 必须传入 base 路径
+ history: createWebHistory(import.meta.env.VITE_BASE_PATH || import.meta.env.BASE_URL),
+ routes
+})
+```
+
+### 2. 后端集成 (drpy-node)
+
+后端通过 `controllers/static.js` 和 `controllers/fastify-spa-routes.js` 提供支持:
+
+1. **静态资源服务**:`fastify-static` 将 `apps` 目录映射到 `/apps/` 路由。
+2. **SPA 路由回退**:`addSPARoutes` 插件拦截 `/apps/admin/*` 的请求,当请求的资源不存在时(如刷新页面),自动返回 `/apps/admin/index.html`,由前端路由接管。
+
+```javascript
+// controllers/static.js
+fastify.register(addSPARoutes, {
+ appsDir: options.appsDir,
+ spaApps: ['drplayer', 'admin'] // 注册为 SPA 应用
+});
+```
+
+### 3. 构建与发布
+
+**请务必使用以下命令进行构建,以确保加载正确的环境变量:**
+
+```bash
+# 在 drpy-node-admin 目录下
+npm run build:apps
+
+# 或者在项目根目录下
+npm run admin:build
+```
+
+构建产物将输出到 `../apps/admin` 目录,可以直接被 drpy-node 服务加载。
+
+## 与 drpy-node 集成
+
+Admin 面板通过 drpy-node-mcp 与主项目通信,需要后端提供相应的 API 接口。
+
+### 日志功能说明
+
+日志查看页面使用 WebSocket 实时接收后端日志。确保:
+
+1. **开发环境**:
+ - 后端服务器运行在 `http://localhost:5757`
+ - Vite 开发服务器自动代理 `/ws` 请求到后端
+
+2. **生产环境**:
+ - 确保后端的 `/ws` 端点可访问
+ - 如果前后端分离部署,配置 `VITE_BACKEND_URL` 环境变量
+ - 示例:`VITE_BACKEND_URL=http://your-backend:5757`
+
+### 部署说明
+
+#### 开发环境
+```bash
+# 终端 1: 启动后端
+npm run dev
+
+# 终端 2: 启动前端
+cd drpy-node-admin
+npm run dev
+```
+
+#### 生产环境
+```bash
+# 构建前端
+cd drpy-node-admin
+npm run build
+
+# 将 dist 目录部署到静态服务器
+# 或配置反向代理将 /admin 请求指向 dist 目录
+```
+
+#### Nginx 配置示例
+```nginx
+server {
+ listen 80;
+ server_name your-domain.com;
+
+ # 主服务
+ location / {
+ proxy_pass http://localhost:5757;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_set_header Host $host;
+ proxy_cache_bypass $http_upgrade;
+ }
+
+ # WebSocket 支持
+ location /ws {
+ proxy_pass http://localhost:5757;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_set_header Host $host;
+ proxy_cache_bypass $http_upgrade;
+ }
+
+ # Admin 面板
+ location /admin {
+ alias /path/to/drpy-node-admin/dist;
+ try_files $uri $uri/ /admin/index.html;
+ }
+}
+```
+
+## License
+
+MIT
diff --git a/drpy-node-admin/ROADMAP.md b/drpy-node-admin/ROADMAP.md
new file mode 100644
index 00000000..c42f1385
--- /dev/null
+++ b/drpy-node-admin/ROADMAP.md
@@ -0,0 +1,433 @@
+# drpy-node-admin 解耦重构规划文档
+
+## 📋 文档目录
+
+本目录包含 drpy-node-admin 解耦与 SPA 插件化重构的完整规划文档:
+
+1. **SPEC.md** - 总体规划与架构设计
+2. **IMPLEMENTATION.md** - 详细实现指南与代码示例
+3. **API.md** - REST API 接口完整文档
+4. **ROADMAP.md** - 本文件,实施路线图
+
+---
+
+## 🎯 重构目标
+
+### 当前问题
+
+```
+┌─────────────────────────────────────────────────────┐
+│ 当前架构 │
+├─────────────────────────────────────────────────────┤
+│ │
+│ drpy-node-admin │
+│ │ │
+│ ├──→ /admin/mcp (调用 MCP 工具) │
+│ │ │
+│ drpy-node │
+│ │ │
+│ └──→ import('../drpy-node-mcp/tools/*.js') ❌ │
+│ │
+│ drpy-node-mcp (独立项目) │
+│ │ │
+│ └──→ 依赖 drpy-node (仅用于开发调试) │
+│ │
+└─────────────────────────────────────────────────────┘
+```
+
+**核心问题**: drpy-node 作为主服务,不应该依赖 drpy-node-mcp
+
+### 目标架构
+
+```
+┌─────────────────────────────────────────────────────┐
+│ 目标架构 │
+├─────────────────────────────────────────────────────┤
+│ │
+│ drpy-node (主服务) │
+│ │ │
+│ ├──→ /api/admin/* (REST API) │
+│ │ │
+│ ├──→ /admin/* (静态文件) │
+│ │ │
+│ └──→ apps/admin/ (编译后的 SPA) ✓ │
+│ │
+│ drpy-node-admin (开发时) │
+│ │ │
+│ └──→ npm run dev (开发服务器) │
+│ │
+│ drpy-node-mcp (独立项目) │
+│ │ │
+│ └──→ 依赖 drpy-node 的 API (可选) │
+│ │
+└─────────────────────────────────────────────────────┘
+```
+
+---
+
+## 📊 变更概览
+
+### drpy-node 变更
+
+| 操作 | 文件路径 | 说明 |
+|-----|---------|------|
+| **重构** | `controllers/admin.js` | 移除 MCP 依赖,实现直接业务逻辑 |
+| **新增** | `controllers/admin/*.js` | 6 个子控制器模块 |
+| **新增** | `utils/admin/*.js` | 3 个工具模块 |
+| **新增** | `apps/admin/` | 编译后的 SPA 静态文件 |
+
+### drpy-node-admin 变更
+
+| 操作 | 文件路径 | 说明 |
+|-----|---------|------|
+| **重构** | `src/api/*.js` | 所有 API 调用改用 REST API |
+| **新增** | `src/api/admin.js` | 统一 API 调用模块 |
+| **修改** | `vite.config.js` | 输出目录改为 `../apps/admin` |
+| **修改** | `src/stores/*.js` | 适配新的 API 响应格式 |
+
+---
+
+## 🚀 实施路线图
+
+### Phase 1: 后端 API 实现 (2-3 天)
+
+**目标**: 实现所有必需的 REST API 接口
+
+#### 步骤 1.1: 创建子控制器 (1 天)
+```
+✓ controllers/admin/systemController.js - 系统管理
+✓ controllers/admin/logsController.js - 日志管理
+✓ controllers/admin/sourcesController.js - 源管理
+✓ controllers/admin/filesController.js - 文件管理
+✓ controllers/admin/dbController.js - 数据库查询
+✓ controllers/admin/routesController.js - 路由信息
+```
+
+#### 步骤 1.2: 重构 admin.js (0.5 天)
+```
+✓ 移除 import('../drpy-node-mcp/...') 代码
+✓ 注册子控制器路由
+✓ 实现 WebSocket 日志流
+✓ 添加静态文件服务
+```
+
+#### 步骤 1.3: 创建工具模块 (0.5 天)
+```
+✓ utils/admin/logReader.js - 日志读取
+✓ utils/admin/configManager.js - 配置管理
+✓ utils/admin/fileValidator.js - 路径安全验证
+```
+
+#### 步骤 1.4: 测试 API (0.5 天)
+```
+✓ 使用 Postman/Thunder 测试所有 API
+✓ 验证响应格式正确性
+✓ 测试 WebSocket 连接
+```
+
+---
+
+### Phase 2: 前端适配 (1-2 天)
+
+**目标**: 前端改用新的 REST API
+
+#### 步骤 2.1: 创建 admin API 模块 (0.5 天)
+```
+✓ src/api/admin.js - 统一 API 调用
+```
+
+#### 步骤 2.2: 重构现有 API 模块 (0.5 天)
+```
+✓ src/api/system.js - 系统相关
+✓ src/api/spider.js - 源管理
+✓ src/api/file.js - 文件管理
+✓ src/api/db.js - 数据库查询 (新增)
+```
+
+#### 步骤 2.3: 调整 Vite 配置 (0.5 天)
+```
+✓ 修改 build.outDir 为 ../apps/admin
+✓ 修改 base 为 /admin/
+✓ 调整 proxy 配置
+```
+
+#### 步骤 2.4: 前端测试 (0.5 天)
+```
+✓ 开发模式测试所有功能
+✓ 验证 API 调用正常
+✓ 测试 WebSocket 日志流
+```
+
+---
+
+### Phase 3: 构建与集成 (1 天)
+
+**目标**: 完成 SPA 插件构建和集成
+
+#### 步骤 3.1: 配置构建脚本 (0.3 天)
+```
+✓ 添加 scripts/build-admin.js
+✓ 更新 package.json 脚本
+```
+
+#### 步骤 3.2: 构建并验证 (0.3 天)
+```
+✓ npm run admin:build
+✓ 验证 apps/admin/ 目录生成
+✓ 检查 index.html 和 assets
+```
+
+#### 步骤 3.3: 集成测试 (0.4 天)
+```
+✓ 启动 drpy-node 服务
+✓ 访问 http://localhost:5757/admin/
+✓ 全面功能测试
+✓ 性能测试
+```
+
+---
+
+### Phase 4: 清理与优化 (可选,1 天)
+
+**目标**: 移除 MCP 依赖,优化代码
+
+#### 步骤 4.1: 移除 MCP 兼容层
+```
+✓ 移除 /admin/mcp 端点
+✓ 清理相关注释
+```
+
+#### 步骤 4.2: 代码优化
+```
+✓ 提取公共逻辑
+✓ 添加错误处理
+✓ 完善日志记录
+```
+
+#### 步骤 4.3: 文档更新
+```
+✓ 更新 README.md
+✓ 更新 API.md
+✓ 添加部署文档
+```
+
+---
+
+## 📁 文件清单
+
+### 新增文件 (drpy-node)
+
+```
+drpy-node/
+├── controllers/admin/
+│ ├── systemController.js ← 新增
+│ ├── logsController.js ← 新增
+│ ├── sourcesController.js ← 新增
+│ ├── filesController.js ← 新增
+│ ├── dbController.js ← 新增
+│ └── routesController.js ← 新增
+└── utils/admin/
+ ├── logReader.js ← 新增
+ ├── configManager.js ← 新增
+ └── fileValidator.js ← 新增
+```
+
+### 修改文件 (drpy-node)
+
+```
+drpy-node/
+└── controllers/
+ └── admin.js ← 重构
+```
+
+### 新增文件 (drpy-node-admin)
+
+```
+drpy-node-admin/
+└── src/api/
+ └── admin.js ← 新增
+```
+
+### 修改文件 (drpy-node-admin)
+
+```
+drpy-node-admin/
+├── src/api/
+│ ├── client.js ← 修改 baseURL
+│ ├── system.js ← 重构 API 调用
+│ ├── spider.js ← 重构 API 调用
+│ └── file.js ← 重构 API 调用
+└── vite.config.js ← 修改构建配置
+```
+
+---
+
+## 🔄 数据流变化
+
+### 之前(MCP 方式)
+
+```
+drpy-node-admin
+ │
+ │ POST /admin/mcp
+ │ { "name": "list_sources", "arguments": {} }
+ ↓
+drpy-node (admin.js)
+ │
+ │ import('../drpy-node-mcp/tools/spiderTools.js')
+ ↓
+drpy-node-mcp
+ │
+ │ return { content: [{ type: "text", text: JSON.stringify(...) }] }
+ ↓
+drpy-node-admin
+ │
+ │ JSON.parse(response.content[0].text)
+```
+
+### 之后(REST API 方式)
+
+```
+drpy-node-admin
+ │
+ │ GET /api/admin/sources
+ ↓
+drpy-node (admin.js)
+ │
+ │ 直接调用 sourcesController.listSources()
+ │
+ │ return { js: [...], catvod: [...] }
+ ↓
+drpy-node-admin
+```
+
+---
+
+## 🎨 前端开发体验
+
+### 开发模式
+
+```bash
+# 终端 1: 启动 drpy-node
+npm run dev
+
+# 终端 2: 启动 drpy-node-admin 开发服务器
+cd drpy-node-admin
+npm run dev
+
+# 访问: http://localhost:5174/
+# API 请求自动代理到 http://localhost:5757
+```
+
+### 构建生产版本
+
+```bash
+cd drpy-node-admin
+npm run build
+
+# 输出到: ../apps/admin/
+# 包含: index.html, assets/*.js, assets/*.css
+```
+
+### 部署验证
+
+```bash
+# 启动 drpy-node
+npm run dev
+
+# 访问: http://localhost:5757/admin/
+```
+
+---
+
+## 🔍 关键决策点
+
+### 决策 1: WebSocket 实现
+
+**选择**: 使用 @fastify/websocket
+
+**原因**:
+- drpy-node 已使用 Fastify
+- @fastify/websocket 官方插件
+- 与现有架构兼容
+
+**替代方案**:
+- Socket.io (需要额外依赖)
+- 原生 WebSocket (需要手动处理)
+
+### 决策 2: 文件上传方式
+
+**选择**: 使用 POST JSON body 传输内容
+
+**限制**:
+- 适合中小文件
+- 不支持大文件上传
+
+**如果需要大文件支持**:
+- 可考虑 multipart/form-data
+- 或分片上传
+
+### 决策 3: 路径安全
+
+**策略**:
+- 白名单方式(只允许特定目录)
+- 禁止路径遍历(..)
+- 禁止敏感文件
+
+### 决策 4: SQL 安全
+
+**策略**:
+- 只允许 SELECT 查询
+- 关键词黑名单过滤
+- 参数化查询(如需要)
+
+---
+
+## 📈 成功指标
+
+### 功能完整性
+- [ ] 所有现有功能可正常使用
+- [ ] API 响应时间与之前相当
+- [ ] WebSocket 日志流稳定
+
+### 代码质量
+- [ ] 无 MCP 依赖
+- [ ] 代码结构清晰
+- [ ] 有适当的错误处理
+
+### 可维护性
+- [ ] API 文档完整
+- [ ] 代码注释充分
+- [ ] 易于扩展
+
+---
+
+## 🎯 下一步行动
+
+1. **审查文档**
+ - 仔细阅读 SPEC.md
+ - 理解 IMPLEMENTATION.md 中的代码示例
+ - 熟悉 API.md 中的接口规范
+
+2. **确认计划**
+ - 评估时间估算是否合理
+ - 确认技术方案可行
+ - 提出调整建议(如有)
+
+3. **开始实施**
+ - 按照 Phase 1 → Phase 2 → Phase 3 顺序执行
+ - 每个阶段完成后进行测试
+ - 遇到问题及时调整
+
+---
+
+## 📞 联系与反馈
+
+如有疑问或需要调整,请及时沟通。在开始实施前,请确保:
+
+1. ✅ 已完整阅读所有规划文档
+2. ✅ 理解技术方案和架构设计
+3. ✅ 确认实施计划和时间安排
+4. ✅ 了解风险和应对措施
+
+**准备好后,请指示开始实施!**
diff --git a/drpy-node-admin/SPEC.md b/drpy-node-admin/SPEC.md
new file mode 100644
index 00000000..22ea3dec
--- /dev/null
+++ b/drpy-node-admin/SPEC.md
@@ -0,0 +1,581 @@
+# drpy-node-admin 解耦与 SPA 插件化重构 SPEC
+
+## 1. 项目概述
+
+### 1.1 当前状态
+- **drpy-node-admin**: 独立的 Vue 3 后台管理项目
+- **数据依赖**: 通过 MCP (Model Context Protocol) 工具调用 drpy-node 功能
+- **耦合问题**: admin.js 中动态导入 `drpy-node-mcp` 模块,违反依赖方向
+
+### 1.2 目标架构
+```
+┌─────────────────────────────────────────────────────────────┐
+│ drpy-node │
+│ ┌──────────────┐ ┌───────────────┐ ┌──────────────┐ │
+│ │ Core APIs │ │ Controllers │ │ Static │ │
+│ │ │ │ │ │ Files │ │
+│ │ - /api/* │◄─┤ - admin.js │◄─┤ /apps/admin │ │
+│ │ - /admin/* │ │ - api.js │ │ │ │
+│ │ │ │ - config.js │ │ - index.html │ │
+│ │ │ │ - ... │ │ - assets/* │ │
+│ └──────────────┘ └───────────────┘ └──────────────┘ │
+│ ▲ ▲ │
+│ │ │ │
+│ └──────────────┬─────────────────────┘ │
+│ │ │
+│ ┌─────────────────────────────────────────────────────────┐│
+│ │ drpy-node-admin (SPA Plugin) ││
+│ │ ┌─────────┐ ┌──────────┐ ┌────────────┐ ││
+│ │ │ Views │ │ Stores │ │Components │ ││
+│ │ └────┬────┘ └────┬─────┘ └──────┬─────┘ ││
+│ │ │ │ │ ││
+│ │ └──────┬─────┴───────────────┴────┐ ││
+│ │ │ API Client (axios) │ ││
+│ │ └───────────┬─────────────┘ ││
+│ │ │ ││
+│ │ ┌───────────┴─────────────┐ ││
+│ │ │ REST API Interface │ ││
+│ │ │ /api/admin/* │ ││
+│ │ └──────────────────────────┘ ││
+│ └─────────────────────────────────────────────────────────┘│
+└─────────────────────────────────────────────────────────────┘
+
+ ▲
+ │
+ ┌───────────────┴───────────────┐
+ │ drpy-node-mcp (Independent) │
+ │ ┌────────────────────────┐ │
+ │ │ MCP Tools │ │
+ │ │ - systemTools.js │ │
+ │ │ - spiderTools.js │ │
+ │ │ - fsTools.js │ │
+ │ │ - dbTools.js │ │
+ │ │ - apiTools.js │ │
+ │ └────────────────────────┘ │
+ │ ▲ │
+ │ │ (depends on) │
+ │ └───────────────────┘
+ └──────────────────────────────────┘
+```
+
+## 2. 需要实现的 REST API
+
+### 2.1 系统管理 API
+
+#### 2.1.1 健康检查
+```
+GET /api/admin/health
+Response: {
+ status: "ok" | "error",
+ uptime: number,
+ memory: { used: number, total: number },
+ version: string
+}
+```
+
+#### 2.1.2 服务重启
+```
+POST /api/admin/restart
+Response: {
+ success: boolean,
+ message: string
+}
+```
+
+### 2.2 日志 API
+
+#### 2.2.1 读取日志
+```
+GET /api/admin/logs?lines=50
+Response: {
+ file: string,
+ content: string
+}
+```
+
+#### 2.2.2 WebSocket 实时日志
+```
+WS /api/admin/logs/stream
+Message: {
+ type: "log" | "error" | "end",
+ content: string,
+ timestamp: number
+}
+```
+
+### 2.3 配置管理 API
+
+#### 2.3.1 获取配置
+```
+GET /api/admin/config?key=section.key
+Response: any (配置值)
+```
+
+#### 2.3.2 更新配置
+```
+POST /api/admin/config
+Body: {
+ key: string,
+ value: any
+}
+Response: {
+ success: boolean,
+ message: string
+}
+```
+
+### 2.4 源管理 API
+
+#### 2.4.1 列出所有源
+```
+GET /api/admin/sources
+Response: {
+ js: string[],
+ catvod: string[]
+}
+```
+
+#### 2.4.2 验证源
+```
+POST /api/admin/sources/validate
+Body: {
+ path: string
+}
+Response: {
+ isValid: boolean,
+ message: string
+}
+```
+
+#### 2.4.3 检查语法
+```
+POST /api/admin/sources/syntax
+Body: {
+ path: string
+}
+Response: {
+ isValid: boolean,
+ error?: string
+}
+```
+
+#### 2.4.4 获取模板
+```
+GET /api/admin/sources/template
+Response: {
+ template: string
+}
+```
+
+### 2.5 文件系统 API
+
+#### 2.5.1 列出目录
+```
+GET /api/admin/files/list?path=spider/js
+Response: [{
+ name: string,
+ path: string,
+ isDirectory: boolean,
+ size?: number
+}]
+```
+
+#### 2.5.2 读取文件
+```
+GET /api/admin/files/read?path=spider/js/test.js
+Response: {
+ type: "text" | "image",
+ content?: string,
+ mimeType?: string,
+ dataUrl?: string
+}
+```
+
+#### 2.5.3 写入文件
+```
+POST /api/admin/files/write
+Body: {
+ path: string,
+ content: string
+}
+Response: {
+ success: boolean,
+ message: string
+}
+```
+
+#### 2.5.4 删除文件
+```
+DELETE /api/admin/files/delete?path=spider/js/test.js
+Response: {
+ success: boolean,
+ message: string
+}
+```
+
+### 2.6 数据库 API
+
+#### 2.6.1 执行查询
+```
+POST /api/admin/db/query
+Body: {
+ sql: string
+}
+Response: [{
+ // 查询结果行
+}]
+```
+
+### 2.7 路由信息 API
+
+#### 2.7.1 获取路由列表
+```
+GET /api/admin/routes
+Response: {
+ registered_controllers: string[]
+}
+```
+
+## 3. 文件结构规划
+
+### 3.1 drpy-node 新增文件
+```
+drpy-node/
+├── controllers/
+│ ├── admin.js # 重构,移除 MCP 依赖
+│ └── admin/
+│ ├── systemController.js # 系统管理
+│ ├── logsController.js # 日志管理
+│ ├── sourcesController.js # 源管理
+│ ├── filesController.js # 文件管理
+│ ├── dbController.js # 数据库查询
+│ └── routesController.js # 路由信息
+├── utils/
+│ └── admin/
+│ ├── logReader.js # 日志读取工具
+│ ├── configManager.js # 配置管理工具
+│ └── fileValidator.js # 文件安全验证
+└── apps/
+ └── admin/ # 新增:编译后的 admin SPA
+ ├── index.html
+ └── assets/
+ ├── index-*.js
+ └── index-*.css
+```
+
+### 3.2 drpy-node-admin 文件调整
+```
+drpy-node-admin/
+├── src/
+│ ├── api/
+│ │ ├── client.js # 保持,调整 baseURL
+│ │ ├── admin.js # 新增:统一的 admin API 调用
+│ │ ├── system.js # 重构:使用 /api/admin/system
+│ │ ├── sources.js # 重构:使用 /api/admin/sources
+│ │ ├── files.js # 重构:使用 /api/admin/files
+│ │ └── db.js # 重构:使用 /api/admin/db
+│ ├── views/
+│ │ └── ... (保持不变)
+│ ├── stores/
+│ │ └── ... (保持不变)
+│ └── components/
+│ └── ... (保持不变)
+├── vite.config.js # 调整:output 指向 apps/admin
+├── package.json
+└── tailwind.config.js
+```
+
+## 4. 实施步骤
+
+### Phase 1: API 层实现 (drpy-node)
+
+#### 步骤 1.1: 创建 admin 子控制器
+1. 创建 `controllers/admin/` 目录
+2. 实现 6 个子控制器模块
+3. 每个控制器实现对应的 API 接口
+
+#### 步骤 1.2: 重构 admin.js
+1. 移除 `import('../drpy-node-mcp/...')` 动态导入
+2. 实现独立的业务逻辑
+3. 注册子控制器路由
+4. 添加静态文件服务指向 `apps/admin/`
+
+#### 步骤 1.3: 实现工具函数
+1. `utils/admin/logReader.js` - 日志文件读取
+2. `utils/admin/configManager.js` - 配置文件管理
+3. `utils/admin/fileValidator.js` - 路径安全验证
+
+### Phase 2: 前端适配 (drpy-node-admin)
+
+#### 步骤 2.1: API 客户端重构
+1. 调整 `baseURL` 为 `/api/admin`
+2. 移除 MCP 响应解析逻辑
+3. 实现标准的 REST API 调用
+
+#### 步骤 2.2: Vite 配置调整
+1. 修改 `build.outDir` 为 `../apps/admin`
+2. 修改 `base` 为 `/admin/`
+3. 添加构建优化配置
+
+#### 步骤 2.3: 路由模式调整
+1. 使用 history 模式或 hash 模式
+2. 添加路由回退处理
+
+### Phase 3: 构建与集成
+
+#### 步骤 3.1: 本地测试
+1. 运行 `npm run admin:build` 构建
+2. 验证生成的文件在 `apps/admin/` 目录
+3. 测试所有功能正常工作
+
+#### 步骤 3.2: 最终验证
+1. 清理 MCP 依赖
+2. 确认 drpy-node 可以独立运行
+3. 性能测试
+
+## 5. API 详细规范
+
+### 5.1 通用响应格式
+```typescript
+// 成功响应
+{
+ success: true,
+ data?: any,
+ message?: string
+}
+
+// 错误响应
+{
+ success: false,
+ error: string,
+ code?: string
+}
+```
+
+### 5.2 错误码定义
+```javascript
+const ErrorCodes = {
+ UNAUTHORIZED: 'UNAUTHORIZED',
+ FORBIDDEN: 'FORBIDDEN',
+ NOT_FOUND: 'NOT_FOUND',
+ INVALID_PATH: 'INVALID_PATH',
+ SYNTAX_ERROR: 'SYNTAX_ERROR',
+ VALIDATION_ERROR: 'VALIDATION_ERROR',
+ INTERNAL_ERROR: 'INTERNAL_ERROR'
+}
+```
+
+### 5.3 认证与授权
+```javascript
+// 使用与 /apps/ 相同的认证机制
+// 所有 /api/admin/* 接口需要 basic auth
+```
+
+## 6. WebSocket 实时日志规范
+
+### 6.1 连接
+```
+WS /api/admin/logs/stream
+```
+
+### 6.2 消息格式
+```javascript
+// 客户端 → 服务端
+{
+ action: "subscribe" | "unsubscribe" | "clear",
+ lines?: number
+}
+
+// 服务端 → 客户端
+{
+ type: "log" | "error" | "end",
+ timestamp: number,
+ content: string
+}
+```
+
+### 6.3 心跳机制
+```javascript
+// 每 30 秒发送一次心跳
+// 客户端
+setInterval(() => {
+ ws.send(JSON.stringify({ type: 'heartbeat' }))
+}, 30000)
+
+// 服务端响应
+{ type: 'pong' }
+```
+
+## 7. 安全考虑
+
+### 7.1 路径验证
+```javascript
+// 只允许访问特定目录
+const ALLOWED_PATHS = [
+ 'spider/js',
+ 'spider/js_dr2',
+ 'spider/catvod',
+ 'spider/py',
+ 'spider/xbpq',
+ 'config',
+ 'json',
+ 'docs'
+];
+
+// 禁止路径遍历
+function validatePath(path) {
+ return !path.includes('..') &&
+ !path.includes('~') &&
+ !path.startsWith('/');
+
+}
+```
+
+### 7.2 SQL 注入防护
+```javascript
+// 只允许 SELECT 查询
+if (!query.trim().toLowerCase().startsWith('select')) {
+ throw new Error('Only SELECT queries allowed');
+}
+```
+
+### 7.3 文件操作限制
+```javascript
+// 禁止写入关键文件
+const PROTECTED_FILES = [
+ 'package.json',
+ 'index.js',
+ 'database.db'
+];
+```
+
+## 8. 性能优化
+
+### 8.1 日志流式传输
+```javascript
+// 使用流式传输大日志文件
+const stream = fs.createReadStream(logPath);
+stream.on('data', (chunk) => {
+ ws.send({ type: 'log', content: chunk.toString() });
+});
+```
+
+### 8.2 静态资源缓存
+```javascript
+// admin 静态资源缓存策略
+fastify.register(fastifyStatic, {
+ root: adminDistPath,
+ prefix: '/admin/',
+ cacheControl: 3600, // 1 小时
+ etag: true
+});
+```
+
+### 8.3 API 响应压缩
+```javascript
+// 启用 gzip 压缩
+import fastifyCompress from '@fastify/compress';
+fastify.register(fastifyCompress);
+```
+
+## 9. 兼容性说明
+
+### 9.1 向后兼容
+- 保留 `/admin/mcp` 接口作为临时兼容层(可配置开关)
+- 给予过渡期,逐步迁移到新 API
+
+### 9.2 版本控制
+```javascript
+// API 版本号
+const API_VERSION = 'v1';
+// 所有响应头包含版本
+reply.header('X-API-Version', API_VERSION);
+```
+
+## 10. 测试计划
+
+### 10.1 单元测试
+- 每个控制器函数的单元测试
+- 工具函数的单元测试
+- API 响应格式验证
+
+### 10.2 集成测试
+- API 端到端测试
+- WebSocket 连接测试
+- 文件上传下载测试
+
+### 10.3 性能测试
+- 日志流式传输性能
+- 大文件读取性能
+- 并发请求处理
+
+## 11. 交付物清单
+
+### 11.1 drpy-node 修改
+- [ ] `controllers/admin.js` - 重构完成
+- [ ] `controllers/admin/systemController.js` - 新增
+- [ ] `controllers/admin/logsController.js` - 新增
+- [ ] `controllers/admin/sourcesController.js` - 新增
+- [ ] `controllers/admin/filesController.js` - 新增
+- [ ] `controllers/admin/dbController.js` - 新增
+- [ ] `controllers/admin/routesController.js` - 新增
+- [ ] `utils/admin/logReader.js` - 新增
+- [ ] `utils/admin/configManager.js` - 新增
+- [ ] `utils/admin/fileValidator.js` - 新增
+
+### 11.2 drpy-node-admin 修改
+- [ ] `src/api/client.js` - baseURL 调整
+- [ ] `src/api/admin.js` - 统一 API 调用
+- [ ] `src/api/system.js` - API 重构
+- [ ] `src/api/spider.js` - API 重构
+- [ ] `src/api/file.js` - API 重构
+- [ ] `src/api/db.js` - API 重构
+- [ ] `vite.config.js` - 构建配置调整
+- [ ] `package.json` - 脚本更新
+
+### 11.3 文档
+- [ ] API 接口文档
+- [ ] 部署指南
+- [ ] 开发指南更新
+- [ ] 变更日志
+
+## 12. 时间估算
+
+| 阶段 | 任务 | 预计时间 |
+|-----|------|---------|
+| Phase 1 | API 层实现 | 2-3 天 |
+| Phase 2 | 前端适配 | 1-2 天 |
+| Phase 3 | 构建与集成 | 1 天 |
+| 测试与修复 | 全面测试 | 1-2 天 |
+| **总计** | | **5-8 天** |
+
+## 13. 风险与应对
+
+### 13.1 技术风险
+**风险**: 解耦后功能缺失
+**应对**: 详细的功能对比测试清单
+
+### 13.2 兼容性风险
+**风险**: 现有部署环境适配问题
+**应对**: 保持 MCP 临时兼容层
+
+### 13.3 性能风险
+**风险**: 新架构性能下降
+**应对**: 性能基准测试和优化
+
+## 14. 后续优化方向
+
+### 14.1 功能增强
+- 添加源市场功能
+- 添加源订阅功能
+- 添加统计分析功能
+
+### 14.2 用户体验优化
+- 实现主题自定义
+- 添加快捷键支持
+- 优化移动端体验
+
+### 14.3 运维功能
+- 添加系统监控图表
+- 实现日志分析功能
+- 添加性能指标展示
diff --git a/drpy-node-admin/index.html b/drpy-node-admin/index.html
new file mode 100644
index 00000000..74275406
--- /dev/null
+++ b/drpy-node-admin/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ {{ route.meta.title || 'DRPYS ADMIN' }}
+
+ API 文档
+
+ {{ endpoint.path }}
+
+ 参数
+
+ {{ param.type || key }}
+
+ 系统备份与恢复
+ 包含文件
+
+
+ 选择文件或目录
+
+
+
+ 环境变量配置
+
+
+ {{ groupName }}
+
+
+ {{ Object.keys(configs).length }} 项
+
+ {{ key }}
+
+ {{ maskSensitive(key, formatDisplayValue(value)) || ' ' }}
+
+ 服务状态
+ 快捷操作
+ 数据库查询
+ 示例查询
+
+
+
+
+
+
+
+
+ {{ column }}
+
+
+
+
+
+ {{ row[column] }}
+
+ 文件管理
+ 文件列表
+ {{ selectedFile.name }}
+
+
+
{{ fileContent }}
+ 日志查看
+
+ 站源映射管理
+ 未保存
+
+ {{ isAdding ? '添加映射记录' : '编辑映射记录' }}
+ 解析管理
+
+
+ 全局解析配置
+
+ parses.conf
+
+
+ JS 解析脚本 (jx 目录)
+
+
+
+ {{ file.name }}
+
+ 源编辑器
+ 验证失败
+ {{ validationError }}
+ 源管理
+
+ {{ source.name }}
+
+ 订阅管理
+
更新至V1.4.1
+更新至V1.3.31
+更新至V1.3.30
+更新至V1.3.29
+更新至V1.3.28
-更新至V1.3.27
-更新至V1.3.26
-更新至V1.3.25
-更新至V1.3.24
-更新至V1.3.23
-更新至V1.3.22
注意事项
总是有人遇到各种奇葩问题,像什么没弹幕,访问/config/1服务马上崩溃等等,能自行解决最好,解决不了我建议你使用下方安装教程
3.道长腾讯轻量云服务器安装方案
跟我一样还有问题那就不可能了,我能用你即能用
todo:
pinyin 库依赖的 nodejieba 跑路了现在无法完成安装new Promise 里发生的错误无法被外部try catch 导致程序崩溃,如 番薯动漫.js 里的写法1.zy安装方案
本项目主体框架由道长开发,项目内相关源收集于互联网,可供学习交流测试使用,禁止商用或者直接转卖代码,转载代码请带上出处。
-