开头有话说
写这篇文章的意义并不在于分享技术,而是让更多的人知道这个方法,使用这个方法.
原文地址: https://segmentfault.com/a/1190000022184839
事出必有因
最新在B站刷<夺宝幸运星>这个动画片,动画时长8:30,片头1:30,片尾长1:08.合着中间内容就6分钟左右,我却要看2:30的片头片尾.每次遇到片头片尾都要手动去拉进度条,简直不能忍,我的时间那么宝贵,那竟然让我看片头!而这时候我发现B站竟然么有跳过片头片尾的功能!
好,你没有,为了更愉快的刷我的动画片,我给你写个.
问题咋解决
经过几十集的拉进度条训练,这个业务我已经很熟练了,我发现片头片尾的时长一般都是固定的.那么我们要想自动跳过片头片尾其实可以:
- 在视频加载完成后跳过指定的时间
- 在视频播放到还剩指定时间的时候切换到下一集
好了思路有了,那怎么控制视频跳过时间呢?
一开始我想通过控制鼠标来解决.后来发现不可控因素太多,于是我开始翻B站的代码,希望可以得到一些提示,黄天不负无聊人,我在window
对象上发现了player
这个属性,而这个属性还有一大坨的方法:
play
pause
reload
seek
...
简单试验之后发现,通过这个player
属性上带的方法我们就可以控制播放行为.
同时还发现了一些player
的事件
video_media_ended
video_media_error
video_media_loaded
...
结合以上所得,我们就可以实现我们想要的功能了.
代码长这样
function skip (start_length, end_length) {
if (!start_length || !end_length) {
return console.error('请设置片头和片尾时长')
}
let total_time = player.getDuration();
let skip_point_start = start_length;
let skip_point_end = total_time - end_length;
let has_listener = false;
const interval = 5000;
window.timer = 0;
function start () {
console.log('开搞');
if (timer) {
clearInterval(timer);
}
timer = setInterval(handler, interval)
}
function handler () {
let current_time = player.getCurrentTime();
if (current_time < skip_point_start) {
console.log('跳过片头')
return window.player.seek(start_length);
}
if (current_time >= skip_point_end) {
console.log('跳过片尾,下一集')
if (!has_listener) {
has_listener = true;
window.player.addEventListener('video_media_loaded', start);
}
return window.player.next();
}
}
start();
}
当然,如我们前面所说,要使用这个脚本需要指定两个时间:
片头时长和片尾时长,单位都是秒.
然后把这两个参数传给上面这个方法执行就行了
skip(90, 68);
这样就可以自动跳过片头片尾了,珍惜我们宝贵的时间.
效果怎么样
我用了两天时间,恩恩,不错,对于固定片头片尾的剧很好,但是会遇到一些片头规则,片尾不规则的情况,这种情况会出问题,经常是没看完就切换到下一集了.但这个问题不要紧,大家注意就行了.
更多的过程
我把一些更详细的内容放在仓库了,有需要的可以自取,记得转载注明出处就ok了
B站跳过开头结尾脚本 ~ aqiongbei/bilibili_scripts
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。