让收藏真正可读、可播,也让媒体入库的每一步有明确边界。 今天的工作主要围绕 KanBox 的内容链路展开。一个链接进入收藏库以后,能否提取有用的正文和媒体,能否在详情页自然阅读,能否在网络失效时继续播放,实际上是同一件事的不同阶段。早些时候逐个平台补解析器,今天则更明显地碰到了通用规则、历史数据升级和真实设备验收的问题。另一条线在 MovieClaw 与 Plex 之间:下载、整理和媒体库扫描原本各有自己的目录与事件语义。只要命名或触发条件不一致,文件虽然存在,用户看到的库仍可能缺集或被反复扫描。两边的改动都提醒我,可靠性往往不在某一个解析函数,而在数据从来源流向最终界面的整条路径上。KanBox 从平台解析走向干净阅读豆瓣内容先暴露了结构化资料与阅读正文混在一起的问题。电影、图书、音乐、播客和小组话题的字段不同,旧版尤其容易把播客摘要当成完整 shownote,或把音频误放进视频链路。今天先重构了五类内容的分层展示,补了高清封面、人物资料与备份恢复;随后又把播客的完整正文和在线音频接进通用播放器。小宇宙作为独立平台加入后,豆瓣播客也复用了同一套音频播放路径。真实公开样本验证了正文、封面和音频来源;旧收藏需要主动“重新解析”才能补齐新字段。早期一轮测试目标仅完成编译,不能算作 XCTest 已运行,后续的样本验证也不等于所有旧条目都完成迁移。网页类型比平台解析更杂。原先遇到博客首页和动态页面时,容易把导航、文章列表或无关图片灌进正文。新的兜底顺序先看 JSON-LD,再看 Open Graph,只对文章型页面抽取静态正文;动态子页面交给隔离的 WebKit 渲染。仍没有可靠正文时,明确保存为页面预览和原链接。随后又加入图片语义判断:结合正文区域、图注、替代文字和相邻段落决定图片是否值得保留,按原页面顺序组织图文,同时排除图标、广告等噪声。这两轮版本已安装,相关回归分别通过;既有网页收藏仍需重新解析,受站点限制的动态内容也可能只能预览。从分享入口到笔记编辑Safari 分享曾出现“看似保存失败”的反馈。根因不是简单的网络错误,而是分享扩展把同步调用的返回值当成了持久化成功与否。修复后,链接和图片进入 App Group 的原子文件队列,由主 App 逐条确认并兼容旧队列。代码和队列测试通过,新版已安装;最终从 Safari 点击分享的人工验收当时仍未完成,不能把安装成功写成端到端通过。进入收藏库后,交互也有一串相邻问题:长按菜单和上下滚动会抢手势,分享图的正文被截短,笔记编辑器在异步查询稍晚返回时可能停在空草稿,保存后页面还会显示旧对象。今天分别让滚动位移取消误触、为分享图提供完整正文和媒体显示选项,并修正编辑器载入、事务回写与导航栏保存按钮的位置。笔记修改、退出、重启后内容保留的界面流程已经跑通并安装真机;分享图那轮专项测试只编译成功,模拟器运行因超时没有完成。后来又给笔记身份补上统一的昵称和头像设置,默认用 kb 图标,已有和新建笔记共用显示规则;相关测试通过并安装,但自动启动未能确认。媒体播放、登录会话与离线副本Instagram 的 Live Photo 原先只剩静态封面,今天改用系统实况照片视图,让查看器长按播放并以实况照片形式保存。快拍是另一类问题:KanBox 内置浏览器已经有登录会话,“重新解析”却仍走匿名请求,因此登录后的媒体根本没有进入解析链路。后续版本把用户主动发起的快拍重解析接到同一浏览会话,校验目标内容,失败时保留原收藏并说明原因。定向和相关回归通过,版本已安装;有效且有权限的真实快拍仍需在手机上复验,过期内容无法靠代码恢复。视频离线则是在可播放地址确定之后才安全落盘。旧行为只有在线播放;新版在取得真实视频文件后后台保存副本,界面标记“离线中”或“已离线”,正常联网仍优先在线播放,断网或在线地址失效时才回退本地。删除收藏、清空数据和手动移除都有对应清理路径;HLS、WebM 与纯网页播放器暂不纳入。全量测试通过,版本已安装,但具体收藏能否在飞行模式下播放,还要等副本完成后做真机验收。在线优先也不会减少已经保存的离线文件占用。GitHub 内容另补了一条阅读路径:剪贴板链接识别兼容多种系统表示,详情页保留原文,并用 Apple Translation 按章节、段落生成可切换的译文。编译与相关回归通过、版本已覆盖安装;当时设备锁定,自动启动和翻译语言包的实际使用仍待用户打开后验证。当天的版本是连续推进的,后续版本承接此前修复,不能把每个安装包当成互不相关的独立成品。MovieClaw 的目录和事件边界MovieClaw 入库链路按媒体库分类重新配置为“下载目录 → 硬链接整理 → Plex 对应库”。硬链接让下载源文件继续做种,同时让整理后的命名出现在媒体库里,不必复制一份视频。旧入口没有直接批量搬迁,因为仍有未完成任务和同名冲突;新任务改走统一分类。一次剧集缺集的排查也说明了命名规范的重要性:旧整理规则与新规则把同一作品分进两个目录。合并为带公开资料库标识的统一目录后,季与集数连续,MovieClaw 扫描没有错误,Plex 也识别为一部完整剧集;重复项保留可恢复备份,播放是否正常仍需最终确认。事件侧先为多个 Plex 媒体库配置局部刷新 Webhook,并确认请求被接收。中途扩大事件勾选范围后发现,播放与收藏也会触发不必要的扫描,于是恢复为只有“订阅内容已入库”才刷新。Plex 的播放事件若要推送消息,需要独立接收端;现有 Webhook 只是事件发送或刷新接口。今天这部分完成了配置与连通性核验,通知桥接仍只是方案,没有部署。下一轮升级仍需守住边界KanBox 的首次引导和日常启动过场今天只完成文稿。方案以静态系统启动首帧衔接 SwiftUI 动画,并让日常过场随真实准备状态结束;还没有写进 App。另一项“全量重新解析”正在实现:它计划放在设置页下方,先提示联网、耗时与平台限流风险,再二次确认,逐条处理并显示进度、失败与取消入口,沿用单条重解析保护手工修改内容的规则。截至本篇整理时没有完成结果,不能当作已交付功能。今天的几条认识可以收在一起:解析结果需要保留来源与不确定性,预览比伪装成完整正文更可靠;批量升级必须尊重用户编辑过的数据;媒体“能播放”“已缓存”“无水印”“真机可保存”是不同验收点;自动化事件应只在对应业务状态发生时触发。接下来要复验有效快拍、离线视频和翻译的真机使用,完成全量重解析的取消与失败处理,并确认整理后的媒体在 Plex 中可正常播放。隐私说明本文只概述当天可核对的技术对话,省略了账户、凭据、设备、私人媒体、内部地址和本地路径。版本与测试结果按当时的验证范围描述;未完成的真机或线上验收没有写成成功。
2026-09-30|自然语言编程日记
今天的工作主要围绕 KanBox 的内容链路展开。一个链接进入收藏库以后,能否提取有用的正文和媒体,能否在详情页自然阅读,能否在网络失效时继续播放,实际上是同一件事的不同阶段。早些时候逐个平台补解析器,今天则更明显地碰到了通用规则、历史数据升级和真实设备验收的问题。
另一条线在 MovieClaw 与 Plex 之间:下载、整理和媒体库扫描原本各有自己的目录与事件语义。只要命名或触发条件不一致,文件虽然存在,用户看到的库仍可能缺集或被反复扫描。两边的改动都提醒我,可靠性往往不在某一个解析函数,而在数据从来源流向最终界面的整条路径上。
KanBox 从平台解析走向干净阅读
豆瓣内容先暴露了结构化资料与阅读正文混在一起的问题。电影、图书、音乐、播客和小组话题的字段不同,旧版尤其容易把播客摘要当成完整 shownote,或把音频误放进视频链路。今天先重构了五类内容的分层展示,补了高清封面、人物资料与备份恢复;随后又把播客的完整正文和在线音频接进通用播放器。小宇宙作为独立平台加入后,豆瓣播客也复用了同一套音频播放路径。真实公开样本验证了正文、封面和音频来源;旧收藏需要主动“重新解析”才能补齐新字段。早期一轮测试目标仅完成编译,不能算作 XCTest 已运行,后续的样本验证也不等于所有旧条目都完成迁移。
网页类型比平台解析更杂。原先遇到博客首页和动态页面时,容易把导航、文章列表或无关图片灌进正文。新的兜底顺序先看 JSON-LD,再看 Open Graph,只对文章型页面抽取静态正文;动态子页面交给隔离的 WebKit 渲染。仍没有可靠正文时,明确保存为页面预览和原链接。随后又加入图片语义判断:结合正文区域、图注、替代文字和相邻段落决定图片是否值得保留,按原页面顺序组织图文,同时排除图标、广告等噪声。这两轮版本已安装,相关回归分别通过;既有网页收藏仍需重新解析,受站点限制的动态内容也可能只能预览。
从分享入口到笔记编辑
Safari 分享曾出现“看似保存失败”的反馈。根因不是简单的网络错误,而是分享扩展把同步调用的返回值当成了持久化成功与否。修复后,链接和图片进入 App Group 的原子文件队列,由主 App 逐条确认并兼容旧队列。代码和队列测试通过,新版已安装;最终从 Safari 点击分享的人工验收当时仍未完成,不能把安装成功写成端到端通过。
进入收藏库后,交互也有一串相邻问题:长按菜单和上下滚动会抢手势,分享图的正文被截短,笔记编辑器在异步查询稍晚返回时可能停在空草稿,保存后页面还会显示旧对象。今天分别让滚动位移取消误触、为分享图提供完整正文和媒体显示选项,并修正编辑器载入、事务回写与导航栏保存按钮的位置。笔记修改、退出、重启后内容保留的界面流程已经跑通并安装真机;分享图那轮专项测试只编译成功,模拟器运行因超时没有完成。后来又给笔记身份补上统一的昵称和头像设置,默认用 kb 图标,已有和新建笔记共用显示规则;相关测试通过并安装,但自动启动未能确认。
媒体播放、登录会话与离线副本
Instagram 的 Live Photo 原先只剩静态封面,今天改用系统实况照片视图,让查看器长按播放并以实况照片形式保存。快拍是另一类问题:KanBox 内置浏览器已经有登录会话,“重新解析”却仍走匿名请求,因此登录后的媒体根本没有进入解析链路。后续版本把用户主动发起的快拍重解析接到同一浏览会话,校验目标内容,失败时保留原收藏并说明原因。定向和相关回归通过,版本已安装;有效且有权限的真实快拍仍需在手机上复验,过期内容无法靠代码恢复。
视频离线则是在可播放地址确定之后才安全落盘。旧行为只有在线播放;新版在取得真实视频文件后后台保存副本,界面标记“离线中”或“已离线”,正常联网仍优先在线播放,断网或在线地址失效时才回退本地。删除收藏、清空数据和手动移除都有对应清理路径;HLS、WebM 与纯网页播放器暂不纳入。全量测试通过,版本已安装,但具体收藏能否在飞行模式下播放,还要等副本完成后做真机验收。在线优先也不会减少已经保存的离线文件占用。
GitHub 内容另补了一条阅读路径:剪贴板链接识别兼容多种系统表示,详情页保留原文,并用 Apple Translation 按章节、段落生成可切换的译文。编译与相关回归通过、版本已覆盖安装;当时设备锁定,自动启动和翻译语言包的实际使用仍待用户打开后验证。当天的版本是连续推进的,后续版本承接此前修复,不能把每个安装包当成互不相关的独立成品。
MovieClaw 的目录和事件边界
MovieClaw 入库链路按媒体库分类重新配置为“下载目录 → 硬链接整理 → Plex 对应库”。硬链接让下载源文件继续做种,同时让整理后的命名出现在媒体库里,不必复制一份视频。旧入口没有直接批量搬迁,因为仍有未完成任务和同名冲突;新任务改走统一分类。一次剧集缺集的排查也说明了命名规范的重要性:旧整理规则与新规则把同一作品分进两个目录。合并为带公开资料库标识的统一目录后,季与集数连续,MovieClaw 扫描没有错误,Plex 也识别为一部完整剧集;重复项保留可恢复备份,播放是否正常仍需最终确认。
事件侧先为多个 Plex 媒体库配置局部刷新 Webhook,并确认请求被接收。中途扩大事件勾选范围后发现,播放与收藏也会触发不必要的扫描,于是恢复为只有“订阅内容已入库”才刷新。Plex 的播放事件若要推送消息,需要独立接收端;现有 Webhook 只是事件发送或刷新接口。今天这部分完成了配置与连通性核验,通知桥接仍只是方案,没有部署。
下一轮升级仍需守住边界
KanBox 的首次引导和日常启动过场今天只完成文稿。方案以静态系统启动首帧衔接 SwiftUI 动画,并让日常过场随真实准备状态结束;还没有写进 App。另一项“全量重新解析”正在实现:它计划放在设置页下方,先提示联网、耗时与平台限流风险,再二次确认,逐条处理并显示进度、失败与取消入口,沿用单条重解析保护手工修改内容的规则。截至本篇整理时没有完成结果,不能当作已交付功能。
今天的几条认识可以收在一起:解析结果需要保留来源与不确定性,预览比伪装成完整正文更可靠;批量升级必须尊重用户编辑过的数据;媒体“能播放”“已缓存”“无水印”“真机可保存”是不同验收点;自动化事件应只在对应业务状态发生时触发。接下来要复验有效快拍、离线视频和翻译的真机使用,完成全量重解析的取消与失败处理,并确认整理后的媒体在 Plex 中可正常播放。
隐私说明
本文只概述当天可核对的技术对话,省略了账户、凭据、设备、私人媒体、内部地址和本地路径。版本与测试结果按当时的验证范围描述;未完成的真机或线上验收没有写成成功。