// ==UserScript== // @name Serienfans/Filmfans Releasegruppen Filter // @namespace https://git.ponywave.de/Akamaru/Userscripts // @version 1.1 // @description Blende Uploads bestimmter Releasegruppen aus // @author Akamaru // @match https://serienfans.org/* // @match https://serienfreaks.org/* // @match https://filmfans.org/* // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_addStyle // @updateURL https://git.ponywave.de/Akamaru/Userscripts/raw/branch/master/serienfans-releasegroup-filter.user.js // @downloadURL https://git.ponywave.de/Akamaru/Userscripts/raw/branch/master/serienfans-releasegroup-filter.user.js // @run-at document-end // ==/UserScript== (function() { 'use strict'; // CSS für Block-Button GM_addStyle(` .block-group-btn { display: inline; margin-left: 5px; background: none; border: none; cursor: pointer; font-size: 14px; padding: 0; line-height: 1; width: auto; min-width: 0; vertical-align: middle; } `); // Standard-Blacklist (kann über das Menü bearbeitet werden) const defaultBlacklist = []; // Lade die Blacklist aus den gespeicherten Einstellungen let blacklist = GM_getValue('releasegroup_blacklist', defaultBlacklist); // Funktion zum Ausblenden von Einträgen function filterReleases() { const entries = document.querySelectorAll('.entry'); entries.forEach(entry => { const releasegroupSpan = entry.querySelector('.audiotag:has(small:contains("Releasegruppe:"))'); if (releasegroupSpan) { const releasegroupText = releasegroupSpan.textContent.trim(); const releasegroup = releasegroupText.replace('Releasegruppe:', '').trim(); if (blacklist.some(blocked => blocked.toLowerCase() === releasegroup.toLowerCase())) { // Blende den Entry-Container und das dazugehörige Checkbox aus entry.style.display = 'none'; const checkbox = entry.previousElementSibling; if (checkbox && checkbox.classList.contains('show_nfo')) { checkbox.style.display = 'none'; } } } }); } // Funktion zum Blocken einer Releasegruppe function blockReleasegroup(releasegroup) { if (!blacklist.some(blocked => blocked.toLowerCase() === releasegroup.toLowerCase())) { blacklist.push(releasegroup); GM_setValue('releasegroup_blacklist', blacklist); location.reload(); } } // Alternative querySelector-Methode (robuster) function filterReleasesAlternative() { const entries = document.querySelectorAll('.entry'); entries.forEach(entry => { let releasegroup = null; // Methode 1: Serienfans/Filmfans - const grouptag = entry.querySelector('.grouptag'); if (grouptag) { releasegroup = grouptag.textContent.trim(); } else { // Methode 2: Ältere Struktur - .audiotag mit "Releasegruppe:" const audiotags = entry.querySelectorAll('.audiotag'); audiotags.forEach(tag => { const small = tag.querySelector('small'); if (small && small.textContent.includes('Releasegruppe:')) { releasegroup = tag.textContent.replace('Releasegruppe:', '').trim(); } }); } // Prüfe ob Releasegruppe geblockt werden soll if (releasegroup && blacklist.some(blocked => blocked.toLowerCase() === releasegroup.toLowerCase())) { entry.style.display = 'none'; const checkbox = entry.previousElementSibling; if (checkbox && checkbox.tagName === 'INPUT') { checkbox.style.display = 'none'; } } // Füge Block-Button hinzu, wenn noch nicht vorhanden if (releasegroup && !entry.querySelector('.block-group-btn')) { const h3 = entry.querySelector('h3'); if (h3) { const blockBtn = document.createElement('button'); blockBtn.textContent = '🚫'; blockBtn.className = 'block-group-btn'; blockBtn.title = `Releasegruppe "${releasegroup}" blocken`; blockBtn.onclick = (e) => { e.preventDefault(); e.stopPropagation(); if (confirm(`Releasegruppe "${releasegroup}" zur Blacklist hinzufügen?`)) { blockReleasegroup(releasegroup); } }; h3.appendChild(blockBtn); } } }); } // Funktion zum Bearbeiten der Blacklist function editBlacklist() { const currentList = blacklist.join(', '); const newList = prompt('Releasegruppen zum Ausblenden (kommagetrennt):\n\nBeispiel: SURCODE, WATCHABLE, ENDSTATiON', currentList); if (newList !== null) { blacklist = newList.split(',').map(item => item.trim()).filter(item => item !== ''); GM_setValue('releasegroup_blacklist', blacklist); alert('Blacklist gespeichert! Die Seite wird neu geladen.'); location.reload(); } } // Registriere Menübefehl GM_registerMenuCommand('Releasegruppen-Filter bearbeiten', editBlacklist); // Filtere beim Laden der Seite filterReleasesAlternative(); // Beobachte Änderungen (falls Inhalte dynamisch nachgeladen werden) const observer = new MutationObserver(() => { filterReleasesAlternative(); }); const listContainer = document.getElementById('list'); if (listContainer) { observer.observe(listContainer, { childList: true, subtree: true }); } })();