Greasy Fork is available in English.

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

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

// ==UserScript==
// @name            蜜柑计划|mikanani|Mikan Project|批量复制磁力链接
// @name:zh         蜜柑计划|mikanani|Mikan Project|批量复制磁力链接
// @name:en         mikanani|Mikan Project|Multi-selector
// @namespace       https://github.com/Zebeqo/
// @version         1.0.4
// @author          Zebeqo
// @description     为详情页,如 https://mikanani.me/Home/Bangumi/2841,提供复选框用于批量复制磁力链接
// @description:zh  为详情页,如 https://mikanani.me/Home/Bangumi/2841,提供复选框用于批量复制磁力链接
// @description:en  For detail pages, such as https://mikanani.me/Home/Bangumi/2841, provide checkboxes to batch copy magnet links.
// @icon            https://mikanani.me/images/favicon.ico
// @supportURL      https://github.com/Zebeqo/mikanani-script/issues
// @match           https://mikanani.me/Home/Bangumi/*
// @match           https://mikanime.tv/Home/Bangumi/*
// ==/UserScript==

(function() {
  "use strict";
  const clipboard = [];
  const Checkbox = (magnetLink) => {
    const wrapper = document.createElement("span");
    const input = document.createElement("input");
    input.setAttribute("type", "checkbox");
    input.setAttribute("data-magnet-link", magnetLink);
    input.checked = clipboard.includes(input.dataset["magnetLink"]);
    input.addEventListener("change", (e) => {
      const magnetlink = e.target.dataset["magnetLink"];
      e.target.checked ? clipboard.push(magnetlink) : clipboard.splice(
        clipboard.findIndex((value) => value === magnetlink),
        1
      );
      console.log(clipboard);
    });
    wrapper.append(input);
    return wrapper;
  };
  const CopyLink = () => {
    const link = document.createElement("a");
    link.setAttribute("class", "subgroup-subscribe");
    link.append(document.createTextNode("[\u6279\u91CF\u590D\u5236\u78C1\u94FE]"));
    link.addEventListener("click", () => {
      navigator.clipboard.writeText(clipboard.join("\n"));
    });
    return link;
  };
  const SelectAll = () => {
    const select = document.createElement("a");
    select.setAttribute("class", "subgroup-subscribe");
    select.append(document.createTextNode("[\u5168\u9009]"));
    select.setAttribute("style", "float: right;");
    select.addEventListener("click", () => {
      let parent = select;
      while (parent.nodeName.toLowerCase() !== "table") {
        parent = parent.parentNode;
      }
      const checkboxs = parent.querySelectorAll("input[type=checkbox]");
      checkboxs.forEach((checkbox) => {
        checkbox.checked = true;
        const magnetlink = checkbox.dataset["magnetLink"];
        if (!clipboard.includes(magnetlink)) {
          clipboard.push(magnetlink);
        }
      });
    });
    return select;
  };
  const UnselectAll = () => {
    const select = document.createElement("a");
    select.setAttribute("class", "subgroup-subscribe");
    select.append(document.createTextNode("[\u53D6\u6D88\u5168\u9009]"));
    select.setAttribute("style", "float: right;");
    select.addEventListener("click", () => {
      let parent = select;
      while (parent.nodeName.toLowerCase() !== "table") {
        parent = parent.parentNode;
      }
      const checkboxs = parent.querySelectorAll("input[type=checkbox]");
      checkboxs.forEach((checkbox) => {
        checkbox.checked = false;
        const magnetlink = checkbox.dataset["magnetLink"];
        if (clipboard.includes(magnetlink)) {
          clipboard.splice(
            clipboard.findIndex((value) => value === magnetlink),
            1
          );
        }
      });
    });
    return select;
  };
  const ReverseSelect = () => {
    const select = document.createElement("a");
    select.setAttribute("class", "subgroup-subscribe");
    select.append(document.createTextNode("[\u53CD\u9009]"));
    select.setAttribute("style", "float: right;");
    select.addEventListener("click", () => {
      let parent = select;
      while (parent.nodeName.toLowerCase() !== "table") {
        parent = parent.parentNode;
      }
      const checkboxs = parent.querySelectorAll("input[type=checkbox]");
      checkboxs.forEach((checkbox) => {
        checkbox.checked = !checkbox.checked;
        const magnetlink = checkbox.dataset["magnetLink"];
        if (clipboard.includes(magnetlink)) {
          clipboard.splice(
            clipboard.findIndex((value) => value === magnetlink),
            1
          );
        } else {
          clipboard.push(magnetlink);
        }
      });
    });
    return select;
  };
  const Select = { SelectAll, UnselectAll, ReverseSelect };
  const origOpen = XMLHttpRequest.prototype.open;
  XMLHttpRequest.prototype.open = function() {
    this.addEventListener("loadend", function() {
      addCheckbox();
      addCopyLink();
      addSelect();
    });
    origOpen.apply(this, arguments);
  };
  const addCheckbox = () => {
    const heads = document.querySelectorAll(".magnet-link-wrap");
    heads.forEach((head) => {
      head.previousSibling || head.insertAdjacentElement(
        "beforebegin",
        Checkbox(head.nextElementSibling.dataset["clipboardText"])
      );
    });
  };
  const addCopyLink = () => {
    document.querySelectorAll('th[width="65%"]').forEach((head) => {
      if (!head.childElementCount) {
        head.insertAdjacentText("beforeend", " ");
        head.insertAdjacentElement("beforeend", CopyLink());
      }
    });
  };
  const addSelect = () => {
    document.querySelectorAll('th[width="65%"]').forEach((head) => {
      if (head.childElementCount === 1) {
        head.insertAdjacentText("beforeend", " ");
        head.insertAdjacentElement("beforeend", Select.SelectAll());
        head.insertAdjacentText("beforeend", " ");
        head.insertAdjacentElement("beforeend", Select.UnselectAll());
        head.insertAdjacentText("beforeend", " ");
        head.insertAdjacentElement("beforeend", Select.ReverseSelect());
      }
    });
  };
  addCheckbox();
  addCopyLink();
  addSelect();
})();