F95Zone Search Buttons for DLsite

Adds modern, well-aligned buttons to search for the current game, circle, and product ID on F95Zone, OtomiGames, and RyuuGames. Keeps "Circle: [Name]" on one line and places circle buttons side by side.

Versión del día 14/03/2025. Echa un vistazo a la versión más reciente.

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         F95Zone Search Buttons for DLsite
// @namespace    http://tampermonkey.net/
// @version      2.2
// @description  Adds modern, well-aligned buttons to search for the current game, circle, and product ID on F95Zone, OtomiGames, and RyuuGames. Keeps "Circle: [Name]" on one line and places circle buttons side by side.
// @author       FunkyJustin
// @match        https://www.dlsite.com/maniax/work/=/product_id/*
// @match        https://www.dlsite.com/pro/work/=/product_id/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Wait for page load
    window.addEventListener('load', createSearchButtons);

    function createSearchButtons() {
        // 1. Extract game/circle info
        const gameTitleEl = document.querySelector('h1#work_name');
        const circleNameEl = document.querySelector('span[itemprop="brand"] a');
        if (!gameTitleEl || !circleNameEl) return;

        const gameTitle = gameTitleEl.innerText.trim();
        const circleName = circleNameEl.innerText.trim();

        let productId = window.location.href.match(/product_id\/([^\/]+)/)[1] || '';
        productId = productId.replace('.html', '');

        // 2. Define URLs
        // F95Zone
        const f95zoneGameLink      = `https://f95zone.to/sam/latest_alpha/#/cat=games/page=1/search=${encodeURIComponent(gameTitle)}`;
        const f95zoneForumLink     = `https://f95zone.to/search/?q=${encodeURIComponent(gameTitle)}&t=post&c[child_nodes]=1&c[nodes][0]=2&c[title_only]=1&o=relevance`;
        const f95zoneCircleLink    = `https://f95zone.to/sam/latest_alpha/#/cat=games/page=1/creator=${encodeURIComponent(circleName)}`;
        const f95zoneProductIdLink = `https://f95zone.to/search/?q=${encodeURIComponent(productId)}`;

        // OtomiGames
        const otomiGamesSearchLink    = `https://otomi-games.com/?s=${encodeURIComponent(gameTitle)}`;
        const otomiGamesProductIdLink = `https://otomi-games.com/${productId}/`;

        // RyuuGames
        const ryuuGamesTitleLink      = `https://www.ryuugames.com/?s=${encodeURIComponent(gameTitle)}`;
        const ryuuGamesProductIdLink  = `https://www.ryuugames.com/?s=${encodeURIComponent(productId)}`;
        const ryuuGamesCircleLink     = `https://www.ryuugames.com/?s=${encodeURIComponent(circleName)}`;

        // 3. Common button styling
        const buttonBaseStyle = {
            display: 'inline-block',
            padding: '8px 16px',
            margin: '5px',
            color: '#fff',
            backgroundColor: '#009688',
            borderRadius: '4px',
            textDecoration: 'none',
            fontSize: '0.9rem',
            cursor: 'pointer',
            transition: 'background-color 0.3s ease'
        };

        function createButton(text, url) {
            const a = document.createElement('a');
            a.innerText = text;
            a.href = url;
            a.target = '_blank';
            Object.assign(a.style, buttonBaseStyle);
            // Hover effect
            a.addEventListener('mouseover', () => {
                a.style.backgroundColor = '#00796B';
            });
            a.addEventListener('mouseout', () => {
                a.style.backgroundColor = '#009688';
            });
            return a;
        }

        // 4. Create buttons
        // Title-based searches
        const f95GameBtn   = createButton('Search on F95Zone', f95zoneGameLink);
        const f95ForumBtn  = createButton('Search on F95Zone Forums', f95zoneForumLink);
        const f95PIDBtn    = createButton('Search Product ID on F95Zone', f95zoneProductIdLink);
        const otomiGameBtn = createButton('Search on OtomiGames', otomiGamesSearchLink);
        const otomiPIDBtn  = createButton('Search Product ID on OtomiGames', otomiGamesProductIdLink);
        const ryuuGameBtn  = createButton('Search on RyuuGames', ryuuGamesTitleLink);
        const ryuuPIDBtn   = createButton('Search Product ID on RyuuGames', ryuuGamesProductIdLink);

        // Circle-based searches
        const f95CircleBtn  = createButton('Search Circle on F95Zone', f95zoneCircleLink);
        const ryuuCircleBtn = createButton('Search Circle on RyuuGames', ryuuGamesCircleLink);

        // 5. Append Title Buttons in a Flex Container
        const titleContainer = document.querySelector('.base_title_br');
        if (titleContainer) {
            const titleFlex = document.createElement('div');
            titleFlex.style.display = 'flex';
            titleFlex.style.flexWrap = 'wrap';
            titleFlex.style.alignItems = 'center';
            titleFlex.style.marginTop = '10px';

            [f95GameBtn, f95ForumBtn, f95PIDBtn,
             otomiGameBtn, otomiPIDBtn,
             ryuuGameBtn, ryuuPIDBtn]
                .forEach(btn => titleFlex.appendChild(btn));

            titleContainer.appendChild(titleFlex);
        }

        // 6. Append Circle Buttons Side by Side
        // Insert right after the circle name, so "Circle: BLACK PANDA" remains on one line
        const circleButtonWrapper = document.createElement('span');
        circleButtonWrapper.style.display = 'inline-flex';
        circleButtonWrapper.style.flexWrap = 'nowrap';
        circleButtonWrapper.style.alignItems = 'center';
        circleButtonWrapper.style.marginLeft = '10px';
        // Add both buttons side by side
        circleButtonWrapper.appendChild(f95CircleBtn);
        circleButtonWrapper.appendChild(ryuuCircleBtn);

        circleNameEl.insertAdjacentElement('afterend', circleButtonWrapper);

        // 7. Auto-submit on F95Zone forum pages
        if (window.location.href === f95zoneForumLink || window.location.href === f95zoneProductIdLink) {
            window.onload = function() {
                setTimeout(function() {
                    const searchField = document.querySelector('.input[name="keywords"]');
                    if (searchField) {
                        searchField.value = gameTitle;
                        searchField.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));
                    }
                }, 1000);
            };
        }
    }
})();