{"version":"https://jsonfeed.org/version/1.1","title":"DBD-raws","home_page_url":"https://cms.dbdraws.dpdns.org","feed_url":"https://cms.dbdraws.dpdns.org/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.dpdns.org/assets/default/channel-image.png","favicon":"https://cms.dbdraws.dpdns.org/assets/default/favicon.png","authors":[{"name":"DBD制作组"}],"language":"zh-cn","items":[{"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.dpdns.org/i/qq-4RD38BQzpxh/","json_url":"https://cms.dbdraws.dpdns.org/i/4RD38BQzpxh/json/","rss_url":"https://cms.dbdraws.dpdns.org/i/4RD38BQzpxh/rss/","guid":"4RD38BQzpxh","status":"published","itunes:episodeType":"full","date_published_short":"Fri Aug 15 2025","date_published_ms":1755241374807}}],"_microfeed":{"microfeed_version":"0.1.5","base_url":"https://cms.dbdraws.dpdns.org","categories":[],"subscribe_methods":[{"name":"JSON","type":"json","url":"https://cms.dbdraws.dpdns.org/json/","image":"https://cms.dbdraws.dpdns.org/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.dpdns.org/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"}}