Bangumi 条目排序

对条目列表进行按排名、人数、评分、时间排序,并可以按人数、时间筛选

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Bangumi 条目排序
// @namespace    https://github.com/bangumi/scripts/liaune
// @version      1.3
// @description  对条目列表进行按排名、人数、评分、时间排序,并可以按人数、时间筛选
// @author       Liaune
// @include      /^https?://(bangumi\.tv|bgm\.tv|chii\.in)/(.+?/tag|.+?/browser|subject_search)(/|\?).+/
// @grant        none
// ==/UserScript==

(function() {

    let sortstyle = -1, sortstyle1 = 1,sortstyle2 = 1,sortstyle3 = -1;
    //按排名排序
    const showBtn = document.createElement('a');  showBtn.addEventListener('click', SortByRank);  showBtn.className = 'chiiBtn';  showBtn.href='javascript:;';   showBtn.textContent = '排名排序';document.querySelector('#browserTools').append(showBtn);
    //按评分人数排序
    const showBtn1 = document.createElement('a'); showBtn1.addEventListener('click', SortByVote);  showBtn1.className = 'chiiBtn'; showBtn1.href='javascript:;'; showBtn1.textContent = '人数排序';document.querySelector('#browserTools').append(showBtn1);
    //按人数筛选
    const voteRange = document.createElement('input');voteRange.addEventListener('blur',Select);voteRange.className = 'textfield';$(voteRange).css({"width":"30px","height":"15px"});document.querySelector('#browserTools').append(voteRange);$(voteRange).hide();
    const voteRange1 = document.createElement('input');voteRange1.addEventListener('blur',Select);voteRange1.className = 'textfield';$(voteRange1).css({"width":"30px","height":"15px"});document.querySelector('#browserTools').append(voteRange1);$(voteRange1).hide();
    //按评分排序
    //const showBtn2 = document.createElement('a'); showBtn2.addEventListener('click', SortByPoint); showBtn2.className = 'chiiBtn'; showBtn2.href='javascript:;'; showBtn2.textContent = '评分排序';document.querySelector('#browserTools').append(showBtn2);
    //按时间排序
    const showBtn3 = document.createElement('a'); showBtn3.addEventListener('click', SortByTime); showBtn3.className = 'chiiBtn'; showBtn3.href='javascript:;'; showBtn3.textContent = '时间排序';document.querySelector('#browserTools').append(showBtn3);
    //按时间筛选
    const timeRange = document.createElement('input');timeRange.addEventListener('blur',Select);timeRange.className = 'textfield';$(timeRange).css({"width":"60px","height":"15px"});document.querySelector('#browserTools').append(timeRange);$(timeRange).hide();
    const timeRange1 = document.createElement('input');timeRange1.addEventListener('blur',Select);timeRange1.className = 'textfield';$(timeRange1).css({"width":"60px","height":"15px"});document.querySelector('#browserTools').append(timeRange1);$(timeRange1).hide();
    function ParseRank(rankstring){
        let rank = rankstring.match(/Rank (\d{1,4})/)? rankstring.match(/Rank (\d{1,4})/)[1]: 9999;
        return rank;
    }
    function ParseVote(votestring){
        let vote = votestring.match(/(\d{1,5})人评分/)? votestring.match(/(\d{1,5})人评分/)[1]: 0;
        return vote;
    }
    function ParseDate(Datestring){
        let yy = Datestring.match(/(\d{4})/)? Datestring.match(/(\d{4})/)[1].toString():'1000';
        Datestring = Datestring.match(/(\d{4})(年|-)(\d{1,2})(月|-)(\d{1,2})/);
        let year = Datestring ? Datestring[1].toString(): yy;
        let month = Datestring ? Datestring[3].toString(): '01';
        let day = Datestring ?Datestring[5].toString(): '01';
        let date= new Date(year+'/'+month+'/'+day);
        let now = new Date();
        return now.getTime()-date.getTime();
    }

    function SortByRank() {
        let itemsList = document.querySelectorAll('#browserItemList li.item');
        sortstyle = (sortstyle==1)? -1 :1;
        showBtn.textContent = (showBtn.textContent=='排名排序↑') ? '排名排序↓':'排名排序↑';
        let container = document.querySelector('ul#browserItemList');
        let arr=[];
        for(let i=0;i<itemsList.length;i++)   arr[i]=itemsList[i];
        arr.sort(function(li1,li2){
            let n1=li1.querySelector('.inner .rank')? ParseRank(li1.querySelector('.inner .rank').textContent): 9999;
            let n2=li2.querySelector('.inner .rank')? ParseRank(li2.querySelector('.inner .rank').textContent): 9999;
            return (n1-n2)*sortstyle;});
        for(let i=0; i<arr.length; i++)     $('#browserItemList').append(arr[i]);
    }

    function SortByVote() {
        $(voteRange).show();$(voteRange1).show();
        let itemsList = document.querySelectorAll('#browserItemList li.item');
        sortstyle1 = (sortstyle1==-1)? 1 :-1;
        showBtn1.textContent = (showBtn1.textContent=='人数排序↓') ? '人数排序↑':'人数排序↓';
        let container = document.querySelector('ul#browserItemList');
        let arr=[];
        for(let i=0;i<itemsList.length;i++)   arr[i]=itemsList[i];
        arr.sort(function(li1,li2){
            let n1=li1.querySelector('.inner .rateInfo .tip_j')? ParseVote(li1.querySelector('.inner .rateInfo .tip_j').textContent): 0;
            let n2=li2.querySelector('.inner .rateInfo .tip_j')? ParseVote(li2.querySelector('.inner .rateInfo .tip_j').textContent): 0;
            return (n1-n2)*sortstyle1;});
        for(let i=0; i<arr.length; i++)      $('#browserItemList').append(arr[i]);
    }

    function SortByPoint() {
        let itemsList = document.querySelectorAll('#browserItemList li.item');
        sortstyle2 = (sortstyle2==-1)? 1 :-1;
        showBtn2.textContent = (showBtn2.textContent=='评分排序↓') ? '评分排序↑':'评分排序↓';
        let arr=[];
        for(let i=0;i<itemsList.length;i++)   arr[i]=itemsList[i];
        arr.sort(function(li1,li2){
            let n1=li1.querySelector('.inner .fade')? parseFloat(li1.querySelector('.inner .fade').innerHTML): 0;
            let n2=li2.querySelector('.inner .fade')? parseFloat(li2.querySelector('.inner .fade').innerHTML): 0;
            if(n1==n2){
                let n11=li1.querySelector('.inner .rank')? ParseRank(li1.querySelector('.inner .rank').textContent): 9999;
                let n22=li2.querySelector('.inner .rank')? ParseRank(li2.querySelector('.inner .rank').textContent): 9999;
                return (n22-n11)*sortstyle2;
            }
            else return (n1-n2)*sortstyle2;
        });
        for(let i=0; i<arr.length; i++)     $('#browserItemList').append(arr[i]);
    }
    function SortByTime() {
        $(timeRange).show();$(timeRange1).show();
        let itemsList = document.querySelectorAll('#browserItemList li.item');
        sortstyle3 = (sortstyle3==-1)? 1 :-1;
        showBtn3.textContent = (showBtn3.textContent=='时间排序↓') ? '时间排序↑':'时间排序↓';
        let container = document.querySelector('ul#browserItemList');
        let arr=[];
        for(let i=0;i<itemsList.length;i++)   arr[i]=itemsList[i];
        arr.sort(function(li1,li2){
            let n1=li1.querySelector('.inner .info')? ParseDate(li1.querySelector('.inner .info').textContent): 0;
            let n2=li2.querySelector('.inner .info')? ParseDate(li2.querySelector('.inner .info').textContent): 0;
            return (n1-n2)*sortstyle3;
        });
        for(let i=0; i<arr.length; i++)     $('#browserItemList').append(arr[i]);
    }
    function Select(){
        let itemsList = document.querySelectorAll('#browserItemList li.item');
        itemsList.forEach( (elem, index) => {
             $(elem).show();
            let time = elem.querySelector('.inner .info')? ParseDate(elem.querySelector('.inner .info').textContent): 0;
            let mintime = timeRange.value !="" ? ParseDate(timeRange.value):ParseDate("1000-1-1");
            let maxtime = timeRange1.value !="" ? ParseDate(timeRange1.value):ParseDate("3000-1-1");
            let vote = elem.querySelector('.inner .rateInfo .tip_j')? ParseVote(elem.querySelector('.inner .rateInfo .tip_j').textContent): 0;
            let minvote = voteRange.value !="" ? parseInt(voteRange.value):0;
            let maxvote = voteRange1.value !="" ? parseInt(voteRange1.value):20000;
            if(time>mintime || time<maxtime || vote<minvote || vote>maxvote)
                $(elem).hide();
        });
    }

})();