借用别人的,比自己做更麻烦......
今天,学而思结课了。这个星期以来过得也算是挺充实的,下午去图书馆的时候借了两本 C# 的书,比起语法方面,更头疼的是 .net 里各种奇怪的控件以及交互。
回到家后便习惯性地打开了 Visual Studio,戴上耳机写代码。
(话说每次都把真白给忽略了...)
最近是重写了几个之前写的逻辑比较混乱的类,比如那个获取番剧信息的,我本来是打算全部集中在一个类里面的。但是我却在首页窗体里直接写了调用 json 获取番剧......这一点都不 OOP 。嘛,不扯这个了。这几天尝试着在做最难得一个部分——番剧的播放,还要带弹幕……
完全没有头绪啊。
上 GitHub 搜了一波,还真别说,睿站这知名度真不是吹的。
1000+的 repo,107000+的代码量,看的都可怕。其中有爬虫,客户端源码,弹幕屏蔽正则表达式等…… 然而一筛选 C# 的 repo,瞬间就少了很多。运气特别好的是,我居然找到了一个用 C# 写的b站弹幕获取并播放的工程。兴奋地二话不说直接fork过来。
Clone 下来后一跑,效果很理想。很开心,然而……
当我输入的URL是番剧地址时:它却不能用了!!
这里需要说明的是,b站的视频页的URL在普通视频中都是av号,然而在番剧页面就是番剧的 episode_id ,即使你访问它的av号URL,也还是会被强行转过去。嘛,这就十分麻烦了。
b站的每个视频的弹幕文件都是一个xml文件,地址十分简单:http://comment.bilibili.com/{cid}.xml。其中最麻烦的是 cid ,b站视频对用户使用的编号是视频的avid,即av号。然而牵扯到弹幕文件,视频原始URL都是需要视频的 cid 的。它们之间并不是通过特定的算法得到的。
网络上流传的一个比较广的方法,是打开视频的播放页,然后在 swf 的播放器的参数中可以得到,然而现在b站已经淘汰掉了 swf 播放器,全部转为了新版H5播放器,这都得益于前阵子b站的热门开源项目的 flv.js 。然而视频页的H5播放器虽然是包含了 cid 参数,但播放器是通过 iframe 框架调用的,如果只是单纯获取网站源代码并不能得到 iframe 里面的内容;目前我所知道的好像也就只有 Python 的爬虫可以爬取框架内的内容。这和网易云音乐防爬虫爬取的做法是类似的。
十分难受啊。这时,我想起了之前提供 pixiv API 的那位大佬。他好像还做了b站的 API。上他的站一看,文档还挺全的,结果居然还真让我找到了。
这个是可以返回b站番剧的 cid 的。这个问题解决了!然而在改 BKlink 这个弹幕播放器的时候我也是心累,因为有很多完全用不到的功能,要将它们都注释掉,但又可能会影响到正常的功能。
就比如这个弹幕播放器原本是支持分P弹幕播放的,但我的番剧弹幕播放只有1P,所以这个功能可以删除。但是原作者为此创建了个分P的数组,我注释掉了数组,然后主功能找不到这个数组了,又要报错,我只能在不删掉这个数组的情况下,使 for 循环每次都循环一次,也就是只读取第一P的数据就可以了……
这也让我深深的感觉改别人的代码真的难受,况且原作者还没写任何注释,我几乎是从头到尾通读了两遍,但有些地方的功能还是没有摸清。费了好大心思删除了它自带的找 cid 的功能后,我让这个播放器直接读取我给它的 cid 的视频弹幕,最后总算是实现了。真的是大脑都在颤抖。
(大概就是这个效果,我一直都是拿妹抖龙来测试的... 真的是被郭德纲支配的恐惧。)
弹幕的问题解决了,那么下面就是视频播放的问题了。还是一样的思路,看 GitHub 上的前辈都是怎么做的,然后我发现大多数人都推荐 APlayer 这个视频引擎。查了一下,居然还是迅雷的!!
说真的,我真的挺佩服迅雷的,之前又听说过他将自己的 UI 库也开源了,大家也都知道迅雷的 UI 水平,以及安装界面的那个宇宙飞船。这个 APlayer 正是迅雷看看以及迅雷影音所在用的,又是一次把老本拿出来啊!诚意满满!!
照样找了个 Demo 文件,然后大概熟悉了一下这个引擎,确实设计的都挺科学的,各个方法也是通俗易懂。然而,当我输入b站的视频播放链接时,它居然没反应!!
什么鬼??当时我完全是懵逼的。将 URL 复制到 Chrome 直接访问,结果出现 403 拒绝访问?!
狡猾狡猾 b站在用户信息方面不加强保护,对于这些视频资源倒是防的挺严的。大概是要在请求头中加上 referer:http://www.bilibili.com/。然而我并不知道怎样让 APlayer 带 HTTP 请求头加载啊!迅雷那边的人肯定都不会考虑到我这种要加 referer 的需求啊……
心态瞬间就崩了。上百度搜了下,结果在 APlayer 的官方论坛的一个帖子的最底部看到了这个回答:
???
APlayer 的文档?就是那个看起来low到爆炸的 chm 文件?我打开了那个文档。瞬间发现了新世界!
功能十分的全,并且调用的方法十分简单,
Aplayer.SetConfig(ConfigID,value);
也就是只需要填入所需功能的编号,以及想要赋予的值就好。讲真,这种设置方式真的是十分的科学!!我也在文档下面找到了我要的:
功能一应俱全,不仅仅是 referer,几乎所有可能用到的 HTTP Header 都包含了!!向迅雷大佬低头!!中国良心企业!中国人民实现富强中国梦的奠基者!秒杀锤子!(你知道我指的是什么事) 。
设置好 referer 后,视频成功打开!
(别笑!但时我脑海中蹦出的第一个av号就是170001。然后就用它来测试了......)
最后,就到了最后的梦魇。我到现在写这篇文的时候依旧没有解决——播放视频的时候弹幕居然在视频的后面!!我尝试许多办法,比如将视频控件强行设置到最底层。但依然没用,那个弹幕是以一种非常奇怪的方式调用的,并不是定义一个类再将其实例化这种。实在没有什么好办法的,那我就只能到 GitHub 上给原作者发 issue 了。
我觉得他并不能看见……
这次真的试一次十分烧脑的尝试。第一次将被人的东西拿来改成自己的,但发现并没有那么容易,我甚至在想如果自己写一个会不会更简单些。(想太多)
别人的,到底还是别人的。
我还得理解他的思路,然后顺应他设立的规则。
唉......
喜欢这篇文章?为什么不打赏一下呢?