[
  {
    "articleStyle": 0,
    "customOrder": -10101001,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "injectJs": "//$(\"div.layui-panel\").eq(0).remove();\nsetInterval(function () {\n    $(\"div.layui-hide-md\").css(\"display\",\"none\");\n},100)",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "singleUrl": true,
    "sourceGroup": "202",
    "sourceIcon": "https://www.yckceo.com/favicon.ico",
    "sourceName": "源仓库(去底部广告）",
    "sourceUrl": "https://www.yckceo.com/"
  },
  {
    "articleStyle": 0,
    "customOrder": -10101000,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "id.content@h3",
    "ruleLink": "a@href",
    "ruleTitle": "a@textNodes",
    "singleUrl": true,
    "sortUrl": "首页::http://yuedu.miaogongzi.net/gx.html",
    "sourceGroup": "书源",
    "sourceIcon": "https://i.loli.net/2021/06/23/S7rvWRZtPIq34MJ.png",
    "sourceName": "喵公子书源管理",
    "sourceUrl": "http://yuedu.miaogongzi.net/gx.html"
  },
  {
    "articleStyle": 0,
    "customOrder": -10100998,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "@js:\ncache.putMemory('lycdrdm',String.raw`\n<html>\n<head>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n    <title>导入</title>\n    <style>\n        body {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            min-height: 80vh;\n        }\n        textarea {\n            font-size: 12px;\n            width: 96%;\n            margin: 16px 2%;\n            padding: 8px;\nbackground-color: rgba(80, 155, 84, 0.1);\nborder-radius: 10px;\n    border: 2px solid rgba(76, 175, 80, 0.3);\n        }\ntextarea:focus {\n    border-color: rgb(76, 175, 80);\n    outline: none;\n    box-shadow: 0 0 8px rgba(255, 107, 107, 0.3);\n  }\n        button {\n            user-select: none;\n            color: white;\n            border: none;\n            border-radius: 4px;\n            height: 40px;\n            width: 80px;\n            overflow: hidden;\n            transition: 0.3s;\n            font-size: 16px;\n        }\n        .an-s {\n        \ttransform: scale(0.8);\n        }\n        #btn1 {background-color: rgba(76, 175, 80, 0.9);}\n        #btn2 {background-color: rgba(175, 76, 80, 0.9);}\n        #btn3 {background-color: rgba(76, 80, 175, 0.9);}\n    </style>\n</head>\n<body>\n    <textarea id=\"copyt\" rows=\"9\" placeholder=\"在这里填写链接\n支持书源、订阅源、净化、字典等json或txt文件\n支持书籍网址（需要有对应的书源）\n支持data或base64加密链接\"></textarea>\n    <br>\n    <button id=\"btn1\" onclick=\"copy(1)\">导入</button>\n<br>\n<button id=\"btn2\" onclick=\"cleart()\">清空</button>\n<br>\n<button id=\"btn3\" onclick=\"copy(3)\">净化</button>\n    <script>\n        function copy(x) {\n            const btn = document.getElementById('btn'+x);\n            btn.classList.add('an-s');\n            const cpt = document.getElementById(\"copyt\");\n            let url = cpt.value;\nif (/[删除去消].*(?:[删除去掉].*[中汉我]|汉.*字|中.*文|文.*字)/.test(url)) url=url.replace(/[abphm]站|[一-ꀀ]/g,'');\n            url = url.replace(/\\n[一-ꀀ，。？！；…“‘、’”]*$/,'').replace(/\\s+|😂|🌚|🌝|🙄|😳|🙃|😊|😍|😘|😏|😱|😭|😒|🤔|😛|😅|🙈|🙊|🙉|🌸|🍀|🌹|🌷|💎|💄|💋|🉑|㊗️|💰|🌈|🦄|🥚|🥟|🌶️|🐔|🍺|🐮|🐻|🐶|🐼|🐖|🐴|🐈|🐕|🧸|🦌|🐟|🐇|🕊️|🦞|🖤|❤️|💚|💙|💕|☎️|🎁|🧧|🎉|🎊|🙋|🙆|👰|🇨🇳|🌏|🔥|🥱|😷|😴|😡|😌|😉|😎|🤓|🥳|🥺|🥰|🤒|🤐|🤭|👿|👻|💩|💊|🍉|🍔|🍋|🥭|🍓|🥒|🥠|🍇|⚽|🏀|🏓|🛀|🃏|🎲|🀄|🎹|🎧|📢|🚗|🚢|🚆|✈️|🚀|🈶|🈚|㊙️|🈲|♠️|♥️|♣️|♦️|➕|➖|✖️|➗|✔️|😮‍💨|😵‍💫|🥸|🔞|🤚|🫱|🫲|🫳|🫴|👌|👍|🤌|🫰|🫵|🫶|✌️|🤟|💪|👏|🤙|🙏|🙇‍♂️|🤷‍♂️|🤦‍♂️|🌺|\\[(?:酷币|受虐滑稽|微笑|哈哈哈|呵呵|呲牙|可爱|可怜|皱眉|惊讶|微笑|坏笑|流泪|抱拳|色|强|doge笑哭|doge原谅ta|旺财|OK)\\]/giu, '').replace(/(\\/.+\\.(?:json|txt))(?:[^\\/\\?\\-\\_\\.][\\S\\s]*)$/, '$1').replace(/^[\\S\\s]+?(?=https?:)/i,'').replace(/\\u0026/g,'%26');\nif (url.startsWith('data:')) url = atob(url.match(/^[^,]+,([^\\s,]+)/)[1]);\nif (/^[\\da-z\\+\\/]{2,}=*$/i.test(url)) url = atob(url);\n            setTimeout(() => {\n                btn.classList.remove('an-s');\n            }, 500);\n            if (url == '') {alert('请输入内容');return}\n            if (/^https?\\:/i.test(url)&&x==1) {\n                if (/\\/.+\\.(?:json|txt)/i.test(url)) {\n                    window.location.href = 'legado://import/Source?src=' + url;\n                }\n                else {\n                    window.location.href = 'legado://import/addToBookshelf?src=' + url;\n                }\n            }\n           else if (x==3) {cpt.value=url;}\n           else alert('链接格式错误');\n        }\nfunction cleart() {\nconst btn = document.getElementById('btn2');\nbtn.classList.add('an-s');\nconst cpt = document.getElementById(\"copyt\");\nsetTimeout(() => {\n                btn.classList.remove('an-s');\n            }, 300);\ncpt.value = '';\n  }\n    </script>\n</body>\n</html>\n`);\r\n''",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": false,
    "ruleArticles": "",
    "ruleLink": "",
    "ruleTitle": "",
    "singleUrl": true,
    "sourceComment": "版本：1.1.1\n——洛娅橙",
    "sourceGroup": "202",
    "sourceIcon": "https://gitee.com/lyc486/yuedu/raw/master/drtb.gif",
    "sourceName": "导入",
    "sourceUrl": "http@js:`data:text/html;base64,${java.base64Encode(cache.getFromMemory('lycdrdm'))}`"
  },
  {
    "articleStyle": 0,
    "customOrder": -10100997,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "singleUrl": true,
    "sourceGroup": "202",
    "sourceIcon": "https://www.yckceo.com/favicon.ico",
    "sourceName": "源仓库",
    "sourceUrl": "https://yckceo.vip/"
  },
  {
    "articleStyle": 0,
    "customOrder": -10100996,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "singleUrl": true,
    "sourceGroup": "202",
    "sourceIcon": "https://yckceo.vip/favicon.ico",
    "sourceName": "源仓库(官方纯净)",
    "sourceUrl": "https://www.yckceo.com/yuedu/shuyuan/index.html"
  },
  {
    "articleStyle": 0,
    "concurrentRate": "6/1000",
    "customOrder": -10100995,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "@js:JSON.stringify({\n\"User-Agent\":java.getWebViewUA().replaceAll(\"; wv| Version/[345].0\",''),\n\"X-Requested-With\":\"XMLHttpRequest\"\r\n})",
    "jsLib": "function gengxin(){\nconst {java, source} = this;\n\tlet url0='https://gitee.com/lyc486/yuedu2/commits/main/订阅/洛娅橙/lyc.json?browser_history=0&page=1&per=3';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet gxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:3].title');\n\tlet [gxlr, gxlr2, gxlr3] = gxlrr;\n\tlet banben = String(source.sortUrl).match(/let banben=\"([\\d\\.]+)\"/)[1];\n\tgxlr=String(gxlr).split(/^([^\\-]+)-/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 0 auto;\n\t}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n  transition: 0.4s;\n}\nbutton span:after {\n  content: '>';\n  position: absolute;\n  opacity: 0;\n  top: 0;\n  right: 30px;\n  transition: 0.2s;\n}\nbutton:active span {\n  padding-right: 20px;\n}\nbutton:active span:after {\n  opacity: 1;\n  right: -40px;\n}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志：${gxlr[2]}</th>\n<tr>\n<td>仓库版本：${gxlr[1]}</td>\n<td>本地版本：${banben}</td>\n</tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志：${gxlr2}<br>　　　　　${gxlr3}</td>\n</tr>\n</table>\n<div class=\"ann\">\n<a href=\"legado://import/importonline?src=https://gitee.com/lyc486/yuedu2/raw/main/订阅/洛娅橙/lyc.json\">\n<button><span>${gxts[0]}</span></button>\n</a>\n</div>\n<p style=\"font-size: 16px;\">导入订阅源窗口需手动选中，然后确认</p>\n<a href=\"legado://import/importonline?src=https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/订阅/洛娅橙/lyc.json\" style=\"font-size: 10px;\">备用链接</a>\n</body>\n</html>`;\nif(gxts[0]=='更新') {\njava.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'订阅源更新');return false;}\nreturn true;\r\n}\n\ntoastjs=`const toastStyle = document.createElement('style');\ntoastStyle.textContent = \".toast-container {position: fixed; z-index: 1000; pointer-events: none; display: flex; flex-direction: column; align-items: center;} .toast-container.top-center { top: 20px; left: 50%; transform: translateX(-50%); } .toast-container.top-left { top: 20px; left: 20px; } .toast-container.top-right { top: 20px; right: 20px; } .toast-container.bottom-center { bottom: 20px; left: 50%; transform: translateX(-50%); } .toast-container.bottom-left { bottom: 20px; left: 20px; } .toast-container.bottom-right { bottom: 20px; right: 20px; } .toast {background: rgba(0, 0, 0, 0.8); color: white; padding: 12px 14px; border-radius: 4px; margin-bottom: 10px;  word-break: initial; max-width: 80vw; opacity: 0; transform: translateY(20px); transition: opacity 0.3s, transform 0.3s; pointer-events: none;} .toast.show {opacity: 1; transform: translateY(0);} .toast.success {background: rgba(46, 204, 113, 0.9);} .toast.error {background: rgba(231, 76, 60, 0.9);} .toast.warning {background: rgba(241, 196, 15, 0.9);} .toast.info {background: rgba(52, 152, 219, 0.9);}\";\ndocument.head.appendChild(toastStyle);\nfunction showToast(message, duration = 3000, type = 'default', position = 'bottom-center') {\n  let container = document.querySelector('.toast-container');\n  if (!container) {\n    container = document.createElement('div');\n    container.className = 'toast-container';\n    document.body.appendChild(container);\n  }\n  container.className = \"toast-container \" + position;\n  const toast = document.createElement('div');\n  toast.className = \"toast \" + type;\n  toast.innerHTML = message;\n  container.appendChild(toast);\n  setTimeout(() => {\n    toast.classList.add('show');\n  }, 10);\n  setTimeout(() => {\n    toast.classList.remove('show');\n    setTimeout(() => {\n      if (toast.parentNode) {\n        toast.parentNode.removeChild(toast);\n      }\n    }, 300);\n  }, duration);\n}`;",
    "lastUpdateTime": 1770225326519,
    "loadWithBaseUrl": true,
    "loginUi": "[\n    {\n    \t\"name\": \"💾仓库\",\n    \t\"type\": \"button\",\n    \t\"action\": \"java.startBrowser('https://github.com/Luoyacheng/yuedu','')\",\n        \"style\": {\n            \"layout_flexGrow\": 2,\n            \"layout_flexBasisPercent\": -1,\n            \"layout_wrapBefore\": true}\n    \t},\n    \t{\n        \"name\": \"🔘樱花效果\",\n        \"type\": \"button\",\n        \"action\": \"bfqfun('樱花效果')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1,\n            \"layout_wrapBefore\": flase}\n    },\n    \t{\n        \"name\": \"🧬激活\",\n        \"type\": \"button\",\n        \"action\": \"jihuo()\",\n        \"style\": {\n            \"layout_flexGrow\": 2,\n            \"layout_flexBasisPercent\": -1,\n            \"layout_wrapBefore\": flase}\n    }\n]",
    "loginUrl": "function login(){}\nfunction bfqfun(x) {\nlet xx = source.get('lyc'+x);\n//默认开启\nif(xx!=2) {source.put('lyc'+x,2);java.toast('⚫已关闭 '+x);}\nelse {source.put('lyc'+x,1);java.toast('🟢已开启 '+x);}\n\t}\nfunction jihuo() {\nlet sleep=Packages.java.lang.Thread.sleep;\t['　　　　　','·　　　　','··　　　','···　　','····　','·····'].forEach((_,i) =>{i+=6;cache.put('lycjihuo',Date.now()+'洛娅橙'+i);do{java.toast('\\n\\n正在激活'+_+'\\n');sleep(50);}while(--i)});\nif (+cache.get('lycjihuo').match(/\\d+/)+3e3>Date.now())\nif (cache.get('lycjihuo').endsWith(1)&&gengxin())\njava.longToast(`\n\n成功激活　　　　　\n版本号：${source.get('bb')}`);\nelse {cache.put('lycjihuo','');java.longToast('\\n\\n激活失败　　　　　\\n');}\n}",
    "ruleArticles": "<js>\nvar h=\"https://gitee.com\";\nvar i=h+\"/lyc486/yuedu/raw/master/favicon.svg\";\nvar m='https://miaogongzi.lanzout.com/';\nif (baseUrl.includes('\"type\":\"sy\"')) {\nif (Math.random()<0.5) gengxin();\n//java.put('xyy',m+'b01rgkhhe');\n    result=java.getElement('$..blobs[*]');\n\t[{\n\t\tn:'主页',\n\t\tt:'个人网页',\n\t\ti:i,\n\t\tu:'data:;base64,QQ,{\"type\":\"url\"}'\n}].concat(\n    [{\n        n:'阅读Sigma版 下载',\n        i:i,\n        t:java.timeFormat(new Date()),\n        u:h+'/api/v5/repos/lyc486/legado/releases?page=1&per_page=6&direction=desc'\n    }]\n,\nArray.from(result).map(x=>{\n\tlet n=x.name;\n\tlet t=x.last_commit.time;\n\treturn {\n\t\tn:n.includes('.apk')?('阅读：'+n):'',\n\t\tt:t?java.timeFormat(new Date(t)):'',\n\t\ti:i,\tu:`@js:'data:;base64,${java.base64Encode(x.url)},{\"type\":\"url\"}'`};\n}).reverse()\n)\n\n}\n else if (baseUrl.startsWith('data')) {\n    let ssr = java.ajax(\"https://gitee.com/lyc486/yuedu2/file_list?ref=main\");\n    let key = java.hexDecodeToString(result);\n    let ma = ssr.match(new RegExp('\\\"[^\"]*'+key+'[^\"]*\\\"',\"gi\"));\n    if (ma==null) {[];}\n    else {\n        ma.map( x => {\n            let y= x.match(/^\"([^\\/]+)\\/([^\\/]+)\\//);\n            if (y==null) {\n                return {};\n            }\n      return {\n        n:y[2],\n        i:i,\n        t:y[1],\n        u:h+\"/lyc486/yuedu2/tree/main/\"+y[1]+\"/\"+y[2]+',{\"webView\": true}'\n    };\n        })\n    }\n} else if (baseUrl.includes(m)) {\n    let webr = result;\neval(webr.match(/var pgs;(?:\\s*.+){3}/)[0]);\neval('var obj={'+webr.match(/data :\\s*\\{[^}]+\\}/)+'}');\nlet body = Object.entries(obj.data)\n.map(([key, value]) => `${key}=${value}`)\n.join('&');\nwebr = java.ajax(m+'filemoreajax.php'+`,{\"method\":\"POST\",\"body\":\"${body}\"}`);\nwebr = com.jayway.jsonpath.JsonPath.read(webr,'$.text[*]');\nArray.from(webr).map(x=>{\n\treturn {\n\t\tn:x.name_all,\n\t\tt:'喵公子 蓝奏云 '+x.time,\n\t\ti:i,\n\t\tu:m+x.id+',{\"webView\": true}'};\n});\n}\nelse {\nresult=java.getElement('$..tree[*]');\nArray.from(result).map(x=>{\n\treturn {\n\t\tn:x.path,\n//\t\tt:java.timeFormat(new Date(x.last_commit.time)),\n\t\ti:i,\n\t\tu:x.url};\n})\n}\n</js>",
    "ruleContent": "@js:\r\nlet title,title2,durl,body='';\r\ntry {title=rssArticle.title;title2=rssArticle.sort;}\ncatch (err) {\nsource.put('bb','0.0.0');\nif (baseUrl.includes(encodeURI('字典')))\ntitle='字典';\nelse if (baseUrl.includes(encodeURI('净化')))\ntitle='净化';\nelse if (baseUrl.includes(encodeURI('目录')))\ntitle='目录';\nelse if (baseUrl.includes('miaogongzi.lanz'))\ntitle='蓝奏';\nelse title='主页',java.toast('请安装测试版');\ntitle2=title;}\ntry {durl=java.hexDecodeToString(result);\ntitle2='软件下载';\ntitle=title.replaceAll('legado_app_','');}catch(e){}\nif (baseUrl.includes('miaogongzi.lanz'))\nresult = `<html><head>\n<meta http-equiv=\"refresh\" content=\"0; url='https://miaogongzi.lanzout.com${java.getString('#downurl@href')}\">\n</head>\n</html>`;\nelse if (title == '主页')\r\nresult = `<html><head>\n<meta http-equiv=\"refresh\" content=\"0; url='https://loyc.xyz\">\n</head>\n</html>`;\nelse if (title.includes('Sigma版')) {\n    body+=`<h1>下载Sigma</h1><a href=\"https://gitee.com/lyc486/legado/commits/main\">完整日志</a>`;\n  let webg = com.jayway.jsonpath.JsonPath.parse(result);\nlet chars = webg.read('$[*]');\n//Packages.java.util.Collections.reverse(chars);\nfor (let char of chars) {\n    body+=`<hr>`;\n    let nm = char.name;\n    body+=`<h3>版本：${nm}</h3>`;\n    let body2 = (char.body+'').replace(/(\\s[\\-*]\\s)/g,'<br>$1');\n    body+=`<p>更新内容：</p><pre style=\"white-space: pre-line;\">${body2}</pre>`;\n    let ls=char.created_at;\n    let time =java.timeFormat(new Date(ls));\n    body+=`<p>更新时间：${time}</p>`;\n    let apks = char.assets;\n    for (let apk of apks) {\n        let nm = apk.name;\n        if (nm.endsWith('apk')) {\n            let durl = apk.browser_download_url;\n            body+=`<h4>名称：${nm}</h4>\n            <div class=\"dls\">\n            <a class=\"dlb dlbs btn1\" href=\"${durl}\">立即下载</a>\n            <a class=\"dlb dlbs btn2\" href=\"yuedu://opapp/${durl}\">下载器</a>\n            </div>\n            `;\n        }\n    }\n    body+=`<br><br>`;\n  }\n}\nelse if (title2 == '软件下载') {\nif (!durl.startsWith(\"https:\"))\tdurl='https://yd.loyc.xyz'+durl.match(/main(.+)/)[1];\nbody=`<h3>${title}</h3><div class=\"dl\">\n<a class=\"dlb btn1\" href=\"${durl}\">立即下载</a>\n<a class=\"dlb btn2\" href=\"yuedu://opapp/${durl}\">使用下载器</a>\n</div>`;\n} else {\n    let trs = java.getElement(\"$.tree[*]\");\r\n    let re = '';\n    for (let tr of trs) {\n        if (tr.type==\"blob\") {\n            let nm = tr.path;\n            let rzurl = \"https://gitee.com/lyc486/yuedu2/commits/main/\" + title2+\"/\"+title+\"/\"+nm;\n      let url = rzurl + '?browser_history=0&page=1&per=5';\r\n        let rzs = java.ajax(url);\r\n        rzs = com.jayway.jsonpath.JsonPath.read(rzs, '$.list[0:5]');\n        let i = 0;\n        for (let rz of rzs) {\n            if (i==0) {\n                if (title == '洛娅橙') {\r\n            let banben1=String(rz.title).match(/^([^\\-]+)-/);\r\n            banben1 = banben1 ? banben1[1] : '9.9.9';\r\n            let banben2 = String(source.sortUrl).match(/let banben=\"([\\d\\.]+)\"/)[1];\r\n            if (banben1>banben2) java.longToast('\\n订阅源本体有更新');\r\n        }\n        re += `<tr style=\"height: 0.1em;\"></tr>\r\n<tr>\r\n<td colspan=\"4\">${nm}</td>\r\n<td class=\"time\" colspan=\"3\">\n${java.timeFormat(new Date(rz.date).getTime())}\n</td>\r\n<td colspan=\"1\"><a href=\"${rzurl}\">查看</a></td>\r\n</tr>\r\n<tr style=\"height:3em;\" data-url=\"${rzurl}\">\r\n<td colspan=\"2\"><button class=\"btn\" id=\"btn1\">导 入</button></td>\r\n<td colspan=\"2\"><button class=\"btn\" id=\"btn2\">导 入</button></td>\r\n<td colspan=\"2\"><button class=\"btn\" id=\"btn3\">备 用</button></td>\r\n<td colspan=\"2\"><button class=\"btn\" id=\"btn4\">备 用</button></td>\r\n</tr>`;\nre += `<tr><td style=\"text-align: left;\" colspan=\"8\"><p id=\"sgtxt\">${rz.title}</p>`;\n            } else {\n re += `<p>${rz.title}</p>`;\n            }\n            i++;\n        }\n        re += `</td></tr>`;\n//处理re结束\n                 \n        }\n    }\n\nbody=`<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\" align=\"center\">\n<caption><h2>${title}</h2></caption>\n<tr>\n<td colspan=\"4\">文件名</td>\n<td colspan=\"3\">更新时间</td>\n<td colspan=\"1\">日志</td>\n</tr>\n${re}\n<tr><td id=\"js\" colspan=\"4\"></td><td id=\"ts\" colspan=\"4\"></td></tr>\n</table>`;\r\n}\n\nif (body!='') {\nlet yht='',yhjs='';\nif (source.get('lyc樱花效果')!=2) {\nyht='<div id=\"gif-c\"><img id=\"yhs-gif\" src=\"https://wimg.588ku.com/gif320/24/07/09/eaa8a92d993345498c6329443903499c.gif\" alt=\"gif-yhs\"></div>';\nyhjs=source.get('yhxyapi');\nif (yhjs.length()<3999) {\n\tyhjs = java.ajax('https://gitee.com/lyc486/yuedu/raw/master/yinghua.js');\n\tif (yhjs.length()>3999)\n\tsource.put('yhxyapi',yhjs);\n\telse yhjs='';}\n\tyhjs=`<script>${yhjs}</script>`;}\n\nresult = `<!DOCTYPE html>\n<html><head>\n<title>${title2}</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\r\n<style>\n:root {\n\t--show-color: rgba(100,100,100,0.7);}\n@media (prefers-color-scheme: dark) {\n\t:root {\n\t--show-color: rgba(250,250,250,0.9);}\n}\n@keyframes pulse {\n\t0% { box-shadow: 0 0 0 0 rgba(150, 201, 61, 0.7); }\n\t70% { box-shadow: 0 0 0 15px rgba(150, 201, 61, 0); }\n\t100% { box-shadow: 0 0 0 0 rgba(150, 201, 61, 0); }\n}        \n\nhtml {\noverflow-x: clip;}\nbody {\nuser-select: none;\nheight: -webkit-fill-available;\nposition: relative;\noverflow: hidden;}\n.dl {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\t}\n.dls {\n\tdisplay: flex;\n\tflex-direction: row;\n    justify-content: center;\n\talign-items: center;\n}\n.btn1 {\n\t\tbackground: linear-gradient(to right, #00b09b, #96c93d);\t\n}\n.btn2 {\n\t\tbackground: linear-gradient(to right, #c93d96, #b09b00);\t\n}\n.dlb {\n\tanimation: pulse 2s infinite;\n\twidth: 33%;\n\tdisplay: inline-block;\n\tcolor: white;\n\tpadding: 18px 45px;\n\tfont-size: 1.4rem;\n\tfont-weight: 600;\n\tborder-radius: 60px;\n\ttext-decoration: none;\n\tbox-shadow: 0 10px 25px rgba(0, 176, 155, 0.4);\n\ttransition: all 0.3s ease;\n\tposition: relative;\n\tmargin: 30px 0;\n\toverflow: hidden;\n\tborder: none;\n\ttext-align: center;\n\t-webkit-tap-highlight-color: transparent;\n}\n.dlbs {\n    width: 22%;\n    padding: 8px 16px;\n    font-size: 0.8rem;\n   margin: 0 16px;\n}\n.dlb:hover {\n\ttransform: translateY(-5px);\n\tbox-shadow: 0 15px 30px rgba(0, 176, 155, 0.6);\n}\n.dlb:active {\n\ttransform: translateY(0);\n}\n.dlb::after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: -50%; left: -60%;\n\twidth: 20px; height: 200%;\n\tbackground: rgba(255, 255, 255, 0.3);\n\ttransform: rotate(25deg);\n\ttransition: all 0.6s;\n}\n.dlb:hover::after {\n\tleft: 120%;\n}\ntable {\nwidth: 100%;\ntable-layout: fixed;\ntext-align: center;\nmargin: 0 auto;\nword-break: break-all;}\r\n.time,.txt-s {font-size:10pt;}\na {text-decoration: none;}\np {padding-left: 5ex;\ntext-indent: -5ex;\nmargin: 0 auto;}\n#gif-c {\nposition: fixed;\ntop: -5px;\nright: 0px;\nz-index: 9;}\n#yhs-gif {\nwidth: 110px;\nheight: auto;}\n#sgtxt {\ntext-shadow: 0 0 4px var(--show-color);}\n</style></head>\n<body>\n${body}\n${yht}\n<script> \n${toastjs}\n</script> \n<script> \nfunction daoru(url,id,copy=false) {\n\turl = url.match(/\\\\/main\\\\/(.+)/)[1];\n\tvar yy=\"\";\n\tswitch(id) {\n\t\tcase \"1\": yy = \"https://gitee.com/lyc486/yuedu2/raw/main/\";break;\n\t\tcase \"2\": yy = \"https://yd.loyc.xyz/\";break;\n\t\tcase \"3\": yy = \"https://raw.githubusercontent.com/Luoyacheng/yuedu/main/\";break;\n\t\tcase \"4\": yy = \"https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/\";break;}\nyy += url;\nif (copy) return yy;\nwindow.location.href=\"legado://import/importonline?src=\"+yy;}\n\nconst js=document.getElementById('js');\nconst ts=document.getElementById('ts');\nlet Timer = null;\nlet Timer2 = null;\nlet pressTime = 0;\nlet timerInterval = null;\nconst btns = document.querySelectorAll('.btn');\nbtns.forEach(btn => {\r\nbtn.addEventListener('pointerdown', function () {\n\tconst btnId = this.id.replace('btn', '');\n\tconst url = btn.closest(\"tr\").dataset.url;\n\tpressTime = 0;\n\ttimerInterval = setInterval(() => {\n\t\tpressTime += 10;\n\t\tjs.textContent = pressTime+\"ms\";\n\t\t}, 10);\n\t\tTimer = setTimeout(() => {\n   copyToClipboard(daoru(url, btnId,true));\n }, 800);\n});\n\r\nbtn.addEventListener('pointerup', function () {\r\nclearTimeout(Timer);\nclearInterval(timerInterval);\nif (pressTime > 0 && pressTime < 800) {\nconst btnId = this.id.replace('btn', '');\nconst url = btn.closest(\"tr\").dataset.url;\ndaoru(url, btnId);}\nTimer2 = null;\nTimer2 = setTimeout(() => {\nts.textContent = js.textContent = \"\";\n }, 900);\n});\n\r\nbtn.addEventListener('pointercancel', function () {\nclearTimeout(Timer);\nclearInterval(timerInterval);\n});\n\n});\n\nfunction copyToClipboard(text) {\nnavigator.clipboard.writeText(text).then(() => {\nts.textContent = \"已复制订阅链接\";\n}).catch(err => {\n showToast(\"复制失败: \" + err);\n});\n}\n</script>\n${yhjs}\r\n</body>\r\n</html>`;}\r\nresult",
    "ruleImage": "i",
    "ruleLink": "u",
    "ruleNextPage": "@js:java.get('xyy');",
    "rulePubDate": "t",
    "ruleTitle": "n",
    "shouldOverrideUrlLoading": "var k=/^yuedu:/.test(url);\nif (k)\njava.openUrl(url.replace('yuedu://opapp/',''),'application/octet-stream');\nk",
    "singleUrl": false,
    "sortUrl": "<js>\r\nlet banben=\"2.3.0\";\nsource.put('bb',banben);\r\njava.toast('\\n欢迎🎉');\nlet url = \"https://gitee.com/api/v5/repos/lyc486/yuedu2/git/trees/main\";\r\nlet rr = java.ajax(url);\nlet trs = com.jayway.jsonpath.JsonPath.read(rr, '$..tree[*]');\r\nlet re = '首页::data:;base64,qq,{\"type\":\"sy\"}\\n';\nfor (let tr of trs) {\n    let nm = tr.path;\n    if (/^[一-ꀀ]/.test(nm)) {\n        let ur=tr.url;\n     re += nm+'::'+ur+'\\n';\n}\n}\r\nPackages.java.lang.Thread.sleep(100);\r\nre\r\n</js>",
    "sourceComment": "data:;base64,{{java.base64Encode(key)}},{\"type\":\"lyc\"}",
    "sourceIcon": "https://gitee.com/lyc486/yuedu/raw/master/favicon.gif",
    "sourceName": "洛娅橙的订阅",
    "sourceUrl": "https://www.luoyacheng.ip-ddns.com"
  },
  {
    "articleStyle": 0,
    "concurrentRate": "",
    "contentBlacklist": "",
    "customOrder": -10100994,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.0.0; MI 5s Plus Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36\",\n\t\"upgrade-insecure-requests\": \"1\",\r\n\"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\",\r\n\"accept-language\": \"zh-CN,en-US;q=0.9\",\r\n\"cookie\": \"down_ip=1\",\r\n\"x-requested-with\": \"cn.nr19.mbrowser\"\n}",
    "injectJs": "",
    "lastUpdateTime": 1739808000251,
    "loadWithBaseUrl": true,
    "loginUi": "",
    "loginUrl": "a = String(source.sourceComment);\nreg1 = /\\s*『.*?』\\s*/g\nreg2 = /.+《(.*?)》.*/\nsortName = []\n\nb = a.match(reg1);\nb = a.split(reg1).map((list, i) => {\n    if (!/^\\s*$/.test(list)) {\n        try {\n            sort = b[i - 1].match(/『(.*?)』/)[1] + \"::\";\n        }\n        catch (err) {\n            sort = \"🌟 精选推荐::\"\n        }\n\n        url = [];\n        Sort = [\"\"];\n        list.split(/\\s*\\n\\s*/).map(text => {\n            text = String(text);\n            if (text.split('::').length == 2 && /^(?!.*(&&|•)).*::/.test(text)) {\n                Sort.push(text);\n            } else {\n                text.split(/\\s*(&&|•)\\s*/).map(text => {\n                    if (text.split('::').length == 2) Sort.push(text);\n                    else if (!/^\\s*::/.test(sort) && reg2.test(text)) url.push(text);\n                });\n            }\n        });\n        return sort += url.join('•') + Sort.join('\\n');\n    }\n    return list\n}).map(text => {\n    text = String(text).replace(/^\\s*::\\s*|\\s*::\\s*$/g, '');\n    \ntext = text.split('\\n').map(text=>{\n    if (/《/.test(text)) text = text.replace(/^(.+?::)(https?\\:\\/\\/(www.)?baidu.com\\/?\\?wd=\\s*)*/, '$1https://www.baidu.com/?wd=');\n\n\n// 更改连接符\n    return text.replace(/\\s*(♞♞|★)\\s*/g, '•');\n  }).join('\\n');\n    if (/::/.test(text)) {\n        sortName.push(text.replace(/::.*/g, ''))\n        return text\n    }\n    return \"\";\n}).join('\\n');\n\n\n\n\n\n\n\n\n\n\nfunction set(json) {\n    json = JSON.stringify(json).replace(/(\".+?)(\\d[,}])/g,'\\n\\t\\t$1 $2').replace(/}$/,'\\n}');\n    return source.setVariable(json);\n}\n\nfunction get() {\n    try {\n        v = JSON.parse(source.getVariable());\n    } catch (e) {\n        v = null\n    }\n    if (v == null || Array.isArray(v)) v = {};\n}\nget()\n\nsortName = sortName.join(',').replace(/\\s*\\n\\s*/g, ',').split(',').map($ => {\n    $ = $.trim()\n    if (v[$] == undefined) v[$] = 1;\n    return $;\n}).join(',');\nb = b.split('\\n').map(text => {\n    t = text.trim()\n    return v[t.split(/\\s*::/)[0]] ? t : \"\"\n}).join('\\n');\nset(v);\n\n\n//log字符串\nfunction login(t) {\n    if (t == undefined) return true;\n    java.log(t);\n    java.toast(t);\n}\n\n\n//log当前分类状态\nfunction look(type) {\nget();\nif (JSON.stringify(v) == \"{}\") $('全部分类');\nif(type){\n\t\tt = [{name:\"　　　　    ༺ˇ»`ʚ  分类选择  ɞ´«ˇ༻   　　　　\",type:\"button\",action:\"$('全部分类')\"}\n,{name:\"　 查看分类设置 　\",type:\"button\",action:\"look(0)\"}\n,{name:\"　 格式分组名称 　\",type:\"button\",action:\"look(1)\"}];\n\t\tfor (key in v) t.push({\n\t\t\tname:key,\n\t\t\ttype:\"button\",\n\t\t\taction:\"$('\"+key+\"')\"\n\t\t});\n\t\tt.push({name: \"　　　　　　　反馈Q群：365976134　　　　　　　\",type:\"button\",action:\"http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=x8r6m0bYYon_pCgT0BRc1ohwZmkkY61Q&authKey=DpmUioCvx45WjRRBnbRT2DsJ7LL6DNY3uau%2BFKPgR%2FSKz4EgYqUjEU5tJNi%2BkNPl&noverify=0&group_code=365976134\"});\n\t\tset(t)\n\t\tt = \"【格式发现】\\n\\t❗数组是复制到登录ui的❗\\nemmm，登录日志好像没办法长按复制。\\n已保存到源变量，去源变量那里复制吧。\";\n\t}\nelse{\n    t = \"【分类状态】\";\n    for (key in v) t += '\\n\\t' + key + '=>' + (v[key] ? '启用' : '禁用');\n   }\n  return login(t);\n}\n\n\n//启用/禁用\nfunction $(sort, name) {\n    get();\n    if (name == undefined) name = sort.split(',')[0];\n    name = name.trim()\n    if (name == '全部分类') {\n        sort = sortName;\n    } else { //屏蔽错误分类\n        sort1 = []\n        sort2 = sortName.split(',')\n        sort.split(',').map(key1 => {\n            key1 = key1.trim();\n            for (i in sort2) {\n                key2 = sort2[i].trim();\n                if (key1 == key2) {\n                    sort1.push(key1);\n                    break;\n                }\n            }\n        })\n        sort = sort1.join(',')\n    }\n    if (!/^\\s*$/.test(sort)) {\n        sort = String(sort).split(',');\n        f = sort.length > 1 ? '分组' : '分类';\n        V = v[sort[0]];\n        if (name == '全部分类') v = {};\n        login('【更改成功】\\n『' + f + '』 ' + name + ': 已' + (V ? '禁用' : '启用'));\n        sort.map(key => v[key] = V ? 0 : 1);\n        return set(v);\n    }\n    return login('【无法更改】\\n原因：没有有效分类(分类名称不正确)')\n}",
    "ruleArticles": "<js>\ntry {\n    $ = JSON.parse(src).text;\n    if ($ == \"no file\") $ = [];\n} catch (err) {\n    reg = /^(https?\\:\\/\\/((www|m)\\.)?baidu\\.com\\/?\\?wd=\\s*)+/i;\n\n    if (baseUrl == source.sourceUrl) {\n        $ = [{\n            name_all: \"无法获取分类？可能没有启用\",\n            time: \"右上角 - 【登录】启用，再【刷新分类】\"\n        }]\n    }\n\n\n\n    //网站整合\n    else if (baseUrl.match(reg)) {\n        $ = [];\n        baseUrl.replace(reg, '').\n        split(/\\s*•\\s*/).map($$ => $.push({\n            name_all: $$.match(/.*?《(.*?)》/)[1],\n            time: $$.match(/◎.*?◎/) ? $$.match(/.*?◎(.*?)◎/)[1] : \"\",\n            uri: $$.match(/【.*?】/) ? $$.match(/.*?【(.*?)】/)[1] : \"\",\n            url: $$.match(/^([^【《◎]*),?/)[1]\n        }));\n    }\n\n\n\n    //蓝奏云\n    else {\n\n        //蓝奏云非分组链接\n        if (String(java.getString('text.举报文件@href')).length) {\n            $ = [{\n                name_all: String(java.getString('class.md@textNodes')),\n                icon: String(java.getString('class.md@textNodes')).replace(/.*\\./, ''),\n                size: String(java.getString('class.mtt@text')).replace(/\\( /, '').replace(/ \\)/, ''),\n                time: String(java.getString('class.mf@textNodes')).replace(/.*\\n/, ''),\n                uri: baseUrl.replace(/^(.+com).*\\/(.+)$/, '$2'),\n                url: baseUrl.replace(/^(.+com).*\\/(.+)$/, '$1/tp/$2')\n            }]\n        }\n\n\n        //取消分享\n        else if (String(java.getString('.off@text')).match(/取消分享/)) {\n            $ = [{\n                name_all: java.getString('.off@text'),\n                time: baseUrl.replace(/[#\\?].*/g, ''),\n                url: baseUrl.replace(/[#\\?].*/g, '')\n            }]\n        }\n\n\n        //蓝奏云分组链接\n        else {\n            json = [];\n            name = java.getString('.user-radio@text||title@text')\n            java.getElements('#folder .mlink').forEach(a => {\n                java.setContent(a);\n                json.push({\n                    name_all: java.getString('.filename@textNodes'),\n                    url: java.getString('a@href'),\n                    time: '🗂️ folder　📑 ' + (String(java.getString('.filesize@text')) || name)\n                })\n            })\n           java.setContent(src);\n\n\n            mat = baseUrl.match(/^(.*?\\.com)[^##]*\\/(.+)$/)\n            url = mat[1]\n            uri = mat[2]\n\n            function $(reg) {\n                return uri.match(reg) ? true : false\n            }\n\n\n            //get【pwd】(链接提取码)\n            pwd =\n                $(/##[^【]/) ? uri.match(/##(.*?)(【|$)/)[1] :\n                \"\";\n\n\n\n            head = {\n                method: \"POST\",\n                params: {\n                    uri: uri,\n                    img: $(/【[^】]/) ? uri.match(/【([^】]+)/)[1] : \"\"\n                }\n            }\n\n\n\n\n            //get 【body】\n            eval(src.match(/var pgs;([\\s\\S]*?pgs.+;)/)[1]);\n            eval('$=' + src.match(/data :([\\s\\S]*?\\})/)[1]);\n            head.body = Object.keys($).map(key => key + \"=\" + $[key]).join('&');\n\n\n            //补全【url】\n            url += \"/filemoreajax.php,\" + JSON.stringify(head);\n\n\n\n            //ajax\n            $ = JSON.parse(java.ajax(url));\n            $ = json.concat($.text != 0 ? $.text :\n\n                //密码错误提示\n                [{\n                    name_all: $.info,\n                    time: uri.replace(/[#\\?].*/, '') + $.info,\n                    url: baseUrl.replace(/[#\\?].*/, '')\n                }])\n            baseUrl = url\n        }\n    }\n}\njava.put('url', baseUrl);\nJSON.stringify($);\n</js>$.[*]",
    "ruleContent": "",
    "ruleDescription": "❗️0、0、开始❗️\n❗️0、0、结束❗️\n\n\n\n\n{{}}@js:\nurl=String(java.getString('$.url')).trim();\n\n\n\n//【..导入】\nif(url.match(/^..导入/)){\n    uri=url.replace(/导入.*/,'');\n    url=url.replace(/.*导入/,'');\n    path =\n        (uri==\"一键\"||uri==\"自动\")?\"auto\":\n            uri==\"书源\"?\"bookSource\":\n                uri==\"订阅\"?\"rssSource\":\n                    uri==\"净化\"?\"replaceRule\":\n                        \"\";\n    url=url.match(/^legado\\:\\/\\//)?url:`legado://import/${path}?src=`+url;\n    url = String(url).replace(/^(.*?src=)(.*)/,(mat, $1, $2)=>{\n        return $1+encodeURIComponent($2);\n    });\n\n\n    result=`<title>{{$.name_all}}</title>\n<iframe src=\"${url}\" hidden></iframe>\n<br><h2>{{$.name_all}}</h2>\n<h5>导入失败？多试试几次</h5>\n\n<h6><b>\n↓资源链接，点击复制\n<a href=\"${url}\">一键导入</a>\n<textarea id=\"copy\" onclick=\"copy()\">${decodeURIComponent(String(url).replace(/legado.*?src=/,''))}</textarea>\n{{$.time}}\n</b></h6>\n\n<style>\na{float:right;text-decoration:none}\nh2{text-align:center;font-size:30px }\nh5{text-align:center;font-size:20px }\nh6{margin:0 2;position:sticky;top:30%;font-size:14px}\ntextarea{width:100%;border-radius:5px}\n</style><script>\nfunction copy(){\n\tdocument.getElementById('copy').select()\n\tdocument.execCommand('copy')\n\talert(\"复制成功\")\n}\n</script>`}\n\n\n\n//【自定义html】\nelse if(url.match(/\\d+、\\d+、/)){\n    reg=new RegExp('❗️'+url+'开始❗️\\\\s*([\\\\s\\\\S]+?)\\\\s*❗️'+url+'结束❗️');\n//默认禁止放大缩小\n    result=result.match(reg)?\n        '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\">'+result.match(reg)[1]:'<br>未找到对应html'\n}\n\nelse{result=''}",
    "ruleImage": "$.uri@js:\nu0 = String(java.get('url'));\nu1 = u0.match(/uri\":\"([^\"]+)/);\nu2 = u0.match(/img\":\"([^\"]+)/);\nuri=String(result)||(u2?u2[1]:u1?u1[1]:\"\");\nfunction $(reg){\n\t\treturn uri.match(reg)?true:false\n\t}\n\n\nsrc =\n$(/https?:\\/\\/|^\\d{3}(\\/\\d\\d){3}$/)? uri:\n$(/【[^】]/)? baseUrl.match(/【(.*?)(】|$)/)[1]:\n\n// 默认封面\n\"\"||source.sourceIcon;\n\n// 补全链接\nsrc.match(/^\\d{3}(\\/\\d\\d){3}$/)?`http://avatar.coolapk.com/data/${src}_avatar_middle.jpg`:src",
    "ruleLink": "$.id@js:\nurl=`{{$.url}}`;\nif(result)url+=`/tp/{{$.id}}`;\nString(url).trim().replace(/^..导入/,'');",
    "ruleNextPage": "@js:\ntry {\n    url = String(java.get('url'));\n    url = url.replace(/(pg=)(\\d+)/, (mat, $1, $2) => {\n        return $1 + (~~$2 + 1)\n    }).replace(url, '');\n} catch (err) {\n    url = \"\"\n}\nurl",
    "rulePubDate": "💾 {{$.icon}}　📥 {{$.size}}　⏱️ {{$.time}}\n##💾 　📥 　⏱️\\s*",
    "ruleTitle": "$.name_all",
    "shouldOverrideUrlLoading": "",
    "singleUrl": false,
    "sortUrl": "@js:eval(String(source.loginUrl));b",
    "sourceComment": "Pixiv 书源订阅（更新📆：2025-02-18）\n\n更新后/设置源变量后，要【刷新分类】\n刷新分类，刷新分类，刷新分类\n\n\n『🅿️丨Pixiv 书源』\nhttps://github.com/windyhusky/PixivSource《⬇️ 导入 Pixiv 等书源 ⬇️》【https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png】◎✍️ windyhusky & DowneyRem &nbsp; 🔗 长期更新◎\n\n一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/pixiv.json《Pixiv 书源》【https://asset.brandfetch.io/idIlKj_n7C/idSsbP7h1m.png】◎🏷️ Pixiv &nbsp; ✅ 单篇 &nbsp; ✅ 系列 &nbsp; 🔗 长期更新◎\n\n一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/linpx.json《Linpx & 兽人小说 书源》【https://furrynovel.ink/apple-touch-icon.png】◎🏷️ Linpx &nbsp; 🏷️ 兽人小说 &nbsp; ✅ 单篇 &nbsp; ✅ 系列 &nbsp; 🔗 长期更新◎\n\n一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/btsrk.json《Pixiv & Linpx & 兽人小说 订阅源》【https://www.furrynovel.com/static/icon.png】◎🏷️Pixiv &nbsp; 🏷️ Linpx &nbsp; 🏷️ 兽人小说 &nbsp; 🔗 长期更新◎\n\n一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/books.json《书源分享/ books 订阅源》◎🏷️ 订阅源 &nbsp; 🔗 长期更新◎\n\n一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json《检查更新 import 订阅源》◎📌 全选-确认-覆盖导入-退出-刷新分类 &nbsp; 🔗 长期更新◎\n\n\n『🅿️丨Pixiv 其他』\nhttps://github.com/Luoyacheng/yuedu《⬇️ 导入 Pixiv 书源 (APP API) ⬇️》【https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png】◎✍️ 洛娅橙 &nbsp; 🏷️ Pixiv 书源 &nbsp;◎\n\n一键导入https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/%E4%B9%A6%E6%BA%90/pixiv%E5%B0%8F%E8%AF%B4/pixiv.json《Pixiv 书源(APP API)》【https://asset.brandfetch.io/idIlKj_n7C/idSsbP7h1m.png】◎✍️ 洛娅橙 &nbsp; ✅ 单篇 &nbsp; ✅ 系列 &nbsp;◎\n\n\nhttps://akaito.xyz/post/Legado《⬇️ 导入 Pixiv 小说目录规则 ⬇️》【https://akaito.xyz/favicon.ico】◎✍️ 一片痴心俱成灰 &nbsp; 🏷️ Pixiv 本地小说目录规则 &nbsp;◎\n\n一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/pixivToc.json《Pixiv 目录规则》【https://asset.brandfetch.io/idIlKj_n7C/idSsbP7h1m.png】◎✍️ 一片痴心俱成灰 &nbsp; 🏷️ 本地小说 &nbsp; 🏷️ 目录规则 &nbsp;◎\n\n\nhttps://books.fishhawk.top/forum/66a8e77866bff10c16e51d6a《⬇️ 导入 轻小说机翻机器人 书源 ⬇️》【https://books.fishhawk.top/icon.svg】◎✍️ holzora &nbsp; 🏷️ 轻小说机翻机器人 &nbsp; ◎\n\n一键导入https://static.kksk.io/uuyr/68d13b5fa22c19c5ad2a5d08c0017f90.json《轻小说机翻机器人 书源》【https://books.fishhawk.top/icon.svg】◎✍️ holzora &nbsp; 🏷️ Pixiv 外文小说 &nbsp;◎\n\n\n『🔎丨不世玄奇』\nhttps://github.com/bushixuanqi/book-source《⬇️ 一键导入 不世玄奇 的书源 ⬇️》【https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png】◎✍️ 不世玄奇 &nbsp; 🏷️ 通用书源 & 通用订阅 &nbsp; 📆 2023-05 &nbsp; 🔗 停更◎\n\n一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/normal.json《通用书源 & 搜索引擎书源》【002/93/87/83】◎ 🏷️ 通用书源 &nbsp; 📆 2023-05 &nbsp; 🔗 停更◎\n\n一键导入https://bushixuanqi.oss-cn-chengdu.aliyuncs.com/通用发现v5.json【002/93/87/83】《聚合搜索 / 通用订阅》◎🏷️ 通用订阅 &nbsp; 📆 2023-04 &nbsp; 🔗 停更◎\n\n\n『📚丨书源整理』\nhttps://shuyuan.yiove.com《📖丨三千书源》◎✍️ Yiove 书源仓库◎【https://shuyuan.yiove.com/logo.jpeg】\n\nhttps://yuedu.miaogongzi.net/gx.html《🏣丨喵公子书源管理》◎✍️ 喵公子◎【003/77/52/16】\n\nhttps://legado.aoaostar.com《📕丨阅读 APP 源》◎✍️ aoaostar &nbsp; 📆 标示日期为采集刷新日期◎【https://avatars.githubusercontent.com/u/86001674】\n\nhttps://www.yckceo.com/yuedu/shuyuan/index.html《🏚️丨源仓库-阅读书源》◎✍️ 我不是木木◎【002/88/03/61】\n\nhttps://flowus.cn/ycheng/share/923f5a35-6dcf-47d1-b8eb-b9c5ef3ed39b《🗞️丨一程书源订阅源阅读合集》◎✍️ 一程 &nbsp; 🏷️ 综合 &nbsp; ◎【002/55/79/99】",
    "sourceGroup": "202",
    "sourceIcon": "https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/doc/pic/Legado-Pixiv.png",
    "sourceName": "书源订阅",
    "sourceUrl": "https://github.com/windyhusky/PixivSource",
    "style": "",
    "variableComment": "【刷新分类】【刷新分类】【刷新分类】"
  },
  {
    "articleStyle": 0,
    "customOrder": -10100993,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "",
    "ruleContent": "",
    "ruleImage": "",
    "ruleLink": "",
    "ruleNextPage": "",
    "ruleTitle": "",
    "singleUrl": true,
    "sourceGroup": "202",
    "sourceIcon": "https://img2.baidu.com/it/u=2497591018,1494490685&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500",
    "sourceName": "美女直播",
    "sourceUrl": "https://zh.virtualtaboo.live/",
    "style": "video{\nwidth:100%;\nheight:auto;}"
  },
  {
    "articleStyle": 0,
    "concurrentRate": "",
    "customOrder": -10100992,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.zhubo",
    "ruleContent": "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n<script src=\"http://bilibili.github.io/flv.js/dist/flv.js\"></script>\n</head>\n<body>\n\t\t\t<video id=\"player1\"  autoplay=\"autoplay\" preload=\"auto\" muted controls=\"controls\">\n\t\t</video>\n\t\t<p>\n    <button onclick=\"enableMute()\" type=\"button\">关闭声音</button>\n\n    <button onclick=\"disableMute()\" type=\"button\">打开声音</button>\n\n</p> \n<div>\n直播链接:{{baseUrl.replace(/zhibo/,\"flv\").replace(/http:\\/\\/api.hclyz.com:81/,\"不可播放rtmp:/\")}}\n</div>\n</body>\n</html>\n<script>\n    if (flvjs.isSupported()) {\n        var videoElement = document.getElementById('player1');\n\t\tvar flvPlayer = flvjs.createPlayer({\n            type: 'flv', \n            url: '{{baseUrl.replace(/zhibo/,\"flv\").replace(/http:\\/\\/api.hclyz.com:81/,\"rtmp://\")}}',\n     });\n\t\tflvPlayer.attachMediaElement(videoElement);\n\t\tflvPlayer.load();\n\t\t//flvPlayer.play();\n    }\n</script>\n <script>\n\nvar myVid = document.getElementById(\"player1\");\n\nfunction enableMute() { \n\n    myVid.muted = true;\n\n} \n\nfunction disableMute() { \n\n    myVid.muted = false;\n\n} \n</script> ",
    "ruleDescription": "",
    "ruleImage": "$.img",
    "ruleLink": "$.address@js:result\n.replace(/\\.flv/,\".zhibo\")\n.replace(/rtmp:\\//,\"\")",
    "rulePubDate": "",
    "ruleTitle": "$.title",
    "singleUrl": false,
    "sortUrl": "偶遇::http://api.hclyz.com:81/mf/jsonouyu.txt\n依依::http://api.hclyz.com:81/mf/jsonyiyi.txt\n夜色::http://api.hclyz.com:81/mf/jsonyese.txt\n亚米::http://api.hclyz.com:81/mf/jsonyami.txt\n色趣::http://api.hclyz.com:81/mf/jsonsequ.txt\n咪狐::http://api.hclyz.com:81/mf/jsonmihu.txt\n夜律::http://api.hclyz.com:81/mf/jsonyelu.txt\n暗语::http://api.hclyz.com:81/mf/jsonanyu.txt\n咪咪::http://api.hclyz.com:81/mf/jsonmimi.txt\n糯米::http://api.hclyz.com:81/mf/jsonnuomi.txt\n苦瓜::http://api.hclyz.com:81/mf/jsonkugua.txt\n蝴蝶::http://api.hclyz.com:81/mf/jsonhudie.txt\n云鹿::http://api.hclyz.com:81/mf/jsonyunlu.txt\n付宝::http://api.hclyz.com:81/mf/jsonfubao.txt\n菠萝::http://api.hclyz.com:81/mf/jsonboluo.txt\n夜艳::http://api.hclyz.com:81/mf/jsonyeyan.txt\n二嫂::http://api.hclyz.com:81/mf/jsonersao.txt\n土豪::http://api.hclyz.com:81/mf/jsontuhao.txt\n盘他::http://api.hclyz.com:81/mf/jsonpanta.txt\n美夕::http://api.hclyz.com:81/mf/jsonmeixi.txt\n坦克::http://api.hclyz.com:81/mf/jsontanke.txt\n蜜桃::http://api.hclyz.com:81/mf/jsonmitao.txt\n她秀::http://api.hclyz.com:81/mf/jsontaxiu.txt\n金鱼::http://api.hclyz.com:81/mf/jsonjinyu.txt\n浴火::http://api.hclyz.com:81/mf/jsonyuhuo.txt\n套路::http://api.hclyz.com:81/mf/jsontaolu.txt\n日出::http://api.hclyz.com:81/mf/jsonrichu.txt\n桃花::http://api.hclyz.com:81/mf/jsontaohua.txt\nLOVE::http://api.hclyz.com:81/mf/jsonLOVE.txt\n久久::http://api.hclyz.com:81/mf/jsonjiujiu.txt\n杏趣::http://api.hclyz.com:81/mf/jsonxingqu.txt\n媚颜::http://api.hclyz.com:81/mf/jsonmeiyan.txt\n灰灰::http://api.hclyz.com:81/mf/jsonhuihui.txt\n爱零::http://api.hclyz.com:81/mf/jsonailing.txt\n爱恋::http://api.hclyz.com:81/mf/jsonailian.txt\n杏播::http://api.hclyz.com:81/mf/jsonxingbo.txt\n金呗::http://api.hclyz.com:81/mf/jsonjinbei.txt\nmoon::http://api.hclyz.com:81/mf/jsonmoon.txt\n夜纯::http://api.hclyz.com:81/mf/jsonyechun.txt\n彩云::http://api.hclyz.com:81/mf/jsoncaiyun.txt\n妞妞::http://api.hclyz.com:81/mf/jsonniuniu.txt\n艳后::http://api.hclyz.com:81/mf/jsonyanhou.txt\n蓝猫::http://api.hclyz.com:81/mf/jsonlanmao.txt\n情趣::http://api.hclyz.com:81/mf/jsonqingqu.txt\n翠鸟::http://api.hclyz.com:81/mf/jsoncuiniao.txt\n糖果::http://api.hclyz.com:81/mf/jsontangguo.txt\n么么哒::http://api.hclyz.com:81/mf/jsonmemeda.txt\n豹娱l::http://api.hclyz.com:81/mf/jsonbaoyul.txt\n卡哇伊::http://api.hclyz.com:81/mf/jsonkawayi.txt\n小妖::http://api.hclyz.com:81/mf/jsonxiaoyao.txt\n幽梦::http://api.hclyz.com:81/mf/jsonyoumeng.txt\n风流::http://api.hclyz.com:81/mf/jsonfengliu.txt\n樱桃::http://api.hclyz.com:81/mf/jsonyingtao.txt\n享色::http://api.hclyz.com:81/mf/jsonxiangse.txt\n娇媚::http://api.hclyz.com:81/mf/jsonjiaomei.txt\n爱爱你::http://api.hclyz.com:81/mf/jsonaiaini.txt\n花房::http://api.hclyz.com:81/mf/jsonhuafang.txt\n卡路里::http://api.hclyz.com:81/mf/jsonkaluli.txt\n名流::http://api.hclyz.com:81/mf/jsonmingliu.txt\n倾心::http://api.hclyz.com:81/mf/jsonqingxin.txt\n樱花::http://api.hclyz.com:81/mf/jsonyinghua.txt\n飘雪::http://api.hclyz.com:81/mf/jsonpiaoxue.txt\n入巷::http://api.hclyz.com:81/mf/jsonruxiang.txt\n蝶恋::http://api.hclyz.com:81/mf/jsondielian.txt\n彩虹::http://api.hclyz.com:81/mf/jsoncaihong.txt\n奥斯卡::http://api.hclyz.com:81/mf/jsonaosika.txt\n皇后::http://api.hclyz.com:81/mf/jsonhuanghou.txt\n牵手::http://api.hclyz.com:81/mf/jsonqianshou.txt\n台妹l::http://api.hclyz.com:81/mf/jsontaimeil.txt\n夜妖姬::http://api.hclyz.com:81/mf/jsonyeyaoji.txt\n一直播::http://api.hclyz.com:81/mf/jsonyizhibo.txt\n玲珑::http://api.hclyz.com:81/mf/jsonlinglong.txt\n橙秀::http://api.hclyz.com:81/mf/jsonchengxiu.txt\n黄瓜::http://api.hclyz.com:81/mf/jsonhuanggua.txt\n颜如玉::http://api.hclyz.com:81/mf/jsonyanruyu.txt\n蛟龙::http://api.hclyz.com:81/mf/jsonjiaolong.txt\n好基友::http://api.hclyz.com:81/mf/jsonhaojiyou.txt\n夜女郎::http://api.hclyz.com:81/mf/jsonyenulang.txt\n娇喘::http://api.hclyz.com:81/mf/jsonjiaochuan.txt\n小妲己::http://api.hclyz.com:81/mf/jsonxiaodaji.txt\n花蝴蝶::http://api.hclyz.com:81/mf/jsonhuahudie.txt\n尤物岛::http://api.hclyz.com:81/mf/jsonyouwudao.txt\n77直播::http://api.hclyz.com:81/mf/json77zhibo.txt\n十八禁::http://api.hclyz.com:81/mf/jsonshibajin.txt\n蝴蝶飞::http://api.hclyz.com:81/mf/jsonhudiefei.txt\n喜欢你::http://api.hclyz.com:81/mf/jsonxihuanni.txt\n兔女郎::http://api.hclyz.com:81/mf/jsontunulang.txt\n双碟::http://api.hclyz.com:81/mf/jsonshuangdie.txt\n约直播::http://api.hclyz.com:81/mf/jsonyuezhibo.txt\n九尾狐::http://api.hclyz.com:81/mf/jsonjiuweihu.txt\n红妆::http://api.hclyz.com:81/mf/jsonhongzhuang.txt\n花仙子::http://api.hclyz.com:81/mf/jsonhuaxianzi.txt\n持久男::http://api.hclyz.com:81/mf/jsonchijiunan.txt\n丽柜厅::http://api.hclyz.com:81/mf/jsonliguiting.txt\n桃花运::http://api.hclyz.com:81/mf/jsontaohuayun.txt\n903娱乐::http://api.hclyz.com:81/mf/json903yule.txt\n视觉秀::http://api.hclyz.com:81/mf/jsonshijuexiu.txt\n芒果派::http://api.hclyz.com:81/mf/jsonmangguopai.txt\n七仙女s::http://api.hclyz.com:81/mf/jsonqixiannus.txt\n夜来香::http://api.hclyz.com:81/mf/jsonyelaixiang.txt\n星宝贝::http://api.hclyz.com:81/mf/jsonxingbaobei.txt\n小蜜蜂::http://api.hclyz.com:81/mf/jsonxiaomifeng.txt\n小棉袄::http://api.hclyz.com:81/mf/jsonxiaomianao.txt\n小辣椒::http://api.hclyz.com:81/mf/jsonxiaolajiao.txt\n小仙女::http://api.hclyz.com:81/mf/jsonxiaoxiannu.txt\n兰桂坊::http://api.hclyz.com:81/mf/jsonlanguifang.txt\n花果山::http://api.hclyz.com:81/mf/jsonhuaguoshan.txt\n招财猫::http://api.hclyz.com:81/mf/jsonzhaocaimao.txt\n心之恋::http://api.hclyz.com:81/mf/jsonxinzhilian.txt\n睡美人::http://api.hclyz.com:81/mf/jsonshuimeiren.txt\n小花螺::http://api.hclyz.com:81/mf/jsonxiaohualuo.txt\n小天使::http://api.hclyz.com:81/mf/jsonxiaotianshi.txt\n小红帽::http://api.hclyz.com:81/mf/jsonxiaohongmao.txt\n樱花雨i::http://api.hclyz.com:81/mf/jsonyinghuayui.txt\n小萌猪::http://api.hclyz.com:81/mf/jsonxiaomengzhu.txt\n小坏蛋::http://api.hclyz.com:81/mf/jsonxiaohuaidan.txt\n小性感::http://api.hclyz.com:81/mf/jsonxiaoxinggan.txt\n红浪漫::http://api.hclyz.com:81/mf/jsonhonglangman.txt\n蚊香社::http://api.hclyz.com:81/mf/jsonwenxiangshe.txt\n蓝月亮::http://api.hclyz.com:81/mf/jsonlanyueliang.txt\n小精灵::http://api.hclyz.com:81/mf/jsonxiaojingling.txt\n红高粱::http://api.hclyz.com:81/mf/jsonhonggaoliang.txt\n小天仙::http://api.hclyz.com:81/mf/jsonxiaotianxian.txt",
    "sourceComment": "某个软件的聚合直播\nrtmp的手机网页应该是无法播放\nmp4的都是广告没管",
    "sourceGroup": "18🚫禁",
    "sourceIcon": "https://img2.baidu.com/it/u=3810767422,2486090729&fm=253&fmt=auto&app=138&f=PNG?w=192&h=192",
    "sourceName": "H直播大全",
    "sourceUrl": "http://api.hclyz.com:81",
    "style": "video{\nwidth:100%;\nheight:auto;}"
  },
  {
    "articleStyle": 0,
    "customOrder": -10100991,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\"User-Agent\": \"okhttp/3.8.1\"}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.posts[*]||$.gameapps[*]",
    "ruleContent": "<h3>{{$.post.title}}</h3>\n{{$.post.detail##<image>(.*?),.*?</image>##<img src=\"$1\">}}\n🩹{{$.post.images[*]}}🩹\n<br><hr><br>\n<h1>评论</h1>\n\n@js:\nresult=result.replace(/\\n/g,'<br>').replace(/<\\/*text>/g,'');\nlist=result.match(/🩹[\\s\\S]+?🩹/)?result.match(/🩹([\\s\\S]+?)🩹/)[1]:'';\nlist=list?list.split('<br>'):[];\n\ncomments=JSON.parse(src).comments;\npp='';\n\nfor(i in comments){\nauthor=comments[i].user.nick;\nauthorimg='<img class=\"author\" src=\"'+comments[i].user.avatar+'\">';\nimgs=comments[i].images?comments[i].images:[];\ntime='<a class=\"time\">'+java.timeFormat(comments[i].createTime)+\"</a>\";\nt=comments[i].text;\nimglist='';\nfor(i in imgs){\nimglist+='<details><summary style=\"color:red\">点击查看图片</summary><img src=\"'+imgs[i]+'\"></details>\\n'\n}\nnick=comments[i].refComment?comments[i].refComment.nick:'';\n\nrep=comments[i].refComment?comments[i].refComment.text:'';\n\nref=nick?'<div class=\"ref\"><p>回复  '+nick+'</p><p>'+rep+'</p></div>'+t:''\ntext=ref?ref:t;\n\npp+=authorimg+author+'<br>'+String(text).replace(/\\n/g,'<br>')+imglist+'<br>'+time+'<br><br><br>';\n}\nresult=result+pp;\nimg='';\nfor(i in list){\nimg+='<details><summary>点击查看图片</summary><img src=\"'+list[i]+'\"></details>\\n'\n}\nresult=String(result).replace(/🩹[\\s\\S]+?🩹|🩹🩹/g,img);\nresult=result.replace(/([^\"])(http[^<\\s\"]+)/g,'$1<a href=\"$2\">$2</a>')",
    "ruleDescription": "<img style=\"width:40px;height:40px\" src=\"{{$.applogo}}\">   {{$.apptitle}}<br>\n<p class=\"tag\">{{$.appsize}}m   {{$.applanguage}}   {{$.appauthorization}}   version{{$.appversion}}   {{$.system}}<p>\n<a href=\"{{$.localurl.url}}\">点击下载</a><br>\n{{$.appdesc}}\n\n<js>result=baseUrl.match(/search/)?result:''</js>",
    "ruleImage": "$.images[0]||$.applogo",
    "ruleLink": "http://floor.huluxia.com/post/detail/ANDROID/2.3?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&post_id={{$.postID||$.shareurl##(\\d+)##$1###}}&page_no=1&page_size=20&doc=1",
    "ruleNextPage": "page",
    "rulePubDate": "<js>\nif(baseUrl.match(/search/)){\nappsize='{{$.appsize}}m';\ntag='{{$.apptags}}';\ntime=java.timeFormat('{{$.createTime}}000');\nresult=appsize+'•'+tag+'•'+time\n}else{result=java.timeFormat('{{$.createTime}}')}\n</js>",
    "ruleTitle": "$.title||$.apptitle",
    "singleUrl": false,
    "sortUrl": "实用软件::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=43&tag_id=0&sort_by=1\n\n绿色软件::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=43&tag_id=4301&sort_by=1\n原创工具::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=43&tag_id=4302&sort_by=0\n影音播放::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=43&tag_id=4304&sort_by=0\n集合贴::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=43&tag_id=4303&sort_by=0\n\n玩机教程::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=44&tag_id=0&sort_by=0\n优选教程::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=44&tag_id=4406&sort_by=0\n软件使用::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=44&tag_id=4401&sort_by=0\n刷机相关::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=44&tag_id=4403&sort_by=0\nROM资源::http://floor.huluxia.com/post/list/ANDROID/2.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{Date.now()}}&count=200&cat_id=44&tag_id=4405&sort_by=0\n搜索软件::http://search.huluxia.com/game/search/ANDROID/4.0.1?platform=2&gkey=000000&app_version=4.1.1.3&versioncode=320&market_id=tool_web&start={{(page-1)*20}}&count=20&keyword={{source.getVariable()}}",
    "sourceComment": "按发布时间排序 sort_by=1\n按回复时间排序 sort_by=0\n按本版精华排序 sort_by=2",
    "sourceGroup": "202",
    "sourceIcon": "http://peco-img.uc.cn/image/quark_baike/upload/2022/27HwTN1fq0c2u3v/bed0926027b99ff2fa8cdb16b16f416d.jpg",
    "sourceName": "葫芦侠",
    "sourceUrl": "http://floor.huluxia.com",
    "style": "img{\nwidth:100%;\nheight:auto\n}\n.author{\nwidth:20px;\nheight:20px\n}\n.ref{\ncolor:#888\n}\n.time{\nfont-size:12px\n}\n.tag{\ncolor:#555;\nfont-size:12px\n}"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100989,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\n \"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; HarmonyOS; OCE-AN50; HMSCore 6.15.0.302) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/16.0.3.302 Mobile Safari/537.36\",\n \"Cookie\":\"accessAgeDisclaimerPH=1; x-index-auth=authed\",\n \"Accept-Encoding\":\"\"\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUi": "",
    "loginUrl": "",
    "ruleArticles": "class.thumbnail group",
    "ruleContent": "<js>\nfunction $(rule){\n\treturn java.getElements(rule);\n}\n\nvar u=\"\",tab_name=\"\",url_list=\"\";\njx=\"https://codjx.com?url=\";\ntab_name+=`<li>画质</li>\\n`;\nv_source=String(result).match(/eval\\((.*m3u8.*video.*)\\)/)[0];\neval(v_source)\nv_res=java.ajax(source)\ndata=String(v_res).match(/.*video\\.m3u8/g)\nfor(i=data.length-1;i>=0;i--){\n\tlink=source.replace('playlist.m3u8',data[i])\n\tif(String(data[i]).match(/x/)){\n\t\tname=String(data[i]).match(/(\\d+)\\//)[1]+\"p\";\n\t}else{\n\t\tname=String(data[i]).match(/(.*)\\//)[1];\n\t}\n\turl_list+=`<li><a link=\"${link}\">${name}</a></li>\\n`\n}\nurl_list+=`<li><a link=\"${source}\">自动</a></li>\\n`\nv_list=`<ul class=\"play_list\">${url_list}</ul>`;\n//获取简介❗️\ndesc=info=$('.space-y-2 .text-secondary.1').text();\ndesc=String(desc).replace(/番号:|番號:|發行日期:|发行日期:/,'');\nsort=` `;\nintro=`中文:${java.get('title')}<br>`;\ninfo=$('.space-y-2 .text-secondary')\nfor(i=1;i<info.length-1;i++){\n\tintro+=`${info[i].text()}<br>`\n}\nintro=java.t2s(intro)\n\n//最后结果，拼接完整网页\nresult=`\n<html>\n<title>${java.get('title')}</title>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\">\n<!--引入jquery-->\n<script src=\"https://code.jquery.com/jquery-3.0.0.min.js\"></script>\n\n<!--播放器-->\n<div id=\"MacPlayer\">\n  <p class=\"url_text\"></p>\n  <iframe src=\"\" border=\"0\" marginwidth=\"0\" framespacing=\"0\" marginheight=\"0\" frameborder=\"0\" scrolling=\"no\" vspale=\"0\" allowfullscreen=\"ture\" noresize=\"\"></iframe>\n</div>\n<div style=\"width:100%;height:29%\"></div>\n\n<!--简介卡片 -->\n<div class=\"card v_info mb20\">\n    <!--标题 -->\n    <h2 class=\"v_title\"></h2>\n    <!--状态、日期、分类 -->\n    <p class=\"v_desc\">\n       <span class=\"desc\">${desc}</span>\n       <span>${sort}</span>\n       <!--简介按钮 -->\n       <span class=\"open_content\" id=\"open_content\">简介</span>\n    </p>\n    <div class=\"v_content\" id=\"v_content\" style=\"display:none;\">\n      <!--封面图片 -->\n      <div class=\"cover\" style=\"\">\n         <img src=\"${java.get('pic')}\"></img>\n      </div>\n      <!--剧情信息 -->\n      <div class=\"content\" id=\"intro_content\">\n        <div id=\"intro\">\n       <p>${intro}</p>\n       <!--简介展开 -->\n      <div class=\"show_more\" id=\"show_more\" style=\"display: block;\"></div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<div class=\"card mb20 v_list\">\n    <!--线路切换-->\n    <ul class=\"tab_control play_from\">\n        ${tab_name}\n    </ul>\n    <div style=\"height:34px;\"></div>\n    <!--所有播放列表与排序-->\n    <div class=\"tab_content\" id=\"play_list\">\n        <div class=\"play_list_sort\" id=\"play_list_sort\">\n⇅ 正序/倒序</div>\n        ${v_list}\n    </div>\n</div>\n</html>\n\n<script>\n\t//tab按钮线路切换\n var $li = $('.tab_control li');\n var $ul = $('.tab_content ul');\n $li.click(function(){\n    var $this = $(this);\n    var $t = $this.index();\n    $li.removeClass('current');\n    $this.addClass('current');\n    $ul.removeClass('current');\n    $ul.eq($t).addClass('current');\n });\n //选择集数\n var $play_li= $('.play_list li');\n var play= $('#MacPlayer');\n var iframe= $('#MacPlayer iframe');\n $play_li.click(function(){\n    var $this = $(this);\n    var $t=$this.index();\n    //获取之前的播放链接\n    var bf=$('.play_list li.current');\n    bf=bf.children('a').attr('link');\n    //改变li标签的CSS样式\n    $play_li.removeClass('current');\n    $this.addClass('current');\n    //获取播放链接和标题\n    url=$this.children('a').attr('link');\n    text=$this.children('a').text();\n    //判断链接是否相同，不同就发送请求\n    if(url!=bf){\n    \trep();\n    }\n });\n //替换\n function rep(){\n      //给iframe的src赋值\n      iframe.attr('src',url);\n      //$('.url_text').text(url);\n  }\n //播放列表排序 \n function set_sort(){ \n \t var box = $('#play_list ul.current');\n \t var el = box.find('li');\n \t var newEl = Array.prototype.reverse.call(el);\n \t for(var i = 0 ;i<newEl.length;i++){\n \t  \t box.append(newEl[i]) \n \t }; \n \t}\n $('#play_list_sort').bind('click',function(){ \n \t  set_sort(); \n \t});\n \t\n \t//-------------详情页相关-------------- \n \tvar open_content = $('#open_content');\n \tvar intro_content = $('#intro_content'); \n \tvar show_more = $('#show_more'); \n \tvar cover = $('#v_content .cover'); \n \t//展开简历块 \n \topen_content.click(function(){ \n \t\t$('#v_content').toggle(); \n \t}); \n \t//内容超出显示更多按钮 \n \tif($(\"#intro\").length>0){\n \t\t var intro_height = $('#intro').get(0).offsetHeight; \n \t\t if(intro_height > 101){\n \t\t \t show_more.show(); \n \t\t \t}; \n \t} \n \t//展开更多内容 \n \tintro_content.click(function(){\n \t\t intro_content.toggleClass('auto'); \n \t\t show_more.toggle(); \n \t\t cover.toggle(); \n \t});\n \t\n \t//初始化\n   (()=>{\n   \t $('.play_list').eq(0).addClass('current');\n\t    $('.play_list li').eq(0).addClass('current');\n\t    $('.tab_control li').eq(0).addClass('current');\n\t    url=$('.play_list li.current a').attr('link');\n\t    rep();\n\t  })();\n</script>\n`\n</js>",
    "ruleDescription": "",
    "ruleImage": "img@data-src\n<js>\njava.put('pic',result)\n</js>",
    "ruleLink": "a[x-text=\"item.full_title\"]@href||a.0@href",
    "ruleNextPage": "page",
    "rulePubDate": "<js>\nsort=\"\";\nresult=java.getElements('.text-xs');\nlen=result.length-1\nfor(i=len;i>=0;i--){\n\tt=result[i].text();\n\ti==len?sort+='🕒'+t:sort+='  '+t;\n}\nsort\n</js>",
    "ruleTitle": ".text-secondary@text\n<js>\njava.put('title',result)\n</js>",
    "singleUrl": false,
    "sortUrl": "<js>\neval(String(source.sourceComment))\nresult=`\n本日::${host}/today-hot?page={{page}}\n搜索::${host}/search/{{source.getVariable()}}\n本周::${host}/weekly-hot?page={{page}}\n本月::${host}/monthly-hot?page={{page}}\n更新::${host}/new?page={{page}}\n新作::${host}/release?page={{page}}\n流出::${host}/uncensored-leak?page={{page}}\n`\n</js>",
    "sourceComment": "  host=\"https://www.missav2.icu/cn\"\n/*\n\thttps://missav.ws/zh\n*/",
    "sourceGroup": "202",
    "sourceIcon": "https://img1.baidu.com/it/u=3056428239,816616493&fm=253&fmt=auto&app=138&f=PNG?w=237&h=237",
    "sourceName": "MissAV",
    "sourceUrl": "MissAV",
    "style": "*{\n\tmargin:0;padding:0;\n}\nhtml{\n\tbackground-color:#222;\n}\na{\n\ttext-decoration:none;\n\tcolor:#222;\n}\nul{\n\tlist-style:none;\n}\niframe{\n\twidth:100%;height:100%;\n}\nh1,h2,h3,h4,h5,h6{\n\tfont-size:100%;font-weight:normal;\n}\nimg,video{\n\theight:auto;max-width:100%;\n}\n#MacPlayer{\n\tz-index:9999;\n\twidth:100%;height:auto;\n\tposition:fixed;top:0;left:0;\n\tbackground-color:black;\n}\n#MacPlayer iframe{\n\twidth:100%;height:217px;\n}\n.url_text{\n\toverflow-x:hidden;\n\twidth:100%;height:auto;\n\tcolor:#fff;background-color:black;\n\tfont-size:10px;white-space: nowrap;\n}\n\n/*块通用*/ \n.card{padding:15px 15px 0 15px;}\n.card .c_header{display: flex;flex-direction: row;justify-content: space-between;padding-bottom:20px;} \n.card .c_title{font-size:18px;color:#fff;font-weight:700;} \n.card .c_title a{color:#fff;} \n.card .c_right a{color:#666;} \n.card .clear_history{color:#FDD835;display:none;}\n\n/*详情页资料卡*/ \n.v_info .v_title,.v_info .v_title{font-size:22px;color:#eee;line-height:26px;} .v_info .v_desc{position:relative;font-size:12px;color:#999;padding-top:4px;} .v_info .v_desc a{color:#999;} .v_info .v_desc .desc{color:#FF3D00;font-weight:700;} .v_info .hr{color:#666;padding:0 4px;} .v_info .open_content{position:absolute;bottom:0;right:20px;color:#FFB026;text-decoration: underline;padding-left:10px;} .v_info .v_content{display:flex;padding-top:20px;} .v_info .cover,.v_info img{width:auto;height:100px;background:#333;} .v_info .cover{margin-right:10px;} .v_info .content{height:101px;overflow:hidden;font-size:12px;flex:1;color:#999;line-height:19px;position: relative;} .v_info .show_more{position: absolute;bottom:0;right:0;width:100%;padding:38px 0 19px 0;height:19px;background: linear-gradient(to bottom, rgba(34,34,34,0) 0%,rgba(34,34,34,1) 100%);color:#eee;text-align:center;display:none;} .v_info .auto{height:auto;}\n\n/*tab */ \n.tab_control{position:absolute;display: flex;flex-direction: row;overflow-x:scroll;width:92.3%} \n.tab_control li{flex:1;position:relative;height:30px;line-height:34px;top:4px;text-align:center;color:#666;cursor:pointer;overflow: hidden;} \n.tab_control li span{display: inline-block;min-width: 10px;padding: 2px 2px;font-size: 9px;font-weight: 700;line-height: 1;color: #fff;text-align: center;white-space: nowrap;vertical-align: middle;background-color:#FFB026;border-radius: 2px;}\n.tab_control li.current{z-index:99;height:37px;font-weight:700;color:#eee;background-image:linear-gradient(180deg, #BF360C 0%, #333 90%);border-radius: 4px 4px 0 0;} \n.tab_content{padding:12px;background: #333;box-shadow: 0 2px 8px 0 rgba(0,0,0,0.50);border-radius: 5px;} \n.tab_content ul.current{display:block;} \n\n/*播放来源、地址、排序*/\n\t.v_list{margin-bottom:20px;} #play_list{position:relative;} #play_list ul.current{display:flex;} .play_from li{flex:none;padding:0 10px;} .play_list{display:none;flex-flow: wrap;margin-right:-10px;} .play_list li{width:20%;margin-bottom:10px;} .play_list li a{overflow:hidden;height:40px;line-height:40px;border-radius: 5px;display:block;background:#222;color:#999;text-align:center;margin-right:10px;} .play_list li a:visited{color:#444;} .play_list li.current a{border: 1px solid #BF360C;color:#BF360C;}\n\n/*处理电影的集数宽度*/ \n.large li{width:25%;} .play_list_sort{padding-bottom:20px;color:#999;} \n\n/*遮罩*/ \n.mask{width:100%;height:100%;background:rgba(0, 0, 0, 0.5);position: fixed;left:0;top:0;display: none;} \n\n/*白天主题配色*/\n@media(prefers-color-scheme:light){\nhtml{background:#FEFEFE;}\n.v_title{color:black !important;}\n.v_desc,.v_desc a,#intro{color:#444 !important;}\n.open_content{color:#4898E0 !important;}\n#show_more{background: linear-gradient(to bottom,transparent,#FEFEFE 100%);}\n.tab_content{background:#FEFEFE;}\n.tab_control li span{background:#4898E0;}\n.tab_control li.current{color:#eee;background: linear-gradient(to bottom,black 10%,white 90%);}\n.play_list li a{color:#444;background:#eee;}\n.play_list li.current a{color:black;border:2px solid black;}\n} \n"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100987,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "ul@li",
    "ruleContent": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>内容提取</title>\n<!-- v2025.05.10 -->\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<script src=\"https://code.jquery.com/jquery-3.6.0.min.js\"></script>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.11.3/viewer.min.css\" />\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.11.3/viewer.min.js\"></script>\n<style>\n    body { font-family: Arial, sans-serif; font-size: 16px; }\n    #title, #page, #loading-status { margin: 0 auto; font-size: 20px; text-align: center; }\n    #description, #urls, #video-url, #video-sources, #messages { width: 100%; max-width: 800px; margin: 1.5px auto; font-size: 14px; text-align: left; word-wrap: break-word; white-space: pre-wrap; }\n    #text, #text :not(img), #text img + * { text-indent: 2em; width: 100%; font-size: 16px; line-height: 1.5em; margin-top: 0; margin-bottom: 0; word-wrap: break-word; white-space: pre-wrap; }\n    img, #text img { width: 100%; height: auto; display: block; margin-bottom: 1.5px; }\n    .flex-container { display: flex; justify-content: center; align-items: center; gap: 10px; margin: 1.5px 0; font-size: 14px; }\n    button, select { flex: 1 1 31%; padding: 3px; border: 1px solid #ccc; border-radius: 5px; box-sizing: border-box; cursor: pointer; background-color: #f9f9f9; transition: background-color 0.3s ease; margin: 1.5px; min-width: 0; font-size: 14px; }\n    #url-select, #video-source-select { flex: 1 1 100%; margin-left: 0; margin-right: 0; text-align: center; }\n    #video-element { width: 100%; height: auto; }\n    textarea { width: 100%; height: auto; min-height: 100px; box-sizing: border-box; resize: vertical; }\n    .error, .warn { color: red; }\n</style>\n</head>\n<body>\n    <h3 id=\"title\">{{@@title@text||h1.0@text||h2.0@text||.title.0@text}}</h3>\n    <p id=\"description\">{{@@.info.0@html||.jianjie@html}}</p>\n    <p id=\"page\" style=\"display:none;\">共<span id=\"total-pages\">1</span>页</p>\n    <p id=\"loading-status\" style=\"display:none;\"></p>\n\n    <div class=\"flex-container\" id=\"loading-buttons\" style=\"display:none;\">\n        <button id=\"prev-page-btn\">上一页</button>\n        <button id=\"next-page-btn\">下一页</button>\n        <button id=\"auto-load-btn\">自&nbsp;&nbsp;动</button>\n    </div>\n    \n    <div class=\"flex-container\">\n        <select id=\"url-select\" style=\"display:none;\"></select>\n    </div>\n    \n    <div class=\"flex-container\">\n        <button id=\"toggle-urls-btn\">显/隐网址</button>\n        <button id=\"toggle-messages-btn\">显/隐信息</button>\n        <button id=\"toggle-debug-btn\">显/隐调试</button>\n    </div>\n    <div id=\"urls\"></div>\n    <div id=\"messages\"></div>\n    <div id=\"debug-info\"></div>\n    <div id=\"video-url\"></div>\n    <div id=\"video-container\" style=\"display: none;\">\n        <video id=\"video-element\" controls preload=\"auto\" width=\"640\" height=\"264\">\n            <source id=\"video-source\" src=\"\" type=\"\">您的浏览器不支持 video 标签。\n        </video>\n    </div>\n    <div class=\"flex-container\" id=\"video-source-container\" style=\"display: none;\">\n        <select id=\"video-source-select\" onchange=\"updateVideoSource()\"></select>\n    </div>\n    <div id=\"images\"></div>\n    <div id=\"text\"></div>\n\n    <script>\n        // 配置对象，包含各种选择器、延迟时间等配置项\n        const config = {    \n            videoSelector: 'body', // 视频选择器\n            imgSelector: '.gridlane-box-inside img,.photos figure img,.content p img', // 图片选择器\n            textSelector: '#content', // 文本选择器\n            debugSelector: '#content, .page, .pager, .content, script', // 调试信息选择器\n            swapImageAttributes: false, // 是否交换图片属性\n            delayTime: 1500, // 延迟提取时间\n            retryDelayTime: 1500, // 重试加载延迟时间\n            maxLoadAttempts: 3, // 最大加载次数\n            autoLoading: false, // true自动模式，false单页模式\n            debugOnce: 0, // 只在特定索引输出一次调试信息\n            totalPagesText: '{{@@.page.0@a.-2@textNodes}}', // 总页码\n            urlSuffixToRemove: /\\.html$/, // 移除url后缀\n            pageUrlText: '{urlPrefix}_{i}.html', // 拼接URL模板        \n            ListMode: true, // true网址列表模式，false网址拼接模式    \n            initialUrls: `{{@@#sort-item-5.0@a@href}}`, // 网址\n            initialUrlsName: `{{@@#sort-item-5.0@a@span@text}}`, // 网址名称\n            sourceurl: '', // 来源URL前缀\n        };\n\n        let videoSources = []; // 存储视频源数组\n        let loadAttempts = {}; // 记录每个URL的加载尝试次数\n        let urls = []; // 存储所有页面的URL\n        let imageBox;\n        let textBox;\n        let currentPageIndex = 0; // 当前页面索引\n        let canLoadNextPage = true; // 控制是否可以加载下一页\n        let autoLoadInProgress = false; // 自动加载状态\n\n        // 构建URL列表\n        function buildUrls(totalPages, baseUrl) {\n            let initialUrlsArray = config.initialUrls.trim().split('\\n').filter(url => url.trim() !== '');\n            let initialUrlsNameArray = config.initialUrlsName.trim().split('\\n').filter(name => name.trim() !== '');\n\n            if (config.ListMode && initialUrlsArray.length > 0) {\n                if (initialUrlsArray.length !== initialUrlsNameArray.length) {\n                    $('#messages').append(`<span class=\"warn\">警告：initialUrls 和 initialUrlsName 的长度不匹配。</span><br>`);\n                }\n\n                urls = initialUrlsArray.map(url => {\n                    if (config.sourceurl && url.startsWith('/') && !/^https?:\\/\\//i.test(url)) {\n                        return config.sourceurl.replace(/\\/$/, '') + url;\n                    } else {\n                        return url;\n                    }\n                });\n\n                urls.forEach((url, index) => {\n                    const name = initialUrlsNameArray[index] || `第 ${index + 1} 页`;\n                    $('#url-select').append(`<option value=\"${index}\">${name}</option>`);\n                    $('#urls').append(`<div>${name}: ${url}</div>`);\n                });\n            } else {\n                if (totalPages === 1) {\n                    urls.push(baseUrl);\n                } else {\n                    urls.push(baseUrl);\n                    for (let i = 2; i <= totalPages; i++) {\n                        urls.push(config.pageUrlText.replace('{urlPrefix}', baseUrl.replace(config.urlSuffixToRemove, '').replace(/\\/$/, '')).replace('{i}', i));\n                    }\n                }\n\n                urls.forEach((url, index) => {\n                    const name = `第 ${index + 1} 页`;\n                    $('#url-select').append(`<option value=\"${index}\">${name}</option>`);\n                    $('#urls').append(`<div>${name}: ${url}</div>`);\n                });\n            }\n\n            $('#total-pages').text(urls.length);\n            toggleNavigationButtons();\n            toggleTotalPagesDisplay();\n        }\n\n        // 规范化URL\n        function normalizeUrl(url) {\n            if (typeof url !== 'string' || !url.trim()) {\n                return '';\n            }\n            const match = url.match(/['\"](.*?)['\"]/);\n            if (match && match[1]) {\n                url = match[1];\n            }\n\n            function processUrl(str) {\n                str = str.trim();\n                str = str.replace(/\\\\u[\\dA-F]{4}/gi, match => String.fromCharCode(parseInt(match.replace(/\\\\u/g, ''), 16)));\n                str = decodeURIComponent(str);\n                str = str.replace(/^http:\\/([^/])/, 'http://$1');\n                str = str.replace(/^https:\\/([^/])/, 'https://$1');\n                return str;\n            }\n            return processUrl(url);\n        }\n\n        // 清空容器内容\n        function clearContainers() {\n            $('#messages').empty();\n            $('#images').empty();\n            $('#text').empty();\n        }\n\n        // 更新图像源\n        function updateImageSrc(elements, shouldSwap) {\n            elements.each(function () {\n                const $this = $(this);\n                const attrsToUpdate = {};\n                if (shouldSwap) {\n                    ['data-original', 'data-src', 'data-url'].forEach(attr => {\n                        if ($this.attr(attr)) {\n                            attrsToUpdate['src'] = $this.attr(attr);\n                        }\n                    });\n                }\n                $this.attr(attrsToUpdate);\n            });\n            return elements;\n        }\n\n        // 切换导航按钮显示状态\n        function toggleNavigationButtons() {\n            if ($('#url-select option').length > 1 && !config.autoLoading) {\n                $('#loading-buttons').show();\n                $('#url-select').show();\n            } else {\n                $('#loading-buttons').hide();\n                $('#url-select').hide();\n            }\n        }\n\n        // 显示加载状态\n        function showLoadingStatus(pageNumber) {\n            const selectedOption = $('#url-select option:selected').text();\n            $('#loading-status').text(`正在加载：${selectedOption}`).show();\n        }\n\n        // 隐藏加载状态\n        function hideLoadingStatus() {\n            $('#loading-status').hide();\n        }\n\n        // 加载指定索引的内容\n        function loadContent(index) {\n            if (index < 0 || index >= urls.length || !canLoadNextPage) return;\n            canLoadNextPage = false;\n            currentPageIndex = index;\n            $('#url-select').val(index);\n            $('#messages').append(`<div>当前地址: <span class=\"warn\">${urls[index]}</span></div>`);\n            if (autoLoadInProgress) {\n                showLoadingStatus(index + 1);\n            }\n            $.ajax({\n                url: urls[index],\n                type: 'GET',\n                success: function (data) {\n                    try {\n                    const $data = $(data);\n                    let updatedHtmlContent = data.replace(/(['\"])(\\/\\/)(?!\\/)/g, '$1https://')\n                        .replace(/src=\"upload/gi, 'src=\"/upload')\n                        .replace(/style=[\"'][^'\"]+[\"']/gi, '')\n                        .replace(/\\\\\\//g, '/');\n                    const parser = new DOMParser();\n                    const doc = parser.parseFromString(updatedHtmlContent, \"text/html\");\n\n                    if (config.debugOnce === index) {\n                        const debugElements = $(doc).find(config.debugSelector);\n                        if (debugElements.length > 0) {\n                            const debugContents = $('<pre>').html(debugElements.clone().wrapAll('<div/>').parent().html()).html();\n                            $('#debug-info').html(`<span class=\"warn\">调试信息: <textarea rows=\"10\" cols=\"80\">${debugContents}</textarea></span>`);\n                        } else {\n                            $('#debug-info').html(`<span class=\"warn\">调试信息: <textarea rows=\"10\" cols=\"80\">调试信息未提取到内容，请检查选择器！</textarea></span>`);\n                        }\n                    }\n                    // 方法1：提取视频\n                    const videoSources1 = [];\n                    const videoContents = $(doc).find(config.videoSelector);\n                    const videoTags = $(videoContents).find('video, source');\n                    videoTags.each(function() {\n                        const videosrc = $(this).attr('src') || \n                                     $(this).attr('data-src') || \n                                     $(this).attr('data-original') || '';\n                        \n                        if (videosrc) {\n                            videoSources1.push(videosrc);\n                        }\n                    });\n                    //反馈\n                    if (videoSources1.length > 0) {\n                        $('#messages').append(`<span>方法1，找到 ${videoSources1.length} 个视频。</span><br>`);\n                    }\n\n                    // 方法2：正则提取视频\n                    const regex = /['\"]https?[^'<>\"]+(m3u8|mp4|webm|ogg|flv|mp3|m4a|wav|ape|flac)([^'<>\"]+)?['\"]/gi;\n                    const matches = data.match(regex);\n                    const videoSources2 = [];\n\n                    if (matches) {\n                        const uniqueMatches = [...new Set(matches)];\n                    \n                        uniqueMatches.forEach(match => {\n                            const normalizedSrc = normalizeUrl(match.replace(/['\"]/g, ''));\n                            videoSources2.push(normalizedSrc);\n                        });\n                    }\n                    //反馈\n                    if (videoSources2.length > 0) {\n                        $('#messages').append(`<span>方法2，找到 ${videoSources2.length} 个视频。</span><br>`);\n                    }\n\n                    // 合并两种方法的结果\n                    videoSources = [...videoSources1, ...videoSources2];\n\n                    // 去重并标准化 URL\n                    const imageExtensions = /\\.(jpg|jpeg|png|gif|bmp|svg)$/i;\n\n                    videoSources = videoSources\n                                  .map(src => normalizeUrl(src.replace(/\\\\+/g, '')))\n                                  .filter(src => src) // 过滤空值\n                                  .filter(src => !imageExtensions.test(src)); // 移除图片地址\n                        \n                    videoSources = [...new Set(videoSources)];// 去重\n\n                    // 显示最终结果\n                    $('#messages').append(`<span>总共找到 ${videoSources.length} 个视频。</span><br>`);\n\n                    if (videoSources.length > 0) {\n                        $('#messages').append(`<span>成功提取到视频，找到 ${videoSources.length} 个视频。</span><br>`);\n                        videoSources.forEach((src, idx) => {\n                            $('#messages').append(`<div>视频地址:<span class=\"warn\"> ${src}</span><br></div>`);\n                            $('#video-source-select').append(`<option value=\"${idx}\">视频源 ${idx + 1}</option>`);\n                        });\n                    \n                        if (videoSources.length == 1) {\n                            $('#video-container').show();\n                            $('#video-url').show();\n                            $('#video-source-container').hide();\n                            updateVideoSource();\n                        } else if (videoSources.length > 1) {\n                            $('#video-container').show();\n                            $('#video-url').show();\n                            $('#video-source-container').show();\n                            updateVideoSource();\n                        } else {\n                            $('#video-container').hide();\n                            $('#video-url').hide();\n                            $('#video-source-container').hide();\n                        }\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未找到视频源。</span><br>`);\n                        $('#video-container').hide();\n                        $('#video-url').hide();\n                        $('#video-source-container').hide();\n                    }\n\n                    //提取图片\n                    const $imgContents = $(doc).find(config.imgSelector);\n                    const shouldSwap = config.swapImageAttributes;\n                    const newContents = updateImageSrc($imgContents.clone(), shouldSwap);\n                    $('#images').append(newContents).show();\n                    if (newContents.length > 0) {\n                        $('#messages').append(`<span>成功提取图片，共 ${newContents.length} 张。</span><br>`);\n                        newContents.each(function () {\n                            const imgSrc = $(this).attr('src') || $(this).attr('data-original') || $(this).attr('data-src') || $(this).attr('data-url');\n                            $('#messages').append(`<div>地址:<span class=\"warn\"> ${imgSrc}</span><br></div>`);\n                        });\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未提取到图片。</span><br>`);\n                    }\n\n                    //提取图片和文本\n                    const textContents = $(doc).find(config.textSelector).map(function () {\n                        const $currentContents = $(this);\n                        $currentContents.find('img + br, script, video, source, iframe').remove();\n                        $currentContents.html($currentContents.html().replace(/>\\s+/gi, '>').replace(/<\\/?br\\s*([^>]*)\\s*\\/?>/gi, '\\n').replace(/\\n+/g, '\\n'));\n                        return $currentContents.html();\n                    }).get().join('');\n                    if (textContents.trim()) {\n                        $('#text').append(`<span>${textContents}</span><br>`).show();\n                        $('#messages').append(`<span>成功提取图文。</span><br>`);\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未提取到图文。</span><br>`);\n                    }\n\n                    if (autoLoadInProgress && currentPageIndex < urls.length - 1) {\n                        setTimeout(() => { \n                            canLoadNextPage = true;\n                            loadContent(currentPageIndex + 1); \n                        }, config.delayTime);\n                    } else {\n                        canLoadNextPage = true;\n                        if (autoLoadInProgress) {\n                            hideLoadingStatus();\n                        }\n                    }\n                } catch (parseError) {\n                    $('#messages').append(`<span class=\"error\">解析页面内容时发生错误: ${parseError.message}</span><br>`);\n                    handleLoadFailure(urls, index);\n                } finally {\n                    if (imageBox) imageBox.viewer.update();\n                    if (textBox) textBox.viewer.update();\n                }\n            },\n            error: function (jqXHR, textStatus, errorThrown) {\n                let errorMessage = `内容加载失败: ${urls[index]}`;\n                switch (textStatus) {\n                    case 'timeout':\n                        errorMessage += ', 请求超时';\n                        break;\n                    case 'abort':\n                        errorMessage += ', 请求被取消';\n                        break;\n                    case 'parsererror':\n                        errorMessage += ', 解析响应出错';\n                        break;\n                    default:\n                        errorMessage += `, 状态码: ${jqXHR.status}, 错误信息: ${errorThrown}`;\n                        break;\n                }\n                $('#messages').append(`<span class=\"error\">${errorMessage}</span><br>`);\n                handleLoadFailure(urls, index);\n                }\n            });\n        }\n\n        // 处理加载失败的情况\n        function handleLoadFailure(urls, index) {\n            if (!loadAttempts[urls[index]]) {\n                loadAttempts[urls[index]] = 1;\n            } else {\n                loadAttempts[urls[index]]++;\n            }\n            if (loadAttempts[urls[index]] <= config.maxLoadAttempts) {\n                const retryMessage = `第${index + 1}页加载失败，正在进行第${loadAttempts[urls[index]]}次加载！`;\n                $('#messages').append(`<span class=\"error\">${retryMessage}</span><br>`);\n                setTimeout(() => { \n                    canLoadNextPage = true;\n                    loadContent(index); \n                }, config.retryDelayTime);\n            } else {\n                const finalErrorMessage = `第${index + 1}页加载失败，已达到最大尝试次数(${config.maxLoadAttempts})！`;\n                $('#messages').append(`<span class=\"error\">${finalErrorMessage}</span><br>`);\n                if (autoLoadInProgress && currentPageIndex < urls.length - 1) {\n                    setTimeout(() => { \n                        canLoadNextPage = true;\n                        loadContent(currentPageIndex + 1); \n                    }, config.delayTime);\n                } else {\n                    canLoadNextPage = true;\n                    if (autoLoadInProgress) {\n                        hideLoadingStatus();\n                    }\n                }\n            }\n        }\n\n        // 更新视频源\n        function updateVideoSource() {\n            const selectedIndex = parseInt(document.getElementById('video-source-select').value);\n            if (isNaN(selectedIndex) || !videoSources[selectedIndex]) {\n                $('#messages').append(`<span class=\"warn\">未找到有效的视频源。</span><br>`);\n                console.warn(\"Invalid or undefined video source:\", selectedIndex, videoSources);\n                return;\n            }\n\n            const selectedSource = videoSources[selectedIndex];\n            document.getElementById('video-url').textContent = `视频地址:\\n ${selectedSource}`;\n\n            const videoSourceElement = document.getElementById('video-source');\n            videoSourceElement.src = selectedSource;\n\n            const videoElement = document.getElementById('video-element');\n            videoElement.load();\n\n            $('#messages').append(`<span>更新视频源为: ${selectedSource}</span><br>`);\n            console.log(\"Updated video source to:\", selectedSource);\n        }\n\n        // 切换总页数显示状态\n        function toggleTotalPagesDisplay() {\n            if (urls.length > 1) {\n                $('#page').show();\n            } else {\n                $('#page').hide();\n            }\n        }\n\n        // 页面加载完成后执行的主要逻辑\n        $(document).ready(function () {\n            imageBox = document.getElementById('images');\n            textBox = document.getElementById('text');\n            if (imageBox && textBox) {\n                new Viewer(imageBox, { title: true, interval: 2000 });\n                new Viewer(textBox, { title: true, interval: 2000 });\n            }\n\n            const totalPagesText = config.totalPagesText;\n            const totalPages = parseInt(totalPagesText, 10) || 1;\n            const baseUrl = '{{baseUrl}}';\n\n            clearContainers();\n            $('#urls, #debug-info textarea, #video-url, #video-source-select').empty();\n            $('#urls, #messages, #debug-info, #video-url, #video-container, #video-source-container, #images, #text').hide();\n\n            buildUrls(totalPages, baseUrl);\n\n            const urlSelect = document.getElementById('url-select');\n            if (urlSelect.options.length > 0) {\n                urlSelect.value = '0'; \n\n                if (config.autoLoading) {\n                    autoLoadInProgress = true;\n                    for (let i = 0; i < urls.length; i++) {\n                        loadContent(i);\n                    }\n                } else {\n                    loadContent(0);\n                }\n            } else {\n                loadContent(0);\n            }\n\n            $('#url-select').change(function () {\n                clearContainers();\n                const selectedIndex = parseInt($(this).val());\n                loadContent(selectedIndex);\n            });\n            $('#prev-page-btn').click(function () {\n                clearContainers();\n                if (currentPageIndex > 0) {\n                    loadContent(currentPageIndex - 1);\n                }\n            });\n            $('#next-page-btn').click(function () {\n                clearContainers();\n                if (currentPageIndex < urls.length - 1) {\n                    loadContent(currentPageIndex + 1);\n                }\n            });\n            $('#auto-load-btn').click(function () {\n                autoLoadInProgress = true;\n                showLoadingStatus(1); \n                for (let i = currentPageIndex + 1; i < urls.length; i++) {\n                    loadContent(i);\n                }\n            });\n            $('#toggle-messages-btn').click(function () { $('#messages').toggle(); });\n            $('#toggle-urls-btn').click(function () { $('#urls').toggle(); });\n            $('#toggle-debug-btn').click(function () { $('#debug-info').toggle(); });\n        });\n    </script>\n</body>\n</html>",
    "ruleImage": "a@data-original",
    "ruleLink": "a.0@href",
    "ruleNextPage": "page||text.下一页@href",
    "rulePubDate": "[class=\"pic-text text-right\"]@text",
    "ruleTitle": "h4@text",
    "singleUrl": false,
    "sortUrl": "搜索🔍::/jiejie/index.php/vod/search.html?wd={{source.getVariable()}}\n黄瓜资源::/jiejie/index.php/vod/type/id/87.html\n155资源::/jiejie/index.php/vod/type/id/248.html\n森林资源::/jiejie/index.php/vod/type/id/117.html\n奥斯卡资源::/jiejie/index.php/vod/type/id/86.html\n百万资源::/jiejie/index.php/vod/type/id/237.html\n制服诱惑::/jiejie/index.php/vod/show/id/251.html\n中文字幕::/jiejie/index.php/vod/show/id/254.html\n美乳巨乳::/jiejie/index.php/vod/show/id/262.html\n熟女人妻::/jiejie/index.php/vod/show/id/259.html\n萝莉少女::/jiejie/index.php/vod/show/id/260.html\n强奸乱伦::/jiejie/index.php/vod/show/id/263.html\n无码专区::/jiejie/index.php/vod/show/id/249.html",
    "sourceComment": "jiejiesp.xyz",
    "sourceGroup": "202",
    "sourceIcon": "https://8wx27o6v.91gaoqing.rest/upload/vod/20250428-1/cfc014ec16937c7f415afd712b482842.gif",
    "sourceName": "姐姐视频",
    "sourceUrl": "https://wap.jiejiesp27.xyz/"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100983,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "ul@li",
    "ruleContent": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>内容提取</title>\n<!-- v2025.05.10 -->\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<script src=\"https://code.jquery.com/jquery-3.6.0.min.js\"></script>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.11.3/viewer.min.css\" />\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.11.3/viewer.min.js\"></script>\n<style>\n    body { font-family: Arial, sans-serif; font-size: 16px; }\n    #title, #page, #loading-status { margin: 0 auto; font-size: 20px; text-align: center; }\n    #description, #urls, #video-url, #video-sources, #messages { width: 100%; max-width: 800px; margin: 1.5px auto; font-size: 14px; text-align: left; word-wrap: break-word; white-space: pre-wrap; }\n    #text, #text :not(img), #text img + * { text-indent: 2em; width: 100%; font-size: 16px; line-height: 1.5em; margin-top: 0; margin-bottom: 0; word-wrap: break-word; white-space: pre-wrap; }\n    img, #text img { width: 100%; height: auto; display: block; margin-bottom: 1.5px; }\n    .flex-container { display: flex; justify-content: center; align-items: center; gap: 10px; margin: 1.5px 0; font-size: 14px; }\n    button, select { flex: 1 1 31%; padding: 3px; border: 1px solid #ccc; border-radius: 5px; box-sizing: border-box; cursor: pointer; background-color: #f9f9f9; transition: background-color 0.3s ease; margin: 1.5px; min-width: 0; font-size: 14px; }\n    #url-select, #video-source-select { flex: 1 1 100%; margin-left: 0; margin-right: 0; text-align: center; }\n    #video-element { width: 100%; height: auto; }\n    textarea { width: 100%; height: auto; min-height: 100px; box-sizing: border-box; resize: vertical; }\n    .error, .warn { color: red; }\n</style>\n</head>\n<body>\n    <h3 id=\"title\">{{@@title@text||h1.0@text||h2.0@text||.title.0@text}}</h3>\n    <p id=\"description\">{{@@.info.0@html||.jianjie@html}}</p>\n    <p id=\"page\" style=\"display:none;\">共<span id=\"total-pages\">1</span>页</p>\n    <p id=\"loading-status\" style=\"display:none;\"></p>\n\n    <div class=\"flex-container\" id=\"loading-buttons\" style=\"display:none;\">\n        <button id=\"prev-page-btn\">上一页</button>\n        <button id=\"next-page-btn\">下一页</button>\n        <button id=\"auto-load-btn\">自&nbsp;&nbsp;动</button>\n    </div>\n    \n    <div class=\"flex-container\">\n        <select id=\"url-select\" style=\"display:none;\"></select>\n    </div>\n    \n    <div class=\"flex-container\">\n        <button id=\"toggle-urls-btn\">显/隐网址</button>\n        <button id=\"toggle-messages-btn\">显/隐信息</button>\n        <button id=\"toggle-debug-btn\">显/隐调试</button>\n    </div>\n    <div id=\"urls\"></div>\n    <div id=\"messages\"></div>\n    <div id=\"debug-info\"></div>\n    <div id=\"video-url\"></div>\n    <div id=\"video-container\" style=\"display: none;\">\n        <video id=\"video-element\" controls preload=\"auto\" width=\"640\" height=\"264\">\n            <source id=\"video-source\" src=\"\" type=\"\">您的浏览器不支持 video 标签。\n        </video>\n    </div>\n    <div class=\"flex-container\" id=\"video-source-container\" style=\"display: none;\">\n        <select id=\"video-source-select\" onchange=\"updateVideoSource()\"></select>\n    </div>\n    <div id=\"images\"></div>\n    <div id=\"text\"></div>\n\n    <script>\n        // 配置对象，包含各种选择器、延迟时间等配置项\n        const config = {    \n            videoSelector: 'body', // 视频选择器\n            imgSelector: '.gridlane-box-inside img,.photos figure img,.content p img', // 图片选择器\n            textSelector: '#content', // 文本选择器\n            debugSelector: '#content, .page, .pager, .content, script', // 调试信息选择器\n            swapImageAttributes: false, // 是否交换图片属性\n            delayTime: 1500, // 延迟提取时间\n            retryDelayTime: 1500, // 重试加载延迟时间\n            maxLoadAttempts: 3, // 最大加载次数\n            autoLoading: false, // true自动模式，false单页模式\n            debugOnce: 0, // 只在特定索引输出一次调试信息\n            totalPagesText: '{{@@.page.0@a.-2@textNodes}}', // 总页码\n            urlSuffixToRemove: /\\.html$/, // 移除url后缀\n            pageUrlText: '{urlPrefix}_{i}.html', // 拼接URL模板        \n            ListMode: true, // true网址列表模式，false网址拼接模式    \n            initialUrls: `{{@@#sort-item-5.0@a@href}}`, // 网址\n            initialUrlsName: `{{@@#sort-item-5.0@a@span@text}}`, // 网址名称\n            sourceurl: '', // 来源URL前缀\n        };\n\n        let videoSources = []; // 存储视频源数组\n        let loadAttempts = {}; // 记录每个URL的加载尝试次数\n        let urls = []; // 存储所有页面的URL\n        let imageBox;\n        let textBox;\n        let currentPageIndex = 0; // 当前页面索引\n        let canLoadNextPage = true; // 控制是否可以加载下一页\n        let autoLoadInProgress = false; // 自动加载状态\n\n        // 构建URL列表\n        function buildUrls(totalPages, baseUrl) {\n            let initialUrlsArray = config.initialUrls.trim().split('\\n').filter(url => url.trim() !== '');\n            let initialUrlsNameArray = config.initialUrlsName.trim().split('\\n').filter(name => name.trim() !== '');\n\n            if (config.ListMode && initialUrlsArray.length > 0) {\n                if (initialUrlsArray.length !== initialUrlsNameArray.length) {\n                    $('#messages').append(`<span class=\"warn\">警告：initialUrls 和 initialUrlsName 的长度不匹配。</span><br>`);\n                }\n\n                urls = initialUrlsArray.map(url => {\n                    if (config.sourceurl && url.startsWith('/') && !/^https?:\\/\\//i.test(url)) {\n                        return config.sourceurl.replace(/\\/$/, '') + url;\n                    } else {\n                        return url;\n                    }\n                });\n\n                urls.forEach((url, index) => {\n                    const name = initialUrlsNameArray[index] || `第 ${index + 1} 页`;\n                    $('#url-select').append(`<option value=\"${index}\">${name}</option>`);\n                    $('#urls').append(`<div>${name}: ${url}</div>`);\n                });\n            } else {\n                if (totalPages === 1) {\n                    urls.push(baseUrl);\n                } else {\n                    urls.push(baseUrl);\n                    for (let i = 2; i <= totalPages; i++) {\n                        urls.push(config.pageUrlText.replace('{urlPrefix}', baseUrl.replace(config.urlSuffixToRemove, '').replace(/\\/$/, '')).replace('{i}', i));\n                    }\n                }\n\n                urls.forEach((url, index) => {\n                    const name = `第 ${index + 1} 页`;\n                    $('#url-select').append(`<option value=\"${index}\">${name}</option>`);\n                    $('#urls').append(`<div>${name}: ${url}</div>`);\n                });\n            }\n\n            $('#total-pages').text(urls.length);\n            toggleNavigationButtons();\n            toggleTotalPagesDisplay();\n        }\n\n        // 规范化URL\n        function normalizeUrl(url) {\n            if (typeof url !== 'string' || !url.trim()) {\n                return '';\n            }\n            const match = url.match(/['\"](.*?)['\"]/);\n            if (match && match[1]) {\n                url = match[1];\n            }\n\n            function processUrl(str) {\n                str = str.trim();\n                str = str.replace(/\\\\u[\\dA-F]{4}/gi, match => String.fromCharCode(parseInt(match.replace(/\\\\u/g, ''), 16)));\n                str = decodeURIComponent(str);\n                str = str.replace(/^http:\\/([^/])/, 'http://$1');\n                str = str.replace(/^https:\\/([^/])/, 'https://$1');\n                return str;\n            }\n            return processUrl(url);\n        }\n\n        // 清空容器内容\n        function clearContainers() {\n            $('#messages').empty();\n            $('#images').empty();\n            $('#text').empty();\n        }\n\n        // 更新图像源\n        function updateImageSrc(elements, shouldSwap) {\n            elements.each(function () {\n                const $this = $(this);\n                const attrsToUpdate = {};\n                if (shouldSwap) {\n                    ['data-original', 'data-src', 'data-url'].forEach(attr => {\n                        if ($this.attr(attr)) {\n                            attrsToUpdate['src'] = $this.attr(attr);\n                        }\n                    });\n                }\n                $this.attr(attrsToUpdate);\n            });\n            return elements;\n        }\n\n        // 切换导航按钮显示状态\n        function toggleNavigationButtons() {\n            if ($('#url-select option').length > 1 && !config.autoLoading) {\n                $('#loading-buttons').show();\n                $('#url-select').show();\n            } else {\n                $('#loading-buttons').hide();\n                $('#url-select').hide();\n            }\n        }\n\n        // 显示加载状态\n        function showLoadingStatus(pageNumber) {\n            const selectedOption = $('#url-select option:selected').text();\n            $('#loading-status').text(`正在加载：${selectedOption}`).show();\n        }\n\n        // 隐藏加载状态\n        function hideLoadingStatus() {\n            $('#loading-status').hide();\n        }\n\n        // 加载指定索引的内容\n        function loadContent(index) {\n            if (index < 0 || index >= urls.length || !canLoadNextPage) return;\n            canLoadNextPage = false;\n            currentPageIndex = index;\n            $('#url-select').val(index);\n            $('#messages').append(`<div>当前地址: <span class=\"warn\">${urls[index]}</span></div>`);\n            if (autoLoadInProgress) {\n                showLoadingStatus(index + 1);\n            }\n            $.ajax({\n                url: urls[index],\n                type: 'GET',\n                success: function (data) {\n                    try {\n                    const $data = $(data);\n                    let updatedHtmlContent = data.replace(/(['\"])(\\/\\/)(?!\\/)/g, '$1https://')\n                        .replace(/src=\"upload/gi, 'src=\"/upload')\n                        .replace(/style=[\"'][^'\"]+[\"']/gi, '')\n                        .replace(/\\\\\\//g, '/');\n                    const parser = new DOMParser();\n                    const doc = parser.parseFromString(updatedHtmlContent, \"text/html\");\n\n                    if (config.debugOnce === index) {\n                        const debugElements = $(doc).find(config.debugSelector);\n                        if (debugElements.length > 0) {\n                            const debugContents = $('<pre>').html(debugElements.clone().wrapAll('<div/>').parent().html()).html();\n                            $('#debug-info').html(`<span class=\"warn\">调试信息: <textarea rows=\"10\" cols=\"80\">${debugContents}</textarea></span>`);\n                        } else {\n                            $('#debug-info').html(`<span class=\"warn\">调试信息: <textarea rows=\"10\" cols=\"80\">调试信息未提取到内容，请检查选择器！</textarea></span>`);\n                        }\n                    }\n                    // 方法1：提取视频\n                    const videoSources1 = [];\n                    const videoContents = $(doc).find(config.videoSelector);\n                    const videoTags = $(videoContents).find('video, source');\n                    videoTags.each(function() {\n                        const videosrc = $(this).attr('src') || \n                                     $(this).attr('data-src') || \n                                     $(this).attr('data-original') || '';\n                        \n                        if (videosrc) {\n                            videoSources1.push(videosrc);\n                        }\n                    });\n                    //反馈\n                    if (videoSources1.length > 0) {\n                        $('#messages').append(`<span>方法1，找到 ${videoSources1.length} 个视频。</span><br>`);\n                    }\n\n                    // 方法2：正则提取视频\n                    const regex = /['\"]https?[^'<>\"]+(m3u8|mp4|webm|ogg|flv|mp3|m4a|wav|ape|flac)([^'<>\"]+)?['\"]/gi;\n                    const matches = data.match(regex);\n                    const videoSources2 = [];\n\n                    if (matches) {\n                        const uniqueMatches = [...new Set(matches)];\n                    \n                        uniqueMatches.forEach(match => {\n                            const normalizedSrc = normalizeUrl(match.replace(/['\"]/g, ''));\n                            videoSources2.push(normalizedSrc);\n                        });\n                    }\n                    //反馈\n                    if (videoSources2.length > 0) {\n                        $('#messages').append(`<span>方法2，找到 ${videoSources2.length} 个视频。</span><br>`);\n                    }\n\n                    // 合并两种方法的结果\n                    videoSources = [...videoSources1, ...videoSources2];\n\n                    // 去重并标准化 URL\n                    const imageExtensions = /\\.(jpg|jpeg|png|gif|bmp|svg)$/i;\n\n                    videoSources = videoSources\n                                  .map(src => normalizeUrl(src.replace(/\\\\+/g, '')))\n                                  .filter(src => src) // 过滤空值\n                                  .filter(src => !imageExtensions.test(src)); // 移除图片地址\n                        \n                    videoSources = [...new Set(videoSources)];// 去重\n\n                    // 显示最终结果\n                    $('#messages').append(`<span>总共找到 ${videoSources.length} 个视频。</span><br>`);\n\n                    if (videoSources.length > 0) {\n                        $('#messages').append(`<span>成功提取到视频，找到 ${videoSources.length} 个视频。</span><br>`);\n                        videoSources.forEach((src, idx) => {\n                            $('#messages').append(`<div>视频地址:<span class=\"warn\"> ${src}</span><br></div>`);\n                            $('#video-source-select').append(`<option value=\"${idx}\">视频源 ${idx + 1}</option>`);\n                        });\n                    \n                        if (videoSources.length == 1) {\n                            $('#video-container').show();\n                            $('#video-url').show();\n                            $('#video-source-container').hide();\n                            updateVideoSource();\n                        } else if (videoSources.length > 1) {\n                            $('#video-container').show();\n                            $('#video-url').show();\n                            $('#video-source-container').show();\n                            updateVideoSource();\n                        } else {\n                            $('#video-container').hide();\n                            $('#video-url').hide();\n                            $('#video-source-container').hide();\n                        }\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未找到视频源。</span><br>`);\n                        $('#video-container').hide();\n                        $('#video-url').hide();\n                        $('#video-source-container').hide();\n                    }\n\n                    //提取图片\n                    const $imgContents = $(doc).find(config.imgSelector);\n                    const shouldSwap = config.swapImageAttributes;\n                    const newContents = updateImageSrc($imgContents.clone(), shouldSwap);\n                    $('#images').append(newContents).show();\n                    if (newContents.length > 0) {\n                        $('#messages').append(`<span>成功提取图片，共 ${newContents.length} 张。</span><br>`);\n                        newContents.each(function () {\n                            const imgSrc = $(this).attr('src') || $(this).attr('data-original') || $(this).attr('data-src') || $(this).attr('data-url');\n                            $('#messages').append(`<div>地址:<span class=\"warn\"> ${imgSrc}</span><br></div>`);\n                        });\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未提取到图片。</span><br>`);\n                    }\n\n                    //提取图片和文本\n                    const textContents = $(doc).find(config.textSelector).map(function () {\n                        const $currentContents = $(this);\n                        $currentContents.find('img + br, script, video, source, iframe').remove();\n                        $currentContents.html($currentContents.html().replace(/>\\s+/gi, '>').replace(/<\\/?br\\s*([^>]*)\\s*\\/?>/gi, '\\n').replace(/\\n+/g, '\\n'));\n                        return $currentContents.html();\n                    }).get().join('');\n                    if (textContents.trim()) {\n                        $('#text').append(`<span>${textContents}</span><br>`).show();\n                        $('#messages').append(`<span>成功提取图文。</span><br>`);\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未提取到图文。</span><br>`);\n                    }\n\n                    if (autoLoadInProgress && currentPageIndex < urls.length - 1) {\n                        setTimeout(() => { \n                            canLoadNextPage = true;\n                            loadContent(currentPageIndex + 1); \n                        }, config.delayTime);\n                    } else {\n                        canLoadNextPage = true;\n                        if (autoLoadInProgress) {\n                            hideLoadingStatus();\n                        }\n                    }\n                } catch (parseError) {\n                    $('#messages').append(`<span class=\"error\">解析页面内容时发生错误: ${parseError.message}</span><br>`);\n                    handleLoadFailure(urls, index);\n                } finally {\n                    if (imageBox) imageBox.viewer.update();\n                    if (textBox) textBox.viewer.update();\n                }\n            },\n            error: function (jqXHR, textStatus, errorThrown) {\n                let errorMessage = `内容加载失败: ${urls[index]}`;\n                switch (textStatus) {\n                    case 'timeout':\n                        errorMessage += ', 请求超时';\n                        break;\n                    case 'abort':\n                        errorMessage += ', 请求被取消';\n                        break;\n                    case 'parsererror':\n                        errorMessage += ', 解析响应出错';\n                        break;\n                    default:\n                        errorMessage += `, 状态码: ${jqXHR.status}, 错误信息: ${errorThrown}`;\n                        break;\n                }\n                $('#messages').append(`<span class=\"error\">${errorMessage}</span><br>`);\n                handleLoadFailure(urls, index);\n                }\n            });\n        }\n\n        // 处理加载失败的情况\n        function handleLoadFailure(urls, index) {\n            if (!loadAttempts[urls[index]]) {\n                loadAttempts[urls[index]] = 1;\n            } else {\n                loadAttempts[urls[index]]++;\n            }\n            if (loadAttempts[urls[index]] <= config.maxLoadAttempts) {\n                const retryMessage = `第${index + 1}页加载失败，正在进行第${loadAttempts[urls[index]]}次加载！`;\n                $('#messages').append(`<span class=\"error\">${retryMessage}</span><br>`);\n                setTimeout(() => { \n                    canLoadNextPage = true;\n                    loadContent(index); \n                }, config.retryDelayTime);\n            } else {\n                const finalErrorMessage = `第${index + 1}页加载失败，已达到最大尝试次数(${config.maxLoadAttempts})！`;\n                $('#messages').append(`<span class=\"error\">${finalErrorMessage}</span><br>`);\n                if (autoLoadInProgress && currentPageIndex < urls.length - 1) {\n                    setTimeout(() => { \n                        canLoadNextPage = true;\n                        loadContent(currentPageIndex + 1); \n                    }, config.delayTime);\n                } else {\n                    canLoadNextPage = true;\n                    if (autoLoadInProgress) {\n                        hideLoadingStatus();\n                    }\n                }\n            }\n        }\n\n        // 更新视频源\n        function updateVideoSource() {\n            const selectedIndex = parseInt(document.getElementById('video-source-select').value);\n            if (isNaN(selectedIndex) || !videoSources[selectedIndex]) {\n                $('#messages').append(`<span class=\"warn\">未找到有效的视频源。</span><br>`);\n                console.warn(\"Invalid or undefined video source:\", selectedIndex, videoSources);\n                return;\n            }\n\n            const selectedSource = videoSources[selectedIndex];\n            document.getElementById('video-url').textContent = `视频地址:\\n ${selectedSource}`;\n\n            const videoSourceElement = document.getElementById('video-source');\n            videoSourceElement.src = selectedSource;\n\n            const videoElement = document.getElementById('video-element');\n            videoElement.load();\n\n            $('#messages').append(`<span>更新视频源为: ${selectedSource}</span><br>`);\n            console.log(\"Updated video source to:\", selectedSource);\n        }\n\n        // 切换总页数显示状态\n        function toggleTotalPagesDisplay() {\n            if (urls.length > 1) {\n                $('#page').show();\n            } else {\n                $('#page').hide();\n            }\n        }\n\n        // 页面加载完成后执行的主要逻辑\n        $(document).ready(function () {\n            imageBox = document.getElementById('images');\n            textBox = document.getElementById('text');\n            if (imageBox && textBox) {\n                new Viewer(imageBox, { title: true, interval: 2000 });\n                new Viewer(textBox, { title: true, interval: 2000 });\n            }\n\n            const totalPagesText = config.totalPagesText;\n            const totalPages = parseInt(totalPagesText, 10) || 1;\n            const baseUrl = '{{baseUrl}}';\n\n            clearContainers();\n            $('#urls, #debug-info textarea, #video-url, #video-source-select').empty();\n            $('#urls, #messages, #debug-info, #video-url, #video-container, #video-source-container, #images, #text').hide();\n\n            buildUrls(totalPages, baseUrl);\n\n            const urlSelect = document.getElementById('url-select');\n            if (urlSelect.options.length > 0) {\n                urlSelect.value = '0'; \n\n                if (config.autoLoading) {\n                    autoLoadInProgress = true;\n                    for (let i = 0; i < urls.length; i++) {\n                        loadContent(i);\n                    }\n                } else {\n                    loadContent(0);\n                }\n            } else {\n                loadContent(0);\n            }\n\n            $('#url-select').change(function () {\n                clearContainers();\n                const selectedIndex = parseInt($(this).val());\n                loadContent(selectedIndex);\n            });\n            $('#prev-page-btn').click(function () {\n                clearContainers();\n                if (currentPageIndex > 0) {\n                    loadContent(currentPageIndex - 1);\n                }\n            });\n            $('#next-page-btn').click(function () {\n                clearContainers();\n                if (currentPageIndex < urls.length - 1) {\n                    loadContent(currentPageIndex + 1);\n                }\n            });\n            $('#auto-load-btn').click(function () {\n                autoLoadInProgress = true;\n                showLoadingStatus(1); \n                for (let i = currentPageIndex + 1; i < urls.length; i++) {\n                    loadContent(i);\n                }\n            });\n            $('#toggle-messages-btn').click(function () { $('#messages').toggle(); });\n            $('#toggle-urls-btn').click(function () { $('#urls').toggle(); });\n            $('#toggle-debug-btn').click(function () { $('#debug-info').toggle(); });\n        });\n    </script>\n</body>\n</html>",
    "ruleImage": "img@src",
    "ruleLink": "a.0@href",
    "ruleNextPage": "text.下一页@href",
    "rulePubDate": "p@text",
    "ruleTitle": "img@alt",
    "singleUrl": false,
    "sortUrl": "搜索🔍::/index.php/vod/search.html?wd={{source.getVariable()}}\n偷拍自拍::index.php/vod/type/id/1.html\n中文字幕::index.php/vod/type/id/2.html\n重口味::index.php/vod/type/id/3.html\n未分类1::index.php/vod/type/id/4.html\n未分类2::index.php/vod/type/id/5.html\n未分类2::index.php/vod/type/id/6.html\n未分类4::index.php/vod/type/id/7.html\n未分类5::index.php/vod/type/id/8.html\n未分类6::index.php/vod/type/id/9.html\n黑料打烊::index.php/vod/type/id/10.html\n未分类7::index.php/vod/type/id/11.html\n未分类8::index.php/vod/type/id/12.html\n未分类9::index.php/vod/type/id/13.html\n未分类10::index.php/vod/type/id/14.html\n未分类11::index.php/vod/type/id/15.html\n未分类12::index.php/vod/type/id/16.html\n未分类13::index.php/vod/type/id/17.html\n未分类14::index.php/vod/type/id/18.html\n未分类15::index.php/vod/type/id/19.html\n未分类16::index.php/vod/type/id/20.html\n未分类17::index.php/vod/type/id/21.html\n未分类18::index.php/vod/type/id/22.html\n未分类19::index.php/vod/type/id/23.html\n未分类20::index.php/vod/type/id/24.html\n未分类21::index.php/vod/type/id/25.html\n未分类22::index.php/vod/type/id/26.html\n未分类23::index.php/vod/type/id/27.html\n未分类24::index.php/vod/type/id/28.html\n未分类25::index.php/vod/type/id/29.html\n未分类26::index.php/vod/type/id/30.html\n未分类27::index.php/vod/type/id/31.html\n未分类28::index.php/vod/type/id/32.html\n未分类29::index.php/vod/type/id/33.html\n未分类30::index.php/vod/type/id/34.html\n未分类31::index.php/vod/type/id/35.html\n未分类32::index.php/vod/type/id/36.html\n未分类33::index.php/vod/type/id/37.html",
    "sourceComment": "www.hhgav2.xyz",
    "sourceGroup": "202",
    "sourceIcon": "https://91ymdl.site/2025020810f8tgt.gif",
    "sourceName": "狠狠干",
    "sourceUrl": "https://www.hhgav9.xyz/"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100979,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "[class=\"group-contents layui-row\"]@a",
    "ruleContent": "class.player-box@all&&\nscript@all",
    "ruleImage": "img@src",
    "ruleLink": "a.0@href",
    "ruleNextPage": "page",
    "rulePubDate": "span@text",
    "ruleTitle": "p@text",
    "singleUrl": false,
    "sortUrl": "搜索🔍::/index.php/vodsearch/{{source.getVariable()}}----------{{page}}---.html\n热门视频::/index.php/vodtype/160-{{page}}.html\n麻豆视频::/index.php/vodtype/161-{{page}}.html\n91视频::/index.php/vodtype/162-{{page}}.html\n天美视频::/index.php/vodtype/163-{{page}}.html\n蜜桃视频::/index.php/vodtype/164-{{page}}.html\n皇家视频::/index.php/vodtype/165-{{page}}.html\n星空视频::/index.php/vodtype/166-{{page}}.html\n大象视频::/index.php/vodtype/168-{{page}}.html\n香蕉视频::/index.php/vodtype/174-{{page}}.html",
    "sourceComment": "https://77.wmbmtz.xyz/go/",
    "sourceGroup": "202",
    "sourceIcon": "https://sanxing.wmbm-4ga.buzz/upload/vod/20250210-1/0a72d886eb129bc0308995244bbfd179.gif",
    "sourceName": "抖阴视频",
    "sourceUrl": "https://sanxing.wmbm-4ga.buzz"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100974,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "ul@li",
    "ruleContent": "class.player-box@all&&\nscript@all",
    "ruleImage": "img@src",
    "ruleLink": "a.0@href",
    "ruleNextPage": "page||text.下一页@href",
    "rulePubDate": "span@text",
    "ruleTitle": "img@alt",
    "singleUrl": false,
    "sortUrl": "搜索🔍::/vodsearch/-------------.html?wd={{source.getVariable()}}",
    "sourceComment": "www.mtlovervip.one",
    "sourceGroup": "202",
    "sourceIcon": "",
    "sourceName": "uu互联网",
    "sourceUrl": "https://楠孠禕攕.mtlovergtt.buzz/"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100924,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; 22041211AC Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Mobile Safari/537.36\"}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": ".list@li",
    "ruleContent": "<js>\nvar v = result.match(/source\\s*=\\s*[\"']([^\"']*?\\.(m3u8|mp4)\\b[^\"']*)[\"']/i);\nvar p = v ? v[1].replace(/\\\\/g,'') : '';\nvar t = '@get:{t}';\nvar d = java.getString('[property=\"video:tag\"]@content');\nvar sign1 = java.base64Decode('44CQ5aSc5piO56m644CR55qE5pKt5pS+5Zmo');\nvar sign2 = java.base64Decode('5LuF5L6b5Liq5Lq65a2m5Lmg5L2/55So77yM5Lil56aB5YiG5Lqr44CB5YCS5Y2W5Y+K5Lu75L2V6L+d5rOV6KGM5Li677yB');\nvar sign3 = java.base64Decode('5L2/55So6ICF6Ieq6KGM5om/5ouF6aOO6Zmp5LiO6LSj5Lu7');\n`<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>${t}</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,sans-serif;background:#f0f9ff;padding:10px}\n.v-box{max-width:800px;margin:0 auto;background:white;border-radius:12px;box-shadow:0 5px 15px rgba(0,0,0,0.1);overflow:hidden}\n.header{padding:12px;border-bottom:1px solid #eee;display:flex;flex-wrap:wrap;justify-content:space-between}\n.sign{background:#e9f7ff;padding:6px;border-radius:6px;margin-bottom:8px;font-size:14px;color:#1a73e8;width:100%}\n.title{font-size:18px;font-weight:600;margin-bottom:8px;width:100%}\n.tags{color:#5f6368;font-size:14px;flex:1;min-width:60%;word-break:break-all}\n.time{color:#5f6368;font-size:14px;text-align:right;flex-basis:35%}\n.v-wrap{position:relative;padding-top:56.25%;background:#000}\n.video{position:absolute;top:0;left:0;width:100%;height:100%}\n.footer{padding:8px;text-align:center;color:#5f6368;font-size:13px}\n.info-box{padding:15px;font-size:14px;line-height:1.6}\n.info-box p{margin:8px 0}\n.hint{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.7);color:#fff;padding:12px 20px;border-radius:20px;font-size:1.1rem;z-index:10;display:none}\n.controls{position:absolute;top:0;left:0;width:100%;height:4px;background:rgba(255,255,255,0.3);z-index:5;transition:opacity 0.3s}\n.progress{height:100%;background:#4a9eff;width:0}\n</style>\n</head>\n<body>\n<div class=\"v-box\">\n<div class=\"header\">\n<div class=\"sign\" style=\"text-align:center;padding:5px 0\">\n<div>${sign1}</div>\n<div style=\"text-align:left; padding-top:4px\">\n${sign2}<br>${sign3}</div>\n</div>\n<div class=\"title\">${t}</div>\n<div class=\"tags\">${d}</div>\n<div class=\"time\" id=\"timeDisplay\">00:00/00:00</div></div>\n<div class=\"v-wrap\">\n<div class=\"controls\"><div class=\"progress\" id=\"progressBar\"></div></div>\n<div class=\"hint\" id=\"hint\">快进中 &gt;&gt;</div>\n<video class=\"video\" id=\"v\" controls playsinline>\n<source src=\"${p}\" type=\"video/mp4\">您的浏览器不支持HTML5视频\n</video>\n</div>\n<div class=\"footer\">滑动调整进度 | 长按2倍速</div>\n</div>\n<script>\nvar v = document.getElementById('v');\nvar tDisplay = document.getElementById('timeDisplay');\nvar pBar = document.getElementById('progressBar');\nvar hint = document.getElementById('hint');\nvar startX = 0, startTime = 0;\nvar longPressTimer;\nvar sensitivity = 0.1;\nvar longPressTime = 500;\nvar hintDuration = 2000;\nfunction updateTime() {\nif (!v.duration) return;\nvar m1 = Math.floor(v.currentTime / 60);\nvar s1 = Math.floor(v.currentTime % 60);\nvar m2 = Math.floor(v.duration / 60);\nvar s2 = Math.floor(v.duration % 60);\ntDisplay.textContent = m1 + ':' + (s1 < 10 ? '0' : '') + s1 + '/' + m2 + ':' + (s2 < 10 ? '0' : '') + s2;\npBar.style.width = (v.currentTime / v.duration) * 100 + '%';}\nv.addEventListener('timeupdate', updateTime);\nv.addEventListener('loadedmetadata', updateTime);\nv.addEventListener('touchstart', function(e) {\nstartX = e.touches[0].clientX;\nstartTime = Date.now();\nif (longPressTimer) clearTimeout(longPressTimer);\nhint.style.display = 'none';\nlongPressTimer = setTimeout(function() {\nv.playbackRate = 2.0;\nhint.style.display = 'block';\nsetTimeout(function() { hint.style.display = 'none'; }, hintDuration);}, longPressTime);});\nv.addEventListener('touchmove', function(e) {\ne.preventDefault();\nclearTimeout(longPressTimer);\nvar diffX = e.touches[0].clientX - startX;\nvar change = diffX * sensitivity * v.duration / 100;\nv.currentTime = Math.max(0, Math.min(v.currentTime + change, v.duration));\nstartX = e.touches[0].clientX;updateTime();});\nv.addEventListener('touchend', function() {\nv.playbackRate = 1.0;\nclearTimeout(longPressTimer);});\n</script>\n</body>\n</html>`\n</js>",
    "ruleImage": "img@data-original",
    "ruleLink": "a.0@href",
    "ruleNextPage": "page",
    "rulePubDate": "{{@@.vodlist_img@html##(\\d+)-(\\d+)-(\\d+)##$0###}} | {{@@.vodlist_img@span.0@text}}",
    "ruleTitle": ".title@text@put:{\"t\":\"@@.title@text\"}",
    "singleUrl": false,
    "sortUrl": "搜索 🔍::/s/page/{{page}}/wd/{{source.getVariable()}}/\n最新::/label/hot/by/time/page/{{page}}/\n日榜::/label/hot/by/hits_day/page/{{page}}/\n周榜::/label/hot/by/hits_week/page/{{page}}/\n月榜::/label/hot/by/hits_month/page/{{page}}/\n国产 🎞::/t/1-{{page}}/\n自拍::/t/5-{{page}}/\n主播大秀::/t/6-{{page}}/\n主播诱惑::/t/36-{{page}}/\n探花::/t/7-{{page}}/\n偷拍::/t/8-{{page}}/\n乱伦::/t/8-{{page}}/\n吃瓜::/t/10-{{page}}/\n抖阴::/t/11-{{page}}/\nAV::/t/12-{{page}}/\n福利姬::/t/20-{{page}}/\n侵犯::/t/37-{{page}}/\n日韩 🎞::/t/2-{{page}}/\n日韩自拍::/t/13-{{page}}/\n日本无码::/t/14-{{page}}/\n字幕::/t/15-{{page}}/\n解说::/t/17-{{page}}/\n换脸::/t/18-{{page}}/\n欧美 🎞::/t/3-{{page}}/\n自拍::/t/21-{{page}}/\n字幕::/t/22-{{page}}/\n伦理 🎞::/t/4-{{page}}/\n三级::/t/29-{{page}}/\n日韩::/t/30-{{page}}/\n动漫 🎞::/t/16-{{page}}/\n剧集::/t/26-{{page}}/\n3D::/t/27-{{page}}/\n次元::/t/28-{{page}}/\n另类 🎞::/t/39-{{page}}/\n同性恋::/t/38-{{page}}/\n变性::/t/40-{{page}}/\n重口味::/t/23-{{page}}/",
    "sourceComment": "<声明>\n//2025.8.10 作者：夜明空\n//源社区：https://taoba.cf\n//仅供个人学习使用，严禁分享、倒卖及任何违法行为！使用者自行承担风险与责任\n</声明>\n\n//网址更新频繁，有需要请到发布页自行更新\n//发布页：\nhttps://18j.18hu.link/mdce\n18j.vip\n18zy.vip\n51zy.vip",
    "sourceGroup": "202",
    "sourceIcon": "https://18oc.life/18link/18j/images/favicon.ico",
    "sourceName": "18J-夜明空",
    "sourceUrl": "https://18oc.life/label/sort"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100722,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.list",
    "ruleDescription": "<br><h3>{{$.vod_name}}</h3>\n<h6>[{{$.vod_score}}分] [{{$.vod_class ##\\,##] [}}]<b>发布于 {{$.vod_time}}</b></h6>\n\n<video src=\"{{$.vod_play_url ##^.*?\\$}}\" poster=\"{{$.vod_pic}}\" controls></video>",
    "ruleImage": "$.vod_pic",
    "ruleLink": "/api.php/provide/vod/?ac=detail&ids={{$.vod_id}}",
    "ruleNextPage": "page",
    "rulePubDate": "⏱️ {{$.vod_duration}}　{{$.vod_score}}分　{{$.vod_time}}",
    "ruleTitle": "$.vod_name",
    "singleUrl": false,
    "sortUrl": "精品推荐::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=20\n🔎 视频搜索::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&wd={{source.getVariable()}}\n国产视频::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=22\n主播直播::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=23\n日本无码::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=24\n日本有码::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=25\n中文字幕::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=26\n巨乳美乳::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=27\n制服丝袜::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=34\n角色扮演::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=35\n熟女人妻::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=28\n强奸乱伦::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=29\n欧美精品::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=30\n少女萝莉::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=31\n三级伦理::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=32\n成人动漫::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=33\n自拍偷拍::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=34\n制服丝袜::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=35\n口交颜射::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=36\n日本精品::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=37\nCosplay::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=38\n素人自拍::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=39\n台湾辣妹::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=40\n韩国御姐::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=41\n唯美港姐::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=42\n东南亚AV::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=43\n欺辱凌辱::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=44\n剧情介绍::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=45\n多人多P::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=46\n91探花::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=47\n网红流出::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=48\n野外露出::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=49\n古装扮演::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=50\n女优系列::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=51\n可爱学生::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=52\n风情旗袍::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=53\n兽耳系列::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=54\n瑜伽裤::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=55\n闷骚护士::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=56\n过膝袜::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=57\n网爆门::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=58\n传媒出品::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=59\n女同性恋::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=60\n男同性恋::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=61\n练腿狂魔::https://slapibf.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=63",
    "sourceComment": "★源URL的填写链接为【list】格式\n\t网站网址\n\t网站网址/api.php/provide/vod/?ac=【list】\n\n例：\nhttps://apittzy.com\nhttps://apittzy.com/api.php/provide/vod/?ac=list\n\nps：\n\t使用【list】格式查看分类和分类id以组成分类URL\n\n\n\n★分类URL的填写链接为【detail】格式\n\t视频搜索::网站网址/api.php/provide/vod/?ac=【detail】&pg={{page}}&wd=关键词\n\t分类名称::网站网址/api.php/provide/vod/?ac=【detail】&pg={{page}}&t=分类id\n\n例：\n\t视频搜索::https://apittzy.com/api.php/provide/vod/?ac=detail&pg={{page}}&wd=按摩\n\t精品推荐::https://apittzy.com/api.php/provide/vod/?ac=detail&pg={{page}}&t=1\n\nps：\n\t分类URL写成【list】格式也行，但是没有详细信息。需要通过正文链接跳转正文页再填写正文规则。而且没有封面！\n\n\n\n★正文规则\n\t因为分类URL使用了【detail】格式，需要的信息都显示了。(视频链接)\n\t所以我们在描述规则填写正文规则就行了，这样子就省的再跳转一次正文链接了。\n\t但是链接规则还是要写的，不然不会加载列表。\n\n\n\n☆【vod】和【art】\n视频分类链接为【vod】格式\n\t网站网址/api.php/provide/vod/?ac=list\n图文分类链接为【art】格式\n\t网站网址/api.php/provide/art/?ac=list\n通过【list】格式查看分类和分类id以组成分类URL\n\nps：\n\t图片和小说链接都是【art】格式，这样子不好分割，建议把小说分类相关链接移除\n\t因为【art】格式的【detail】链接并不会显示全部套图，所以需要填写正确的链接规则跳转正文页再填写正文规则而不是直接在描述规则处填写规则\n\n\n\n☆详情页链接规则\n\t详情页链接仅支持【detail】格式\n网站网址/api.php/provide/(vod/art)/?ac=detail&ids=(视频id/图文id)\n\n\t如果分类URL只填写了网址，那么链接规则补充剩下的链接就行了\n例：\n\t/api.php/provide/vod/?ac=detail&ids=视频id\n❗仅限【vod】/【art】单格式使用\n\n\t如果订阅同时写了【vod】和【art】两种格式，链接就需要使用js判定\n@js:\nif(baseUrl.match(/art/)){\n\t网站网址/api.php/provide/art/?ac=detail&ids={{$.art_id}}\n}else{\n\t网站网址/api.php/provide/vod/?ac=detail&ids={{$.vod_id}}\n}\nps：\n\t使用两种格式时，此js在正文规则也会需要用到。\n\n\n\n\n\n‼️以下网址加上【list】链接可更改为json格式，查看分类及分类id\n\n\t因为json链接格式固定？\n\t所以修改一下网站之间的分类URL差别即可使用此订阅格式套用，，，大概\n\nps：\n\t注意【list】和【detail】格式以及【vod】和【art】链接的差别\n\n\n共30个网址：\n\n\t★鲨鱼::https://shayuapi.com\n\t\tps：老朋友了\n\n\n\t老鸭资源失效::http://laoyazy50.cc\n\t\tps：网站有时效性？\n\n\n\t老鸭资源2失效::https://api.apilyzy.com\n\n\n\n\t水蜜桃失效::http://51smt4.xyz\n\n\n\t99资源失效::http://99zy.pw\n\n\n\t99资源吧失效::http://99zyba.com\n\n\n\t丝袜资源失效::http://siwazyw.net\n\n\n\t浪潮资源失效::http://langchaozy6.com\n\n\n\tCK资源失效::http://www.feifei67.com\n\n\n\t大雕资源失效::http://www.dd-01.com\n\n\n\t银龙资源失效::https://yinlong.tv\n\n\n\t苍天资源失效::http://cj.cangtiancj.com\n\n\n\t骚色资源失效::http://api.saosezy.icu\n\n\n\t芒果资源失效::https://mgzyz1.com\n\n\n\t酷豆资源失效::https://kudouzy.com\n\n\n\t酷伦理资源失效::https://api.kudian70.com\n\n\n\t速播资源失效::https://api.suboapi.com\n\n\n\t国产精品::https://zy.difi.life\n\n\n\t痴汉队长失效::https://javcaptain.com\n\n\n\t秀色资源失效::https://api.xiuseapi.com\n\n\n\t苹果资源失效::https://www.pg111222.com\n\n\n\t茄子资源失效::http://www.qiezizy8.com\n\n\n\t辣椒资源失效::https://www.lajiaozy18.com\n\n\n\t花椒资源失效::https://apihjzy.com/api.php/provide/vod/?ac=list\n\t\tps：网站无法打开，json链接可以\n\n\n\t桃色资源失效::https://api.taoseapi.com/api.php/provide/vod/?ac=list\n\t\tps：网站无法打开，json链接可以\n\n\n\t乐播资源::https://lbapi9.com/api.php/provide/vod/?ac=list\n\t\tps：网站无法打开，json链接可以\n\n\n\t佳丽资源失效::https://jializyzapi.com/api.php/provide/vod/?ac=list\n\t\tps：网站无法打开，json链接可以\n\n\n\t番号资源::http://fhapi9.com/api.php/provide/vod/?ac=list\n\t\tps：网站无法打开，json链接可以\n\n\n\tx8优酷失效::https://gov.gooder.bar\n\t\tps：没有vod格式？\n\n\n\t土狗采集失效::http://vip-04.tgzy.cc\n\t\tpa：vod格式好像是音乐？\n\n\n\n☆使用【vod】和【art】两种链接的正文规则参考\n<br><h3>{{$.list..vod_name||$.list..art_name}}</h3>\n<h6>[{{$.list..type_name}}]<b>发布于 {{$.list..vod_time||$.list..art_time}}</b></h6>\n\n<video src=\"{{$.list..vod_play_url ##^.*?\\$}}\" poster=\"{{$.list..vod_pic}}\" controls>视频加载失败</video>\n\n<div id=\"TúPiàn\">\n{{$.list..art_content ##</?(br|p)>}}\n</div>\n<link rel=\"stylesheet\" href=\"https://cdn.bootcdn.net/ajax/libs/viewerjs/1.10.2/viewer.min.css\">\n<script src=\"https://cdn.bootcdn.net/ajax/libs/viewerjs/1.10.2/viewer.min.js\"></script>\n<script>\n  new Viewer(\n    document.getElementById(\"TúPiàn\")    ,{\n//设置图片地址来源\n    url: 'src',\n//是否显示图片标题(true/false)\n    title: false,\n//设置播放间隔(单位毫秒，1秒=1000毫秒)\n    interval: 3000\n    }\n  );\n</script>\n\n@js:\nif(baseUrl.match(/art/)){\n\tresult.replace(/<vid[\\s\\S]+deo>/,'')\n}else{\n\tresult.replace(/<div[\\s\\S]+ipt>/,'')\n}",
    "sourceGroup": "202",
    "sourceIcon": "https://i.postimg.cc/sXtXHZDM/IMG_20220716_190738.png",
    "sourceName": "森林资源",
    "sourceUrl": "https://slapibf.com/api.php/provide/vod/?ac=list",
    "style": "h3{text-align:center}\nh6{margin-bottom:0}\nb{float:right}\n\nvideo{width:100%;max-height:285px;border-radius:5px}"
  },
  {
    "articleStyle": 0,
    "contentBlacklist": "https://pc.stgowan.com/,\nhttps://dmku.mhtjx.top/,\nhttps://dmku.m3u8.pw/,\nhttps://dm.bbj.icu/,\nhttps://www.superplayer.top/index.php/index/dm",
    "coverDecodeJs": "function toByteArray(input) {\n  var out = new Packages.java.io.ByteArrayOutputStream();\n  var buffer = java.strToBytes('\\0'.repeat(4096));\n  var bytesRead;\n  while ((bytesRead = input.read(buffer)) != -1) {\n    out.write(buffer, 0, bytesRead);\n  }\n  return out.toByteArray();\n}\n\n(function() {\n  // 1. 读取原始字节内容\n  var textBytes = toByteArray(result);\n  // 2. 如果是GIF文件，直接返回原始字节\n  if (src.endsWith('.gif')) {\n    return textBytes;\n  }\n  try {\n    // 3. 将字节转换为字符串（用于解析数据URI）\n    var dataUri = java.bytesToStr(textBytes, \"UTF-8\");\n    // 4. 判断是完整的数据URI还是纯Base64数据\n    var base64Prefix = \"base64,\";\n    var base64Index = dataUri.indexOf(base64Prefix);\n    if (base64Index === -1) {\n      // 如果没有找到base64前缀，检查是否需要截取第一个/及之后的内容\n      var firstSlashIndex = dataUri.indexOf('/');\n      if (firstSlashIndex !== -1) {\n        // 如果找到第一个/，截取/及之后的内容\n        dataUri = dataUri.substring(firstSlashIndex);\n      }\n      // 对整个内容进行Base64解码\n      return java.base64DecodeToByteArray(dataUri);\n    } else {\n      // 如果是标准data URI，提取base64编码部分解码\n      var base64Data = dataUri.substring(base64Index + base64Prefix.length);\n      return java.base64DecodeToByteArray(base64Data);\n    }\n  } catch (e) {\n    // 解码失败时返回原始字节\n    return textBytes;\n  }\n})();",
    "customOrder": -10100160,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Linux; U; Android 10; zh-cn; MI CC 11)  AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.127 Mobile Safari/537.36 XiaoMi/MiuiBrowser/18.1.8 swan-mibrowser\",\n\t\"referer\": \"{{baseUrl}}\"\n}",
    "injectJs": "function setupCustomPlayer(video) {\n  // 手势滑动快进\n  let isDragging = false;\n  let startX = 0;\n  let startTime = 0;\n  \n  // 长按加速相关变量\n  let longPressTimer = null;\n  const LONG_PRESS_DELAY = 300;\n  const NORMAL_SPEED = 1.25;\n  const FAST_SPEED = 3;\n  let wasPaused = false;\n\n  // 触摸事件处理\n  function handleTouchStart(e) {\n    startX = e.touches[0].clientX;\n    startTime = video.currentTime;\n    wasPaused = video.paused;\n    \n    longPressTimer = setTimeout(() => {\n      video.playbackRate = FAST_SPEED;\n      if (wasPaused) video.play();\n    }, LONG_PRESS_DELAY);\n  }\n\n  function handleTouchMove(e) {\n    if (longPressTimer) {\n      clearTimeout(longPressTimer);\n      longPressTimer = null;\n    }\n    \n    const dx = e.touches[0].clientX - startX;\n    if (Math.abs(dx) > 10) {\n      if (!isDragging) {\n        video.pause();\n        isDragging = true;\n      }\n      const change = (dx / video.clientWidth) * video.duration;\n      video.currentTime = Math.max(0, Math.min(startTime + change, video.duration));\n    }\n  }\n\n  function handleTouchEnd() {\n    if (longPressTimer) {\n      clearTimeout(longPressTimer);\n      longPressTimer = null;\n    }\n    \n    if (isDragging) {\n      video.playbackRate = NORMAL_SPEED;\n      video.play();\n      isDragging = false;\n    } else if (video.playbackRate === FAST_SPEED) {\n      video.playbackRate = NORMAL_SPEED;\n      if (wasPaused) video.pause();\n    }\n  }\n\n  // 添加触摸事件监听\n  video.addEventListener('touchstart', handleTouchStart);\n  video.addEventListener('touchmove', handleTouchMove);\n  video.addEventListener('touchend', handleTouchEnd);\n  \n  // 初始播放速度\n  video.playbackRate = NORMAL_SPEED;\n\n  // 创建按钮的通用函数\n  function createButton(text, onClick, position, width = '20px') {\n    const button = document.createElement('button');\n    button.textContent = text;\n    button.style.position = 'absolute';\n    button.style[position.horizontal] = '0';\n    button.style.top = '50%';\n    button.style.transform = 'translateY(-50%)';\n    button.style.zIndex = '999';\n    button.style.padding = '1px';\n    button.style.background = 'rgba(51, 51, 51, 0)';\n    button.style.color = '#fff';\n    button.style.border = 'none';\n    button.style.cursor = 'pointer';\n    button.style.width = width;\n    button.style.height = '30px';\n    button.addEventListener('click', onClick);\n    video.parentNode.appendChild(button);\n    return button;\n  }\n\n  // 旋转按钮（右侧）\n  createButton('⟳', () => {\n    const currentRotation = parseInt(video.getAttribute('data-rotation') || '0');\n    const newRotation = (currentRotation + 90) % 360;\n    video.setAttribute('data-rotation', newRotation);\n    \n    // 保留当前的缩放比例\n    const currentTransform = video.style.transform || '';\n    let currentScale = 1;\n    const scaleMatch = currentTransform.match(/scale\\(([^)]+)\\)/);\n    if (scaleMatch) currentScale = parseFloat(scaleMatch[1]);\n    \n    video.style.transform = `rotate(${newRotation}deg) scale(${currentScale})`;\n  }, { horizontal: 'right' });\n\n  // 缩放按钮（左侧）\n  let zoomCount = 0;\n  createButton('+', () => {\n    const currentRotation = parseInt(video.getAttribute('data-rotation') || '0');\n    \n    // 获取当前缩放比例\n    const currentTransform = video.style.transform || '';\n    let currentScale = 1;\n    const scaleMatch = currentTransform.match(/scale\\(([^)]+)\\)/);\n    if (scaleMatch) currentScale = parseFloat(scaleMatch[1]);\n    \n    if (zoomCount < 4) {\n      const newScale = currentScale * 1.25;\n      video.style.transform = `rotate(${currentRotation}deg) scale(${newScale})`;\n      zoomCount++;\n    } else {\n      video.style.transform = `rotate(${currentRotation}deg) scale(1)`;\n      zoomCount = 0;\n    }\n  }, { horizontal: 'left' });\n\n  // 快速跳转按钮（底部中央）\n  const buttonContainer = document.createElement('div');\n  buttonContainer.style.position = 'absolute';\n  buttonContainer.style.bottom = '0';\n  buttonContainer.style.left = '50%';\n  buttonContainer.style.transform = 'translateX(-50%)';\n  buttonContainer.style.display = 'flex';\n  buttonContainer.style.gap = '10px';\n  buttonContainer.style.zIndex = '999';\n  \n  // 按钮配置\n  const seekButtons = [\n    { text: '-5分', time: -300 },\n    { text: '-1分', time: -60 },\n    { text: '+1分', time: 60 },\n    { text: '+5分', time: 300 }\n  ];\n\n  seekButtons.forEach(({ text, time }) => {\n    const button = document.createElement('button');\n    button.textContent = text;\n    button.style.padding = '1px';\n    button.style.background = 'rgba(51, 51, 51, 0)';\n    button.style.color = '#fff';\n    button.style.border = 'none';\n    button.style.cursor = 'pointer';\n    button.style.width = '60px';\n    button.style.height = '30px';\n    button.addEventListener('click', () => {\n      video.currentTime = Math.max(0, Math.min(video.currentTime + time, video.duration));\n    });\n    buttonContainer.appendChild(button);\n  });\n\n  video.parentNode.appendChild(buttonContainer);\n}\n\n// 修改初始化逻辑，增加重试机制\nfunction initPlayerWithRetry() {\n  const maxRetries = 10;\n  const retryInterval = 500;\n  let retries = 0;\n  const tryInit = () => {\n    const video = document.getElementById('video');\n    if (video) {\n      setupCustomPlayer(video);\n    } else if (retries < maxRetries) {\n      retries++;\n      setTimeout(tryInit, retryInterval);\n    }\n  };\n  tryInit();\n}\n// 使用重试机制初始化播放器\ninitPlayerWithRetry();",
    "lastUpdateTime": 1775584959581,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.rescont.data",
    "ruleContent": "<html><head><meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no\" />\n<meta name=\"referrer\" content=\"never\"/>\n  <style>html, body {text-align: center;margin: 0; padding: 0;width: 100%;overflow: hidden;} </style>\n  <script src=\"https://unpkg.com/hls.js@1.4.3/dist/hls.min.js\"></script>\n</head><body>\n  <div class=\"container\">\n    <div class=\"title\">{{$.rescont.title}}</div>\n    <video id=\"video\" width=\"100%\" height=\"91%\" poster=\"\" controls autoplay muted loop></video>\n  </div>\n<script>\nconst v=document.getElementById('video'),s=[\n  \"{{$.rescont.videopath}}\",\n  \"\"];\nlet c=0;\nfunction setupCustomControls(e){/* 自定义功能实现 */}\nfunction playNext(){\n  c>=s.length&&(c=0); // 循环重置计数器\n  const u=s[c++];\n  // 检测Hls对象是否存在\n  if (typeof Hls !== 'undefined' && Hls.isSupported()) {\n    const h = new Hls({\n      enableSoftwareAES: true,          // 强制软件解密\n      forceKeyFrameOnDiscontinuity: true // 关键帧恢复\n    });\n    h.loadSource(u);\n    h.attachMedia(v);\n    h.on(Hls.Events.MANIFEST_PARSED,()=>v.play().then(()=>setupCustomControls(v)).catch(console.log));\n    h.on(Hls.Events.ERROR,(_,d)=>d.fatal&&playNext())\n  } else { // Hls加载失败或浏览器原生支持HLS\n    if (v.canPlayType('application/vnd.apple.mpegurl')) {\n      v.src = u;\n      v.onloadedmetadata = () => v.play().then(() => setupCustomControls(v));\n      v.onerror = playNext;\n    } else {\n      // 如果都不支持，尝试直接播放（可能支持MP4等格式）\n      v.src = u;\n      v.onerror = playNext;\n      v.play().then(() => setupCustomControls(v)).catch(playNext);\n    }\n  }\n}playNext();\n</script>\n</body></html>",
    "ruleImage": "{{$.coverbase64.url}}",
    "ruleLink": "/api/videoplay/{{$.id}}?uuid=1",
    "ruleNextPage": "$.rescont.next_page_url",
    "rulePubDate": "📆{{$.updated_at## .*}}  ⏱️{{$.playtimes}}",
    "ruleTitle": "$.title##.*屎.*|.*Ts.*|.*TS.*|.*ts.*|.*伪娘.*|.*人妖.*|.*男同.*|.*mbrba.*|.*水果派.*|.*解说.*|.*mmraa.*|.*ss-.*|.*fway.*|.*rebd.*|.*mbdd.*|.*双性.*|.*妈妈.*|.*儿子.*|.*爸爸.*|.*女儿.*|.*母子.*|.*父女.*|.*熟女.*|.*眼射.*|.*直男.*|.*CD.*|.*肥女.*|.*黄金.*|.*骚0.*|.*gv.*|.*父子.*|.*飞机.*|.*撸.*|.*厕.*|.*老阿姨.*|.*乱伦.*|.*[电影].*",
    "singleUrl": false,
    "sortUrl": "\n随机::/api/videosort/0?page={{ Math.ceil(Math.random()*1600) }}\n最新::/api/videosort/0?page={{page}}\n🔎搜索::/api/videosort/0?serach={{v=source.getVariable();if(/^\\s*$/.test(v)||v==null)source.setVariable('强奸');source.getVariable()}}&page={{page}}\n国产自拍::/api/videosort/28?page={{page}}\nH动漫::/api/videosort/32?page={{page}}\n3D动画::/api/videosort/65?page={{page}}\n国产AV::/api/videosort/68?page={{page}}\n高清无码::/api/videosort/30?page={{page}}\n凌辱侵犯::/api/videosort/60?page={{page}}\n性虐调教::/api/videosort/64?page={{page}}\n长腿丝袜::/api/videosort/43?page={{page}}\n制服诱惑::/api/videosort/33?page={{page}}\nAV素人::/api/videosort/39?page={{page}}\nAV剧情::/api/videosort/49?page={{page}}\n绿帽人妻::/api/videosort/58?page={{page}}\n痴女淫娃::/api/videosort/61?page={{page}}\n美乳巨乳::/api/videosort/38?page={{page}}\n草莓推荐::/api/videosort/52?page={{page}}\ntaipei1001::/api/videosort/69?page={{page}}\n259LUXU::/api/videosort/50?page={{page}}\n明星淫梦::/api/videosort/56?page={{page}}\n电车痴汉::/api/videosort/59?page={{page}}\n絕色佳人::/api/videosort/44?page={{page}}\n网红嫩模::/api/videosort/37?page={{page}}\n口交自慰::/api/videosort/63?page={{page}}\n精油汗汁::/api/videosort/62?page={{page}}\n角色扮演::/api/videosort/27?page={{page}}\n魔镜系列::/api/videosort/54?page={{page}}\n重咸口味::/api/videosort/48?page={{page}}\n三级电影:/api/videosort/46?page={{page}}\n家庭乱伦::/api/videosort/57?page={{page}}\nAV欧美::/api/videosort/36?page={{page}}\n恐怖情色::/api/videosort/51?page={{page}}\n酒店偷拍::/api/videosort/67?page={{page}}",
    "sourceGroup": "18",
    "sourceIcon": "https://i1.wp.com/i.postimg.cc/wjL5myHr/kpptube-cc-3e997cb42a6b0f37af6c6a40866ba202.gif",
    "sourceName": "🌈草莓    S",
    "sourceUrl": "https://api.cmapiaba.xyz/",
    "style": ".container {\n    position: relative; /* 相对定位，用于包含视频 */\n    height: 100%; /* 容器高度与视频原始高度相同 */\n    overflow: hidden; /* 隐藏超出容器的部分 */\n}\n.title {\n    position: absolute; /* 绝对定位，相对于容器 */\n    top: 0; \n    width: 100%;\n    overflow: hidden; \n    text-overflow: ellipsis;\n    display: -webkit-box;\n    -webkit-box-orient: vertical; \n    -webkit-line-clamp: 2;\n    z-index: 1; /* 确保标题在视频之上 */\n    background: #000; /* 纯黑色背景 */ \n    padding: 0 0 3px 0;\n}\nvideo {\n    position: absolute; /* 绝对定位，相对于容器 */ \n    top: -65px; /* 上移80px */\n    left: 0; \n    width: 100%; \n    height: calc(96% + 65px);  /* 调整高度以适应内容 */\n    object-fit: contain; /* 确保视频内容不被裁剪 */\n    z-index: 0; /* 确保视频在标题之下 */\n    controls=\"controls\" autoplay muted; \n} \n"
  },
  {
    "articleStyle": 0,
    "contentBlacklist": "https://pc.stgowan.com/,\nhttps://dmku.mhtjx.top/,\nhttps://dmku.m3u8.pw/,\nhttps://dm.bbj.icu/,\nhttps://www.superplayer.top/index.php/index/dm",
    "coverDecodeJs": "function toByteArray(input) {\n  var out = new Packages.java.io.ByteArrayOutputStream();\n  var buffer = java.strToBytes('\\0'.repeat(4096));\n  var bytesRead;\n  while ((bytesRead = input.read(buffer)) != -1) {\n    out.write(buffer, 0, bytesRead);\n  }\n  return out.toByteArray();\n}\n\n(function() {\n  // 1. 读取原始字节内容\n  var textBytes = toByteArray(result);\n  // 2. 如果是GIF文件，直接返回原始字节\n  if (src.endsWith('.gif')) {\n    return textBytes;\n  }\n  try {\n    // 3. 将字节转换为字符串（用于解析数据URI）\n    var dataUri = java.bytesToStr(textBytes, \"UTF-8\");\n    // 4. 判断是完整的数据URI还是纯Base64数据\n    var base64Prefix = \"base64,\";\n    var base64Index = dataUri.indexOf(base64Prefix);\n    if (base64Index === -1) {\n      // 如果没有找到base64前缀，检查是否需要截取第一个/及之后的内容\n      var firstSlashIndex = dataUri.indexOf('/');\n      if (firstSlashIndex !== -1) {\n        // 如果找到第一个/，截取/及之后的内容\n        dataUri = dataUri.substring(firstSlashIndex);\n      }\n      // 对整个内容进行Base64解码\n      return java.base64DecodeToByteArray(dataUri);\n    } else {\n      // 如果是标准data URI，提取base64编码部分解码\n      var base64Data = dataUri.substring(base64Index + base64Prefix.length);\n      return java.base64DecodeToByteArray(base64Data);\n    }\n  } catch (e) {\n    // 解码失败时返回原始字节\n    return textBytes;\n  }\n})();",
    "customOrder": -10100158,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Linux; U; Android 10; zh-cn; MI CC 11)  AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.127 Mobile Safari/537.36 XiaoMi/MiuiBrowser/18.1.8 swan-mibrowser\",\n\t\"referer\": \"{{baseUrl}}\"\n}",
    "injectJs": "function setupCustomPlayer(video) {\n  // 手势滑动快进\n  let isDragging = false;\n  let startX = 0;\n  let startTime = 0;\n  \n  // 长按加速相关变量\n  let longPressTimer = null;\n  const LONG_PRESS_DELAY = 300;\n  const NORMAL_SPEED = 1.25;\n  const FAST_SPEED = 3;\n  let wasPaused = false;\n\n  // 触摸事件处理\n  function handleTouchStart(e) {\n    startX = e.touches[0].clientX;\n    startTime = video.currentTime;\n    wasPaused = video.paused;\n    \n    longPressTimer = setTimeout(() => {\n      video.playbackRate = FAST_SPEED;\n      if (wasPaused) video.play();\n    }, LONG_PRESS_DELAY);\n  }\n\n  function handleTouchMove(e) {\n    if (longPressTimer) {\n      clearTimeout(longPressTimer);\n      longPressTimer = null;\n    }\n    \n    const dx = e.touches[0].clientX - startX;\n    if (Math.abs(dx) > 10) {\n      if (!isDragging) {\n        video.pause();\n        isDragging = true;\n      }\n      const change = (dx / video.clientWidth) * video.duration;\n      video.currentTime = Math.max(0, Math.min(startTime + change, video.duration));\n    }\n  }\n\n  function handleTouchEnd() {\n    if (longPressTimer) {\n      clearTimeout(longPressTimer);\n      longPressTimer = null;\n    }\n    \n    if (isDragging) {\n      video.playbackRate = NORMAL_SPEED;\n      video.play();\n      isDragging = false;\n    } else if (video.playbackRate === FAST_SPEED) {\n      video.playbackRate = NORMAL_SPEED;\n      if (wasPaused) video.pause();\n    }\n  }\n\n  // 添加触摸事件监听\n  video.addEventListener('touchstart', handleTouchStart);\n  video.addEventListener('touchmove', handleTouchMove);\n  video.addEventListener('touchend', handleTouchEnd);\n  \n  // 初始播放速度\n  video.playbackRate = NORMAL_SPEED;\n\n  // 创建按钮的通用函数\n  function createButton(text, onClick, position, width = '20px') {\n    const button = document.createElement('button');\n    button.textContent = text;\n    button.style.position = 'absolute';\n    button.style[position.horizontal] = '0';\n    button.style.top = '50%';\n    button.style.transform = 'translateY(-50%)';\n    button.style.zIndex = '999';\n    button.style.padding = '1px';\n    button.style.background = 'rgba(51, 51, 51, 0)';\n    button.style.color = '#fff';\n    button.style.border = 'none';\n    button.style.cursor = 'pointer';\n    button.style.width = width;\n    button.style.height = '30px';\n    button.addEventListener('click', onClick);\n    video.parentNode.appendChild(button);\n    return button;\n  }\n\n  // 旋转按钮（右侧）\n  createButton('⟳', () => {\n    const currentRotation = parseInt(video.getAttribute('data-rotation') || '0');\n    const newRotation = (currentRotation + 90) % 360;\n    video.setAttribute('data-rotation', newRotation);\n    \n    // 保留当前的缩放比例\n    const currentTransform = video.style.transform || '';\n    let currentScale = 1;\n    const scaleMatch = currentTransform.match(/scale\\(([^)]+)\\)/);\n    if (scaleMatch) currentScale = parseFloat(scaleMatch[1]);\n    \n    video.style.transform = `rotate(${newRotation}deg) scale(${currentScale})`;\n  }, { horizontal: 'right' });\n\n  // 缩放按钮（左侧）\n  let zoomCount = 0;\n  createButton('+', () => {\n    const currentRotation = parseInt(video.getAttribute('data-rotation') || '0');\n    \n    // 获取当前缩放比例\n    const currentTransform = video.style.transform || '';\n    let currentScale = 1;\n    const scaleMatch = currentTransform.match(/scale\\(([^)]+)\\)/);\n    if (scaleMatch) currentScale = parseFloat(scaleMatch[1]);\n    \n    if (zoomCount < 4) {\n      const newScale = currentScale * 1.25;\n      video.style.transform = `rotate(${currentRotation}deg) scale(${newScale})`;\n      zoomCount++;\n    } else {\n      video.style.transform = `rotate(${currentRotation}deg) scale(1)`;\n      zoomCount = 0;\n    }\n  }, { horizontal: 'left' });\n\n  // 快速跳转按钮（底部中央）\n  const buttonContainer = document.createElement('div');\n  buttonContainer.style.position = 'absolute';\n  buttonContainer.style.bottom = '0';\n  buttonContainer.style.left = '50%';\n  buttonContainer.style.transform = 'translateX(-50%)';\n  buttonContainer.style.display = 'flex';\n  buttonContainer.style.gap = '10px';\n  buttonContainer.style.zIndex = '999';\n  \n  // 按钮配置\n  const seekButtons = [\n    { text: '-5分', time: -300 },\n    { text: '-1分', time: -60 },\n    { text: '+1分', time: 60 },\n    { text: '+5分', time: 300 }\n  ];\n\n  seekButtons.forEach(({ text, time }) => {\n    const button = document.createElement('button');\n    button.textContent = text;\n    button.style.padding = '1px';\n    button.style.background = 'rgba(51, 51, 51, 0)';\n    button.style.color = '#fff';\n    button.style.border = 'none';\n    button.style.cursor = 'pointer';\n    button.style.width = '60px';\n    button.style.height = '30px';\n    button.addEventListener('click', () => {\n      video.currentTime = Math.max(0, Math.min(video.currentTime + time, video.duration));\n    });\n    buttonContainer.appendChild(button);\n  });\n\n  video.parentNode.appendChild(buttonContainer);\n}\n\n// 修改初始化逻辑，增加重试机制\nfunction initPlayerWithRetry() {\n  const maxRetries = 10;\n  const retryInterval = 500;\n  let retries = 0;\n  const tryInit = () => {\n    const video = document.getElementById('video');\n    if (video) {\n      setupCustomPlayer(video);\n    } else if (retries < maxRetries) {\n      retries++;\n      setTimeout(tryInit, retryInterval);\n    }\n  };\n  tryInit();\n}\n// 使用重试机制初始化播放器\ninitPlayerWithRetry();",
    "lastUpdateTime": 1775588357478,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.rescont.data[*]",
    "ruleContent": "<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no\" />\n  <meta name=\"referrer\" content=\"never\"/>\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n    html, body {\n      width: 100%;\n      height: 100vh;\n      background: #000;\n      overflow: hidden;\n    }\n    .container {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      background: #000;\n    }\n    .title {\n      color: white;\n      background: rgba(0,0,0,0.8);\n      padding: 10px;\n      font-size: 16px;\n      text-align: center;\n      font-weight: bold;\n      border-bottom: 1px solid #333;\n      flex-shrink: 0;\n    }\n    .url-bar {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      background: #1e1e1e;  /* 完全不透明背景 */\n      padding: 8px 12px;\n      gap: 10px;\n      border-bottom: 1px solid #444;\n      flex-shrink: 0;\n      position: relative;\n      z-index: 20;  /* 确保在视频之上 */\n    }\n    .url-text {\n      flex: 1;\n      color: #0f0;\n      font-family: monospace;\n      font-size: 12px;\n      word-break: break-all;\n      max-height: 60px;\n      overflow-y: auto;\n      background: #2d2d2d;\n      padding: 6px 8px;\n      border-radius: 4px;\n    }\n    .copy-btn {\n      background: #007bff;\n      border: none;\n      color: white;\n      padding: 6px 12px;\n      border-radius: 4px;\n      cursor: pointer;\n      font-size: 12px;\n      flex-shrink: 0;\n      position: relative;\n      z-index: 21;\n      pointer-events: auto; /* 确保可点击 */\n    }\n    .copy-btn:active {\n      background: #0056b3;\n    }\n    .video-wrapper {\n      flex: 1;\n      position: relative;\n      background: #000;\n      min-height: 0;\n    }\n    video {\n      width: 100%;\n      height: 100%;\n      object-fit: contain;\n    }\n  </style>\n  <script src=\"https://unpkg.com/hls.js@1.4.3/dist/hls.min.js\"></script>\n</head>\n<body>\n<div class=\"container\">\n  <div class=\"title\">{{$.rescont.title}}</div>\n  <div class=\"url-bar\">\n    <div class=\"url-text\" id=\"urlText\">加载中...</div>\n    <button class=\"copy-btn\" id=\"copyBtn\">复制</button>\n  </div>\n  <div class=\"video-wrapper\">\n    <video id=\"video\" controls autoplay muted loop></video>\n  </div>\n</div>\n\n<script>\nconst v = document.getElementById('video');\nconst urlTextDiv = document.getElementById('urlText');\nconst copyBtn = document.getElementById('copyBtn');\nlet currentUrl = '';\n\nconst s = [\n  \"{{$.rescont.videopath}}\",\n  \"\"\n];\nlet c = 0;\n\nfunction updateUrlDisplay(url) {\n  currentUrl = url || '';\n  urlTextDiv.innerText = currentUrl || '无地址';\n}\n\nfunction copyUrl() {\n  if (!currentUrl) {\n    alert('没有可复制的地址');\n    return;\n  }\n  navigator.clipboard.writeText(currentUrl).then(() => {\n    const originalText = copyBtn.innerText;\n    copyBtn.innerText = '已复制';\n    setTimeout(() => {\n      copyBtn.innerText = originalText;\n    }, 1500);\n  }).catch(err => {\n    alert('复制失败: ' + err);\n  });\n}\ncopyBtn.addEventListener('click', copyUrl);\n\nfunction setupCustomControls(e) {\n  // 自定义功能（原逻辑保留）\n}\n\nfunction playNext() {\n  if (c >= s.length) c = 0;\n  const u = s[c++];\n  updateUrlDisplay(u);\n\n  if (typeof Hls !== 'undefined' && Hls.isSupported()) {\n    const h = new Hls({\n      enableSoftwareAES: true,\n      forceKeyFrameOnDiscontinuity: true\n    });\n    h.loadSource(u);\n    h.attachMedia(v);\n    h.on(Hls.Events.MANIFEST_PARSED, () => {\n      v.play().then(() => setupCustomControls(v)).catch(console.log);\n    });\n    h.on(Hls.Events.ERROR, (_, d) => {\n      if (d.fatal) playNext();\n    });\n  } else {\n    if (v.canPlayType('application/vnd.apple.mpegurl')) {\n      v.src = u;\n      v.onloadedmetadata = () => v.play().then(() => setupCustomControls(v));\n      v.onerror = playNext;\n    } else {\n      v.src = u;\n      v.onerror = playNext;\n      v.play().then(() => setupCustomControls(v)).catch(playNext);\n    }\n  }\n}\n\nplayNext();\n</script>\n</body>\n</html>",
    "ruleImage": "{{$.coverbase64.url}}",
    "ruleLink": "/api/videoplay/{{$.id}}?uuid=1",
    "ruleNextPage": "$.rescont.next_page_url",
    "rulePubDate": "📆{{$.updated_at## .*}}  ⏱️{{$.playtimes}}",
    "ruleTitle": "$.title##.*屎.*|.*Ts.*|.*TS.*|.*ts.*|.*伪娘.*|.*人妖.*|.*男同.*|.*mbrba.*|.*水果派.*|.*解说.*|.*mmraa.*|.*ss-.*|.*fway.*|.*rebd.*|.*mbdd.*|.*双性.*|.*妈妈.*|.*儿子.*|.*爸爸.*|.*女儿.*|.*母子.*|.*父女.*|.*熟女.*|.*眼射.*|.*直男.*|.*CD.*|.*肥女.*|.*黄金.*|.*骚0.*|.*gv.*|.*父子.*|.*飞机.*|.*撸.*|.*厕.*|.*老阿姨.*|.*乱伦.*",
    "singleUrl": false,
    "sortUrl": "\n随机::/api/videosort/0?page={{ Math.ceil(Math.random()*1500) }}\n最新::/api/videosort/0?page={{page}}\n🔎搜索::/api/videosort/0?serach={{v=source.getVariable();if(/^\\s*$/.test(v)||v==null)source.setVariable('强奸');source.getVariable()}}&page={{page}}\n国产自拍::/api/videosort/10?page={{page}}\nH动漫::/api/videosort/14?page={{page}}\n扶她姐妹::/api/videosort/58?page={{page}}\n国产AV::/api/videosort/60?page={{page}}\n网红主播::/api/videosort/17?page={{page}}\n嫩模专区::/api/videosort/37?page={{page}}\n偷拍盗摄::/api/videosort/53?page={{page}}\n萌妹酱篇::/api/videosort/54?page={{page}}\n精彩短片::/api/videosort/55?page={{page}}\n外流视频::/api/videosort/32?page={{page}}\n明星淫梦::/api/videosort/40?page={{page}}\n鹿少女集::/api/videosort/56?page={{page}}\n高清无码::/api/videosort/1?page={{page}}\n制服诱惑::/api/videosort/5?page={{page}}\n长腿丝袜::/api/videosort/11?page={{page}}\nAV剧情::/api/videosort/29?page={{page}}\nAV素人::/api/videosort/24?page={{page}}\n淫荡痴女::/api/videosort/51?page={{page}}\n巨乳咪咪::/api/videosort/20?page={{page}}\n人妻熟女::/api/videosort/6?page={{page}}\n近亲乱伦::/api/videosort/49?page={{page}}\n淫乱师生::/api/videosort/46?page={{page}}\n角色扮演::/api/videosort/4?page={{page}}\n青春萝莉::/api/videosort/22?page={{page}}\n魔镜系列::/api/videosort/39?page={{page}}\n中文无码::/api/videosort/57?page={{page}}\n当红女优::/api/videosort/9?page={{page}}\n中文字幕::/api/videosort/19?page={{page}}\n259LUXU::/api/videosort/36?page={{page}}\n重咸口味::/api/videosort/23?page={{page}}\n丝瓜推荐::/api/videosort/30?page={{page}}\n三级电影::/api/videosort/25?page={{page}}\n电车之狼::/api/videosort/52?page={{page}}\n中外合拍::/api/videosort/59?page={{page}}\n苍老师::/api/videosort/44?page={{page}}\n女同性爱::/api/videosort/38?page={{page}}\n欧美AV::/api/videosort/16?page={{page}}\n恐怖情色::/api/videosort/35?page={{page}}",
    "sourceGroup": "18",
    "sourceIcon": "https://kp-i25985.com/Uploads/vod/2023-06-21/1141.mp4.gif",
    "sourceName": "🌈丝瓜    S",
    "sourceUrl": "https://api.sgapiaba.xyz",
    "style": ".container {\n    position: relative; /* 相对定位，用于包含视频 */\n    height: 100%; /* 容器高度与视频原始高度相同 */\n    overflow: hidden; /* 隐藏超出容器的部分 */\n}\n.title {\n    position: absolute; /* 绝对定位，相对于容器 */\n    top: 0; \n    width: 100%;\n    overflow: hidden; \n    text-overflow: ellipsis;\n    display: -webkit-box;\n    -webkit-box-orient: vertical; \n    -webkit-line-clamp: 2;\n    z-index: 1; /* 确保标题在视频之上 */\n    background: #000; /* 纯黑色背景 */ \n    padding: 0 0 3px 0;\n}\nvideo {\n    position: absolute; /* 绝对定位，相对于容器 */ \n    top: -65px; /* 上移80px */\n    left: 0; \n    width: 100%; \n    height: calc(96% + 65px);  /* 调整高度以适应内容 */\n    object-fit: contain; /* 确保视频内容不被裁剪 */\n    z-index: 0; /* 确保视频在标题之下 */\n    controls=\"controls\" autoplay muted; \n} \n"
  },
  {
    "articleStyle": 1,
    "customOrder": -10100155,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10;Xiaomi 10pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Mobile Safari/537.36\"}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$..data[*]",
    "ruleContent": "$..videopath##.*\\$\n\n@js:\nurl=result;\n\nloadding=java.get(\"pic\")\n\nhtml=\n`<link rel=\"stylesheet\" type=\"text/css\" href=\"https://muiplayer.js.org/css/mui-player.min.css\" />\n\n<script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/gh/ljun223/reader3@main/js/mui-player.min.js\"></script>\n\n<script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/gh/ljun223/reader3@main/js/mui-player-mobile-plugin.min.js\"></script>\n\n<div class=\"dz\">`+url+`</div>\n\n<div id=\"mui-player\" style=\"width:100%;height:300px\"></div>\n\n<script>\n   var mp = new MuiPlayer(\t{\n \t\t  \"container\": \"#mui-player\",\n \t\t  \"src\": \"`+url+`\",\n \t\t  \"poster\":\"`+loadding+`\",\n \t\t  \"autoFit\":false,\n \t\t  \"lang\": \"zh-cn\",\n \t  \t\"height\":\"300px\",\n \t\t  plugins: [\n \t\t    new MuiPlayerMobilePlugin({\n \t\t\t    \"key\":\n \t\t\t \"01I01I01H01J01L01K01J01I01K01J01H01D01J01G01E\",\n \t\t    \t\"showMenuButton\": true,\n \t\t\t    \"pageGesture\":true,\n \t\t\t   })\n    ]\n   }); \n </script>`",
    "ruleImage": "coverpath@put:{\"pic\":\"$.coverpath\"}",
    "ruleLink": "https://77gmk8o.com/api/videoplay/{{$.id}}?uuid=1",
    "ruleNextPage": "page",
    "rulePubDate": "authername",
    "ruleTitle": "title",
    "singleUrl": false,
    "sortUrl": "@js:\n\ndata=java.ajax(\"https://77gmk8o.com/api/videosort\");\n\njson=JSON.parse(data);\n\nvar list=[];\nvar num=json.rescont.length;\nfor(var i=1;i<num;i++){\nlist+=json.rescont[i].name+\"::\"+\"https://77gmk8o.com/api/videosort/\"+json.rescont[i].id+\"?orderby=&page={{page}}\"+\"\\n\"\n\t};\n\"搜索用::https://77gmk8o.com/api/videosort/0?page={{page}}&serach={{source.getVariable()}}\"+\"\\n\"+list",
    "sourceGroup": "202",
    "sourceIcon": "https://img0.baidu.com/it/u=2908908160,2785784129&fm=253&fmt=auto&app=138&f=PNG",
    "sourceName": "葫芦视频",
    "sourceUrl": "https://77gmk8o.com"
  },
  {
    "articleStyle": 2,
    "customOrder": -10098552,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\n\t\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\",\"referer\": \"{{baseUrl}}\"\n\t}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": ".picture-list a",
    "ruleContent": ".picture-item-box@all##src=\".*\" data-src##src\n<js>##href##</js>",
    "ruleImage": "img@data-src",
    "ruleLink": "href",
    "ruleNextPage": "text.下一页@href",
    "rulePubDate": "span@text",
    "ruleTitle": "text",
    "singleUrl": false,
    "sortUrl": "今日最新::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/2000/\n\t热姐::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/2001/\n罗莉塔::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/2002/\n性感的::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/2003/\n杂志::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/2004/\n角色扮演::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/5001/\n美足::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/5029/\n唯美::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/2002/\n模特儿::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/5031/\n日本::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/5032/\n东盟::https://mak803-ad398-dke3e.xofulitu765.xyz/arttype/5033/\n韩国::https://mak803-ad398-dke3e.xofulitu765.xyz/t/5034/\n搜索::https://mak803-ad398-dke3e.xofulitu765.xyz/s/wd/{{(source.getVariable()==''||source.getVariable()==null)?source.setVariable('萝莉'):\"\"}}{{source.getVariable()}}/",
    "sourceComment": "",
    "sourceGroup": "202",
    "sourceIcon": "https://img2.baidu.com/it/u=2497591018,1494490685&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500",
    "sourceName": "福利兔",
    "sourceUrl": "https://mak803-ad398-dke3e.xofulitu765.xyz/xoxo"
  },
  {
    "articleStyle": 0,
    "customOrder": -10098512,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; TEL-AN00 Build/HONORTEL-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Mobile Safari/537.36\"}",
    "injectJs": "const video = document.getElementById('video');\n        let isDragging = false;\n        let startX = 0;\n        let startTime = 0;\n\n        video.addEventListener('touchstart', (e) => {\n            isDragging = true;\n            startX = e.touches[0].clientX;\n            startTime = video.currentTime;\n            video.pause();  // 暂停视频\n        });\n\n        video.addEventListener('touchmove', (e) => {\n            if (!isDragging) return;\n            const dx = e.touches[0].clientX - startX;\n            const duration = video.duration;\n            const change = (dx / video.clientWidth) * duration;\n            video.currentTime = Math.min(Math.max(startTime + change, 0), duration);\n        });\n\n        video.addEventListener('touchend', () => {\n            if (isDragging) {\n                video.play();  // 继续播放视频\n                isDragging = false;\n            }\n        });",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.model.data",
    "ruleContent": "`<html>\n    <head>\n        <meta name=\"viewport\" content=\"width=device-width\">\n        <style>\n            body {\n                margin: 0;\n                font-family: Arial, sans-serif;\n                background: linear-gradient(135deg, #ece9e6, #ffffff);\n                display: flex;\n                flex-direction: column;\n                align-items: center;\n                justify-content: flex-start;\n                padding: 20px;\n            }\n            .container {\n                width: 100%;\n                max-width: 800px;\n                background: #fff;\n                border-radius: 10px;\n                box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n                overflow: hidden;\n                margin-bottom: 20px;\n            }\n            h3 {\n                margin: 0;\n                padding: 10px 20px;\n                font-size: 0.9em;\n                background: #333;\n                color: #fff;\n                border-radius: 10px 10px 0 0;\n            }\n            .video-container {\n                width: 100%;\n                background: #000;\n                position: relative;\n            }\n            video {\n                width: 100%;\n                height: auto;\n                display: block;\n            }\n            .info-container {\n                padding: 20px;\n            }\n            .info-container p {\n                margin: 10px 0;\n                color: #555;\n            }\n            .info-container p span {\n                font-weight: bold;\n                color: #000;\n            }\n        </style>\n    </head>\n    <body>\n        <div class=\"container\">\n            <h3>{{$.model.title}}</h3>\n            <div class=\"video-container\">\n                <video id=\"video\" src=\"{{$.model.url}}\" poster=\"{{$.model.coverUrl}}\" controls></video>\n            </div>\n        </div>\n        <div class=\"info-container\">\n            <p>⌚️ 时长：<span>{{$.model.durationFormat}}</span></p>\n            <p>📆 日期：<span>{{$.model.onlineTime##T|.000.*## }}</span></p>\n            <p>🎥 播放：<span>{{$.model.viewCount}}次</span></p>\n            <p>📩 收藏：<span>{{$.model.collectCount}}</span></p>\n            <p>🕵 片商：<span>{{$.model.authors}}</span></p>\n            <p>👤 上传：<span>{{$.model.uploader}}</span></p>\n            <p>🔖 标签：<span>{{$.model.categories}},{{$.model.tags}}</span></p>\n            <p>🏷 简介：<span>{{$.model.brief}}</span></p>\n        </div>\n        <script>\n            // 获取视频元素\n            const video = document.getElementById('video');\n            let touchStartX = 0;\n            let touchStartY = 0;\n            let touchStartTime = 0;\n            let isLongPress = false;\n\n            // 滑动快进\n            video.addEventListener('touchstart', (e) => {\n                touchStartX = e.touches[0].clientX;\n                touchStartY = e.touches[0].clientY;\n                touchStartTime = Date.now();\n                isLongPress = false;\n            });\n\n            video.addEventListener('touchmove', (e) => {\n                const deltaX = e.touches[0].clientX - touchStartX;\n                const deltaY = e.touches[0].clientY - touchStartY;\n\n                // 如果是水平滑动，且未进入长按状态\n                if (Math.abs(deltaX) > Math.abs(deltaY) && !isLongPress) {\n                    const duration = video.duration;\n                    const seekTime = video.currentTime + (deltaX / 50); // 每滑动100px快进1秒\n                    video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n                }\n                e.preventDefault(); // 防止默认行为（如页面滚动）\n            });\n\n            // 长按快进\n            video.addEventListener('touchend', (e) => {\n                const touchEndTime = Date.now();\n                const touchDuration = touchEndTime - touchStartTime;\n\n                // 如果长按时间超过500ms，进入长按快进状态\n                if (touchDuration > 500) {\n                    isLongPress = true;\n\n                    // 在长按状态下，根据滑动距离快进\n                    const deltaX = e.changedTouches[0].clientX - touchStartX;\n                    const duration = video.duration;\n                    const seekTime = video.currentTime + (deltaX / 100); // 每滑动100px快进1秒\n                    video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n                } else {\n                    isLongPress = false;\n                }\n            });\n        </script>\n    </body>\n    </html>`",
    "ruleImage": "$.coverUrl",
    "ruleLink": "https://www.uaa001.com/api/video/app/video/intro?force=false&id={{$.id}}&viewId=17225706561773551",
    "ruleNextPage": "page",
    "rulePubDate": "{{$.onlineTime##T.*}} {{$.tags}}",
    "ruleTitle": "$.title",
    "singleUrl": false,
    "sortUrl": "变量搜索::/api/video/app/video/search?keyword={{v=source.getVariable();if(/^\\s*$/.test(v)||v==null)source.setVariable('粉嫩');source.getVariable()}}&orderType=1&page={{page}}&searchType=1&size=40\n\n最新排行::/api/video/app/video/search?category=&orderType=1&page={{page}}&searchType=1&size=40\n\n观看排行::/api/video/app/video/search?category=&orderType=3&page={{page}}&searchType=1&size=40\n\n收藏排行::/api/video/app/video/search?category=&orderType=4&page={{page}}&searchType=1&size=40\n\n国产视频::/api/video/app/video/search?orderType=1&origin=1&page={{page}}&searchType=1&size=40\n\n日本AV::/api/video/app/video/search?orderType=1&origin=2&page={{page}}&searchType=1&size=40\n\nH动漫::/api/video/app/video/search?orderType=1&origin=3&page={{page}}&searchType=1&size=40\n\n自拍偷拍::/api/video/app/video/search?category=自拍偷拍&orderType=1&page={{page}}&searchType=1&size=40\n\n主播福利::/api/video/app/video/search?category=主播福利&orderType=1&page={{page}}&searchType=1&size=40\n\n制服诱惑\n丝袜网袜::/api/video/app/video/search?tag=丝袜网袜&page={{page}}&searchType=1&size=40\n\n泳装水着::/api/video/app/video/search?tag=泳装水着&page={{page}}&searchType=1&size=40\n\nJK制服::/api/video/app/video/search?tag=JK制服&page={{page}}&searchType=1&size=40\n\n女仆::/api/video/app/video/search?tag=女仆&page={{page}}&searchType=1&size=40\n\n吊带袜::/api/video/app/video/search?tag=吊带袜&page={{page}}&searchType=1&size=40\n\n兔女郎::/api/video/app/video/search?tag=兔女郎&page={{page}}&searchType=1&size=40\n\n身材样貌\n少女萝莉::/api/video/app/video/search?tag=少女萝莉&page={{page}}&searchType=1&size=40\n\n白虎::/api/video/app/video/search?tag=白虎&page={{page}}&searchType=1&size=40\n\n苗条::/api/video/app/video/search?tag=苗条&page={{page}}&searchType=1&size=40\n\n美腿美脚::/api/video/app/video/search?tag=美腿美脚&page={{page}}&searchType=1&size=40\n\n美臀::/api/video/app/video/search?tag=美臀&page={{page}}&searchType=1&size=40\n\n熟女::/api/video/app/video/search?tag=熟女&page={{page}}&searchType=1&size=40\n\n巨乳::/api/video/app/video/search?tag=巨乳&page={{page}}&searchType=1&size=40\n\n交合喜好\n颜射::/api/video/app/video/search?tag=颜射&page={{page}}&searchType=1&size=40\n\n肛交::/api/video/app/video/search?tag=肛交&page={{page}}&searchType=1&size=40\n\n潮吹::/api/video/app/video/search?tag=潮吹&page={{page}}&searchType=1&size=40\n\n口交::/api/video/app/video/search?tag=口交&page={{page}}&searchType=1&size=40\n\n69::/api/video/app/video/search?tag=69&page={{page}}&searchType=1&size=40\n\n乳交::/api/video/app/video/search?tag=乳交&page={{page}}&searchType=1&size=40\n\n内射中出::/api/video/app/video/search?tag=内射中出&page={{page}}&searchType=1&size=40\n\n刺激玩法\n捆绑调教::/api/video/app/video/search?tag=捆绑调教&page={{page}}&searchType=1&size=40\n\n痴女痴汉::/api/video/app/video/search?tag=痴女痴汉&page={{page}}&searchType=1&size=40\n\n强奸轮奸::/api/video/app/video/search?tag=强奸轮奸&page={{page}}&searchType=1&size=40\n\n3P群交::/api/video/app/video/search?tag=3P群交&page={{page}}&searchType=1&size=40\n\n奇异催眠::/api/video/app/video/search?tag=奇异催眠&page={{page}}&searchType=1&size=40\n\n出轨::/api/video/app/video/search?tag=出轨&page={{page}}&searchType=1&size=40\n\nNTR::/api/video/app/video/search?tag=NTR&page={{page}}&searchType=1&size=40\n\n角色扮演\n医生护士::/api/video/app/video/search?tag=医生护士&page={{page}}&searchType=1&size=40\n\n空中女郎::/api/video/app/video/search?tag=空中女郎&page={{page}}&searchType=1&size=40\n\n未亡人::/api/video/app/video/search?tag=未亡人&page={{page}}&searchType=1&size=40\n\n老师校园::/api/video/app/video/search?tag=老师校园&page={{page}}&searchType=1&size=40\n\n人妻主妇::/api/video/app/video/search?tag=人妻主妇&page={{page}}&searchType=1&size=40\n\nOL::/api/video/app/video/search?tag=OL&page={{page}}&searchType=1&size=40\n\n姐姐妹妹::/api/video/app/video/search?tag=姐姐妹妹&page={{page}}&searchType=1&size=40\n\n母亲女儿::/api/video/app/video/search?tag=母亲女儿&page={{page}}&searchType=1&size=40\n\nTS人妖::/api/video/app/video/search?tag=TS人妖&page={{page}}&searchType=1&size=40\n\n女高中生::/api/video/app/video/search?tag=女高中生&page={{page}}&searchType=1&size=40",
    "sourceGroup": "202",
    "sourceIcon": "https://ged520-github-io.pages.dev/header_2025_02_10_18_24.png",
    "sourceName": "UAA·视频",
    "sourceUrl": "https://www.uaa001.com/##",
    "style": "body {\n            margin: 0;\n            font-family: Arial, sans-serif;\n            background: linear-gradient(135deg, #ece9e6, #ffffff);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: flex-start;\n            padding: 20px;\n        }\n        .container {\n            width: 100%;\n            max-width: 800px;\n            background: #fff;\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n            overflow: hidden;\n            margin-bottom: 20px;\n        }\n        h3 {\n            margin: 0;\n            padding: 10px 20px;\n            font-size: 0.9em;\n            background: #333;\n            color: #fff;\n            border-radius: 10px 10px 0 0;\n        }\n        .video-container {\n            width: 100%;\n            background: #000;\n            position: relative;\n        }\n        video {\n            width: 100%;\n            height: auto;\n            display: block;\n        }\n        .info-container {\n            padding: 20px;\n        }\n        .info-container p {\n            margin: 10px 0;\n            color: #555;\n        }\n        .info-container p span {\n            font-weight: bold;\n            color: #000;\n        }"
  },
  {
    "articleStyle": 0,
    "contentBlacklist": "https://lupic.cdn.bcebos.com/,\nhttps://cpro.baidu.com/,\nhttps://eclick.baidu.com/,\nhttps://sofire.baidu.com/,\nhttps://analytics.woozooo.com/,\nhttps://statics.woozooo.com/,\nhttps://hm.baidu.com/,\nhttps://wwads.cn/code/,\nhttps://cdn.wwads.cn/,\nhttps://pagead2.googlesyndication.com,\nhttps://www.qlspx.com,\nhttps://sdk.51.la,\nhttps://abk.lingsiqiwu.com,\n\nhttps://googleads4.g.doubleclick.net,\nhttps://static.googleadsserving.cn,\nhttps://s0.2mdn.net,\nhttps://tpc.googlesyndication.com,\nhttps://www.googletagservices.com,\nhttps://cm.g.doubleclick.net,,\nhttps://star.jsyunmy.com,\nhttps://p.qlogo.cn,\nhttps://partner.googleadservices.com,",
    "customOrder": -10098449,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\",\n\t\"upgrade-insecure-requests\": \"1\",\r\n\"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\",\r\n\"accept-language\": \"zh-CN,en-US;q=0.9\",\r\n\"cookie\": \"down_ip=1\",\r\n\"x-requested-with\": \"cn.nr19.mbrowser\"\n}\n}",
    "injectJs": "// 是蓝奏云链接时\nif(/lanzou/.test(window.location.href)){\nArray.from(document.querySelectorAll(`\n\t.mt2:last-of-type,.appreport,.n_login,\n\tdiv[style*=\"color: #8a6d3b;\"]\n`),$=>$.style.display='none');\n}\n\n\n//选择需要删除的标签，以,分隔\nitems = document.querySelectorAll(`\n.stealth-scroll,\n\n#evaluate-box,\n.project-operation,\n.recommend-footer,\n\n.project-desc2,\n.side-widget,\n\n.header_nav,\n.under,\n\n.abox-item\n`)\n\n//把选择的html值改成空\nArray.from(items,(item)=>{\n\titem.innerHTML = ``\n\titem.style.display = `#m-splitter`\n})",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "<js>\ntry {\n    $ = JSON.parse(src).text;\n    if ($ == \"no file\") $ = [];\n} \n\n//♥catch。。。\ncatch (err) {\n\n    //💚💚0 网站整合\n     if (baseUrl.match(/www\\.baidu\\.com\\?wd=/)) {\n\neval(String(source.sourceComment));\n\n        $ = [];\n        baseUrl.replace(/^.*?wd=\\s*/,'').replace(/\\,/g,',{\"headers\":{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.0.0; MI 5s Plus Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 CatYuedu Mobile Safari/537.36\"}}').\n        split(/\\s*♞♞\\s*/).map($$ => $.push({\n            name_all: $$.match(/.*?《(.*?)》/)[1],\n            time: $$.match(/◎.*?◎/) ? $$.match(/.*?◎(.*?)◎/)[1].replace(/□/,'▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁').replace(/■/,'▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃').replace(/♡/,'作者的发布链接｜随缘更新').replace(/🦁/,'｜编程狮｜w3cschool.cn｜') : \"\",\n            uri1: $$.match(/【.*?】/) ? $$.match(/.*?【(.*?)】/)[1] : \"\",\n            url: gitsy.match(/\\/gh$/) ? \n $$.match(/^([^【《◎]*),?/)[1].replace(/💙💚/,yck).replace(/🧡💛/,gitsy).replace(/💛💚/,gitdate) : \n $$.match(/^([^【《◎]*),?/)[1].replace(/💙💚/,yck).replace(/🧡💛/,gitsy).replace(/💛💚/,gitdate).replace(/\\@/,'/')\n        }));\n    }\n    //💚💚0 网站整合结束\n\n\n    //💚💚1 【阅读.A】构建下载链接。与官方测试版中的共存版apk不能共存。\n    else if(baseUrl.match(/10bit/)){\neval(String(source.sourceComment));\nsrc=gitsy.match(/\\/gh$/) ? \nbaseUrl.match(/(🧡💛.*)/)[1].replace(/🧡💛/,gitsy) : \nbaseUrl.match(/(🧡💛.*)/)[1].replace(/🧡💛/,gitsy).replace(/\\@/,'/');\nsrc=String(java.ajax(src));\n$=json=[]\n\t\tname_all = src.match(/\\[(legado.*?)\\]\\((.*?)\\)\\s*上次(构建时间.*)/)[1]+\" ✱去18list限制 ✱与共存版同包名\"\n\t\tid =down + src.match(/\\[(legado.*?)\\]\\(.*(\\/10bits.*?)\\)\\s*上次(构建时间.*)/)[2]\n\t\ttime = src.match(/\\[(legado.*?)\\]\\((.*?)\\)\\s*上次(构建时间.*)/)[3]\n\t\turi = baseUrl.match(/【(.*?)】/)[1],\n\n$.push({name_all:name_all,id:id,time:time,uri:uri})\n\nJSON.stringify(json)\n\t}\n    //💚💚1 阅读.A去限制结束\n\n\n    //💚💚2 蓝奏云\n    else {\n\n        //🧡🧡🧡蓝奏云非分组链接\n        if (String(java.getString('text.举报文件@href')).length) {\n            $ = [{\n                name_all: String(java.getString('class.md@textNodes')),\n                icon: String(java.getString('class.md@textNodes')).replace(/.*\\./, ''),\n                size: String(java.getString('class.mtt@text')).replace(/\\( /, '').replace(/ \\)/, ''),\n                time: String(java.getString('class.mf@textNodes')).replace(/.*\\n/, ''),\n                uri: baseUrl.replace(/^(.+com).*\\/(.+)$/, '$2'),\n                url: baseUrl.replace(/^(.+com).*\\/(.+)$/, '$1/tp/$2')\n            }]\n        }\n        //🧡🧡🧡蓝奏云非分组结束\n\n\n        //🧡🧡🧡取消分享\n        else if (String(java.getString('.off@text')).match(/取消分享/)) {\n            $ = [{\n                name_all: java.getString('.off@text'),\n                time: baseUrl.replace(/[#\\?].*/g, ''),\n                url: baseUrl.replace(/[#\\?].*/g, '')\n            }]\n        }\n        //🧡🧡🧡取消结束\n\n\n        //🧡🧡🧡蓝奏云分组链接\n        else {\n            json = [];\n            name = java.getString('.user-radio@text||title@text')\n            java.getElements('#folder .mlink').forEach(a => {java.setContent(a);\n      json.push({\n      \t    name_all: java.getString('.filename@textNodes'),\n          url: java.getString('a@href'),\n          time: '🗂️ folder　📑 ' + (String(java.getString('.filesize@text')) || name) })\n    })\njava.setContent(src);\n\n\n            mat = baseUrl.match(/^(.*?\\.com)[^##]*\\/(.+)$/)\n            url = mat[1]\n            uri = mat[2]\n\n            function $(reg) {\n                return uri.match(reg) ? true : false}\n\n\n            //get【pwd】(链接提取码)\n            pwd =\n$(/##[^【]/) ? uri.match(/##(.*?)(【|$)/)[1] :\"\";\n\n\nhead = {method: \"POST\", params: {uri: uri,\nimg: $(/【[^】]/)?uri.match(/【([^】]+)/)[1] :\"\"}}\n\n\n            //get 【body】\n            eval(src.match(/var pgs;([\\s\\S]*?pgs.+;)/)[1]);\n            eval('$=' + src.match(/data :([\\s\\S]*?\\})/)[1]);\n            head.body = Object.keys($).map(key => key + \"=\" + $[key]).join('&');\n\n\n            //补全【url】\nurl += \"/filemoreajax.php,\" + JSON.stringify(head);\n\n            //ajax\n            $ = JSON.parse(java.ajax(url));\n            $ = json.concat($.text != 0 ? $.text :\n             //密码错误提示\n             [{name_all: $.info,\n               time: uri.replace(/[#\\?].*/, '') + $.info,\n               url: baseUrl.replace(/[#\\?].*/, '') }]\n                                        )\n            baseUrl = url\n        }\n        //🧡🧡🧡蓝奏分组结束\n\n    }\n    //💚💚2 蓝奏结束\n\n}\n//♥catch(err)结束\n\njava.put('url', baseUrl);\nJSON.stringify($);\n</js>$.[*]",
    "ruleDescription": "❗️0、0、开始❗️\n❗️0、0、结束❗️\n\n{{}}@js:\nurl=String(java.getString('$.url')).trim();\n\n//【..导入】\nif(url.match(/^..导入|^♥/)){\nuri=url.replace(/导入.*/,'');\nurl=url.replace(/.*导入|♥/,'');\npath =\n(uri==\"一键\"||uri==\"自动\"||url==\"♥.*\")?\"auto\":\nuri==\"书源\"?\"bookSource\":\nuri==\"订阅\"?\"rssSource\":\nuri==\"净化\"?\"replaceRule\":\n\"\";\nurl=url.match(/^legado\\:\\/\\//)?url:`legado://import/${path}?src=`+url;\nurl = String(url).replace(/^(.*?src=)(.*)/,(mat, $1, $2)=>{\n  return $1+encodeURIComponent($2);\n});\n\nresult=`<title>{{$.name_all}}</title>\n<iframe src=\"${url}\" hidden></iframe>\n<br>\n<md3><b>{{$.name_all}}</b></md3>\n\n<br>\n<br><md4>\n　　❤️导入不成功？多导几次试试。<br>\n　　💔达咩～！一滴都没有啦～！！<br>\n<br></md4>\n\n<a href=\"${url}\" class=\"button\">◎ 一键导入 ◎</a>\n\n<br>\n<br>\n<center><md4>\n⬇︎资源链接，点击复制⬇︎</md4><br>\n<textarea id=\"copy\" onclick=\"copy()\">${decodeURIComponent(String(url).replace(/legado.*?src=/,''))}</textarea>\n{{$.time}}</center>\n<br>\n<md5>\nrssSource by.Thomas.　　 md轻改&收集整理<br>\n资源取自网络，仅作参考试用，请24小时内删除<br></md5>\n\n<script>\nfunction copy(){\n\tdocument.getElementById('copy').select()\n\tdocument.execCommand('copy')\n\talert(\"复制成功\")\n}\n</script>`}\n\n\n//【自定义html】\nelse if(url.match(/\\d+、\\d+、/)){\nreg=new RegExp('❗️'+url+'开始❗️\\\\s*([\\\\s\\\\S]+?)\\\\s*❗️'+url+'结束❗️');\n//默认禁止放大缩小\nresult=result.match(reg)?\n'<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\">'+result.match(reg)[1]:'<br>未找到对应html'\n}\n\nelse{result=''}",
    "ruleImage": "@js:\nn=`{{$.name_all}}` ;\nuri1=`{{$.uri1}}` ;\n\nsrc =\n\turi1 ? uri1 :\n\n//文件名判断使用对应图标✱\n//baseUrl.match(/【(.*?)[】$]/) ?baseUrl.match(/【(.*?)(】|$)/)[1] :\n\nbaseUrl.match(/423down/)? \"423down.png\" :\nbaseUrl.match(/lxapk/)? \"lxapk.png\" :\nbaseUrl.match(/yoyodadada/)? \"yoyo.png\" :\n\n\nn.match(/\\.zip/i)? \"zip.png\" :\nn.match(/md|迷迭/)? \"md.png\" :\nn.match(/legado|阅读Pro/i)? \"yuedu.jpg\" :\nn.match(/tts|语音|讯飞语记/i)? \"tts.png\" :\nn.match(/书源|book/)? \"sy.png\" :\nn.match(/rss|订阅/)? \"dy.png\" :\nn.match(/净化/)? \"jh.png\" :\nn.match(/漫画|comic/i)? \"mh.png\" :\nn.match(/lequ/)? \"sy.png\" :\n//文件名判断apk图标\nn.match(/\\.apk/)? \"apk.png\" :\n\n//蓝奏云盘设定的图片/为空时\nbaseUrl.match(/【[^】$]/)? baseUrl.match(/【(.*?)(】|$)/)[1]:`lan.png`;\n\n\n//md图片简写补全。\n\neval(String(source.sourceComment));\n\npic= \npic==`0` ? `/md-yd/pic@main/00rose/${src}`:\npic==`1` ? `/md-yd/pic@main/01pink/${src}` :\npic==`2` ? `/md-yd/pic@main/02blue/${src}` :\npic==`3` ? `/md-yd/pic@main/03green/${src}` :\npic==`4` ? `/md-yd/pic@main/04gear/${src}` :\npic==`5` ? `/md-yd/pic@main/05green/${src}` :\npic==`6` ? `/md-yd/pic@main/06red/${src}`:\npic==`7` ? `/md-yd/pic@main/07blackred/${src}` :\npic==`8` ? `/md-yd/pic@main/08black/${src}` :\npic==`9` ? `/md-yd/pic@main/09note/${src}` :\n\npic==`10`?`/md-yd/pic@main/03green2/${src}`:\npic==`11`?`/md-yd/pic@main/04gear2/${src}` :\n//pic==`12`?\n`/md-yd/pic@main/04gear3/${src}`;\n\n\npic=gitpic+pic;\n\npic= \nString (gitpic).match(/gitee/) ? \nString(pic).replace(/\\/md\\-yd\\/pic\\@main/,''):\nString (gitpic).match(/\\/gh$/) ? \n pic : \nString (pic).replace(/\\@/,'/');\n\nsrc=src.match(/^http/) ? src : pic ;\nsrc",
    "ruleLink": "$.id@js:\nurl=`{{$.url||$.sourceUrl}}`\n//下面这句if是为了【阅读.A去限制】\nif(result.match(/10hit/)){result}\nelse if(result){url+=`{{$.id}}`;\n}",
    "ruleNextPage": "@js:\ntry {\n    url = String(java.get('url'));\n    url = url.replace(/(pg=)(\\d+)/, (mat, $1, $2) => {\n        return $1 + (~~$2 + 1)\n    }).replace(url, '');\n} catch (err) {\n    url = \"\"\n}\nurl",
    "rulePubDate": "💾 {{$.icon}}　♥ {{$.size}}　⏱️ {{$.time}}\n##💾 　♥ 　⏱️\\s*",
    "ruleTitle": "$.name_all",
    "singleUrl": false,
    "sortUrl": "📚书源::http://www.baidu.com?wd=https://i.jandan.net/pic【b002.png】《🐣煎蛋无聊图  ‼️md订阅若出错 请修改源注释里的值‼️》◎■◎♞♞https://0427.118pan.com/o18659【yuedu.jpg】《📙阅读app｜打包&分享by遇见》◎点文件名右空白处 显示下载按钮 直接下载◎♞♞💙💚/yuedu/shuyuan/index.html【mu.jpg】《📚源仓库｜阅读书源》◎www.yckceo.vip◎♞♞💙💚/yiciyuan/tuyuan/index.html【mu.jpg】《🎨源仓库｜异次元漫画app下载 ＆ 图源 （与阅读app互不通用）》◎■◎♞♞♥https://www.gitlink.org.cn/api/yi-c/yd/raw/sy.json?ref=master【sy.png】《📚一程书源》◎♡◎♞♞♥https://www.gitlink.org.cn/api/yi-c/yd/raw/dy.json?ref=master【dy.png】《📚一程订阅》◎♡◎♞♞https://cdn05042023.gitlink.org.cn/yi-c/yd【rq.png】《＃ 查看日期》◎◎♞♞https://flowus.cn/share/923f5a35-6dcf-47d1-b8eb-b9c5ef3ed39b,【wy.png】《＃ 一程主页》◎□◎♞♞♥🧡💛/PB-pobing/pobing@pb/sy.json【sy.png】《📚破冰书源 Ⓖ》◎♡◎♞♞💛💚/PB-pobing/pobing/commits/pb/sy.json,【rq.png】《＃ 查看日期 Ⓖ》◎□◎♞♞♥🧡💛/zmn001125/booksources@master/sources/guaner.txt【sy.png】《📚关耳书源 Ⓖ》◎♡◎♞♞💛💚/zmn001125/booksources/commits/master/sources/guaner.txt,【rq.png】《＃ 查看日期 Ⓖ》◎□◎♞♞♥🧡💛/XIU2/Yuedu@master/shuyuan【sy.png】《📚XIU2书源 Ⓖ》◎♡◎♞♞💛💚/XIU2/Yuedu/commits/master/shuyuan,【rq.png】《＃ 查看日期 Ⓖ》◎□◎♞♞♥🧡💛/cyao2q/yuedu@master/shuyuan【sy.png】《📚cyao2q书源 Ⓖ》◎♡◎♞♞💛💚/cyao2q/yuedu/commits/master/shuyuan,【rq.png】《＃ 查看日期 Ⓖ》◎□◎♞♞♥https://www.gitlink.org.cn/api/haxc/book/raw/bookSource.json?ref=master【mh.png】《🎨Haxc阅读漫画源》◎♡◎♞♞https://cdn05042023.gitlink.org.cn/haxc/book【rq.png】《＃ 查看日期》◎■◎♞♞http://yuedu.miaogongzi.net/gx.html,【mgz.gif】《📚喵公子整理（一程  Haxc 破冰 不世玄奇 为作者发布链接）》◎◎♞♞https://cdn05042023.gitlink.org.cn/miaogongzi/legado/【mgz.gif】《＃ 查看日期（Namo 漫画1 漫画2 关耳 黄凡凡）》◎□◎♞♞https://legado.aoaostar.com/,【yj.png】《📚aoaostar采集｜标示的日期仅为采集刷新日期》◎□◎♞♞♥🧡💛/shidahuilang/shuyuan@shuyuan/good.json【】《📚大灰狼｜书源（采集自源仓库） Ⓖ》◎◎♞♞♥🧡💛/shidahuilang/shuyuan@shuyuan/book.json【】《📚大灰狼｜书源-未检验（采集自源仓库） Ⓖ》◎◎♞♞♥🧡💛/shidahuilang/shuyuan@shuyuan/jinghua.json【】《📚大灰狼｜净化 Ⓖ》◎大灰狼仓库github.com/shidahuilang/shuyuan/◎♞♞♥🧡💛/shidahuilang/shuyuan@shuyuan/tts.json【】《📚大灰狼｜TTS 语音引擎70 思必驰 Ⓖ》◎◎♞♞💛💚/shidahuilang/shuyuan/commits/shuyuan,【rq.png】《＃ 查看日期 Ⓖ》◎□◎♞♞https://p.20190524.xyz/,【sy.png】《📚大猫临时网盘》◎■◎♞♞https://v2.jt12.de/doc/,【md.png】《📚橘涂书源网盘（阅读app内置）设置教程》◎‼️与喵公子书源网盘2选1使用◎♞♞https://moew.yuedu.ink/,【md.png】《📚迷迭订阅》◎‼️更新后打开订阅，右上，刷新分类◎♞♞http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=a9JODTNzlrw31t0Q8AAlLOERgKBt9ms6&authKey=hDz11n4lB6Qv8R3U9acMcoYg62TwLTZc%2FbHlGIpswLsrbwtnMlOXiXb5mAQ9ZRTI&noverify=0&group_code=892966579【md.png】《QQ小说交流群892966579点我跳转加群》◎若有异常，请手动加群◎\n\n\n\n📙喵公子::https://miaogongzi.lanzout.com/b01rgkhhe\n\n📙MD.1::https://mmxmm.lanzoue.com/b0d6c09hi##iori\n\n📙Ⓖ阅读.A::🧡💛/10bits/gedoor-Build@master/README.md##【yuedu.jpg】\n\n📙不似苏::https://busisu.lanzoub.com/s/yuedupro##777\n\n//🅻乐享/黑鹰\n📙搜书大师::https://lxapk.lanzoub.com/b05sf0ngd##cpj0\n\n🅨TTS 讯飞语记::https://yoyodadada.lanzouw.com/b01co9qad##et0k\n\n土狗/M浏览器::https://www.lanzoux.com/s/tgllq##【tugou.png】\n\n🅻ES文件::https://lxapk.lanzouw.com/b05sf5etc##f5fb【es.png】\n\n④ES文件::https://423down.lanzouo.com/b0f1d7s2h\n\n④小黄鸟抓包::https://423down.lanzouv.com/b0f1b9v6j\n\n④小说软件::https://423down.lanzouv.com/b0f1cdr9i\n\n🅨笔趣阁::https://yoyodadada.lanzouw.com/b01fi8imd##4jkl\n\n\n\n📘教程1::http://www.baidu.com?wd=http://dh.sqst.xyz/,【dh.png】《ℹ️大哈导航 dh.sqst.xyz‼️优惠资讯、购物大都是推广佣金链，》◎◎♞♞https://dlidli.wang/,【dh.png】《ℹ️嘀哩导航 dlidli.wang‼️你买他赚钱。涉及资金请谨慎。》◎◎♞♞https://adzhp.net/,【dh.png】《ℹ️爱达导航 adzhp.net‼️尽量不要通过导航里的链接跳转网购。》◎■◎♞♞https://alanskycn.gitee.io/teachme/Rule/source.html,【jc.png】《〔官方〕书源规则：从入门到入土》◎□◎♞♞https://www.bilibili.com/video/BV1zk4y1T7PD/,【jc.png】《视频.关耳书源教程1▶️第一个书源。utf-8搜索地址有关键词》◎B站up主：萌芽中的男生。加音量加字幕。◎♞♞https://www.bilibili.com/video/BV1PN411Q7U6/,【jc.png】《视频.关耳书源教程2▶️第二个书源。GBK编码》◎B站up主：萌芽中的男生。加音量加字幕。◎♞♞https://www.bilibili.com/video/BV1N14y1m7iP/,【jc.png】《视频.关耳书源教程3▶️第三个书源。post搜索地址无关键词》◎B站up主：萌芽中的男生。加音量加字幕。◎♞♞https://www.bilibili.com/video/BV1ga4y1w7AB/,【jc.png】《视频.关耳书源教程4▶️发现规则、#&lrm;#替换、请求头》◎B站up主：萌芽中的男生。加音量加字幕◎♞♞https://www.bilibili.com/video/BV1cX4y1i7zz/,【jc.png】《视频.关耳书源教程5▶️常用js语法》◎B站up主：萌芽中的男生。加音量加字幕◎♞♞https://www.bilibili.com/video/BV12N411S7jd/,【jc.png】《视频.关耳书源教程6▶️漫画正文规则》◎B站up主：萌芽中的男生。加音量加字幕◎♞♞https://www.bilibili.com/video/BV1YV4y1a7cL/,【jc.png】《视频.关耳书源教程7▶️几个问题》◎□◎♞♞https://www.w3cschool.cn/regex_rmjc/regex_rmjc-n5a328cn.html,【jc.png】《📖正则表达式30分钟入门教程》◎🦁◎♞♞https://www.w3cschool.cn/regex/ogzw1nyz.html,【jc.png】《📖轻松学习正则表达式》◎🦁◎♞♞https://www.w3cschool.cn/regexp/2yjd1pq6.html,【jc.png】《📖正则表达式》◎□◎♞♞https://agit.ai/butterfly/JsoupXpath/src/branch/master/README.md,【jc.png】《　↳ XPath库的说明（官方教程里提及的github链接的镜像）》◎◎♞♞https://agit.ai/butterfly/horseshoe/src/branch/master/README.md,【jc.png】《　↳ 2018-10-Regex专题（官方教程提及的github链接的镜像）》◎■◎♞♞https://jandan.net/bbs#/topic/210,【b002.png】《ℹ️煎蛋国内图片加速》◎□◎♞♞https://www.xiaoji001.com/download.html【yx.png】《🐤小鸡模拟器xiaoji001.com （掌机、家用游戏机＆相关游戏）》◎◎♞♞http://www.ponyemu.com/index_m.html【yx.png】《🦄小马模拟器ponyemu.com （掌机、家用游戏机＆相关游戏）》◎■◎\n\n\n\n📘教程2::http://www.baidu.com?wd=https://m.runoob.com/,【jc.png】《RUNOOB [少林武功总纲] 秃子的成神之路  你秃了 但也变强了》◎www.runoob.com｜m.runoob.com◎♞♞https://c.runoob.com/,【gj.png】《菜鸟工具 c.runoob.com》◎□◎♞♞https://www.w3cschool.cn/tutorial,【jc.png】《W3Cschool [少林武功总纲] 秃子的成神之路  你秃了 但也变强了》◎🦁◎♞♞https://www.w3cschool.cn/webtools/,【gj.png】《在线工具 w3cschool.cn》◎■◎♞♞https://www.w3cschool.cn/html/html-intro.html,【jc.png】《HTML 教程》◎🦁◎♞♞https://www.w3cschool.cn/html5/html5-intro.html,【jc.png】《HTML5 教程》◎🦁◎♞♞https://www.w3cschool.cn/htmltags/html-reference.html,【jc.png】《HTML 参考手册》◎□◎♞♞https://www.w3cschool.cn/css/css-intro.html,【jc.png】《CSS 教程》◎🦁◎♞♞https://www.w3cschool.cn/css3/a2yscflg.html,【jc.png】《CSS3 教程》◎🦁◎♞♞https://www.w3cschool.cn/cssref/3ps212do.html,【jc.png】《CSS 参考手册》◎□◎♞♞https://www.w3cschool.cn/javascript/js-intro.html,【jc.png】《JavaScript 教程》◎🦁◎♞♞https://www.w3cschool.cn/nwfchn/c56iqozt.html,【jc.png】《JavaScript 标准参考教程》◎🦁◎♞♞https://www.w3cschool.cn/jsref/jsref-jsref-tutorialnmor1pl5.html,【jc.png】《JavaScript 和 HTML DOM 参考手册》◎□◎♞♞https://www.w3cschool.cn/jquery/jquery-intro.html,【jc.png】《jQuery 教程》◎🦁◎♞♞https://www.w3cschool.cn/ajax/nr583fns.html,【jc.png】《AJAX 教程》◎🦁◎♞♞https://www.w3cschool.cn/json/json-tutorial.html,【jc.png】《JSON 教程》◎🦁◎♞♞https://www.w3cschool.cn/xpath/xpath-xpath-tutorialij9m1t5i.html,【jc.png】《XPath 教程》◎□◎♞♞https://www.w3cschool.cn/python3/python3-tutorial.html,【jc.png】《Python3 教程》◎🦁◎♞♞https://www.w3cschool.cn/java/java-tutorial.html,【jc.png】《Java 教程》◎🦁◎♞♞https://www.w3cschool.cn/php/php-tutorial.html,【jc.png】《PHP 教程》◎🦁◎♞♞https://www.w3cschool.cn/aspnet/aspnet-tutorial.html,【jc.png】《ASP.NET 教程》◎🦁◎♞♞https://www.w3cschool.cn/cpp/cpp-intro.html,【jc.png】《C++ 教程》◎🦁◎♞♞https://www.w3cschool.cn/linux/linux-tutorial.html,【jc.png】《Linux 教程》◎🦁◎♞♞https://www.w3cschool.cn/git/git-tutorial.html,【jc.png】《Git 教程》◎🦁◎\n",
    "sourceComment": "yck=1\n/*▔▔▔▔▔▔▔▔\n⬆︎设置源仓库地址\n1  www.yckceo.com\n2  www.yckceo1.com\n3  www.yck2.com\n4  www.e-yck.top\nmd.24.5.1.\n▁▁▁▁▁▁▁▁*/\n\n\npic=4\n/*▔▔▔▔▔▔▔▔\n⬆︎设置图片样式\n0  红+\n1  粉++\n2  蓝++\n3  绿+  10\n4  绿齿轮  11  12\n5  绿字印章+\n6  红字印章+\n7  红字 黑白背景\n8  蓝字黑底（夜间）-\n9  卡其色 记事板-\n▁▁▁▁▁▁▁▁*/\n\n\ngitpic=17\ngitsy=0\n/*▔▔▔▔▔▔▔▔\n⬆︎gitpic（1-17）设置图片镜像链接。\n⬆︎gitsy（0-16）设置书源镜像链接（关耳、破冰、XIU2、cyao2q、大灰狼）。\n——— Ⓖ github ——\t—\n0  随机 ⬅︎ 仅gitsy可设。若随机到失效镜像，请刷新分类（再次随机）。\n1  raw.kkgithub.com\n2  github.moeyy.xyz\n3  mirror.ghproxy.com\n4  raw.cachefly.998111.xyz\n5  ghproxy.net\n6 521github.com\n7  slink.ltd\n8  gh.con.sh\n9  cors.isteed.cc\n10 hub.gitmirror.com\n11 sciproxy.com\n12 ghproxy.cc\n13 cf.ghproxy.cc\n14 gh.jiasu.in\n15 ghcy.eu.org\n16 raw.gitmirror.com\n17 gitee.com ⬅︎ 仅gitpic可设\n▁▁▁▁▁▁▁▁*/\n\n\ngitdate=4\ndown=0\n/*▔▔▔▔▔▔▔▔\n⬆︎gitdate（1-4）设置书源查看日期的链接（关耳、破冰、XIU2、cyao2q、大灰狼）\n⬆︎down（0-20）设置📚阅读.A 下载链接.\n——— Ⓖ github ——\t—\n0  随机 ⬅︎ 仅down可设。若随机到失效链接，请刷新分类（再次随机）。\n1  521github.com\n2  dgithub.xyz\n3  kkgithub.com\n4  cors.isteed.cc\n5  gh.con.sh\n6  cf.ghproxy.cc\n7  mirror.ghproxy.com\n8  github.moeyy.xyz\n9  ghproxy.cc\n10 gh.jiasu.in\n11 slink.ltd\t\t\n12 gh.ddlc.top\t\t\n13 gh.h233.eu.org\n14 dl.ghpig.top\n15 hub.gitmirror.com\n16 sciproxy.com\n17 download.nuaa.cf\n18 download.scholar.rr.nu\n19 download.yzuu.cf\n20 ghproxy.net\t\n▁▁▁▁▁▁▁▁*/\n\n\n/*▔▔▔▔▔▔▔▔\n订阅源图标可自己复制链接替换\n（拉到顶部第三项，“图标”）\n★★ github 图标★★\nhttps://521github.com/md-yd/pic/raw/main/00rose/a001b.png\nhttps://raw.gitmirror.com/md-yd/pic/main/00rose/001.png\n★★gitee图标★★\nhttps://gitee.com/visita/yd/raw/master/00rose/a001b.png\nhttps://gitee.com/visita/yd/raw/master/00rose/001.png\n▁▁▁▁▁▁▁▁*/\n\n\n/*▔▔▔▔▔▔▔▔\nrss by.Thomas。  md小改&收集整理。\n\n小说交流群892966579\nA群637775313不加人。若群炸了查看此群群资料找新家。\n\n内容取自网络，仅作学习参考，请24小时内删除。找到感兴趣内容请去支持正版。\n▁▁▁▁▁▁▁▁*/\n\n\nyck=\nyck==1 ? `https://www.yckceo.com` :\nyck==2 ? `https://www.yckceo1.com` :\nyck==3 ? `https://www.yck2.com` :\n//yck==4 ? \n`https://www.e-yck.top` ;\n\n\ngitpic=\ngitpic==1 ? \n`https://raw.kkgithub.com`:\ngitpic==2 ? \n`https://github.moeyy.xyz/https://raw.githubusercontent.com`:\ngitpic==3 ?\n`https://mirror.ghproxy.com/https://raw.githubusercontent.com`:\ngitpic==4 ? \n`https://raw.cachefly.998111.xyz`:\ngitpic==5 ?\n`https://ghproxy.net/https://raw.githubusercontent.com`:\ngitpic==6 ? \n`https://521github.com/extdomains/raw.githubusercontent.com` :\ngitpic==7 ? \n`https://slink.ltd/https://raw.githubusercontent.com` :\ngitpic==8 ? \n`https://gh.con.sh/https://raw.githubusercontent.com` :\ngitpic==9 ? \n`https://cors.isteed.cc/https://raw.githubusercontent.com` :\ngitpic==10 ? \n`https://hub.gitmirror.com/https://raw.githubusercontent.com` :\ngitpic==11 ?\n`https://sciproxy.com/https://raw.githubusercontent.com` :\ngitpic==12 ?\n`https://ghproxy.cc/https://raw.githubusercontent.com` :\ngitpic==13 ?\n`https://cf.ghproxy.cc/https://raw.githubusercontent.com` :\ngitpic==14 ?\n`https://gh.jiasu.in/https://raw.githubusercontent.com`:\ngitpic==15 ? \n`https://ghcy.eu.org/https://raw.githubusercontent.com`:\ngitpic==16 ? \n`https://raw.gitmirror.com`:\n//gitpic==17 ? \n`https://gitee.com/visita/yd/raw/master`;\n\n\ngitsy=\ngitsy==0? \nparseInt(Math.random()*16+1) : gitsy;\n\ngitsy=\ngitsy==1 ? \n`https://raw.kkgithub.com`:\ngitsy==2 ? \n`https://github.moeyy.xyz/https://raw.githubusercontent.com`:\ngitsy==3 ?\n`https://mirror.ghproxy.com/https://raw.githubusercontent.com`:\ngitsy==4 ? \n`https://raw.cachefly.998111.xyz`:\ngitsy==5 ?\n`https://ghproxy.net/https://raw.githubusercontent.com`:\ngitsy==6 ? \n`https://521github.com/extdomains/raw.githubusercontent.com` :\ngitsy==7 ? \n`https://slink.ltd/https://raw.githubusercontent.com` :\ngitsy==8 ? \n`https://gh.con.sh/https://raw.githubusercontent.com` :\ngitsy==9 ? \n`https://cors.isteed.cc/https://raw.githubusercontent.com` :\ngitsy==10 ? \n`https://hub.gitmirror.com/https://raw.githubusercontent.com` :\ngitsy==11 ?\n`https://sciproxy.com/https://raw.githubusercontent.com` :\ngitsy==12 ?\n`https://ghproxy.cc/https://raw.githubusercontent.com` :\ngitsy==13 ?\n`https://cf.ghproxy.cc/https://raw.githubusercontent.com` :\ngitsy==14 ?\n`https://gh.jiasu.in/https://raw.githubusercontent.com`:\ngitsy==15 ? \n`https://ghcy.eu.org/https://raw.githubusercontent.com`:\n//gitsy==16 ? \n`https://raw.gitmirror.com`;\n\n\ngitdate=\ngitdate==1 ? \n`https://521github.com`:\ngitdate==2 ? \n`https://dgithub.xyz`:\ngitdate==3 ? \n`https://kkgithub.com`:\n//gitdate==4 ? \n`https://cors.isteed.cc/github.com`;\n\n\ndown=\ndown==0? \nparseInt(Math.random()*20+1) : down;\n\ndown=\ndown==1 ? \n`https://521github.com`:\ndown==2 ? \n`https://dgithub.xyz`:\ndown==3 ? \n`https://kkgithub.com`:\ndown==4 ? \n`https://cors.isteed.cc/github.com`:\ndown==5 ? \n`https://gh.con.sh/https://github.com`:\ndown==6 ? \n`https://cf.ghproxy.cc/https://github.com`:\ndown==7 ? \n`https://mirror.ghproxy.com/https://github.com`:\ndown==8 ? \n`https://github.moeyy.xyz/https://github.com`:\ndown==9 ?\n`https://ghproxy.cc/https://github.com`:\ndown==10 ?\n`https://gh.jiasu.in/https://github.com`:\ndown==11 ? \n`https://slink.ltd/https://github.com`:\ndown==12 ? \n`https://gh.ddlc.top/https://github.com`:\ndown==13 ? \n`https://gh.h233.eu.org/https://github.com`:\ndown==14 ? \n`https://dl.ghpig.top/https://github.com`:\ndown==15 ? \n`https://hub.gitmirror.com/https://github.com`:\ndown==16 ?\n`https://sciproxy.com/github.com`:\ndown==17 ?\n`https://download.nuaa.cf`:\ndown==18 ?\n`https://download.scholar.rr.nu`:\ndown==19 ? \n`https://download.yzuu.cf`:\n//down==20 ? \n`https://ghproxy.net/https://github.com`;",
    "sourceGroup": "202",
    "sourceIcon": "https://gitee.com/visita/yd/raw/master/00rose/a001b.png#",
    "sourceName": "阅读难受1",
    "sourceUrl": "https://www.lanzoux.com/#2024md1",
    "style": "body {\r\n    font-family: 'Roboto', sans-serif;\r\n    display: flex;\r\n    flex-direction: column;\r\n    height: 100vh;\r\n    margin: 5;\r\n    background-color: #F8F8F8;\r\n}\r\n\nmd1 {\n    color: #444444;\n    font-size: 2em; \r\n    margin: 40px 0;\n    font-weight: 400;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\r\nmd2 {\r\n    color: #444444;\n    font-size: 1.4em; \n    margin-bottom: 40px;\n    line-height: 1.8;\n    font-weight: 400;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\r\nmd3 {\n    color: #212121;\n    font-size: 1.6em; \r\n    margin: 10px 0;\n    font-weight: 400;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\nmd4 {\n    font-size: 1.1em; \r\n}\n\r\nmd5 {\r\n    font-size: 1em; \n    color: #222222;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\ntextarea {\n    width:98%;\r\n    height: auto;\r\n    min-height: 54px;\n    max-height: 500px;\r\n    overflow-y: auto;\n    border-radius:5px;\r\n    border: 1px solid #BDBDBD;\r\n}\r\n\r\n.button {\n    display: block; \r\n    margin-left: auto;\n    margin-right: auto;\r\n    padding: 6px 10px;\r\n    background-color: #FF5722;\r\n    border: none;\r\n    color: white;\r\n    cursor: pointer;\r\n    border-radius: 4px;\r\n    text-decoration: none;\r\n    margin-top: 1px;\r\n    font-size: 18px;\r\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);\r\n    transition: background-color 0.5s,\n    transform 0.4s;\r\n}\r\n\r\n.button:hover {\r\n    background-color: #FF5722;\r\n    transform: translateY(-2px);\r\n}\r\n\r\n.button:active {\r\n    box-shadow: 0 3px 5px rgba(0, 0, 0, 0.4);\r\n    transform: translateY(0);\r\n}"
  },
  {
    "articleStyle": 0,
    "contentBlacklist": "https://lupic.cdn.bcebos.com/,\nhttps://cpro.baidu.com/,\nhttps://eclick.baidu.com/,\nhttps://sofire.baidu.com/,\nhttps://analytics.woozooo.com/,\nhttps://statics.woozooo.com/,\nhttps://hm.baidu.com/,\nhttps://wwads.cn/code/,\nhttps://cdn.wwads.cn/,\nhttps://pagead2.googlesyndication.com,\nhttps://www.qlspx.com,\nhttps://sdk.51.la,\nhttps://abk.lingsiqiwu.com,\n\nhttps://googleads4.g.doubleclick.net,\nhttps://static.googleadsserving.cn,\nhttps://s0.2mdn.net,\nhttps://tpc.googlesyndication.com,\nhttps://www.googletagservices.com,\nhttps://cm.g.doubleclick.net,,\nhttps://star.jsyunmy.com,\nhttps://p.qlogo.cn,\nhttps://partner.googleadservices.com,",
    "customOrder": -10098444,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.0.0; MI 5s Plus Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36\",\n\t\"upgrade-insecure-requests\": \"1\",\r\n\"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\",\r\n\"accept-language\": \"zh-CN,en-US;q=0.9\",\r\n\"cookie\": \"down_ip=1\",\r\n\"x-requested-with\": \"cn.nr19.mbrowser\"\n}",
    "injectJs": "// 是蓝奏云链接时\nif(/lanzou/.test(window.location.href)){\nArray.from(document.querySelectorAll(`\n\t.mt2:last-of-type,.appreport,.n_login,\n\tdiv[style*=\"color: #8a6d3b;\"]\n`),$=>$.style.display='none');\n}\n\n\n//选择需要删除的标签，以,分隔\nitems = document.querySelectorAll(`\n.stealth-scroll,\n\n#evaluate-box,\n.project-operation,\n.recommend-footer,\n\n.project-desc2,\n.side-widget,\n\n.header_nav,\n.under\n`)\n\n//把选择的html值改成空\nArray.from(items,(item)=>{\n\titem.innerHTML = ``\n\titem.style.display = `#m-splitter`\n})",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": false,
    "ruleArticles": "<js>\ntry {\n    $ = JSON.parse(src).text;\n    if ($ == \"no file\") $ = [];\n} \n\n//💙catch。。。\ncatch (err) {\n\n    //💚💚网站整合\n     if (baseUrl.match(/www\\.baidu\\.com\\?wd=/)) {\n        $ = [];\n        baseUrl.replace(/^.*?wd=\\s*/,'').replace(/\\,/g,',{\"headers\":{\"User-Agent\": \"Mozilla/5.0 (Windows; U; Windows NT 5.2;. en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 Quark/4.6.2.161\"}}').\n        split(/\\s*♞♞\\s*/).map($$ => $.push({\n            name_all: $$.match(/.*?《(.*?)》/)[1],\n            time: $$.match(/◎.*?◎/) ? $$.match(/.*?◎(.*?)◎/)[1].replace(/■/,'▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁').replace(/🦁/,'｜编程狮｜w3cschool.cn｜') : \"\",\n            uri1: $$.match(/【.*?】/) ? $$.match(/.*?【(.*?)】/)[1] : \"004.png\",\n            url: $$.match(/^([^【《◎]*),?/)[1]\n        }));\n    }\n    //💚💚0 网站整合结束\n\n\n    //💚💚蓝奏云\n    else {\n\n        //🧡🧡🧡蓝奏云非分组链接\n        if (String(java.getString('text.举报文件@href')).length) {\n            $ = [{\n                name_all: String(java.getString('class.md@textNodes')),\n                icon: String(java.getString('class.md@textNodes')).replace(/.*\\./, ''),\n                size: String(java.getString('class.mtt@text')).replace(/\\( /, '').replace(/ \\)/, ''),\n                time: String(java.getString('class.mf@textNodes')).replace(/.*\\n/, ''),\n                uri: baseUrl.replace(/^(.+com).*\\/(.+)$/, '$2'),\n                url: baseUrl.replace(/^(.+com).*\\/(.+)$/, '$1/tp/$2')\n            }]\n        }\n        //🧡🧡🧡蓝奏云非分组结束\n\n\n        //🧡🧡🧡取消分享\n        else if (String(java.getString('.off@text')).match(/取消分享/)) {\n            $ = [{\n                name_all: java.getString('.off@text'),\n                time: baseUrl.replace(/[#\\?].*/g, ''),\n                url: baseUrl.replace(/[#\\?].*/g, ''),\n            }]\n        }\n        //🧡🧡🧡取消结束\n\n\n        //🧡🧡🧡蓝奏云分组链接\n        else {\n            json = [];\n            name = java.getString('.user-radio@text||title@text')\n            java.getElements('#folder .mlink').forEach(a => {java.setContent(a);\n      json.push({\n      \t    name_all: java.getString('.filename@textNodes'),\n          url: java.getString('a@href'),\n          time: '🗂️ folder　📑 ' + (String(java.getString('.filesize@text')) || name) })\n    })\njava.setContent(src);\n\n\n            mat = baseUrl.match(/^(.*?\\.com)[^##]*\\/(.+)$/)\n            url = mat[1]\n            uri = mat[2]\n            uri2=baseUrl.match(/【[^】]/)? baseUrl.match(/【(.*?)[】$]/)[1]: \"004.png\"\n\n            function $(reg) {\n                return uri.match(reg) ? true : false}\n\n\n            //get【pwd】(链接提取码)\n            pwd =\n$(/##[^【]/) ? uri.match(/##(.*?)(【|$)/)[1] :\"\";\n\n\n\nhead = {method: \"POST\", params: {uri: uri,\nimg: $(/【[^】]/)?uri.match(/【([^】]+)/)[1] :\"\"}}\n\n\n            //get 【body】\n            eval(src.match(/var pgs;([\\s\\S]*?pgs.+;)/)[1]);\n            eval('$=' + src.match(/data :([\\s\\S]*?\\})/)[1]);\n            head.body = Object.keys($).map(key => key + \"=\" + $[key]).join('&');\n\n\n            //补全【url】\nurl += \"/filemoreajax.php,\" + JSON.stringify(head);\n\n            //ajax\n            $ = JSON.parse(java.ajax(url));\n            $ = json.concat($.text != 0 ? $.text :\n             //密码错误提示\n             [{name_all: $.info,\n               time: uri.replace(/[#\\?].*/, '') + $.info,\n               url: baseUrl.replace(/[#\\?].*/, '') }]\n                                        )\n            baseUrl = url\n        }\n        //🧡🧡🧡蓝奏分组结束\n\n    }\n    //💚💚蓝奏结束\n\n}\n//💙catch(err)结束\n\njava.put('url', baseUrl);\nJSON.stringify($);\n</js>$.[*]",
    "ruleImage": "@js:\nn=`{{$.name_all}}` ;\nuri1=`{{$.uri1}}` ;\n\nsrc =uri1 ? uri1 :\n\n//文件名判断使用对应图标\nn.match(/\\.zip|\\.7z|\\.rar/i)? \"zip.png\" :\nn.match(/apk/g)? \"apk.png\" :\n\n!n.match(/\\.\\w\\w\\w$/)? \"0.png\" :\nn.match(/迷迭|md/i)? \"md.png\" :\nn.match(/单仓|215613905|taka|q版/)? \"dc1.png\" :\nn.match(/可视|影视仓|影音壳子|多仓/)? \"dc2.png\" :\nn.match(/本地/)? \"bd.png\" :\nn.match(/海阔|[^青钢承]影|视|剧|直播|tv[^b]/i)? \"ys.png\" :\n\nbaseUrl.match(/423down/)? \"423down.png\" :\nbaseUrl.match(/lxapk/)? \"lxapk.png\" :\nbaseUrl.match(/yoyodadada/)? \"yoyo.png\" :\n\n\n\nbaseUrl.match(/【(.*?)[】$]/) ? baseUrl.match(/【(.*?)(】|$)/)[1]:\n\n//为空时\n`lan.png` ;\n\n\n//md图片简写补全。\n\neval(String(source.sourceComment));\n\npic= \npic==`0` ? `/md-yd/pic@main/00rose/${src}`:\npic==`1` ? `/md-yd/pic@main/01pink/${src}` :\npic==`2` ? `/md-yd/pic@main/02blue/${src}` :\npic==`3` ? `/md-yd/pic@main/03green/${src}` :\npic==`4` ? `/md-yd/pic@main/04gear/${src}` :\npic==`5` ? `/md-yd/pic@main/05green/${src}` :\npic==`6` ? `/md-yd/pic@main/06red/${src}`:\npic==`7` ? `/md-yd/pic@main/07blackred/${src}` :\npic==`8` ? `/md-yd/pic@main/08black/${src}` :\npic==`9` ? `/md-yd/pic@main/09note/${src}` :\n\npic==`10`?`/md-yd/pic@main/03green2/${src}`:\npic==`11`?`/md-yd/pic@main/04gear2/${src}` :\n//pic==`12`?\n`/md-yd/pic@main/04gear3/${src}`;\n\n\npic=gitpic+pic;\n\npic= \nString (gitpic).match(/gitee/) ? \nString(pic).replace(/\\/md\\-yd\\/pic\\@main/,''):\nString (gitpic).match(/\\/gh$/) ? \n pic : \nString (pic).replace(/\\@/,'/');\n\nsrc=src.match(/^http/) ? src : pic ;\nsrc",
    "ruleLink": "$.id@js:\nurl=`{{$.url}}`\nif(result){url+=`/tp/{{$.id}}`;\nurl}",
    "ruleNextPage": "@js:\ntry {\n    url = String(java.get('url'));\n    url = url.replace(/(pg=)(\\d+)/, (mat, $1, $2) => {\n        return $1 + (~~$2 + 1)\n    }).replace(url, '');\n} catch (err) {\n    url = \"\"\n}\nurl",
    "rulePubDate": "💾 {{$.icon}}　📥 {{$.size}}　⏱️ {{$.time}}\n##💾 　📥 　⏱️\\s*",
    "ruleTitle": "$.name_all",
    "singleUrl": false,
    "sortUrl": "‼️‼️注意‼️‼️::http://www.baidu.com?wd=https://0【md.png】《⬇︎本列表仅作警示 无须点入⬇︎》◎▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁◎♞♞https://1【md.png】《‼️本订阅内的软件，皆未测试。所有软件或游戏，》◎◎♞♞https://2【md.png】《如需分享推广群才能用，点分享然后取消，不发出去，》◎◎♞♞https://4【md.png】《也算分享成功。可重复假分享满足次数，即可正常使用。》◎不清楚这个小bug是否仍有效◎♞♞https://6【md.png】《‼️软件中如有广告、优惠活动、羊毛资讯，涉及资金，请勿相信！》◎▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁◎♞♞https://7【md.png】《‼️如有在线博彩、赌博，都是诈骗，请勿尝试！》◎▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁◎\n\n\n破解游戏::https://www.lanzoui.com/b053xt4vg\nHs团队破解游戏::https://pan.lanzoui.com/b888887\n兜兜软件::https://www.lanzoui.com/b133841/\n兜兜游戏::https://www.lanzoui.com/b897234\n霖淘购软件::https://www.lanzoui.com/b252370/\n霖淘购游戏::https://www.lanzoui.com/b01zs40va\n未归类::https://www.lanzoui.com/b01b01h9a\nBhVip::https://pan.lanzoui.com/u/彪煌qq1846055318\n大肥::https://pan.lanzoui.com/u/qianxun8\n淘购街::https://pan.lanzoui.com/b165784\n软件库::https://www.lanzoui.com/u/rjk\n安卓软件::https://www.lanzoui.com/u/langman666\n滚哥new::https://ypziyuanshare.lanzoul.com/b0epegxzi\n滚哥old::https://www.lanzoux.com/b838976\n小默::https://pan.lanzoui.com/b828085\n阿友::https://pan.lanzoui.com/u/aybaba\n软件分享::https://www.lanzoui.com/u/aiwange\n动漫::https://pan.lanzoui.com/b765262/",
    "sourceComment": "pic=9\n/*▔▔▔▔▔▔▔▔\n⬆︎设置图片样式\n0  红+\n1  粉++\n2  蓝++\n3  绿+  10\n4  绿齿轮  11  12\n5  绿字印章+\n6  红字印章+\n7  红字 黑白背景\n8  蓝字黑底（夜间）-\n9  卡其色 记事板-\nv240501\n▁▁▁▁▁▁▁▁*/\n\n\ngitpic=17\n/*▔▔▔▔▔▔▔▔\n⬆︎gitpic 设置图片镜像链接。\n——— Ⓖ github ——\t—\n1  raw.kkgithub.com\n2  github.moeyy.xyz\n3  mirror.ghproxy.com\n4  raw.cachefly.998111.xyz\n5  ghproxy.net\n6 521github.com\n7  slink.ltd\n8  gh.con.sh\n9  cors.isteed.cc\n10 hub.gitmirror.com\n11 sciproxy.com\n12 ghproxy.cc\n13 cf.ghproxy.cc\n14 gh.jiasu.in\n15 ghcy.eu.org\n16 raw.gitmirror.com\n17 gitee.com ✱\n▁▁▁▁▁▁▁▁*/\n\n\n/*▔▔▔▔▔▔▔▔\n订阅源图标可自己复制链接替换\n（拉到顶部第三项）\n★★ github 图标★★\nhttps://521github.com/md-yd/pic/raw/main/00rose/0purple.jpg\nhttps://521github.com/md-yd/pic/raw/main/00rose/004.png\n★★gitee图标★★\nhttps://gitee.com/visita/yd/raw/master/00rose/0purple.jpg\nhttps://gitee.com/visita/yd/raw/master/00rose/004.png\n▁▁▁▁▁▁▁▁*/\n\n\n/*▔▔▔▔▔▔▔▔\nrss by.Thomas。  md小改&收集整理。\n\n小说交流群892966579\nA群637775313不加人。若群炸了查看此群群资料找新家。\n\n内容取自网络，仅作学习参考，请24小时内删除。找到感兴趣内容请去支持正版。\n▁▁▁▁▁▁▁▁*/\n\n\ngitpic=\ngitpic==1 ? \n`https://raw.kkgithub.com`:\ngitpic==2 ? \n`https://github.moeyy.xyz/https://raw.githubusercontent.com`:\ngitpic==3 ?\n`https://mirror.ghproxy.com/https://raw.githubusercontent.com`:\ngitpic==4 ? \n`https://raw.cachefly.998111.xyz`:\ngitpic==5 ?\n`https://ghproxy.net/https://raw.githubusercontent.com`:\ngitpic==6 ? \n`https://521github.com/extdomains/raw.githubusercontent.com` :\ngitpic==7 ? \n`https://slink.ltd/https://raw.githubusercontent.com` :\ngitpic==8 ? \n`https://gh.con.sh/https://raw.githubusercontent.com` :\ngitpic==9 ? \n`https://cors.isteed.cc/https://raw.githubusercontent.com` :\ngitpic==10 ? \n`https://hub.gitmirror.com/https://raw.githubusercontent.com` :\ngitpic==11 ?\n`https://sciproxy.com/https://raw.githubusercontent.com` :\ngitpic==12 ?\n`https://ghproxy.cc/https://raw.githubusercontent.com` :\ngitpic==13 ?\n`https://cf.ghproxy.cc/https://raw.githubusercontent.com` :\ngitpic==14 ?\n`https://gh.jiasu.in/https://raw.githubusercontent.com`:\ngitpic==15 ? \n`https://ghcy.eu.org/https://raw.githubusercontent.com`:\ngitpic==16 ? \n`https://raw.gitmirror.com`:\n//gitpic==17 ? \n`https://gitee.com/visita/yd/raw/master`;",
    "sourceGroup": "202",
    "sourceIcon": "https://gitee.com/visita/yd/raw/master/00rose/a006b.png#",
    "sourceName": "未测难受6",
    "sourceUrl": "https://www.lanzoux.com/#2024md6",
    "style": "body {\r\n    font-family: 'Roboto', sans-serif;\r\n    display: flex;\r\n    flex-direction: column;\r\n    height: 100vh;\r\n    margin: 5;\r\n    background-color: #F8F8F8;\r\n}\r\n\nmd1 {\n    color: #444444;\n    font-size: 2em; \r\n    margin: 40px 0;\n    font-weight: 400;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\r\nmd2 {\r\n    color: #444444;\n    font-size: 1.4em; \n    margin-bottom: 40px;\n    line-height: 1.8;\n    font-weight: 400;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\r\nmd3 {\n    color: #212121;\n    font-size: 1.6em; \r\n    margin: 10px 0;\n    font-weight: 400;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\nmd4 {\n    font-size: 1.1em; \r\n}\n\r\nmd5 {\r\n    font-size: 1em; \n    color: #222222;\n    justify-content: center;\n    text-align: center;\r\n}\r\n\ntextarea {\n    width:98%;\r\n    height: auto;\r\n    min-height: 54px;\n    max-height: 500px;\r\n    overflow-y: auto;\n    border-radius:5px;\r\n    border: 1px solid #BDBDBD;\r\n}\r\n\r\n.button {\n    display: block; \r\n    margin-left: auto;\n    margin-right: auto;\r\n    padding: 6px 10px;\r\n    background-color: #FF5722;\r\n    border: none;\r\n    color: white;\r\n    cursor: pointer;\r\n    border-radius: 4px;\r\n    text-decoration: none;\r\n    margin-top: 1px;\r\n    font-size: 18px;\r\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);\r\n    transition: background-color 0.5s,\n    transform 0.4s;\r\n}\r\n\r\n.button:hover {\r\n    background-color: #FF5722;\r\n    transform: translateY(-2px);\r\n}\r\n\r\n.button:active {\r\n    box-shadow: 0 3px 5px rgba(0, 0, 0, 0.4);\r\n    transform: translateY(0);\r\n}\r\n\n\r\n"
  },
  {
    "articleStyle": 0,
    "customOrder": -100772,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Linux; Android 8.0.0; MI 5s Plus Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36\"\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "<js>\ntry{\n\t$=JSON.parse(src).text\n\tif($==\"no file\")$=[];\n\t}\ncatch(err){\n\n\tmat = baseUrl.match(/^(.*?com)[^##]*\\/(.+)$/)\n\t\turl = java.put('url', mat[1])\n\t\turi = java.put('uri', mat[2])\n\nfunction $(reg){\n\t\treturn uri.match(reg)?true:false\n\t}\n\n//get【pwd】(链接提取码)\npwd = \n$(/##[^【]/)?  baseUrl.match(/##(.*?)(【|$)/)[1]:\n\"\";\n\neval(result.match(/var pgs;([\\s\\S]*?pgs.+;)/)[1]);\neval('$='+result.match(/data :([\\s\\S]*?\\})/)[1])\n\nbody = \"\";\nfor(key in $)body += key+'='+$[key]+'&';\nbody = String(body).replace(/&$/,'');\n\nurl += `/filemoreajax.php,{\"method\":\"POST\",\"body\":\"${body}\"}`\n\njava.ajax(url)}\n</js>\n$.text",
    "ruleContent": "@js:\n$=JSON.parse(src).data;\npath=String($.name).match(/净化/)?\n\"replaceRule\":\nString($.name).match(/订阅[^失败]/)?\n\"rssSource\": \"bookSource\";\n\nsrc = \"legado://import/\"+path+\"?src=\";\n\n//【过客】及【快乐】的蓝奏云列表，下载页面添加提示注释。其他列表则跳转到普通下载页面。\nbaseUrl.match(/lanzoul/)? \n//🧡🧡🧡🧡🧡🧡🧡🧡🧡🧡🧡🧡🧡🧡\n`\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\">\n<title>${$.name}</title>\n<br><br>\n\n<center>\n<h3>${$.name}</h3>\n</center>\n　　注：点◎下载文件◎，底栏会弹出信息，<br>\n　　再点信息右面的“下载”，才会开始下载。<br>\n　　文件下载默认存放在 根目录/Download/<br>\n<br>\n　　注：软件若有推群弹窗，分享时不发出去，<br>\n　　返回也算分享成功。勿信广告博彩诈骗。<br>\n<br>\n<h5 style=\"margin:0;padding:3% 5%\">\n\n<b style=\"float:left\"></b>\n\n<b style=\"float:right\">\n文件大小： ${$.size}\n<br><br>\n上传日期： ${$.time}\n<br><br><br>\n<a href=\"${$.url}\">◎ 下载文件 ◎　　　　　　　　　</a>\n</b>\n\n</h5>\n<br><br><br><br><br>\n<p>　　${$.describe}</p>\n\n<br>↓资源链接，点击复制<textarea id=\"copy\" onclick=\"copy()\">${$.url}</textarea>\n<br><br><center>\nrssSource by.Thomas.　　 迷迭轻改&收集整理<br><br>\n资源取自网络，仅作参考试用，请24小时内删除<br></center>\n<script>\nfunction copy(){\n\tdocument.getElementById('copy').select()\n\tdocument.execCommand('copy')\n\talert(\"复制成功\")\n}\n</script>\n`: \n//💙💙💙💙💙💙💙💙💙💙💙💙💙💙\n`\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\">\n<title>${$.name}</title>\n<br><br><br><br>\n<center>\n<h3>${$.name}</h3>\n</center>\n　　注：点◎下载文件◎，底栏会弹出信息，<br>\n　　再点信息右面的“下载”，才会开始下载。<br>\n　　文件下载默认存放在 根目录/Download/<br>\n<br>\n<h5 style=\"margin:0;padding:3% 5%\">\n\n<b style=\"float:left\"></b>\n\n<b style=\"float:right\">\n文件大小： ${$.size}\n<br><br>\n上传日期： ${$.time}\n<br><br><br>\n<a href=\"${$.url}\">◎ 下载文件 ◎　　　　　　　　　</a>\n</b>\n\n</h5>\n<br><br><br><br><br>\n<p>　　${$.describe}</p>\n\n<br>↓资源链接，点击复制<textarea id=\"copy\" onclick=\"copy()\">${$.url}</textarea>\n<br><br><center>\nrssSource by.Thomas.　　 迷迭轻改&收集整理<br><br>\n资源取自网络，仅作参考试用，请24小时内删除<br></center>\n<script>\nfunction copy(){\n\tdocument.getElementById('copy').select()\n\tdocument.execCommand('copy')\n\talert(\"复制成功\")\n}\n</script>\n`##　　(null|undefined)|null|获取失败",
    "ruleImage": "@js:\nsrc =\nbaseUrl.match(/【http/)?  baseUrl.match(/【(.*?)(】|$)/)[1]:\n\n//一程图标简写补全\nbaseUrl.match(/【\\//)?  \"https://gitee.com/i-c/tc/raw/master/dy/yd\"+baseUrl.match(/【(.*?)(】|$)/)[1]:\n\n//4⃣️423 简写补全\n//baseUrl.match(/【4】/)?  \"https://pic.616pic.com/ys_b_img/00/04/50/svvOHW89bj.jpg\":\n\nbaseUrl.match(/423down/)?  \"https://img2.baidu.com/it/u=2176863467,1140264399&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=501\":\n\n\n//‼️蝶图标 简写补全\n//‼️baseUrl.match(/【md】/)? \"http://pp.myapp.com/ma_icon/0/icon_52437554_1640934578/256\":\n\n//‼️默认图标：粉色小鸟图标\n//‼️\"https://android-artworks.25pp.com/fs08/2023/01/03/9/110_03e44582413966c9a6310cf847cc08ba_con_130x130.png\"\n\n//默认图标：apk图标\n\"https://android-artworks.25pp.com/fs08/2021/08/02/7/110_578817aeea22639f2b3e99603deae43d_con_130x130.png\"",
    "ruleLink": "@js:\n//key=0;\nkey=String(source.getVariable());\nkey=key.match(/^[12]/)? key:\"0\";\n\nkey.match(/^1/)? \"https://lanzou.baihe.gay/?url=@get:{url}/{{$.id}}\" :\n//key.match(/^2/)?\"https://tool.bitefu.net/lanzou?url=@get:{url}/{{$.id}}\" :\n\"https://apis.jxcxin.cn/api/lanzou?url=@get:{url}/{{$.id}}\";",
    "ruleNextPage": "@js:\ntry{\n\t\tu = String(java.get('url'))\n\t\tp = u.match(/pg=(\\d+)&/)[1]\n\t\tp = 'pg='+(parseInt(p)+1)+'&'\n\t\turl = u.replace(/pg=(\\d+)&/,p)\n\t}\ncatch(err){url=\"\"}\nurl",
    "rulePubDate": "💾 {{$.icon}}　📥 {{$.size}}　⏱️ {{$.time}}",
    "ruleTitle": "$.name_all",
    "singleUrl": false,
    "sortUrl": "▶️多仓本地包/云星::https://wwc.lanzoub.com/b0erx68gf##4e93【https://image.28283.com/attachment/soft/2022/0920/101944_94931889.png】\n▶️可视TV/多仓/云星::https://wwc.lanzoub.com/b0es81t8j##54jb【https://image.28283.com/attachment/soft/2022/0920/101944_94931889.png】\n▶️影视仓/多仓/奇奇::https://qiqi2020.lanzouv.com/b09svqv1c##666【http://pic.y8l.com/up/2022-6/202262415595588.png】\n\n▶️TVBox/终南::https://wws.lanzouv.com/b03j4ulyh##999【https://pic.yidown.com/uploadfile/2022/1129/20221129010510248.png】\n▶️TVbox/神器::https://tsq.lanzouv.com/b0c4nr91c##123【https://pic.yidown.com/uploadfile/2022/1129/20221129010510248.png】\n\n🎬海阔视界::https://haikuo.lanzoui.com/u/GoldRiver##【http://image.coolapk.com/apk_logo/2021/0725/14/ic_launcher-286481-o_1fbe4snlg1r9n1vfokun2st7c3r-uid-726186@192x192.png】\n🎨异次元/漫画::https://yiciyuan.lanzoui.com/b00ej0kba##【https://mmbiz.qlogo.cn/mmbiz_jpg/GwqVApVbd26P0XRjNg7FOdcy1kBEBfNV6PhmNPdMxGrejHxe7cibbbLE5msAj3x5KtPo2FxdI7XPFOcGsW43Zzg/300】\n\n🐶土狗浏览器::https://www.lanzoux.com/s/tgllq##【https://files.youxibao.com/imgfile/20220918/180828286hk7.png】\n\n//‼️423软件‼️\n4⃣️洛雪音乐多版本::https://pan.lanzouo.com/b0bf2cfa/##glqw\n4⃣️小黄鸟::https://423down.lanzouv.com/b0f1b9v6j\n4⃣️影视软件::https://423down.lanzouv.com/b0f2x4syh\n4⃣️系统辅助::https://423down.lanzouv.com/b0f1944od\n4⃣️视频图像::https://423down.lanzouv.com/b0f1czyjc\n4⃣️Xposed框架::https://423down.lanzouv.com/b0f1fns7a\n4⃣️TV盒子::https://423down.lanzouv.com/b0f1944aj\n4⃣️资讯软件::https://423down.lanzouv.com/b0f19mgrg\n4⃣️酷安mod::https://423down.lanzouv.com/b0f2uzq2b\n4⃣️WiFi万能钥匙::https://423down.lanzouv.com/b0f1f1t5c\n4⃣️抖音mod::https://423down.lanzouv.com/b0f199a5a\n4⃣️百度地图::https://423down.lanzouv.com/b0f1f64re\n4⃣️浏览器::https://423down.lanzouv.com/b0f24u4de\n4⃣️计算器::https://423down.lanzouv.com/b0f21mrtc\n\napk/不似苏::https://busisu.lanzoub.com/s/yixie\n\n//‼️过客‼️\n✈️飞机::https://lanzoul.com/b0eaqzjgb\nℹ️软件1::https://lanzoul.com/s/gk123\n🎮破解游戏::https://lanzoul.com/b0e94dqob##【https://android-artworks.25pp.com/fs08/2022/09/01/10/110_e567c7eefee644e1206852e8b574f5c1_con_130x130.png】\n💀🎮游戏1::https://lanzoul.com/b0ea7uq6j##【https://android-artworks.25pp.com/fs08/2022/01/13/5/123_4354f8163cf3b486a8451db4a93adc71_con_130x130.png】\n💀视频1::https://lanzoul.com/b0eaqzimb##【https://android-artworks.25pp.com/fs08/2023/01/03/9/110_03e44582413966c9a6310cf847cc08ba_con_130x130.png】\n\n//‼️快乐分享者‼️\nℹ️软件2::https://lanzoul.com/b02e5e9sd\nxℹ️软件::https://lanzoul.com/b02damfkd\nx💀🎮游戏::https://lanzoul.com/b02cy01di##【https://android-artworks.25pp.com/fs08/2022/01/13/5/123_4354f8163cf3b486a8451db4a93adc71_con_130x130.png】\n💀🎮游戏2::https://lanzoul.com/b02e5e9je##【https://android-artworks.25pp.com/fs08/2022/01/13/5/123_4354f8163cf3b486a8451db4a93adc71_con_130x130.png】\n💀视频2::https://lanzoul.com/b02cy1lzg##【https://android-artworks.25pp.com/fs08/2023/01/03/9/110_03e44582413966c9a6310cf847cc08ba_con_130x130.png】\n\n♟ps2模拟器::https://xianuani.lanzoux.com/b02in8lqj##5fxg\n♟李跳跳::https://wwe.lanzouw.com/b01v0g3wj##1233\n♟ES浏览器::https://lanzoui.com/b00ze62be\n♟幸运破解器::https://ghpym.lanzouo.com/b011ah2ah##byfa",
    "sourceComment": "切换解析线路：如果出现问题页面打不开，点右上角 ->“设置源变量”-> 输入数字。确认。\n（刷新 重新加载列表）\n\n额，测试频繁玩坏了，被封ip了。。\n不知源变量判断语句有没有问题。\n如果仍然打不开网页，请修改“列表”->最下面那项“链接规则”里的语句全删了，换下面3个线路中的一个。‼️bitefu线路参数略不同，就不用也这个订阅源里了。\nhttps://tool.bitefu.net/lanzou?url=@get:{url}/{{$.id}}\nhttps://apis.jxcxin.cn/api/lanzou?url=@get:{url}/{{$.id}}\nhttps://lanzou.baihe.gay/?url=@get:{url}/{{$.id}}\n\n————————\nhttps://tool.bitefu.net/lanzou?type=down&url=\nhttps://apis.jxcxin.cn/api/lanzou?type=down&url=\nhttps://lanzou.baihe.gay/?type=down&url=\n————————\n@js:\n//key=0;\nkey=String(source.getVariable());\nkey=key.match(/^[12]/)? key:\"0\";\n\nkey.match(/^1/)? \"https://tool.bitefu.net/lanzou?url=@get:{url}/{{$.id}}\" : \nkey.match(/^2/)? \"https://apis.jxcxin.cn/api/lanzou?url=@get:{url}/{{$.id}}\" : \"https://lanzou.baihe.gay/?url=@get:{url}/{{$.id}}\";\n————————\nby. Thomas\n\n云图标\nhttp://i-1.emu999.net/2105/2148/6559a00508a842a0ab5ccdb7f74ca7f2.png\n蝶图标\nhttp://pp.myapp.com/ma_icon/0/icon_52437554_1640934578/256\n\n\n\n\n\nhttps://i01piccdn.sogoucdn.com/ccfccb7297e21f01\n\n‼️若无法跳转到下载页面，请刷新列表（右上角，“刷新分类”。或下拉屏幕也可刷新）。\n————————\n本订阅源套用了第三方直链生成工具。\nby. Thomas\nmd轻改及收集整理列表。\n————————\n小说交流群462030508\nA群637775313不加人。若群炸了查看此群群资料找新家。\n\n内容取自网络，仅供学习参考，请同学们在24小时内删除\n————————\n云图标\nhttp://i-1.emu999.net/2105/2148/6559a00508a842a0ab5ccdb7f74ca7f2.png\n蝶图标\nhttp://pp.myapp.com/ma_icon/0/icon_52437554_1640934578/256\n————————\n4⃣️小说软件::https://423down.lanzouv.com/b0f1cdr9i\n📙阅读3.0::https://kunfei.lanzoui.com/b0f810h4b##【https://i.loli.net/2021/06/23/S7rvWRZtPIq34MJ.png】\n📙阅读pro/不似苏::https://busisu.lanzoub.com/s/yuedupro##【https://i.loli.net/2021/06/23/S7rvWRZtPIq34MJ.png】\n📙阅读X 3.0 已不更::https://hahahahahaha.lanzoux.com/b08rjey5i##no18ls【https://i.loli.net/2021/06/23/S7rvWRZtPIq34MJ.png】\n📙阅读2.0 已不更::https://kunfei.lanzoui.com/b0f7pt4hi##【https://i.loli.net/2021/06/23/S7rvWRZtPIq34MJ.png】\n\n▶️多仓本地包/云星::https://wwc.lanzoub.com/b0erx68gf##4e93【https://image.28283.com/attachment/soft/2022/0920/101944_94931889.png】\n▶️可视TV/多仓/云星::https://wwc.lanzoub.com/b0es81t8j##54jb【https://image.28283.com/attachment/soft/2022/0920/101944_94931889.png】\n▶️影视仓/多仓/奇奇::https://qiqi2020.lanzouv.com/b09svqv1c##666【http://pic.y8l.com/up/2022-6/202262415595588.png】",
    "sourceGroup": "合集",
    "sourceIcon": "https://agit.ai/butterfly/yd/raw/branch/yd/pic/purple2.jpg",
    "sourceName": "box+apk 蓝奏直链√",
    "sourceUrl": "https://www.lanzoux.com#d1",
    "style": "a{text-decoration:none}\nimg{width:20%;height:auto;border-radius:50%}\ntextarea{width:100%;border-radius:5px}"
  },
  {
    "articleStyle": 1,
    "customOrder": -240,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": ".list_box@ul",
    "ruleContent": "id.video@all",
    "ruleImage": ".lazy@img",
    "ruleLink": "a@href",
    "ruleNextPage": "page",
    "rulePubDate": "span@text",
    "ruleTitle": ".title@text",
    "singleUrl": false,
    "sortUrl": "搜索🕵️::https://www.qinav.com/search/102728_{{page}}.html\n\n國產::https://www.qinav.com/search/100053_{{page}}.html\n日韓::https://www.qinav.com/search/116524_{{page}}.html\n歐美::https://www.qinav.com/search/116472_{{page}}.html\n動漫::https://www.qinav.com/search/101452_{{page}}.html\n有碼::https://www.qinav.com/search/116520_{{page}}.html\n無碼::https://www.qinav.com/search/100406_{{page}}.html\n字幕::https://www.qinav.com/search/105685_{{page}}.html\n三級::https://www.qinav.com/search/109192_{{page}}.html\n自拍::https://www.qinav.com/search/100070_{{page}}.html\n偷拍::https://www.qinav.com/search/100069_{{page}}.html\n主播::https://www.qinav.com/search/100961_{{page}}.html\n自慰::https://www.qinav.com/search/100039_{{page}}.html\n高潮::https://www.qinav.com/search/100145_{{page}}.html\n巨乳::https://www.qinav.com/search/100034_{{page}}.html\n大奶::https://www.qinav.com/search/100046_{{page}}.html\n蘿莉::https://www.qinav.com/search/100064_{{page}}.html\n少婦::https://www.qinav.com/search/100088_{{page}}.html\n熟女::https://www.qinav.com/search/100029_{{page}}.html\n亂倫::https://www.qinav.com/search/100092_{{page}}.html\n強姦::https://www.qinav.com/search/100100_{{page}}.html\n素人::https://www.qinav.com/search/100366_{{page}}.html\n白嫩::https://www.qinav.com/search/100032_{{page}}.html\n抖音::https://www.qinav.com/search/100483_{{page}}.html \n處女::https://www.qinav.com/search/100077_{{page}}.html \n媽媽::https://www.qinav.com/search/100091_{{page}}.html \n按摩::https://www.qinav.com/search/100248_{{page}}.html \nKTV::https://www.qinav.com/search/100059_{{page}}.html \n破處::https://www.qinav.com/search/100051_{{page}}.html \n裸貸::https://www.qinav.com/search/100135_{{page}}.html \n明星::https://www.qinav.com/search/100125_{{page}}.html \n母子::https://www.qinav.com/search/100392_{{page}}.html \n00後::https://www.qinav.com/search/100141_{{page}}.html \n換妻::https://www.qinav.com/search/100249_{{page}}.html \n極品::https://www.qinav.com/search/100155_{{page}}.html\n微信::https://www.qinav.com/search/100065_{{page}}.html\n幼女::https://www.qinav.com/search/100596_{{page}}.html\n絲襪::https://www.qinav.com/search/100035_{{page}}.html\n噴水::https://www.qinav.com/search/100040_{{page}}.html\n童貞::https://www.qinav.com/search/100028_{{page}}.html\n高中::https://www.qinav.com/search/100990_{{page}}.html\n喝醉::https://www.qinav.com/search/100062_{{page}}.html\n黑人::https://www.qinav.com/search/100164_{{page}}.html\n白虎::https://www.qinav.com/search/100043_{{page}}.html\n白絲::https://www.qinav.com/search/100080_{{page}}.html\n網紅::https://www.qinav.com/search/100036_{{page}}.html\n直播::https://www.qinav.com/search/100038_{{page}}.html\n約炮::https://www.qinav.com/search/100175_{{page}}.html\n教室::https://www.qinav.com/search/101599_{{page}}.html\n宿舍::https://www.qinav.com/search/100076_{{page}}.html\n雙飛::https://www.qinav.com/search/100072_{{page}}.html\n戶外::https://www.qinav.com/search/100087_{{page}}.html\n",
    "sourceGroup": "18🚫禁",
    "sourceIcon": "https://www.qinav.com/static/icon.png",
    "sourceName": "QinAV",
    "sourceUrl": "https://www.qinav.com/",
    "style": "video{width:100%}img{width:100%}"
  },
  {
    "articleStyle": 1,
    "customOrder": -238,
    "enableJs": false,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": false,
    "ruleArticles": "$.list",
    "ruleDescription": "$.vod_play_url\n@js:\nresult=result.replace('在线播放$','');\nresult=\"<video src=\\\"\"+result+\"\\\" width=\\\"100%\\\" controls height=\\\"285px\\\"></video>\";\nresult=\"<html><head><meat charset=\\\"utf-8\\\"><meat name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no\\\"/><style>html,body{margin:0;padding:0;width:100%;}</style></head><body>\"+result+\"</body></html>\"",
    "ruleImage": "$.vod_pic",
    "ruleLink": "$.vod_id",
    "ruleNextPage": "page",
    "rulePubDate": "$.vod_time",
    "ruleTitle": "$.vod_name",
    "singleUrl": false,
    "sortUrl": "搜索::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&wd=全裸&pg={{page}}\n推荐::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&pg={{page}}\n国产::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=1&pg={{page}}\n精品::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=31&pg={{page}}\n日无::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=2&pg={{page}}\n日有::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=3&pg={{page}}\n中字::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=20&pg={{page}}\n主播::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=21&pg={{page}}\n动漫::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=22&pg={{page}}\n欧美::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=23&pg={{page}}\n私拍::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=24&pg={{page}}\n丝袜::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=25&pg={{page}}\n人妻::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=26&pg={{page}}\n韩国::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=27&pg={{page}}\n香港::https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&t=28&pg={{page}}",
    "sourceComment": "",
    "sourceGroup": "18🚫禁",
    "sourceIcon": "https://z3.ax1x.com/2021/02/07/ytBxSK.gif",
    "sourceName": "©Tikhub",
    "sourceUrl": "https://shayuapi.com/api.php/provide/vod/at/json/?ac=detail&pg={{page}}"
  },
  {
    "articleStyle": 0,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "singleUrl": true,
    "sourceComment": "使用需搭配加速器 不要相信里面的任何广告\n点击弹窗下方红色按钮即可跳过广告\n欢迎各位大佬对本源进行二创\n书源交流群：374309405（加群可获取福利）",
    "sourceGroup": "",
    "sourceIcon": "https://ogfap.com/logo.png",
    "sourceName": "成人tik（源注释必看）",
    "sourceUrl": "https://xxxtik.com/"
  },
  {
    "articleStyle": 1,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "class.line_bottom@tr",
    "ruleContent": "class.entry@html",
    "ruleLink": "tag.a.0@href",
    "ruleNextPage": "page",
    "rulePubDate": "text",
    "ruleTitle": "a@title",
    "singleUrl": false,
    "sortUrl": "最新::https://3sdfs.enpeta.com/e/action/ListInfo/?classid=1",
    "sourceComment": "https://3sdfs.enpeta.com/e/action/ListInfo/?classid=1\n最新::https://31.enpeta.com/e/action/ListInfo/index.php?page={{page}}&classid=1",
    "sourceGroup": "202",
    "sourceIcon": "https://avatars.githubusercontent.com/u/49548316",
    "sourceName": "性趣套图",
    "sourceUrl": "https://enpeta.com"
  },
  {
    "articleStyle": 3,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\n\"User-Agent\": \"Mozilla/5.0 (Android)\"\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.blocks..models[*]&&$.models[*]",
    "ruleContent": "<js>\nconst parts = baseUrl.split(',').map(function(item) { return item.trim(); });\nconst domain = parts[0].split('/').slice(0, 3).join('/');\nconst username = parts[0].split('/').pop() || parts[0];\n\nconst camAjax = java.ajax(domain + '/api/front/v2/models/username/' + username + '/cam?uniq=0');\nconst configAjax = java.ajax(domain + '/api/front/v3/config/initial');\nconst membersAjax = java.ajax(domain + '/api/front/v2/models/username/' + username + '/members?uniq=0');\n\nlet responseData = { status: \"offline\", avatarUrl: \"\", startTime: \"\", coverImg: \"\", userDescription: \"\", goalDescription: \"\", fanClubDescription: \"\", topic: \"\", username: username, stream: \"\", topBestPlace: \"\", hlsLines: [], cdn: \"\", pixelatedResolutions: [], membersCount: 0, tipMenuPriceList: [], isLive: false, tipMenuCreatedAt: \"\", websocketUrl: \"\", websocketToken: \"\", modelId: \"\" };\n\nif (camAjax) {\n    const camData = JSON.parse(camAjax);\n    const user = camData.user && camData.user.user ? camData.user.user : {};\n    const cam = camData.cam ? camData.cam : {};\n    \n    responseData.status = user.status || \"offline\";\n    responseData.avatarUrl = user.avatarUrl || \"\";\n    responseData.startTime = user.statusChangedAt || \"\";\n    responseData.userDescription = user.description || \"\";\n    responseData.goalDescription = cam.goal && cam.goal.description ? cam.goal.description : \"\";\n    responseData.fanClubDescription = cam.userFanClub && cam.userFanClub.description ? cam.userFanClub.description : \"\";\n    responseData.topic = cam.topic || \"\";\n    responseData.stream = cam.streamName || \"\";\n    responseData.topBestPlace = user.topBestPlace || \"\";\n    responseData.modelId = user.id || \"\";\n    \n    if (user.snapshotTimestamp && responseData.modelId) {\n        responseData.coverImg = \"https://img.doppiocdn.live/thumbs/\" + user.snapshotTimestamp + \"/\" + responseData.modelId;\n    }\n    \n    if (cam.broadcastSettings && cam.broadcastSettings.presets) {\n        const presets = cam.broadcastSettings.presets;\n        var allResolutions = [];\n        \n        if (presets.default && presets.default.constructor === Array) {\n            allResolutions = allResolutions.concat(presets.default);\n        }\n        \n        if (presets.pixelated && presets.pixelated.constructor === Array) {\n            allResolutions = allResolutions.concat(presets.pixelated);\n        }\n        \n        if (presets.testing && presets.testing.constructor === Array) {\n            allResolutions = allResolutions.concat(presets.testing);\n        }\n        \n        if (presets.h265 && presets.h265.constructor === Array) {\n            allResolutions = allResolutions.concat(presets.h265);\n        }\n        \n        if (presets.vr && presets.vr.constructor === Array) {\n            allResolutions = allResolutions.concat(presets.vr);\n        }\n        \n        var uniqueResolutions = [];\n        for (var i = 0; i < allResolutions.length; i++) {\n            if (uniqueResolutions.indexOf(allResolutions[i]) === -1) {\n                uniqueResolutions.push(allResolutions[i]);\n            }\n        }\n        \n        uniqueResolutions.sort(function(a, b) {\n            var numA = parseInt(a);\n            var numB = parseInt(b);\n            if (isNaN(numA)) numA = 0;\n            if (isNaN(numB)) numB = 0;\n            if (a === \"auto\") return 1;\n            if (b === \"auto\") return -1;\n            if (a === \"160p_blurred\") return 1;\n            if (b === \"160p_blurred\") return -1;\n            return numB - numA;\n        });\n        \n        responseData.pixelatedResolutions = uniqueResolutions;\n    }\n    \n    responseData.isLive = user.isOnline === true;\n    responseData.tipMenuCreatedAt = cam.tipMenu && cam.tipMenu.createdAt ? cam.tipMenu.createdAt : \"\";\n    \n    if (cam.tipMenu && cam.tipMenu.settings) {\n        responseData.tipMenuPriceList = cam.tipMenu.settings.map(function(item) {\n            return {\n                activity: item.activity || \"\",\n                price: item.price || 0\n            };\n        });\n    }\n}\n\nif (configAjax) {\n    const configData = JSON.parse(configAjax);\n    const hosts = configData.initial && configData.initial.common && configData.initial.common.hlsStreamHosts ? configData.initial.common.hlsStreamHosts : {};\n    var hlsLines = [];\n    if (hosts.A) hlsLines.push(hosts.A);\n    if (hosts.B) hlsLines.push(hosts.B);\n    if (hosts.C) hlsLines.push(hosts.C);\n    if (hosts.D) hlsLines.push(hosts.D);\n    if (hosts.E) hlsLines.push(hosts.E);\n    if (hosts.F) hlsLines.push(hosts.F);\n    responseData.hlsLines = hlsLines;\n    responseData.cdn = responseData.hlsLines[0] || \"\";\n    \n    const client = configData.initial && configData.initial.client ? configData.initial.client : {};\n    responseData.websocketUrl = client.websocket && client.websocket.url ? client.websocket.url : \"\";\n    responseData.websocketToken = client.websocket && client.websocket.token ? client.websocket.token : \"\";\n}\n\nif (membersAjax) {\n    try {\n        const membersData = JSON.parse(membersAjax);\n        responseData.membersCount = \n            (membersData && membersData.guests ? membersData.guests : 0) + \n            (membersData && membersData.spies ? membersData.spies : 0) + \n            (membersData && membersData.invisibles ? membersData.invisibles : 0) + \n            (membersData && membersData.greens ? membersData.greens : 0) + \n            (membersData && membersData.golds ? membersData.golds : 0) + \n            (membersData && membersData.regulars ? membersData.regulars : 0);\n    } catch (error) {\n        responseData.membersCount = 0;\n    }\n}\n\nJSON.stringify(responseData);\n</js>\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title></title>\n</head>\n    <style>\n        * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Microsoft Yahei', sans-serif; }\n        body { color: #333; padding: 0.1rem; min-height: 100vh; background: #f5f5f5; }\n        .app-container { display: grid; grid-template-columns: 1fr; gap: 1rem; max-width: 1200px; margin: 0 auto; }\n        .live-section { border-radius: 12px; overflow: hidden; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); border: 1px solid #eaeaea; background: #fff; }\n        .topic-section { padding: 14px 20px; border-bottom: 1px solid #eaeaea; background: #fff; display: none; }\n        .topic-label { font-size: 12px; color: #666; margin-bottom: 6px; display: flex; align-items: center; gap: 8px; font-weight: 500; }\n        .topic-content { font-size: 15px; color: #333; font-weight: 500; line-height: 1.4; }\n        .chat-section { border-radius: 12px; padding: 1rem; display: flex; flex-direction: column; height: 500px; border: 1px solid #eaeaea; background: #fff; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); }\n        .chat-messages { flex: 1; overflow-y: auto; padding-right: 0.5rem; width: 100%; }\n        .chat-messages::-webkit-scrollbar { width: 6px; }\n        .chat-messages::-webkit-scrollbar-track { background: #f0f0f0; border-radius: 3px; }\n        .chat-messages::-webkit-scrollbar-thumb { background: #c0c0c0; border-radius: 3px; }\n        .message-wrapper { display: block; margin-bottom: 0.3rem; width: 100%; }\n        .message-item { padding: 0.3rem 0.6rem; border-radius: 16px; font-size: 0.85rem; line-height: 1.3; border: 1px solid rgba(224, 224, 224, 0.6); display: block; background: #f8f8f8; color: #333; width: 100%; word-break: break-word; box-sizing: border-box; }\n        .lovense-item { border-color: #e0e0e0; background: #f8f8f8; }\n        .tip-item { border-color: #e0e0e0; background: #f8f8f8; }\n        .system-message { border-color: #e0e0e0; color: #666; font-size: 0.85rem; margin: 0 auto 0.3rem auto; background: #f8f8f8; }\n        .user-name { font-weight: 600; color: #222; margin-left: 0.4rem; }\n        .level-tag { font-size: 0.75rem; color: #666; background: #f0f0f0; padding: 0.1rem 0.4rem; border-radius: 8px; }\n        .tip-amount { color: #e74c3c; font-weight: 600; }\n        .live-header { padding: 16px 20px; border-bottom: 1px solid #eaeaea; display: flex; align-items: center; gap: 15px; background: #fff; }\n        .avatar-container { width: 56px; height: 56px; flex-shrink: 0; }\n        .avatar { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; border: 3px solid #007aff; }\n        .host-info { flex: 1; min-width: 0; }\n        .host-info h2 { font-size: 18px; margin-bottom: 6px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #333; }\n        .status-container { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }\n        .live-badge { display: inline-flex; align-items: center; background: #ff3b30; color: white; padding: 4px 10px; border-radius: 4px; font-size: 12px; font-weight: 600; letter-spacing: 0.3px; }\n        .live-badge::before { content: ''; display: inline-block; width: 6px; height: 6px; background-color: white; border-radius: 50%; margin-right: 6px; animation: blink 1.5s infinite; }\n        @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }\n        .viewer-count { font-size: 13px; color: #666; display: flex; align-items: center; gap: 5px; }\n        .player-container { position: relative; background: #000000; overflow: hidden; }\n        .player-container:fullscreen { display: flex; align-items: center; justify-content: center; }\n        .player-container:-webkit-full-screen { display: flex; align-items: center; justify-content: center; }\n        #dplayer { width: 100% !important; height: 100% !important; display: flex; align-items: center; }\n        #dplayer video { object-fit: contain !important; }\n        .dplayer-controller { display: none !important; }\n        .dplayer-notice { display: none !important; }\n        .custom-controls { position: absolute; bottom: 0; left: 0; right: 0; padding: 12px 15px 6px; display: flex; align-items: center; justify-content: space-between; opacity: 0; transition: opacity 0.2s; z-index: 1000; pointer-events: none; }\n        .player-container.controls-visible .custom-controls { opacity: 1; pointer-events: auto; }\n        .player-container.controls-hidden .custom-controls { opacity: 0; pointer-events: none; }\n        .left-controls, .right-controls { display: flex; align-items: center; gap: 8px; pointer-events: auto; }\n        .rotate-btn { background: rgba(255, 255, 255, 0.15); border: 1px solid rgba(255, 255, 255, 0.25); color: rgba(255, 255, 255, 0.9); padding: 6px 10px; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 500; white-space: nowrap; display: flex; align-items: center; justify-content: center; transition: all 0.15s; min-width: 52px; pointer-events: auto; }\n        .rotate-btn:hover { background: rgba(255, 255, 255, 0.25); color: white; }\n        .control-btn { background: rgba(255, 255, 255, 0.15); border: 1px solid rgba(255, 255, 255, 0.25); color: #ffffff; width: 36px; height: 36px; border-radius: 6px; display: flex; align-items: center; justify-content: center; cursor: pointer; font-size: 16px; transition: all 0.15s; pointer-events: auto; }\n        .control-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n        .selector-btn { background: rgba(255, 255, 255, 0.15); border: 1px solid rgba(255, 255, 255, 0.25); color: #ffffff; padding: 6px 10px; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 500; white-space: nowrap; display: flex; align-items: center; gap: 5px; transition: all 0.15s; min-width: 65px; justify-content: center; pointer-events: auto; }\n        .selector-menu { position: absolute; bottom: 42px; background: #ffffff; border-radius: 8px; min-width: 90px; display: none; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16); border: 1px solid #d1d1d6; overflow: hidden; z-index: 1001; pointer-events: auto; }\n        .menu-item { padding: 8px 12px; color: #333; cursor: pointer; font-size: 13px; transition: all 0.15s; border-bottom: 1px solid #eaeaea; display: flex; align-items: center; justify-content: space-between; pointer-events: auto; }\n        .menu-item:last-child { border-bottom: none; }\n        .menu-item:hover:not(:disabled) { background: #007aff; color: white; }\n        .menu-item.active { background: rgba(10, 132, 255, 0.1); color: #007aff; }\n        .menu-item.active:after { content: \"✓\"; font-size: 12px; color: #007aff; }\n        .loading-indicator { position: absolute; top: 15px; left: 15px; background: rgba(0, 0, 0, 0.8); color: white; padding: 6px 12px; border-radius: 4px; font-size: 12px; z-index: 1002; display: none; border: 1px solid rgba(255, 255, 255, 0.1); }\n        .floating-button { position: fixed; bottom: 20px; right: 20px; width: 60px; height: 60px; border-radius: 50%; background: #007aff; color: white; display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 4px 12px rgba(0, 122, 255, 0.3); z-index: 10000; border: none; font-size: 24px; }\n        .floating-panel { position: fixed; bottom: 90px; right: 20px; width: 400px; background: #ffffff; border-radius: 12px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); padding: 20px; z-index: 9999; border: 1px solid #eaeaea; display: none; max-height: 80vh; overflow-y: auto; }\n        .floating-panel::-webkit-scrollbar { width: 6px; }\n        .floating-panel::-webkit-scrollbar-track { background: #f0f0f0; border-radius: 3px; }\n        .floating-panel::-webkit-scrollbar-thumb { background: #c0c0c0; border-radius: 3px; }\n        .floating-panel-title { font-size: 18px; font-weight: 600; margin-bottom: 15px; color: #333; padding-bottom: 10px; border-bottom: 1px solid #eaeaea; }\n        .floating-info-section { margin-bottom: 20px; }\n        .floating-info-section-title { font-size: 15px; color: #007aff; margin-bottom: 12px; font-weight: 600; display: flex; align-items: center; gap: 8px; }\n        .floating-info-item { margin-bottom: 12px; display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #f5f5f5; }\n        .floating-info-item:last-child { border-bottom: none; margin-bottom: 0; }\n        .floating-info-label { font-size: 13px; color: #666; min-width: 120px; }\n        .floating-info-value { font-size: 14px; color: #333; font-weight: 500; text-align: right; flex: 1; }\n        .floating-content { background: #f8f9fa; border: 1px solid #eaeaea; border-radius: 8px; padding: 12px; font-size: 14px; color: #333; line-height: 1.5; margin-bottom: 15px; }\n        .floating-price-list { display: flex; flex-direction: column; gap: 8px; }\n        .floating-price-item { background: #ffffff; border: 1px solid #eaeaea; border-radius: 8px; padding: 10px 12px; display: flex; align-items: center; justify-content: space-between; transition: all 0.2s; }\n        .floating-price-item:hover { border-color: #007aff; }\n        .floating-price-activity { font-size: 14px; color: #333; flex: 1; }\n        .floating-price-value { font-size: 14px; color: #ff3b30; font-weight: 600; }\n        @media (max-width: 768px) {\n            .floating-panel { width: 350px; right: 10px; bottom: 80px; }\n            .floating-button { width: 50px; height: 50px; font-size: 20px; right: 15px; bottom: 15px; }\n            .live-header { padding: 14px 16px; }\n            .avatar-container { width: 48px; height: 48px; }\n            .host-info h2 { font-size: 16px; }\n        }\n        @media (max-width: 480px) {\n            .floating-panel { width: 300px; }\n            .chat-section { height: 400px; }\n            .app-container { padding: 0.5rem; gap: 1rem; }\n        }\n    </style>\n<body>\n    <div id=\"config\" style=\"display:none;\">\n        <div id=\"liveData\" style=\"display:none;\">{{result}}</div>\n    </div>\n    \n    <div class=\"app-container\">\n        <div class=\"live-section\">\n            <div class=\"topic-section\" id=\"topicContainer\">\n                <div class=\"topic-label\">\n                    <i class=\"fas fa-bullhorn\"></i> 直播标题\n                </div>\n                <div class=\"topic-content\" id=\"topic\"></div>\n            </div>\n            \n            <div class=\"live-header\">\n                <div class=\"avatar-container\">\n                    <img class=\"avatar\" id=\"avatarImg\" src=\"\" alt=\"\">\n                </div>\n                <div class=\"host-info\">\n                    <h2 id=\"hostName\">正在加载...</h2>\n                    <div class=\"status-container\">\n                        <span class=\"live-badge\">直播中</span>\n                        <div class=\"viewer-count\">\n                            <i class=\"fas fa-users\"></i>\n                            <span id=\"membersCount\">--</span> 人\n                        </div>\n                    </div>\n                </div>\n            </div>\n            \n            <div class=\"player-container\" id=\"playerContainer\">\n                <div id=\"dplayer\"></div>\n                <div class=\"loading-indicator\" id=\"loadingIndicator\">正在切换...</div>\n                <div class=\"custom-controls\">\n                    <div class=\"left-controls\">\n                        <button class=\"control-btn\" id=\"refreshBtn\" title=\"刷新播放\">\n                            <i class=\"fas fa-redo-alt\"></i>\n                        </button>\n                        <button class=\"control-btn\" id=\"volumeBtn\" title=\"静音/取消静音\">\n                            <i class=\"fas fa-volume-up\"></i>\n                        </button>\n                        <div class=\"rotate-btn\" id=\"rotateBtn\">竖屏</div>\n                    </div>\n                    <div class=\"right-controls\">\n                        <div class=\"line-selector\">\n                            <div class=\"selector-btn\" id=\"lineBtn\" title=\"选择线路\">线路1 <i class=\"fas fa-chevron-down\"></i></div>\n                            <div class=\"selector-menu\" id=\"lineMenu\"></div>\n                        </div>\n                        <div class=\"quality-selector\">\n                            <div class=\"selector-btn\" id=\"qualityBtn\" title=\"选择清晰度\">默认 <i class=\"fas fa-chevron-down\"></i></div>\n                            <div class=\"selector-menu\" id=\"qualityMenu\"></div>\n                        </div>\n                        <button class=\"control-btn\" id=\"fullscreenBtn\" title=\"全屏\">\n                            <i class=\"fas fa-expand\"></i>\n                        </button>\n                    </div>\n                </div>\n            </div>\n        </div>\n        \n        <div class=\"chat-section\">\n             <div class=\"chat-messages\" id=\"chatContainer\"></div>\n        </div>\n    </div>\n    \n    <button class=\"floating-button\" id=\"floatingBtn\">\n        <i class=\"fas fa-info\"></i>\n    </button>\n    \n    <div class=\"floating-panel\" id=\"floatingPanel\">\n        <div class=\"floating-panel-title\">直播信息</div>\n        \n        <div class=\"floating-info-section\">\n            <div class=\"floating-info-section-title\">\n                <i class=\"fas fa-user\"></i> 主播信息\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\">主播名称:</span>\n                <span class=\"floating-info-value\" id=\"floatingHostName\">--</span>\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\">历史最高排行:</span>\n                <span class=\"floating-info-value\" id=\"floatingTopBestPlace\">--</span>\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\">总人数:</span>\n                <span class=\"floating-info-value\" id=\"floatingMembersCount\">--</span>\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\">首次开播日期:</span>\n                <span class=\"floating-info-value\" id=\"floatingTipMenuCreatedAt\">--</span>\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\" id=\"floatingDurationLabel\">时长标签:</span>\n                <span class=\"floating-info-value\" id=\"floatingDuration\">--</span>\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\" id=\"floatingTimeLabel\">时间标签:</span>\n                <span class=\"floating-info-value\" id=\"floatingStatusTime\">--</span>\n            </div>\n        </div>\n        \n        <div class=\"floating-info-section\" id=\"floatingUserDescriptionSection\">\n            <div class=\"floating-info-section-title\">\n                <i class=\"fas fa-user-circle\"></i> 主播介绍\n            </div>\n            <div class=\"floating-content\" id=\"floatingUserDescription\"></div>\n        </div>\n        \n        <div class=\"floating-info-section\" id=\"floatingGoalSection\">\n            <div class=\"floating-info-section-title\">\n                <i class=\"fas fa-bullseye\"></i> 直播目标\n            </div>\n            <div class=\"floating-content\" id=\"floatingGoalDescription\"></div>\n        </div>\n        \n        <div class=\"floating-info-section\" id=\"floatingFanClubSection\">\n            <div class=\"floating-info-section-title\">\n                <i class=\"fas fa-users\"></i> 粉丝团留言\n            </div>\n            <div class=\"floating-content\" id=\"floatingFanClubDescription\"></div>\n        </div>\n        \n        <div class=\"floating-info-section\">\n            <div class=\"floating-info-section-title\">\n                <i class=\"fas fa-gift\"></i> 打赏菜单\n            </div>\n            <div class=\"floating-price-list\" id=\"floatingPriceList\"></div>\n        </div>\n        \n        <div class=\"floating-info-section\">\n            <div class=\"floating-info-section-title\">\n                <i class=\"fas fa-tv\"></i> 播放设置\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\">当前线路:</span>\n                <span class=\"floating-info-value\" id=\"floatingLine\">线路1</span>\n            </div>\n            <div class=\"floating-info-item\">\n                <span class=\"floating-info-label\">清晰度:</span>\n                <span class=\"floating-info-value\" id=\"floatingQuality\">默认</span>\n            </div>\n        </div>\n    </div>\n\n    <script src=\"https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/hls.js@1.4.10/dist/hls.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/js/all.min.js\"></script>\n    <script>\n        const liveDataElement = document.getElementById('liveData');\n        let liveData = {};\n        \n        if (liveDataElement.textContent) {\n            try {\n                liveData = JSON.parse(liveDataElement.textContent);\n            } catch (e) {}\n        }\n        \n        const chatContainer = document.getElementById('chatContainer');\n        let chatWs = null;\n\n        function addSystemMessage(text) {\n            const systemDiv = document.createElement('div');\n            systemDiv.className = 'message-item system-message';\n            systemDiv.textContent = text;\n            chatContainer.prepend(systemDiv);\n            chatContainer.scrollTop = 0;\n        }\n        \n        function initChat() {\n            if (!liveData.modelId || !liveData.websocketUrl || !liveData.websocketToken) return;\n\n            addSystemMessage('开始连接弹幕服务器');\n            \n            const timeoutMs = 10000;\n            let connectTimeoutTimer = setTimeout(() => {\n                if (chatWs && chatWs.readyState !== WebSocket.OPEN) {\n                    chatWs.close();\n                    addSystemMessage('连接超时：未能成功连接弹幕服务器');\n                }\n            }, timeoutMs);\n            \n            if (chatWs && chatWs.readyState === WebSocket.OPEN) {\n                chatWs.close();\n            }\n            \n            chatWs = new WebSocket(`${liveData.websocketUrl}`);\n            const sendQueue = [\n                '{\"connect\":{\"token\":\"' + liveData.websocketToken + '\"},\"id\":1}',\n                `{\"subscribe\":{\"channel\":\"newChatMessage@${liveData.modelId}\"},\"id\":2}`\n            ];\n            \n            function getUserLevelTag(userData) {\n                return userData?.userRanking?.level ? `<span class=\"level-tag\">Lv.${userData.userRanking.level}</span>` : '';\n            }\n            \n            function createMessageElement(data) {\n                const messageDiv = document.createElement('div');\n                messageDiv.className = 'message-item';\n                \n                const { type, userData, details } = data.message;\n                const levelTag = getUserLevelTag(userData);\n                \n                let content = '';\n                switch(type) {\n                    case 'text':\n                        messageDiv.className += ' text-item';\n                        content = `${levelTag}<span class=\"user-name\">${userData.username}</span>: ${details.body}`;\n                        break;\n                    case 'tip':\n                        messageDiv.className += ' tip-item';\n                        content = `${levelTag}<span class=\"user-name\">${userData.username}</span>: 已支付<span class=\"tip-amount\">${details.amount}</span>代币`;\n                        break;\n                    case 'lovense':\n                        messageDiv.className += ' lovense-item';\n                        const { power, time, amount } = details.lovenseDetails.detail;\n                        const powerText = power === 'low' ? '低' : power === 'medium' ? '中' : '高';\n                        const clientLevelTag = getUserLevelTag(details.lovenseDetails.clientUserInfo);\n                        content = `${clientLevelTag}<span class=\"user-name\">${details.lovenseDetails.clientUserInfo.username}</span>: ${powerText}强度 · ${time}秒`;\n                        break;\n                    default:\n                        return null;\n                }\n                \n                messageDiv.innerHTML = content;\n                return messageDiv;\n            }\n            \n            function addMessageToPanel(messageData) {\n                const messageElement = createMessageElement(messageData);\n                if (messageElement) {\n                    const messageWrapper = document.createElement('div');\n                    messageWrapper.className = 'message-wrapper';\n                    messageWrapper.appendChild(messageElement);\n                    chatContainer.prepend(messageWrapper);\n                    chatContainer.scrollTop = 0;\n                }\n            }\n            \n            chatWs.onopen = () => {\n                clearTimeout(connectTimeoutTimer);\n                sendQueue.forEach(cmd => chatWs.send(cmd));\n                addSystemMessage('弹幕服务器连接正常');\n            };\n            \n            chatWs.onmessage = (e) => {\n                if (e.data.trim() === '{}') {\n                    chatWs.send('{}');\n                    return;\n                }\n                try {\n                    const data = JSON.parse(e.data);\n                    if (data.ping) {\n                        chatWs.send(JSON.stringify({ pong: data.ping }));\n                    }\n                    if (data.push?.channel === `newChatMessage@${liveData.modelId}`) {\n                        addMessageToPanel(data.push.pub.data);\n                    }\n                } catch (error) {}\n            };\n            \n            chatWs.onerror = (err) => {\n                const errorDiv = document.createElement('div');\n                errorDiv.className = 'message-item system-message';\n                errorDiv.textContent = '连接错误';\n                chatContainer.prepend(errorDiv);\n                chatContainer.scrollTop = 0;\n            };\n            \n            chatWs.onclose = (e) => {\n                const closeDiv = document.createElement('div');\n                closeDiv.className = 'message-item system-message';\n                closeDiv.textContent = `连接关闭 | 错误码: ${e.code}`;\n                chatContainer.prepend(closeDiv);\n                chatContainer.scrollTop = 0;\n            };\n        }\n        \n        const elements = {\n            avatarImg: document.getElementById('avatarImg'),\n            hostName: document.getElementById('hostName'),\n            refreshBtn: document.getElementById('refreshBtn'),\n            volumeBtn: document.getElementById('volumeBtn'),\n            lineBtn: document.getElementById('lineBtn'),\n            lineMenu: document.getElementById('lineMenu'),\n            qualityBtn: document.getElementById('qualityBtn'),\n            qualityMenu: document.getElementById('qualityMenu'),\n            fullscreenBtn: document.getElementById('fullscreenBtn'),\n            loadingIndicator: document.getElementById('loadingIndicator'),\n            playerContainer: document.getElementById('playerContainer'),\n            membersCount: document.getElementById('membersCount'),\n            floatingBtn: document.getElementById('floatingBtn'),\n            floatingPanel: document.getElementById('floatingPanel'),\n            floatingHostName: document.getElementById('floatingHostName'),\n            floatingTopBestPlace: document.getElementById('floatingTopBestPlace'),\n            floatingMembersCount: document.getElementById('floatingMembersCount'),\n            floatingTipMenuCreatedAt: document.getElementById('floatingTipMenuCreatedAt'),\n            floatingTopic: document.getElementById('floatingTopic'),\n            floatingTopicSection: document.getElementById('floatingTopicSection'),\n            floatingGoalDescription: document.getElementById('floatingGoalDescription'),\n            floatingGoalSection: document.getElementById('floatingGoalSection'),\n            floatingUserDescription: document.getElementById('floatingUserDescription'),\n            floatingUserDescriptionSection: document.getElementById('floatingUserDescriptionSection'),\n            floatingFanClubDescription: document.getElementById('floatingFanClubDescription'),\n            floatingFanClubSection: document.getElementById('floatingFanClubSection'),\n            floatingPriceList: document.getElementById('floatingPriceList'),\n            floatingDurationLabel: document.getElementById('floatingDurationLabel'),\n            floatingDuration: document.getElementById('floatingDuration'),\n            floatingTimeLabel: document.getElementById('floatingTimeLabel'),\n            floatingStatusTime: document.getElementById('floatingStatusTime'),\n            floatingLine: document.getElementById('floatingLine'),\n            floatingQuality: document.getElementById('floatingQuality'),\n            topicContainer: document.getElementById('topicContainer'),\n            topic: document.getElementById('topic'),\n            rotateBtn: document.getElementById('rotateBtn')\n        };\n        \n        let dp = null;\n        let isMuted = false;\n        let isFullscreen = false;\n        let hlsInstance = null;\n        let durationInterval = null;\n        let config = {};\n        let hideControlsTimer = null;\n        \n        const getStreamUrl = (lineIndex = config.currentLine || 0, quality = config.currentQuality || 'auto') => {\n            const line = config.hlsLines?.[lineIndex];\n            if (!line || !config.stream) return '';\n            \n            const pureStatus = (config.status || '').toLowerCase();\n            let suffix = '_auto';\n            \n            if (pureStatus !== 'public') {\n                suffix = '_160p_blurred';\n            } else if (quality === 'auto') {\n                suffix = '_auto';\n            } else {\n                suffix = '_' + quality;\n            }\n            \n            return `https://edge-hls.${line}/hls/${config.stream}/master/${config.stream}${suffix}.m3u8?pkey=bXorqTB5ZhP5FcpX`;\n        };\n        \n        function showControls() {\n            elements.playerContainer.classList.remove('controls-hidden');\n            elements.playerContainer.classList.add('controls-visible');\n            if (hideControlsTimer) {\n                clearTimeout(hideControlsTimer);\n            }\n            hideControlsTimer = setTimeout(() => {\n                elements.playerContainer.classList.remove('controls-visible');\n                elements.playerContainer.classList.add('controls-hidden');\n            }, 3000);\n        }\n        \n        function switchStream(url) {\n            if (!dp || !dp.video || !url) return;\n            \n            config.isSwitching = true;\n            elements.loadingIndicator.style.display = 'block';\n            showControls();\n            \n            const video = dp.video;\n            video.pause();\n            video.src = '';\n            video.load();\n            \n            if (hlsInstance) {\n                try {\n                    hlsInstance.stopLoad();\n                    setTimeout(() => {\n                        hlsInstance.destroy();\n                        hlsInstance = null;\n                        startNewStream(url, video);\n                    }, 50);\n                } catch (e) {\n                    hlsInstance.destroy();\n                    hlsInstance = null;\n                    startNewStream(url, video);\n                }\n            } else {\n                startNewStream(url, video);\n            }\n        }\n        \n        function startNewStream(url, video) {\n            video.src = url;\n            \n            if (Hls.isSupported()) {\n                hlsInstance = new Hls({\n                    enableWorker: true,\n                    lowLatencyMode: true,\n                    backBufferLength: 60,\n                    maxBufferSize: 30 * 1000 * 1000,\n                    maxBufferLength: 30\n                });\n                \n                hlsInstance.loadSource(url);\n                hlsInstance.attachMedia(video);\n                \n                hlsInstance.on(Hls.Events.MANIFEST_PARSED, () => {\n                    completeSwitch();\n                    video.play().catch(e => {});\n                });\n                \n                hlsInstance.on(Hls.Events.ERROR, (event, data) => {\n                    if (data.fatal) {\n                        switch(data.type) {\n                            case Hls.ErrorTypes.NETWORK_ERROR:\n                                hlsInstance.startLoad();\n                                break;\n                            case Hls.ErrorTypes.MEDIA_ERROR:\n                                hlsInstance.recoverMediaError();\n                                break;\n                            default:\n                                completeSwitch();\n                                break;\n                        }\n                    }\n                });\n                \n                setTimeout(() => {\n                    if (config.isSwitching) {\n                        completeSwitch();\n                    }\n                }, 5000);\n                \n            } else if (video.canPlayType('application/vnd.apple.mpegurl')) {\n                video.addEventListener('loadedmetadata', () => {\n                    completeSwitch();\n                    video.play().catch(e => {});\n                });\n                \n                video.addEventListener('error', () => {\n                    completeSwitch();\n                });\n                \n                setTimeout(() => {\n                    if (config.isSwitching) {\n                        completeSwitch();\n                    }\n                }, 5000);\n            } else {\n                completeSwitch();\n            }\n        }\n        \n        function completeSwitch() {\n            config.isSwitching = false;\n            elements.loadingIndicator.style.display = 'none';\n        }\n        \n        function initPlayer() {\n            config = { ...liveData, currentLine: 0, currentQuality: 'auto', isSwitching: false };\n            \n            const url = getStreamUrl();\n            if (!url) return;\n            \n            if (dp) {\n                dp.destroy();\n                dp = null;\n            }\n            \n            dp = new DPlayer({\n                container: document.getElementById('dplayer'),\n                live: true,\n                autoplay: true,\n                theme: '#00a1d6',\n                loop: false,\n                lang: 'zh-cn',\n                screenshot: false,\n                hotkey: false,\n                preload: 'auto',\n                volume: 0.7,\n                mutex: true,\n                controls: false,\n                video: {\n                    url: url,\n                    pic: config.coverImg,\n                    type: 'customHls',\n                    customType: {\n                        customHls: function(video, player) {}\n                    }\n                },\n                contextmenu: [],\n                danmaku: false\n            });\n            \n            const videoElement = dp.video;\n            if (videoElement) {\n                videoElement.style.pointerEvents = 'none';\n                videoElement.addEventListener('click', function(e) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    return false;\n                });\n            }\n            \n            const dplayerContainer = dp.container;\n            dplayerContainer.style.pointerEvents = 'none';\n            dplayerContainer.addEventListener('click', function(e) {\n                e.preventDefault();\n                e.stopPropagation();\n                return false;\n            });\n            \n            isMuted = dp.video.muted;\n            elements.volumeBtn.innerHTML = isMuted \n                ? '<i class=\"fas fa-volume-mute\"></i>'\n                : '<i class=\"fas fa-volume-up\"></i>';\n            \n            switchStream(url);\n        }\n\n        function refreshPlayer() {\n            if (config.isSwitching || !config.stream) return;\n            const url = getStreamUrl(config.currentLine, config.currentQuality);\n            switchStream(url);\n        }\n        \n        function switchLine(lineIndex) {\n            if (config.isSwitching || !config.hlsLines || lineIndex >= config.hlsLines.length) return;\n            config.currentLine = lineIndex;\n            elements.lineBtn.innerHTML = `线路${lineIndex + 1} <i class=\"fas fa-chevron-down\"></i>`;\n            elements.floatingLine.textContent = `线路${lineIndex + 1}`;\n            updateLineMenuHighlights();\n            elements.lineMenu.style.display = 'none';\n            \n            const url = getStreamUrl(lineIndex, config.currentQuality);\n            switchStream(url);\n        }\n        \n        function switchQuality(quality) {\n            if (config.isSwitching) return;\n            config.currentQuality = quality;\n            const displayText = quality === 'auto' ? '默认' : quality;\n            elements.qualityBtn.innerHTML = `${displayText} <i class=\"fas fa-chevron-down\"></i>`;\n            elements.floatingQuality.textContent = displayText;\n            updateQualityMenuHighlights();\n            elements.qualityMenu.style.display = 'none';\n            \n            const url = getStreamUrl(config.currentLine, quality);\n            switchStream(url);\n        }\n        \n        function formatDuration(seconds) {\n            if (!seconds) return '0秒';\n            \n            const days = Math.floor(seconds / (24 * 60 * 60));\n            const hours = Math.floor((seconds % (24 * 60 * 60)) / (60 * 60));\n            const minutes = Math.floor((seconds % (60 * 60)) / 60);\n            const secs = Math.floor(seconds % 60);\n            \n            let result = '';\n            if (days > 0) result += `${days}天`;\n            if (hours > 0) result += `${hours}小时`;\n            if (minutes > 0) result += `${minutes}分钟`;\n            if (secs > 0 || result === '') result += `${secs}秒`;\n            \n            return result;\n        }\n        \n        function updateTimeInfo() {\n            if (!config.status || !config.startTime) return;\n            \n            const pureStatus = config.status.replace(/^状态：/, '').toLowerCase();\n            const isPublic = pureStatus === 'public';\n            const startTime = config.startTime ? new Date(config.startTime).getTime() : null;\n            const now = Date.now();\n            \n            if (config.isLive && startTime) {\n                if (isPublic) {\n                    elements.floatingDurationLabel.textContent = '直播时长:';\n                    elements.floatingTimeLabel.textContent = '直播时间:';\n                    \n                    const duration = Math.floor((now - startTime) / 1000);\n                    const durationText = formatDuration(duration);\n                    elements.floatingDuration.textContent = durationText;\n                    \n                    const startDate = new Date(startTime);\n                    elements.floatingStatusTime.textContent = startDate.toLocaleString();\n                } else {\n                    elements.floatingDurationLabel.textContent = '持续时长:';\n                    elements.floatingTimeLabel.textContent = '私密直播:';\n                    \n                    const duration = Math.floor((now - startTime) / 1000);\n                    const durationText = formatDuration(duration);\n                    elements.floatingDuration.textContent = durationText;\n                    \n                    const startDate = new Date(startTime);\n                    elements.floatingStatusTime.textContent = startDate.toLocaleString();\n                }\n            } else if (startTime) {\n                elements.floatingDurationLabel.textContent = '持续时长:';\n                elements.floatingTimeLabel.textContent = '下播时间:';\n                \n                const duration = Math.floor((now - startTime) / 1000);\n                let durationText = formatDuration(duration);\n                elements.floatingDuration.textContent = durationText;\n                \n                const endDate = new Date(startTime);\n                elements.floatingStatusTime.textContent = endDate.toLocaleString();\n            } else {\n                elements.floatingDuration.textContent = '--';\n                elements.floatingStatusTime.textContent = '--';\n            }\n        }\n        \n        function startDurationUpdate() {\n            if (durationInterval) {\n                clearInterval(durationInterval);\n            }\n            \n            updateTimeInfo();\n            durationInterval = setInterval(updateTimeInfo, 1000);\n        }\n        \n        function updateFloatingPanel() {\n            const pureUsername = (config.username || '').split('/').pop() || config.username || '';\n            elements.floatingHostName.textContent = pureUsername || '未知主播';\n            elements.membersCount.textContent = config.membersCount > 0 ? config.membersCount.toLocaleString() : '--';\n            elements.floatingMembersCount.textContent = config.membersCount > 0 ? config.membersCount.toLocaleString() : '--';\n            \n            if (config.topBestPlace > 0) {\n                const rankText = `TOP ${config.topBestPlace}`;\n                elements.floatingTopBestPlace.textContent = rankText;\n            } else {\n                elements.floatingTopBestPlace.textContent = '未上榜';\n            }\n            \n            if (config.tipMenuCreatedAt) {\n                const createdAt = new Date(config.tipMenuCreatedAt);\n                elements.floatingTipMenuCreatedAt.textContent = createdAt.toLocaleString();\n            } else {\n                elements.floatingTipMenuCreatedAt.textContent = '--';\n            }\n            \n            if (config.userDescription && config.userDescription.trim() !== '') {\n                elements.floatingUserDescription.textContent = config.userDescription;\n                elements.floatingUserDescriptionSection.style.display = 'block';\n            } else {\n                elements.floatingUserDescriptionSection.style.display = 'none';\n            }\n            \n            if (config.goalDescription && config.goalDescription.trim() !== '') {\n                elements.floatingGoalDescription.textContent = config.goalDescription;\n                elements.floatingGoalSection.style.display = 'block';\n            } else {\n                elements.floatingGoalSection.style.display = 'none';\n            }\n            \n            if (config.fanClubDescription && config.fanClubDescription.trim() !== '') {\n                elements.floatingFanClubDescription.textContent = config.fanClubDescription;\n                elements.floatingFanClubSection.style.display = 'block';\n            } else {\n                elements.floatingFanClubSection.style.display = 'none';\n            }\n            \n            if (config.tipMenuPriceList && config.tipMenuPriceList.length > 0) {\n                elements.floatingPriceList.innerHTML = '';\n                config.tipMenuPriceList.forEach((tip) => {\n                    const priceItem = document.createElement('div');\n                    priceItem.className = 'floating-price-item';\n                    \n                    const activityDiv = document.createElement('div');\n                    activityDiv.className = 'floating-price-activity';\n                    activityDiv.textContent = tip.activity || '未命名';\n                    \n                    const priceDiv = document.createElement('div');\n                    priceDiv.className = 'floating-price-value';\n                    priceDiv.textContent = `${tip.price || 0} 代币`;\n                    \n                    priceItem.appendChild(activityDiv);\n                    priceItem.appendChild(priceDiv);\n                    elements.floatingPriceList.appendChild(priceItem);\n                });\n            } else {\n                elements.floatingPriceList.innerHTML = '<div class=\"floating-price-item\"><div class=\"floating-price-activity\">暂无打赏菜单</div></div>';\n            }\n            \n            startDurationUpdate();\n        }\n        \n        function initUI() {\n            const pureUsername = (config.username || '').split('/').pop() || config.username || '';\n            elements.hostName.textContent = pureUsername || '未知主播';\n            \n            if (config.topic && config.topic.trim() !== '') {\n                elements.topic.textContent = config.topic;\n                elements.topicContainer.style.display = 'block';\n                document.title = config.topic;\n            } else {\n                elements.topicContainer.style.display = 'none';\n                document.title = pureUsername || '直播间';\n            }\n            \n            if (config.avatarUrl) {\n                const prefix = 'https://static-cdn.strpst.com';\n                if (config.avatarUrl.startsWith(prefix + prefix)) {\n                    config.avatarUrl = config.avatarUrl.replace(prefix + prefix, prefix);\n                }\n                elements.avatarImg.src = config.avatarUrl;\n            } else {\n                elements.avatarImg.src = '主播';\n            }\n            \n            updateFloatingPanel();\n        }\n        \n        function initLineMenu() {\n            elements.lineMenu.innerHTML = '';\n            \n            if (!config.hlsLines || config.hlsLines.length === 0) {\n                const item = document.createElement('div');\n                item.className = 'menu-item';\n                item.textContent = '无线路';\n                item.style.opacity = '0.6';\n                elements.lineMenu.appendChild(item);\n                return;\n            }\n            \n            config.hlsLines.forEach((line, index) => {\n                const item = document.createElement('div');\n                item.className = `menu-item ${index === config.currentLine ? 'active' : ''}`;\n                item.textContent = `线路${index + 1}`;\n                item.dataset.index = index;\n                item.onclick = (e) => {\n                    e.stopPropagation();\n                    switchLine(index);\n                };\n                elements.lineMenu.appendChild(item);\n            });\n        }\n        \n        function initQualityMenu() {\n            elements.qualityMenu.innerHTML = '';\n            const pureStatus = (config.status || '').replace(/^状态：/, '').toLowerCase();\n            \n            let availableQualities = [];\n            availableQualities.push({ value: 'auto', display: '默认' });\n            \n            if (pureStatus !== 'public') {\n                availableQualities = [{ value: '160p_blurred', display: '模糊' }];\n                config.currentQuality = '160p_blurred';\n            } else if (config.pixelatedResolutions && config.pixelatedResolutions.length > 0) {\n                config.pixelatedResolutions.forEach(resolution => {\n                    if (resolution !== '160p_blurred') {\n                        availableQualities.push({ \n                            value: resolution, \n                            display: resolution \n                        });\n                    }\n                });\n            }\n            \n            availableQualities.forEach((quality) => {\n                const isActive = quality.value === config.currentQuality;\n                const item = document.createElement('div');\n                item.className = `menu-item ${isActive ? 'active' : ''}`;\n                item.textContent = quality.display;\n                item.dataset.quality = quality.value;\n                item.onclick = (e) => {\n                    e.stopPropagation();\n                    switchQuality(quality.value);\n                };\n                elements.qualityMenu.appendChild(item);\n            });\n            \n            const currentQuality = availableQualities.find(q => q.value === config.currentQuality);\n            const displayText = currentQuality ? currentQuality.display : '默认';\n            elements.qualityBtn.innerHTML = `${displayText} <i class=\"fas fa-chevron-down\"></i>`;\n            elements.floatingQuality.textContent = displayText;\n        }\n        \n        function updateLineMenuHighlights() {\n            const items = elements.lineMenu.querySelectorAll('.menu-item');\n            items.forEach((item, index) => {\n                if (index === config.currentLine) {\n                    item.classList.add('active');\n                } else {\n                    item.classList.remove('active');\n                }\n            });\n        }\n        \n        function updateQualityMenuHighlights() {\n            const items = elements.qualityMenu.querySelectorAll('.menu-item');\n            items.forEach((item) => {\n                const quality = item.dataset.quality;\n                if (quality === config.currentQuality) {\n                    item.classList.add('active');\n                } else {\n                    item.classList.remove('active');\n                }\n            });\n        }\n        \n        async function handleRotateClick() {\n            try {\n                if (!document.fullscreenElement) {\n                    await elements.playerContainer.requestFullscreen();\n                }\n                \n                if (screen.orientation) {\n                    const type = screen.orientation.type;\n                    if (type.startsWith('portrait')) {\n                        await screen.orientation.lock('landscape');\n                        elements.rotateBtn.textContent = '横屏';\n                    } else {\n                        await screen.orientation.lock('portrait');\n                        elements.rotateBtn.textContent = '横屏';\n                    }\n                }\n                showControls();\n            } catch (err) {}\n        }\n        \n        function bindEvents() {\n            elements.refreshBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                refreshPlayer();\n                showControls();\n            });\n            \n            elements.volumeBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                if (dp && dp.video && !config.isSwitching) {\n                    isMuted = !isMuted;\n                    dp.video.muted = isMuted;\n                    elements.volumeBtn.innerHTML = isMuted \n                        ? '<i class=\"fas fa-volume-mute\"></i>'\n                        : '<i class=\"fas fa-volume-up\"></i>';\n                }\n                showControls();\n            });\n            \n            elements.fullscreenBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                if (!isFullscreen) {\n                    const container = document.querySelector('.player-container');\n                    if (container.requestFullscreen) {\n                        container.requestFullscreen();\n                    } else if (container.webkitRequestFullscreen) {\n                        container.webkitRequestFullscreen();\n                    }\n                    elements.fullscreenBtn.innerHTML = '<i class=\"fas fa-compress\"></i>';\n                } else {\n                    if (document.exitFullscreen) {\n                        document.exitFullscreen();\n                    } else if (document.webkitExitFullscreen) {\n                        document.webkitExitFullscreen();\n                    }\n                    elements.fullscreenBtn.innerHTML = '<i class=\"fas fa-expand\"></i>';\n                }\n                isFullscreen = !isFullscreen;\n                showControls();\n            });\n            \n            elements.lineBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                elements.lineMenu.style.display = \n                    elements.lineMenu.style.display === 'block' ? 'none' : 'block';\n                elements.qualityMenu.style.display = 'none';\n                updateLineMenuHighlights();\n                showControls();\n            });\n            \n            elements.qualityBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                elements.qualityMenu.style.display = \n                    elements.qualityMenu.style.display === 'block' ? 'none' : 'block';\n                elements.lineMenu.style.display = 'none';\n                updateQualityMenuHighlights();\n                showControls();\n            });\n            \n            elements.rotateBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                handleRotateClick();\n            });\n            \n            elements.playerContainer.addEventListener('touchstart', (e) => {\n                if (e.target.closest('.custom-controls, .selector-menu, .control-btn, .selector-btn, .menu-item, .rotate-btn')) {\n                    showControls();\n                    return;\n                }\n                \n                if (elements.playerContainer.classList.contains('controls-hidden')) {\n                    showControls();\n                } else {\n                    elements.playerContainer.classList.remove('controls-visible');\n                    elements.playerContainer.classList.add('controls-hidden');\n                    if (hideControlsTimer) {\n                        clearTimeout(hideControlsTimer);\n                        hideControlsTimer = null;\n                    }\n                }\n            });\n            \n            document.addEventListener('click', (e) => {\n                if (!e.target.closest('.selector-btn')) {\n                    elements.lineMenu.style.display = 'none';\n                    elements.qualityMenu.style.display = 'none';\n                }\n            });\n            \n            document.addEventListener('fullscreenchange', handleFullscreenChange);\n            document.addEventListener('webkitfullscreenchange', handleFullscreenChange);\n            \n            elements.floatingBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                elements.floatingPanel.style.display = \n                    elements.floatingPanel.style.display === 'block' ? 'none' : 'block';\n            });\n            \n            document.addEventListener('click', (e) => {\n                if (!e.target.closest('.floating-button') && !e.target.closest('.floating-panel')) {\n                    elements.floatingPanel.style.display = 'none';\n                }\n            });\n        }\n        \n        function handleFullscreenChange() {\n            const isFullscreenNow = !!(document.fullscreenElement || \n                document.webkitFullscreenElement);\n            if (!isFullscreenNow) {\n                elements.fullscreenBtn.innerHTML = '<i class=\"fas fa-expand\"></i>';\n                isFullscreen = false;\n            }\n        }\n        \n        function initializeApp() {\n            if (!liveData || Object.keys(liveData).length === 0) return;\n            \n            addSystemMessage('正在读取直播间信息');\n            \n            config = { ...liveData, currentLine: 0, currentQuality: 'auto', isSwitching: false };\n            \n            initUI();\n            initLineMenu();\n            initQualityMenu();\n            initPlayer();\n            bindEvents();\n            initChat();\n            \n            elements.playerContainer.classList.add('controls-visible');\n            showControls();\n        }\n        \n        document.addEventListener('DOMContentLoaded', initializeApp);\n    </script>\n</body>\n</html>",
    "ruleImage": "https://img.doppiocdn.live/thumbs/{$.popularSnapshotTimestamp}/{$..id}_webp",
    "ruleLink": "/{$.username}",
    "rulePubDate": "{$.isLive}观众：{$.viewersCount}人 状态：{$.status}@js:result.replace(/(状态：)public/g, \"$1公开\").replace(/(状态：)(?!公开).+/g, \"$1付费\").replace(/false.*/g, '状态：未直播').replace(/true/g, '')",
    "ruleTitle": "$.username",
    "singleUrl": false,
    "sortUrl": "全部直播::/api/front/v2/models?limit=60&primaryTag=girls\n直播推荐::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"recommended\"]]\n竖屏直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"mobile\"]]\n中文直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"tagLanguageChinese\"]]\n日本直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"tagLanguageJapanese\"]]\n韩国直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"tagLanguageKorean\"]]\n户外直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"doPublicPlace\"]]\n青少年直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"ageTeen\"]]\n俄罗斯直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"tagLanguageRussianSpeaking\"]]\nASMR直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"asmr\"]]\nCOS直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"doCosplay\"]]\n情侣直播::/api/front/models?limit=60&primaryTag=couples\n变性直播::/api/front/models?limit=60&primaryTag=trans\n新人直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"autoTagNew\"]]\n互动玩具::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"autoTagInteractiveToy\"]]\n炮机直播::/api/front/models?limit=60&primaryTag=girls&filterGroupTags=[[\"fuckMachine\"]]",
    "sourceComment": "备用：\nhttps://zh.virtualtaboo.live\nhttps://zh.spiritzone.top\nhttps://zh.stripchat.webcam\nhttps://zh.mywebcamroom.com\nhttps://zh.topcams.tv\nhttps://zh.stripchatgirls.com\nhttps://zh.stripchat.com\nhttps://zh.xhamsterlive.com\nhttps://zh.hotzcam.com\nhttps://zh.tklivechat.com\nhttps://zh.spankbanglive.com\nhttps://zh.live.91pinse.com\npkey=Iecohquahc5RieQu\npkey=bXorqTB5ZhP5FcpX",
    "sourceIcon": "https://i.imgs.ovh/2025/12/29/Cwo6eX.png",
    "sourceName": "Strip直播",
    "sourceUrl": "https://zh.topcams.tv"
  },
  {
    "articleStyle": 0,
    "coverDecodeJs": "java.createSymmetricCrypto(\"AES/CBC/NoPadding\",\"f5d965df75336270\",\"97b60394abc2fbe1\").decrypt(result)",
    "customOrder": 3,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; U; Android 13; zh-Hans-CN; PFJM10 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/135.0.4896.58 Quark/6.13.6.581 Mobile Safari/537.36\",\n\"Accept-Language\":\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"}",
    "lastUpdateTime": 1775584744388,
    "loadWithBaseUrl": true,
    "ruleArticles": "#body>.container>.row>div[role=\"main\"]>article:not(:has(meta[content=\"广告\"]))>a",
    "ruleContent": "@js:\nlet urls = [];\nlet resultStr = String(result);\n\nlet getM3u8 = (html = resultStr) => {\n    let url = /(https?:[^'\"\\s]*?\\.m3u8[^'\"\\s]*)/g;\n    let urlSet = new Set();\n    for (let match of (html.matchAll(url) || [])) {\n  \t   let ul = match[1].replace(/\\\\/g, \"\");\n  \t   urlSet.add(ul);\n    \t};\n    return Array.from(urlSet);\n};\n\n let updateProgress = (current, total) => {\n    let percentage = Math.round(current / total * 10000)/100;\n    let blocks = Math.floor(percentage / 10);\n    let progressBar = \"█\".repeat(blocks) + \"░\".repeat(10 - blocks);\n    java.longToast(`【加载进度】\\n${progressBar} \\n${percentage}%`);\n};\n\nif (/点我/.test(result) && /查看详情/.test(result)) {\n    let list = java.getElements('@@#post>article>.post-content>p>a');\n    let links = Array.from(list).slice(0,-1);\n    let tempUrls = []; \n    links.forEach((link, index) => {\n        updateProgress(index + 1, links.length);\n        \n        let href = String(link.attr('href'));\n        let fullUrl = `${source.key}${href}`;\n        let doc = String(java.ajax(fullUrl));\n        let pageUrls = getM3u8(doc);\n        if (pageUrls.length > 0) {\n            tempUrls = tempUrls.concat(pageUrls);\n        }\n        if (index === links.length - 1) {\n            urls = tempUrls;\n        }\n    })\n} else {\n    urls = getM3u8();\n};\n\n`<html>\n    <head>\n        <meta name=\"viewport\" content=\"width=device-width\">\n        <style>\n            body {\n                margin: 0;\n                font-family: Arial, sans-serif;\n                background: linear-gradient(135deg, #ece9e6, #ffffff);\n                display: flex;\n                flex-direction: column;\n                align-items: center;\n                justify-content: flex-start;\n                padding: 20px;\n            }\n            .container {\n                width: 100%;\n                max-width: 800px;\n                background: #fff;\n                border-radius: 10px;\n                box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n                overflow: hidden;\n                margin-bottom: 20px;\n            }\n            h3 {\n            \t    text-align: center;\n                margin: 0;\n                padding: 10px 20px;\n                font-size: 0.9em;\n                background: #333;\n                color: #fff;\n                border-radius: 10px 10px 0 0;\n            }\n            .video-container {\n                width: 100%;\n                background: #000;\n                position: relative;\n            }\n            video {\n                width: 100%;\n                height: auto;\n                display: block;\n            }\n            .info-container {\n                padding: 20px;\n            }\n            .info-container p {\n                margin: 10px 0;\n                color: #555;\n            }\n            .info-container p span {\n                font-weight: bold;\n                color: #000;\n            }\n            .nav-container {\n                display: flex;\n                justify-content: space-between;\n                align-items: center;\n                padding: 15px 20px;\n                background: #f5f5f5;\n                border-top: 1px solid #ddd;\n            }\n            .nav-button {\n                padding: 10px 20px;\n                background: #007bff;\n                color: white;\n                border: none;\n                border-radius: 5px;\n                cursor: pointer;\n                font-size: 14px;\n            }\n            .nav-button:disabled {\n                background: #6c757d;\n                cursor: not-allowed;\n            }\n            .page-select {\n                padding: 10px 15px;\n                border: 1px solid #ddd;\n                border-radius: 5px;\n                font-size: 14px;\n                background: white;\n                min-width: 120px;\n            }\n            .video-info {\n                text-align: center;\n                padding: 10px;\n                background: #f8f9fa;\n                border-bottom: 1px solid #ddd;\n                font-size: 14px;\n                color: #666;\n            }\n        </style>\n    </head>\n    <body>\n        <div class=\"container\">\n        <h3>当前播放: 第<span id=\"currentVideo\">1</span>集 / 共${urls.length}集</h3>\n            <div class=\"video-container\">\n                <video controls autoplay name=\"media\" id=\"videoPlayer\">\n                    <source src=\"${urls[0] || ''}\" type=\"application/x-mpegURL\">\n                </video>\n            </div>\n            <div class=\"nav-container\">\n                <button class=\"nav-button\" id=\"prevBtn\" onclick=\"changeVideo(-1)\">上一集</button>\n                <select class=\"page-select\" id=\"pageSelect\">\n                    <!-- 选项将通过JavaScript动态生成 -->\n                </select>\n                <button class=\"nav-button\" id=\"nextBtn\" onclick=\"changeVideo(1)\">下一集</button>\n            </div>\n            <div class=\"info-container\">\n            </div>\n        </div>\n\n        <script>\n            // 视频地址数组和当前索引\n            const videoUrls = ${JSON.stringify(urls)};\n            let currentVideoIndex = 0;\n            \n            // 获取DOM元素\n            const video = document.getElementById('videoPlayer');\n            const prevBtn = document.getElementById('prevBtn');\n            const nextBtn = document.getElementById('nextBtn');\n            const pageSelect = document.getElementById('pageSelect');\n            const currentVideoSpan = document.getElementById('currentVideo');\n            \n            // 生成下拉菜单选项\n            function generateSelectOptions() {\n                let optionsHtml = '';\n                for (let i = 0; i < videoUrls.length; i++) {\n                   optionsHtml += '<option value=\"' + i + '\">第' + (i + 1) + '集</option>';\n    };\n                pageSelect.innerHTML = optionsHtml;\n             }\n            \n            // 更新按钮状态和显示\n            function updateButtons() {\n                prevBtn.disabled = currentVideoIndex === 0;\n                nextBtn.disabled = currentVideoIndex === videoUrls.length - 1;\n                pageSelect.value = currentVideoIndex;\n                currentVideoSpan.textContent = currentVideoIndex + 1;\n            }\n            \n            // 切换视频\n            function changeVideo(direction) {\n                const newIndex = currentVideoIndex + direction;\n                if (newIndex >= 0 && newIndex < videoUrls.length) {\n                    currentVideoIndex = newIndex;\n                    video.src = videoUrls[currentVideoIndex];\n                    video.load();\n                    updateButtons();\n                }\n            }\n            \n            // 选择特定视频\n            function selectVideo(index) {\n                const newIndex = parseInt(index);\n                if (newIndex >= 0 && newIndex < videoUrls.length) {\n                    currentVideoIndex = newIndex;\n                    video.src = videoUrls[currentVideoIndex];\n                    video.load();\n                    updateButtons();\n                }\n            }\n            \n            // 初始化按钮状态\n            generateSelectOptions();\n            updateButtons();\n            \n            // 绑定下拉菜单事件\n            pageSelect.addEventListener('change',function() {\n               selectVideo(this.value);\n             });\n            \n            // 触摸控制相关代码\n            let touchStartX = 0;\n            let touchStartY = 0;\n            let touchStartTime = 0;\n            let isLongPress = false;\n\n            // 滑动快进\n            video.addEventListener('touchstart', (e) => {\n                touchStartX = e.touches[0].clientX;\n                touchStartY = e.touches[0].clientY;\n                touchStartTime = Date.now();\n                isLongPress = false;\n            });\n\n            video.addEventListener('touchmove', (e) => {\n                const deltaX = e.touches[0].clientX - touchStartX;\n                const deltaY = e.touches[0].clientY - touchStartY;\n\n                // 如果是水平滑动，且未进入长按状态\n                if (Math.abs(deltaX) > Math.abs(deltaY) && !isLongPress) {\n                    const duration = video.duration;\n                    const seekTime = video.currentTime + (deltaX / 100); // 每滑动100px快进1秒\n                    video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n                }\n            });\n\n            // 长按快进\n            video.addEventListener('touchend', (e) => {\n                const touchEndTime = Date.now();\n                const touchDuration = touchEndTime - touchStartTime;\n\n                // 如果长按时间超过500ms，进入长按快进状态\n                if (touchDuration > 500) {\n                    isLongPress = true;\n                    // 在长按状态下，根据滑动距离快进\n                    const deltaX = e.changedTouches[0].clientX - touchStartX;\n                    const duration = video.duration;\n                    const seekTime = video.currentTime + (deltaX / 100); // 每滑动100px快进1秒\n                    video.currentTime = Math.min(Math.max(seekTime, 0), duration);\n                } else {\n                    isLongPress = false;\n                }\n            });\n\n            // 防止默认行为（如页面滚动）\n            video.addEventListener('touchmove', (e) => {\n                e.preventDefault();\n            });\n        </script>\n    </body>\n</html>`",
    "ruleImage": "@js:\nvar text = java.getString('script@html');\nvar match = text.match(/loadBannerDirect\\('([^']+)'/);\nvar img = match ? match[1] : '';\nimg;",
    "ruleLink": "href",
    "ruleNextPage": "page",
    "rulePubDate": "{{@@.wraps@text}}{{@@.post-card-info span@text##\\n}}",
    "ruleTitle": "h2@text",
    "singleUrl": false,
    "sortUrl": "首页::/page/{{page}}/\n每日大赛::/category/mrds/{{page}}/\n搜索::/search/{{source.getVariable()}}/{{page}}/\n主题大赛::/category/ztds/{{page}}/\n热搜吃瓜::/category/rstt/{{page}}/\n校园学生::/category/xazd/{{page}}/\n必撸大赛::/category/blyp/{{page}}/\n反差泄密::/category/fctg/{{page}}/\n网红黑料::/category/mhds/{{page}}/\n猎奇重口::/category/lqdp/{{page}}/\nAV看片::/category/jdsj/{{page}}/\n明星大赛::/category/mxwh/{{page}}/\n动漫之家::/category/smdh/{{page}}/\n影视国漫::/category/dypd/{{page}}/\ncos写真::/category/mtds/{{page}}/\n声控ASMR::/category/ysds/{{page}}/\n寸止挑战::/category/czds/{{page}}/\n混剪PMV::/category/hjds/{{page}}/\n原创投稿::/category/tgds/{{page}}/\n欧美精品::/category/omjp/{{page}}/\n全网参赛::/category/qwcs/{{page}}/",
    "sourceComment": "发布页: https://www.njttvylz.cc\n最新网址: https://mrds72.com\n永久地址: https://mrds.com\n备用网址: https://mrdsx5.com\n备用线路1: big.ktgchwz.xyz\n备用线路2: adjust.ktgchwz.xyz\n备用线路3: borrow.ktgchwz.xyz\n备用线路4: black.ktgchwz.xyz\n获取地址: mrds.club@gmail.com",
    "sourceGroup": "美涩",
    "sourceIcon": "https://img2.baidu.com/it/u=2497591018,1494490685&fm=253&fmt=auto&app=138&f=JPEG?w=375&h=500",
    "sourceName": "每日大赛",
    "sourceUrl": "https://d3fzqoxno61m61.rnxuiofe.com/",
    "style": "iframe{\n\theight:600px\n}\ntitle{\n\tdisplay:block\n}"
  },
  {
    "articleStyle": 3,
    "customOrder": 10,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 1774624625703,
    "loadWithBaseUrl": true,
    "ruleArticles": ".mb15 a[32:]",
    "ruleContent": "<js>\n// 提取m3u8链接\nvar m3u8Match = result.match(/\"([^\"]*?index\\.m3u8[^\"]*)\"/i) \n             || result.match(/'([^']*?index\\.m3u8[^']*)'/i);\n\nvar p = '';\nif (m3u8Match) {\n    var u = m3u8Match[1]\n        .replace(/\\\\\\//g, '/')      // \\/ → /\n        .replace(/\\\\\\\\/g, '\\\\')      // \\\\ → \\\n        .trim();\n    \n    // 补全协议\n    if (u.startsWith('//')) {\n        u = 'https:' + u;\n    } else if (!u.startsWith('http')) {\n        // 需要基础URL，这里假设当前页面URL在result中或需要传入\n        u = 'https://' + u;  // 简化处理，或根据实际需求调整\n    }\n    p = u;\n}\n\n// 标题：从 span.tx-flex-sh > a 的 title 属性获取\nvar t = java.getString('.f-bold @text') || '未知标题';\n\n// 标签：从 meta[name=\"description\"] 的 content 获取  \nvar b = java.getString('meta[name=\"description\"]@content').replace(\"站点域名:rensgynyn.xyz\",\"\") || '';\nvar updateIndex = b.indexOf('更新时间');\nif (updateIndex !== -1) {\nvar d = b.substring(updateIndex);  // 保留\"更新时间\"及之后的内容\n}\n\n`<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>${t}</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,sans-serif;background:#f0f9ff;padding:10px}\n.v-box{max-width:800px;margin:0 auto;background:white;border-radius:12px;box-shadow:0 5px 15px rgba(0,0,0,0.1);overflow:hidden}\n.header{padding:12px;border-bottom:1px solid #eee;display:flex;flex-wrap:wrap;justify-content:space-between}\n.title{font-size:18px;font-weight:600;margin-bottom:8px;width:100%}\n.tags{color:#5f6368;font-size:14px;flex:1;min-width:60%;word-break:break-all}\n.time{color:#5f6368;font-size:14px;text-align:right;flex-basis:35%}\n.v-wrap{position:relative;padding-top:56.25%;background:#000}\n.video{position:absolute;top:0;left:0;width:100%;height:100%}\n.footer{padding:8px;text-align:center;color:#5f6368;font-size:13px}\n.info-box{padding:15px;font-size:14px;line-height:1.6}\n.info-box p{margin:8px 0}\n.hint{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.7);color:#fff;padding:12px 20px;border-radius:20px;font-size:1.1rem;z-index:10;display:none}\n.controls{position:absolute;top:0;left:0;width:100%;height:4px;background:rgba(255,255,255,0.3);z-index:5;transition:opacity 0.3s}\n.progress{height:100%;background:#4a9eff;width:0}\n</style>\n</head>\n<body>\n<div class=\"v-box\">\n<div class=\"header\">\n<div class=\"title\">${t}</div>\n<div class=\"tags\">${d}</div>\n<div class=\"time\" id=\"timeDisplay\">00:00/00:00</div></div>\n<div class=\"v-wrap\">\n<div class=\"controls\"><div class=\"progress\" id=\"progressBar\"></div></div>\n<div class=\"hint\" id=\"hint\">快进中 &gt;&gt;</div>\n<video class=\"video\" id=\"v\" controls playsinline>\n<source src=\"${p}\" type=\"application/x-mpegURL\">您的浏览器不支持HTML5视频\n</video>\n</div>\n<div class=\"footer\">滑动调整进度 | 长按2倍速</div>\n</div>\n<script>\nvar v = document.getElementById('v');\nvar tDisplay = document.getElementById('timeDisplay');\nvar pBar = document.getElementById('progressBar');\nvar hint = document.getElementById('hint');\nvar startX = 0, startTime = 0;\nvar longPressTimer;\nvar sensitivity = 0.1;\nvar longPressTime = 500;\nvar hintDuration = 2000;\nfunction updateTime() {\nif (!v.duration) return;\nvar m1 = Math.floor(v.currentTime / 60);\nvar s1 = Math.floor(v.currentTime % 60);\nvar m2 = Math.floor(v.duration / 60);\nvar s2 = Math.floor(v.duration % 60);\ntDisplay.textContent = m1 + ':' + (s1 < 10 ? '0' : '') + s1 + '/' + m2 + ':' + (s2 < 10 ? '0' : '') + s2;\npBar.style.width = (v.currentTime / v.duration) * 100 + '%';}\nv.addEventListener('timeupdate', updateTime);\nv.addEventListener('loadedmetadata', updateTime);\nv.addEventListener('touchstart', function(e) {\nstartX = e.touches[0].clientX;\nstartTime = Date.now();\nif (longPressTimer) clearTimeout(longPressTimer);\nhint.style.display = 'none';\nlongPressTimer = setTimeout(function() {\nv.playbackRate = 2.0;\nhint.style.display = 'block';\nsetTimeout(function() { hint.style.display = 'none'; }, hintDuration);}, longPressTime);});\nv.addEventListener('touchmove', function(e) {\ne.preventDefault();\nclearTimeout(longPressTimer);\nvar diffX = e.touches[0].clientX - startX;\nvar change = diffX * sensitivity * v.duration / 100;\nv.currentTime = Math.max(0, Math.min(v.currentTime + change, v.duration));\nstartX = e.touches[0].clientX;updateTime();});\nv.addEventListener('touchend', function() {\nv.playbackRate = 1.0;\nclearTimeout(longPressTimer);});\n</script>\n</body>\n</html>`\n</js>\n",
    "ruleImage": "img@src",
    "ruleLink": "a.0@href<js> resutl='https://rensgyn1.lol'+result</js><js>\nresult=result.replace('dis', '');\n</js>\n",
    "ruleNextPage": ".pageitem.-1@href",
    "rulePubDate": "time@text",
    "ruleTitle": "a@title",
    "shouldOverrideUrlLoading": "true",
    "singleUrl": false,
    "sortUrl": "国产视频::https://rensgyn1.lol/sort/223.html\n精品推荐::https://rensgyn1.lol/sort/224.html\n国产色情::https://rensgyn1.lol/sort/225.html\n中文字幕::https://rensgyn1.lol/sort/226.html\n主播直播::https://rensgyn1.lol/sort/227.html\n国产传媒::https://rensgyn1.lol/sort/228.html\n亚洲无码::https://rensgyn1.lol/sort/229.html\n日本有码::https://rensgyn1.lol/sort/230.html\n亚洲有码::https://rensgyn1.lol/sort/231.html\n日本无码::https://rensgyn1.lol/sort/232.html\n中文有码::https://rensgyn1.lol/sort/233.html\n欧美无码::https://rensgyn1.lol/sort/234.html\n巨乳美乳::https://rensgyn1.lol/sort/235.html\n强奸乱伦::https://rensgyn1.lol/sort/236.html\n人妻系列::https://rensgyn1.lol/sort/237.html\n制服诱惑::https://rensgyn1.lol/sort/238.html\n强奸精品::https://rensgyn1.lol/sort/239.html\n直播主播::https://rensgyn1.lol/sort/240.html\n欧美精品::https://rensgyn1.lol/sort/241.html\n激情动漫::https://rensgyn1.lol/sort/242.html\n萝莉少女::https://rensgyn1.lol/sort/243.html\n明星换脸::https://rensgyn1.lol/sort/244.html\n伦理三级::https://rensgyn1.lol/sort/245.html\n抖阴视频::https://rensgyn1.lol/sort/246.html\n女优明星::https://rensgyn1.lol/sort/248.html\n自拍偷拍::https://rensgyn1.lol/sort/249.html\n视频一区::https://rensgyn1.lol/sort/250.html\n制服丝袜::https://rensgyn1.lol/sort/251.html\n视频二区::https://rensgyn1.lol/sort/252.html\n口交颜射::https://rensgyn1.lol/sort/253.html\n网-曝-门::https://rensgyn1.lol/sort/254.html\n日本精品::https://rensgyn1.lol/sort/255.html\n视频三区::https://rensgyn1.lol/sort/256.html\nCosplay::https://rensgyn1.lol/sort/257.html\n伦理三级::https://rensgyn1.lol/sort/258.html\n素人自拍::https://rensgyn1.lol/sort/259.html\nAV解说::https://rensgyn1.lol/sort/260.html\n台湾辣妹::https://rensgyn1.lol/sort/261.html\nSM调教::https://rensgyn1.lol/sort/262.html\n韩国御姐::https://rensgyn1.lol/sort/263.html\n萝莉少女::https://rensgyn1.lol/sort/264.html\n唯美港姐::https://rensgyn1.lol/sort/265.html\n东南亚AV::https://rensgyn1.lol/sort/267.html\n女同性恋::https://rensgyn1.lol/sort/268.html\n欺辱凌辱::https://rensgyn1.lol/sort/269.html\n玩偶姐姐::https://rensgyn1.lol/sort/270.html\n剧情介绍::https://rensgyn1.lol/sort/271.html\n视频四区::https://rensgyn1.lol/sort/272.html\n多人多P::https://rensgyn1.lol/sort/273.html\n人妖系列::https://rensgyn1.lol/sort/274.html\n91探花::https://rensgyn1.lol/sort/275.html\n网红流出::https://rensgyn1.lol/sort/276.html\n野外露出::https://rensgyn1.lol/sort/277.html\n古装扮演::https://rensgyn1.lol/sort/278.html\n女优系列::https://rensgyn1.lol/sort/279.html\n可爱学生::https://rensgyn1.lol/sort/280.html\n风情旗袍::https://rensgyn1.lol/sort/281.html\n兽耳系列::https://rensgyn1.lol/sort/282.html\n瑜伽裤::https://rensgyn1.lol/sort/283.html\n闷骚护士::https://rensgyn1.lol/sort/284.html\n过膝袜::https://rensgyn1.lol/sort/285.html\n网曝门::https://rensgyn1.lol/sort/286.html\n传媒出品::https://rensgyn1.lol/sort/287.html\n女同性恋::https://rensgyn1.lol/sort/288.html\n男同性恋::https://rensgyn1.lol/sort/289.html\n恋腿狂魔::https://rensgyn1.lol/sort/290.html\n韩国主播::https://rensgyn1.lol/sort/293.html\nVR视角::https://rensgyn1.lol/sort/294.html\n无码专区::https://rensgyn1.lol/sort/295.html\n制服师生::https://rensgyn1.lol/sort/297.html\n伦理系列::https://rensgyn1.lol/sort/298.html\n换脸AI::https://rensgyn1.lol/sort/299.html\n中文伦理::https://rensgyn1.lol/sort/300.html\n卡通动漫::https://rensgyn1.lol/sort/301.html\n欧美系列::https://rensgyn1.lol/sort/302.html\n美女主播::https://rensgyn1.lol/sort/303.html\n国产自拍::https://rensgyn1.lol/sort/304.html\n人妻热门::https://rensgyn1.lol/sort/305.html\n萝莉系列::https://rensgyn1.lol/sort/306.html\n女同性爱::https://rensgyn1.lol/sort/307.html\n多人群交::https://rensgyn1.lol/sort/308.html\n美乳巨乳::https://rensgyn1.lol/sort/309.html\n强奸热门::https://rensgyn1.lol/sort/310.html\n抖阴视频::https://rensgyn1.lol/sort/311.html\n韩国主播::https://rensgyn1.lol/sort/312.html\n网红头条::https://rensgyn1.lol/sort/313.html\n网爆黑料::https://rensgyn1.lol/sort/314.html\n欧美无码::https://rensgyn1.lol/sort/315.html\n女优明星::https://rensgyn1.lol/sort/316.html\nSM调教::https://rensgyn1.lol/sort/317.html\n精品解说::https://rensgyn1.lol/sort/326.html\n亚洲情色::https://rensgyn1.lol/sort/374.html\n主播自拍::https://rensgyn1.lol/sort/375.html\n国产偷拍::https://rensgyn1.lol/sort/376.html\n无码系列::https://rensgyn1.lol/sort/377.html\n欧美性爱::https://rensgyn1.lol/sort/378.html\n熟女专区::https://rensgyn1.lol/sort/379.html\n强奸系列::https://rensgyn1.lol/sort/380.html\n巨乳系列::https://rensgyn1.lol/sort/381.html\n中文大全::https://rensgyn1.lol/sort/382.html\n制服学生::https://rensgyn1.lol/sort/383.html\n女同蕾丝::https://rensgyn1.lol/sort/384.html\n卡通动画::https://rensgyn1.lol/sort/385.html\n视频伦理::https://rensgyn1.lol/sort/386.html\n少女裸体::https://rensgyn1.lol/sort/387.html\n重口色情::https://rensgyn1.lol/sort/388.html\n人兽性交::https://rensgyn1.lol/sort/389.html\n福利姬::https://rensgyn1.lol/sort/473.html\n生活都市::https://rensgyn1.lol/sort/474.html\n不偷恋情::https://rensgyn1.lol/sort/475.html\n学生校园::https://rensgyn1.lol/sort/476.html\n人妻熟女::https://rensgyn1.lol/sort/477.html\n暴力虐待::https://rensgyn1.lol/sort/478.html\n明星偶像::https://rensgyn1.lol/sort/479.html\n玄幻仙侠::https://rensgyn1.lol/sort/480.html\n科学幻想::https://rensgyn1.lol/sort/481.html\n街拍偷拍::https://rensgyn1.lol/sort/482.html\n丝袜美腿::https://rensgyn1.lol/sort/483.html\n欧美风情::https://rensgyn1.lol/sort/484.html\n网友自拍::https://rensgyn1.lol/sort/485.html\n卡通漫画::https://rensgyn1.lol/sort/486.html\n露出激情::https://rensgyn1.lol/sort/487.html\n唯美写真::https://rensgyn1.lol/sort/488.html\n女优情报::https://rensgyn1.lol/sort/489.html\n私房俱乐部::https://rensgyn1.lol/sort/490.html\n学生少女::https://rensgyn1.lol/sort/492.html\n技师风采::https://rensgyn1.lol/sort/493.html\n熟女少妇::https://rensgyn1.lol/sort/494.html\n国产热播::https://rensgyn1.lol/sort/495.html\n反差母狗::https://rensgyn1.lol/sort/496.html\n美脚丝足::https://rensgyn1.lol/sort/497.html\n情侣自拍::https://rensgyn1.lol/sort/498.html\n偷情约炮::https://rensgyn1.lol/sort/499.html\n真实偷拍::https://rensgyn1.lol/sort/500.html\n高潮喷水::https://rensgyn1.lol/sort/501.html\n强奸迷奸::https://rensgyn1.lol/sort/503.html\n户外露出::https://rensgyn1.lol/sort/504.html\nSM调教::https://rensgyn1.lol/sort/505.html\n情趣内衣::https://rensgyn1.lol/sort/506.html\n精选探花::https://rensgyn1.lol/sort/507.html\n网曝门事件::https://rensgyn1.lol/sort/509.html\n校园猛料::https://rensgyn1.lol/sort/510.html\n网红流出::https://rensgyn1.lol/sort/511.html\n明星黑料::https://rensgyn1.lol/sort/512.html\n裸贷肉偿::https://rensgyn1.lol/sort/513.html\n婚闹恶俗::https://rensgyn1.lol/sort/514.html\n抓奸名场面::https://rensgyn1.lol/sort/515.html\n男同女同::https://rensgyn1.lol/sort/516.html\nJK少女::https://rensgyn1.lol/sort/518.html\n黑丝白丝::https://rensgyn1.lol/sort/519.html\n女仆::https://rensgyn1.lol/sort/520.html\ncosplay::https://rensgyn1.lol/sort/521.html\nOL制服::https://rensgyn1.lol/sort/522.html\n旗袍::https://rensgyn1.lol/sort/523.html\n空姐制服::https://rensgyn1.lol/sort/524.html\n护士医生::https://rensgyn1.lol/sort/525.html\n禁忌母子::https://rensgyn1.lol/sort/527.html\n兄弟姐妹::https://rensgyn1.lol/sort/528.html\n爱上嫂子::https://rensgyn1.lol/sort/529.html\n狂操小姨::https://rensgyn1.lol/sort/530.html\n换夫换妻::https://rensgyn1.lol/sort/531.html\n淫荡儿媳::https://rensgyn1.lol/sort/532.html\n爷爷奶奶::https://rensgyn1.lol/sort/533.html\n啪啪直播::https://rensgyn1.lol/sort/535.html\n学生直播::https://rensgyn1.lol/sort/536.html\n自慰诱惑::https://rensgyn1.lol/sort/537.html\n乱伦直播::https://rensgyn1.lol/sort/538.html\n户外勾搭::https://rensgyn1.lol/sort/539.html\n车震直播::https://rensgyn1.lol/sort/540.html\n国产AV::https://rensgyn1.lol/sort/541.html\n欧美精选::https://rensgyn1.lol/sort/543.html\n户外搭讪::https://rensgyn1.lol/sort/544.html\n美女自慰::https://rensgyn1.lol/sort/545.html\n成人剧情::https://rensgyn1.lol/sort/546.html\n黑人大屌::https://rensgyn1.lol/sort/547.html\n群P大作战::https://rensgyn1.lol/sort/548.html\n欧美重口::https://rensgyn1.lol/sort/549.html\n人兽性交::https://rensgyn1.lol/sort/551.html\nSM性虐::https://rensgyn1.lol/sort/552.html\n人妖伪娘::https://rensgyn1.lol/sort/553.html\n孕妇内射::https://rensgyn1.lol/sort/554.html\n吃屎喝尿::https://rensgyn1.lol/sort/555.html\n扩阴拳交::https://rensgyn1.lol/sort/556.html\n阳具巨物::https://rensgyn1.lol/sort/557.html\n3D动漫::https://rensgyn1.lol/sort/559.html\n同人动漫::https://rensgyn1.lol/sort/560.html\n日本中文::https://rensgyn1.lol/sort/562.html\n无码流出::https://rensgyn1.lol/sort/563.html\nFC2::https://rensgyn1.lol/sort/564.html\nHEYZO::https://rensgyn1.lol/sort/565.html\n东京热::https://rensgyn1.lol/sort/566.html\n一本道::https://rensgyn1.lol/sort/567.html\n网红主播::https://rensgyn1.lol/sort/569.html\n伦理精选::https://rensgyn1.lol/sort/570.html\n剧情故事::https://rensgyn1.lol/sort/571.html",
    "sourceIcon": "https://gips0.baidu.com/it/u=1646076759,2240023288&fm=3086&app=3086&f=JPEG&wm=1,baiduai3,0,0,13,9&wmo=5,5&w=1024&h=1024",
    "sourceName": "万人求",
    "sourceUrl": "https://rensgyn1.lol/sort/536.html"
  },
  {
    "articleStyle": 0,
    "customOrder": 14,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 1773939133675,
    "loadWithBaseUrl": true,
    "ruleArticles": ".vod[2:23]",
    "ruleContent": "<js>\n// 提取m3u8链接\nvar m3u8Match = result.match(/\"([^\"]*?index\\.m3u8[^\"]*)\"/i) \n             || result.match(/'([^']*?index\\.m3u8[^']*)'/i);\n\nvar p = '';\nif (m3u8Match) {\n    var u = m3u8Match[1]\n        .replace(/\\\\\\//g, '/')      // \\/ → /\n        .replace(/\\\\\\\\/g, '\\\\')      // \\\\ → \\\n        .trim();\n    \n    // 补全协议\n    if (u.startsWith('//')) {\n        u = 'https:' + u;\n    } else if (!u.startsWith('http')) {\n        // 需要基础URL，这里假设当前页面URL在result中或需要传入\n        u = 'https://' + u;  // 简化处理，或根据实际需求调整\n    }\n    p = u;\n}\n\n// 标题：从 span.tx-flex-sh > a 的 title 属性获取\nvar t = java.getString('.title.1 @text') || '未知标题';\n\n// 标签：从 meta[name=\"description\"] 的 content 获取  \nvar b = java.getString('meta[name=\"description\"]@content') || '';\nvar updateIndex = b.indexOf('更新时间');\nif (updateIndex !== -1) {\nvar d = b.substring(updateIndex);  // 保留\"更新时间\"及之后的内容\n}\n\n`<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>${t}</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,sans-serif;background:#f0f9ff;padding:10px}\n.v-box{max-width:800px;margin:0 auto;background:white;border-radius:12px;box-shadow:0 5px 15px rgba(0,0,0,0.1);overflow:hidden}\n.header{padding:12px;border-bottom:1px solid #eee;display:flex;flex-wrap:wrap;justify-content:space-between}\n.title{font-size:18px;font-weight:600;margin-bottom:8px;width:100%}\n.tags{color:#5f6368;font-size:14px;flex:1;min-width:60%;word-break:break-all}\n.time{color:#5f6368;font-size:14px;text-align:right;flex-basis:35%}\n.v-wrap{position:relative;padding-top:56.25%;background:#000}\n.video{position:absolute;top:0;left:0;width:100%;height:100%}\n.footer{padding:8px;text-align:center;color:#5f6368;font-size:13px}\n.info-box{padding:15px;font-size:14px;line-height:1.6}\n.info-box p{margin:8px 0}\n.hint{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.7);color:#fff;padding:12px 20px;border-radius:20px;font-size:1.1rem;z-index:10;display:none}\n.controls{position:absolute;top:0;left:0;width:100%;height:4px;background:rgba(255,255,255,0.3);z-index:5;transition:opacity 0.3s}\n.progress{height:100%;background:#4a9eff;width:0}\n</style>\n</head>\n<body>\n<div class=\"v-box\">\n<div class=\"header\">\n<div class=\"title\">${t}</div>\n<div class=\"tags\">${d}</div>\n<div class=\"time\" id=\"timeDisplay\">00:00/00:00</div></div>\n<div class=\"v-wrap\">\n<div class=\"controls\"><div class=\"progress\" id=\"progressBar\"></div></div>\n<div class=\"hint\" id=\"hint\">快进中 &gt;&gt;</div>\n<video class=\"video\" id=\"v\" controls playsinline>\n<source src=\"${p}\" type=\"application/x-mpegURL\">您的浏览器不支持HTML5视频\n</video>\n</div>\n<div class=\"footer\">滑动调整进度 | 长按2倍速</div>\n</div>\n<script>\nvar v = document.getElementById('v');\nvar tDisplay = document.getElementById('timeDisplay');\nvar pBar = document.getElementById('progressBar');\nvar hint = document.getElementById('hint');\nvar startX = 0, startTime = 0;\nvar longPressTimer;\nvar sensitivity = 0.1;\nvar longPressTime = 500;\nvar hintDuration = 2000;\nfunction updateTime() {\nif (!v.duration) return;\nvar m1 = Math.floor(v.currentTime / 60);\nvar s1 = Math.floor(v.currentTime % 60);\nvar m2 = Math.floor(v.duration / 60);\nvar s2 = Math.floor(v.duration % 60);\ntDisplay.textContent = m1 + ':' + (s1 < 10 ? '0' : '') + s1 + '/' + m2 + ':' + (s2 < 10 ? '0' : '') + s2;\npBar.style.width = (v.currentTime / v.duration) * 100 + '%';}\nv.addEventListener('timeupdate', updateTime);\nv.addEventListener('loadedmetadata', updateTime);\nv.addEventListener('touchstart', function(e) {\nstartX = e.touches[0].clientX;\nstartTime = Date.now();\nif (longPressTimer) clearTimeout(longPressTimer);\nhint.style.display = 'none';\nlongPressTimer = setTimeout(function() {\nv.playbackRate = 2.0;\nhint.style.display = 'block';\nsetTimeout(function() { hint.style.display = 'none'; }, hintDuration);}, longPressTime);});\nv.addEventListener('touchmove', function(e) {\ne.preventDefault();\nclearTimeout(longPressTimer);\nvar diffX = e.touches[0].clientX - startX;\nvar change = diffX * sensitivity * v.duration / 100;\nv.currentTime = Math.max(0, Math.min(v.currentTime + change, v.duration));\nstartX = e.touches[0].clientX;updateTime();});\nv.addEventListener('touchend', function() {\nv.playbackRate = 1.0;\nclearTimeout(longPressTimer);});\n</script>\n</body>\n</html>`\n</js>\n",
    "ruleImage": "img@data-original",
    "ruleLink": "a@href",
    "ruleNextPage": ".pageitem.-1@href",
    "ruleTitle": "a@text",
    "singleUrl": false,
    "sortUrl": "自拍::https://eeoopinkyy.cc/pink/index.php/vod/type/id/198/page/{{page}}.html\n搜索::https://eeoopinkyy.cc/pink/index.php/vod/search/page/{{page}}/wd/{{source.getVariable()}}.html\n吃瓜::https://eeoopinkyy.cc/pink/index.php/vod/search/page/{{page}}/wd/吃瓜.html\n国产::https://eeoopinkyy.cc/pink/index.php/vod/type/id/197/page/{{page}}.html\n国产视频::https://eeoopinkyy.cc/pink/index.php/vod/type/id/199.html\n国产传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/200.html\n国产裸聊::https://eeoopinkyy.cc/pink/index.php/vod/type/id/201.html\n国产直播::https://eeoopinkyy.cc/pink/index.php/vod/type/id/202.html\n国产偷拍::https://eeoopinkyy.cc/pink/index.php/vod/type/id/203.html\n国产大制作::https://eeoopinkyy.cc/pink/index.php/vod/type/id/204.html\n国产主播::https://eeoopinkyy.cc/pink/index.php/vod/type/id/205.html\n蜜桃传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/217.html\n天美传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/218.html\n乌鸦传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/219.html\n星空传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/220.html\n乐播传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/221.html\n大象传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/222.html\n映画传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/223.html\n皇家华人::https://eeoopinkyy.cc/pink/index.php/vod/type/id/208.html\n精东影业::https://eeoopinkyy.cc/pink/index.php/vod/type/id/209.html\n成人头条::https://eeoopinkyy.cc/pink/index.php/vod/type/id/210.html\n免子先生::https://eeoopinkyy.cc/pink/index.php/vod/type/id/211.html\n杏吧原创::https://eeoopinkyy.cc/pink/index.php/vod/type/id/212.html\n91制片厂::https://eeoopinkyy.cc/pink/index.php/vod/type/id/213.html\n开心鬼传媒::https://eeoopinkyy.cc/pink/index.php/vod/type/id/214.html\n黑料网曝::https://eeoopinkyy.cc/pink/index.php/vod/type/id/181.html\n会所技师::https://eeoopinkyy.cc/pink/index.php/vod/type/id/182.html\n探花约炮::https://eeoopinkyy.cc/pink/index.php/vod/type/id/183.html\n淫妻绿帽::https://eeoopinkyy.cc/pink/index.php/vod/type/id/184.html\n制服诱惑::https://eeoopinkyy.cc/pink/index.php/vod/type/id/185.html\n重口猎奇::https://eeoopinkyy.cc/pink/index.php/vod/type/id/186.html\n强奸乱伦::https://eeoopinkyy.cc/pink/index.php/vod/type/id/187.html\n精品甄之::https://eeoopinkyy.cc/pink/index.php/vod/type/id/190.html\n网曝黑料::https://eeoopinkyy.cc/pink/index.php/vod/type/id/191.html\n明星换脸::https://eeoopinkyy.cc/pink/index.php/vod/type/id/192.html\n女优明星::https://eeoopinkyy.cc/pink/index.php/vod/type/id/193.html\n韩国主播::https://eeoopinkyy.cc/pink/index.php/vod/type/id/194.html\n网红主播::https://eeoopinkyy.cc/pink/index.php/vod/type/id/195.html\n群交淫乱::https://eeoopinkyy.cc/pink/index.php/vod/type/id/196.html\n巨乳美乳::https://eeoopinkyy.cc/pink/index.php/vod/type/id/244.html\n高清名优::https://eeoopinkyy.cc/pink/index.php/vod/type/id/245.html\n人妻熟女::https://eeoopinkyy.cc/pink/index.php/vod/type/id/246.html\n中文字幕::https://eeoopinkyy.cc/pink/index.php/vod/type/id/247.html\nSM调教::https://eeoopinkyy.cc/pink/index.php/vod/type/id/248.html\nVR视角::https://eeoopinkyy.cc/pink/index.php/vod/type/id/249.html\nAV解说::https://eeoopinkyy.cc/pink/index.php/vod/type/id/250.html\n日本无码::https://eeoopinkyy.cc/pink/index.php/vod/type/id/235.html\n欧美性爱::https://eeoopinkyy.cc/pink/index.php/vod/type/id/236.html\n欧美无码::https://eeoopinkyy.cc/pink/index.php/vod/type/id/237.html\n高清有码::https://eeoopinkyy.cc/pink/index.php/vod/type/id/238.html\n日本素人::https://eeoopinkyy.cc/pink/index.php/vod/type/id/239.html\n伦理三级::https://eeoopinkyy.cc/pink/index.php/vod/type/id/240.html\n动漫精选::https://eeoopinkyy.cc/pink/index.php/vod/type/id/241.html\n乱伦毁三观::https://eeoopinkyy.cc/pink/index.php/vod/type/id/226.html\n淫乱学生妹::https://eeoopinkyy.cc/pink/index.php/vod/type/id/227.html\n玩偶姐姐::https://eeoopinkyy.cc/pink/index.php/vod/type/id/228.html\n糖心Vlog::https://eeoopinkyy.cc/pink/index.php/vod/type/id/229.html\n萝莉社::https://eeoopinkyy.cc/pink/index.php/vod/type/id/230.html\n性视界::https://eeoopinkyy.cc/pink/index.php/vod/type/id/231.html\nPsychoPorn::https://eeoopinkyy.cc/pink/index.php/vod/type/id/232.html",
    "sourceComment": "┍   　  　书源作者：闻君三月　　  　┒\n├───┬────────────┤\n│！免责│本书源只提供代码进行技术│\n│！声明│交流，请于２４小时后删除│\n└────────────────┘",
    "sourceIcon": "https://ico.img12345.com/jt/favicon.png",
    "sourceName": "粉粉",
    "sourceUrl": "https://eeoopinkyy.cc/pink/index.php/vod/type/id/197.html"
  },
  {
    "articleStyle": 1,
    "concurrentRate": "",
    "customOrder": 23,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginCheckJs": "",
    "loginUi": "",
    "loginUrl": "",
    "ruleArticles": "",
    "ruleContent": "",
    "ruleDescription": "",
    "ruleImage": "",
    "ruleLink": "",
    "ruleNextPage": "",
    "rulePubDate": "",
    "ruleTitle": "",
    "singleUrl": false,
    "sortUrl": "中字::https://rsshub.app/t66y/26\n技术区::https://rsshub.app/t66y/7\n图区::https://rsshub.app/t66y/8\n盖区::https://rsshub.app/t66y/16\nhttp::https://rsshub.app/t66y/21\n文学区::https://rsshub.app/t66y/20",
    "sourceComment": "草榴图文",
    "sourceGroup": "18🚫禁",
    "sourceIcon": "https://i.postimg.cc/qRRpTpFs/ytDpOe.jpg",
    "sourceName": "📖草榴ζ",
    "sourceUrl": "https://rsshub.app/t66y/",
    "style": ""
  },
  {
    "articleStyle": 1,
    "coverDecodeJs": "java.createSymmetricCrypto(\"AES/CBC/NoPadding\",\"f5d965df75336270\",\"97b60394abc2fbe1\").decrypt(result)",
    "customOrder": 23,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; U; Android 13; zh-Hans-CN; PFJM10 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/135.0.4896.58 Quark/6.13.6.581 Mobile Safari/537.36\",\n\"Accept-Language\":\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"}",
    "lastUpdateTime": 1775585231245,
    "loadWithBaseUrl": true,
    "ruleArticles": "#body>.container>.row>div[role=\"main\"]>article:not(:has(meta[content=\"广告\"]))>a",
    "ruleContent": "// 兼容 Rhino 的脚本（ES5）\nvar urls = [];\nvar resultStr = String(result || '');   // 确保 result 存在\n\n// 从 HTML 中提取 m3u8 链接\nfunction getM3u8(html) {\n    html = html || resultStr;\n    var urlRegex = /(https?:[^'\"\\s]*?\\.m3u8[^'\"\\s]*)/g;\n    var urlSet = [];\n    var match;\n    while ((match = urlRegex.exec(html)) !== null) {\n        var ul = match[1].replace(/\\\\/g, \"\");\n        if (urlSet.indexOf(ul) === -1) {\n            urlSet.push(ul);\n        }\n    }\n    return urlSet;\n}\n\n// 更新进度条（可选）\nfunction updateProgress(current, total) {\n    var percentage = Math.round(current / total * 10000) / 100;\n    var blocks = Math.floor(percentage / 10);\n    var progressBar = \"\";\n    for (var i = 0; i < blocks; i++) progressBar += \"█\";\n    for (var i = blocks; i < 10; i++) progressBar += \"░\";\n    java.longToast(\"【加载进度】\\n\" + progressBar + \" \\n\" + percentage + \"%\");\n}\n\n// 判断是否需要点开详情页\nif (/点我/.test(resultStr) && /查看详情/.test(resultStr)) {\n    // 获取所有详情页链接\n    var list = java.getElements('@@#post>article>.post-content>p>a');\n    var links = [];\n    for (var i = 0; i < list.length - 1; i++) {  // 去掉最后一个\n        links.push(list[i]);\n    }\n    var tempUrls = [];\n    for (var idx = 0; idx < links.length; idx++) {\n        updateProgress(idx + 1, links.length);\n        var link = links[idx];\n        var href = String(link.getAttribute('href'));\n        var fullUrl = source.key + href;   // 需要确保 source.key 存在\n        var doc = String(java.ajax(fullUrl));\n        var pageUrls = getM3u8(doc);\n        tempUrls = tempUrls.concat(pageUrls);\n        if (idx === links.length - 1) {\n            urls = tempUrls;\n        }\n    }\n} else {\n    urls = getM3u8();\n}\n\n// 如果没有获取到任何视频地址，显示错误信息\nif (!urls || urls.length === 0) {\n    '<html><body><h2>未找到视频地址，请检查规则或网站结构</h2></body></html>';\n} else {\n    // 生成 HTML 页面（注意转义）\n    var htmlOutput = '<html>' +\n        '<head>' +\n        '<meta name=\"viewport\" content=\"width=device-width\">' +\n        '<style>' +\n        'body{margin:0;font-family:Arial,sans-serif;background:linear-gradient(135deg,#ece9e6,#fff);display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:20px;}' +\n        '.container{width:100%;max-width:800px;background:#fff;border-radius:10px;box-shadow:0 4px 8px rgba(0,0,0,0.1);overflow:hidden;margin-bottom:20px;}' +\n        'h3{text-align:center;margin:0;padding:10px 20px;font-size:0.9em;background:#333;color:#fff;border-radius:10px 10px 0 0;}' +\n        '.video-container{width:100%;background:#000;position:relative;}' +\n        'video{width:100%;height:auto;display:block;}' +\n        '.nav-container{display:flex;justify-content:space-between;align-items:center;padding:15px 20px;background:#f5f5f5;border-top:1px solid #ddd;}' +\n        '.nav-button{padding:10px 20px;background:#007bff;color:white;border:none;border-radius:5px;cursor:pointer;font-size:14px;}' +\n        '.nav-button:disabled{background:#6c757d;cursor:not-allowed;}' +\n        '.page-select{padding:10px 15px;border:1px solid #ddd;border-radius:5px;font-size:14px;background:white;min-width:120px;}' +\n        '</style>' +\n        '</head>' +\n        '<body>' +\n        '<div class=\"container\">' +\n        '<h3>当前播放: 第<span id=\"currentVideo\">1</span>集 / 共' + urls.length + '集</h3>' +\n        '<div class=\"video-container\">' +\n        '<video controls autoplay name=\"media\" id=\"videoPlayer\">' +\n        '<source src=\"' + urls[0] + '\" type=\"application/x-mpegURL\">' +\n        '</video>' +\n        '</div>' +\n        '<div class=\"nav-container\">' +\n        '<button class=\"nav-button\" id=\"prevBtn\" onclick=\"changeVideo(-1)\">上一集</button>' +\n        '<select class=\"page-select\" id=\"pageSelect\"></select>' +\n        '<button class=\"nav-button\" id=\"nextBtn\" onclick=\"changeVideo(1)\">下一集</button>' +\n        '</div>' +\n        '</div>' +\n        '<script>' +\n        'var videoUrls = ' + JSON.stringify(urls) + ';' +\n        'var currentVideoIndex = 0;' +\n        'var video = document.getElementById(\"videoPlayer\");' +\n        'var prevBtn = document.getElementById(\"prevBtn\");' +\n        'var nextBtn = document.getElementById(\"nextBtn\");' +\n        'var pageSelect = document.getElementById(\"pageSelect\");' +\n        'var currentVideoSpan = document.getElementById(\"currentVideo\");' +\n        'function generateSelectOptions() {' +\n        '    var optionsHtml = \"\";' +\n        '    for (var i = 0; i < videoUrls.length; i++) {' +\n        '        optionsHtml += \"<option value=\\\\\"\" + i + \"\\\\\">第\" + (i+1) + \"集</option>\";' +\n        '    }' +\n        '    pageSelect.innerHTML = optionsHtml;' +\n        '}' +\n        'function updateButtons() {' +\n        '    prevBtn.disabled = (currentVideoIndex === 0);' +\n        '    nextBtn.disabled = (currentVideoIndex === videoUrls.length - 1);' +\n        '    pageSelect.value = currentVideoIndex;' +\n        '    currentVideoSpan.textContent = currentVideoIndex + 1;' +\n        '}' +\n        'function changeVideo(direction) {' +\n        '    var newIndex = currentVideoIndex + direction;' +\n        '    if (newIndex >= 0 && newIndex < videoUrls.length) {' +\n        '        currentVideoIndex = newIndex;' +\n        '        video.src = videoUrls[currentVideoIndex];' +\n        '        video.load();' +\n        '        updateButtons();' +\n        '    }' +\n        '}' +\n        'function selectVideo(index) {' +\n        '    var newIndex = parseInt(index, 10);' +\n        '    if (newIndex >= 0 && newIndex < videoUrls.length) {' +\n        '        currentVideoIndex = newIndex;' +\n        '        video.src = videoUrls[currentVideoIndex];' +\n        '        video.load();' +\n        '        updateButtons();' +\n        '    }' +\n        '}' +\n        'pageSelect.onchange = function() { selectVideo(this.value); };' +\n        'generateSelectOptions();' +\n        'updateButtons();' +\n        '</script>' +\n        '</body>' +\n        '</html>';\n\n    htmlOutput;\n}",
    "ruleImage": "@js:\nvar text = java.getString('script@html');\nvar match = text.match(/loadBannerDirect\\('([^']+)'/);\nvar img = match ? match[1] : '';\nimg;",
    "ruleLink": "href",
    "ruleNextPage": "page",
    "rulePubDate": "{{@@.wraps@text}}{{@@.post-card-info span@text##\\n}}",
    "ruleTitle": "h2@text",
    "singleUrl": false,
    "sortUrl": "搜索::/search/{{source.getVariable()}}/{{page}}/\n首页::/page/{{page}}/\n每日大赛::/category/mrds/{{page}}/\n主题大赛::/category/ztds/{{page}}/\n热搜吃瓜::/category/rstt/{{page}}/\n校园学生::/category/xazd/{{page}}/\n必撸大赛::/category/blyp/{{page}}/\n反差泄密::/category/fctg/{{page}}/\n网红黑料::/category/mhds/{{page}}/\n猎奇重口::/category/lqdp/{{page}}/\nAV看片::/category/jdsj/{{page}}/\n明星大赛::/category/mxwh/{{page}}/\n动漫之家::/category/smdh/{{page}}/\n影视国漫::/category/dypd/{{page}}/\ncos写真::/category/mtds/{{page}}/\n声控ASMR::/category/ysds/{{page}}/\n寸止挑战::/category/czds/{{page}}/\n混剪PMV::/category/hjds/{{page}}/\n原创投稿::/category/tgds/{{page}}/\n欧美精品::/category/omjp/{{page}}/\n全网参赛::/category/qwcs/{{page}}/",
    "sourceComment": "// 发布页https://www.quawdtr.cc/",
    "sourceGroup": "美涩",
    "sourceIcon": "https://img1.baidu.com/it/u=3056428239,816616493&fm=253&fmt=auto&app=138&f=PNG?w=237&h=237",
    "sourceName": "每日大赛",
    "sourceUrl": "https://board.ipfizxh.com//",
    "style": "iframe{\n\theight:600px\n}\ntitle{\n\tdisplay:block\n}"
  },
  {
    "articleStyle": 0,
    "customOrder": 37,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "singleUrl": true,
    "sourceComment": "//:Mengteen",
    "sourceGroup": "202",
    "sourceIcon": "https://cdn.sshs.rip/63/a0/63d782d6ef5f9104b6b92f3ca0a317a0.webp",
    "sourceName": "😍随机福利视频",
    "sourceUrl": "https://jiejie.uk/xjj/fuli/"
  },
  {
    "articleStyle": 1,
    "customOrder": 129,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": ".aspect-ratio",
    "ruleContent": "class.max-width-md margin-x-auto margin-bottom-lg@all",
    "ruleImage": "img@data-src",
    "ruleLink": "a@href",
    "ruleNextPage": "",
    "rulePubDate": ".card-video__duration@text",
    "ruleTitle": "img@alt",
    "singleUrl": false,
    "sortUrl": "中國AV::https://ppp.porn/categories/china-av/\n日本片商::https://ppp.porn/categories/japan-producer/\n素人自拍::https://ppp.porn/categories/amateur/\n中國::https://ppp.porn/categories/china/\n台灣::https://ppp.porn/categories/taiwan/\n日本::https://ppp.porn/categories/japan/\n東南亞::https://ppp.porn/categories/se-asia/\n韓國::https://ppp.porn/categories/korea/\n香港::https://ppp.porn/categories/hongkong/\nCosplay::https://ppp.porn/categories/cosplay/\n主播::https://ppp.porn/categories/streamer/\n主觀視角::https://ppp.porn/categories/first-person-pov/\n凌辱::https://ppp.porn/categories/bdsm/\n劇情::https://ppp.porn/categories/drama/\n多P::https://ppp.porn/categories/threesome/\n探花::https://ppp.porn/categories/91-tanhua/\n流出::https://ppp.porn/categories/leaked/\n無碼::https://ppp.porn/categories/uncensored/\n野外露出::https://ppp.porn/categories/exhibitionists/\nOL::https://ppp.porn/categories/office-lady/\n動漫::https://ppp.porn/categories/acg/\n古裝::https://ppp.porn/categories/costume/\n女僕::https://ppp.porn/categories/maid/\n學生::https://ppp.porn/categories/student/\n旗袍::https://ppp.porn/categories/cheongsam/\n獸耳::https://ppp.porn/categories/kemonomimi/\n瑜伽褲::https://ppp.porn/categories/yoga-pants/\n真理褲::https://ppp.porn/categories/dolfin-shorts/\n絲襪::https://ppp.porn/categories/pantyhose/\n護士::https://ppp.porn/categories/nurse/\n過膝襪::https://ppp.porn/categories/knee-socks/",
    "sourceGroup": "18🚫禁",
    "sourceIcon": "https://i.postimg.cc/q7MH2x2p/IMG-20220716-132525.jpg",
    "sourceName": "P站",
    "sourceUrl": "https://ppp.porn/",
    "style": "video{width:100%}img{width:100%}"
  },
  {
    "articleStyle": 3,
    "customOrder": 416,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n\t\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\",\"referer\": \"{{baseUrl}}\"\n\t}",
    "jsLib": "let search = \"https://dns.jingluo.love/2025/68a878e00d302.jpg\";",
    "lastUpdateTime": 1775586135304,
    "loadWithBaseUrl": true,
    "ruleArticles": ".pornkvideos",
    "ruleContent": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>内容提取</title>\n<!-- v2025.05.10 -->\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<script src=\"https://code.jquery.com/jquery-3.6.0.min.js\"></script>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.11.3/viewer.min.css\" />\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.11.3/viewer.min.js\"></script>\n<style>\n    body { font-family: Arial, sans-serif; font-size: 16px; }\n    #title, #page, #loading-status { margin: 0 auto; font-size: 20px; text-align: center; }\n    #description, #urls, #video-url, #video-sources, #messages { width: 100%; max-width: 800px; margin: 1.5px auto; font-size: 14px; text-align: left; word-wrap: break-word; white-space: pre-wrap; }\n    #text, #text :not(img), #text img + * { text-indent: 2em; width: 100%; font-size: 16px; line-height: 1.5em; margin-top: 0; margin-bottom: 0; word-wrap: break-word; white-space: pre-wrap; }\n    img, #text img { width: 100%; height: auto; display: block; margin-bottom: 1.5px; }\n    .flex-container { display: flex; justify-content: center; align-items: center; gap: 10px; margin: 1.5px 0; font-size: 14px; }\n    button, select { flex: 1 1 31%; padding: 3px; border: 1px solid #ccc; border-radius: 5px; box-sizing: border-box; cursor: pointer; background-color: #f9f9f9; transition: background-color 0.3s ease; margin: 1.5px; min-width: 0; font-size: 14px; }\n    #url-select, #video-source-select { flex: 1 1 100%; margin-left: 0; margin-right: 0; text-align: center; }\n    #video-element { width: 100%; height: auto; }\n    textarea { width: 100%; height: auto; min-height: 100px; box-sizing: border-box; resize: vertical; }\n    .error, .warn { color: red; }\n</style>\n</head>\n<body>\n    <h3 id=\"title\">{{@@title@text||h1.0@text||h2.0@text||.title.0@text}}</h3>\n    <p id=\"description\">{{@@.info.0@html||.jianjie@html}}</p>\n    <p id=\"page\" style=\"display:none;\">共<span id=\"total-pages\">1</span>页</p>\n    <p id=\"loading-status\" style=\"display:none;\"></p>\n\n    <div class=\"flex-container\" id=\"loading-buttons\" style=\"display:none;\">\n        <button id=\"prev-page-btn\">上一页</button>\n        <button id=\"next-page-btn\">下一页</button>\n        <button id=\"auto-load-btn\">自&nbsp;&nbsp;动</button>\n    </div>\n    \n    <div class=\"flex-container\">\n        <select id=\"url-select\" style=\"display:none;\"></select>\n    </div>\n    \n    <div class=\"flex-container\">\n        <button id=\"toggle-urls-btn\">显/隐网址</button>\n        <button id=\"toggle-messages-btn\">显/隐信息</button>\n        <button id=\"toggle-debug-btn\">显/隐调试</button>\n    </div>\n    <div id=\"urls\"></div>\n    <div id=\"messages\"></div>\n    <div id=\"debug-info\"></div>\n    <div id=\"video-url\"></div>\n    <div id=\"video-container\" style=\"display: none;\">\n        <video id=\"video-element\" controls preload=\"auto\" width=\"640\" height=\"264\">\n            <source id=\"video-source\" src=\"\" type=\"\">您的浏览器不支持 video 标签。\n        </video>\n    </div>\n    <div class=\"flex-container\" id=\"video-source-container\" style=\"display: none;\">\n        <select id=\"video-source-select\" onchange=\"updateVideoSource()\"></select>\n    </div>\n    <div id=\"images\"></div>\n    <div id=\"text\"></div>\n\n    <script>\n        // 配置对象，包含各种选择器、延迟时间等配置项\n        const config = {    \n            videoSelector: 'body', // 视频选择器\n            imgSelector: '.gridlane-box-inside img,.photos figure img,.content p img', // 图片选择器\n            textSelector: '#content', // 文本选择器\n            debugSelector: '#content, .page, .pager, .content, script', // 调试信息选择器\n            swapImageAttributes: false, // 是否交换图片属性\n            delayTime: 1500, // 延迟提取时间\n            retryDelayTime: 1500, // 重试加载延迟时间\n            maxLoadAttempts: 3, // 最大加载次数\n            autoLoading: false, // true自动模式，false单页模式\n            debugOnce: 0, // 只在特定索引输出一次调试信息\n            totalPagesText: '{{@@.page.0@a.-2@textNodes}}', // 总页码\n            urlSuffixToRemove: /\\.html$/, // 移除url后缀\n            pageUrlText: '{urlPrefix}_{i}.html', // 拼接URL模板        \n            ListMode: true, // true网址列表模式，false网址拼接模式    \n            initialUrls: `{{@@#sort-item-5.0@a@href}}`, // 网址\n            initialUrlsName: `{{@@#sort-item-5.0@a@span@text}}`, // 网址名称\n            sourceurl: '', // 来源URL前缀\n        };\n\n        let videoSources = []; // 存储视频源数组\n        let loadAttempts = {}; // 记录每个URL的加载尝试次数\n        let urls = []; // 存储所有页面的URL\n        let imageBox;\n        let textBox;\n        let currentPageIndex = 0; // 当前页面索引\n        let canLoadNextPage = true; // 控制是否可以加载下一页\n        let autoLoadInProgress = false; // 自动加载状态\n\n        // 构建URL列表\n        function buildUrls(totalPages, baseUrl) {\n            let initialUrlsArray = config.initialUrls.trim().split('\\n').filter(url => url.trim() !== '');\n            let initialUrlsNameArray = config.initialUrlsName.trim().split('\\n').filter(name => name.trim() !== '');\n\n            if (config.ListMode && initialUrlsArray.length > 0) {\n                if (initialUrlsArray.length !== initialUrlsNameArray.length) {\n                    $('#messages').append(`<span class=\"warn\">警告：initialUrls 和 initialUrlsName 的长度不匹配。</span><br>`);\n                }\n\n                urls = initialUrlsArray.map(url => {\n                    if (config.sourceurl && url.startsWith('/') && !/^https?:\\/\\//i.test(url)) {\n                        return config.sourceurl.replace(/\\/$/, '') + url;\n                    } else {\n                        return url;\n                    }\n                });\n\n                urls.forEach((url, index) => {\n                    const name = initialUrlsNameArray[index] || `第 ${index + 1} 页`;\n                    $('#url-select').append(`<option value=\"${index}\">${name}</option>`);\n                    $('#urls').append(`<div>${name}: ${url}</div>`);\n                });\n            } else {\n                if (totalPages === 1) {\n                    urls.push(baseUrl);\n                } else {\n                    urls.push(baseUrl);\n                    for (let i = 2; i <= totalPages; i++) {\n                        urls.push(config.pageUrlText.replace('{urlPrefix}', baseUrl.replace(config.urlSuffixToRemove, '').replace(/\\/$/, '')).replace('{i}', i));\n                    }\n                }\n\n                urls.forEach((url, index) => {\n                    const name = `第 ${index + 1} 页`;\n                    $('#url-select').append(`<option value=\"${index}\">${name}</option>`);\n                    $('#urls').append(`<div>${name}: ${url}</div>`);\n                });\n            }\n\n            $('#total-pages').text(urls.length);\n            toggleNavigationButtons();\n            toggleTotalPagesDisplay();\n        }\n\n        // 规范化URL\n        function normalizeUrl(url) {\n            if (typeof url !== 'string' || !url.trim()) {\n                return '';\n            }\n            const match = url.match(/['\"](.*?)['\"]/);\n            if (match && match[1]) {\n                url = match[1];\n            }\n\n            function processUrl(str) {\n                str = str.trim();\n                str = str.replace(/\\\\u[\\dA-F]{4}/gi, match => String.fromCharCode(parseInt(match.replace(/\\\\u/g, ''), 16)));\n                str = decodeURIComponent(str);\n                str = str.replace(/^http:\\/([^/])/, 'http://$1');\n                str = str.replace(/^https:\\/([^/])/, 'https://$1');\n                return str;\n            }\n            return processUrl(url);\n        }\n\n        // 清空容器内容\n        function clearContainers() {\n            $('#messages').empty();\n            $('#images').empty();\n            $('#text').empty();\n        }\n\n        // 更新图像源\n        function updateImageSrc(elements, shouldSwap) {\n            elements.each(function () {\n                const $this = $(this);\n                const attrsToUpdate = {};\n                if (shouldSwap) {\n                    ['data-original', 'data-src', 'data-url'].forEach(attr => {\n                        if ($this.attr(attr)) {\n                            attrsToUpdate['src'] = $this.attr(attr);\n                        }\n                    });\n                }\n                $this.attr(attrsToUpdate);\n            });\n            return elements;\n        }\n\n        // 切换导航按钮显示状态\n        function toggleNavigationButtons() {\n            if ($('#url-select option').length > 1 && !config.autoLoading) {\n                $('#loading-buttons').show();\n                $('#url-select').show();\n            } else {\n                $('#loading-buttons').hide();\n                $('#url-select').hide();\n            }\n        }\n\n        // 显示加载状态\n        function showLoadingStatus(pageNumber) {\n            const selectedOption = $('#url-select option:selected').text();\n            $('#loading-status').text(`正在加载：${selectedOption}`).show();\n        }\n\n        // 隐藏加载状态\n        function hideLoadingStatus() {\n            $('#loading-status').hide();\n        }\n\n        // 加载指定索引的内容\n        function loadContent(index) {\n            if (index < 0 || index >= urls.length || !canLoadNextPage) return;\n            canLoadNextPage = false;\n            currentPageIndex = index;\n            $('#url-select').val(index);\n            $('#messages').append(`<div>当前地址: <span class=\"warn\">${urls[index]}</span></div>`);\n            if (autoLoadInProgress) {\n                showLoadingStatus(index + 1);\n            }\n            $.ajax({\n                url: urls[index],\n                type: 'GET',\n                success: function (data) {\n                    try {\n                    const $data = $(data);\n                    let updatedHtmlContent = data.replace(/(['\"])(\\/\\/)(?!\\/)/g, '$1https://')\n                        .replace(/src=\"upload/gi, 'src=\"/upload')\n                        .replace(/style=[\"'][^'\"]+[\"']/gi, '')\n                        .replace(/\\\\\\//g, '/');\n                    const parser = new DOMParser();\n                    const doc = parser.parseFromString(updatedHtmlContent, \"text/html\");\n\n                    if (config.debugOnce === index) {\n                        const debugElements = $(doc).find(config.debugSelector);\n                        if (debugElements.length > 0) {\n                            const debugContents = $('<pre>').html(debugElements.clone().wrapAll('<div/>').parent().html()).html();\n                            $('#debug-info').html(`<span class=\"warn\">调试信息: <textarea rows=\"10\" cols=\"80\">${debugContents}</textarea></span>`);\n                        } else {\n                            $('#debug-info').html(`<span class=\"warn\">调试信息: <textarea rows=\"10\" cols=\"80\">调试信息未提取到内容，请检查选择器！</textarea></span>`);\n                        }\n                    }\n                    // 方法1：提取视频\n                    const videoSources1 = [];\n                    const videoContents = $(doc).find(config.videoSelector);\n                    const videoTags = $(videoContents).find('video, source');\n                    videoTags.each(function() {\n                        const videosrc = $(this).attr('src') || \n                                     $(this).attr('data-src') || \n                                     $(this).attr('data-original') || '';\n                        \n                        if (videosrc) {\n                            videoSources1.push(videosrc);\n                        }\n                    });\n                    //反馈\n                    if (videoSources1.length > 0) {\n                        $('#messages').append(`<span>方法1，找到 ${videoSources1.length} 个视频。</span><br>`);\n                    }\n\n                    // 方法2：正则提取视频\n                    const regex = /['\"]https?[^'<>\"]+(m3u8|mp4|webm|ogg|flv|mp3|m4a|wav|ape|flac)([^'<>\"]+)?['\"]/gi;\n                    const matches = data.match(regex);\n                    const videoSources2 = [];\n\n                    if (matches) {\n                        const uniqueMatches = [...new Set(matches)];\n                    \n                        uniqueMatches.forEach(match => {\n                            const normalizedSrc = normalizeUrl(match.replace(/['\"]/g, ''));\n                            videoSources2.push(normalizedSrc);\n                        });\n                    }\n                    //反馈\n                    if (videoSources2.length > 0) {\n                        $('#messages').append(`<span>方法2，找到 ${videoSources2.length} 个视频。</span><br>`);\n                    }\n\n                    // 合并两种方法的结果\n                    videoSources = [...videoSources1, ...videoSources2];\n\n                    // 去重并标准化 URL\n                    const imageExtensions = /\\.(jpg|jpeg|png|gif|bmp|svg)$/i;\n\n                    videoSources = videoSources\n                                  .map(src => normalizeUrl(src.replace(/\\\\+/g, '')))\n                                  .filter(src => src) // 过滤空值\n                                  .filter(src => !imageExtensions.test(src)); // 移除图片地址\n                        \n                    videoSources = [...new Set(videoSources)];// 去重\n\n                    // 显示最终结果\n                    $('#messages').append(`<span>总共找到 ${videoSources.length} 个视频。</span><br>`);\n\n                    if (videoSources.length > 0) {\n                        $('#messages').append(`<span>成功提取到视频，找到 ${videoSources.length} 个视频。</span><br>`);\n                        videoSources.forEach((src, idx) => {\n                            $('#messages').append(`<div>视频地址:<span class=\"warn\"> ${src}</span><br></div>`);\n                            $('#video-source-select').append(`<option value=\"${idx}\">视频源 ${idx + 1}</option>`);\n                        });\n                    \n                        if (videoSources.length == 1) {\n                            $('#video-container').show();\n                            $('#video-url').show();\n                            $('#video-source-container').hide();\n                            updateVideoSource();\n                        } else if (videoSources.length > 1) {\n                            $('#video-container').show();\n                            $('#video-url').show();\n                            $('#video-source-container').show();\n                            updateVideoSource();\n                        } else {\n                            $('#video-container').hide();\n                            $('#video-url').hide();\n                            $('#video-source-container').hide();\n                        }\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未找到视频源。</span><br>`);\n                        $('#video-container').hide();\n                        $('#video-url').hide();\n                        $('#video-source-container').hide();\n                    }\n\n                    //提取图片\n                    const $imgContents = $(doc).find(config.imgSelector);\n                    const shouldSwap = config.swapImageAttributes;\n                    const newContents = updateImageSrc($imgContents.clone(), shouldSwap);\n                    $('#images').append(newContents).show();\n                    if (newContents.length > 0) {\n                        $('#messages').append(`<span>成功提取图片，共 ${newContents.length} 张。</span><br>`);\n                        newContents.each(function () {\n                            const imgSrc = $(this).attr('src') || $(this).attr('data-original') || $(this).attr('data-src') || $(this).attr('data-url');\n                            $('#messages').append(`<div>地址:<span class=\"warn\"> ${imgSrc}</span><br></div>`);\n                        });\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未提取到图片。</span><br>`);\n                    }\n\n                    //提取图片和文本\n                    const textContents = $(doc).find(config.textSelector).map(function () {\n                        const $currentContents = $(this);\n                        $currentContents.find('img + br, script, video, source, iframe').remove();\n                        $currentContents.html($currentContents.html().replace(/>\\s+/gi, '>').replace(/<\\/?br\\s*([^>]*)\\s*\\/?>/gi, '\\n').replace(/\\n+/g, '\\n'));\n                        return $currentContents.html();\n                    }).get().join('');\n                    if (textContents.trim()) {\n                        $('#text').append(`<span>${textContents}</span><br>`).show();\n                        $('#messages').append(`<span>成功提取图文。</span><br>`);\n                    } else {\n                        $('#messages').append(`<span class=\"warn\">未提取到图文。</span><br>`);\n                    }\n\n                    if (autoLoadInProgress && currentPageIndex < urls.length - 1) {\n                        setTimeout(() => { \n                            canLoadNextPage = true;\n                            loadContent(currentPageIndex + 1); \n                        }, config.delayTime);\n                    } else {\n                        canLoadNextPage = true;\n                        if (autoLoadInProgress) {\n                            hideLoadingStatus();\n                        }\n                    }\n                } catch (parseError) {\n                    $('#messages').append(`<span class=\"error\">解析页面内容时发生错误: ${parseError.message}</span><br>`);\n                    handleLoadFailure(urls, index);\n                } finally {\n                    if (imageBox) imageBox.viewer.update();\n                    if (textBox) textBox.viewer.update();\n                }\n            },\n            error: function (jqXHR, textStatus, errorThrown) {\n                let errorMessage = `内容加载失败: ${urls[index]}`;\n                switch (textStatus) {\n                    case 'timeout':\n                        errorMessage += ', 请求超时';\n                        break;\n                    case 'abort':\n                        errorMessage += ', 请求被取消';\n                        break;\n                    case 'parsererror':\n                        errorMessage += ', 解析响应出错';\n                        break;\n                    default:\n                        errorMessage += `, 状态码: ${jqXHR.status}, 错误信息: ${errorThrown}`;\n                        break;\n                }\n                $('#messages').append(`<span class=\"error\">${errorMessage}</span><br>`);\n                handleLoadFailure(urls, index);\n                }\n            });\n        }\n\n        // 处理加载失败的情况\n        function handleLoadFailure(urls, index) {\n            if (!loadAttempts[urls[index]]) {\n                loadAttempts[urls[index]] = 1;\n            } else {\n                loadAttempts[urls[index]]++;\n            }\n            if (loadAttempts[urls[index]] <= config.maxLoadAttempts) {\n                const retryMessage = `第${index + 1}页加载失败，正在进行第${loadAttempts[urls[index]]}次加载！`;\n                $('#messages').append(`<span class=\"error\">${retryMessage}</span><br>`);\n                setTimeout(() => { \n                    canLoadNextPage = true;\n                    loadContent(index); \n                }, config.retryDelayTime);\n            } else {\n                const finalErrorMessage = `第${index + 1}页加载失败，已达到最大尝试次数(${config.maxLoadAttempts})！`;\n                $('#messages').append(`<span class=\"error\">${finalErrorMessage}</span><br>`);\n                if (autoLoadInProgress && currentPageIndex < urls.length - 1) {\n                    setTimeout(() => { \n                        canLoadNextPage = true;\n                        loadContent(currentPageIndex + 1); \n                    }, config.delayTime);\n                } else {\n                    canLoadNextPage = true;\n                    if (autoLoadInProgress) {\n                        hideLoadingStatus();\n                    }\n                }\n            }\n        }\n\n        // 更新视频源\n        function updateVideoSource() {\n            const selectedIndex = parseInt(document.getElementById('video-source-select').value);\n            if (isNaN(selectedIndex) || !videoSources[selectedIndex]) {\n                $('#messages').append(`<span class=\"warn\">未找到有效的视频源。</span><br>`);\n                console.warn(\"Invalid or undefined video source:\", selectedIndex, videoSources);\n                return;\n            }\n\n            const selectedSource = videoSources[selectedIndex];\n            document.getElementById('video-url').textContent = `视频地址:\\n ${selectedSource}`;\n\n            const videoSourceElement = document.getElementById('video-source');\n            videoSourceElement.src = selectedSource;\n\n            const videoElement = document.getElementById('video-element');\n            videoElement.load();\n\n            $('#messages').append(`<span>更新视频源为: ${selectedSource}</span><br>`);\n            console.log(\"Updated video source to:\", selectedSource);\n        }\n\n        // 切换总页数显示状态\n        function toggleTotalPagesDisplay() {\n            if (urls.length > 1) {\n                $('#page').show();\n            } else {\n                $('#page').hide();\n            }\n        }\n\n        // 页面加载完成后执行的主要逻辑\n        $(document).ready(function () {\n            imageBox = document.getElementById('images');\n            textBox = document.getElementById('text');\n            if (imageBox && textBox) {\n                new Viewer(imageBox, { title: true, interval: 2000 });\n                new Viewer(textBox, { title: true, interval: 2000 });\n            }\n\n            const totalPagesText = config.totalPagesText;\n            const totalPages = parseInt(totalPagesText, 10) || 1;\n            const baseUrl = '{{baseUrl}}';\n\n            clearContainers();\n            $('#urls, #debug-info textarea, #video-url, #video-source-select').empty();\n            $('#urls, #messages, #debug-info, #video-url, #video-container, #video-source-container, #images, #text').hide();\n\n            buildUrls(totalPages, baseUrl);\n\n            const urlSelect = document.getElementById('url-select');\n            if (urlSelect.options.length > 0) {\n                urlSelect.value = '0'; \n\n                if (config.autoLoading) {\n                    autoLoadInProgress = true;\n                    for (let i = 0; i < urls.length; i++) {\n                        loadContent(i);\n                    }\n                } else {\n                    loadContent(0);\n                }\n            } else {\n                loadContent(0);\n            }\n\n            $('#url-select').change(function () {\n                clearContainers();\n                const selectedIndex = parseInt($(this).val());\n                loadContent(selectedIndex);\n            });\n            $('#prev-page-btn').click(function () {\n                clearContainers();\n                if (currentPageIndex > 0) {\n                    loadContent(currentPageIndex - 1);\n                }\n            });\n            $('#next-page-btn').click(function () {\n                clearContainers();\n                if (currentPageIndex < urls.length - 1) {\n                    loadContent(currentPageIndex + 1);\n                }\n            });\n            $('#auto-load-btn').click(function () {\n                autoLoadInProgress = true;\n                showLoadingStatus(1); \n                for (let i = currentPageIndex + 1; i < urls.length; i++) {\n                    loadContent(i);\n                }\n            });\n            $('#toggle-messages-btn').click(function () { $('#messages').toggle(); });\n            $('#toggle-urls-btn').click(function () { $('#urls').toggle(); });\n            $('#toggle-debug-btn').click(function () { $('#debug-info').toggle(); });\n        });\n    </script>\n</body>\n</html>",
    "ruleImage": "img@data-src",
    "ruleLink": "/vodplay/{{@a.0@href##voddetail/(.*).html##$1##}}-1-1.html",
    "ruleNextPage": "text.下页@href",
    "rulePubDate": ".vlength@text",
    "ruleTitle": "a@text",
    "singleUrl": false,
    "sortUrl": "国产色情::/vodtype/12.html\n日本无码::/vodtype/20.html\n自拍偷拍::/vodtype/21.html\n人妻熟女::/vodtype/22.html\n黑人洋屌::/vodtype/23.html\n欧美精品::/vodtype/24.html\n岛国女优::/vodtype/25.html\n萝莉少女::/vodtype/26.html\n国产精品::/vodtype/55.html\n国产直播::/vodtype/56.html\n动漫禁漫::/vodtype/57.html\n黑料吃瓜::/vodtype/58.html\n欧美大屌::/vodtype/60.html\n探花约炮::/vodtype/61.html\n华语精品::/vodtype/63.html\n乱伦精品::/vodtype/64.html\n学生合集::/vodtype/65.html\n卡通动漫::/vodtype/69.html\n乱伦中出::/vodtype/70.html\n传媒原创::/vodtype/71.html\n口爆颜射::/vodtype/72.html\n岛国群交::/vodtype/73.html\n日本有码::/vodtype/74.html\n中文字幕::/vodtype/75.html\n吃瓜爆料::/vodtype/76.html\n角色扮演::/vodtype/77.html\n淫娃自慰::/vodtype/78.html\n日本有码::/vodtype/80.html\n主播网红::/vodtype/81.html\n韩国直播::/vodtype/84.html\n公开漏出::/vodtype/85.html\n日本无码::/vodtype/86.html\n重口调教::/vodtype/88.html\n户外打野::/vodtype/89.html",
    "sourceComment": "shewo1.cc",
    "sourceGroup": "美涩",
    "sourceIcon": "https://baf7baf7.shewo11.cc/template/shewo/images/logo.png",
    "sourceName": "射我里面了",
    "sourceUrl": "https://baf7baf7.shewo11.cc/"
  },
  {
    "articleStyle": 0,
    "customOrder": 571,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; TEL-AN00 Build/HONORTEL-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Mobile Safari/537.36\"}",
    "injectJs": "const video = document.getElementById('video');\n        let isDragging = false;\n        let startX = 0;\n        let startTime = 0;\n\n        video.addEventListener('touchstart', (e) => {\n            isDragging = true;\n            startX = e.touches[0].clientX;\n            startTime = video.currentTime;\n            video.pause();  // 暂停视频\n        });\n\n        video.addEventListener('touchmove', (e) => {\n            if (!isDragging) return;\n            const dx = e.touches[0].clientX - startX;\n            const duration = video.duration;\n            const change = (dx / video.clientWidth) * duration;\n            video.currentTime = Math.min(Math.max(startTime + change, 0), duration);\n        });\n\n        video.addEventListener('touchend', () => {\n            if (isDragging) {\n                video.play();  // 继续播放视频\n                isDragging = false;\n            }\n        });",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.model.data",
    "ruleContent": "<div class=\"container\">\n        <h3>{{$.model.title}}</h3>\n        <div class=\"video-container\">\n            <video id=\"video\" src=\"{{$.model.url}}\" poster=\"{{$.model.coverUrl}}\" controls></video>\n        </div>\n        <hr />\n        <div class=\"info-container\">\n            <p>⌚️ 时长：<span>{{$.model.durationFormat}}</span></p>\n            <p>📆 日期：<span>{{$.model.onlineTime##T|.000.*## }}</span></p>\n            <p>🎥 播放：<span>{{$.model.viewCount}}次</span></p>\n            <p>📩 收藏：<span>{{$.model.collectCount}}</span></p>\n            <p>🕵 片商：<span>{{$.model.authors}}</span></p>\n            <p>👤 上传：<span>{{$.model.uploader}}</span></p>\n            <p>🔖 标签：<span>{{$.model.categories}},{{$.model.tags}}</span></p>\n            <p>🏷 简介：<span>{{$.model.brief}}</span></p>\n        </div>\n    </div>",
    "ruleDescription": "",
    "ruleImage": "$.coverUrl",
    "ruleLink": "https://www.uaa.com/api/video/app/video/intro?force=false&id={{$.id}}&viewId=17225706561773551",
    "ruleNextPage": "page",
    "rulePubDate": "{{$.onlineTime##T.*}} {{$.tags}}",
    "ruleTitle": "$.title",
    "singleUrl": false,
    "sortUrl": "搜索::/api/video/app/video/search?keyword={{source.getVariable()}}&orderType=0&page={{page}}&size=33\n国产视频::/api/video/app/video/search?orderType=1&origin=1&page={{page}}&size=33\n日本AV::/api/video/app/video/search?orderType=1&origin=2&page={{page}}&size=33\nH动漫::/api/video/app/video/search?orderType=1&origin=3&page={{page}}&size=33\n\n观看排行::/api/video/app/video/search?category=&orderType=3&page={{page}}&searchType=1&size=32\n收藏排行::/api/video/app/video/search?category=&orderType=4&page={{page}}&searchType=1&size=32\n\n自拍偷拍::/api/video/app/video/search?category=&keyword=自拍偷拍&orderType=0&page={{page}}&searchType=1&size=32\n探花精选::/api/video/app/video/search?category=&keyword=探花精选&orderType=0&page={{page}}&searchType=1&size=32\n主播福利::/api/video/app/video/search?category=主播福利&orderType=1&page={{page}}&size=33\n",
    "sourceComment": "//改uaa",
    "sourceGroup": "h",
    "sourceIcon": "https://www.uaa.com/assets/uaalogo.7acb1f90.svg",
    "sourceName": "UAA-视频",
    "sourceUrl": "https://www.uaa.com",
    "style": "body {\n            margin: 0;\n            font-family: Arial, sans-serif;\n            background: linear-gradient(135deg, #ece9e6, #ffffff);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: flex-start;\n            padding: 20px;\n        }\n        .container {\n            width: 100%;\n            max-width: 800px;\n            background: #fff;\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n            overflow: hidden;\n            margin-bottom: 20px;\n        }\n        h3 {\n            margin: 0;\n            padding: 10px 20px;\n            font-size: 0.9em;\n            background: #333;\n            color: #fff;\n            border-radius: 10px 10px 0 0;\n        }\n        .video-container {\n            width: 100%;\n            background: #000;\n            position: relative;\n        }\n        video {\n            width: 100%;\n            height: auto;\n            display: block;\n        }\n        .info-container {\n            padding: 20px;\n        }\n        .info-container p {\n            margin: 10px 0;\n            color: #555;\n        }\n        .info-container p span {\n            font-weight: bold;\n            color: #000;\n        }"
  },
  {
    "articleStyle": 3,
    "customOrder": 947,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 1775587987390,
    "loadWithBaseUrl": true,
    "ruleArticles": "article",
    "ruleContent": "class.dplayer@all<js>\nresult=result.match(/http.*0/)[0]##\\</js>{{@@title@text##正在播放:|永久.*}}\n<video src=\"{{result}}\" width=\"100%\" height=\"auto\" controls></video>",
    "ruleImage": "@js:\"https://mgtv-bbqn.oss-cn-beijing.aliyuncs.com/1/2310310103284A29582395A850D3A0F5C26862354MzFE/SrRlbr0.gif\"",
    "ruleLink": "a.0@href",
    "ruleNextPage": "text.下一页@href",
    "rulePubDate": "span.1@text",
    "ruleTitle": "class.post-card-title@text",
    "singleUrl": false,
    "sortUrl": "搜索::/search/{{source.getVariable()}}/{{page}}/\n主播::/search/牛仔裤/{{page}}/\n今日事件::/category/mrxl/\n吃瓜热搜::/category/mldjh/\n学生校园::/category/xyml/\n看片娱乐::/category/ldcz/\n海角乱伦::/category/llsj/\n猎奇事件::/category/qwys/\n动漫大全::\t/category/dmdq/\n精选探花::/category/jxth/\n反差美女::/category/rmbg/\n网红黑料::/category/whmx/\n欧美系列::/category/omxl/\n日韩系列::/category/rhxl/\n户外野外::/category/hwyw/\n调教受虐::/category/tjsn/",
    "sourceComment": "https://mlgc01.co/",
    "sourceGroup": "美涩",
    "sourceIcon": "http://p6.itc.cn/images01/20201202/8d012ed623d647a78635557e7d235ab6.jpeg",
    "sourceName": "91大事件🥝",
    "sourceUrl": "https://jbr7z1.xwgjwrua.cc/"
  },
  {
    "articleStyle": 1,
    "customOrder": 953,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775588065990,
    "loadWithBaseUrl": true,
    "ruleArticles": "article",
    "ruleContent": "class.dplayer@all<js>\nresult=result.match(/http.*0/)[0]##\\</js>{{@@title@text##成人黑料.*}}\n<video src=\"{{result}}\" width=\"100%\" height=\"auto\" controls></video>",
    "ruleImage": "@js:\nvar text = java.getString('script@html');\nvar match = text.match(/loadBannerDirect\\('([^']+)'/);\nvar img = match ? match[1] : '';\nimg;",
    "ruleLink": "a@href",
    "ruleNextPage": "page",
    "rulePubDate": "span.1@text",
    "ruleTitle": "class.post-card-title@text",
    "singleUrl": false,
    "sortUrl": "搜索::/search/{{source.getVariable()}}/{{page}}/\n今日吃瓜::/category/wpcz/{{page}}/\n热门大瓜::/category/rdsj/{{page}}/\n学生校园::/category/xsxy/{{page}}/\n网红黑料::/category/whhl/{{page}}/\n看片娱乐::/category/ysyl/{{page}}/\n乱伦道德::/category/lldd/{{page}}/\n人人吃瓜::/category/rrcg/{{page}}/\n海外吃瓜::/category/hwcg/{{page}}/\n骚男骚女::/category/snsn/{{page}}/",
    "sourceComment": "https://www.doxyoxc.xyz/",
    "sourceGroup": "美涩",
    "sourceIcon": "http://p6.itc.cn/images01/20201202/8d012ed623d647a78635557e7d235ab6.jpeg",
    "sourceName": "51吃瓜🥝",
    "sourceUrl": "https://behind.qjaeyfzu.xyz/"
  },
  {
    "articleStyle": 0,
    "customOrder": 1064,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n\"User-Agent\": \"Mozilla/5.0 (Linux; U; Android 8.1.0; zh-CN; MI 8 Lite Build/OPM1.171019.019) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.2.0.1100 Mobile Safari/537.36\"\n}",
    "lastUpdateTime": 1775588319799,
    "loadWithBaseUrl": true,
    "ruleArticles": "class.module-item",
    "ruleContent": "<div class=\"play_video\">\n{{@@title@text}}{{@@class.player-wrapper@all}}",
    "ruleImage": "img@data-cover",
    "ruleLink": "a.0@href",
    "ruleNextPage": "page",
    "rulePubDate": "class.module-item-caption@text",
    "ruleTitle": "img@alt",
    "singleUrl": false,
    "sortUrl": "最新::https://cn1.91short.com/\n推荐::/short/recommend_home_list/\n美女正妹::/short/label_related_list/Ug_pu_kskqY%3D\n91大神::/short/label_related_list/otDa4t6lDDQ%3D\n门事件::/short/label_related_list/3QW8lOdBcls%3D\n大神::/search?wd=大神\n变量搜索::/search?wd={{java.encodeURI(source.getVariable())}}\n学生::/search?wd=学生\n91::/search?wd=91\n偷情::/search?wd=偷情\n推特::/search?wd=推特\n少女::/search?wd=少女\n贫乳::/search?wd=贫乳\n口交::/search?wd=口交\n妹妹::/search?wd=妹妹\n美女::/search?wd=美女\n\n美臀巨臀::/short/label_related_list/azG9-jZfzG0%3D?title=%E7%BE%8E%E8%87%80%E5%B7%A8%E8%87%80\n后入::/search?wd=后入\n国产高清::/short/home_category_list/hd\n排行::/short/ranking_list\n国产AV::/short/label_related_list/1Bd0Zzp8D_E%3D\n大象传媒::/short/label_related_list/F16wCJ3LmWY%3D\n情趣综艺::/short/label_related_list/-0S1LwkskU4%3D\n推荐2::/film/home_recommend_list\n专题::/film/home_subject_list\n女优::/film/home_actor_list\n无码::/film/home_category_list/coded\n中字::/film/home_category_list/chinese_subtitle\n动漫::/film/home_list/jOSxa-4E27U%3D\n经典三级::/film/home_list/uZg0vDL8P8A%3D\n欧美性爱::/film/home_list/LblejiEnM6s%3D\nAV解说::/film/home_list/vJq_GzRiesQ%3D",
    "sourceComment": "翻页和封面不会\n\n永久域名 https://cn1.91short.com",
    "sourceGroup": "美涩",
    "sourceIcon": "https://cn1.91short.com/public/statics/logo.png",
    "sourceName": "91视频",
    "sourceUrl": "https://cn1.91short.com/",
    "style": "iframe{\n\theight:auto\n}\ntitle{\n\tdisplay:block\n}"
  }
]