diff --git a/serienfans-releasegroup-filter.user.js b/serienfans-releasegroup-filter.user.js new file mode 100644 index 0000000..4abe336 --- /dev/null +++ b/serienfans-releasegroup-filter.user.js @@ -0,0 +1,150 @@ +// ==UserScript== +// @name Serienfans/Filmfans Releasegruppen Filter +// @namespace https://git.ponywave.de/Akamaru/Userscripts +// @version 1.0 +// @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 => { + const audiotags = entry.querySelectorAll('.audiotag'); + let releasegroup = null; + + // Finde die Releasegruppe + audiotags.forEach(tag => { + const small = tag.querySelector('small'); + if (small && small.textContent.includes('Releasegruppe:')) { + releasegroup = tag.textContent.replace('Releasegruppe:', '').trim(); + + if (blacklist.some(blocked => blocked.toLowerCase() === releasegroup.toLowerCase())) { + entry.style.display = 'none'; + const checkbox = entry.previousElementSibling; + if (checkbox && checkbox.classList.contains('show_nfo')) { + 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 }); + } +})();