返回列表 发新帖

【哔哩哔哩】历史记录进度备份

  [复制链接]

9

主题

2704

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3201
好评
0
信誉
145

考神MT论坛新人MT论坛帅哥挂机大佬

发表于 2023-7-14 00:11:06 来自手机  | 显示全部楼层 | 阅读模式  来自 广东
本帖最后由 2640554600 于 2023-7-14 00:11 编辑


【哔哩哔哩】
历史记录
进度备份
哔哩哔哩自带的历史记录
有效期只有三个月左右
所以 写来自用的插件
功能大致就是下图
播放进度
大于85%会在
【TA的视频】里隐藏
避免重复播放



  1. // ==UserScript==
  2. // [url=home.php?mod=space&uid=]@name[/url]        哔哩哔哩 - 进度备份
  3. // [url=home.php?mod=space&uid=]@namespace[/url]   Violentmonkey Scripts
  4. // [url=home.php?mod=space&uid=]@match[/url]       *://*.bilibili.com/*
  5. // [url=home.php?mod=space&uid=]@version[/url]     1.0
  6. //版权:俊哥
  7. //版权所有 侵权必究
  8. //举报联系QQ2640554600
  9. (() => {
  10.     const config = {
  11.         "hide_watched_videos": true,//隐藏观看过的视频
  12.         "backup_to_cloud": true
  13.     };
  14.     const rules = {
  15.         "all": [".*://.*.bilibili.com.*", []],
  16.         "home": [".*://www.bilibili.com(?:$|/$|/\\?.*)", [RemoveAdsHome]],//首页
  17.         "video": [".*://www.bilibili.com/video/([ab][v][a-z0-9]*).*", [RecordPlayTime]],//视频
  18.         "sapce": [".*://space.bilibili.com/.*", [PlayProgressUI]]//主页
  19.     };
  20.     (function () {
  21.         for (type in rules) {
  22.             var focus = rules[type]
  23.             var regexp = RegExp(focus[0], "i").exec(window.location.href)
  24.             if (regexp != null) {
  25.                 console.log("\u9875\u9762\u7c7b\u578b", type, "|", "\u4f7f\u7528\u51fd\u6570", focus[1]);
  26.                 for (let i = 0; i < focus[1].length; i++) {
  27.                     focus[1][i].call(null, { regexp: regexp.slice(1,) })
  28.                 }
  29.             }
  30.         }
  31.     }());
  32.     //(new webdav("dav账号", "dav密码")).AutoBack('bilibili')//改为自己的号!!!
  33.     //----------------功能模块
  34.     function RecordPlayTime() {//记录播放进度
  35.         $(bind)
  36.         function bind() {
  37.             let window = unsafeWindow
  38.             $('video,bwp-video').on("timeupdate", throttle(
  39.                 function () {
  40.                     if ("__INITIAL_STATE__" in window) {
  41.                         if ("bvid" in window.__INITIAL_STATE__) {
  42.                             let bvid = window.__INITIAL_STATE__.bvid
  43.                             let duration = parseInt(this.target.duration)
  44.                             let currentTime = parseInt(this.target.currentTime)
  45.                             let old = GM_getValue_local("history", bvid, false)
  46.                             if (!old || old.p < currentTime) {
  47.                                 GM_setValue_local("history", bvid, { d: duration, p: currentTime })
  48.                             } else {
  49.                                 //当前进度小于历史最大进度
  50.                             }
  51.                         }
  52.                     }
  53.                 }, 1000
  54.             ))
  55.             $('video,bwp-video').on("ended",
  56.                 () => {
  57.                     if ("bvid" in window.__INITIAL_STATE__) {
  58.                         let PlayList = GM_getValue('PlayList', null)
  59.                         let Index = PlayList.indexOf(window.__INITIAL_STATE__.bvid)
  60.                         if (Index != -1) {
  61.                             location.replace('https://www.bilibili.com/video/' + PlayList[++Index])
  62.                         }
  63.                     }
  64.                 }
  65.             )
  66.         }

  67.     }
  68.     function PlayProgressUI() {//进度条
  69.         ObserveNewElements(".small-item.fakeDanmu-item", insert)
  70.         window.onfocus = function (e) {
  71.             $('.small-item.fakeDanmu-item').each(
  72.                 function () {
  73.                     insert(this)
  74.                 }
  75.             )
  76.         }
  77.         function insert(element) {
  78.             var id = $(element).attr('data-aid')
  79.             var history = GM_getValue_local("history", id, false)
  80.             if (!!history) {//判断JSON是否为空
  81.                 var progress_ui = document.createElement('div');
  82.                 var Percent = getPercent(history.p, history.d)
  83.                 $(progress_ui).attr('class', 'progress').attr('style', 'top: 0px;position: absolute;width: 100%;height: 4px;background-color: #909090;').html(`<div id="content" style="width: ${Percent}%;height: 100%;background-color: #f00;"></div>`);
  84.                 $(element).find('.cover').append(progress_ui);
  85.                 if (config["hide_watched_videos"]) {//读取设置
  86.                     if (Percent > 85) {
  87.                         $(element).hide();
  88.                         $(element).css('border', '1px solid #e9e9e9')
  89.                     }
  90.                 }
  91.             }
  92.         }
  93.     }
  94.     function RemoveAdsHome() {
  95.         $(
  96.             function () {
  97.                 let observer = new MutationObserver((mutationsList, observer) => {
  98.                     // 遍历每一个发生变化的 mutation
  99.                     for (let mutation of mutationsList) {
  100.                         // 检查新增元素
  101.                         if (mutation.type === 'childList') {
  102.                             // 遍历新增的节点和子节点
  103.                             mutation.addedNodes.forEach(node => {
  104.                                 if ($(node).is('.bili-video-card.is-rcmd') || $(node).is('.feed-card')) {
  105.                                     handleNode(node);
  106.                                 }
  107.                             });
  108.                         }
  109.                     }
  110.                 });

  111.                 // 要监视的目标节点
  112.                 let targetNode = document.body;

  113.                 // 配置并启动 MutationObserver
  114.                 observer.observe(targetNode, { childList: true, subtree: true });

  115.                 // 处理新增的节点的函数
  116.                 function handleNode(node) {
  117.                     if (node.marking) {
  118.                         return null
  119.                     }
  120.                     let element = $(node).find("div>a")[0]
  121.                     if (!element.getAttribute('href').includes("www.bilibili.com")) {
  122.                         node.marking = true
  123.                         if ($(node.parentElement).is('.feed-card')) {
  124.                             node.parentElement.parentElement.appendChild(node.parentElement);
  125.                         } else {
  126.                             node.parentElement.appendChild(node);
  127.                         }
  128.                         console.log("移除广告", node);
  129.                     }
  130.                 }
  131.                 $('.bili-video-card.is-rcmd').each(function () {
  132.                     handleNode(this)
  133.                 });
  134.             }
  135.         )
  136.     }
  137.     //----------------常用函数
  138.     function throttle(fn, intvl, ...prm) {//节流
  139.         let timer;
  140.         let interval;
  141.         return function (...args) {
  142.             if (!timer) {
  143.                 timer = setTimeout(function () {
  144.                     interval = intvl
  145.                     fn.call(...args, ...prm)
  146.                     timer = null;
  147.                 }, interval)
  148.             }
  149.         }
  150.     }
  151.     function formatTime(seconds) {//转换时间格式
  152.         let minutes = Math.floor(seconds / 60);
  153.         seconds = seconds % 60;
  154.         return (minutes < 10 ? "0" : "") + minutes + ":" + (seconds < 10 ? "0" : "") + seconds;
  155.     }
  156.     function getPercent(num, total) {//取百分比
  157.         num = parseFloat(num);
  158.         total = parseFloat(total);
  159.         if (isNaN(num) || isNaN(total)) {
  160.             return 0;
  161.         }
  162.         return total <= 0 ? "0%" : (Math.round(num / total * 10000) / 100.00);
  163.     }
  164.     function ObserveNewElements(selector, response, filter) {//selector,call(node,mutation),filterRepetition=true)
  165.         'use strict';
  166.         if (!!selector) {
  167.             let config = {
  168.                 childList: true,
  169.                 subtree: true
  170.             };
  171.             const mutationCallback = (mutationsList) => {
  172.                 for (let mutation of mutationsList) {
  173.                     let type = mutation.type;
  174.                     if (type == "childList") {
  175.                         if (mutation.addedNodes.length != 0) {
  176.                             var New_node = []
  177.                             for (let index = 0; index < mutation.addedNodes.length; index++) {
  178.                                 var Nodes = $(mutation.addedNodes[index])
  179.                                 for (let Tindex = 0; Tindex < Nodes.length; Tindex++) {
  180.                                     if ($(Nodes[Tindex]).is(selector)) {
  181.                                         New_node.push(Nodes[Tindex])
  182.                                     }
  183.                                 }
  184.                                 Nodes.find(selector).each(
  185.                                     function () {
  186.                                         New_node.push(this)
  187.                                     }
  188.                                 )
  189.                             }
  190.                             if (New_node.length > 0) {
  191.                                 setTimeout((function (list) {
  192.                                     for (let i = 0; i < list.length; i++) {
  193.                                         if (filter) {
  194.                                             if (list[i]['OpenFilter']) {
  195.                                                 continue;
  196.                                             } else {
  197.                                                 list[i]['OpenFilter'] = true
  198.                                             }
  199.                                         }
  200.                                         response.call(mutation, list[i], mutation)
  201.                                     }
  202.                                 }(New_node)), 300)
  203.                             }
  204.                         }
  205.                     }
  206.                 }
  207.             };
  208.             var observe = new MutationObserver(mutationCallback);
  209.             observe.observe(document, config)
  210.             return observe
  211.         }
  212.     }
  213.     function GM_getValue_local(id, key, defaultValue) {
  214.         var data = GM_getValue(id, {});
  215.         return data[key] || defaultValue;
  216.     }
  217.     function GM_setValue_local(id, key, value) {
  218.         var data = GM_getValue(id, {});
  219.         data[key] = value;
  220.         return GM_setValue(id, data);
  221.     }
  222. })();
