🏠 Home 

mikanani|Mikan Project|Multi-selector

For detail pages, such as https://mikanani.me/Home/Bangumi/2841, provide checkboxes to batch copy magnet links.

// ==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();
})();