0%

Bilibili-Gate - 动态 - 合并时间线

Bilibili-Gate - 分组查看动态 最近添加一种新的实现:「合并时间线」

代码

https://github.com/magicdawn/Bilibili-Gate/blob/v0.29.0/src/modules/rec-services/dynamic-feed/group/merge-timeline-service.ts

说明

最初实现是从全部动态中筛选出属于分组的动态, 但动态 API 全部动态只会保存最近一段时间 or 一定数量, 不太清楚机制, 所以这种方式获取的分组动态会不全.
而且基于筛选的方式, 可能为了一条很久之前的动态, 会造成大量无用请求.

合并时间线

类似归并排序(divide + merge) 中 merge 步骤. 对分组中的每个 UP 维护一个 bufferQueue, 每次从这些 queues 中取出一个最值, 组成一个新的 list.
具体来说, 依赖 B 站动态 API 返回的 id_str 有序, 或者 pub_ts 有序也行, 最值取 id_str 最大的即可.

弊端: 为了获取队头, 需要每个 queue 都至少包含一项, 也就对应着一次请求. 所以限制为 20 个. 越多, 启动越慢, 而且会造成瞬时并发, 有引发风控的风险.