Greasy Fork

Seed Picks

做种精选

// ==UserScript==
// @name         Seed Picks
// @namespace    http://tampermonkey.net/
// @version      2024-03-09
// @description  做种精选
// @author       bahtyar
// @match        https://*.tjupt.org/torrents.php*
// @match        https://pt.keepfrds.com/torrents.php*
// @icon         none
// @grant        none
// ==/UserScript==

(function () {
  "use strict";
  var site_url = decodeURI(location.href);
  // console.log(site_url)\

  var siteData = {
    "tjupt": {
      values: {
        "T0": 4,
        "B0": 7,
        "N0": 130,
        "L": 300,
      }, // T0, N0, B0, L
    },
    "keepfrds": {
      values: {
        "T0":52,
        "B0": 7,
        "N0": 100,        
        "L": 900,
      }, // T0, N0, B0, L
    },
  };
  function calculateA(Ti, T0, Si, Ni, N0) {
    const term1 = 1 - Math.pow(10, -Ti / T0);
    const term2 = Si * (1 + Math.sqrt(2) * Math.pow(10, -(Ni - 1) / (N0 - 1)));
    return term1 * term2;
  }

  function calculateB(A, L, B0) {
    const pi = Math.PI;
    const arctanValue = Math.atan(A / L);
    const result = ((B0 * 2) / pi) * arctanValue;
    return result;
  }

  function addColumnToTable() {
    if (site_url.includes("tjupt.org")) {
      addtjuptColumns();
    } else if (site_url.includes("keepfrds.com")) {
      addkeepfrdsColumns();
    }
  }

  function calculateTimeDifference(timeString) {
    const currentTime = new Date();
    const uploadTime = new Date(timeString.replace("<br>", " "));
    const timeDifferenceInMilliseconds = currentTime - uploadTime;
    return timeDifferenceInMilliseconds / (1000 * 60 * 60 * 7 * 24); // 转换为周
  }

  function convertToGB(inputString) {
    if (site_url.includes("tjupt.org")) {
      return tjuptConvertToGB(inputString);
    } else if (site_url.includes("keepfrds.com")) {
      return keepfrdsConvertToGB(inputString);
    }
  }

  function addtjuptColumns() {
    const table0 = document.getElementsByClassName("torrents")[0];
    if (!table0) {
      console.error('Table with class "torrents" not found.');
      return;
    }
    const table = table0.tBodies[0];
    const rows = table.children;
    const valueA = document.createElement("td");
    valueA.textContent = "A值";
    valueA.className = "colhead";
    rows[0].appendChild(valueA);
    const point = document.createElement("td");
    point.textContent = "时魔";
    point.className = "colhead";
    rows[0].appendChild(point);
    for (let i = 1; i < rows.length; i++) {
      const cells = rows[i].children;
      const tr = cells[i];
      // 获取时间差(单位:小时)、体积(单位:GB)、#seeders
      const timeString = cells[3].innerHTML;
      const timeDifference = calculateTimeDifference(timeString); // 计算时间差
      const volume = parseFloat(convertToGB(cells[4].textContent.trim()));
      const seeders = parseFloat(cells[5].textContent.trim());
      // console.log(timeString, timeDifference, volume, seeders)
      const resultA = calculateA(timeDifference, 4, volume, seeders, 7);
      // console.log(resultA)
      const result = calculateB(resultA, 300, 130);
      const resultACell = document.createElement("td");
      resultACell.textContent = resultA.toFixed(2);
      rows[i].appendChild(resultACell);
      const resultCell = document.createElement("td");
      resultCell.textContent = result.toFixed(2); // 保留两位小数
      rows[i].appendChild(resultCell);
    }
  }

  function addkeepfrdsColumns() {
    const table0 = document.getElementsByClassName("torrents")[0];
    if (!table0) {
      console.error('Table with class "torrents" not found.');
      return;
    }
    const table = table0.tBodies[0];
    // console.log(table);
    const rows = table.children;
    const valueA = document.createElement("td");
    valueA.textContent = "A值";
    valueA.className = "colhead";
    rows[0].appendChild(valueA);
    const point = document.createElement("td");
    point.textContent = "时魔";
    point.className = "colhead";
    rows[0].appendChild(point);
    console.log("rows")
    // console.log(rows[1]);
    for (let i = 1; i < rows.length; i++) {
      const cells = rows[i].children;
      console.log(cells);
      const tr = cells[i];
      // 获取时间差(单位:小时)、体积(单位:GB)、#seeders
      const timeString = cells[3].querySelector('span[title]').getAttribute('title');
      console.log(timeString);
      const timeDifference = calculateTimeDifference(timeString); // 计算时间差
      const volume = parseFloat(convertToGB(cells[4].textContent.trim()));
      const seeders = parseFloat(cells[5].textContent.trim());
      // console.log(timeString, timeDifference, volume, seeders)
      let T0 = siteData["keepfrds"]["values"]["T0"];
      let N0 = siteData["keepfrds"]["values"]["N0"];
      let B0 = siteData["keepfrds"]["values"]["B0"];
      let L = siteData["keepfrds"]["values"]["L"];
      const resultA = calculateA(timeDifference, T0, volume, seeders, N0);
      // console.log(resultA)
      const result = calculateB(resultA, L, B0);
      const resultACell = document.createElement("td");
      resultACell.textContent = resultA.toFixed(2);
      rows[i].appendChild(resultACell);
      const resultCell = document.createElement("td");
      resultCell.textContent = result.toFixed(2); // 保留两位小数
      rows[i].appendChild(resultCell);
    }
  }

  function tjuptConvertToGB(inputString) {
    const regex = /(\d+(\.\d+)?)\s*([KkMmGgTt]?i?[Bb])/;
    const match = inputString.match(regex);

    if (match) {
      const value = parseFloat(match[1]);
      const unit = match[3].toUpperCase();

      switch (unit) {
        case "KIB":
          return value / (1024 * 1024);
        case "MIB":
          return value / 1024;
        case "GIB":
          return value;
        case "TIB":
          return value * 1024;
        default:
          console.error("Unsupported unit:", unit);
          return NaN;
      }
    } else {
      console.error("Invalid input string:", inputString);
      return NaN;
    }
  }

  function keepfrdsConvertToGB(inputString) {
    const regex = /(\d+(\.\d+)?)\s*([KkMmGgTt]?[Bb])/;
    const match = inputString.match(regex);
    if (match) {
      const value = parseFloat(match[1]);
      const unit = match[3].toUpperCase();

      switch (unit) {
        case "KB":
          return value / (1024 * 1024);
        case "MB":
          return value / 1024;
        case "GB":
          return value;
        case "TB":
          return value * 1024;
        default:
          console.error("Unsupported unit:", unit);
          return NaN;
      }
    }
  }

  window.addEventListener("load", addColumnToTable);
})();