Greasy Fork is available in English.

DuckDuckGo Images for Brave search

Inserts DuckDuckGo images tab into Brave search

// ==UserScript==
// @name         DuckDuckGo Images for Brave search
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  Inserts DuckDuckGo images tab into Brave search
// @author       Nobody
// @match        https://search.brave.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=brave.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    function insertDuckImagesMenu() {
        const primaryTabs = document.getElementById('primary-tabs');
        if (!primaryTabs) return;

        // Ensure the tab is not already added
        if (primaryTabs.querySelector('.duckduckgo-images-tab')) return;

        const tabImages = primaryTabs.querySelector('li:nth-child(2)');
        if (!tabImages) return;

        const duckDuckGoImagesTab = tabImages.cloneNode(true);
        const duckDuckGoImagesLink = duckDuckGoImagesTab.querySelector('a');
        if (!duckDuckGoImagesLink) return;

        const href = duckDuckGoImagesLink.getAttribute('href');
        const queryStart = href.indexOf('q=') + 2;
        const searchQuery = href.substring(queryStart);

        const newURL = `https://duckduckgo.com/?q=${searchQuery}&iax=images&ia=images`;
        duckDuckGoImagesLink.setAttribute('href', newURL);
        duckDuckGoImagesLink.setAttribute('target', '_blank');

        const textSpan = duckDuckGoImagesLink.querySelector('span');
        if (textSpan) textSpan.textContent = 'Duck Img';

        duckDuckGoImagesTab.classList.remove('active');
        duckDuckGoImagesTab.classList.add('duckduckgo-images-tab'); // Add a custom class

        primaryTabs.insertBefore(duckDuckGoImagesTab, tabImages.nextSibling);
    }

    function observePrimaryTabs() {
        const primaryTabs = document.getElementById('primary-tabs');
        if (!primaryTabs) return;

        const observer = new MutationObserver(() => {
            insertDuckImagesMenu(); // Re-insert menu on changes
        });

        observer.observe(primaryTabs, { childList: true, subtree: true });
    }

    window.addEventListener('load', () => {
        insertDuckImagesMenu(); // Initial insertion
        observePrimaryTabs();  // Observe changes to re-insert if necessary
    });
})();