Greasy Fork

Greasy Fork is available in English.

Youtube Hide Paused Gradient by Sapioit

Removes the annoying gradients visible when pausing a video.

当前为 2023-08-06 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Youtube Hide Paused Gradient by Sapioit
// @namespace   Sapioit
// @copyright   Sapioit, 2020 - Present
// @author      sapioitgmail.com
// @license     GPL-2.0-only; http://www.gnu.org/licenses/gpl-2.0.txt
// @icon        https://youtube.com/favicon.ico
// @match       https://www.youtube.com/*
// @match       http*://*.youtube.com/*
// @match       http*://youtube.com/*
// @match       https://youtu.be/*
// @match       http*://*.youtu.be/*
// @description Removes the annoying gradients visible when pausing a video.
// @version     1.6.0.1
// @grant       GM_addStyle
// @grant       GM_registerMenuCommand
// @grant       GM_setValue
// @grant       GM_getValue
// ==/UserScript==

localStorage.setItem('currentWatchMetadataValued', 0);
localStorage.setItem('consecutiveUnchangedCounted', 0);
const isFocused = () => typeof document.hidden !== undefined ? !document.hidden : null;

function title_changed (count = 3) {
  console.info("%cYoutube Hide Paused Gradient by Sapioit: title_changed: %cChecking title.", "color: yellow; background-color: black;", "color: white");

  // Check if the value of the title (the first "yt-formatted-string.style-scope.ytd-watch-metadata" element) has changed
  let firstWatchMetadataElement = document.querySelector('h1 yt-formatted-string.style-scope.ytd-watch-metadata');

  if ( firstWatchMetadataElement === null || (typeof firstWatchMetadataElement) === 'undefined') {
    console.info("Youtube Hide Paused Gradient by Sapioit: title_changed: %cThe 'h1 yt-formatted-string.style-scope.ytd-watch-metadata' is either NULL or UNDEFINED.", "color: red");
    console.info("%cYoutube Hide Paused Gradient by Sapioit: title_changed: %c", "color: red", "color: default", firstWatchMetadataElement , (typeof firstWatchMetadataElement));
    return false;
  }

  console.info("%cYoutube Hide Paused Gradient by Sapioit: title_changed:", "color: cyan", (firstWatchMetadataElement.textContent.trim()) );
  console.info("%cYoutube Hide Paused Gradient by Sapioit: title_changed:", "color: cyan", (firstWatchMetadataElement.textContent.trim() !== '') , ' ' , (firstWatchMetadataElement) );

  if ( firstWatchMetadataElement.textContent.trim() !== '') {
    // Get the current value of the title
    let currentWatchMetadataValue = firstWatchMetadataElement.textContent.trim();
    console.info("%cYoutube Hide Paused Gradient by Sapioit: title_changed: %cTitle found.", "color: yellow; background-color: black;", "color: white");

    // Get the consecutive unchanged count from localStorage, or set it to 0 if it's not available
    let consecutiveUnchangedCount = parseInt(localStorage.getItem('consecutiveUnchangedCounted')) || 0;

    // Increment the consecutiveUnchangedCount if the value is the same
    consecutiveUnchangedCount++;

    // Update the stored value and consecutiveUnchangedCount in localStorage
    localStorage.setItem('currentWatchMetadataValued', currentWatchMetadataValue);
    localStorage.setItem('consecutiveUnchangedCounted', consecutiveUnchangedCount.toString());

    console.log("Youtube Hide Paused Gradient by Sapioit: title_changed: Try nr #" + (1+consecutiveUnchangedCount) );

    // Check if the current value is the same as the previous one stored in localStorage
    if (localStorage.getItem('currentWatchMetadataValued') === currentWatchMetadataValue) {

      // Stop the function if the title value hasn't changed for the last three checks (consecutiveUnchangedCount is less than 4)
      if ( consecutiveUnchangedCount < (count+1) ) {
        console.log("Youtube Hide Paused Gradient by Sapioit: title_changed: First 'yt-formatted-string.style-scope.ytd-watch-metadata' element has not changed for the last three checks. Stopping check.");
        return false; // Return that the title has not changed.
      } else {
        // Reset the consecutiveUnchangedCount if the value has changed
        consecutiveUnchangedCount = 0;

        // Update the stored value and consecutiveUnchangedCount in localStorage
        localStorage.setItem('currentWatchMetadataValued', currentWatchMetadataValue);
        localStorage.setItem('consecutiveUnchangedCounted', consecutiveUnchangedCount.toString());
        return true; // Return that the title has changed.
      }
    } else {
      // Reset the consecutiveUnchangedCount if the value has changed
      consecutiveUnchangedCount = 0;

      // Update the stored value and consecutiveUnchangedCount in localStorage
      localStorage.setItem('currentWatchMetadataValued', currentWatchMetadataValue);
      localStorage.setItem('consecutiveUnchangedCounted', consecutiveUnchangedCount.toString());
      return true; // Return that the title has changed.
    }
  } else {
    console.log("Youtube Hide Paused Gradient by Sapioit: title_changed: Checking title FAILED.");
  }
  return false; // Return that the title has changed.
  // Usage example:
  if ( title_changed() ){
    return;
  }
  if ( title_changed(8) ){
    return;
  }
}


