▶ OmoFun 动漫(弹幕版)

https://www.omofuns.com

wsnailccc (15442)1天前

加了有开关的弹幕功能。低版本的阅读器可能无法观看弹幕。播放器那里可以开关弹幕,有记忆功能。

使用步骤(直接使用应该也可以):登录-一键获取网址-测试延时-选择可用的低延时链接-检查登录状态-右上角☑️
二维码导入
{
    "bookSourceComment": "v7:修复登录面板在真机报 TypeError: java.lang.reflect.Array.newInstance 不是函数(改用 BufferedReader 文本流读法,规则层同步去掉 byte[] 创建);测速判据放宽为「有实质响应即通」;恢复「检查登录状态」并升级为线路自检按钮(显示版本\/字节数\/是否盾页\/影片链接数)。线路仍从发布页动态获取、测速不自动切换。\n2026.11.13 v8:新增子内容规则(subContent),从站内弹幕接口取弹幕供内置播放器加载;\n播放\/线路\/目录\/正文解密与 v7 完全一致,弹幕取不到时静默放弃、不影响播放。",
    "bookSourceGroup": "影视频源 🎬",
    "bookSourceName": "▶ OmoFun 动漫(弹幕版)",
    "bookSourceType": 4,
    "bookSourceUrl": "https:\/\/www.omofuns.com",
    "bookUrlPattern": "https?:\/\/[^\/]+\/anime\/[0-9a-f]{24}\\.html",
    "customButton": false,
    "customOrder": 1,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n\/\/ 默认兜底线路(与发布页当前 4 条一致);实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(\/\\\/+$\/,'');\n      if(u.indexOf('https:\/\/')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  \/\/ 兼容旧书源遗留的 om_sn \/ om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(\/\\\/+$\/,'');if(v.indexOf('https:\/\/')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(\/\\\/+$\/,''),a=lines();if(c.indexOf('https:\/\/')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(\/\\\/+$\/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(\/^https?:\\\/\\\/\/,'')===hn)return a[i];}if(s.indexOf('https:\/\/')===0)return 'https:\/\/'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  \/\/ 用 ByteArrayOutputStream 生成 byte[],避开反射建数组的高危 API\n  \/\/ (Legado 登录面板\/部分真机环境里该 Class 会被解析成 JavaPackage 而非类)\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(\/^\\s+\/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  \/\/ 文本流读法:InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  \/\/ 全程不创建 Java byte[],避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\/\/ 最后一次重试用:跳过 SSL 证书\/主机名校验(应对被劫持的线路或自签播放器证书)\nfunction looseSSL(c){\n  \/\/ 最后一次重试兜底:只跳过主机名校验(足以应对 CN=*.10086.cn 这类劫持证书)。\n  \/\/ 不再自建 TrustManager[] —— 那需要反射创建 Java 数组,真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application\/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/[^\\\/]+(\\\/[^\\s]*)?$\/.exec(s);return m?(m[1]||'\/'):'\/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.charAt(0)==='\/')return b+u;return b+'\/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(\/\\\/+$\/,'')==='https:\/\/as.cfhls.top')return '';return u;}if(u.charAt(0)==='\/')return 'https:\/\/as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=\/anime\/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('\/anime\/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('\/play\/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    \/\/ 无封面不再跳过条目:隐藏轮播 banner 只有图床根路径背景,coverUrl 留空即可,\n    \/\/ 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面,则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=curLine();\nvar rows=[\n {title:'\\ud83d\\udcfa \\u9996\\u9875\\u63a8\\u8350',url:b+'\/'},\n {title:'\\ud83d\\uddd3 \\u65b0\\u756a\\u8868\\uff08\\u5468\\u66f4\\uff09',url:b+'\/week\/'},\n {title:'\\ud83d\\udd25 \\u4eca\\u65e5\\u70ed\\u64ad',url:b+'\/dayhot\/'},\n {title:'\\ud83c\\uddef\\ud83c\\uddf5 \\u65e5\\u6f2b',url:b+'\/type\/1-{{page}}.html'},\n {title:'\\ud83c\\udde8\\ud83c\\uddf3 \\u56fd\\u6f2b',url:b+'\/type\/2-{{page}}.html'},\n {title:'\\ud83c\\udfac \\u52a8\\u753b',url:b+'\/type\/5-{{page}}.html'},\n {title:'\\ud83c\\udf9e \\u5267\\u573a\\u7248',url:b+'\/type\/24-{{page}}.html'},\n {title:'\\ud83e\\uddb8 \\u7279\\u6444',url:b+'\/type\/4-{{page}}.html'},\n {title:'\\ud83c\\uddfa\\ud83c\\uddf8 \\u7f8e\\u6f2b',url:b+'\/type\/3-{{page}}.html'}\n];\nreturn JSON.stringify(rows);\n})()",
    "header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36\"}",
    "lastUpdateTime": "1794533014312",
    "loginCheckJs": "(function(){ try { return result || ''; } catch(e) { return ''; } })()",
    "loginUi": "[{\"key\": \"om_status\", \"type\": \"text\", \"name\": \"当前状态\", \"viewName\": \"OM_status(source)\", \"hint\": \"切换线路后点右上角 √ 保存\"}, {\"key\": \"om_pub\", \"type\": \"text\", \"name\": \"发布页网址\", \"hint\": \"默认 https:\/\/fb.omoo.tv\/ ,发布页改版\/换镜像时在此修改\", \"defaultValue\": \"https:\/\/fb.omoo.tv\/\"}, {\"key\": \"om_btn_get\", \"type\": \"button\", \"name\": \"🔄 一键从发布页获取网址路线\", \"action\": \"OM_actGet(java,source)\"}, {\"key\": \"om_btn_speed\", \"type\": \"button\", \"name\": \"⚡ 测试延时(只显示结果,不自动切换)\", \"action\": \"OM_actSpeed(java,source)\"}, {\"key\": \"om_btn_check\", \"type\": \"button\", \"name\": \"🔍 检查登录状态 \/ 自检当前线路\", \"action\": \"OM_actCheck(java,source)\"}, {\"key\": \"om_btn_line1\", \"type\": \"button\", \"name\": \"线路 1\", \"viewName\": \"OM_label(source,0)\", \"action\": \"OM_actSet(java,source,0)\"}, {\"key\": \"om_btn_line2\", \"type\": \"button\", \"name\": \"线路 2\", \"viewName\": \"OM_label(source,1)\", \"action\": \"OM_actSet(java,source,1)\"}, {\"key\": \"om_btn_line3\", \"type\": \"button\", \"name\": \"线路 3\", \"viewName\": \"OM_label(source,2)\", \"action\": \"OM_actSet(java,source,2)\"}, {\"key\": \"om_btn_line4\", \"type\": \"button\", \"name\": \"线路 4\", \"viewName\": \"OM_label(source,3)\", \"action\": \"OM_actSet(java,source,3)\"}, {\"key\": \"om_btn_line5\", \"type\": \"button\", \"name\": \"线路 5\", \"viewName\": \"OM_label(source,4)\", \"action\": \"OM_actSet(java,source,4)\"}, {\"key\": \"om_btn_line6\", \"type\": \"button\", \"name\": \"线路 6\", \"viewName\": \"OM_label(source,5)\", \"action\": \"OM_actSet(java,source,5)\"}, {\"key\": \"om_btn_line7\", \"type\": \"button\", \"name\": \"线路 7\", \"viewName\": \"OM_label(source,6)\", \"action\": \"OM_actSet(java,source,6)\"}, {\"key\": \"om_btn_line8\", \"type\": \"button\", \"name\": \"线路 8\", \"viewName\": \"OM_label(source,7)\", \"action\": \"OM_actSet(java,source,7)\"}, {\"key\": \"om_custom\", \"type\": \"text\", \"name\": \"自定义线路\", \"hint\": \"填 https:\/\/ 开头的完整域名\"}, {\"key\": \"om_btn_custom\", \"type\": \"button\", \"name\": \"➡ 切换到自定义线路\", \"action\": \"OM_custom(java,source)\"}, {\"key\": \"om_btn_reset\", \"type\": \"button\", \"name\": \"↩ 恢复默认线路\", \"action\": \"OM_reset(java,source)\"}]",
    "loginUrl": "<js>\nfunction login(){}\nvar OM_DEF=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nvar OM_PUB='https:\/\/fb.omoo.tv\/';\nvar OM_UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\nfunction OM_g(v){var x=String(v===undefined||v===null?'':v);return (x==='null'||x==='undefined'||x==='JsNull'||x==='[object Object]')?'':x;}\nfunction OM_pub(sv){var v=OM_g(sv.get('om_pub')).replace(\/\\\/+$\/,'');return v.indexOf('http')===0?v:OM_PUB;}\nfunction OM_toast(jv,m){try{jv.toast(m);return;}catch(e){}try{jv.longToast(m);}catch(e2){}}\n\n\/\/ 纯 JS base64 解码(Latin-1,线路 URL 均为 ASCII)\nfunction OM_b64d(s){\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/',o='',buf=0,bits=0,i,v;\n  for(i=0;i<s.length;i++){\n    var ch=s.charAt(i);if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);if(v<0)continue;\n    buf=((buf<<6)|v)&0xFFFFFF;bits+=6;\n    if(bits>=8){bits-=8;o+=String.fromCharCode((buf>>bits)&255);}\n  }\n  return o;\n}\n\n\/\/ 原生 HttpURLConnection:发布页 \/ 线路探活共用,绝不调用 java.ajax(真机会 ClassCastException)\nfunction OM_GET(url){\n  var out={h:'',ms:0,ok:false,err:''},t0=Date.now();\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod('GET');c.setConnectTimeout(6000);c.setReadTimeout(10000);\n    c.setInstanceFollowRedirects(true);\n    c.setRequestProperty('User-Agent',OM_UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    out.h=OM_TXT(c);\n    \/\/ 判据放宽:只要拿到实质响应就算「线路通」。安全验证页也是通的(过盾由规则层负责)。\n    out.ok=out.h.length>=1000;\n  }catch(e){out.err=String(e);}\n  out.ms=Date.now()-t0;return out;\n}\n\/\/ 文本流读法:不创建 Java byte[],避开真机上会崩的反射建数组 API\nfunction OM_TXT(c){\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\n\/\/ 从发布页混淆脚本里执行出 encodedLinks(脚本字符串已打散,纯正则取不到,必须 eval)\nfunction OM_fetchLines(jv,pub){\n  var r=OM_GET(pub);\n  if(!r.h)return{err:'\\u65e0\\u6cd5\\u8bfb\\u53d6\\u53d1\\u5e03\\u9875\\uff1a'+(r.err||'\\u7a7a\\u54cd\\u5e94')};\n  var re=\/<script[^>]*>([\\s\\S]*?)<\\\/script>\/g,m,code='';\n  while((m=re.exec(r.h))!==null){if(m[1].indexOf('encodedLinks')>=0)code=m[1];}\n  if(!code)return{err:'\\u53d1\\u5e03\\u9875\\u672a\\u627e\\u5230\\u7ebf\\u8def\\u6570\\u7ec4\\uff08\\u7ed3\\u6784\\u53ef\\u80fd\\u5df2\\u53d8\\uff09'};\n  var encodedLinks=null;\n  try{\n    var window=this,document={\n      createElement:function(){return{style:{},setAttribute:function(){},appendChild:function(){},innerHTML:'',textContent:''};},\n      body:{appendChild:function(){}},getElementById:function(){return null;}\n    };\n    eval(code);\n  }catch(e){\/* DOM 部分可能抛错,encodedLinks 通常已赋值 *\/}\n  if(!encodedLinks||!encodedLinks.length)return{err:'\\u7ebf\\u8def\\u6570\\u7ec4\\u4e3a\\u7a7a\\u6216\\u811a\\u672c\\u65e0\\u6cd5\\u6267\\u884c'};\n  var out=[],seen={};\n  for(var i=0;i<encodedLinks.length;i++){\n    var parts=String(encodedLinks[i]).split('|'),u='';\n    try{u=OM_b64d(parts[0]).replace(\/\\\/+$\/,'');}catch(e2){}\n    if(u.indexOf('http')!==0||seen[u])continue;\n    seen[u]=1;\n    out.push({u:u,n:parts[1]||u.replace(\/^https?:\\\/\\\/\/,'')});\n  }\n  if(!out.length)return{err:'\\u89e3\\u7801\\u540e\\u65e0\\u6709\\u6548\\u7ebf\\u8def'};\n  return{lines:out};\n}\n\nfunction OM_load(sv){\n  var raw=OM_g(sv.get('om_lines'));\n  if(raw){try{var a=JSON.parse(raw);if(a&&a.length)return a;}catch(e){}}\n  var r=[];for(var i=0;i<OM_DEF.length;i++)r.push({u:OM_DEF[i],n:OM_DEF[i].replace(\/^https?:\\\/\\\/\/,'')});\n  return r;\n}\nfunction OM_save(sv,lines){\n  var n=Math.min(lines.length,8);\n  sv.put('om_lines',JSON.stringify(lines.slice(0,n)));\n  sv.put('om_line',lines[0].u);\n  for(var i=0;i<8;i++)sv.put('om_sp_'+i,'');\n  return n;\n}\nfunction OM_status(sv){\n  var arr=OM_load(sv),cur=OM_g(sv.get('om_line')).replace(\/\\\/+$\/,''),idx=-1;\n  for(var i=0;i<arr.length;i++)if(arr[i].u===cur)idx=i;\n  return '\\u3010v7\\u3011\\u5f53\\u524d\\uff1a'+(cur||'\\u9ed8\\u8ba4')+(idx>=0?('\\uff08\\u7b2c'+(idx+1)+'\\u6761\\uff09'):'')\n    +' \\uff5c \\u53d1\\u5e03\\u9875\\uff1a'+OM_pub(sv)+' \\uff5c \\u5171 '+arr.length+' \\u6761';\n}\nfunction OM_label(sv,i){\n  var arr=OM_load(sv);\n  if(i>=arr.length)return '\\uff08\\u7a7a\\u4f4d '+(i+1)+'\\uff09';\n  var cur=OM_g(sv.get('om_line')).replace(\/\\\/+$\/,''),sp=OM_g(sv.get('om_sp_'+i));\n  return (cur===arr[i].u?'\\u2714 ':'')+'\\u7ebf\\u8def'+(i+1)+' '+arr[i].n+(sp?('  '+sp):'');\n}\nfunction OM_actGet(jv,sv){\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u8bfb\\u53d6\\u53d1\\u5e03\\u9875\\uff0c\\u8bf7\\u7a0d\\u5019\\u2026');\n  var res=OM_fetchLines(jv,OM_pub(sv));\n  if(res.err){OM_toast(jv,'\\u274c '+res.err+'\\uff1b\\u4e5f\\u53ef\\u5728\\u4e0b\\u65b9\\u586b\\u5199\\u81ea\\u5b9a\\u4e49\\u7ebf\\u8def');return;}\n  var n=OM_save(sv,res.lines);\n  OM_toast(jv,'\\u2705 \\u5df2\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6 '+n+' \\u6761\\u7ebf\\u8def\\uff0c\\u9ed8\\u8ba4\\u7b2c 1 \\u6761\\uff1b\\u8bf7\\u70b9\\u300c\\u6d4b\\u8bd5\\u5ef6\\u65f6\\u300d\\u540e\\u81ea\\u884c\\u70b9\\u9009');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actSpeed(jv,sv){\n  var arr=OM_load(sv);\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u6d4b\\u901f '+arr.length+' \\u6761\\u7ebf\\u8def\\uff0c\\u8bf7\\u7a0d\\u5019\\u2026');\n  var best=-1,bestMs=1e12;\n  for(var i=0;i<arr.length;i++){\n    var r=OM_GET(arr[i].u+'\/');\n    sv.put('om_sp_'+i,r.ok?(r.ms+'ms'):('\\u4e0d\\u53ef\\u7528 '+r.ms+'ms'));\n    if(r.ok&&r.ms<bestMs){bestMs=r.ms;best=i;}\n  }\n  if(best>=0){\n    sv.put('om_sp_'+best,'\\u26a1'+bestMs+'ms');\n    OM_toast(jv,'\\u2705 \\u6d4b\\u901f\\u5b8c\\u6210\\uff0c\\u6700\\u5feb '+arr[best].n+' '+bestMs+'ms\\uff1b\\u70b9\\u5bf9\\u5e94\\u300c\\u7ebf\\u8def N\\u300d\\u6309\\u94ae\\u5373\\u53ef\\u5207\\u6362\\uff08\\u4e0d\\u4f1a\\u81ea\\u52a8\\u5207\\uff09');\n  }else{\n    OM_toast(jv,'\\u26a0 \\u5168\\u90e8\\u7ebf\\u8def\\u63a2\\u6d3b\\u672a\\u901a\\u8fc7\\uff0c\\u8bf7\\u68c0\\u67e5\\u7f51\\u7edc\\u6216\\u91cd\\u65b0\\u83b7\\u53d6\\u53d1\\u5e03\\u9875\\u7ebf\\u8def');\n  }\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actSet(jv,sv,i){\n  var arr=OM_load(sv);\n  if(i>=arr.length){OM_toast(jv,'\\u26a0 \\u8be5\\u7ebf\\u8def\\u4f4d\\u4e3a\\u7a7a\\uff0c\\u8bf7\\u5148\\u83b7\\u53d6\\u7ebf\\u8def');return;}\n  sv.put('om_line',arr[i].u);\n  var r=OM_GET(arr[i].u+'\/');\n  OM_toast(jv,(r.ok?'\\u2705 \\u5df2\\u5207\\u6362 ':'\\u26a0 \\u5df2\\u5207\\u6362\\u4f46\\u63a2\\u6d3b\\u672a\\u901a\\u8fc7 ')+arr[i].n+'\\uff08'+r.ms+'ms\\uff09');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_custom(jv,sv){\n  var v=OM_g(sv.get('om_custom')).replace(\/\\\/+$\/,'');\n  if(v.indexOf('https:\/\/')!==0){OM_toast(jv,'\\u26a0 \\u8bf7\\u586b https:\/\/ \\u5f00\\u5934\\u7684\\u5b8c\\u6574\\u57df\\u540d');return;}\n  sv.put('om_line',v);\n  OM_toast(jv,'\\u2705 \\u5df2\\u5207\\u6362\\u81ea\\u5b9a\\u4e49\\u7ebf\\u8def\\uff1a'+v);\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_reset(jv,sv){\n  sv.put('om_lines','');sv.put('om_line',OM_DEF[0]);\n  for(var i=0;i<8;i++)sv.put('om_sp_'+i,'');\n  OM_toast(jv,'\\u21a9 \\u5df2\\u6062\\u590d\\u9ed8\\u8ba4 4 \\u6761\\u7ebf\\u8def\\uff1b\\u82e5\\u9700\\u6700\\u65b0\\u7ebf\\u8def\\u8bf7\\u70b9\\u300c\\u4e00\\u952e\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6\\u7f51\\u5740\\u8def\\u7ebf\\u300d');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actCheck(jv,sv){\n  var arr=OM_load(sv),cur=OM_g(sv.get('om_line')).replace(\/\\\/+$\/,'');\n  if(cur.indexOf('https:\/\/')!==0)cur=arr.length?arr[0].u:'';\n  if(!cur){OM_toast(jv,'\\u274c \\u7ebf\\u8def\\u6c60\\u4e3a\\u7a7a\\uff0c\\u8bf7\\u5148\\u70b9\\u300c\\u4e00\\u952e\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6\\u7f51\\u5740\\u8def\\u7ebf\\u300d');return;}\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u81ea\\u68c0 '+cur.replace(\/^https?:\\\/\\\/\/,'')+' \\u2026');\n  var r=OM_GET(cur+'\/');\n  var shield=r.h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||r.h.indexOf('verify_check')>=0;\n  var n=0;try{var mm=r.h.match(\/\\\/anime\\\/[a-f0-9]{24}\\.html\/g);n=mm?mm.length:0;}catch(e){}\n  var state=shield?'\\u26a0 \\u5b89\\u5168\\u9a8c\\u8bc1\\u9875\\uff08\\u89c4\\u5219\\u4f1a\\u81ea\\u52a8\\u8fc7\\u76fe\\uff09':(n>0?'\\u2705 \\u6b63\\u5e38\\u9875':'\\u26a0 \\u65e0\\u5f71\\u7247\\u94fe\\u63a5');\n  var msg='v7 \\u81ea\\u68c0\\uff5c'+cur.replace(\/^https?:\\\/\\\/\/,'')+'\\uff5c'+r.h.length+' \\u5b57\\u8282\\uff5c'+state+'\\uff5c\\u5f71\\u7247 '+n+' \\u4e2a\\uff5c'+r.ms+'ms';\n  if(r.err)msg+='\\uff5c\\u9519\\u8bef\\uff1a'+String(r.err).substring(0,50);\n  OM_toast(jv,msg);\n  try{sv.put('om_lastcheck',msg);}catch(e2){}\n  try{jv.reLoginView();}catch(e3){}\n}\n<\/js>",
    "respondTime": 180000,
    "ruleBookInfo": {
        "author": "$.a",
        "coverUrl": "$.c",
        "init": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n\/\/ 默认兜底线路(与发布页当前 4 条一致);实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(\/\\\/+$\/,'');\n      if(u.indexOf('https:\/\/')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  \/\/ 兼容旧书源遗留的 om_sn \/ om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(\/\\\/+$\/,'');if(v.indexOf('https:\/\/')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(\/\\\/+$\/,''),a=lines();if(c.indexOf('https:\/\/')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(\/\\\/+$\/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(\/^https?:\\\/\\\/\/,'')===hn)return a[i];}if(s.indexOf('https:\/\/')===0)return 'https:\/\/'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  \/\/ 用 ByteArrayOutputStream 生成 byte[],避开反射建数组的高危 API\n  \/\/ (Legado 登录面板\/部分真机环境里该 Class 会被解析成 JavaPackage 而非类)\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(\/^\\s+\/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  \/\/ 文本流读法:InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  \/\/ 全程不创建 Java byte[],避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\/\/ 最后一次重试用:跳过 SSL 证书\/主机名校验(应对被劫持的线路或自签播放器证书)\nfunction looseSSL(c){\n  \/\/ 最后一次重试兜底:只跳过主机名校验(足以应对 CN=*.10086.cn 这类劫持证书)。\n  \/\/ 不再自建 TrustManager[] —— 那需要反射创建 Java 数组,真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application\/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/[^\\\/]+(\\\/[^\\s]*)?$\/.exec(s);return m?(m[1]||'\/'):'\/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.charAt(0)==='\/')return b+u;return b+'\/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(\/\\\/+$\/,'')==='https:\/\/as.cfhls.top')return '';return u;}if(u.charAt(0)==='\/')return 'https:\/\/as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=\/anime\/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('\/anime\/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('\/play\/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    \/\/ 无封面不再跳过条目:隐藏轮播 banner 只有图床根路径背景,coverUrl 留空即可,\n    \/\/ 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面,则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||''),d=gt(h)?null:Jp(h);\nvar nm0='';if(d){nm0=txt(first(d,'h1.title'));}\nif(!nm0){var r0=pick(pth(baseUrl));h=r0.h;b=r0.b;d=Jp(h);}\nvar name='',p1='',meta='',status='',intro='';\nif(d){\n name=txt(first(d,'h1.title'));\n var im=first(d,'a.pic img');\n if(im){p1=attr(im,'data-original')||attr(im,'src');}\n try{var ps=d.select('p.data');\n   for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text()).trim();\n     if(t.indexOf('\\u7c7b\\u578b')===0)meta=t;\n     else if(t.indexOf('\\u72b6\\u6001')===0)status=t.replace(\/^\\u72b6\\u6001[\\uff1a:]\\s*\/,'');}\n }catch(e1){}\n intro=txt(first(d,'.detail-content'))||txt(first(d,'.detail-sketch'))||txt(first(d,'.desc'));\n}\nvar kind='';\nif(meta){kind=meta.replace(\/^\\u7c7b\\u578b[\\uff1a:]\\s*\/,'').split('\/')[0].replace(\/[,\\uff0c]\\s*\/g,' \\u00b7 ').trim();}\nvar o={a:'OmoFun',c:pic(p1),k:kind,w:status,t:status||'\\u2014',i:intro,n:name,tocUrl:String(baseUrl||'')};\nreturn JSON.stringify(o);\n})()",
        "intro": "$.i",
        "kind": "$.k",
        "lastChapter": "$.t",
        "name": "$.n",
        "tocUrl": "$.tocUrl",
        "wordCount": "$.w"
    },
    "ruleContent": {
        "content": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n\/\/ 默认兜底线路(与发布页当前 4 条一致);实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(\/\\\/+$\/,'');\n      if(u.indexOf('https:\/\/')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  \/\/ 兼容旧书源遗留的 om_sn \/ om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(\/\\\/+$\/,'');if(v.indexOf('https:\/\/')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(\/\\\/+$\/,''),a=lines();if(c.indexOf('https:\/\/')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(\/\\\/+$\/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(\/^https?:\\\/\\\/\/,'')===hn)return a[i];}if(s.indexOf('https:\/\/')===0)return 'https:\/\/'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  \/\/ 用 ByteArrayOutputStream 生成 byte[],避开反射建数组的高危 API\n  \/\/ (Legado 登录面板\/部分真机环境里该 Class 会被解析成 JavaPackage 而非类)\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(\/^\\s+\/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  \/\/ 文本流读法:InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  \/\/ 全程不创建 Java byte[],避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\/\/ 最后一次重试用:跳过 SSL 证书\/主机名校验(应对被劫持的线路或自签播放器证书)\nfunction looseSSL(c){\n  \/\/ 最后一次重试兜底:只跳过主机名校验(足以应对 CN=*.10086.cn 这类劫持证书)。\n  \/\/ 不再自建 TrustManager[] —— 那需要反射创建 Java 数组,真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application\/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/[^\\\/]+(\\\/[^\\s]*)?$\/.exec(s);return m?(m[1]||'\/'):'\/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.charAt(0)==='\/')return b+u;return b+'\/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(\/\\\/+$\/,'')==='https:\/\/as.cfhls.top')return '';return u;}if(u.charAt(0)==='\/')return 'https:\/\/as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=\/anime\/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('\/anime\/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('\/play\/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    \/\/ 无封面不再跳过条目:隐藏轮播 banner 只有图床根路径背景,coverUrl 留空即可,\n    \/\/ 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面,则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),page=String(result||'');\n\/\/ 播放页 result 若被盾拦截或为空,用原生 HTTP 自己抓一次(自动过盾 + 换线)\nif(page.indexOf('player_aaaa')<0){var rr=pick(pth(baseUrl));page=rr.h;b=rr.b;}\nvar i=page.indexOf('var player_aaaa=');\nif(i<0) return '\\u26a0 \\u672a\\u627e\\u5230\\u64ad\\u653e\\u6570\\u636e\\uff08\\u9875\\u9762\\u5b57\\u8282='+page.length+'\\uff0c\\u53ef\\u80fd\\u88ab\\u5b89\\u5168\\u9a8c\\u8bc1\\u62e6\\u622a\\uff09';\nvar st=page.indexOf('{',i),dep=0,end=-1,inStr=false,q='';\nif(st<0) return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u8d77\\u59cb\\u7b26\\u7f3a\\u5931';\nfor(var k=st;k<page.length;k++){\n  var c=page.charAt(k);\n  if(inStr){ if(c==='\\\\'){k++;continue;} if(c===q)inStr=false; continue; }\n  if(c==='\"'||c===\"'\"){ inStr=true; q=c; continue; }\n  if(c==='{')dep++; else if(c==='}'){ dep--; if(dep===0){ end=k+1; break; } }\n}\nif(end<0) return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u62ec\\u53f7\\u4e0d\\u914d\\u5e73';\nvar pd=null;\ntry{ pd=JSON.parse(page.slice(st,end)); }catch(e2){ return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u89e3\\u6790\\u5931\\u8d25'; }\nvar rawUrl=String(pd.url||'');\nif(String(pd.encrypt)==='1'){ try{ rawUrl=unescape(rawUrl); }catch(e3){ } }\nif(!rawUrl) return '\\u26a0 \\u8be5\\u96c6\\u6682\\u65e0\\u64ad\\u653e\\u5730\\u5740';\nvar dmid='';\ntry{ var dm=\/\\\"dmid\\\"\\s*:\\s*\\\"?(\\d+)\\\"?\/.exec(page); if(dm)dmid=dm[1]; }catch(e5){ }\nif(!dmid)dmid=String(pd.id||'');\nvar pic1=String((pd.vod_data&&pd.vod_data.vod_pic)||'');\nvar qs=[\n  'url='+encodeURIComponent(rawUrl),\n  'dmid='+encodeURIComponent(dmid),\n  'next='+encodeURIComponent(String(pd.link_next||'')),\n  'name='+encodeURIComponent(String((pd.vod_data&&pd.vod_data.vod_name)||'')),\n  'sid='+encodeURIComponent(String(pd.sid||'1')),\n  'nid='+encodeURIComponent(String(pd.nid||'1')),\n  'ph='+encodeURIComponent('https:\/\/as.cfhls.top\/'),\n  'h='+encodeURIComponent(b),\n  'pic='+encodeURIComponent(pic1)\n];\n\/\/ 3 次机会:art 主域 → low 备用域 → 跳过 SSL 校验再试 art(应对证书\/主机名问题)\nvar hosts=['https:\/\/art.v2player.top:8989\/player\/?','https:\/\/low.v2player.top:8989\/player\/?','https:\/\/art.v2player.top:8989\/player\/?'];\nvar ph1='',mm=null,lastErr='';\nfor(var retry=0;retry<3;retry++){\n  var tu=hosts[retry]+qs.join('&')+(retry?('&_r='+Date.now()+'_'+retry):'');\n  try{\n    var resp=REQ(tu,'GET',null,'',retry===2);\n    ph1=String(resp.h||'');lastErr=String(resp.err||'');\n  }catch(e6){ph1='';lastErr=String(e6);}\n  mm=\/playData\\('([^']+)','([^']+)'\\)\/.exec(ph1);\n  if(mm)break;\n  try{ Packages.java.lang.Thread.sleep(300); }catch(eS){}\n}\nif(!mm) return '\\u26a0 \\u64ad\\u653e\\u5668\\u65e0\\u54cd\\u5e94\\uff08\\u5df2\\u8bd5 3 \\u6b21\\uff0c\\u672b\\u6b21\\u5b57\\u8282='+ph1.length+'\\uff09\\u3002\\u82e5\\u6301\\u7eed\\u5931\\u8d25\\u8bf7\\u5728\\u8c03\\u8bd5\\u6b63\\u6587\\u91cc\\u770b\\u6b64\\u63d0\\u793a\\uff0c\\u6216\\u5207\\u6362\\u7ebf\\u8def';\ntry{\n  var cipher=mm[1], ivHex=mm[2];\n  var keyB=new Packages.java.lang.String('ABABEF777999CCCD').getBytes('UTF-8');\n  var key=new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES');\n  var hl=ivHex.length\/2;\n  var ivbos=new Packages.java.io.ByteArrayOutputStream();\n  for(var hi=0;hi<hl;hi++)ivbos.write(parseInt(ivHex.substr(hi*2,2),16));\n  var ivb=ivbos.toByteArray();\n  var iv=new Packages.javax.crypto.spec.IvParameterSpec(ivb);\n  var cb=b64b(cipher);\n  var cc=Packages.javax.crypto.Cipher.getInstance('AES\/CBC\/PKCS5Padding');\n  cc.init(2,key,iv);\n  var d2=cc.doFinal(cb);\n  var u2=String(new Packages.java.lang.String(d2,'UTF-8')).trim();\n  if(u2.indexOf('org.h:\/\/')===0) u2='https:\/\/'+u2.slice(8);\n  if(u2.indexOf('http')!==0) return '\\u26a0 \\u89e3\\u6790\\u51fa\\u7684\\u5730\\u5740\\u5f02\\u5e38\\uff1a'+u2.slice(0,100);\n  return u2;\n}catch(e7){ return '\\u26a0 \\u64ad\\u653e\\u5730\\u5740\\u89e3\\u5bc6\\u5931\\u8d25\\uff1a'+e7; }\n\n})()",
        "subContent": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nvar API='https:\/\/danmu.v2player.top:8989\/cxvbsfhapi.php\/barrage\/index';\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction TXT(c){\n  var is=c.getInputStream();\n  try{var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);}catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\nfunction looseSSL(c){\n  try{var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});c.setHostnameVerifier(hv);}catch(e){}\n}\nfunction REQ(url,method,body,ct,loose,ck){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','application\/json, text\/plain, *\/*');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    c.setRequestProperty('Origin','https:\/\/art.v2player.top:8989');\n    c.setRequestProperty('Referer','https:\/\/art.v2player.top:8989\/player\/');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){\n      c.setDoOutput(true);\n      if(ct)c.setRequestProperty('Content-Type',ct);\n      var os=c.getOutputStream();\n      os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));\n      os.flush();os.close();\n    }\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';}\n  return out;\n}\nfunction gt(h){h=S(h);if(!h)return true;return h.indexOf('系统安全验证')>=0||h.indexOf('verify_check')>=0;}\nfunction pass(b,ck){try{var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),'application\/x-www-form-urlencoded',false,ck);return {ok:String(r.h||'').indexOf('\"code\":1')>=0||String(r.h||'').indexOf('\"code\": 1')>=0,ck:String(r.sc||ck||'')};}catch(e){return {ok:false,ck:ck};}}\nfunction getPlay(u){\n  var ck='',g=REQ(u,'GET',null,'',false,null),h=S(g.h);\n  if(g.sc)ck=g.sc;\n  if(h&&!gt(h)&&h.length>2000)return h;\n  var m=\/^(https?:\\\/\\\/[^\\\/]+)\/.exec(u);\n  if(m){for(var i=0;i<2;i++){var p=pass(m[1],ck);ck=p.ck;if(!p.ok)break;g=REQ(u,'GET',null,'',false,ck);h=S(g.h);if(h&&!gt(h)&&h.length>2000)return h;}}\n  return h;\n}\nfunction esc(s){\n  s=S(s).replace(\/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]\/g,'');\n  return s.replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;').replace(\/'\/g,'&apos;');\n}\nfunction color10(c){var m=\/^#?([0-9a-fA-F]{6})$\/.exec(S(c).replace(\/\\s\/g,''));return m?parseInt(m[1],16):16777215;}\nfunction modeBili(m){var n=parseInt(m,10);if(n===1)return 5;if(n===2)return 4;return 1;}\nfunction DM_XML(list){\n  var out=['<?xml version=\"1.0\" encoding=\"UTF-8\"?>','<i>',\n           '<chatserver>chat.bilibili.com<\/chatserver>','<chatid>0<\/chatid>',\n           '<mission>0<\/mission>','<maxlimit>8000<\/maxlimit>','<state>0<\/state>',\n           '<real_name>0<\/real_name>','<source>k-v<\/source>'];\n  for(var i=0;i<list.length;i++){\n    var d=list[i]||{},t=parseFloat(d.time);\n    if(isNaN(t)||t<0)t=0;\n    var p=[t.toFixed(3),modeBili(d.mode),25,color10(d.color),0,0,0,String(i+1)].join(',');\n    out.push('<d p=\"'+p+'\">'+esc(d.text)+'<\/d>');\n  }\n  out.push('<\/i>');\n  return out.join('\\n');\n}\ntry{\n  var u=S(baseUrl);\n  var pm=\/\\\/play\\\/(\\d+)\\\/(\\d+)\\.html\/.exec(u);\n  var nid=pm?pm[2]:'1';\n  \/\/ dmid(番剧级ID) 优先从本次响应 HTML 取;result 被 content 改写时自己重抓一次播放页\n  var html=S(result),dm=\/\"?dmid\"?\\s*:\\s*\"?(\\d+)\"?\/.exec(html),vid=dm?dm[1]:'';\n  if(!vid&&u){var gp=getPlay(u);var dm2=\/\"?dmid\"?\\s*:\\s*\"?(\\d+)\"?\/.exec(gp);if(dm2)vid=dm2[1];}\n  if(!vid)return '';\n  var body=JSON.stringify({vid:parseInt(vid,10),sid:0,nid:parseInt(nid,10)});\n  var r=REQ(API,'POST',body,'application\/json;charset=UTF-8',false,null);\n  var txt=S(r.h);\n  if(!txt)r=REQ(API,'POST','vid='+parseInt(vid,10)+'&sid=0&nid='+parseInt(nid,10),'application\/x-www-form-urlencoded',true,null);\n  txt=S(r.h);\n  if(!txt)return '';\n  var list=[];\n  try{list=JSON.parse(txt).list||[];}catch(e){return '';}\n  if(!list.length)return '';\n  return DM_XML(list);\n}catch(e){return '';}\n})()"
    },
    "ruleExplore": {
        "author": "$.kind",
        "bookList": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n\/\/ 默认兜底线路(与发布页当前 4 条一致);实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(\/\\\/+$\/,'');\n      if(u.indexOf('https:\/\/')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  \/\/ 兼容旧书源遗留的 om_sn \/ om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(\/\\\/+$\/,'');if(v.indexOf('https:\/\/')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(\/\\\/+$\/,''),a=lines();if(c.indexOf('https:\/\/')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(\/\\\/+$\/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(\/^https?:\\\/\\\/\/,'')===hn)return a[i];}if(s.indexOf('https:\/\/')===0)return 'https:\/\/'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  \/\/ 用 ByteArrayOutputStream 生成 byte[],避开反射建数组的高危 API\n  \/\/ (Legado 登录面板\/部分真机环境里该 Class 会被解析成 JavaPackage 而非类)\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(\/^\\s+\/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  \/\/ 文本流读法:InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  \/\/ 全程不创建 Java byte[],避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\/\/ 最后一次重试用:跳过 SSL 证书\/主机名校验(应对被劫持的线路或自签播放器证书)\nfunction looseSSL(c){\n  \/\/ 最后一次重试兜底:只跳过主机名校验(足以应对 CN=*.10086.cn 这类劫持证书)。\n  \/\/ 不再自建 TrustManager[] —— 那需要反射创建 Java 数组,真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application\/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/[^\\\/]+(\\\/[^\\s]*)?$\/.exec(s);return m?(m[1]||'\/'):'\/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.charAt(0)==='\/')return b+u;return b+'\/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(\/\\\/+$\/,'')==='https:\/\/as.cfhls.top')return '';return u;}if(u.charAt(0)==='\/')return 'https:\/\/as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=\/anime\/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('\/anime\/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('\/play\/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    \/\/ 无封面不再跳过条目:隐藏轮播 banner 只有图床根路径背景,coverUrl 留空即可,\n    \/\/ 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面,则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||'');\nvar out=gt(h)?[]:parseList(h,b);\nif(out.length===0){\n  var r=pick(pth(baseUrl));\n  if(okPage(r.h)){out=parseList(r.h,r.b);}\n}\nreturn arr(null,out);\n})()",
        "bookUrl": "$.bookUrl",
        "coverUrl": "$.coverUrl",
        "kind": "$.kind",
        "lastChapter": "$.lastChapter",
        "name": "$.name"
    },
    "ruleSearch": {
        "author": "$.kind",
        "bookList": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n\/\/ 默认兜底线路(与发布页当前 4 条一致);实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(\/\\\/+$\/,'');\n      if(u.indexOf('https:\/\/')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  \/\/ 兼容旧书源遗留的 om_sn \/ om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(\/\\\/+$\/,'');if(v.indexOf('https:\/\/')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(\/\\\/+$\/,''),a=lines();if(c.indexOf('https:\/\/')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(\/\\\/+$\/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(\/^https?:\\\/\\\/\/,'')===hn)return a[i];}if(s.indexOf('https:\/\/')===0)return 'https:\/\/'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  \/\/ 用 ByteArrayOutputStream 生成 byte[],避开反射建数组的高危 API\n  \/\/ (Legado 登录面板\/部分真机环境里该 Class 会被解析成 JavaPackage 而非类)\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(\/^\\s+\/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  \/\/ 文本流读法:InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  \/\/ 全程不创建 Java byte[],避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\/\/ 最后一次重试用:跳过 SSL 证书\/主机名校验(应对被劫持的线路或自签播放器证书)\nfunction looseSSL(c){\n  \/\/ 最后一次重试兜底:只跳过主机名校验(足以应对 CN=*.10086.cn 这类劫持证书)。\n  \/\/ 不再自建 TrustManager[] —— 那需要反射创建 Java 数组,真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application\/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/[^\\\/]+(\\\/[^\\s]*)?$\/.exec(s);return m?(m[1]||'\/'):'\/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.charAt(0)==='\/')return b+u;return b+'\/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(\/\\\/+$\/,'')==='https:\/\/as.cfhls.top')return '';return u;}if(u.charAt(0)==='\/')return 'https:\/\/as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=\/anime\/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('\/anime\/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('\/play\/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    \/\/ 无封面不再跳过条目:隐藏轮播 banner 只有图床根路径背景,coverUrl 留空即可,\n    \/\/ 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面,则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar p=pth(baseUrl);\n\/\/ 少数版本 Legado 会把 baseUrl 里的百分号编码还原成中文,Java URL 不接受裸中文\nif(\/[^\\x00-\\x7F]\/.test(p)){try{p=encodeURI(p);}catch(ep){}}\nvar r=pick(p);\nvar out=okPage(r.h)?parseList(r.h,r.b):[];\nreturn arr(null,out);\n})()",
        "bookUrl": "$.bookUrl",
        "coverUrl": "$.coverUrl",
        "kind": "$.kind",
        "lastChapter": "$.lastChapter",
        "name": "$.name"
    },
    "ruleToc": {
        "chapterList": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n\/\/ 默认兜底线路(与发布页当前 4 条一致);实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(\/\\\/+$\/,'');\n      if(u.indexOf('https:\/\/')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  \/\/ 兼容旧书源遗留的 om_sn \/ om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(\/\\\/+$\/,'');if(v.indexOf('https:\/\/')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(\/\\\/+$\/,''),a=lines();if(c.indexOf('https:\/\/')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(\/\\\/+$\/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(\/^https?:\\\/\\\/\/,'')===hn)return a[i];}if(s.indexOf('https:\/\/')===0)return 'https:\/\/'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  \/\/ 用 ByteArrayOutputStream 生成 byte[],避开反射建数组的高危 API\n  \/\/ (Legado 登录面板\/部分真机环境里该 Class 会被解析成 JavaPackage 而非类)\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(\/^\\s+\/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  \/\/ 文本流读法:InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  \/\/ 全程不创建 Java byte[],避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\/\/ 最后一次重试用:跳过 SSL 证书\/主机名校验(应对被劫持的线路或自签播放器证书)\nfunction looseSSL(c){\n  \/\/ 最后一次重试兜底:只跳过主机名校验(足以应对 CN=*.10086.cn 这类劫持证书)。\n  \/\/ 不再自建 TrustManager[] —— 那需要反射创建 Java 数组,真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application\/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/[^\\\/]+(\\\/[^\\s]*)?$\/.exec(s);return m?(m[1]||'\/'):'\/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.charAt(0)==='\/')return b+u;return b+'\/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(\/\\\/+$\/,'')==='https:\/\/as.cfhls.top')return '';return u;}if(u.charAt(0)==='\/')return 'https:\/\/as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=\/anime\/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('\/anime\/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('\/play\/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    \/\/ 无封面不再跳过条目:隐藏轮播 banner 只有图床根路径背景,coverUrl 留空即可,\n    \/\/ 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面,则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||'');\nfunction tp(hh,bb){\n var out=[],seen={},d=Jp(hh);\n if(!d)return out;\n try{\n   var pane=first(d,'div[id^=playlist]');\n   var as=null;\n   try{if(pane)as=pane.select('a[href*=\/play\/]');}catch(e1){}\n   if(!as||as.size()===0){try{as=d.select('div[id^=playlist] a[href*=\/play\/]');}catch(e2){}} \n   if(!as||as.size()===0){try{as=d.select('a[href*=\/play\/]');}catch(e3){}} \n   if(as&&as.size()>0){\n     for(var i=0;i<as.size();i++){\n       var a=as.get(i),u=attr(a,'href');\n       if(u.indexOf('\/play\/')<0||seen[u])continue;\n       seen[u]=1;\n       var n=attr(a,'title')||txt(a);\n       if(!n)n='\\u7b2c'+(out.length+1)+'\\u96c6';\n       out.push(JSON.stringify({n:n,u:abs(bb,u)}));\n     }\n   }\n }catch(ez){}\n return out;\n}\nvar out=gt(h)?[]:tp(h,b);\nif(out.length===0){var r1=pick(pth(baseUrl));out=tp(r1.h,r1.b);}\nreturn arr(null,out);\n})()",
        "chapterName": "$.n",
        "chapterUrl": "$.u"
    },
    "searchUrl": "@js:(function(){\nvar UA='Mozilla\/5.0 (Linux; Android 13; SM-G991B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n\/\/ 默认兜底线路(与发布页当前 4 条一致);实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https:\/\/www.omofuns.com','https:\/\/cn.233dm.com','https:\/\/cn.211dm.com','https:\/\/cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(\/\\\/+$\/,'');\n      if(u.indexOf('https:\/\/')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  \/\/ 兼容旧书源遗留的 om_sn \/ om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(\/\\\/+$\/,'');if(v.indexOf('https:\/\/')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(\/\\\/+$\/,''),a=lines();if(c.indexOf('https:\/\/')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(\/\\\/+$\/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(\/^https?:\\\/\\\/\/,'')===hn)return a[i];}if(s.indexOf('https:\/\/')===0)return 'https:\/\/'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  \/\/ 用 ByteArrayOutputStream 生成 byte[],避开反射建数组的高危 API\n  \/\/ (Legado 登录面板\/部分真机环境里该 Class 会被解析成 JavaPackage 而非类)\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=\/^https?:\\\/\\\/([^\\\/]+)\/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(\/^\\s+\/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  \/\/ 文本流读法:InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  \/\/ 全程不创建 Java byte[],避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\/\/ 最后一次重试用:跳过 SSL 证书\/主机名校验(应对被劫持的线路或自签播放器证书)\nfunction looseSSL(c){\n  \/\/ 最后一次重试兜底:只跳过主机名校验(足以应对 CN=*.10086.cn 这类劫持证书)。\n  \/\/ 不再自建 TrustManager[] —— 那需要反射创建 Java 数组,真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application\/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'\/index.php\/ajax\/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=\/^https?:\\\/\\\/[^\\\/]+(\\\/[^\\s]*)?$\/.exec(s);return m?(m[1]||'\/'):'\/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.charAt(0)==='\/')return b+u;return b+'\/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('\/\/')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(\/\\\/+$\/,'')==='https:\/\/as.cfhls.top')return '';return u;}if(u.charAt(0)==='\/')return 'https:\/\/as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=\/anime\/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('\/anime\/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('\/play\/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    \/\/ 无封面不再跳过条目:隐藏轮播 banner 只有图床根路径背景,coverUrl 留空即可,\n    \/\/ 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面,则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=curLine();\nreturn b+'\/search\/'+encodeURIComponent(String(key))+'----------{{page}}---.html';\n})()",
    "weight": 0
}
广告