Hide YouTube Shorts from search r###lts and redirect Shorts URLs
// ==UserScript==// @name:ko 유튜브 쇼츠 차단// @name YouTube Shorts Blocker// @description:ko 쇼츠를 차단 및 Shorts URL을 YouTube.com으로 리다이렉트 합니다.// @description Hide YouTube Shorts from search r###lts and redirect Shorts URLs// @namespace https://ndaesik.tistory.com/// @version 1.4// @author ndaesik// @match https://m.youtube.com/*// @match https://www.youtube.com/*// @icon https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Youtube_shorts_icon.svg/193px-Youtube_shorts_icon.svg.png// ==/UserScript==(function() {'use strict';// Function to hide Shorts in search r###lts and mobile r###ltsfunction hideShortsInSearch() {// Desktop search r###ltsconst items = document.querySelectorAll('ytd-video-renderer');items.forEach(item => {const link = item.querySelector('ytd-thumbnail > a');if (link && link.href.includes('/shorts/')) {item.style.display = 'none';}});// Mobile search r###ltsconst mobileItems = document.querySelectorAll('[href*="/shorts/"]');mobileItems.forEach(item => {const contextRenderer = item.closest('ytm-video-with-context-renderer');if (contextRenderer) {contextRenderer.style.display = 'none';}});}// Hide existing Shorts sectionsfunction hideShortsSection() {const selectors = ['[tab-title="Shorts"]', // desktop nav'ytd-rich-section-renderer', // desktop main page feed'ytd-reel-shelf-renderer', // desktop search r###lts feed'#items ytd-guide-entry-renderer:nth-child(2)', // desktop channel tab'ytm-pivot-bar-item-renderer:nth-child(2)', // mobile nav bar'ytm-rich-section-renderer', // mobile main page feed'ytm-reel-shelf-renderer', // mobile search r###lts feed];selectors.forEach(selector => {const elements = document.querySelectorAll(selector);elements.forEach(el => {el.style.display = 'none';});});}// Redirect Shorts URLs to main video playerfunction redirectShorts() {if (window.location.href.includes('youtube.com/shorts/')) {window.location.href = window.location.href.replace('/shorts/', '/watch?v=');}}// Create and run MutationObserver to handle dynamically loaded contentconst observer = new MutationObserver((mutations) => {mutations.forEach((mutation) => {if (mutation.addedNodes.length) {hideShortsInSearch();hideShortsSection();}});});// Start observing the document with the configured parametersobserver.observe(document.body, {childList: true,subtree: true});// Initial runhideShortsInSearch();hideShortsSection();redirectShorts();})();