userscripts/javdb_copy_all_magnets.user.js

82 lines
2.1 KiB
JavaScript

// ==UserScript==
// @name JavDB - Copy all magnets
// @namespace Violentmonkey Scripts
// @match https://javdb.com/v/*
// @grant none
// @version 1.0
// @author Lukáš Kucharczyk
// @description Adds a button to copy all magnet links at once.
// @downloadURL https://git.kucharczyk.xyz/lukas/userscripts/raw/branch/main/javdb_copy_all_magnets.user.js
// @supportURL https://git.kucharczyk.xyz/lukas/userscripts
// ==/UserScript==
/**
* @param {string} type
* @param {object} props
* @param {...(string|HTMLElement)} children
* @return {HTMLElement}
*/
function elt(type, props, ...children) {
let dom = document.createElement(type);
if (props) {
Object.keys(props).forEach((key) => {
if (key === "style") {
Object.assign(dom.style, props[key]);
} else if (key === "dataset") {
Object.keys(props[key]).forEach((dataKey) => {
dom.dataset[dataKey] = props[key][dataKey];
});
} else {
dom[key] = props[key];
}
});
}
for (let child of children) {
if (typeof child !== "string") dom.appendChild(child);
else dom.appendChild(document.createTextNode(child));
}
return dom;
}
function findElementsWithText(text, tagName = "*") {
const elements = document.querySelectorAll(tagName);
return Array.from(elements).filter((element) =>
element.textContent.includes(text)
);
}
const allMagnetButtons = findElementsWithText("Copy", "button");
let allMagnetLinks = allMagnetButtons.reduce((prevValue, currentButton) => {
return prevValue + "\n" + currentButton.dataset.clipboardText;
}, "");
let copyAllButton = elt(
"div",
{
className: "item columns is-desktop",
},
elt("div", {
className: "magnet-name column is-four-fifths",
}),
elt(
"div",
{
className: "buttons column",
},
elt(
"button",
{
type: "button",
className: "button is-info copy-to-clipboard",
dataset: {
clipboardText: allMagnetLinks,
},
},
"Copy all magnets"
)
)
);
const magnetContainer = document.getElementById("magnets-content");
magnetContainer.prepend(copyAllButton);