Skip to content

添加三个实用功能#2174

Open
ZHwash wants to merge 13 commits into
Predidit:mainfrom
ZHwash:pr1.1
Open

添加三个实用功能#2174
ZHwash wants to merge 13 commits into
Predidit:mainfrom
ZHwash:pr1.1

Conversation

@ZHwash

@ZHwash ZHwash commented Jun 5, 2026

Copy link
Copy Markdown

Kazumi 新增功能Changelog

注意:使用了AI辅助编程技术

新增功能

功能一:番剧卡片长按/右键收藏菜单

目标

在热门、时间线、搜索、收藏页面上,长按或右键点击番剧卡片时弹出「添加到分类」菜单,允许用户快速将番剧加入已创建的自定义收藏分类。

改动文件

文件 改动
lib/bean/widget/collect_button.dart 新增可选 menuController / iconSize / constraints / padding 参数;switch→map 重构
lib/bean/widget/collectable_card_wrapper.dart (新) 共享 StatefulWidget,包裹任意卡片,提供 MenuController + GestureDetector + CollectButton 叠加层
lib/bean/card/bangumi_card.dart 新增 onLongPress / onSecondaryTap 回调
lib/bean/card/bangumi_timeline_card.dart 新增 onLongPress / onSecondaryTap 回调
lib/pages/collect/collect_page.dart 始终渲染 CollectButton;编辑模式 = 40px 圆形,普通模式 = 32px 半透明圆形
lib/pages/popular/popular_page.dart CollectableCardWrapper 包裹 BangumiCardV
lib/pages/timeline/timeline_page.dart CollectableCardWrapper 包裹 BangumiTimelineCard
lib/pages/search/search_page.dart CollectableCardWrapper 包裹 BangumiCardV

设计要点

  • CollectableCardWrapper 始终渲染 GestureDetector + CollectButtonStack
  • 按钮位置:right: 4, bottom: 8(32×32 半透明圆形)
  • BackdropFilter(Windows 渲染兼容性)
  • 长按/右键触发 MenuController.open(),复用原有的分类菜单逻辑

功能二:收藏页更新角标

目标

在收藏页(追踪中)的番剧卡片上显示红色角标,提示该番剧有未观看的新剧集。

改动文件

文件 改动
lib/utils/update_check_service.dart (新) UpdateCheckService — 遍历「在看」列表,调用 Bangumi API 获取最新集数,与已记录集数比较
lib/pages/collect/collect_controller.dart ObservableSet<int> bangumiIdsWithUpdate@action checkForUpdates() 含 20s 超时;loadCollectibles() 中延迟调用
lib/pages/collect/collect_page.dart 卡片右上角红点角标
lib/modules/collect/collect_module.dart CollectedBangumi 新增 eps 字段 (@HiveField(3)),记录总集数
lib/repositories/collect_crud_repository.dart 新增 updateCollectibleEps(id, eps) 方法,更新收藏番剧的集数信息

设计要点

  • 使用 BangumiApi.getBangumiEpisodesByID()(type=0 的剧集数)而非每插件查询
  • 懒加载 _crudRepo 避免 DI 死锁
  • 15s(Service 层)+ 20s(Controller 层)超时,防止启动卡死

功能三:时间线卡片显示播出集数

目标

在时间线页面的每张番剧卡片上显示最新已播集数(更新至第X话),并支持按播出日期排序。

改动文件

文件 改动
lib/bean/card/bangumi_timeline_card.dart 新增 episodeCount / onLongPress / onSecondaryTap 参数;底部显示 ▶ 更新至第X话;GestureDetector 包裹 InkWell 支持长按/右键
lib/pages/timeline/timeline_controller.dart 新增 ObservableMap<int, int> episodeCounts + isLoadingEpisodes + fetchEpisodeCounts() 异步并行加载;changeSortType() 新增第 4 种排序(按 airDate)
lib/pages/timeline/timeline_controller.g.dart MobX 代码生成(自动生成)
lib/pages/timeline/timeline_page.dart episodeCounts[item.id] 传入 BangumiTimelineCard
lib/modules/bangumi/bangumi_item.dart 新增 airTime 字段 (@HiveField(15));fromJson 中解析 airtime.time
lib/modules/bangumi/bangumi_item.g.dart Hive 适配器自动更新
lib/modules/bangumi/episode_item.dart 新增 airdate / status 字段 + isAired 计算属性,判断剧集是否已播出

