1
0
Files
Userscripts/serienfans-releasegroup-filter.user.js
2025-09-30 19:30:05 +02:00

158 lines
6.1 KiB
JavaScript

// ==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 - <span class="grouptag">
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 });
}
})();