Greasy Fork

Greasy Fork is available in English.

bangumi关联条目显示增强

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

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

})();