function swapButtonsSaveShare(){
  if ( !isFocused() || title_changed(8) ){
    return;
  }
  console.log("Youtube Hide Paused Gradient by Sapioit: swapButtons:: Checking if 'Save' button is inside the top-level-buttons-computed element.");

  let isSaveButtonInside = document.querySelector('div#top-level-buttons-computed.top-level-buttons.style-scope.ytd-menu-renderer button[aria-label="Save to playlist"]');
  console.info('%cYoutube Hide Paused Gradient by Sapioit: swapButtons: %c', "color: cyan", isSaveButtonInside, (typeof isSaveButtonInside));

  if (isSaveButtonInside) {
    console.log("Youtube Hide Paused Gradient by Sapioit: swapButtons: 'Save' button is inside the top-level-buttons-computed element.");
    console.log("Youtube Hide Paused Gradient by Sapioit: swapButtons:: " + JSON.stringify(isSaveButtonInside));
    //GM_addStyle('div#top-level-buttons-computed.top-level-buttons.style-scope.ytd-menu-renderer button[aria-label="Save to playlist"] { background-color: red;}');
    return;
  }

  console.log("Youtube Hide Paused Gradient by Sapioit: swapButtons: 'Save' button is NOT inside the top-level-buttons-computed element.");
  let saveButton = document.querySelector('ytd-button-renderer[button-renderer][button-next] button[aria-label="Save to playlist"]');
  let shareButton = document.querySelector('ytd-button-renderer[button-renderer][button-next] button[aria-label="Share"]');

  if (saveButton && shareButton) {
    let saveButtonParent = saveButton.parentElement;
    let shareButtonParent = shareButton.parentElement;

    // Create placeholder elements to hold the buttons temporarily
    const placeholder1 = document.createElement('div');
    const placeholder2 = document.createElement('div');

    // Move the buttons to their respective placeholder positions
    saveButtonParent.insertBefore(placeholder1, saveButton);
    shareButtonParent.insertBefore(placeholder2, shareButton);
    shareButtonParent.insertBefore(saveButton, placeholder2);
    saveButtonParent.insertBefore(shareButton, placeholder1);

    // Remove the placeholders
    saveButtonParent.removeChild(placeholder1);
    shareButtonParent.removeChild(placeholder2);

    // Swap Save2 with a new Share2
    let save2Button = document.querySelector('tp-yt-paper-item[aria-disabled="false"] yt-formatted-string[role="option"][class="style-scope ytd-menu-service-item-renderer"]');
    if (save2Button) {
      let saveButtonParent = saveButton.parentElement;

      // Swap the positions of saveButton and shareButton in their respective parents
      saveButtonParent.insertBefore(shareButton, saveButton.nextSibling);

      // Create new HTML for the modified share2Button
      let newShare2ButtonHTML = '<ytd-menu-service-item-renderer class="style-scope ytd-menu-popup-renderer iron-selected" use-icons="" system-icons="" role="menuitem" tabindex="-1" aria-selected="true"><!--css-build:shady--><!--css-build:shady--><tp-yt-paper-item class="style-scope ytd-menu-service-item-renderer" style-target="host" role="option" tabindex="0" aria-disabled="false"><!--css-build:shady--><yt-icon class="style-scope ytd-menu-service-item-renderer"><!--css-build:shady--><!--css-build:shady--><yt-icon-shape class="style-scope yt-icon"><icon-shape class="yt-spec-icon-shape"><div style="width: 100%; height: 100%; fill: currentcolor;"><svg height="24" viewBox="0 0 24 24" width="24" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;"><path d="M15 5.63 20.66 12 15 18.37V14h-1c-3.96 0-7.14 1-9.75 3.09 1.84-4.07 5.11-6.4 9.89-7.1l.86-.13V5.63M14 3v6C6.22 10.13 3.11 15.33 2 21c2.78-3.97 6.44-6 12-6v6l8-9-8-9z"></path></svg></div></icon-shape></yt-icon-shape></yt-icon></div><yt-formatted-string class="style-scope ytd-menu-service-item-renderer">Share</yt-formatted-string><ytd-badge-supported-renderer class="style-scope ytd-menu-service-item-renderer" disable-upgrade="" hidden=""></ytd-badge-supported-renderer></tp-yt-paper-item></ytd-menu-service-item-renderer>';

      // Create a new DOM element from the HTML string
      const parser = new DOMParser();
      const newShare2Button = parser.parseFromString(newShare2ButtonHTML, "text/html").body.firstChild;

      // Add the newShare2Button after the saveButton
      saveButtonParent.insertBefore(newShare2Button, saveButton.nextSibling);
    }

    /*let newShareButton = '<button class="yt-spec-button-shape-next yt-spec-button-shape-next--tonal yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-leading " aria-label="Share" style=""><div class="yt-spec-button-shape-next__icon" aria-hidden="true"><yt-icon style="width: 24px; height: 24px;"><!--css-build:shady--><!--css-build:shady--><yt-icon-shape class="style-scope yt-icon"><icon-shape class="yt-spec-icon-shape"><div style="width: 100%; height: 100%; fill: currentcolor;"><svg height="24" viewBox="0 0 24 24" width="24" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;"><path d="M15 5.63 20.66 12 15 18.37V14h-1c-3.96 0-7.14 1-9.75 3.09 1.84-4.07 5.11-6.4 9.89-7.1l.86-.13V5.63M14 3v6C6.22 10.13 3.11 15.33 2 21c2.78-3.97 6.44-6 12-6v6l8-9-8-9z"></path></svg></div></icon-shape></yt-icon-shape></yt-icon></div><div class="cbox yt-spec-button-shape-next__button-text-content"><span class="yt-core-attributed-string yt-core-attributed-string--white-space-no-wrap" role="text">Share</span></div><yt-touch-feedback-shape style="border-radius: inherit;"><div class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response" aria-hidden="true"><div class="yt-spec-touch-feedback-shape__stroke" style=""></div><div class="yt-spec-touch-feedback-shape__fill" style=""></div></div></yt-touch-feedback-shape></button>';
    let newSaveButton = '<button class="yt-spec-button-shape-next yt-spec-button-shape-next--tonal yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-leading " aria-label="Save to playlist" style=""><div class="yt-spec-button-shape-next__icon" aria-hidden="true"><yt-icon style="width: 24px; height: 24px;"><!--css-build:shady--><!--css-build:shady--><yt-icon-shape class="style-scope yt-icon"><icon-shape class="yt-spec-icon-shape"><div style="width: 100%; height: 100%; fill: currentcolor;"><svg height="24" viewBox="0 0 24 24" width="24" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;"><path d="M22 13h-4v4h-2v-4h-4v-2h4V7h2v4h4v2zm-8-6H2v1h12V7zM2 12h8v-1H2v1zm0 4h8v-1H2v1z"></path></svg></div></icon-shape></yt-icon-shape></yt-icon></div><div class="cbox yt-spec-button-shape-next__button-text-content"><span class="yt-core-attributed-string yt-core-attributed-string--white-space-no-wrap" role="text">Save</span></div><yt-touch-feedback-shape style="border-radius: inherit;"><div class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response" aria-hidden="true"><div class="yt-spec-touch-feedback-shape__stroke" style=""></div><div class="yt-spec-touch-feedback-shape__fill" style=""></div></div></yt-touch-feedback-shape></button>';

    function createTrustedHTML(inputString) {
      const parser = new DOMParser();
      const doc = parser.parseFromString(inputString, "text/html");
      const fragment = doc.body;
      return fragment.outerHTML;
    }


    function escapeHTML(inputString) {
      return inputString.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    }


    newShareButton = createTrustedHTML(newShareButton);
    newSaveButton = createTrustedHTML(newSaveButton);


    shareButton.outerHTML = newSaveButton;
    saveButton.outerHTML = newShareButton;*/

    // To remove the old "Save" and "Share" buttons, uncomment the lines below:
    // saveButtonParent.removeChild(saveButton);
    // shareButtonParent.removeChild(shareButton);
  }
  console.info("%cYoutube Hide Paused Gradient by Sapioit: swapButtons: Finishing swapping.", "color: cyan");
}


