在各字幕組分區新增一鍵「複製磁連」及「特定複製」按鈕。「特定複製」可輸入關鍵字,只複製標題含該關鍵字的磁連
// ==UserScript==
// @name 蜜柑計劃 一鍵複製磁連
// @namespace http://tampermonkey.net/
// @version 1.3.1
// @description 在各字幕組分區新增一鍵「複製磁連」及「特定複製」按鈕。「特定複製」可輸入關鍵字,只複製標題含該關鍵字的磁連
// @author shanlan (grok-4-fast-reasoning)
// @match https://mikanani.me/Home/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=mikanani.me
// @grant none
// @run-at document-end
// @license MIT
// ==/UserScript==
(function() {
'use strict';
function notify(msg) {
const n = document.createElement('div');
n.style.position = 'fixed';
n.style.left = '50%';
n.style.top = '50%';
n.style.transform = 'translate(-50%, -50%)';
n.style.backgroundColor = 'rgba(0,0,0,0.7)';
n.style.color = 'white';
n.style.padding = '12px 24px';
n.style.borderRadius = '8px';
n.style.zIndex = '9999';
n.style.fontSize = '30px';
n.style.boxShadow = '0 2px 12px rgba(0,0,0,0.2)';
n.textContent = msg;
document.body.appendChild(n);
setTimeout(() => {
n.style.transition = 'opacity 1s';
n.style.opacity = '0';
setTimeout(() => { n.remove(); }, 1000);
}, 3000);
}
function main() {
// 只針對有 id 屬性的 div.subgroup-text(即字幕組區塊),排除 header2-text
const subgroupDivs = document.querySelectorAll('div.subgroup-text[id]');
subgroupDivs.forEach(div => {
const btn = document.createElement('button');
btn.textContent = '複製磁連';
btn.style.marginLeft = '10px';
btn.style.padding = '2px 6px';
btn.style.fontSize = '12px';
// 新增「特定複製」按鈕
const specificBtn = document.createElement('button');
specificBtn.textContent = '特定複製';
specificBtn.style.marginLeft = '5px';
specificBtn.style.padding = '2px 6px';
specificBtn.style.fontSize = '12px';
// 避免重複添加(檢查兩個按鈕)
if (![...div.children].some(c => c.tagName === 'BUTTON' && (c.textContent.includes('複製磁連') || c.textContent.includes('特定複製')))) {
div.appendChild(btn);
div.appendChild(specificBtn);
}
btn.addEventListener('click', () => {
// 原邏輯:複製所有磁連
let table = null;
const parent = div.parentElement || document;
const tables = Array.from(parent.querySelectorAll('table'));
table = tables.find(t => (div.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_FOLLOWING));
if (!table) {
table = tables.find(t => t.querySelector('a.js-magnet'));
}
if (!table) {
console.log('未找到對應的磁連列表 (table)');
notify('未找到對應的磁連列表,請稍候或重新載入頁面');
return;
}
const magnetAnchors = table.querySelectorAll('a.js-magnet, a.magnet-link, a[href^="magnet:"]');
const magnets = [];
magnetAnchors.forEach(anchor => {
// 優先 data-clipboard-text,沒有就用 href
const fullText = anchor.getAttribute('data-clipboard-text') || anchor.getAttribute('href') || '';
if (fullText) {
const match = fullText.match(/^(magnet:\?xt=urn:btih:[^&]+)/);
if (match) {
magnets.push(match[1]);
} else if (fullText.startsWith('magnet:')) {
magnets.push(fullText);
}
}
});
if (magnets.length === 0) {
console.log('未找到任何磁連!');
notify('未找到任何磁連');
return;
}
const result = magnets.join('\n');
if (typeof GM_setClipboard !== 'undefined') {
GM_setClipboard(result, 'text');
} else {
const textarea = document.createElement('textarea');
textarea.value = result;
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
notify('已複製 ' + magnets.length + ' 個磁連,如果有沒複製到的請點擊右下角『顯示更多』');
});
// 新增邏輯:特定複製(過濾標題含關鍵字的磁連)
specificBtn.addEventListener('click', () => {
const keyword = prompt('請輸入關鍵字(用於過濾標題):', '');
if (!keyword || keyword.trim() === '') {
notify('未輸入關鍵字,取消操作');
return;
}
const kwd = keyword.toLowerCase().trim(); // 忽略大小寫
let table = null;
const parent = div.parentElement || document;
const tables = Array.from(parent.querySelectorAll('table'));
table = tables.find(t => (div.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_FOLLOWING));
if (!table) {
table = tables.find(t => t.querySelector('a.js-magnet'));
}
if (!table) {
console.log('未找到對應的磁連列表 (table)');
notify('未找到對應的磁連列表,請稍候或重新載入頁面');
return;
}
// 遍歷 table 的每一行 <tr>
const rows = table.querySelectorAll('tr');
const magnets = [];
rows.forEach(row => {
const titleLink = row.querySelector('a.magnet-link-wrap');
if (titleLink && titleLink.textContent.toLowerCase().includes(kwd)) {
const magnetAnchor = row.querySelector('a.js-magnet');
if (magnetAnchor) {
const fullText = magnetAnchor.getAttribute('data-clipboard-text') || magnetAnchor.getAttribute('href') || '';
if (fullText) {
const match = fullText.match(/^(magnet:\?xt=urn:btih:[^&]+)/);
if (match) {
magnets.push(match[1]);
} else if (fullText.startsWith('magnet:')) {
magnets.push(fullText);
}
}
}
}
});
if (magnets.length === 0) {
console.log('未找到匹配的磁連!');
notify('未找到包含關鍵字「' + keyword + '」的磁連');
return;
}
const result = magnets.join('\n');
if (typeof GM_setClipboard !== 'undefined') {
GM_setClipboard(result, 'text');
} else {
const textarea = document.createElement('textarea');
textarea.value = result;
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
notify('已複製 ' + magnets.length + ' 個匹配的磁連,如果有沒複製到的請點擊右下角『顯示更多』');
});
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', main);
} else {
main();
}
})();