复制代码


文件:【哔哩哔哩】历史记录备份
https://2640554600.lanzoui.com/ipEh112ch8qh

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

9

主题

2704

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3201
好评
0
信誉
145

考神MT论坛新人MT论坛帅哥挂机大佬

发表于 2023-7-14 00:11:53 来自手机  | 显示全部楼层  来自 广东
【哔哩哔哩】历史记录进度备份
回复

使用道具 举报

19

主题

3703

回帖

8924

积分

硕士生

Rank: 6Rank: 6

金币
1377
好评
0
信誉
100

MT论坛新人MT论坛最佳新人MT论坛帅哥考神

发表于 2023-7-14 00:16:02 来自手机  | 显示全部楼层  来自 湖北
看看是啥
回复

使用道具 举报

282

主题

4134

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
5852
好评
23
信誉
128

考神MT论坛新人MT论坛最佳新人MT论坛帅哥MT论坛活跃会员MT论坛灌水老大

发表于 2023-7-14 00:20:30 来自手机  | 显示全部楼层  来自 北京
路过看看
回复

使用道具 举报

2

主题

8668

回帖

2万

积分

博士后

小白

Rank: 8Rank: 8

金币
10385
好评
1
信誉
147

考神MT论坛新人

发表于 2023-7-14 00:22:13 来自手机  | 显示全部楼层  来自 河南
看看隐藏
回复

