3
头图

开头有话说

写这篇文章的意义并不在于分享技术,而是让更多的人知道这个方法,使用这个方法.

原文地址: 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


aqiongbei
2k 声望281 粉丝

人生路上,你走的每一步都算数