YouTube Deactivate Important Notifications

Removes the "Important" section in the YouTube notification menu, putting the notifications whithin it back to their appropriate position in the notification list.

Устаревшая версия за 05.04.2025. Перейдите к последней версии.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name        YouTube Deactivate Important Notifications
// @namespace   greatest.deepsurf.us/en/users/1436613
// @match       https://www.youtube.com/*
// @version     1.1
// @license     MIT
// @author      gosha305
// @description Removes the "Important" section in the YouTube notification menu, putting the notifications whithin it back to their appropriate position in the notification list.
// ==/UserScript==

let orderOfPrecedence;
let regularNotificationPanel;
let importantNotificationPanel;
let notificationsHandled = false;

const hideImportantNotificationsSection = "#sections yt-multi-page-menu-section-renderer:has(ytd-notification-renderer),ytd-popup-container #sections:has(ytd-notification-renderer) #section-title {display:none;} .unimportantNotifications{display:unset !important;}";

let menuRemover = document.createElement("style");
menuRemover.textContent = hideImportantNotificationsSection;
document.head.appendChild(menuRemover);

let popupContainer;
function findPopup(){
  popupContainer = document.querySelector("ytd-popup-container")
  if (!popupContainer){
    setTimeout(200, findPopup);
  }
}
findPopup();

(new MutationObserver(function(_,observer){
  const notificationMenu = document.querySelector("ytd-popup-container")?.lastChild
  if (notificationMenu?.nodeName == "TP-YT-IRON-DROPDOWN"){
    (new MutationObserver(function(mutationList){replaceNotifications(mutationList);})).observe(notificationMenu, {attributes: true});
    observer.disconnect();
  }
})).observe(popupContainer, {childList: true, subtree:true})


function replaceNotifications(mutationList){
  const importantNotifications = document.querySelectorAll("yt-multi-page-menu-section-renderer:nth-of-type(1) #items > ytd-notification-renderer");
  if (!importantNotifications || importantNotifications.length == 0) {
    return;
  }
  regularNotificationPanel = document.querySelector("yt-multi-page-menu-section-renderer:nth-of-type(2)");
  regularNotificationPanelItems = regularNotificationPanel.querySelector("#items")

  orderOfPrecedence = getOrderOfPrecendence();
  importantNotifications.forEach(notification => {regularNotificationPanelItems.insertBefore(notification,findAppropriatePosition(notification))});
  regularNotificationPanel.classList.add("unimportantNotifications");
}


function getOrderOfPrecendence(){
  const seen = new Set();
  const nonNumberDateParts = Array.from(regularNotificationPanel.querySelectorAll("ytd-notification-renderer .metadata.style-scope.ytd-notification-renderer > yt-formatted-string:nth-of-type(2)")).map(e => e.textContent.split(" ").filter(part => isNaN(Number(part))).join(''));
  return nonNumberDateParts.filter(e => {if (seen.has(e)) return false; seen.add(e); return true;})
}


function findAppropriatePosition(element){
  const elementParts = element.querySelector(".metadata.style-scope.ytd-notification-renderer > yt-formatted-string:nth-of-type(2)").textContent.split(" ");
  const nonNumberPartsRank = orderOfPrecedence.indexOf(elementParts.filter(e => isNaN(Number(e))).join(''));
  const NumberParts = elementParts.find(e => !isNaN(Number(e)))
  const rep = Array.from(regularNotificationPanel.querySelectorAll("ytd-notification-renderer")).find(e => !compareUploadDateText(e.querySelector(".metadata.style-scope.ytd-notification-renderer > yt-formatted-string:nth-of-type(2)").textContent, nonNumberPartsRank, NumberParts));
  return rep;
}

function compareUploadDateText(date1, nonNumberPartsRank2,date2NumberParts){
  const date1Parts = date1.split(" ");
  const nonNumberPartsRank1 = orderOfPrecedence.indexOf(date1Parts.filter(e => isNaN(Number(e))).join(''));
  if (nonNumberPartsRank1 < nonNumberPartsRank2){
    return true;
  } else if (nonNumberPartsRank1 > nonNumberPartsRank2){
    return false;
  } else {
    return Number(date1Parts.find(e => !isNaN(Number(e)))) < date2NumberParts
  }
}