|
1 | 1 | // ==UserScript== |
2 | 2 | // @name YouTube™ Classic 📺 — (Remove rounded design + Return YouTube dislikes) |
3 | | -// @version 2026.1.17.1 |
| 3 | +// @version 2026.1.17.2 |
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 |
|
387 | 387 | return this.mergeDeep(target, ...sources); |
388 | 388 | } |
389 | 389 | static onNewScript(mutations) { |
390 | | - for (var mut of mutations) { |
391 | | - for (var node of mut.addedNodes) { // eslint-disable-line no-unused-vars |
392 | | - YTP.bruteforce(); |
393 | | - } |
394 | | - } |
| 390 | + for (const mut of mutations) for (const node of mut.addedNodes) // eslint-disable-line no-unused-vars |
| 391 | + YTP.bruteforce() |
395 | 392 | } |
396 | 393 | static start() { this.observer.observe(document, {childList: true, subtree: true}); } |
397 | 394 | static stop() { this.observer.disconnect(); } |
|
411 | 408 | this.mergeDeep(this._config.EXPERIMENT_FLAGS, exps); |
412 | 409 | } |
413 | 410 | static decodePlyrFlags(flags) { |
414 | | - var obj = {}, |
415 | | - dflags = flags.split('&'); |
416 | | - for (var i = 0; i < dflags.length; i++) { |
417 | | - var dflag = dflags[i].split('='); |
418 | | - obj[dflag[0]] = dflag[1]; |
419 | | - } |
420 | | - return obj; |
| 411 | + const obj = {}, dflags = flags.split('&') |
| 412 | + for (let i = 0 ; i < dflags.length ; i++) { |
| 413 | + const dflag = dflags[i].split('=') ; obj[dflag[0]] = dflag[1] } |
| 414 | + return obj |
421 | 415 | } |
422 | 416 | static encodePlyrFlags(flags) { |
423 | | - var keys = Object.keys(flags), |
424 | | - response = ''; |
425 | | - for (var i = 0; i < keys.length; i++) { |
426 | | - if (i > 0) { response += '&'; } |
427 | | - response += keys[i] + '=' + flags[keys[i]]; |
| 417 | + const keys = Object.keys(flags) ; let response = '' |
| 418 | + for (let i = 0 ; i < keys.length ; i++) { |
| 419 | + if (i > 0) response += '&' |
| 420 | + response += keys[i] + '=' + flags[keys[i]] |
428 | 421 | } |
429 | | - return response; |
| 422 | + return response |
430 | 423 | } |
431 | 424 | static setPlyrFlags(flags) { |
432 | | - if (!unsafeWindow.yt) return; |
433 | | - if (!unsafeWindow.yt.config_) return; |
434 | | - if (!unsafeWindow.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS) return; |
435 | | - var conCfgs = unsafeWindow.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS; |
436 | | - if (!('WEB_PLAYER_CONTEXT_CONFIGS' in this._config)) this._config.WEB_PLAYER_CONTEXT_CONFIGS = {}; |
437 | | - for (var cfg in conCfgs) { |
438 | | - var dflags = this.decodePlyrFlags(conCfgs[cfg].serializedExperimentFlags); |
439 | | - this.mergeDeep(dflags, flags); |
| 425 | + if (!unsafeWindow.yt) return |
| 426 | + if (!unsafeWindow.yt.config_) return |
| 427 | + if (!unsafeWindow.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS) return |
| 428 | + const conCfgs = unsafeWindow.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS |
| 429 | + if (!('WEB_PLAYER_CONTEXT_CONFIGS' in this._config)) this._config.WEB_PLAYER_CONTEXT_CONFIGS = {} |
| 430 | + for (const cfg in conCfgs) { |
| 431 | + const dflags = this.decodePlyrFlags(conCfgs[cfg].serializedExperimentFlags) |
| 432 | + this.mergeDeep(dflags, flags) |
440 | 433 | this._config.WEB_PLAYER_CONTEXT_CONFIGS[cfg] = { |
441 | | - serializedExperimentFlags: this.encodePlyrFlags(dflags) |
442 | | - } |
| 434 | + serializedExperimentFlags: this.encodePlyrFlags(dflags) } |
443 | 435 | } |
444 | 436 | } |
445 | 437 | } |
|
456 | 448 | : 'https://i.imgur.com/rHLcxEs.png' // Light mode |
457 | 449 | ytLogo.textContent = '' ; ytLogo.append(classicLogo) |
458 | 450 | YTP.stop() |
459 | | - for (var i = 0; i < ATTRS.length; i++) { document.getElementsByTagName('html')[0].removeAttribute(ATTRS[i]) } |
| 451 | + for (let i = 0 ; i < ATTRS.length ; i++) document.getElementsByTagName('html')[0].removeAttribute(ATTRS[i]) |
460 | 452 | unsafeWindow.removeEventListener('yt-page-date-updated', tmp) |
461 | 453 | }) |
462 | 454 |
|
|
481 | 473 | } |
482 | 474 |
|
483 | 475 | function restoreTrending() { |
484 | | - var trendingData = { |
| 476 | + const trendingData = { |
485 | 477 | 'navigationEndpoint': { |
486 | 478 | 'clickTrackingParams': 'CBwQtSwYASITCNqYh-qO_fACFcoRrQYdP44D9Q==', |
487 | 479 | 'commandMetadata': { |
|
510 | 502 | // Fix YouTube dislikes |
511 | 503 | addEventListener('yt-page-data-updated', function() { |
512 | 504 | if(!location.pathname.startsWith('/watch')) return; |
513 | | - var lds = $('ytd-video-primary-info-renderer div#top-level-buttons-computed'); |
514 | | - var like = $('ytd-video-primary-info-renderer div#segmented-like-button > ytd-toggle-button-renderer'); |
515 | | - var share = $('ytd-video-primary-info-renderer div#top-level-buttons-computed > ytd-segmented-like-dislike-button-renderer + ytd-button-renderer'); |
| 505 | + const lds = $('ytd-video-primary-info-renderer div#top-level-buttons-computed'), |
| 506 | + like = $('ytd-video-primary-info-renderer div#segmented-like-button > ytd-toggle-button-renderer'), |
| 507 | + share = $('ytd-video-primary-info-renderer div#top-level-buttons-computed > ytd-segmented-like-dislike-button-renderer + ytd-button-renderer') |
516 | 508 | lds.insertBefore(like, share); |
517 | 509 | like.setAttribute('class', like.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button')); |
518 | 510 | like.removeAttribute('is-paper-button-with-icon'); |
|
521 | 513 | like.setAttribute('is-icon-button', ''); |
522 | 514 | like.querySelector('a').insertBefore(like.querySelector('yt-formatted-string'), like.querySelector('tp-yt-paper-tooltip')); |
523 | 515 | try { like.querySelector('paper-ripple').remove(); } catch(e) {} |
524 | | - var paper = like.querySelector('tp-yt-paper-button'); |
| 516 | + let paper = like.querySelector('tp-yt-paper-button'); |
525 | 517 | paper.removeAttribute('style-target'); |
526 | 518 | paper.removeAttribute('animated'); |
527 | 519 | paper.removeAttribute('elevation'); |
528 | 520 | like.querySelector('a').insertBefore(paper.querySelector('yt-icon'), like.querySelector('yt-formatted-string')); |
529 | 521 | paper.outerHTML = paper.outerHTML.replace('<tp-yt-paper-button ', '<yt-icon-button ').replace('</tp-yt-paper-button>', '</yt-icon-button>'); |
530 | 522 | paper = like.querySelector('yt-icon-button'); |
531 | 523 | paper.querySelector('button#button').appendChild(like.querySelector('yt-icon')); |
532 | | - var dislike = $('ytd-video-primary-info-renderer div#segmented-dislike-button > ytd-toggle-button-renderer'); |
| 524 | + const dislike = $('ytd-video-primary-info-renderer div#segmented-dislike-button > ytd-toggle-button-renderer'); |
533 | 525 | lds.insertBefore(dislike, share); |
534 | 526 | $('ytd-video-primary-info-renderer ytd-segmented-like-dislike-button-renderer').remove(); |
535 | 527 | dislike.setAttribute('class', dislike.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button')); |
536 | 528 | dislike.removeAttribute('has-no-text'); |
537 | 529 | dislike.setAttribute('style-action-button', ''); |
538 | | - var dlabel = document.createElement('yt-formatted-stringx'); |
| 530 | + const dlabel = document.createElement('yt-formatted-stringx'); |
539 | 531 | dlabel.setAttribute('id', 'text'); |
540 | 532 | if (dislike.getAttribute('class').includes('style-default-active')) { |
541 | 533 | dlabel.setAttribute('class', dlabel.getAttribute('class').replace('style-default', 'style-default-active')) } |
|
544 | 536 | }); |
545 | 537 |
|
546 | 538 | // Restore classic comments UI |
547 | | - var hl; |
548 | | - const cfconfig = { unicodeEmojis: false }; |
| 539 | + let hl |
| 540 | + const cfconfig = { unicodeEmojis: false } |
549 | 541 | const cfi18n = { |
550 | 542 | en: { |
551 | 543 | viewSingular: 'View reply', |
|
558 | 550 | } |
559 | 551 | } |
560 | 552 | function getString(string, hl = 'en', ...args) { |
561 | | - if (!string) return; |
562 | | - var str; |
| 553 | + if (!string) return |
| 554 | + let str |
563 | 555 | if (cfi18n[hl]) { |
564 | | - if (cfi18n[hl][string]) { |
565 | | - str = cfi18n[hl][string]; |
566 | | - } else if (cfi18n.en[string]) { |
567 | | - str = cfi18n.en[string]; |
568 | | - } else { |
569 | | - return; |
570 | | - } |
571 | | - } else { if (cfi18n.en[string]) str = cfi18n.en[string]; } |
572 | | - for (var i = 0; i < args.length; i++) { |
573 | | - str = str.replace(/%s/, args[i]); |
574 | | - } |
575 | | - return str; |
| 556 | + if (cfi18n[hl][string]) |
| 557 | + str = cfi18n[hl][string] |
| 558 | + else if (cfi18n.en[string]) |
| 559 | + str = cfi18n.en[string] |
| 560 | + else return |
| 561 | + } else if (cfi18n.en[string]) |
| 562 | + str = cfi18n.en[string] |
| 563 | + for (let i = 0 ; i < args.length ; i++) |
| 564 | + str = str.replace(/%s/, args[i]) |
| 565 | + return str |
576 | 566 | } |
577 | 567 | function getSimpleString(object) { |
578 | | - if (object.simpleText) return object.simpleText; |
579 | | - var str = ''; |
580 | | - for (var i = 0; i < object.runs.length; i++) { |
581 | | - str += object.runs[i].text; |
582 | | - } |
583 | | - return str; |
| 568 | + if (object.simpleText) return object.simpleText |
| 569 | + let str = '' |
| 570 | + for (let i = 0 ; i < object.runs.length ; i++) |
| 571 | + str += object.runs[i].text |
| 572 | + return str |
584 | 573 | } |
585 | 574 | function formatComment(comment) { |
586 | 575 | if (cfconfig.unicodeEmojis) { |
587 | | - var runs; |
| 576 | + let runs |
588 | 577 | try { |
589 | 578 | runs = comment.contentText.runs |
590 | | - for (var i = 0; i < runs.length; i++) { |
591 | | - delete runs[i].emoji; |
592 | | - delete runs[i].loggingDirectives; |
| 579 | + for (let i = 0 ; i < runs.length ; i++) { |
| 580 | + delete runs[i].emoji |
| 581 | + delete runs[i].loggingDirectives |
593 | 582 | } |
594 | 583 | } catch(err) {} |
595 | 584 | } |
596 | | - return comment; |
| 585 | + return comment |
597 | 586 | } |
598 | 587 | async function formatCommentThread(thread) { |
599 | 588 | if (thread.comment.commentRenderer) { |
600 | 589 | thread.comment.commentRenderer = formatComment(thread.comment.commentRenderer); |
601 | 590 | } |
602 | | - var replies; |
| 591 | + let replies |
603 | 592 | try { |
604 | 593 | replies = thread.replies.commentRepliesRenderer; |
605 | 594 | if (replies.viewRepliesIcon) { |
|
610 | 599 | replies.hideReplies.buttonRenderer.icon = replies.hideRepliesIcon.buttonRenderer.icon; |
611 | 600 | delete replies.hideRepliesIcon; |
612 | 601 | } |
613 | | - var creatorName; |
| 602 | + let creatorName |
614 | 603 | try { |
615 | 604 | creatorName = replies.viewRepliesCreatorThumbnail.accessibility.accessibilityData.label; |
616 | 605 | delete replies.viewRepliesCreatorThumbnail; |
617 | 606 | } catch(err) {} |
618 | | - var replyCount = getSimpleString(replies.viewReplies.buttonRenderer.text); |
| 607 | + let replyCount = getSimpleString(replies.viewReplies.buttonRenderer.text) |
619 | 608 | replyCount = +replyCount.replace(getString('replyCountIsolator', hl), ''); |
620 | | - var viewMultiString = creatorName ? 'viewMultiOwner' : 'viewMulti'; |
621 | | - var viewSingleString = creatorName ? 'viewSingularOwner' : 'viewSingular'; |
| 609 | + const viewMultiString = creatorName ? 'viewMultiOwner' : 'viewMulti', |
| 610 | + viewSingleString = creatorName ? 'viewSingularOwner' : 'viewSingular' |
622 | 611 | replies.viewReplies.buttonRenderer.text = { |
623 | 612 | runs: [{ |
624 | 613 | text: (replyCount > 1) ? getString(viewMultiString, hl, replyCount, creatorName) |
|
632 | 621 | return thread; |
633 | 622 | } |
634 | 623 | function refreshData(element) { |
635 | | - var clone = element.cloneNode(); |
636 | | - clone.data = element.data; |
637 | | - clone.data.fixedByCF = true; |
638 | | - for (var i in element.properties) { clone[i] = element[i]; } |
639 | | - element.insertAdjacentElement('afterend', clone); |
640 | | - element.remove(); |
641 | | - } |
642 | | - var commentObserver = new MutationObserver((list) => { |
| 624 | + const clone = element.cloneNode() |
| 625 | + clone.data = element.data |
| 626 | + clone.data.fixedByCF = true |
| 627 | + for (const i in element.properties) clone[i] = element[i] |
| 628 | + element.insertAdjacentElement('afterend', clone) |
| 629 | + element.remove() |
| 630 | + } |
| 631 | + const commentObserver = new MutationObserver((list) => { |
643 | 632 | list.forEach(async(mutation) => { |
644 | 633 | if (mutation.addedNodes) { |
645 | | - for (var i = 0; i < mutation.addedNodes.length; i++) { |
646 | | - var elm = mutation.addedNodes[i]; |
| 634 | + for (let i = 0 ; i < mutation.addedNodes.length ; i++) { |
| 635 | + const elm = mutation.addedNodes[i] |
647 | 636 | if (elm.classList && elm.data && !elm.data.fixedByCF) { |
648 | 637 | if (elm.tagName == 'YTD-COMMENT-THREAD-RENDERER') { |
649 | | - elm.data = await formatCommentThread(elm.data); |
650 | | - refreshData(elm); |
| 638 | + elm.data = await formatCommentThread(elm.data) |
| 639 | + refreshData(elm) |
651 | 640 | } else if (elm.tagName == 'YTD-COMMENT-RENDERER') { |
652 | 641 | if (!elm.classList.contains('ytd-comment-thread-renderer')) { |
653 | | - elm.data = formatComment(elm.data); |
654 | | - refreshData(elm); |
| 642 | + elm.data = formatComment(elm.data) |
| 643 | + refreshData(elm) |
655 | 644 | } |
656 | 645 | } |
657 | 646 | } |
658 | 647 | } |
659 | 648 | } |
660 | | - }); |
661 | | - }); |
| 649 | + }) |
| 650 | + }) |
662 | 651 | document.addEventListener('yt-page-data-updated', async() => { |
663 | | - commentObserver.observe(document.querySelector('ytd-app'), { childList: true, subtree: true }); |
664 | | - }); |
| 652 | + commentObserver.observe(document.querySelector('ytd-app'), { childList: true, subtree: true }) |
| 653 | + }) |
665 | 654 |
|
666 | 655 | // CSS adjustments and UI fixes |
667 | 656 | const fixesStyle = document.createElement('style') |
|
1923 | 1912 | getButtons().children[1].clientWidth + |
1924 | 1913 | 8; |
1925 | 1914 | const widthPercent = likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50; |
1926 | | - var likePercentage = parseFloat(widthPercent.toFixed(1)); |
1927 | | - const dislikePercentage = (100 - likePercentage).toLocaleString(); |
1928 | | - likePercentage = likePercentage.toLocaleString(); |
1929 | | - var tooltipInnerHTML; |
| 1915 | + let likePercentage = parseFloat(widthPercent.toFixed(1)) |
| 1916 | + const dislikePercentage = (100 - likePercentage).toLocaleString() |
| 1917 | + likePercentage = likePercentage.toLocaleString() |
| 1918 | + let tooltipInnerHTML |
1930 | 1919 | switch (extConfig.tooltipPercentageMode) { |
1931 | 1920 | case 'dash_like': |
1932 | 1921 | tooltipInnerHTML = `${likes.toLocaleString()} / ${dislikes.toLocaleString()} - ${likePercentage}%`; |
|
0 commit comments