// ==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);
});
}
});
}