Greasy Fork is available in English.

PT站点魔力计算器修复版-HDSky

在HDSky显示每个种子的A值和每GB的A值,脚本原作者neoblackxt。

  1. // ==UserScript==
  2. // @name PT站点魔力计算器修复版-HDSky
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.0.2
  5. // @description 在HDSky显示每个种子的A值和每GB的A值,脚本原作者neoblackxt。
  6. // @author neoblackxt, LaneLau, box
  7. // @require https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js
  8. // @require https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js
  9. // @match *://*.hdsky.me/torrents*
  10. // @match *://*.hdsky.me/mybonus.php*
  11. // @license GPL License
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // ==/UserScript==
  15.  
  16. function run() {
  17. var $ = jQuery;
  18.  
  19. let host = window.location.host.match(/\b[^\.]+\.[^\.]+$/)[0]
  20. let isMybonusPage = window.location.toString().indexOf("mybonus.php")!=-1
  21. let argsReady = true;
  22. let T0 = GM_getValue(host + ".T0");
  23. let N0 = GM_getValue(host + ".N0");
  24. let B0 = GM_getValue(host + ".B0");
  25. let L = GM_getValue(host + ".L");
  26. let M = GM_getValue(host + ".M");
  27. if(!(T0 && N0 && B0 && L && M)){
  28. argsReady = false
  29. if(!isMybonusPage){
  30. alert("未找到魔力值参数,请打开魔力值系统说明获取(/mybonus.php)");
  31. }
  32. }
  33. if (isMybonusPage){
  34. T0 = parseInt($("li:has(b:contains('T0'))")[1].innerText.split(" = ")[1]);
  35. N0 = parseInt($("li:has(b:contains('N0'))")[1].innerText.split(" = ")[1]);
  36. B0 = parseInt($("li:has(b:contains('B0'))")[1].innerText.split(" = ")[1]);
  37. L = parseInt($("li:has(b:contains('L'))")[1].innerText.match(/\d+/)[0]);
  38. M = parseInt($("li:has(b:contains('M'))")[1].innerText.match(/\d+/)[0]);
  39.  
  40. GM_setValue(host + ".T0",T0);
  41. GM_setValue(host + ".N0",N0);
  42. GM_setValue(host + ".B0",B0);
  43. GM_setValue(host + ".L",L);
  44. GM_setValue(host + ".M",M); // 新增M参数
  45. let A = parseFloat($("div:contains(' (A = ')")[0].innerText.split(" = ")[1]);
  46.  
  47. if(!argsReady){
  48. if(T0 && N0 && B0 && L){
  49. alert("魔力值参数已更新")
  50. }else{
  51. alert("魔力值参数获取失败")
  52. }
  53. }
  54.  
  55. function calcB(A){
  56. return B0*(2/Math.PI)*Math.atan(A/L)
  57. }
  58.  
  59. let data = []
  60. for (let i=0; i<25*L; i=i+L/4){
  61. data.push([i,calcB(i)])
  62. }
  63.  
  64. $("table+h1").before('<div id="main" style="width: 600px;height:400px; margin:auto;"></div>')
  65.  
  66. var myChart = echarts.init(document.getElementById('main'));
  67. // 指定图表的配置项和数据
  68. var option = {
  69. title: {
  70. text: 'B - A 图',
  71. top: 'bottom',
  72. left: 'center'
  73. },
  74. tooltip: {
  75. trigger: 'axis',
  76. axisPointer: {
  77. type: 'cross'
  78. },
  79. backgroundColor: 'rgba(255, 255, 255, 0.8)',
  80. position: function (pos, params, el, elRect, size) {
  81. var obj = { top: 10 };
  82. obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30;
  83. return obj;
  84. },
  85. extraCssText: 'width: 170px'
  86.  
  87. },
  88. xAxis: {
  89. name: 'A',
  90. },
  91. yAxis: {
  92. name: 'B'
  93. },
  94. axisPointer: {
  95. label: {
  96. backgroundColor: '#777'
  97. }
  98. },
  99. series: [
  100. {
  101. type: 'line',
  102. data: data,
  103. symbol: 'none'
  104. },
  105. {
  106. type: 'line',
  107. data:[[A,calcB(A)]],
  108. symbolSize: 6
  109. }
  110. ]
  111. };
  112.  
  113. // 使用刚指定的配置项和数据显示图表。
  114. myChart.setOption(option);
  115. }
  116.  
  117.  
  118.  
  119. function calcA(T, S, N, K) {
  120.  
  121. //var c1 = 1 - Math.pow(10, -(T / T0));
  122. // 当断种时,显示续种后的实际值,因为当前状态值无意义
  123. //N = N ? N : 1;
  124. // 当前状态值,加入做种后实际值会小于当前值
  125. // TODO: 改为双行显示为当前值和实际值
  126. let time_factor = 1 - Math.pow(10, -(T / T0));
  127. let keep_factor = 1 + Math.sqrt(2) * Math.pow(10, -(N - 1) / (N0 - 1));
  128. let a = time_factor * S * K * keep_factor * M / (N + 1);
  129. //var c2 = 1 + Math.pow(2, .5) * Math.pow(10, -(N - 1) / (N0 - 1)) * (M / N);
  130. console.log("Ti = " + T + ", Si = " + S + ", Ni = " + N + ", K = " + K);
  131. //return c1 * S * a;
  132. return a;
  133. }
  134.  
  135. function makeA($this, i_T, i_S, i_N) {
  136. var time = $this.children('td:eq(' + i_T + ')').find("span").attr("title");
  137. var T = Math.min(52, (new Date().getTime() - new Date(time).getTime()) / 1e3 / 86400 / 7);
  138. var size = $this.children('td:eq(' + i_S + ')').text().trim();
  139. var size_tp = 1;
  140. var S = size.replace(/[KMGT]B/, function (tp) {
  141. if (tp == "KB") {
  142. size_tp = 1 / 1024 / 1024;
  143. } else if (tp == "MB") {
  144. size_tp = 1 / 1024;
  145. } else if (tp == "GB") {
  146. size_tp = 1;
  147. } else if (tp == "TB") {
  148. size_tp = 1024;
  149. }
  150. return "";
  151. });
  152. S = parseFloat(S).toFixed(2) * size_tp;
  153. var number = $this.children('td:eq(' + i_N + ')').text().replace(/,/g, "").trim();
  154. var N = parseInt(number);
  155. var K = $this.find("span:contains('官组')").length ? 2 : 1;
  156. var A = calcA(T, S, N ,K).toFixed(4);
  157. var ave = (A / S / M).toFixed(2);
  158. if ((A > S * 2) && (N != 0)) {
  159. //标红A大于体积2倍且不断种的种子
  160. return '<span style="color:#ff0000;font-weight:900;">' + A + '@' + ave + '</span>'
  161. } else {
  162. return '<span style="">' + A + '@' + ave + "</span>"
  163. }
  164. }
  165.  
  166. var i_T, i_S, i_N
  167. $('.torrents:last-of-type>tbody>tr').each(function (row) {
  168. var $this = $(this);
  169. if (row == 0) {
  170. $this.children('td').each(function (col) {
  171. if ($(this).find('img.time').length) {
  172. i_T = col
  173. } else if ($(this).find('img.size').length) {
  174. i_S = col
  175. } else if ($(this).find('img.seeders').length) {
  176. i_N = col
  177. }
  178. })
  179. if (!i_T || !i_S || !i_N) {
  180. alert('未能找到数据列')
  181. return
  182. }
  183. $this.children("td:last").before("<td class=\"colhead\" title=\"A值@每GB的A值\">A@A/GB</td>");
  184. } else {
  185. //console.log("Ti = " + i_T + ", Si = " + i_S + ", Ni = " + i_N);
  186. var textA = makeA($this, i_T, i_S, i_N)
  187. $this.children("td:last").before("<td class=\"rowfollow\">" + textA + "</td>");
  188. }
  189. });
  190. }
  191.  
  192. run()