追踪站支持改造计划(2026-04)
目的
这份文档用于记录 Kototoro 追踪站支持的下一阶段改造计划,方便跨机器继续工作,也方便后续把实现进度逐项对照回填。
本轮改造的核心目标不是“再补几个接口”,而是把以下能力真正打通为可用闭环:
AniListMyAnimeListSimkl
范围覆盖:
- 站点登录
- 发现页 / 浏览页
- 分类页
- 详情页
- 列表卡片信息密度
- 高清封面获取
- 简介清洗
- 本地缓存与展示链路
当前现状
基于 2026-04-27 的代码排查,当前关键结论如下。本文档此前记录的是改造起点,多个条目已经落地;后续应把它作为进度台账维护,而不是继续按旧状态执行。
1. Simkl 基础设施已进入主流程
Simkl 已经接入追踪站基础设施:
app/src/main/kotlin/org/skepsun/kototoro/scrobbling/common/domain/model/ScrobblerService.ktapp/src/main/kotlin/org/skepsun/kototoro/scrobbling/common/domain/ScrobblerRepositoryMap.ktapp/src/main/kotlin/org/skepsun/kototoro/tracking/discovery/data/DefaultTrackingSiteDiscoveryService.ktapp/src/main/AndroidManifest.xml的 scrobbler auth host 列表
当前状态不是“体系内不存在”,而是“基础浏览、详情、绑定和同步链路已接入,剩余站点能力细化”。
已完成:
ScrobblerService增加SIMKLSimklRepository/SimklInterceptor/SimklScrobbler已接入ScrobblingModule、ScrobblerRepositoryMap、设置页登录入口和 OAuth callback 已接入- 发现页分类、搜索、详情、episode 列表、推荐、状态同步、增量同步和
removed_from_list删除对比已形成首批闭环
剩余重点:
memo删除与更细粒度远端注释同步策略- 发现页分类之外的更多时间维度筛选
- 避免伪造 Simkl 不具备的 manga / 角色 / person 域
2. 发现页数据模型已完成首批扩展
TrackingSiteItem 已扩展为可承载更多站点字段:
primaryTitlesecondaryTitleprogressTextupdatedAtTextscoreMax
TrackingSiteItemEntity、TrackingSiteCacheRepository 与 Migration39To40 已同步;DiscoverViewModel / DiscoverCategoryViewModel 已开始保留标题、副标题、评分范围等字段。
剩余重点:
Bangumi排行页字段仍偏依赖页面抓取,评分、章节、更新时间颗粒度需继续验证- 副标题目前仍是单行摘要,后续可拆成更明确的多段信息区块
MAL/Shikimori的“每日放送”仍主要是按日期映射季度,不是真正逐日 airing API
3. AniList / MAL / Simkl 详情能力已有明显推进
相关实现主要在:
app/src/main/kotlin/org/skepsun/kototoro/scrobbling/anilist/data/AniListRepository.ktapp/src/main/kotlin/org/skepsun/kototoro/scrobbling/mal/data/MALRepository.ktapp/src/main/kotlin/org/skepsun/kototoro/scrobbling/simkl/data/SimklRepository.ktapp/src/main/kotlin/org/skepsun/kototoro/tracking/discovery/data/DefaultTrackingSiteDiscoveryService.kt
已完成:
AniList已接入 airing schedule、characters、voice actors、related、recommendations、高质量图片字段和 HTML 简介规整MAL已接入 ranking / seasonal、large cover、details、reviews / forum、characters、related、recommendationsSimkl已接入 discovery categories、overview、recommendations、sync activities 与 removed list- 主详情页追踪站补充区块已能展示角色卡片、角色弹层、声优列表与外跳站点页
剩余重点:
- 角色、声优、person 实体详情页仍需从各站点实际详情页补齐真实图片和外链
- MAL / Bangumi / Shikimori / Kitsu 的人物与角色页信息深度仍不均衡
- 站点缺少角色/person 域时必须降级展示,不能虚构字段
4. 简介清洗已开始统一,但仍需收口
历史问题是 details / scrobbling sheet 侧常见直接对字符串做 sanitize():
app/src/main/kotlin/org/skepsun/kototoro/core/util/ext/String.kt
当前 AniList 等详情已开始做 HTML 段落和换行规整,但仍需继续统一规则:
- HTML 简介优先转干净文本
br/p转换为合理换行- 去除多余空白与残余标签
- 在 repository / discovery 映射阶段尽早清洗,避免 UI 层重复兜底
5. 用户系统入口已完成首批迁移
当前进度:
已完成:
- 根设置新增独立
用户分区 - 追踪站账号入口从
Services页迁移到新的UsersSettingsFragment - 用户页新增“默认浏览追踪网站”兜底设置,发现页顶部追踪源面板异常时仍可从设置切换浏览源
同步设定入口从Services页迁移到用户页,路径调整为设置 -> 用户 -> 同步设定- 新增统一
ScrobblerUserProfile/ScrobblerUserStats模型 - 新增
TrackingUserAccountSummaryProvider AniList/MAL/Simkl已补首批账号统计摘要- 其他站点先回退为“昵称 + 登录状态”,后续逐站补统计
- 根设置新增独立
尚未完成:
Bangumi/Shikimori/Kitsu/MangaUpdates的统计深挖- 用户页内的更多能力入口,例如用户评论、列表跳转、远端收藏/历史概览
- 把“用户系统”继续扩展成跨站统一资料页,而不只是账号列表
6. 下一步计划:角色 / 声优 / Person 实体详情增强
用户给出的当前方向是“改善角色、声优、person 实体详情页,正确读取各个网站的网页实际内容和图片”。建议按低风险顺序推进:
- 不先扩 Room 表结构,优先从已有追踪站详情缓存动态解析角色图、声优头像、角色页 / person 页外链,避免为首批展示能力引入 migration。
- 统一实体关系卡片的数据来源:角色、声优、person 页面都通过
TrackingSiteItemDetails.CharacterInfo/PersonInfo获取真实图片、职责、声优列表和 URL。 - 逐站补齐仓库层字段映射,优先使用站点实际详情页或官方 API 已提供的高清字段;缺字段时优雅降级,不写站点特化 UI 分支。
- 第一批重点站点顺序:
AniList、MAL、Bangumi。Simkl仅处理其真实支持的作品域,不伪造角色/person。 - 验证路径优先覆盖:从作品详情进入角色卡片、从角色进入实体详情、从声优 / person 进入实体详情、外链按钮打开站点真实页面、图片加载成功。
本次推进记录:
- 已在
DetailsViewModel侧增强实体详情动态解析:角色实体继续从关联作品的追踪站详情回补角色图、职责、声优列表和角色页 URL。 - 已新增 person / 声优头像回补策略:Person 实体通过其配音角色所在作品详情匹配
PersonInfo,优先使用站点实际提供的avatarUrl。 - 暂不新增实体图谱图片字段和 Room migration,保持 KISS/YAGNI;如果后续需要离线展示或跨进程稳定缓存,再单独设计实体展示元数据表。
改造目标
完成后应达到以下状态:
AniList、MAL、Simkl三个源都支持登录。- 三个源都能作为追踪站浏览源出现在发现页与分类页。
- 三个源都尽量提供“每日放送 / 每日更新”入口。
- 列表卡片可展示至少以下信息中的合理子集:
- 主标题
- 原名 / 译名
- 评分
- 状态
- 已更新章节 / 集数
- 每日放送信息
- 详情页可稳定展示:
- 高清主封面
- recommendations
- related works
- creators / staff
- characters
- 简介显示不再残留原始 HTML 标签。
- 缓存结构与 UI 结构保持站点无关,不为单站点写死分支。
分阶段计划
阶段 1:补齐 Simkl 基础设施
目标:
- 让
Simkl正式成为 Kototoro 的追踪源之一
当前进度(更新于 2026-04-27):
已完成:
ScrobblerService增加SIMKL- 新增
SimklRepository/SimklInterceptor/SimklScrobbler - 接入
ScrobblerRepositoryMap - 接入
ScrobblingModule的 storage /OkHttpClient/ repository provider / scrobbler set ScrobblerConfigActivity与AndroidManifest.xml增加simkl-auth回调 host- 设置页已增加
Simkl登录入口 - OAuth code -> token ->
ScrobblerStorage保存链路已接通 DefaultTrackingSiteDiscoveryService已接入 Simkl 发现页分类与列表拉取- 已基于官方文档补齐 Simkl 文本搜索接口
- 已基于官方文档补齐 Simkl 详情接口与 episode 列表读取
- 已基于官方文档补齐 Simkl
watchlist/history/ratings/sync/all-items写链路 - 已基于官方
sync/activities+date_from改为增量同步,并补removed_from_list的 IDs-only 删除对比 - Simkl 已重新开放手动绑定、自动建联和状态同步入口
尚未完成:
memo删除与更细粒度的远端注释同步策略- 发现页分类之外的更多列表形态与时间维度筛选
主要改动点:
ScrobblerService增加SIMKL- 新增
SimklRepository - 接入
ScrobblerRepositoryMap - 增加对应
OkHttpClient/ storage / Hilt provider - 增加字符串、图标、设置项
- 在
ScrobblerConfigActivity和AndroidManifest.xml中补simkl-auth
参考实现:
E:/kototoro_demo/Dartotsu/lib/Api/Simkl/Login.dartE:/kototoro_demo/Dartotsu/lib/Api/Simkl/Simkl.dartE:/kototoro_demo/Dartotsu/lib/Api/Simkl/SimklService.dart
交付标准:
- 可以在 Kototoro 中看到 Simkl 登录入口
- OAuth 回调完成后可拿到 token 并保存
- Simkl 可以作为“可浏览 + 可搜索 + 可查看详情 + 可绑定同步”的追踪站进入主流程
阶段 2:扩展发现页数据模型
目标:
- 让“浏览页卡片能显示更多信息”成为模型层能力,而不是 UI 临时拼接
当前进度(更新于 2026-04-27):
已完成:
TrackingSiteItem已扩展primaryTitle、secondaryTitle、progressText、updatedAtText、scoreMaxTrackingSiteCacheRepository与tracking_site_items表结构已同步扩展- 已新增
Migration39To40 DiscoverViewModel/DiscoverCategoryViewModel已改为保留并透传标题、副标题、评分范围- 浏览卡片右上角评分徽标已支持
value/max显示 - 网格卡片与列表卡片已开始显示追踪站副标题
AniList/MAL/Kitsu/Shikimori/Simkl/MangaUpdates的发现列表已补第一批真实字段映射:- 原文主标题
- 译名副标题
- 章节 / 集数统计
- 更新时间或播出日期
- 站点原生评分与评分上限
尚未完成:
Bangumi排行页的真实评分 / 更新时间 / 章节统计还主要依赖页面抓取,字段颗粒度仍偏弱- 副标题目前仍压缩为单行文本,后续可继续拆成更明确的多段信息区块
- “每日放送独立页面” 已有独立入口,且目前已形成分层能力:
Bangumi calendar已支持真实按日期切换AniList airing schedule已支持真实按日期查询与独立页日期切换Simkl anime/tv airing已支持把所选日期透传为真实date请求参数MAL seasonal与Shikimori seasonal已支持把所选日期映射到对应季度并刷新列表- 但
MAL/Shikimori当前仍是“按日期映射季度”,不是真正的逐日 airing API
- 详情页评论按钮已支持内联阅读与站点外跳,但真正的“站内发评论 / 发长评 API 写入”仍需逐站单独深挖
主要改动点:
- 扩展
TrackingSiteItem - 扩展
TrackingSiteCacheRepository - 必要时扩展
tracking_site_items表结构并补 migration - 调整
DiscoverViewModel - 调整
DiscoverCategoryViewModel - 调整发现页卡片映射与展示
建议新增或统一的字段:
secondaryTitleoriginalTitletranslatedTitlestatusTextprogressTextairingTextcoverUrlbackdropUrlscore
交付标准:
- 数据不会在
TrackingSiteItem -> Content这一步丢失 - 浏览页 / 分类页卡片能够消费新增字段
阶段 3:增强 AniList 接入
目标:
- 把 AniList 从“可浏览”提升到“信息完整且图片质量够用”
当前进度(更新于 2026-04-27):
已完成:
- 发现页分类已新增
AniList airing schedule - 顶部“每日放送”入口已可优先跳转到
AniList airing schedule AniListRepository已新增基于airingSchedules的按日期 GraphQL 查询- 独立页日期选择已可真实驱动
AniList每日放送列表 AniList airing已接入专用空态与顶部日期副标题AniList airing卡片已开始展示本地放送时刻,而不只是日期AniList发现分类已继续补齐首批高价值列表:Trending MoviesTop Rated SeriesMost Favourited SeriesTrending ManhwaTrending Novels
AniList分类页切换按钮已可在更多 anime / manga 官方列表之间直接跳转AniList详情页的关联作品 / 推荐作品封面已优先使用extraLarge/largeAniList详情页已补角色列表与声优数据读取,角色图 / 声优头像优先使用更高质量图片- 追踪站详情弹窗的简介已改为先解析 HTML 再显示,
AniList简介也补了首批段落/换行规范化 - 主详情页的追踪站补充区块已开始展示
AniList角色卡片,并显示role + CV - 追踪站补充区块中的角色卡片已支持轻量详情弹层,进入后可查看完整声优列表
- 角色轻量详情弹层已补站点角色页外跳按钮,形成“卡片摘要 -> 弹层明细 -> 站点角色页”链路
- 角色卡片信息层级已细化为“标题 / 角色 / CV”,并增加明确的站外打开提示
- 发现页分类已新增
尚未完成:
- 详情页角色 / 推荐 / 关联封面仍有继续提高清晰度空间
- 简介清洗与更丰富的详情扩展区块仍待继续补齐
主要改动点:
- 在
AniListRepository中补每日放送 / airing schedule 数据 - 详情查询补强:
- 高清封面
- characters
- staff / creators
- recommendations
- relations
- 更完整标题字段
- 简介统一清洗
重点问题:
- 当前推荐 / 关联 / 角色图很多仍然是
medium - 应优先改为
large/extraLarge/ 更合适字段
交付标准:
- AniList 分类里可见每日放送或等效日历入口
- 详情页角色 / 推荐 / 关联封面质量明显提升
阶段 4:增强 MAL 接入
目标:
- 补齐 MAL 浏览与详情的信息深度
当前进度(更新于 2026-04-27):
已完成:
- ranking / seasonal 浏览已接入
- 详情页已补 large cover、基础详情字段、reviews / forum 入口
- characters、related works、recommendations 已接入首批网页解析
尚未完成:
- 角色详情页 / people 页的真实正文、头像和外链仍需逐页验证
- “每日放送 / 当日更新”仍不是 MAL 官方逐日 airing API
- MAL 网页结构变化风险高,解析应保持小函数和可降级策略
后续改动点:
- 为 MAL 增加“每日放送 / 当日更新”的发现入口
- 扩展详情字段:
- 原名 / 标题信息
- 评分
- 章节 / 集数
- 作者
- 推荐作品
- 相关作品
- 评估角色 / 创作者 / 推荐区块是否需要额外数据源或补抓逻辑
- 统一简介清洗
参考点:
E:/kototoro_demo/Dartotsu/lib/Api/MyAnimeList/*
交付标准:
- MAL 不再只停留在 ranking / seasonal 的浅层浏览
- 详情页信息密度与 AniList 基本对齐
- 角色和 people 实体页能显示 MAL 实际网页提供的图片和外链;解析失败时不阻塞作品详情
阶段 5:完善 Simkl 发现页与详情页
目标:
- 把 Simkl 从“基础可用”继续扩展到“浏览、详情、同步体验更完整”
当前进度(更新于 2026-04-27):
已完成:
- 登录、搜索、发现分类、详情、episode 列表、overview、recommendations 已进入主流程
sync/activities增量同步和removed_from_list删除对比已接入
尚未完成:
memo删除与远端注释同步策略- 更多列表形态和时间维度筛选
- Simkl 不提供稳定角色/person 域时,不应为了统一 UI 伪造角色或声优实体
后续改动点:
- 发现页接入:
- trending
- premieres
- airing
- 详情页接入:
posterfanartoverviewusers_recommendations- 评分 / 状态 / 播出信息
- 统一映射到
TrackingSiteItem/TrackingSiteItemDetails
参考实现:
E:/kototoro_demo/Dartotsu/lib/Api/Simkl/SimklQueries/GetAnimeMangaListData.dartE:/kototoro_demo/Dartotsu/lib/Api/Simkl/Data/Media.dart
注意:
- Simkl 的数据域偏 anime / shows / movies,不应伪造其不具备的 manga 语义
- UI 展示需要按站点能力做条件化
交付标准:
- Simkl 可作为实际可用的浏览源进入主流程
- Simkl 缺失角色/person 数据时展示为空或隐藏对应区块,而不是展示错误占位数据
阶段 6:统一详情页与浏览页展示
目标:
- 真正把新增字段“显示出来”,而不是只停在仓库层
当前进度(更新于 2026-04-27):
已完成:
- 浏览卡片已开始消费扩展后的标题、副标题、评分范围
- 详情页追踪站补充区块已支持角色、关联、推荐、额外区块
- 角色卡片和角色弹层已能展示角色图、职责、声优列表和站点外链
- 本次新增:实体详情页能从关联作品追踪站详情动态回补角色图、角色职责、声优列表、角色页 URL 和 person / 声优头像
尚未完成:
- Person 实体页还需要补正文、代表作、更多站点外链等信息
- 角色 / person 页仍主要依赖已缓存作品详情;如果缓存缺失,需要逐站设计安全的详情补抓策略
后续改动点:
discover卡片展示逻辑details头部信息展示逻辑supplemental sections映射- recommendations / related / characters / creators 列表项封面请求
关注文件:
app/src/main/kotlin/org/skepsun/kototoro/discover/ui/*app/src/main/kotlin/org/skepsun/kototoro/discover/ui/compose/*app/src/main/kotlin/org/skepsun/kototoro/details/ui/DetailsViewModel.ktapp/src/main/kotlin/org/skepsun/kototoro/details/ui/compose/DetailsHeader.kt
交付标准:
- 浏览页卡片信息更完整
- 详情页补充区块真正使用高清图
- 各站点字段缺失时展示能优雅降级
- 从作品、角色、声优三个入口进入实体详情时,图片和外链来源一致且可解释
阶段 7:简介清洗与统一图片策略
目标:
- 解决“简介脏”和“列表图清晰、详情区反而糊”的问题
当前进度(更新于 2026-04-27):
已完成:
- AniList 简介已开始 HTML 段落 / 换行规整
- 追踪站详情弹窗已开始使用清洗后的简介
- 角色、声优、关联作品、推荐作品已优先使用详情接口提供的较高质量图片字段
尚未完成:
- 清洗函数尚未完全收口为站点无关工具
- MAL / Bangumi 等网页解析来源仍需按实际 HTML 验证残留标签、实体转义和图片 URL 归一化
后续改动点:
- 抽离统一的 tracking 描述清洗函数
- 在 repository / discovery 映射阶段就完成 HTML 清洗
- 统一封面 URL 归一化与优先级策略
建议规则:
- HTML 简介优先转干净文本
br/p转换为合理换行- 去除多余空白与残余标签
- 推荐 / 角色 / 创作者列表优先使用详情接口中的高清图字段
交付标准:
- 简介不再出现明显 HTML 残留
- 详情补充区块封面质量与详情主图策略一致
建议实施顺序
旧的阶段 1 到阶段 3 已基本完成,后续建议按下面顺序推进,降低回归风险:
- 阶段 6:先把角色 / 声优 / person 实体详情的数据展示链路补稳。
- 阶段 4:补 MAL 角色页 / people 页真实内容、图片和外链解析。
- 阶段 7:收口简介清洗与图片 URL 归一化。
- 阶段 5:继续完善 Simkl 真实支持的作品域能力,明确不支持角色/person 时的降级。
这样做的原因:
- 先让实体详情页消费现有数据,避免过早扩库表
- 再补站点仓库层字段,能直接看到 UI 收益
- 最后统一清洗和图片策略,减少重复解析逻辑
验证清单
每阶段至少完成以下验证:
./gradlew :app:compileDebugKotlin --no-daemon
涉及登录时额外验证:
- AniList 登录
- MAL 登录
- Simkl 登录
- 回调 URI 是否正确回到
ScrobblerConfigActivity
涉及浏览与详情时额外验证:
- 发现页首页加载
- 分类页分页
- 详情页推荐区块
- 详情页角色区块
- 详情页 creators / staff 区块
- 简介无 HTML 残留
- 高清图实际加载成功
进度记录建议
建议后续直接在本文档末尾追加:
- 已完成阶段
- 当前阻塞点
- 待验证项
- 关键接口差异
这样换机器继续时,不需要重新做上下文恢复。