|
1 | 1 | // ==UserScript== |
2 | 2 | // @name YouTube™ Classic 📺 — (Remove rounded design + Return YouTube dislikes) |
3 | | -// @version 2026.1.20.8 |
| 3 | +// @version 2026.1.20.9 |
4 | 4 | // @author Adam Lui, Magma_Craft, Anarios, JRWR, Fuim & hoothin |
5 | 5 | // @namespace https://github.com/adamlui |
6 | 6 | // @description Reverts YouTube to its classic design (before all the rounded corners & hidden dislikes) + redirects YouTube Shorts |
|
290 | 290 | function extractSelectors(obj) { |
291 | 291 | return Object.values(obj).flatMap(val => typeof val == 'object' ? extractSelectors(val) : val) } |
292 | 292 |
|
| 293 | + function getLoadedElem(selector, timeout = null) { |
| 294 | + const timeoutPromise = timeout ? new Promise(resolve => setTimeout(() => resolve(null), timeout)) : null |
| 295 | + const isLoadedPromise = new Promise(resolve => { |
| 296 | + const elem = document.querySelector(selector) |
| 297 | + if (elem) resolve(elem) |
| 298 | + else new MutationObserver((_, obs) => { |
| 299 | + const elem = document.querySelector(selector) |
| 300 | + if (elem) { obs.disconnect() ; resolve(elem) } |
| 301 | + }).observe(document.documentElement, { childList: true, subtree: true }) |
| 302 | + }) |
| 303 | + return ( timeoutPromise ? Promise.race([isLoadedPromise, timeoutPromise]) : isLoadedPromise ) |
| 304 | + } |
| 305 | + |
293 | 306 | const toolbarMenu = { |
294 | 307 | state: { |
295 | 308 | symbols: ['❌', '✔️'], separator: env.scriptManager.name == 'Tampermonkey' ? ' — ' : ': ', |
|
438 | 451 | YTP.setExpMulti(EXPFLAGS) |
439 | 452 | YTP.setPlyrFlags(PLYRFLAGS) |
440 | 453 |
|
441 | | - function $(q) { return document.querySelector(q) } |
442 | | - |
443 | | - function getLoadedElem(selector, timeout = null) { |
444 | | - const timeoutPromise = timeout ? new Promise(resolve => setTimeout(() => resolve(null), timeout)) : null |
445 | | - const isLoadedPromise = new Promise(resolve => { |
446 | | - const elem = document.querySelector(selector) |
447 | | - if (elem) resolve(elem) |
448 | | - else new MutationObserver((_, obs) => { |
449 | | - const elem = document.querySelector(selector) |
450 | | - if (elem) { obs.disconnect() ; resolve(elem) } |
451 | | - }).observe(document.documentElement, { childList: true, subtree: true }) |
452 | | - }) |
453 | | - return ( timeoutPromise ? Promise.race([isLoadedPromise, timeoutPromise]) : isLoadedPromise ) |
454 | | - } |
| 454 | + getLoadedElem('#items.ytd-guide-section-renderer').then(restoreTrending) |
| 455 | + getLoadedElem('#items.ytd-mini-guide-section-renderer').then(restoreTrending) |
455 | 456 |
|
456 | 457 | function restoreTrending() { |
457 | 458 | const trendingData = { |
|
477 | 478 | document.querySelector('#items > ytd-mini-guide-entry-renderer:nth-child(2)').data = trendingData |
478 | 479 | } |
479 | 480 |
|
480 | | - getLoadedElem('#items.ytd-guide-section-renderer').then(() => { restoreTrending() }) |
481 | | - getLoadedElem('#items.ytd-mini-guide-section-renderer').then(() => { restoreTrending() }) |
482 | | - |
483 | | - // Fix YouTube dislikes |
484 | | - addEventListener('yt-page-data-updated', function() { |
485 | | - if(!location.pathname.startsWith('/watch')) return |
486 | | - const lds = $('ytd-video-primary-info-renderer div#top-level-buttons-computed'), |
487 | | - like = $('ytd-video-primary-info-renderer div#segmented-like-button > ytd-toggle-button-renderer'), |
488 | | - share = $('ytd-video-primary-info-renderer div#top-level-buttons-computed > ytd-segmented-like-dislike-button-renderer + ytd-button-renderer') |
489 | | - lds.insertBefore(like, share) |
490 | | - like.setAttribute('class', like.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button')) |
491 | | - like.removeAttribute('is-paper-button-with-icon') |
492 | | - like.removeAttribute('is-paper-button') |
493 | | - like.setAttribute('style-action-button', '') |
494 | | - like.setAttribute('is-icon-button', '') |
495 | | - like.querySelector('a').insertBefore(like.querySelector('yt-formatted-string'), like.querySelector('tp-yt-paper-tooltip')) |
496 | | - like?.querySelector('paper-ripple')?.remove() |
497 | | - let paper = like.querySelector('tp-yt-paper-button') |
498 | | - paper.removeAttribute('style-target') |
499 | | - paper.removeAttribute('animated') |
500 | | - paper.removeAttribute('elevation') |
501 | | - like.querySelector('a').insertBefore(paper.querySelector('yt-icon'), like.querySelector('yt-formatted-string')) |
502 | | - paper.outerHTML = paper.outerHTML.replace('<tp-yt-paper-button ', '<yt-icon-button ').replace('</tp-yt-paper-button>', '</yt-icon-button>') |
503 | | - paper = like.querySelector('yt-icon-button') |
504 | | - paper.querySelector('button#button').append(like.querySelector('yt-icon')) |
505 | | - const dislike = $('ytd-video-primary-info-renderer div#segmented-dislike-button > ytd-toggle-button-renderer') |
506 | | - lds.insertBefore(dislike, share) |
507 | | - $('ytd-video-primary-info-renderer ytd-segmented-like-dislike-button-renderer').remove() |
508 | | - dislike.setAttribute('class', dislike.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button')) |
509 | | - dislike.removeAttribute('has-no-text') |
510 | | - dislike.setAttribute('style-action-button', '') |
511 | | - const dlabel = document.createElement('yt-formatted-stringx') |
512 | | - dlabel.setAttribute('id', 'text') |
513 | | - if (dislike.getAttribute('class').includes('style-default-active')) { |
514 | | - dlabel.setAttribute('class', dlabel.getAttribute('class').replace('style-default', 'style-default-active')) } |
515 | | - dislike.querySelector('a').insertBefore(dlabel, dislike.querySelector('tp-yt-paper-tooltip')) |
516 | | - $('ytd-video-primary-info-renderer').removeAttribute('flex-menu-enabled') |
517 | | - }) |
518 | | - |
519 | 481 | // Restore classic comments UI |
520 | 482 | let hl |
521 | 483 | const cfconfig = { unicodeEmojis: false } |
|
0 commit comments