function add_hover_tooltips() {
  /*var video_titles = document.getElementsByTagName("h3").getElementsByClassName("ytd-compact-video-renderer").getElementsByTagName("span");*/
  /*var video_titles = document.querySelector("span.ytd-compact-video-renderer");*/
  //var video_titles = document.getElementsByTagName("span").getElementsByClassName("ytd-compact-video-renderer");

  /*var video_titles = document.querySelectorAll("span.ytd-compact-video-renderer");*/
  var video_titles = document.querySelectorAll("span.ytd-compact-video-renderer, #video-title");
  for(var i=0; i<video_titles.length; i++){
    console.log(video_titles[i]);
    var current_title = video_titles[i].getAttribute("title");
    video_titles[i].setAttribute("alt", current_title);
    video_titles[i].setAttribute("data-title", current_title);
    video_titles[i].setAttribute("data-tooltip", current_title);
  }
  /*
    video_titles = document.querySelectorAll("#video-title");
    for(i=0; i<video_titles.length; i++){
        console.log(video_titles[i]);
        current_title = video_titles[i].getAttribute("title");
        video_titles[i].setAttribute("alt", current_title);
        video_titles[i].setAttribute("data-title", current_title);
        video_titles[i].setAttribute("data-tooltip", current_title);
    }
    */
}






