哔哩哔哩(B站|Bilibili)收藏夹Fix

修复 哔哩哔哩(B站|Bilibili) 失效的收藏。(可查看av号、标题、封面)

目前為 2019-05-19 提交的版本,檢視 最新版本

// ==UserScript==
// @name         哔哩哔哩(B站|Bilibili)收藏夹Fix
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  修复 哔哩哔哩(B站|Bilibili) 失效的收藏。(可查看av号、标题、封面)
// @author       Mr.Po
// @match        https://space.bilibili.com/*/favlist*
// @require      http://code.jquery.com/jquery-1.11.0.min.js
// @connect      biliplus.com
// @grant        GM_xmlhttpRequest
// ==/UserScript==

// 是否启用调试模式
var isDebug = false;

// 重试延迟[秒]
var retryDelay=5;

(function() {
    'use strict';

    var space = 2000;

    setInterval(updateFav,space);
})();

// 修改收藏
function updateFav(){

    var $lis = $("ul.fav-video-list.content li.small-item.disabled");

    if($lis.size()>0){

        $lis.each(function(i,it){

            var aid = $(it).attr("data-aid");
            var $a = $(it).find("a");

            $a.attr("href","https://www.biliplus.com/video/av"+aid+"/");
            $a.attr("target","_blank");

            fixTitleAndPic($(it),aid,$($a[1]));
            signInval($(it),$($a[1]))

            $(it).removeClass("disabled");
            $a.removeClass("disabled");
        });

        showDetail($lis);
    }
}

// 标记失效
function signInval($it,$a){

    var $pubdate = $it.find("div.meta.pubdate");
    $pubdate.attr("style","text-decoration:line-through");

    $a.attr("style","text-decoration:line-through");
}

// 绑定重新加载
function bindReload($a,fun){

    $a.text("->手动加载<-");

    $a.click(function(){

        $(this).unbind("click");

        $a.text("Loading...");

        fun();
    });
}

// 再次尝试加载
function retryLoad(retry,$a,fun){

    if(retry){// 手动重试

        $a.text("请求过快,请稍后["+retryDelay+"]s再试!");

        setTimeout(function(){

            bindReload($a,fun);

        },retryDelay*1000);

        countdown($a,retryDelay);

    }else{// 首次

        $a.attr("href","javascript:void(0);");

        bindReload($a,fun);
    }
}

// 加载倒计时
function countdown($a,second){

    if($a.text().indexOf("请求过快")==0){

        $a.text("请求过快,请稍后["+second+"]s再试!");

        if(second>1){
            setTimeout(function(){
                countdown($a,second-1);
            },1000);
        }
    }
}

// 修复成功
function fixSuccess($it,$a,aid,title,pic){

    $a.text(title);
    $a.attr("title",$a.text());
    $a.attr("href","https://www.biliplus.com/video/av"+aid+"/");

    isLoad(pic,function(){
        var $img = $it.find("img");
        $img.attr("src",pic);
    });
}

// 修复标题和海报
function fixTitleAndPic($it,aid,$a,retry){

    if(isDebug){
        console.log("fixTitleAndPic");
    }

    GM_xmlhttpRequest({
        method: 'GET',
        url: "https://www.biliplus.com/api/view?id="+aid,
        responseType:"json",
        onload: function(response){

            var res = response.response;

            if(isDebug){
                console.log("0---->:");
                console.log(res);
            }

            // 找到了
            if(res.title){

                fixSuccess($it,$a,aid,res.title,res.pic);

            }else if(res.code==-503){// 请求过快

                console.warn("0---->:av"+aid+",请求过快!");

                fixTitleAndPicEnhance3($it,$a,aid);

            }else{// 未找到

                fixTitleAndPicEnhance1(aid,$a,$it);
            }
        },
        onerror:function(e){
            console.log("出错啦");
            console.log(e);
        }
    });
}

