您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Restores the old watch layout from before 2019
当前为
- // ==UserScript==
- // @name Watch9 Reconstruct
- // @version 2.0.0
- // @description Restores the old watch layout from before 2019
- // @author Aubrey P.
- // @icon https://www.youtube.com/favicon.ico
- // @namespace aubymori
- // @license Unlicense
- // @match www.youtube.com/*
- // @grant none
- // @run-at document-start
- // ==/UserScript==
- const w9rOptions = {
- oldAutoplay: true,
- removeBloatButtons: true
- }
- /**
- * Internationalization strings.
- */
- const w9ri18n = {
- en: {
- subSuffixMatch: /( subscribers)|( subscriber)/, // Regex for isolating subscriber count
- subCntZero: "No", // When the author has 0 subscribers
- nonPublishMatch: /(Premier)|(Stream)|(Start)/, // Match to determine if a video was normally uploaded
- publishedOn: "Published on %s", // Self explanatory
- upNext: "Up next",
- autoplay: "Autoplay",
- autoplayTip: "When autoplay is enabled, a suggested video will automatically play next."
- }
- };
- /**
- * Stub for autoplay renderer.
- * (CURRENTLY UNUSED)
- */
- const autoplayStub = `
- <ytd-compact-autoplay-renderer class="style-scope ytd-watch-next-secondary-results-renderer">
- <div id="head" class="style-scope ytd-compact-autoplay-renderer">
- <div id="upnext" class="style-scope ytd-compact-autoplay-renderer"></div>
- <div id="autoplay" class="style-scope ytd-compact-autoplay-renderer"></div>
- <tp-yt-paper-toggle-button id="toggle" noink="" class="style-scope ytd-compact-autoplay-renderer" role="button" aria-pressed="" tabindex="0" style="touch-action: pan-y;" toggles="" aria-disabled="false" aria-label=""></tp-yt-paper-toggle-button>
- <tp-yt-paper-tooltip id="tooltip for="toggle" class="style-scope ytd-compact-autoplay-renderer" role="tooltip" tabindex="-1"></tp-yt-paper-tooltip>
- </div>
- <div id="contents" class="style-scope ytd-compact-autoplay-renderer"></div>
- </ytd-compact-autoplay-renderer>
- `;
- /**
- * Get a string from the internationalization strings.
- *
- * @param {string} string Name of string to get
- * @param {string} hl Language to use.
- * @returns {string}
- */
- function getString(string, hl = "en") {
- if (string == null) return "ERROR";
- return w9ri18n[hl][string];
- }
- /**
- * Format upload date string to include "Published on" if applicable.
- *
- * @param {string} dateStr dateText from InnerTube ("Sep 13, 2022", "Premiered 2 hours ago", etc.)
- * @param {string} hl Language to use.
- * @returns
- */
- function formatUploadDate(dateStr, hl = "en") {
- var nonPublishMatch = getString("nonPublishMatch", hl);
- var publishedOn = getString("publishedOn", hl);
- if (nonPublishMatch.test(dateStr)) {
- return dateStr;
- } else {
- return publishedOn.replace("%s", dateStr);
- }
- }
- /**
- * Format subscriber count string to only include count.
- *
- * @param {string} count Subscriber count string from InnerTube ("374K subscribers", "No subscribers", etc.)
- * @param {string} hl Language to use.
- * @returns
- */
- function formatSubCount(count, hl = "en") {
- if (count == null) return "";
- var tmp = count.replace(getString("subSuffixMatch", hl), "");
- tmp = tmp.replace(getString("subCntZero", hl), "0");
- return tmp;
- }
- /**
- * Toggle autoplay.
- *
- * @returns {void}
- */
- function clickAutoplay() {
- var player = document.querySelector("#movie_player");
- var autoplay;
- if (autoplay = player.querySelector(".ytp-autonav-toggle-button-container")) {
- autoplay.parentNode.click();
- } else {
- var settings = player.querySelector('.ytp-settings-button');
- settings.click();settings.click();
- var item = player.querySelector('.ytp-menuitem[role="menuitemcheckbox"]');
- item.click();
- }
- }
- /**
- * Should the Autoplay renderer be inserted?
- * (Basically, if there's a playlist active)
- *
- * @returns {boolean}
- */
- function shouldHaveAutoplay() {
- var playlist;
- if (playlist = document.querySelector("#playlist.ytd-watch-flexy")) {
- if (playlist.hidden && playlist.hidden == true) {
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- }
- function removeBloatButtons() {
- var watchFlexy = document.querySelector("ytd-watch-flexy");
- var primaryInfo = watchFlexy.querySelector("ytd-video-primary-info-renderer");
- var actionBtns = primaryInfo.querySelector("ytd-menu-renderer.ytd-video-primary-info-renderer .top-level-buttons");
- // I have no idea why they made this a seperate element
- // type but go off I guess, Google
- var dlBtn;
- if (dlBtn = actionBtns.querySelector("ytd-download-button-renderer")) {
- dlBtn.remove();
- }
- var abList = actionBtns.querySelectorAll("ytd-button-renderer");
- for (var i = 0; i < abList.length; i++) {
- var iconType;
- if (iconType = abList[i].data.icon.iconType) {
- console.log(iconType);
- if (iconType == "MONEY_HEART" || iconType == "CONTENT_CUT") {
- abList[i].remove();
- }
- }
- }
- }
- /**
- * Build new Watch9 elements and tweak currently existing elements accordingly.
- *
- * @return {void}
- */
- function buildWatch9() {
- const watchFlexy = document.querySelector("ytd-watch-flexy");
- const primaryInfo = watchFlexy.querySelector("ytd-video-primary-info-renderer");
- const secondaryInfo = watchFlexy.querySelector("ytd-video-secondary-info-renderer");
- const viewCount = primaryInfo.querySelector("ytd-video-view-count-renderer");
- const subBtn = secondaryInfo.querySelector("#subscribe-button tp-yt-paper-button");
- const uploadDate = secondaryInfo.querySelector(".date.ytd-video-secondary-info-renderer"); // Old unused element that we inject the date into
- const language = yt.config_.HL;
- // Let script know we've done this initial build
- watchFlexy.setAttribute("watch9-built", "");
- // Make view count large like in Watch9
- viewCount.removeAttribute("small");
- // Publish date
- var newUploadDate = formatUploadDate(primaryInfo.data.dateText.simpleText, language);
- uploadDate.innerText = newUploadDate;
- // Sub count
- var newSubCount = formatSubCount(secondaryInfo.data.owner.videoOwnerRenderer.subscriberCountText.simpleText);
- var w9rSubCount = document.createElement("yt-formatted-string");
- w9rSubCount.classList.add("style-scope", "deemphasize");
- w9rSubCount.text = {
- simpleText: newSubCount
- };
- subBtn.insertAdjacentElement("beforeend", w9rSubCount);
- // Bloat buttons
- removeBloatButtons();
- }
- /**
- * Update currently existing Watch9 elements.
- *
- * @return {void}
- */
- function updateWatch9() {
- const watchFlexy = document.querySelector("ytd-watch-flexy");
- const primaryInfo = watchFlexy.querySelector("ytd-video-primary-info-renderer");
- const secondaryInfo = watchFlexy.querySelector("ytd-video-secondary-info-renderer");
- const subCnt = secondaryInfo.querySelector("yt-formatted-string.deemphasize");
- const uploadDate = secondaryInfo.querySelector(".date.ytd-video-secondary-info-renderer");
- const language = yt.config_.HL;
- // Publish date
- var newUploadDate = formatUploadDate(primaryInfo.data.dateText.simpleText, language);
- uploadDate.innerText = newUploadDate;
- // Sub count
- var newSubCount = formatSubCount(secondaryInfo.data.owner.videoOwnerRenderer.subscriberCountText.simpleText, language);
- subCnt.text = {
- simpleText: newSubCount
- };
- // Bloat buttons
- removeBloatButtons();
- }
- /**
- * Run the Watch9 build/update functions.
- */
- document.addEventListener("yt-page-data-updated", (e) => {
- if (e.detail.pageType == "watch") {
- if (document.querySelector("ytd-watch-flexy").getAttribute("watch9-built") != null) {
- updateWatch9();
- } else {
- buildWatch9();
- }
- }
- });
- /**
- * Inject styles.
- */
- document.addEventListener("DOMContentLoaded", function tmp() {
- document.head.insertAdjacentHTML("beforeend", `
- <style>
- /* Hide Watch11 */
- ytd-watch-metadata {
- display: none !important;
- }
- /* Force Watch10 to display */
- #meta-contents[hidden],
- #info-contents[hidden] {
- display: block !important;
- }
- yt-formatted-string.deemphasize {
- opacity: .85;
- margin-left: 6px;
- }
- yt-formatted-string.deemphasize:empty {
- margin-left: 0;
- }
- /**
- * Prevent sub count from appearing on the "Edit video" button since
- * it uses the same element as subscribe button
- */
- ytd-button-renderer.style-primary yt-formatted-string.deemphasize {
- display: none;
- }
- #info-strings.ytd-video-primary-info-renderer,
- #owner-sub-count.ytd-video-owner-renderer {
- display: none !important;
- }
- </style>
- `);
- document.removeEventListener("DOMContentLoaded", tmp);
- });