window.onloadstart = function(){setTimeout(function () {
  add_hover_tooltips();
}, 0.001*1000)}; //loads after 0.001 seconds


window.addEventListener('keydown', function(e) {
  let play_button = document.querySelector('button.ytp-play-button');
  let valid_target = e.target === document.body || e.target === document.querySelector('#player-api');
  let pressed_space = e.keyCode === 32 || e.keyCode === 'Space'; // Space
  if (play_button && valid_target && pressed_space) {
    console.log("Youtube Hide Paused Gradient by Sapioit: Pressed pause or resume.");
    e.preventDefault();
    playButton.click();
  }
});




if (typeof document.getElementsByClassName("ytp-gradient-top")[0] != "undefined") {
  document.getElementsByClassName("ytp-gradient-top")[0].style.display = 'none';
}
if (typeof document.getElementsByClassName("ytp-gradient-top")[0] != "undefined") {
  document.getElementsByClassName("ytp-gradient-top")[0].style.opacity = '0';
}
if (typeof document.getElementsByClassName("ytp-gradient-bottom")[0] != "undefined") {
  document.getElementsByClassName("ytp-gradient-bottom")[0].style.display = 'none';
}
if (typeof document.getElementsByClassName("ytp-gradient-bottom")[0] != "undefined") {
  document.getElementsByClassName("ytp-gradient-bottom")[0].style.opacity = '0';
}