// 修复标题和海报 增强 - 1
function fixTitleAndPicEnhance1(aid,$a,$it){

    GM_xmlhttpRequest({
        method: 'GET',
        url: "https://www.biliplus.com/all/video/av"+aid+"/",
        onload: function(response){

            //console.log("1---->:"+response.responseText);

            var params = response.responseText.match(/getjson\('(\/api\/view_all.+)'/);

            fixTitleAndPicEnhance2(params[1],$a,$it,aid);
        }
     });
}

// 修复标题和海报 增强 - 2
function fixTitleAndPicEnhance2(param,$a,$it,aid,retry){

    if(isDebug){
        console.log("fixTitleAndPicEnhance2");
    }

    GM_xmlhttpRequest({
        method: 'GET',
        url: "https://backup.biliplus.com"+param,
        responseType:"json",
        onload:  function(response){

            var res = response.response;

            if(isDebug){
                console.log("2---->:");
                console.log(res);
            }

            // 找到了
            if(res.code==0){

                fixSuccess($it,$a,aid,res.data.info.title,res.data.info.pic);

            }else if(res.code==-503){// 请求过快

                console.warn("2---->:av"+aid+",请求过快!");

                retryLoad(retry,$a,function(){
                    fixTitleAndPicEnhance2(param,$a,$it,aid,true);
                });

            }else{// 未找到

                $a.text("已失效("+aid+")");
                $a.attr("title",$a.text());
            }
        }
     });
}

// 修复标题和海报 增强 - 3
function fixTitleAndPicEnhance3($it,$a,aid){

    if(isDebug){
        console.log("fixTitleAndPicEnhance3");
    }

    GM_xmlhttpRequest({
        method: 'GET',
        url: "https://www.biliplus.com/video/av"+aid+"/",
        onload: function(response){

            try{

                if(isDebug){
                    console.log("3---->:"+response.responseText);
                }

                var jsonStr = response.responseText.match(/window\.addEventListener\('DOMContentLoaded',function\(\){view\((.+)\);}\);/)[1];

                if(isDebug){
                    console.log(jsonStr);
                }

                var res = $.parseJSON(jsonStr);

                if(res.title){// 存在

                    fixSuccess($it,$a,aid,res.title,res.pic);

                }else{// 不存在

                    fixTitleAndPicEnhance1(aid,$a,$it);
                }

            }catch(e){

                console.error(e);

                // 当出现错误时,出现手动加载
                retryLoad(retry,$a,function(){
                    fixTitleAndPic($it,aid,$a,true);
                });
            }
        }
     });
}

// 判断一个url是否可以访问
function isLoad(url,fun){
    $.ajax({
        url: url,
        type: 'GET',
        success: function(response) {
            fun();
        },
        error:function(e){}
    });
}

// 显示详细
function showDetail($lis){

    var fidRegex = window.location.href.match(/fid=(\d+)/);

        var fid;

        if(fidRegex){
            fid = fidRegex[1];
        }else{
            fid = $("div.fav-item.cur").attr("fid");
        }

        var pn = $("ul.be-pager li.be-pager-item.be-pager-item-active").text();

        $.ajax({
            url: "https://api.bilibili.com/medialist/gateway/base/spaceDetail?media_id="+fid+"&pn="+pn+"&ps=20&keyword=&order=mtime&type=0&tid=0&jsonp=jsonp",
            success: function(json){

                var $medias = json.data.medias;

                $lis.each(function(i,it){

                    var aid = $(it).attr("data-aid");

                    var $mediaF = $medias.filter(function(it){
                        if(it.id==aid){
                            return it;
                        }
                    });

                    var $media = $mediaF[0];

                    var $a = $(it).find("a");

                    var titles = "";

                    if($media.pages){

                        var $titlesM = $media.pages.map(function(it,i,arry){
                            return it.title;
                        });

                        titles = $titlesM.join("、");
                    }

                    var content = "av:"+aid+"\nP数:"+$media.page+"\n子P:"+titles+"\n简介:"+$media.intro

                    $($a[0]).attr("title",content);
                });
            }
        });
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址