吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1250|回复: 23
收起左侧

[其他求助] 如何用油猴脚本记录b站合集视频播放进度,并自动恢复?

[复制链接]
一个学渣 发表于 2024-2-26 12:19
50吾爱币
本帖最后由 一个学渣 于 2024-2-27 13:12 编辑

例如如下合集视频,播放单个视频不会记录进度,每次都重新开始。

https://www.bilibili.com/video/BV1oJ4m1W7UD/?spm_id_from=333.788&vd_source=41a8a53d53212f30c2f1f0e069cf966e

我想在脚本的这个部分,加入记录合集中单个视频的“播放进度并恢复”功能,该怎么写?
有没有大佬帮写下啊?


[Java] 纯文本查看 复制代码
            /* 记录播放速度的信息 */
            let rateKey = "_h5_player_playback_rate_"
            // 修改
            let url = window.location.href;
            let url2 = document.querySelector('.first-line-title')?.href || 'not_season';

            const regex = /\/(BV\w+)/;
            const match = url.match(regex);

            if(match){

                let bvNumber = match[1];

                // 如果是合集,用合集id替换BV
                if(url2 != 'not_season'){
                    let regex2 = /\?(sid=\w+)/;
                    let match2 = url2.match(regex2)[1].replace('sid=', '');
                    console.log("合集",match2);
                    bvNumber =match2;
                }

                rateKey += bvNumber;
            }else if(url.includes("bvid")){
                rateKey += url.substr(url.lastIndexOf("bvid=")+5)
            }

            console.log("设置播放速度",rateKey,curPlaybackRate,)
            !isInCrossOriginFrame() && window.localStorage.setItem(rateKey, curPlaybackRate);

            t.playbackRate = curPlaybackRate;

            delete player.playbackRate;
            player.playbackRate = curPlaybackRate;
            try {
                originalMethods.Object.defineProperty.call(Object, player, 'playbackRate', {
                    configurable: true,
                    get: function () {
                        return curPlaybackRate
                    },
                    set: function () {}
                });
            } catch (e) {
                debug.error('解锁playbackRate失败', e);
            }

            /* 本身处于1倍播放速度的时候不再提示 */
            if (!num && curPlaybackRate === 1) {
                return true
            } else {
                !notips && t.tips(i18n.t('tipsMsg.playspeed') + player.playbackRate);
            }
        },




最佳答案

查看完整内容

