osu! Source to Bangumi Search

Add a Bangumi search link next to osu! beatmap source link

// ==UserScript==
// @name         osu! Source to Bangumi Search
// @namespace    https://osu.ppy.sh/users/15416101
// @version      1.1
// @description  Add a Bangumi search link next to osu! beatmap source link
// @author       trytodupe, ChatGPT
// @match        https://osu.ppy.sh/beatmapsets/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    function addBangumiLink() {
        const sourceLinks = document.querySelectorAll('a[href*="https://osu.ppy.sh/beatmapsets?q=source"]');

        sourceLinks.forEach(link => {
            if (link.dataset.bgmAdded) return;

            const sourceText = link.textContent.trim();
            const bangumiUrl = `https://bangumi.tv/subject_search/${encodeURIComponent(sourceText)}`;

            const bgmLink = document.createElement('a');
            bgmLink.href = bangumiUrl;
            bgmLink.textContent = '[search on bgm]';
            bgmLink.target = '_blank';
            bgmLink.className = link.className;

            const separator = document.createTextNode(' ');
            link.parentElement.appendChild(separator);
            link.parentElement.appendChild(bgmLink);

            link.dataset.bgmAdded = 'true';
        });
    }

    const observer = new MutationObserver(() => {
        addBangumiLink();
    });
    observer.observe(document.body, { childList: true, subtree: true });

    let currentUrl = location.href;
    setInterval(() => {
        if (location.href !== currentUrl) {
            currentUrl = location.href;
            setTimeout(() => addBangumiLink(), 500);
        }
    }, 500);

    addBangumiLink();
})();