[
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": -10106397,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "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/1.html\n国产视频::/jiejie/index.php/vod/type/id/88.html\n国产传媒::/jiejie/index.php/vod/type/id/89.html\n国产主播::/jiejie/index.php/vod/type/id/90.html\n网曝黑料::/jiejie/index.php/vod/type/id/92.html\n网红头条::/jiejie/index.php/vod/type/id/94.html\n国产精品::/jiejie/index.php/vod/type/id/95.html\n绿帽淫妻::/jiejie/index.php/vod/type/id/96.html\n国产探花::/jiejie/index.php/vod/type/id/97.html\n国产乱伦::/jiejie/index.php/vod/type/id/98.html\n麻豆传媒::/jiejie/index.php/vod/type/id/102.html\n其他片商::/jiejie/index.php/vod/type/id/115.html\n网曝门事件::/jiejie/index.php/vod/type/id/116.html\n精品推荐::/jiejie/index.php/vod/type/id/118.html\n国产色情::/jiejie/index.php/vod/type/id/119.html\n主播直播::/jiejie/index.php/vod/type/id/120.html\n伦理三级::/jiejie/index.php/vod/type/id/121.html\n自拍偷拍::/jiejie/index.php/vod/type/id/122.html\n素人自拍::/jiejie/index.php/vod/type/id/123.html\n唯美港姐::/jiejie/index.php/vod/type/id/124.html\n剧情介绍::/jiejie/index.php/vod/type/id/125.html\n91探花::/jiejie/index.php/vod/type/id/126.html\n网红流出::/jiejie/index.php/vod/type/id/127.html\n野外露出::/jiejie/index.php/vod/type/id/128.html\n古装扮演::/jiejie/index.php/vod/type/id/129.html\n可爱学生::/jiejie/index.php/vod/type/id/130.html\n风情旗袍::/jiejie/index.php/vod/type/id/131.html\n瑜伽裤::/jiejie/index.php/vod/type/id/132.html\n网曝门::/jiejie/index.php/vod/type/id/133.html\n中文字幕::/jiejie/index.php/vod/type/id/145.html\n日本有码::/jiejie/index.php/vod/type/id/146.html\n欧美无码::/jiejie/index.php/vod/type/id/147.html\n强奸乱伦::/jiejie/index.php/vod/type/id/148.html\n制服诱惑::/jiejie/index.php/vod/type/id/149.html\n激情动漫::/jiejie/index.php/vod/type/id/150.html\n女优明星::/jiejie/index.php/vod/type/id/152.html\n日本无码::/jiejie/index.php/vod/type/id/155.html\n中文字幕::/jiejie/index.php/vod/type/id/156.html\n日本有码::/jiejie/index.php/vod/type/id/157.html\n高清无码::/jiejie/index.php/vod/type/id/158.html\nSWAG::/jiejie/index.php/vod/type/id/163.html\n日本乱伦::/jiejie/index.php/vod/type/id/164.html\n亚洲无码::/jiejie/index.php/vod/type/id/165.html\n亚洲有码::/jiejie/index.php/vod/type/id/166.html\n中文字幕::/jiejie/index.php/vod/type/id/167.html\n人妻熟女::/jiejie/index.php/vod/type/id/168.html\n强奸乱伦::/jiejie/index.php/vod/type/id/169.html\n欧美精品::/jiejie/index.php/vod/type/id/170.html\n成人动漫::/jiejie/index.php/vod/type/id/171.html\n日本精品::/jiejie/index.php/vod/type/id/172.html\ncosplay::/jiejie/index.php/vod/type/id/173.html\n台湾辣妹::/jiejie/index.php/vod/type/id/174.html\n韩国御姐::/jiejie/index.php/vod/type/id/175.html\n东南亚::/jiejie/index.php/vod/type/id/176.html\n女优系列::/jiejie/index.php/vod/type/id/177.html\n兽耳系列::/jiejie/index.php/vod/type/id/178.html\n闷骚护士::/jiejie/index.php/vod/type/id/179.html\n制服丝袜::/jiejie/index.php/vod/type/id/181.html\n国产视频::/jiejie/index.php/vod/type/id/238.html\n国产主播::/jiejie/index.php/vod/type/id/239.html\n91大神::/jiejie/index.php/vod/type/id/240.html\n热门事件::/jiejie/index.php/vod/type/id/241.html\n传媒自拍::/jiejie/index.php/vod/type/id/242.html\n日本有码::/jiejie/index.php/vod/type/id/243.html\n日本无码::/jiejie/index.php/vod/type/id/244.html\n日韩主播::/jiejie/index.php/vod/type/id/245.html\n动漫肉番::/jiejie/index.php/vod/type/id/246.html\n百合::/jiejie/index.php/vod/type/id/247.html\n无码专区::/jiejie/index.php/vod/show/id/249.html\n麻豆传媒::/jiejie/index.php/vod/type/id/250.html\n制服诱惑::/jiejie/index.php/vod/show/id/251.html\n三级伦理::/jiejie/index.php/vod/type/id/252.html\n中文字幕::/jiejie/index.php/vod/show/id/254.html\n卡通动漫::/jiejie/index.php/vod/type/id/255.html\n欧美系列::/jiejie/index.php/vod/type/id/256.html\n美女主播::/jiejie/index.php/vod/type/id/257.html\n国产自拍::/jiejie/index.php/vod/type/id/258.html\n熟女人妻::/jiejie/index.php/vod/show/id/259.html\n萝莉少女::/jiejie/index.php/vod/show/id/260.html\n百合剧情::/jiejie/index.php/vod/type/id/261.html\n美乳巨乳::/jiejie/index.php/vod/show/id/262.html\n强奸乱伦::/jiejie/index.php/vod/show/id/263.html\n抖音视频::/jiejie/index.php/vod/type/id/264.html\n网红头条::/jiejie/index.php/vod/type/id/266.html\n网曝黑料::/jiejie/index.php/vod/type/id/267.html\n欧美无码::/jiejie/index.php/vod/type/id/268.html\n女优明星::/jiejie/index.php/vod/type/id/269.html\nAV解说::/jiejie/index.php/vod/type/id/270.html\n国产精品::/jiejie/index.php/vod/type/id/272.html\n国产探花::/jiejie/index.php/vod/type/id/273.html\n国产乱伦::/jiejie/index.php/vod/type/id/274.html\n美女主播::/jiejie/index.php/vod/type/id/275.html\n网红精选::/jiejie/index.php/vod/type/id/276.html\n国产传媒::/jiejie/index.php/vod/type/id/280.html\nSM调教::/jiejie/index.php/vod/type/id/281.html\n绿帽淫妻::/jiejie/index.php/vod/type/id/282.html\n制服诱惑::/jiejie/index.php/vod/type/id/283.html\n日本无码::/jiejie/index.php/vod/type/id/284.html\n日本有码::/jiejie/index.php/vod/type/id/285.html\n中文字幕::/jiejie/index.php/vod/type/id/286.html\n欧美专区::/jiejie/index.php/vod/type/id/287.html\n动漫肉番::/jiejie/index.php/vod/type/id/289.html\n日韩专区::/jiejie/index.php/vod/type/id/290.html\n网曝门事件::/jiejie/index.php/vod/type/id/291.html\nAV解说::/jiejie/index.php/vod/type/id/292.html\n偷拍自拍::/jiejie/index.php/vod/type/id/294.html\n国产大制作::/jiejie/index.php/vod/type/id/295.html\n乱伦系列::/jiejie/index.php/vod/type/id/296.html\n学生妹系列::/jiejie/index.php/vod/type/id/297.html\n女网红::/jiejie/index.php/vod/type/id/298.html\n网曝黑料::/jiejie/index.php/vod/type/id/299.html\n高清有码::/jiejie/index.php/vod/type/id/300.html\n高清无码::/jiejie/index.php/vod/type/id/301.html\n中文字幕::/jiejie/index.php/vod/type/id/302.html\n欧美精品::/jiejie/index.php/vod/type/id/303.html\n动漫精选::/jiejie/index.php/vod/type/id/304.html\n强奸乱伦::/jiejie/index.php/vod/type/id/305.html\n中文字幕::/jiejie/index.php/vod/type/id/306.html\n制服诱惑::/jiejie/index.php/vod/type/id/307.html\n熟女人妻::/jiejie/index.php/vod/type/id/308.html",
    "sourceComment": "jiejiesp.xyz",
    "sourceGroup": "R-18可用免翻",
    "sourceIcon": "https://8wx27o6v.91gaoqing.rest/upload/vod/20250428-1/cfc014ec16937c7f415afd712b482842.gif",
    "sourceName": "姐姐视频",
    "sourceUrl": "https://wap.jiejiesp27.xyz/",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": -10103523,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\n \"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; HarmonyOS; OCE-AN50; HMSCore 6.15.0.302) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/16.0.3.302 Mobile Safari/537.36\",\n \"Cookie\":\"accessAgeDisclaimerPH=1; x-index-auth=authed\",\n \"Accept-Encoding\":\"\"\n}",
    "lastUpdateTime": 1778198793380,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "class.thumbnail group",
    "ruleContent": "<js>\nfunction $(rule) {\n    return java.getElements(rule);\n}\n\n// 1. 匹配 eval 加密段\nvar pageSource = String(result);\nvar evalMatch = pageSource.match(/eval\\(function\\(p,a,c,k,e,d\\).*\\)\\)/);\nif (!evalMatch) {\n    result = \"<p>错误：未找到完整的视频源加密段</p>\";\n} else {\n    eval(evalMatch[0]);\n\n    // ========== 代理替换 ==========\n    source = source.replace(/https:\\/\\/(([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,})\\//, 'https://www.thisav.sbs/jmpres/$1/');\n    if (typeof source842 !== 'undefined') {\n        source842 = source842.replace(/https:\\/\\/(([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,})\\//, 'https://www.thisav.sbs/jmpres/$1/');\n    }\n    if (typeof source1280 !== 'undefined') {\n        source1280 = source1280.replace(/https:\\/\\/(([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,})\\//, 'https://www.thisav.sbs/jmpres/$1/');\n    }\n\n    if (typeof source !== 'undefined') {\n        var qualityMap = {};\n\n        // 2. 主 m3u8 子画质\n        try {\n            var v_res = java.ajax(source);\n            var data = String(v_res).match(/.*video\\.m3u8/g);\n            if (data != null && data.length > 0) {\n                for (var i = 0; i < data.length; i++) {\n                    var link = source.replace('playlist.m3u8', data[i]);\n                    var name = \"\";\n                    if (String(data[i]).match(/x/)) {\n                        name = String(data[i]).match(/(\\d+)\\//)[1] + \"p\";\n                    } else {\n                        name = String(data[i]).match(/(.*)\\//)[1];\n                    }\n                    if (!qualityMap[name]) qualityMap[name] = link;\n                }\n            }\n        } catch(e) {}\n\n        // 3. 备用源 720p/1080p\n        if (typeof source842 !== 'undefined' && source842) {\n            if (!qualityMap['720p']) qualityMap['720p'] = source842;\n        }\n        if (typeof source1280 !== 'undefined' && source1280) {\n            if (!qualityMap['1080p']) qualityMap['1080p'] = source1280;\n        }\n\n        // 4. 自动源\n        qualityMap['自动'] = source;\n\n        // 5. 生成画质列表（自动放最后）\n        var url_list = '';\n        for (var k in qualityMap) {\n            if (k === '自动') continue;\n            url_list += '<li><a link=\"' + qualityMap[k] + '\">' + k + '</a></li>\\n';\n        }\n        url_list += '<li><a link=\"' + qualityMap['自动'] + '\">自动</a></li>\\n';\n        var v_list = '<ul class=\"play_list\">' + url_list + '</ul>';\n\n        // 6. 简介\n        var desc = $('.space-y-2 .text-secondary.1').text();\n        desc = String(desc).replace(/番号:|番號:|發行日期:|发行日期:/, '');\n        var sort = '&nbsp;';\n        var intro = '中文:' + java.get('title') + '<br>';\n        var infoEls = $('.space-y-2 .text-secondary');\n        for (var j = 1; j < infoEls.length - 1; j++) {\n            intro += infoEls[j].text() + '<br>';\n        }\n        intro = java.t2s(intro);\n\n        // 7. 构建 HTML（保留原界面样式）\n        var title = java.get('title');\n        var pic = java.get('pic');\n        var tab_name = '<li>画质</li>\\n';\n\n        result = '<!DOCTYPE html>\\n<html>\\n<head>\\n';\n        result += '<meta charset=\"utf-8\">\\n';\n        result += '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\">\\n';\n        result += '<title>' + title + '</title>\\n';\n        result += '<style>\\n';\n        result += 'body{margin:0;background:#000;color:#fff;font-family:sans-serif;}\\n';\n        result += '.MacPlayer{position:relative;width:100%;background:#000;}\\n';\n        result += '.MacPlayer video{width:100%;display:block;}\\n';\n        result += '.card{margin:8px;background:#1a1a1a;border-radius:8px;padding:12px;}\\n';\n        result += '.v_title{font-size:16px;margin:0 0 8px 0;}\\n';\n        result += '.v_desc{font-size:13px;color:#aaa;}\\n';\n        result += '.open_content{color:#fe628e;cursor:pointer;}\\n';\n        result += '.v_content{margin-top:8px;}\\n';\n        result += '.cover img{width:100%;border-radius:4px;}\\n';\n        result += '.intro{font-size:13px;color:#ddd;}\\n';\n        result += '.tab_control{list-style:none;padding:0;display:flex;gap:8px;}\\n';\n        result += '.tab_control li{padding:4px 12px;background:#333;border-radius:4px;cursor:pointer;}\\n';\n        result += '.tab_control li.current{background:#fe628e;}\\n';\n        result += '.play_list{list-style:none;padding:0;display:flex;flex-wrap:wrap;gap:8px;}\\n';\n        result += '.play_list li{padding:6px 12px;background:#333;border-radius:4px;cursor:pointer;}\\n';\n        result += '.play_list li.current{background:#fe628e;}\\n';\n        result += '.play_list_sort{cursor:pointer;color:#fe628e;margin-bottom:8px;}\\n';\n        result += '</style>\\n';\n        result += '<script src=\"https://code.jquery.com/jquery-3.0.0.min.js\"><\\/script>\\n';\n        result += '<script src=\"https://cdnjs.thisav.sbs/ajax/libs/hls.js/1.4.3/hls.min.js\"><\\/script>\\n';\n        result += '</head>\\n<body>\\n';\n\n        // 播放器区域\n        result += '<div class=\"MacPlayer\" id=\"MacPlayer\">\\n';\n        result += '  <video id=\"videoPlayer\" controls playsinline></video>\\n';\n        result += '</div>\\n';\n\n        // 简介卡片\n        result += '<div class=\"card v_info\">\\n';\n        result += '  <h2 class=\"v_title\">' + title + '</h2>\\n';\n        result += '  <p class=\"v_desc\">\\n';\n        result += '    <span class=\"desc\">' + desc + '</span>\\n';\n        result += '    <span>' + sort + '</span>\\n';\n        result += '    <span class=\"open_content\" id=\"open_content\">简介</span>\\n';\n        result += '  </p>\\n';\n        result += '  <div class=\"v_content\" id=\"v_content\" style=\"display:none;\">\\n';\n        result += '    <div class=\"cover\"><img src=\"' + pic + '\"></div>\\n';\n        result += '    <div class=\"content\" id=\"intro_content\">\\n';\n        result += '      <div id=\"intro\"><p>' + intro + '</p>\\n';\n        result += '        <div class=\"show_more\" id=\"show_more\" style=\"display:block;\"></div>\\n';\n        result += '      </div>\\n';\n        result += '    </div>\\n';\n        result += '  </div>\\n';\n        result += '</div>\\n';\n\n        // 画质切换卡片\n        result += '<div class=\"card v_list\">\\n';\n        result += '  <ul class=\"tab_control play_from\">' + tab_name + '</ul>\\n';\n        result += '  <div style=\"height:34px;\"></div>\\n';\n        result += '  <div class=\"tab_content\" id=\"play_list\">\\n';\n        result += '    <div class=\"play_list_sort\" id=\"play_list_sort\">⇅ 正序/倒序</div>\\n';\n        result += '    ' + v_list + '\\n';\n        result += '  </div>\\n';\n        result += '</div>\\n';\n\n        // 核心播放控制器 JS\n        result += '<script>\\n';\n        result += 'var video = document.getElementById(\"videoPlayer\");\\n';\n        result += 'var hls = null;\\n';\n        result += 'function loadSource(url) {\\n';\n        result += '  if(hls){ hls.stopLoad(); hls.detachMedia(); hls.destroy(); }\\n';\n        result += '  if(Hls.isSupported()) {\\n';\n        result += '    hls = new Hls({ autoStartLoad: true });\\n';\n        result += '    hls.loadSource(url);\\n';\n        result += '    hls.attachMedia(video);\\n';\n        result += '    hls.on(Hls.Events.MANIFEST_PARSED, function() { video.play(); });\\n';\n        result += '  } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\\n';\n        result += '    video.src = url;\\n';\n        result += '    video.addEventListener(\"loadedmetadata\", function() { video.play(); });\\n';\n        result += '  }\\n';\n        result += '}\\n';\n\n        // 初始化：加载自动源\n        result += 'loadSource(\"' + qualityMap['自动'] + '\");\\n';\n\n        // 画质点击事件\n        result += '$(\".play_list li\").click(function(){\\n';\n        result += '  var $this = $(this);\\n';\n        result += '  $(\".play_list li\").removeClass(\"current\");\\n';\n        result += '  $this.addClass(\"current\");\\n';\n        result += '  var url = $this.children(\"a\").attr(\"link\");\\n';\n        result += '  if(url) loadSource(url);\\n';\n        result += '});\\n';\n\n        // 正序/倒序排序\n        result += 'var sortAsc = true;\\n';\n        result += '$(\"#play_list_sort\").click(function(){\\n';\n        result += '  var ul = $(\".play_list\");\\n';\n        result += '  var lis = ul.children(\"li\").get();\\n';\n        result += '  sortAsc = !sortAsc;\\n';\n        result += '  if(sortAsc){ lis.sort(function(a,b){ return 0; }); }\\n';\n        result += '  else{ lis.reverse(); }\\n';\n        result += '  ul.empty().append(lis);\\n';\n        result += '});\\n';\n\n        // 简介展开/收起\n        result += '$(\"#open_content\").click(function(){\\n';\n        result += '  $(\"#v_content\").toggle();\\n';\n        result += '});\\n';\n        result += 'if($(\"#intro\").height() > 101) $(\"#show_more\").show();\\n';\n        result += '$(\"#intro_content\").click(function(){\\n';\n        result += '  $(this).toggleClass(\"auto\");\\n';\n        result += '  $(\"#show_more\").toggle();\\n';\n        result += '  $(\".cover\").toggle();\\n';\n        result += '});\\n';\n\n        // 默认选中第一个画质\n        result += '$(\".play_list li\").first().addClass(\"current\");\\n';\n        result += '<\\/script>\\n';\n        result += '</body>\\n</html>';\n\n    } else {\n        result = \"<p>错误：source 变量未定义</p>\";\n    }\n}\n</js>",
    "ruleImage": "img@data-src\n<js>\njava.put('pic',result)\n</js>",
    "ruleLink": "a[x-text=\"item.full_title\"]@href||a.0@href",
    "ruleNextPage": "page||text.下一页@href",
    "rulePubDate": "<js>\nsort=\"\";\nresult=java.getElements('.text-xs');\nlen=result.length-1\nfor(i=len;i>=0;i--){\n\tt=result[i].text();\n\ti==len?sort+='🕒'+t:sort+='  '+t;\n}\nsort\n</js>",
    "ruleTitle": ".text-secondary@text\n<js>\njava.put('title',result)\n</js>",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "<js>\neval(String(source.sourceComment))\nresult=`\n搜索::${host}/search/{{source.getVariable()}}\n中文字幕::${host}/chinese-subtitle\n中文字幕::${host}/chinese-subtitle?sort=views\n无码流出::${host}/uncensored-leak\n最近更新::${host}/new\n新作上市::${host}/release\n今日热门::${host}/today-hot\n本周热门::${host}/weekly-hot\n本月热门::${host}/monthly-hot\n素人SIRO::${host}/siro\n素人LUXU::${host}/luxu\n素人GANA::${host}/gana\n素人PRESTIGE PREMIUM::${host}/maan\n无码FC2::${host}/fc2\n无码HEYZO::${host}/heyzo\n无码FC2::${host}/fc2\n无码一本道::${host}/1pondo\n无码Caribbeancom::${host}/caribbeancom\n无码Caribbeancompr::${host}/caribbeancompr\n无码10musume::${host}/10musume\n无码pacopacomama::${host}/pacopacomama\n`\n</js>",
    "sourceComment": " host=\"https://www.missav1.icu/dm194/cn\"\n/*\n\thttps://www.missav1.icu/dm194/cn\n*/",
    "sourceGroup": "R-18可用免翻",
    "sourceIcon": "https://img1.baidu.com/it/u=3056428239,816616493&fm=253&fmt=auto&app=138&f=PNG?w=237&h=237",
    "sourceName": "MissAV",
    "sourceUrl": "MissAV",
    "style": "body {\n    margin: 0;\n    background: #000;\n    color: #fff;\n    font-family: sans-serif;\n}\n\n.MacPlayer {\n    position: relative;\n    width: 100%;\n    background: #000;\n}\n\n.MacPlayer video {\n    width: 100%;\n    display: block;\n}\n\n.card {\n    margin: 8px;\n    background: #1a1a1a;\n    border-radius: 8px;\n    padding: 12px;\n}\n\n.v_title {\n    font-size: 16px;\n    margin: 0 0 8px 0;\n}\n\n.v_desc {\n    font-size: 13px;\n    color: #aaa;\n}\n\n.open_content {\n    color: #fe628e;\n    cursor: pointer;\n}\n\n.v_content {\n    margin-top: 8px;\n}\n\n.cover img {\n    width: 100%;\n    border-radius: 4px;\n}\n\n.intro {\n    font-size: 13px;\n    color: #ddd;\n}\n\n.tab_control {\n    list-style: none;\n    padding: 0;\n    display: flex;\n    gap: 8px;\n}\n\n.tab_control li {\n    padding: 4px 12px;\n    background: #333;\n    border-radius: 4px;\n    cursor: pointer;\n}\n\n.tab_control li.current {\n    background: #fe628e;\n}\n\n.play_list {\n    list-style: none;\n    padding: 0;\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n}\n\n.play_list li {\n    padding: 6px 12px;\n    background: #333;\n    border-radius: 4px;\n    cursor: pointer;\n}\n\n.play_list li.current {\n    background: #fe628e;\n}\n\n.play_list_sort {\n    cursor: pointer;\n    color: #fe628e;\n    margin-bottom: 8px;\n}",
    "type": 0
  },
  {
    "articleStyle": 1,
    "cacheFirst": false,
    "customOrder": -10102258,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": false,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11; PCAM10 Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4103.106 Mobile Safari/537.36\"} ",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUrl": "https://czy.yzfnb6.help/cn/home/web/index.php/vod/play/id/1177871/sid/1/nid/1.html",
    "preload": false,
    "ruleArticles": "[class=\"H5__content\"]@[class=\"video__wrap\"]@a",
    "ruleContent": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>内容提取-双模版</title>\n\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    #urls,#messages,#debug-info,#video-url,#video-container,#video-source-select,#images,#text {display:none;}\n</style>\n</head>\n<body>\n    <h3 id=\"title\">{{@@title@text||h1.0@text||h2.0@text||.title.0@text##高清在线观看|-国产剧| - 专享影视| - 热门高清|影视大全|海外华人|高清1080p|无广告影院|\\|}}</h3>\n    <p id=\"description\">{{@@.info.0@html||.jianjie@html}}</p>\n    <p id=\"page\">共<span id=\"total-pages\">1</span>页</p>\n    <p id=\"loading-status\" style=\"display:none;\"></p>\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    <div class=\"flex-container\">\n        <select id=\"url-select\" style=\"display:none;\"></select>\n    </div>\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\">\n        <video id=\"video-element\" controls preload=\"auto\" width=\"640\" height=\"264\">\n            <source id=\"video-source\" src=\"\" type=\"\">\n            您的浏览器不支持 video 标签。\n        </video>\n    </div>\n    <div class=\"flex-container\">\n        <select id=\"video-source-select\" onchange=\"updateVideoSource()\"></select>\n    </div>\n    <div id=\"images\"></div>\n    <div id=\"text\"></div>\n    <script>\nconst config = {    \n    videoSelector: 'body', // 视频选择器\n    imgSelector: '.gridlane-box-inside img', // 图片选择器\n    textSelector: '#content', // 文本选择器\n    debugSelector: '.player-wrapper', // 调试信息选择器\n    swapImageAttributes: false, // 是否交换图片属性\n    delayTime: 1500, // 延迟提取时间\n    retryDelayTime: 1500, // 重试加载延迟时间\n    maxLoadAttempts: 3, // 最大加载次数\n    autoLoading: false, // true自动模式，false单页模式\n    debugOnce: 0, // 只在特定索引输出一次调试信息\n         /* -网页拼接-*/    \n    totalPagesText: '{{@@.pager@li.-3@a@textNodes}}', // 总页码\n    urlSuffixToRemove: /\\.aspx$/, // 移除url后缀\n    pageUrlText: '{urlPrefix}p{i}.aspx', // 拼接URL模板        \n        /* -以上拼接模式（网址需要拼接）-*/\n        /* -上下分割线-*/\n        /* -以下列表模式（地址与目录对应，比如视频、漫画）-*/   \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\nlet videoSources = [];\nlet loadAttempts = {};\nlet urls = [];\nlet imageBox;\nlet textBox;\nlet currentPageIndex = 0;\nlet canLoadNextPage = true;\nlet autoLoadInProgress = false;\n\n// 构建URL列表\nfunction 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}\n\nfunction normalizeUrl(url) {\n    if (typeof url!== 'string' ||!url.trim()) return '';\n    url = url.replace(/\\\\u[\\dA-F]{4}/gi, (match) => String.fromCharCode(parseInt(match.replace(/\\\\u/g, ''), 16)));\n    url = decodeURIComponent(url);\n    url = url.replace(/^http:\\/([^/])/, 'http://$1'); // 修正 http:/ 协议部分\n    url = url.replace(/^https:\\/([^/])/, 'https://$1'); // 修正 https:/ 协议部分\n    return url;\n}\n\n// 清空容器\nfunction clearContainers() {\n    $('#messages').empty();\n    $('#images').empty();\n    $('#text').empty();\n}\n\n// 更新图片的src属性\nfunction 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// 切换导航按钮和选择框的显示\nfunction 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// 显示加载状态\nfunction showLoadingStatus(pageNumber) {\n    const selectedOption = $('#url-select option:selected').text();\n    $('#loading-status').text(`正在加载：${selectedOption}`).show();\n}\n\n// 隐藏加载状态\nfunction hideLoadingStatus() {\n    $('#loading-status').hide();\n}\n\n// 内容提取函数内容\nfunction 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                  // 添加调试标签输出信息\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\n                // 方法1：video标签获取视频地址\n                const videoContents = $(doc).find(config.videoSelector);\n                const videoTags = $(videoContents).find('video');\n                videoTags.each(function () {\n                    const videosrc = $(this).attr('src') || $(this).attr('data-src') || $(this).attr('data-original') || '';\n                    if (videosrc) {\n                        videoSources.push(videosrc);\n                    }\n                });\n                \n                // 方法2：source标签获取视频地址\n                const sources = $(videoContents).find('source');\n                sources.each(function () {\n                    const sourceSrc = $(this).attr('src') || $(this).attr('data-src') || $(this).attr('data-original') || '';\n                    if (sourceSrc) {\n                        videoSources.push(sourceSrc);\n                    }\n                });\n                \n                // 方法3：正则表达式获取视频地址\n                const regex = /['\"]https?[^'<>\"]+\\.(m3u8|mp4|webm|ogg|flv|mp3|m4a|wav|ape|flac)['\"]/ig;\n                const matches = data.match(regex);\n                if (matches) {\n                    const uniqueMatches = matches.filter((value, idx, self) => self.indexOf(value) === idx);\n    videoSources = videoSources.concat(uniqueMatches.map((match) => {\n        // 使用replace删除引号\n                const urlWithoutQuotes = match.replace(/['\"]/g, '');\n                return normalizeUrl(urlWithoutQuotes);\n                          }));\n                }\n\n                videoSources = videoSources.map(src => normalizeUrl(src.replace(/\\\\+/g, '')));\n                videoSources = [...new Set(videoSources)];\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-select').hide();\n                        updateVideoSource(); // 自动更新视频源\n                    } else if (videoSources.length > 1) {\n                        $('#video-container').show();\n                        $('#video-url').show();\n                        $('#video-source-select').show();\n                        updateVideoSource(); // 默认选择第一个视频源\n                    } else {\n                        $('#video-container').hide();\n                        $('#video-url').hide();\n                        $('#video-source-select').hide();\n                    }\n                } else {\n                    $('#messages').append(`<span class=\"warn\">未找到视频源。</span><br>`);\n                    $('#video-container').hide();\n                    $('#video-url').hide();\n                    $('#video-source-select').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').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                \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// 处理加载失败的情况\nfunction 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// 更新视频源\nfunction updateVideoSource() {\n    const selectedIndex = parseInt(document.getElementById('video-source-select').value);\n    const selectedSource = videoSources[selectedIndex];\n    document.getElementById('video-url').textContent = `视频地址:\\n ${selectedSource}`;\n\n    // 设置 video-source 的 src 属性\n    const videoSourceElement = document.getElementById('video-source');\n    videoSourceElement.src = selectedSource;\n\n    // 更新 video 元素的 src 属性\n    const videoElement = document.getElementById('video-element');\n    videoElement.load();\n\n    // 添加调试信息\n    $('#messages').append(`<span>更新视频源为: ${selectedSource}</span><br>`);\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').empty();\n    $('#debug-info textarea').empty();   \n    $('#video-url').empty().hide();\n    $('#video-container').hide();\n    $('#video-source-select').empty().hide();\n    \n    buildUrls(totalPages, baseUrl);\n\n    const urlSelect = document.getElementById('url-select');\n    if (urlSelect.options.length > 0) {\n        urlSelect.value = '0'; \n        \n        if (config.autoLoading) {\n            autoLoadInProgress = true;\n            for (let i = 0; i < urls.length; i++) {\n                loadContent(i);\n            }\n        } else {\n            loadContent(0);\n        }\n    } else {\n        loadContent(0);\n    }\n\n    $('#url-select').change(function () {\n        clearContainers();\n        const selectedIndex = parseInt($(this).val());\n        loadContent(selectedIndex);\n    });\n    $('#prev-page-btn').click(function () {\n        clearContainers();\n        if (currentPageIndex > 0) {\n            loadContent(currentPageIndex - 1);\n        }\n    });\n    $('#next-page-btn').click(function () {\n        clearContainers();\n        if (currentPageIndex < urls.length - 1) {\n            loadContent(currentPageIndex + 1);\n        }\n    });\n    $('#auto-load-btn').click(function () {\n        autoLoadInProgress = true;\n        showLoadingStatus(1); \n        for (let i = currentPageIndex + 1; i < urls.length; i++) {\n            loadContent(i);\n        }\n    });\n    $('#toggle-messages-btn').click(function () { $('#messages').toggle(); });\n    $('#toggle-urls-btn').click(function () { $('#urls').toggle(); });\n    $('#toggle-debug-btn').click(function () { $('#debug-info').toggle(); });\n});\n    </script>\n</body>\n</html>",
    "ruleImage": "img@src",
    "ruleLink": "a@href",
    "ruleNextPage": "page||text.下一页@href",
    "rulePubDate": "p.-1@text\n",
    "ruleTitle": "h3.-1@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "搜索::https://czy.yzfnb6.help/cn/home/web/index.php/vod/search.html?wd={{source.getVariable()}}\n最新上传::/cn/home/web/index.php/label/new/page/{{page}}.html\n月排行::/cn/home/web/index.php/label/hot_month/page/{{page}}.html\n日排行::/cn/home/web/index.php/label/hot_day/page/{{page}}.html\n周排行::/cn/home/web/index.php/label/hot_week/page/{{page}}.html\n熟母少妇::/cn/home/web/index.php/vod/type/id/20/page/{{page}}.html\n网红直播::/cn/home/web/index.php/vod/type/id/21/page/{{page}}.html\n自拍偷拍::/cn/home/web/index.php/vod/type/id/22/page/{{page}}.html\n强奸乱伦::/cn/home/web/index.php/vod/type/id/23/page/{{page}}.html\n高清国产::/cn/home/web/index.php/vod/type/id/24/page/{{page}}.html\n韩国专区::/cn/home/web/index.php/vod/type/id/25/page/{{page}}.html\n日本有码::/cn/home/web/index.php/vod/type/id/26/page/{{page}}.html\n日本无码::/cn/home/web/index.php/vod/type/id/27/page/{{page}}.html\n欧美情色::/cn/home/web/index.php/vod/type/id/28/page/{{page}}.html\n动漫卡通::/cn/home/web/index.php/vod/type/id/29/page/{{page}}.html\n三级伦理::/cn/home/web/index.php/vod/type/id/30/page/{{page}}.html",
    "sourceComment": "By小新\n永久地址：https://bqm.avds8.com/g/\nhttps://rlblsm.yzfnb4.lat/cn/home/web/\nhttps://qrb.yzfnb3.ink/cn/home/web/\nhttps://qrb.yzfnb3.ink/cn/home/web/",
    "sourceGroup": "R-18可用免翻",
    "sourceIcon": "",
    "sourceName": "优质粉嫩鲍",
    "sourceUrl": "https://qrb.yzfnb3.ink",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; TEL-AN00 Build/HONORTEL-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Mobile Safari/537.36\"}",
    "lastUpdateTime": 1778071770227,
    "loadWithBaseUrl": true,
    "loginUrl": "https://shuhuang.xyz/member.php?mod=logging&action=login&mobile=2",
    "preload": false,
    "ruleArticles": "class.wbthreadlist_body",
    "ruleContent": "<p>{{@@class.view_tit@text}}</p>\n<div>{{@@class.message@all}}</div>\n---------\n\t<br>\n<span>没有附件，需登录。如附件名称错误，请自行更改文件名称</span>",
    "ruleLink": "tag.a@href",
    "ruleNextPage": "page",
    "rulePubDate": "tag.p@span.1@text",
    "ruleTitle": "span@text",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "同人最新::/forum.php?mod=forumdisplay&fid=2&page={{page}}\n同人连载::/forum.php?mod=forumdisplay&fid=3&page={{page}}\n同人完结::/forum.php?mod=forumdisplay&fid=4&page={{page}}\n\n常规最新::/forum.php?mod=forumdisplay&fid=7&page={{page}}\n常规连载::/forum.php?mod=forumdisplay&fid=8&page={{page}}\n常规完结::/forum.php?mod=forumdisplay&fid=9&page={{page}}\n",
    "sourceGroup": "源仓库",
    "sourceIcon": "",
    "sourceName": "书荒站",
    "sourceUrl": "https://shuhuang.xyz",
    "type": 0
  },
  {
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; TEL-AN00 Build/HONORTEL-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Mobile Safari/537.36\"}",
    "lastUpdateTime": 1777783596017,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": true,
    "sourceIcon": "",
    "sourceName": "幻境导航",
    "sourceUrl": "https://hjdh.xyz",
    "type": 0
  }
]