您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ajoute filters, Open All, YouTube trailers, et series recherche pour Oxtorrent/Torrent911.
// ==UserScript== // @name Oxtorrent/Torrent911 // @namespace https://greasyfork.org/users/PinkyGreasy // @version 1.0.1 // @description Ajoute filters, Open All, YouTube trailers, et series recherche pour Oxtorrent/Torrent911. // @author Pinky Greasy // @license MIT // @include /^https:\/\/(www\.)?(oxtorrent|torrent9|torrent911|t911)\.[a-z]+\/.*(films|series|detail|torrent|recherche).*/ // @grant none // ==/UserScript== (function () { 'use strict'; function searchTrailerOnYoutube(title) { // Clean up title for search (remove language tags, quality, year) let cleanTitle = title .replace(/\b(FRENCH|TRUEFRENCH|MULTI|VOSTFR|HDTS|CAM|MD|LD|REPACK|HDRip|WEBRIP)\b/gi, '') .replace(/\b(720p|1080p|2160p|4K)\b/gi, '') .replace(/\b\d{4}\b/g, '') // remove year .replace(/\s+/g, ' ') .trim(); let youtubeUrl = `https://www.youtube.com/results?search_query=${encodeURIComponent(cleanTitle + " trailer")}`; window.open(youtubeUrl, '_blank'); } function createOpenAllButton() { if (document.querySelector('#openAllBtn')) return; // prevent duplicates // Container for button + checkbox let container = document.createElement('div'); container.style.display = 'flex'; container.style.alignItems = 'center'; container.style.gap = '10px'; container.style.margin = '10px 0'; container.style.justifyContent = 'center'; // Original button let btn = document.createElement('button'); btn.id = 'openAllBtn'; btn.innerText = 'Open All'; btn.style.padding = '10px 15px'; btn.style.background = '#007bff'; btn.style.color = '#fff'; btn.style.border = 'none'; btn.style.borderRadius = '5px'; btn.style.cursor = 'pointer'; btn.style.fontSize = '14px'; btn.style.boxShadow = '0 2px 5px rgba(0,0,0,0.3)'; // Create YouTube checkbox let label = document.createElement('label'); label.style.fontSize = '14px'; label.style.cursor = 'pointer'; let checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'youtubeTrailer'; checkbox.style.marginRight = '5px'; label.appendChild(checkbox); label.appendChild(document.createTextNode('YouTube trailer')); container.appendChild(btn); container.appendChild(label); document.querySelector('#dernierstorrents #trier')?.insertAdjacentElement("afterbegin", container); btn.addEventListener('click', function() { let links = [...document.querySelectorAll('.listing-torrent > table tr td:first-child a')] .filter(link => link.offsetParent !== null); let groups = {}; links.forEach(link => { let text = link.innerText.trim(); let key = text .replace(/\b(FRENCH|TRUEFRENCH|MULTI|VOSTFR|HDTS|CAM|MD|LD|REPACK|HDRip|WEBRIP)\b.*$/gi, '') .replace(/\b(720p|1080p|2160p|4K)\b.*$/gi, '') // .replace(/\b\d{4}\b/g, '') // remove year .replace(/\s+/g, ' ') .trim() .toLowerCase(); if (!groups[key]) groups[key] = []; groups[key].push({ link: link.href, text }); }); let selectedItems = []; for (let key in groups) { let items = groups[key]; items.sort((a, b) => { let score = (t) => { if (/720p/i.test(t)) return 3; if (/1080p/i.test(t)) return 2; return 1; // fallback }; return score(b.text) - score(a.text); }); selectedItems.push(items[0]); // keep the object {link, text} } console.log(`Opening ${selectedItems.length} unique items`); selectedItems.forEach(item => { if (checkbox.checked) { searchTrailerOnYoutube(item.text); // Then open trailer tab } window.open(item.link, '_blank'); // Open torrent link }); }); } function hideOldMovies() { let list = document.querySelectorAll('.listing-torrent > table tr td:first-child'); let re = new RegExp(' (VOSTFR|HDTS|MD|LD|CAM) '); const d = new Date(); if (list.length > 0) { list.forEach((el) => { const filmName = el.innerText; if (re.test(filmName)) { el.closest("tr").remove(); } else { const year = filmName.trim().substr(-4); if (parseInt(year) <= d.getFullYear() - 3) { el.closest("tr").remove(); } } }); } } function openNewBackgroundTab(url) { var a = document.createElement("a"); a.href = url; var evt = document.createEvent("MouseEvents"); evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null); a.dispatchEvent(evt); } function tabifyLinks() { let links = document.querySelectorAll('.listing-torrent > table tr td:first-child a'); links.forEach((el) => { el.onclick = function (e) { e.preventDefault(); openNewBackgroundTab(el.href); } }); } function highlightFrSeries() { let list = document.querySelectorAll('.listing-torrent > table tr td:first-child'); let re = new RegExp(' VOSTFR ', 'i'); console.log(list.length); if (list.length > 0) { list.forEach((el) => { console.log(el); const filmName = el.innerText; if (re.test(filmName)) { el.closest("tr").style.opacity = "0.3"; } }); } } function copyTextToClipboard(element, text) { var textArea = document.createElement('textarea'); textArea.style.position = 'absolute'; textArea.style.opacity = '0'; textArea.value = text; document.body.appendChild(textArea); var execCopy = e => { textArea.select(); document.execCommand('copy'); document.body.removeChild(textArea); }; element.addEventListener('mouseup', execCopy, { once: true }); } function downloadifyPoster() { let poster = document.querySelector('img.img-rounded'); let download = document.querySelector('[class^="download"] a[href^="magnet"]')?.href || document.querySelector('#torrentsimage a[href*="magnet:"]')?.href; if (poster) { poster.style.cursor = "pointer"; if (download) { let magnet = document.querySelector('[class^="download"] img[alt*="magnet"]') || document.querySelector('#torrentsimage a[href*="magnet:"]'); if (magnet) { poster.onmousedown = e => magnet.closest('a').click(); } } else { poster.onmousedown = e => copyTextToClipboard(poster, download); } } } function youtubifyTitle() { let titles = document.querySelectorAll('.title > a[title]'); if (titles.length > 0) { titles.forEach(titleEl => { const name = titleEl.title.replace(/(REPACK|FRENCH|TRUEFRENCH|HDRip).+/, '').trim(); const searchUrl = "https://www.youtube.com/results?search_query=" + encodeURIComponent(name) + " trailer"; titleEl.href = searchUrl; titleEl.target = '_blank'; }); } } function cleanSerieName(rawName) { // Replace dots with spaces let name = rawName.replace(/\./g, ' '); // Capture everything up to SxxExx let match = name.match(/^(.*?\bS\d{2}E)\d{2}/i); if (match) { return match[1].trim(); } // If no SxxExx found, return cleaned name without extension return name.replace(/\.[^.]+$/, '').trim(); } function searchifySerie() { const elements = document.querySelectorAll('#torrentsimage .maximums'); elements.forEach(el => { el.style.cursor = "pointer"; el.addEventListener('click', (e) => { e.preventDefault(); let rawName = el.textContent.trim(); let cleanedName = cleanSerieName(rawName); let searchUrl = `/recherche/${encodeURIComponent(cleanedName)}`; window.open(searchUrl, '_blank'); // open in new tab }); }); } setTimeout(() => { const page = location.href; console.log("Tampermonkey Script Loaded!", page); if (page.match(/(torrent|detail)\/[0-9]+/)) { console.log("page"); downloadifyPoster(); youtubifyTitle(); searchifySerie(); } else if (page.includes("series")) { console.log("series"); highlightFrSeries(); tabifyLinks(); } else if (page.includes("films")) { console.log("films"); hideOldMovies(); tabifyLinks(); createOpenAllButton(); } }, 1000); })();