这是一个用来在B站视频进度条上方建立显示弹幕热度的Chrome插件,以弹幕数量-时间的直方图显示,在高能处(定义为短期内有大量弹幕出现的时间点)有明显的峰值,能够用来直观地看视频中的热点,也能够拿来做为空降(跳跃快进)的指示。html
已经上架Chrome插件市场,在这里或者搜【Danmaku】就能找到。前端
源代码在GitHub,欢迎Star。jquery
其实作一个这样的插件的想法已经在脑海里盘桓好一阵了(创意来源于某Hub),直到最近才有空(摸鱼)写了出来,正好拿来做为TypeScript跟Chrome Extension的练手项目。git
插件的实现主要分为以下几个部分:github
基于chrome-extension-typescript-starter的脚手架。web
依靠Chrome Extension的manifest.json
文件能够指定在bilibili的页面中执行指定的代码文件。chrome
av号跟分P信息通常可从url中直接得到(形如https://www.bilibili.com/video/avXXXXX/?p=XXXX
),但事实上B站的视频格式分不少种,目前光我见到的就有下面几种:typescript
/video/avXXXXX/?p=XXXX
/watchlater/#/avXXXXXX/pXXXX
/video/avXXXXXX/index_XXXXX.html
/bangumi/play/epYYYYY/
/bangumi/play/ssZZZZZ
所以须要有不一样的处理,特别是番剧,url中没有av号信息,须要从DOM中获取。json
B站每一个视频都有一个av号,但因为每一个视频有可能有多个分P,所以B站还有一个隐含的cid用以索引一个具体的视频(以及弹幕),经过分析找到了这个API:api
https://api.bilibili.com/x/player/pagelist?aid=AV_ID&jsonp=jsonp
其实cid能够有多种方法得到,包括网页DOM、原网页HTML等等,但因为B站视频分类众多(普通视频、番剧、稍后再看、历史观看)且网页DOM都有不一样,所以仍是用这个API比较优雅
能够经过av号拿到该视频每一个分P的cid以及视频长度,而后经过API
https://comment.bilibili.com/CID.xml
可以获取xml格式的弹幕数据,告一段落
弹幕数据的解析参考自这篇博客
这个倒简单,处理一下弹幕数据调用echarts的API便可。
在用户点击切换分P或者其余操做的时候,B站前端用的是HTML5的History API(也有的是hashchange),所以不能光用window.onhashchange事件来监控。而对于H5 History的监控,标准上又只有onpopstate事件,没有onpushstate(这一点是我比较困惑的,望有人解惑)。
所以只能使用折中的方案:利用插件的background script以及webNavigation权限监控全部B站选项卡的history更新(经过chrome提供的onHistoryStateUpdated事件),而且创建content_script与background_script的链接进行单点通知,触发页面中的url更新事件。