// ==UserScript==
// @name nyaa.si magnet copy/paste
// @namespace http://tampermonkey.net/
// @version 1.5
// @description Copy magnet URI's of selected/searched tables
// @match https://nyaa.si/*
// @grant none
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/530242/nyaasi%20magnet%20copypaste.user.js
// @updateURL https://update.greasyfork.icu/scripts/530242/nyaasi%20magnet%20copypaste.meta.js
// ==/UserScript==
(function() {
'use strict';
const uncheckedIcon = ``;
const checkedIcon = ``;
const copyIcon = ``;
const checkIcon = ``;
function addStyles() {
const style = document.createElement('style');
style.textContent = `
/* Style for the select column header & cells */
th.select-col, td.select-col {
text-align: center;
vertical-align: middle;
padding: 0.5rem;
}
/* Row select button styling */
.shadcn-select-btn {
padding: 4px;
background-color: transparent;
border: none;
cursor: pointer;
transition: transform 0.2s ease;
}
.shadcn-select-btn:hover {
transform: scale(1.1);
}
/* Top buttons container */
.magnet-button-container {
margin: 20px 0;
display: flex;
gap: 12px;
}
/* Top buttons with icon & text */
.magnet-button {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
font-size: 14px;
cursor: pointer;
background-color: #1976d2;
border: none;
border-radius: 4px;
color: #fff;
transition: background-color 0.3s ease, transform 0.2s ease;
}
.magnet-button:hover {
background-color: #115293;
transform: translateY(-1px);
}
/* Style for selected rows */
tr.selected-row {
background-color: #d0ebff !important;
transition: background-color 0.3s ease;
}
/* Icon within top buttons */
.btn-icon {
display: inline-flex;
vertical-align: middle;
}
.btn-text {
display: inline-flex;
vertical-align: middle;
}
`;
document.head.appendChild(style);
}
function addSelectColumnHeader(table) {
const thead = table.querySelector('thead');
if (thead) {
const headerRow = thead.querySelector('tr');
if (headerRow) {
const selectTh = document.createElement('th');
selectTh.className = 'select-col';
selectTh.style.width = '50px';
selectTh.innerHTML = ``;
headerRow.insertBefore(selectTh, headerRow.firstChild);
}
}
}
function addSelectButtonsToRows(table) {
const rows = table.querySelectorAll('tbody tr');
rows.forEach(row => {
const selectTd = document.createElement('td');
selectTd.className = 'select-col';
const btn = document.createElement('button');
btn.className = 'shadcn-select-btn';
btn.innerHTML = uncheckedIcon;
btn.addEventListener('click', function(e) {
e.stopPropagation();
btn.classList.toggle('selected');
if (btn.classList.contains('selected')) {
btn.innerHTML = checkedIcon;
row.classList.add('selected-row');
} else {
btn.innerHTML = uncheckedIcon;
row.classList.remove('selected-row');
}
});
selectTd.appendChild(btn);
row.insertBefore(selectTd, row.firstChild);
});
}
function addCopyButtons() {
const table = document.querySelector('table.torrent-list');
if (!table) return;
const container = document.createElement('div');
container.className = 'magnet-button-container';
const copyAllBtn = document.createElement('button');
copyAllBtn.className = 'magnet-button';
copyAllBtn.innerHTML = `${copyIcon}Copy Magnets`;
container.appendChild(copyAllBtn);
const copySelectedBtn = document.createElement('button');
copySelectedBtn.className = 'magnet-button';
copySelectedBtn.innerHTML = `${checkIcon}Copy Selected`;
container.appendChild(copySelectedBtn);
table.parentNode.insertBefore(container, table);
copyAllBtn.addEventListener('click', () => {
let magnetLinks = Array.from(table.querySelectorAll('a[href^="magnet:"]'))
.map(a => a.href);
magnetLinks = Array.from(new Set(magnetLinks));
const magnetsText = magnetLinks.join('\n');
navigator.clipboard.writeText(magnetsText)
.then(() => {
const originalHTML = copyAllBtn.innerHTML;
copyAllBtn.innerHTML = `${copyIcon}Copied!`;
setTimeout(() => { copyAllBtn.innerHTML = originalHTML; }, 2000);
})
.catch(err => console.error('Error copying all magnet links:', err));
});
copySelectedBtn.addEventListener('click', () => {
const selectedRows = table.querySelectorAll('tbody tr.selected-row');
if (selectedRows.length === 0) {
alert('Please select one or more rows using the select buttons first.');
return;
}
let selectedMagnets = [];
selectedRows.forEach(row => {
const magnets = Array.from(row.querySelectorAll('a[href^="magnet:"]'))
.map(a => a.href);
selectedMagnets = selectedMagnets.concat(magnets);
});
selectedMagnets = Array.from(new Set(selectedMagnets));
const magnetsText = selectedMagnets.join('\n');
navigator.clipboard.writeText(magnetsText)
.then(() => {
const originalHTML = copySelectedBtn.innerHTML;
copySelectedBtn.innerHTML = `${checkIcon}Copied!`;
setTimeout(() => { copySelectedBtn.innerHTML = originalHTML; }, 2000);
})
.catch(err => console.error('Error copying selected magnet links:', err));
});
}
window.addEventListener('load', function() {
const table = document.querySelector('table.torrent-list');
if (table) {
addStyles();
addSelectColumnHeader(table);
addSelectButtonsToRows(table);
addCopyButtons();
}
});
})();