[
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": -10100155,
    "enableJs": true,
    "enabled": false,
    "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": "legado",
    "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": true,
    "contentBlacklist": ".*(?:jads.co|googlesyndication|googletagmanager|creative|infinity.js.aspx|cdn.jsdelivr|creative.*widgets).*",
    "customOrder": -10100152,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "header": "@js:\n(()=>{\nlet headerss={};\nheaderss['User-Agent']=java.getWebViewUA();\n return JSON.stringify(headerss);\n})();",
    "injectJs": "Artplayer.PLAYBACK_RATE = [0.6, 1, 2, 4, 6];\nArtplayer.FAST_FORWARD_TIME = 500;\nArtplayer.MOBILE_DBCLICK_PLAY = false;\nArtplayer.DBCLICK_FULLSCREEN = false;\nArtplayer.TOUCH_MOVE_RATIO = 0.1;\n// 生成唯一ID\nfunction generateUniqueId() {\n    return 'artplayer-' + Date.now() + '-' + Math.random().toString(36).slice(2, 9);\n}\n\n// 视频替换函数（带防抖）\nlet replaceTimeout;\n\nfunction replaceVideos() {\n    clearTimeout(replaceTimeout);\n    replaceTimeout = setTimeout(() => {\n        document.querySelectorAll('video').forEach(video => {\n            try {\n\n                // 获取视频源\n                const videoSrc = video.currentSrc || video.getAttribute('src');\n                if (!videoSrc) return;\n                        const posterSrc = video.poster || video.getAttribute('poster') || '';\n\n                // 创建容器（继承样式）\n                var container = document.createElement('div');\n                container.id = generateUniqueId();\n                container.style.width = '100%';\n                //container.className = video.className;\n                container.style.aspectRatio = '16/9';\n\n                // 替换元素\n                video.parentNode.replaceWith(container);\n\n                // 初始化播放器（继承配置）\n                var art = new Artplayer({\n                    container: '#' + container.id,\n                    url: videoSrc,\n                    poster:posterSrc,\n                    theme: '#ffad00',\n                    autoplay: false,\n                    muted: false,\n                    fullscreen: true,\n                    autoSize: true,\n                    autoMini: false,\n                    playbackRate: true,\n                    setting: true,\n                    lock: true,\n                    gesture: true,\n                    fastForward: true,\n                    autoPlayback: true,\n                    autoOrientation: true,\n                });\n\n                art.on('dblclick', (event) => {\n                    event.stopImmediatePropagation();\n                    event.stopPropagation();\n                    event.preventDefault();\n                    const tmz = +\"20\";\n                    const clix = event.clientX;\n                    const rwid = art.rect.width;\n                    if (clix < rwid / 3) art.backward = tmz;\n                    else if (clix > rwid * 2 / 3) art.forward = tmz;\n                    else art.toggle();\n                });\n\n            } catch (e) {\n                console.log('🌈🌈🌈ArtPlayer init error:' + e);\n            }\n        });\n    }, 100);\n}\n\n// 初始执行\nreplaceVideos();\n\n// 页面卸载时清理\nwindow.addEventListener('beforeunload', () => {\n    clearTimeout(replaceTimeout);\n});",
    "lastUpdateTime": 1773945742824,
    "loadWithBaseUrl": true,
    "preload": false,
    "preloadJs": "// 捕获阶段阻止所有dblclick事件（包括动态添加的元素）\ndocument.addEventListener('dblclick', e => {\n  e.stopImmediatePropagation();\n  e.preventDefault();\n}, true); // true表示捕获阶段\n    // 定义去广告的函数\n    function removeAds() {\n        // 例子：通过 class 名称移除广告\n        const adClasses = ['ad-banner', 'ad-container', 'ad-sidebar', 'popup-ad']; // 替换为实际广告的 class 名\n        adClasses.forEach(className => {\n            const ads = document.querySelectorAll(`.${className}`);\n            ads.forEach(ad => ad.remove());\n        });\n\n        // 例子：通过 id 移除广告\n        const adIds = ['watch-footer', 'mobile-ad', 'interstitial-ad']; // 替换为实际广告的 id 名\n        adIds.forEach(id => {\n            const ad = document.getElementById(id);\n            if (ad) ad.remove();\n        });\n\n        // 例子：移除某些广告标签（比如 iframe 广告）\n        const adTags = ['iframe', 'ins']; // 替换为常用的广告标签\n        adTags.forEach(tag => {\n            const ads = document.querySelectorAll(tag);\n            ads.forEach(ad => {\n                if (ad.src && ad.src.includes('ads')) { // 检查 URL 中是否包含 \"ads\"\n                    ad.remove();\n                }\n            });\n        });\n    }\n    \n\ndocument.addEventListener('DOMContentLoaded', function() {\n     // 初次加载时移除广告\n    removeAds();\n});\n// 处理单页应用或动态导航\n    window.addEventListener('popstate', removeAds); // 监听浏览器的前进/后退操作\n    window.addEventListener('hashchange', removeAds); // 监听 URL 的哈希变化（单页应用常用）\n    \n\n/*\n(function () {\n    // 创建 MutationObserver 监听 DOM 的变化\n    const observer = new MutationObserver(() => {\n        removeAds(); // 每次 DOM 发生变化时执行去广告\n    });\n    // 开始监听\n    observer.observe(document.body, {\n        childList: true, // 监听子节点变化\n        subtree: true // 监听整个子树\n    });\n    \n})();\n*/\n\n\n    // 加载 ArtPlayer\nconst script = document.createElement('script');\nconst SCRIPT_URL = 'https://unpkg.com/artplayer/dist/artplayer.js';\nconst cachedScript = localStorage.getItem(\"artplayer_dm\");\nif (cachedScript) {\n  loadScriptFromString(cachedScript);\n} else {\n  fetch(SCRIPT_URL)\n    .then(res => res.text())\n    .then(scriptText => {\n        localStorage.setItem(\"artplayer_dm\", scriptText);\n        loadScriptFromString(scriptText);\n    });\n}\n// 工具函数：加载脚本\nfunction loadScriptFromString(content) {\nscript.textContent = content;\ndocument.head.appendChild(script);}\n",
    "shouldOverrideUrlLoading": "/zh.stripchat.com/.test(url)",
    "showWebLog": true,
    "singleUrl": true,
    "sourceComment": "版本：0.0.1",
    "sourceGroup": "vpn",
    "sourceIcon": "https://vdownload.hembed.com/image/icon/tab_logo.png?secure=EJYLwnrDlidVi_wFp3DaGw==,4867726124",
    "sourceName": "hanime（黄漫视频）",
    "sourceUrl": "https://hanime1.me/",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": -10100133,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 1774474876972,
    "loadWithBaseUrl": true,
    "preload": false,
    "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",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "🔎 视频搜索::/api.php/provide/vod/?ac=detail&pg={{page}}&wd=巨乳\n\n精品推荐::/index.php/provide/vod/?ac=detail&pg={{page}}&t=1\n国产视频::/index.php/provide/vod/?ac=detail&pg={{page}}&t=2\n主播直播::/index.php/provide/vod/?ac=detail&pg={{page}}&t=3\n日本无码::/index.php/provide/vod/?ac=detail&pg={{page}}&t=4\n日本有码::/index.php/provide/vod/?ac=detail&pg={{page}}&t=5\n中文字幕::/index.php/provide/vod/?ac=detail&pg={{page}}&t=6\n巨乳美乳::/index.php/provide/vod/?ac=detail&pg={{page}}&t=7\n制服丝袜::/index.php/provide/vod/?ac=detail&pg={{page}}&t=34\n角色扮演::/index.php/provide/vod/?ac=detail&pg={{page}}&t=35\n熟女人妻::/index.php/provide/vod/?ac=detail&pg={{page}}&t=8\n强奸乱伦::/index.php/provide/vod/?ac=detail&pg={{page}}&t=9\n欧美精品::/index.php/provide/vod/?ac=detail&pg={{page}}&t=10\n少女萝莉::/index.php/provide/vod/?ac=detail&pg={{page}}&t=11\n三级伦理::/index.php/provide/vod/?ac=detail&pg={{page}}&t=12\n成人动漫::/index.php/provide/vod/?ac=detail&pg={{page}}&t=13\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=14\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=15\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=16\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=17\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=18\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=19\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=20\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=21\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=22\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=23\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=24\n成人2动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=25\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=26\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=27\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=28\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=29\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=30\n成人动漫::/api.php/provide/vod/?ac=detail&pg={{page}}&t=31",
    "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": "vpn",
    "sourceIcon": "https://i.postimg.cc/sXtXHZDM/IMG_20220716_190738.png",
    "sourceName": "探探测试",
    "sourceUrl": "https://shayuapi.com",
    "style": "h3{text-align:center}\nh6{margin-bottom:0}\nb{float:right}\n\nvideo{width:100%;max-height:285px;border-radius:5px}",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": -10098512,
    "enableJs": true,
    "enabled": false,
    "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": 1774475138312,
    "loadWithBaseUrl": true,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "vpn",
    "sourceIcon": "https://z3.ax1x.com/2021/05/04/gnLfmD.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        }",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": false,
    "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\"}",
    "lastUpdateTime": 1775646552526,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "$.model.data",
    "ruleContent": "<!-- <p>http://play.eeefun.cc/?url=={{$.model.url}}</p> -->\n<!-- <iframe src='http://play.eeefun.cc/?url={{$.model.url}}'></iframe> -->\n<hr />\n<p>播放地址: {{$.model.url}}</p>\n<iframe src=\"https://tools.liumingye.cn/m3u8/#{{$.model.url}}\"></iframe>\n<details>\n  <summary>\n    <h3>{{$.model.title}}</h3>\n  </summary>\n  <img src={{$.model.coverUrl}}>\n  <div>\n    <p>⌚️ 时长：{{$.model.durationFormat}}</p>\n    <p>📆 日期：{{$.model.onlineTime##T|.000.*## }}</p>\n    <p>🎥 播放：{{$.model.viewCount}}次</p>\n    <p>📩 收藏：{{$.model.collectCount}}</p>\n    <p>🕵 片商：{{$.model.authors}}</p>\n    <p>👤 上传：{{$.model.uploader}}</p>\n    <p>🔖 标签：{{$.model.categories}},{{$.model.tags}}</p>\n    <p>🏷 简介：{{$.model.brief}}</p>\n</details>",
    "ruleImage": "$.coverUrl",
    "ruleLink": "https://api.uaa.com/video/app/video/intro?force=false&id={{$.id}}&viewId=16887182234803442",
    "ruleNextPage": "page",
    "rulePubDate": "{{$.vip##1##VIP}} {{$.onlineTime##T.*}} {{$.tags}}##^0##免费",
    "ruleTitle": "$.title",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "变量搜索::/video/app/video/search?keyword={{v=source.getVariable();if(/^\\s*$/.test(v)||v==null)source.setVariable('无码');source.getVariable()}}&orderType=0&page={{page}}&size=33\n\n最新排行::/video/app/video/search?category=&orderType=1&page=1&size=33\n\n观看排行::/video/app/video/search?category=&orderType=-1&page=1&size=33\n\n收藏排行::/video/app/video/search?category=&orderType=4&page=1&size=33\n\nH动漫::/video/app/video/search?orderType=1&origin=3&page={{page}}&size=33\n\n\n泡面番::/video/app/video/search?category=%E6%B3%A1%E9%9D%A2%E7%95%AA&orderType=1&page={{page}}&size=33\n\n国产视频::/video/app/video/search?orderType=1&origin=1&page={{page}}&size=33\n\n\n少女萝莉::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=少女萝莉\n\n白虎::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=白虎\n\n自拍偷拍::/video/app/video/search?category=自拍偷拍&orderType=1&page={{page}}&size=33\n\n探花精选::/video/app/video/search?category=探花精选&orderType=1&page=1&size=33\n\n\n主播福利::/video/app/video/search?category=主播福利&orderType=1&page=1&size=33\n\n\n日本AV::/video/app/video/search?orderType=1&origin=2&page={{page}}&size=33\n\n\n制服诱惑\n丝袜网袜::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=丝袜网袜\n泳装水着::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=泳装水着\nJK制服::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=JK制服\n女仆::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=女仆\n吊带袜::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=吊带袜\n兔女郎::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=兔女郎\n伪娘::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=伪娘\n\n身材样貌\n苗条::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=苗条\n美腿美脚::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=美腿美脚\n美臀::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=美臀\n熟女::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=熟女\n巨乳::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=巨乳\n\n交合喜好\n颜射::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=颜射\n足交::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=足交\n肛交::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=肛交\n潮吹::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=潮吹\n口交::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=口交\n69::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=69\n乳交::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=乳交\n内射中出::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=内射中出\n\n\n刺激玩法\n捆绑调教::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=捆绑调教\n痴女痴汉::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=痴女痴汉\n强奸轮奸::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=强奸轮奸\n3P群交::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=3P群交\n奇异催眠::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=奇异催眠\n出轨::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=出轨\n家庭乱伦::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=家庭乱伦\nNTR::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=NTR\n\n\n角色扮演\n医生护士::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=医生护士\n空中女郎::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=空中女郎\n未亡人::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=未亡人\n老师校园::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=老师校园\n人妻主妇::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=人妻主妇\nOL::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=OL\n姐姐妹妹::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=姐姐妹妹\n母亲女儿::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=母亲女儿\nTS人妖::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=TS人妖\n女高中生::/video/app/video/search?orderType=1&page={{page}}&size=33&tag=女高中生\n",
    "sourceComment": "//网页网址 https://www.uaa.com/video\n//VIP可以观看\n//搬运，请注明源作者😎",
    "sourceGroup": "vpn",
    "sourceIcon": "https://www.uaa.com/assets/uaalogo.7acb1f90.svg",
    "sourceName": "UAA/友爱-视频",
    "sourceUrl": "https://api.uaa.com",
    "style": "*{\n\tz-index:0;\n\tmargin:0;\n\tpadding:0;\n\twidth:99.3%;\n\theight:auto;\n}\n\np{\n\ttext-indent:5px;\n}\nbody>p:first-of-type{\n\twidth:100%;\n\tposition:sticky;\n\ttop:0.3px;\n\theight:15px;font-size:0.7rem;\n\tborder-radius:5px 5px 5px 5px;\n\tbackground:#000;color:#fff;\n\twhite-space:nowrap;\n\toverflow:auto;\n\tz-index:4;\n}\niframe{\n\tposition:sticky;top:16;\n\tbackground:#000;color:#fff;\n\tborder-radius:10px 10px 10px 10px;\t\n\theight:285px;\n\tz-index:3;\n}\n\ndetails{\n\twidth:90%;\n\tmargin:0 5%;\n\tpadding:10px;\n}\n\nsummary{\n\twidth:90%;\n\tmargin:0.5%;\n\toutline:none;\n\ttext-align:center;\n \t}",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775405861793,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "legado",
    "sourceIcon": "https://nsvod.me/static/ds5/img/favicon.png",
    "sourceName": "耐视点播",
    "sourceUrl": "https://nsvod.me",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": false,
    "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": "legado",
    "sourceIcon": "https://18oc.life/18link/18j/images/favicon.ico",
    "sourceName": "18J-夜明空",
    "sourceUrl": "https://18oc.life/label/tag/",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 2,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 1776044035231,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.list-col",
    "ruleContent": "<html>\n<head>\n<title>{{@.dropdown-menu.series_drop@p@text}}{{@@title@text}}</title>\n{{@meta@html}}\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.19.0/js/md5.min.js\"></script>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css\">\n</head>\n<body>\n<button id=\"detail-button\" class=\"is-detail\">\n    <div class=\"hamburger\">\n        <span></span>\n        <span></span>\n        <span></span>\n    </div>\n</button>\n\n<button id=\"auto-scroll-button\" class=\"floating-btn\">\n    <i class=\"fas fa-play\"></i>\n</button>\n\n<button id=\"comment-button\" class=\"floating-comment-btn\">\n    <i class=\"fas fa-comments\"></i>\n</button>\n\n<div style=\"display:none\">{{@.dropdown-menu.series_drop@html}}</div>\n<div id=\"comic-content\" class=\"comic-content\" style=\"display:none;\">\n    <div class=\"loading\" id=\"initial-loading\">正在加载漫画...</div>\n</div>\n<div id=\"detail-page\" class=\"detail-container\"></div>\n<div id=\"bottom-loader\" class=\"loading\" style=\"display:none\"></div>\n<div id=\"end-message\" class=\"end-message\">已经到底了</div>\n\n<script>\nlet isDetailView = true,\n    currentChapters = [],\n    activeChapterIndex = -1,\n    config = {\n        currentChapter: 1,\n        totalChapters: 0,\n        isLoading: false,\n        hasMore: true,\n        nextChapterUrl: null\n    },\n    comicScrollPosition = 0,\n    commentsCurrentPage = 1,\n    commentsIsLoading = false,\n    commentsHasMore = true,\n    currentTab = 'chapters',\n    currentChapterId = null;\n\nlet currentChapterImages = [];\nlet displayedImagesCount = 0;\nlet imagesPerBatch = 300;\nlet batchLoading = false;\nlet allImagesLoaded = false;\n\nlet autoScrollEnabled = false;\nlet autoScrollAnimationId = null;\nlet autoScrollSpeed = 180;\n\nlet chapterReadStatus = {};\nlet lastActiveChapter = null;\n\nconst getMetaContent = p => {\n        const el = document.querySelector(`meta[property=\"${p}\"], meta[name=\"${p}\"]`);\n        return el ? el.getAttribute('content') || '' : '';\n    },\n    getSeriesId = () => {\n        const url = getMetaContent('og:url') || window.location.href;\n        const m = url.match(/\\/photo\\/(\\d+)/);\n        return m ? m[1] : '';\n    },\n    getCoverUrl = () => {\n        const o = getMetaContent('og:image'),\n              s = getSeriesId();\n        if (!o || !s) return '';\n        try {\n            return `https://${new URL(o.replace(/\\\\\\//g, '/')).hostname}/media/albums/${s}.jpg`;\n        } catch {\n            return '';\n        }\n    },\n    getChaptersData = (html = null) => {\n        const c = [];\n        const container = html ? \n            (() => {\n                const d = document.createElement('div');\n                d.innerHTML = html;\n                return d;\n            })() : \n            document;\n        \n        container.querySelectorAll('.series_drop_item').forEach(e => {\n            const h = e.getAttribute('href'),\n                  t = e.textContent.trim();\n            if (h && t) c.push({ \n                url: h.split('?')[0], \n                number: t, \n                title: t,\n                id: h.split('?')[0].match(/\\/photo\\/(\\d+)/)?.[1]\n            });\n        });\n        return c;\n    },\n    getTagsData = () => {\n        const k = getMetaContent('keywords');\n        return k ? k.split(',').map(t => t.trim()).filter(t => t) : [];\n    },\n    extractChapterIdFromUrl = u => {\n        const m = u ? u.match(/\\/photo\\/(\\d+)/) : null;\n        return m ? m[1] : null;\n    };\n\nconst highlightCurrentChapter = () => {\n    const chapterLinks = document.querySelectorAll('.chapter-link');\n    chapterLinks.forEach(link => {\n        link.classList.remove('active');\n        const index = parseInt(link.getAttribute('data-index'));\n        if (chapterReadStatus[index]) {\n            link.classList.add('read');\n        } else {\n            link.classList.remove('read');\n        }\n        if (index === activeChapterIndex) {\n            link.classList.add('active');\n            const chaptersList = document.querySelector('.chapters-list');\n            if (chaptersList && link.offsetTop > chaptersList.scrollTop + chaptersList.clientHeight - 50) {\n                chaptersList.scrollTop = link.offsetTop - chaptersList.offsetTop - 100;\n            } else if (link.offsetTop < chaptersList.scrollTop) {\n                chaptersList.scrollTop = link.offsetTop - chaptersList.offsetTop;\n            }\n        }\n    });\n};\n\nconst markChapterAsRead = (chapterIndex) => {\n    if (chapterIndex >= 0) {\n        chapterReadStatus[chapterIndex] = true;\n        const seriesId = getSeriesId();\n        if (seriesId) {\n            const key = `jm_${seriesId}_read`;\n            localStorage.setItem(key, JSON.stringify(chapterReadStatus));\n        }\n        highlightCurrentChapter();\n    }\n};\n\nconst loadReadStatus = () => {\n    const seriesId = getSeriesId();\n    if (seriesId) {\n        const key = `jm_${seriesId}_read`;\n        const saved = localStorage.getItem(key);\n        if (saved) {\n            try {\n                chapterReadStatus = JSON.parse(saved);\n            } catch (e) {\n                chapterReadStatus = {};\n            }\n        }\n    }\n};\n\nconst updateCurrentChapterInDirectory = (chapterIndex) => {\n    if (chapterIndex !== activeChapterIndex) {\n        lastActiveChapter = activeChapterIndex;\n        activeChapterIndex = chapterIndex;\n        if (lastActiveChapter !== null && lastActiveChapter >= 0) {\n            markChapterAsRead(lastActiveChapter);\n        }\n        if (isDetailView && currentTab === 'chapters') {\n            highlightCurrentChapter();\n        }\n    }\n};\n\nconst detectCurrentChapter = () => {\n    if (isDetailView || currentChapters.length === 0) return;\n    \n    const scrollPosition = window.scrollY + window.innerHeight / 3;\n    const chapters = document.querySelectorAll('.chapter-title');\n    \n    let currentFound = false;\n    \n    for (let i = 0; i < chapters.length; i++) {\n        const chapter = chapters[i];\n        const rect = chapter.getBoundingClientRect();\n        const top = rect.top + window.scrollY;\n        const bottom = rect.bottom + window.scrollY;\n        \n        if (scrollPosition >= top && scrollPosition <= bottom) {\n            const chapterNum = parseInt(chapter.textContent.match(/第(\\d+)话/)?.[1]);\n            if (chapterNum && chapterNum - 1 !== activeChapterIndex) {\n                updateCurrentChapterInDirectory(chapterNum - 1);\n                currentFound = true;\n                break;\n            }\n        }\n    }\n    if (!currentFound && chapters.length > 0) {\n        const lastChapter = chapters[chapters.length - 1];\n        const rect = lastChapter.getBoundingClientRect();\n        if (scrollPosition > rect.bottom + window.scrollY) {\n            const chapterNum = parseInt(lastChapter.textContent.match(/第(\\d+)话/)?.[1]);\n            if (chapterNum && chapterNum - 1 !== activeChapterIndex) {\n                updateCurrentChapterInDirectory(chapterNum - 1);\n            }\n        }\n    }\n};\n\nconst findLastReadChapterIndex = () => {\n    let lastReadIndex = -1;\n    for (let i = 0; i < currentChapters.length; i++) {\n        if (chapterReadStatus[i]) {\n            lastReadIndex = i;\n        }\n    }\n    return lastReadIndex;\n};\n\nconst toggleElementDisplay = (id, display) => {\n    const el = document.getElementById(id);\n    if (el) el.style.display = display;\n};\n\nconst toggleButtonClass = () => {\n    const detailButton = document.getElementById('detail-button');\n    if (detailButton) {\n        if (isDetailView) {\n            detailButton.classList.replace('is-reader', 'is-detail');\n        } else {\n            detailButton.classList.replace('is-detail', 'is-reader');\n        }\n    }\n};\n\nconst getSeriesTitle = () => {\n    const ogTitle = getMetaContent('og:title');\n    if (ogTitle && ogTitle.trim()) {\n        return ogTitle.trim()\n            .replace(/^\\d+\\s*-\\s*/, '')\n            .replace(/\\|H漫內頁瀏覽 Comics - 禁漫天堂/, '')\n            .trim();\n    }\n    \n    const pageTitle = document.title || '';\n    if (pageTitle) {\n        return pageTitle.trim();\n    }\n    \n    return '未知标题';\n};\n\nconst updateCommentHeaderText = (status = 'loading', commentCount = 0) => {\n    const tc = document.querySelector('.total-comments');\n    if (!tc) return;\n    \n    const chapterNum = Math.max(config.currentChapter, 1);\n    let text = '';\n    \n    switch(status) {\n        case 'loading':\n            text = `<i class=\"fas fa-comments\"></i> 正在加载第${chapterNum}话评论...`;\n            break;\n        case 'loaded':\n            if (commentCount === 0) {\n                text = `<i class=\"fas fa-comments\"></i> 第${chapterNum}话评论 (0)`;\n            } else {\n                text = `<i class=\"fas fa-comments\"></i> 第${chapterNum}话评论 (${commentCount})`;\n            }\n            break;\n        case 'empty':\n            text = `<i class=\"fas fa-comments\"></i> 第${chapterNum}话评论 (0)`;\n            break;\n        case 'error':\n            text = `<i class=\"fas fa-comments\"></i> 第${chapterNum}话评论加载失败`;\n            break;\n        default:\n            text = `<i class=\"fas fa-comments\"></i> 第${chapterNum}话评论`;\n    }\n    \n    tc.innerHTML = text;\n};\n\nconst toggleAutoScroll = () => {\n    autoScrollEnabled = !autoScrollEnabled;\n    const autoScrollBtn = document.getElementById('auto-scroll-button');\n    \n    if (autoScrollBtn) {\n        if (autoScrollEnabled) {\n            autoScrollBtn.classList.add('active');\n            autoScrollBtn.innerHTML = '<i class=\"fas fa-pause\"></i>';\n            startAutoScroll();\n        } else {\n            autoScrollBtn.classList.remove('active');\n            autoScrollBtn.innerHTML = '<i class=\"fas fa-play\"></i>';\n            stopAutoScroll();\n        }\n    }\n};\n\nconst startAutoScroll = () => {\n    let lastScrollTime = 0;\n    const scrollPerFrame = autoScrollSpeed / 60;\n    \n    function smoothScroll(currentTime) {\n        if (!autoScrollEnabled || isDetailView) return;\n        \n        const elapsed = currentTime - lastScrollTime;\n        \n        if (elapsed >= 16) {\n            detectCurrentChapter();\n            \n            const scrollPosition = window.innerHeight + window.scrollY;\n            const documentHeight = document.documentElement.scrollHeight;\n            \n            if (scrollPosition >= documentHeight - 100) {\n                stopAutoScroll();\n                return;\n            }\n            \n            window.scrollBy({\n                top: scrollPerFrame,\n                behavior: 'instant'\n            });\n            \n            lastScrollTime = currentTime;\n        }\n        \n        if (autoScrollEnabled) {\n            autoScrollAnimationId = requestAnimationFrame(smoothScroll);\n        }\n    }\n    \n    autoScrollAnimationId = requestAnimationFrame(smoothScroll);\n};\n\nconst stopAutoScroll = () => {\n    if (autoScrollAnimationId) {\n        cancelAnimationFrame(autoScrollAnimationId);\n        autoScrollAnimationId = null;\n    }\n    autoScrollEnabled = false;\n};\n\nconst startReading = () => {\n    const lastReadIndex = findLastReadChapterIndex();\n    let startChapterIndex;\n    \n    if (lastReadIndex >= 0) {\n        if (lastReadIndex + 1 < currentChapters.length) {\n            startChapterIndex = lastReadIndex + 1;\n        } else {\n            startChapterIndex = lastReadIndex;\n        }\n    } else {\n        startChapterIndex = 0;\n    }\n    \n    if (currentChapters[startChapterIndex]) {\n        updateCurrentChapterInDirectory(startChapterIndex);\n        config.currentChapter = startChapterIndex + 1;\n        loadChapterByUrl(currentChapters[startChapterIndex].url, startChapterIndex);\n        showReaderView();\n    }\n};\n\nconst showDetailPage = () => {\n    stopAutoScroll();\n    \n    comicScrollPosition = window.scrollY || document.documentElement.scrollTop;\n    isDetailView = true;\n    window.scrollTo(0, 0);\n    \n    toggleElementDisplay('comic-content', 'none');\n    toggleElementDisplay('bottom-loader', 'none');\n    toggleElementDisplay('end-message', 'none');\n    \n    toggleButtonClass();\n    \n    const dc = document.getElementById('detail-page');\n    if (!dc) return;\n    \n    dc.style.display = 'block';\n    \n    const title = getSeriesTitle();\n    let desc = (getMetaContent('og:description') || getMetaContent('description') || '');\n    const cover = getCoverUrl();\n    const tags = getTagsData();\n    const seriesId = getSeriesId();\n    \n    const lastReadIndex = findLastReadChapterIndex();\n    const hasReadChapters = lastReadIndex >= 0;\n    const continueReadingText = hasReadChapters ? '继续阅读' : '立即阅读';\n    \n    if (desc) {\n        desc = desc.replace(/-免費成人H漫線上看/, '').trim();\n    }\n    \n    let html = `<div class=\"detail-header\"><div class=\"info-container\">\n        <h2 class=\"detail-title\">${title}</h2>\n        <div class=\"cover-container\">${cover ? `<img src=\"${cover}\" alt=\"${title}\" class=\"cover-image\" onerror=\"this.style.display='none'\">` : ''}</div>\n        <div class=\"detail-meta\">${seriesId ? `<span>作品ID: ${seriesId}</span>` : ''}${currentChapters.length > 0 ? `<span>目录数: ${currentChapters.length}</span>` : ''}</div>\n        <button class=\"start-reading-btn\" onclick=\"startReading()\">${continueReadingText}</button>\n        ${desc ? `<div class=\"detail-description\">${desc}</div>` : ''}\n        ${tags.length > 0 ? `<div class=\"detail-tags\">${tags.map(t => `<span class=\"tag\">${t}</span>`).join('')}</div>` : ''}\n    </div></div>`;\n    \n    html += `<div class=\"chapters-section\"><h2 class=\"section-title\">作品详情</h2>`;\n    \n    if (currentChapters.length <= 1) {\n        currentTab = 'comments';\n        html += `<div class=\"tab-container\">\n            <div class=\"tab-header\">\n                <button class=\"tab-btn active\" onclick=\"switchTab('comments')\">评论</button>\n            </div>\n            <div class=\"tab-content\">\n                <div id=\"commentsTabContent\">\n                    <div class=\"comments-container\">\n                        <div class=\"comments-header\"><div class=\"total-comments\"><i class=\"fas fa-comments\"></i> 评论区</div></div>\n                        <section class=\"comment-list\" id=\"commentContainer\"></section>\n                        <button class=\"load-more-btn\" id=\"loadMoreBtn\"><i class=\"fas fa-spinner fa-spin\" style=\"display:none;\"></i><span>查看更多评论</span></button>\n                    </div>\n                </div>\n            </div>\n        </div>`;\n    } else {\n        html += `<div class=\"tab-container\">\n            <div class=\"tab-header\">\n                <button class=\"tab-btn ${currentTab === 'chapters' ? 'active' : ''}\" onclick=\"switchTab('chapters')\">目录</button>\n                <button class=\"tab-btn ${currentTab === 'comments' ? 'active' : ''}\" onclick=\"switchTab('comments')\">评论</button>\n            </div>\n            <div class=\"tab-content\">\n                ${currentTab === 'chapters' ? `\n                <div class=\"chapters-list\" id=\"chapters-list\">\n                    ${currentChapters.map((c, i) => `\n                        <a href=\"javascript:void(0);\" data-index=\"${i}\" data-url=\"${c.url}\" class=\"chapter-item chapter-link ${i === activeChapterIndex ? 'active' : ''} ${chapterReadStatus[i] ? 'read' : ''}\">\n                            <div class=\"chapter-number\">${c.number}</div>\n                            ${i === activeChapterIndex ? '<div class=\"chapter-progress\">当前阅读</div>' : ''}\n                        </a>`).join('')}\n                </div>` : `\n                <div id=\"commentsTabContent\">\n                    <div class=\"comments-container\">\n                        <div class=\"comments-header\"><div class=\"total-comments\"></div></div>\n                        <section class=\"comment-list\" id=\"commentContainer\"></section>\n                        <button class=\"load-more-btn\" id=\"loadMoreBtn\"><i class=\"fas fa-spinner fa-spin\" style=\"display:none;\"></i><span>查看更多评论</span></button>\n                    </div>\n                </div>`}\n            </div>\n        </div>`;\n    }\n    \n    html += `</div>`;\n    \n    dc.innerHTML = html;\n    \n    initCommentsSystem();\n    \n    let chapterId;\n    if (activeChapterIndex >= 0 && currentChapters[activeChapterIndex]) {\n        chapterId = extractChapterIdFromUrl(currentChapters[activeChapterIndex].url);\n    } else {\n        chapterId = extractChapterIdFromUrl(window.location.href);\n    }\n    \n    if (chapterId) {\n        currentChapterId = chapterId;\n        loadComments(currentChapterId, 1);\n    }\n    \n    if (currentChapters.length > 1) {\n        const chapterLinks = document.querySelectorAll('.chapter-link');\n        chapterLinks.forEach(l => {\n            l.addEventListener('click', function(e) {\n                e.preventDefault();\n                const i = parseInt(this.getAttribute('data-index'));\n                updateCurrentChapterInDirectory(i);\n                config.currentChapter = i + 1;\n                loadChapterByUrl(this.getAttribute('data-url'), i);\n                showReaderView();\n            });\n        });\n    }\n    \n    highlightCurrentChapter();\n};\n\nconst showReaderView = () => {\n    isDetailView = false;\n    \n    toggleElementDisplay('detail-page', 'none');\n    toggleElementDisplay('comic-content', 'block');\n    \n    toggleButtonClass();\n    \n    setTimeout(() => {\n        window.scrollTo(0, comicScrollPosition);\n    }, 0);\n};\n\nconst switchToComments = () => {\n    if (!isDetailView) {\n        showDetailPage();\n        setTimeout(() => {\n            switchTab('comments');\n            document.querySelector('#commentsTabContent')?.scrollIntoView({\n                behavior: 'smooth',\n                block: 'start'\n            });\n        }, 250);\n    } else {\n        switchTab('comments');\n        setTimeout(() => {\n            document.querySelector('#commentsTabContent')?.scrollIntoView({\n                behavior: 'smooth',\n                block: 'start'\n            });\n        }, 50);\n    }\n};\n\nfunction switchTab(t) {\n    currentTab = t;\n    \n    const tabButtons = document.querySelectorAll('.tab-btn');\n    tabButtons.forEach(b => {\n        b.classList.remove('active');\n        if (b.textContent.includes(t === 'chapters' ? '目录' : '评论')) {\n            b.classList.add('active');\n        }\n    });\n    \n    const tc = document.querySelector('.tab-content');\n    if (!tc) return;\n    \n    if (t === 'chapters') {\n        if (currentChapters.length > 1) {\n            tc.innerHTML = `<div class=\"chapters-list\" id=\"chapters-list\">\n                ${currentChapters.map((c, i) => `\n                    <a href=\"javascript:void(0);\" data-index=\"${i}\" data-url=\"${c.url}\" class=\"chapter-item chapter-link ${i === activeChapterIndex ? 'active' : ''} ${chapterReadStatus[i] ? 'read' : ''}\">\n                        <div class=\"chapter-number\">${c.number}</div>\n                        ${i === activeChapterIndex ? '<div class=\"chapter-progress\">当前阅读</div>' : ''}\n                    </a>`).join('')}\n            </div>`;\n            \n            const chapterLinks = document.querySelectorAll('.chapter-link');\n            chapterLinks.forEach(l => {\n                l.addEventListener('click', function(e) {\n                    e.preventDefault();\n                    const i = parseInt(this.getAttribute('data-index'));\n                    updateCurrentChapterInDirectory(i);\n                    config.currentChapter = i + 1;\n                    loadChapterByUrl(this.getAttribute('data-url'), i);\n                    showReaderView();\n                });\n            });\n            highlightCurrentChapter();\n        } else {\n            switchTab('comments');\n            return;\n        }\n    } else {\n        tc.innerHTML = `<div id=\"commentsTabContent\">\n            <div class=\"comments-container\">\n                <div class=\"comments-header\"><div class=\"total-comments\"></div></div>\n                <section class=\"comment-list\" id=\"commentContainer\"></section>\n                <button class=\"load-more-btn\" id=\"loadMoreBtn\"><i class=\"fas fa-spinner fa-spin\" style=\"display:none;\"></i><span>查看更多评论</span></button>\n            </div>\n        </div>`;\n        \n        initCommentsSystem();\n        \n        if (currentChapterId) {\n            commentsCurrentPage = 1;\n            commentsHasMore = true;\n            const cc = document.getElementById('commentContainer');\n            if (cc) cc.innerHTML = '<div class=\"loading\" style=\"text-align:center;padding:20px;\">正在加载评论...</div>';\n            \n            updateCommentHeaderText('loading');\n            \n            loadComments(currentChapterId, commentsCurrentPage);\n        }\n    }\n}\n\nfunction initCommentsSystem() {\n    const b = document.getElementById('loadMoreBtn');\n    if (b) {\n        b.addEventListener('click', () => {\n            if (!commentsIsLoading && commentsHasMore) {\n                commentsCurrentPage++;\n                loadComments(currentChapterId, commentsCurrentPage);\n            }\n        });\n    }\n}\n\nfunction loadComments(cid, page) {\n    if (!cid) return;\n    \n    commentsIsLoading = true;\n    const b = document.getElementById('loadMoreBtn');\n    if (!b) return;\n    \n    const s = b.querySelector('.fa-spinner'),\n          t = b.querySelector('span');\n    s.style.display = 'inline-block';\n    t.textContent = '加载中...';\n    b.disabled = true;\n    \n    updateCommentHeaderText('loading');\n    \n    fetch(`${window.location.origin}/ajax/album_pagination`, {\n        method: \"POST\",\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded\"},\n        body: `video_id=${cid}&page=${page}`\n    })\n    .then(r => r.text())\n    .then(d => {\n        if (d.trim() === '' || d.includes('没有评论')) {\n            commentsHasMore = false;\n            b.style.display = 'none';\n            const cc = document.getElementById('commentContainer');\n            if (cc && page === 1) {\n                cc.innerHTML = `<div style=\"text-align:center;padding:30px;color:#999;\">第${Math.max(config.currentChapter, 1)}话暂无评论</div>`;\n                updateCommentHeaderText('empty');\n            }\n        } else {\n            const hasNextPage = d.includes('btn-primary');\n            \n            if (!hasNextPage) {\n                commentsHasMore = false;\n            }\n            \n            const td = document.createElement('div');\n            td.innerHTML = d;\n            td.querySelectorAll('.disclose').forEach(sc => {\n                const tl = sc.closest('.timeline');\n                if (tl) {\n                    const hc = tl.querySelector('.timeline-content[style*=\"display: none\"]');\n                    sc.remove();\n                    if (hc) hc.style.display = 'block';\n                }\n            });\n            \n            const cc = document.getElementById('commentContainer');\n            if (cc) {\n                if (page === 1) {\n                    cc.innerHTML = td.innerHTML;\n                } else {\n                    cc.insertAdjacentHTML('beforeend', td.innerHTML);\n                }\n                const cs = cc.querySelectorAll('.timeline-panel');\n                updateCommentHeaderText('loaded', cs.length);\n            }\n            \n            if (!hasNextPage) {\n                b.style.display = 'none';\n                const cc = document.getElementById('commentContainer');\n                if (cc && page >= 1) {\n                    const endDiv = document.createElement('div');\n                    endDiv.style.textAlign = 'center';\n                    endDiv.style.padding = '15px';\n                    endDiv.style.color = '#999';\n                    endDiv.innerHTML = '已加载所有评论';\n                    cc.appendChild(endDiv);\n                }\n            }\n        }\n    })\n    .catch((error) => {\n        console.error('Error loading comments:', error);\n        commentsCurrentPage--;\n        commentsHasMore = false;\n        b.style.display = 'none';\n        const cc = document.getElementById('commentContainer');\n        if (cc && page === 1) {\n            cc.innerHTML = `<div style=\"text-align:center;padding:30px;color:#ff6b6b;\">第${Math.max(config.currentChapter, 1)}话评论加载失败</div>`;\n            updateCommentHeaderText('error');\n        }\n    })\n    .finally(() => {\n        commentsIsLoading = false;\n        if (b && b.style.display !== 'none') {\n            s.style.display = 'none';\n            t.textContent = '查看更多评论';\n            b.disabled = false;\n        }\n    });\n}\n\nconst loadChapterByUrl = (u, i) => {\n    stopAutoScroll();\n    \n    comicScrollPosition = 0;\n    window.scrollTo(0, 0);\n    \n    const comicContent = document.getElementById('comic-content');\n    if (comicContent) {\n        comicContent.innerHTML = '<div class=\"loading\" id=\"initial-loading\">正在加载漫画...</div>';\n    }\n    \n    const initialLoading = document.getElementById('initial-loading');\n    if (initialLoading) initialLoading.style.display = 'block';\n    \n    updateCurrentChapterInDirectory(i);\n    config.currentChapter = i + 1;\n    config.isLoading = true;\n    config.hasMore = true;\n    \n    currentChapterImages = [];\n    displayedImagesCount = 0;\n    allImagesLoaded = false;\n    batchLoading = false;\n    \n    const nid = extractChapterIdFromUrl(u);\n    if (nid) {\n        currentChapterId = nid;\n        if (isDetailView && currentTab === 'comments') {\n            commentsCurrentPage = 1;\n            commentsHasMore = true;\n            const cc = document.getElementById('commentContainer');\n            if (cc) cc.innerHTML = '<div class=\"loading\" style=\"text-align:center;padding:20px;\">正在加载评论...</div>';\n            \n            updateCommentHeaderText('loading');\n            \n            loadComments(currentChapterId, 1);\n        }\n    }\n    \n    const x = new XMLHttpRequest();\n    x.open('GET', u, true);\n    x.timeout = 10000;\n    x.onload = async () => {\n        if (x.status === 200) {\n            currentChapters = getChaptersData(x.responseText);\n            await processChapterContent(x.responseText, config.currentChapter, true);\n            config.isLoading = false;\n            if (isDetailView && currentTab === 'chapters') {\n                highlightCurrentChapter();\n            }\n        }\n    };\n    x.onerror = x.ontimeout = () => config.isLoading = false;\n    x.send();\n};\n\nconst extractAllImageUrls = h => {\n    const d = document.createElement('div');\n    d.innerHTML = h;\n    const imgs = d.querySelectorAll('.spnotice_chk img[data-original]');\n    const urls = [];\n    \n    imgs.forEach(img => {\n        const u = img.getAttribute('data-original');\n        if (u && !u.includes('blank.jpg')) {\n            urls.push(u);\n        }\n    });\n    \n    return urls;\n};\n\nconst decryptImage = (src, imgElement) => {\n    const m = src.match(/photos\\/(\\d+)\\/(\\d+)/);\n    if (!m) return Promise.resolve();\n    \n    const b = m[1], i = m[2].split('.')[0], bn = parseInt(b);\n    \n    let n;\n    if (bn > 421925) n = (md5(b + i).charCodeAt(md5(b + i).length - 1) % 8 + 1) * 2;\n    else if (bn >= 268850) n = (md5(b + i).charCodeAt(md5(b + i).length - 1) % 10 + 1) * 2;\n    else n = 10;\n    \n    return new Promise(resolve => {\n        const tempImg = new Image();\n        tempImg.crossOrigin = 'anonymous';\n        \n        tempImg.onload = () => {\n            const canvas = document.createElement('canvas');\n            const ctx = canvas.getContext('2d');\n            canvas.width = tempImg.width;\n            canvas.height = tempImg.height;\n            \n            const w = tempImg.width, h = tempImg.height;\n            const y = Math.floor(h / n), r = h % n;\n            \n            for (let j = 1; j <= n; j++) {\n                let sy = y * (j - 1), sh = y, dy = h - (y * j);\n                if (j === n) { sh += r; dy -= r; }\n                if (dy < 0) dy = 0;\n                ctx.drawImage(tempImg, 0, sy, w, sh, 0, dy, w, sh);\n            }\n            \n            imgElement.src = canvas.toDataURL();\n            resolve();\n        };\n        \n        tempImg.onerror = () => {\n            imgElement.src = src;\n            resolve();\n        };\n        \n        tempImg.src = src;\n    });\n};\n\nconst loadImageWithPlaceholder = async (src, placeholderImg) => {\n    const m = src.match(/photos\\/(\\d+)\\/(\\d+)/);\n    \n    if (m && !src.includes('.gif') && parseInt(m[1]) >= 220980) {\n        await decryptImage(src, placeholderImg);\n    } else {\n        placeholderImg.src = src;\n    }\n};\n\nconst displayImageBatch = async (startIndex) => {\n    if (batchLoading || startIndex >= currentChapterImages.length) return;\n    \n    batchLoading = true;\n    \n    const endIndex = Math.min(startIndex + imagesPerBatch, currentChapterImages.length);\n    const comicContent = document.getElementById('comic-content');\n    if (!comicContent) return;\n    \n    const chapterContainer = comicContent.querySelector(`#chapter-${config.currentChapter}`);\n    if (!chapterContainer) return;\n    \n    for (let i = startIndex; i < endIndex; i++) {\n        const placeholder = document.createElement('img');\n        placeholder.className = 'comic-page';\n        placeholder.style.width = '100%';\n        placeholder.style.height = 'auto';\n        placeholder.style.minHeight = '200px';\n        placeholder.style.backgroundColor = '#f5f5f5';\n        placeholder.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n        chapterContainer.appendChild(placeholder);\n        \n        loadImageWithPlaceholder(currentChapterImages[i], placeholder);\n    }\n    \n    displayedImagesCount = endIndex;\n    batchLoading = false;\n    \n    if (endIndex >= currentChapterImages.length) {\n        allImagesLoaded = true;\n    }\n};\n\nconst processChapterContent = async (h, cn, first) => {\n    const comicContent = document.getElementById('comic-content');\n    if (!comicContent) return;\n    \n    const oldChapter = comicContent.querySelector(`#chapter-${cn}`);\n    if (oldChapter) oldChapter.remove();\n    \n    const cc = document.createElement('div');\n    cc.id = `chapter-${cn}`;\n    comicContent.appendChild(cc);\n    \n    const t = document.createElement('div');\n    t.className = 'chapter-title';\n    if (first) {\n        config.totalChapters = currentChapters.length;\n        t.textContent = `第${cn}话，共${config.totalChapters}话`;\n    } else {\n        t.textContent = `第${cn}话，共${config.totalChapters}话`;\n    }\n    if (config.totalChapters <= 1) t.style.display = 'none';\n    cc.appendChild(t);\n    \n    if (first) {\n        toggleElementDisplay('initial-loading', 'none');\n    }\n    \n    currentChapterImages = extractAllImageUrls(h);\n    displayedImagesCount = 0;\n    allImagesLoaded = false;\n    \n    await displayImageBatch(0);\n    \n    if (activeChapterIndex + 1 < currentChapters.length) {\n        const nextBtn = document.createElement('button');\n        nextBtn.className = 'next-chapter-btn';\n        nextBtn.innerHTML = '下一话';\n        nextBtn.onclick = () => {\n            const nextChapterIndex = activeChapterIndex + 1;\n            const nextChapter = currentChapters[nextChapterIndex];\n            if (nextChapter) {\n                updateCurrentChapterInDirectory(nextChapterIndex);\n                config.currentChapter = nextChapterIndex + 1;\n                loadChapterByUrl(nextChapter.url, nextChapterIndex);\n            }\n        };\n        cc.appendChild(nextBtn);\n    }\n};\n\nwindow.addEventListener('DOMContentLoaded', () => {\n    const i = extractChapterIdFromUrl(window.location.href);\n    if (i) currentChapterId = i;\n    \n    loadReadStatus();\n    \n    config.isLoading = true;\n    const x = new XMLHttpRequest();\n    x.open('GET', window.location.pathname, true);\n    x.timeout = 30000;\n    x.onload = async () => {\n        if (x.status === 200) {\n            currentChapters = getChaptersData(x.responseText);\n            \n            const currentUrl = window.location.pathname;\n            activeChapterIndex = currentChapters.findIndex(chapter => \n                chapter.url === currentUrl.split('?')[0]\n            );\n            \n            if (activeChapterIndex === -1 && currentChapters.length > 0) {\n                activeChapterIndex = 0;\n            }\n            \n            config.currentChapter = activeChapterIndex + 1;\n            \n            if (currentChapters.length <= 1) {\n                isDetailView = false;\n                toggleButtonClass();\n                toggleElementDisplay('comic-content', 'block');\n                await processChapterContent(x.responseText, config.currentChapter, true);\n                markChapterAsRead(activeChapterIndex);\n            } else {\n                showDetailPage();\n            }\n            \n            config.isLoading = false;\n        }\n    };\n    x.onerror = x.ontimeout = () => config.isLoading = false;\n    x.send();\n    \n    const detailButton = document.getElementById('detail-button');\n    if (detailButton) {\n        detailButton.addEventListener('click', () => {\n            isDetailView ? showReaderView() : showDetailPage();\n        });\n    }\n    \n    const autoScrollButton = document.getElementById('auto-scroll-button');\n    if (autoScrollButton) {\n        autoScrollButton.addEventListener('click', toggleAutoScroll);\n    }\n    \n    const commentButton = document.getElementById('comment-button');\n    if (commentButton) {\n        commentButton.addEventListener('click', switchToComments);\n    }\n});\nlet scrollTimeout;\nwindow.addEventListener('scroll', () => {\n    clearTimeout(scrollTimeout);\n    scrollTimeout = setTimeout(() => {\n        detectCurrentChapter();\n    }, 100);\n    \n    if (config.isLoading || batchLoading || isDetailView) return;\n    \n    if (!allImagesLoaded && currentChapterImages.length > 0) {\n        const imageElements = document.querySelectorAll('.comic-page');\n        if (imageElements.length > 0) {\n            const loadedCount = Array.from(imageElements).filter(img => \n                img.src && !img.src.includes('data:image/gif') && img.complete\n            ).length;\n            \n            if (loadedCount < currentChapterImages.length) {\n                const nextBatchStart = Math.floor(loadedCount / imagesPerBatch) * imagesPerBatch;\n                if (nextBatchStart < currentChapterImages.length) {\n                    const lastImage = imageElements[imageElements.length - 1];\n                    const lastImageRect = lastImage.getBoundingClientRect();\n                    \n                    if (lastImageRect.top <= window.innerHeight + 500) {\n                        displayImageBatch(nextBatchStart);\n                    }\n                }\n            } else {\n                allImagesLoaded = true;\n            }\n        }\n    }\n});\n</script>\n</body>\n</html>",
    "ruleImage": "tag.img@data-original&&tag.img@src",
    "ruleLink": "tag.a.0@href@js:result.replace(/.*?album\\/(\\d+).*/g,\"/photo/$1\")",
    "ruleNextPage": "class.prevnext.0@href",
    "rulePubDate": "class.tags@text||class.video-views pull-left@text&&class.video-added@text##分类标签:",
    "ruleTitle": "tag.img@title##\\[.*?\\]|【.*?】",
    "searchUrl": "/search/photos?search_query={{key}}",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "全部::albums?o=mr\n全彩::/search/photos?search_query=全彩\n韩漫::/albums/hanman?o=mr\n美漫::/albums/meiman?o=mr&page={{page}}\n同人::/albums/doujin?o=mr\n短篇::/albums/short?o=mr\n其他::/albums/another?o=mr\n单行本::/albums/single?o=mr\n日排行榜::/albums?o=mv&t=t\n月排行榜::/albums?t=m&o=mv\n总排行榜::/albums?o=mv\n特殊play::/albums/play\n连载更新::/promotes/26\n网站推荐::/promotes/27\nCG图集::/albums/doujin/sub/CG?page={{page}}\nCosplay::/albums/another/sub/cosplay?page={{page}}\n全彩::/search/photos?search_query=%E5%85%A8%E5%BD%A9&page={{page}}\n重口::/search/photos?search_query=%E9%87%8D%E5%8F%A3&page={{page}}\n口交::/search/photos?search_query=%E5%8F%A3%E4%BA%A4&main_tag=0&page={{page}}\n乳汁::/search/photos?search_query=%E4%B9%B3%E6%B1%81&main_tag=0&page={{page}}\n骑大车::/search/photos?search_query=%E9%A8%8E%E5%A4%A7%E8%BB%8A&main_tag=0&page={{page}}\n勇者::/search/photos?search_query=%E5%8B%87%E8%80%85&main_tag=0&page={{page}}\n魔物娘::/search/photos?search_query=%E9%AD%94%E7%89%A9%E5%A8%98&main_tag=0&page={{page}\n3D::/search/photos/?search_query=3D&page={{page}}\n魅魔::/search/photos?search_query=%E9%AD%85%E9%AD%94&page={{page}}\n精灵::/search/photos?search_query=%E7%B2%BE%E7%81%B5&main_tag=0&page={{page}}\n触手::/search/photos?search_query=%E8%A7%A6%E6%89%8B&main_tag=0&page={{page}}\n阿黑颜::/search/photos?search_query=%E9%98%BF%E9%BB%91%E9%A1%8F&page={{page}}\n扶他::/search/photos?search_query=%E6%89%B6%E4%BB%96&page={{page}}\n风的工坊::/search/photos?search_query=%E9%A2%A8%E7%9A%84%E5%B7%A5%E6%88%BF&page={{page}}\n4K汉化组::/search/photos?search_query=4k%E6%BC%A2%E5%8C%96%E7%B5%84&page={{page}}\n主题                                                                                                                           \n剧情向::/search/photos?search_query=%E5%8A%87%E6%83%85%E5%90%91&page={{page}}\n纯爱::/search/photos?search_query=%E7%B4%94%E6%84%9B&page={{page}}\n痴女::/search/photos?search_query=%E7%99%A1%E5%A5%B3&page={{page}}\n自慰::/search/photos?search_query=%E8%87%AA%E6%85%B0&page={{page}}\n触手::/search/photos?search_query=%E8%A7%B8%E6%89%8B&page={{page}}\n魔物::/search/photos?search_query=%E9%AD%94%E7%89%A9&page={{page}}\n性转换::/search/photos?search_query=%E6%80%A7%E8%BD%89%E6%8F%9B&page={{page}}\n乱伦::/search/photos?search_query=%E4%BA%82%E5%80%AB&page={{page}}\n人妻::/search/photos?search_query=%E4%BA%BA%E5%A6%BB&page={{page}}\nNTR::/search/photos?search_query=NTR&page={{page}}\n校园::/search/photos?search_query=%E6%A0%A1%E5%9C%92&page={{page}}\n百合::/search/photos?search_query=%E7%99%BE%E5%90%88&page={{page}}\n师生::/search/photos?search_query=%E5%B8%AB%E7%94%9F&page={{page}}\n御姐::/search/photos?search_query=%E5%BE%A1%E5%A7%90&page={{page}}\n熟女::/search/photos?search_query=%E7%86%9F%E5%A5%B3&page={{page}}\n巨乳::/search/photos?search_query=%E5%B7%A8%E4%B9%B3&page={{page}}\n贫乳::/search/photos?search_query=%E8%B2%A7%E4%B9%B3&page={{page}}\n女王::/search/photos?search_query=%E5%A5%B3%E7%8E%8B&page={{page}}\n教师::/search/photos?search_query=%E6%95%99%E5%B8%AB&page={{page}}\n女仆::/search/photos?search_query=%E5%A5%B3%E5%83%95&page={{page}}\n护士::/search/photos?search_query=%E8%AD%B7%E5%A3%AB&page={{page}}\n泳装::/search/photos?search_query=%E6%B3%B3%E8%A3%9D&page={{page}}\n眼镜::/search/photos?search_query=%E7%9C%BC%E9%8F%A1&page={{page}}\n连裤袜::/search/photos?search_query=%E9%80%A3%E8%A4%B2%E8%A5%AA&page={{page}}\n其他制服::/search/photos?search_query=%E5%85%B6%E4%BB%96%E5%88%B6%E6%9C%8D&page={{page}}\n兔女郎::/search/photos?search_query=%E5%85%94%E5%A5%B3%E9%83%8E&page={{page}\n\n最新A漫::/albums?o=mr&page={{page}}\n最新韩漫::/albums/hanman?o=mr&page={{page}}\n最新美漫::/albums/meiman?o=mr&page={{page}}\n最新同人::/albums/doujin?o=mr&page={{page}}\n最新短篇::/albums/short?o=mr&page={{page}}\n最新其他::/albums/another?o=mr&page={{page}}\n最新单行本::/albums/single?o=mr&page={{page}}                                                                                                                        ",
    "sourceComment": "发布页：\nhttps://jmcomicgo.me\nhttps://jmcmomic.github.io",
    "sourceGroup": "legado",
    "sourceIcon": "https://img2.baidu.com/it/u=3335455477,220573182&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=501",
    "sourceName": "禁漫天堂",
    "sourceUrl": "https://jm18c-uoe.net",
    "style": "#jm-page-body {\n    margin: 0;\n    padding: 0;\n    overflow-x: hidden;\n}\n#detail-page {\n    max-width: 1200px;\n    margin: 0 auto;\n    padding: 15px;\n    box-shadow: 0 0 8px rgba(0,0,0,0.08);\n    display: block;\n}\n#comic-content {\n    padding: 0 !important;\n    margin: -12px !important;\n    width: calc(100% + 24px) !important;\n    box-sizing: border-box;\n}\n.comic-page {\n    max-width: 100% !important;\n    height: auto;\n    display: block;\n    margin: 0 auto !important;\n    box-sizing: border-box;\n}\n.chapter-title {\n    text-align: center;\n    font-size: 16px;\n    font-weight: 600;\n    color: #333;\n    background-color: #f8f9fa;\n    padding: 12px 20px;\n    margin: 15px 0;\n    border-radius: 8px;\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n    letter-spacing: 0.5px;\n    box-sizing: border-box;\n}\n.page-title {\n    text-align: center;\n    font-size: 14px;\n    color: #666;\n    padding: 8px 0;\n    margin: 10px 0;\n    box-sizing: border-box;\n}\n.next-chapter-btn {\n    display: block;\n    width: 90%;\n    max-width: 300px;\n    margin: 25px auto;\n    padding: 14px 28px;\n    background: #ff6b6b;\n    color: white;\n    border: none;\n    border-radius: 8px;\n    font-size: 16px;\n    font-weight: 600;\n    cursor: pointer;\n    text-align: center;\n    transition: all 0.3s;\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n.next-chapter-btn:hover {\n    background: #ff5252;\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);\n}\n.next-chapter-btn:active {\n    transform: translateY(0);\n}\n#detail-page .detail-header {\n    display: flex;\n    flex-wrap: wrap;\n    margin-bottom: 25px;\n    border-bottom: 1px solid #eee;\n    padding-bottom: 15px;\n}\n#detail-page .cover-container {\n    flex: 0 0 250px;\n    margin-right: 25px;\n}\n#detail-page .cover-image {\n    width: 100%;\n    height: auto;\n    border-radius: 6px;\n    box-shadow: 0 3px 10px rgba(0,0,0,0.12);\n}\n#detail-page .info-container {\n    flex: 1;\n    min-width: 280px;\n}\n#detail-page .detail-title {\n    font-size: 24px;\n    font-weight: bold;\n    margin: 0 0 8px;\n    color: #222;\n}\n#detail-page .detail-meta {\n    color: #666;\n    font-size: 13px;\n    margin-bottom: 8px;\n}\n#detail-page .detail-meta span {\n    margin-right: 15px;\n}\n#detail-page .start-reading-btn {\n    background-color: #ff6b6b;\n    color: white;\n    border: none;\n    padding: 12px 24px;\n    border-radius: 6px;\n    font-size: 16px;\n    font-weight: 600;\n    cursor: pointer;\n    margin: 12px 0 18px;\n    transition: all 0.2s;\n}\n#detail-page .start-reading-btn:hover {\n    background-color: #ff5252;\n    transform: translateY(-1px);\n    box-shadow: 0 4px 12px rgba(255,107,107,0.25);\n}\n#detail-page .start-reading-btn:active {\n    transform: translateY(0);\n}\n#detail-page .detail-description {\n    line-height: 1.5;\n    margin-bottom: 15px;\n    font-size: 14px;\n    color: #444;\n}\n#detail-page .detail-tags {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-bottom: 15px;\n}\n#detail-page .tag {\n    background-color: #f0f0f0;\n    padding: 4px 10px;\n    border-radius: 16px;\n    font-size: 13px;\n    color: #555;\n}\n#detail-page .chapters-section {\n    margin-top: 25px;\n}\n#detail-page .section-title {\n    font-size: 20px;\n    font-weight: bold;\n    margin-bottom: 15px;\n    padding-bottom: 8px;\n    border-bottom: 2px solid #ff6b6b;\n}\n#detail-page .tab-container {\n    margin-bottom: 20px;\n}\n#detail-page .tab-header {\n    display: flex;\n    border-bottom: 2px solid #e0e0e0;\n    margin-bottom: 20px;\n}\n#detail-page .tab-btn {\n    padding: 12px 24px;\n    background: none;\n    border: none;\n    font-size: 16px;\n    font-weight: 600;\n    color: #666;\n    cursor: pointer;\n    position: relative;\n    transition: all 0.2s;\n}\n#detail-page .tab-btn:hover,\n#detail-page .tab-btn.active {\n    color: #ff6b6b;\n}\n#detail-page .tab-btn.active::after {\n    content: '';\n    position: absolute;\n    bottom: -2px;\n    left: 0;\n    right: 0;\n    height: 2px;\n    background-color: #ff6b6b;\n}\n#detail-page .chapters-list {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n    gap: 12px;\n    max-height: 500px;\n    overflow-y: auto;\n    padding: 10px;\n}\n#detail-page .chapter-item {\n    background-color: #f9f9f9;\n    border-radius: 6px;\n    padding: 12px;\n    text-align: center;\n    transition: all 0.2s ease;\n    cursor: pointer;\n    text-decoration: none;\n    color: #333;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    min-height: 60px;\n    position: relative;\n}\n#detail-page .chapter-item:hover {\n    background-color: #e9e9e9;\n    transform: translateY(-2px);\n    box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n}\n#detail-page .chapter-item.active {\n    background-color: #ff6b6b;\n    transform: translateY(-2px);\n    box-shadow: 0 4px 12px rgba(255,107,107,0.25);\n}\n#detail-page .chapter-item.read {\n    background-color: #e8f5e8;\n    border-left: 3px solid #4caf50;\n}\n#detail-page .chapter-number {\n    font-size: 14px;\n    font-weight: bold;\n    margin-bottom: 4px;\n}\n#detail-page .chapter-progress {\n    font-size: 12px;\n    color: #666;\n    margin-top: 4px;\n}\n#detail-page .chapter-item.active .chapter-progress {\n    color: #333;\n    font-weight: 600;\n}\n#detail-page .comments-container {\n    background: white;\n    border-radius: 12px;\n    padding: 20px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n    border: 1px solid #e0e0e0;\n}\n#detail-page .comments-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 20px;\n    padding-bottom: 12px;\n    border-bottom: 2px solid #f0f0f0;\n}\n#detail-page .total-comments {\n    font-size: 16px;\n    font-weight: 600;\n    color: #333;\n}\n#detail-page .load-more-btn {\n    display: block;\n    width: 100%;\n    padding: 12px;\n    background: white;\n    border: 1px solid #e0e0e0;\n    border-radius: 12px;\n    color: #666;\n    font-size: 14px;\n    font-weight: 500;\n    text-align: center;\n    cursor: pointer;\n    margin-top: 12px;\n    transition: all 0.2s;\n}\n#detail-page .load-more-btn:hover {\n    background: #f8f9fa;\n    border-color: #d0d0d0;\n}\n#detail-page .load-more-btn:active {\n    background: #f0f2f5;\n}\n#detail-page .comment-header {\n    display: flex;\n    align-items: center;\n    margin-bottom: 12px;\n}\n#detail-page .user-avatar,\n#detail-page .timeline-avatar {\n    width: 40px;\n    height: 40px;\n    border-radius: 50%;\n    margin-right: 12px;\n    overflow: hidden;\n    flex-shrink: 0;\n}\n#detail-page .user-avatar img,\n#detail-page .timeline-avatar img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n}\n#detail-page .user-info {\n    flex: 1;\n}\n#detail-page .username-row {\n    display: flex;\n    align-items: center;\n    margin-bottom: 4px;\n}\n#detail-page .username,\n#detail-page .timeline-username {\n    font-weight: 600;\n    color: #1a1a1a;\n    font-size: 15px;\n    margin-right: 8px;\n}\n#detail-page .user-level,\n#detail-page .timeline-user-level {\n    background: linear-gradient(45deg, #FFD700, #FFA500);\n    color: #333;\n    padding: 2px 8px;\n    border-radius: 10px;\n    font-size: 11px;\n    font-weight: 600;\n    text-align: center;\n}\n#detail-page .user-title,\n#detail-page .timeline-user-title {\n    color: #666;\n    font-size: 13px;\n    line-height: 1.3;\n}\n#detail-page .comment-content {\n    font-size: 15px;\n    line-height: 1.5;\n    color: #1a1a1a;\n    margin-bottom: 16px;\n    padding-left: 52px;\n    word-wrap: break-word;\n}\n#detail-page .date-info,\n#detail-page .timeline-date {\n    color: #999;\n    font-size: 12px;\n    margin-top: 4px;\n}\n#detail-page .timeline-panel {\n    border: none;\n    background: transparent;\n    box-shadow: none;\n    margin-bottom: 12px;\n}\n#detail-page .timeline-panel-body {\n    padding: 16px;\n    background: white;\n    border-radius: 12px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n    border: 1px solid #e0e0e0;\n}\n#detail-page .timeline-left {\n    float: left;\n    width: 40px;\n    margin-right: 12px;\n}\n#detail-page .timeline-right {\n    margin-left: 52px;\n}\n#detail-page .timeline-header {\n    display: flex;\n    align-items: center;\n    margin-bottom: 4px;\n}\n#detail-page .timeline-second-header {\n    margin-bottom: 8px;\n}\n#detail-page .timeline-content {\n    font-size: 15px;\n    line-height: 1.5;\n    color: #1a1a1a;\n    margin-bottom: 8px;\n}\n#detail-page .comment-vote,\n#detail-page .timeline-info-reply,\n#detail-page .timeline-ft,\n#detail-page .timeline-info,\n#detail-page .reply-line,\n#detail-page .other-timelines,\n#detail-page .timeline-badge,\n#detail-page .notice_more,\n#detail-page .btn,\n#detail-page .navbar-btn,\n#detail-page .m-l-15,\n#detail-page .m-r-15 {\n    display: none;\n}\n#detail-button {\n    position: fixed;\n    top: 15px;\n    right: 15px;\n    width: 46px;\n    height: 46px;\n    background-color: rgba(255, 107, 107, 0.95);\n    border-radius: 50%;\n    border: none;\n    color: white;\n    font-weight: 600;\n    cursor: pointer;\n    box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n    transition: all 0.2s ease;\n    z-index: 1001;\n    padding: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    overflow: hidden;\n}\n#detail-button:hover {\n    background-color: rgba(255, 82, 82, 0.95);\n    transform: translateY(-1px) scale(1.05);\n    box-shadow: 0 5px 15px rgba(0,0,0,0.25);\n}\n#detail-button:active {\n    transform: translateY(0) scale(0.98);\n    box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n}\n#comment-button {\n    position: fixed;\n    top: 71px;\n    right: 15px;\n    width: 46px;\n    height: 46px;\n    background-color: rgba(74, 144, 226, 0.95);\n    border-radius: 50%;\n    border: none;\n    color: white;\n    font-weight: 600;\n    cursor: pointer;\n    box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n    transition: all 0.2s ease;\n    z-index: 1000;\n    padding: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    overflow: hidden;\n    font-size: 20px;\n}\n#comment-button:hover {\n    background-color: rgba(58, 126, 204, 0.95);\n    transform: translateY(-1px) scale(1.05);\n    box-shadow: 0 5px 15px rgba(0,0,0,0.25);\n}\n#comment-button:active {\n    transform: translateY(0) scale(0.98);\n    box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n}\n#auto-scroll-button {\n    position: fixed;\n    bottom: 100px;\n    right: 20px;\n    width: 56px;\n    height: 56px;\n    border-radius: 50%;\n    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n    color: white;\n    border: none;\n    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 22px;\n    z-index: 9999;\n    transition: all 0.3s ease;\n    opacity: 0.9;\n}\n#auto-scroll-button:hover {\n    opacity: 1;\n    transform: scale(1.05);\n    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);\n}\n#auto-scroll-button.active {\n    background: linear-gradient(135deg, #f56565 0%, #ed64a6 100%);\n    animation: auto-scroll-pulse 2s infinite;\n}\n@keyframes auto-scroll-pulse {\n    0% {\n        box-shadow: 0 0 0 0 rgba(245, 101, 101, 0.4);\n    }\n    70% {\n        box-shadow: 0 0 0 10px rgba(245, 101, 101, 0);\n    }\n    100% {\n        box-shadow: 0 0 0 0 rgba(245, 101, 101, 0);\n    }\n}\n#detail-button .hamburger {\n    width: 22px;\n    height: 18px;\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    align-items: center;\n}\n#detail-button .hamburger span {\n    display: block;\n    width: 22px;\n    height: 2.8px;\n    background-color: white;\n    border-radius: 2px;\n    transition: all 0.3s ease;\n}\n#detail-button.is-reader .hamburger span:nth-child(1),\n#detail-button.is-reader .hamburger span:nth-child(3) {\n    transform: none;\n    width: 22px;\n}\n#detail-button.is-reader .hamburger span:nth-child(2) {\n    opacity: 1;\n    width: 18px;\n}\n#detail-button.is-detail .hamburger span:nth-child(1) {\n    transform: translateY(7.5px) rotate(45deg);\n}\n#detail-button.is-detail .hamburger span:nth-child(2) {\n    opacity: 0;\n    width: 0;\n}\n#detail-button.is-detail .hamburger span:nth-child(3) {\n    transform: translateY(-7.5px) rotate(-45deg);\n}\n#initial-loading,\n#bottom-loader,\n.end-message {\n    text-align: center;\n    padding: 30px;\n    font-size: 16px;\n    box-sizing: border-box;\n}\n#initial-loading,\n#bottom-loader {\n    color: #666;\n}\n#end-message {\n    color: #888;\n    display: none;\n}\n@media (max-width: 768px) {\n    #jm-page-body {\n        padding: 12px;\n    }\n    #detail-page .detail-header {\n        flex-direction: column;\n    }\n    #detail-page .cover-container {\n        margin-right: 0;\n        margin-bottom: 15px;\n    }\n    #detail-page .chapters-list {\n        grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n        max-height: 400px;\n    }\n    #detail-page .detail-title {\n        font-size: 22px;\n    }\n    .chapter-title {\n        font-size: 15px;\n        padding: 10px 18px;\n        margin: 12px 0 8px;\n    }\n    .next-chapter-btn {\n        width: 85%;\n        padding: 12px 20px;\n        font-size: 15px;\n        margin: 20px auto;\n    }\n    #detail-page .tab-btn {\n        padding: 10px 20px;\n        font-size: 15px;\n    }\n    #detail-page .comments-container {\n        padding: 15px;\n    }\n    #detail-page .start-reading-btn {\n        padding: 10px 20px;\n        font-size: 15px;\n        margin: 10px 0 15px;\n    }\n    #detail-button {\n        width: 42px;\n        height: 42px;\n        top: 12px;\n        right: 12px;\n    }\n    #detail-button .hamburger {\n        width: 20px;\n        height: 16px;\n    }\n    #detail-button .hamburger span {\n        width: 20px;\n        height: 2.5px;\n    }\n    #detail-button.is-detail .hamburger span:nth-child(1) {\n        transform: translateY(6.5px) rotate(45deg);\n    }\n    #detail-button.is-detail .hamburger span:nth-child(3) {\n        transform: translateY(-6.5px) rotate(-45deg);\n    }\n    #comment-button {\n        width: 42px;\n        height: 42px;\n        top: 64px;\n        right: 12px;\n        font-size: 18px;\n    }\n    #auto-scroll-button {\n        width: 50px;\n        height: 50px;\n        bottom: 90px;\n        right: 15px;\n        font-size: 20px;\n    }\n}\n@media (max-width: 480px) {\n    #detail-page {\n        padding: 10px;\n    }\n    #detail-page .cover-container {\n        flex: 0 0 200px;\n    }\n    #detail-page .chapters-list {\n        grid-template-columns: repeat(auto-fill, minmax(85px, 1fr));\n        max-height: 350px;\n    }\n    #detail-page .chapter-item {\n        padding: 8px;\n        min-height: 55px;\n    }\n    #detail-page .chapter-number {\n        font-size: 13px;\n    }\n    .chapter-title {\n        font-size: 14px;\n        padding: 8px 16px;\n        margin: 10px 0 6px;\n    }\n    .next-chapter-btn {\n        width: 80%;\n        padding: 10px 16px;\n        font-size: 14px;\n        margin: 15px auto;\n    }\n    .page-title {\n        font-size: 13px;\n    }\n    #detail-page .tab-btn {\n        padding: 8px 16px;\n        font-size: 14px;\n    }\n    #detail-page .start-reading-btn {\n        padding: 8px 16px;\n        font-size: 14px;\n        margin: 8px 0 12px;\n    }\n    #detail-button {\n        width: 40px;\n        height: 40px;\n        top: 10px;\n        right: 10px;\n    }\n    #detail-button .hamburger {\n        width: 18px;\n        height: 14px;\n    }\n    #detail-button .hamburger span {\n        width: 18px;\n        height: 2.2px;\n    }\n    #detail-button.is-detail .hamburger span:nth-child(1) {\n        transform: translateY(6px) rotate(45deg);\n    }\n    #detail-button.is-detail .hamburger span:nth-child(3) {\n        transform: translateY(-6px) rotate(-45deg);\n    }\n    #comment-button {\n        width: 40px;\n        height: 40px;\n        top: 60px;\n        right: 10px;\n        font-size: 16px;\n    }\n    #auto-scroll-button {\n        width: 48px;\n        height: 48px;\n        bottom: 85px;\n        right: 12px;\n        font-size: 18px;\n    }\n}",
    "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": "默认",
    "sourceIcon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWEAAAFhBAMAAABT0QbkAAAAAXNSR0IArs4c6QAAACRQTFRFLzY8R3BMLTQ6LjU7oMxJm8dElsI/kb05jLg0hrMvb446T2M71eCsLgAAAAR0Uk5T/wBQxEskO5YAAA+JSURBVHja1NXBbdswFMbxT5KLIOlFlRaQ0AWoegEfyMCoLz0wG2SEDtARfA168cED9NABq9KMbMsSE+gRzHt/2D4+/PQsgvgSrForhZQVxboNikqEuAofU9GGxARvcnNYvMbHtg6IQwtmtOawuAaHuveLv4JH3wLiMZgbOSxuwKf8PeIanOreFlfgVfuWuFJgRw6LFbhVhMUl+JWFxBU41gbEChwr5sU1eNbNisG1OXEJrnUzYvBtWlyCb9mkGJybEpfgXDYhVmDdrbgG77obsQLvirG4AvfakbgB9/KRGPy7FpfgX3YlbsC//FJcQULthbiGhLoLcQMJ5RdiyOgsriGjbhCXkFE2iCGlV3EFKbVeXENKnRc3kFLuxQpSKrwYcjqJa8ipc+IScsqcuIGccidWEJQTQ5q4gqTaXlxDUlkvLsWJG0gq78UKkip6MWQlUVxBVg1qzPb5ZbrfiNTDy3R7zKdQBsR6ukdEaqWn2yDQErH+gzgdk4kPiJNOJt6AEHl+s2DiDlG6WyZWC8QaUVqJEx8Tin8hRs/LxFgi3sQ5eAnF3xGh+5TiLSK0SiCOe+sdk4oPoGeTijcxDl5S8Q7k7tKKH0FulVasQe6YWLwHtefE4g394KUV02+9+9TiLYh9Siym33rH5OIDaD0lFhv9A7R08h3vqDee0Ta+eGamNdpqE+HGM9N/nyXt2Pa88SfGrXc0Dnw73BB3bOd2bO0elH5q09ts9B073mgJ/imMG0t74ez/6dfzDW3Hp3HjV8K4aEfvwT268fOuXglrKTu2ZmrHDm63tIPnpxinHoaf9MvFw5RLsNH+MUDo70n5Ot3xh+1QduyH6LPXo622pFvPnnfsztowP8aO+6/PDT5vhnL0tB3Ome0b5hv3VhPEPif3x7rP/VhDOHr3fpK3Dht+or7Hboz/ng+d37b9R2wZ48YNQ0G0C5C91wApXfyhsXDjhoWRJk2O4CPsUXK/wMPPT8u7sKH/19CINCkZGIyfNKAfK/9qDitfTItPoNw8zY2r4y6deOulbfdmleYZYYSmFDdmZkS+ehcSlIscjWsPEA/5xJ+qgkL1DWFJqIuJBdhph8TkKX3iGYev+aLVXDXGdDdpRR/PfqVPPArwCuvyJxXGDB8sDIt71vgfiA3ksNZaSLzMKLMYY0mfet0ZMOqmTawlxkJAYDHQ0Ew7AzRGWKcce2OBsbk8txZpPEtW76dybcwYRKrf8ZSRVGQX9OwxeeLRSPC9mRHa6hcVxgyeBGSKIerbZrJ4HtgpO4nBmGCdMRZjYMPYctV71VesyBJG47S1ImMzCsFibFyMaQ85EMpquhQRnM4ig3xi+SzGTiAYG1PVO5Eemb7MrMO0xBjxriKrEXOQ53TxaOaThKzDFFZjbEZMENqHjGCyeCJJaGosY7D6HUtYjCfigSNTvb9uqcvk7QD8DhXGMopvOSAH4+eELc1oQZizgPdh/KWeMsX7XN+c+Jwo3rGJmSjewYn3V+9yQOKaOQ9IXKre6ejEL3tNfxydmIniHZC4Ur3XoxP3P7Xi3T9xY78afumOv3cW79rRx7i0LSTunddqmlPnexWva5YZX8MIZ7/re4t3m/DE0KuMb8JomrnqXRpvq7FrVhl/JNHYg3Fvb7fteZdnJ2XSN769ibEnLzCWR19D0otrLXfqndhbUPUh6e8QkhrjgXH9lCjjNvWys3juI8v/tJaxchQxEESVeMHwfZ6E5AKmjX05VWRExI6IL+HiS9jvo7Y127NVSzCLuClrNVaVWq0njWXnt0f/80Pdf3esq8DWP9Eyt0OFt0wKVWOvhMF8hHH45IF5fNJ2bOhy7F/NcEWoFFEiPAOMdRuYbFNTeujV45yU6nw9IoSHGMdN0Cm6OHi284HCI9pgHN1W1IcZd8tdjDkF2dL4gdJ7oN8gILHkG4jGGYuBQGz3YAcKr4slWffPV4sT1CJDjLd3lmq/tgca+aVeeN4ln7oe3f9OEpEM3GOHw8y8B/PJls7BLvL6q4c1Vj3Hl2npqGY9gQSPO6YMpSMcj66ARXIuF54rhOJ1kraWGmDcObALrB+xktUyKJfeO209sZ5mHZlOc4AxurJDBNpXd2iwr4Oq4LxaQkBw2NvMdKMKOw0wDsvJpV11T7QQqqX3EwZGnpG32ZjK8hjj8JtEvU3QVRGc70VBiHEqttk9b8Vo5Tkgy9G1R5jGVsbnauHBImTvExm7XPsgY/nS5Vu2kX4D2mtNb4KhhwN9Mk7JOGQxfo+TscFa469gg/f2VC08mCImX5ZRrFvHMGOGs7EztDbnkKE33OqFp+Bku7Urwj01GQOOO1y4y3NrkwsujKNWhAJA5x+TX5IAz44fG2UMo2enXmuPUAjLuVR4K8KM5bm8OnxljFHGFOKPzHGU42YwJ2jYt4rce2R0xL54u4JB8sOOt/LO1FprP3IHazyXCk+Ocu7b4jgR27hjXrxQItQWUFQqTCuvnmBuXcewFvpPjFllucTELWjUyKog9ySGCjr2HeRhx9tzvLH0TCORnktqti+8RO8SG3asCMcN+yi8eg+GXZzkWHFvx4pK4e3jwnfl/o7nv4/XCy9n3Z/x80Jlwi4Krx728dLuy1jn+AGFRSpiZzq+N2ON73BVXry9s/sz5iJ/qi9jpdaNKAwfYCaWTIPgBWDyApCXSUtz0UzSUFnLdeMqWkGjKlcyjapc6FzF3LeLo2jWRP/Z9drWSqt/3O3K++nzOXuAeZXDGs898ZdK00RfzK3HP1Mv/OGQWA23Cbewf+PFfRDHNVj4gJkf2Hg065R41k6jEhd2Tb0JPjK7d0CMWWhOiR/ImJ90jUcPbolnNbFx6tlPPHJOHCvHnLFH0ob/7Z9cEAPyrOYyTj37xnNHjCbVCirjE3Jf5YA4xjTH/DmDJMbGizEV1fkVVzrtvEeyaj37xjt37ljrzDj1ZhjRLMWYTidIQxziUjzf690f5uoQyBGOH1pRjolZMky9CVdfeEiToxxDHrU/80NiaDymUSsnjiHK8d+4ZGi9v2IMHOKkjreTbcL6t2+8+In6qONPjqd25ac8wvSck4s6TiBbjwlG23phglmoQzCPBxPPINsv+xZj9I2HqdQhmMOJE0NTrPFtZrrW+x5jTIcc4dhQFZO4vRbHOfFJME/UZIqHdOt4rk5Cx8n9Id/TrWOMOolijKb1AlOpTrutY8yWeJZgCMIXUCKqrWOMI8frGLPiG28GSWgAx5MEw7deyl3dJseOiKfa+YKNh1/TG/Hsd8OdFdfqbCbeLIdVZ46/ksq3BJnZxktQctUf8TOprMEcP/W+I3BCrohjyFcyt57txBukKqZMId9bfcvnbUGPxBQzy7Z/aqpMXBP/Bj83X6BGpNkKlvtxvE4wK6bxMDSIY/6whdXEc02MXW4/rvjBOZRj0leN+bXyYRzzU0/A/3gJpuqTOCO71jM33mCOA4upJ7nvGMYxX6OifRoH1L9j+9bjJ16fxAKI2dYzA60GdLxOIYpH23iidZekbh2LHQaFyAkuQFPdTFLnju1bzzzxlGO3xKkgi9Yzv1JOvdaxpF0/+pNd4ynHolPiVLQ/Lcdr3PI/orWADQm1HOOWw4nxu1q3GwXMloq2SXH5a4tY4JYjHOO3tYinsEUk97SN2ClwkvbrmGBLkj5/nnhYFHm7KtJeHVOKjjNSCRjHK6iKfh2vwdDn1vqeokAa2HEAhkSSf7r82suq8baOe67jqRBtx9sDz4WA5Rdw3OVdIXY7pvbvLkTyvL1JUljOnTqWmIxaKQx7JhKjGs+wZ3E4sYCA4w+BWVGzlmKoTZxiDidOMeA4TCGyatakgDwDscAc4RgDjqcSoupQu2SuCseOSWDmev25jWO3dUwMlqA6gWRK3HEdSwg6/oA9QjQrQkKIBr8rKEDHzW9fpJBn8sAxtl4qF80Loz2GuFPHUqStDxITbJJi2bwKrORILFPYtuh25kHeNLsCiVk5r+N2TyExtl7akH1IDEGCjqtCpi1khjiUmIr/i+OZWMeiyzq2qApsPSEfYeLpUAKZdukYwnUeyXZ/SfnCjm+Zk+s6lgDDERegWD7pGw/ruO+7omYDZLbxMrJ07J4YkuVc4y25h4cgPmcP5Un8cMzBzaeceE8c81Mv5BrPE8d8k71JDHnjOOQ2chPPG8dTaZWFP45JWiX3xTFOPT7ZyiPHgRUxDeK4JMvWwyw1L1tAenB8jsdict5xNohjkhB24rmv4yJrfzJi8wYb4ZOteMfM3j4c49TDUC+OCzBAbMKdilXjgWM843DiTMr2uRrH0128qvEYx7C3D8dU7ACWstIQZ5t06DizdEyF2fEmK53jQkqXjnXEgdkxPOjKcWbtONjleK591c3qEHV8nhmBZZFrXzWDY3pxTOY5ncmqF8cZYmiJ3zJj5Epfx3BMfnhVtI81EH8UxpSkd1xkrRzuuGRCmoSlIUXxSnrHsP1wx/u4mpYZxEZbmBWQw4kZCC0xlaaaKCt9VeApRzguIQbizFAV5crgGHb35Dg0OiZDHcPunhyHJscveuKyzHp3jH2K1nx0TKU+sjIUU6eODQWJec+0KVeGqoDLojyCGJIZiH+U+pDBMR5yTB3vdbYe+JUMjjG52ymN2zELw3sOSEyZlrgyOC4GJNYCF+SNY7yo2E9J/tWxufVeTA8xb+iK2L71cl8dk7bxfK1jei/5kH+OzVOvIG8dh5qJ56Fjc+vl/jomTeN56NjceuSx44An9thxyDaex475J/KOHd92SUxs43nsmG898trxj72fCAcmnjKN5zEx/0jeNfF1p8TENF7XdXzRLfH7vg+EromX+wIs+yY+Wtmr58T4TN458VW3xASN1zHxLV3uIH7ffpZYlnzrLf97bolvyBOrByyIrynq2HF41P5lTW4ivnBN/ErHVgUS39KYcrYhvqYx5XRDfEFjysmG+IrGlLsN8SWNKTcb4ojGlOhf4tuxEY/qsjitiS/GdFXUxFdjuipq4mhMZVwTj6j1zmriMbXeaU08pkK+a4gvxzPxGuJoRI3XEF+MpYwV8dVYylgRR6MpCkV8PY6iUMRjKYsTRTyW++1GEY9kUJ9Fingk99uJIh7LbREp4pHcFqct4iv/x0eLOLr1v+8U8Th67wSIfZccIfGF54qROPJbMRB7LvkUiH2XHPHEV55XMRJH/t7FQOy55DsgVrn1XDESX5KPuUFiv2+4kwiI/a6LswiIPa+LGyAGZA+BkdjfK+4uQmLItV9/TyAx5mfyJb9EHLFvyAiMxJgrv2oYiTGXnt0SSIy59aznkBg1D8l8BoKBeGBm5NUS/wMtJQR5NY0DewAAAABJRU5ErkJggg==",
    "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": "默认",
    "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,
    "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,
    "sourceGroup": "默认",
    "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": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "默认",
    "sourceIcon": "http://mmbiz.qpic.cn/mmbiz_png/hpfMV8hEuL2eS6vnCxvTzoOiaCAibV6exBzJWq9xMic9xDg3YXAick87tsfafic0icRwkQ5ibV0bJ84JtSuxhPuEDVquA/0?wx_fmt=png",
    "sourceName": "小说拾遗",
    "sourceUrl": "snssdk1128://user/profile/562564899806367",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "coverDecodeJs": "java.createSymmetricCrypto(\"AES/CBC/NoPadding\",\"f5d965df75336270\",\"97b60394abc2fbe1\").decrypt(result)",
    "customOrder": 3,
    "enableJs": true,
    "enabled": false,
    "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,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "legado",
    "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}",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 4,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "默认",
    "sourceIcon": "https://cdn.jsdelivr.net/gh/mgz0227/meowcloud/icon.png",
    "sourceName": "Meow云",
    "sourceUrl": "https://pan.miaogongzi.net",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 8,
    "enableJs": true,
    "enabled": false,
    "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": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "li",
    "ruleDescription": "",
    "ruleLink": "text.一键导入@onclick",
    "ruleNextPage": "",
    "rulePubDate": "span@text",
    "ruleTitle": "a@text",
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "legado",
    "sourceIcon": "https://m.acgnfl.com/24/07/content_33/525867/007.webp",
    "sourceName": "开心漫画",
    "sourceUrl": "https://www.kxmanhua1.com/manga/library",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 10,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775584304436,
    "loadWithBaseUrl": true,
    "preload": false,
    "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') || '';\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",
    "showWebLog": false,
    "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",
    "sourceGroup": "legado",
    "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",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 11,
    "enableJs": true,
    "enabled": false,
    "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": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "li",
    "ruleDescription": "",
    "ruleLink": "text.一键导入@onclick",
    "ruleNextPage": "",
    "rulePubDate": "span@text",
    "ruleTitle": "a@text",
    "showWebLog": false,
    "singleUrl": true,
    "sourceGroup": "legado",
    "sourceIcon": "https://m.acgnfl.com/24/07/content_33/525867/045.webp",
    "sourceName": "漫小肆",
    "sourceUrl": "https://www.ikanhm.top",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 14,
    "enableJs": true,
    "enabled": false,
    "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": "legado",
    "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://www.googletagmanager.com/,\nhttps://www.google-analytics.com/",
    "customOrder": 16,
    "enableJs": true,
    "enabled": false,
    "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": 1775584881772,
    "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={{v=source.getVariable();if(/^\\s*$/.test(v)||v==null)source.setVariable('奸');source.getVariable()}}&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": "legado",
    "sourceIcon": "https://kp-i25985.com/Uploads/vod/2023-06-21/1141.mp4.gif",
    "sourceName": "❀碰碰网  S",
    "sourceUrl": "https://www.sevvz.cc/",
    "type": 0
  },
  {
    "articleStyle": 2,
    "cacheFirst": false,
    "customOrder": 20,
    "enableJs": true,
    "enabled": false,
    "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": 1774475170918,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "[class=\"embed-responsive embed-responsive-16by9-rotating position-relative\"]",
    "ruleContent": "<js>\np=String(result.match(/contentUrl\":\"(.*.m3u8)\",/)[1]).replace(/\\\\/g,\"\");\n pi=java.getString('ol@li.-1@text')||1;\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                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><title>👤Mengteen</title>🏷${pi}</h3>\n            <div class=\"video-container\">\n                <video controls autoplay name=\"media\" id=\"videoPlayer\">\n                    <source src=\"${p}\" type=\"video/mp4\">\n                </video>\n            </div>\n            <div class=\"info-container\">\n                \n            </div>\n        </div>\n\n        <script>\n            // 获取视频元素\n            const video = document.getElementById('videoPlayer');\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                    // 在长按状态下，根据滑动距离快进\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>`;\n\n</js>",
    "ruleImage": "img@src",
    "ruleLink": "a.0@href##(\\d+)##/$1###",
    "ruleNextPage": "page",
    "rulePubDate": "🏷{{@@class.badge badge-success@text}}｜📆{{@@span@text}}",
    "ruleTitle": "img@alt",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "首页::/p/1/c/33?page={{page}}\n搜索::/q/{{(source.getVariable()==''||source.getVariable()==null)?source.setVariable('年轻'):source.getVariable()}}?page={{page}}\n国内伦理::/p/1/c/33?area_id=2&page={{page}}\n香港伦理::/p/1/c/33?area_id=5&page={{page}}\n台湾伦理::/p/1/c/33?area_id=4&page={{page}}\n韩国伦理::/p/1/c/33?area_id=17&page={{page}}\n日本伦理::/p/1/c/33?area_id=18&page={{page}}\n欧美伦理::/p/1/c/33?area_id=6&page={{page}}\n其它伦理::/p/1/c/33?area_id=3&page={{page}}\n泰国伦理::/p/1/c/33?area_id=10&page={{page}}\n印度伦理::/p/1/c/33?area_id=14&page={{page}}",
    "sourceComment": "源社区：@Mengteen\n二传或者是其它问题请@我并告知我",
    "sourceGroup": "legado",
    "sourceIcon": "https://cdn.sshs.rip/20/6e/20a43d023d77b2839892076750cb0f6e.webp",
    "sourceName": "🎞PTT伦理",
    "sourceUrl": "https://ptt.co/zh-cn/##@Mengteen",
    "style": "iframe{\n\theight:600px\n}\ntitle{\n\tdisplay:block\n}",
    "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": 21,
    "enableJs": true,
    "enabled": false,
    "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": "legado",
    "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": 1,
    "cacheFirst": false,
    "coverDecodeJs": "java.createSymmetricCrypto(\"AES/CBC/NoPadding\",\"f5d965df75336270\",\"97b60394abc2fbe1\").decrypt(result)",
    "customOrder": 23,
    "enableJs": true,
    "enabled": false,
    "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,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "legado",
    "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}",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 33,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 1774475223761,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.col-xs-12 col-sm-4 col-md-3 col-lg-3",
    "ruleContent": "<js>\nresult=decodeURIComponent(result.match(/strencode2\\(\"(.*?)\"\\)/)[1]).match(/src='(.*?)'/)[1];\n`<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</head>\n<body>\n<video src=\"${result}\" width=\"100%\" height=\"auto\" controls=\"controls\" ></video>\n</body>\n</html>`\n</js>",
    "ruleImage": "img@src",
    "ruleLink": "a@href",
    "ruleNextPage": "page",
    "rulePubDate": "class.duration@text",
    "ruleTitle": "class.video-title title-truncate m-t-5@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "主页::/v.php?category=rf&viewtype=basic&page={{page}},{'webView': true}\n91原创::/v.php?category=ori&viewtype=basic&page={{page}},{'webView': true}\n当前最热::/v.php?category=hot&viewtype=basic&page={{page}},{'webView': true}\n本月最热::/v.php?category=top&viewtype=basic&page={{page}},{'webView': true}\n10分钟以上 ::/v.php?category=long&viewtype=basic&page={{page}},{'webView': true}\n20分钟以上 ::/v.php?category=longer&viewtype=basic&page={{page}},{'webView': true}\n本月收藏::/v.php?category=tf&viewtype=basic&page={{page}},{'webView': true}\n 收藏最多::/v.php?category=mf&viewtype=basic&page={{page}},{'webView': true}\n高清::/v.php?category=hd&viewtype=basic&page={{page}},{'webView': true}\n上月最热::/v.php?category=top&m=-1&viewtype=basic&page={{page}},{'webView': true}\n本月讨论::/v.php?category=md&viewtype=basic&page={{page}},{'webView': true}\n",
    "sourceGroup": "vpn",
    "sourceIcon": "https://z3.ax1x.com/2021/05/04/gnLfmD.png",
    "sourceName": "©91porn",
    "sourceUrl": "https://91porn.com/",
    "style": "body{background-color:black;margin:0;padding:0;width:100%;}",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 37,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "header": " {\n\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36\",\"Cookie\":\"__cfduid=de7f377235b8f6a0fbc001c358691bbff1600348768\"\n}",
    "lastUpdateTime": 1774475247594,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.videobrickwrap@class.videobrick",
    "ruleContent": "@js:\nheader={\"Referer\":baseUrl};\nheaders={\"headers\":JSON.stringify(header)}\nvar doc = org.jsoup.Jsoup.parse(result);\nvar spt = doc.select(\"script\").toString();\nvar src = spt.match(/\"https.*.mp4.*\"/);\nvar video='<iframe src='+src+' width=\"100%\" height=\"560\" frameborder=\"no\" allowfullscreen=\"true\">'  \nresult = video",
    "ruleImage": "tag.img@src",
    "ruleLink": "class.interlink@tag.a@href",
    "ruleNextPage": "page",
    "rulePubDate": "@js:\nvar doc = org.jsoup.Jsoup.parse(result)\nvar text = doc.select(\"div.videointro\").text();\nvar info = String(text).replace(/\\|/,\"   喜欢:\");\nresult = \"观看: \"+info",
    "ruleTitle": "tag.img@alt",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "无码::https://ohentai.org/tagsearch.php?tag=Uncensored&p={{page}}\n1080p::https://ohentai.org/tagsearch.php?tag=1080p&p={{page}}\n游戏CG::https://ohentai.org/tagsearch.php?tag=Game&p={{page}}\n熟女::https://ohentai.org/tagsearch.php?tag=Milf&p={{page}}\n束缚::https://ohentai.org/tagsearch.php?tag=Rape&p={{page}}\n口交::https://ohentai.org/tagsearch.php?tag=Blow%20Job&p={{page}}\n纯爱::https://ohentai.org/tagsearch.php?tag=Vanilla&p={{page}}",
    "sourceGroup": "vpn",
    "sourceIcon": "https://i.postimg.cc/wxQpYXF9/1660809059840.png",
    "sourceName": "☪Ohentai",
    "sourceUrl": "https://ohentai.org/",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 38,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "header": " {\n\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36\",\"Cookie\":\"__cfduid=d150f32feeec7048d35993a8a642d2c0e1600348724; AVS=k29ctap8qhbuncoijpdkckr5v7\"\n}",
    "lastUpdateTime": 1774475256629,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.left@class.row@class.game-item&&class.left@class.row@class.video-item",
    "ruleContent": "@js:\nheader={\"Referer\":baseUrl};\nheaders={\"headers\":JSON.stringify(header)}\nif(baseUrl.match(/gif/)){\nvar doc = org.jsoup.Jsoup.parse(result);\nvar gif = String(doc).match(/gif.{5,10}.webm/);\nvar preview = 'https://www.hentaicloud.com/media/'+gif;\n\nif(String(doc).match(/From Video/)){\nvar url = doc.select(\"div.fromvideo\").select(\"a\").attr(\"href\");\nvar allUrl = 'https://www.hentaicloud.com'+url;\nvar doc = org.jsoup.Jsoup.connect(allUrl).get();\nvar spt = doc.select(\"source\").toString();\nvar src = spt.match(/https.{36}hd.{5,10}mp4/);\nresult = '<body><div><video controls=\"true\" width=\"100%\" autoplay=\"true\" src ='+preview+'></div><div><a href='+src+' >点击看全片</a></div></body>'\n}else{  \nresult = '<body><div><video controls=\"true\" width=\"100%\" autoplay=\"true\" src ='+preview+'></div><div><a>此片暂无出处</a></div></body>'\n}\n\n}else{\nvar doc = org.jsoup.Jsoup.parse(result);\nvar spt = doc.select(\"source\").toString();\nvar src = spt.match(/https.{36}hd.{5,10}mp4/);\nvar video='<iframe src='+src+' width=\"100%\" height=\"560\" frameborder=\"no\" allowfullscreen=\"true\">'  \nresult = video}",
    "ruleImage": "tag.img@src",
    "ruleLink": "tag.a@href",
    "ruleNextPage": "page",
    "rulePubDate": "@js:\nvar doc = org.jsoup.Jsoup.parse(result)\nvar text = doc.select(\"div.info\").select(\"span\").textNodes();\nif(text.size()==3){\nvar view = text.get(2).toString();\nif(view==\" \"){view =\"无\";}\nvar episode =text.get(0).toString();\nif(episode ==\" \"|| episode ==\"-\"){episode =\"无\";}\nresult = episode+\"   观看:\"+view}else if(text.size()==4){\nvar view = text.get(3).toString();\nif(view==\" \"){view =\"无\";}\nvar episode =text.get(0).toString();\nif(episode ==\" \"|| episode ==\"-\"){episode =\"无\";}\nresult = episode+\"   观看:\"+view\n}else{result = \"可通过动图预览查找动画\"}\n",
    "ruleTitle": "tag.div@id&&class.name@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "3D::https://www.hentaicloud.com/videos/3d-hentai?page={{page}}\n口交::https://www.hentaicloud.com/tags/Blowjob?page={{page}}\n无码::https://www.hentaicloud.com/tags/Uncensored?page={{page}}\n触手::https://www.hentaicloud.com/tags/Tentacle?page={{page}}\n扶她::https://www.hentaicloud.com/videos/futanari?page={{page}}\n恶魔::https://www.hentaicloud.com/tags/Demon?page={{page}}\n自慰::https://www.hentaicloud.com/tags/Masturbation?page={{page}}\n后宫::https://www.hentaicloud.com/tags/Harem?page={{page}}",
    "sourceGroup": "legado",
    "sourceIcon": "https://i.postimg.cc/wxQpYXF9/1660809059840.png",
    "sourceName": "☪hentai~c",
    "sourceUrl": "https://www.hentaicloud.com",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 414,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; 2211133C Build/TKQ1.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36\"}",
    "lastUpdateTime": 1775586071363,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": ".grid_post-box",
    "ruleContent": "@js:\nlet images = [];\nlet regex = /<a\\s[^>]*?href\\s*=\\s*['\"]([^'\"]+\\.(?:jpe?g|png|gif|webp|bmp))['\"][^>]*>\\s*<img[^>]*>/gi;\nlet match;\nwhile ((match = regex.exec(result)) !== null) {\n    let realUrl = match[1];\n    images.push(`<img src=\"${realUrl}\" style=\"max-width:100%;display:block;margin:0px auto;\">`);\n}\nlet imageContent = images.join('');\nlet p = `\n<title>🏄Mengteen</title>\n<style>\n  * {margin: 0; padding: 0}\n  img {width: 100%;height: auto}\n  /* Mengteen阅图基础UI */\n  /* 返回按钮基础 */\n  #backToTopBtn {\n    display: none;\n    position: fixed;\n    bottom: 36px;\n    right: 18px;\n    z-index: 999;\n    border: none;\n    outline: none;\n    background: linear-gradient(135deg, #ADD8E6, #FFF8DC);\n    color: white;\n    cursor: pointer;\n    padding: 2px;\n    border-radius: 10%;\n    font-size: 18px;\n    box-shadow: 0 8px 32px rgba(70, 130, 180, 0.3);\n    transition: all 0.3s ease;\n    backdrop-filter: blur(4px);\n    border: 1px solid rgba(255, 255, 255, 0.3);\n  }\n  \n  #backToTopBtn:hover {\n    background: linear-gradient(135deg, #ADD8E6, #FFF8DC);\n    transform: scale(1.08);\n    box-shadow: 0 8px 25px rgba(70, 130, 180, 0.4);\n  }\n  \n  #backToTopBtn:active {\n    transform: scale(0.95);\n  }\n  \n  /* 图片加载完成提示基础 */\n  #image-loaded-toast {\n    position: fixed;\n    bottom: 33px;\n    left: 50%;\n    transform: translateX(-50%);\n    background: rgba(0, 0, 0, 0.7);\n    color: white;\n    padding: 10px 20px;\n    border-radius: 20px;\n    font-size: 14px;\n    z-index: 998;\n    backdrop-filter: blur(4px);\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\n    opacity: 0;\n    transition: opacity 0.3s;\n    pointer-events: none;\n  }\n  \n  /* 标题卡片基础 */\n  #image-loaded-toast.show {\n    opacity: 1;\n  }\n</style>\n<div style=\"\n  text-align:center;\n  padding:50px 20px 20px;\n  margin:0 0 0px;\n  position:relative;\n  background:linear-gradient(135deg, #f0f7ff, #e6f0ff);\n\">\n  <!-- 标题卡片 -->\n  <div style=\"\n    position:relative;\n    z-index:10;\n    display:inline-block;\n    transform:translateY(-20px);\n    filter: drop-shadow(0 15px 25px rgba(70,130,180,0.25));\n  \">\n    <div style=\"\n      background:rgba(255,255,255,0.75);\n      backdrop-filter:blur(12px);\n      padding:16px 48px;\n      border-radius:18px;\n      border:1px solid rgba(255,255,255,0.5);\n      box-shadow:0 8px 32px rgba(70,130,180,0.2), inset 0 0 12px rgba(255,255,255,0.6);\n      position:relative;\n      overflow:hidden;\n    \">\n      <!-- 顶部高光 -->\n      <div style=\"\n        position:absolute;\n        top:0; left:0; right:0;\n        height:40%;\n        background:linear-gradient(to bottom, rgba(255,255,255,0.4), transparent);\n        pointer-events:none;\n      \"></div>\n      \n      <h3 style=\"\n        background:linear-gradient(135deg, #4a7bd0, #00a2b8);\n        -webkit-background-clip:text;\n        background-clip:text;\n        color:transparent;\n        font-size:1.3rem;\n        font-weight:700;\n        margin:0;\n        letter-spacing:-0.5px;\n        position:relative;\n        z-index:2;\n      \">{{@@h1@text}}</h3>\n      \n      <!-- 左下装饰点 -->\n      <div style=\"\n        position:absolute;\n        bottom:12px;\n        left:20px;\n        width:6px;\n        height:6px;\n        background:#00a2b8;\n        border-radius:50%;\n        opacity:0.7;\n      \"></div>\n      \n      <!-- 右下装饰点 -->\n      <div style=\"\n        position:absolute;\n        bottom:12px;\n        right:20px;\n        width:6px;\n        height:6px;\n        background:#4a7bd0;\n        border-radius:50%;\n        opacity:0.7;\n      \"></div>\n    </div>\n  </div>\n  \n  <!-- 时间信息 -->\n  <div style=\"\n    margin-top:0px;\n    padding:0px 20px;\n  \">\n    <h5 style=\"\n      color:#6c757d;\n      font-weight:400;\n      font-size:1rem;\n      margin:0;\n      line-height:1.6;\n      letter-spacing:0.3px;\n      position:relative;\n      display:inline-block;\n      max-width:700px;\n    \">\n      {{@@.post-meta-bottom@time.0@text}}\n      <!-- 下划线装饰 -->\n      <div style=\"\n        position:absolute;\n        bottom:-5px;\n        left:0;\n        width:100%;\n        height:1px;\n        background:linear-gradient(90deg, transparent, rgba(70,130,180,0.3), transparent);\n      \"></div>\n    </h5>\n  </div>\n  \n  <!-- 左上装饰圆 -->\n  <div style=\"\n    position:absolute;\n    top:10%;\n    left:15%;\n    width:40px;\n    height:40px;\n    border-radius:50%;\n    background:linear-gradient(135deg, rgba(74,123,208,0.1), transparent);\n    filter:blur(2px);\n  \"></div>\n  \n  <!-- 右下装饰圆 -->\n  <div style=\"\n    position:absolute;\n    bottom:15%;\n    right:10%;\n    width:60px;\n    height:60px;\n    border-radius:50%;\n    background:linear-gradient(135deg, rgba(0,162,184,0.1), transparent);\n    filter:blur(4px);\n    transform:rotate(30deg);\n  \"></div>\n</div>\n${imageContent}  <!-- 这里是图片内容 -->\n<div id=\"image-loaded-toast\">✅ 全部图片已完成加载</div>\n<button id=\"backToTopBtn\" title=\"回到顶部\">🔝</button>\n<script>\n(function() {\n  const backToTopBtn = document.getElementById(\"backToTopBtn\");\n  const toast = document.getElementById(\"image-loaded-toast\");\n  \n  // 图片加载完成检测\n  const images = document.querySelectorAll(\"img\");\n  let loadedCount = 0;\n  const totalImages = images.length;\n  \n  // 如果页面没有图片，直接隐藏提示\n  if(totalImages === 0) {\n    toast.style.display = \"none\";\n  }\n  \n  // 检测图片加载完成\n  images.forEach(img => {\n    if(img.complete) {\n      checkAllLoaded();\n    } else {\n      img.addEventListener(\"load\", checkAllLoaded);\n      img.addEventListener(\"error\", checkAllLoaded);\n    }\n  });\n  \n  function checkAllLoaded() {\n    loadedCount++;\n    if(loadedCount >= totalImages) {\n      showToast();\n    }\n  }\n  \n  function showToast() {\n    toast.classList.add(\"show\");\n    setTimeout(() => {\n      toast.classList.remove(\"show\");\n    }, 2000);\n  }\n  \n  // 监听页面滚动事件\n  window.addEventListener(\"scroll\", () => {\n    const scrollPosition = window.scrollY || document.documentElement.scrollTop;\n    \n    if (scrollPosition > 288) {\n      backToTopBtn.style.display = \"block\";\n      backToTopBtn.style.opacity = \"1\";\n    } else {\n      backToTopBtn.style.display = \"none\";\n    }\n  });\n  \n  // 点击事件监听器\n  backToTopBtn.addEventListener(\"click\", () => {\n    window.scrollTo({\n      top: 0,\n      behavior: \"smooth\"\n    });\n  });\n})();\n</script>\n`;\np;",
    "ruleImage": "img@data-src",
    "ruleLink": ".clearfix@data-href",
    "ruleNextPage": "page",
    "rulePubDate": "🏄Mengteen｜🔖{{@@.post-cat@text}}",
    "ruleTitle": "img@alt",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "首页::/page/{{page}}/\n搜索::/page/{{page}}/?s={{(source.getVariable()==''||source.getVariable()==null)?source.setVariable('美女'):source.getVariable()}}\n女優画像::/category/avjoyuu/page/{{page}}/\n女高画像::/category/josikousei/page/{{page}}/\nおっぱい画像[美乳]::/category/oppai/page/{{page}}/\n太もも画像[美腿]::/category/hutomomo/page/{{page}}/\nオナニー画像[自慰]::/category/onani/page/{{page}}/\n野外セックス[野外啪啪]::/category/yagaisekkusu/page/{{page}}/\n乱交画像[群P]::/category/rankougazou/page/{{page}}/\nフェラ画像[口交]::/category/fera/page/{{page}}/\nクンニ画像[口交]::/category/kunnni/page/{{page}}/\nパイズリ画像[乳交]::/category/paizurigazou/page/{{page}}/\nレズ[女同]::/category/rezugazou/page/{{page}}/\nキス画像[接吻]::/category/kisugazou/page/{{page}}/\nSM::/category/smgazou/page/{{page}}/\n露出::/category/rosyutsugazou/page/{{page}}/\n偷拍::/category/tousatsugazou/page/{{page}}/\n素人::/category/sirouto/page/{{page}}/\n欧美::/category/gaizinerogazou/page/{{page}}/\n制服::/category/olgazou/page/{{page}}/\n泳衣::/category/mizugi/page/{{page}}/\n网袜::/category/amitaitsu/page/{{page}}/\n黑丝::/category/pannsuto/page/{{page}}/\n吊带::/category/ga-ta-beruto/page/{{page}}/\n浴衣::/category/yukatakimono/page/{{page}}/\n女仆::/category/meido/page/{{page}}/\n眼镜娘::/category/megane/page/{{page}}/",
    "sourceComment": "源社区：@Mengteen  2025.7.16\n二传二创或者是其它问题请联系我。\n我邮箱:[xxxmgqxxx@vip.qq.com]\n我QQ:99737563(备注来意)\n1.不需要挂🪜子,个别地方网络加载可能有点慢或者是需要挂🪜子才能访问，别急！\n2.使用了我自己的看图UI,卡片式标题,自适应全屏,一键返回顶上按钮,图片加载完成提示等。\n3.搜索和分类是按我自己个人喜欢的,你也可以放一些你自己喜欢的。",
    "sourceGroup": "vpn",
    "sourceIcon": "https://pashalism.com/wp-content/uploads/2022/03/2341-33.jpg",
    "sourceName": "👙工口画像",
    "sourceUrl": "https://pashalism.com/##@Mengteen",
    "type": 0,
    "variableComment": "🏄Mengteen提示：在此输入关键词搜索！"
  },
  {
    "articleStyle": 3,
    "cacheFirst": false,
    "customOrder": 416,
    "enableJs": true,
    "enabled": false,
    "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,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "legado",
    "sourceIcon": "https://baf7baf7.shewo11.cc/template/shewo/images/logo.png",
    "sourceName": "射我里面了",
    "sourceUrl": "https://baf7baf7.shewo11.cc/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "coverDecodeJs": "java.createSymmetricCrypto(\"AES/CBC/NoPadding\",\"f5d965df75336270\",\"97b60394abc2fbe1\").decrypt(result)",
    "customOrder": 417,
    "enableJs": true,
    "enabled": false,
    "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": 1775586154133,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "#body>.container>.row>div[role=\"main\"]>article:not(:has(meta[content=\"广告\"]))>a",
    "ruleContent": "<js>\nvar step1 = java.base64Decode('QGpzOg0KbGV0IHVybHMgPSBbXTsNCmxldCByZXN1bHRTdHIgPSBTdHJpbmcocmVzdWx0KTsNCg0KLy8g566A5YyW5o+Q5Y+WbTN1OA0KbGV0IGdldE0zdTggPSBmdW5jdGlvbigpIHsNCiAgICBsZXQgdXJsU2V0ID0gW107DQogICAgDQogICAgLy8gMS4g5LuOdmlkZW/moIfnrb7mj5Dlj5YNCiAgICBsZXQgdmlkZW9zID0gamF2YS5nZXRFbGVtZW50cygndmlkZW8nKTsNCiAgICBpZiAodmlkZW9zICYmIHZpZGVvcy5sZW5ndGggPiAwKSB7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlkZW9zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBsZXQgdiA9IHZpZGVvc1tpXTsNCiAgICAgICAgICAgIGxldCBzcmMgPSBTdHJpbmcodi5hdHRyKCdzcmMnKSk7DQogICAgICAgICAgICBpZiAoc3JjLmluZGV4T2YoJy5tM3U4JykgPiAtMSkgew0KICAgICAgICAgICAgICAgIGlmICh1cmxTZXQuaW5kZXhPZihzcmMpID09PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICB1cmxTZXQucHVzaChzcmMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvLyAyLiDku45IVE1M5rqQ56CB5o+Q5Y+WDQogICAgbGV0IHJlZ2V4ID0gLyhodHRwcz86W14nIlxzXSo/XC5tM3U4W14nIlxzXSopL2c7DQogICAgbGV0IG1hdGNoOw0KICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKHJlc3VsdFN0cikpICE9PSBudWxsKSB7DQogICAgICAgIGxldCB1cmwgPSBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7DQogICAgICAgIGlmICh1cmxTZXQuaW5kZXhPZih1cmwpID09PSAtMSkgew0KICAgICAgICAgICAgdXJsU2V0LnB1c2godXJsKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICByZXR1cm4gdXJsU2V0Ow0KfTsNCg0KLy8g5aSE55CG5YiG6ZuGDQppZiAoL+eCueaIkS8udGVzdChyZXN1bHQpICYmIC/mn6XnnIvor6bmg4UvLnRlc3QocmVzdWx0KSkgew0KICAgIGxldCBsaW5rcyA9IGphdmEuZ2V0RWxlbWVudHMoJ0BAI3Bvc3Q+YXJ0aWNsZT4ucG9zdC1jb250ZW50PnA+YScpOw0KICAgIGxldCB0ZW1wVXJscyA9IFtdOw0KICAgIA0KICAgIGlmIChsaW5rcyAmJiBsaW5rcy5sZW5ndGggPiAwKSB7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoIC0gMTsgaSsrKSB7DQogICAgICAgICAgICBsZXQgaHJlZiA9IFN0cmluZyhsaW5rc1tpXS5hdHRyKCdocmVmJykpOw0KICAgICAgICAgICAgbGV0IGRvYyA9IFN0cmluZyhqYXZhLmFqYXgoc291cmNlLmtleSArIGhyZWYpKTsNCiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gZG9jLm1hdGNoKC8oaHR0cHM/OlteJyJcc10qP1wubTN1OFteJyJcc10qKS9nKTsNCiAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7DQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGVzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBtYXRjaGVzW2pdLnJlcGxhY2UoL1xcL2csICIiKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBVcmxzLmluZGV4T2YodXJsKSA9PT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBVcmxzLnB1c2godXJsKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICB1cmxzID0gdGVtcFVybHM7DQp9IGVsc2Ugew0KICAgIHVybHMgPSBnZXRNM3U4KCk7DQp9DQoNCi8vIOWOu+mHje+8iOWGjeasoeehruS/ne+8iQ0KbGV0IGZpbmFsVXJscyA9IFtdOw0KZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7DQogICAgbGV0IHVybCA9IHVybHNbaV07DQogICAgaWYgKHVybCAmJiB1cmwuaW5kZXhPZignLm0zdTgnKSA+IC0xICYmIGZpbmFsVXJscy5pbmRleE9mKHVybCkgPT09IC0xKSB7DQogICAgICAgIGZpbmFsVXJscy5wdXNoKHVybCk7DQogICAgfQ0KfQ0KdXJscyA9IGZpbmFsVXJsczsNCg0KLy8g566A5YyW5pKt5pS+5ZmoDQp2YXIgaHRtbCA9ICc8IURPQ1RZUEUgaHRtbD4nICsNCic8aHRtbD4nICsNCic8aGVhZD4nICsNCiAgICAnPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCI+JyArDQogICAgJzxzdHlsZT4nICsNCiAgICAgICAgJyogeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9JyArDQogICAgICAgICdib2R5IHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAyMHB4OyBiYWNrZ3JvdW5kOiAjZjBmMGYwOyBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7IH0nICsNCiAgICAgICAgJy5jb250YWluZXIgeyBtYXgtd2lkdGg6IDEwMDBweDsgbWFyZ2luOiAwIGF1dG87IGJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAxMHB4OyBvdmVyZmxvdzogaGlkZGVuOyBib3gtc2hhZG93OiAwIDJweCAxMHB4IHJnYmEoMCwwLDAsMC4xKTsgfScgKw0KICAgICAgICAnLmhlYWRlciB7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICM2NjdlZWEgMCUsICM3NjRiYTIgMTAwJSk7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyB9JyArDQogICAgICAgICcudmlkZW8td3JhcHBlciB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IDEwMCU7IHBhZGRpbmctdG9wOiA1Ni4yNSU7IC8qIDE2Ojkg5a696auY5q+UICovIGJhY2tncm91bmQ6ICMwMDA7IH0nICsNCiAgICAgICAgJyN2aWRlbyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBvYmplY3QtZml0OiBjb250YWluOyB9JyArDQogICAgICAgICcuY29udHJvbHMgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDE1cHggMjBweDsgYmFja2dyb3VuZDogI2Y4ZjlmYTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7IH0nICsNCiAgICAgICAgJy5uYXYtZ3JvdXAgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDEwcHg7IH0nICsNCiAgICAgICAgJ2J1dHRvbiB7IHBhZGRpbmc6IDEwcHggMjBweDsgYmFja2dyb3VuZDogIzAwN2JmZjsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDE0cHg7IHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4zczsgfScgKw0KICAgICAgICAnYnV0dG9uOmhvdmVyIHsgYmFja2dyb3VuZDogIzAwNTZiMzsgfScgKw0KICAgICAgICAnYnV0dG9uOmRpc2FibGVkIHsgYmFja2dyb3VuZDogIzZjNzU3ZDsgY3Vyc29yOiBub3QtYWxsb3dlZDsgfScgKw0KICAgICAgICAnc2VsZWN0IHsgcGFkZGluZzogMTBweCAxNXB4OyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItcmFkaXVzOiA1cHg7IGZvbnQtc2l6ZTogMTRweDsgYmFja2dyb3VuZDogd2hpdGU7IG1pbi13aWR0aDogMTIwcHg7IH0nICsNCiAgICAgICAgJy5pbmZvIHsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjZjVmNWY1OyBjb2xvcjogIzY2NjsgZm9udC1zaXplOiAxNHB4OyB9JyArDQogICAgICAgICcuZnVsbHNjcmVlbi1idG4geyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjMjhhNzQ1OyB9JyArDQogICAgICAgICcuZnVsbHNjcmVlbi1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMjE4ODM4OyB9JyArDQogICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsnICsNCiAgICAgICAgICAgICdib2R5IHsgcGFkZGluZzogMTBweDsgfScgKw0KICAgICAgICAgICAgJy5jb250YWluZXIgeyBib3JkZXItcmFkaXVzOiA1cHg7IH0nICsNCiAgICAgICAgICAgICcuY29udHJvbHMgeyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7IH0nICsNCiAgICAgICAgICAgICcubmF2LWdyb3VwIHsgd2lkdGg6IDEwMCU7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgfScgKw0KICAgICAgICAgICAgJ2J1dHRvbiwgc2VsZWN0IHsgd2lkdGg6IDEwMCU7IH0nICsNCiAgICAgICAgJ30nICsNCiAgICAnPC9zdHlsZT4nICsNCic8L2hlYWQ+JyArDQonPGJvZHk+JyArDQogICAgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciI+JyArDQogICAgICAgICc8ZGl2IGNsYXNzPSJoZWFkZXIiPicgKw0KICAgICAgICAgICAgJzxzcGFuIGlkPSJjdXJyZW50Ij4xPC9zcGFuPiAvIDxzcGFuIGlkPSJ0b3RhbCI+JyArIHVybHMubGVuZ3RoICsgJzwvc3Bhbj4g6ZuGJyArDQogICAgICAgICc8L2Rpdj4nICsNCiAgICAgICAgJzxkaXYgY2xhc3M9InZpZGVvLXdyYXBwZXIiPicgKw0KICAgICAgICAgICAgJzx2aWRlbyBjb250cm9scyBhdXRvcGxheSBwbGF5c2lubGluZSBpZD0idmlkZW8iPicgKw0KICAgICAgICAgICAgICAgICc8c291cmNlIHNyYz0iJyArICh1cmxzWzBdIHx8ICcnKSArICciIHR5cGU9ImFwcGxpY2F0aW9uL3gtbXBlZ1VSTCI+JyArDQogICAgICAgICAgICAgICAgJ+aCqOeahOa1j+iniOWZqOS4jeaUr+aMgeinhumikeaSreaUvicgKw0KICAgICAgICAgICAgJzwvdmlkZW8+JyArDQogICAgICAgICc8L2Rpdj4nICsNCiAgICAgICAgJzxkaXYgY2xhc3M9ImNvbnRyb2xzIj4nICsNCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJuYXYtZ3JvdXAiPicgKw0KICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9ImNoYW5nZVZpZGVvKC0xKSIgaWQ9InByZXZCdG4iPuS4iuS4gOmbhjwvYnV0dG9uPicgKw0KICAgICAgICAgICAgICAgICc8c2VsZWN0IG9uY2hhbmdlPSJqdW1wVG9WaWRlbyh0aGlzLnZhbHVlKSIgaWQ9InZpZGVvU2VsZWN0Ij4nOw0KDQovLyDnlJ/miJDpgInpobkNCmZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgew0KICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9IicgKyBpICsgJyI+56ysICcgKyAoaSArIDEpICsgJyDpm4Y8L29wdGlvbj4nOw0KfQ0KDQpodG1sICs9ICc8L3NlbGVjdD4nICsNCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJjaGFuZ2VWaWRlbygxKSIgaWQ9Im5leHRCdG4iPuS4i+S4gOmbhjwvYnV0dG9uPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0idG9nZ2xlRnVsbHNjcmVlbigpIiBjbGFzcz0iZnVsbHNjcmVlbi1idG4iPuWFqOWxjzwvYnV0dG9uPicgKw0KICAgICAgICAnPC9kaXY+JyArDQogICAgICAgICc8ZGl2IGNsYXNzPSJpbmZvIj7mib7liLAgJyArIHVybHMubGVuZ3RoICsgJyDkuKrop4bpopHmupA8L2Rpdj4nICsNCiAgICAnPC9kaXY+JyArDQoNCiAgICAnPHNjcmlwdD4nICsNCiAgICAgICAgJ3ZhciB2aWRlb1VybHMgPSAnICsgSlNPTi5zdHJpbmdpZnkodXJscykgKyAnOycgKw0KICAgICAgICAndmFyIGN1cnJlbnRJbmRleCA9IDA7JyArDQogICAgICAgICd2YXIgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmlkZW8iKTsnICsNCiAgICAgICAgJ3ZhciB2aWRlb1NlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb1NlbGVjdCIpOycgKw0KICAgICAgICAndmFyIGN1cnJlbnRTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImN1cnJlbnQiKTsnICsNCiAgICAgICAgJ3ZhciB0b3RhbFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG90YWwiKTsnICsNCiAgICAgICAgJ3ZhciBwcmV2QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByZXZCdG4iKTsnICsNCiAgICAgICAgJ3ZhciBuZXh0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5leHRCdG4iKTsnICsNCiAgICAgICAgJycgKw0KICAgICAgICAnZnVuY3Rpb24gdXBkYXRlVUkoKSB7JyArDQogICAgICAgICAgICAnY3VycmVudFNwYW4udGV4dENvbnRlbnQgPSBjdXJyZW50SW5kZXggKyAxOycgKw0KICAgICAgICAgICAgJ3RvdGFsU3Bhbi50ZXh0Q29udGVudCA9IHZpZGVvVXJscy5sZW5ndGg7JyArDQogICAgICAgICAgICAndmlkZW9TZWxlY3QudmFsdWUgPSBjdXJyZW50SW5kZXg7JyArDQogICAgICAgICAgICAncHJldkJ0bi5kaXNhYmxlZCA9IGN1cnJlbnRJbmRleCA9PT0gMDsnICsNCiAgICAgICAgICAgICduZXh0QnRuLmRpc2FibGVkID0gY3VycmVudEluZGV4ID09PSB2aWRlb1VybHMubGVuZ3RoIC0gMTsnICsNCiAgICAgICAgICAgICd2aWRlby5zcmMgPSB2aWRlb1VybHNbY3VycmVudEluZGV4XTsnICsNCiAgICAgICAgICAgICd2aWRlby5sb2FkKCk7JyArDQogICAgICAgICd9JyArDQogICAgICAgICcnICsNCiAgICAgICAgJ2Z1bmN0aW9uIGNoYW5nZVZpZGVvKGRpcmVjdGlvbikgeycgKw0KICAgICAgICAgICAgJ3ZhciBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCArIGRpcmVjdGlvbjsnICsNCiAgICAgICAgICAgICdpZiAobmV3SW5kZXggPj0gMCAmJiBuZXdJbmRleCA8IHZpZGVvVXJscy5sZW5ndGgpIHsnICsNCiAgICAgICAgICAgICAgICAnY3VycmVudEluZGV4ID0gbmV3SW5kZXg7JyArDQogICAgICAgICAgICAgICAgJ3VwZGF0ZVVJKCk7JyArDQogICAgICAgICAgICAnfScgKw0KICAgICAgICAnfScgKw0KICAgICAgICAnJyArDQogICAgICAgICdmdW5jdGlvbiBqdW1wVG9WaWRlbyhpbmRleCkgeycgKw0KICAgICAgICAgICAgJ2N1cnJlbnRJbmRleCA9IHBhcnNlSW50KGluZGV4KTsnICsNCiAgICAgICAgICAgICd1cGRhdGVVSSgpOycgKw0KICAgICAgICAnfScgKw0KICAgICAgICAnJyArDQogICAgICAgICdmdW5jdGlvbiB0b2dnbGVGdWxsc2NyZWVuKCkgeycgKw0KICAgICAgICAgICAgJ2lmICghZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHsnICsNCiAgICAgICAgICAgICAgICAnaWYgKHZpZGVvLnJlcXVlc3RGdWxsc2NyZWVuKSB7JyArDQogICAgICAgICAgICAgICAgICAgICd2aWRlby5yZXF1ZXN0RnVsbHNjcmVlbigpOycgKw0KICAgICAgICAgICAgICAgICd9IGVsc2UgaWYgKHZpZGVvLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7JyArDQogICAgICAgICAgICAgICAgICAgICd2aWRlby53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpOycgKw0KICAgICAgICAgICAgICAgICd9IGVsc2UgaWYgKHZpZGVvLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7JyArDQogICAgICAgICAgICAgICAgICAgICd2aWRlby5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpOycgKw0KICAgICAgICAgICAgICAgICd9JyArDQogICAgICAgICAgICAnfSBlbHNlIHsnICsNCiAgICAgICAgICAgICAgICAnaWYgKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7JyArDQogICAgICAgICAgICAgICAgICAgICdkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpOycgKw0KICAgICAgICAgICAgICAgICd9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKSB7JyArDQogICAgICAgICAgICAgICAgICAgICdkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpOycgKw0KICAgICAgICAgICAgICAgICd9IGVsc2UgaWYgKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pIHsnICsNCiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTsnICsNCiAgICAgICAgICAgICAgICAnfScgKw0KICAgICAgICAgICAgJ30nICsNCiAgICAgICAgJ30nICsNCiAgICAgICAgJycgKw0KICAgICAgICAnLy8g5Yid5aeL5YyWJyArDQogICAgICAgICd1cGRhdGVVSSgpOycgKw0KICAgICAgICAnJyArDQogICAgICAgICcvLyDplK7nm5jlv6vmjbfplK4nICsNCiAgICAgICAgJ2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbihlKSB7JyArDQogICAgICAgICAgICAnaWYgKGUua2V5ID09PSAiQXJyb3dMZWZ0IikgY2hhbmdlVmlkZW8oLTEpOycgKw0KICAgICAgICAgICAgJ2Vsc2UgaWYgKGUua2V5ID09PSAiQXJyb3dSaWdodCIpIGNoYW5nZVZpZGVvKDEpOycgKw0KICAgICAgICAgICAgJ2Vsc2UgaWYgKGUua2V5ID09PSAiZiIgfHwgZS5rZXkgPT09ICJGIikgdG9nZ2xlRnVsbHNjcmVlbigpOycgKw0KICAgICAgICAnfSk7JyArDQogICAgICAgICcnICsNCiAgICAgICAgJy8vIOinhumikemUmeivr+WkhOeQhicgKw0KICAgICAgICAndmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBmdW5jdGlvbigpIHsnICsNCiAgICAgICAgICAgICdjb25zb2xlLmxvZygi6KeG6aKR5Yqg6L296ZSZ6K+v77yM5bCd6K+V5YiH5o2i5Yiw5LiL5LiA5LiqIik7JyArDQogICAgICAgICAgICAnaWYgKGN1cnJlbnRJbmRleCA8IHZpZGVvVXJscy5sZW5ndGggLSAxKSB7JyArDQogICAgICAgICAgICAgICAgJ2N1cnJlbnRJbmRleCsrOycgKw0KICAgICAgICAgICAgICAgICd1cGRhdGVVSSgpOycgKw0KICAgICAgICAgICAgJ30nICsNCiAgICAgICAgJ30pOycgKw0KICAgICc8L3NjcmlwdD4nICsNCic8L2JvZHk+JyArDQonPC9odG1sPic7DQoNCmh0bWw7');\nvar step2 = java.getString(step1);\nresult = step2\n</js>",
    "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",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "搜索::/search/{{source.getVariable()}}/{{page}}/\n首页::/page/{{page}}/\n今日看料::/category/24hcg/{{page}}/\n热门吃瓜::/category/rgtj/{{page}}/\n每日热瓜::/category/mrrg/{{page}}/\n反差女神::/category/fcns/{{page}}/\n学院热瓜::/category/xyrg/{{page}}/\n网红吃瓜::/category/whhl/{{page}}/\n每日大赛::/category/mrds/{{page}}/\n海角乱伦::/category/llsq/{{page}}/\n黑料大事::/category/hlda/{{page}}/\n撸友看片::/category/lydt/{{page}}/\n黑料杂谈::/category/hlzt/{{page}}/\nav解说::/category/avjs/{{page}}/\n禁播动漫::/category/mrst/{{page}}/\n性爱技巧::/category/wyxs/{{page}}/\n爽文短剧::/category/swdj/{{page}}/\n明星吃瓜::/category/mxbg/{{page}}/\n官场秘闻::/category/gcmw/{{page}}/\n学生::/search/学生/{{page}}/\n全部①::/<,page/{{page}}/>\n全部②::/page/3/\n全部③::/page/5/\n偷情::/search/偷情/{{page}}/\n白虎::/search/白虎/{{page}}/\n反差::/search/反差/{{page}}/\n极品::/search/极品/{{page}}/\n萝莉::/search/萝莉/{{page}}/\n00后::/search/00后/{{page}}/\n女同::/search/女同/{{page}}/\n双马尾::/search/双马尾/{{page}}/\n学院::/search/学院/{{page}}/\n高三::/search/高三/{{page}}/\n高中::/search/高中/{{page}}/\n少女::/search/少女/{{page}}/\n情趣::/search/情趣/{{page}}/\n自拍::/search/自拍/{{page}}/\n大学::/search/大学/{{page}}/\n大一::/search/大一/{{page}}/\n学妹::/search/学妹/{{page}}/\n校花::/search/校花/{{page}}/\n调教::/search/调教/{{page}}/\n女神::/search/女神/{{page}}/\n少妇::/search/少妇/{{page}}/\n巨乳::/search/巨乳/{{page}}/\n孕妇::/search/孕妇/{{page}}/\n口::/search/口交/{{page}}/\n精::/search/精/{{page}}/",
    "sourceGroup": "legado",
    "sourceIcon": "https://i1.wp.com/i.postimg.cc/wjL5myHr/kpptube-cc-3e997cb42a6b0f37af6c6a40866ba202.gif",
    "sourceName": "黑料不打烊",
    "sourceUrl": "https://wiki.cvgdpnvq.xyz/",
    "style": "iframe{\n\theight:600px\n}\ntitle{\n\tdisplay:block\n}",
    "type": 0
  },
  {
    "articleStyle": 3,
    "cacheFirst": false,
    "customOrder": 947,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 1775587987390,
    "loadWithBaseUrl": true,
    "preload": false,
    "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",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "搜索::/search/{{source.getVariable()}}/{{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": "legado",
    "sourceIcon": "http://p6.itc.cn/images01/20201202/8d012ed623d647a78635557e7d235ab6.jpeg",
    "sourceName": "91大事件🥝",
    "sourceUrl": "https://jbr7z1.xwgjwrua.cc/",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 953,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775588065990,
    "loadWithBaseUrl": true,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "legado",
    "sourceIcon": "http://p6.itc.cn/images01/20201202/8d012ed623d647a78635557e7d235ab6.jpeg",
    "sourceName": "51吃瓜🥝",
    "sourceUrl": "https://behind.qjaeyfzu.xyz/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 1064,
    "enableJs": true,
    "enabled": false,
    "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,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "legado",
    "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}",
    "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": 1071,
    "enableJs": true,
    "enabled": false,
    "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": "legado",
    "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": 1076,
    "enableJs": true,
    "enabled": false,
    "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": "legado",
    "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": 0,
    "cacheFirst": false,
    "customOrder": 1082,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11; Pixel 3 XL Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/102.0.4988.0 Mobile Safari/537.36 SearchCraft/3.9.2 (Baidu; P1 11)\",\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// 直接初始化避免额外事件\nconst video = document.getElementById('video');\nif (video) setupCustomPlayer(video);",
    "lastUpdateTime": 1775591752645,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "<js>\nresult = java.ajax(source.sourceUrl + \"go.js\");\nvar urlMatch = result.match(/top\\.location\\s*=\\s*['\"](https?:\\/\\/[^\\/'\"]+)/);\nif (urlMatch) {\n    A = urlMatch[1];} else {\n    A = source.sourceUrl;}\njava.put('url', A);\npath = baseUrl.replace(/^https?:\\/\\/[^\\/]+/, '');\nB = A + path;\njava.put('next', B);\njava.ajax(B);\n</js>\n.stui-vodlist__box",
    "ruleContent": "{{@@script@all##\"url\":\"(.*)\",\"url##$1##}}\n@js:\nresult = result.replace(/\\\\+/g, '');\n\nresult = `\n<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<style>\nhtml, body { text-align:center; margin:0; padding:0; width:100%; overflow:hidden; }\n</style>\n<!-- 引入CryptoJS库 -->\n<script src=\"https://s4.zstatic.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js\"></script>\n</head>\n<body>\n<div class=\"container\">\n<div class=\"title\">{{@@h4.0@text##.*:}}</div>\n<video id=\"video\" width=\"100%\" height=\"90%\" poster=\"{{java.get('pic')}}\" controls autoplay muted loop></video>\n</div>\n\n<script>\n(function() {\n// 配置解密参数\nconst key = CryptoJS.enc.Latin1.parse('9q4h7kt7skwsc9af1qmwy14jkfq2biab');\nconst iv = CryptoJS.enc.Latin1.parse('6b3gslw69k6eazmw');\nconst encryptedUrl = \"${result}\"; // 注入加密URL\n\ntry {\n// 1. 预处理URL\nlet base64Str = encryptedUrl\n.replace(/-/g, '+') // URL安全Base64替换\n.replace(/_/g, '/');\n\n// 2. Base64补全\nconst pad = base64Str.length % 4;\nif (pad) base64Str += '===='.slice(0, 4 - pad);\n\n// 3. 解密流程\nconst encryptedData = CryptoJS.enc.Base64.parse(base64Str);\nconst decrypted = CryptoJS.AES.decrypt(\n{ ciphertext: encryptedData },\nkey,\n{ iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }\n);\n\n// 4. 处理解密结果\nconst decryptedStr = decodeURIComponent(\nCryptoJS.enc.Latin1.stringify(decrypted)\n);\nconst parts = decryptedStr.split(',');\n\nif (parts.length !== 5) throw new Error('无效解密数据');\nconst realUrl = \\`https://cdn-m.asujp.com:59888/f/\\${parts[0]}/\\${parts[1]}/\\${parts[2]}/play.m3u8?_KS=\\${parts[3]}&_KE=\\${parts[4]}\\`;\n\n// 5. 动态设置视频源\ndocument.getElementById('video').src = realUrl;\n} catch (e) {\ndocument.body.innerHTML = '视频解析失败: ' + e.message;\n}\n})();\n</script>\n</body>\n</html>\n`;\nresult",
    "ruleImage": "{{@@a@data-original}}\n<js>\njava.put('pic',result)\n</js>",
    "ruleLink": "{{java.get('url')}}{{@@a.0@href}}",
    "ruleNextPage": "@js:\nvar A = java.get('next'); \nvar B = java.ajax(A);\nvar C = java.get('url'); \nvar D = B.match(/<a [^>]*href=\"([^\"]+)\"[^>]*>\\s*下一页\\s*<\\/a>/i);\nnextPageUrl = D ? (C + D[1]) : \"\";\n",
    "rulePubDate": "{{@@span@text}}\n@js:\nresult = result !== \"\" ? result : \"点击播放\";",
    "ruleTitle": "h4@text##.*屎.*|.*喝尿.*|.*Ts.*|.*ts.*|.*伪娘.*|.*伪男.*|.*人妖.*|.*男同.*|.*狼狗.*|.*奶狗.*|.*鲜肉.*|.*帅哥.*|.*正装.*|.*猛1.*|.*ZKtop1.*|.*体育生.*|.*双性.*|.*男男.*|.*直男.*|.*gv.*|.*父子.*|.*飞机.*|.*撸.*|.*女性向.*|.*骚0.*|.*poop.*|.*男奴.*|.*奴男.*|.*同志.*|.*苏木.*|.*西装.*|.*骚受.*|.*QS.*|.*Peter.*|.*摔跤社.*|.*基情.*|.*天菜.*|.*大鸡.*|.*肌肉.*|.*薄肌.*|.*G片.*|.*术0.*|.*宏翔.*|.*男蜜.*|.*自制口.*|.*威廉.*|.*骚男.*|.*基友.*|.*美男子.*|.*鸡儿.*",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "\n随机::/index.php/vod/type/id/{{ Math.floor(Math.random()*3) +1}}/page/{{ Math.ceil(Math.random()*440) }}.html\n\n🔎搜索::/index.php/vod/search.html?wd={{v=source.getVariable();if(/^\\s*$/.test(v)||v==null)source.setVariable('奸');source.getVariable()}}\n\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黑料::/index.php/vod/type/id/7.html\n欧美::/index.php/vod/type/id/4.html\n三级::/index.php/vod/type/id/6.html\n动漫::/index.php/vod/type/id/5.html",
    "sourceComment": "备用地址\nhttp://3.j332.cc/\nhttp://k587.cc/\n\n",
    "sourceGroup": "vpn",
    "sourceIcon": "https://img4.tuwandata.com/v2/thumb/jpg/NWFkMywxMTI1LDAsOSwzLDEsLTEsTk9ORSwsLDkw/u/res.tuwan.com/zipgoods/20190508/3b6408c569f8eb687a8dd6eb3578bdb9.jpg",
    "sourceName": "YourPorn",
    "sourceUrl": "http://t.t631.cc/",
    "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: +20px; /* 视频上移 */\n    left: 0; \n    width: 100%; \n    height: calc(93% + 0px);  /* 调整高度以适应内容 */\n    object-fit: contain; /* 确保视频内容不被裁剪 */\n    z-index: 0; /* 确保视频在标题之下 */\n    controls=\"controls\" autoplay muted; \n} \n",
    "type": 0
  },
  {
    "articleStyle": 3,
    "cacheFirst": false,
    "customOrder": 1098,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 1775588705888,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": ".item",
    "ruleContent": "id.kt_player@all&&script@all",
    "ruleImage": "img@data-original",
    "ruleLink": "a@href",
    "ruleNextPage": "page",
    "rulePubDate": ".time@span",
    "ruleTitle": "img@alt",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "搜索::https://www.85xo.com/search/{{v=source.getVariable()}}/\n亚洲人::/tags/ya-zhou-ren/\n马来::/tags/ma-lai/\n日本::/tags/ri-ben/\n后入::/tags/hou-ru/\n大奶::/tags/da-nai/\n高潮::/tags/gao-chao/\n做爱::/tags/zuo-ai/\n马来西亚::/tags/ma-lai-zi-ya/\n妹妹::/tags/mei-mei/\n兔牙::/tags/tu-ya/\n妹::/tags/mei/\n巨乳::/tags/ju-ru/\n自慰::/tags/zi-wei/\n情侣::/tags/qing-lv/\n骚::/tags/sao/\n男友::/tags/nan-you/\n淫叫::/tags/yin-jiao/\n抓奶::/tags/zhua-nai/\n新加坡::/tags/xin-jia-po/\n内衣::/tags/nei-yi/\n肉棒::/tags/rou-bang/\n床上::/tags/chuang-shang/\n嫩逼::/tags/nei-bi/\n日本人::/tags/ri-ben-ren/\n鲍鱼::/tags/bao-yu/\n口::/tags/kou/\n少女::/tags/shao-nv/\n美女::/tags/mei-nv/\n台灣::/tags/tai-wan/\n可爱::/tags/ke-ai/\n偷拍::/tags/tou-pai/\n掰逼::/tags/bai-bi/\n喷水::/tags/pen-shui/\n脱衣::/tags/tuo-yi/\n屁眼::/tags/pi-yan/\n口交::/tags/kou-jiao/\n高中::/tags/gao-zhong/\n妹子::/tags/mei-zi/\n中國::/tags/zhong-guo/\n母狗::/tags/mu-gao/\n全裸::/tags/quan-luo/\n美臀::/tags/mei-tun/\n贫乳::/tags/pin-ru/\n逼::/tags/bi/\n内裤::/tags/nei-ku/\n爱::/tags/ai/\n自拍::/tags/zi-pai/\n学生::/tags/xue-sheng/\n呻吟::/tags/shen-yin/\n韓國::/tags/han-guo/\n泰國::/tags/tai-guo/\n越南::/tags/yue-nan/\n近拍::/tags/jin-pai/\n香港::/tags/xiang-gang/\n新馬::/tags/xin-ma/\n街拍::/tags/jie-pai/",
    "sourceComment": "https://www.85po.com",
    "sourceGroup": "legado",
    "sourceIcon": "https://85tube.com/favicon.ico",
    "sourceName": "85Tube",
    "sourceUrl": "https://www.85xo.com/",
    "style": "{background-color:black;margin:0;padding:0;width:100%;}",
    "type": 0
  },
  {
    "articleStyle": 2,
    "cacheFirst": false,
    "customOrder": 1106,
    "enableJs": true,
    "enabled": false,
    "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,
    "preload": false,
    "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",
    "showWebLog": false,
    "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": "vpn",
    "sourceIcon": "https://img0.baidu.com/it/u=2874790938,228875074&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=1149",
    "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        }",
    "type": 0
  },
  {
    "articleStyle": 3,
    "cacheFirst": false,
    "customOrder": 1148,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 1775588980159,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.stui-vodlist clearfix@tag.li||class.col-lg-4 col-md-3 col-sm-2 col-xs-1",
    "ruleContent": "class.player-box@all&&\nscript@all",
    "ruleImage": "a.0@data-original",
    "ruleLink": "a.0@href",
    "ruleNextPage": "text.下一页@href",
    "ruleTitle": "h4@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "搜索::/index.php/vod/search.html?wd={{source.getVariable()}}&submit=\n國產::/index.php/vod/type/id/1/page/{{page}}.html\n無碼::/index.php/vod/type/id/2/page/{{page}}.html\n有碼::/index.php/vod/type/id/3/page/{{page}}.html\n歐美::/index.php/vod/type/id/4/page/{{page}}.html\n動漫::/index.php/vod/type/id/5/page/{{page}}.html\n情色::/index.php/vod/type/id/6/page/{{page}}.html\n黑料::/index.php/vod/type/id/7/page/{{page}}.html",
    "sourceComment": "bmx56.com",
    "sourceGroup": "vpn",
    "sourceIcon": "",
    "sourceName": "youporn",
    "sourceUrl": "https://x139gc2uaksfi4.com:58011/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 1149,
    "enableJs": true,
    "enabled": false,
    "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": "legado",
    "sourceIcon": "http://img95.699pic.com/xsj/1r/73/9i.jpg",
    "sourceName": "✈️91PORN\n☆夜明空☆",
    "sourceUrl": "https://f1011.a2507app.com/index.php",
    "type": 2,
    "variableComment": "❌ 请勿修改此处内容，请自行查看源注释"
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "concurrentRate": "20/10000",
    "contentBlacklist": "",
    "customOrder": 1241,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "header": "<js>\nheaders={\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.0.0\",\n    \"Referer\": String(source.getKey()).replace(/(.*\\/\\/[a-z0-9.-]+).*/, '$1')\n}\nJSON.stringify(headers);\n</js>",
    "injectJs": "",
    "jsLib": "function get(tag,num) {\n    sort = ['post_date_and_popularity','post_date','video_viewed','most_favourited'];\n    sort1 = ['','post_date_and_popularity','post_date','video_viewed','most_favourited'];\n    var e = eval(tag + '[' + num + ']');\n    return e;\n}\nfunction Get(e) {\n    const { java, source, cookie, cache } = this;\n    var get = JSON.parse(source.getLoginHeader());\n    return get[e];\n}\nfunction Map(e) {\n    const { java, source, cookie, cache } = this;\n    var infomap = source.getLoginInfoMap();\n    var map = (infomap !== null && infomap.get(e)) ? infomap.get(e) : '';\n    return String(map);\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginCheckJs": "",
    "loginUi": "[\n  { name: \"  查看当前  \", type: \"button\", action: \"look(0)\" },\n  { name: \"   查看历史   \", type: \"button\", action: \"look(1)\" },\n  { name: \"  恢复默认  \", type: \"button\", action: \"test(0)\" },\n\n  {\n    name: \"            💡　　 源　　 站　　 更　　 新　　 💡            \",\n    type: \"button\",\n    action: \"update()\"\n  },\n\n  { name: \"                      ༺ˇ»`ʚ  点击切换源站  ɞ´«ˇ༻                    \", type: \"button\" },\n  { name: \"       ①国际网址✈️       \", type: \"button\", action: \"$(1)\"},\n  { name: \"       ②国内网址🐰       \", type: \"button\", action: \"$(2)\"},\n\n  { name: \"                      ༺ˇ»`ʚ  点击切换分类  ɞ´«ˇ༻                    \", type: \"button\" },\n  { name: \"           主题标签           \", type: \"button\", action: \"o(0)\" },\n  { name: \"           女优一览           \", type: \"button\", action: \"o(1)\" },\n\n  { name: \"                      ༺ˇ»`ʚ  列表影片排序  ɞ´«ˇ༻                    \", type: \"button\" },\n  { name: \" 近 期   \", type: \"button\", action: \"q(0)\" },\n  { name: \" 更 新   \", type: \"button\", action: \"q(1)\" },\n  { name: \" 观 看   \", type: \"button\", action: \"q(2)\" },\n  { name: \" 收 藏 \", type: \"button\", action: \"q(3)\" },\n\n  { name: \"                      ༺ˇ»`ʚ  搜索影片排序  ɞ´«ˇ༻                    \", type: \"button\" },\n  { name: \"  最高相关  \", type: \"button\", action: \"r(0)\" },\n  { name: \"   近期最佳   \", type: \"button\", action: \"r(1)\" },\n  { name: \"  最近更新  \", type: \"button\", action: \"r(2)\" },\n  { name: \"  最多观看  \", type: \"button\", action: \"r(3)\" },\n  { name: \"   最高收藏   \", type: \"button\", action: \"r(4)\" },\n  { name: \"                    \", type: \"button\" },\n\n  { name: \"                      ༺ˇ»`ʚ  分类女优排序  ɞ´«ˇ༻                    \", type: \"button\" },\n  { name: \" 热 度   \", type: \"button\", action: \"p(0)\" },\n  { name: \" 名 字   \", type: \"button\", action: \"p(1)\" },\n  { name: \" 更 新   \", type: \"button\", action: \"p(2)\" },\n  { name: \" 数 量 \", type: \"button\", action: \"p(3)\" },\n\n  { name: \"                      ༺ˇ»`ʚ  女优加载页数  ɞ´«ˇ༻                    \", type: \"button\", action: \"login('【加载页数】' + n(2) + '填写数字或范围，如：15或10-20')\" },\n  { name: \"页数：\", type: \"text\" },\n\n  { name: \"                      ༺ˇ»`ʚ  填写收藏词条  ɞ´«ˇ༻                    \", type: \"button\", action: \"login('【收藏词条】' + n(2) + '填写搜索关键词\\\\n多个关键词用英文逗号”,“隔开')\" },\n  { name: \"收藏：\", type: \"text\" },\n\n  {\n    name: \"            💡　　 源　　 站　　 打　　 印　　 💡            \",\n    type: \"button\",\n    action: \"test()\"\n  }\n]",
    "loginUrl": "var fburl = 'https://alldayj.com';\noriginal = {\n    'o': 0,\n    'p': 0,\n    'q': 0,\n    'r': 0,\n    'url': 'https://jable.tv',\n    'urls': [\n        'https://jable.tv',\n        'https://jable.tv'\n    ]\n};\ntry {\n    $$$ = JSON.parse(source.getLoginHeader());\n    if ($$$ == null) {\n        error;\n    } else {\n        '';\n    };\n} catch (e) {\n    $$$ = original;\n    put($$$);\n}\nx = '⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚';\nvar Headers = String(cache.get(java.md5Encode16(Get('url') + \"headers\")));\nvar Option = {\n    \"method\": \"GET\",\n    \"headers\": Headers\n};\nfunction test(e) {\n    if (e == undefined) {\n        return java.log('\\n' + JSON.stringify($$$['urls'], null, '\\t')) + login('【源站输出提示】' + n(2) + '源站已打印完毕，请到日志查看');\n    }\n    if (e == 0) {\n        login('【初始化提示】' + n(2) + '已恢复默认设置');\n        return put(original);\n    }\n    date1 = new Date().getTime();\n    html = java.ajax($$$.urls[e]);\n    if(html.includes('no-js')){\n        cookie.removeCookie(Get('url'));\n        java.startBrowserAwait($$$.urls[e],\"验证\").body();\n        date1 = new Date().getTime();\n        html = java.ajax($$$.urls[e]);\n    }\n    date2 = new Date().getTime();\n    t = date2 - date1;\n    time = t / 1000 + 's';\n    c = String(html).indexOf('新作');\n    logTime = '【' + name(e) + '】\\n┋┋\\n' + '解析时间：' + time;\n    if (c == -1 || t > 5000) {\n        return login('【访问失败提示】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️源站已失效(可能被墙)♣️\\n┋┋\\n请更新网址/切换源站/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n    } else if (t < 1000) {\n        return login('【网络环境优良】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低，推荐使用此站❤️\\n┋┋\\n网络环境优良，请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n    } else if (t >= 1000 && t < 2000) {\n        return login('【网络环境一般】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般，勉强可使用♦️\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n    } else if (t >= 2000 && t < 5000) {\n        return login('【网络环境堪忧】' + n(2) + '┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高，不建议使用♠\\n┋┋\\n请切换其他源站或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n    }\n}\nfunction put(data) {\n    return source.putLoginHeader(JSON.stringify(data, null, '\\t'));\n}\nfunction update() {\n    $$$['urls'].splice(original['urls'].length);\n    time = new Date().getTime();\n    html = java.webViewGetOverrideUrl(null, fburl + '?t=' + time, null, '');\n    J = org.jsoup.Jsoup.parse(html);\n    u = J.select('.col-md-8 a');\n    for (i in u) {\n        host = String(u[i].attr('href'));\n        if (String($$$['urls']).indexOf(host) === -1) {\n            java.log('\\n✅已添加源站：\\n' + host);\n            $$$['urls'].push(host);\n            put($$$);\n        }\n    }\n    return login('【源站更新提示】' + n(2) + '源站更新完毕，请到日志查看');\n}\nfunction name(e) {\n    if (e == undefined) {\n        e = 0;\n    }\n    return x[e] + $$$.urls[e];\n}\nfunction login(e) {\n    if (e == undefined) {\n        return;\n    }\n    java.longToast(e);\n}\nfunction n(e) {\n    n = '\\n';\n    for (m = 1; m < e; m++) {\n        n = n + '\\n';\n    }\n    return n;\n}\nfunction k(e) {\n    k = ' ';\n    for (q = 1; q < e; q++) {\n        k = k + ' ';\n    }\n    return k;\n}\nfunction l(e) {\n    l = '';\n    for (o = 1; o < e; o++) {\n        l = l + '';\n    }\n    return l;\n}\nfunction look(e) {\n    if (e == 0) {\n        return login('【查看当前源站】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ' + '📌' + name($$$.ci0)) + '\\n┋┋' + ('\\n' + '🗳订阅分类：' + typeO($$$.o)) + '\\n┋┋' + ('\\n' + '👩‍🎤女优排序：' + typeP($$$.p)) + '\\n┋┋' + ('\\n' + '📚分类排序：' + typeQ($$$.q)) + '\\n┋┋' + ('\\n' + '📚搜索排序：' + typeR($$$.r)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n    } else {\n        return login('【查看历史接口】\\n\\n┏┅━┅━┅━┅━┅━┅━┅━┅━┅┓\\n┋┋' + ('\\n ci1：' + name($$$.ci1)) + '\\n┋┋' + ('\\n ci2：' + name($$$.ci2)) + '\\n┋┋' + ('\\n ci3：' + name($$$.ci3)) + '\\n┋┋' + '\\n┗┅━┅━┅━┅━┅━┅━┅━┅━┅┛');\n    }\n}\nfunction $(e) {\n    if (e == undefined) {\n        e = result['序号：'];\n        e = e > 0 ? e : '0';\n    }\n    if (/^ci[123]$/.test(e)) {\n        eval('i=$$$.' + e);\n    }\n    if (/\\D|^$/.test(e) || e < 0 || e >= $$$['urls'].length) {\n        return login('【源站错误提示】' + n(2) + '已选择的源站无效，请重新选择');\n    }\n    $$$['url'] = $$$['urls'][e];\n    $$$['ci3'] = $$$['ci2'];\n    $$$['ci2'] = $$$['ci1'];\n    $$$['ci1'] = $$$['ci0'];\n    $$$['ci0'] = e;\n    put($$$);\n    test(e);\n}\nO = ['主题标签','全部女优'];\nfunction typeO(e) {\n    if (e == undefined) {\n        e = 0;\n    }\n    return O[e];\n}\nfunction o(e) {\n    if (o == undefined) {\n        o = result.o;\n    }\n    if (e == $$$.o) {\n        return login('【分类切换提示】' + n(2) + '已经选择此分类，无需更换');\n    }\n    login('【分类切换提示】' + n(2) + '已经切换到[' + typeO(e) + ']分类，请刷新分类');\n    $$$.o = e;\n    return put($$$);\n}\nP = ['热度优先','名字排序','最近更新','影片数量'];\nfunction typeP(e) {\n    if (e == undefined) {\n        e = 0;\n    }\n    return P[e];\n}\nfunction p(e) {\n    if (p == undefined) {\n        p = result.p;\n    }\n    if (e == $$$.p) {\n        return login('【女优排序提示】' + n(2) + '已经选择此排序，无需更换');\n    }\n    login('【女优排序提示】' + n(2) + '已经切换到[' + typeP(e) + ']排序，请刷新分类');\n    $$$.p = e;\n    return put($$$);\n}\nQ = ['近期最佳','最近更新','最多观看','最高收藏'];\nfunction typeQ(e) {\n    if (e == undefined) {\n        e = 0;\n    }\n    return Q[e];\n}\nfunction q(e) {\n    if (q == undefined) {\n        q = result.q;\n    }\n    if (e == $$$.q) {\n        return login('【分类影片排序】' + n(2) + '已经选择此排序，无需更换');\n    }\n    login('【分类影片排序】' + n(2) + '已经切换到[' + typeQ(e) + ']排序');\n    $$$.q = e;\n    return put($$$);\n}\nR = ['最高相关','近期最佳','最近更新','最多观看','最高收藏'];\nfunction typeR(e) {\n    if (e == undefined) {\n        e = 0;\n    }\n    return R[e];\n}\nfunction r(e) {\n    if (r == undefined) {\n        r = result.r;\n    }\n    if (e == $$$.r) {\n        return login('【搜索影片排序】' + n(2) + '已经选择此排序，无需更换');\n    }\n    login('【搜索影片排序】' + n(2) + '已经切换到[' + typeR(e) + ']排序');\n    $$$.r = e;\n    return put($$$);\n}",
    "preload": false,
    "ruleArticles": ".mb-e-20",
    "ruleContent": "<js>\n//获取集数\nvar n = 0;\nvar names = ['原版视频'];\nvar list = [];\nURL = baseUrl;\nlist.push(URL);\njishu = list.map(($, i)=>{\n    var value = '',name = '',bt = '',fm = '';\n    html = $ == baseUrl ? result : java.ajax($);\n    J = org.jsoup.Jsoup.parse(html);\n    name = names[i];\n    var Value = [];\n    url = html.match(/hlsUrl\\s*=\\s*'(.*?)'/)[1];\n    Value.push({src:url,size:'0'});\n    value = JSON.stringify(Value);\n    bt = J.select('h4')[0].text();\n    fm = J.select('video')[0].attr('poster');\n    return `<button onclick=\"jishu(this)\" value=${value} data-bt=\"${bt}\"  data-fm=\"${fm}\"><b>${name}</b></button>`;\n}).join('\\n');\n\nstyle = ' style=\"display:none;\"';\njishu = `<div class=\"jishu\" data-n=\"${n}\"${style}>\\n<p>🎥 视频版本：&lrm;</p>\\n<p>${jishu}</p>\\n</div>\\n`;\n\n//返回json\nJSON.stringify({\n    jishu: jishu\n})\n</js>\n<!DOCTYPE html>\n<html lang=\"zh-Hans\">\n<head>\n<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<link rel=\"stylesheet\" href=\"https://cdn.plyr.io/3.6.12/plyr.css\">\n<style>\n* {\n    z-index: 0;\n    margin: 0;\n    padding: 0;\n}\n\nbody {\n    margin: auto;\n    background: #ccc;\n    width: 100%;\n}\n\nbody>p:first-of-type {\n    width: 100%;\n    position: sticky;\n    top: 0px;\n    text-indent: 0px;\n    height: 16px;\n    font-size: 0.7rem;\n    border-radius: 0px 0px 0px 0px;\n    background: #000;\n    color: #fff;\n    white-space: nowrap;\n    overflow: auto;\n    z-index: 4;\n}\n\nvideo {\n    visibility: hidden;\n}\n\n.video-container {\n    position: relative;\n    min-height: 56.25vw;\n    z-index: 3;\n}\n\n#player {\n    position: relative;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n}\n\n:root {\n    --plyr-color-main: #00aaff;/* 播放器主要颜色 */\n    --plyr-control-color: #fff;/* 播放器控件图标颜色 */\n    --plyr-control-background: transparent;/* 播放器控件背景颜色 */\n    --plyr-video-background: transparent;/* 视频背景颜色 */\n    --plyr-range-fill-background: #0099ee;/* 进度条已填充部分的颜色 */\n    --plyr-range-thumb-background: #fff;/* 进度条滑块的颜色 */\n}\n\n.plyr__control--overlaid {\n    background: transparent;\n    border: 0;\n    border-radius: 100%;\n    color: #fff;\n    left: calc(50% - 30px);\n    top: calc(50% - 45px);\n    transform: none;\n    width: 60px;\n    height: 60px;\n    padding: 0;\n    z-index: 2;\n}\n\n.plyr__control--overlaid svg {\n    width: 50px;\n    height: 50px;\n    left: calc(50% - 25px);\n    top: calc(50% - 25px);\n    transform: none;\n    fill: #fff;/* 大播放器控件图标颜色 */\n}\n\n.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true] {\n    background: transparent;/* 播放器控件悬停/点击背景颜色 */\n    color: #00aaff;/* 播放器控件悬停/点击图标颜色 */\n}\n\n.plyr__controls .plyr__controls__item {\n    margin-left: auto;\n    margin: calc(var(--plyr-control-spacing,10px)/4);\n}\n\n.plyr__time--duration {\n    display: inline-block!important;\n}\n\n.plyr__time+.plyr__time:before {\n    margin-right: 8px!important\n}\n\n@media (max-width: 640px) {\n    .plyr__captions {\n        margin-bottom:-8px\n    }\n\n    .plyr__progress__container {\n        margin-right: 5px\n    }\n\n    .plyr__time {\n        position: absolute;\n        bottom: 29px;\n    }\n\n    .plyr__time--current {\n        left: 108px\n    }\n\n    .plyr__time+.plyr__time:before {\n        content: \"\"!important\n    }\n\n    .plyr__time--duration {\n        right: 110px;\n    }\n\n    .plyr__volume {\n        width: auto;\n        max-width: 32px!important;\n        min-width: 32px!important\n    }\n\n    input[id^=plyr-volume-] {\n        display: none!important;\n    }\n\n    .plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--pip-supported [data-plyr=pip] {\n        display: none!important;\n    }\n}\n\n.all-info {\n    position: absolute;\n    background: #ccc;/* 详情信息背景颜色 */\n    margin: auto;\n    width: 100%;\n    height: auto;\n}\n\n.all-info>div {\n    width: 100%;\n    margin: auto;\n}\n\n.all-info>p {\n    text-indent: 0px;\n}\n\n.all-info>div>p {\n    width: 90%;\n    margin: 5px 5%;\n    outline: none;\n    text-align: left;\n    word-wrap: break-word;\n}\n\ndetails {\n    width: 100%;\n    height: auto;\n    margin: auto;\n    padding: 0;\n    border-bottom: 0.5px solid #333;\n}\n\ndetails>img {\n    width: 100%;\n}\n\ndetails[open] {\n    border-bottom: none;\n}\n\nsummary {\n    width: 90%;\n    margin: 5px 3%;\n    outline: none;\n    line-height: 1.5;\n    text-align: left;\n    word-wrap: break-word;\n}\n\nsummary::-webkit-details-marker {\n    display: none;\n}\n\nbutton {\n    width: 29.5%;\n    margin: 1.25%;\n    padding: 5px;\n    outline: none;\n    border-radius: 8px;\n    font-size: 0.7rem;\n    text-overflow: ellipsis;\n    overflow: hidden;\n}\n\nbutton.active {\n    color: #166188;\n    position: sticky;\n    left: 0;\n    right: 0;\n}\n</style>\n</head>\n<body>\n<p>{{src.match(/hlsUrl\\s*=\\s*'(.*?)'/)[1]}}</p>\n<div class=\"video-container\">\n  <video id=\"player\" playsinline controls preload=\"auto\" poster=\"https://qyyuapi.com/img/noposter.png\">\n  </video>\n</div>\n<div class=\"all-info\">\n<details>\n  <summary>\n    <h3>{{@@h4.0@text}}</h3>\n  </summary>\n  <img src={{@@video@poster}}>\n</details>\n{{JSON.parse(result).jishu}}\n<div>\n    <p>📆 更新：{{@@.mr-3.0@text}}</p>\n    <p>🎥 播放：{{@@.mr-3.1@text##\\s}}</p>\n    <p>❤ 收藏：{{@@.count@text}}</p>\n    <p>👩‍🎤 女优：{{@@.rounded-circle@title}}</p>\n    <p>📦 主题：{{@@.tags.h6-md@text##•.*$}}</p>\n    <p>🔖 标签：{{@@.tags.h6-md@text##^.*•}}</p>\n</div>\n</div>\n\n<script src=\"https://cdn.plyr.io/3.6.12/plyr.js\"></script>\n<script src=\"https://cdn.jsdelivr.net/npm/hls.js@latest\"></script>\n\n<script>\n// 选中标签\nfunction $(rule) {\n    return document.querySelectorAll(rule);\n}\n\n// 删除选中标签的class\nfunction omit(items) {\n    return Array.from(items, (item) => {\n        item.className = \"\";\n    });\n}\n\n// 选中标签的class增加active\nfunction active(items, index) {\n    items[index].className = \"active\";\n}\n\n// 播放器实例\nlet player = null;\n\n// 获取视频URL并更新视频源\nfunction geturl() {\n    let zyurl = $(\".jishu button.active\")[0].value;\n    let img = $('img')[0];\n    let fm = $(\".jishu button.active\")[0].dataset.fm;\n\n    // 更新视频封面\n    $(\".video-container\")[0].style.background = `#000 url('${fm}') no-repeat center center / cover`;\n\n    // 设置不同分辨率的视频源\n    let sources = JSON.parse(zyurl);\n\n    return { sources: sources };\n}\n\n// 初始化播放器\nfunction initializePlayer(sources) {\n    const video = $('video')[0];\n    const qualityOptions = sources.map(source => parseInt(source.size));\n\n    // 立即重新初始化 Plyr 实例\n    player = new Plyr(video, {\n        controls: [\n            'play-large',   // 大播放按钮\n            'rewind',       // 倒退\n            'play',         // 播放\n            'fast-forward', // 快进\n            'progress',     // 进度条\n            'current-time', // 当前时间\n            'duration',     // 总时长\n            'mute',         // 静音\n            'volume',       // 音量\n            'captions',     // 字幕\n            'settings',     // 设置\n            'pip',          // 画中画\n            'airplay',      // Airplay\n            'fullscreen'    // 全屏\n        ],\n        settings: ['quality', 'speed'],\n        quality: {\n            default: qualityOptions[0],\n            options: qualityOptions,\n            forced: true,\n            onChange: (newQuality) => {\n                changeVideoQuality(newQuality, sources);\n            }\n        },\n        fullscreen: {\n            enabled: true,\n            fallback: true,\n            iosNative: true,\n            container: null,\n        },\n        speed: {\n            selected: 1, // 设置默认播放倍数\n            options: [0.25, 0.5, 1, 1.5, 2],\n        },\n        i18n: {\n            restart: '重新开始',\n            rewind: '倒退 {seektime} 秒',\n            play: '播放',\n            pause: '暂停',\n            fastForward: '快进 {seektime} 秒',\n            seek: '进度',\n            seekLabel: '{currentTime} / {duration}',\n            played: '播放',\n            buffered: '缓冲',\n            currentTime: '当前时间',\n            duration: '持续时间',\n            volume: '音量',\n            mute: '静音',\n            unmute: '取消静音',\n            enableCaptions: '启用字幕',\n            disableCaptions: '禁用字幕',\n            enterFullscreen: '进入全屏',\n            exitFullscreen: '退出全屏',\n            frameTitle: '播放器',\n            captions: '字幕',\n            settings: '设置',\n            speed: '速度',\n            normal: '正常',\n            quality: '画质',\n            qualityLabel: {\n                0: '自动',\n            },\n            pip: '画中画',\n            loop: '循环',\n            start: '开始',\n            end: '结束',\n            all: '全部',\n            reset: '重置',\n            disabled: '禁用',\n            advertisement: '广告'\n        },\n        keyboard: {\n            focused: true,\n            global: true,\n        },\n        tooltips: {\n            controls: true,\n            seek: true\n        },\n        captions: {\n            active: true,\n            update: true,\n            language: 'auto',\n        },\n    });\n\n    player.on('ready', () => {\n        video.style.visibility = 'visible';\n\n        // 添加长按倍速播放功能\n        let longPressTimeout = null;\n        let initialSpeed = 1;\n        let isLongPress = false;\n        const controls = document.querySelector('.plyr__controls');\n        const overlaid = document.querySelector('.plyr__control--overlaid');\n\n        const startLongPress = (e) => {\n            e.stopPropagation();\n            initialSpeed = player.speed;\n            longPressTimeout = setTimeout(() => {\n                setTimeout(() => {\n                    controls.style.display = 'none';\n                    overlaid.style.display = 'none';\n                }, 1000);\n                isLongPress = true;\n                player.speed = 2; // 长按时设置2倍速播放\n            }, 500);\n        };\n\n        const endLongPress = (e) => {\n            e.stopPropagation();\n            clearTimeout(longPressTimeout);\n            if (isLongPress) {\n                player.speed = initialSpeed;\n                isLongPress = false;\n                setTimeout(() => {\n                    controls.style.display = 'flex';\n                    overlaid.style.display = 'flex';\n                }, 2000);\n            }\n        };\n\n        // 监听播放器区域的pointerdown和pointerup事件\n        const playerContainer = document.querySelector('.plyr__video-wrapper');\n\n        playerContainer.addEventListener('pointerdown', startLongPress, true);\n        playerContainer.addEventListener('pointerup', endLongPress, true);\n        playerContainer.addEventListener('pointerleave', endLongPress, true);\n\n        // 处理全屏模式下的特殊情况\n        document.addEventListener('fullscreenchange', () => {\n            if (!document.fullscreenElement) {\n                endLongPress();\n            }\n        });\n    });\n}\n\n// 切换视频质量的函数\nfunction changeVideoQuality(quality, sources) {\n    const video = $('video')[0];\n    const selectedSource = sources.find(source => source.size === quality.toString());\n    const currentTime = video.currentTime;\n    const wasPlaying = !video.paused;\n\n    if (wasPlaying) {\n        $(\".video-container\")[0].style.background = '#000';\n    }\n    $(\"body>p\")[0].innerText = selectedSource.src;\n\n    if (selectedSource) {\n        if (Hls.isSupported() && selectedSource.src.endsWith('.m3u8')) {\n            const hls = new Hls();\n            hls.loadSource(selectedSource.src);\n            hls.attachMedia(video);\n            hls.on(Hls.Events.MANIFEST_PARSED, () => {\n                video.currentTime = currentTime;\n                if (wasPlaying) {\n                    video.play();\n                }\n            });\n        } else {\n            video.pause();\n            video.src = selectedSource.src;\n            video.load();\n            video.currentTime = currentTime;\n            if (wasPlaying) {\n                video.play();\n            }\n        }\n    }\n}\n\n// 点击集数按钮时调用的函数\nfunction jishu(item) {\n    if (player && typeof player.destroy === 'function') {\n        player.destroy();\n        player = null;\n    }\n    omit($('.jishu button.active'));\n    item.className = \"active\";\n    const { sources } = geturl();\n    initializePlayer(sources);\n}\n\n// 页面加载时初始化播放器\n(() => {\n    let n = $(\".jishu\")[0].dataset.n;\n    active($('.jishu button'), n);\n    const { sources } = geturl();\n    initializePlayer(sources);\n})();\n</script>\n</body>\n</html>",
    "ruleDescription": "",
    "ruleImage": "img@data-src",
    "ruleLink": "a.0@href",
    "ruleNextPage": "page",
    "rulePubDate": "⌚️ {{@@.label@text}}    🎥 {{@@.sub-title@html}}\n@js:\nresult.replace(/<p[\\s\\S]*?<\\/svg>|<\\/p>|\\n/gm,'').replace(/<svg[\\s\\S]*?<\\/svg>/m,'  ❤ ').replace(/(\\d)\\s+(\\d)/g,'$1$2')",
    "ruleTitle": ".title@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "@js:\neval(String(source.loginUrl));\nvar exploreUrl = [];\nvar Sort = `{{get('sort',Get('q'))}}`;\nvar Sort1 = `{{get('sort1',Get('r'))}}`;\nfunction explore(e, f, g) {\n    if (g=='收藏') {\n        style = `${e}::@js:\\`${f}\\`\\n`;\n    } else if (g=='主题') {\n        style = `${e}::@js:\\`${f}?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=${Sort}&from={{page}}&_={{new Date().getTime()}}\\`\\n`;\n    } else if (g=='标签') {\n        style = `${e}::@js:\\`${f}?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=${Sort}&from={{page}}&_={{new Date().getTime()}}\\`\\n`;\n    } else {//女优\n        style = `${e}::@js:\\`${f}?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=${Sort}&from={{page}}&_={{new Date().getTime()}}\\`\\n`;\n    }\n    return style;\n}\n\nsc = Map('收藏：');\nscs = sc !== '' ? sc.split(\",\") : [];\nif (scs.length > 0) {\n    scs.forEach((sc) => {\n        let scHref = `{{Get('url')}}/search/${sc}/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=${sc}&sort_by=${Sort1}&from={{page}}&_={{new Date().getTime()}}`;\n        exploreUrl.push(explore(sc, scHref, '收藏'));\n    });\n}\n\nhtml = java.ajax(Get('url')+'/categories/');\nif(String(html).includes('no-js')){\n    cookie.removeCookie(Get('url'));\n    java.startBrowserAwait(Get('url'),'验证');\n}\n\nJ = org.jsoup.Jsoup.parse(html);\n\nif (Get('o') == 0) {\n    java.toast(\"正在获取主题标签数据，请稍后！\")\n    categories = J.select('.pb-e-lg-40 a');\n    for (i in categories) {\n        exploreUrl.push(explore(categories[i].select('h4').text()+'('+String(categories[i].select('span').text()).replace(/(\\d+).*$/, '$1')+')', `{{Get('url')}}${String(categories[i].attr('href')).replace(/.*\\/\\/[a-z0-9.-]+/, '')}`, '主题'));\n    }\n    tags = J.select('.gutter-20.pb-3 a');\n    for (i in tags) {\n        exploreUrl.push(explore(tags[i].text(), `{{Get('url')}}${String(tags[i].attr('href')).replace(/.*\\/\\/[a-z0-9.-]+/, '')}`, '标签'));\n    }\n}\n\nnsort = ['avg_videos_popularity','title','last_content_date','total_videos'];\nif (Get('o') == 1) {\n    java.toast(\"正在获取女优数据，请耐心等待！\");\n    Fpage = /-/.test(Map('页数：')) ? Map('页数：').match(/(\\d+)/g)[0] : '1';\n    Lpage = /-/.test(Map('页数：')) ? Map('页数：').match(/(\\d+)/g)[1] : (/\\d+/.test(Map('页数：')) ? Map('页数：') : '5');\n    var murl = [];\n    for (let i = Fpage; i <= Lpage; i++) {\n        murl.push(Get('url')+'/models/?mode=async&function=get_block&block_id=list_models_models_list&sort_by='+nsort[Get('p')]+'&from='+i+'&_='+(new Date().getTime())); \n    }\n    htmls = java.ajaxAll(murl);\n    for (let i = 0; i < htmls.length; i++) {\n        let models = org.jsoup.Jsoup.parse(htmls[i].body()).select('.horizontal-img-box');\n        models.forEach((model) => {\n            let modelName = model.select('.title').text();\n            let modelSpanText = model.select('span').text();\n            let modelVideosCount = String(modelSpanText).replace(/(\\d+).*$/, '$1');\n            let modelHref = `{{Get('url')}}${String(model.select('a').attr('href')).replace(/.*\\/\\/[a-z0-9.-]+/, '')}`;\n            exploreUrl.push(explore(`${modelName}(${modelVideosCount})`, modelHref, '女优'));\n        });\n    }\n}\n\n`变量搜索::@js:\\`{{Get('url')}}/search/{{v=source.getVariable();if(/^\\s*$/.test(v)||v==null)source.setVariable('秘密');source.getVariable()}}/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=${source.getVariable()}&sort_by=${Sort1}&from={{page}}&_={{new Date().getTime()}}\\`\\n\n${exploreUrl.join('\\n')}`",
    "sourceComment": "修改：1、优化页面样式；by：xiaohan231-2024/08/25\n\n修改：1、优化长按倍速播放功能；by：xiaohan231-2024/08/24\n\n修改：1、优化播放器样式；2、选择播放倍速后，点击屏幕不再恢复成正常；3、添加长按2倍速播放功能，想要设置成其他的可以在内容规则根据注释修改；by：xiaohan231-2024/08/21\n\n修改：1、调用Plyr插件搭建网页播放器；2、设置播放器默认比例为16/9，以防止加载时播放器高度变动；3、优化播放器样式；by：xiaohan231-2024/08/20\n\n修改：1、增加收藏关键词；2、视频不再采用第三方解析，改为调用原生播放器；3、添加视频封面；by：xiaohan231-2024/08/18\n\n修改：1、优化女优信息获取；2、优化内容规则；by：xiaohan231-2024/08/17\n\n修改：1、增加源站更新切换；2、优化分类获取；3、更换视频解析接口；by：xiaohan231-2024/08/16\n\nby：xiaohan231-2024/08/15",
    "sourceGroup": "vpn",
    "sourceIcon": "https://android-artworks.25pp.com/fs08/2016/06/08/0/1_64c34da744af4616fdd2f88ca37f4314_con_130x130.png",
    "sourceName": "Jable.tv",
    "sourceUrl": "https://jable.tv/#xh",
    "style": "",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 1254,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.video-img-box",
    "ruleContent": "class.pb-e-lg-30@script.-1@all\n<js>\nresult=result.match(/http.*m3u8/)[0]</js>\n<video src=\"{{result}}\" width=\"100%\" height=\"auto\" controls></video>",
    "ruleDescription": "",
    "ruleImage": "img@data-src",
    "ruleLink": "a.0@href",
    "ruleNextPage": "page",
    "ruleTitle": "class.title@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "搜索🕵️::https://jable.tv/search/{{source.getVariable()}}/\n\n婚纱::https://jable.tv/tags/wedding-dress/\n热门::https://jable.tv/hot/\n肉丝::https://jable.tv/tags/flesh-toned-pantyhose/\n黑丝::https://jable.tv/tags/black-pantyhose/\n调教::https://jable.tv/categories/bdsm/\n凌辱::https://jable.tv/categories/rape/\n制服::https://jable.tv/categories/uniform/\n纹身::https://jable.tv/tags/tattoo/\n白虎::https://jable.tv/tags/hairless-pussy/\n萝莉::https://jable.tv/tags/loli/\n群交::https://jable.tv/categories/groupsex/\n女同::https://jable.tv/categories/lesbian/\n美腿::https://jable.tv/categories/pantyhose/\n偷拍::https://jable.tv/categories/hidden-cam/\n无码::https://jable.tv/categories/uncensored/\n视角::https://jable.tv/categories/pov/\n最新::https://jable.tv/latest-updates/",
    "sourceGroup": "legado",
    "sourceIcon": "https://i.postimg.cc/wxQpYXF9/1660809059840.png",
    "sourceName": "©Jable视频",
    "sourceUrl": "https://jable.tv/",
    "style": "",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": 1285,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": false,
    "lastUpdateTime": 1775589784432,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": ".aspect-ratio",
    "ruleContent": "class.max-width-md margin-x-auto margin-bottom-lg@all",
    "ruleImage": "img@data-src",
    "ruleLink": "a@href",
    "rulePubDate": ".card-video__duration@text",
    "ruleTitle": "img@alt",
    "showWebLog": false,
    "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": "legado",
    "sourceIcon": "https://ppp.porn/favicon.ico",
    "sourceName": "P站",
    "sourceUrl": "https://ppp.porn/",
    "style": "video{width:100%}img{width:100%}",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 1413,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": ".bloglist@ul@tr",
    "ruleContent": ".contentbox@all##上一篇(.|\\n)*",
    "ruleImage": "@js:\"https://i.postimg.cc/SsyT3xzC/1683726499157.png\"",
    "ruleLink": "li.0@a@href",
    "ruleNextPage": "text.下一页@href",
    "rulePubDate": "li.0@span@text",
    "ruleTitle": "li.0@a@title",
    "showWebLog": false,
    "singleUrl": false,
    "sourceComment": "双数据\n自行将 标题  时间  链接\n0  改为  1\n就是另一个数据啦",
    "sourceGroup": "vpn",
    "sourceIcon": "https://i.postimg.cc/W4phMYsP/1659057345748.png",
    "sourceName": "📖色文",
    "sourceUrl": "https://233335.xyz/e/action/ListInfo/?classid=1",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "coverDecodeJs": "/\\/(new|xiao|upload)\\//.test(src)?java.createSymmetricCrypto(\"AES/CBC/Pkcs7Padding\", \"f5d965df75336270\",\"97b60394abc2fbe1\").decrypt(result):result",
    "customOrder": 1602,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "header": "{\n\t\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\",\"referer\": \"{{baseUrl}}\"\n\t}",
    "lastUpdateTime": 1775591767759,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.video-item",
    "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:\nurl=String(result).match(/.*loadImg\\(this,'(.*)'.*/)[1];\nresult=url",
    "ruleLink": "a@href",
    "ruleNextPage": "page",
    "rulePubDate": "class.date-xxx@text",
    "ruleTitle": "class.title@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "首页::/page/{{page}}/\n最新黑料::/hlcg/page/{{page}}/\n今日热瓜::/jrrs/page/{{page}}/\n热门黑料::/jqrm/page/{{page}}/\n经典黑料::/lsdg/page/{{page}}/\n日榜黑料::/mrrb/page/{{page}}/\n周榜黑料::/zbjx/page/{{page}}/\n月榜黑料::/ybrg/page/{{page}}/\n原创社区::/ycsq/page/{{page}}/\n反差专区::/fczq/page/{{page}}/\n校园黑料::/xycg/page/{{page}}/\n网红黑料::/whhl/page/{{page}}/\n影视短剧::/ysdj/page/{{page}}/\n每日大赛::/mrds/page/{{page}}/\n明星丑闻::/mxcw/page/{{page}}/\n深夜综艺::/syzy/page/{{page}}/\n推特社区::/ttsq/page/{{page}}/\n独家曝料::/djbl/page/{{page}}/\n桃图杂志::/ttzz/page/{{page}}/\n黑料课堂::/hlkt/page/{{page}}/\n有求必应::/yqby/page/{{page}}/\n黑料爆改::/hlbg/page/{{page}}/\n官场曝料::/gchl/page/{{page}}/\n全球奇闻::/qqqw/page/{{page}}/\n抖音::/tag/2/{{page}}.html\n快手::/tag/3/{{page}}.html\n推特::/tag/7/{{page}}.html\n模特::/tag/36/{{page}}.html\n学生::/tag/10/{{page}}.html\n御姐::/tag/40/{{page}}.html\n少妇::/tag/405/{{page}}.html\n人妻::/tag/22/{{page}}.html\n自拍::/tag/332/{{page}}.html\n偷拍::/tag/27/{{page}}.html\n自慰::/tag/313/{{page}}.html\n后入::/tag/922/{{page}}.html\n母狗::/tag/140/{{page}}.html\n露脸::/tag/781/{{page}}.html\n露出::/tag/17/{{page}}.html\n直播::/tag/28/{{page}}.html\n约炮::/tag/163/{{page}}.html\n出轨::/tag/505/{{page}}.html\n偷情::/tag/18/{{page}}.html\n制服::/tag/50/{{page}}.html\n肥臀::/tag/35/{{page}}.html\n巨乳::/tag/34/{{page}}.html\n高颜值::/tag/275/{{page}}.html",
    "sourceComment": "感谢社区大佬的解密\n源社区：@Mengteen \n二传二创或者是其它问题请联系我。\n我邮箱:[xxxmgqxxx@vip.qq.com]\n我QQ:99737563(备注来意)\n2025.7.6 修复分类以及更新\n地址发布页：https://hlbg3.com/\n黑料最新入口\nhttps://hlbg8.com\n牢记永久域名\nhttps://www.heiliao88.com/\nhttps://155.fun或https://18hlw.com",
    "sourceGroup": "legado",
    "sourceIcon": "https://img4.tuwandata.com/v2/thumb/jpg/NWFkMywxMTI1LDAsOSwzLDEsLTEsTk9ORSwsLDkw/u/res.tuwan.com/zipgoods/20190508/3b6408c569f8eb687a8dd6eb3578bdb9.jpg",
    "sourceName": "🎞黑料网",
    "sourceUrl": "https://qbfeh.rcrfesyj.cc/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 1605,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775590466136,
    "loadWithBaseUrl": true,
    "preload": false,
    "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@href",
    "ruleNextPage": "page",
    "rulePubDate": "span.1@text",
    "ruleTitle": "class.post-card-title@text",
    "showWebLog": false,
    "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://51cgg32.com",
    "sourceGroup": "legado",
    "sourceIcon": "http://p6.itc.cn/images01/20201202/8d012ed623d647a78635557e7d235ab6.jpeg",
    "sourceName": "51吃瓜🥝",
    "sourceUrl": "https://car.fuuanuxl.cc/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 1607,
    "enableJs": true,
    "enabled": false,
    "enabledCookieJar": true,
    "lastUpdateTime": 1775590497300,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "article",
    "ruleContent": "class.dplayer@all<js>\nresult=result.match(/http.*m3u8/)[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": "page",
    "rulePubDate": "class.post-card-info@text",
    "ruleTitle": "h2@text##热榜.*",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "学生::/search/学生/{{page}}/\n全部①::/<,page/{{page}}/>\n全部②::/page/3/\n全部③::/page/5/\n搜索::/search/{{source.getVariable()}}/{{page}}/\n偷情::/search/偷情/{{page}}/\n白虎::/search/白虎/{{page}}/\n反差::/search/反差/{{page}}/\n极品::/search/极品/{{page}}/\n萝莉::/search/萝莉/{{page}}/\n00后::/search/00后/{{page}}/\n女同::/search/女同/{{page}}/\n双马尾::/search/双马尾/{{page}}/\n学院::/search/学院/{{page}}/\n高三::/search/高三/{{page}}/\n高中::/search/高中/{{page}}/\n少女::/search/少女/{{page}}/\n情趣::/search/情趣/{{page}}/\n自拍::/search/自拍/{{page}}/\n大学::/search/大学/{{page}}/\n大一::/search/大一/{{page}}/\n学妹::/search/学妹/{{page}}/\n校花::/search/校花/{{page}}/\n调教::/search/调教/{{page}}/\n女神::/search/女神/{{page}}/\n少妇::/search/少妇/{{page}}/\n巨乳::/search/巨乳/{{page}}/\n孕妇::/search/孕妇/{{page}}/\n口::/search/口交/{{page}}/\n精::/search/精/{{page}}/",
    "sourceComment": "//多个视频不会写\n发:https://heiliao.su",
    "sourceGroup": "legado",
    "sourceIcon": "http://p6.itc.cn/images01/20201202/8d012ed623d647a78635557e7d235ab6.jpeg",
    "sourceName": "黑料不打洋🥝",
    "sourceUrl": "https://heiliao1076.pro/",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 4637,
    "enableJs": true,
    "enabled": false,
    "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,
    "preload": false,
    "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",
    "showWebLog": false,
    "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",
    "sourceComment": "",
    "sourceGroup": "vpn",
    "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        }",
    "type": 0
  }
]