保种和认领分析

Seeds statistics for HDPT/HHclub

// ==UserScript==
// @name         保种和认领分析
// @namespace    http://tampermonkey.net/
// @version      0.5.1
// @description  Seeds statistics for HDPT/HHclub
// @author       ootruieo
// @match        https://hdpt.xyz/userdetails.php?id=*
// @match        https://hhanclub.top/userdetails.php?id=*
// @match        https://wintersakura.net/userdetails.php?id=*
// @match        https://piggo.me/userdetails.php?id=*
// @grant        GM.xmlHttpRequest
// @license      GNU GPLv3
// ==/UserScript==
///更新记录
//v0.5  新增适配站点猪猪网;认领和统计适配站点分页机制;
//v0.4  新增适配站点HHclub
//v0.3  适配改版做种页面
//v0.2  适配分页认领(存在问题:官种等分析仅统计当前显示分页)
//v0.1  基本功能

(function() {
    'use strict';

    // Your code here...

    function sleep(time) {
        return new Promise((resolve) => setTimeout(resolve, time)).catch((e)=>{console.log(e);});
    }

    var regOfficial = /\s$/i;
    var claimCellIndex = -1;
    var domainName = '';
    var uid = '';
    const GetKa1TableId = function(){
        var seeding = document.getElementById("ka1").childNodes;
        for(var i = 1;i < seeding.length; i++){
            if(seeding[i].tagName == 'TABLE'){
                return i;
            }
        }
        return 0;
    }

    const ShowOfficialTorrents = function(){
    	var tableId = GetKa1TableId();
        var seeding = document.getElementById("ka1").childNodes;
        if(document.getElementById ("cboxOfficialOnly").checked){
            seeding[(tableId - 8)].innerText = officialSeedCount;
            for(var i = 1;i < seeding[tableId].rows.length;i++){
                if(seeding[tableId].rows[i].id =="unofficial" || seeding[tableId].rows[i].id =="dunplicate" ){
                    seeding[tableId].rows[i].setAttribute("style", "display:none");
                }
            }
        }
        else{
            seeding[(tableId - 8)].innerText = totalSeedCount;
            for(var j = 1;j < seeding[tableId].rows.length;j++){
                if(seeding[tableId].rows[j].id =="unofficial"){
                    seeding[tableId].rows[j].removeAttribute("style");
                }
            }
        }
    }

    const HighlightOfficialTorrents = function(element){
    	var tableId = GetKa1TableId();
        var seeding = document.getElementById("ka1").childNodes;
        if(document.getElementById ("cboxOfficialBgColor").checked){
            for(var i = 1;i < seeding[tableId].rows.length;i++){
                if(seeding[tableId].rows[i].id =="official5"){
                    seeding[tableId].rows[i].setAttribute("style", "background:LightGreen !important");
                }
                else if(seeding[tableId].rows[i].id =="official10"){
                    seeding[tableId].rows[i].setAttribute("style", "background:LightBLue !important");
                }
                else if(seeding[tableId].rows[i].id =="official"){
                    seeding[tableId].rows[i].setAttribute("style", "background:Wheat !important");
                }
                else if(seeding[tableId].rows[i].id =="dunplicate"){
                    seeding[tableId].rows[i].setAttribute("style", "background:Grey !important");
                }
            }
        }
        else{
            for(var j=1;j < seeding[tableId].rows.length;j++){
                if(seeding[tableId].rows[j].id.startsWith("official")){
                    seeding[tableId].rows[j].removeAttribute("style");
                }
            }
        }
    }

    const ClaimAllTorrents = async function(){
        if(!document.getElementById ("cboxOfficialOnly").checked){
            if(!window.confirm("请确认是否认领非官种?\n1.认领官种请勾选仅显示官种\n注意:OK/确定 = 认领非官种!!!")){
                return;
            }
        }
        var tableId = GetKa1TableId();
        var btnClaimAllTorrents = document.getElementById ("claimAllTorrents");
        btnClaimAllTorrents.setAttribute("disabled","1");
        btnClaimAllTorrents.setAttribute("style", 'margin-left:5px;margin-top:10px;margin-bottom:10px;color:grey;');
        btnClaimAllTorrents.setAttribute("value","认领中...");

        var seeding = document.getElementById("ka1").childNodes;
        var count =0;
        var sucess = 0;
        for(var i = 1;i < seeding[tableId].rows.length;i++){
            var rowstyle = seeding[tableId].rows[i].getAttribute("style");
            if(rowstyle == undefined || rowstyle != "display:none"){
                //console.log(seeding[tableId].rows[i].cells[claimCellIndex]);
                var claimCells = seeding[tableId].rows[i].cells[claimCellIndex].childNodes;
                if(claimCells.length == 2 && claimCells[0].tagName == 'BUTTON' && claimCells[0].style.display == "flex"){
                    count ++;
                    var id = parseInt(seeding[tableId].rows[i].cells[1].getElementsByTagName('a')[0].href.replace(domainName,"").replace("details.php?id=","").replace("&hit=1",""));
                    await jQuery.post("ajax.php",  {action: "addClaim", params: {"torrent_id": id}}, function (response) {
                        var resp =JSON.parse(response);
                        if(resp.ret == 0){
                            console.log(`认领成功(ID= ${id})`);
                            seeding[tableId].rows[i].setAttribute("style", "background:Green !important");
                            sucess += 1;
                        }else{
                            console.log(`认领失败(ID= ${id}):${resp.msg}`);
                            seeding[tableId].rows[i].setAttribute("style", "background:Red !important");
                        }
                    });
                    await sleep(10);
                }
            }
        }
        btnClaimAllTorrents.removeAttribute("disabled");
        btnClaimAllTorrents.setAttribute("value","一键认领");
        btnClaimAllTorrents.setAttribute("style", 'margin-left:5px;margin-top:10px;margin-bottom:10px;font-weight:bold;color:red;');
        alert(`本次可认领种子${count}个,成功认领${sucess}个`);
    }

    var officialSeedCount = 0;
    var totalSeedCount = 0;
    var _sizeUnits = "BKMGTPEZY";
    var _sizeReg = /[KMGTPEZY]/i;
    const SizeToGb = function(size){
        var sizeNum = parseFloat(size);
        var m = size.match(_sizeReg);
        if( m != null){
            return sizeNum * Math.pow(1024, _sizeUnits.indexOf(m[0]) - 3);
        }else{
            return sizeNum/1024/1024/1024;
        }
    }

    const GetNextPageTorrents = async function(page){
        let resp = await new Promise((resolve, reject) => {
               GM.xmlHttpRequest({
                   method: 'GET',
                   url: `${domainName}getusertorrentlistajax.php?page=${page}&userid=${uid}&type=seeding`,
                   headers: {
                       'Accept': 'application/json, text/javascript, */*; q=0.01',
                   },
                   dataType: 'json',
                   onload: function(response){
                       resolve(response.responseText);
                   },
                })
            });
           if(resp != ''){
               let parser = new DOMParser();
               var dom = parser.parseFromString(resp, "text/html");
               var nextPage = dom.childNodes[0].childNodes[1].childNodes;
               for(var i = 0;i < nextPage.length; i++){
                   if(nextPage[i].tagName == 'TABLE'){
                       return nextPage[i];
                   }
               }
               return null;
           }
    }

    const InjectFunctionButtons = async function(){
        var seeding = document.getElementById("ka1");
        var seedingNodes = seeding.childNodes;
        var pageControl = document.querySelectorAll('td>div>p');
        if(pageControl.length > 0){
            for(var x = pageControl.length - 1;x >= 0; x--){
                pageControl[x].parentNode.removeChild(pageControl[x]);
            }
        }
        var tableId = GetKa1TableId();
        var seedCount = 0;
        for(var i = 0;i < seedingNodes.length; i++){
            if(seedingNodes[i].tagName == 'B'){
                seedCount = parseInt(seedingNodes[i].innerText);
                break;
            }
        }
        if(seedCount > 100){
            var pageCount = Math.ceil(seedCount/100);
            for(var j = 1;j < pageCount; j++){
                let pageTable = await GetNextPageTorrents(j);
                for(var pi = pageTable.rows.length - 1;pi > 0;pi--){
                    seedingNodes[tableId].appendChild(pageTable.rows[pi]);
                    await sleep(10);
                }
                pageTable = null;
            }
        }
        var officialSeedingSize = 0;
        var seedingle5 = 0,seedingle10 = 0;
        var seedingLe5Size = 0,seedingLe10Size = 0;
        var setIds = new Set();
        var totalSize = 0;
        for(var ti=1;ti<seedingNodes[tableId].rows.length;ti++){
            var torrCellElementA = seedingNodes[tableId].rows[ti].cells[1].getElementsByTagName('a')[0];
            if(!setIds.has(torrCellElementA.href)) {
                setIds.add(torrCellElementA.href);
                var title = torrCellElementA.title.toLowerCase();
                var seeders = parseInt(seedingNodes[tableId].rows[ti].cells[4].innerText);
                var size = seedingNodes[tableId].rows[ti].cells[3].innerText;
                var sizeValue = SizeToGb(size);
                totalSize += sizeValue;
                if(title.match(regOfficial) != null){
                    var isLe5 = (seeders <= 5);
                    var isLe10 = (seeders <= 10);
                    officialSeedingSize += sizeValue;
                    officialSeedCount += 1;
                    if(isLe5){
                        seedingNodes[tableId].rows[ti].id="official5";
                        seedingle5 += 1;
                        seedingLe5Size += sizeValue;
                    }
                    else if(isLe10){
                        seedingNodes[tableId].rows[ti].id="official10";
                        seedingle10 += 1;
                        seedingLe10Size += sizeValue;
                    }
                    else{
                        seedingNodes[tableId].rows[ti].id="official";
                    }
                }
                else{
                    seedingNodes[tableId].rows[ti].id="unofficial";
                }
            }
            else{
                seedingNodes[tableId].rows[ti].id="dunplicate";
            }
        }

        totalSeedCount = setIds.size;
        var seedingStatistics = document.getElementById("seedingStatistics");
        if(seedingStatistics!=null){
            seedingStatistics.textContent=(`${totalSeedCount} 种子|总大小 ${(totalSize/1024).toFixed(3)}TB
                    【官种:${officialSeedCount}(${(officialSeedingSize/1024).toFixed(2)}TB);
                    <=5人:${seedingle5}(${(seedingLe5Size/1024).toFixed(2)}TB);
                    <=10人:${seedingle10}(${(seedingLe10Size/1024).toFixed(2)}TB)】`);
            seedingStatistics.removeAttribute('onclick');
            seedingStatistics.removeAttribute('href');
            seedingStatistics.setAttribute("style","pointer-events:none;");
            seedingStatistics.setAttribute("disable","true");
        }
        var cboxOfficialOnly=document.createElement("input");
        cboxOfficialOnly.setAttribute("type","checkbox");
        cboxOfficialOnly.setAttribute("id",'cboxOfficialOnly');
        cboxOfficialOnly.setAttribute("style", 'margin-left:30px;margin-top:10px;margin-bottom:10px;');
        cboxOfficialOnly.onchange = ShowOfficialTorrents;

        var spanOfficialOnly = document.createElement('span');
        spanOfficialOnly.style.fontWeight = "bold";
        spanOfficialOnly.style.color = "red";
        spanOfficialOnly.appendChild(document.createTextNode('仅显示官种'));
        seeding.insertBefore(spanOfficialOnly, seedingNodes[tableId]);
        seeding.insertBefore(cboxOfficialOnly, seedingNodes[tableId]);

        var cboxOfficialBgColor=document.createElement("input");
        cboxOfficialBgColor.setAttribute("type","checkbox");
        cboxOfficialBgColor.setAttribute("id",'cboxOfficialBgColor');
        cboxOfficialBgColor.setAttribute("style", 'margin-left:30px;margin-top:10px;margin-bottom:10px;');
        cboxOfficialBgColor.onchange = HighlightOfficialTorrents;

        var spanOfficialBgColor = document.createElement('span');
        spanOfficialBgColor.style.fontWeight = "bold";
        spanOfficialBgColor.style.color = "red";
        spanOfficialBgColor.appendChild(document.createTextNode('突出显示官种'));
        seeding.insertBefore(spanOfficialBgColor, seedingNodes[tableId]);
        seeding.insertBefore(cboxOfficialBgColor, seedingNodes[tableId]);

        var btnClaimAllTorrents=document.createElement("input");
        btnClaimAllTorrents.setAttribute("type","button");
        btnClaimAllTorrents.setAttribute("value","一键认领");
        btnClaimAllTorrents.setAttribute("id",'claimAllTorrents');
        btnClaimAllTorrents.setAttribute("style", 'margin-left:5px;margin-top:10px;margin-bottom:10px;font-weight:bold;color:red;');
        btnClaimAllTorrents.onclick = ClaimAllTorrents;
        seeding.insertBefore(btnClaimAllTorrents, seedingNodes[tableId]);
        observer.observe(seeding, config);
    }

    const mutationCallback = (mutationsList) => {
        for(let m of mutationsList) {
            let type = m.type;
            switch (type) {
                case "childList":
                    observer.disconnect();
                    console.log("A child node has been added or removed.");
                    InjectFunctionButtons();
                    break;
                default:
                    break;
            }
        }
    }
    let config = { childList: true,};
    var observer = new MutationObserver(mutationCallback);

    const manualLoadSeed = async function(){
        var x = document.querySelectorAll("tr>td>a");
        for (var i = 0; i < x.length; i++) {
            if(x[i].href.indexOf("getusertorrentlistajax") != -1 && x[i].href.indexOf("seeding") != -1) {
                x[i].click();
                await sleep(1000);
                var seeding = document.getElementById("ka1");
                var seedingNodes = seeding.childNodes;
                var retryCount = 0;
                while(retryCount < 10 && seedingNodes.length ==0){
                    await sleep(retryCount * 1000);
                    retryCount += 1;
                    seedingNodes = seeding.childNodes;
                }
                InjectFunctionButtons();
                break;
            }
        }
    }


    if(location.href.indexOf('hdpt.xyz') > -1){
        regOfficial = /[@-]\s?(HDPTWEB|HDPT)(|.mkv|.mp4|.ts|.iso)$/i ;
        claimCellIndex = 12;
        domainName = "https://hdpt.xyz/";
    }else if(location.href.indexOf('hhanclub.top') > -1){
        regOfficial = /[@-]\s?(HHWEB)(|.mkv|.mp4|.ts|.iso)$/i ;
        claimCellIndex = 12;
        domainName = "https://hhanclub.top/";
    }else if(location.href.indexOf('wintersakura.net') > -1){
        regOfficial = /[@-]\s?(WScode|SakuraWEB|SakuraSUB)(|.mkv|.mp4|.ts|.iso)$/i ;
        claimCellIndex = 12;
        domainName = "https://wintersakura.net/";
    }else if(location.href.indexOf('piggo.me') > -1){
        regOfficial = /[@-]\s?(PigoHD|PigoWeb|PiGoNF|PigoAD)(|.mkv|.mp4|.ts|.iso)$/i ;
        claimCellIndex = 12;
        domainName = "https://piggo.me/";
    }
    uid = location.href.substring(location.href.indexOf('id=')+3);

    var x = document.getElementsByClassName("embedded");
    if(x.length > 0){
        for(var i = 0; i < x.length; i++) {
            for(var k = 0; k < x[i].childNodes.length; k++){
                if(x[i].childNodes[k].tagName == "TABLE"){
                    for(var j = 0; j < x[i].childNodes[k].rows.length; j++) {
                        if(x[i].childNodes[k].rows[j].cells[0].innerText == '当前做种'){
                            var row = x[i].childNodes[k].insertRow(j);
                            var cell1 = row.insertCell(0);
                            cell1.innerHTML="保种分析";
                            cell1.setAttribute("class","rowhead nowrap");
                            cell1.setAttribute("width","1%");
                            cell1.setAttribute("valign","top");
                            cell1.setAttribute("align","right");

                            var cell2 = row.insertCell(1);
                            cell2.innerHTML='<a id="seedingStatistics" href="javascript:void(0);" style="font-weight:bold;color:red" title="分级统计官种数量和体积">点我分析保种统计</a>';//
                            cell2.setAttribute("class","rowfollow");
                            cell2.setAttribute("width","99%");
                            cell2.setAttribute("valign","top");
                            cell2.setAttribute("align","left");
                            document.getElementById ("seedingStatistics").addEventListener("click", manualLoadSeed, false);
                            return;
                        }
                    }
                }
            }
        }
    }
})();