Gelbooru Bulk Unfavorite

Automatically remove all favorites from gelbooru using AJAX.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         Gelbooru Bulk Unfavorite
// @version      1.6
// @description  Automatically remove all favorites from gelbooru using AJAX.
// @author       https://github.com/binge-coder
// @match        *://gelbooru.com/index.php?page=favorites*
// @run-at       document-end
// @namespace https://greasyfork.org/users/1575858
// ==/UserScript==

(function() {
    'use strict';

    const removalDelay = 1000;
    const refreshDelay = 2000;
    const autoRun = true;

    function processFavoritesBatch() {
        // Find all <b>Remove</b> tags and get their parent <a> links
        let removeButtons = Array.from(document.querySelectorAll('b'))
            .filter(b => b.textContent.trim().toLowerCase() === "remove")
            .map(b => b.closest('a'))
            .filter(a => a !== null && a.getAttribute("href"));

        console.log("Found", removeButtons.length, "remove buttons.");

        if(removeButtons.length === 0) {
            console.log("No favorites found. Process complete.");
            return;
        }

        let index = 0;
        function removeNext() {
            if(index >= removeButtons.length) {
                console.log("Batch complete. Refreshing...");
                setTimeout(() => location.reload(), refreshDelay);
                return;
            }

            let button = removeButtons[index];
            let url = button.getAttribute("href"); // Direct access to href

            if(url) {
                console.log("Removing favorite via URL:", url);
                fetch(url, { credentials: 'include' })
                    .then(() => {
                        console.log("Removed index", index);
                        index++;
                        setTimeout(removeNext, removalDelay);
                    })
                    .catch(err => {
                        console.error("Error at index", index, err);
                        index++;
                        setTimeout(removeNext, removalDelay);
                    });
            } else {
                index++;
                removeNext();
            }
        }
        removeNext();
    }

    function addManualButton() {
        let btn = document.createElement("button");
        btn.innerText = "Remove All Favorites";
        btn.style = "position:fixed;top:10px;right:10px;z-index:1000;padding:10px;background:red;color:white;border:none;cursor:pointer;";
        btn.onclick = processFavoritesBatch;
        document.body.appendChild(btn);
    }

    addManualButton();

    if(autoRun) {
        // Short delay to ensure page is ready
        setTimeout(() => {
            const hasFavs = Array.from(document.querySelectorAll('b')).some(b => b.textContent.trim().toLowerCase() === "remove");
            if(hasFavs) processFavoritesBatch();
        }, 500);
    }
})();