// ==UserScript==
// @name bangumi关联条目显示增强
// @namespace https://github.com/bangumi/scripts/liaune
// @version 0.4.3
// @description 显示条目页面关联条目的完成情况
// @author Liaune
// @include /^https?:\/\/((bangumi|bgm)\.tv|chii.in)\/subject\/\d+$/
// @grant GM_addStyle
// ==/UserScript==
(function() {
GM_addStyle(`
.rank{
padding: 2px 5px 1px 5px;
background: #b4b020;
color: #FFF;
-webkit-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
-moz-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px
}
.rank_1{
padding: 2px 5px 1px 5px;
background: #15d7b3;
color: #FFF;
-webkit-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
-moz-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px
}
.wish{
border-color: #fd59a9;
border-style: solid;
border-width:2px;
border-radius: 4px
}
.collect{
border-color: #3838e6;
border-style: solid;
border-width:2px;
border-radius: 4px
}
.do{
border-color: #15d748;
border-style: solid;
border-width:2px;
border-radius: 4px
}
.on_hold{
border-color: #f6af45;
border-style: solid;
border-width:2px;
border-radius: 4px
}
.dropped{
border-color: #5a5855;
border-style: solid;
border-width:2px;
border-radius: 4px
}
`);
let update=0,count=0;
const itemsList = document.querySelectorAll('#columnSubjectHomeB ul.browserCoverMedium li');
const itemsList2 = document.querySelectorAll('#columnSubjectHomeB ul.coversSmall li');
const TotalItems=itemsList.length + itemsList2.length;
//修改柱状图高度
let votes_subject = document.querySelectorAll('.horizontalChart li a .count');
let vote_subject = new Array(); for(i=0;i<votes_subject.length;i++) vote_subject[i]=votes_subject[i].textContent.match(/\d+/)?votes_subject[i].textContent.match(/\d+/)[0]:0;
let largest=0; for(i=0;i<vote_subject.length;i++) {if(parseInt(vote_subject[i])>largest) largest=parseInt(vote_subject[i]);}
for(i=0;i<votes_subject.length;i++){height=parseFloat(parseInt(vote_subject[i])/largest*100).toFixed(2).toString(); votes_subject[i].style.height=height+'%';}
//更新缓存数据
const showBtn = document.createElement('a');
showBtn.addEventListener('click', Update);
showBtn.className = 'chiiBtn';
showBtn.href='javascript:;';
showBtn.textContent = '更新';
GetInfo(update);
function Update(){
count=0;
update=1;
GetInfo(update);
}
function GetInfo(update){
itemsList.forEach( (elem, index) => {
elem.style.height="150px";
let href = elem.querySelector('a.avatar').href;
let href1 = href.replace(/subject/,"update");
let ID = href.split('/subject/')[1];
if(localStorage.getItem(ID+'Votes') && !update)
DisplayRank(localStorage.getItem(ID+'Rank'),index,1);
else ShowRank(href,index,1);
if(localStorage.getItem(ID+'Interest') && !update)
DisplayCollect(localStorage.getItem(ID+'Interest'),index,1);
else if(localStorage.getItem(ID+'Votes')>20 || !localStorage.getItem(ID+'Votes')) ShowCollect(href1,index,1);
});
itemsList2.forEach( (elem, index) => {
elem.style.height="150px";
elem.style.width="82px";
let href = elem.querySelector('a').href;
let href1 = href.replace(/subject/,"update");
let ID = href.split('/subject/')[1];
if(localStorage.getItem(ID+'Votes') && !update)
DisplayRank(localStorage.getItem(ID+'Rank'),index,0);
else ShowRank(href,index,0);
if(localStorage.getItem(ID+'Interest') && !update)
DisplayCollect(localStorage.getItem(ID+'Interest'),index,0);
else if(localStorage.getItem(ID+'Votes')>20 || !localStorage.getItem(ID+'Votes')) ShowCollect(href1,index,0);
});
}
function ShowCollect(href,index,args){
fetch(href,{credentials: "include"})
.then(data => {
return new Promise(function (resovle, reject) {
let targetStr = data.text();
resovle(targetStr);
});
})
.then(targetStr => {
let Match = targetStr.match(/"GenInterestBox\('(\S+?)'\)" checked="checked"/);
let interest = Match ? Match[1] : null;
let ID = href.split('/update/')[1];
if(Match) localStorage.setItem(ID+'Interest',interest);
if(!update) DisplayCollect(interest,index,args);
else{
count+=1;
showBtn.textContent='更新中... (' + count + '/' + TotalItems +')';
if(count==TotalItems){ location.reload(); showBtn4.textContent='更新完毕!';}
}
});
}
function DisplayCollect(interest,index,args){
let avatarNeue,pictureFrameGroup;
if(args) avatarNeue = document.querySelectorAll('#columnSubjectHomeB ul.browserCoverMedium li')[index].querySelector('span.avatarNeue');
else pictureFrameGroup = document.querySelectorAll('#columnSubjectHomeB ul.coversSmall li')[index].querySelector('span.pictureFrameGroup');
if(interest=='wish'){
if(args) avatarNeue.classList.add('wish');
else pictureFrameGroup.classList.add('wish');
}
else if(interest=='collect'){
if(args) avatarNeue.classList.add('collect');
else pictureFrameGroup.classList.add('collect');
}
else if(interest=='do'){
if(args) avatarNeue.classList.add('do');
else pictureFrameGroup.classList.add('do');
}
else if(interest=='on_hold'){
if(args) avatarNeue.classList.add('on_hold');
else pictureFrameGroup.classList.add('on_hold');
}
else if(interest=='dropped'){
if(args) avatarNeue.classList.add('dropped');
else pictureFrameGroup.classList.add('dropped');
}
}
function ShowRank(href,index,args){
fetch(href,{credentials: "include"})
.then(data => {
return new Promise(function (resovle, reject) {
let targetStr = data.text();
resovle(targetStr);
});
})
.then(targetStr => {
let canMatch = targetStr.match(/<small class="alarm">#(\S+?)<\/small>/);
let rankNum = canMatch ? parseInt(canMatch[1], 10) : null;
let ID = href.split('/subject/')[1];
if(canMatch) localStorage.setItem(ID+'Rank',rankNum);
let Match2 = targetStr.match(/<span property="v:votes">(\S+?)<\/span>/);
let votes = Match2? parseInt(Match2[1]) : null;
if(Match2) localStorage.setItem(ID+'Votes',votes);
if(!update) DisplayRank(rankNum,index,args);
else{
showBtn.textContent='更新中... (' + count + '/' + TotalItems +')';
if(count==itemsList.length){ location.reload(); showBtn4.textContent='更新完毕!';}
}
});
}
function DisplayRank(rankNum,index,args){
let rankSp = document.createElement('span');
rankSp.className = 'rank';
if (rankNum) {
if(rankNum<=1500) rankSp.classList.add('rank_1');
else rankSp.classList.add('rank');
rankSp.innerHTML = `<small>Rank </small>${rankNum}`;
}
else rankSp.style.display="none";
if(args) document.querySelectorAll('#columnSubjectHomeB ul.browserCoverMedium li')[index].append(rankSp);
else document.querySelectorAll('#columnSubjectHomeB ul.coversSmall li')[index].append(rankSp);
count+=1;
if(count==TotalItems && document.querySelector('#columnSubjectHomeB .subject_section .clearit'))
document.querySelector('#columnSubjectHomeB .subject_section .clearit').append(showBtn);
}
})();