iKode Blog icon iKode Blog
返回文章列表

Article

从 Git 更新日志到 B 站封面:让小站记住自己的变化

技术笔记2026年6月19日 20:353 min

补齐更新日志、管理员入口、游戏视频档案、时间排序与 BiliCover 之后,这个网站开始把自己的开发过程也变成内容。

整理现有文章时,我发现记录停在了查询队列实验。Git 里已经继续向前走了几步:后台能读取提交记录,公开页面只向管理员展示后台入口,B站历史投稿被整理成游戏视频档案,而旧的 BiliCover 小玩具也回到了现在的 Lab。

这篇文章把这些还没有被写下来的变化补在一起。它们看起来分散,实际都在回答同一个问题:一个个人网站怎样记住自己从哪里长出来。

让提交记录变成可读的更新日志

后台新增了更新日志页面,直接读取 Git commit,并把 conventional commit 的类型、范围、时间和说明整理成双语时间线。开发环境可以读取实时 Git 历史,构建时也会生成快照,部署后不需要依赖服务器上的 .git 目录。

这块入口仍然属于后台。公开页会先读取当前登录用户,只有管理员才看到管理入口;普通用户和访客不会被一个无权访问的按钮引向登录页。

把 B 站投稿整理成游戏档案

第一阶段的游戏模块已经同步了主页上的 96 个公开视频。同步脚本会按 BVID 幂等更新标题、简介、封面、时长、播放量和发布时间,再根据标题把视频归到原神、崩坏3、崩坏:星穹铁道、雀魂或其他游戏,并补充挑战、单通、抽卡、直播、音乐等内容类型。

前台的 游戏档案 可以按游戏、系列、类型和年份筛选;后台则保留人工修正分类和英文文案的入口。图片对象存储仍然没有启动,封面继续使用 B 站远程地址,并统一带上 referrerpolicy="no-referrer"

最新内容必须真的排在前面

文章和生活列表之前会先按 isFeatured 排序,这意味着一篇较旧的精选内容可能压在最新内容上面。精选适合首页策展,却不适合作为时间线的第一规则。现在两个公开列表共享同一个顺序定义:发布时间倒序,创建时间只负责处理同一发布时间的稳定排序。

/** Keep public timelines newest-first with a stable creation-time tie breaker. */
export function newestContentFirst() {
  return [
    { publishedAt: 'desc' as const },
    { createdAt: 'desc' as const }
  ]
}

这样“最新显示在最前面”不再依赖每个接口各自记得写对,也不会被精选状态悄悄改写。

把旧 BiliCover 搬回 Lab

旧版 BiliCover 的工作流很直接:粘贴 BV、av 或分享文案,显示标题与封面,然后下载。新的 B站视频封面提取 保留了这条最短路径,同时加入中英切换、加载与错误状态、移动端布局,以及受限的服务端下载代理。

输入解析先从整段文本中寻找 BV 或 av;只有没有直接标识时,才允许解析 b23.tv 短链。下载接口也不会接收任意图片地址,而是重新读取视频元数据,并只代理 hdslb.com/bfs/archive/ 下的封面。

/** Parse a BV or av reference from a plain id, URL, or copied share message. */
export function parseBilibiliVideoReference(value?: string | null) {
  const text = value?.trim() ?? ''
  const bvid = text.match(/BV[0-9A-Za-z]{10}/)?.[0]

  if (bvid) return { bvid }

  const aid = text.match(/\bav(\d{1,20})\b/i)?.[1]
  return aid ? { aid } : null
}

这次没有把旧站原样塞进 iframe,也没有为了“迁移”重新造一套孤立服务。旧玩具的用途被保留下来,输入解析和 B 站请求则复用了现在网站的服务端边界。

更新日志记住代码如何变化,游戏档案记住视频如何积累,文章时间线记住内容何时发生,BiliCover 则把一个旧项目重新接回现在的工作台。对个人网站来说,这些记忆本身就是内容。

Comments

留言

需要 GitHub 登录。新评论会先进入待审核,别急,它只是先坐到门口等一会儿。

使用 GitHub 登录后可以评论。

已通过评论

0

还没有通过审核的评论。桌子很安静,第一杯茶还没端上来。