YouTube - Non-Rounded Design

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

当前为 2023-09-13 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name YouTube - Non-Rounded Design
  3. // @version 4.1.6
  4. // @description This script disables YouTube's new rounded corners (reverts back to the previous layout before late 2022 with extra stuff included such as the explore tab, 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. // ==/UserScript==
  13.  
  14. // Attributes to remove from <html>
  15. const ATTRS = [
  16. "darker-dark-theme",
  17. "darker-dark-theme-deprecate"
  18. ];
  19.  
  20. // Regular config keys.
  21. const CONFIGS = {
  22. BUTTON_REWORK: false
  23. }
  24.  
  25. // Experiment flags.
  26. const EXPFLAGS = {
  27. enable_channel_page_header_profile_section: false,
  28. enable_header_channel_handler_ui: false,
  29. kevlar_unavailable_video_error_ui_client: false,
  30. kevlar_refresh_on_theme_change: false,
  31. kevlar_modern_sd_v2: false,
  32. kevlar_watch_cinematics: false,
  33. kevlar_watch_comments_panel_button: false,
  34. kevlar_watch_grid: false,
  35. kevlar_watch_grid_hide_chips: false,
  36. kevlar_watch_metadata_refresh: false,
  37. kevlar_watch_metadata_refresh_no_old_secondary_data: false,
  38. kevlar_watch_modern_metapanel: false,
  39. kevlar_watch_modern_panels: false,
  40. kevlar_watch_panel_height_matches_player: false,
  41. smartimation_background: false,
  42. web_amsterdam_playlists: false,
  43. web_animated_actions: false,
  44. web_animated_like: false,
  45. web_button_rework: false,
  46. web_button_rework_with_live: false,
  47. web_darker_dark_theme: false,
  48. web_enable_youtab: false,
  49. web_guide_ui_refresh: false,
  50. web_modern_ads: false,
  51. web_modern_buttons: false,
  52. web_modern_chips: false,
  53. web_modern_collections_v2: false,
  54. web_modern_dialogs: false,
  55. web_modern_playlists: false,
  56. web_modern_subscribe: true,
  57. web_modern_tabs: false,
  58. web_rounded_containers: false,
  59. web_rounded_thumbnails: false,
  60. web_searchbar_style: "default",
  61. web_segmented_like_dislike_button: false,
  62. web_sheets_ui_refresh: false,
  63. web_snackbar_ui_refresh: false,
  64. web_watch_rounded_player_large: false
  65. }
  66.  
  67. // Player flags
  68. // !!! USE STRINGS FOR VALUES !!!
  69. // For example: "true" instead of true
  70. const PLYRFLAGS = {
  71. web_rounded_containers: "false",
  72. web_rounded_thumbnails: "false"
  73. }
  74.  
  75. class YTP {
  76. static observer = new MutationObserver(this.onNewScript);
  77.  
  78. static _config = {};
  79.  
  80. static isObject(item) {
  81. return (item && typeof item === "object" && !Array.isArray(item));
  82. }
  83.  
  84. static mergeDeep(target, ...sources) {
  85. if (!sources.length) return target;
  86. const source = sources.shift();
  87.  
  88. if (this.isObject(target) && this.isObject(source)) {
  89. for (const key in source) {
  90. if (this.isObject(source[key])) {
  91. if (!target[key]) Object.assign(target, { [key]: {} });
  92. this.mergeDeep(target[key], source[key]);
  93. } else {
  94. Object.assign(target, { [key]: source[key] });
  95. }
  96. }
  97. }
  98.  
  99. return this.mergeDeep(target, ...sources);
  100. }
  101.  
  102.  
  103. static onNewScript(mutations) {
  104. for (var mut of mutations) {
  105. for (var node of mut.addedNodes) {
  106. YTP.bruteforce();
  107. }
  108. }
  109. }
  110.  
  111. static start() {
  112. this.observer.observe(document, {childList: true, subtree: true});
  113. }
  114.  
  115. static stop() {
  116. this.observer.disconnect();
  117. }
  118.  
  119. static bruteforce() {
  120. if (!window.yt) return;
  121. if (!window.yt.config_) return;
  122.  
  123. this.mergeDeep(window.yt.config_, this._config);
  124. }
  125.  
  126. static setCfg(name, value) {
  127. this._config[name] = value;
  128. }
  129.  
  130. static setCfgMulti(configs) {
  131. this.mergeDeep(this._config, configs);
  132. }
  133.  
  134. static setExp(name, value) {
  135. if (!("EXPERIMENT_FLAGS" in this._config)) this._config.EXPERIMENT_FLAGS = {};
  136.  
  137. this._config.EXPERIMENT_FLAGS[name] = value;
  138. }
  139.  
  140. static setExpMulti(exps) {
  141. if (!("EXPERIMENT_FLAGS" in this._config)) this._config.EXPERIMENT_FLAGS = {};
  142.  
  143. this.mergeDeep(this._config.EXPERIMENT_FLAGS, exps);
  144. }
  145.  
  146. static decodePlyrFlags(flags) {
  147. var obj = {},
  148. dflags = flags.split("&");
  149.  
  150. for (var i = 0; i < dflags.length; i++) {
  151. var dflag = dflags[i].split("=");
  152. obj[dflag[0]] = dflag[1];
  153. }
  154.  
  155. return obj;
  156. }
  157.  
  158. static encodePlyrFlags(flags) {
  159. var keys = Object.keys(flags),
  160. response = "";
  161.  
  162. for (var i = 0; i < keys.length; i++) {
  163. if (i > 0) {
  164. response += "&";
  165. }
  166. response += keys[i] + "=" + flags[keys[i]];
  167. }
  168.  
  169. return response;
  170. }
  171.  
  172. static setPlyrFlags(flags) {
  173. if (!window.yt) return;
  174. if (!window.yt.config_) return;
  175. if (!window.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS) return;
  176. var conCfgs = window.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS;
  177. if (!("WEB_PLAYER_CONTEXT_CONFIGS" in this._config)) this._config.WEB_PLAYER_CONTEXT_CONFIGS = {};
  178.  
  179. for (var cfg in conCfgs) {
  180. var dflags = this.decodePlyrFlags(conCfgs[cfg].serializedExperimentFlags);
  181. this.mergeDeep(dflags, flags);
  182. this._config.WEB_PLAYER_CONTEXT_CONFIGS[cfg] = {
  183. serializedExperimentFlags: this.encodePlyrFlags(dflags)
  184. }
  185. }
  186. }
  187. }
  188.  
  189. window.addEventListener("yt-page-data-updated", function tmp() {
  190. YTP.stop();
  191. for (i = 0; i < ATTRS.length; i++) {
  192. document.getElementsByTagName("html")[0].removeAttribute(ATTRS[i]);
  193. }
  194. window.removeEventListener("yt-page-date-updated", tmp);
  195. });
  196.  
  197. YTP.start();
  198.  
  199. YTP.setCfgMulti(CONFIGS);
  200. YTP.setExpMulti(EXPFLAGS);
  201. YTP.setPlyrFlags(PLYRFLAGS);
  202.  
  203. function $(q) {
  204. return document.querySelector(q);
  205. }
  206.  
  207. // Re-add 'Explore' tab in sidebar (it also replaces the 'Shorts' tab)
  208. function waitForElm(selector) {
  209. return new Promise(resolve => {
  210. if (document.querySelector(selector)) {
  211. return resolve(document.querySelector(selector));
  212. }
  213.  
  214. const observer = new MutationObserver(mutations => {
  215. if (document.querySelector(selector)) {
  216. resolve(document.querySelector(selector));
  217. observer.disconnect();
  218. }
  219. });
  220.  
  221. observer.observe(document.body, {
  222. childList: true,
  223. subtree: true
  224. });
  225. });
  226. }
  227.  
  228. function restoreTrending() {
  229.  
  230. var trendingData = {
  231. "navigationEndpoint": {
  232. "clickTrackingParams": "CBwQtSwYASITCNqYh-qO_fACFcoRrQYdP44D9Q==",
  233. "commandMetadata": {
  234. "webCommandMetadata": {
  235. "url": "/feed/explore",
  236. "webPageType": "WEB_PAGE_TYPE_BROWSE",
  237. "rootVe": 6827,
  238. "apiUrl": "/youtubei/v1/browse"
  239. }
  240. },
  241. "browseEndpoint": {
  242. "browseId": "FEtrending"
  243. }
  244. },
  245. "icon": {
  246. "iconType": "EXPLORE"
  247. },
  248. "trackingParams": "CBwQtSwYASITCNqYh-qO_fACFcoRrQYdP44D9Q==",
  249. "formattedTitle": {
  250. "simpleText": "Explore"
  251. },
  252. "accessibility": {
  253. "accessibilityData": {
  254. "label": "Explore"
  255. }
  256. },
  257. "isPrimary": true
  258. };
  259.  
  260. 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>`;
  261. document.querySelector(`#items > ytd-guide-entry-renderer:nth-child(2)`).data = trendingData;
  262.  
  263. 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>`;
  264. document.querySelector(`#items > ytd-mini-guide-entry-renderer:nth-child(2)`).data = trendingData;
  265.  
  266. }
  267.  
  268.  
  269. waitForElm("#items.ytd-guide-section-renderer").then((elm) => {
  270. restoreTrending();
  271. });
  272.  
  273. waitForElm("#items.ytd-mini-guide-section-renderer").then((elm) => {
  274. restoreTrending();
  275. });
  276.  
  277. // CSS tweaks/fixes, performance increases and other fixes to be included
  278. (function() {
  279. ApplyCSS();
  280. function ApplyCSS() {
  281. var styles = document.createElement("style");
  282. styles.innerHTML=`
  283. /* Revert old background color and buttons */
  284. html[dark] {
  285. --yt-spec-general-background-a: #181818 !important;
  286. --yt-spec-general-background-b: #0f0f0f !important;
  287. --yt-spec-brand-background-primary: rgba(33, 33, 33, 0.98) !important;
  288. --yt-spec-10-percent-layer: rgba(255, 255, 255, 0.1) !important;
  289. }
  290. html:not([dark]) {
  291. --yt-spec-general-background-a: #f9f9f9 !important;
  292. --yt-spec-general-background-b: #f1f1f1 !important;
  293. --yt-spec-brand-background-primary: rgba(255, 255, 255, 0.98) !important;
  294. --yt-spec-10-percent-layer: rgba(0, 0, 0, 0.1) !important;
  295. }
  296.  
  297. ytd-masthead {
  298. background: var(--yt-spec-brand-background-solid) !important;
  299. }
  300. ytd-app {
  301. background: var(--yt-spec-general-background-a) !important;
  302. }
  303. ytd-browse[page-subtype="channels"] {
  304. background: var(--yt-spec-general-background-b) !important;
  305. }
  306. ytd-c4-tabbed-header-renderer {
  307. --yt-lightsource-section1-color: var(--yt-spec-general-background-a) !important;
  308. }
  309.  
  310. ytd-mini-guide-renderer, ytd-mini-guide-entry-renderer {
  311. background-color: var(--yt-spec-brand-background-solid) !important;
  312. }
  313.  
  314. #cinematics.ytd-watch-flexy {
  315. display: none !important;
  316. }
  317.  
  318. #tabs-divider.ytd-c4-tabbed-header-renderer {
  319. border-bottom: 0px !important;
  320. }
  321.  
  322. #header.ytd-rich-grid-renderer {
  323. width: 100% !important;
  324. }
  325.  
  326. #chips.ytd-feed-filter-chip-bar-renderer {
  327. padding-left: 24px !important;
  328. }
  329.  
  330. [page-subtype="home"] #chips-wrapper.ytd-feed-filter-chip-bar-renderer {
  331. background-color: var(--yt-spec-brand-background-primary) !important;
  332. border-top: 1px solid var(--yt-spec-10-percent-layer) !important;
  333. border-bottom: 1px solid var(--yt-spec-10-percent-layer) !important;
  334. }
  335. ytd-feed-filter-chip-bar-renderer[is-dark-theme] #left-arrow.ytd-feed-filter-chip-bar-renderer::after {
  336. background: linear-gradient(to right, var(--yt-spec-brand-background-primary) 20%, rgba(33, 33, 33, 0) 80%) !important;
  337. }
  338. ytd-feed-filter-chip-bar-renderer[is-dark-theme] #right-arrow.ytd-feed-filter-chip-bar-renderer::before {
  339. background: linear-gradient(to left, var(--yt-spec-brand-background-primary) 20%, rgba(33, 33, 33, 0) 80%) !important;
  340. }
  341. ytd-feed-filter-chip-bar-renderer #left-arrow-button.ytd-feed-filter-chip-bar-renderer,
  342. ytd-feed-filter-chip-bar-renderer #right-arrow-button.ytd-feed-filter-chip-bar-renderer {
  343. background-color: var(--yt-spec-brand-background-primary) !important;
  344. }
  345. yt-chip-cloud-renderer[is-dark-theme] #right-arrow.yt-chip-cloud-renderer::before {
  346. background: linear-gradient(to left, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(24, 24, 24, 0) 90%) !important;
  347. }
  348. yt-chip-cloud-renderer #left-arrow-button.yt-chip-cloud-renderer,
  349. yt-chip-cloud-renderer #right-arrow-button.yt-chip-cloud-renderer {
  350. background: var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) !important;
  351. }
  352. yt-chip-cloud-renderer[is-dark-theme] #left-arrow.yt-chip-cloud-renderer::after {
  353. background: linear-gradient(to right, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(24, 24, 24, 0) 90%) !important;
  354. }
  355. yt-chip-cloud-renderer #left-arrow.yt-chip-cloud-renderer::after {
  356. background: linear-gradient(to right, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(249, 249, 249, 0) 90%) !important;
  357. }
  358. yt-chip-cloud-renderer #right-arrow.yt-chip-cloud-renderer::before {
  359. background: linear-gradient(to left, var(--ytd-chip-cloud-background, var(--yt-spec-general-background-a)) 10%, rgba(249, 249, 249, 0) 90%) !important;
  360. }
  361. 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,
  362. 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 {
  363. background-color: var(--yt-spec-general-background-b) !important;
  364. }
  365. yt-chip-cloud-chip-renderer {
  366. height: 32px !important;
  367. border: 1px solid var(--yt-spec-10-percent-layer) !important;
  368. border-radius: 16px !important;
  369. box-sizing: border-box !important;
  370. }
  371.  
  372. /* Remove rounded corners on buttons and boxes */
  373. #container.ytd-searchbox {
  374. background-color: var(--ytd-searchbox-background) !important;
  375. border-radius: 2px 0 0 2px !important;
  376. box-shadow: inset 0 1px 2px var(--ytd-searchbox-legacy-border-shadow-color) !important;
  377. color: var(--ytd-searchbox-text-color) !important;
  378. padding: 2px 6px !important;
  379. }
  380. ytd-searchbox[desktop-searchbar-style="rounded_corner_dark_btn"] #searchbox-button.ytd-searchbox {
  381. display: none !important;
  382. }
  383. ytd-searchbox[desktop-searchbar-style="rounded_corner_light_btn"] #searchbox-button.ytd-searchbox {
  384. display: none !important;
  385. }
  386. #search[has-focus] #search-input {
  387. margin-left: 32px !important;
  388. }
  389. #search-icon-legacy.ytd-searchbox {
  390. display: block !important;
  391. border-radius: 0px 2px 2px 0px !important;
  392. }
  393. .sbsb_a {
  394. border-radius: 2px !important;
  395. }
  396. .sbsb_c {
  397. padding-left: 10px !important;
  398. }
  399. div.sbqs_c::before {
  400. margin-right: 10px !important;
  401. }
  402. ytd-searchbox[has-focus] #search-icon.ytd-searchbox {
  403. padding-left: 10px !important;
  404. padding-right: 10px !important;
  405. }
  406. #voice-search-button.ytd-masthead {
  407. background-color: var(--yt-spec-general-background-a) !important;
  408. margin-left: 4px !important;
  409. }
  410. #guide-content.ytd-app {
  411. background: var(--yt-spec-brand-background-solid) !important;
  412. }
  413. yt-interaction.ytd-guide-entry-renderer,
  414. ytd-guide-entry-renderer {
  415. border-radius: 0px !important;
  416. }
  417. a#endpoint.yt-simple-endpoint.style-scope.ytd-mini-guide-entry-renderer {
  418. margin: 0px !important;
  419. }
  420. ytd-guide-entry-renderer[guide-refresh] {
  421. width: 100% !important;
  422. border-radius: 0px !important;
  423. }
  424. tp-yt-paper-item.ytd-guide-entry-renderer {
  425. --paper-item-focused-before-border-radius: 0px !important;
  426. }
  427. ytd-mini-guide-entry-renderer {
  428. border-radius: 0 !important;
  429. }
  430. ytd-guide-section-renderer.style-scope.ytd-guide-renderer {
  431. padding-left: 0px !important;
  432. }
  433. ytd-mini-guide-renderer[guide-refresh] {
  434. padding: 0 !important;
  435. }
  436. ytd-guide-entry-renderer[active] {
  437. border-radius: 0px !important;
  438. }
  439. .style-scope.ytd-guide-entry-renderer:hover {
  440. border-radius: 0 !important;
  441. }
  442. tp-yt-paper-item.style-scope.ytd-guide-entry-renderer {
  443. border-radius: 0px !important;
  444. padding-left: 24px !important;
  445. }
  446. #guide-section-title.ytd-guide-section-renderer {
  447. color: var(--yt-spec-text-secondary) !important;
  448. padding: 8px 24px !important;
  449. font-size: var(--ytd-tab-system-font-size) !important;
  450. font-weight: var(--ytd-tab-system-font-weight) !important;
  451. letter-spacing: var(--ytd-tab-system-letter-spacing) !important;
  452. text-transform: var(--ytd-tab-system-text-transform) !important;
  453. }
  454. .style-scope.ytd-rich-item-renderer {
  455. border-radius: 2px !important;
  456. }
  457. .style-scope.ytd-item-section-renderer {
  458. border-radius: 0px !important;
  459. }
  460. #tooltip.tp-yt-paper-tooltip {
  461. border-radius: 2px !important;
  462. }
  463. div.style-scope.yt-tooltip-renderer {
  464. border-radius: 0px !important;
  465. }
  466. .style-scope.ytd-topic-link-renderer {
  467. border-radius: 2px !important;
  468. }
  469. .bold.style-scope.yt-formatted-string {
  470. font-family: Roboto !important;
  471. }
  472. .style-scope.yt-formatted-string {
  473. font-family: Roboto !important;
  474. }
  475. #bar {
  476. border-radius: 2px !important;
  477. }
  478. ytd-multi-page-menu-renderer {
  479. border-radius: 0px !important;
  480. border: 1px solid var(--yt-spec-10-percent-layer) !important;
  481. border-top: none !important;
  482. box-shadow: none !important;
  483. }
  484. yt-dropdown-menu {
  485. --paper-menu-button-content-border-radius: 2px !important;
  486. }
  487. ytd-menu-popup-renderer {
  488. border-radius: 2px !important;
  489. }
  490. .style-scope.ytd-shared-post-renderer {
  491. border-radius: 0px !important;
  492. }
  493. div#repost-context.style-scope.ytd-shared-post-renderer {
  494. border-radius: 0px !important;
  495. }
  496. ytd-post-renderer.style-scope.ytd-shared-post-renderer {
  497. border-radius: 0px !important;
  498. }
  499. div#dismissed.style-scope.ytd-compact-video-renderer {
  500. border-radius: 0px !important;
  501. }
  502. .style-scope.ytd-feed-nudge-renderer {
  503. border-radius: 2px !important;
  504. }
  505. .style-scope.ytd-inline-survey-renderer {
  506. border-radius: 2px !important;
  507. }
  508. .style-scope.ytd-brand-video-shelf-renderer {
  509. border-radius: 0px !important;
  510. }
  511.  
  512. div#dismissible.style-scope.ytd-brand-video-singleton-renderer {
  513. border-radius: 0px !important;
  514. }
  515.  
  516. #inline-survey-compact-video-renderer {
  517. border-radius: 0px !important;
  518. }
  519.  
  520. tp-yt-paper-button#button.style-scope.ytd-button-renderer.style-inactive-outline.size-default {
  521. border-radius: 2px !important;
  522. }
  523. div#dismissed.style-scope.ytd-rich-grid-media {
  524. border-radius: 0px !important;
  525. }
  526.  
  527. ytd-thumbnail[size="large"] a.ytd-thumbnail, ytd-thumbnail[size="large"]::before {
  528. border-radius: 0 !important;
  529. }
  530. ytd-thumbnail[size="medium"] a.ytd-thumbnail, ytd-thumbnail[size="medium"]::before {
  531. border-radius: 0 !important;
  532. }
  533.  
  534. ytd-playlist-thumbnail[size="medium"] a.ytd-playlist-thumbnail, ytd-playlist-thumbnail[size="medium"]::before {
  535. border-radius: 0 !important;
  536. }
  537.  
  538. ytd-playlist-thumbnail[size="large"] a.ytd-playlist-thumbnail, ytd-playlist-thumbnail[size="large"]::before {
  539. border-radius: 0 !important;
  540. }
  541.  
  542. ytd-playlist-panel-renderer[modern-panels]:not([within-miniplayer]) #container.ytd-playlist-panel-renderer {
  543. border-radius: 0 !important;
  544. }
  545. ytd-thumbnail-overlay-toggle-button-renderer.style-scope.ytd-thumbnail {
  546. border-radius: 2px !important;
  547. }
  548. ytd-compact-link-renderer.ytd-settings-sidebar-renderer {
  549. margin: 0px !important;
  550. border-radius: 0 !important;
  551. }
  552. ytd-compact-link-renderer[compact-link-style=compact-link-style-type-settings-sidebar][active] {
  553. border-radius: 0 !important;
  554. }
  555. tp-yt-paper-item.style-scope.ytd-compact-link-renderer::before {
  556. border-radius: 0 !important;
  557. }
  558. ytd-compact-link-renderer[compact-link-style=compact-link-style-type-settings-sidebar] tp-yt-paper-item.ytd-compact-link-renderer {
  559. padding-left: 24px !important;
  560. padding-right: 24px !important;
  561. }
  562. img#img.style-scope.yt-image-shadow {
  563. border-radius: 50px !important;
  564. }
  565. #title.style-scope.ytd-feed-nudge-renderer {
  566. font-family: Roboto !important;
  567. }
  568. yt-chip-cloud-chip-renderer.style-scope.ytd-feed-nudge-renderer {
  569. border-radius: 50px !important;
  570. }
  571.  
  572. div#label-container.style-scope.ytd-thumbnail-overlay-toggle-button-renderer {
  573. border: 2px !important;
  574. text-transform: uppercase !important;
  575. }
  576. ytd-thumbnail-overlay-time-status-renderer.style-scope.ytd-thumbnail {
  577. border-radius: 2px !important;
  578. }
  579.  
  580. ytd-backstage-post-dialog-renderer {
  581. border-radius: 2px !important;
  582. }
  583.  
  584. yt-bubble-hint-renderer {
  585. border-radius: 2px !important;
  586. }
  587.  
  588. #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 {
  589. text-transform: capitalize !important;
  590. }
  591. #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 {
  592. width: 24px !important;
  593. height: 24px !important;
  594. }
  595. #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 {
  596. padding: 6px !important;
  597. }
  598. ytd-watch-metadata[modern-metapanel] #description.ytd-watch-metadata, #description.ytd-watch-metadata {
  599. background-color: transparent !important;
  600. border-radius: 0px !important;
  601. }
  602. ytd-watch-metadata[modern-metapanel] #description-inner.ytd-watch-metadata, #description-inner.ytd-watch-metadata {
  603. margin: 0px !important;
  604. }
  605. ytd-watch-metadata[modern-metapanel-order] #comment-teaser.ytd-watch-metadata, #comment-teaser.ytd-watch-metadata {
  606. border: 1px solid var(--yt-spec-10-percent-layer) !important;
  607. border-radius: 4px !important;
  608. }
  609. ytd-comments-entry-point-header-renderer[modern-metapanel], #comment-teaser.ytd-watch-metadata {
  610. background-color: transparent !important;
  611. }
  612.  
  613. div#title.text-shell.skeleton-bg-color {
  614. border-radius: 2px !important;
  615. }
  616. div#count.text-shell.skeleton-bg-color {
  617. border-radius: 2px !important;
  618. }
  619. div#owner-name.text-shell.skeleton-bg-color {
  620. border-radius: 2px !important;
  621. }
  622.  
  623. div#published-date.text-shell.skeleton-bg-color {
  624. border-radius: 2px !important;
  625. }
  626.  
  627. div#subscribe-button.skeleton-bg-color {
  628. border-radius: 4px !important;
  629. }
  630.  
  631. div.rich-thumbnail.skeleton-bg-color {
  632. border-radius: 0px !important;
  633. }
  634. div.rich-video-title.text-shell.skeleton-bg-color {
  635. border-radius: 2px !important;
  636. }
  637.  
  638. div.rich-video-meta.text-shell.skeleton-bg-color {
  639. border-radius: 2px !important;
  640. }
  641. #meta #avatar {
  642. width: 48px;
  643. height: 48px;
  644. margin-right: 16px;
  645. }
  646. #meta #avatar img {
  647. width: 100%;
  648. }
  649. #channel-name.ytd-video-owner-renderer {
  650. font-size: 1.4rem !important;
  651. }
  652. #info.ytd-video-primary-info-renderer {
  653. height: 40px !important;
  654. }
  655. ytd-merch-shelf-renderer {
  656. background-color: transparent !important;
  657. }
  658. div#clarify-box.attached-message.style-scope.ytd-watch-flexy {
  659. margin-top: 0px !important;
  660. }
  661. ytd-clarification-renderer.style-scope.ytd-item-section-renderer, ytd-clarification-renderer.style-scope.ytd-watch-flexy {
  662. border: 1px solid !important;
  663. border-color: #0000001a !important;
  664. border-radius: 0px !important;
  665. }
  666. yt-formatted-string.description.style-scope.ytd-clarification-renderer {
  667. font-size: 1.4rem !important;
  668. }
  669. div.content-title.style-scope.ytd-clarification-renderer {
  670. padding-bottom: 4px !important;
  671. }
  672. ytd-watch-flexy[rounded-player-large]:not([fullscreen]):not([theater]) #ytd-player.ytd-watch-flexy {
  673. border-radius: 0px !important;
  674. }
  675. ytd-rich-metadata-renderer[rounded] {
  676. border-radius: 0px !important;
  677. }
  678. ytd-live-chat-frame[rounded-container], ytd-live-chat-frame[rounded-container] #show-hide-button.ytd-live-chat-frame ytd-toggle-button-renderer.ytd-live-chat-frame, iframe.style-scope.ytd-live-chat-frame {
  679. border-radius: 0px !important;
  680. }
  681. ytd-toggle-button-renderer.style-scope.ytd-live-chat-frame, yt-live-chat-header-renderer.style-scope.yt-live-chat-renderer {
  682. background: var(--yt-spec-brand-background-solid) !important;
  683. }
  684. 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 {
  685. padding-top: 4px !important;
  686. padding-bottom: 4px !important;
  687. }
  688. ytd-playlist-panel-renderer[modern-panels]:not([within-miniplayer]) #container.ytd-playlist-panel-renderer, ytd-tvfilm-offer-module-renderer[modern-panels], ytd-donation-shelf-renderer.style-scope.ytd-watch-flexy {
  689. border-radius: 0px !important;
  690. }
  691. ytd-playlist-panel-renderer[modern-panels]:not([hide-header-text]) .title.ytd-playlist-panel-renderer {
  692. font-family: Roboto !important;
  693. font-size: 1.4rem !important;
  694. line-height: 2rem !important;
  695. font-weight: 500 !important;
  696. }
  697. ytd-tvfilm-offer-module-renderer[modern-panels] #header.ytd-tvfilm-offer-module-renderer {
  698. border-radius: 0px !important;
  699. font-family: Roboto !important;
  700. font-size: 1.6rem !important;
  701. line-height: 2.2rem !important;
  702. font-weight: 400 !important;
  703. }
  704. ytd-donation-shelf-renderer[modern-panels] #header-text.ytd-donation-shelf-renderer {
  705. font-family: Roboto !important;
  706. font-size: 1.6rem !important;
  707. font-weight: 500 !important;
  708. }
  709. ytd-channel-video-player-renderer[rounded] #player.ytd-channel-video-player-renderer {
  710. border-radius: 0px !important;
  711. }
  712. ytd-universal-watch-card-renderer[rounded] #header.ytd-universal-watch-card-renderer, ytd-universal-watch-card-renderer[rounded] #hero.ytd-universal-watch-card-renderer {
  713. border-radius: 0px !important;
  714. }
  715. /* Remove rounded corners from the video player (Thanks to oldbutgoldyt for the code) */
  716. .ytp-ad-player-overlay-flyout-cta-rounded {
  717. border-radius: 2px !important;
  718. }
  719.  
  720. .ytp-flyout-cta .ytp-flyout-cta-action-button.ytp-flyout-cta-action-button-rounded {
  721. font-family: Arial !important;
  722. background: #167ac6 !important;
  723. border: solid 1px transparent !important;
  724. border-color: #167ac6 !important;
  725. border-radius: 2px !important;
  726. box-shadow: 0 1px 0 rgba(0,0,0,.05) !important;
  727. font-size: 11px !important;
  728. font-weight: 500 !important;
  729. height: 28px !important;
  730. margin: 0 8px 0 0 !important;
  731. max-width: 140px !important;
  732. padding: 0 10px !important;
  733. }
  734.  
  735. .ytp-ad-action-interstitial-action-button.ytp-ad-action-interstitial-action-button-rounded {
  736. background-color: #167ac6 !important;
  737. border: none !important;
  738. border-radius: 2px;
  739. font-family: Roboto !important;
  740. font-size: 23px !important;
  741. height: 46px !important;
  742. line-height: 46px !important;
  743. min-width: 164px !important;
  744. padding: 0 20px !important;
  745. }
  746.  
  747. .ytp-settings-menu {
  748. border-radius: 2px !important;
  749. }
  750.  
  751. .ytp-sb-subscribe {
  752. border-radius: 2px !important;
  753. background-color: #f00 !important;
  754. color: #fff !important;
  755. text-transform: uppercase !important;
  756. }
  757.  
  758. .ytp-sb-unsubscribe {
  759. border-radius: 2px !important;
  760. background-color: #eee !important;
  761. color: #606060 !important;
  762. text-transform: uppercase !important;
  763. }
  764.  
  765. .ytp-sb-subscribe.ytp-sb-disabled {
  766. background-color: #f3908b !important;
  767. }
  768.  
  769. .branding-context-container-inner.ytp-rounded-branding-context {
  770. border-radius: 2px !important;
  771. }
  772.  
  773. .ytp-tooltip.ytp-rounded-tooltip:not(.ytp-preview) .ytp-tooltip-text {
  774. border-radius: 2px !important;
  775. }
  776.  
  777. .ytp-autonav-endscreen-upnext-button.ytp-autonav-endscreen-upnext-button-rounded {
  778. border-radius: 2px !important;
  779. }
  780.  
  781. .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 {
  782. border-radius: 0 !important;
  783. }
  784.  
  785. .ytp-videowall-still-image {
  786. border-radius: 0 !important;
  787. }
  788.  
  789. div.iv-card.iv-card-video.ytp-rounded-info {
  790. border-radius: 0 !important;
  791. }
  792.  
  793. div.iv-card.iv-card-playlist.ytp-rounded-info {
  794. border-radius: 0 !important;
  795. }
  796.  
  797. div.iv-card.iv-card-channel.ytp-rounded-info {
  798. border-radius: 0 !important;
  799. }
  800.  
  801. div.iv-card.ytp-rounded-info {
  802. border-radius: 0 !important;
  803. }
  804.  
  805. .ytp-tooltip.ytp-rounded-tooltip.ytp-text-detail.ytp-preview, .ytp-tooltip.ytp-rounded-tooltip.ytp-text-detail.ytp-preview .ytp-tooltip-bg {
  806. border-radius: 2px !important;
  807. }
  808.  
  809. .ytp-ce-video.ytp-ce-medium-round, .ytp-ce-playlist.ytp-ce-medium-round, .ytp-ce-medium-round .ytp-ce-expanding-overlay-background {
  810. border-radius: 0 !important;
  811. }
  812.  
  813. .ytp-autonav-endscreen-upnext-thumbnail {
  814. border-radius: 0 !important;
  815. }
  816.  
  817. @font-face {
  818. font-family: no-parens;
  819. src: url("data:application/x-font-woff;base64,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");;
  820. unicode-range: U+0028, U+0029;
  821. }
  822.  
  823. span.ytp-menu-label-secondary {
  824. font-family: "no-parens", "Roboto", sans-serif;
  825. }
  826.  
  827. .ytp-swatch-color-white {
  828. color: #f00 !important;
  829. }
  830.  
  831. .iv-card {
  832. border-radius: 0 !important;
  833. }
  834.  
  835. .iv-branding .branding-context-container-inner {
  836. border-radius: 2px !important;
  837. }
  838.  
  839. .ytp-offline-slate-bar {
  840. border-radius: 2px !important;
  841. }
  842.  
  843. .ytp-offline-slate-button {
  844. border-radius: 2px !important;
  845. }
  846.  
  847. .ytp-ce-video.ytp-ce-large-round, .ytp-ce-playlist.ytp-ce-large-round, .ytp-ce-large-round .ytp-ce-expanding-overlay-background {
  848. border-radius: 0 !important;
  849. }
  850.  
  851. .ytp-flyout-cta .ytp-flyout-cta-icon.ytp-flyout-cta-icon-rounded {
  852. border-radius: 0 !important;
  853. }
  854.  
  855. .ytp-player-minimized .html5-main-video, .ytp-player-minimized .ytp-miniplayer-scrim, .ytp-player-minimized.html5-video-player {
  856. border-radius: 0 !important;
  857. }
  858.  
  859. ytd-miniplayer #player-container.ytd-miniplayer, ytd-miniplayer #video-container.ytd-miniplayer .video.ytd-miniplayer, ytd-miniplayer #card.ytd-miniplayer, ytd-miniplayer {
  860. border-radius: 0 !important;
  861. }
  862.  
  863. ytd-channel-video-player-renderer[rounded] #player.ytd-channel-video-player-renderer {
  864. border-radius: 0 !important;
  865. }
  866.  
  867. .ytp-small-mode .ytp-chrome-bottom {
  868. height: 36px !important;
  869. }
  870.  
  871. #movie_player > div.ytp-promotooltip-wrapper > div.ytp-promotooltip-container {
  872. border-radius: 2px !important;
  873. }
  874.  
  875. .ytp-chrome-controls .ytp-jump-button {
  876. display: none !important;
  877. }
  878.  
  879. /* Subscribe button fixes + Old compact channel header UI */
  880. #buttons.ytd-c4-tabbed-header-renderer {
  881. flex-direction: row-reverse !important;
  882. }
  883. yt-button-shape.style-scope.ytd-subscribe-button-renderer {
  884. display: flex !important;
  885. }
  886. #subscribe-button ytd-subscribe-button-renderer button {
  887. height: 37px !important;
  888. letter-spacing: 0.5px !important;
  889. border-radius: 2px !important;
  890. text-transform: uppercase !important;
  891. }
  892. .yt-spec-button-shape-next--mono.yt-spec-button-shape-next--filled {
  893. color: #fff !important;
  894. background: var(--yt-spec-brand-button-background) !important;
  895. border-radius: 2px !important;
  896. text-transform: uppercase !important;
  897. letter-spacing: 0.5px !important;
  898. }
  899. 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 {
  900. height: 37px !important;
  901. letter-spacing: 0.5px !important;
  902. border-radius: 2px !important;
  903. text-transform: uppercase !important;
  904. }
  905. #subscribe-button ytd-subscribe-button-renderer button.yt-spec-button-shape-next--tonal {
  906. background-color: var(--yt-spec-badge-chip-background) !important;
  907. color: var(--yt-spec-text-secondary) !important;
  908. }
  909. 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 {
  910. background-color: var(--yt-spec-badge-chip-background) !important;
  911. color: var(--yt-spec-text-secondary) !important;
  912. height: 25px !important;
  913. letter-spacing: 0.5px !important;
  914. border-radius: 2px !important;
  915. text-transform: uppercase !important;
  916. }
  917. 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 {
  918. background-color: transparent !important;
  919. border-radius: 16px !important;
  920. padding-left: 14px !important;
  921. padding-right: 2px !important;
  922. margin-left: 4px !important;
  923. }
  924. 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, 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 {
  925. display: none !important;
  926. }
  927. 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 {
  928. border-radius: 100px !important;
  929. width: 37px !important;
  930. }
  931. yt-smartimation.ytd-subscribe-button-renderer {
  932. display: flex !important;
  933. }
  934.  
  935. ytd-channel-tagline-renderer {
  936. display: none !important;
  937. }
  938.  
  939. #avatar.ytd-c4-tabbed-header-renderer {
  940. width: 80px !important;
  941. height: 80px !important;
  942. margin: 0 24px 0 0 !important;
  943. flex: none !important;
  944. overflow: hidden !important;
  945. }
  946.  
  947. #avatar-editor.ytd-c4-tabbed-header-renderer {
  948. --ytd-channel-avatar-editor-size: 80px !important;
  949. }
  950.  
  951. #channel-name.ytd-c4-tabbed-header-renderer {
  952. margin-bottom: 0 !important;
  953. }
  954.  
  955. #channel-header-container.ytd-c4-tabbed-header-renderer {
  956. padding-top: 0 !important;
  957. align-items: center !important;
  958. }
  959.  
  960. #inner-header-container.ytd-c4-tabbed-header-renderer {
  961. margin-top: 0 !important;
  962. align-items: center !important;
  963. }
  964.  
  965. yt-formatted-string#channel-handle.style-scope.ytd-c4-tabbed-header-renderer {
  966. display: none !important;
  967. }
  968.  
  969. #videos-count {
  970. display: none !important;
  971. }
  972.  
  973. .meta-item.ytd-c4-tabbed-header-renderer {
  974. display: block !important;
  975. }
  976. div#channel-header-links.style-scope.ytd-c4-tabbed-header-renderer {
  977. display: none !important;
  978. }
  979.  
  980. /* Other fixes to be temporary (new update as of August 2023) */
  981. div.page-header-banner.style-scope.ytd-c4-tabbed-header-renderer {
  982. margin-left: 0px !important;
  983. margin-right: 0px !important;
  984. }
  985.  
  986. ytd-c4-tabbed-header-renderer[use-page-header-style] .page-header-banner.ytd-c4-tabbed-header-renderer {
  987. border-radius: 0px !important;
  988. }
  989.  
  990. ytd-c4-tabbed-header-renderer[use-page-header-style] #meta.ytd-c4-tabbed-header-renderer {
  991. width: auto !important;
  992. }
  993. /* Remove Shorts, Trending, Podcasts and Shopping in the guide menus + Other elements to be fixed and removed */
  994. #endpoint.yt-simple-endpoint.ytd-guide-entry-renderer.style-scope[title="Shorts"] {
  995. display: none !important;
  996. }
  997. #endpoint.yt-simple-endpoint.ytd-mini-guide-entry-renderer.style-scope[title="Shorts"] {
  998. display: none !important;
  999. }
  1000. #endpoint.yt-simple-endpoint.ytd-guide-entry-renderer.style-scope[title="Trending"] {
  1001. display: none !important;
  1002. }
  1003. #endpoint.yt-simple-endpoint.ytd-guide-entry-renderer.style-scope[title="Podcasts"] {
  1004. display: none !important;
  1005. }
  1006. ytd-guide-entry-renderer > a[href*="/channel/UCkYQyvc_i9hXEo4xic9Hh2g"] {
  1007. display: none !important;
  1008. }
  1009.  
  1010. .yt-tab-shape-wiz {
  1011. padding: 0 32px !important;
  1012. margin-right: 0 !important;
  1013. }
  1014. .yt-tab-shape-wiz__tab {
  1015. font-size: 14px !important;
  1016. font-weight: 500 !important;
  1017. letter-spacing: var(--ytd-tab-system-letter-spacing) !important;
  1018. text-transform: uppercase !important;
  1019. }
  1020. .yt-tab-group-shape-wiz__slider {
  1021. display: none !important;
  1022. }
  1023. .yt-tab-shape-wiz__tab-bar {
  1024. display: none !important;
  1025. }
  1026. yt-formatted-string.style-scope.yt-chip-cloud-chip-renderer {
  1027. font-weight: 400 !important;
  1028. }
  1029. span.style-scope.ytd-rich-shelf-renderer {
  1030. font-weight: 400 !important;
  1031. }
  1032. span.style-scope.ytd-shelf-renderer {
  1033. font-size: 1.6rem !important;
  1034. font-weight: 500 !important;
  1035. }
  1036. .count-text.ytd-comments-header-renderer {
  1037. font-size: 1.6rem !important;
  1038. line-height: 2.2rem !important;
  1039. font-weight: 400 !important;
  1040. }
  1041.  
  1042. ytd-reel-shelf-renderer.style-scope.ytd-item-section-renderer, ytd-reel-shelf-renderer.ytd-structured-description-content-renderer {
  1043. display: none !important;
  1044. }
  1045. ytd-video-description-infocards-section-renderer.style-scope.ytd-structured-description-content-renderer > #header.ytd-video-description-infocards-section-renderer, ytd-video-description-infocards-section-renderer.style-scope.ytd-structured-description-content-renderer > #action-buttons.ytd-video-description-infocards-section-renderer {
  1046. display: none !important;
  1047. }
  1048. button.ytp-button.ytp-jump-button.ytp-jump-button-enabled {
  1049. display: none !important;
  1050. }
  1051. ytd-player#ytd-player.style-scope.ytd-watch-flexy > div#container.style-scope.ytd-player > .html5-video-player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > a.ytp-next-button.ytp-button {
  1052. display: block !important;
  1053. }
  1054. div#chip-bar.style-scope.ytd-search-header-renderer > yt-chip-cloud-renderer.style-scope.ytd-search-header-renderer > div#container.style-scope.yt-chip-cloud-renderer {
  1055. display: none !important;
  1056. }`
  1057. document.head.appendChild(styles);
  1058. }
  1059. })();
  1060.  
  1061. function $(q) {
  1062. return document.querySelector(q);
  1063. }
  1064.  
  1065. addEventListener('yt-page-data-updated', function() {
  1066. if(!location.pathname.startsWith('/watch')) return;
  1067.  
  1068. var lds = $('ytd-video-primary-info-renderer div#top-level-buttons-computed');
  1069. var like = $('ytd-video-primary-info-renderer div#segmented-like-button > ytd-toggle-button-renderer');
  1070. var share = $('ytd-video-primary-info-renderer div#top-level-buttons-computed > ytd-segmented-like-dislike-button-renderer + ytd-button-renderer');
  1071.  
  1072. lds.insertBefore(like, share);
  1073.  
  1074. like.setAttribute('class', like.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button'));
  1075. like.removeAttribute('is-paper-button-with-icon');
  1076. like.removeAttribute('is-paper-button');
  1077. like.setAttribute('style-action-button', '');
  1078. like.setAttribute('is-icon-button', '');
  1079. like.querySelector('a').insertBefore(like.querySelector('yt-formatted-string'), like.querySelector('tp-yt-paper-tooltip'));
  1080. try { like.querySelector('paper-ripple').remove(); } catch(e) {}
  1081. var paper = like.querySelector('tp-yt-paper-button');
  1082. paper.removeAttribute('style-target');
  1083. paper.removeAttribute('animated');
  1084. paper.removeAttribute('elevation');
  1085. like.querySelector('a').insertBefore(paper.querySelector('yt-icon'), like.querySelector('yt-formatted-string'));
  1086. paper.outerHTML = paper.outerHTML.replace('<tp-yt-paper-button ', '<yt-icon-button ').replace('</tp-yt-paper-button>', '</yt-icon-button>');
  1087. paper = like.querySelector('yt-icon-button');
  1088. paper.querySelector('button#button').appendChild(like.querySelector('yt-icon'));
  1089.  
  1090. var dislike = $('ytd-video-primary-info-renderer div#segmented-dislike-button > ytd-toggle-button-renderer');
  1091. lds.insertBefore(dislike, share);
  1092. $('ytd-video-primary-info-renderer ytd-segmented-like-dislike-button-renderer').remove();
  1093. dislike.setAttribute('class', dislike.getAttribute('class').replace('ytd-segmented-like-dislike-button-renderer', 'ytd-menu-renderer force-icon-button'));
  1094. dislike.removeAttribute('has-no-text');
  1095. dislike.setAttribute('style-action-button', '');
  1096. var dlabel = document.createElement('yt-formatted-stringx');
  1097. dlabel.setAttribute('id', 'text');
  1098. if(dislike.getAttribute('class').includes('style-default-active'))
  1099. dlabel.setAttribute('class', dlabel.getAttribute('class').replace('style-default', 'style-default-active'));
  1100. dislike.querySelector('a').insertBefore(dlabel, dislike.querySelector('tp-yt-paper-tooltip'));
  1101.  
  1102. $('ytd-video-primary-info-renderer').removeAttribute('flex-menu-enabled');
  1103. });
  1104.  
  1105. ((__CONTEXT__) => {
  1106.  
  1107. // Purpose 1: Remove Obsolete Flags
  1108. // Purpose 2: Remove Flags bring no visual difference
  1109. // Purpose 3: Enable Flags bring performance boost
  1110.  
  1111. const DISABLE_CINEMATICS = false; // standard design
  1112. const NO_SerializedExperiment = true;
  1113. const KEEP_PLAYER_QUALITY_STICKY = true; // see https://gf.qytechs.cn/scripts/471033/
  1114. const DISABLE_serializedExperimentIds = true;
  1115. const DISABLE_serializedExperimentFlags = true;
  1116. const ENABLE_EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST = {
  1117. defaultValue: true, // performance boost
  1118. useExternal: () => typeof localStorage.EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST !== 'undefined',
  1119. externalValue: () => (+localStorage.EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST ? true : false)
  1120. };
  1121. const ENABLE_EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS = {
  1122. defaultValue: true, // not sure
  1123. useExternal: () => typeof localStorage.EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS !== 'undefined',
  1124. externalValue: () => (+localStorage.EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS ? true : false)
  1125. };
  1126. const ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH = {
  1127. defaultValue: true, // not sure
  1128. useExternal: () => typeof localStorage.ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH !== 'undefined',
  1129. externalValue: () => (+localStorage.ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH ? true : false)
  1130. };
  1131.  
  1132. const ALLOW_ALL_LIVE_CHATS_FLAGS = false;
  1133.  
  1134.  
  1135.  
  1136. // TBC
  1137. // kevlar_tuner_should_always_use_device_pixel_ratio
  1138. // kevlar_tuner_should_clamp_device_pixel_ratio
  1139. // kevlar_tuner_clamp_device_pixel_ratio
  1140. // kevlar_tuner_should_use_thumbnail_factor
  1141. // kevlar_tuner_thumbnail_factor
  1142. // kevlar_tuner_min_thumbnail_quality
  1143. // kevlar_tuner_max_thumbnail_quality
  1144.  
  1145. // kevlar_tuner_should_test_visibility_time_between_jobs
  1146. // kevlar_tuner_visibility_time_between_jobs_ms
  1147.  
  1148. // kevlar_tuner_default_comments_delay
  1149. // kevlar_tuner_run_default_comments_delay
  1150.  
  1151. let settled = null;
  1152. // cinematic feature is no longer an experimential feature.
  1153. // It has been officially implemented.
  1154. // To disable cinematics, the user shall use other userscripts or just turn off the option in the video options.
  1155.  
  1156. const getSettingValue = (fm) => fm.useExternal() ? fm.externalValue() : fm.defaultValue;
  1157.  
  1158. const win = this instanceof Window ? this : window;
  1159.  
  1160. // Create a unique key for the script and check if it is already running
  1161. const hkey_script = 'jmimcvowrlzl';
  1162. if (win[hkey_script]) throw new Error('Duplicated Userscript Calling'); // avoid duplicated scripting
  1163. win[hkey_script] = true;
  1164.  
  1165. /** @type {globalThis.PromiseConstructor} */
  1166. const Promise = ((async () => { })()).constructor;
  1167.  
  1168. let isMainWindow = false;
  1169. let mzFlagDetected = new Set();
  1170. let zPlayerKevlar = false;
  1171. try {
  1172. isMainWindow = window.document === window.top.document
  1173. } catch (e) { }
  1174.  
  1175. function fixSerializedExperiment(conf) {
  1176.  
  1177. if (DISABLE_serializedExperimentIds && typeof conf.serializedExperimentIds === 'string') {
  1178. let ids = conf.serializedExperimentIds.split(',');
  1179. let newIds = [];
  1180. for (const id of ids) {
  1181. let keep = false;
  1182. if (keep) {
  1183. newIds.push(id);
  1184. }
  1185. }
  1186. conf.serializedExperimentIds = newIds.join(',');
  1187. }
  1188.  
  1189. if (DISABLE_serializedExperimentFlags && typeof conf.serializedExperimentFlags === 'string') {
  1190. const fg = conf.serializedExperimentFlags;
  1191. const rx = /(^|&)(\w+)=([^=&|\s\{\}\[\]\(\)?]*)/g;
  1192. let res = [];
  1193. for (let m; m = rx.exec(fg);) {
  1194. let key = m[2];
  1195. let value = m[3];
  1196. let keep = false;
  1197. if (KEEP_PLAYER_QUALITY_STICKY) {
  1198. if (key === 'html5_exponential_memory_for_sticky' || key.startsWith('h5_expr_')) {
  1199. keep = true;
  1200. }
  1201. }
  1202. if (!DISABLE_CINEMATICS) {
  1203. if (key === 'web_cinematic_watch_settings') {
  1204. keep = true;
  1205. }
  1206. }
  1207. if (keep) res.push(`${key}=${value}`);
  1208. }
  1209. conf.serializedExperimentFlags = res.join('&');
  1210. }
  1211.  
  1212. }
  1213.  
  1214. const all_live_chat_flags = `live_chat_banner_expansion_fix
  1215. live_chat_enable_mod_view
  1216. live_chat_enable_qna_banner_overflow_menu_actions
  1217. live_chat_enable_qna_channel
  1218. live_chat_enable_send_button_in_slow_mode
  1219. live_chat_filter_emoji_suggestions
  1220. live_chat_increased_min_height
  1221. live_chat_over_playlist
  1222. live_chat_web_enable_command_handler
  1223. live_chat_web_use_emoji_manager_singleton
  1224. live_chat_whole_message_clickable`.trim().split(/\s+/)
  1225.  
  1226. const hLooper = ((fn) => {
  1227.  
  1228. let nativeFnLoaded = false;
  1229. let kc1 = 0;
  1230.  
  1231. const setIntervalW = setInterval;
  1232. const clearIntervalW = clearInterval;
  1233. let microDisconnectFn = null;
  1234. let fStopLooper = false;
  1235. const looperFn = () => {
  1236. if (fStopLooper) return;
  1237.  
  1238. let config_ = null;
  1239. let EXPERIMENT_FLAGS = null;
  1240. try {
  1241. config_ = yt.config_;
  1242. EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS
  1243. } catch (e) { }
  1244.  
  1245. if (EXPERIMENT_FLAGS) {
  1246.  
  1247. fn(EXPERIMENT_FLAGS, config_);
  1248.  
  1249. if (microDisconnectFn) {
  1250. let isYtLoaded = false;
  1251. try {
  1252. isYtLoaded = typeof ytcfg.set === 'function';
  1253. } catch (e) { }
  1254. if (isYtLoaded) {
  1255. microDisconnectFn();
  1256. }
  1257. }
  1258.  
  1259. }
  1260.  
  1261. let playerKevlar = null;
  1262.  
  1263. try {
  1264. playerKevlar = ytcfg.data_.WEB_PLAYER_CONTEXT_CONFIGS.WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH;
  1265. } catch (e) { }
  1266.  
  1267. if (playerKevlar && !zPlayerKevlar) {
  1268. zPlayerKevlar = true;
  1269.  
  1270. if (NO_SerializedExperiment && typeof playerKevlar.serializedExperimentFlags === 'string' && typeof playerKevlar.serializedExperimentIds === 'string') {
  1271. fixSerializedExperiment(playerKevlar);
  1272. }
  1273.  
  1274.  
  1275. }
  1276.  
  1277.  
  1278.  
  1279. };
  1280.  
  1281. const controller = {
  1282. start() {
  1283. kc1 = setIntervalW(looperFn, 1);
  1284. (async () => {
  1285. while (true && !nativeFnLoaded) {
  1286. looperFn();
  1287. if (fStopLooper) break;
  1288. await (new Promise(requestAnimationFrame));
  1289. }
  1290. })();
  1291. looperFn();
  1292. },
  1293. /**
  1294. *
  1295. * @param {Window} __CONTEXT__
  1296. */
  1297. setupForCleanContext(__CONTEXT__) {
  1298.  
  1299. const { requestAnimationFrame, setInterval, clearInterval, setTimeout, clearTimeout } = __CONTEXT__;
  1300.  
  1301. (async () => {
  1302. while (true) {
  1303. looperFn();
  1304. if (fStopLooper) break;
  1305. await (new Promise(requestAnimationFrame));
  1306. }
  1307. })();
  1308.  
  1309. let kc2 = setInterval(looperFn, 1);
  1310.  
  1311. const marcoDisconnectFn = () => {
  1312. if (fStopLooper) return;
  1313. Promise.resolve().then(() => {
  1314. if (kc1 || kc2) {
  1315. kc1 && clearIntervalW(kc1); kc1 = 0;
  1316. kc2 && clearInterval(kc2); kc2 = 0;
  1317. looperFn();
  1318. }
  1319. fStopLooper = true;
  1320. });
  1321. document.removeEventListener('yt-page-data-fetched', marcoDisconnectFn, false);
  1322. document.removeEventListener('yt-navigate-finish', marcoDisconnectFn, false);
  1323. document.removeEventListener('spfdone', marcoDisconnectFn, false);
  1324. };
  1325. document.addEventListener('yt-page-data-fetched', marcoDisconnectFn, false);
  1326. document.addEventListener('yt-navigate-finish', marcoDisconnectFn, false);
  1327. document.addEventListener('spfdone', marcoDisconnectFn, false);
  1328.  
  1329.  
  1330. function onReady() {
  1331. if (!fStopLooper) {
  1332. setTimeout(() => {
  1333. !fStopLooper && marcoDisconnectFn();
  1334. }, 1000);
  1335. }
  1336. }
  1337.  
  1338. Promise.resolve().then(() => {
  1339. if (document.readyState !== 'loading') {
  1340. onReady();
  1341. } else {
  1342. window.addEventListener("DOMContentLoaded", onReady, false);
  1343. }
  1344. });
  1345.  
  1346. nativeFnLoaded = true;
  1347.  
  1348. microDisconnectFn = () => Promise.resolve(marcoDisconnectFn).then(setTimeout);
  1349.  
  1350. }
  1351. };
  1352.  
  1353. return controller;
  1354. })((EXPERIMENT_FLAGS, config_) => {
  1355.  
  1356. if (!EXPERIMENT_FLAGS) return;
  1357.  
  1358. if (!settled) {
  1359. settled = {
  1360. use_maintain_stable_list: getSettingValue(ENABLE_EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST),
  1361. use_maintain_reuse_components: getSettingValue(ENABLE_EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS),
  1362. use_defer_detach: getSettingValue(ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH),
  1363. }
  1364. if (settled.use_maintain_stable_list) Promise.resolve().then(() => console.debug("use_maintain_stable_list"));
  1365. if (settled.use_maintain_reuse_components) Promise.resolve().then(() => console.debug("use_maintain_reuse_components"));
  1366. if (settled.use_defer_detach) Promise.resolve().then(() => console.debug("use_defer_detach"));
  1367. }
  1368. const { use_maintain_stable_list, use_maintain_reuse_components, use_defer_detach } = settled;
  1369.  
  1370. const setFalseFn = (EXPERIMENT_FLAGS) => {
  1371.  
  1372.  
  1373. for (const [key, value] of Object.entries(EXPERIMENT_FLAGS)) {
  1374.  
  1375.  
  1376. if (value === true) {
  1377. // if(key.indexOf('modern')>=0 || key.indexOf('enable')>=0 || key.indexOf('theme')>=0 || key.indexOf('skip')>=0 || key.indexOf('ui')>=0 || key.indexOf('observer')>=0 || key.indexOf('polymer')>=0 )continue;
  1378.  
  1379. if (mzFlagDetected.has(key)) continue;
  1380. mzFlagDetected.add(key);
  1381. const kl = key.length;
  1382. const kl7 = kl % 7;
  1383. const kl5 = kl % 5;
  1384. const kl3 = kl % 3;
  1385. const kl2 = kl % 2;
  1386.  
  1387. if (!DISABLE_CINEMATICS) {
  1388.  
  1389.  
  1390. if (key === 'kevlar_measure_ambient_mode_idle' || key === 'kevlar_watch_cinematics_invisible' || key === 'web_cinematic_theater_mode' || key === 'web_cinematic_fullscreen') {
  1391. continue;
  1392. }
  1393.  
  1394.  
  1395. let cineKey = key === 'enable_cinematic_blur_desktop_loading' ? 1
  1396. : key === 'kevlar_watch_cinematics' ? 2
  1397. : key === 'web_cinematic_masthead' ? 3
  1398. : key === 'web_watch_cinematics_preferred_reduced_motion_default_disabled' ? 4 : 0;
  1399. if (cineKey > 0) {
  1400. return;
  1401. }
  1402. }
  1403.  
  1404.  
  1405. if (key.indexOf('kevlar_') >= 0) {
  1406. if (kl7 === 2 && kl5 === 2 && kl2 === 1 && kl3 === 1) {
  1407. if (key === 'kevlar_rendererstamper_event_listener') continue; // https://github.com/cyfung1031/userscript-supports/issues/11
  1408. }
  1409.  
  1410. if (kl === 22) {
  1411. // kevlar_enable_up_arrow - no use
  1412. // kevlar_help_use_locale - might use
  1413. // kevlar_refresh_gesture - might use
  1414. // kevlar_smart_downloads - might use
  1415. // kevlar_thumbnail_fluid
  1416. // kevlar_ytb_live_badges
  1417.  
  1418. if (key === 'kevlar_ytb_live_badges') continue;
  1419.  
  1420. }
  1421.  
  1422.  
  1423. if (!use_maintain_stable_list) {
  1424.  
  1425. if (key === 'kevlar_tuner_should_test_maintain_stable_list') continue;
  1426. if (key === 'kevlar_should_maintain_stable_list') continue;
  1427. if (key === 'kevlar_tuner_should_maintain_stable_list') continue; // fallback
  1428. }
  1429. if (!use_maintain_reuse_components) {
  1430.  
  1431. if (key === 'kevlar_tuner_should_test_reuse_components') continue;
  1432. if (key === 'kevlar_tuner_should_reuse_components') continue;
  1433. if (key === 'kevlar_should_reuse_components') continue; // fallback
  1434. }
  1435.  
  1436. if (kl7 === 5 && kl5 == 4 && kl2 === 1 && kl3 === 1) {
  1437. if (key === 'kevlar_system_icons') continue;
  1438. }
  1439.  
  1440. // if(key==='kevlar_prefetch_data_augments_network_data') continue;
  1441.  
  1442. if (kl7 === 6 && kl5 === 0 && kl3 === 2 && kl2 === 0) { // home page / watch page icons
  1443.  
  1444. if (key === 'kevlar_three_dot_ink') continue;
  1445. if (key === 'kevlar_use_wil_icons') continue;
  1446. if (key === 'kevlar_home_skeleton') continue;
  1447. }
  1448.  
  1449. if (kl7 === 4 && kl5 === 0 && kl3 === 1 && kl2 === 1) {
  1450.  
  1451. if (key === 'kevlar_fluid_touch_scroll') continue;
  1452. if (key === 'kevlar_watch_color_update') continue;
  1453. if (key === 'kevlar_use_vimio_behavior') continue; // home page - channel icon
  1454.  
  1455. }
  1456.  
  1457. if (kl3 === 2 && kl5 === 4 && kl2 < 2) { // collapsed meta
  1458. // no teaser, use latest collapsed meta design
  1459. if (key === 'kevlar_structured_description_content_inline') continue;
  1460. if (key === 'kevlar_watch_metadata_refresh') continue;
  1461.  
  1462. }
  1463.  
  1464.  
  1465. if (kl5 === 3 && kl3 === 1 && kl2 === 0) {
  1466.  
  1467. if (key === 'kevlar_watch_js_panel_height') continue; // affect Tabview Youtube
  1468.  
  1469.  
  1470. }
  1471.  
  1472.  
  1473. } else {
  1474.  
  1475.  
  1476. if (ALLOW_ALL_LIVE_CHATS_FLAGS && all_live_chat_flags.indexOf(key) >= 0) {
  1477. continue;
  1478. /*
  1479. *
  1480. live_chat_banner_expansion_fix
  1481. live_chat_enable_mod_view
  1482. live_chat_enable_qna_banner_overflow_menu_actions
  1483. live_chat_enable_qna_channel
  1484. live_chat_enable_send_button_in_slow_mode
  1485. live_chat_filter_emoji_suggestions
  1486. live_chat_increased_min_height
  1487. live_chat_over_playlist
  1488. live_chat_web_enable_command_handler
  1489. live_chat_web_use_emoji_manager_singleton
  1490. live_chat_whole_message_clickable
  1491.  
  1492. */
  1493. }
  1494.  
  1495. if (kl7 === 1 && kl5 === 1 && kl2 === 0 && kl3 === 0) {
  1496. if (key === 'live_chat_web_enable_command_handler') continue;
  1497.  
  1498. }
  1499. if (kl7 === 1 && kl5 === 4 && kl3 === 2 && kl2 === 1) {
  1500.  
  1501. if (key === 'shorts_desktop_watch_while_p2') continue;
  1502. }
  1503.  
  1504. if (key === 'web_button_rework') continue;
  1505.  
  1506. if (kl7 === 3 && kl5 == 1 && kl2 === 1 && kl3 === 1) {
  1507. if (key === 'web_darker_dark_theme_live_chat') continue;
  1508. }
  1509.  
  1510. if (kl5 === 1 && kl3 === 0 && kl2 === 1 && kl7 === 0) {
  1511. if (key === 'web_darker_dark_theme') return; // it also affect cinemtaics
  1512. }
  1513.  
  1514. if (kl3 === 0 && kl5 === 2) { // modern menu
  1515.  
  1516. if (key === 'web_button_rework_with_live') continue;
  1517. if (key === 'web_fix_fine_scrubbing_drag') continue;
  1518. }
  1519.  
  1520.  
  1521. if (kl3 === 1 && kl5 === 4 && kl2 === 1) { // full screen -buggy
  1522. if (key === 'external_fullscreen') continue;
  1523. }
  1524.  
  1525. if (kl3 === 0 && kl5 === 3 && kl2 === 0) { // minimize menu
  1526. if (key === 'web_modern_buttons') continue;
  1527. if (key === 'web_modern_dialogs') continue;
  1528.  
  1529. }
  1530.  
  1531. if (kl3 === 1 && kl5 === 0 && kl7 === 5 && kl2 === 0) { // Tabview Youtube - multiline transcript
  1532. if (key === 'enable_mixed_direction_formatted_strings') continue;
  1533. }
  1534.  
  1535. }
  1536.  
  1537. // console.log(key)
  1538. EXPERIMENT_FLAGS[key] = false;
  1539. }
  1540. }
  1541.  
  1542. }
  1543.  
  1544. setFalseFn(EXPERIMENT_FLAGS);
  1545. if (config_.EXPERIMENTS_FORCED_FLAGS) setFalseFn(config_.EXPERIMENTS_FORCED_FLAGS);
  1546.  
  1547. EXPERIMENT_FLAGS.desktop_delay_player_resizing = false;
  1548. EXPERIMENT_FLAGS.web_animated_like = false;
  1549. EXPERIMENT_FLAGS.web_animated_like_lazy_load = false;
  1550.  
  1551. if (use_maintain_stable_list) {
  1552. EXPERIMENT_FLAGS.kevlar_tuner_should_test_maintain_stable_list = true;
  1553. EXPERIMENT_FLAGS.kevlar_should_maintain_stable_list = true;
  1554. EXPERIMENT_FLAGS.kevlar_tuner_should_maintain_stable_list = true; // fallback
  1555. }
  1556.  
  1557. if (use_maintain_reuse_components) {
  1558. EXPERIMENT_FLAGS.kevlar_tuner_should_test_reuse_components = true;
  1559. EXPERIMENT_FLAGS.kevlar_tuner_should_reuse_components = true;
  1560. EXPERIMENT_FLAGS.kevlar_should_reuse_components = true; // fallback
  1561. }
  1562.  
  1563. if (use_defer_detach) {
  1564. EXPERIMENT_FLAGS.kevlar_tuner_should_defer_detach = true;
  1565. }
  1566.  
  1567. // EXPERIMENT_FLAGS.kevlar_prefetch_data_augments_network_data = true; // TBC
  1568. });
  1569.  
  1570. hLooper.start();
  1571.  
  1572.  
  1573. const cleanContext = async (win) => {
  1574. const waitFn = requestAnimationFrame; // shall have been binded to window
  1575. try {
  1576. let mx = 16; // MAX TRIAL
  1577. const frameId = 'vanillajs-iframe-v1'
  1578. let frame = document.getElementById(frameId);
  1579. let removeIframeFn = null;
  1580. if (!frame) {
  1581. frame = document.createElement('iframe');
  1582. frame.id = 'vanillajs-iframe-v1';
  1583. frame.sandbox = 'allow-same-origin'; // script cannot be run inside iframe but API can be obtained from iframe
  1584. let n = document.createElement('noscript'); // wrap into NOSCRPIT to avoid reflow (layouting)
  1585. n.appendChild(frame);
  1586. while (!document.documentElement && mx-- > 0) await new Promise(waitFn); // requestAnimationFrame here could get modified by YouTube engine
  1587. const root = document.documentElement;
  1588. root.appendChild(n); // throw error if root is null due to exceeding MAX TRIAL
  1589. removeIframeFn = (setTimeout) => {
  1590. const removeIframeOnDocumentReady = (e) => {
  1591. e && win.removeEventListener("DOMContentLoaded", removeIframeOnDocumentReady, false);
  1592. win = null;
  1593. setTimeout(() => {
  1594. n.remove();
  1595. n = null;
  1596. }, 200);
  1597. }
  1598. if (document.readyState !== 'loading') {
  1599. removeIframeOnDocumentReady();
  1600. } else {
  1601. win.addEventListener("DOMContentLoaded", removeIframeOnDocumentReady, false);
  1602. }
  1603. }
  1604. }
  1605. while (!frame.contentWindow && mx-- > 0) await new Promise(waitFn);
  1606. const fc = frame.contentWindow;
  1607. if (!fc) throw "window is not found."; // throw error if root is null due to exceeding MAX TRIAL
  1608. const { requestAnimationFrame, setInterval, setTimeout, clearInterval, clearTimeout } = fc;
  1609. const res = { requestAnimationFrame, setInterval, setTimeout, clearInterval, clearTimeout };
  1610. for (let k in res) res[k] = res[k].bind(win); // necessary
  1611. if (removeIframeFn) Promise.resolve(res.setTimeout).then(removeIframeFn);
  1612. return res;
  1613. } catch (e) {
  1614. console.warn(e);
  1615. return null;
  1616. }
  1617. };
  1618.  
  1619. cleanContext(win).then(__CONTEXT__ => {
  1620.  
  1621. const { requestAnimationFrame, setInterval, clearInterval, setTimeout, clearTimeout } = __CONTEXT__;
  1622.  
  1623. hLooper.setupForCleanContext(__CONTEXT__)
  1624.  
  1625. });
  1626.  
  1627.  
  1628. if (isMainWindow) {
  1629.  
  1630. console.groupCollapsed(
  1631. "%cYouTube EXPERIMENT_FLAGS Tamer",
  1632. "background-color: #EDE43B ; color: #000 ; font-weight: bold ; padding: 4px ;"
  1633. );
  1634.  
  1635. console.log("Script is loaded.");
  1636. console.log("This might affect the new features when YouTube rolls them out to general users.");
  1637. console.log("If you found any issue in using YouTube, please disable this script to check whether the issue is due to this script or not.");
  1638.  
  1639. console.groupEnd();
  1640.  
  1641. }
  1642.  
  1643. })(null);
  1644.  
  1645. Object.defineProperties(document, { 'hidden': {value: false}, 'webkitHidden': {value: false}, 'visibilityState': {value: 'visible'}, 'webkitVisibilityState': {value: 'visible'} });
  1646.  
  1647. setInterval(function(){
  1648. document.dispatchEvent( new KeyboardEvent( 'keyup', { bubbles: true, cancelable: true, keyCode: 143, which: 143 } ) );
  1649. }, 60000);
  1650.  
  1651. // Extra adjustments to be needed such as old comment replies UI
  1652. var observingComments = false;
  1653. var hl;
  1654.  
  1655. const cfconfig = {
  1656. unicodeEmojis: false
  1657. };
  1658.  
  1659. const cfi18n = {
  1660. en: {
  1661. viewSingular: "View reply",
  1662. viewMulti: "View %s replies",
  1663. viewSingularOwner: "View reply from %s",
  1664. viewMultiOwner: "View %s replies from %s and others",
  1665. hideSingular: "Hide reply",
  1666. hideMulti: "Hide replies",
  1667. replyCountIsolator: /( REPLIES)|( REPLY)/
  1668. }
  1669. }
  1670.  
  1671. /**
  1672. * Get a string from the localization strings.
  1673. *
  1674. * @param {string} string Name of string to get
  1675. * @param {string} hl Language to use.
  1676. * @param {...array} args Strings.
  1677. * @returns {string}
  1678. */
  1679. function getString(string, hl = "en", ...args) {
  1680. if (!string) return;
  1681. var str;
  1682. if (cfi18n[hl]) {
  1683. if (cfi18n[hl][string]) {
  1684. str = cfi18n[hl][string];
  1685. } else if (cfi18n.en[string]) {
  1686. str = cfi18n.en[string];
  1687. } else {
  1688. return;
  1689. }
  1690. } else {
  1691. if (cfi18n.en[string]) str = cfi18n.en[string];
  1692. }
  1693.  
  1694. for (var i = 0; i < args.length; i++) {
  1695. str = str.replace(/%s/, args[i]);
  1696. }
  1697.  
  1698. return str;
  1699. }
  1700.  
  1701. /**
  1702. * Wait for a selector to exist
  1703. *
  1704. * @param {string} selector CSS Selector
  1705. * @param {HTMLElement} base Element to search inside
  1706. * @returns {Node}
  1707. */
  1708. async function waitForElm(selector, base = document) {
  1709. if (!selector) return null;
  1710. if (!base.querySelector) return null;
  1711. while (base.querySelector(selector) == null) {
  1712. await new Promise(r => requestAnimationFrame(r));
  1713. };
  1714. return base.querySelector(selector);
  1715. };
  1716.  
  1717. /**
  1718. * Is a value in an array?
  1719. *
  1720. * @param {*} needle Value to search
  1721. * @param {Array} haystack Array to search
  1722. * @returns {boolean}
  1723. */
  1724. function inArray(needle, haystack) {
  1725. for (var i = 0; i < haystack.length; i++) {
  1726. if (needle == haystack[i]) return true;
  1727. }
  1728. return false;
  1729. }
  1730.  
  1731. /**
  1732. * Get text of an InnerTube string.
  1733. *
  1734. * @param {object} object String container.
  1735. */
  1736. function getSimpleString(object) {
  1737. if (object.simpleText) return object.simpleText;
  1738.  
  1739. var str = "";
  1740. for (var i = 0; i < object.runs.length; i++) {
  1741. str += object.runs[i].text;
  1742. }
  1743. return str;
  1744. }
  1745.  
  1746. /**
  1747. * Format a commentRenderer.
  1748. *
  1749. * @param {object} comment commentRenderer from InnerTube.
  1750. */
  1751. function formatComment(comment) {
  1752. if (cfconfig.unicodeEmojis) {
  1753. var runs;
  1754. try {
  1755. runs = comment.contentText.runs
  1756. for (var i = 0; i < runs.length; i++) {
  1757. delete runs[i].emoji;
  1758. delete runs[i].loggingDirectives;
  1759. }
  1760. } catch(err) {}
  1761. }
  1762.  
  1763. return comment;
  1764. }
  1765.  
  1766. /**
  1767. * Format a commentThreadRenderer.
  1768. *
  1769. * @param {object} thread commentThreadRenderer from InnerTube.
  1770. */
  1771. async function formatCommentThread(thread) {
  1772. if (thread.comment.commentRenderer) {
  1773. thread.comment.commentRenderer = formatComment(thread.comment.commentRenderer);
  1774. }
  1775.  
  1776. var replies;
  1777. try {
  1778. replies = thread.replies.commentRepliesRenderer;
  1779. if (replies.viewRepliesIcon) {
  1780. replies.viewReplies.buttonRenderer.icon = replies.viewRepliesIcon.buttonRenderer.icon;
  1781. delete replies.viewRepliesIcon;
  1782. }
  1783.  
  1784. if (replies.hideRepliesIcon) {
  1785. replies.hideReplies.buttonRenderer.icon = replies.hideRepliesIcon.buttonRenderer.icon;
  1786. delete replies.hideRepliesIcon;
  1787. }
  1788.  
  1789. var creatorName;
  1790. try {
  1791. creatorName = replies.viewRepliesCreatorThumbnail.accessibility.accessibilityData.label;
  1792. delete replies.viewRepliesCreatorThumbnail;
  1793. } catch(err) {}
  1794.  
  1795. var replyCount = getSimpleString(replies.viewReplies.buttonRenderer.text);
  1796. replyCount = +replyCount.replace(getString("replyCountIsolator", hl), "");
  1797.  
  1798. var viewMultiString = creatorName ? "viewMultiOwner" : "viewMulti";
  1799. var viewSingleString = creatorName ? "viewSingularOwner" : "viewSingular";
  1800.  
  1801. replies.viewReplies.buttonRenderer.text = {
  1802. runs: [
  1803. {
  1804. text: (replyCount > 1) ? getString(viewMultiString, hl, replyCount, creatorName) : getString(viewSingleString, hl, creatorName)
  1805. }
  1806. ]
  1807. }
  1808.  
  1809. replies.hideReplies.buttonRenderer.text = {
  1810. runs: [
  1811. {
  1812. text: (replyCount > 1) ? getString("hideMulti", hl) : getString("hideSingular", hl)
  1813. }
  1814. ]
  1815. };
  1816. } catch(err) {}
  1817.  
  1818. return thread;
  1819. }
  1820.  
  1821. /**
  1822. * Force Polymer to refresh data of an element.
  1823. *
  1824. * @param {Node} element Element to refresh data of.
  1825. */
  1826. function refreshData(element) {
  1827. var clone = element.cloneNode();
  1828. clone.data = element.data;
  1829. // Let the script know we left our mark
  1830. // in a way that doesn't rely on classes
  1831. // because Polymer likes to cast comments
  1832. // into the void for later reuse
  1833. clone.data.fixedByCF = true;
  1834. for (var i in element.properties) {
  1835. clone[i] = element[i];
  1836. }
  1837. element.insertAdjacentElement("afterend", clone);
  1838. element.remove();
  1839. }
  1840.  
  1841. var commentObserver = new MutationObserver((list) => {
  1842. list.forEach(async (mutation) => {
  1843. if (mutation.addedNodes) {
  1844. for (var i = 0; i < mutation.addedNodes.length; i++) {
  1845. var elm = mutation.addedNodes[i];
  1846. if (elm.classList && elm.data && !elm.data.fixedByCF) {
  1847. if (elm.tagName == "YTD-COMMENT-THREAD-RENDERER") {
  1848. elm.data = await formatCommentThread(elm.data);
  1849. refreshData(elm);
  1850. } else if (elm.tagName == "YTD-COMMENT-RENDERER") {
  1851. if (!elm.classList.contains("ytd-comment-thread-renderer")) {
  1852. elm.data = formatComment(elm.data);
  1853. refreshData(elm);
  1854. }
  1855. }
  1856. }
  1857. }
  1858. }
  1859. });
  1860. });
  1861.  
  1862. document.addEventListener("yt-page-data-updated", async (e) => {
  1863. hl = yt.config_.HL;
  1864. commentObserver.observe(document.querySelector("ytd-app"), { childList: true, subtree: true });
  1865. });

QingJ © 2025

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