Youtube Logo - Link to subscriptions feed

Change YouTube logo link to user's subscription feed instead of homepage, when logged in, for 2017 and later YouTube layout.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name            Youtube Logo - Link to subscriptions feed
// @namespace       Youtube Logo - Link to subscriptions feed
// @description     Change YouTube logo link to user's subscription feed instead of homepage, when logged in, for 2017 and later YouTube layout.
// @version         2.0.1
// @include         *://*.youtube.tld/*
// @supportURL      https://greasyfork.org/en/scripts/13582/feedback
// @author          aciid
// @license         MIT
// ==/UserScript==

//console.info("[YTLTSF] Script running ... Youtube Logo - Link to subscriptions feed");

async function WaitForPageLoad() {
    while (true) { // Indefinite loop, YouTube page won't load unless tab is in focus anyway.
        var logoLoaded = (document.querySelectorAll("[id='logo'][title='YouTube Home']").length > 0);
        var userLoggedIn = (document.querySelector("div[id='buttons'] img[id='img'][alt='Avatar image']") !== null);
        var userLoggedOut = (document.querySelector("div[id='end'] [id='button'][aria-label='Sign in']") !== null);

        //console.log("[YTLTSF] Loading... (logoLoaded: " + logoLoaded + ") && (loggedIn: " + userLoggedIn + " || loggedOut: " + userLoggedOut + ")");

        if (logoLoaded) { // Wait for logo to load before proceeding
            // Script will wait for either user userLoggedIn or userLoggedOut element before proceeding
            if (userLoggedIn) {
                RunScript(); // Continue script
                return;
            } else if (userLoggedOut) {
                //console.log("[YTLTSF] Quitting script, user not logged in...");
                return;
            }
        }
        await new Promise(r => setTimeout(r, 100)); // Sleep loop for 100ms
    }
}

function RunScript() {
    var logos = document.querySelectorAll("[id='logo'][title='YouTube Home']");

    // Iterate through all logo elements like main page and left-hand menu
    logos.forEach(logo => {
        BlockEvents(logo); // Block youtube events on logo element so we can redirect clicks to subscriptions page

        logo.href = "/feed/subscriptions"; // Add href just for appearances
        logo.addEventListener("click", LogoClick); // Process mouse click on logo
        //logo.addEventListener("pointerdown", LogoClick); // Uncomment to allow touchscreen clicks on logo
    });
}

function BlockEvents(element) {
    var action = function(e) {
        e.preventDefault(); // Block original YouTube event action
        //console.log("Blocked YouTube event: " + e.type + " targetPath: " + e.target.rootPath);
    }

    // Create list of event types to be blocked
    var events = [];
    for (var ele in element) {
        if(ele.startsWith("onclick") || ele.startsWith("onpointerdown")) {
            events.push(ele.substr(2));
        }
    }

    events.forEach(function(eventType) {
        element.addEventListener(eventType, action);
    });
}

function LogoClick(event) {
    // Re-create Subscriptions button then click it to load subscriptions page without refreshing whole page
    var subButton = document.createElement("a");
    subButton.innerHTML = '<a id="endpoint" class="yt-simple-endpoint style-scope ytd-guide-entry-renderer" tabindex="-1" role="tablist" title="Subscriptions" href="/feed/subscriptions">';
    subButton.style = "visibility:hidden;"

    document.body.appendChild(subButton); // Add subButton to webpage
    document.querySelector("a[id='endpoint'][title='Subscriptions']").click(); // Find and click subButton button (either youtube or above created button works)

    event.stopPropagation(); // Stop any further events from being fired
}

WaitForPageLoad();