[
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": -10100164,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775405861793,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "2222",
    "sourceIcon": "https://nsvod.me/static/ds5/img/favicon.png",
    "sourceName": "耐视点播",
    "sourceUrl": "https://nsvod.me",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": -10100163,
    "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": 1775584094755,
    "loadWithBaseUrl": true,
    "preload": false,
    "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\"}",
    "showWebLog": false,
    "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": "2222",
    "sourceIcon": "https://18oc.life/18link/18j/images/favicon.ico",
    "sourceName": "18J-夜明空",
    "sourceUrl": "https://18oc.life/label/tag/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "contentBlacklist": "https://www.googletagmanager.com/,\nhttps://www.google-analytics.com/",
    "customOrder": -10100162,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "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}",
    "lastUpdateTime": 1776568647397,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": ".item",
    "ruleContent": "\n<div id=\"kt_player\"></div>\n{{@@script.0@all}}\n{{@@script.1@all}}\n",
    "ruleImage": "img@data-original\n<js>\njava.put('pic',result)\n</js>",
    "ruleLink": "{{@@a.0@href##(.*)/videos/##$1##}}/embed/{{@@a.0@href##videos/(.*)/.*/##$1##}}",
    "ruleNextPage": "page",
    "rulePubDate": "{{@@.added@text}} ⏱️{{@@.duration@text}} ",
    "ruleTitle": "@js:\nif (\"{{@@.ico-premium@text}}\"!==\"\"||\"{{@@.ico-private@text}}\"!==\"\"){result=\"\"}else{result=\"{{@@.title@text##.*屎.*|.*Ts.*|.*TS.*|.*ts.*|.*伪娘.*|.*人妖.*|.*男同.*|.*老妈.*|.*水果派.*|.*解说.*|.*摄像头.*|.*嘘嘘.*|.*洗浴.*|.*尿尿.*|.*口活王子.*|.*双性.*|.*熟女.*|.*眼射.*|.*直男.*|.*CD.*|.*肥女.*|.*黄金.*|.*骚0.*|.*gv.*|.*父子.*|.*飞机.*|.*撸.*|.*厕.*|.*老阿姨.*|.*排泄.*|.*poop.*|.*女性向.*|.*马眼.*|.*尸.*|.*奶奶.*|.*骚男.*|.*基友.*|.*美男子.*|.*鸡儿.*|.*坦克.*|.*偸拍.*|.*偷拍.*|.*抄底.*|.*ASMR.*|乱伦|姐弟|兄妹|女儿|母子|父女|亲姐|亲妹|姐姐|妈妈|儿子|爸爸}}\"}",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "\n随机::/latest-updates/?mode=async&function=get_block&block_id=list_videos_latest_videos_list&sort_by=post_date&from={{ Math.ceil(Math.random()*3100) }}\n最新::/latest-updates/{{page}}/\n\n🔎搜索::/search/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=mdyd&from_videos={{page}}\n国产::/categories/578b1514760ab61a070c749150717a81/{{page}}/\n自拍::/categories/1ef21937a5e74ea11c196d9ef3e711b5/{{page}}/\n主播::/categories/eff9e2950ba3b6ab7b4c2ec9f93710c3/{{page}}/\n无码::/categories/439d9c907f8ed7618a580d7a2c535f9c/{{page}}/\n中字::/categories/12b662058ca87e01e828812daf0a8f21/{{page}}/\n有码::/categories/c580d4e1a999ba6d2dce2d3a2781effd/{{page}}/\n热点::/categories/fba0203903081dc916cab34e22d74ab6/{{page}}/\nSM::/categories/bfb7516f1ee5a9975e9d87f7c50b5be5/{{page}}/\n欧美::/categories/637f734f493bfeedbccead08cc3814fc/{{page}}/\n动漫::/categories/bc392163908dbe3c3b79441be0b1fff0/{{page}}/",
    "sourceComment": "https://www.sesesp.info/\nhttps://www.sehhh.cc/\nhttps://www.sepkk.cc/\nhttps://www.sebxx.cc/\nhttps://www.seuu.info/\n备用地址\nhttps://www.seebb.info/\nhttps://www.seppff.cc/\n\n<js>\nresult=java.ajax(\"https://www.sepbx.cc/embed/{{@@a.0@href##videos/(.*)/.*/##$1##}}\");\n</js>",
    "sourceGroup": "2222",
    "sourceIcon": "https://kp-i25985.com/Uploads/vod/2023-06-21/1141.mp4.gif",
    "sourceName": "❀碰碰网  S",
    "sourceUrl": "https://www.sevvz.cc/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": -10100161,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 1774456739906,
    "loadWithBaseUrl": true,
    "preload": false,
    "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",
    "showWebLog": false,
    "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└────────────────┘",
    "sourceGroup": "2222",
    "sourceIcon": "https://ico.img12345.com/jt/favicon.png",
    "sourceName": "粉粉",
    "sourceUrl": "https://eeoopinkyy.cc/pink/index.php/vod/type/id/197.html",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "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,
    "preload": false,
    "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.*|.*父子.*|.*飞机.*|.*撸.*|.*厕.*|.*老阿姨.*|.*乱伦.*|.*[电影].*",
    "showWebLog": false,
    "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": "2222",
    "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",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": -10100159,
    "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\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"}",
    "jsLib": "function getData() {\nvar Data = this.source.getVariable();\nif (Data == \"\" || Data == undefined) {\nreturn {};\n}\ntry {\nreturn JSON.parse(String(Data));\n} catch (e) {\nreturn {};\n}\n}\nfunction getPage() {\nvar data = getData.call(this);\nvar startPage = (data.page == \"\" || data.page == undefined) ? '' : parseInt(data.page)-1;\nreturn startPage;\n}\nfunction getUrl2() {\nvar url2=String(this.source.key).replace(/\\/$/,'');\nreturn url2;\n}",
    "lastUpdateTime": 1775589016933,
    "loadWithBaseUrl": true,
    "loginUi": "[{\"name\": \"起始页码\",\"type\": \"text\"},\n{\"name\": \"🎁 更新书源\",\"type\": \"button\",\"action\":\"https://pc.sysbbs.com/thread-72602-1-1.html\",\"style\": {\n\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.4}},\n{\"name\": \"🌐 打开网站(登录)\",\"type\": \"button\",\"action\": \"web()\",\"style\": {\"layout_flexGrow\": 1,\"layout_flexBasisPercent\": 0.4}}]",
    "loginUrl": "function login() {\nvar loginInfo = source.getLoginInfoMap() || {};\nvar pageInput = loginInfo['起始页码'];\nif (!pageInput || pageInput == \"\" || pageInput == undefined || pageInput == null) {\npageInput = \"1\";\nloginInfo['起始页码'] = pageInput;       source.putLoginInfo(JSON.stringify(loginInfo));\n}\nvar pageData = {\"page\": pageInput};\nsource.setVariable(JSON.stringify(pageData));\n}\nfunction web() {\njava.startBrowser(`{{getUrl2()}}`, baseUrl);\njava.toast('\\n🌐 '+getUrl2());\n}",
    "preload": false,
    "ruleArticles": "@js:\nvar a=java.getElements('.col-xs-12');\nvar b=parseInt(java.getString('.page_number@value'));\n//java.log(b);\nvar c=parseInt(String(java.getString('.pagingnav@form@a.-2@text')));\n//java.log(c);\nif (baseUrl.match(/search_id/)) {\na;\n} else {\njava.toast('\\n📚 第'+b+'/'+c+'页');\na;\n}",
    "ruleContent": "<js>\nvar step1 = java.base64Decode('PGpzPgp2YXIgYT1zb3VyY2Uuc291cmNlQ29tbWVudDsKdmFyIGQ9amF2YS5iYXNlNjREZWNvZGUoJzVMMmM2SUNGNzd5YTVhU2M1cGlPNTZtNkNpOHY1cnFRNTZTKzVZeTY3N3lhYUhSMGNITTZMeTl3WXk1emVYTmlZbk11WTI5dEN1S2FvTys0aitTNHBlZW1nZVdJaHVTNnErT0FnZVdBa3VXTmx1V1BpdVM3dStTOWxlaS9uZWF6bGVpaGpPUzR1dSs4Z2VTOXYrZVVxT2lBaGVpSHF1aWhqT2FKdithTGhlbWpqdW1acWVTNGp1aTBvK1M3dXdvOEwrV2pzT2FZamo0PScpOwppZihhLmluY2x1ZGVzKGQpKXsKdmFyIGNvbnQgPQpqYXZhLmJhc2U2NERlY29kZSgnUEdwelBncDJZWElnYUhSdGJDQTlJR3BoZG1FdVoyVjBVM1J5YVc1bktDY2pjR3hoZVdWeVgyOXVaVUJ6WTNKcGNIUkFhSFJ0YkNjcE93cDJZWElnWlc1amIyUmxaRTFoZEdOb0lEMGdhSFJ0YkM1dFlYUmphQ2d2Wkc5amRXMWxiblJjTG5keWFYUmxYQ2h6ZEhKbGJtTnZaR1V5WENoYklpZGRLRnRlSWlkZEt5bGJJaWRkWENsY0tTOHBPd3AyWVhJZ1pXNWpiMlJsWkNBOUlHVnVZMjlrWldSTllYUmphQ0EvSUdWdVkyOWtaV1JOWVhSamFGc3hYU0E2SUc1MWJHdzdDbWxtSUNobGJtTnZaR1ZrS1NCN0NuWmhjaUJrWldOdlpHVmtJRDBnWkdWamIyUmxWVkpKUTI5dGNHOXVaVzUwS0dWdVkyOWtaV1FwT3dwMllYSWdjM0pqVFdGMFkyZ2dQU0JrWldOdlpHVmtMbTFoZEdOb0tDOXpjbU5jY3lvOVhITXFXeUluWFNoYlhpSW5YU3NwV3lJblhTOHBPd3BwWmlBb2MzSmpUV0YwWTJnZ0ppWWdjM0pqVFdGMFkyaGJNVjBwSUhzS2RtRnlJSFZ5YkNBOUlITnlZMDFoZEdOb1d6RmRPd3AyWVhJZ1ZWSk1JRDBnZFhKc0xuSmxjR3hoWTJVb0x5Wm1QVnRlSmwwcUx5d25KeWs3Q2xWU1REc0tmUXA5Q2p3dmFuTSsnKTsKcmVzdWx0ID0gamF2YS5nZXRTdHJpbmcoY29udCk7Cn0gZWxzZSB7CmVycm9yPWphdmEuYmFzZTY0RGVjb2RlKCc0cHFnNzdpUElPYWpnT2ExaStXSXNPUzVwdWE2a09paXErYUJ0dWFFaitldm9lYVV1UXJpclpBZzZLKzM1WW1ONWI2QTVMMmM2SUNGNUxpNzZhRzE1cHUwNXBhdzVMbW01cnFRS09XRnMrbVhyZVdIZ09XTWx1YVl2dWVrdXVtVHZ1YU9wU252dkpvS2FIUjBjSE02THk5dExuTjVjMkppY3k1amIyMEs0cTJRSU9hUW5PZTBvdWVVcU9hSXQrV1FqZSs4bXVXa25PYVlqdWVwdWc9PScpOwpyZXN1bHQ9amF2YS5sb25nVG9hc3QoJ1xuJytlcnJvcik7CnJlc3VsdD0nXG4mbHJtO1xuJytlcnJvcjsKfQpyZXN1bHQKPC9qcz4=');\nvar step2 = java.getString(step1);\nresult = step2\n</js>",
    "ruleImage": "img@src",
    "ruleLink": "a@href",
    "ruleNextPage": "page",
    "rulePubDate": "<js>\nvar html = String(java.getString('.well@text'));\nvar resultParts = [];\nvar time=java.getString('.duration@text');\nresultParts.push('🔁' + time);\n\nvar data = html.replace(/.*添加时间:([^作者]+)作者.*/, '$1').replace(/\\s*/g, '');\nif (data && data.trim() !== '' && data !== html) {\nresultParts.push('⏰' + data);\n}\nvar author = html.replace(/.*作者:([^热度]+)热度.*/, '$1');\nif (author && author.trim() !== '' && author !== html) {\nresultParts.push('👤' + author);\n}\nvar hotMatch = html.match(/.*热度:([^收藏]+)收藏.*/);\nif (hotMatch && hotMatch[1]) {\nvar hot = parseInt(hotMatch[1].trim());\nif (!isNaN(hot) && hot !== 0) {\nresultParts.push('🔥' + hot);\n}\n}\nresultParts.join(' ')\n</js>",
    "ruleTitle": ".video-title@text",
    "searchUrl": "/search_result.php?viewtype=basic&search_type=search_videos&search_id={{key}}&min_duration=10&page={{page}}",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "最新::/v.php?next=watch&page=<{{page+getPage()}}>\n91原创::/v.php?category=ori&viewtype=basic&page=<{{page+getPage()}}>\n当前最热::/v.php?category=hot&viewtype=basic&page=<{{page+getPage()}}>\n本月最热::/v.php?category=top&viewtype=basic&page=<{{page+getPage()}}>\n10分钟以上::/v.php?category=long&viewtype=basic&page=<{{page+getPage()}}>\n20分钟以上::/v.php?category=longer&viewtype=basic&page=<{{page+getPage()}}>\n本月收藏::/v.php?category=tf&viewtype=basic&page=<{{page+getPage()}}>\n最近加精::/v.php?category=rf&viewtype=basic&page=<{{page+getPage()}}>\n高清::/v.php?category=hd&viewtype=basic&page=<{{page+getPage()}}>\n每月最热::/v.php?category=top&m=-1&viewtype=basic&page=<{{page+getPage()}}>\n本月讨论::/v.php?category=md&viewtype=basic&page=<{{page+getPage()}}>\n收藏最多::/v.php?category=mf&viewtype=basic&page=<{{page+getPage()}}>",
    "sourceComment": "<声明>\n//2025.12.5 作者：夜明空\n//源社区：https://pc.sysbbs.com\n⚠️严禁分享、倒卖及任何违法行为！使用者自行承担风险与责任\n</声明>\n\n💡 使用说明\n1、需要挂梯；\n2、登录界面可控制页码；\n3、请使用洛娅橙版阅读，否则没有搜索功能，也无法播放视频；如果先导入了旧版阅读，发现没有搜索功能(如果有搜索可无视本条说明)，需要到作者原帖下载初始订阅源再导入；\n4、登录后搜索才有结果，但是搜索有间隔，且有观看次数限制，不建议使用登录；\n5、注意一下最大页码，到最后一页还继续往下拉，会返回前面几章无限轮回；\n\n//洛娅橙魔改版阅读：\nhttps://gitee.com/lyc486/legado/releases\n\n//疑似永久域名：http://91p676.com\n//同类：\nhttps://a1019.9p58b.com/index.php\nhttps://f1011.a2507app.com/index.php",
    "sourceGroup": "2222",
    "sourceIcon": "http://img95.699pic.com/xsj/1r/73/9i.jpg",
    "sourceName": "✈️91PORN\n☆夜明空☆",
    "sourceUrl": "https://f1011.a2507app.com/index.php",
    "type": 2,
    "variableComment": "❌ 请勿修改此处内容，请自行查看源注释"
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "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,
    "preload": false,
    "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.*|.*父子.*|.*飞机.*|.*撸.*|.*厕.*|.*老阿姨.*|.*乱伦.*",
    "showWebLog": false,
    "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": "2222",
    "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",
    "type": 0
  },
  {
    "articleStyle": 3,
    "cacheFirst": false,
    "customOrder": -10100157,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775591744706,
    "loadWithBaseUrl": true,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "2222",
    "sourceIcon": "https://img4.tuwandata.com/v2/thumb/jpg/NWFkMywxMTI1LDAsOSwzLDEsLTEsTk9ORSwsLDkw/u/res.tuwan.com/zipgoods/20190508/3b6408c569f8eb687a8dd6eb3578bdb9.jpg",
    "sourceName": "姐姐视频",
    "sourceUrl": "https://wap.jiejiesp19.xyz",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "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": 1774474850215,
    "loadWithBaseUrl": true,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "2222",
    "sourceIcon": "https://img0.baidu.com/it/u=2908908160,2785784129&fm=253&fmt=auto&app=138&f=PNG",
    "sourceName": "葫芦视频",
    "sourceUrl": "https://77gmk8o.com",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": -100942,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "阅读,书源",
    "sourceIcon": "https://i.loli.net/2021/06/23/S7rvWRZtPIq34MJ.png",
    "sourceName": "源仓库",
    "sourceUrl": "http://www.yckceo.vip",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "1",
    "sourceIcon": "",
    "sourceName": "源仓库(官方纯净)",
    "sourceUrl": "http://yckceo.vip",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 2,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/012.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.0 Mobile Safari/533.4 3gpp-gba\"}",
    "lastUpdateTime": 1774456899623,
    "loadWithBaseUrl": true,
    "loginUrl": "https://yckceo.vip/",
    "preload": false,
    "ruleArticles": "class.ylist",
    "ruleContent": "head@all&&class.m-top@all",
    "ruleLink": "a@href",
    "rulePubDate": "{{@@h2@p@text}} {{@@tag.span@text&&tag.span.2@title}}\n@js:result.replace(/\\n/g,'  ').replace(/\\s+[23]\\.X/,'').replace(/用户[: ：]+/,'👤').replace(/ 下载[: ：](\\d+)\\s*UID[:：](\\d+)/,'(UID: $2)  📥$1').replace(/下载[：: ]+/,'📥').replace(/源数量[：:](\\d+)/,'📝$1个源')",
    "ruleTitle": "名称：{{//h2/a[1]/text()##http.*}}\n网址：{{//h2/a[1]/text()##.*(http)##$1}}\n@js:result.replace(/([\\s\\S]{4,}?)(?:\\s+)?\\1/g, '$1')",
    "searchUrl": "/yuedu/shuyuan/index.html?keys={{key}}&uid=&order1=time&order2=1&ver=&faxian=&sousuo=&x18=<,&page={{page}}>",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "📖书源::/yuedu/shuyuan/index.html?page={{page - 1 == 0 ? \"\": page}}\n🔰订阅源::/yuedu/rss/index.html?page={{page}}\n📖书源合集::/yuedu/shuyuans/index.html?page={{page}}\n🔰订阅源合集::/yuedu/rsss/index.html?page={{page}}\n\n🔎搜书源::/yuedu/shuyuan/index.html?keys={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">请输入关键词</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&uid=&order1=time&order2=1&ver=&faxian=&sousuo=&x18=<,&page={{page}}>\n🔎搜订阅::/yuedu/rss/index.html?keys={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">请输入关键词</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&uid=&order1=time&order2=1&ver=&faxian=&sousuo=&x18=<,&page={{page}}>\n👤搜书源(UID)::/yuedu/shuyuan/index.html?keys=&uid={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">请输入UID</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&order1=time&order2=1&ver=&faxian=&sousuo=&x18=<,&page={{page}}>\n👤搜订阅(UID)::/yuedu/rss/index.html?keys=&uid={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">请输入UID</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&order1=time&order2=1&ver=&faxian=&sousuo=&x18=<,&page={{page}}>",
    "sourceComment": "by：旅途\n改：歌行灯\n弹窗搜索的代码是从关耳大大那抄的\n————————————\n【地址失效的解决方法】\n若地址失效导致订阅源失效，可于登录处进入源仓库最新地址发布页，从发布页复制最新可用地址粘贴到源URL处，然后退出重进即可。\n————————————\n【如何搜索】\n点击（或下拉）标有🔎或👤的列表，会弹出提示框，填写关键词或UID即可。也可直接在源变量处填写关键词/UID（记得保存并刷新分类）\n（昵称后面的括号里那串数字就是UID，注意不要填“UID:”这几个字符，只用填数字）\n如果你填的是源名称，那么结果在🔎处查看；如果你填的是源作者的UID，那么结果在👤处查看。\n阅读Sigma版可点击右上角搜索按钮，输入关键词搜索书源。\n————————————\n修复源URL与源名称一样时重复显示4遍的问题（2026.2.3@歌行灯）",
    "sourceGroup": "2222",
    "sourceIcon": "data:image/png;base64,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",
    "sourceName": "源仓库\n(看注释)",
    "sourceUrl": "https://www.yck2026.top",
    "type": 0,
    "variableComment": "请填写搜索关键词或UID\n若列表没有刷新请手动 右上三个点【刷新分类】\n"
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 2,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 1776139801389,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "2222",
    "sourceIcon": "https://cdn.jsdelivr.net/gh/gedoor/legado@master/app/src/main/res/mipmap-hdpi/ic_launcher.png",
    "sourceName": "使用说明",
    "sourceUrl": "https://www.yuque.com/legado",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 3,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "legado",
    "sourceIcon": "http://mmbiz.qpic.cn/mmbiz_png/hpfMV8hEuL2eS6vnCxvTzoOiaCAibV6exBzJWq9xMic9xDg3YXAick87tsfafic0icRwkQ5ibV0bJ84JtSuxhPuEDVquA/0?wx_fmt=png",
    "sourceName": "小说拾遗",
    "sourceUrl": "snssdk1128://user/profile/562564899806367",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "contentBlacklist": ".+abe.ymmiyun.com.+,.+star.xfztgxt.com.+,.+jjpp.lmtjapi.com.+",
    "customOrder": 3,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "@js:\ncache.putMemory('yckdm',String.raw`\njava.toast('地址发布页 yckceo.vip');\nvar surl='https://yckceo.vip', mint=9999;\r\nvar rr=java.ajax(surl);\r\nrr = org.jsoup.Jsoup.parse(rr);\nrr = rr.select(\"#urllist a:not([href='#'])\");\nrr.length<2&&java.longToast('发布页访问异常');\nPackages.java.util.Collections.reverse(rr);\r\nlet aly = new JavaImporter(Packages.org.jsoup.Jsoup, Packages.org.jsoup.Connection);\r\nfor (char of rr) {\r\n\tlet url = char.attr(\"href\");\r\n\turl = 'https://' + String(url).replace(/^.*\\//, '');\r\n\ttry {\r\n\tlet st = Date.now();\r\n\t\twith (aly) {\r\n\t\t\tJsoup.connect(url)\r\n\t\t\t\t.timeout(5000)\r\n\t\t\t\t.ignoreContentType(true)\r\n\t\t\t\t.followRedirects(false)\r\n\t\t\t\t.method(Connection.Method.HEAD)\r\n\t\t\t\t.execute()}\r\n\tlet et = Date.now();\n\turl+=(cache.get('yckwb')||'');\r\n\tlet tm = et-st;\r\n\tif (tm<900) {surl=url; break;}\r\n\tif (tm<mint) {mint=tm;surl=url;}\r\n\t} catch(err) {}\r\n}\ntry {\ncookie.setCookie(surl,source.getLoginHeaderMap().Cookie);\n} catch(e) {cookie.removeCookie(surl);}\nsurl\r\n`);\r\nJSON.stringify({\"User-Agent\":java.getWebViewUA().replaceAll(\"; wv| Version\\/4.0\",'')});",
    "jsLib": "qiehuanlib=[{首页:\"\"},{阅读:\"/yuedu/index/index.html\"},{书源:\"/yuedu/shuyuan/index.html\"},{书源合集:\"/yuedu/shuyuans/index.html\"},{订阅源:\"/yuedu/rss/index.html\"},{订阅源合集:\"/yuedu/rsss/index.html\"},{其它:\"/yuedu/tools/index.html\"}];",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUi": "[\n {\n \"name\": \"📌切换起始页\",\n \"type\": \"button\",\n \"action\": \"qiehuan()\",\n \"style\": {\n \t\"layout_flexGrow\": 0,\n \t\"layout_flexBasisPercent\": -1,\n  \"layout_wrapBefore\": true}\n },\n {\n \"name\": \"📝登录\",\n \"type\": \"button\",\n \"action\": \"denglu()\",\n \"style\": {\n  \"layout_flexGrow\": 0,\n  \"layout_flexBasisPercent\": -1,\n  \"layout_wrapBefore\": false}\n }\n]",
    "loginUrl": "function login(){}\nfunction qiehuan(){\n\tlet nm = source.get('ycknm');\n\tif(nm==''||nm>6) {nm=0;}\n\tlet qh = qiehuanlib[nm];\n\tlet key = Object.keys(qh)[0];\n\tlet value = qh[key];\n\tcache.put('yckwb',value);\n\tjava.longToast('\\n起始页已设为\\n'+key);\n\tnm++;\n\tsource.put('ycknm',nm);\n}\nfunction denglu(){\n\tlet url=eval(String(cache.getFromMemory('yckdm'))).match(/^http.{4}[^\\/]+/);\n\tif (url) {\n\tjava.startBrowserAwait(url,'登录');\n\tPackages.java.lang.Thread.sleep(50);\n let ck=cookie.getCookie(url)+'';\nif (!ck.includes('token')) java.toast('💔登录失败');\nelse source.putLoginHeader(`{Cookie: \"${ck}\"}`),java.toast('🎉登录成功');\n\t\t} else java.toast('获取网址失败');\n}",
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceIcon": "https://gitee.com/lyc486/yuedu/raw/master/ycktb.gif",
    "sourceName": "源仓库",
    "sourceUrl": "http@js:eval(String(cache.getFromMemory('yckdm')))",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 3,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "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": 1675946926480,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "id.content@h3",
    "ruleLink": "a@href",
    "ruleTitle": "a@textNodes",
    "showWebLog": false,
    "singleUrl": true,
    "sortUrl": "首页::http://yuedu.miaogongzi.net/gx.html",
    "sourceGroup": "书源",
    "sourceIcon": "data:image/png;base64,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",
    "sourceName": "喵公子书源管理",
    "sourceUrl": "http://yuedu.miaogongzi.net/gx.html",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 5,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "legado",
    "sourceIcon": "https://cdn.jsdelivr.net/gh/mgz0227/meowcloud/icon.png",
    "sourceName": "Meow云",
    "sourceUrl": "https://pan.miaogongzi.net",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 5,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "legado",
    "sourceIcon": "https://cdn.jsdelivr.net/gh/gedoor/legado@master/app/src/main/res/mipmap-hdpi/ic_launcher.png",
    "sourceName": "烏雲净化",
    "sourceUrl": "https://www.lanzout.com/b0bw8jwoh",
    "type": 0
  }
]