<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>白鹿原嚒</title><description>白鹿原嚒的小站</description><link>https://blog.blym.top/</link><language>zh_CN</language><item><title>网站更新历史</title><link>https://blog.blym.top/posts/update/</link><guid isPermaLink="true">https://blog.blym.top/posts/update/</guid><description>彳尔女子，这是一条网站更新历史文章</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;网站更新日志&lt;/h1&gt;
&lt;p&gt;本文记录了博客的每一次更新。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2026-02-26&lt;/h2&gt;
&lt;h3&gt;新增功能&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;edgeone page自动部署&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优化了edgeone page的部署流程&lt;/li&gt;
&lt;li&gt;支持自动部署到edgeone page&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;移除了Netlify 部署支持&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将Netlify 部署转为edgeone page部署&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;2026-02-25&lt;/h2&gt;
&lt;h3&gt;新增功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Actions 自动部署&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;配置了 GitHub Actions 自动构建部署&lt;/li&gt;
&lt;li&gt;推送到 main 分支自动构建部署到 GitHub Pages&lt;/li&gt;
&lt;li&gt;支持绑定自定义域名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Netlify 部署支持&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加 netlify.toml 配置文件&lt;/li&gt;
&lt;li&gt;支持一键部署到 Netlify&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;域名切换组件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;侧边栏显示当前访问域名&lt;/li&gt;
&lt;li&gt;显示多个域名：主站（blog.blym.top、blog.119567.xyz）和备用站（hengduan.dpdns.org、hengduan.de5.net）&lt;/li&gt;
&lt;li&gt;实时显示各域名的网络延迟&lt;/li&gt;
&lt;li&gt;当前访问的域名自动高亮显示&lt;/li&gt;
&lt;li&gt;点击在当前标签页切换域名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不蒜子统计接入&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;侧边栏 Profile 区域显示今日访问量和今日访客数&lt;/li&gt;
&lt;li&gt;页脚显示今日访问、今日访客、总访问、总访客&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;移动端布局优化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;侧边栏功能移至移动端顶部&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分类排序优化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;未分类分类默认放在最底部&lt;/li&gt;
&lt;li&gt;其他分类按字母顺序排列&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;功能优化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;主题设置面板优化&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;主题切换按钮添加背景模糊效果&lt;/li&gt;
&lt;li&gt;彩虹模式支持实时调节颜色变换速率&lt;/li&gt;
&lt;li&gt;主题色滑块实时生效&lt;/li&gt;
&lt;li&gt;统一按钮点击状态视觉反馈&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;2026-02-24&lt;/h2&gt;
&lt;h3&gt;新增功能&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;评论系统&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;集成了 Giscus 评论系统&lt;/li&gt;
&lt;li&gt;支持亮/暗主题切换&lt;/li&gt;
&lt;li&gt;位于文章末尾&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文章末尾固定内容&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 编辑链接&lt;/li&gt;
&lt;li&gt;文章修订历史&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;侧边栏 Profile 组件升级&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;头像改为圆形样式&lt;/li&gt;
&lt;li&gt;显示文章统计数据（文章数、总字数）&lt;/li&gt;
&lt;li&gt;集成社交平台链接入口（GitHub、Gitee、Bilibili）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文章更新检测功能&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;右下角小铃铛组件&lt;/li&gt;
&lt;li&gt;自动检测 RSS 订阅，发现新文章或更新时通知&lt;/li&gt;
&lt;li&gt;支持查看文章变更内容（DIFF 显示）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文章置顶功能&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持在文章 frontmatter 中添加 &lt;code&gt;pinned: true&lt;/code&gt; 置顶文章&lt;/li&gt;
&lt;li&gt;置顶文章显示&quot;置顶&quot;标签&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;主题切换同步修复&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修复了主题切换功能与亮/暗主题切换不同步的问题&lt;/li&gt;
&lt;li&gt;建立了单一的主题状态源&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;默认主题色修改&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认主题色从 250（青色）改为 120（绿色）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;历史&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2026-02-23：博客上线&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>一言</title><link>https://blog.blym.top/posts/yiyan/</link><guid isPermaLink="true">https://blog.blym.top/posts/yiyan/</guid><pubDate>Sat, 17 May 2025 09:49:00 GMT</pubDate><content:encoded>&lt;h1&gt;每日一言&lt;/h1&gt;
&lt;p&gt;&amp;lt;p id=&quot;hitokoto&quot;&amp;gt;
&amp;lt;a href=&quot;#&quot; id=&quot;hitokoto_text&quot;&amp;gt;:D 获取中...&amp;lt;/a&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;script&amp;gt;
fetch(&apos;https://v1.hitokoto.cn&apos;)
.then(response =&amp;gt; response.json())
.then(data =&amp;gt; {
const hitokoto = document.querySelector(&apos;#hitokoto_text&apos;)
hitokoto.href = &lt;code&gt;https://hitokoto.cn/?uuid=${data.uuid}&lt;/code&gt;
hitokoto.innerText = data.hitokoto
})
.catch(console.error)
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;h1&gt;每日诗句&lt;/h1&gt;
&lt;p&gt;&amp;lt;span id=&quot;jinrishici-sentence&quot;&amp;gt;正在加载今日诗词....&amp;lt;/span&amp;gt;
&amp;lt;script src=&quot;https://sdk.jinrishici.com/v2/browser/jinrishici.js&quot; charset=&quot;utf-8&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>分享一篇网上很有趣的文章</title><link>https://blog.blym.top/posts/post-1/</link><guid isPermaLink="true">https://blog.blym.top/posts/post-1/</guid><description>爱意落山河，满纸尽遗憾</description><pubDate>Sat, 14 Mar 2026 23:32:00 GMT</pubDate><content:encoded>&lt;h2&gt;最近看到网上一篇很有趣的文章，于是给它复制过来了&lt;/h2&gt;
&lt;h3&gt;这里呢，是它的摘要&lt;/h3&gt;
&lt;h5&gt;“爱意落山河，满纸尽遗憾”，道尽了单恋最极致的孤独与悲凉。本研究 通过对单向心动、默默付出、自我感动三种情感形态的深度解构，揭示了 “我 满腔热忱，你毫不知情” 的情感困境。本文提出：有一种爱情，从始至终只有 一个人；有一种心动，从开始就注定是结局。它是一个人的兵荒马乱，一个人的 春夏秋冬，一个人的悲欢离合。你把 TA 当成人生的全部，TA 却从未知道你的 存在；你为 TA 耗尽所有温柔，TA 却从未给过一丝回应。&lt;/h5&gt;
&lt;h3&gt;原文呢，各位就去末尾的链接中看吧&lt;/h3&gt;
&lt;h4&gt;最后，也就是结尾，送给各位一句话&lt;/h4&gt;
&lt;p&gt;愿你，此后余生，有爱可期，有人懂你，深情不再枉付，心动皆有回应，爱意不 落山河，余生再无遗憾。&lt;/p&gt;
&lt;p&gt;[王老师, 龙老师, 邹老师 (2026). 爱意落山河，满纸尽遗憾. Rubbish]:&lt;a href=&quot;https://rubbish-journal.org/zh/articles/0d661320-cc51-4e0c-a059-cc6fc2775c23&quot;&gt;爱意落山河，满纸尽遗憾 - Rubbish — An Interdisciplinary Journal&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>视奸我 - 网易云音乐播放状态展示</title><link>https://blog.blym.top/posts/project-1/</link><guid isPermaLink="true">https://blog.blym.top/posts/project-1/</guid><description>视奸我 - 网易云音乐播放状态展示的README文档。</description><pubDate>Fri, 27 Feb 2026 05:05:00 GMT</pubDate><content:encoded>&lt;h1&gt;视奸我 - 网易云音乐播放状态展示&lt;/h1&gt;
&lt;p&gt;将网易云音乐播放状态实时展示在个人主页上。&lt;/p&gt;
&lt;h2&gt;项目结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;shijian-music/
├── api/                    # API 调试工具
│   ├── music.php       # 音乐数据 API
│   └── debug.html          # 可视化调试面板
└── shijianwomusic/         # BetterNCM 插件
    ├── src/main.tsx        # 插件源码
    └── dist/               # 构建输出（安装此目录）
        ├── main.js
        └── manifest.json
        └──	shijianwo.plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;快速开始&lt;/h2&gt;
&lt;h3&gt;1. 环境要求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PHP 7.4+&lt;/li&gt;
&lt;li&gt;Web 服务器 (Apache/Nginx)&lt;/li&gt;
&lt;li&gt;Node.js（用于构建插件）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/std-microblock/BetterNCM&quot;&gt;BetterNCM&lt;/a&gt; &amp;gt;= 0.2.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 构建插件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cd shijianwomusic
npm install
npm run build
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 安装 BetterNCM 插件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装 &lt;a href=&quot;https://github.com/std-microblock/BetterNCM&quot;&gt;BetterNCM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在 BetterNCM 设置中点击 &quot;Open Folder&quot; 打开数据目录&lt;/li&gt;
&lt;li&gt;创建 &lt;code&gt;plugins_dev&lt;/code&gt; 文件夹（如果不存在）&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;shijianwomusic/dist&lt;/code&gt; 目录内的文件复制到 &lt;code&gt;plugins_dev/shijianwo-music/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重启网易云音乐&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目录结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BetterNCM/
└── plugins_dev/
    └── shijianwo-music/
        ├── main.js
        └── manifest.json
        └──	shijianwo.plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 配置插件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开网易云音乐&lt;/li&gt;
&lt;li&gt;点击右上角 BetterNCM 图标&lt;/li&gt;
&lt;li&gt;找到 &quot;视奸我-网易云插件&quot;&lt;/li&gt;
&lt;li&gt;点击配置按钮，输入 API 地址：&lt;pre&gt;&lt;code&gt;http://your-domain.com/music.php
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;保存配置&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5. 部署主页&lt;/h3&gt;
&lt;p&gt;将 &lt;code&gt;my-index&lt;/code&gt; 目录上传到 Web 服务器即可。&lt;/p&gt;
&lt;h2&gt;API 接口&lt;/h2&gt;
&lt;h3&gt;基础 URL&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;http://your-domain.com/music.php
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;接口列表&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;接口&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?action=current&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取完整播放信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?action=song&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;仅获取歌曲信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?action=progress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;仅获取播放进度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?action=lyrics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;仅获取歌词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?action=status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取播放状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?action=health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;健康检查&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;POST 更新数据&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;POST /music.php?action=update
Content-Type: application/json

{
  &quot;playing&quot;: {
    &quot;isPlaying&quot;: true,
    &quot;song&quot;: {...},
    &quot;progress&quot;: {...},
    &quot;lyrics&quot;: {...}
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;调试工具&lt;/h2&gt;
&lt;p&gt;访问 &lt;code&gt;http://your-domain.com/api/debug.html&lt;/code&gt; 可视化查看 API 数据。&lt;/p&gt;
&lt;h2&gt;功能特点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;实时同步播放状态&lt;/li&gt;
&lt;li&gt;显示歌曲名称、艺术家、专辑&lt;/li&gt;
&lt;li&gt;播放进度条实时更新&lt;/li&gt;
&lt;li&gt;歌词预览&lt;/li&gt;
&lt;li&gt;响应式设计，支持移动端&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;插件列表中看不到插件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;确保安装的是 &lt;code&gt;dist&lt;/code&gt; 目录内的文件&lt;/li&gt;
&lt;li&gt;确保 &lt;code&gt;manifest.json&lt;/code&gt; 和 &lt;code&gt;main.js&lt;/code&gt; 在同一目录&lt;/li&gt;
&lt;li&gt;重启网易云音乐客户端&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;配置按钮无响应&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;按 F12 打开开发者工具&lt;/li&gt;
&lt;li&gt;查看控制台是否有错误&lt;/li&gt;
&lt;li&gt;确保 BetterNCM 版本 &amp;gt;= 0.2.5&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;API 连接失败&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;检查 API 地址是否正确&lt;/li&gt;
&lt;li&gt;确保 PHP 服务器正常运行&lt;/li&gt;
&lt;li&gt;检查跨域配置&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;歌曲信息为空&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;确保网易云音乐正在播放歌曲&lt;/li&gt;
&lt;li&gt;按 F12 查看控制台日志&lt;/li&gt;
&lt;li&gt;检查 BetterNCM API 是否正常返回数据&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;demo展示&lt;/h2&gt;
&lt;h4&gt;这里演示的是直接调用我自己的api，api仅提供数据，播放器显示功能需要自己写&lt;/h4&gt;
&lt;p&gt;&amp;lt;style&amp;gt;
.music-player {
background: var(--card-bg, #fff);
border-radius: 12px;
padding: 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.music-player .title {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
margin-bottom: 12px;
}
.music-player .status-dot {
margin-left: auto;
width: 8px;
height: 8px;
border-radius: 50%;
background: #9ca3af;
}
.music-player .status-dot.playing {
background: #22c55e;
animation: statusPulse 2s ease-in-out infinite;
}
@keyframes statusPulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.music-player .content {
display: flex;
gap: 16px;
}
.music-player .cover {
width: 80px;
height: 80px;
border-radius: 8px;
overflow: hidden;
background: #f3f4f6;
flex-shrink: 0;
}
.music-player .cover img {
width: 100%;
height: 100%;
object-fit: cover;
}
.music-player .cover-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: #9ca3af;
}
.music-player .info {
flex: 1;
min-width: 0;
}
.music-player .song-title {
font-weight: 600;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.music-player .artist, .music-player .album {
font-size: 12px;
color: #6b7280;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.music-player .progress-container {
margin-top: 8px;
}
.music-player .progress-bar {
width: 100%;
height: 4px;
background: #e5e7eb;
border-radius: 2px;
overflow: hidden;
}
.music-player .progress-fill {
height: 100%;
background: #22c55e;
border-radius: 2px;
transition: width 0.3s;
}
.music-player .time {
display: flex;
justify-content: space-between;
font-size: 11px;
color: #9ca3af;
margin-top: 4px;
}
.music-player .lyrics {
margin-top: 8px;
font-size: 12px;
color: #6b7280;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
&amp;lt;/style&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;section class=&quot;music-player&quot; id=&quot;section-music&quot;&amp;gt;
&amp;lt;div class=&quot;title&quot;&amp;gt;
&amp;lt;span&amp;gt;🎵&amp;lt;/span&amp;gt;
&amp;lt;span id=&quot;music-section-title&quot;&amp;gt;正在播放&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;status-dot&quot; id=&quot;music-status-dot&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;content&quot;&amp;gt;
&amp;lt;div class=&quot;cover&quot; id=&quot;music-cover-wrapper&quot;&amp;gt;
&amp;lt;img id=&quot;music-cover&quot; src=&quot;&quot; alt=&quot;封面&quot; style=&quot;display:none;&quot;&amp;gt;
&amp;lt;div class=&quot;cover-placeholder&quot; id=&quot;music-cover-placeholder&quot;&amp;gt;
&amp;lt;span&amp;gt;🎵&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;info&quot;&amp;gt;
&amp;lt;div class=&quot;song-title&quot; id=&quot;music-title&quot;&amp;gt;未在播放&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;artist&quot; id=&quot;music-artist&quot;&amp;gt;-&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;album&quot; id=&quot;music-album&quot;&amp;gt;-&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;progress-container&quot;&amp;gt;
&amp;lt;div class=&quot;progress-bar&quot;&amp;gt;
&amp;lt;div class=&quot;progress-fill&quot; id=&quot;music-progress-bar&quot; style=&quot;width:0%&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;time&quot;&amp;gt;
&amp;lt;span id=&quot;music-current-time&quot;&amp;gt;00:00&amp;lt;/span&amp;gt;
&amp;lt;span id=&quot;music-duration&quot;&amp;gt;00:00&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;lyrics&quot; id=&quot;music-lyrics-wrapper&quot; style=&quot;display:none;&quot;&amp;gt;
&amp;lt;p id=&quot;music-lyrics&quot;&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;script&amp;gt;
(function() {
const API_URL = &apos;https://blym.top/music.php&apos;;
let lastMusicData = null;
let lastUpdateTime = 0;
let lastProgressTime = Date.now();
let lastProgressValue = -1;
const PAUSE_THRESHOLD = 10000;
const NOT_PLAYING_THRESHOLD = 30 * 60 * 1000;
const PROGRESS_CHANGE_THRESHOLD = 1000;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function formatTime(seconds) {
    const mins = Math.floor(seconds / 60);
    const secs = Math.floor(seconds % 60);
    return mins.toString().padStart(2, &apos;0&apos;) + &apos;:&apos; + secs.toString().padStart(2, &apos;0&apos;);
}

function showNotPlaying() {
    const dot = document.getElementById(&apos;music-status-dot&apos;);
    const title = document.getElementById(&apos;music-section-title&apos;);
    const songTitle = document.getElementById(&apos;music-title&apos;);
    const artist = document.getElementById(&apos;music-artist&apos;);
    const album = document.getElementById(&apos;music-album&apos;);
    const cover = document.getElementById(&apos;music-cover&apos;);
    const coverPlaceholder = document.getElementById(&apos;music-cover-placeholder&apos;);
    const progressBar = document.getElementById(&apos;music-progress-bar&apos;);
    const currentTime = document.getElementById(&apos;music-current-time&apos;);
    const duration = document.getElementById(&apos;music-duration&apos;);
    const lyricsWrapper = document.getElementById(&apos;music-lyrics-wrapper&apos;);

    if (dot) { dot.className = &apos;status-dot&apos;; }
    if (title) title.textContent = &apos;未在播放&apos;;
    if (songTitle) songTitle.textContent = &apos;未在播放&apos;;
    if (artist) artist.textContent = &apos;-&apos;;
    if (album) album.textContent = &apos;-&apos;;
    if (cover) cover.style.display = &apos;none&apos;;
    if (coverPlaceholder) coverPlaceholder.style.display = &apos;flex&apos;;
    if (progressBar) progressBar.style.width = &apos;0%&apos;;
    if (currentTime) currentTime.textContent = &apos;00:00&apos;;
    if (duration) duration.textContent = &apos;00:00&apos;;
    if (lyricsWrapper) lyricsWrapper.style.display = &apos;none&apos;;
}

function showPaused() {
    const dot = document.getElementById(&apos;music-status-dot&apos;);
    if (dot) dot.className = &apos;status-dot&apos;;
}

function updateLocalProgress() {
    if (!lastMusicData || !lastMusicData.playing) return;

    const now = Date.now();
    const timeSinceProgressChange = now - lastProgressTime;

    if (timeSinceProgressChange &amp;gt; NOT_PLAYING_THRESHOLD) {
        showNotPlaying();
        return;
    }

    if (timeSinceProgressChange &amp;gt; PAUSE_THRESHOLD) {
        showPaused();
        return;
    }

    if (!lastMusicData.playing.isPlaying) return;

    const progress = lastMusicData.playing.progress || {};
    const elapsedMs = now - lastUpdateTime;

    if (elapsedMs &amp;gt; 30000) return;

    const currentMs = (progress.currentTime || 0) + elapsedMs;
    const durationMs = progress.duration || 1;
    const percent = Math.min(100, Math.max(0, (currentMs / durationMs) * 100));

    const progressBar = document.getElementById(&apos;music-progress-bar&apos;);
    const currentTimeEl = document.getElementById(&apos;music-current-time&apos;);

    if (progressBar) progressBar.style.width = percent + &apos;%&apos;;
    if (currentTimeEl) currentTimeEl.textContent = formatTime(currentMs / 1000);
}

function updateMusic() {
    fetch(API_URL + &apos;?action=current&apos;)
        .then(res =&amp;gt; res.json())
        .then(response =&amp;gt; {
            const data = response.data;
            if (!data || !data.playing) return;

            const now = Date.now();
            const rawProgress = data.playing.progress?.currentTime || 0;
            const currentProgress = Math.floor(rawProgress / PROGRESS_CHANGE_THRESHOLD);
            
            if (currentProgress !== lastProgressValue) {
                lastProgressTime = now;
                lastProgressValue = currentProgress;
            }

            lastMusicData = data;
            lastUpdateTime = now;

            const song = data.playing.song || {};
            const progress = data.playing.progress || {};
            const lyrics = data.playing.lyrics || {};
            const isPlaying = data.playing.isPlaying || false;

            const timeSinceProgressChange = now - lastProgressTime;
            const isPaused = timeSinceProgressChange &amp;gt; PAUSE_THRESHOLD;
            const isNotPlaying = timeSinceProgressChange &amp;gt; NOT_PLAYING_THRESHOLD;

            if (isNotPlaying) {
                showNotPlaying();
                return;
            }

            const dot = document.getElementById(&apos;music-status-dot&apos;);
            const title = document.getElementById(&apos;music-section-title&apos;);
            const songTitle = document.getElementById(&apos;music-title&apos;);
            const artist = document.getElementById(&apos;music-artist&apos;);
            const album = document.getElementById(&apos;music-album&apos;);
            const cover = document.getElementById(&apos;music-cover&apos;);
            const coverPlaceholder = document.getElementById(&apos;music-cover-placeholder&apos;);
            const progressBar = document.getElementById(&apos;music-progress-bar&apos;);
            const currentTime = document.getElementById(&apos;music-current-time&apos;);
            const duration = document.getElementById(&apos;music-duration&apos;);
            const lyricsWrapper = document.getElementById(&apos;music-lyrics-wrapper&apos;);
            const lyricsEl = document.getElementById(&apos;music-lyrics&apos;);

            if (title) {
                title.textContent = (isPlaying &amp;amp;&amp;amp; !isPaused) ? &apos;正在播放&apos; : &apos;已暂停&apos;;
            }

            if (dot) {
                if (isPlaying &amp;amp;&amp;amp; !isPaused) {
                    dot.className = &apos;status-dot playing&apos;;
                } else {
                    dot.className = &apos;status-dot&apos;;
                }
            }

            if (songTitle) songTitle.textContent = song.name || &apos;未在播放&apos;;
            if (artist) {
                const artists = song.artists || [];
                artist.textContent = artists.length &amp;gt; 0 ? artists.join(&apos; / &apos;) : &apos;-&apos;;
            }
            if (album) album.textContent = song.album?.name || &apos;-&apos;;

            if (cover &amp;amp;&amp;amp; coverPlaceholder) {
                if (song.album?.cover) {
                    cover.src = song.album.cover;
                    cover.style.display = &apos;block&apos;;
                    coverPlaceholder.style.display = &apos;none&apos;;
                } else {
                    cover.style.display = &apos;none&apos;;
                    coverPlaceholder.style.display = &apos;flex&apos;;
                }
            }

            if (progressBar) progressBar.style.width = (progress.percent || 0) + &apos;%&apos;;
            if (currentTime) currentTime.textContent = progress.formattedCurrentTime || &apos;00:00&apos;;
            if (duration) duration.textContent = progress.formattedDuration || &apos;00:00&apos;;

            if (lyricsWrapper &amp;amp;&amp;amp; lyricsEl) {
                if (lyrics.available &amp;amp;&amp;amp; lyrics.raw) {
                    lyricsEl.textContent = lyrics.raw.substring(0, 100);
                    lyricsWrapper.style.display = &apos;block&apos;;
                } else {
                    lyricsWrapper.style.display = &apos;none&apos;;
                }
            }
        })
        .catch(() =&amp;gt; {
            const dot = document.getElementById(&apos;music-status-dot&apos;);
            if (dot) dot.className = &apos;status-dot&apos;;
        });
}

updateMusic();
setInterval(updateMusic, 1000);
setInterval(updateLocalProgress, 100);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;})();
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;h2&gt;温馨提醒&lt;/h2&gt;
&lt;h3&gt;本项目使用AI进行开发&lt;/h3&gt;
&lt;h2&gt;许可证&lt;/h2&gt;
&lt;p&gt;MIT License&lt;/p&gt;
</content:encoded></item><item><title>文章更新提醒功能食用指南 - 超级牛逼！</title><link>https://blog.blym.top/posts/post-diff-guide/</link><guid isPermaLink="true">https://blog.blym.top/posts/post-diff-guide/</guid><description>也就是右下角那个超级牛逼的小铃铛，到底该怎么用？</description><pubDate>Sun, 22 Feb 2026 01:32:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;没错，就是你现在看到的右下角那个并不起眼的小铃铛。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你可能已经注意到了，最近博客右下角多了一个小铃铛图标。这并不是什么订阅推送（虽然它长得很像），而是一个&lt;strong&gt;基于客户端的文章更新检测系统&lt;/strong&gt;。&lt;/p&gt;
&lt;h1&gt;为什么要搞这个？&lt;/h1&gt;
&lt;p&gt;很多时候，我们写完一篇文章后，可能会发现有错别字，或者某些观点需要补充，甚至是因为某些原因需要删改内容。&lt;/p&gt;
&lt;p&gt;对于读者（也就是你）来说，如果你之前看过这篇文章，再次点进来时，可能很难发现到底哪里变了。是改了个标点？还是加了一大段干货？&lt;/p&gt;
&lt;p&gt;为了解决这个“找不同”的难题，我们引入了这个功能。它会记录你上次访问时的文章版本，并在你下次访问时，自动对比服务器上的最新版本，告诉你：&lt;strong&gt;这篇文章变了，具体变在哪。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;食用方法&lt;/h1&gt;
&lt;p&gt;其实非常简单，整个流程完全自动化，不需要你手动做任何操作。&lt;/p&gt;
&lt;h2&gt;1. 发现更新&lt;/h2&gt;
&lt;p&gt;当你浏览博客时，系统会自动在后台获取最新的 RSS 订阅源，并与你本地缓存的文章记录进行比对。&lt;/p&gt;
&lt;p&gt;如果发现了有文章更新（无论是内容、标题还是描述），右下角的小铃铛就会出现一个&lt;strong&gt;红点&lt;/strong&gt;，并且会有一个入场动画提醒你“有新东西了”。&lt;/p&gt;
&lt;h2&gt;2. 查看列表&lt;/h2&gt;
&lt;p&gt;点击小铃铛，会弹出一个面板，列出所有有变动的文章。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;新文章&lt;/strong&gt;：带有一个绿色的 &lt;code&gt;NEW&lt;/code&gt; 标签，表示这是你上次访问以来新发布的文章。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新&lt;/strong&gt;：带有一个蓝色的 &lt;code&gt;UPDATE&lt;/code&gt; 标签，表示这篇文章你之前可能看过（或者它存在于你的缓存中），但现在它有了新的变化。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 查看 DIFF&lt;/h2&gt;
&lt;p&gt;这是最核心的功能。点击带有 &lt;code&gt;UPDATE&lt;/code&gt; 标签的文章标题，浏览器会直接跳转到该文章，并自动滚动到&lt;strong&gt;第一个变更点&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在文章正文中，你会看到类似代码编辑器的 DIFF 效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;span style=&quot;color:rgb(220 38 38);text-decoration:line-through&quot;&amp;gt;红色划线部分&amp;lt;/span&amp;gt;：表示被删除或修改前的内容。&lt;/li&gt;
&lt;li&gt;&amp;lt;span style=&quot;color:rgb(22 163 74);text-decoration:underline&quot;&amp;gt;绿色下划线部分&amp;lt;/span&amp;gt;：表示新增或修改后的内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果变更内容较多，我们只会显示变更点附近的几行文字作为上下文（Context），其余未变动的部分会保持原样，不会干扰你的正常阅读。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q: 为什么我没看到小铃铛？&lt;/strong&gt;
A: 如果没有检测到任何新文章或更新，小铃铛会默认隐藏，以免打扰你阅读。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 为什么有时候明明文章没变化，却提示更新了？&lt;/strong&gt;
A: 系统不仅检测正文，还会检测标题和描述。有时候我可能只是改了个标点，或者修正了排版，也会触发更新通知。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 我不想看这些红红绿绿的线了怎么办？&lt;/strong&gt;
A: 在小铃铛面板右上角，有一个&lt;strong&gt;清空&lt;/strong&gt;按钮（垃圾桶图标）。点击它，系统会将当前所有文章标记为“已读/最新”，并清空本地的对比记录。下次再有新变化时，才会再次提醒。&lt;/p&gt;
</content:encoded></item><item><title>一言分享</title><link>https://blog.blym.top/posts/yiyan-1/</link><guid isPermaLink="true">https://blog.blym.top/posts/yiyan-1/</guid><pubDate>Fri, 05 Jul 2024 21:04:05 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;iframe src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;amp;aid=112734083614972&amp;amp;bvid=BV1j6haeREjU&amp;amp;cid=500001605987550&amp;amp;page=1&amp;amp;high_quality=1&amp;amp;danmaku=0&quot; allowfullscreen=&quot;allowfullscreen&quot; width=&quot;100%&quot; height=&quot;500&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; sandbox=&quot;allow-top-navigation allow-same-origin allow-forms allow-scripts&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h1&gt;文字版&lt;/h1&gt;
&lt;p&gt;如果你把视野拉长，你把时间尺度，观察尺度拉长。你会发现，哇，人生怎么这么苦，全是很多很难解决的问题，不管是这个家庭关系，还是工作。然后人生的下半场，我不知道是如此类的，然后你会觉得很强的焦虑感，或者觉得不适，觉得哎呀未来好没有希望，特别难受。但是，如果说你把你的视野不往长了看，你往短了看，要短到一个极限的感觉。比如说在接下来一个小时，我就可以吃到那边早餐店的早餐了，我可以品味每一口早餐，再点上一杯热巧克力，这种感觉应该还是挺值的期待的。当你把你对未来的期待，收缩到一天之内，或者说几个小时之内，那可能你的感觉会更好一些，这是我在网上看到的。我觉得用这个方式对我自己还挺好的，很多时候我觉得那天特别的糟糕，或者觉得特别的不舒服的时候，我就会跟自己说，接下来好歹能吃个饭，我能给自己点一顿麦当劳啥的，也还是挺好的一个感受。你看，当我把时间尺度拉到五分钟的时候，我马上就能看到这么这么漂亮，超级完美的日出，这感觉真的超棒——Tim&lt;/p&gt;
</content:encoded></item><item><title>今日美好</title><link>https://blog.blym.top/posts/daily-1/</link><guid isPermaLink="true">https://blog.blym.top/posts/daily-1/</guid><pubDate>Fri, 24 May 2024 23:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;今天的月亮格外圆，送给你&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;../images/daily-1/IMG_20240524_210312.jpg&quot; alt=&quot;月球&quot; /&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>