蜜柑计划|mikanani|Mikan Project|批量复制磁力链接

为详情页,如 https://mikanani.me/Home/Bangumi/2841,提供复选框用于批量复制磁力链接

  1. // ==UserScript==
  2. // @name 蜜柑计划|mikanani|Mikan Project|批量复制磁力链接
  3. // @name:zh 蜜柑计划|mikanani|Mikan Project|批量复制磁力链接
  4. // @name:en mikanani|Mikan Project|Multi-selector
  5. // @namespace https://github.com/Zebeqo/
  6. // @version 1.0.4
  7. // @author Zebeqo
  8. // @description 为详情页,如 https://mikanani.me/Home/Bangumi/2841,提供复选框用于批量复制磁力链接
  9. // @description:zh 为详情页,如 https://mikanani.me/Home/Bangumi/2841,提供复选框用于批量复制磁力链接
  10. // @description:en For detail pages, such as https://mikanani.me/Home/Bangumi/2841, provide checkboxes to batch copy magnet links.
  11. // @icon https://mikanani.me/images/favicon.ico
  12. // @supportURL https://github.com/Zebeqo/mikanani-script/issues
  13. // @match https://mikanani.me/Home/Bangumi/*
  14. // @match https://mikanime.tv/Home/Bangumi/*
  15. // ==/UserScript==
  16.  
  17. (function() {
  18. "use strict";
  19. const clipboard = [];
  20. const Checkbox = (magnetLink) => {
  21. const wrapper = document.createElement("span");
  22. const input = document.createElement("input");
  23. input.setAttribute("type", "checkbox");
  24. input.setAttribute("data-magnet-link", magnetLink);
  25. input.checked = clipboard.includes(input.dataset["magnetLink"]);
  26. input.addEventListener("change", (e) => {
  27. const magnetlink = e.target.dataset["magnetLink"];
  28. e.target.checked ? clipboard.push(magnetlink) : clipboard.splice(
  29. clipboard.findIndex((value) => value === magnetlink),
  30. 1
  31. );
  32. console.log(clipboard);
  33. });
  34. wrapper.append(input);
  35. return wrapper;
  36. };
  37. const CopyLink = () => {
  38. const link = document.createElement("a");
  39. link.setAttribute("class", "subgroup-subscribe");
  40. link.append(document.createTextNode("[\u6279\u91CF\u590D\u5236\u78C1\u94FE]"));
  41. link.addEventListener("click", () => {
  42. navigator.clipboard.writeText(clipboard.join("\n"));
  43. });
  44. return link;
  45. };
  46. const SelectAll = () => {
  47. const select = document.createElement("a");
  48. select.setAttribute("class", "subgroup-subscribe");
  49. select.append(document.createTextNode("[\u5168\u9009]"));
  50. select.setAttribute("style", "float: right;");
  51. select.addEventListener("click", () => {
  52. let parent = select;
  53. while (parent.nodeName.toLowerCase() !== "table") {
  54. parent = parent.parentNode;
  55. }
  56. const checkboxs = parent.querySelectorAll("input[type=checkbox]");
  57. checkboxs.forEach((checkbox) => {
  58. checkbox.checked = true;
  59. const magnetlink = checkbox.dataset["magnetLink"];
  60. if (!clipboard.includes(magnetlink)) {
  61. clipboard.push(magnetlink);
  62. }
  63. });
  64. });
  65. return select;
  66. };
  67. const UnselectAll = () => {
  68. const select = document.createElement("a");
  69. select.setAttribute("class", "subgroup-subscribe");
  70. select.append(document.createTextNode("[\u53D6\u6D88\u5168\u9009]"));
  71. select.setAttribute("style", "float: right;");
  72. select.addEventListener("click", () => {
  73. let parent = select;
  74. while (parent.nodeName.toLowerCase() !== "table") {
  75. parent = parent.parentNode;
  76. }
  77. const checkboxs = parent.querySelectorAll("input[type=checkbox]");
  78. checkboxs.forEach((checkbox) => {
  79. checkbox.checked = false;
  80. const magnetlink = checkbox.dataset["magnetLink"];
  81. if (clipboard.includes(magnetlink)) {
  82. clipboard.splice(
  83. clipboard.findIndex((value) => value === magnetlink),
  84. 1
  85. );
  86. }
  87. });
  88. });
  89. return select;
  90. };
  91. const ReverseSelect = () => {
  92. const select = document.createElement("a");
  93. select.setAttribute("class", "subgroup-subscribe");
  94. select.append(document.createTextNode("[\u53CD\u9009]"));
  95. select.setAttribute("style", "float: right;");
  96. select.addEventListener("click", () => {
  97. let parent = select;
  98. while (parent.nodeName.toLowerCase() !== "table") {
  99. parent = parent.parentNode;
  100. }
  101. const checkboxs = parent.querySelectorAll("input[type=checkbox]");
  102. checkboxs.forEach((checkbox) => {
  103. checkbox.checked = !checkbox.checked;
  104. const magnetlink = checkbox.dataset["magnetLink"];
  105. if (clipboard.includes(magnetlink)) {
  106. clipboard.splice(
  107. clipboard.findIndex((value) => value === magnetlink),
  108. 1
  109. );
  110. } else {
  111. clipboard.push(magnetlink);
  112. }
  113. });
  114. });
  115. return select;
  116. };
  117. const Select = { SelectAll, UnselectAll, ReverseSelect };
  118. const origOpen = XMLHttpRequest.prototype.open;
  119. XMLHttpRequest.prototype.open = function() {
  120. this.addEventListener("loadend", function() {
  121. addCheckbox();
  122. addCopyLink();
  123. addSelect();
  124. });
  125. origOpen.apply(this, arguments);
  126. };
  127. const addCheckbox = () => {
  128. const heads = document.querySelectorAll(".magnet-link-wrap");
  129. heads.forEach((head) => {
  130. head.previousSibling || head.insertAdjacentElement(
  131. "beforebegin",
  132. Checkbox(head.nextElementSibling.dataset["clipboardText"])
  133. );
  134. });
  135. };
  136. const addCopyLink = () => {
  137. document.querySelectorAll('th[width="65%"]').forEach((head) => {
  138. if (!head.childElementCount) {
  139. head.insertAdjacentText("beforeend", " ");
  140. head.insertAdjacentElement("beforeend", CopyLink());
  141. }
  142. });
  143. };
  144. const addSelect = () => {
  145. document.querySelectorAll('th[width="65%"]').forEach((head) => {
  146. if (head.childElementCount === 1) {
  147. head.insertAdjacentText("beforeend", " ");
  148. head.insertAdjacentElement("beforeend", Select.SelectAll());
  149. head.insertAdjacentText("beforeend", " ");
  150. head.insertAdjacentElement("beforeend", Select.UnselectAll());
  151. head.insertAdjacentText("beforeend", " ");
  152. head.insertAdjacentElement("beforeend", Select.ReverseSelect());
  153. }
  154. });
  155. };
  156. addCheckbox();
  157. addCopyLink();
  158. addSelect();
  159. })();