diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f229a4..c353d5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -199,3 +199,23 @@ NYT, CNN, Al Jazeera, TechCrunch, BBC, The Guardian, CNBC, Bloomberg - selector.py — 新源权重 + 主题差异化上限 - summarize_news.py — 来源恢复逻辑 + 时间格式修复 - sync.py — 阅读时长秒→分钟 + +## v1.3.0 (2026-06-20) — Audiobookshelf 有声书服务 + +### Added +- **Audiobookshelf** Docker 部署(ghcr.io/advplyr/audiobookshelf:latest),端口 13378 +- Caddy 反代 `podcast.xybkwd.top` +- `archive_old_audio.sh` — 服务器端滚动淘汰脚本(每节目保留3集) +- `sync_archive.sh` — 本地 D 盘归档同步脚本 +- `D:/服务器备份/有声书/` — 本地永久音频归档目录 +- 文体部工作空间 — 播客/有声书/课程学习管理 + +### Changed +- 服务清单新增 Audiobookshelf (podcast.xybkwd.top) + +### Lessons Learned (Critical) +- 🔴 数据库/cache 操作必须先问用户,不得擅自执行(造成 Audiobookshelf DB 误删) +- Audiobookshelf 章节排序依赖三层:文件名 + chapters[].start + audioFiles[].index +- 排序依据必须是源端 upload_date,不准凭主观判断 +- 容器有 watcher 自动检测文件变化,不需要重启 +- B站无纯音频流,用 `-f worstvideo+worstaudio/worst` 最小化下载量 diff --git a/DECISION_LOG.md b/DECISION_LOG.md index 96daf16..f77aa6f 100644 --- a/DECISION_LOG.md +++ b/DECISION_LOG.md @@ -39,3 +39,39 @@ 22:15 WorkBuddy 自动化 → 读取 digest + 待办 → 微信推送工作报告 23:00 WorkBuddy 自动化 → 全量固化检查 → 补漏 → git push → 微信通知 ``` + +### O-2026-06-20: 音频滚动淘汰 + 本地归档分层存储 + +**决策**:服务器每节目只保留最新 3 集,旧集通过 `archive_old_audio.sh` 移到 `archive_pending/`,再由 `sync_archive.sh` SCP 到本地 D 盘归档。 + +**原因**: +- 服务器磁盘有限(59G 总量,40G 可用),不滚动物理上无法长期扩容 +- 冯先生明确要求旧音频不直接删除,要保存为个人财富 +- 本地 D 盘 392G 可用,足以存储大量音频 + +**架构**: +``` +服务器 audiobooks/ (3集) → archive_pending/ (暂存) → D:/服务器备份/有声书/ (永久) +``` + +### O-2026-06-20: 章节排序以源端发布时间为准 + +**决策**:同一专辑多集章节的排序,必须依据 B站/YouTube 的 `upload_date`,不准靠文件名或主观判断。 + +**原因**:中文文件名排序(Unicode 码位顺序)与实际发布时间经常不一致。`【深】` vs `【妖】` 在中文排序中【深】靠前,但视频发布顺序是【妖】先于【深】。 + +**实施**:下载时 `--print upload_date` 记录源端时间,按 upload_date 升序排列生成 01-N 前缀。 + +### O-2026-06-20: 多部门工作空间拆分 + +**决策**:从单一 Claw 工作空间拆分为 6 个独立工作空间: +| 部门 | 路径 | 职责 | +|:---|:---|:---| +| 主任 | Claw | 总协调、宏观记忆 | +| 办公室 | 办公室 | 公文写作 | +| 交易部 | 服务器 | 策略研发/实盘 | +| 智库办 | 智库办 | 形势分析 | +| 开发部 | dev-department | 部署/运维 | +| 文体部 | 文体部 | 播客/有声书 | + +**原因**:单空间上下文被压缩,各部门任务相互污染。拆分后各空间独立记忆,主任只保留宏观摘要。 diff --git a/README.md b/README.md index ce234a1..1ebb3e7 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,9 @@ | beast/ai-chat | AI 对话 | | beast/todo-system | 待办系统 | | beast/daily-brief | 日报生成 | +| beast/ebook-library | 电子书库 + AI读书助手 | | beast/server-ops | **跨服务的运维日志(本仓库)** | +| — | Audiobookshelf (podcast.xybkwd.top) — 无独立仓库,运维记录在 server-ops | ## 目录结构 diff --git a/TIMELINE.md b/TIMELINE.md index 9079e15..514fe5e 100644 --- a/TIMELINE.md +++ b/TIMELINE.md @@ -125,13 +125,15 @@ | Caddy(反代) | 各域名 | 80/443 | ✅ 运行中 | | Gitea | gitea.xybkwd.top | 3000 | ✅ 运行中 | | Memos | memo.xybkwd.top | 5230 | ✅ 运行中 | -| Beast Dashboard | dashboard.xybkwd.top | 9000 | ✅ dry-run 运行中 | +| Dashboard | dashboard.xybkwd.top | 9000 | ✅ dry-run 运行中 | | AI Chat | chat.xybkwd.top | 8900 | ✅ 运行中 | | Todo Server | nav.xybkwd.top/api | 9001 | ✅ 运行中 | | 每日要闻 | brief.xybkwd.top | 静态 | ✅ 运行中 | | 栖云导航 | nav.xybkwd.top | 静态 | ✅ 运行中 | +| **Audiobookshelf** | **podcast.xybkwd.top** | **13378** | **✅ 运行中** | | 灵感收集器 | — | cron | ✅ 每日 22:00 运行 | | 系统备份 | — | cron | ✅ 每日 04:00 运行 | +| 音频归档 | D://服务器备份//有声书// | — | ✅ 手动同步 | --- @@ -186,3 +188,56 @@ **安全铁律**: - 严禁取消 basicauth,任何调试通过 localhost 不改 Caddyfile + +--- + +### 2026-06-20 — Audiobookshelf 有声书服务上线 + 音频归档体系 + +**v11.0 — 有声书 & 播客服务** + +**部署内容**: +- Docker 部署 `ghcr.io/advplyr/audiobookshelf:latest`,端口 13378 +- Caddy 反代到 `podcast.xybkwd.top` +- docker-compose 管理:`/home/ubuntu/audiobookshelf/docker-compose.yml` +- 数据目录:`config/` `metadata/` `audiobooks/` `podcasts/` +- 手机端通过希声 App 同步收听 + +**核心工作流**: +``` +B站/YouTube → yt-dlp 下载(带 upload_date) → 转 MP3 + → 按源端发布时间排序 → 加 01-N 前缀(完整保留标题) + → 放入 audiobooks/节目名/ + → Audiobookshelf watcher 自动检测 → 希声自动同步 +``` + +**技术突破 — 章节排序三层同步铁律**: +Audiobookshelf 章节排序依赖三层数据,只改文件名不生效: +| 层 | 位置 | 关键字段 | 规则 | +|:---|:---|:---|:---| +| ① 文件系统 | 文件名 | `01-标题.mp3` | 数字前缀确保字母序 | +| ② books 表 | `chapters` JSON | `start`(秒) | 必须连续递增 | +| ③ books 表 | `audioFiles` JSON | `index` | 必须顺序 1→2→3→... | + +**滚动淘汰 + 本地归档体系**: +- 每节目服务器只保留最新 3 集(节省磁盘) +- 淘汰的旧集 → `archive_pending/` 暂存 → `sync_archive.sh` SCP 到本地 +- 本地归档:`D:/服务器备份/有声书/<节目名>/`(D 盘 392G 可用) +- 服务器脚本:`/home/ubuntu/audiobookshelf/scripts/archive_old_audio.sh` +- 本地脚本:`D:/服务器备份/有声书/sync_archive.sh` + +**踩坑记录**: +1. 数据库误删 — 必须问用户再动手(血的教训) +2. 章节排序 — 不是靠文件名字母序,是靠 chapters[].start 时间戳 +3. SCP 中文路径 — 含空格的目录需临时路径中转 +4. 容器无需频繁重启 — watcher 自动检测文件变化 +5. B站无纯音频流 — 用 `-f worstvideo+worstaudio/worst` 最小化下载量 + +**当前有声书内容**: +| 节目 | 集数 | 来源 | +|:---|:---|:---| +| 渤海小吏·八王之乱 | 5集 | B站 | +| 纵横四海 | 3集 | B站 | +| 翟东升 | 3集 | YouTube | +| Elon Musk | 99集 | 本地导入 | + +**意义**:从碎片化的通勤时间利用,升级为一套完整的"内容获取 → 整理归档 → 移动收听"流水线。个人知识输入的又一条通道。