Audio Tab Title

Change the window title on YouTube based on the channel name and video title, and append the website name on Spotify and SoundCloud pages.

// ==UserScript==
// @name         Audio Tab Title
// @description  Change the window title on YouTube based on the channel name and video title, and append the website name on Spotify and SoundCloud pages.
// @version      0.6.1
// @namespace    itsafeature.org
// @author       Geoffrey De Belie (Smile4ever)
// @license      Unlicense
// @match        https://www.youtube.com/watch?v=*
// @match        https://music.youtube.com/*
// @match        https://open.spotify.com/*
// @match        https://soundcloud.com/*
// @match        https://music.amazon.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Format GrupoBryndisOficial to Grupo Bryndis
    function formatChannelName(name) {
        if (!name.includes(" ")) {
            name = name.replace(/([a-z])([A-Z])/g, '$1 $2'); // Add spaces if none exist
        }
        return name.replace("Oficial", "").trim(); // Remove "Oficial" and trim spaces
    }

    // Function to update the title on YouTube
    function updateYouTubeTitle() {
        const metadataElementArtist = document.querySelector(".yt-video-attribute-view-model__metadata h4"); // Artist
        const metadataElementTitle = document.querySelector(".yt-video-attribute-view-model__metadata h1"); // Title

        const channelElement = document.querySelector('a.yt-simple-endpoint.style-scope.yt-formatted-string');
        const channelName = channelElement?.innerText ?? "";
        const channelNameClean = formatChannelName(channelName.split(' - ')[0].split('|')[0]);

        const videoTitleElement = document.querySelector('#above-the-fold #title');
        const videoTitle = videoTitleElement?.innerText ?? "";
        const spaceIndex = videoTitle.indexOf(' ');
        const dashIndex = videoTitle.indexOf('-');
        const lastDashIndex = videoTitle.lastIndexOf('-');

        // We need the video title element, if it's not found the page structure must have changed
        if(videoTitleElement == null) return;

        if (metadataElementArtist && metadataElementTitle && lastDashIndex != -1){
            const contentAfterDash = videoTitle.substring(lastDashIndex + 1).trim();

            if (contentAfterDash.toLowerCase().includes(metadataElementArtist.innerText.toLowerCase())) {
                // If metadata artist appears after the dash in video title, fix the tab title
                document.title = `${metadataElementArtist.innerText} - ${metadataElementTitle.innerText} - YouTube`;
                return;
            }
        }

        if(dashIndex != -1 && videoTitle.indexOf(', ') == -1){
            return;
        }

        // Use metadata if available
        if (metadataElementArtist && metadataElementTitle) {
            // Set the window title for YouTube if needed
            document.title = `${metadataElementArtist.innerText} - ${metadataElementTitle.innerText} - YouTube`;
            return;
        }

        // Fall back to channel + video title approach
        if (channelElement) {
            // If there's no space, continue. If the first dash appears before the first space, get out
            if (spaceIndex != -1 && dashIndex < spaceIndex) return;

            // Set the window title for YouTube if needed
            if(videoTitle.includes(channelNameClean) == false){
                document.title = `${channelNameClean} - ${videoTitle} - YouTube`;
                return;
            }
        }
    }

    // Function to update the title on YouTube Music
    function updateYouTubeMusicTitle() {
        const elements = document.querySelectorAll('.ytmusic-player-bar yt-formatted-string');
        if (elements.length < 2) return;

        const artistElement = elements[1];
        const audioTitleElement = elements[0];

        if (artistElement && audioTitleElement) {
            const artistName = artistElement.childNodes[0].innerText;
            const audioTitle = audioTitleElement.innerText;

            // Set the window title for YouTube Music
            document.title = `${artistName} - ${audioTitle} - YouTube Music`;
        }
    }

    // Function to update the title on Spotify
    function updateSpotifyTitle() {
        const titleElement = document.querySelector('title'); // Get the <title> element
        if (titleElement.innerText.includes(" - Spotify") == false) {
            titleElement.innerText = `${titleElement.innerText} - Spotify`; // Set the title's innerText for Spotify
        }
    }

     function updateSoundCloudTitle() {
        const titleElement = document.querySelector('title'); // Get the <title> element
        if (titleElement.innerText.includes(" - SoundCloud") == false) {
            titleElement.innerText = `${titleElement.innerText} - SoundCloud`; // Set the title's innerText for Spotify
        }
    }

    function updateAmazonMusicTitle(){
        const shadowHost = document.querySelector('music-horizontal-item');
        const shadowRoot = shadowHost.shadowRoot;
        const musicLinks = shadowRoot.querySelectorAll('music-link');

        if (musicLinks.length >= 2) {
            const songTitle = musicLinks[0].getAttribute('title');
            const artistTitle = musicLinks[1].getAttribute('title');

            document.title = `${artistTitle} - ${songTitle} - Amazon Music`;
        }
    }

    // Function to check for the current platform
    function updateTitle() {
        if (window.location.hostname == 'music.youtube.com'){
            updateYouTubeMusicTitle();
        } else if (window.location.hostname.includes('youtube.com')) {
            updateYouTubeTitle();
        } else if (window.location.hostname.includes('spotify.com')) {
            updateSpotifyTitle();
        } else if (window.location.hostname.includes('soundcloud.com')) {
            updateSoundCloudTitle();
        } else if (window.location.hostname.includes('music.amazon.com')) {
            updateAmazonMusicTitle();
        }
    }

    // Optionally, observe changes in the page if the title might update after load
    const observer = new MutationObserver(updateTitle);
    observer.observe(document.body, { childList: true, subtree: true });

    // Wait for the page content to load before running the updateTitle function
    window.addEventListener('load', updateTitle);

    // Set an interval to check the title every second on Spotify pages only
    setInterval(() => {
        updateTitle(); // Update the title every X seconds (if needed)
    }, 2000);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址