水木杉 发表于 2020-6-22 17:45

油猴脚本——B站收藏夹视频观看记录保存

本帖最后由 水木杉 于 2020-6-22 17:52 编辑

    相信很多人和我一样在B站上收藏了很多视频,有些视频长时间没看都不知道自己到底看没看过,尤其是一些学习视频,一段时间后就不知道到底看到哪一集了。针对这个问题,我写了一个油猴脚本,帮助你记录收藏夹中视频的观看记录,当你有一天再次打开的时候就能给你提示,帮助你跳转到正确页面。
    1、进入B站收藏夹页面,如下图所示,脚本会帮你保存你收藏夹中的视频






   2、如果你的视频放在多个收藏夹里,还需要你一个个把收藏夹点开展现在屏幕上,脚本才能查找得到,保存完后会冒出保存了多少视频的提示框。

像这种有很多页的也需要你一页一页的翻动一下(因为第一次接触js,水平实在有限),收藏了新视频也需要重新回到这里保存一遍


3、当你每次从主页的收藏那里点击观看你收藏的视频的时候(如下图),就能在视频左侧看到记录了




这个小窗口不处理的话20s后就会自动关闭,你观看其他集的时候也能自动保存观看到哪一集了




下面是代码,直接粘贴到你的油猴里面吧...
(保存用的是油猴的GM_setValue函数,记录保存在了浏览器内置的 LevelDB)
*****************************************************************************************************
// ==UserScript==
// @name         保存B站收藏夹观看记录
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description保存B站收藏夹中视频的观看记录,当你打开视频时会自动定位。
// @author       sersan
// @match      https://www.bilibili.com/*
// @match      https://space.bilibili.com/*
// @require      http://code.jquery.com/jquery-1.11.0.min.js
// @grant      GM_setValue
// @grant      GM_getValue
// ==/UserScript==

