YouTube restyle

youtube video progressbar outline & color replacement

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

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

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         YouTube restyle
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  youtube video progressbar outline & color replacement
// @author       Roman Sergeev aka naxombl4 aka Brutal Doomer
// @match        https://www.youtube.com/*
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

/**
 * v1.0 added comments, added --vars, removed timeout function changing svg path fill
 *      added surveyLoadProgresses from another script
 *      added replacer of YT logos
 * v0.1 original script
 */

(function() {
    'use strict';
    // replace youtube logo on the browser tab with image of corresponding color (changing the theme, you have to upload your own)
    document.getElementsByTagName('link')[1].setAttribute("href", "https://dl.dropboxusercontent.com/s/9avoipkut6ydydu/32.png");
    document.getElementsByTagName('link')[2].setAttribute("href", "https://dl.dropboxusercontent.com/s/8mujk3poo7nvxsm/48.png");
    document.getElementsByTagName('link')[3].setAttribute("href", "https://dl.dropboxusercontent.com/s/5zrmlvm9uy1zran/96.png");
    document.getElementsByTagName('link')[4].setAttribute("href", "https://dl.dropboxusercontent.com/s/6goosuv17qzvgit/144.png");
    //var notificationImageSrc = "https://www.dropbox.com/scl/fi/uxal14y48igxdp02hy8n9/notification.png"; // dropbox has changed their storing method, yet old links still work. You can't modify links due to CORB policy, so...
    // Here's the replacement image in Base64, size 64x64px. If you change the theme - change this as well
    // Original image is at https://www.gstatic.com/images/branding/product/2x/youtube_96in128dp.png
    var notificationImageSrc64 = "data:image/jpeg;base64,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";
    var colour = "#558",
        darken = "#447",
        bright = "#669",
        prgbar = "#0f06",
        prgend = "#0f0";

    GM_addStyle(`
  :root {
    --colour: `+colour+`;
    --darken: `+darken+`;
    --bright: `+bright+`;
    --prgbar: `+prgbar+`;
    --prgend: `+prgend+`;
  }
  html[refresh],
  [refresh] {
    --yt-spec-static-brand-red: var(--colour);
    --yt-spec-red-indicator: var(--colour);
  }
  span.mention.yt-live-chat-text-message-renderer {
    background: var(--colour) !important; /* live chat mention background replacement (doesn't work) */
  }
  div.ytp-chapter-hover-container,
  div.ytp-chapter-hover-container>div {
    outline: none;
  }
  div.ytp-load-progress {
    background-color: var(--prgbar);
  }
  div.ytp-load-progress div.progressBarAfter {
    position: absolute;
    height: 100%;
    right: 0;
    background-color: var(--prgend);
  }
  .ytp-hover-progress.ytp-hover-progress-light {
    background-color: var(--prgbar);
  }
  div.ytp-swatch-background-color,
  button.ytp-settings-button.ytp-hd-quality-badge::after {
    background-color: var(--darken);
  }
  html:not(.style-scope)[dark], :not(.style-scope)[dark] {
    --yt-spec-static-overlay-background-brand: var(--colour);
    --yt-spec-brand-button-background: var(--darken);
    --yt-spec-light-blue: var(--colour);
    --yt-spec-call-to-action: var(--colour);
    --yt-live-chat-mention-background-color: var(--colour);
  }
  sup.ytp-swatch-color {
    color: var(--colour);
  }
  div.ytp-cairo-refresh-signature-moments .ytp-play-progress {
    background: var(--colour);
  }
  span.badge-style-type-live-now.ytd-badge-supported-renderer {
    --yt-spec-brand-link-text: var(--bright);
  }
  span.mention.style-scope.yt-live-chat-text-message-renderer,
  .mention.yt-live-chat-text-message-renderer {
    background: var(--colour) !important;
  }
  ytd-thumbnail-overlay-resume-playback-renderer[enable-refresh-signature-moments-web] #progress.ytd-thumbnail-overlay-resume-playback-renderer {
    background: linear-gradient(to right, var(--darken) 80%, var(--colour) 100%);
  }
  span.mention.yt-live-chat-text-message-renderer {
    background: none;
    border: 2px solid var(--colour);
    border-radius: 9px;
  }
  .guide-entry-badge.ytd-guide-entry-renderer {
    --yt-spec-static-brand-red: #77a;
  }
  #newness-dot.ytd-guide-entry-renderer {
    --yt-spec-themed-blue: var(--colour);
  }
  yt-icon#logo-icon svg>g:first-child>path:first-child {
    fill: var(--colour);
  }
  svg>g>g.style-scope.ytd-topbar-logo-renderer>path {
    fill: var(--colour);
  }
  div#title-container svg>path:first-child {
    fill: var(--colour);
  }
  button.ytp-live-badge[disabled]:before {
    background: var(--colour);
  }
  #progress.ytd-thumbnail-overlay-resume-playback-renderer {
    --yt-spec-static-brand-red: var(--colour);
  }
  .ytp-menuitem[aria-checked="true"] .ytp-menuitem-toggle-checkbox {
    background: var(--colour);
  }
  .badge-style-type-live-now.ytd-badge-supported-renderer {
    --yt-spec-brand-link-text: var(--bright);
  }
  ytd-thumbnail-overlay-toggle-button-renderer[aria-label="Добавить в очередь"] {
    display: none !important;
    pointer-events: none !important;
  }
  .yt-spec-avatar-shape--cairo-refresh.yt-spec-avatar-shape--live-ring::after {
    background: linear-gradient(to top right, var(--darken) 60%, var(--bright) 85%);
  }
  .yt-spec-avatar-shape--cairo-refresh .yt-spec-avatar-shape__live-badge {
    background: var(--darken);
  }
  .yt-spec-icon-badge-shape--type-notification-refresh .yt-spec-icon-badge-shape__badge {
    background: var(--darken);
  }
  /*#item-scroller path.style-scope.yt-icon {
    fill: var(--colour);
  }*/`);

    // update marker position
    function surveyLoadProgresses() {
        var targets = Array.from(document.getElementsByClassName("ytp-load-progress"));
        for (var i = 0; i < targets.length; i++) {
            var target = targets[i];
            if (target.children.length == 0) {
                var div = document.createElement("div");
                div.className = "progressBarAfter";
                target.appendChild(div);
            }
            div = target.children[0];
            var progress = /\d+(\.\d+)?/.exec(target.style.transform)[0];
            div.style.width = (7 / progress) + "px"; // I don't remember why, but ok
            if (progress == 0 || progress == 1 && i != targets.length - 1)
                div.style.width = 0;
        }
        //console.log(targets.map(x => /\d+(\.\d+)?/.exec(x.style.transform)[0]).join(" "));
    }
    setInterval(surveyLoadProgresses, 1000);

    var imagesFetched = 0;
    function surveyYTImages() {
        var list = document.querySelectorAll('[id=img]');
        for (var i = imagesFetched; i < list.length; ++i)
            if (list[i].src.startsWith("https://www.gstatic.com/images/branding/product/"))
                list[i].src = notificationImageSrc64;
        //imagesFetched = Math.max(imagesFetched, list.length); // sometimes is skipped
    }
    setInterval(surveyYTImages, 1000);
})();