Youtube - Fix channel links in sidebar recommendations

Fixes the channel links for the "Up next" and recommendated videos below it on youtube.

As of 29.01.2021. See ბოლო ვერსია.

// ==UserScript==
// @name         Youtube - Fix channel links in sidebar recommendations
// @namespace    1N07
// @version      0.5
// @description  Fixes the channel links for the "Up next" and recommendated videos below it on youtube.
// @author       1N07
// @match        https://www.youtube.com/*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_openInTab
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

    var videoSectionOption;
    var videoSection = GM_getValue("videoSection", true);
    SetVidSecOption();

    GM_addStyle(`
		ytd-compact-video-renderer .channel-link-blocker:hover ~ a #text.ytd-channel-name {
			text-decoration: underline;
		}
		.loading-channel-link, .loading-channel-link * {
			cursor: progress !important;
		}

		.channel-link-blocker-parent
		{
			position: relative;
		}

		.channel-link-blocker
		{
			display: inline-block;
			position: absolute;
			width: 100%;
			height: 25px;
			background-color: rgba(255, 25, 25, 0);
			top: 32px;
			left: 0;
			z-index: 2019;
			cursor: pointer;
		}
	`);

    setInterval(AddListeners, 200); //fairly stupid way to do this, but hey, it works so this is how I'm doing it for now... -> switch to mutationobserver?

    function AddListeners() {
        // My big brain high IQ plan for preventing the video from opening, since seems whatever I do some click event is caught by youtube:
        // Adding invisible divs on top of channel links so I can handle the clicks however I want. :DD
        $("ytd-compact-video-renderer .metadata.ytd-compact-video-renderer:not(.channel-link-blocker-parent) > a[href^='/watch'], ytd-compact-playlist-renderer .metadata.ytd-compact-playlist-renderer:not(.channel-link-blocker-parent) > a[href^='/watch']").each(function(){
            $(this).parent().addClass("channel-link-blocker-parent");
            $(this).parent().prepend(`<div class="channel-link-blocker" title="Open channel to current tab with LMB and to a new tab with MMB"></div>`);
            $(this).parent().find(".channel-link-blocker").prop("style", "top: " + $(this).parent().find("a[href^='/watch']:first > h3").height() + "px;");
        });

        $(".channel-link-blocker").off(); //take out old listeners
        $(".channel-link-blocker").on("mousedown", function(e){ if(e.button==1) return false; }); //prevent MMB scrolling
        $(".channel-link-blocker").on("mouseup click", function(e){ //add new listeners
            e.preventDefault();
            e.stopPropagation();
            if(e && (e.which == 2 || e.which == 1)) {
                let elem = $(this);
                elem.addClass("loading-channel-link");
                let getUrl = $(this).next().prop("href") || "error"; //url of the video for the ajax
                if(getUrl != "error") {
                    $.get(getUrl, function(data){
                        let foundChannel = data.split('"/channel/')[1].split('"')[0] || "error"; //finding the channel code from the returned data
                        if(foundChannel != "error") {
                            if(e.which == 2)
                            {
                                GM_openInTab("https://www.youtube.com/channel/" + foundChannel + (videoSection ? "/videos" : ""));
                            }
                            else
                                window.open("https://www.youtube.com/channel/" + foundChannel + (videoSection ? "/videos" : ""),"_self");
                        }
                        else {
                            alert("parsing error");
                        }
                    }).fail(function(){
                        alert("load error");
                    }).always(function(){
                        elem.removeClass("loading-channel-link");
                    });
                }
                else {
                    alert("getUrl error");
                }
            }
        });
    }

    function SetVidSecOption() {
        GM_unregisterMenuCommand(videoSectionOption);
        videoSectionOption = GM_registerMenuCommand("Fix channel links- videos section (" + (videoSection ? "yes" : "no") + ") -click to change-", function(){
            videoSection = !videoSection;
            GM_setValue("videoSection", videoSection);
            SetVidSecOption();
        });
    }
})();