加了一个判断,解决了第二个问题,缩小了保存间隔,理论上播放完毕会重置进度到0 [mw_shl_code=javascript,true]function modifyVideoProgress(progress_cache_key){ // 从本地存储中获取进度 let progress = localStorage.getItem(progress_cache_key); if (progress) { // 如果本地存储中有进度值,则设置视频播放进度为该值 video.currentTime = parseFloat(progress); ...

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
yunchu + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fcml45 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zx2000 发表于 2024-2-26 12:19
一个学渣 发表于 2024-3-5 12:09
谢谢大佬,带p合集可以用!但有两个小问题。

1.就是视频播放到末尾的时候,进度会被记录下来。这时候 ...

加了一个判断,解决了第二个问题,缩小了保存间隔,理论上播放完毕会重置进度到0
[JavaScript] 纯文本查看 复制代码
function modifyVideoProgress(progress_cache_key){
    // 从本地存储中获取进度
        let progress = localStorage.getItem(progress_cache_key);
        if (progress) {
            // 如果本地存储中有进度值,则设置视频播放进度为该值
            video.currentTime = parseFloat(progress);
        }
    }
// 定义进度缓存的键
let progress_cache_key_prefix = "progress_cache_";
// 获取视频元素
let video = document.querySelector("video");

let progress_cache_key = progress_cache_key_prefix + document.querySelector("meta[itemprop='url']").content.split("/")[4] + (new URLSearchParams(window.location.search).get("p") || "");
modifyVideoProgress(progress_cache_key);

// 创建一个 MutationObserver 实例,监听视频切换
let observer = new MutationObserver(function(mutationsList) {
    for (let mutation of mutationsList) {
        if (mutation.type === 'childList' || mutation.type === 'characterData') {
            let new_progress_cache_key = progress_cache_key_prefix + document.querySelector("meta[itemprop='url']").content.split("/")[4] + (new URLSearchParams(window.location.search).get("p") || "");
            // 防止新视频短时间内多次更新进度
            if(progress_cache_key != new_progress_cache_key){
                modifyVideoProgress(new_progress_cache_key);
                progress_cache_key = new_progress_cache_key;
            }
        }
    }
});
// 配置 MutationObserver 监听 title 元素的属性变化
let title = document.querySelector("title");
observer.observe(title, { childList: true, subtree: true, characterData: true });

// 创建定时器,每隔1s保存视频进度
    setInterval(()=>{
        let progress_cache_key = progress_cache_key_prefix + document.querySelector("meta[itemprop='url']").content.split("/")[4] + (new URLSearchParams(window.location.search).get("p") || "");;
        localStorage.setItem(progress_cache_key, video.currentTime);
    },1000)
cga10000 发表于 2024-2-26 15:43
要在脚本中添加记录合集中单个视频的播放进度并恢复功能,你可以使用localStorage来存储和读取每个视频的播放进度。下面是一个示例代码,用于记录和恢复合集中的单个视频的播放进度:

javascript
// 获取当前视频的BV号或合集ID
let bvNumber = '';
if (match) {
  bvNumber = match[1];
} else if (url.includes("bvid")) {
  bvNumber = url.substr(url.lastIndexOf("bvid=") + 5);
}

// 构建用于记录播放进度的键值
let progressKey = "_video_progress_" + bvNumber;

// 检查localStorage中是否已经记录了该视频的播放进度
let savedProgress = window.localStorage.getItem(progressKey);

// 如果有记录,则将播放器的currentTime设置为记录的播放进度
if (savedProgress) {
  player.currentTime = parseFloat(savedProgress);
}

// 监听视频的timeupdate事件,实时更新并保存播放进度
player.addEventListener('timeupdate', function() {
  let currentProgress = player.currentTime;
  window.localStorage.setItem(progressKey, currentProgress);
});
以上代码通过监听视频的timeupdate事件,在视频的播放过程中实时更新并保存播放进度。当用户重新打开合集中的某个视频时,会检查localStorage中是否已经记录了该视频的播放进度,如果有记录,则将播放器的currentTime设置为记录的播放进度,从而恢复上次观看的位置。

免费评分

参与人数 1吾爱币 -3 收起 理由
苏紫方璇 -3 禁止照搬ai回复

查看全部评分

 楼主| 一个学渣 发表于 2024-2-26 21:16
cga10000 发表于 2024-2-26 15:43
要在脚本中添加记录合集中单个视频的播放进度并恢复功能,你可以使用localStorage来存储和读取每个视频的播 ...

没效果,造成设置刷屏
 楼主| 一个学渣 发表于 2024-2-28 20:22
有没有大佬看看?
 楼主| 一个学渣 发表于 2024-3-1 23:00
周末有人吗?
梦汐 发表于 2024-3-2 17:17
合集的记录之前写过,但效果不好删掉了,简单点说就是获取URL判断是否为合集,取出合集的标识符,然后记录视频播放进度和合集选集,然后保存到本地,下次打开重新上面步骤并判断当前选集是否小于上次选集然后跳转
https://www.52pojie.cn/thread-1807516-1-1.html
zx2000 发表于 2024-3-2 20:31
你是要只记录合集的视频播放进度还是所有视频的播放进度
 楼主| 一个学渣 发表于 2024-3-2 20:44
本帖最后由 一个学渣 于 2024-3-2 20:46 编辑
zx2000 发表于 2024-3-2 20:31
你是要只记录合集的视频播放进度还是所有视频的播放进度

所有的。(不过单集视频网站好像可以自己记录)
主要是合集视频(包括一个视频里分好多p的),比如播放第一个视频到1分钟处,
然后点击下一集,播放第二个视频,
此时点击上一集,回到第一个视频,还是从头开始,无法恢复播放进度到1分钟处。

我想能进行记录。
zx2000 发表于 2024-3-3 21:14
本帖最后由 zx2000 于 2024-3-3 21:53 编辑

[JavaScript] 纯文本查看 复制代码
// 定义进度缓存的键
let progress_cache_key_prefix = "progress_cache_";
// 获取视频元素
let video = document.querySelector("video");

let progress_cache_key = progress_cache_key_prefix + document.querySelector("meta[itemprop='url']").content.split("/")[4];

// 从本地存储中获取进度
let progress = localStorage.getItem(progress_cache_key);
if (progress) {
    // 如果本地存储中有进度值,则设置视频播放进度为该值
    video.currentTime = parseFloat(progress);
}
// 创建一个 MutationObserver 实例,监听视频切换
let observer = new MutationObserver(function(mutationsList) {
    for (let mutation of mutationsList) {
        if (mutation.type === 'attributes' && mutation.attributeName === 'title') {
            progress_cache_key = progress_cache_key_prefix + document.querySelector("meta[itemprop='url']").content.split("/")[4];
            let newProgress = localStorage.getItem(progress_cache_key);
            if (newProgress) {
                video.currentTime = parseFloat(newProgress);
            }
        }
    }
});
// 配置 MutationObserver 监听 title 元素的属性变化
let title = document.querySelector(".video-title");
observer.observe(title, { attributes: true, attributeOldValue: true, attributeFilter: ['title'] });

// 创建定时器,每隔5s保存视频进度
    setInterval(()=>{
        let progress_cache_key = progress_cache_key_prefix + document.querySelector("meta[itemprop='url']").content.split("/")[4];
        localStorage.setItem(progress_cache_key, video.currentTime);
    },5000)
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 02:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表