Youtube plus

Small CSS tweaks to youtube with color theme settings

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         Youtube plus
// @description  Small CSS tweaks to youtube with color theme settings
// @grant        GM_addStyle
// @include *://youtube.com/*
// @include *://www.youtube.com/*
// @run-at document-start
// @version 3.5
// @namespace https://greasyfork.org/users/3167
// ==/UserScript==

var defaultcolor = "hsla(3, 60%, 47%, 1)";

var customcolor = defaultcolor;

var firstrun = false;

if (typeof(Storage) !== "undefined") {
  if (localStorage.yt_custom_color) {
      customcolor = localStorage.yt_custom_color;
  } else {
      firstrun = true;
      localStorage.yt_custom_color = customcolor;
  }
}

console.log("yt_custom_color", customcolor);

var stylesheet = `
body {
    /* --yt-custom-color: " + customcolor + "; */
}
.ytp-pause-overlay {
    display: none;
}
#player-ads { display: none; }
body, 
ytd-app {
    --yt-brand-paper-button-color: var(--yt-custom-color) !important;
    --yt-brand-color: var(--yt-custom-color) !important;
}
paper-button.style-scope.ytd-subscribe-button-renderer,
paper-button.ytd-subscribe-button-renderer {
    background-color: var(--yt-custom-color);
}
paper-button.style-scope.ytd-subscribe-button-renderer[subscribed] {
    background-color: var(--yt-spec-10-percent-layer);
}
ytd-guide-entry-renderer[active] path.style-scope.yt-icon {
    color: var(--yt-custom-color) !important;
}
#progress.yt-page-navigation-progress, 
#progress.ytd-thumbnail-overlay-resume-playback-renderer, 
.ytp-red2 .ytp-swatch-background-color, 
.ytp-red2 .ytp-swatch-background-color-secondary, 
.ytp-play-progress.ytp-swatch-background-color, 
.ytp-swatch-background-color-secondary, 
.ytp-scrubber-button.ytp-swatch-background-color {
    background-color: var(--yt-custom-color) !important;
}
path#lozenge-path, 
path.style-scope.ytd-topbar-logo-renderer {
    fill: var(--yt-custom-color);
}
div#top div#player {
    max-height: calc(100vh - var(--ytd-masthead-height, 56px));
}
`;



var setcustomcolor = function (colorinput) {
  console.log("Changing color theme to: " + colorinput);
  customcolor = colorinput;
  document.body.style.setProperty('--yt-custom-color', customcolor);

  localStorage.yt_custom_color = customcolor;

  var savedcolor = localStorage.yt_custom_color;
  console.log("Saved color theme: " + savedcolor);
  
}
unsafeWindow.setcustomcolor = setcustomcolor;

var pickcustomcolor = function () {
    console.log("click");
    customcolorpicker.click();
}
unsafeWindow.pickcustomcolor = pickcustomcolor;

var resetcustomcolor = function () {
    unsafeWindow.setcustomcolor(defaultcolor);
}
unsafeWindow.resetcustomcolor = resetcustomcolor;

var video_emitkey = function(keycode) {
  var video_element = document.getElementById("movie_player");
  if (video_element) {
    var ke = new KeyboardEvent('keydown');
    delete ke.keyCode;
    Object.defineProperty(ke, "keyCode", {"value" : keycode});
    video_element.dispatchEvent(ke);
  }
}

var volumecontrol_init = function() {
  var video_player = document.getElementById("ytd-player");
  if (video_player) {

    if (!video_player.youtubeplus_wheel_hooked) {
      video_player.addEventListener('wheel', function(e) {
        e.preventDefault();
        if (e.deltaY < 0) {
          video_emitkey(38);
        }
        if (e.deltaY > 0) {
          video_emitkey(40);
        }
      }); 
      video_player.youtubeplus_wheel_hooked = true;
    }
  }
}

var redirectshorts_init = function() {
    if (location.href.includes("/shorts/")){
        let redirect_url = location.href.replace("/shorts/", "/watch?v=");
        console.log("Shorts detected, redirecting to: " + redirect_url);
        window.location.href = redirect_url;
    }
}

var init = function() {
  
  if (typeof GM_addStyle != "undefined") {
    GM_addStyle (stylesheet);
  } else {
    var css = document.createElement("style");
    css.type = "text/css";
    css.innerHTML = stylesheet;
    document.head.appendChild(css);
  }

  var customcolorpicker = document.createElement('input');
  customcolorpicker.type = "color";
  customcolorpicker.onchange = "setcustomcolor(this.value);";
  customcolorpicker.style = "display: none;";
  customcolorpicker.addEventListener("change", function() {
      setcustomcolor(this.value);

  });
  redirectshorts_init();
  setcustomcolor(customcolor);
  volumecontrol_init();
  mutator_init();
  console.log("Youtube++ init!");
}

var mutator_callback = function() {
  //console.log("Mutation detected...");
  volumecontrol_init();
  mutator_init();
}

var mutator_init = function() {
  var targetNode = document.body;
  if (targetNode && !targetNode.youtubeplus_mutator_hooked) {
    var observer = new MutationObserver(mutator_callback);
    observer.observe(targetNode, { childList: true });
    targetNode.youtubeplus_mutator_hooked = true;
  }
}

if (typeof unsafeWindow.Request_OLD == "undefined") {
  var Request_OLD = unsafeWindow.Request;
  class Request extends Request_OLD {
    constructor(a,b) {
      b = b || {};
      b.credentials = b.credentials || "same-origin";
      super(a,b)
    }
  }
  unsafeWindow.Request = Request;
}

console.log("Youtube++ loaded!");

document.addEventListener("DOMContentLoaded", function(event) { 
  init();
  console.log("Youtube++ init!");
});