/*
document.getElementsByClassName("ytp-gradient-top")[0].style.display = 'none';
document.getElementsByClassName("ytp-gradient-top")[0].style.opacity = '0';
document.getElementsByClassName("ytp-gradient-bottom")[0].style.display = 'none';
document.getElementsByClassName("ytp-gradient-bottom")[0].style.opacity = '0';
*/



GM_addStyle('.ytp-caption-window-container { top: 2% !important; }');

GM_addStyle('.ytp-gradient-top { display: none !important; opacity: 0 !important; }');
GM_addStyle('.ytp-gradient-top { width: none !important; opacity: 0 !important; }');

GM_addStyle('button div.ytp-autonav-toggle-button-container { display: none !important;}');
GM_addStyle('[data-tooltip-target-id="ytp-autonav-toggle-button"] { display: none !important;}');
//GM_addStyle('.ytp-button[data-tooltip-target-id="ytp-autonav-toggle-button"] { display: none !important;}');
GM_addStyle('--ytd-engagement-panel-section-list-rendere { display: none !important;}');
GM_addStyle('.ytp-time-display > span { padding: 3px; background: rgba(0, 0, 0, 0.5); }');
//GM_addStyle('.ytd-thumbnail-overlay-time-status-renderen { transition-duration: 0s; }');

window.onload = function(){setTimeout(function () {
  GM_addStyle('button div.ytp-autonav-toggle-button-container { display: none !important;}');
  GM_addStyle('[data-tooltip-target-id="ytp-autonav-toggle-button"] { display: none !important;}');
  GM_addStyle('--ytd-engagement-panel-section-list-rendere { display: none !important;}');
  GM_addStyle('#video-title.ytd-compact-video-renderer { overflow: none !important;}');
  GM_addStyle('ytd-button-renderer > yt-button-shape > button[aria-label="Thanks"] { display: none !important; }');
  //GM_addStyle('ytd-button-renderer > yt-button-shape > button[aria-label="Save to playlist"] { display: inline-block !important; }');
  add_hover_tooltips();
  swapButtonsSaveShare();
  setTimeout(function () {
    swapButtonsSaveShare();
  }, 5*1000) //loads after 5 seconds
  //GM_addStyle('.ytd-thumbnail-overlay-time-status-renderen { transition-duration: 0s; }');
}, 5*1000)}; //loads after 5 seconds

function repeaterFunction(){
  if ( title_changed(8) ){
    return;
  }
  GM_addStyle('button div.ytp-autonav-toggle-button-container { display: none !important;}');
  GM_addStyle('[data-tooltip-target-id="ytp-autonav-toggle-button"] { display: none !important;}');
  GM_addStyle('--ytd-engagement-panel-section-list-rendere { display: none !important;}');
  add_hover_tooltips();
  swapButtonsSaveShare();
  setTimeout(repeaterFunction, 30*1000); //loads every 30 seconds
}
repeaterFunction();


GM_addStyle("span[data-tooltip]:before { z-index:301; content: attr(data-tooltip);  position: absolute;  opacity: 0;  padding: 10px;  background: black;  color: white;}    span[data-tooltip]:hover:before {  opacity: 1;} ");
GM_addStyle(".yt-simple-endpoint[title]:before { z-index:301; content: attr(title);  position: absolute;  opacity: 0;  padding: 10px;  background: black;  color: white;}    .yt-simple-endpoint[title]:hover:before {  opacity: 1 !important;} ");


// <ytd-engagement-panel-section-list-renderer class="style-scope ytd-watch-flexy" visibility="ENGAGEMENT_PANEL_VISIBILITY_EXPANDED">GM_addStyle(a);