使用 Obsidian 搭建个人媒体记录库

实际效果:我的媒体库 - 北极星的博客

我有个需求挺简单的:看过的动画、电影、书、玩过的游戏,能有个地方统一记下来,最好有个画廊视图能翻看,筛选一下"哪些还没看""哪些评分高"。如果还能自动同步到博客上,就更省事了。

于是我在 Obsidian 里搭了一套媒体库系统,顺手写了个同步插件,用下来感觉还不错。这篇聊聊怎么搞的。

本地媒体库本身的搭建,主要是参考了这个博主的视频和代码来的:
Obsidian如何打造智能图书影视库管理系统,兼顾颜值和实用功能!_哔哩哔哩_bilibili

整体思路

分两块:

  1. Obsidian 本地 — 每种媒体类型一个文件夹,每条记录一个 .md 文件,配合 DataviewJS 写一个画廊概览页,支持筛选、排序、搜索、改状态。
  2. 同步到博客 — 一个 Obsidian 插件,把本地媒体笔记转成 Typecho 兼容格式,上传图片,推到博客。同时生成一个和本地画廊功能一致的云端画廊页面。

架构大概长这样:

1
2
3
4
5
6
7
Obsidian 媒体库 (.md + frontmatter)

├─ 本地画廊(DataviewJS,可交互)

└─ 同步插件 → REST API → Typecho 博客
├─ 文章(每条媒体一篇)
└─ 画廊页(独立页面,纯前端渲染)

814669580

本地部分:在 Obsidian 里建媒体库

文件组织

目录结构很简单,按类型分文件夹:

1
2
3
4
5
6
7
8
媒体库/
├─ 媒体库概览.md ← 画廊页面
├─ anime/ ← 动画
├─ book/ ← 书籍
├─ movie/ ← 电影
├─ teleplay/ ← 剧集
├─ game/ ← 游戏
└─ music/ ← 音乐

每条记录是一个 markdown 文件,用 frontmatter 存元数据。以一部动画为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
title: 葬送的芙莉莲
type: anime
score: 8.8
genre:
- 奇幻
- 冒险
tags:
- 治愈
- 公路片
datePublished: 2023-09-29
观看状态: 看过✅
集数: "28"
---

不同来源的笔记字段名可能不一样——比如 Douban 插件用 title,Bangumi 插件用 中文名原名。画廊页的脚本做了兼容,会自动映射。

画廊概览页

这是整个媒体库的门面,基于 DataviewJS 写的。核心功能:

筛选栏 — 顶部一排下拉菜单,可以按类型、状态、标签、评分、上映时间、季度、创建时间来筛。所有筛选条件实时生效,状态自动保存到 localStorage,下次打开还在。

搜索 — 右上角的搜索框支持多关键词,会在标题、创作者、标签、描述等字段里加权匹配,还能高亮结果。

排序 — 按评分、标题、日期升降序,最后一个下拉菜单搞定。

卡片网格 — 每条媒体一张卡片,包含:

  • 封面图(自动从本地附件或网络 URL 加载)
  • 左上角类型图标(🎬🎮📚✨ 一眼分辨)
  • 右上角状态标签,点击可以切换(想看 → 在看 → 看过 → 搁置 → 抛弃),自动更新文件 frontmatter
  • 左下角发布日期,右下角评分
  • 标题(点击跳转到详情页)
  • 导演/作者/制作方信息
  • anime 和剧集还会显示进度条(已看/总集数)

添加新媒体

顶部有个"添加媒体"按钮,点了直接调起 Douban 插件的搜索导入——输入名字就能从豆瓣拉取元数据创建笔记,不用手敲。

同步部分:一键推到博客

本地记着爽,但有时候想分享,或者想在手机上看。我写了个 Obsidian 插件 media-typecho-sync,配合 Typecho 后端的 RESTful 插件,实现一键同步。

同步管理面板

点击侧边栏的云上传图标,弹出一个管理面板:

1795930511

面板可以:

  • 搜索和筛选 — 按名称搜,按类型/观看状态/同步状态/公开状态筛
  • 增量同步 — 只同步本地有改动过的文件(按 mtime 判断)
  • 强制同步 — 勾选指定条目强制推送,或者全量重推
  • 预览变更 — 先看看哪些文件会被同步,确认无误再推
  • 逐条设置公开状态 — 每条媒体可以独立设为公开/隐藏/私有
  • 删除已选 — 从云端删掉已同步的文章
  • 重建画廊 — 只更新画廊页,不动文章

同步过程做了什么

点击同步后,插件会:

  1. 测试连接 → 扫描本地媒体库 → 对比缓存,找改动
  2. 上传新图片(DJB2 内容哈希去重,同一张图不会传两次)
  3. 转换格式:Wiki 链接 [使用Obsidian搭建个人媒体记录库](https://blog.polaris2333.top/index.php/archives//) → 普通链接、Callout 块 → HTML、DataviewJS → 静态内容
  4. 通过 REST API 创建/更新文章,附上封面、摘要、标签、分类
  5. 重建云端画廊页

整个过程在面板底部有实时进度,出错了也一目了然。

格式转换要点

Obsidian 的笔记语法和 Typecho 的 Markdown 解析不太一样,插件在推送前会自动处理:

Obsidian 语法转换结果
![[xxx.jpg]]![xxx](远程URL)(图片已上传)
别名[别名](博客文章链接)
> [!info] 标题<div class="callout callout-info">...</div>
`= this.score` frontmatter 对应字段的值
dataviewjs 代码块静态 HTML(集数列表、描述等)
ep-box 集数标记内联样式(紫色=已看,深灰=未看)

云端画廊

同步后博客上会自动生成一个独立画廊页面,和 Obsidian 里的体验基本一致——筛选、排序、搜索、卡片展示都在,只是不能修改状态(毕竟是静态页面,没 Obsidian API)。

4157130936

一些细节设计

差异检测三种模式:正常模式按 mtime 增量同步;强制模式全量重推;白名单模式只同步选中文件——改了一条笔记只想推这一条,没问题。

图片去重双层保险:先按路径匹配缓存,再按 DJB2 内容哈希匹配。同一张图在不同笔记里引用多次,只传一次。

集数追踪:anime 的集数数据来自 Bangumi 模板的 ep-box,统计 data-status="2"(已看标记)的数量生成进度条。剧集类也是同理。

跨插件兼容:画廊脚本同时兼容 Douban 插件和 Bangumi Sync 插件创建的文件,字段名不同也能正常显示。

需要准备什么

Obsidian 这边:

  • Obsidian ≥ 1.5.0
  • Dataview 插件(画廊页的核心依赖)
  • Douban 插件或 Bangumi Sync(用来导入元数据,可选但推荐)

Typecho 这边:

  • RESTful 插件(提供 API)
  • Butterfly 主题(推荐,画廊和自定义字段支持最好)

最后

这套方案我从自己用着顺手出发,一点点补齐了筛选、进度、同步、管理面板这些功能。用"Obsidian 做本地数据库 + 画廊做可视化 + 插件做发布"的思路,把记录和分享串起来了。

插件代码和 RESTful 后端都在 GitHub 上开源了,有兴趣可以看看。有更好的想法也欢迎交流。

bluemoon23333/media-typecho-sync: 将obsidian的媒体库页面同步为typecho的一个独立页面的插件