{"version":"https://jsonfeed.org/version/1.1","title":"DBD-raws","home_page_url":"https://cms.dbdraws.dpdns.org","feed_url":"https://cms-dbdraws.pages.dev/json/","description":"<style>\n        #api-text-container {\n            font-size: 22px;\n            \n            max-width: 90%;\n            text-align: center;\n            line-height: 1.6;\n            padding: 20px;\n            border-left: 4px solid #4CAF50;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n        }\n@media (max-width: 768px) {\n            #api-text-container {\n                font-size: 18px; /* 移动端减小到18px */\n                max-width: 95%; /* 移动端宽度占比更大（减少留白） */\n                padding: 15px; /* 移动端内边距减小 */\n            }\n    </style>\n<p id=\"api-text-container\"></p>\n<script>\n  // 调用文字API（以「一言」为例，返回随机句子）\n  fetch(\"https://v1.hitokoto.cn/?c=d\") // API地址（返回JSON）\n    .then(response => response.json())\n    .then(data => {\n      // 将API返回的文字填入容器（不添加任何样式，使用网站默认文本样式）\n      document.getElementById(\"api-text-container\").textContent = data.hitokoto;\n    })\n    .catch(error => {\n      // 加载失败时显示提示（同样使用默认样式）\n      document.getElementById(\"api-text-container\").textContent = \"加载失败，请稍后刷新\";\n    });\n</script>\n\n<p>这是一款轻量级的内容管理系统（CMS），可自行托管于Cloudflare平台。通过microfeed，您能够便捷地发布多种形式的内容——包括音频、视频、照片、文档、博客文章及外部链接，并以网页、RSS订阅和JSON格式输出信息流。</p>","icon":"https://cms-dbdraws.pages.dev/assets/default/channel-image.png","favicon":"https://cms-dbdraws.pages.dev/assets/default/favicon.png","authors":[{"name":"DBD制作组"}],"language":"zh-cn","items":[{"id":"H9Ld7FpM6yK","title":"🔍博壳搜索器 (调试版)","url":"https://cms.dbdraws.dpdns.org/i/json-H9Ld7FpM6yK/","content_html":"\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n    body {\n      max-width: 800px;\n      margin: 30px auto;\n      padding: 0 20px;\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto;\n      line-height: 1.6;\n    }\n    /* 搜索框样式 —— 上边距已优化 */\n    .search-box {\n      margin-top: 25px;    /* 更舒服的上边距 */\n      margin-bottom: 25px;\n    }\n    #search-input {\n      width: 100%;\n      padding: 10px 14px;\n      border: 1px solid #eaeaea;\n      border-radius: 6px;\n      font-size: 16px;\n      outline: none;\n    }\n    #search-input:focus {\n      border-color: #999;\n    }\n    /* 文章列表 */\n    .post-list {\n      display: flex;\n      flex-direction: column;\n      gap: 18px;\n    }\n    .post-item {\n      padding: 14px 0;\n      border-bottom: 1px solid #f5f5f5;\n    }\n    .post-item h3 {\n      font-size: 18px;\n      margin-bottom: 6px;\n    }\n    .post-item a {\n      color: #222;\n      text-decoration: none;\n    }\n    .post-item a:hover {\n      text-decoration: underline;\n    }\n    .post-item p {\n      color: #666;\n      font-size: 14px;\n    }\n  </style>\n\n<div class=\"search-box\">\n  <input \n    type=\"text\" \n    id=\"search-input\" \n    placeholder=\"输入关键词实时搜索文章...\"\n    autocomplete=\"off\"\n  >\n</div>\n\n<div class=\"post-list\">\n  <div class=\"post-item\">\n    <h3><a href=\"post-1.html\">轻量博客搭建完全教程</a></h3>\n    <p>纯HTML+CSS+JS实现极简博客，无后端、无数据库、超快加载</p>\n  </div>\n  <div class=\"post-item\">\n    <h3><a href=\"post-2.html\">前端本地搜索实现</a></h3>\n    <p>不用任何库，原生JS实现博客实时搜索，代码不到1KB</p>\n  </div>\n  <div class=\"post-item\">\n    <h3><a href=\"post-3.html\">CSS极简样式优化</a></h3>\n    <p>让博客干净好看的轻量CSS，适配手机和电脑</p>\n  </div>\n  <div class=\"post-item\">\n    <h3><a href=\"post-4.html\">静态博客部署指南</a></h3>\n    <p>Github Pages / Vercel 免费部署静态博客教程</p>\n  </div>\n</div>\n\n<script>\nconst searchInput = document.getElementById('search-input');\nconst postItems = document.querySelectorAll('.post-item');\n\nsearchInput.addEventListener('input', function (e) {\n  const keyword = e.target.value.toLowerCase().trim();\n  postItems.forEach(item => {\n    const text = item.textContent.toLowerCase();\n    item.style.display = text.includes(keyword) ? 'block' : 'none';\n  });\n});\n</script>\n\n","content_text":"轻量博客搭建完全教程\n\n纯HTML+CSS+JS实现极简博客，无后端、无数据库、超快加载\n\n\n前端本地搜索实现\n\n不用任何库，原生JS实现博客实时搜索，代码不到1KB\n\n\nCSS极简样式优化\n\n让博客干净好看的轻量CSS，适配手机和电脑\n\n\n静态博客部署指南\n\nGithub Pages / Vercel 免费部署静态博客教程","date_published":"2026-01-31T14:53:55.189Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/🔍博壳搜索器-调试版-H9Ld7FpM6yK/","json_url":"https://cms-dbdraws.pages.dev/i/H9Ld7FpM6yK/json/","rss_url":"https://cms-dbdraws.pages.dev/i/H9Ld7FpM6yK/rss/","guid":"H9Ld7FpM6yK","status":"published","itunes:episodeType":"full","date_published_short":"Sat Jan 31 2026","date_published_ms":1769871235189}},{"id":"Ak02D0CbhPX","title":"随机小姐姐 - 最新源","url":"https://cms.dbdraws.dpdns.org/i/随机小姐姐-新源-Ak02D0CbhPX/","content_html":"\n    <style>\n        body {\n            font-family: 'Arial', sans-serif;\n            max-width: 1000px;\n            margin: 0 auto;\n            padding: 15px;\n            background-color: #f5f5f5;\n        }\n\n        #player-container {\n            background: #000;\n            border-radius: 8px;\n            margin-bottom: 15px;\n            overflow: hidden;\n            box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n        }\n\n        #player {\n            width: 100%;\n            height: auto;\n            max-height: 80vh;\n            min-height: 500px;\n            max-height: 550px;\n            display: block;\n        }\n\n        .control-panel {\n            background: white;\n            padding: 15px;\n            border-radius: 8px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n            margin-bottom: 15px;\n        }\n\n        .button-group {\n            display: flex;\n            gap: 8px;\n            margin-bottom: 12px;\n            flex-wrap: wrap;\n        }\n\n        button {\n            background: #7F9CCC;\n            color: #fff;\n            border: none;\n            padding: 10px 12px;\n            border-radius: 6px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: all 0.3s;\n            flex-grow: 1;\n            font-size: 14px;\n            min-width: 80px;\n        }\n\n        button:hover {\n            background: #6A8BBC;\n            transform: translateY(-1px);\n        }\n\n        button#toggleAuto {\n            flex-grow: 2;\n        }\n\n        .source-management {\n            margin-top: 15px;\n        }\n\n        .source-list {\n            margin-top: 10px;\n            max-height: 30vh;\n            overflow-y: auto;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            padding: 8px;\n            background: white;\n        }\n\n        .source-item {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            padding: 8px;\n            border-bottom: 1px solid #eee;\n        }\n\n        .source-item:last-child {\n            border-bottom: none;\n        }\n\n        .source-url {\n            flex-grow: 1;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n            margin-right: 8px;\n            font-size: 14px;\n        }\n\n        .source-actions {\n            display: flex;\n            gap: 5px;\n        }\n\n        .source-actions button {\n            padding: 5px 8px;\n            font-size: 12px;\n            background: #ff6b6b;\n            min-width: 50px;\n            flex-grow: 0;\n        }\n\n        .source-actions button:first-child {\n            background: #4CAF50;\n        }\n\n        .add-source-form {\n            display: flex;\n            gap: 8px;\n            margin-top: 12px;\n        }\n\n        .add-source-form input {\n            flex-grow: 1;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 14px;\n        }\n\n        .add-source-form button {\n            width: 90px;\n            flex-grow: 0;\n        }\n\n        .status {\n            margin-top: 10px;\n            font-size: 14px;\n            color: #666;\n            text-align: center;\n        }\n\n        .current-source {\n            font-weight: bold;\n            color: #7F9CCC;\n            word-break: break-all;\n        }\n\n        .default-source-indicator {\n            color: #888;\n            font-style: italic;\n            margin-top: 5px;\n        }\n\n        /* 手机端优化 */\n        @media (max-width: 600px) {\n            body {\n                padding: 10px;\n            }\n\n            #player {\n                min-height: 500px;\n            }\n\n            .control-panel {\n                padding: 12px;\n            }\n\n            button {\n                padding: 8px 10px;\n                font-size: 13px;\n            }\n\n            .source-item {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n\n            .source-actions {\n                margin-top: 5px;\n                width: 100%;\n                justify-content: flex-end;\n            }\n\n            .add-source-form {\n                flex-direction: column;\n            }\n\n            .add-source-form button {\n                width: 100%;\n            }\n        }\n    </style>\n\n\n    <div id=\"player-container\">\n        <video id=\"player\" controls playsinline></video>\n    </div>\n    \n    <div class=\"control-panel\">\n        <div class=\"button-group\">\n            <button id=\"toggleAuto\">连续播放: 开</button>\n            <button id=\"nextVideo\">换一个 ▶</button>\n            <button id=\"switchSource\">切换源</button>\n        </div>\n        \n        <div class=\"status\" id=\"statusArea\">\n            <!-- 状态信息动态生成 -->\n        </div>\n        \n        <div class=\"source-management\">\n            <h3 style=\"margin-bottom: 8px;\">视频源管理</h3>\n            <div class=\"source-list\" id=\"sourceList\">\n                <!-- 视频源列表动态生成 -->\n            </div>\n            \n            <div class=\"add-source-form\">\n                <input type=\"text\" id=\"newSourceInput\" placeholder=\"输入视频API地址\">\n                <button id=\"addSource\">添加源</button>\n            </div>\n        </div>\n    </div>\n\n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            // 隐藏默认源\n            const defaultSources = [\n                'http://api.mmp.cc/api/ksvideo?type=mp4&id=jk',\n                'https://www.ximi.me/video/list.php'\n            ];\n            \n            // 用户添加的源\n            let userSources = JSON.parse(localStorage.getItem('userVideoSources')) || [];\n            \n            // 获取所有源\n            function getAllSources() {\n                return [...userSources, ...defaultSources];\n            }\n            \n            let currentSourceIndex = 0;\n            let autoPlay = localStorage.getItem('autoPlay') !== 'false';\n            const player = document.getElementById('player');\n            let isProcessing = false;\n            \n            // 单源重试控制\n            let currentSourceRetries = 0;\n            const maxRetriesPerSource = 2;\n            \n            // DOM元素\n            const elements = {\n                toggleAuto: document.getElementById('toggleAuto'),\n                nextVideo: document.getElementById('nextVideo'),\n                switchSource: document.getElementById('switchSource'),\n                sourceList: document.getElementById('sourceList'),\n                newSourceInput: document.getElementById('newSourceInput'),\n                addSource: document.getElementById('addSource'),\n                statusArea: document.getElementById('statusArea')\n            };\n            \n            // 重置重试计数\n            function resetSourceRetry() {\n                currentSourceRetries = 0;\n            }\n            \n            // 初始化播放器\n            function initPlayer() {\n                updateAutoPlayButton();\n                updateSourceDisplay();\n                renderSourceList();\n                \n                if (userSources.length > 0) {\n                    currentSourceIndex = 0;\n                } else {\n                    currentSourceIndex = defaultSources.length > 0 ? userSources.length : 0;\n                }\n                \n                resetSourceRetry();\n                loadRandomVideo();\n            }\n            \n            // 更新自动播放按钮\n            function updateAutoPlayButton() {\n                elements.toggleAuto.textContent = `连续播放: ${autoPlay ? '开' : '关'}`;\n            }\n            \n            // 加载随机视频\n            function loadRandomVideo() {\n                if (isProcessing) return;\n                isProcessing = true;\n                \n                const allSources = getAllSources();\n                if (allSources.length === 0) {\n                    showStatus('无可用视频源，请添加视频源', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                if (currentSourceIndex >= allSources.length) {\n                    currentSourceIndex = 0;\n                }\n                \n                const currentSource = allSources[currentSourceIndex];\n                const timestamp = new Date().getTime();\n                const randomParam = Math.random();\n                \n                let videoUrl = currentSource;\n                if (currentSource.includes('?')) {\n                    videoUrl += `&_t=${timestamp}_${randomParam}`;\n                } else {\n                    videoUrl += `?_t=${timestamp}_${randomParam}`;\n                }\n                \n                player.src = videoUrl;\n                updateSourceDisplay();\n                \n                requestAnimationFrame(() => {\n                    player.play().catch(e => {\n                        console.error(`当前源第${currentSourceRetries+1}次播放失败:`, e);\n                        \n                        if (e.name === 'NotAllowedError') {\n                            showStatus('请点击播放按钮开始（浏览器限制自动播放）', true);\n                        } else {\n                            if (currentSourceRetries < maxRetriesPerSource) {\n                                currentSourceRetries++;\n                                showStatus(`当前源重试中(${currentSourceRetries}/${maxRetriesPerSource})...`, true);\n                                setTimeout(() => {\n                                    loadRandomVideo();\n                                }, 1000);\n                                return;\n                            } else {\n                                showStatus(`当前源已重试${maxRetriesPerSource}次失败，切换到下一个源...`, true);\n                                resetSourceRetry();\n                                switchToNextSource();\n                            }\n                        }\n                    }).finally(() => {\n                        isProcessing = false;\n                        if (player.paused === false) {\n                            resetSourceRetry();\n                        }\n                    });\n                });\n            }\n            \n            // 显示状态\n            function showStatus(message, isError = false) {\n                requestAnimationFrame(() => {\n                    elements.statusArea.innerHTML = `<div class=\"status-message\" style=\"color: ${isError ? '#ff4444' : '#666'}\">${message}</div>`;\n                });\n            }\n            \n            // 切换下一个源\n            function switchToNextSource() {\n                if (isProcessing) return;\n                \n                const allSources = getAllSources();\n                if (allSources.length === 0) return;\n                \n                currentSourceIndex = (currentSourceIndex + 1) % allSources.length;\n                resetSourceRetry();\n                loadRandomVideo();\n            }\n            \n            // 更新源显示\n            function updateSourceDisplay() {\n                const allSources = getAllSources();\n                if (allSources.length > 0) {\n                    const currentSource = allSources[currentSourceIndex];\n                    const isDefaultSource = defaultSources.includes(currentSource);\n                    \n                    requestAnimationFrame(() => {\n                        if (isDefaultSource) {\n                            elements.statusArea.innerHTML = `\n                                <div class=\"status-message\">正在使用系统默认视频源</div>\n                                <div class=\"default-source-indicator\">如需更好体验，请添加自定义视频源</div>\n                            `;\n                        } else {\n                            elements.statusArea.innerHTML = `\n                                <div class=\"status-message\">当前视频源:</div>\n                                <div class=\"current-source\">${currentSource}</div>\n                            `;\n                        }\n                    });\n                } else {\n                    showStatus('无可用视频源，请添加视频源', true);\n                }\n            }\n            \n            // 渲染源列表\n            function renderSourceList() {\n                requestAnimationFrame(() => {\n                    elements.sourceList.innerHTML = '';\n                    \n                    if (userSources.length === 0) {\n                        elements.sourceList.innerHTML = '<div style=\"text-align: center; padding: 10px; color: #888;\">暂无自定义视频源，请添加</div>';\n                        return;\n                    }\n                    \n                    const fragment = document.createDocumentFragment();\n                    \n                    userSources.forEach((source, index) => {\n                        const sourceItem = document.createElement('div');\n                        sourceItem.className = 'source-item';\n                        \n                        const sourceUrl = document.createElement('span');\n                        sourceUrl.className = 'source-url';\n                        sourceUrl.textContent = source;\n                        \n                        const sourceActions = document.createElement('div');\n                        sourceActions.className = 'source-actions';\n                        \n                        const useBtn = document.createElement('button');\n                        useBtn.textContent = '使用';\n                        useBtn.addEventListener('click', () => {\n                            if (!isProcessing) {\n                                resetSourceRetry();\n                                useSource(index);\n                            }\n                        });\n                        \n                        const deleteBtn = document.createElement('button');\n                        deleteBtn.textContent = '删除';\n                        deleteBtn.addEventListener('click', () => {\n                            if (!isProcessing) deleteSource(index);\n                        });\n                        \n                        sourceActions.appendChild(useBtn);\n                        sourceActions.appendChild(deleteBtn);\n                        \n                        sourceItem.appendChild(sourceUrl);\n                        sourceItem.appendChild(sourceActions);\n                        \n                        fragment.appendChild(sourceItem);\n                    });\n                    \n                    elements.sourceList.appendChild(fragment);\n                });\n            }\n            \n            // 删除源\n            function deleteSource(userSourceIndex) {\n                if (isProcessing) return;\n                isProcessing = true;\n                \n                const allSources = getAllSources();\n                const sourceToDelete = userSources[userSourceIndex];\n                \n                if (allSources[currentSourceIndex] === sourceToDelete) {\n                    switchToNextSource();\n                }\n                \n                userSources.splice(userSourceIndex, 1);\n                saveUserSources();\n                renderSourceList();\n                updateSourceDisplay();\n                \n                if (userSources.length === 0 && allSources.length > 0) {\n                    currentSourceIndex = allSources.length - 1;\n                    loadRandomVideo();\n                }\n                \n                isProcessing = false;\n            }\n            \n            // 使用指定源\n            function useSource(index) {\n                if (isProcessing) return;\n                currentSourceIndex = index;\n                loadRandomVideo();\n            }\n            \n            // 添加新源\n            function addNewSource() {\n                if (isProcessing) return;\n                isProcessing = true;\n                \n                const newSource = elements.newSourceInput.value.trim();\n                \n                if (!newSource) {\n                    showStatus('请输入有效的视频API地址', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                if (!newSource.startsWith('http://') && !newSource.startsWith('https://')) {\n                    showStatus('URL必须以http://或https://开头', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                if (getAllSources().includes(newSource)) {\n                    showStatus('该视频源已存在', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                userSources.unshift(newSource);\n                elements.newSourceInput.value = '';\n                saveUserSources();\n                \n                currentSourceIndex = 0;\n                resetSourceRetry();\n                loadRandomVideo();\n                renderSourceList();\n                \n                showStatus('视频源添加成功', false);\n                isProcessing = false;\n            }\n            \n            // 保存用户源\n            function saveUserSources() {\n                localStorage.setItem('userVideoSources', JSON.stringify(userSources));\n            }\n            \n            // 事件监听\n            document.addEventListener('click', function(e) {\n                if (e.target === elements.toggleAuto) {\n                    autoPlay = !autoPlay;\n                    localStorage.setItem('autoPlay', autoPlay);\n                    updateAutoPlayButton();\n                } else if (e.target === elements.nextVideo) {\n                    resetSourceRetry();\n                    loadRandomVideo();\n                } else if (e.target === elements.switchSource) {\n                    resetSourceRetry();\n                    switchToNextSource();\n                } else if (e.target === elements.addSource) {\n                    addNewSource();\n                }\n            });\n            \n            // 回车添加源\n            elements.newSourceInput.addEventListener('keypress', function(e) {\n                if (e.key === 'Enter') {\n                    addNewSource();\n                }\n            });\n            \n            // 视频结束事件\n            player.addEventListener('ended', function() {\n                if (autoPlay && !isProcessing) {\n                    resetSourceRetry();\n                    loadRandomVideo();\n                }\n            });\n            \n            // 视频错误事件\n            player.addEventListener('error', function() {\n                if (!isProcessing && currentSourceRetries < maxRetriesPerSource) {\n                    currentSourceRetries++;\n                    showStatus(`当前源重试中(${currentSourceRetries}/${maxRetriesPerSource})...`, true);\n                    setTimeout(() => loadRandomVideo(), 1000);\n                }\n            });\n            \n            // 初始化\n            initPlayer();\n        });\n    </script>\n","content_text":"连续播放: 开 换一个 ▶ 切换源\n\n\n\n视频源管理\n\n\n添加源","date_published":"2025-12-07T17:26:24.196Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/随机小姐姐-最新源-Ak02D0CbhPX/","json_url":"https://cms-dbdraws.pages.dev/i/Ak02D0CbhPX/json/","rss_url":"https://cms-dbdraws.pages.dev/i/Ak02D0CbhPX/rss/","guid":"Ak02D0CbhPX","status":"published","itunes:episodeType":"full","date_published_short":"Sun Dec 07 2025","date_published_ms":1765128384196}},{"id":"UOv_7ad6Pw0","title":"随机色色图片 (18+)","url":"https://cms.dbdraws.dpdns.org/i/apitup-UOv_7ad6Pw0/","content_html":"<!-- 随机图片切换器（博客嵌入）最终版 -->\n<style>\n.random-img-box { \n  max-width: 100%;\n  margin: 15px 0; \n  text-align: center; \n  position: relative; /* 加载中不占位 不跳动关键 */\n}\n.random-img { \n  max-width: 100%;\n  max-height: 80vh; /* 你的原尺寸保留 */\n  min-height: 540px;\n  max-height: 550px;\n  border-radius: 6px;\n  box-shadow: 0 1px 4px rgba(0,0,0,0.1);\n  object-fit: contain; /* 原图比例 不拉伸不裁剪 */\n   background: #fff!important; /* 关键1 强制图片留白处纯白 根治渐变 */\n}\n.random-btn { padding: 10px 20px; margin-top: 12px; background: #4299e1; color: #fff; border: none; border-radius: 25px; cursor: pointer; font-size: 14px; }\n.random-btn:hover { background: #3182ce; }\n.random-loading { \n  color: #666; \n  padding: 20px 0; \n  position: absolute; /* 绝对定位 不占位 */\n  top: 20px;\n  left: 50%;\n  transform: translateX(-50%);\n}\n</style>\n\n<div class=\"random-img-box\">\n  <div class=\"random-loading\" id=\"imgLoading\">加载中...</div>\n  <img class=\"random-img\" id=\"blogRandomImg\" alt=\"随机图片\" style=\"display: none;\">\n  <button class=\"random-btn\" id=\"refreshImgBtn\">换一张图片</button>\n</div>\n\n<script>\nconst RANDOM_API = \"https://sbtxqq.com/api/sese.php\";\nconst imgDom = document.getElementById(\"blogRandomImg\");\nconst loadingDom = document.getElementById(\"imgLoading\");\nconst btnDom = document.getElementById(\"refreshImgBtn\");\n\nfunction loadNewImg() {\n  // 删掉隐藏旧图+显示加载中  实现无缝换图不跳动\n  let random = Date.now() + Math.floor(Math.random()*10000);\n  imgDom.src = `${RANDOM_API}?t=${random}`;\n}\n\nimgDom.onload = () => { loadingDom.style.display = \"none\"; imgDom.style.display = \"block\"; };\nimgDom.onerror = () => { loadNewImg(); };\n\nsetTimeout(()=>{\n  loadNewImg();\n  btnDom.addEventListener(\"click\", loadNewImg);\n},100);\n</script>\n","content_text":"加载中...\n随机图片 换一张图片","date_published":"2025-08-20T18:03:03.337Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/18-UOv_7ad6Pw0/","json_url":"https://cms-dbdraws.pages.dev/i/UOv_7ad6Pw0/json/","rss_url":"https://cms-dbdraws.pages.dev/i/UOv_7ad6Pw0/rss/","guid":"UOv_7ad6Pw0","status":"published","itunes:episodeType":"full","date_published_short":"Wed Aug 20 2025","date_published_ms":1755712983337}},{"id":"4RD38BQzpxh","title":"🎵QQ音乐搜索播放器","url":"https://cms.dbdraws.dpdns.org/i/qq-4RD38BQzpxh/","content_html":"<style>\n  /* 移动端优先 - 基础样式 */\n  * {\n    box-sizing: border-box;\n  }\n\n  body {\n    font-family: 'Segoe UI', sans-serif;\n    background: linear-gradient(to right, #f0f4ff, #e8f0fe);\n    margin: 0;\n    padding: 12px;\n    min-height: 100vh;\n  }\n\n  .container {\n    width: 100%;\n    max-width: 100%;\n    margin: 0 auto;\n  }\n\n  h1 {\n    font-size: 1.2rem;\n    margin: 0 0 15px;\n    color: #333;\n    text-align: center;\n  }\n\n  .search-bar {\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n    margin-bottom: 20px;\n    width: 100%;\n  }\n\n  input, select, button {\n    width: 100%;\n    padding: 12px;\n    font-size: 0.95rem;\n    border-radius: 6px;\n    border: 1px solid #ccc;\n  }\n\n  button {\n    background-color: #4285f4;\n    color: white;\n    border: none;\n    cursor: pointer;\n    font-weight: 500;\n    transition: background-color 0.2s;\n  }\n\n  button:hover, button:focus {\n    background-color: #3367d6;\n    outline: none;\n  }\n\n  input:focus, select:focus {\n    outline: 2px solid #4285f4;\n    border-color: #4285f4;\n  }\n\n  .results-container {\n    width: 100%;\n  }\n\n  .results {\n    background: white;\n    border-radius: 8px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n    overflow: hidden;\n  }\n\n  .result-item {\n    padding: 12px;\n    border-bottom: 1px solid #eee;\n    cursor: pointer;\n    transition: background-color 0.2s;\n  }\n\n  .result-item:hover {\n    background-color: #f8f9fa;\n  }\n\n  .result-item:active {\n    background-color: #e8f0fe;\n  }\n\n  .result-item .title {\n    font-weight: 600;\n    margin-bottom: 4px;\n    color: #333;\n  }\n\n  .result-item .singer {\n    font-size: 0.9rem;\n    color: #666;\n  }\n\n  .player-container {\n    width: 100%;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n  }\n\n  .cover-container {\n    width: 100%;\n    display: flex;\n    justify-content: center;\n    margin-bottom: 15px;\n  }\n\n  .cover {\n    width: 140px;\n    height: 140px;\n    object-fit: cover;\n    border-radius: 8px;\n    box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n  }\n\n  .player-info {\n    text-align: center;\n    margin-bottom: 15px;\n    width: 100%;\n    padding: 0 10px;\n  }\n\n  .player-info h2 {\n    font-size: 1.1rem;\n    margin: 0 0 5px;\n    color: #333;\n  }\n\n  .player-info p {\n    font-size: 0.9rem;\n    color: #666;\n    margin: 0;\n  }\n\n  .player-controls {\n    width: 100%;\n    margin: 15px 0;\n  }\n\n  audio {\n    width: 100%;\n    height: 40px;\n  }\n\n  .lyric-container {\n    width: 100%;\n  }\n\n  .lyric {\n    width: 100%;\n    height: 250px;\n    padding: 12px;\n    background: #f9f9f9;\n    border-radius: 6px;\n    overflow-y: auto;\n    white-space: pre-wrap;\n    font-size: 0.9rem;\n    color: #333;\n    line-height: 1.5;\n  }\n\n  .loading, .error {\n    padding: 20px;\n    text-align: center;\n    color: #666;\n    width: 100%;\n  }\n\n  .error {\n    color: #d93025;\n    background: #fee;\n    border-radius: 6px;\n  }\n\n  /* 平板及以上 (481px 以上) */\n  @media (min-width: 481px) {\n    body {\n      padding: 15px;\n    }\n\n    h1 {\n      font-size: 1.5rem;\n      margin-bottom: 25px;\n    }\n\n    .search-bar {\n      flex-direction: row;\n      gap: 10px;\n      margin-bottom: 25px;\n    }\n\n    input, select {\n      flex: 1;\n      min-width: 120px;\n    }\n\n    button {\n      width: auto;\n      min-width: 120px;\n    }\n\n    .cover {\n      width: 160px;\n      height: 160px;\n    }\n\n    .lyric {\n      height: 300px;\n      font-size: 1rem;\n    }\n\n    .player-info h2 {\n      font-size: 1.3rem;\n    }\n  }\n\n  /* 小桌面端 (768px 以上) */\n  @media (min-width: 768px) {\n    .container {\n      max-width: 768px;\n    }\n    \n    .cover {\n      width: 180px;\n      height: 180px;\n    }\n\n    .lyric {\n      height: 350px;\n    }\n  }\n\n  /* 大桌面端 (1024px 以上) */\n  @media (min-width: 1024px) {\n    .container {\n      max-width: 900px;\n    }\n    \n    .cover {\n      width: 200px;\n      height: 200px;\n    }\n\n    .lyric {\n      height: 400px;\n      font-size: 1.05rem;\n    }\n\n    .player-info h2 {\n      font-size: 1.5rem;\n    }\n  }\n\n  /* 小手机优化 (小于360px) */\n  @media (max-width: 360px) {\n    body {\n      padding: 8px;\n    }\n    \n    h1 {\n      font-size: 1.1rem;\n    }\n    \n    input, select, button {\n      padding: 10px;\n      font-size: 0.9rem;\n    }\n\n    .cover {\n      width: 120px;\n      height: 120px;\n    }\n    \n    .lyric {\n      height: 200px;\n      font-size: 0.85rem;\n    }\n  }\n</style>\n\n<div class=\"search-bar\">\n    <input type=\"text\" id=\"searchInput\" placeholder=\"输入歌曲关键词...\" />\n    <select id=\"qualitySelect\">\n      <option value=\"1\">SQ无损音质</option>\n      <option value=\"2\">HQ高品质</option>\n    </select>\n    <button id=\"searchBtn\">搜索</button>\n  </div>\n\n<div class=\"results\" id=\"searchResult\" style=\"display: none;\"></div>\n\n<center> <div class=\"player\" id=\"player\" style=\"display: none;\" style=\"display: none;\">\n    <img id=\"cover\" class=\"cover\" src=\"https://via.placeholder.com/180\" alt=\"封面\" />\n    <div class=\"info\">\n      <h2 id=\"title\">暂无歌曲</h2>\n      <p id=\"singer\">——</p>\n      <p id=\"quality\">音质：默认</p>\n    </div>\n    <audio id=\"audioPlayer\" controls style=\"width: 100%;max-width:460px;\" loop></audio>\n    <div class=\"lyric\" id=\"lyric\">暂无歌词</div>\n  </div></center>\n\n<script>\n    const API = 'https://lpz.chatc.vip/apiqq.php';\n    const searchInput = document.getElementById('searchInput');\n    const searchBtn = document.getElementById('searchBtn');\n    const qualitySelect = document.getElementById('qualitySelect');\n    const searchResult = document.getElementById('searchResult');\n    const player = document.getElementById('player');\n    const audioPlayer = document.getElementById('audioPlayer');\n    const cover = document.getElementById('cover');\n    const title = document.getElementById('title');\n    const singer = document.getElementById('singer');\n    const quality = document.getElementById('quality');\n    const lyric = document.getElementById('lyric');\n\n    searchBtn.onclick = searchMusic;\n    searchInput.onkeydown = e => { if (e.key === 'Enter') searchMusic(); };\n\n    async function searchMusic() {\n      const keyword = searchInput.value.trim();\n      const br = qualitySelect.value;\n      if (!keyword) return alert('请输入关键词');\n      searchResult.style.display = 'block';\n      searchResult.innerHTML = '<div class=\"loading\">搜索中...</div>';\n\n      try {\n        const url = `${API}?msg=${encodeURIComponent(keyword)}&type=json&br=${br}`;\n        const res = await fetch(url);\n        const data = await res.json();\n        if (data.code !== 200 || !data.data) throw new Error(data.message || '搜索失败');\n\n        const list = Object.entries(data.data)\n          .filter(([k]) => !isNaN(Number(k)))\n          .map(([k, v]) => ({ index: k, ...v }));\n\n        if (!list.length) {\n          searchResult.innerHTML = '<div class=\"error\">未找到相关歌曲</div>';\n          return;\n        }\n\n        searchResult.innerHTML = list.map(song => `\n          <div class=\"result-item\" data-index=\"${song.n}\">\n            <span>${song.song_title || '未知歌名'}</span>\n            <span>${song.song_singer || '未知歌手'}</span>\n          </div>\n        `).join('');\n\n        document.querySelectorAll('.result-item').forEach(item => {\n          item.onclick = () => loadSongDetail(keyword, item.dataset.index, br);\n        });\n\n      } catch (err) {\n        searchResult.innerHTML = `<div class=\"error\">${err.message}</div>`;\n        console.error(err);\n      }\n    }\n\nlet isLoading = false;\n\nasync function loadSongDetail(keyword, index, br) {\n  if (isLoading) return;\n  isLoading = true;\n\n  try {\n    const url = `${API}?msg=${encodeURIComponent(keyword)}&n=${index}&type=json&br=${br}`;\n    const res = await fetch(url);\n    const data = await res.json();\n    if (data.code !== 200 || !data.data) throw new Error(data.message || '加载失败');\n\n    const song = data.data;\n    title.textContent = song.song_name || '未知歌名';\n    singer.textContent = song.song_singer || '未知歌手';\n    quality.textContent = `音质：${song.quality || (br === '2' ? 'HQ高品质' : '默认')}`;\n    cover.src = song.cover || 'https://via.placeholder.com/180';\n    cover.onerror = () => { cover.src = 'https://via.placeholder.com/180'; };\n    audioPlayer.src = song.music_url || '';\n    lyric.textContent = song.lyric || '暂无歌词';\n\n    // 自动播放\n    audioPlayer.play().catch(err => console.warn('自动播放失败：', err));\n\n    player.style.display = 'block';\n    searchResult.style.display = 'none';\n  } catch (err) {\n    alert(err.message);\n    console.error(err);\n  } finally {\n    isLoading = false;\n  }\n}\n\n  </script>\n\n","content_text":"SQ无损音质 HQ高品质 搜索\n\n封面 [https://via.placeholder.com/180]\n\n\n暂无歌曲\n\n——\n\n音质：默认\n\n暂无歌词","date_published":"2025-08-15T07:02:54.807Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/qq-4RD38BQzpxh/","json_url":"https://cms-dbdraws.pages.dev/i/4RD38BQzpxh/json/","rss_url":"https://cms-dbdraws.pages.dev/i/4RD38BQzpxh/rss/","guid":"4RD38BQzpxh","status":"published","itunes:episodeType":"full","date_published_short":"Fri Aug 15 2025","date_published_ms":1755241374807}},{"id":"lkhoTm8kFvy","title":"在线音乐","url":"https://cms.dbdraws.dpdns.org/i/ceshi-lkhoTm8kFvy/","content_html":"\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>全能音乐搜索播放器</title>\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        }\n        \n        body {\n            background: linear-gradient(135deg, #1a2a6c, #b21f1f, #1a2a6c);\n            color: #fff;\n            min-height: 100vh;\n            padding: 20px;\n        }\n        \n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            display: grid;\n            grid-template-columns: 1fr 1.5fr;\n            gap: 20px;\n        }\n\n\n        /* 新增的移动端优化CSS - 不改变任何现有元素 */\n@media (max-width: 768px) {\n    body {\n        padding: 10px;\n        font-size: 13px;\n    }\n    \n    .container {\n        grid-template-columns: 1fr;\n        gap: 15px;\n    }\n    \n    h1 {\n        font-size: 1.8rem;\n        gap: 10px;\n    }\n    \n    .search-box {\nflex-direction: column;\n        max-width: 100%;\n        gap: 12px;\n\n    }\n    \n    .search-box input,\n    .search-box select,\n    .search-box button {\n        width: 100%;\n\n    }\n    \n    .panel {\n        padding: 15px;\n    }\n    \n    .album-art {\n        max-height: 80vw;\n    }\n    \n    .control-btn {\n        width: 56px;\n        height: 56px;\n        min-width: 56px;\n    }\n    \n    .quality-selector {\n        justify-content: center;\n    }\n    \n    .lyrics-container {\n        max-height: 40vh;\n        padding: 15px;\n        font-size: 1rem;\n    }\n    \n    .result-item {\n        padding: 12px;\n        gap: 12px;\n    }\n    \n    .album-thumb {\n        width: 50px;\n        height: 50px;\n    }\n    \n    /* 触摸反馈优化 */\n    button, .control-btn, .quality-btn, .result-item {\n        transition: all 0.15s ease;\n    }\n    \n    button:active, \n    .control-btn:active, \n    .quality-btn:active,\n    .result-item:active {\n        transform: scale(0.98);\n        opacity: 0.9;\n    }\n    \n    /* 文本溢出处理 */\n\n    \n    /* 移动端隐藏部分装饰性图标 */\n    .panel-title i {\n        display: none;\n    }\n\n    /* 移动端进度条更明显 */\n    .progress-container {\n        height: 6px;\n    }\n    \n    /* 禁用移动端hover效果 */\n    .result-item:hover {\n        transform: none;\n        background: rgba(255, 255, 255, 0.1);\n    }\n    \n    .control-btn:hover {\n        transform: none;\n        background: rgba(255, 255, 255, 0.1);\n    }\n}\n\n/* 更小屏幕的额外优化 */\n@media (max-width: 480px) {\n    body {\n        padding: 8px;\n    }\n    \n    .panel {\n        padding: 12px;\n    }\n    \n    .main-controls {\n        gap: 15px;\n    }\n    \n    /* 确保输入框字体大小不被缩放 */\n    input, select, button {\n        font-size: 16px !important;\n    }\n}\n\n  \n\n\n      \n        header {\n            grid-column: 1 / -1;\n            text-align: center;\n            padding: 20px;\n            background: rgba(0, 0, 0, 0.3);\n            border-radius: 15px;\n            margin-bottom: 20px;\n            backdrop-filter: blur(10px);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n        }\n        \n        h1 {\n            font-size: 2.5rem;\n            margin-bottom: 10px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 15px;\n        }\n        \n        h1 i {\n            color: #FF0054;\n        }\n        \n        .search-box {\n            display: flex;\n            gap: 10px;\n            margin: 20px auto;\n            max-width: 650px;\n        }\n        \n        input, select, button {\n            padding: 12px 15px;\n            border: none;\n            border-radius: 50px;\n            font-size: 1rem;\n            outline: none;\n        }\n        \n        input {\n            flex: 1;\n            background: rgba(255, 255, 255, 0.9);\n            color: #333;\n        }\n        \n        select {\n            background: rgba(255, 255, 255, 0.85);\n            color: #333;\n            width: 140px;\n        }\n        \n        button {\n            background: linear-gradient(to right, #FF0054, #FF512F);\n            color: white;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            width: 120px;\n            font-weight: bold;\n        }\n        \n        button:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);\n        }\n        \n        .panel {\n            grid-column: 1 / -1;\n            text-align: center;\n            padding: 20px;\n            background: rgba(0, 0, 0, 0.3);\n            border-radius: 15px;\n            margin-bottom: 20px;\n            backdrop-filter: blur(10px);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            background: rgba(0, 0, 0, 0.4);\n            border-radius: 15px;\n            padding: 20px;\n            backdrop-filter: blur(10px);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            height: fit-content;\n        }\n\n        .panel-title {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            margin-bottom: 20px;\n            padding-bottom: 10px;\n            border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n        }\n        \n         .panel-title i {\n            color: #4ecca3;\n        }\n        \n        /* 搜索结果区域 */\n        .results-list {\n            max-height: 600px;\n            overflow-y: auto;\n            padding-right: 10px;\n        }\n        \n        .result-item {\n            background: rgba(255, 255, 255, 0.1);\n            padding: 15px;\n            border-radius: 10px;\n            margin-bottom: 10px;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            display: flex;\n            align-items: center;\n            gap: 15px;\n        }\n        \n        .result-item:hover {\n            background: rgba(255, 255, 255, 0.2);\n            transform: translateX(5px);\n        }\n        \n        .result-item.active {\n            background: linear-gradient(to right, rgba(255, 0, 84, 0.4), rgba(78, 204, 163, 0.4));\n            border-left: 4px solid #FF0054;\n        }\n        \n        .album-thumb {\n            width: 60px;\n            height: 60px;\n            border-radius: 8px;\n            background: rgba(255, 255, 255, 0.1);\n            overflow: hidden;\n            flex-shrink: 0;\n        }\n        \n        .album-thumb img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n        }\n        \n        .song-info h3 {\n            font-size: 1rem;\n            margin-bottom: 5px;\n        }\n        \n        .song-info p {\n            font-size: 0.8rem;\n            color: #ddd;\n        }\n        \n        /* 播放器区域 */\n        .player-container {\n            display: flex;\n            flex-direction: column;\n            gap: 20px;\n        }\n        .player-lyrics {\n            display: flex;\n            flex-direction: column;\n            gap: 20px;\n        }\n        .album-art {\n            width: 100%;\n            aspect-ratio: 1/1;\n            border-radius: 15px;\n            background: rgba(0, 0, 0, 0.3);\n            overflow: hidden;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n        \n        .album-art img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n        }\n        \n        .album-art i {\n            font-size: 5rem;\n            color: rgba(255, 255, 255, 0.1);\n        }\n        \n        .player-controls {\n            display: flex;\n            flex-direction: column;\n            gap: 15px;\n        }\n        \n        .quality-selector {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n            padding: 10px 0;\n        }\n        \n        .quality-btn {\n            padding: 8px 15px;\n            background: rgba(255, 255, 255, 0.15);\n            border-radius: 20px;\n            cursor: pointer;\n            transition: all 0.3s ease;\n        }\n        \n        .quality-btn.active {\n            background: #FF0054;\n        }\n        \n        .controls {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            padding: 10px 0;\n        }\n        \n        .main-controls {\n            display: flex;\n            gap: 20px;\n            align-items: center;\n        }\n        \n        .control-btn {\n            width: 50px;\n            height: 50px;\n            border-radius: 50%;\n            background: rgba(255, 255, 255, 0.1);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            cursor: pointer;\n            transition: all 0.3s ease;\n        }\n        \n        .control-btn:hover {\n            background: rgba(255, 255, 255, 0.2);\n            transform: scale(1.05);\n        }\n        \n        .control-btn.play {\n            background: #FF0054;\n        }\n        \n        .control-btn.play:hover {\n            background: #ff336d;\n        }\n        \n        .progress-container {\n            width: 100%;\n            height: 5px;\n            background: rgba(255, 255, 255, 0.2);\n            border-radius: 5px;\n            cursor: pointer;\n            margin: 15px 0;\n        }\n        \n        .progress-bar {\n            height: 100%;\n            background: #FF0054;\n            border-radius: 5px;\n            width: 0%;\n            transition: width 0.1s linear;\n        }\n        \n        .time-info {\n            display: flex;\n            justify-content: space-between;\n            font-size: 0.9rem;\n            color: #ddd;\n        }\n        \n        /* 歌词区域 */\n        .lyrics-container {\n            background: rgba(0, 0, 0, 0.3);\n            border-radius: 10px;\n            padding: 20px;\n            margin-top: 20px;\n            max-height: 503.16px;\n            overflow-y: auto;\n            font-size: 1.1rem;\n            line-height: 2;\n        }\n        \n        .lyrics-container p {\n            margin-bottom: 15px;\n            transition: all 0.3s ease;\n            opacity: 0.7;\n        }\n        \n        .lyrics-container p.active {\n            color: #FF0054;\n            font-weight: bold;\n            opacity: 1;\n            transform: scale(1.05);\n        }\n        \n        .empty-state {\n            text-align: center;\n            padding: 40px 20px;\n            color: rgba(255, 255, 255, 0.7);\n        }\n        \n        .empty-state i {\n            font-size: 5rem;\n            margin-bottom: 20px;\n            opacity: 0.3;\n        }\n        \n        .empty-state h3 {\n            font-size: 1.5rem;\n            margin-bottom: 10px;\n        }\n        \n        .empty-state p {\n            font-size: 1rem;\n        }\n        \n        /* 滚动条样式 */\n        ::-webkit-scrollbar {\n            width: 8px;\n        }\n        \n        ::-webkit-scrollbar-track {\n            background: rgba(0, 0, 0, 0.2);\n            border-radius: 10px;\n        }\n        \n        ::-webkit-scrollbar-thumb {\n            background: rgba(255, 0, 84, 0.5);\n            border-radius: 10px;\n        }\n        \n        ::-webkit-scrollbar-thumb:hover {\n            background: rgba(255, 0, 84, 0.8);\n        }\n        \n        /* 分页控件样式 */\n        .pagination {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            gap: 10px;\n            margin-top: 20px;\n            padding: 10px 0;\n            flex-wrap: wrap;\n        }\n        \n        .pagination-btn {\n            background: rgba(255, 255, 255, 0.1);\n            color: white;\n            border: none;\n            border-radius: 50%;\n            width: 40px;\n            height: 40px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            font-size: 0.9rem;\n        }\n        \n        .pagination-btn:hover:not(.disabled) {\n            background: rgba(255, 0, 84, 0.7);\n        }\n        \n        .pagination-btn.disabled {\n            opacity: 0.3;\n            cursor: not-allowed;\n        }\n        \n        .pagination-btn.active {\n            background: #FF0054;\n            transform: scale(1.1);\n        }\n        \n        .page-info {\n            font-size: 0.9rem;\n            color: #ddd;\n            padding: 0 15px;\n        }\n        \n        .page-input {\n            background: rgba(255, 255, 255, 0.1);\n            border: none;\n            border-radius: 20px;\n            padding: 8px 15px;\n            color: white;\n            width: 80px;\n            text-align: center;\n            margin: 0 5px;\n        }\n        \n        .page-input:focus {\n            outline: 1px solid #FF0054;\n        }\n        \n        .page-jump-btn {\n            background: rgba(255, 255, 255, 0.2);\n            color: white;\n            border: none;\n            border-radius: 20px;\n            padding: 8px 15px;\n            cursor: pointer;\n            transition: all 0.3s ease;\n        }\n        \n        .page-jump-btn:hover {\n            background: rgba(255, 0, 84, 0.7);\n        }\n        \n        footer {\n            grid-column: 1 / -1;\n            text-align: center;\n            padding: 20px;\n            margin-top: 20px;\n            font-size: 0.9rem;\n            color: rgba(255, 255, 255, 0.7);\n        }\n    </style>\n</head>\n<br>\n\n    <div class=\"container\">\n        <header>\n            <h1><i class=\"fas fa-music\"></i> 无损音乐搜索播放器</h1>\n            <p>支持多个音乐源，高音质播放，歌词显示和专辑封面浏览</p>\n            \n            <div class=\"search-box\">\n                <input type=\"text\" id=\"search-input\" placeholder=\"输入歌曲名称、歌手或专辑...\">\n                <select id=\"source-select\">\n                    <option value=\"netease\">网易云音乐✔</option>\n                    <option value=\"joox\">JOOX音乐✔</option>\n                    <option value=\"kuwo\">酷我音乐✔</option>\n                    <option value=\"bilibili\">B站(不稳定)✔</option>\n                    <option value=\"tidal\">Tidal✔</option>\n                    <option value=\"apple\">Apple Music(中转)✔</option>\n                    <option value=\"tencent\">QQ音乐✘</option>\n                    <option value=\"spotify\">Spotify✘</option>\n                    <option value=\"kugou\">酷狗音乐✘</option>\n                </select>\n                <button id=\"search-btn\"><i class=\"fas fa-search\"></i> 搜索</button>\n            </div>\n        </header>\n        \n        <div class=\"panel\">\n            <div class=\"panel-title\">\n                <i class=\"fas fa-list\"></i>\n                <h2>搜索结果</h2>\n            </div>\n            \n            <div class=\"results-list\" id=\"results-container\">\n                <div class=\"empty-state\">\n                    <i class=\"fas fa-search\"></i>\n                    <h3>搜索音乐</h3>\n                    <p>输入关键词并选择音乐源后点击搜索按钮</p>\n                </div>\n            </div>\n            \n            <!-- 分页控件 -->\n            <div class=\"pagination\" id=\"pagination-container\">\n                <!-- 动态生成分页按钮 -->\n            </div>\n        </div>\n        \n        <div class=\"player-container\">\n            <div class=\"panel\">\n                <div class=\"panel-title\">\n                    <i class=\"fas fa-compact-disc\"></i>\n                    <h2>专辑封面</h2>\n                </div>\n                \n                <div class=\"album-art\">\n                    <i class=\"fas fa-music\"></i>\n                </div>\n                \n                <div class=\"player-controls\">\n                    <div class=\"quality-selector\">\n                        <div class=\"quality-btn\" data-quality=\"999\">无损音质</div>\n                        <div class=\"quality-btn active\" data-quality=\"320\">高品质</div>\n                        <div class=\"quality-btn\" data-quality=\"192\">中等音质</div>\n                        <div class=\"quality-btn\" data-quality=\"128\">普通音质</div>\n                    </div>\n                    \n                    <div class=\"controls\">\n                        <div class=\"main-controls\">\n                            <div class=\"control-btn\">\n                                <i class=\"fas fa-step-backward\"></i>\n                            </div>\n                            <div class=\"control-btn play\">\n                                <i class=\"fas fa-play\"></i>\n                            </div>\n                            <div class=\"control-btn\">\n                                <i class=\"fas fa-step-forward\"></i>\n                            </div>\n                        </div>\n                        \n                        <div class=\"volume\">\n                            <i class=\"fas fa-volume-up\"></i>\n                        </div>\n                    </div>\n                    \n                    <div class=\"progress-container\">\n                        <div class=\"progress-bar\" id=\"progress-bar\"></div>\n                    </div>\n                    \n                    <div class=\"time-info\">\n                        <span id=\"current-time\">0:00</span>\n                        <span id=\"total-time\">0:00</span>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"player-lyrics\">\n            <div class=\"panel\">\n                <div class=\"panel-title\">\n                    <i class=\"fas fa-file-alt\"></i>\n                    <h2>歌词</h2>\n                </div>\n          \n                <div class=\"lyrics-container\" id=\"lyrics-container\">\n                    <div class=\"empty-state\">\n                        <i class=\"fas fa-file-alt\"></i>\n                        <h3>歌词显示区域</h3>\n                        <p>选择歌曲后，歌词将显示在这里</p>\n                    </div>\n                </div>\n        </div>\n    </div>    \n        \n        <footer>\n            <p>© 2025 无损音乐播放器 | 基于GDStudio音乐API | 仅供学习使用</p>\n        </footer>\n    \n\n    <script>\n        // 全局变量\n        let currentTrack = null;\n        let audioPlayer = new Audio();\n        let searchResults = [];\n        let currentPlayingIndex = -1;\n        let lyrics = [];\n        let currentLyricIndex = -1;\n        \n        // 分页相关变量\n        let currentPage = 1;\n        let totalPages = 1;\n        const resultsPerPage = 10;\n        \n        // DOM元素\n        const searchInput = document.getElementById('search-input');\n        const sourceSelect = document.getElementById('source-select');\n        const searchBtn = document.getElementById('search-btn');\n        const resultsContainer = document.getElementById('results-container');\n        const paginationContainer = document.getElementById('pagination-container');\n        const lyricsContainer = document.getElementById('lyrics-container');\n        const progressBar = document.getElementById('progress-bar');\n        const currentTimeDisplay = document.getElementById('current-time');\n        const totalTimeDisplay = document.getElementById('total-time');\n        const playBtn = document.querySelector('.control-btn.play');\n        const albumArt = document.querySelector('.album-art');\n        const qualityButtons = document.querySelectorAll('.quality-btn');\n        \n        // 简单缓存，避免重复请求\n        const picUrlCache = new Map();\n\n        /**\n         * 解析真实图片 URL\n         * @param {string} source 源（netease/qq/...）\n         * @param {string|number} picId 图片ID\n         * @param {number} size 目标尺寸（300/500）\n         * @returns {Promise<string|null>} 真实图片地址或 null\n         */\n        async function getRealPicUrl(source, picId, size) {\n          if (!source || !picId) return null;\n          const cacheKey = `${source}:${picId}:${size}`;\n          if (picUrlCache.has(cacheKey)) return picUrlCache.get(cacheKey);\n\n          const api = `https://music-api.gdstudio.xyz/api.php?types=pic&source=${encodeURIComponent(source)}&id=${encodeURIComponent(picId)}&size=${encodeURIComponent(size)}`;\n\n          try {\n            const res = await fetch(api);\n            if (!res.ok) throw new Error(`图片API错误: ${res.status}`);\n            const data = await res.json();\n            const url = typeof data === 'string' ? data : data?.url;\n            if (url) {\n              picUrlCache.set(cacheKey, url);\n              return url;\n            }\n            return null;\n          } catch (e) {\n            console.error('解析图片URL失败:', e);\n            return null;\n          }\n        }\n\n        /**\n         * 将容器里的占位符替换为真实图片\n         * @param {HTMLElement} container .album-thumb 或 .album-art 容器\n         * @param {string|null} url 真实图片URL\n         * @param {string} alt alt 文本\n         * @param {'thumb'|'art'} kind 用于判断兜底展示\n         */\n        function setImageInto(container, url, alt, kind) {\n          if (!url) {\n            container.innerHTML = kind === 'thumb'\n              ? '<i class=\"fas fa-music\"></i>'\n              : '<i class=\"fas fa-compact-disc\"></i>';\n            return;\n          }\n          const img = document.createElement('img');\n          img.src = url;\n          img.alt = alt || '';\n          img.referrerPolicy = 'no-referrer'; // 避免某些CDN拒绝\n          container.innerHTML = '';\n          container.appendChild(img);\n        }\n\n        // 事件监听器\n        searchBtn.addEventListener('click', performSearch);\n        searchInput.addEventListener('keypress', (e) => {\n            if (e.key === 'Enter') performSearch();\n        });\n        \n        playBtn.addEventListener('click', togglePlay);\n        audioPlayer.addEventListener('timeupdate', updateProgress);\n        audioPlayer.addEventListener('loadedmetadata', () => {\n            totalTimeDisplay.textContent = formatTime(audioPlayer.duration);\n        });\n        audioPlayer.addEventListener('ended', playNext);\n        \n        progressBar.parentElement.addEventListener('click', (e) => {\n            const progressWidth = progressBar.parentElement.clientWidth;\n            const clickPosition = e.offsetX;\n            const duration = audioPlayer.duration;\n            \n            audioPlayer.currentTime = (clickPosition / progressWidth) * duration;\n        });\n        \n        // 搜索功能\n        async function performSearch() {\n            const keyword = searchInput.value.trim();\n            const source = sourceSelect.value;\n            \n            if (!keyword) {\n                alert('请输入搜索关键词');\n                return;\n            }\n            \n            // 重置分页\n            currentPage = 1;\n            totalPages = 1;\n            \n            // 显示加载状态\n            resultsContainer.innerHTML = `\n                <div class=\"empty-state\">\n                    <i class=\"fas fa-spinner fa-spin\"></i>\n                    <h3>正在搜索...</h3>\n                    <p>请稍候</p>\n                </div>\n            `;\n            paginationContainer.innerHTML = '';\n            \n            try {\n                const response = await fetch(`https://music-api.gdstudio.xyz/api.php?types=search&source=${source}&name=${encodeURIComponent(keyword)}&count=100`);\n                \n                if (!response.ok) {\n                    throw new Error(`API响应错误: ${response.status}`);\n                }\n                \n                const results = await response.json();\n                searchResults = results;\n                \n                if (results.length === 0) {\n                    resultsContainer.innerHTML = `\n                        <div class=\"empty-state\">\n                            <i class=\"fas fa-exclamation-circle\"></i>\n                            <h3>未找到结果</h3>\n                            <p>请尝试其他关键词或更换音乐源</p>\n                        </div>\n                    `;\n                    return;\n                }\n                \n                // 计算总页数\n                totalPages = Math.ceil(results.length / resultsPerPage);\n                \n                // 显示搜索结果\n                displayResults();\n                \n                // 生成分页控件\n                generatePagination();\n                \n            } catch (error) {\n                console.error('搜索时出错:', error);\n                resultsContainer.innerHTML = `\n                    <div class=\"empty-state\">\n                        <i class=\"fas fa-exclamation-triangle\"></i>\n                        <h3>搜索失败</h3>\n                        <p>${error.message || '请稍后再试'}</p>\n                    </div>\n                `;\n            }\n        }\n\n        // 显示搜索结果\n        function displayResults() {\n            resultsContainer.innerHTML = '';\n            \n            // 计算当前页的开始和结束索引\n            const startIndex = (currentPage - 1) * resultsPerPage;\n            const endIndex = Math.min(startIndex + resultsPerPage, searchResults.length);\n            \n            // 获取当前页的结果\n            const pageResults = searchResults.slice(startIndex, endIndex);\n            \n            pageResults.forEach((track, index) => {\n                const resultItem = document.createElement('div');\n                resultItem.className = 'result-item';\n                resultItem.dataset.index = startIndex + index;\n                \n                resultItem.innerHTML = `\n                  <div class=\"album-thumb\">\n                    ${track.pic_id ? `<i class=\"fas fa-spinner fa-spin\"></i>` : `<i class=\"fas fa-music\"></i>`}\n                  </div>\n                  <div class=\"song-info\">\n                    <h3>${track.name}</h3>\n                    <p>${track.artist} - ${track.album}</p>\n                  </div>\n                `;\n\n                // 异步解析真实图片URL并注入\n                if (track.pic_id) {\n                  const thumbContainer = resultItem.querySelector('.album-thumb');\n                  getRealPicUrl(sourceSelect.value, track.pic_id, 300)\n                    .then((url) => setImageInto(thumbContainer, url, track.album, 'thumb'));\n                }\n                \n                resultItem.addEventListener('click', () => {\n                    // 移除之前活跃项的样式\n                    document.querySelectorAll('.result-item').forEach(item => {\n                        item.classList.remove('active');\n                    });\n                    \n                    // 添加当前活跃项的样式\n                    resultItem.classList.add('active');\n                    \n                    // 加载并播放选中的歌曲\n                    loadAndPlayTrack(track, startIndex + index);\n                });\n                \n                resultsContainer.appendChild(resultItem);\n            });\n            \n            // 如果没有结果，显示空状态\n            if (pageResults.length === 0) {\n                resultsContainer.innerHTML = `\n                    <div class=\"empty-state\">\n                        <i class=\"fas fa-exclamation-circle\"></i>\n                        <h3>未找到结果</h3>\n                        <p>请尝试其他关键词或更换音乐源</p>\n                    </div>\n                `;\n            }\n        }\n        \n        // 生成分页控件\n        function generatePagination() {\n            if (totalPages <= 1) {\n                paginationContainer.innerHTML = '';\n                return;\n            }\n            \n            let paginationHTML = '';\n            \n            // 上一页按钮\n            const prevDisabled = currentPage === 1 ? 'disabled' : '';\n            paginationHTML += `\n                <button class=\"pagination-btn ${prevDisabled}\" id=\"prev-page\">\n                    <i class=\"fas fa-chevron-left\"></i>\n                </button>\n            `;\n            \n            // 显示当前页和总页数\n            paginationHTML += `\n                <div class=\"page-info\">\n                    第 <input type=\"number\" min=\"1\" max=\"${totalPages}\" value=\"${currentPage}\" class=\"page-input\" id=\"page-input\"> / ${totalPages} 页\n                </div>\n            `;\n            \n            // 下一页按钮\n            const nextDisabled = currentPage === totalPages ? 'disabled' : '';\n            paginationHTML += `\n                <button class=\"pagination-btn ${nextDisabled}\" id=\"next-page\">\n                    <i class=\"fas fa-chevron-right\"></i>\n                </button>\n            `;\n            \n            // 添加跳转按钮\n            paginationHTML += `\n                <button class=\"page-jump-btn\" id=\"jump-btn\">跳转</button>\n            `;\n            \n            paginationContainer.innerHTML = paginationHTML;\n            \n            // 添加事件监听器\n            document.getElementById('prev-page').addEventListener('click', goToPrevPage);\n            document.getElementById('next-page').addEventListener('click', goToNextPage);\n            document.getElementById('jump-btn').addEventListener('click', jumpToPage);\n            document.getElementById('page-input').addEventListener('keypress', (e) => {\n                if (e.key === 'Enter') jumpToPage();\n            });\n        }\n        \n        // 上一页\n        function goToPrevPage() {\n            if (currentPage > 1) {\n                currentPage--;\n                displayResults();\n                generatePagination();\n                scrollToTop();\n            }\n        }\n        \n        // 下一页\n        function goToNextPage() {\n            if (currentPage < totalPages) {\n                currentPage++;\n                displayResults();\n                generatePagination();\n                scrollToTop();\n            }\n        }\n        \n        // 跳转到指定页\n        function jumpToPage() {\n            const pageInput = document.getElementById('page-input');\n            let pageNum = parseInt(pageInput.value);\n            \n            if (isNaN(pageNum)) {\n                pageNum = 1;\n            }\n            \n            if (pageNum < 1) {\n                pageNum = 1;\n            } else if (pageNum > totalPages) {\n                pageNum = totalPages;\n            }\n            \n            currentPage = pageNum;\n            displayResults();\n            generatePagination();\n            scrollToTop();\n        }\n        \n        // 滚动到顶部\n        function scrollToTop() {\n            resultsContainer.scrollTo({\n                top: 0,\n                behavior: 'smooth'\n            });\n        }\n\n        // 加载并播放歌曲\n        async function loadAndPlayTrack(track, index) {\n            currentPlayingIndex = index;\n            currentTrack = track;\n            \n            // 更新专辑封面\n            albumArt.innerHTML = `<div class=\"empty-state\"><i class=\"fas fa-spinner fa-spin\"></i></div>`;\n\n            if (track.pic_id) {\n              const url = await getRealPicUrl(sourceSelect.value, track.pic_id, 500);\n              setImageInto(albumArt, url, track.album, 'art');\n            } else {\n              setImageInto(albumArt, null, track.album, 'art');\n            }\n            \n            // 显示加载状态\n            lyricsContainer.innerHTML = `\n                <div class=\"empty-state\">\n                    <i class=\"fas fa-spinner fa-spin\"></i>\n                    <h3>加载中...</h3>\n                    <p>正在获取歌曲和歌词</p>\n                </div>\n            `;\n            \n            try {\n                // 获取歌曲URL\n                const quality = document.querySelector('.quality-btn.active').dataset.quality;\n                const urlResponse = await fetch(`https://music-api.gdstudio.xyz/api.php?types=url&source=${sourceSelect.value}&id=${track.id}&br=${quality}`);\n                \n                if (!urlResponse.ok) {\n                    throw new Error('获取歌曲URL失败');\n                }\n                \n                const urlData = await urlResponse.json();\n                \n                // 获取歌词\n                const lyricId = track.lyric_id || track.id;\n                const lyricResponse = await fetch(`https://music-api.gdstudio.xyz/api.php?types=lyric&source=${sourceSelect.value}&id=${lyricId}`);\n                \n                if (!lyricResponse.ok) {\n                    throw new Error('获取歌词失败');\n                }\n                \n                const lyricData = await lyricResponse.json();\n                \n                // 设置音频源\n                audioPlayer.src = urlData.url;\n                audioPlayer.load();\n                \n                // 播放音频\n                playBtn.querySelector('i').className = 'fas fa-pause';\n                audioPlayer.play().catch(error => {\n                    console.error('播放失败:', error);\n                    alert('播放失败，可能是当前音源无效');\n                });\n                \n                // 处理歌词\n                processLyrics(lyricData);\n                \n            } catch (error) {\n                console.error('加载歌曲时出错:', error);\n                lyricsContainer.innerHTML = `\n                    <div class=\"empty-state\">\n                        <i class=\"fas fa-exclamation-triangle\"></i>\n                        <h3>加载失败</h3>\n                        <p>${error.message || '请稍后再试'}</p>\n                    </div>\n                `;\n            }\n        }\n        \n        // 处理歌词\n        function processLyrics(lyricData) {\n            lyrics = [];\n            currentLyricIndex = -1;\n            \n            // 使用原文歌词或翻译歌词\n            const rawLyrics = lyricData.tlyric || lyricData.lyric || '';\n            \n            // 解析LRC歌词\n            const lines = rawLyrics.split('\\n');\n            lines.forEach(line => {\n                const timeMatch = line.match(/\\[(\\d+):(\\d+(?:\\.\\d+)?)\\]/);\n                if (timeMatch) {\n                    const minutes = parseInt(timeMatch[1]);\n                    const seconds = parseFloat(timeMatch[2]);\n                    const time = minutes * 60 + seconds;\n                    \n                    const text = line.replace(timeMatch[0], '').trim();\n                    if (text) {\n                        lyrics.push({ time, text });\n                    }\n                }\n            });\n            \n            // 按时间排序\n            lyrics.sort((a, b) => a.time - b.time);\n            \n            // 显示歌词\n            displayLyrics();\n        }\n        \n        // 显示歌词\n        function displayLyrics() {\n            if (lyrics.length === 0) {\n                lyricsContainer.innerHTML = '<p>暂无歌词</p>';\n                return;\n            }\n            \n            lyricsContainer.innerHTML = '';\n            lyrics.forEach((line, index) => {\n                const p = document.createElement('p');\n                p.dataset.index = index;\n                p.textContent = line.text;\n                lyricsContainer.appendChild(p);\n            });\n        }\n        \n        // 更新歌词高亮\n        function updateLyricsHighlight(time) {\n            // 清除之前的高亮\n            document.querySelectorAll('#lyrics-container p').forEach(p => {\n                p.classList.remove('active');\n            });\n            \n            // 找到当前时间对应的歌词行\n            let activeIndex = -1;\n            for (let i = 0; i < lyrics.length; i++) {\n                if (time >= lyrics[i].time) {\n                    activeIndex = i;\n                } else {\n                    break;\n                }\n            }\n            \n            if (activeIndex !== -1 && activeIndex !== currentLyricIndex) {\n                currentLyricIndex = activeIndex;\n                const activeLine = document.querySelector(`#lyrics-container p[data-index=\"${activeIndex}\"]`);\n                \n                if (activeLine) {\n                    activeLine.classList.add('active');\n                    \n                    // 滚动到当前歌词行\n                    activeLine.scrollIntoView({\n                        behavior: 'smooth',\n                        block: 'center'\n                    });\n                }\n            }\n        }\n        \n        // 播放/暂停切换\n        function togglePlay() {\n            if (audioPlayer.paused || audioPlayer.ended) {\n                if (audioPlayer.src) {\n                    audioPlayer.play().catch(error => {\n                        console.error('播放失败:', error);\n                        alert('播放失败，可能是当前音源无效');\n                    });\n                    playBtn.querySelector('i').className = 'fas fa-pause';\n                } else if (searchResults.length > 0) {\n                    // 如果没有正在播放的歌曲，但搜索结果存在，播放第一首\n                    document.querySelector('.result-item').click();\n                }\n            } else {\n                audioPlayer.pause();\n                playBtn.querySelector('i').className = 'fas fa-play';\n            }\n        }\n        \n        // 播放下一首\n        function playNext() {\n            if (searchResults.length === 0) return;\n            \n            currentPlayingIndex = (currentPlayingIndex + 1) % searchResults.length;\n            const nextItem = document.querySelector(`.result-item[data-index=\"${currentPlayingIndex}\"]`);\n            \n            if (nextItem) {\n                nextItem.click();\n            }\n        }\n        \n        // 更新进度条\n        function updateProgress() {\n            const currentTime = audioPlayer.currentTime;\n            const duration = audioPlayer.duration || 1; // 避免NaN\n            \n            const progressPercent = (currentTime / duration) * 100;\n            progressBar.style.width = `${progressPercent}%`;\n            \n            currentTimeDisplay.textContent = formatTime(currentTime);\n            \n            // 更新歌词\n            updateLyricsHighlight(currentTime);\n        }\n        \n        // 格式化时间 (秒 -> mm:ss)\n        function formatTime(seconds) {\n            if (isNaN(seconds)) return '0:00';\n            \n            const mins = Math.floor(seconds / 60);\n            const secs = Math.floor(seconds % 60);\n            return `${mins}:${secs < 10 ? '0' : ''}${secs}`;\n        }\n        \n        // 音质选择\n        qualityButtons.forEach(button => {\n            button.addEventListener('click', () => {\n                // 更新UI\n                qualityButtons.forEach(btn => btn.classList.remove('active'));\n                button.classList.add('active');\n                \n                // 如果当前有歌曲在播放，重新加载该歌曲\n                if (currentTrack && !audioPlayer.paused) {\n                    loadAndPlayTrack(currentTrack, currentPlayingIndex);\n                }\n            });\n        });\n        \n        // 默认加载一些热门歌曲\n        window.addEventListener('DOMContentLoaded', () => {\n            searchInput.value = '庄心妍';\n            setTimeout(performSearch, 500);\n        });\n    </script>\n","content_text":"全能音乐搜索播放器\n\n\n\n无损音乐搜索播放器\n\n支持多个音乐源，高音质播放，歌词显示和专辑封面浏览\n\n网易云音乐✔ JOOX音乐✔ 酷我音乐✔ B站(不稳定)✔ Tidal✔ Apple Music(中转)✔ QQ音乐✘ Spotify✘ 酷狗音乐✘ 搜索\n\n\n搜索结果\n\n\n搜索音乐\n\n输入关键词并选择音乐源后点击搜索按钮\n\n\n\n\n专辑封面\n\n\n无损音质\n高品质\n中等音质\n普通音质\n\n\n0:00 0:00\n\n\n歌词\n\n\n歌词显示区域\n\n选择歌曲后，歌词将显示在这里\n\n© 2025 无损音乐播放器 | 基于GDStudio音乐API | 仅供学习使用","date_published":"2025-08-09T13:34:36.843Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/在线音乐-lkhoTm8kFvy/","json_url":"https://cms-dbdraws.pages.dev/i/lkhoTm8kFvy/json/","rss_url":"https://cms-dbdraws.pages.dev/i/lkhoTm8kFvy/rss/","guid":"lkhoTm8kFvy","status":"published","itunes:episodeType":"full","date_published_short":"Sat Aug 09 2025","date_published_ms":1754746476843}},{"id":"BFgkhhdHga5","title":"夜间模式测试","url":"https://cms.dbdraws.dpdns.org/i/ceshi-BFgkhhdHga5/","content_html":"\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>我的博客 - 夜间模式测试</title>\n    <style>\n        /* 基础样式 */\n        body {\n            font-family: 'Arial', sans-serif;\n            line-height: 1.6;\n            margin: 0;\n            padding: 20px;\n            background-color: #ffffff;\n            color: #333333;\n            transition: background-color 0.3s, color 0.3s;\n        }\n        \n        header {\n            border-bottom: 1px solid #eee;\n            padding-bottom: 20px;\n            margin-bottom: 30px;\n        }\n        \n        h1 {\n            color: #2c3e50;\n        }\n        \n        article {\n            max-width: 800px;\n            margin: 0 auto;\n        }\n        \n        a {\n            color: #3498db;\n            text-decoration: none;\n        }\n        \n        .post {\n            background: #f9f9f9;\n            padding: 20px;\n            margin-bottom: 20px;\n            border-radius: 5px;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n        }\n        \n        /* 夜间模式样式 */\n        body.dark-mode {\n            background-color: #121212;\n            color: #e0e0e0;\n        }\n        \n        body.dark-mode header {\n            border-bottom-color: #333;\n        }\n        \n        body.dark-mode h1 {\n            color: #bb86fc;\n        }\n        \n        body.dark-mode .post {\n            background: #1e1e1e;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.3);\n        }\n        \n        body.dark-mode a {\n            color: #4dd0e1;\n        }\n        \n        /* 切换按钮样式 */\n        #darkModeToggle {\n            position: fixed;\n            bottom: 20px;\n            right: 20px;\n            padding: 10px 20px;\n            background: #333;\n            color: white;\n            border: none;\n            border-radius: 20px;\n            cursor: pointer;\n            z-index: 999;\n            font-size: 14px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n            transition: all 0.3s;\n        }\n        \n        #darkModeToggle:hover {\n            transform: scale(1.05);\n        }\n        \n        body.dark-mode #darkModeToggle {\n            background: #bb86fc;\n            color: #121212;\n        }\n    </style>\n</head>\n\n    <header>\n        <h1>我的博客</h1>\n        <nav>\n            <a href=\"#\">首页</a> | \n            <a href=\"#\">文章</a> | \n            <a href=\"#\">关于</a>\n        </nav>\n    </header>\n    \n    <article>\n        <div class=\"post\">\n            <h2>第一篇文章</h2>\n            <p>这是一篇示例博客文章。夜间模式可以减轻眼睛疲劳，特别是在光线较暗的环境中使用电脑时。</p>\n            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam auctor, nisl eget ultricies tincidunt, nisl nisl aliquam nisl, eget ultricies nisl nisl eget nisl.</p>\n        </div>\n        \n        <div class=\"post\">\n            <h2>第二篇文章</h2>\n            <p>这是另一篇示例文章。你可以点击右下角的按钮切换夜间模式。</p>\n            <p>Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>\n        </div>\n    </article>\n    \n    <button id=\"darkModeToggle\">夜间模式</button>\n    \n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            const darkModeToggle = document.getElementById('darkModeToggle');\n            \n            // 检查本地存储和系统偏好\n            function checkDarkModePreference() {\n                const savedMode = localStorage.getItem('darkMode');\n                const systemPrefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n                \n                if (savedMode === 'enabled' || (savedMode === null && systemPrefersDark)) {\n                    document.body.classList.add('dark-mode');\n                    darkModeToggle.textContent = '白天模式';\n                    localStorage.setItem('darkMode', 'enabled');\n                }\n            }\n            \n            // 初始化检查\n            checkDarkModePreference();\n            \n            // 监听系统主题变化\n            if (window.matchMedia) {\n                const colorSchemeQuery = window.matchMedia('(prefers-color-scheme: dark)');\n                colorSchemeQuery.addEventListener('change', checkDarkModePreference);\n            }\n            \n            // 切换夜间模式\n            darkModeToggle.addEventListener('click', function() {\n                document.body.classList.toggle('dark-mode');\n                \n                if (document.body.classList.contains('dark-mode')) {\n                    localStorage.setItem('darkMode', 'enabled');\n                    darkModeToggle.textContent = '白天模式';\n                } else {\n                    localStorage.setItem('darkMode', 'disabled');\n                    darkModeToggle.textContent = '夜间模式';\n                }\n            });\n        });\n    </script>\n","content_text":"我的博客 - 夜间模式测试\n\n\n我的博客\n\n首页 | 文章 | 关于\n\n\n第一篇文章\n\n这是一篇示例博客文章。夜间模式可以减轻眼睛疲劳，特别是在光线较暗的环境中使用电脑时。\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam auctor, nisl\neget ultricies tincidunt, nisl nisl aliquam nisl, eget ultricies nisl nisl eget\nnisl.\n\n\n第二篇文章\n\n这是另一篇示例文章。你可以点击右下角的按钮切换夜间模式。\n\nSed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad\nminim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea\ncommodo consequat.\n\n夜间模式","date_published":"2025-08-08T14:12:14.934Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/夜间模式测试-BFgkhhdHga5/","json_url":"https://cms-dbdraws.pages.dev/i/BFgkhhdHga5/json/","rss_url":"https://cms-dbdraws.pages.dev/i/BFgkhhdHga5/rss/","guid":"BFgkhhdHga5","status":"published","itunes:episodeType":"full","date_published_short":"Fri Aug 08 2025","date_published_ms":1754662334934}},{"id":"Dz7-m7LZ1Vy","title":"背景测试","url":"https://cms.dbdraws.dpdns.org/i/ceshi-Dz7-m7LZ1Vy/","content_html":"\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>简约高斯模糊背景（带API文字）</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            min-height: 100vh;\n            display: flex;\n            flex-direction: column;\n            font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n            color: #333;\n            background-image: url(\"https://api.yszwbk.com?39\");\n            background-size: cover;\n            background-position: center;\n            background-attachment: fixed;\n            position: relative;\n        }\n\n        body::before {\n            content: \"\";\n            position: fixed;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background-image: inherit;\n            background-size: cover;\n            background-position: center;\n            filter: blur(8px);\n            z-index: -1;\n            transform: scale(1.02);\n        }\n\n        body::after {\n            content: \"\";\n            position: fixed;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: rgba(255, 255, 255, 0.3);\n            z-index: -1;\n        }\n\n        .content {\n            flex: 1;\n            max-width: 800px;\n            margin: 0 auto;\n            padding: 40px 20px;\n            width: 100%;\n        }\n\n        .header {\n            margin-bottom: 40px;\n            color: #222;\n        }\n\n        .header h1 {\n            font-size: 2rem;\n            margin-bottom: 10px;\n        }\n\n        .meta {\n            color: #666;\n            font-size: 0.9rem;\n            margin-bottom: 20px;\n        }\n\n        .subscribe {\n            margin: 15px 0;\n            font-size: 0.9rem;\n        }\n\n        .subscribe a {\n            color: #4a86e8;\n            text-decoration: none;\n            margin-right: 10px;\n        }\n\n        .card {\n            background: rgba(255, 255, 255, 0.95);\n            border-radius: 12px;\n            padding: 30px;\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);\n            margin-bottom: 40px;\n        }\n\n        .card h2 {\n            font-size: 1.8rem;\n            margin-bottom: 15px;\n            color: #222;\n        }\n\n        /* API文字输出区域样式 */\n        .api-text {\n            line-height: 1.8; /* 增加行高，提升阅读体验 */\n            color: #555;\n            margin-bottom: 20px;\n            min-height: 60px; /* 预留空间，避免加载时抖动 */\n            font-size: 1.05rem;\n        }\n\n        .btn {\n            display: inline-block;\n            padding: 10px 20px;\n            background: #333;\n            color: white;\n            border-radius: 6px;\n            text-decoration: none;\n            font-size: 0.9rem;\n        }\n\n        footer {\n            padding: 20px;\n            text-align: center;\n            color: #666;\n            font-size: 0.85rem;\n            border-top: 1px solid rgba(0, 0, 0, 0.05);\n            background: rgba(255, 255, 255, 0.8);\n        }\n\n        footer a {\n            color: #4a86e8;\n            text-decoration: none;\n        }\n\n        /* 加载状态样式（可选） */\n        .loading {\n            color: #999;\n            font-style: italic;\n        }\n  #text-output {\n            font-size: 24px;\n            color: #333;\n            max-width: 100%;\n            text-align: center;\n            line-height: 1.6;\n            padding: 20px;\n            border-left: 4px solid #4CAF50;\n            background-color: white;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n        }\n    </style>\n</head>\n<br>\n        <div class=\"card\">\n            <h2>随机一言</h2>\n            <!-- API文字输出区域（替换原静态p标签） -->\n            <p id=\"text-output\" class=\"api-text loading\">加载中...</p>\n            <a href=\"#\" class=\"btn\">探索更多</a>\n        </div>\n    </div>\n\n\n    <script>\n        // API地址（一言API，返回名言类型文字）\n        const apiUrl = \"https://v1.hitokoto.cn/?c=d\"; // ?c=d 筛选名言类型\n        \n        // 调用API并输出文字\n        fetch(apiUrl)\n            .then(response => {\n                if (!response.ok) throw new Error(\"网络错误\");\n                return response.json();\n            })\n            .then(data => {\n                // 获取API返回的文字内容（字段为hitokoto）\n                const text = data.hitokoto;\n                // 将文字显示到页面，并移除加载状态\n                const outputElement = document.getElementById(\"text-output\");\n                outputElement.textContent = text;\n                outputElement.classList.remove(\"loading\"); // 移除加载中样式\n            })\n            .catch(error => {\n                // 加载失败时显示友好提示\n                const outputElement = document.getElementById(\"text-output\");\n                outputElement.textContent = \"名言加载失败，请刷新页面重试\";\n                outputElement.classList.remove(\"loading\");\n                console.error(\"API调用失败:\", error);\n            });\n    </script>\n","content_text":"简约高斯模糊背景（带API文字）\n\n\n\n随机一言\n\n加载中...\n\n探索更多","date_published":"2025-08-08T08:21:51.448Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/背景测试-Dz7-m7LZ1Vy/","json_url":"https://cms-dbdraws.pages.dev/i/Dz7-m7LZ1Vy/json/","rss_url":"https://cms-dbdraws.pages.dev/i/Dz7-m7LZ1Vy/rss/","guid":"Dz7-m7LZ1Vy","status":"published","itunes:episodeType":"full","date_published_short":"Fri Aug 08 2025","date_published_ms":1754641311448}},{"id":"iNeSvdQ0K4h","title":"每日60秒读懂世界","url":"https://cms.dbdraws.dpdns.org/i/meiri60-iNeSvdQ0K4h/","content_html":"<figure style=\"text-align: center; margin: 1.5em 0;\">\n  <img \n    src=\"https://api.xhus.cn/api/60s\" \n    alt=\"每日60秒读懂世界\" \n    style=\"max-width: 100%; height: auto; border-radius: 10px; transition: transform 0.3s ease;\"\n    loading=\"lazy\"\n  >\n  <figcaption style=\"font-size: 0.95em; color: #555; margin-top: 0.8em;\">60秒读懂世界</figcaption>\n</figure>","content_text":"每日60秒读懂世界 [https://api.xhus.cn/api/60s] 60秒读懂世界","date_published":"2025-08-08T07:13:59.990Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/60-iNeSvdQ0K4h/","json_url":"https://cms-dbdraws.pages.dev/i/iNeSvdQ0K4h/json/","rss_url":"https://cms-dbdraws.pages.dev/i/iNeSvdQ0K4h/rss/","guid":"iNeSvdQ0K4h","status":"published","itunes:episodeType":"full","date_published_short":"Fri Aug 08 2025","date_published_ms":1754637239990}},{"id":"mX7-wXOi5JR","title":"随机小姐姐-v1.3-单源重试机制","url":"https://cms.dbdraws.dpdns.org/i/11-mX7-wXOi5JR/","content_html":"<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>随机小姐姐</title>\n    <style>\n        /* 原有样式不变 */\n        body {\n            font-family: 'Arial', sans-serif;\n            max-width: 1000px;\n            margin: 0 auto;\n            padding: 15px;\n            background-color: #f5f5f5;\n        }\n        \n        #player-container {\n            background: #000;\n            border-radius: 8px;\n            margin-bottom: 15px;\n            overflow: hidden;\n            box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n        }\n        \n        #player {\n            width: 100%;\n            height: auto;\n            max-height: 80vh;\n            min-height: 250px;\n            max-height: 550px;\n            display: block;\n        }\n        \n        .control-panel {\n            background: white;\n            padding: 15px;\n            border-radius: 8px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n            margin-bottom: 15px;\n        }\n        \n        .button-group {\n            display: flex;\n            gap: 8px;\n            margin-bottom: 12px;\n            flex-wrap: wrap;\n        }\n        \n        button {\n            background: #7F9CCC;\n            color: #fff;\n            border: none;\n            padding: 10px 12px;\n            border-radius: 6px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: all 0.3s;\n            flex-grow: 1;\n            font-size: 14px;\n            min-width: 80px;\n        }\n        \n        button:hover {\n            background: #6A8BBC;\n            transform: translateY(-1px);\n        }\n        \n        button#toggleAuto {\n            flex-grow: 2;\n        }\n        \n        .source-management {\n            margin-top: 15px;\n        }\n        \n        .source-list {\n            margin-top: 10px;\n            max-height: 30vh;\n            overflow-y: auto;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            padding: 8px;\n            background: white;\n        }\n        \n        .source-item {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            padding: 8px;\n            border-bottom: 1px solid #eee;\n        }\n        \n        .source-item:last-child {\n            border-bottom: none;\n        }\n        \n        .source-url {\n            flex-grow: 1;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n            margin-right: 8px;\n            font-size: 14px;\n        }\n        \n        .source-actions {\n            display: flex;\n            gap: 5px;\n        }\n        \n        .source-actions button {\n            padding: 5px 8px;\n            font-size: 12px;\n            background: #ff6b6b;\n            min-width: 50px;\n            flex-grow: 0;\n        }\n        \n        .source-actions button:first-child {\n            background: #4CAF50;\n        }\n        \n        .add-source-form {\n            display: flex;\n            gap: 8px;\n            margin-top: 12px;\n        }\n        \n        .add-source-form input {\n            flex-grow: 1;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 14px;\n        }\n        \n        .add-source-form button {\n            width: 90px;\n            flex-grow: 0;\n        }\n        \n        .status {\n            margin-top: 10px;\n            font-size: 14px;\n            color: #666;\n            text-align: center;\n        }\n        \n        .current-source {\n            font-weight: bold;\n            color: #7F9CCC;\n            word-break: break-all;\n        }\n        \n        .default-source-indicator {\n            color: #888;\n            font-style: italic;\n            margin-top: 5px;\n        }\n        \n        /* 手机端优化 */\n        @media (max-width: 600px) {\n            body {\n                padding: 10px;\n            }\n            \n            #player {\n                min-height: 200px;\n            }\n            \n            .control-panel {\n                padding: 12px;\n            }\n            \n            button {\n                padding: 8px 10px;\n                font-size: 13px;\n            }\n            \n            .source-item {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n            \n            .source-actions {\n                margin-top: 5px;\n                width: 100%;\n                justify-content: flex-end;\n            }\n            \n            .add-source-form {\n                flex-direction: column;\n            }\n            \n            .add-source-form button {\n                width: 100%;\n            }\n        }\n    </style>\n</head>\n\n\n    <h1 style=\"text-align: center; margin-bottom: 15px;\">随机小姐姐</h1>\n    \n    <div id=\"player-container\">\n        <video id=\"player\" controls playsinline></video>\n    </div>\n    \n    <div class=\"control-panel\">\n        <div class=\"button-group\">\n            <button id=\"toggleAuto\">连续播放: 开</button>\n            <button id=\"nextVideo\">换一个 ▶</button>\n            <button id=\"switchSource\">切换源</button>\n        </div>\n        \n        <div class=\"status\" id=\"statusArea\">\n            <!-- 状态信息将在这里动态生成 -->\n        </div>\n        \n        <div class=\"source-management\">\n            <h3 style=\"margin-bottom: 8px;\">视频源管理</h3>\n            <div class=\"source-list\" id=\"sourceList\">\n                <!-- 视频源列表将在这里动态生成 -->\n            </div>\n            \n            <div class=\"add-source-form\">\n                <input type=\"text\" id=\"newSourceInput\" placeholder=\"输入视频API地址\">\n                <button id=\"addSource\">添加源</button>\n            </div>\n        </div>\n    </div>\n\n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            // 隐藏的默认源 (不在界面显示)\n            const defaultSources = [\n                'http://api.xkwat.com/vid.php',\n                'https://www.ximi.me/video/list.php'\n            ];\n            \n            // 用户添加的源\n            let userSources = JSON.parse(localStorage.getItem('userVideoSources')) || [];\n            \n            // 获取所有源 (默认源 + 用户源)\n            function getAllSources() {\n                return [...userSources, ...defaultSources];\n            }\n            \n            let currentSourceIndex = 0;\n            let autoPlay = localStorage.getItem('autoPlay') !== 'false';\n            const player = document.getElementById('player');\n            let isProcessing = false; // 防止重复操作\n            \n            // 添加：单源内重试控制（核心修改）\n            let currentSourceRetries = 0; // 当前源的重试次数\n            const maxRetriesPerSource = 2; // 单个源的最大重试次数（可自定义）\n            \n            // DOM元素\n            const elements = {\n                toggleAuto: document.getElementById('toggleAuto'),\n                nextVideo: document.getElementById('nextVideo'),\n                switchSource: document.getElementById('switchSource'),\n                sourceList: document.getElementById('sourceList'),\n                newSourceInput: document.getElementById('newSourceInput'),\n                addSource: document.getElementById('addSource'),\n                statusArea: document.getElementById('statusArea')\n            };\n            \n            // 添加：重置当前源的重试计数\n            function resetSourceRetry() {\n                currentSourceRetries = 0;\n            }\n            \n            // 初始化播放器\n            function initPlayer() {\n                updateAutoPlayButton();\n                updateSourceDisplay();\n                renderSourceList();\n                \n                // 如果有用户源，优先使用第一个用户源\n                if (userSources.length > 0) {\n                    currentSourceIndex = 0;\n                } else {\n                    // 否则使用第一个默认源\n                    currentSourceIndex = defaultSources.length > 0 ? userSources.length : 0;\n                }\n                \n                resetSourceRetry(); // 初始化时重置重试计数\n                loadRandomVideo();\n            }\n            \n            // 更新自动播放按钮状态\n            function updateAutoPlayButton() {\n                elements.toggleAuto.textContent = `连续播放: ${autoPlay ? '开' : '关'}`;\n            }\n            \n            // 加载随机视频（核心修改：单源内重试逻辑）\n            function loadRandomVideo() {\n                if (isProcessing) return;\n                isProcessing = true;\n                \n                const allSources = getAllSources();\n                if (allSources.length === 0) {\n                    showStatus('无可用视频源，请添加视频源', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                // 确保索引在有效范围内\n                if (currentSourceIndex >= allSources.length) {\n                    currentSourceIndex = 0;\n                }\n                \n                const currentSource = allSources[currentSourceIndex];\n                const timestamp = new Date().getTime();\n                const randomParam = Math.random();\n                \n                let videoUrl = currentSource;\n                if (currentSource.includes('?')) {\n                    videoUrl += `&_t=${timestamp}_${randomParam}`;\n                } else {\n                    videoUrl += `?_t=${timestamp}_${randomParam}`;\n                }\n                \n                player.src = videoUrl;\n                updateSourceDisplay();\n                \n                // 使用requestAnimationFrame来优化性能\n                requestAnimationFrame(() => {\n                    player.play().catch(e => {\n                        console.error(`当前源第${currentSourceRetries+1}次播放失败:`, e);\n                        \n                        // 1. 区分错误类型处理\n                        if (e.name === 'NotAllowedError') {\n                            // 浏览器拦截自动播放（非源错误），提示用户手动点击\n                            showStatus('请点击播放按钮开始（浏览器限制自动播放）', true);\n                        } else {\n                            // 源错误：判断是否达到单源最大重试次数\n                            if (currentSourceRetries < maxRetriesPerSource) {\n                                // 未达最大次数，重试当前源（同一源多次尝试）\n                                currentSourceRetries++;\n                                showStatus(`当前源重试中(${currentSourceRetries}/${maxRetriesPerSource})...`, true);\n                                \n                                // 短暂延迟后重试（避免频繁请求）\n                                setTimeout(() => {\n                                    loadRandomVideo(); // 重试当前源\n                                }, 1000);\n                                return; // 提前退出，不执行后续解锁逻辑（交由重试处理）\n                            } else {\n                                // 达到单源最大重试次数，切换到下一个源\n                                showStatus(`当前源已重试${maxRetriesPerSource}次失败，切换到下一个源...`, true);\n                                resetSourceRetry(); // 重置当前源重试计数\n                                switchToNextSource(); // 切换到新源\n                            }\n                        }\n                    }).finally(() => {\n                        // 2. 无论成败，最终解锁（确保下次能操作）\n                        isProcessing = false;\n                        \n                        // 播放成功时重置当前源重试计数（例如用户手动点击播放）\n                        if (player.paused === false) {\n                            resetSourceRetry();\n                        }\n                    });\n                });\n            }\n            \n            // 显示状态信息\n            function showStatus(message, isError = false) {\n                requestAnimationFrame(() => {\n                    elements.statusArea.innerHTML = `<div class=\"status-message\" style=\"color: ${isError ? '#ff4444' : '#666'}\">${message}</div>`;\n                });\n            }\n            \n            // 切换到下一个源\n            function switchToNextSource() {\n                if (isProcessing) return;\n                \n                const allSources = getAllSources();\n                if (allSources.length === 0) return;\n                \n                currentSourceIndex = (currentSourceIndex + 1) % allSources.length;\n                resetSourceRetry(); // 切换源时重置重试计数\n                loadRandomVideo();\n            }\n            \n            // 更新当前源显示\n            function updateSourceDisplay() {\n                const allSources = getAllSources();\n                if (allSources.length > 0) {\n                    const currentSource = allSources[currentSourceIndex];\n                    const isDefaultSource = defaultSources.includes(currentSource);\n                    \n                    requestAnimationFrame(() => {\n                        if (isDefaultSource) {\n                            // 使用默认源时不显示具体URL\n                            elements.statusArea.innerHTML = `\n                                <div class=\"status-message\">正在使用系统默认视频源</div>\n                                <div class=\"default-source-indicator\">如需更好体验，请添加自定义视频源</div>\n                            `;\n                        } else {\n                            // 使用用户源时显示URL\n                            elements.statusArea.innerHTML = `\n                                <div class=\"status-message\">当前视频源:</div>\n                                <div class=\"current-source\">${currentSource}</div>\n                            `;\n                        }\n                    });\n                } else {\n                    showStatus('无可用视频源，请添加视频源', true);\n                }\n            }\n            \n            // 渲染源列表 (只显示用户添加的源)\n            function renderSourceList() {\n                requestAnimationFrame(() => {\n                    elements.sourceList.innerHTML = '';\n                    \n                    if (userSources.length === 0) {\n                        elements.sourceList.innerHTML = '<div style=\"text-align: center; padding: 10px; color: #888;\">暂无自定义视频源，请添加</div>';\n                        return;\n                    }\n                    \n                    const fragment = document.createDocumentFragment();\n                    \n                    userSources.forEach((source, index) => {\n                        const sourceItem = document.createElement('div');\n                        sourceItem.className = 'source-item';\n                        \n                        const sourceUrl = document.createElement('span');\n                        sourceUrl.className = 'source-url';\n                        sourceUrl.textContent = source;\n                        \n                        const sourceActions = document.createElement('div');\n                        sourceActions.className = 'source-actions';\n                        \n                        const useBtn = document.createElement('button');\n                        useBtn.textContent = '使用';\n                        useBtn.addEventListener('click', () => {\n                            if (!isProcessing) {\n                                resetSourceRetry(); // 用户主动操作，重置重试计数\n                                useSource(index);\n                            }\n                        });\n                        \n                        const deleteBtn = document.createElement('button');\n                        deleteBtn.textContent = '删除';\n                        deleteBtn.addEventListener('click', () => {\n                            if (!isProcessing) deleteSource(index);\n                        });\n                        \n                        sourceActions.appendChild(useBtn);\n                        sourceActions.appendChild(deleteBtn);\n                        \n                        sourceItem.appendChild(sourceUrl);\n                        sourceItem.appendChild(sourceActions);\n                        \n                        fragment.appendChild(sourceItem);\n                    });\n                    \n                    elements.sourceList.appendChild(fragment);\n                });\n            }\n            \n            // 删除源\n            function deleteSource(userSourceIndex) {\n                if (isProcessing) return;\n                isProcessing = true;\n                \n                const allSources = getAllSources();\n                const sourceToDelete = userSources[userSourceIndex];\n                \n                // 检查是否正在使用要删除的源\n                if (allSources[currentSourceIndex] === sourceToDelete) {\n                    // 如果删除的是当前正在使用的源，切换到下一个源\n                    switchToNextSource();\n                }\n                \n                userSources.splice(userSourceIndex, 1);\n                saveUserSources();\n                renderSourceList();\n                updateSourceDisplay();\n                \n                // 如果没有用户源了，自动切换到默认源\n                if (userSources.length === 0 && allSources.length > 0) {\n                    currentSourceIndex = allSources.length - 1; // 切换到最后一个源(默认源)\n                    loadRandomVideo();\n                }\n                \n                isProcessing = false;\n            }\n            \n            // 使用指定源\n            function useSource(index) {\n                if (isProcessing) return;\n                currentSourceIndex = index;\n                loadRandomVideo();\n            }\n            \n            // 添加新源\n            function addNewSource() {\n                if (isProcessing) return;\n                isProcessing = true;\n                \n                const newSource = elements.newSourceInput.value.trim();\n                \n                if (!newSource) {\n                    showStatus('请输入有效的视频API地址', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                // 简单验证URL格式\n                if (!newSource.startsWith('http://') && !newSource.startsWith('https://')) {\n                    showStatus('URL必须以http://或https://开头', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                // 检查是否已存在(包括默认源)\n                if (getAllSources().includes(newSource)) {\n                    showStatus('该视频源已存在', true);\n                    isProcessing = false;\n                    return;\n                }\n                \n                userSources.unshift(newSource); // 添加到开头\n                elements.newSourceInput.value = '';\n                saveUserSources();\n                \n                // 使用新添加的源\n                currentSourceIndex = 0;\n                resetSourceRetry(); // 添加新源后重置重试计数\n                loadRandomVideo();\n                renderSourceList();\n                \n                showStatus('视频源添加成功', false);\n                isProcessing = false;\n            }\n            \n            // 保存用户源到本地存储\n            function saveUserSources() {\n                localStorage.setItem('userVideoSources', JSON.stringify(userSources));\n            }\n            \n            // 事件监听 - 使用事件委托优化性能\n            document.addEventListener('click', function(e) {\n                if (e.target === elements.toggleAuto) {\n                    autoPlay = !autoPlay;\n                    localStorage.setItem('autoPlay', autoPlay);\n                    updateAutoPlayButton();\n                } else if (e.target === elements.nextVideo) {\n                    resetSourceRetry(); // 用户主动点击\"换一个\"，重置重试计数\n                    loadRandomVideo();\n                } else if (e.target === elements.switchSource) {\n                    resetSourceRetry(); // 用户主动切换源，重置重试计数\n                    switchToNextSource();\n                } else if (e.target === elements.addSource) {\n                    addNewSource();\n                }\n            });\n            \n            // 按Enter键添加源\n            elements.newSourceInput.addEventListener('keypress', function(e) {\n                if (e.key === 'Enter') {\n                    addNewSource();\n                }\n            });\n            \n            // 视频结束事件\n            player.addEventListener('ended', function() {\n                if (autoPlay && !isProcessing) {\n                    resetSourceRetry(); // 视频正常结束后，重置重试计数\n                    loadRandomVideo();\n                }\n            });\n            \n            // 视频错误事件（补充处理）\n            player.addEventListener('error', function() {\n                if (!isProcessing && currentSourceRetries < maxRetriesPerSource) {\n                    // 播放器错误事件也触发重试逻辑\n                    currentSourceRetries++;\n                    showStatus(`当前源重试中(${currentSourceRetries}/${maxRetriesPerSource})...`, true);\n                    setTimeout(() => loadRandomVideo(), 1000);\n                }\n            });\n            \n            // 初始化\n            initPlayer();\n        });\n    </script>\n","content_text":"随机小姐姐\n\n\n随机小姐姐\n\n\n连续播放: 开 换一个 ▶ 切换源\n\n\n\n视频源管理\n\n\n添加源","date_published":"2025-08-07T06:40:28.292Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/v13-mX7-wXOi5JR/","json_url":"https://cms-dbdraws.pages.dev/i/mX7-wXOi5JR/json/","rss_url":"https://cms-dbdraws.pages.dev/i/mX7-wXOi5JR/rss/","guid":"mX7-wXOi5JR","status":"published","itunes:episodeType":"full","date_published_short":"Thu Aug 07 2025","date_published_ms":1754548828292}},{"id":"UOZgEjv0rIa","title":"api视频源集合","url":"https://cms.dbdraws.dpdns.org/i/apijihe-UOZgEjv0rIa/","content_html":"<p>手机竖屏 https://www.cunshao.com/666666/api/web.php</p><p>清晰横版 https://www.cunshao.com/666666/api/pc.php</p><p>歌唱 https://188sp.711888.xyz/188/video.php</p><p>http://api.mmp.cc/</p><p>聚合短视频，超多数据，无重复数据</p><p>https://api.mmp.cc/api/miss?type=mp4</p><p>http://api.mmp.cc/api/shortvideo?type=mp4</p><p>http://api.mmp.cc/api/ksvideo?id=jk&amp;type=mp4</p><p>http://api.mmp.cc/api/ksvideo?id=BaiSi&amp;type=mp4</p><p>http://api.mmp.cc/api/ksvideo?id=QingCun&amp;type=mp4</p><p><br></p><p>https://www.yviii.com/video/i.php（主页 https://www.yviii.com/video/）</p><p><br></p><p>最新JK</p><p>https://sbtxqq.com/api/jksp.php</p><p>晴天推荐</p><p>https://sbtxqq.com/api/qttj.php</p><p>图片</p><p>https://sbtxqq.com/api/sese.php</p>","content_text":"手机竖屏 https://www.cunshao.com/666666/api/web.php\n\n清晰横版 https://www.cunshao.com/666666/api/pc.php\n\n歌唱 https://188sp.711888.xyz/188/video.php\n\nhttp://api.mmp.cc/\n\n聚合短视频，超多数据，无重复数据\n\nhttps://api.mmp.cc/api/miss?type=mp4\n\nhttp://api.mmp.cc/api/shortvideo?type=mp4\n\nhttp://api.mmp.cc/api/ksvideo?id=jk&type=mp4\n\nhttp://api.mmp.cc/api/ksvideo?id=BaiSi&type=mp4\n\nhttp://api.mmp.cc/api/ksvideo?id=QingCun&type=mp4\n\n\n\n\nhttps://www.yviii.com/video/i.php（主页 https://www.yviii.com/video/）\n\n\n\n\n最新JK\n\nhttps://sbtxqq.com/api/jksp.php\n\n晴天推荐\n\nhttps://sbtxqq.com/api/qttj.php\n\n图片\n\nhttps://sbtxqq.com/api/sese.php","date_published":"2025-08-06T17:44:15.294Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/api-UOZgEjv0rIa/","json_url":"https://cms-dbdraws.pages.dev/i/UOZgEjv0rIa/json/","rss_url":"https://cms-dbdraws.pages.dev/i/UOZgEjv0rIa/rss/","guid":"UOZgEjv0rIa","status":"published","itunes:episodeType":"full","date_published_short":"Wed Aug 06 2025","date_published_ms":1754502255294}},{"id":"4ZjvkpwoyHX","title":"api数据提取示例","url":"https://cms.dbdraws.dpdns.org/i/apitiqu-4ZjvkpwoyHX/","content_html":"<head>\n  <meta charset=\"UTF-8\">\n  <title>视频播放示例</title>\n  <!-- 1. 导入jQuery（正规CDN） -->\n  <script src=\"https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js\"></script>\n</head>\n\n\n  <!-- 2. 视频播放区域（合规内容） -->\n  <div style=\"margin: 20px;\">\n    <h3>视频播放</h3>\n    <!-- 视频标签：controls=显示控制条，muted=静音（解决自动播放限制） -->\n    <video id=\"videoPlayer\" controls  autoplay style=\"width: 100%;\n            height: auto;\n            max-height: 80vh;\n            min-height: 250px;\n            max-height: 550px;\n            display: block;\">\n      <source src=\"\" type=\"video/mp4\"> <!-- 视频源（后续通过AJAX设置） -->\n      您的浏览器不支持HTML5视频，请升级浏览器。 <!-- 不支持时的提示 -->\n    </video>\n \n    <!-- 3. 播放按钮（需用户交互，符合浏览器政策） -->\n    <button id=\"playBtn\" disabled style=\"margin-top: 10px;\">\n      加载中...（请等待视频源设置）\n    </button>\n    <!-- 4. 状态提示（用于反馈错误） -->\n    <p id=\"statusText\" style=\"color: #666;\">未发起请求...</p>\n  </div>\n\n  <!-- 5. JavaScript逻辑（整合AJAX+视频播放） -->\n  <script>\n    $(document).ready(function() {\n      // 步骤1：发起AJAX请求（获取合法视频URL）\n      $.ajax({\n        url: 'https://v2.xxapi.cn/api/meinv', // 替换为你的合法自建接口（返回视频URL）\n        type: 'GET',\n        dataType: 'json',\n        beforeSend: function() {\n          // 请求中：更新状态提示\n          $('#statusText').text('正在请求视频URL...');\n        },\n        success: function(res) {\n          // 步骤2：判断请求成功（code=200）且视频URL合法\n          if (res.code === 200 && isLegalVideoUrl(res.data)) {\n            const videoPlayer = document.getElementById('videoPlayer');\n            const playBtn = document.getElementById('playBtn');\n            \n            // 步骤3：设置视频源（res.data是合法MP4 URL）\n            videoPlayer.src = res.data;\n            $('#statusText').text('视频URL获取成功，正在加载视频...');\n            \n            // 步骤4：处理视频加载事件（加载完成后启用播放按钮）\n            videoPlayer.addEventListener('loadedmetadata', function() {\n              playBtn.disabled = false;\n              playBtn.textContent = '点击播放视频（已加载）';\n              $('#statusText').text('视频加载完成，点击按钮播放...');\n            });\n            \n            // 步骤5：处理视频播放错误（如URL无效、格式不支持）\n            videoPlayer.addEventListener('error', function(e) {\n              playBtn.disabled = true;\n              playBtn.textContent = '视频播放失败';\n              $('#statusText').text('视频播放错误：' + getVideoErrorMsg(e));\n            });\n            \n            // 步骤6：用户点击播放按钮，开始播放（需用户交互）\n            playBtn.addEventListener('click', function() {\n              videoPlayer.play(); // 调用播放方法（符合浏览器政策）\n              $('#statusText').text('视频正在播放...');\n            });\n          } else {\n            // 请求失败：更新状态提示（如code≠200或URL非法）\n            $('#statusText').text('请求失败：' + (res.msg || '视频URL非法'));\n            $('#playBtn').text('请求失败，无法播放');\n          }\n        },\n        error: function(xhr, status, error) {\n          // 步骤7：处理AJAX请求错误（如网络断开、接口不存在）\n          $('#statusText').text('AJAX请求错误：' + error);\n          $('#playBtn').text('请求错误，无法播放');\n        }\n      });\n    });\n\n    // 辅助函数1：判断是否为合法视频URL（防止非法链接）\n    function isLegalVideoUrl(url) {\n      // 校验规则：HTTP/HTTPS开头，后缀为MP4（支持大多数浏览器）\n      const regex = /^(https?:\\/\\/)[\\w.-]+[\\w/-]*\\.mp4$/i;\n      return regex.test(url);\n    }\n\n    // 辅助函数2：获取视频播放错误信息（友好提示）\n    function getVideoErrorMsg(e) {\n      switch (e.target.error.code) {\n        case e.target.error.MEDIA_ERR_ABORTED:\n          return '视频播放被中止';\n        case e.target.error.MEDIA_ERR_NETWORK:\n          return '网络错误导致视频无法加载';\n        case e.target.error.MEDIA_ERR_DECODE:\n          return '视频解码错误（格式不支持）';\n        case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:\n          return '视频源不支持（URL无效或格式错误）';\n        default:\n          return '未知错误';\n      }\n    }\n  </script>\n  <button onclick=\"location.reload()\" style=\"\n    width:100%;\n    height:40px;\n    background:#1a38f9;\n    color:#fff;\n    border:0;\n    border-radius:5px;\n    cursor:pointer;\n    transition:background 0.3s;\n    font-weight:600\n  \" onmouseover=\"this.style.background='#0a28e9'\" \n    onmouseout=\"this.style.background='#1a38f9'\">\n    换一个视频\n  </button>","content_text":"视频播放示例\n\n\n视频播放\n\n您的浏览器不支持HTML5视频，请升级浏览器。 加载中...（请等待视频源设置）\n\n未发起请求...\n\n换一个视频","date_published":"2025-08-06T14:28:32.877Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/api-4ZjvkpwoyHX/","json_url":"https://cms-dbdraws.pages.dev/i/4ZjvkpwoyHX/json/","rss_url":"https://cms-dbdraws.pages.dev/i/4ZjvkpwoyHX/rss/","guid":"4ZjvkpwoyHX","status":"published","itunes:episodeType":"full","date_published_short":"Wed Aug 06 2025","date_published_ms":1754490512877}},{"id":"tcJ7R5g2Yrd","title":"测试HLS","url":"https://cms.dbdraws.dpdns.org/i/ceshihls-tcJ7R5g2Yrd/","content_html":"<head>\n    <title>HLS视频播放器 - 优化版</title>\n    <meta charset=\"UTF-8\">\n    <script src=\"https://cdn.jsdelivr.net/npm/hls.js@latest\"></script>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            margin: 0;\n            padding: 20px;\n            background: #f5f5f5;\n        }\n        .container {\n            max-width: 842px;\n            margin: 0 auto;\n            background: white;\n            padding: 20px;\n            border-radius: 8px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n        }\n        video {\n            width: 100%;\n            background: #000;\n            border-radius: 4px;\n        }\n        .status {\n            margin-top: 10px;\n            padding: 10px;\n            background: #f8f9fa;\n            border-radius: 4px;\n            font-size: 14px;\n        }\n        .error {\n            color: #dc3545;\n        }\n    </style>\n</head>\n    <div class=\"container\">\n        <h1>HLS视频播放器</h1>\n        <video id=\"video\" controls></video>\n        <div id=\"status\" class=\"status\">正在初始化播放器...</div>\n    </div>\n\n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            const video = document.getElementById('video');\n            const statusEl = document.getElementById('status');\n            const videoUrl = 'https://cdn2.hdys01.com/videos/2024/12/11/6758fb4ad00f6b30eb766757/3524c0/index.m3u8';\n\n            // 检测浏览器兼容性\n            if (!Hls.isSupported() && !video.canPlayType('application/vnd.apple.mpegurl')) {\n                statusEl.innerHTML = '<span class=\"error\">错误：您的浏览器不支持HLS视频播放。</span>';\n                return;\n            }\n\n            // 尝试播放\n            function playVideo() {\n                if (Hls.isSupported()) {\n                    const hls = new Hls({\n                        maxBufferLength: 30,      // 优化缓冲\n                        maxMaxBufferLength: 600,  // 防止卡顿\n                        enableWorker: true        // 使用Web Worker提升性能\n                    });\n                    \n                    hls.loadSource(videoUrl);\n                    hls.attachMedia(video);\n                    \n                    hls.on(Hls.Events.MANIFEST_PARSED, function() {\n                        statusEl.textContent = '视频已加载，正在播放...';\n                        video.play().catch(e => {\n                            statusEl.innerHTML = `<span class=\"error\">播放失败：${e.message}</span>`;\n                        });\n                    });\n                    \n                    hls.on(Hls.Events.ERROR, function(event, data) {\n                        let errorMsg = '加载视频失败';\n                        if (data.fatal) {\n                            switch(data.type) {\n                                case Hls.ErrorTypes.NETWORK_ERROR:\n                                    errorMsg = '网络错误，请检查链接或CORS设置';\n                                    break;\n                                case Hls.ErrorTypes.MEDIA_ERROR:\n                                    errorMsg = '视频解码错误';\n                                    hls.recoverMediaError(); // 尝试自动恢复\n                                    break;\n                                default:\n                                    errorMsg = '致命错误，无法播放';\n                                    hls.destroy();\n                                    break;\n                            }\n                        }\n                        statusEl.innerHTML = `<span class=\"error\">${errorMsg}</span>`;\n                    });\n                } else {\n                    // Safari等原生支持HLS的浏览器\n                    video.src = videoUrl;\n                    video.addEventListener('loadedmetadata', function() {\n                        statusEl.textContent = '视频已加载，正在播放...';\n                        video.play().catch(e => {\n                            statusEl.innerHTML = `<span class=\"error\">播放失败：${e.message}</span>`;\n                        });\n                    });\n                    video.addEventListener('error', function() {\n                        statusEl.innerHTML = '<span class=\"error\">视频加载失败（可能是CORS问题）</span>';\n                    });\n                }\n            }\n\n            // 用户交互后尝试播放（解决浏览器自动播放策略）\n            document.body.addEventListener('click', function init() {\n                playVideo();\n                document.body.removeEventListener('click', init);\n            }, { once: true });\n\n            statusEl.textContent = '点击页面任意位置开始加载视频...';\n        });\n    </script>","content_text":"HLS视频播放器 - 优化版\n\n\nHLS视频播放器\n\n正在初始化播放器...","date_published":"2025-08-06T10:48:20.392Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/hls-tcJ7R5g2Yrd/","json_url":"https://cms-dbdraws.pages.dev/i/tcJ7R5g2Yrd/json/","rss_url":"https://cms-dbdraws.pages.dev/i/tcJ7R5g2Yrd/rss/","guid":"tcJ7R5g2Yrd","status":"published","itunes:episodeType":"full","date_published_short":"Wed Aug 06 2025","date_published_ms":1754477300392}},{"id":"RNmnn6KiEHE","title":"LAFBD-041 Laforet Girl Vol.41 天使与恶魔(Blu-ray 版)-大桥未久","url":"https://cms.dbdraws.dpdns.org/i/RNmnn6KiEHE/","content_html":" <style>\n        body {\n            font-family: Arial, sans-serif;\n            line-height: 1.6;\n           //max-width: 800px;\n            margin: 0 auto;\n            padding: 15px;\n        }\n        .magnet-link {\n            background-color: #f5f5f5;\n            padding: 12px;\n            border-radius: 6px;\n            margin-bottom: 15px;\n            word-break: break-all;\n        }\n        .center {\n            text-align: center;\n        }\n        details {\n            margin: 0;\n            border: 1px solid #ddd;\n            border-radius: 8px;\n            overflow: hidden;\n            margin-bottom: 15px;\n        }\n        summary {\n            padding: 10px;\n            background: #f0f0f0;\n            cursor: pointer;\n            font-weight: bold;\n        }\n        iframe {\n            width: 100%;\n            height: 100%;\n            border: none;\n            aspect-ratio: 16/9;\n        }\n    </style>\n<h1  style=\"margin-bottom: 20px;\">LAFBD-041 Laforet Girl Vol.41 天使与恶魔(Blu-ray 版)-大桥未久</h1>\n    <a href=\"https://missav123.com/cn/search/LAF-41\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: inline-block; padding: 8px 16px; background: #007bff; color: white; text-decoration: none; border-radius: 4px;margin-bottom: 20px;\">访问原网站</a>\n    </br>\n    <img src=\"https://fourhoi.com/laf-041/cover-n.jpg\" alt=\"海报\" width=\"300\">\n    <p>分类：中字无码 | 日期：2015-01-09 | 时长：121分钟</p>\n<div style=\"\ndisplay: flex;\nflex-wrap: wrap;\njustify-content:center;\nalign-items: center;\ngap: 10px;\nborder: 1px dashed #ccc;\npadding: 10px;\n\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_0.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_1.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_2.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_3.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_4.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_5.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_6.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_7.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_8.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_9.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_10.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_11.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_12.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_13.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_14.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_15.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_16.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_17.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_18.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_19.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_20.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_21.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_22.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_23.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_24.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_25.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_26.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_27.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_28.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_29.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_30.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_31.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_32.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_33.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_34.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_35.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_36.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_37.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_38.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_39.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_40.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_41.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_42.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_43.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_44.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_45.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_46.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_47.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_48.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_49.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n<img loading=\"lazy\" src=\"https://c0.jdbstatic.com/samples/78/78vkJ_l_50.jpg\" alt=\"图片1\" style=\"height: 100px;aspect-ratio: 750/422;object-fit: contain;\">\n</div><br>\n\n\n    <h2>磁力链接1（BD Remux 提取）【19.53G】</h2>\n    <div class=\"magnet-link\">\n        magnet:?xt=urn:btih:209681b407c7b3d5cfe71c8bf9f313ee6f2b98e7&dn=LaForet Girl 41 Angel and Devil (LAFBD-41)[BD Remux].mkv\n    </div>\n\n    <h2>磁力链接2（1080P+加速）【8G】</h2>\n    <div class=\"magnet-link\">\n        magnet:?xt=urn:btih:8b8a0fcf347b490f3bacef5a72ce04b3b0253523&dn=[JAV] [Uncensored] LAFBD-41 [1080p]\n    </div>\n\n    <hr>\n\n    <div class=\"center\">\n        <h3>👇在线播放（仅支持手机）👇</h3>\n    </div>\n\n    <details>\n        <summary>点击展开线路1（无码720P）</summary>\n        <iframe \n            src=\"https://surrit.com/77a07363-7c38-4678-88dc-43355939e727/720p/video.m3u8\"\n            frameborder=\"0\"\n            allowfullscreen\n            loading=\"lazy\"\n        ></iframe>\n    </details>\n\n    <details>\n        <summary>点击展开线路2（发行480P）</summary>\n        <iframe \n            src=\"https://surrit.com/20e9f6ca-0679-4cf4-86df-b29a0321eeb9/842x480/video.m3u8\"\n            frameborder=\"0\"\n            allowfullscreen\n            loading=\"lazy\"\n        ></iframe>\n    </details>","content_text":"LAFBD-041 LAFORET GIRL VOL.41 天使与恶魔(BLU-RAY 版)-大桥未久\n\n访问原网站\n海报 [https://fourhoi.com/laf-041/cover-n.jpg]\n\n分类：中字无码 | 日期：2015-01-09 | 时长：121分钟\n\n图片1 [https://c0.jdbstatic.com/samples/78/78vkJ_l_0.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_1.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_2.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_3.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_4.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_5.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_6.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_7.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_8.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_9.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_10.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_11.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_12.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_13.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_14.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_15.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_16.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_17.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_18.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_19.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_20.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_21.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_22.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_23.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_24.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_25.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_26.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_27.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_28.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_29.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_30.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_31.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_32.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_33.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_34.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_35.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_36.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_37.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_38.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_39.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_40.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_41.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_42.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_43.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_44.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_45.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_46.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_47.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_48.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_49.jpg] 图片1\n[https://c0.jdbstatic.com/samples/78/78vkJ_l_50.jpg]\n\n\n\n磁力链接1（BD REMUX 提取）【19.53G】\n\nmagnet:?xt=urn:btih:209681b407c7b3d5cfe71c8bf9f313ee6f2b98e7&dn=LaForet Girl 41\nAngel and Devil (LAFBD-41)[BD Remux].mkv\n\n\n磁力链接2（1080P+加速）【8G】\n\nmagnet:?xt=urn:btih:8b8a0fcf347b490f3bacef5a72ce04b3b0253523&dn=[JAV]\n[Uncensored] LAFBD-41 [1080p]\n\n--------------------------------------------------------------------------------\n\n\n👇在线播放（仅支持手机）👇\n\n点击展开线路1（无码720P） 点击展开线路2（发行480P）","date_published":"2025-08-06T10:36:41.962Z","_microfeed":{"web_url":"https://cms-dbdraws.pages.dev/i/lafbd-041-laforet-girl-vol41-blu-ray-RNmnn6KiEHE/","json_url":"https://cms-dbdraws.pages.dev/i/RNmnn6KiEHE/json/","rss_url":"https://cms-dbdraws.pages.dev/i/RNmnn6KiEHE/rss/","guid":"RNmnn6KiEHE","status":"published","itunes:episodeType":"full","date_published_short":"Wed Aug 06 2025","date_published_ms":1754476601962}}],"_microfeed":{"microfeed_version":"0.1.5","base_url":"https://cms-dbdraws.pages.dev","categories":[],"subscribe_methods":[{"name":"JSON","type":"json","url":"https://cms-dbdraws.pages.dev/json/","image":"https://cms-dbdraws.pages.dev/assets/brands/subscribe/json.png","enabled":true,"editable":false,"id":"p0wHIR3D42R"},{"name":"友情链接","type":"google podcasts","url":"https://blog.dbdraws.dpdns.org/friends","image":"https://cms-dbdraws.pages.dev/assets/brands/subscribe/google.png","enabled":true,"editable":true,"id":"BRWdIXxcFlR"}],"description_text":"这是一款轻量级的内容管理系统（CMS），可自行托管于Cloudflare平台。通过microfeed，您能够便捷地发布多种形式的内容——包括音频、视频、照片、文档、博客文章及外部链接，并以网页、RSS订阅和JSON格式输出信息流。","copyright":"Copyright © DBD制作组.2026","itunes:type":"episodic","items_sort_order":"newest_first"}}