您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Re-adoption of Single Column Detection against video and browser sizes
// ==UserScript== // @name YouTube: Single Column Tamer // @namespace UserScripts // @match https://www.youtube.com/* // @grant none // @unwrap // @inject-into page // @version 0.1.8 // @author CY Fung // @description Re-adoption of Single Column Detection against video and browser sizes // @require https://cdn.jsdelivr.net/gh/cyfung1031/userscript-supports@8fac46500c5a916e6ed21149f6c25f8d1c56a6a3/library/ytZara.js // @require https://update.gf.qytechs.cn/scripts/475632/1361351/ytConfigHacks.js // @license MIT // ==/UserScript== (() => { const ENABLE_WHEN_CONTENT_OCCUPY_MORE_THAN = 0.2 // 20% or more of other content can be displayed in your browser // protait screen & vertical live let _isSingleColumnPreferred = false; let bypass = false; let videoRatio = null; let _forceTwoCols = 0; let cachedSCUsage = null; const insp = o => o ? (o.polymerController || o.inst || o || 0) : (o || 0); const Promise = (async () => { })().constructor; const createPipeline = () => { let pipelineMutex = Promise.resolve(); const pipelineExecution = fn => { return new Promise((resolve, reject) => { pipelineMutex = pipelineMutex.then(async () => { let res; try { res = await fn(); } catch (e) { console.log('error_F1', e); reject(e); } resolve(res); }).catch(console.warn); }); }; return pipelineExecution; }; let rafPromise = null; const rafFn = (typeof webkitRequestAnimationFrame !== 'undefined' ? webkitRequestAnimationFrame : requestAnimationFrame).bind(window); // eslint-disable-line no-undef, no-constant-condition const getRafPromise = () => rafPromise || (rafPromise = new Promise(resolve => { rafFn(hRes => { rafPromise = null; resolve(hRes); }); })); const getProto = (element) => { if (element) { const cnt = insp(element); return cnt.constructor.prototype || null; } return null; }; function toQueryForcedTwoCols(q) { if (q && typeof q === 'string') { q = q.replace('1000px', '200.2px'); q = q.replace('629px', '129.2px'); q = q.replace('657px', '157.2px'); q = q.replace('630px', '130.2px'); q = q.replace('1327px', '237.2px'); } return q; } function toQueryForcedOneCol(q) { if (q && typeof q === 'string') { q = q.replace('1000px', '998200.3px'); q = q.replace('629px', '998129.3px'); q = q.replace('657px', '998157.3px'); q = q.replace('630px', '998130.3px'); q = q.replace('1327px', '998237.3px'); } return q; } function getShouldSingleColumn() { if (typeof cachedSCUsage == 'boolean') return cachedSCUsage; const { clientHeight, clientWidth } = document.documentElement; if (clientHeight > clientWidth) { const referenceVideoHeight = clientWidth * videoRatio; const belowSpace = clientHeight - referenceVideoHeight; if (belowSpace > -1e-3 && belowSpace - ENABLE_WHEN_CONTENT_OCCUPY_MORE_THAN * clientHeight > -1e-3 && belowSpace > 65) { return (cachedSCUsage = true); } } return (cachedSCUsage = false); } /** @type {Set<WeakRef<Object>>} */ const querySet = new Set(); const protoFnQueryChanged = async () => { await customElements.whenDefined('iron-media-query'); const dummy = document.querySelector('iron-media-query') || document.createElement('iron-media-query'); const cProto = getProto(dummy); if (typeof cProto.queryChanged !== 'function') return; if (cProto.queryChanged71) return; if (cProto.queryChanged.length !== 0) return; cProto.queryChanged71 = cProto.queryChanged; cProto.queryChanged = function () { /** @type {string} */ let q = this.query; if (q) { if (!this.addedToSet53_) { this.addedToSet53_ = 1; querySet.add(new WeakRef(this)); } if (!bypass) { if (q.length > 3 && !q.includes('.')) { this.lastQuery53_ = q; } } if (this.lastQuery53_) { if (_isSingleColumnPreferred) { q = toQueryForcedOneCol(this.lastQuery53_); } else if (_forceTwoCols) { q = toQueryForcedTwoCols(this.lastQuery53_); } else { q = this.lastQuery53_; } } if (q !== this.query && typeof q === 'string' && q) { this.query = q; } } return this.queryChanged71(); } }; const createCSSElement = ()=>{ const cssElm = document.createElement('style'); cssElm.id = 'oh7T7lsvcHJQ'; document.head.appendChild(cssElm); cssElm.textContent = ` ytd-watch-flexy[flexy][is-two-columns_] { --ytd-watch-flexy-min-player-height-ss: 10px; } ytd-watch-flexy[flexy][is-two-columns_] #primary.ytd-watch-flexy { min-width: calc(var(--ytd-watch-flexy-min-player-height-ss)*1.7777777778); } ytd-watch-flexy[flexy][is-two-columns_]:not([is-four-three-to-sixteen-nine-video_]):not([is-extra-wide-video_]):not([full-bleed-player][full-bleed-no-max-width-columns]):not([fixed-panels]) #primary.ytd-watch-flexy { min-width: calc(var(--ytd-watch-flexy-min-player-height-ss)*1.7777777778); } `; return cssElm; } const protoFnRatioChanged = async () => { await customElements.whenDefined('ytd-watch-flexy'); const dummy = document.querySelector('ytd-watch-flexy') || document.createElement('ytd-watch-flexy'); const cProto = getProto(dummy); if (typeof cProto.videoHeightToWidthRatioChanged_ !== 'function') return; if (cProto.videoHeightToWidthRatioChanged23_) return; // if (cProto.videoHeightToWidthRatioChanged_.length !== 2) return; cProto.videoHeightToWidthRatioChanged23_ = cProto.videoHeightToWidthRatioChanged_; const ratioQueryFix24_ = () => { if (videoRatio > 1e-5) { } else return; let changeCSS = false; const changedSingleColumn = _isSingleColumnPreferred !== (_isSingleColumnPreferred = getShouldSingleColumn()); let action = 0; if (changedSingleColumn) { action |= 4; } if (!_isSingleColumnPreferred) { const isVerticalRatio = videoRatio > 1.6 && videoRatio < 2.7; if (isVerticalRatio && !_forceTwoCols) { changeCSS = true; _forceTwoCols = 1; action |= 1; } else if (!isVerticalRatio && _forceTwoCols) { changeCSS = true; _forceTwoCols = 0; action |= 2; } } if (action) { for (const p of querySet) { const qnt = p.deref(); if (!qnt || !qnt.lastQuery53_) continue; if (action & 4) { if (!qnt.q00 && !qnt.q02 && _isSingleColumnPreferred) { qnt.q00 = qnt.lastQuery53_; qnt.q02 = toQueryForcedOneCol(qnt.q00); } action |= 8; } if (action & 1) { if (!qnt.q00 && !qnt.q01) { qnt.q00 = qnt.lastQuery53_; qnt.q01 = toQueryForcedTwoCols(qnt.q00); } if (qnt.q00 && qnt.q01) { action |= 8; } } else if (action & 2) { if (qnt.q00 && qnt.q01) { action |= 8; } } } if (action & 8) { bypass = true; for (const p of querySet) { const qnt = p.deref(); if (qnt && qnt.lastQuery53_ && qnt.query) { qnt.queryChanged(); } } bypass = false; } } let cssElm = null; if (changeCSS) { cssElm = cssElm || document.querySelector('style#oh7T7lsvcHJQ') || createCSSElement(); } else { cssElm = cssElm || document.querySelector('style#oh7T7lsvcHJQ'); } if (cssElm) { if (_forceTwoCols && cssElm.disabled) cssElm.disabled = false; else if (!_forceTwoCols && !cssElm.disabled) cssElm.disabled = true; } }; const resizePipeline = createPipeline(); cProto.videoHeightToWidthRatioChanged_ = function () { try { cachedSCUsage = null; videoRatio = this.videoHeightToWidthRatio_; resizePipeline(ratioQueryFix24_); } catch (e) { } return this.videoHeightToWidthRatioChanged23_(...arguments); }; let rzid = 0; Window.prototype.addEventListener.call(window, 'resize', function () { cachedSCUsage = null; if (videoRatio > 1e-5) { } else return; if (rzid > 1e9) rzid = 9; const t = ++rzid; resizePipeline(async () => { if (t !== rzid) return; await getRafPromise(); if (t !== rzid) return; let k = getShouldSingleColumn(); if (_isSingleColumnPreferred !== k) { resizePipeline(ratioQueryFix24_); } }); }, { capture: false, passive: true }); }; window._ytConfigHacks.add((config_) => { const EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS; if (EXPERIMENT_FLAGS) { EXPERIMENT_FLAGS.kevlar_set_internal_player_size = false; // vertical live -> schedulePlayerSizeUpdate_ } }); (async () => { if (!document.documentElement) await ytZara.docInitializedAsync(); // wait for document.documentElement is provided await ytZara.promiseRegistryReady(); // wait for YouTube's customElement Registry is provided (old browser only) protoFnQueryChanged(); protoFnRatioChanged(); })(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址