使用道具 举报

4

主题

6254

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3952
好评
5
信誉
96

考神MT论坛帅哥MT论坛新人

发表于 2023-7-14 00:25:05 来自手机  | 显示全部楼层  来自 河南
多谢分享
回复

使用道具 举报

2

主题

589

回帖

1244

积分

高中生

Rank: 4

金币
90
好评
1
信誉
99
发表于 2023-7-14 00:28:30 来自手机  | 显示全部楼层  来自 湖北
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

85

主题

7249

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
777
好评
96
信誉
147

考神MT论坛活跃会员MT论坛新人MT论坛最佳新人MT论坛帅哥MT论坛侠客挂机大佬

发表于 2023-7-14 00:29:04 来自手机  | 显示全部楼层  来自 新疆
感谢分享
回复

使用道具 举报

20

主题

1178

回帖

3402

积分

大学生

Rank: 5Rank: 5

金币
3125
好评
2
信誉
96

MT论坛新人考神

QQ
发表于 2023-7-14 00:29:29 来自手机  | 显示全部楼层  来自 安徽
看看隐藏
回复

使用道具 举报

0

主题

3275

回帖

8849

积分

硕士生

Rank: 6Rank: 6

金币
5261
好评
2
信誉
100
发表于 2023-7-14 00:32:16 来自手机  | 显示全部楼层  来自 甘肃
感谢分享
回复

使用道具 举报

13

主题

5044

回帖

1万

积分

博士生

E●机甲FK

Rank: 7Rank: 7Rank: 7

金币
3850
好评
22
信誉
100

MT论坛最佳新人MT论坛帅哥MT论坛新人考神MT论坛活跃会员挂机大佬

QQ
发表于 2023-7-14 00:37:21 来自手机  | 显示全部楼层  来自 安徽
感谢分享
回复

使用道具 举报

22

主题

6592

回帖

2万

积分

博士后

超级至尊VIP

Rank: 8Rank: 8

金币
6092
好评
6
信誉
99

考神MT论坛新人MT论坛帅哥MT论坛最佳新人MT论坛活跃会员挂机大佬

发表于 2023-7-14 00:57:20 来自手机  | 显示全部楼层  来自 甘肃
看看隐藏
回复

使用道具 举报

47

主题

2297

回帖

8304

积分

硕士生

Rank: 6Rank: 6

金币
4576
好评
20
信誉
110

考神

发表于 2023-7-14 01:00:56 来自手机  | 显示全部楼层  来自 陕西
回复看看
回复

使用道具 举报

4

主题

589

回帖

2002

积分

大学生

Rank: 5Rank: 5

金币
1193
好评
0
信誉
119

考神MT论坛新人MT论坛最佳新人MT论坛帅哥

发表于 2023-7-14 01:14:43 来自手机  | 显示全部楼层  来自 山东
非常感谢大佬的分享
回复

使用道具 举报

95

主题

8181

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
297
好评
28
信誉
108

考神MT论坛新人MT论坛帅哥MT论坛最佳新人MT论坛活跃会员

发表于 2023-7-14 01:24:32 来自手机  | 显示全部楼层  来自 湖北
支持一下
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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