random doujin but with tags

Generates a random doujinshi with personalized tags

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         random doujin but with tags
// @namespace    pablo
// @version      2.0
// @description  Generates a random doujinshi with personalized tags
// @match        https://nhentai.net/*
// @exclude      https://nhentai.net/g/*/
// @connect      nhentai.net
// @icon         https://i.imgur.com/1lihxY2.png
// @license MIT
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @grant        GM_getValue
// @grant        GM_openInTab
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// ==/UserScript==

(function() {
    'use strict';

    const apiBaseUrl = 'https://nhentai.net/api/galleries/search?query=';

    // Create the button
    const button = document.createElement('button');
    button.textContent = 'MAGIC !';
    button.classList.add('my-button');

    // Create the multi-selection tag list
    const select = document.createElement('select');
    select.style.position = 'static';
    select.style.bottom = '100px';
    select.style.right = '20px';
    select.style.zIndex = '9999';
    select.style.padding = '8px 12px';
    select.style.border = '1px solid #ddd';
    select.style.borderRadius = '5px';
    select.style.fontSize = '14px';
    select.style.backgroundColor = '#fff';
    select.style.color = '#333';
    select.style.maxWidth = '300px';
    select.style.height = '45px';
    select.multiple = true;

    // Define your desired tags (you can add more by following this exemple:(, "tag")
    const desired_tags = ["big breasts", "full color"];

    desired_tags.forEach(tag => {
        const option = document.createElement('option');
        option.textContent = tag;
        select.appendChild(option);
    });

    // Button click event
    button.addEventListener('click', async function() {
        const selectedTags = Array.from(select.selectedOptions, option => option.value);
        if (selectedTags.length > 0) {
            try {
                const randomTag = getRandomTag(selectedTags);
                const doujinshi = await getRandomDoujinshi(randomTag);
                displayDoujinshiDetails(doujinshi, randomTag);
            } catch (error) {
                displayErrorMessage('An error occurred while fetching doujinshi. Please try again later.');
            }
        }
    });

    // Create the container for the button and the select
    const container = document.createElement('li');
    container.appendChild(button);
    container.appendChild(select);

    // Target the <ul> element with class "menu right"
    const ulMenu = document.querySelector('ul.menu.right');
    if (ulMenu) {
        ulMenu.appendChild(container);
    }

    // Add styles
    GM_addStyle(`
       .my-button {
            background-color: #0d0d0d;
            color: white;
            border: none;
            padding: 5px 20px;
            font-size: 14px;
            cursor: pointer;
            border-radius: 0px;
            margin-right: 10px; /* Add margin to separate from other buttons */
        }

        .my-container {
            display: flex;
            align-items: center;
        }
    `);

    function getRandomTag(tags) {
        const randomIndex = Math.floor(Math.random() * tags.length);
        return tags[randomIndex];
    }

   async function getRandomDoujinshi(tag) {
        const response = await fetch(apiBaseUrl + tag);
        const data = await response.json();
        if (data.num_pages > 0) {
            const randomPage = Math.floor(Math.random() * data.num_pages) + 1;
            return getRandomDoujinshiFromPage(tag, randomPage);
        } else {
            throw new Error(`No doujinshi found with tag "${tag}"`);
        }
    }

    async function getRandomDoujinshiFromPage(tag, page) {
        const response = await fetch(apiBaseUrl + tag + '&page=' + page);
        const data = await response.json();
        if (data.result.length > 0) {
            const randomIndex = Math.floor(Math.random() * data.result.length);
            return data.result[randomIndex];
        } else {
            throw new Error(`No doujinshi found with tag "${tag}"`);
        }
    }

    function displayDoujinshiDetails(doujinshi, tag) {
        const title = doujinshi.title.pretty;
        const tags = doujinshi.tags.map(tag => tag.name).join(', ');
        console.log('Doujinshi Title:', title);
        console.log('Tags:', tags);
        console.log(`The doujinshi "${title}" contains the tag "${tag}"`);
        window.open(`https://nhentai.net/g/${doujinshi.id}`, '_blank');
    }

})();