YouTube - Non-Rounded Design

This script disables YouTube's new rounded corners (reverts back to the previous layout before 2022 with extra stuff included such as the explore tab, auto redirect shorts to watch interface, old comment replies UI, etc...)

当前为 2023-07-16 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name YouTube - Non-Rounded Design
  3. // @version 4.0.6
  4. // @description This script disables YouTube's new rounded corners (reverts back to the previous layout before 2022 with extra stuff included such as the explore tab, auto redirect shorts to watch interface, old comment replies UI, etc...)
  5. // @author Magma_Craft
  6. // @license MIT
  7. // @match https://www.youtube.com/*
  8. // @namespace https://gf.qytechs.cn/en/users/933798
  9. // @icon https://www.youtube.com/favicon.ico
  10. // @run-at document-start
  11. // @grant none
  12. // @require https://cdnjs.cloudflare.com/ajax/libs/arrive/2.4.1/arrive.min.js
  13. // ==/UserScript==
  14.  
  15. // Attributes to remove from <html>
  16. const ATTRS = [
  17. "darker-dark-theme",
  18. "darker-dark-theme-deprecate"
  19. ];
  20.  
  21. // Regular config keys.
  22. const CONFIGS = {
  23. BUTTON_REWORK: false
  24. }
  25.  
  26. // Experiment flags.
  27. const EXPFLAGS = {
  28. enable_header_channel_handler_ui: false,
  29. kevlar_unavailable_video_error_ui_client: false,
  30. kevlar_refresh_on_theme_change: false,
  31. kevlar_watch_cinematics: false,
  32. kevlar_watch_metadata_refresh: false,
  33. kevlar_watch_modern_metapanel: false,
  34. kevlar_watch_modern_panels: false,
  35. kevlar_watch_panel_height_matches_player: false,
  36. web_amsterdam_playlists: false,
  37. web_animated_like: false,
  38. web_button_rework: false,
  39. web_button_rework_with_live: false,
  40. web_darker_dark_theme: false,
  41. web_filled_subscribed_button: false,
  42. web_guide_ui_refresh: false,
  43. web_modern_ads: false,
  44. web_modern_buttons: false,
  45. web_modern_chips: false,
  46. web_modern_dialogs: false,
  47. web_modern_playlists: false,
  48. web_modern_subscribe: false,
  49. web_rounded_containers: false,
  50. web_rounded_thumbnails: false,
  51. web_searchbar_style: "default",
  52. web_segmented_like_dislike_button: false,
  53. web_sheets_ui_refresh: false,
  54. web_snackbar_ui_refresh: false
  55. }
  56.  
  57. // Player flags
  58. // !!! USE STRINGS FOR VALUES !!!
  59. // For example: "true" instead of true
  60. const PLYRFLAGS = {
  61. web_rounded_containers: "false",
  62. web_rounded_thumbnails: "false"
  63. }
  64.  
  65. class YTP {
  66. static observer = new MutationObserver(this.onNewScript);
  67.  
  68. static _config = {};
  69.  
  70. static isObject(item) {
  71. return (item && typeof item === "object" && !Array.isArray(item));
  72. }
  73.  
  74. static mergeDeep(target, ...sources) {
  75. if (!sources.length) return target;
  76. const source = sources.shift();
  77.  
  78. if (this.isObject(target) && this.isObject(source)) {
  79. for (const key in source) {
  80. if (this.isObject(source[key])) {
  81. if (!target[key]) Object.assign(target, { [key]: {} });
  82. this.mergeDeep(target[key], source[key]);
  83. } else {
  84. Object.assign(target, { [key]: source[key] });
  85. }
  86. }
  87. }
  88.  
  89. return this.mergeDeep(target, ...sources);
  90. }
  91.  
  92.  
  93. static onNewScript(mutations) {
  94. for (var mut of mutations) {
  95. for (var node of mut.addedNodes) {
  96. YTP.bruteforce();
  97. }
  98. }
  99. }
  100.  
  101. static start() {
  102. this.observer.observe(document, {childList: true, subtree: true});
  103. }
  104.  
  105. static stop() {
  106. this.observer.disconnect();
  107. }
  108.  
  109. static bruteforce() {
  110. if (!window.yt) return;
  111. if (!window.yt.config_) return;
  112.  
  113. this.mergeDeep(window.yt.config_, this._config);
  114. }
  115.  
  116. static setCfg(name, value) {
  117. this._config[name] = value;
  118. }
  119.  
  120. static setCfgMulti(configs) {
  121. this.mergeDeep(this._config, configs);
  122. }
  123.  
  124. static setExp(name, value) {
  125. if (!("EXPERIMENT_FLAGS" in this._config)) this._config.EXPERIMENT_FLAGS = {};
  126.  
  127. this._config.EXPERIMENT_FLAGS[name] = value;
  128. }
  129.  
  130. static setExpMulti(exps) {
  131. if (!("EXPERIMENT_FLAGS" in this._config)) this._config.EXPERIMENT_FLAGS = {};
  132.  
  133. this.mergeDeep(this._config.EXPERIMENT_FLAGS, exps);
  134. }
  135.  
  136. static decodePlyrFlags(flags) {
  137. var obj = {},
  138. dflags = flags.split("&");
  139.  
  140. for (var i = 0; i < dflags.length; i++) {
  141. var dflag = dflags[i].split("=");
  142. obj[dflag[0]] = dflag[1];
  143. }
  144.  
  145. return obj;
  146. }
  147.  
  148. static encodePlyrFlags(flags) {
  149. var keys = Object.keys(flags),
  150. response = "";
  151.  
  152. for (var i = 0; i < keys.length; i++) {
  153. if (i > 0) {
  154. response += "&";
  155. }
  156. response += keys[i] + "=" + flags[keys[i]];
  157. }
  158.  
  159. return response;
  160. }
  161.  
  162. static setPlyrFlags(flags) {
  163. if (!window.yt) return;
  164. if (!window.yt.config_) return;
  165. if (!window.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS) return;
  166. var conCfgs = window.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS;
  167. if (!("WEB_PLAYER_CONTEXT_CONFIGS" in this._config)) this._config.WEB_PLAYER_CONTEXT_CONFIGS = {};
  168.  
  169. for (var cfg in conCfgs) {
  170. var dflags = this.decodePlyrFlags(conCfgs[cfg].serializedExperimentFlags);
  171. this.mergeDeep(dflags, flags);
  172. this._config.WEB_PLAYER_CONTEXT_CONFIGS[cfg] = {
  173. serializedExperimentFlags: this.encodePlyrFlags(dflags)
  174. }
  175. }
  176. }
  177. }
  178.  
  179. window.addEventListener("yt-page-data-updated", function tmp() {
  180. YTP.stop();
  181. for (i = 0; i < ATTRS.length; i++) {
  182. document.getElementsByTagName("html")[0].removeAttribute(ATTRS[i]);
  183. }
  184. window.removeEventListener("yt-page-date-updated", tmp);
  185. });
  186.  
  187. YTP.start();
  188.  
  189. YTP.setCfgMulti(CONFIGS);
  190. YTP.setExpMulti(EXPFLAGS);
  191. YTP.setPlyrFlags(PLYRFLAGS);
  192.  
  193. function $(q) {
  194. return document.querySelector(q);
  195. }
  196.  
  197. // Re-add 'Explore' tab in sidebar (it also replaces the 'Shorts' tab)
  198. function waitForElm(selector) {
  199. return new Promise(resolve => {
  200. if (document.querySelector(selector)) {
  201. return resolve(document.querySelector(selector));
  202. }
  203.  
  204. const observer = new MutationObserver(mutations => {
  205. if (document.querySelector(selector)) {
  206. resolve(document.querySelector(selector));
  207. observer.disconnect();
  208. }
  209. });
  210.  
  211. observer.observe(document.body, {
  212. childList: true,
  213. subtree: true
  214. });
  215. });
  216. }
  217.  
  218. function restoreTrending() {
  219.  
  220. var trendingData = {
  221. "navigationEndpoint": {
  222. "clickTrackingParams": "CBwQtSwYASITCNqYh-qO_fACFcoRrQYdP44D9Q==",
  223. "commandMetadata": {
  224. "webCommandMetadata": {
  225. "url": "/feed/explore",
  226. "webPageType": "WEB_PAGE_TYPE_BROWSE",
  227. "rootVe": 6827,
  228. "apiUrl": "/youtubei/v1/browse"
  229. }
  230. },
  231. "browseEndpoint": {
  232. "browseId": "FEtrending"
  233. }
  234. },
  235. "icon": {
  236. "iconType": "EXPLORE"
  237. },
  238. "trackingParams": "CBwQtSwYASITCNqYh-qO_fACFcoRrQYdP44D9Q==",
  239. "formattedTitle": {
  240. "simpleText": "Explore"
  241. },
  242. "accessibility": {
  243. "accessibilityData": {
  244. "label": "Explore"
  245. }
  246. },
  247. "isPrimary": true
  248. };
  249.  
  250. var guidetemplate = `<ytd-guide-entry-renderer class="style-scope ytd-guide-section-renderer" is-primary="" line-end-style="none"><!--css-build:shady--><a id="endpoint" class="yt-simple-endpoint style-scope ytd-guide-entry-renderer" tabindex="-1" role="tablist"><tp-yt-paper-item role="tab" class="style-scope ytd-guide-entry-renderer" tabindex="0" aria-disabled="false"><!--css-build:shady--><yt-icon class="guide-icon style-scope ytd-guide-entry-renderer" disable-upgrade=""></yt-icon><yt-img-shadow height="24" width="24" class="style-scope ytd-guide-entry-renderer" disable-upgrade=""></yt-img-shadow><yt-formatted-string class="title style-scope ytd-guide-entry-renderer"><!--css-build:shady--></yt-formatted-string><span class="guide-entry-count style-scope ytd-guide-entry-renderer"></span><yt-icon class="guide-entry-badge style-scope ytd-guide-entry-renderer" disable-upgrade=""></yt-icon><div id="newness-dot" class="style-scope ytd-guide-entry-renderer"></div></tp-yt-paper-item></a><yt-interaction class="style-scope ytd-guide-entry-renderer"><!--css-build:shady--><div class="stroke style-scope yt-interaction"></div><div class="fill style-scope yt-interaction"></div></yt-interaction></ytd-guide-entry-renderer>`;
  251. document.querySelector(`#items > ytd-guide-entry-renderer:nth-child(2)`).data = trendingData;
  252. var miniguidetemplate = `<ytd-mini-guide-entry-renderer class="style-scope ytd-mini-guide-section-renderer" is-primary="" line-end-style="none"><!--css-build:shady--><a id="endpoint" class="yt-simple-endpoint style-scope ytd-guide-entry-renderer" tabindex="-1" role="tablist"><tp-yt-paper-item role="tab" class="style-scope ytd-guide-entry-renderer" tabindex="0" aria-disabled="false"><!--css-build:shady--><yt-icon class="guide-icon style-scope ytd-guide-entry-renderer" disable-upgrade=""></yt-icon><yt-img-shadow height="24" width="24" class="style-scope ytd-guide-entry-renderer" disable-upgrade=""></yt-img-shadow><yt-formatted-string class="title style-scope ytd-guide-entry-renderer"><!--css-build:shady--></yt-formatted-string><span class="guide-entry-count style-scope ytd-guide-entry-renderer"></span><yt-icon class="guide-entry-badge style-scope ytd-guide-entry-renderer" disable-upgrade=""></yt-icon><div id="newness-dot" class="style-scope ytd-guide-entry-renderer"></div></tp-yt-paper-item></a><yt-interaction class="style-scope ytd-guide-entry-renderer"><!--css-build:shady--><div class="stroke style-scope yt-interaction"></div><div class="fill style-scope yt-interaction"></div></yt-interaction></ytd-guide-entry-renderer>`;
  253. document.querySelector(`#items > ytd-mini-guide-entry-renderer:nth-child(2)`).data = trendingData;
  254. }
  255. waitForElm("#items.ytd-guide-section-renderer").then((elm) => {
  256. restoreTrending();
  257. });
  258. waitForElm("#items.ytd-mini-guide-section-renderer").then((elm) => {
  259. restoreTrending();
  260. });
  261.  
  262. // Auto redirect shorts to watch page (credit goes to YukisCoffee and Fuim)
  263. var oldHref = document.location.href;
  264. if (window.location.href.indexOf('youtube.com/shorts') > -1) {
  265. window.location.replace(window.location.toString().replace('/shorts/', '/watch?v='));
  266. }
  267. window.onload = function() {
  268. var bodyList = document.querySelector("body")
  269. var observer = new MutationObserver(function(mutations) {
  270. mutations.forEach(function(mutation) {
  271. if (oldHref != document.location.href) {
  272. oldHref = document.location.href;
  273. console.log('location changed!');
  274. if (window.location.href.indexOf('youtube.com/shorts') > -1) {
  275. window.location.replace(window.location.toString().replace('/shorts/', '/watch?v='));
  276. }
  277. }
  278. });
  279. });
  280. var config = {
  281. childList: true,
  282. subtree: true
  283. };
  284. observer.observe(bodyList, config);
  285. };
  286.  
  287. /**
  288. * Shorts URL redirect.
  289. *
  290. * This is called on initial visit only. Successive navigations
  291. * are managed by modifying the YouTube Desktop application.
  292. */
  293. (function(){
  294.  
  295. /** @type {string} */
  296. var path = window.location.pathname;
  297.  
  298. if (0 == path.search("/shorts"))
  299. {
  300. // Extract the video ID from the shorts link and redirect.
  301.  
  302. /** @type {string} */
  303. var id = path.replace(/\/|shorts|\?.*/g, "");
  304.  
  305. window.location.replace("https://www.youtube.com/watch?v=" + id);
  306. }
  307.  
  308. })();
  309.  
  310. /**
  311. * YouTube Desktop Shorts remover.
  312. *
  313. * If the initial URL was not a shorts link, traditional redirection
  314. * will not work. This instead modifies video elements to replace them with
  315. * regular links.
  316. */
  317. (function(){
  318.  
  319. /**
  320. * @param {string} selector (CSS-style) of the element
  321. * @return {Promise<Element>}
  322. */
  323. async function querySelectorAsync(selector)
  324. {
  325. while (null == document.querySelector(selector))
  326. {
  327. // Pause for a frame and let other code go on.
  328. await new Promise(r => requestAnimationFrame(r));
  329. }
  330.  
  331. return document.querySelector(selector);
  332. }
  333.  
  334. /**
  335. * Small toolset for interacting with the Polymer
  336. * YouTube Desktop application.
  337. *
  338. * @author Taniko Yamamoto <kirasicecreamm@gmail.com>
  339. * @version 1.0
  340. */
  341. class YtdTools
  342. {
  343. /** @type {string} Page data updated event */
  344. static EVT_DATA_UPDATE = "yt-page-data-updated";
  345.  
  346. /** @type {Element} Main YT Polymer manager */
  347. static YtdApp;
  348.  
  349. /** @type {bool} */
  350. static hasInitialLoaded = false;
  351.  
  352. /** @return {Promise<bool>} */
  353. static async isPolymer()
  354. {
  355. /** @return {Promise<void>} */
  356. function waitForBody() // nice hack lazy ass
  357. {
  358. return new Promise(r => {
  359. document.addEventListener("DOMContentLoaded", function a(){
  360. document.removeEventListener("DOMContentLoaded", a);
  361. r();
  362. });
  363. });
  364. }
  365.  
  366. await waitForBody();
  367.  
  368. if ("undefined" != typeof document.querySelector("ytd-app"))
  369. {
  370. this.YtdApp = document.querySelector("ytd-app");
  371. return true;
  372. }
  373. return false;
  374. }
  375.  
  376. /** @async @return {Promise<void|string>} */
  377. static waitForInitialLoad()
  378. {
  379. var updateEvent = this.EVT_DATA_UPDATE;
  380. return new Promise((resolve, reject) => {
  381. if (!this.isPolymer())
  382. {
  383. reject("Not Polymer :(");
  384. }
  385.  
  386. function _listenerCb()
  387. {
  388. document.removeEventListener(updateEvent, _listenerCb);
  389. resolve();
  390. }
  391.  
  392. document.addEventListener(updateEvent, _listenerCb);
  393. });
  394. }
  395.  
  396. /** @return {string} */
  397. static getPageType()
  398. {
  399. return this.YtdApp.data.page;
  400. }
  401. }
  402.  
  403. class ShortsTools
  404. {
  405. /** @type {MutationObserver} */
  406. static mo = new MutationObserver(muts => {
  407. muts.forEach(mut => {
  408. Array.from(mut.addedNodes).forEach(node => {
  409. if (node instanceof HTMLElement) {
  410. this.onMutation(node);
  411. }
  412. });
  413. });
  414. });
  415.  
  416. /** @return {void} */
  417. static watchForShorts()
  418. {
  419. /*
  420. this.mo.observe(YtdTools.YtdApp, {
  421. childList: true,
  422. subtree: true
  423. });
  424. */
  425. var me = this;
  426. YtdTools.YtdApp.arrive("ytd-video-renderer, ytd-grid-video-renderer", function() {
  427. me.onMutation(this);
  428.  
  429. // This is literally the worst hack I ever wrote, but it works ig...
  430. (new MutationObserver(function(){
  431. if (me.isShortsRenderer(this))
  432. {
  433. me.onMutation(this);
  434. }
  435. }.bind(this))).observe(this, {"subtree": true, "childList": true, "characterData": "true"});
  436. });
  437. }
  438.  
  439. /** @return {void} */
  440. static stopWatchingForShorts()
  441. {
  442. this.mo.disconnect();
  443. }
  444.  
  445. /**
  446. * @param {HTMLElement} node
  447. * @return {void}
  448. */
  449. static onMutation(node)
  450. {
  451. if (node.tagName.search("VIDEO-RENDERER") > -1 && this.isShortsRenderer(node))
  452. {
  453. this.transformShortsRenderer(node);
  454. }
  455. }
  456.  
  457. /** @return {bool} */
  458. static isShortsRenderer(videoRenderer)
  459. {
  460. return "WEB_PAGE_TYPE_SHORTS" == videoRenderer?.data?.navigationEndpoint?.commandMetadata?.webCommandMetadata?.webPageType;
  461. }
  462.  
  463. /** @return {string} */
  464. static extractLengthFromA11y(videoData)
  465. {
  466. // A11y = {title} by {creator} {date} {*length*} {viewCount} - play Short
  467. // tho hopefully this works in more than just English
  468. var a11yTitle = videoData.title.accessibility.accessibilityData.label;
  469.  
  470. var publishedTimeText = videoData.publishedTimeText.simpleText;
  471. var viewCountText = videoData.viewCountText.simpleText;
  472.  
  473. var isolatedLengthStr = a11yTitle.split(publishedTimeText)[1].split(viewCountText)[0]
  474. .replace(/\s/g, "");
  475.  
  476. var numbers = isolatedLengthStr.split(/\D/g);
  477.  
  478. var string = "";
  479.  
  480. // Remove all empties before iterating it
  481. for (var i = 0; i < numbers.length; i++)
  482. {
  483. if ("" === numbers[i])
  484. {
  485. numbers.splice(i, 1);
  486. i--;
  487. }
  488. }
  489.  
  490. for (var i = 0; i < numbers.length; i++)
  491. {
  492. // Lazy 0 handling idc im tired
  493. if (1 == numbers.length)
  494. {
  495. string += "0:";
  496. if (1 == numbers[i].length)
  497. {
  498. string += "0" + numbers[i];
  499. }
  500. else
  501. {
  502. string += numbers[i];
  503. }
  504.  
  505. break;
  506. }
  507.  
  508. if (0 != i) string += ":";
  509. if (0 != i && 1 == numbers[i].length) string += "0";
  510. string += numbers[i];
  511. }
  512.  
  513. return string;
  514. }
  515.  
  516. /**
  517. * @param {HTMLElement} videoRenderer
  518. * @return {void}
  519. */
  520. static transformShortsRenderer(videoRenderer)
  521. {
  522.  
  523. /** @type {string} */
  524. var originalOuterHTML = videoRenderer.outerHTML;
  525.  
  526. /** @type {string} */
  527. var lengthText = videoRenderer.data?.lengthText?.simpleText ?? this.extractLengthFromA11y(videoRenderer.data);
  528.  
  529. /** @type {string} */
  530. var lengthA11y = videoRenderer.data?.lengthText?.accessibility?.accessibilityData?.label ?? "";
  531.  
  532. /** @type {string} */
  533. var originalHref = videoRenderer.data.navigationEndpoint.commandMetadata.webCommandMetadata.url;
  534. var href = "/watch?v=" + originalHref.replace(/\/|shorts|\?.*/g, "");
  535.  
  536. var reelWatchEndpoint = videoRenderer.data.navigationEndpoint.reelWatchEndpoint;
  537.  
  538. var i;
  539. videoRenderer.data.thumbnailOverlays.forEach((a, index) =>{
  540. if ("thumbnailOverlayTimeStatusRenderer" in a)
  541. {
  542. i = index;
  543. }
  544. });
  545.  
  546. // Set the thumbnail overlay style
  547. videoRenderer.data.thumbnailOverlays[i].thumbnailOverlayTimeStatusRenderer.style = "DEFAULT";
  548.  
  549. delete videoRenderer.data.thumbnailOverlays[i].thumbnailOverlayTimeStatusRenderer.icon;
  550.  
  551. // Set the thumbnail overlay text
  552. videoRenderer.data.thumbnailOverlays[i].thumbnailOverlayTimeStatusRenderer.text.simpleText = lengthText;
  553.  
  554. // Set the thumbnail overlay accessibility label
  555. videoRenderer.data.thumbnailOverlays[i].thumbnailOverlayTimeStatusRenderer.text.accessibility.accessibilityData.label = lengthA11y;
  556.  
  557. // Set the navigation endpoint metadata (used for middle click)
  558. videoRenderer.data.navigationEndpoint.commandMetadata.webCommandMetadata.webPageType = "WEB_PAGE_TYPE_WATCH";
  559. videoRenderer.data.navigationEndpoint.commandMetadata.webCommandMetadata.url = href;
  560.  
  561. videoRenderer.data.navigationEndpoint.watchEndpoint = {
  562. "videoId": reelWatchEndpoint.videoId,
  563. "playerParams": reelWatchEndpoint.playerParams,
  564. "params": reelWatchEndpoint.params
  565. };
  566. delete videoRenderer.data.navigationEndpoint.reelWatchEndpoint;
  567.  
  568. //var _ = videoRenderer.data; videoRenderer.data = {}; videoRenderer.data = _;
  569.  
  570. // Sometimes the old school data cycle trick fails,
  571. // however this always works.
  572. var _ = videoRenderer.cloneNode();
  573. _.data = videoRenderer.data;
  574. for (var i in videoRenderer.properties)
  575. {
  576. _[i] = videoRenderer[i];
  577. }
  578. videoRenderer.insertAdjacentElement("afterend", _);
  579. videoRenderer.remove();
  580. }
  581. }
  582.  
  583. /**
  584. * Sometimes elements are reused on page updates, so fix that
  585. *
  586. * @return {void}
  587. */
  588. function onDataUpdate()
  589. {
  590. var videos = document.querySelectorAll("ytd-video-renderer, ytd-grid-video-renderer");
  591.  
  592. for (var i = 0, l = videos.length; i < l; i++) if (ShortsTools.isShortsRenderer(videos[i]))
  593. {
  594. ShortsTools.transformShortsRenderer(videos[i]);
  595. }
  596. }
  597.  
  598. /**
  599. * I hope she makes lotsa spaghetti :D
  600. * @async @return {Promise<void>}
  601. */
  602. async function main()
  603. {
  604. // If not Polymer, nothing happens
  605. if (await YtdTools.isPolymer())
  606. {
  607. ShortsTools.watchForShorts();
  608.  
  609. document.addEventListener("yt-page-data-updated", onDataUpdate);
  610. }
  611. }
  612.  
  613. main();
  614.  
  615. })();
  616.  
  617. // Fix for like and dislike ratio (Return YouTube Dislike is required)
  618. function $(q) {
  619. return document.querySelector(q);
  620. }
  621. addEventListener('yt-page-data-updated', function() {
  622. if(!location.pathname.startsWith('/watch')) return;
  623. var lds = $('ytd-video-primary-info-renderer div#top-level-buttons-computed');
  624. var like = $('ytd-video-primary-info-renderer div#segmented-like-button > ytd-toggle-button-renderer');
  625. var share = $('ytd-video-primary-info-renderer div#top-level-buttons-computed > ytd-segmented-like-dislike-button-renderer + ytd-button-renderer');
  626. lds.insertBefore(like, share);
  627. like.setAttribute('class', like.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button'));
  628. like.removeAttribute('is-paper-button-with-icon');
  629. like.removeAttribute('is-paper-button');
  630. like.setAttribute('style-action-button', '');
  631. like.setAttribute('is-icon-button', '');
  632. like.querySelector('a').insertBefore(like.querySelector('yt-formatted-string'), like.querySelector('tp-yt-paper-tooltip'));
  633. try { like.querySelector('paper-ripple').remove(); } catch(e) {}
  634. var paper = like.querySelector('tp-yt-paper-button');
  635. paper.removeAttribute('style-target');
  636. paper.removeAttribute('animated');
  637. paper.removeAttribute('elevation');
  638. like.querySelector('a').insertBefore(paper.querySelector('yt-icon'), like.querySelector('yt-formatted-string'));
  639. paper.outerHTML = paper.outerHTML.replace('<tp-yt-paper-button ', '<yt-icon-button ').replace('</tp-yt-paper-button>', '</yt-icon-button>');
  640. paper = like.querySelector('yt-icon-button');
  641. paper.querySelector('button#button').appendChild(like.querySelector('yt-icon'));
  642. var dislike = $('ytd-video-primary-info-renderer div#segmented-dislike-button > ytd-toggle-button-renderer');
  643. lds.insertBefore(dislike, share);
  644. $('ytd-video-primary-info-renderer ytd-segmented-like-dislike-button-renderer').remove();
  645. dislike.setAttribute('class', dislike.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button'));
  646. dislike.removeAttribute('has-no-text');
  647. dislike.setAttribute('style-action-button', '');
  648. var dlabel = document.createElement('yt-formatted-stringx');
  649. dlabel.setAttribute('id', 'text');
  650. if(dislike.getAttribute('class').includes('style-default-active'))
  651. dlabel.setAttribute('class', dlabel.getAttribute('class').replace('style-default', 'style-default-active'));
  652. dislike.querySelector('a').insertBefore(dlabel, dislike.querySelector('tp-yt-paper-tooltip'));
  653. $('ytd-video-primary-info-renderer').removeAttribute('flex-menu-enabled');
  654. });
  655.  
  656. // Restore old comment replies UI
  657. var observingComments = false;
  658. var hl;
  659.  
  660. const cfconfig = {
  661. unicodeEmojis: false
  662. };
  663.  
  664. const cfi18n = {
  665. en: {
  666. viewSingular: "View reply",
  667. viewMulti: "View %s replies",
  668. viewSingularOwner: "View reply from %s",
  669. viewMultiOwner: "View %s replies from %s and others",
  670. hideSingular: "Hide reply",
  671. hideMulti: "Hide replies",
  672. replyCountIsolator: /( REPLIES)|( REPLY)/
  673. }
  674. }
  675.  
  676. /**
  677. * Get a string from the localization strings.
  678. *
  679. * @param {string} string Name of string to get
  680. * @param {string} hl Language to use.
  681. * @param {...array} args Strings.
  682. * @returns {string}
  683. */
  684. function getString(string, hl = "en", ...args) {
  685. if (!string) return;
  686. var str;
  687. if (cfi18n[hl]) {
  688. if (cfi18n[hl][string]) {
  689. str = cfi18n[hl][string];
  690. } else if (cfi18n.en[string]) {
  691. str = cfi18n.en[string];
  692. } else {
  693. return;
  694. }
  695. } else {
  696. if (cfi18n.en[string]) str = cfi18n.en[string];
  697. }
  698.  
  699. for (var i = 0; i < args.length; i++) {
  700. str = str.replace(/%s/, args[i]);
  701. }
  702.  
  703. return str;
  704. }
  705.  
  706. /**
  707. * Wait for a selector to exist
  708. *
  709. * @param {string} selector CSS Selector
  710. * @param {HTMLElement} base Element to search inside
  711. * @returns {Node}
  712. */
  713. async function waitForElm(selector, base = document) {
  714. if (!selector) return null;
  715. if (!base.querySelector) return null;
  716. while (base.querySelector(selector) == null) {
  717. await new Promise(r => requestAnimationFrame(r));
  718. };
  719. return base.querySelector(selector);
  720. };
  721.  
  722. /**
  723. * Is a value in an array?
  724. *
  725. * @param {*} needle Value to search
  726. * @param {Array} haystack Array to search
  727. * @returns {boolean}
  728. */
  729. function inArray(needle, haystack) {
  730. for (var i = 0; i < haystack.length; i++) {
  731. if (needle == haystack[i]) return true;
  732. }
  733. return false;
  734. }
  735.  
  736. /**
  737. * Get text of an InnerTube string.
  738. *
  739. * @param {object} object String container.
  740. */
  741. function getSimpleString(object) {
  742. if (object.simpleText) return object.simpleText;
  743.  
  744. var str = "";
  745. for (var i = 0; i < object.runs.length; i++) {
  746. str += object.runs[i].text;
  747. }
  748. return str;
  749. }
  750.  
  751. /**
  752. * Format a commentRenderer.
  753. *
  754. * @param {object} comment commentRenderer from InnerTube.
  755. */
  756. function formatComment(comment) {
  757. if (cfconfig.unicodeEmojis) {
  758. var runs;
  759. try {
  760. runs = comment.contentText.runs
  761. for (var i = 0; i < runs.length; i++) {
  762. delete runs[i].emoji;
  763. delete runs[i].loggingDirectives;
  764. }
  765. } catch(err) {}
  766. }
  767.  
  768. return comment;
  769. }
  770.  
  771. /**
  772. * Format a commentThreadRenderer.
  773. *
  774. * @param {object} thread commentThreadRenderer from InnerTube.
  775. */
  776. async function formatCommentThread(thread) {
  777. if (thread.comment.commentRenderer) {
  778. thread.comment.commentRenderer = formatComment(thread.comment.commentRenderer);
  779. }
  780.  
  781. var replies;
  782. try {
  783. replies = thread.replies.commentRepliesRenderer;
  784. if (replies.viewRepliesIcon) {
  785. replies.viewReplies.buttonRenderer.icon = replies.viewRepliesIcon.buttonRenderer.icon;
  786. delete replies.viewRepliesIcon;
  787. }
  788.  
  789. if (replies.hideRepliesIcon) {
  790. replies.hideReplies.buttonRenderer.icon = replies.hideRepliesIcon.buttonRenderer.icon;
  791. delete replies.hideRepliesIcon;
  792. }
  793.  
  794. var creatorName;
  795. try {
  796. creatorName = replies.viewRepliesCreatorThumbnail.accessibility.accessibilityData.label;
  797. delete replies.viewRepliesCreatorThumbnail;
  798. } catch(err) {}
  799.  
  800. var replyCount = getSimpleString(replies.viewReplies.buttonRenderer.text);
  801. replyCount = +replyCount.replace(getString("replyCountIsolator", hl), "");
  802.  
  803. var viewMultiString = creatorName ? "viewMultiOwner" : "viewMulti";
  804. var viewSingleString = creatorName ? "viewSingularOwner" : "viewSingular";
  805.  
  806. replies.viewReplies.buttonRenderer.text = {
  807. runs: [
  808. {
  809. text: (replyCount > 1) ? getString(viewMultiString, hl, replyCount, creatorName) : getString(viewSingleString, hl, creatorName)
  810. }
  811. ]
  812. }
  813.  
  814. replies.hideReplies.buttonRenderer.text = {
  815. runs: [
  816. {
  817. text: (replyCount > 1) ? getString("hideMulti", hl) : getString("hideSingular", hl)
  818. }
  819. ]
  820. };
  821. } catch(err) {}
  822.  
  823. return thread;
  824. }
  825.  
  826. /**
  827. * Force Polymer to refresh data of an element.
  828. *
  829. * @param {Node} element Element to refresh data of.
  830. */
  831. function refreshData(element) {
  832. var clone = element.cloneNode();
  833. clone.data = element.data;
  834. // Let the script know we left our mark
  835. // in a way that doesn't rely on classes
  836. // because Polymer likes to cast comments
  837. // into the void for later reuse
  838. clone.data.fixedByCF = true;
  839. for (var i in element.properties) {
  840. clone[i] = element[i];
  841. }
  842. element.insertAdjacentElement("afterend", clone);
  843. element.remove();
  844. }
  845.  
  846. var commentObserver = new MutationObserver((list) => {
  847. list.forEach(async (mutation) => {
  848. if (mutation.addedNodes) {
  849. for (var i = 0; i < mutation.addedNodes.length; i++) {
  850. var elm = mutation.addedNodes[i];
  851. if (elm.classList && elm.data && !elm.data.fixedByCF) {
  852. if (elm.tagName == "YTD-COMMENT-THREAD-RENDERER") {
  853. elm.data = await formatCommentThread(elm.data);
  854. refreshData(elm);
  855. } else if (elm.tagName == "YTD-COMMENT-RENDERER") {
  856. if (!elm.classList.contains("ytd-comment-thread-renderer")) {
  857. elm.data = formatComment(elm.data);
  858. refreshData(elm);
  859. }
  860. }
  861. }
  862. }
  863. }
  864. });
  865. });
  866.  
  867. document.addEventListener("yt-page-data-updated", async (e) => {
  868. hl = yt.config_.HL;
  869. commentObserver.observe(document.querySelector("ytd-app"), { childList: true, subtree: true });
  870. });
  871.  
  872. // CSS adjustments and UI fixes
  873. (function() {
  874. ApplyCSS();
  875. function ApplyCSS() {
  876. var styles = document.createElement("style");
  877. styles.innerHTML=`
  878. ytd-masthead {
  879. background: var(--yt-spec-brand-background-solid) !important;
  880. }
  881. ytd-app {
  882. background: var(--yt-spec-general-background-a) !important;
  883. }
  884.  
  885. ytd-browse[page-subtype="channels"] {
  886. background: var(--yt-spec-general-background-b) !important;
  887. }
  888.  
  889. ytd-c4-tabbed-header-renderer {
  890. --yt-lightsource-section1-color: var(--yt-spec-general-background-a) !important;
  891. }
  892.  
  893. #tabs-divider.ytd-c4-tabbed-header-renderer {
  894. border-bottom: 0px !important;
  895. }
  896. #container.ytd-searchbox {
  897. background-color: var(--ytd-searchbox-background) !important;
  898. border-radius: 2px 0 0 2px !important;
  899. box-shadow: inset 0 1px 2px var(--ytd-searchbox-legacy-border-shadow-color) !important;
  900. color: var(--ytd-searchbox-text-color) !important;
  901. padding: 2px 6px !important;
  902. }
  903.  
  904. ytd-searchbox[desktop-searchbar-style="rounded_corner_dark_btn"] #searchbox-button.ytd-searchbox {
  905. display: none !important;
  906. }
  907.  
  908. ytd-searchbox[desktop-searchbar-style="rounded_corner_light_btn"] #searchbox-button.ytd-searchbox {
  909. display: none !important;
  910. }
  911.  
  912. #search[has-focus] #search-input {
  913. margin-left: 32px !important;
  914. }
  915.  
  916. #search-icon-legacy.ytd-searchbox {
  917. display: block !important;
  918. border-radius: 0px 2px 2px 0px !important;
  919. }
  920.  
  921. .sbsb_a {
  922. border-radius: 2px !important;
  923. }
  924.  
  925. .sbsb_c {
  926. padding-left: 10px !important;
  927. }
  928.  
  929. div.sbqs_c::before {
  930. margin-right: 10px !important;
  931. }
  932.  
  933. ytd-searchbox[has-focus] #search-icon.ytd-searchbox {
  934. padding-left: 10px !important;
  935. padding-right: 10px !important;
  936. }
  937.  
  938. #voice-search-button.ytd-masthead {
  939. background-color: var(--yt-spec-general-background-a) !important;
  940. margin-left: 4px !important;
  941. }
  942.  
  943. #guide-content.ytd-app {
  944. background: var(--yt-spec-brand-background-solid) !important;
  945. }
  946.  
  947. yt-interaction.ytd-guide-entry-renderer,
  948. ytd-guide-entry-renderer {
  949. border-radius: 0px !important;
  950. }
  951.  
  952. ytd-guide-entry-renderer[guide-refresh] {
  953. width: 100% !important;
  954. border-radius: 0px !important;
  955. }
  956.  
  957. tp-yt-paper-item.ytd-guide-entry-renderer {
  958. --paper-item-focused-before-border-radius: 0px !important;
  959. }
  960.  
  961. ytd-mini-guide-renderer {
  962. background-color: var(--yt-spec-brand-background-solid) !important;
  963. }
  964.  
  965. ytd-mini-guide-entry-renderer {
  966. background-color: var(--yt-spec-brand-background-solid) !important;
  967. border-radius: 0 !important;
  968. }
  969.  
  970. ytd-guide-section-renderer.style-scope.ytd-guide-renderer {
  971. padding-left: 0px !important;
  972. }
  973.  
  974. ytd-mini-guide-renderer[guide-refresh] {
  975. padding: 0 !important;
  976. }
  977.  
  978. ytd-guide-entry-renderer[active] {
  979. border-radius: 0px !important;
  980. }
  981.  
  982. .style-scope.ytd-guide-entry-renderer:hover {
  983. border-radius: 0 !important;
  984. }
  985. tp-yt-paper-item.style-scope.ytd-guide-entry-renderer {
  986. border-radius: 0px !important;
  987. padding-left: 24px !important;
  988. }
  989.  
  990. #guide-section-title.ytd-guide-section-renderer {
  991. color: var(--yt-spec-text-secondary) !important;
  992. padding: 8px 24px !important;
  993. font-size: var(--ytd-tab-system-font-size) !important;
  994. font-weight: var(--ytd-tab-system-font-weight) !important;
  995. letter-spacing: var(--ytd-tab-system-letter-spacing) !important;
  996. text-transform: var(--ytd-tab-system-text-transform) !important;
  997. }
  998.  
  999. yt-chip-cloud-chip-renderer {
  1000. height: 32px !important;
  1001. border: 1px solid var(--yt-spec-10-percent-layer) !important;
  1002. border-radius: 16px !important;
  1003. box-sizing: border-box !important;
  1004. }
  1005.  
  1006. yt-formatted-string.style-scope.yt-chip-cloud-chip-renderer {
  1007. font-weight: 400 !important;
  1008. }
  1009.  
  1010. [page-subtype="home"] #chips-wrapper.ytd-feed-filter-chip-bar-renderer {
  1011. background-color: var(--yt-spec-brand-background-primary) !important;
  1012. border-top: 1px solid var(--yt-spec-10-percent-layer) !important;
  1013. border-bottom: 1px solid var(--yt-spec-10-percent-layer) !important;
  1014. }
  1015.  
  1016. ytd-feed-filter-chip-bar-renderer[is-dark-theme] #left-arrow.ytd-feed-filter-chip-bar-renderer::after {
  1017. background: linear-gradient(to right, var(--yt-spec-brand-background-primary) 20%, rgba(33, 33, 33, 0) 80%) !important;
  1018. }
  1019.  
  1020. ytd-feed-filter-chip-bar-renderer[is-dark-theme] #right-arrow.ytd-feed-filter-chip-bar-renderer::before {
  1021. background: linear-gradient(to left, var(--yt-spec-brand-background-primary) 20%, rgba(33, 33, 33, 0) 80%) !important;
  1022. }
  1023.  
  1024. ytd-feed-filter-chip-bar-renderer #left-arrow-button.ytd-feed-filter-chip-bar-renderer,
  1025. ytd-feed-filter-chip-bar-renderer #right-arrow-button.ytd-feed-filter-chip-bar-renderer {
  1026. background-color: var(--yt-spec-brand-background-primary) !important;
  1027. }
  1028.  
  1029. yt-chip-cloud-renderer[is-dark-theme] #right-arrow.yt-chip-cloud-renderer::before {
  1030. background: linear-gradient(to left, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(24, 24, 24, 0) 90%) !important;
  1031. }
  1032.  
  1033. yt-chip-cloud-renderer #left-arrow-button.yt-chip-cloud-renderer,
  1034. yt-chip-cloud-renderer #right-arrow-button.yt-chip-cloud-renderer {
  1035. background: var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) !important;
  1036. }
  1037.  
  1038. yt-chip-cloud-renderer[is-dark-theme] #left-arrow.yt-chip-cloud-renderer::after {
  1039. background: linear-gradient(to right, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(24, 24, 24, 0) 90%) !important;
  1040. }
  1041.  
  1042. yt-chip-cloud-renderer #left-arrow.yt-chip-cloud-renderer::after {
  1043. background: linear-gradient(to right, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(249, 249, 249, 0) 90%) !important;
  1044. }
  1045.  
  1046. yt-chip-cloud-renderer #right-arrow.yt-chip-cloud-renderer::before {
  1047. background: linear-gradient(to left, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(249, 249, 249, 0) 90%) !important;
  1048. }
  1049.  
  1050. ytd-feed-filter-chip-bar-renderer[component-style="FEED_FILTER_CHIP_BAR_STYLE_TYPE_HASHTAG_LANDING_PAGE"] #chips-wrapper.ytd-feed-filter-chip-bar-renderer,
  1051. ytd-feed-filter-chip-bar-renderer[component-style="FEED_FILTER_CHIP_BAR_STYLE_TYPE_CHANNEL_PAGE_GRID"] #chips-wrapper.ytd-feed-filter-chip-bar-renderer {
  1052. background-color: var(--yt-spec-general-background-b) !important;
  1053. }
  1054. .style-scope.ytd-rich-item-renderer {
  1055. border-radius: 2px !important;
  1056. }
  1057.  
  1058. .style-scope.ytd-item-section-renderer {
  1059. border-radius: 0px !important;
  1060. }
  1061.  
  1062. #tooltip.tp-yt-paper-tooltip {
  1063. border-radius: 2px !important;
  1064. }
  1065.  
  1066. .style-scope.ytd-topic-link-renderer {
  1067. border-radius: 2px !important;
  1068. }
  1069. .bold.style-scope.yt-formatted-string {
  1070. font-family: Roboto !important;
  1071. }
  1072.  
  1073. .style-scope.yt-formatted-string {
  1074. font-family: Roboto !important;
  1075. }
  1076.  
  1077. #bar {
  1078. border-radius: 2px !important;
  1079. }
  1080.  
  1081. ytd-multi-page-menu-renderer {
  1082. border-radius: 0px !important;
  1083. border: 1px solid var(--yt-spec-10-percent-layer) !important;
  1084. border-top: none !important;
  1085. box-shadow: none !important;
  1086. }
  1087.  
  1088. yt-dropdown-menu {
  1089. --paper-menu-button-content-border-radius: 2px !important;
  1090. }
  1091.  
  1092. ytd-menu-popup-renderer {
  1093. border-radius: 2px !important;
  1094. }
  1095.  
  1096. .style-scope.ytd-shared-post-renderer {
  1097. border-radius: 0px !important;
  1098. }
  1099. div#dismissed.style-scope.ytd-compact-video-renderer {
  1100. border-radius: 0px !important;
  1101. }
  1102. .style-scope.ytd-feed-nudge-renderer {
  1103. border-radius: 2px !important;
  1104. }
  1105. .style-scope.ytd-inline-survey-renderer {
  1106. border-radius: 2px !important;
  1107. }
  1108. .style-scope.ytd-brand-video-shelf-renderer {
  1109. border-radius: 0px !important;
  1110. }
  1111.  
  1112. tp-yt-paper-button#button.style-scope.ytd-button-renderer.style-inactive-outline.size-default {
  1113. border-radius: 2px !important;
  1114. }
  1115.  
  1116. div#dismissed.style-scope.ytd-rich-grid-media {
  1117. border-radius: 0px !important;
  1118. }
  1119. ytd-thumbnail-overlay-toggle-button-renderer.style-scope.ytd-thumbnail {
  1120. border-radius: 2px !important;
  1121. }
  1122.  
  1123. ytd-compact-link-renderer.ytd-settings-sidebar-renderer {
  1124. margin: 0px !important;
  1125. border-radius: 0 !important;
  1126. }
  1127.  
  1128. ytd-compact-link-renderer[compact-link-style=compact-link-style-type-settings-sidebar][active] {
  1129. border-radius: 0 !important;
  1130. }
  1131. tp-yt-paper-item.style-scope.ytd-compact-link-renderer::before {
  1132. border-radius: 0 !important;
  1133. }
  1134. ytd-compact-link-renderer[compact-link-style=compact-link-style-type-settings-sidebar] tp-yt-paper-item.ytd-compact-link-renderer {
  1135. padding-left: 24px !important;
  1136. padding-right: 24px !important;
  1137. }
  1138.  
  1139. img#img.style-scope.yt-image-shadow {
  1140. border-radius: 50px !important;
  1141. }
  1142. #title.style-scope.ytd-feed-nudge-renderer {
  1143. font-family: Roboto !important;
  1144. }
  1145.  
  1146. yt-chip-cloud-chip-renderer.style-scope.ytd-feed-nudge-renderer {
  1147. border-radius: 50px !important;
  1148. }
  1149.  
  1150. #meta #avatar {
  1151. width: 48px;
  1152. height: 48px;
  1153. margin-right: 16px;
  1154. }
  1155. #meta #avatar img {
  1156. width: 100%;
  1157. }
  1158. #channel-name.ytd-video-owner-renderer {
  1159. font-size: 1.4rem !important;
  1160. }
  1161.  
  1162. #info.ytd-video-primary-info-renderer {
  1163. height: 40px !important;
  1164. }
  1165. ytd-merch-shelf-renderer {
  1166. background-color: transparent !important;
  1167. }
  1168. div#clarify-box.attached-message.style-scope.ytd-watch-flexy {
  1169. margin-top: 0px !important;
  1170. }
  1171.  
  1172. ytd-clarification-renderer.style-scope.ytd-item-section-renderer {
  1173. border: 1px solid !important;
  1174. border-color: #0000001a !important;
  1175. border-radius: 0px !important;
  1176. }
  1177.  
  1178. ytd-clarification-renderer.style-scope.ytd-watch-flexy {
  1179. border: 1px solid !important;
  1180. border-color: #0000001a !important;
  1181. border-radius: 0px !important;
  1182. }
  1183.  
  1184. yt-formatted-string.description.style-scope.ytd-clarification-renderer {
  1185. font-size: 1.4rem !important;
  1186. }
  1187.  
  1188. div.content-title.style-scope.ytd-clarification-renderer {
  1189. padding-bottom: 4px !important;
  1190. }
  1191.  
  1192. ytd-rich-metadata-renderer[rounded] {
  1193. border-radius: 0px !important;
  1194. }
  1195.  
  1196. ytd-live-chat-frame[rounded-container] {
  1197. border-radius: 0px !important;
  1198. }
  1199.  
  1200. ytd-live-chat-frame[rounded-container] #show-hide-button.ytd-live-chat-frame ytd-toggle-button-renderer.ytd-live-chat-frame {
  1201. border-radius: 0px !important;
  1202. }
  1203.  
  1204. ytd-toggle-button-renderer.style-scope.ytd-live-chat-frame {
  1205. background: var(--yt-spec-brand-background-solid) !important;
  1206. }
  1207.  
  1208. yt-live-chat-header-renderer.style-scope.yt-live-chat-renderer {
  1209. background: var(--yt-spec-brand-background-solid) !important;
  1210. }
  1211.  
  1212. ytd-toggle-button-renderer.style-scope.ytd-live-chat-frame > a.yt-simple-endpoint.style-scope.ytd-toggle-button-renderer > tp-yt-paper-button.style-scope.ytd-toggle-button-renderer {
  1213. padding-top: 4px !important;
  1214. padding-bottom: 4px !important;
  1215. }
  1216.  
  1217. iframe.style-scope.ytd-live-chat-frame {
  1218. border-radius: 0px !important;
  1219. }
  1220.  
  1221. ytd-playlist-panel-renderer[modern-panels]:not([within-miniplayer]) #container.ytd-playlist-panel-renderer {
  1222. border-radius: 0px !important;
  1223. }
  1224.  
  1225. ytd-playlist-panel-renderer[modern-panels]:not([hide-header-text]) .title.ytd-playlist-panel-renderer {
  1226. font-family: Roboto !important;
  1227. font-size: 1.4rem !important;
  1228. line-height: 2rem !important;
  1229. font-weight: 500 !important;
  1230. }
  1231.  
  1232. ytd-tvfilm-offer-module-renderer[modern-panels] {
  1233. border-radius: 0px !important;
  1234. }
  1235.  
  1236. ytd-tvfilm-offer-module-renderer[modern-panels] #header.ytd-tvfilm-offer-module-renderer {
  1237. border-radius: 0px !important;
  1238. font-family: Roboto !important;
  1239. font-size: 1.6rem !important;
  1240. line-height: 2.2rem !important;
  1241. font-weight: 400 !important;
  1242. }
  1243.  
  1244. ytd-donation-shelf-renderer.style-scope.ytd-watch-flexy {
  1245. border-radius: 0px !important;
  1246. }
  1247.  
  1248. ytd-donation-shelf-renderer[modern-panels] #header-text.ytd-donation-shelf-renderer {
  1249. font-family: Roboto !important;
  1250. font-size: 1.6rem !important;
  1251. font-weight: 500 !important;
  1252. }
  1253.  
  1254. ytd-channel-video-player-renderer[rounded] #player.ytd-channel-video-player-renderer {
  1255. border-radius: 0px !important;
  1256. }
  1257.  
  1258. ytd-universal-watch-card-renderer[rounded] #header.ytd-universal-watch-card-renderer {
  1259. border-radius: 0px !important;
  1260. }
  1261.  
  1262. ytd-universal-watch-card-renderer[rounded] #hero.ytd-universal-watch-card-renderer {
  1263. border-radius: 0px !important;
  1264. }
  1265.  
  1266. #title.ytd-settings-sidebar-renderer {
  1267. font-family: Roboto !important;
  1268. font-weight: 400 !important;
  1269. }
  1270.  
  1271. span.style-scope.ytd-rich-shelf-renderer {
  1272. font-weight: 400 !important;
  1273. }
  1274.  
  1275. span.style-scope.ytd-shelf-renderer {
  1276. font-size: 1.6rem !important;
  1277. font-weight: 500 !important;
  1278. }
  1279.  
  1280. .count-text.ytd-comments-header-renderer {
  1281. font-size: 1.6rem !important;
  1282. line-height: 2.2rem !important;
  1283. font-weight: 400 !important;
  1284. }
  1285.  
  1286. #channel-container.ytd-c4-tabbed-header-renderer {
  1287. height: 100px !important;
  1288. }
  1289.  
  1290. #contentContainer.tp-yt-app-header-layout {
  1291. padding-top: 353px !important;
  1292. }
  1293.  
  1294. #channel-header-container.ytd-c4-tabbed-header-renderer {
  1295. padding-top: 0 !important;
  1296. }
  1297.  
  1298. ytd-c4-tabbed-header-renderer[use-modern-style] #channel-name.ytd-c4-tabbed-header-renderer {
  1299. margin-bottom: 0px !important;
  1300. }
  1301.  
  1302. ytd-c4-tabbed-header-renderer[use-modern-style] #avatar-editor.ytd-c4-tabbed-header-renderer {
  1303. --ytd-channel-avatar-editor-size: 80px !important;
  1304. }
  1305.  
  1306. #avatar.ytd-c4-tabbed-header-renderer {
  1307. width: 80px !important;
  1308. height: 80px !important;
  1309. margin: 0 24px 0 0 !important;
  1310. flex: none !important;
  1311. border-radius: 50% !important;
  1312. background-color: transparent !important;
  1313. overflow: hidden !important;
  1314. }
  1315.  
  1316. yt-formatted-string#channel-handle.style-scope.ytd-c4-tabbed-header-renderer {
  1317. display: none !important;
  1318. }
  1319.  
  1320. yt-formatted-string#subscriber-count.style-scope.ytd-c4-tabbed-header-renderer {
  1321. margin: -8px !important;
  1322. }
  1323.  
  1324. #wrapper > .ytd-channel-tagline-renderer.style-scope,#videos-count {
  1325. display: none !important;
  1326. }
  1327.  
  1328. .yt-tab-shape-wiz {
  1329. padding: 0 32px !important;
  1330. margin-right: 0 !important;
  1331. }
  1332.  
  1333. .yt-tab-shape-wiz__tab {
  1334. font-size: 14px !important;
  1335. font-weight: 500 !important;
  1336. letter-spacing: var(--ytd-tab-system-letter-spacing) !important;
  1337. text-transform: uppercase !important;
  1338. }
  1339.  
  1340. .yt-tab-group-shape-wiz__slider {
  1341. display: none !important;
  1342. }
  1343.  
  1344. .yt-tab-shape-wiz__tab-bar {
  1345. display: none !important;
  1346. }
  1347.  
  1348. /* Remove rounded corners on Featured shelfs */
  1349. div#dismissible.style-scope.ytd-brand-video-shelf-renderer {
  1350. border-radius: 0px !important;
  1351. }
  1352.  
  1353. div#dismissible.style-scope.ytd-brand-video-singleton-renderer {
  1354. border-radius: 0px !important;
  1355. }
  1356.  
  1357. #inline-survey-compact-video-renderer {
  1358. border-radius: 0px !important;
  1359. }
  1360.  
  1361. /* Remove rounded corners on unloaded elements */
  1362. #top-row.ytd-watch-metadata > div#actions.item.style-scope.ytd-watch-metadata > div#actions-inner.style-scope.ytd-watch-metadata > div#menu.style-scope.ytd-watch-metadata > ytd-menu-renderer.style-scope.ytd-watch-metadata > div#top-level-buttons-computed.top-level-buttons.style-scope.ytd-menu-renderer > ytd-button-renderer, #top-row.ytd-watch-metadata > div#actions.item.style-scope.ytd-watch-metadata > div#actions-inner.style-scope.ytd-watch-metadata > div#menu.style-scope.ytd-watch-metadata > ytd-menu-renderer.style-scope.ytd-watch-metadata > div#flexible-item-buttons.style-scope.ytd-menu-renderer > ytd-button-renderer, #top-row.ytd-watch-metadata > div#actions.item.style-scope.ytd-watch-metadata > div#actions-inner.style-scope.ytd-watch-metadata > div#menu.style-scope.ytd-watch-metadata > ytd-menu-renderer.style-scope.ytd-watch-metadata > div#top-level-buttons-computed.top-level-buttons.style-scope.ytd-menu-renderer > ytd-segmented-like-dislike-button-renderer.style-scope.ytd-menu-renderer > yt-smartimation.style-scope.ytd-segmented-like-dislike-button-renderer > div#segmented-buttons-wrapper.style-scope.ytd-segmented-like-dislike-button-renderer > div#segmented-like-button.style-scope.ytd-segmented-like-dislike-button-renderer > ytd-toggle-button-renderer {
  1363. text-transform: capitalize !important;
  1364. }
  1365.  
  1366. #top-row.ytd-watch-metadata > div#actions.item.style-scope.ytd-watch-metadata > div#actions-inner.style-scope.ytd-watch-metadata > div#menu.style-scope.ytd-watch-metadata > ytd-menu-renderer.style-scope.ytd-watch-metadata > div#top-level-buttons-computed.top-level-buttons.style-scope.ytd-menu-renderer > ytd-segmented-like-dislike-button-renderer.style-scope.ytd-menu-renderer > yt-smartimation.style-scope.ytd-segmented-like-dislike-button-renderer > div#segmented-buttons-wrapper.style-scope.ytd-segmented-like-dislike-button-renderer > div#segmented-dislike-button.style-scope.ytd-segmented-like-dislike-button-renderer > ytd-toggle-button-renderer.style-scope.ytd-segmented-like-dislike-button-renderer.style-text > a.yt-simple-endpoint.style-scope.ytd-toggle-button-renderer > yt-icon-button#button.yt-simple-endpoint.style-scope.ytd-toggle-button-renderer > button#button.style-scope.yt-icon-button {
  1367. width: 24px !important;
  1368. height: 24px !important;
  1369. }
  1370.  
  1371. #top-row.ytd-watch-metadata > div#actions.item.style-scope.ytd-watch-metadata > div#actions-inner.style-scope.ytd-watch-metadata > div#menu.style-scope.ytd-watch-metadata > ytd-menu-renderer.style-scope.ytd-watch-metadata > div#top-level-buttons-computed.top-level-buttons.style-scope.ytd-menu-renderer > ytd-segmented-like-dislike-button-renderer.style-scope.ytd-menu-renderer > yt-smartimation.style-scope.ytd-segmented-like-dislike-button-renderer > div#segmented-buttons-wrapper.style-scope.ytd-segmented-like-dislike-button-renderer > div#segmented-dislike-button.style-scope.ytd-segmented-like-dislike-button-renderer > ytd-toggle-button-renderer.style-scope.ytd-segmented-like-dislike-button-renderer.style-text > a.yt-simple-endpoint.style-scope.ytd-toggle-button-renderer > yt-icon-button#button.yt-simple-endpoint.style-scope.ytd-toggle-button-renderer {
  1372. padding: 6px !important;
  1373. }
  1374.  
  1375. ytd-watch-metadata[modern-metapanel] #description.ytd-watch-metadata, #description.ytd-watch-metadata {
  1376. background-color: transparent !important;
  1377. border-radius: 0px !important;
  1378. }
  1379.  
  1380. ytd-watch-metadata[modern-metapanel] #description-inner.ytd-watch-metadata, #description-inner.ytd-watch-metadata {
  1381. margin: 0px !important;
  1382. }
  1383.  
  1384. ytd-watch-metadata[modern-metapanel-order] #comment-teaser.ytd-watch-metadata, #comment-teaser.ytd-watch-metadata {
  1385. border: 1px solid var(--yt-spec-10-percent-layer) !important;
  1386. border-radius: 4px !important;
  1387. }
  1388.  
  1389. ytd-comments-entry-point-header-renderer[modern-metapanel], #comment-teaser.ytd-watch-metadata {
  1390. background-color: transparent !important;
  1391. }
  1392.  
  1393. div#title.text-shell.skeleton-bg-color {
  1394. border-radius: 0px !important;
  1395. }
  1396. div#count.text-shell.skeleton-bg-color {
  1397. border-radius: 0px !important;
  1398. }
  1399. div#owner-name.text-shell.skeleton-bg-color {
  1400. border-radius: 0px !important;
  1401. }
  1402.  
  1403. div#published-date.text-shell.skeleton-bg-color {
  1404. border-radius: 0px !important;
  1405. }
  1406.  
  1407. div#subscribe-button.skeleton-bg-color {
  1408. border-radius: 2px !important;
  1409. }
  1410.  
  1411. div.rich-thumbnail.skeleton-bg-color {
  1412. border-radius: 0px !important;
  1413. }
  1414. div.rich-video-title.text-shell.skeleton-bg-color {
  1415. border-radius: 0px !important;
  1416. }
  1417.  
  1418. div.rich-video-meta.text-shell.skeleton-bg-color {
  1419. border-radius: 0px !important;
  1420. }
  1421. a#endpoint.yt-simple-endpoint.style-scope.ytd-mini-guide-entry-renderer {
  1422. margin: 0px !important;
  1423. }
  1424.  
  1425. /* Remove rounded corners from the video player (Thanks to oldbutgoldyt for the code) */
  1426. .ytp-ad-player-overlay-flyout-cta-rounded {
  1427. border-radius: 2px !important;
  1428. }
  1429.  
  1430. .ytp-flyout-cta .ytp-flyout-cta-action-button.ytp-flyout-cta-action-button-rounded {
  1431. font-family: Arial !important;
  1432. background: #167ac6 !important;
  1433. border: solid 1px transparent !important;
  1434. border-color: #167ac6 !important;
  1435. border-radius: 2px !important;
  1436. box-shadow: 0 1px 0 rgba(0,0,0,.05) !important;
  1437. font-size: 11px !important;
  1438. font-weight: 500 !important;
  1439. height: 28px !important;
  1440. margin: 0 8px 0 0 !important;
  1441. max-width: 140px !important;
  1442. padding: 0 10px !important;
  1443. }
  1444.  
  1445. .ytp-ad-action-interstitial-action-button.ytp-ad-action-interstitial-action-button-rounded {
  1446. background-color: #167ac6 !important;
  1447. border: none !important;
  1448. border-radius: 2px;
  1449. font-family: Arial !important;
  1450. font-size: 23px !important;
  1451. height: 46px !important;
  1452. line-height: 46px !important;
  1453. min-width: 164px !important;
  1454. padding: 0 20px !important;
  1455. }
  1456.  
  1457. .ytp-settings-menu {
  1458. border-radius: 2px !important;
  1459. }
  1460.  
  1461. .ytp-sb-subscribe {
  1462. border-radius: 2px !important;
  1463. background-color: #f00 !important;
  1464. color: #fff !important;
  1465. text-transform: uppercase !important;
  1466. }
  1467.  
  1468. .ytp-sb-unsubscribe {
  1469. border-radius: 2px !important;
  1470. background-color: #eee !important;
  1471. color: #606060 !important;
  1472. text-transform: uppercase !important;
  1473. }
  1474.  
  1475. .ytp-sb-subscribe.ytp-sb-disabled {
  1476. background-color: #f3908b !important;
  1477. }
  1478.  
  1479. .branding-context-container-inner.ytp-rounded-branding-context {
  1480. border-radius: 2px !important;
  1481. }
  1482.  
  1483. .ytp-tooltip.ytp-rounded-tooltip:not(.ytp-preview) .ytp-tooltip-text {
  1484. border-radius: 2px !important;
  1485. }
  1486.  
  1487. .ytp-autonav-endscreen-upnext-button.ytp-autonav-endscreen-upnext-button-rounded {
  1488. border-radius: 2px !important;
  1489. }
  1490.  
  1491. .ytp-ad-overlay-container.ytp-rounded-overlay-ad .ytp-ad-overlay-image img, .ytp-ad-overlay-container.ytp-rounded-overlay-ad .ytp-ad-text-overlay, .ytp-ad-overlay-container.ytp-rounded-overlay-ad .ytp-ad-enhanced-overlay {
  1492. border-radius: 0 !important;
  1493. }
  1494.  
  1495. .ytp-videowall-still-image {
  1496. border-radius: 0 !important;
  1497. }
  1498.  
  1499. div.iv-card.iv-card-video.ytp-rounded-info {
  1500. border-radius: 0 !important;
  1501. }
  1502.  
  1503. div.iv-card.iv-card-playlist.ytp-rounded-info {
  1504. border-radius: 0 !important;
  1505. }
  1506.  
  1507. div.iv-card.iv-card-channel.ytp-rounded-info {
  1508. border-radius: 0 !important;
  1509. }
  1510.  
  1511. div.iv-card.ytp-rounded-info {
  1512. border-radius: 0 !important;
  1513. }
  1514.  
  1515. .ytp-tooltip.ytp-rounded-tooltip.ytp-text-detail.ytp-preview, .ytp-tooltip.ytp-rounded-tooltip.ytp-text-detail.ytp-preview .ytp-tooltip-bg {
  1516. border-radius: 2px !important;
  1517. }
  1518.  
  1519. .ytp-ce-video.ytp-ce-medium-round, .ytp-ce-playlist.ytp-ce-medium-round, .ytp-ce-medium-round .ytp-ce-expanding-overlay-background {
  1520. border-radius: 0 !important;
  1521. }
  1522.  
  1523. .ytp-autonav-endscreen-upnext-thumbnail {
  1524. border-radius: 0 !important;
  1525. }
  1526.  
  1527. @font-face {
  1528. font-family: no-parens;
  1529. src: url("data:application/x-font-woff;base64,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");;
  1530. unicode-range: U+0028, U+0029;
  1531. }
  1532.  
  1533. span.ytp-menu-label-secondary {
  1534. font-family: "no-parens", "Roboto", sans-serif;
  1535. }
  1536.  
  1537. .ytp-swatch-color-white {
  1538. color: #f00 !important;
  1539. }
  1540.  
  1541. .iv-card {
  1542. border-radius: 0 !important;
  1543. }
  1544.  
  1545. .iv-branding .branding-context-container-inner {
  1546. border-radius: 2px !important;
  1547. }
  1548.  
  1549. .ytp-offline-slate-bar {
  1550. border-radius: 2px !important;
  1551. }
  1552.  
  1553. .ytp-offline-slate-button {
  1554. border-radius: 2px !important;
  1555. }
  1556.  
  1557. .ytp-ce-video.ytp-ce-large-round, .ytp-ce-playlist.ytp-ce-large-round, .ytp-ce-large-round .ytp-ce-expanding-overlay-background {
  1558. border-radius: 0 !important;
  1559. }
  1560.  
  1561. .ytp-flyout-cta .ytp-flyout-cta-icon.ytp-flyout-cta-icon-rounded {
  1562. border-radius: 0 !important;
  1563. }
  1564.  
  1565. .ytp-player-minimized .html5-main-video, .ytp-player-minimized .ytp-miniplayer-scrim, .ytp-player-minimized.html5-video-player {
  1566. border-radius: 0 !important;
  1567. }
  1568.  
  1569. ytd-miniplayer #player-container.ytd-miniplayer, ytd-miniplayer #video-container.ytd-miniplayer .video.ytd-miniplayer, ytd-miniplayer #card.ytd-miniplayer, ytd-miniplayer {
  1570. border-radius: 0 !important;
  1571. }
  1572.  
  1573. #player.ytd-channel-video-player-renderer {
  1574. border-radius: 0 !important;
  1575. }
  1576.  
  1577. #player.ytd-channel-video-player-renderer .ytp-small-mode .ytp-chrome-bottom {
  1578. height: 36px !important;
  1579. }
  1580.  
  1581. ytd-video-masthead-ad-primary-video-renderer[rounded] #player-container.ytd-video-masthead-ad-primary-video-renderer {
  1582. border-radius: 0 !important;
  1583. }
  1584.  
  1585. /* Subscribe button fix when you are logged in + other button adjustments */
  1586. #buttons.ytd-c4-tabbed-header-renderer {
  1587. flex-direction: row-reverse !important;
  1588. }
  1589.  
  1590. yt-button-shape.style-scope.ytd-subscribe-button-renderer {
  1591. display: flex !important;
  1592. }
  1593.  
  1594. #subscribe-button ytd-subscribe-button-renderer button {
  1595. height: 37px !important;
  1596. letter-spacing: 0.5px !important;
  1597. border-radius: 2px !important;
  1598. text-transform: uppercase !important;
  1599. }
  1600.  
  1601. .yt-spec-button-shape-next--mono.yt-spec-button-shape-next--filled {
  1602. color: #fff !important;
  1603. background: #c00 !important;
  1604. border-radius: 2px !important;
  1605. text-transform: uppercase !important;
  1606. letter-spacing: 0.5px !important;
  1607. }
  1608.  
  1609. button.yt-spec-button-shape-next.yt-spec-button-shape-next--tonal.yt-spec-button-shape-next--mono.yt-spec-button-shape-next--size-m {
  1610. height: 37px !important;
  1611. letter-spacing: 0.5px !important;
  1612. border-radius: 2px !important;
  1613. text-transform: uppercase !important;
  1614. }
  1615.  
  1616. button.yt-spec-button-shape-next.yt-spec-button-shape-next--tonal.yt-spec-button-shape-next--mono.yt-spec-button-shape-next--size-s {
  1617. height: 25px !important;
  1618. letter-spacing: 0.5px !important;
  1619. border-radius: 2px !important;
  1620. text-transform: uppercase !important;
  1621. }
  1622.  
  1623. div#notification-preference-button.style-scope.ytd-subscribe-button-renderer > ytd-subscription-notification-toggle-button-renderer-next.style-scope.ytd-subscribe-button-renderer > yt-button-shape > .yt-spec-button-shape-next--size-m {
  1624. background-color: transparent !important;
  1625. border-radius: 16px !important;
  1626. padding-left: 14px !important;
  1627. padding-right: 2px !important;
  1628. margin-left: 4px !important;
  1629. }
  1630.  
  1631. div#notification-preference-button.style-scope.ytd-subscribe-button-renderer > ytd-subscription-notification-toggle-button-renderer-next.style-scope.ytd-subscribe-button-renderer > yt-button-shape > .yt-spec-button-shape-next--size-m > div.cbox.yt-spec-button-shape-next__button-text-content {
  1632. display: none !important;
  1633. }
  1634.  
  1635. div#notification-preference-button.style-scope.ytd-subscribe-button-renderer > ytd-subscription-notification-toggle-button-renderer-next.style-scope.ytd-subscribe-button-renderer > yt-button-shape > .yt-spec-button-shape-next--size-m > div.yt-spec-button-shape-next__secondary-icon {
  1636. display: none !important;
  1637. }
  1638.  
  1639. div#notification-preference-button.style-scope.ytd-subscribe-button-renderer > ytd-subscription-notification-toggle-button-renderer-next.style-scope.ytd-subscribe-button-renderer > yt-button-shape > .yt-spec-button-shape-next--size-m {
  1640. border-radius: 100px !important;
  1641. width: 37px !important;
  1642. }
  1643.  
  1644. yt-smartimation.ytd-subscribe-button-renderer {
  1645. display: flex !important;
  1646. }
  1647.  
  1648. /* Remove Shorts, Trending, Podcasts and Shopping in the guide menus + Other elements to be fixed and removed */
  1649. #endpoint.yt-simple-endpoint.ytd-guide-entry-renderer.style-scope[title="Shorts"] {
  1650. display: none !important;
  1651. }
  1652.  
  1653. #endpoint.yt-simple-endpoint.ytd-mini-guide-entry-renderer.style-scope[title="Shorts"] {
  1654. display: none !important;
  1655. }
  1656.  
  1657. #endpoint.yt-simple-endpoint.ytd-guide-entry-renderer.style-scope[title="Trending"] {
  1658. display: none !important;
  1659. }
  1660.  
  1661. #endpoint.yt-simple-endpoint.ytd-guide-entry-renderer.style-scope[title="Podcasts"] {
  1662. display: none !important;
  1663. }
  1664.  
  1665. ytd-guide-entry-renderer > a[href*="/channel/UCkYQyvc_i9hXEo4xic9Hh2g"] {
  1666. display: none !important;
  1667. }
  1668.  
  1669. ytd-reel-shelf-renderer.style-scope.ytd-item-section-renderer {
  1670. display: none !important;
  1671. }
  1672.  
  1673. ytd-horizontal-card-list-renderer.ytd-structured-description-content-renderer:not(:first-child), ytd-metadata-row-container-renderer.ytd-structured-description-content-renderer:not(:first-child), ytd-structured-description-content-renderer[inline-structured-description] ytd-horizontal-card-list-renderer.ytd-structured-description-content-renderer, ytd-structured-description-content-renderer[inline-structured-description] ytd-error-corrections-section-renderer.ytd-structured-description-content-renderer, ytd-structured-description-content-renderer[inline-structured-description] ytd-video-description-infocards-section-renderer.ytd-structured-description-content-renderer {
  1674. display: none !important;
  1675. }
  1676.  
  1677. button.ytp-button.ytp-jump-button.ytp-jump-button-enabled {
  1678. display: none !important;
  1679. }
  1680.  
  1681. a.ytp-next-button.ytp-button {
  1682. display: block !important;
  1683. }`
  1684. document.head.appendChild(styles);
  1685. }
  1686. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址