调用时机

  • getSchedules()(当前季度)/ getSchedulesBySeason()(历史季度)完成后自动触发 fetchEpisodeCounts()
  • 遍历日历中所有番剧 ID,并行批量请求(每批10个)调用 BangumiApi.getBangumiEpisodesByID()
  • 统计 type=0 且已播出 的集数(即 isAired == true),取最大集数

性能优化

  • 并行批量加载:原来串行加载70个番剧需约70秒,现在并行批量加载(每批10个)只需约7秒(提升10倍)
  • 分批控制:每批10个并发请求,避免过多并发导致 Bangumi API 限流
  • 智能过滤:只统计 type=0(正片)且 isAired == true 的集数,排除未播出和特别篇

功能回退

以下功能已在开发过程中被移除或简化:

回退一:移除时间线卡片中的星期和具体时间显示

原因

  • Bangumi 网站本身不显示具体的更新时间
  • 保持界面简洁,只显示最核心的集数信息

移除内容

  • ❌ 星期显示(周一~周日)
  • ❌ 具体播出时间(如 20:00)
  • ✅ 保留:集数显示(更新至第X话)

当前时间线卡片底部显示

▶ 更新至第12话  ⭐ 8.5  #123  👍 456
Screenshot_2026-06-05-14-06-35-093_com predidit k Screenshot_2026-06-05-14-06-37-947_com predidit k Screenshot_2026-06-05-14-06-26-196_com predidit k Screenshot_2026-06-05-14-06-30-369_com predidit k

@ZHwash

ZHwash commented Jun 5, 2026

Copy link
Copy Markdown
Author

存在一个小bug:时间线卡片显示播出集数在每次完全重新打开此程序(后台完全关闭)时需要重新加载,一般在10s左右。此bug我暂时无法处理。

@Predidit

Predidit commented Jun 5, 2026

Copy link
Copy Markdown
Owner

感谢你的工作,但是此实现目前无法接受

我们不能改变 Bangumi API 的行为,在 Bangumi API 的榜单与时间表API没有提供放送进度的情况下,我们应该倾向于不实现此功能,而不是为每个动画进行单独的详情请求,来让一个页面的网络请求数放大几十倍,这也是重新加载要 10s 的原因

@ZHwash

ZHwash commented Jun 5, 2026

Copy link
Copy Markdown
Author

请问后续的更新提醒功能将如何实现?

感谢你的工作,但是此实现目前无法接受

我们不能改变 Bangumi API 的行为,在 Bangumi API 的榜单与时间表API没有提供放送进度的情况下,我们应该倾向于不实现此功能,而不是为每个动画进行单独的详情请求,来让一个页面的网络请求数放大几十倍,这也是重新加载要 10s 的原因

@Predidit

Predidit commented Jun 5, 2026

Copy link
Copy Markdown
Owner

在 Bangumi 提供相关接口前,这些功能无法推进,当前为每个番剧单独请求一次详情的做法是不可接受的

@ZHwash

ZHwash commented Jun 5, 2026

Copy link
Copy Markdown
Author

好的。请问是否需要单独添加功能一:'长按或右键可直接呼出分类页面',亦或类似功能性开发已在计划中?如可行,我可以提交此单独功能的pr

在 Bangumi 提供相关接口前,这些功能无法推进,当前为每个番剧单独请求一次详情的做法是不可接受的

@Predidit

Predidit commented Jun 5, 2026

Copy link
Copy Markdown
Owner

功能一暂时没有相关计划,自定义收藏分类不在当前计划中

因为当前五种分类是在和 Bangumi 官方保持一致

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants