Remove Important YouTube Notifications

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

Verzia zo dňa 05.04.2025. Pozri najnovšiu verziu.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name        Remove Important YouTube Notifications
// @namespace   greatest.deepsurf.us/en/users/1436613
// @match       https://www.youtube.com/*
// @version     1.0
// @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 = "ytd-popup-container #sections:has(ytd-notification-renderer),ytd-popup-container #sections:has(ytd-notification-renderer) #section-title {display:none;} ytd-popup-container #sections:has(ytd-notification-renderer.unimportantNotification){display:unset !important;}";

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

let popupContainer = document.querySelector("ytd-popup-container");

(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) #items");
  orderOfPrecedence = getOrderOfPrecendence();
  importantNotifications.forEach(element => {regularNotificationPanel.insertBefore(element,findAppropriatePosition(element)); element.classList.add("unimportantNotification")});
}


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
  }
}