(function()
{
    'use strict';

    //var url_old = window.location.href;
    //console.log(url_old);


    //********************************************函数*******************************
    //保存收藏夹到Chrome 内置的 LevelDB 中
    var saveText = function()
    {
      //alert('Hello world!');
      var text = GM_getValue('myCollect');
      var myCollect={};
      var len = 0;
      if(text != undefined)
      {
            //console.log(text);

            var MyArray = JSON.parse( text );
            for(var ever in MyArray)
            {
                //console.log(ever);
                myCollect = MyArray;
                len++;
            }

      }


      const $lis = $("ul.fav-video-list.content li.small-item");
      for (var i=0;i<$lis.length;i++)
      {
            //console.log($lis);
            //var fireOnThis = document.querySelector('.fav-video-list');
            var urlSave = $lis.getElementsByTagName('a').href;
            //var textSave = $lis.getElementsByTagName('a').text;
            //console.log(urlSave);
            var num =1;
            var temp = {
                'url': urlSave,
                'num':num

            };
            var isexit = false;
            for(var ever1 in MyArray)
            {
                if(MyArray.url == urlSave)
                {
                  isexit = true;
                  break;
                }
            }

            if(!isexit)
            {
                myCollect = temp;
                len++;
            }

      }
      var myCollectJson = JSON.stringify(myCollect);

      GM_setValue('myCollect', myCollectJson);
      var str1 = '保存成功! 共保存了 '+ (len+1) + ' 部视频!';
      alert(str1);

    };


    //现在的地址在收藏夹中是否存在
    var checkurl = function()
    {
      //如果只有1集就不再往下了
      var lastpage = $('.cur-page');
      //console.log(lastpage);
      if(lastpage.length == 0)
      {
            return;
      }
      var lastnum = lastpage.text().split('/') - '0';
      //匹配现在的网址是不是在收藏夹中
      var url_now = window.location.href;
      var text = GM_getValue('myCollect');
      var MyArray = JSON.parse( text );
      var page = 1;
      var isexit = false;
      for(var ever in MyArray)
      {
            if(url_now == MyArray.url)
            {
                isexit = true;
                page = MyArray.num;
                break;

            }
      }

      if(isexit)
      {

            var body = document.getElementsByTagName("body");
            var div = document.createElement("div");

            div.id = 'myIdser';
            div.style.display = '';
            div.style.position = 'fixed';
            div.style.top = '420px';
            div.style.left = '10px';
            div.style.width = '160px';
            div.style.height = '80px';
            div.style.overflow = 'hidden';
            div.style.zIndex = '9999';
            div.style.boxShadow = '0 3px 6px #999';
            div.onscroll = function ()
            {
                div.scrollLeft = 0;
                div.scrollTop = 0;
            };
            //新的地址
            var url_new = url_now + '?p=' + page;
            var url_new_next = url_now + '?p=' + (page+1);

            var info = "<p class='pos_fixed'style='font-size:18px;color:red;text-align:center'>发现了观看记录: </p>";
            var info1 = "<p class='pos_fixed'style='font-size:18px;color:red;text-align:center'>第 " + page + " 集</p>";
            div.innerHTML += info;
            div.innerHTML += info1;

            var input_ly = document.createElement("input");
            input_ly.type = "button";
            input_ly.style.position = 'fixed';
            input_ly.style.button = '10px';
            input_ly.style.left = '15px';
            input_ly.setAttribute("class","button");
            input_ly.setAttribute("value","跳到该集");
            input_ly.addEventListener("click",function(ev){window.location.href=url_new;});
            input_ly.setAttribute("left","0px");
            input_ly.setAttribute("font-size","12px");
            input_ly.setAttribute("height","18px");
            input_ly.setAttribute("width","40px");

            var input_ly1 = document.createElement("input");
            input_ly1.type = "button";
            input_ly1.style.position = 'fixed';
            input_ly1.style.button = '10px';
            input_ly1.style.left = '110px';
            input_ly1.setAttribute("class","button");
            input_ly1.setAttribute("value","到下一集");
            input_ly1.addEventListener("click",function(ev){window.location.href=url_new_next;});
            input_ly1.setAttribute("right","0px");
            input_ly1.setAttribute("font-size","12px");
            input_ly1.setAttribute("height","18px");
            input_ly1.setAttribute("width","40px");


            div.appendChild(input_ly);
            if(page != lastnum)
            {
                div.appendChild(input_ly1);
            }

            document.body.appendChild(div);
            window.setTimeout(function(){div.remove();},20000);

      }
      else
      {

            var div1 = document.getElementById("myIdser");
            if(div1)
            {
                div1.remove();
            }
            var isNeedSave = false;
            for(var everone in MyArray)
            {
                if(url_now.indexOf(MyArray.url) != -1)
                {
                  if((url_now.split("=")-'0') != MyArray.num)
                  {
                         MyArray.num = url_now.split("=") - '0';
                        isNeedSave = true;
                        break;
                  }
                  break;
                }
            }

            //将新的观看记录保存
            if(isNeedSave)
            {
                isNeedSave = false;
                //alert('Hello world!');
                var myCollectJson = JSON.stringify(MyArray);
                GM_setValue('myCollect', myCollectJson);
                //console.log(GM_getValue('myCollect', myCollectJson));

            }

      }

    }



    //******************************************入口**********************************
    //判断是不是在收藏页,在收藏页面将保存收藏夹信息
    const favlistRegex = /https:\/\/space\.bilibili\.com\/\d+\/favlist.*/;
    const flag = favlistRegex.test(window.location.href);
    //console.log(flag);
    if (flag)
    {
      //监听触发操作
      function hashChange()
      {
            //alert('事件触发了!');
            saveText();
      }
      window.setTimeout(function()
      {
            saveText();
            const $lis = $("ul.fav-video-list.content li.small-item");
            var url_inner = $lis.getElementsByTagName('a').href;

            //url变化监听器 每3s检测一次
            setInterval(function()
            {
                //var ischanged = window.location.href != url_old;
                const $lis = $("ul.fav-video-list.content li.small-item");
                var urlSave = $lis.getElementsByTagName('a').href;
                var isSureChange = urlSave != url_inner;
                if(isSureChange)
                {
                  //url_old = window.location.href;
                  url_inner = urlSave;
                  hashChange();
                }
            }, 3000);
      }, 3000);

    }
    else
    {
      //不是收藏夹页面
      checkurl();
      var url_old = window.location.href;

      //url变化监听器 每3s检测一次
      setInterval(function()
      {
            var ischanged = window.location.href != url_old;
            if(ischanged)
            {
                url_old = window.location.href;
                checkurl();
            }
      }, 3000);

    }






})();


水木杉 发表于 2020-6-22 19:59

oudaidai 发表于 2020-6-22 19:47
一进入收藏夹就会弹出保存视频的那个窗口吗?我好像弹不出来。。。(无JS基础)

有可能是浏览器设置问题,或者是不兼容,我也不是很懂。。。

水木杉 发表于 2020-6-22 21:47

孤独无情 发表于 2020-6-22 21:37
能搞个压缩包或者gxs的下载链接吗 纯代码不会用啊 尴尬

点开Tampermonke,点添加新脚本,再粘贴上代码保存就能用了

andyle 发表于 2020-6-22 18:02

一般都是收藏夹直接记录

xueyuchen 发表于 2020-6-22 18:12

谢谢,吾爱有你更精彩

johnnywei 发表于 2020-6-22 18:27

哆啦A梦好评

tian321 发表于 2020-6-22 18:58

谢谢分享。

bsjasd 发表于 2020-6-22 19:04

多谢分享

oudaidai 发表于 2020-6-22 19:47

一进入收藏夹就会弹出保存视频的那个窗口吗?我好像弹不出来。。。(无JS基础)

戒色大师 发表于 2020-6-22 19:57

andyle 发表于 2020-6-22 18:02
一般都是收藏夹直接记录

但是收藏夹找起来麻烦啊

SharkCan 发表于 2020-6-22 20:05

油猴真是万能的, 居然可以这么用 。非常棒!
页: [1] 2
查看完整版本: 油猴脚本——B站收藏夹视频观看记录保存