Greasy Fork is available in English.

智慧树网课助手

自动挂机看知到MOOC,支持屏蔽弹窗题目、自动切换下一节,章测试和考试支持自动答题,视频自动倍速播放、线路选择、默认静音等,解除各类功能限制,开放自定义参数

< Feedback on 智慧树网课助手

سوئال / ئىنكاس

§
يوللانغان ۋاقتى: 2020-04-15

关于"限制视频挂机时长"功能计时不准确的修复办法

脚本用了挺久了,最近才注意到有个限制视频挂机时长的功能。但是这个功能有点问题:1.5倍速下实际播放时长远超设置的时长。下面是我个人研究后找到的解决方案。 1.添加 var lastCache = { duration: 0.0, currentTime: 0.0, debug = 0 //打开debug功能,会在控制台显示剩余时间。 }; 2.添加函数 function remainingTime(){ var duration = self.PlayerStarter.playerArray[0].player.cache.duration; var currentTime = self.PlayerStarter.playerArray[0].player.cache.currentTime; if(lastCache.duration == 0){ lastCache.duration = duration; lastCache.currentTime = currentTime; } var delta = currentTime - lastCache.currentTime; if(delta < 0){ //delta = setting.time * setting.speed / 1E3; delta = lastCache.duration - lastCache.currentTime; if(delta > 1){ delta -= setting.time * setting.speed / 1E3 - currentTime; //这个if不加应该也行,只是为了计时更精确 } delta += currentTime; lastCache.duration = duration; } setting.habit -= delta; lastCache.currentTime = currentTime; if(lastCache.debug == 1){ var outtime = Math.round(setting.habit * 1E3); console.log("剩余时间: " + parseInt(outtime / 6E4) + ":" + parseInt(outtime % 6E4 / 1E3) + ":" + parseInt(outtime % 1E3)); } } 3.修改totalTime()函数 将 setting.habit -= player.paused() ? 0 : setting.time; 替换为 remainingTime(); 4.修改habit参数为你想要设定的时长,单位为分钟。建议稍微多设置一点。 不知道为什么设置不了代码格式,就这样吧: ( 希望作者能看到。

wyn665817ئاپتور
§
يوللانغان ۋاقتى: 2020-04-15
تەھرىرلەنگەن ۋاقتى: 2020-04-15

@Skeleton321 说道: 限制视频挂机时长的功能,问题:1.5倍速下实际播放时长远超设置的时长。

注意:限制视频挂机时长的功能设定的参数,与播放速度无关,只是计时功能,且有一定的限制,即循环计时区间内,视频为播放状态才会计入统计时间。(切换视频不影响计时功能)

请不要混淆视频播放在进度条实际时间上去的区别,前者为视频进度,后者为实际时间。脚本的计时功能是基于后者的实际时间,而不是进度条上的时间,进度条上的时间受视频倍速影响。

wyn665817ئاپتور
§
يوللانغان ۋاقتى: 2020-04-15

再来说一下你的代码,先将代码格式化:

var lastCache = {
    duration: 0,
    currentTime: 0,
    debug: 0 // 打开debug功能,会在控制台显示剩余时间。
};

function remainingTime() {
    var duration = self.PlayerStarter.playerArray[0].player.cache.duration;
    var currentTime = self.PlayerStarter.playerArray[0].player.cache.currentTime;
    if (lastCache.duration == 0) {
        lastCache.duration = duration;
        lastCache.currentTime = currentTime;
    }
    var delta = currentTime - lastCache.currentTime;
    if (delta < 0) {
        // delta = setting.time * setting.speed / 1E3;
        delta = lastCache.duration - lastCache.currentTime;
        if (delta > 1) {
            delta -= setting.time * setting.speed / 1E3 - currentTime; // 这个if不加应该也行,只是为了计时更精确
        }
        delta += currentTime;
        lastCache.duration = duration;
    }
    setting.habit -= delta;
    lastCache.currentTime = currentTime;
    if (lastCache.debug == 1) {
        var out_time = Math.round(setting.habit * 1E3);
        console.log("剩余时间: " + parseInt(out_time / 6E4) + ":" + parseInt(out_time % 6E4 / 1E3) + ":" + parseInt(out_time % 1E3));
    }
}

代码第14行,delta值的产生,可以理解为你在取进度条上的播放进度。 代码第15~23行,可以理解为切换视频后,进行的处理。

代码第15行的判断,有明显的BUG,delta < 0也可能是由于手动向前拖动了进度条,导致当前进度小于上次的进度值。这会直接导致计时出现极大的偏差。

基于对你的代码分析,你可能是想在倍速的情况下,计时进度条的时间进度。如果要实现此功能,可以简单修改脚本即可。

// 脚本原代码
setting.habit -= player.paused() ? 0 : setting.time;

// 修改后的代码
setting.habit -= player.paused() ? 0 : setting.time * setting.speed;
§
يوللانغان ۋاقتى: 2020-04-16

第15行原本是判断是否开始播放后续的视频,手动拖动进度条的问题确实没有考虑到,直接判断视频url可能会更好? 除此之外,我还遇到其他的问题,例如一个15分钟的视频,在1.5倍速下本应该10分钟看完,但网页版可能只看了9分钟或更短的时间,平台就认为看完了这个视频,且学习记录中统计的时间为15分钟。这个可能是个个例。综合来看,直接统计播放时间的效果可能会更好。

جاۋاب قايتۇرۇش

جاۋاب قايتۇرۇش ئۈچۈن كىرىش.