昨晚 KNA 群里在讨论给本地播放器加弹幕功能。之前虽然听说过但是并未接触过所谓「弹幕池」的概念,但是星光菊苣说只要生成 SSA 字幕直接交给播放器挂上就成。并且,(虽然很想顺带吐槽 Zht 和我们争了半天最后槽点根本不在一个点子上orz) 少将也表示时效并不重要,不需要考虑播放器的字幕自动重载问题。

所以躺在床上的时候就考虑了下整体的架构。还是最拿手的 HTTP RESTful API,基本功能的话就是获取字幕和发送弹幕。大致的思路如下。

  • 客户端打开媒体文件后首先获得文件的 hash。有些播放器自动寻找字幕似乎是通过文件名.. 这样的话我改个名字岂不是彻底失效。不过用 hash 来做检索文件的唯一信息的话,不同压制组放出的同一部片源都会有不同的弹幕… 不过似乎也好,如果压制了字幕进去的话,有些针对字幕君的吐槽啊什么的.. 嘛于是就这样。
  • 服务端通过文件 hash 值来查找有无已存在的字幕文件。如果找到则直接发送文件给客户端,如果没有则在数据库中创建该条目,并生成新的字幕文件发送给客户端。
  • 客户端以约定好的数据格式发送弹幕信息。用户友好啊之类的(所见即所得什么的..) 就都是客户端的问题了.. 服务端拿到的应该是处理好的数据。
  • 服务端接收到新的弹幕后将其存进数据库,并追加到已有字幕文件。这样下次其他客户端再次请求该文件的时候就会看到弹幕。

剩下的就不知道了,因为上面几条出来之后我就睡着了zzzzZ

早上翘课写代码这种事情早就习以为常了… 更何况是(我已经不知道该如何吐槽)的老师的上机课….

基本架构和功能大概 3 小时搞定,之前大概花了将近 1 个小时看 SSA/ASS Subtitles 以及 Express 4.x 的文档。因为 Express 4.x 开始命令行工具被单独分开,害我半天没找到生成模板的命令… (你丫瞎改啥啊啊啊啊

编码过程里倒是没遇到啥坑,就是数据处理有点烦。因为没找到啥比较好的 SSA 字幕处理库,生成的时候都是手动处理,各种 + '\n' 什么的..

以及,SSA/ASS 字幕的格式特性让 Array.prototype.join 得以利用,省掉不少麻烦。

于是源码在这里。在基础架构之上还可以很方便的添加大量其他功能,验证啊什么的.. 顺便我还木有做 POST 数据的检查。这个大概晚些时候会加上。

四月的荒废状态持续了 27 天宣告结束。嘛,挣脱五月病要感谢星光菊苣、Zht、少将以及 KNA 字幕组的所有小伙伴们 >///< 感谢你们~

以后要继续加油喵!~