Fixes the channel links for the "Up next" and recommendated videos below it on youtube.
目前為
// ==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();
});
}
})();