bangumi关联条目显示增强

显示条目页面关联条目的完成情况

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

})();