// ==UserScript==
// @name YouTube: Audio Only
// @description No Video Streaming
// @namespace UserScript
// @version 1.4.2
// @author CY Fung
// @match https://www.youtube.com/*
// @match https://www.youtube.com/embed/*
// @match https://www.youtube-nocookie.com/embed/*
// @match https://m.youtube.com/*
// @exclude /^https?://\S+\.(txt|png|jpg|jpeg|gif|xml|svg|manifest|log|ini)[^\/]*$/
// @icon https://raw.githubusercontent.com/cyfung1031/userscript-supports/main/icons/YouTube-Audio-Only.png
// @grant GM_registerMenuCommand
// @grant GM.setValue
// @grant GM.getValue
// @run-at document-start
// @license MIT
// @compatible chrome
// @compatible firefox
// @compatible opera
// @compatible edge
// @compatible safari
// @allFrames true
//
// ==/UserScript==
(async function () {
'use strict';
/** @type {globalThis.PromiseConstructor} */
const Promise = (async () => { })().constructor; // YouTube hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
if (typeof AbortSignal === 'undefined') throw new DOMException("Please update your browser.", "NotSupportedError");
async function confirm(message) {
// Create the HTML for the dialog
if (!document.body) return;
let dialog = document.getElementById('confirmDialog794');
if (!dialog) {
const dialogHTML = `
<div id="confirmDialog794" class="dialog-style" style="display: block;">
<div class="confirm-box">
<p>${message}</p>
<div class="confirm-buttons">
<button id="confirmBtn">Confirm</button>
<button id="cancelBtn">Cancel</button>
</div>
</div>
</div>
`;
// Append the dialog to the document body
document.body.insertAdjacentHTML('beforeend', dialogHTML);
dialog = document.getElementById('confirmDialog794');
}
// Return a promise that resolves or rejects based on the user's choice
return new Promise((resolve) => {
document.getElementById('confirmBtn').onclick = () => {
resolve(true);
cleanup();
};
document.getElementById('cancelBtn').onclick = () => {
resolve(false);
cleanup();
};
function cleanup() {
dialog && dialog.remove();
dialog = null;
}
});
}
if (location.pathname === '/live_chat' || location.pathname === 'live_chat_replay') return;
const pageInjectionCode = function () {
if (typeof AbortSignal === 'undefined') throw new DOMException("Please update your browser.", "NotSupportedError");
const URL = window.URL || new Function('return URL')();
const createObjectURL = URL.createObjectURL.bind(URL);
/** @type {globalThis.PromiseConstructor} */
const Promise = (async () => { })().constructor; // YouTube hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
const PromiseExternal = ((resolve_, reject_) => {
const h = (resolve, reject) => { resolve_ = resolve; reject_ = reject };
return class PromiseExternal extends Promise {
constructor(cb = h) {
super(cb);
if (cb === h) {
/** @type {(value: any) => void} */
this.resolve = resolve_;
/** @type {(reason?: any) => void} */
this.reject = reject_;
}
}
};
})();
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(e);
reject(e);
}
resolve(res);
}).catch(console.warn);
});
};
return pipelineExecution;
}
const observablePromise = (proc, timeoutPromise) => {
let promise = null;
return {
obtain() {
if (!promise) {
promise = new Promise(resolve => {
let mo = null;
const f = () => {
let t = proc();
if (t) {
mo.disconnect();
mo.takeRecords();
mo = null;
resolve(t);
}
}
mo = new MutationObserver(f);
mo.observe(document, { subtree: true, childList: true })
f();
timeoutPromise && timeoutPromise.then(() => {
resolve(null)
});
});
}
return promise
}
}
}
const insp = o => o ? (o.polymerController || o.inst || o || 0) : (o || 0);
let setTimeout_ = setTimeout;
let clearTimeout_ = clearTimeout;
const delayPn = delay => new Promise((fn => setTimeout_(fn, delay)));
const mockEvent = (o, elem) => {
o = o || {};
elem = elem || null;
return {
preventDefault: () => { },
stopPropagation: () => { },
stopImmediatePropagation: () => { },
returnValue: true,
target: elem,
srcElement: elem,
defaultPrevented: false,
cancelable: true,
timeStamp: performance.now(),
...o
}
};
const generalRegister = (prop, symbol, checker, pg) => {
const objSet = new Set();
let done = false;
const f = (o) => {
const ct = o.constructor;
const proto = ct.prototype;
if (!done && proto && ct !== Function && ct !== Object && checker(proto)) {
done = true;
delete Object.prototype[prop];
objSet.delete(proto);
objSet.delete(o);
for (const obj of objSet) {
obj[prop] = obj[symbol];
delete obj[symbol];
}
objSet.clear();
Object.defineProperty(proto, prop, pg);
return proto;
}
return false;
};
Object.defineProperty(Object.prototype, prop, {
get() {
const p = f(this);
if (p) {
return p[prop];
} else {
return this[symbol];
}
},
set(nv) {
const p = f(this);
if (p) {
p[prop] = nv;
} else {
objSet.add(this);
this[symbol] = nv;
}
return true;
},
enumerable: false,
configurable: true
});
};
function removeTempObjectProp01() {
delete Object.prototype['kevlar_non_watch_unified_player'];
delete Object.prototype['kevlar_unified_player'];
}
Object.defineProperty(Object.prototype, 'kevlar_non_watch_unified_player', {
get() {
// console.log(501, this.constructor.prototype)
return true;
},
set(nv) {
return true;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Object.prototype, 'kevlar_unified_player', {
get() {
// console.log(501, this.constructor.prototype)
return true;
},
set(nv) {
return true;
},
enumerable: false,
configurable: true
});
let prr = new PromiseExternal();
const prrPipeline = createPipeline();
let stopAndReload = false;
// let vcc = 0;
// let vdd = -1;
let u33 = null;
let fa = 0;
// let maj = 0;
let cv = null;
document.addEventListener('durationchange', (evt) => {
const target = (evt || 0).target;
if (!(target instanceof HTMLMediaElement)) return;
if (target.classList.contains('video-stream') && target.classList.contains('html5-main-video')) {
if (target.readyState !== 1) {
fa = 1;
} else {
fa = 2;
}
// if (target.readyState === 1) {
// vcc++;
// }
if (target.readyState === 1 && target.networkState === 2) {
target.__spfgs__ = true;
if (u33) {
u33.resolve();
u33 = null;
}
if (cv) {
cv.resolve();
cv = null;
}
} else {
target.__spfgs__ = false;
}
}
}, true);
// XMLHttpRequest.prototype.open299 = XMLHttpRequest.prototype.open;
/*
XMLHttpRequest.prototype.open2 = function(method, url, ...args){
if (typeof url === 'string' && url.length > 24 && url.includes('/videoplayback?') && url.replace('?', '&').includes('&source=')) {
if (vcc !== vdd) {
vdd = vcc;
window.postMessage({ ZECxh: url.includes('source=yt_live_broadcast') }, "*");
}
}
return this.open299(method, url, ...args)
}*/
// desktop only
// document.addEventListener('yt-page-data-fetched', async (evt) => {
// const pageFetchedDataLocal = evt.detail;
// let isLiveNow;
// try {
// isLiveNow = pageFetchedDataLocal.pageData.playerResponse.microformat.playerMicroformatRenderer.liveBroadcastDetails.isLiveNow;
// } catch (e) { }
// window.postMessage({ ZECxh: isLiveNow === true }, "*");
// }, false);
// return;
// let clickLockFn = null;
let clickLockFn = null;
let clickTarget = null;
if (location.origin === 'https://m.youtube.com') {
// const s1 = Symbol();
// const s2 = Symbol();
// Object.defineProperty(Object.prototype, 'videox', {
// get(){
// // let r = this[s1] || this.audio;
// // if(r && !r.isHdr){
// // r.isHdr = function(){
// // return false;
// // }
// // }
// // return r;
// return undefined;
// },
// set(nv){
// this[s1]= nv;
// return true;
// },
// enumerable: false,
// configurable: true
// });
/*
Object.defineProperty(Object.prototype, 'videoTrack', {
get(){
return this[s2] || this.audioTrack;
},
set(nv){
this[s2]= nv;
return true;
},
enumerable: false,
configurable: true
});
*/
EventTarget.prototype.addEventListener322 = EventTarget.prototype.addEventListener;
const dummyFn = () => { };
EventTarget.prototype.addEventListener = function (evt, fn, opts) {
let hn = fn;
if (evt === 'player-error') {
// hn = function (evt) {
// const err = evt.detail || 0;
// if (err.errorCode === 5) {
// console.log("4411", err)
// debugger
// return;
// }
// fn.call(this, evt);
// }
} else if (evt === 'player-detailed-error') {
// hn = function (evt) {
// if (evt.detail && typeof evt.detail === 'object') {
// let key = Object.keys(evt.detail)[0];
// if (key && evt.detail[key]) {
// const err = evt.detail[key]
// if (err.errorCode === 'player.exception' && err.messageKey === 'GENERIC_WITHOUT_LINK') {
// console.log("4422", err)
// return;
// }
// }
// }
// fn.call(this, evt);
// }
} else if (evt === 'video-data-change') {
// hn = function (evt) {
// if (maj > 0 && Date.now() - maj < 80) {
// } else {
// if (maj) return;
// maj = Date.now();
// }
// fn.call(this, evt);
// }
// evt+='y'
} else if (evt === 'player-state-change') {
// evt+='y'
} else if (evt === 'player-autonav-pause' || evt === 'visibilitychange') {
evt += 'y'
fn = dummyFn;
} else if (evt === 'click' && this.id === 'movie_player') {
clickLockFn = fn; clickTarget = this;
// hn = function (e) {
// // console.log(22 , e)
// // console.log(433, e.type, e.detail, fn);
// // window.em33 = true;
// // if(e && e.type !=='updateui' && e.type!=='success' && e.type!==''){
// // console.log(433, e.type, e.detail);
// // }
// return fn.apply(this, arguments)
// }
}
/*
if(evt ==='player-state-change' || evt == "player-autonav-pause" || evt === "video-data-change" || evt === "state-navigatestart"){
hn = function(){
let e = arguments[0];
if(e){
console.log(213, e.type, e.detail);
}
return fn.apply(this, arguments)
}
}
*/
return this.addEventListener322(evt, hn, opts)
}
/*
const XMLHttpRequest_ = XMLHttpRequest;
(() => {
XMLHttpRequest = class XMLHttpRequest extends XMLHttpRequest_ {
constructor(...args) {
super(...args);
}
open(method, url, ...args) {
if (typeof url === 'string' && url.length > 24 && url.includes('/videoplayback?') && url.replace('?', '&').includes('&source=')) {
if (vcc !== vdd) {
vdd = vcc;
window.postMessage({ ZECxh: url.includes('source=yt_live_broadcast') }, "*");
}
}
return super.open(method, url, ...args)
}
}
})();
*/
}
(() => {
XMLHttpRequest = (() => {
const XMLHttpRequest_ = XMLHttpRequest;
if ('__xmMc8__' in XMLHttpRequest_.prototype) return XMLHttpRequest_;
const url0 = createObjectURL(new Blob([], { type: 'text/plain' }));
const c = class XMLHttpRequest extends XMLHttpRequest_ {
constructor(...args) {
super(...args);
}
open(method, url, ...args) {
let skip = false;
if (!url || typeof url !== 'string') skip = true;
else if (typeof url === 'string') {
let turl = url[0] === '/' ? `.youtube.com${url}` : `${url}`;
if (turl.includes('googleads') || turl.includes('doubleclick.net')) {
skip = true;
} else if (turl.includes('.youtube.com/pagead/')) {
skip = true;
} else if (turl.includes('.youtube.com/ptracking')) {
skip = true;
} else if (turl.includes('.youtube.com/api/stats/')) { // /api/stats/
// skip = true; // for user activity logging e.g. watched videos
} else if (turl.includes('play.google.com/log')) {
skip = true;
} else if (turl.includes('.youtube.com//?')) { // //?cpn=
skip = true;
}
}
if (!skip) {
this.__xmMc8__ = 1;
return super.open(method, url, ...args);
} else {
this.__xmMc8__ = 2;
return super.open('GET', url0);
}
}
send(...args) {
if (this.__xmMc8__ === 1) {
return super.send(...args);
} else if (this.__xmMc8__ === 2) {
return super.send();
} else {
console.log('xhr warning');
return super.send(...args);
}
}
}
c.prototype.__xmMc8__ = 0;
return c;
})();
const s7 = Symbol();
const f7 = () => true;
!window.canRetry9048 && generalRegister('canRetry', s7, (p) => {
return typeof p.onStateChange === 'function' && typeof p.dispose === 'function' && typeof p.hide === 'undefined' && typeof p.show === 'undefined' && typeof p.isComplete === 'undefined' && typeof p.getDuration === 'undefined'
}, {
get() {
if ('logger' in this && 'policy' in this && 'xhr' && this) {
if (this.errorMessage && typeof this.errorMessage === 'string' && this.errorMessage.includes('XMLHttpRequest') && this.errorMessage.includes('Invalid URL')) { // "SyntaxError_Failed to execute 'open' on 'XMLHttpRequest': Invalid URL"
// OKAY !
console.log('canRetry05 - ', this.errorMessage)
return f7;
}
// console.log(this)
console.log('canRetry02 - ', this.errorMessage, this)
} else {
console.log('canRetry ERR - ', this.errorMessage)
}
return this[s7];
},
set(nv) {
this[s7] = nv;
return true;
},
enumerable: false,
configurable: true
});
window.canRetry9048 = 1;
// const addProtoToArr = (parent, key, arr) => {
// let isChildProto = false;
// for (const sr of arr) {
// if (parent[key].prototype instanceof parent[sr]) {
// isChildProto = true;
// break;
// }
// }
// if (isChildProto) return;
// arr = arr.filter(sr => {
// if (parent[sr].prototype instanceof parent[key]) {
// return false;
// }
// return true;
// });
// arr.push(key);
// return arr;
// }
// const getZq = (_yt_player) => {
// const w = 'Zq';
// let arr = [];
// for (const [k, v] of Object.entries(_yt_player)) {
// const p = typeof v === 'function' ? v.prototype : 0;
// if (p
// // && typeof p.canRetry === 'function'
// // && typeof p.dispose === 'function'
// && typeof p.onStateChange === 'function'
// ) {
// arr = addProtoToArr(_yt_player, k, arr) || arr;
// }
// }
// console.log(299, arr)
// if (arr.length === 0) {
// console.warn(`Key does not exist. [${w}]`);
// } else {
// console.log(`[${w}]`, arr);
// return arr[0];
// }
// }
// (location.origin ==='https://www.youtube.com' ? document : window).addEventListener( location.origin ==='https://www.youtube.com' ? 'yt-action' : 'state-navigateend', ()=>{
// let arr = [];
// if (typeof _yt_player !== 'undefined' && _yt_player && typeof _yt_player === 'object') {
// for (const [k, v] of Object.entries(_yt_player)) {
// if (typeof v === 'function'
// // && typeof v.prototype.canRetry === 'function'
// // && typeof v.prototype.dispose === 'function'
// && typeof v.prototype.onStateChange === 'function'
// ) {
// arr.push(k);
// }
// }
// getZq(_yt_player);
// }
// console.log(277, arr, typeof _yt_player);
// }, {once: true, passive: true, capture: true})
})();
// const waitFor = (checker, ms) => {
// return new Promise(resolve => {
// let cid = setInterval(() => {
// if (!cid) return;
// let r = checker();
// if (r) {
// clearInterval(cid);
// cid = 0;
// resolve(r);
// }
// }, ms);
// }).catch(console.warn)
// };
if (location.origin === 'https://www.youtube.com') {
if (location.pathname.startsWith('/embed/')) {
// document.querySelector('#player > .ytp-embed')
// console.log(1230)
const ytEmbedReady = observablePromise(() => document.querySelector('#player > .ytp-embed')).obtain();
ytEmbedReady.then(async (embedPlayer) => {
while (true) {
if (window.yt && window.yt.config_) break;
await delayPn(60);
}
let configs = yt.config_ || 0;
configs = configs.WEB_PLAYER_CONTEXT_CONFIGS || {};
for (const [key, entry] of Object.entries(configs)) {
if (entry && typeof entry.serializedExperimentFlags === 'string') {
// prevent idle playback failure
entry.serializedExperimentFlags = entry.serializedExperimentFlags.replace(/\b(html5_check_for_idle_network_interval_ms|html5_trigger_loader_when_idle_network|html5_sabr_fetch_on_idle_network_preloaded_players|html5_autonav_cap_idle_secs|html5_autonav_quality_cap|html5_disable_client_autonav_cap_for_onesie|html5_idle_rate_limit_ms|html5_sabr_fetch_on_idle_network_preloaded_players|html5_webpo_idle_priority_job|html5_server_playback_start_policy|html5_check_video_data_errors_before_playback_start|html5_check_unstarted|html5_check_queue_on_data_loaded)=([-_\w]+)(\&|$)/g, (_, a, b, c) => {
return a + '00' + '=' + b + c;
});
}
}
let playerKevlar = null;
try {
playerKevlar = window.yt.config_.WEB_PLAYER_CONTEXT_CONFIGS.WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH;
} catch (e) { }
if (playerKevlar) {
playerKevlar.allowWoffleManagement = false;
playerKevlar.cinematicSettingsAvailable = false;
playerKevlar.showMiniplayerButton = false;
playerKevlar.showMiniplayerUiWhenMinimized = false;
playerKevlar.transparentBackground = false;
playerKevlar.enableCsiLogging = false;
playerKevlar.externalFullscreen = false;
if (typeof playerKevlar.serializedExperimentFlags === 'string') {
playerKevlar.serializedExperimentFlags = '';
}
if (typeof playerKevlar.serializedExperimentIds === 'string') {
playerKevlar.serializedExperimentIds = '';
}
}
const player_ = embedPlayer;
// console.log(player_)
const asyncStateChange = async (audio, k) => {
const refreshAllStaleEntitiesForNonReadyAudio = async () => {
try {
if (audio.readyState == 0) await player_.refreshAllStaleEntities();
} catch (e) {
console.log(e)
}
};
const seekToLiveHeadForLiveStream = async () => {
try {
await player_.seekToLiveHead();
if ((await player_.isAtLiveHead()) === true) {
await player_.seekToStreamTime();
return true;
}
} catch (e) {
console.log(e);
}
};
try {
const ns23 = audio.networkState == 2 || audio.networkState == 3;
if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
await delayPn(500);
if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
if (audio.paused) {
await player_.clearVideo(); // avoid error in live streaming
await player_.clearQueue(); // avoid error in live streaming
await delayPn(300);
for (let i = 0; i < 3; i++) {
if (audio.readyState === 0) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
}
await refreshAllStaleEntitiesForNonReadyAudio();
} else {
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
}
}
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState === 1 && ns23 && audio.muted === false) {
await seekToLiveHeadForLiveStream();
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === false) {
await delayPn(60);
if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === false) {
if (audio.paused === true) {
await player_.clearVideo(); // avoid error in live streaming
await player_.clearQueue(); // avoid error in live streaming
await delayPn(300);
for (let i = 0; i < 3; i++) {
if (audio.readyState === 0) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
} else {
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
}
}
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState === 1 && ns23 && audio.muted === true) {
await seekToLiveHeadForLiveStream();
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === true) {
await delayPn(60);
if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === true) {
if (audio.paused === true) {
await player_.clearVideo(); // avoid error in live streaming
await player_.clearQueue(); // avoid error in live streaming
await delayPn(300);
for (let i = 0; i < 3; i++) {
if (audio.readyState === 0) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
} else {
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
}
}
}
} catch (e) {
console.log(e)
}
};
// console.log(299, player_)
let qz = (k) => {
try {
if (typeof k === 'number' && k === player_.getPlayerState()) {
const audio = document.querySelector('#player audio.video-stream.html5-main-video');
if (audio) asyncStateChange(audio, k);
}
} catch (e) {
console.log(e)
}
};
player_.addEventListener('onStateChange', qz);
const state0 = player_.getPlayerState();
if (typeof state0 === 'number') {
qz(state0);
}
player_.addEventListener('onVideoProgress', () => {
// console.log('video')
});
// console.log(1231)
})
} else {
document.addEventListener('yt-action', () => {
const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
if (config_) {
let configs = config_.WEB_PLAYER_CONTEXT_CONFIGS || {};
for (const [key, entry] of Object.entries(configs)) {
if (entry && typeof entry.serializedExperimentFlags === 'string') {
// prevent idle playback failure
entry.serializedExperimentFlags = entry.serializedExperimentFlags.replace(/\b(html5_check_for_idle_network_interval_ms|html5_trigger_loader_when_idle_network|html5_sabr_fetch_on_idle_network_preloaded_players|html5_autonav_cap_idle_secs|html5_autonav_quality_cap|html5_disable_client_autonav_cap_for_onesie|html5_idle_rate_limit_ms|html5_sabr_fetch_on_idle_network_preloaded_players|html5_webpo_idle_priority_job|html5_server_playback_start_policy|html5_check_video_data_errors_before_playback_start|html5_check_unstarted|html5_check_queue_on_data_loaded)=([-_\w]+)(\&|$)/g, (_, a, b, c) => {
return a + '00' + '=' + b + c;
});
}
}
removeTempObjectProp01();
const EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS;
if (EXPERIMENT_FLAGS) {
EXPERIMENT_FLAGS.kevlar_unified_player = true;
EXPERIMENT_FLAGS.kevlar_non_watch_unified_player = true;
}
const EXPERIMENTS_FORCED_FLAGS = config_.EXPERIMENTS_FORCED_FLAGS;
if (EXPERIMENTS_FORCED_FLAGS) {
EXPERIMENTS_FORCED_FLAGS.kevlar_unified_player = true;
EXPERIMENTS_FORCED_FLAGS.kevlar_non_watch_unified_player = true;
}
}
}, { once: true, passive: true, capture: true })
const setupAudioPlaying = (player00_) => {
const player_ = player00_;
if (!player_) return;
if (player_.__audio544__) return;
player_.__audio544__ = 1;
// console.log(1233, player_)
let ytdPlayerElement = null;
const asyncStateChange = async (audio, k) => {
const refreshAllStaleEntitiesForNonReadyAudio = async () => {
try {
if (audio.readyState == 0) await player_.refreshAllStaleEntities();
} catch (e) {
console.log(e)
}
};
const seekToLiveHeadForLiveStream = async () => {
try {
await player_.seekToLiveHead();
if ((await player_.isAtLiveHead()) === true) {
await player_.seekToStreamTime();
return true;
}
} catch (e) {
console.log(e);
}
};
const stopAndReloadFn = async () => {
if (location.pathname === '/watch') {
player_.destroy();
location.replace(location.href);
await delayPn(8000);
}
// await player_.stopVideo();
// await player_.updateVideoData();
// try{
// await player_.refreshAllStaleEntities();
// }catch(e){}
// await player_.playVideo();
}
try {
const ns23 = audio.networkState == 2 || audio.networkState == 3;
if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
await delayPn(500);
if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
if (stopAndReload) {
stopAndReload = false;
await stopAndReloadFn();
}
if (audio.paused) {
await player_.clearVideo(); // avoid error in live streaming
await player_.clearQueue(); // avoid error in live streaming
await delayPn(300);
for (let i = 0; i < 3; i++) {
if (audio.readyState === 0) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
}
await refreshAllStaleEntitiesForNonReadyAudio();
} else {
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.cancelPlayback();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
}
}
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState === 1 && ns23 && audio.muted === false) {
await seekToLiveHeadForLiveStream();
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === false) {
await delayPn(60);
if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === false) {
if (stopAndReload) {
stopAndReload = false;
await stopAndReloadFn();
}
if (audio.paused === true) {
await player_.clearVideo(); // avoid error in live streaming
await player_.clearQueue(); // avoid error in live streaming
await delayPn(300);
for (let i = 0; i < 3; i++) {
if (audio.readyState === 0) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.cancelPlayback();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
} else {
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.cancelPlayback();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
}
}
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState === 1 && ns23 && audio.muted === true) {
await seekToLiveHeadForLiveStream();
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === true) {
await delayPn(60);
if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.muted === true) {
if (audio.paused === true) {
// single page navigation
player_.destroy();
location.replace(location.href);
// console.log('location,replace');
await delayPn(8000);
} else {
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.cancelPlayback();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
}
}
}
} catch (e) {
console.log(e)
}
};
let mid = 0;
let qz = (k_) => {
const k = k_;
try {
if (typeof k === 'number' && k === player_.getPlayerState()) {
if (!ytdPlayerElement) {
ytdPlayerElement = [...document.querySelectorAll('ytd-player')].filter(e => !e.closest('[hidden]'))[0]
}
const audio = ytdPlayerElement ? HTMLElement.prototype.querySelector.call(ytdPlayerElement, '.video-stream.html5-main-video') : null;
if (audio) {
if (mid > 1e9) mid = 9;
const t = ++mid;
prrPipeline(async () => {
if (t !== mid) return;
await prr.then();
if (t !== mid) return;
await asyncStateChange(audio, k);
});
}
}
} catch (e) {
console.log(e)
}
};
player_.addEventListener('onStateChange', qz);
const state0 = player_.getPlayerState();
// console.log(221, state0)
if (typeof state0 === 'number') {
qz(state0);
}
player_.addEventListener('onVideoProgress', () => {
Promise.resolve().then(() => {
player_.updateLastActiveTime();
});
});
}
customElements.whenDefined('ytd-player').then(() => {
const dummy = document.querySelector('ytd-player') || document.createElement('ytd-player');
const cnt = insp(dummy);
const cProto = cnt.constructor.prototype;
cProto.createMainAppPlayer932_ = cProto.createMainAppPlayer_;
cProto.initPlayer932_ = cProto.initPlayer_;
cProto.createMainAppPlayer_ = function (a, b, c) {
let r = this.createMainAppPlayer932_(a, b, c);
try {
this.mainAppPlayer_.api.then(function (e) {
setupAudioPlaying(e);
})
} finally {
return r;
}
}
cProto.initPlayer_ = function (a) {
let r = this.initPlayer932_(a);
try {
r.then(() => {
setupAudioPlaying(this.player_);
})
} finally {
return r;
}
}
})
let useStopAndReload = location.pathname !== '/watch';
document.addEventListener('yt-navigate-start', () => {
prr = new PromiseExternal();
if (useStopAndReload) stopAndReload = true;
});
document.addEventListener('yt-navigate-cache', () => {
prr = new PromiseExternal();
if (useStopAndReload) stopAndReload = true;
});
document.addEventListener('yt-navigate-finish', () => {
prr.resolve();
});
}
// document.addEventListener('yt-navigate-finish', async () => {
// try{
// const player_ = await playerAsyncControlled_.then();
// const fn = () => {
// const elm = document.querySelector('ytd-player#ytd-player');
// if (!elm) return;
// const cnt = insp(elm);
// if (!cnt) return;
// if (!cnt.player_) return;
// if (!cnt.player_.playVideo) return;
// return { elm, cnt };
// }
// let o = fn();
// if (!o) {
// o = await observablePromise(fn).obtain()
// }
// const { cnt, elm } = o;
// return;
// const audio = HTMLElement.prototype.querySelector.call(elm, '.video-stream.html5-main-video');
// if(!audio) return;
// if(player_.getPlayerState() === 3 && audio.readyState === 1 && audio.networkState === 2 && !audio.paused && !audio.muted){
// }else if(player_.getPlayerState() === 3 && audio.readyState === 0 && audio.networkState === 2 && !audio.paused && !audio.muted){
// if (audio.__spfgs__ !== true) { // undefined or false
// u33 = new PromiseExternal();
// await u33.then();
// }
// await waitFor(() => {
// return audio.readyState === 1 && audio.networkState === 2 && !audio.paused && !audio.muted
// }, 9);
// } else{
// return;
// }
// if (player_.getPlayerState() !== 3 || !audio.isConnected) return;
// console.log('x02', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 t f
// await player_.cancelPlayback();
// await waitFor(() => {
// return audio.readyState === 1 && audio.networkState === 2 && audio.paused && !audio.muted
// }, 9);
// console.log('x03', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 t f
// // await new Promise(resolve => window.setTimeout(resolve, 1));
// // console.log('x04', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 t f
// await player_.playVideo();
// await waitFor(() => {
// return audio.readyState === 1 && audio.networkState === 2 && !audio.paused && !audio.muted
// }, 9);
// console.log('x04', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 f f
// return;
// if (player_.getPlayerState() === 3) {
// const audio = HTMLElement.prototype.querySelector.call(elm, '.video-stream.html5-main-video');
// console.log('x01', audio.readyState, audio.networkState, audio.paused, audio.muted) // 0 2 f f
// if (audio.__spfgs__ !== true) { // undefined or false
// u33 = new PromiseExternal();
// await u33.then();
// }
// await waitFor(() => {
// return audio.readyState === 1 && audio.networkState === 2 && !audio.paused && !audio.muted
// }, 9);
// console.log('x02', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 f f
// if (player_.getPlayerState() !== 3 || !audio.isConnected) return;
// if (audio && audio.__spfgs__ === true) {
// await player_.cancelPlayback();
// await waitFor(() => {
// return audio.readyState === 1 && audio.networkState === 2 && audio.paused && !audio.muted
// }, 9);
// console.log('x03', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 t f
// // await new Promise(resolve => window.setTimeout(resolve, 1));
// // console.log('x04', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 t f
// await player_.playVideo();
// await waitFor(() => {
// return audio.readyState === 1 && audio.networkState === 2 && !audio.paused && !audio.muted
// }, 9);
// console.log('x04', audio.readyState, audio.networkState, audio.paused, audio.muted) // 1 2 f f
// }
// }
// }catch(e){
// console.log(e)
// }
// });
} else if (location.origin === 'https://m.youtube.com') {
let player0 = null;
let mgg = null;
const mff = function (e) {
if (!player0) {
if (e && (e || 0).target) {
player0 = e.target
if (mgg) mgg();
}
}
}
document.addEventListener('player-initialized', mff, true);
document.addEventListener('player-state-change', mff, true);
document.addEventListener('player-ad-state-change', mff, true);
document.addEventListener('player-detailed-error', mff, true);
document.addEventListener('player-error', mff, true);
document.addEventListener('on-play-autonav-video', mff, true);
document.addEventListener('on-play-previous-autonav-video', mff, true);
document.addEventListener('player-fullscreen-change', mff, true);
document.addEventListener('player-fullscreen-toggled', mff, true);
document.addEventListener('player-dom-paused', mff, true);
document.addEventListener('yt-show-toast', mff, true);
document.addEventListener('yt-innertube-command', mff, true);
document.addEventListener('yt-update-c3-companion', mff, true);
document.addEventListener('video-data-change', mff, true);
document.addEventListener('video-progress', mff, true);
document.addEventListener('local-media-change', mff, true);
let em = '';
let tc = false;
// let pw = null;
(async () => {
try {
let player_;
let elm;
const asyncStateChange = async (audio, k) => {
const refreshAllStaleEntitiesForNonReadyAudio = async () => {
// try {
// if (audio.readyState == 0) await player_.refreshAllStaleEntities();
// } catch (e) {
// console.log(e)
// }
};
const seekToLiveHeadForLiveStream = async () => {
try {
await player_.seekToLiveHead();
if ((await player_.isAtLiveHead()) === true) {
await player_.seekToStreamTime();
return true;
}
} catch (e) {
console.log(e);
}
};
// console.log(123)
try {
if (!player_ || !elm || typeof player_.getPlayerState !== 'function') return;
// console.log(292, !!pw, k===-1, player_.getPlayerState() == -1);
// if (pw) {
// pw.resolve();
// }
// pw = new PromiseExternal();
const ns23 = audio.networkState == 2 || audio.networkState == 3
// console.log(127001, k, player_.getPlayerState(), audio.readyState, ns23, audio.muted)
const f = () => {
let closeBtnRenderer = document.querySelector('.ytm-bottom-sheet-overlay-renderer-close.icon-close');
if (closeBtnRenderer) {
const btn = closeBtnRenderer.querySelector('button');
const container = closeBtnRenderer.closest('#global-loader ~ .ytm-bottom-sheet-overlay-container');
if (container) {
container.style.visibility = 'collapse';
container.style.zIndex = '-1';
}
if (btn) {
setTimeout(() => {
btn.click();
}, 300);
}
}
}
f();
if (k === 3 && player_.getPlayerState() === 3 && audio.readyState > 0 && ns23 && audio.muted === true) {
tc = true;
}
if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
await delayPn(500);
if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
// console.log(127003)
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
// console.log(127004, audio.readyState)
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.cancelPlayback();
await player_.pauseVideo();
await player_.playVideo();
await delayPn(300);
}
// console.log(127005, audio.readyState)
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
// console.log(127006, audio.readyState)
}
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState === 1 && ns23 && audio.muted === false) {
await seekToLiveHeadForLiveStream();
} else if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23) {
// console.log(1201)
await delayPn(60);
// console.log(1202, player_.getPlayerState() , audio.readyState , ns23, audio.paused === false, audio.muted === false)
// console.log(127002, k, player_.getPlayerState(), audio.readyState, ns23, audio.muted)
if (k === 3 && player_.getPlayerState() === 3 && audio.readyState == 0 && ns23 && audio.paused === false) {
// pw = pw || new PromiseExternal();
// const pw0 = pw;
// console.log(127003)
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
// console.log(127004, audio.readyState)
while (audio.readyState === 0) {
await refreshAllStaleEntitiesForNonReadyAudio();
await player_.cancelPlayback();
await player_.pauseVideo();
await player_.playVideo(); await delayPn(60);
}
// console.log(127005, audio.readyState)
if (!player_.isAtLiveHead()) {
if (await seekToLiveHeadForLiveStream()) await delayPn(60);
}
await refreshAllStaleEntitiesForNonReadyAudio();
// console.log(127006, audio.readyState)
}
}
} catch (e) {
console.log(e)
}
};
// console.log(299, player_)
let qz = (e) => {
// console.log(992)
try {
if (e && (e || 0).target) {
elm = player_ = e.target
}
if (!elm || !player_) return;
let k = -2;
if (e && e.detail && e.detail.state) {
k = e.detail.state
}
// console.log(188, k, player_ )
if (typeof player_.getPlayerState === 'function' && typeof k === 'number' && k === player_.getPlayerState()) {
const audio = HTMLElement.prototype.querySelector.call(elm, '.video-stream.html5-main-video');
if (audio) asyncStateChange(audio, k);
}
} catch (e) {
console.log(e)
}
};
document.addEventListener('player-state-change', qz, true);
mgg = function () {
if (player0) {
// console.log(22)
const player_ = player0
const state0 = player_.getPlayerState();
if (typeof state0 === 'number') {
qz({ type: 'player-state-change', target: player_, detail: { state: state0 } });
}
}
}
document.addEventListener('video-progress', (e) => {
if (e && (e || 0).target) {
elm = player_ = e.target
}
if (!elm || !player_) return;
Promise.resolve().then(() => {
if (player_ && typeof player_.updateLastActiveTime === 'function') {
player_.updateLastActiveTime();
}
});
if (tc) {
tc = false;
const audio = HTMLElement.prototype.querySelector.call(elm, '.video-stream.html5-main-video');
if (audio && audio.muted === true && audio.isConnected === true && audio.readyState >= 0 && audio.networkState >= 2 && audio.paused === false) {
audio.click();
}
}
}, true);
return player_;
} catch (e) {
console.log(e)
}
})();
// document.addEventListener('DOMContentLoaded', (evt) => {
// const mo = new MutationObserver((mutations)=>{
// console.log(5899, mutations)
// });
// mo.observe(document, {subtree: true, childList: true})
// })
// window.addEventListener('onReady', (evt) => {
// console.log(6811)
// }, true);
// window.addEventListener('localmediachange', (evt) => {
// console.log(6812)
// }, true);
// window.addEventListener('onVideoDataChange', (evt) => {
// console.log(6813)
// }, true);
window.addEventListener('state-navigateend', async (evt) => {
const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
if (config_) {
let configs = config_.WEB_PLAYER_CONTEXT_CONFIGS || {};
for (const [key, entry] of Object.entries(configs)) {
if (entry && typeof entry.serializedExperimentFlags === 'string') {
// prevent idle playback failure
entry.serializedExperimentFlags = entry.serializedExperimentFlags.replace(/\b(html5_check_for_idle_network_interval_ms|html5_trigger_loader_when_idle_network|html5_sabr_fetch_on_idle_network_preloaded_players|html5_autonav_cap_idle_secs|html5_autonav_quality_cap|html5_disable_client_autonav_cap_for_onesie|html5_idle_rate_limit_ms|html5_sabr_fetch_on_idle_network_preloaded_players|html5_webpo_idle_priority_job|html5_server_playback_start_policy|html5_check_video_data_errors_before_playback_start|html5_check_unstarted|html5_check_queue_on_data_loaded)=([-_\w]+)(\&|$)/g, (_, a, b, c) => {
return a + '00' + '=' + b + c;
});
}
}
removeTempObjectProp01();
const EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS;
if (EXPERIMENT_FLAGS) {
EXPERIMENT_FLAGS.kevlar_unified_player = true;
EXPERIMENT_FLAGS.kevlar_non_watch_unified_player = true;
}
const EXPERIMENTS_FORCED_FLAGS = config_.EXPERIMENTS_FORCED_FLAGS;
if (EXPERIMENTS_FORCED_FLAGS) {
EXPERIMENTS_FORCED_FLAGS.kevlar_unified_player = true;
EXPERIMENTS_FORCED_FLAGS.kevlar_non_watch_unified_player = true;
}
}
// maj = 0;
// console.log(5910)
try {
if (clickLockFn && clickTarget) {
let a = HTMLElement.prototype.querySelector.call(clickTarget, '.video-stream.html5-main-video');
if (!a) return;
// if(fa!==1) return;
if (a.muted === true && a.__spfgs__ !== true && a.paused === true && a.networkState === 0 && a.readyState === 0) {
const pr = new Promise(resolve => {
document.addEventListener('player-state-change', resolve, { once: true, passive: true, capture: false });
}).then();
// maj = 0;
clickLockFn.call(clickTarget, mockEvent({ type: 'click', target: clickTarget, detail: 1 }));
await delayPn(1);
// if(fa!==1) return;
if (a.muted === false && a.__spfgs__ !== true && a.paused === true && a.networkState === 0 && a.readyState === 0) {
// maj = 0;
clickLockFn.call(clickTarget, mockEvent({ type: 'click', target: clickTarget, detail: 1 }));
await delayPn(1);
// if(fa!==1) return;
}
delayRun(pr);
}
}
} catch (e) { console.log(e) }
}, false);
// document.addEventListener('volumechange', (evt) => {
// console.log('volumechange')
// }, true)
// document.addEventListener('play', (evt) => {
// console.log('play')
// }, true)
// document.addEventListener('player-initialized', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('renderer-module-load-start', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('video-data-change', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-state-change', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('updateui', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('renderer-module-load-end', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-autonav-pause', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-ad-state-change', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-detailed-error', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-error', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('on-play-autonav-video', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('on-play-previous-autonav-video', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-fullscreen-change', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-fullscreen-toggled', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-dom-paused', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('yt-show-toast', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('yt-innertube-command', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('yt-update-c3-companion', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('video-progress', (evt) => {
// // console.log(evt.type)
// }, true)
// document.addEventListener('localmediachange', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-initialized', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('renderer-module-load-start', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('video-data-change', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-state-change', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('updateui', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('renderer-module-load-end', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-autonav-pause', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-ad-state-change', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-detailed-error', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-error', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('on-play-autonav-video', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('on-play-previous-autonav-video', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-fullscreen-change', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-fullscreen-toggled', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('player-dom-paused', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('yt-show-toast', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('yt-innertube-command', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('yt-update-c3-companion', (evt) => {
// console.log(evt.type)
// }, true)
// window.addEventListener('video-progress', (evt) => {
// // console.log(evt.type)
// }, true)
// window.addEventListener('localmediachange', (evt) => {
// console.log(evt.type)
// }, true)
// document.addEventListener('player-error', (evt) => {
// console.log(3001, evt.type, evt)
// }, true)
// document.addEventListener('player-detailed-error', (evt) => {
// console.log(3002, evt.type, evt)
// }, true)
async function delayRun(pr) {
let q = document.querySelector('#movie_player');
if (!q) return;
let a = document.querySelector('.video-stream.html5-main-video');
if (!a) return;
await pr.then();
if (fa !== 1) return;
if (a.muted) return;
if (a.muted === false && a.readyState === 0 && a.networkState === 2) {
} else {
return;
}
// console.log('xx2')
if (a.muted === false && a.readyState === 0 && a.networkState === 2) {
} else {
// clearInterval(cid);
}
if (a.paused !== true) return;
// clearInterval(cid);
// console.log('xx3')
if (document.querySelector('.player-controls-content')) return;
if (fa !== 1) return;
if (a.paused === true && a.muted === false && a.readyState === 0 && a.networkState === 2) {
// maj = 0;
clickLockFn.call(clickTarget, mockEvent({ type: 'click', target: clickTarget, detail: 1 }));
}
// console.log(a.paused)
// console.log(7710)
if (a.paused === true && a.muted === false && a.networkState === 2 && a.readyState === 0) {
if (typeof clickTarget.seekToLiveHead === 'function') await clickTarget.seekToLiveHead();
if (typeof clickTarget.isAtLiveHead === 'function' && (await clickTarget.isAtLiveHead()) === true) {
if (typeof clickTarget.seekToStreamTime === 'function') await clickTarget.seekToStreamTime();
}
}
}
document.addEventListener('durationchange', (evt) => {
if (evt.target.readyState !== 1) {
fa = 1;
} else {
fa = 2;
}
}, true)
}
let kz = false;
document.addEventListener('yt-action', function (evt) {
if (kz) return;
kz = true;
const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
if (config_) {
let playerKevlar = null;
try {
playerKevlar = config_.WEB_PLAYER_CONTEXT_CONFIGS.WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH;
} catch (e) { }
if (playerKevlar) {
// console.log(322, playerKevlar)
playerKevlar.allowWoffleManagement = false;
playerKevlar.cinematicSettingsAvailable = false;
playerKevlar.showMiniplayerButton = false;
playerKevlar.showMiniplayerUiWhenMinimized = false;
playerKevlar.transparentBackground = false;
playerKevlar.enableCsiLogging = false;
playerKevlar.externalFullscreen = false;
if (typeof playerKevlar.serializedExperimentFlags === 'string') {
playerKevlar.serializedExperimentFlags = '';
// playerKevlar.serializedExperimentFlags = playerKevlar.serializedExperimentFlags.replace(/[-\w]+=(\[\]|[.-\d]+|[_a-z]+|)(&|$)/g,'').replace(/&$/,'')
}
if (typeof playerKevlar.serializedExperimentIds === 'string') {
playerKevlar.serializedExperimentIds = '';
// playerKevlar.serializedExperimentIds = playerKevlar.serializedExperimentIds.replace(/\d+\s*(,\s*|$)/g,'')
}
}
let configs = config_.WEB_PLAYER_CONTEXT_CONFIGS || {};
for (const [key, entry] of Object.entries(configs)) {
if (entry && typeof entry.serializedExperimentFlags === 'string') {
// prevent idle playback failure
entry.serializedExperimentFlags = entry.serializedExperimentFlags.replace(/\b(html5_check_for_idle_network_interval_ms|html5_trigger_loader_when_idle_network|html5_sabr_fetch_on_idle_network_preloaded_players|html5_autonav_cap_idle_secs|html5_autonav_quality_cap|html5_disable_client_autonav_cap_for_onesie|html5_idle_rate_limit_ms|html5_sabr_fetch_on_idle_network_preloaded_players|html5_webpo_idle_priority_job|html5_server_playback_start_policy|html5_check_video_data_errors_before_playback_start|html5_check_unstarted|html5_check_queue_on_data_loaded)=([-_\w]+)(\&|$)/g, (_, a, b, c) => {
return a + '00' + '=' + b + c;
});
}
}
/*
const EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS
for(const k in EXPERIMENT_FLAGS){
if(EXPERIMENT_FLAGS[k]===true){
EXPERIMENT_FLAGS[k] = false;
}
}
console.log(3277, EXPERIMENT_FLAGS)
*/
removeTempObjectProp01();
const EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS;
if (EXPERIMENT_FLAGS) {
EXPERIMENT_FLAGS.kevlar_unified_player = true;
EXPERIMENT_FLAGS.kevlar_non_watch_unified_player = true;
}
const EXPERIMENTS_FORCED_FLAGS = config_.EXPERIMENTS_FORCED_FLAGS;
if (EXPERIMENTS_FORCED_FLAGS) {
EXPERIMENTS_FORCED_FLAGS.kevlar_unified_player = true;
EXPERIMENTS_FORCED_FLAGS.kevlar_non_watch_unified_player = true;
}
}
}, { capture: true, passive: true, once: true });
let prepared = false;
function prepare() {
if (prepared) return;
prepared = true;
if (typeof _yt_player !== 'undefined' && _yt_player && typeof _yt_player === 'object') {
for (const [k, v] of Object.entries(_yt_player)) {
if (typeof v === 'function' && typeof v.prototype.clone === 'function'
&& typeof v.prototype.get === 'function' && typeof v.prototype.set === 'function'
&& typeof v.prototype.isEmpty === 'undefined' && typeof v.prototype.forEach === 'undefined'
&& typeof v.prototype.clear === 'undefined'
) {
key = k;
}
}
}
if (key) {
const ClassX = _yt_player[key];
_yt_player[key] = class extends ClassX {
constructor(...args) {
if (typeof args[0] === 'string' && args[0].startsWith('http://')) args[0] = '';
super(...args);
}
}
_yt_player[key].luX1Y = 1;
}
}
let s3 = Symbol();
generalRegister('deviceIsAudioOnly', s3, (p) => {
return typeof p.getPlayerType === 'function' && typeof p.getVideoEmbedCode === 'function' && typeof p.getVideoUrl === 'function' && !p.onCueRangeEnter && !p.getVideoData && !('ATTRIBUTE_NODE' in p)
}, {
get() {
return this[s3];
},
set(nv) {
if (typeof nv === 'boolean') this[s3] = true;
else this[s3] = undefined;
prepare();
return true;
},
enumerable: false,
configurable: true
});
let s1 = Symbol();
let s2 = Symbol();
Object.defineProperty(Object.prototype, 'defraggedFromSubfragments', {
get() {
// console.log(501, this.constructor.prototype)
return undefined;
},
set(nv) {
return true;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Object.prototype, 'hasSubfragmentedFmp4', {
get() {
// console.log(502, this.constructor.prototype)
return this[s1];
},
set(nv) {
if (typeof nv === 'boolean') this[s1] = false;
else this[s1] = undefined;
return true;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Object.prototype, 'hasSubfragmentedWebm', {
get() {
// console.log(503, this.constructor.prototype)
return this[s2];
},
set(nv) {
if (typeof nv === 'boolean') this[s2] = false;
else this[s2] = undefined;
return true;
},
enumerable: false,
configurable: true
});
const supportedFormatsConfig = () => {
function typeTest(type) {
if (typeof type === 'string' && type.startsWith('video/')) {
return false;
}
}
// return a custom MIME type checker that can defer to the original function
function makeModifiedTypeChecker(origChecker) {
// Check if a video type is allowed
return function (type) {
let res = undefined;
if (type === undefined) res = false;
else {
res = typeTest.call(this, type);
}
if (res === undefined) res = origChecker.apply(this, arguments);
return res;
};
}
// Override video element canPlayType() function
const proto = (HTMLVideoElement || 0).prototype;
if (proto && typeof proto.canPlayType == 'function') {
proto.canPlayType = makeModifiedTypeChecker(proto.canPlayType);
}
// Override media source extension isTypeSupported() function
const mse = window.MediaSource;
// Check for MSE support before use
if (mse && typeof mse.isTypeSupported == 'function') {
mse.isTypeSupported = makeModifiedTypeChecker(mse.isTypeSupported);
}
};
supportedFormatsConfig();
}
const isEnable = (typeof GM !== 'undefined' && typeof GM.getValue === 'function') ? (await GM.getValue("isEnable_aWsjF", true)) : null;
if (typeof isEnable !== 'boolean') throw new DOMException("Please Update your browser", "NotSupportedError");
if (isEnable) {
const element = document.createElement('button');
element.setAttribute('onclick', `(${pageInjectionCode})()`);
element.click();
}
GM_registerMenuCommand(`Turn ${isEnable ? 'OFF' : 'ON'} YouTube Audio Mode`, async function () {
await GM.setValue("isEnable_aWsjF", !isEnable);
location.reload();
});
let messageCount = 0;
let busy = false;
window.addEventListener('message', (evt) => {
const v = ((evt || 0).data || 0).ZECxh;
if (typeof v === 'boolean') {
if (messageCount > 1e9) messageCount = 9;
const t = ++messageCount;
if (v && isEnable) {
requestAnimationFrame(async () => {
if (t !== messageCount) return;
if (busy) return;
busy = true;
if (await confirm("Livestream is detected. Press OK to disable YouTube Audio Mode.")) {
await GM.setValue("isEnable_aWsjF", !isEnable);
location.reload();
}
busy = false;
});
}
}
});
const pLoad = new Promise(resolve => {
if (document.readyState !== 'loading') {
resolve();
} else {
window.addEventListener("DOMContentLoaded", resolve, false);
}
});
function contextmenuInfoItemAppearedFn(target) {
const btn = target.closest('.ytp-menuitem[role="menuitem"]');
if (!btn) return;
if (btn.parentNode.querySelector('.ytp-menuitem[role="menuitem"].audio-only-toggle-btn')) return;
document.documentElement.classList.add('with-audio-only-toggle-btn');
const newBtn = btn.cloneNode(true)
newBtn.querySelector('.ytp-menuitem-label').textContent = `Turn ${isEnable ? 'OFF' : 'ON'} YouTube Audio Mode`;
newBtn.classList.add('audio-only-toggle-btn');
btn.parentNode.insertBefore(newBtn, btn.nextSibling);
newBtn.addEventListener('click', async () => {
await GM.setValue("isEnable_aWsjF", !isEnable);
location.reload();
});
}
function mobileMenuItemAppearedFn(target) {
const btn = target.closest('ytm-menu-item');
if (!btn) return;
if (btn.parentNode.querySelector('ytm-menu-item.audio-only-toggle-btn')) return;
document.documentElement.classList.add('with-audio-only-toggle-btn');
const newBtn = btn.cloneNode(true);
newBtn.querySelector('.menu-item-button').textContent = `Turn ${isEnable ? 'OFF' : 'ON'} YouTube Audio Mode`;
newBtn.classList.add('audio-only-toggle-btn');
btn.parentNode.insertBefore(newBtn, btn.nextSibling);
newBtn.addEventListener('click', async () => {
await GM.setValue("isEnable_aWsjF", !isEnable);
location.reload();
});
}
pLoad.then(() => {
document.addEventListener('animationstart', (evt) => {
const animationName = evt.animationName;
if (!animationName) return;
if (animationName === 'contextmenuInfoItemAppeared') contextmenuInfoItemAppearedFn(evt.target);
if (animationName === 'mobileMenuItemAppeared') mobileMenuItemAppearedFn(evt.target);
}, true);
const style = document.createElement('style');
style.id = 'fm9v0';
style.textContent = `
.html5-video-container {
background-color: black;
}
/* #movie_player > .ytp-iv-video-content {
pointer-events: none; // allow clicking
} */
#movie_player > .html5-video-container:not(:empty) {
box-sizing: border-box;
height: 100%;
}
@keyframes mobileMenuItemAppeared {
0% {
background-position-x: 3px;
}
100% {
background-position-x: 4px;
}
}
ytm-select.player-speed-settings ~ ytm-menu-item:last-of-type {
animation: mobileMenuItemAppeared 1ms linear 0s 1 normal forwards;
}
@keyframes contextmenuInfoItemAppeared {
0% {
background-position-x: 3px;
}
100% {
background-position-x: 4px;
}
}
.ytp-contextmenu .ytp-menuitem[role="menuitem"] path[d^="M22 34h4V22h-4v12zm2-30C12.95"]{
animation: contextmenuInfoItemAppeared 1ms linear 0s 1 normal forwards;
}
.with-audio-only-toggle-btn .ytp-contextmenu,
.with-audio-only-toggle-btn .ytp-contextmenu .ytp-panel-menu,
.with-audio-only-toggle-btn .ytp-contextmenu .ytp-panel {
height: 40vh !important;
min-height: 36rem !important;
}
#confirmDialog794 {
z-index:999999 !important;
display: none;
/* Hidden by default */
position: fixed;
/* Stay in place */
z-index: 1;
/* Sit on top */
left: 0;
top: 0;
width: 100%;
/* Full width */
height: 100%;
/* Full height */
overflow: auto;
/* Enable scroll if needed */
background-color: rgba(0,0,0,0.4);
/* Black w/ opacity */
}
#confirmDialog794 .confirm-box {
position:relative;
color: black;
z-index:999999 !important;
background-color: #fefefe;
margin: 15% auto;
/* 15% from the top and centered */
padding: 20px;
border: 1px solid #888;
width: 30%;
/* Could be more or less, depending on screen size */
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
}
#confirmDialog794 .confirm-buttons {
text-align: right;
}
#confirmDialog794 button {
margin-left: 10px;
}
`
document.head.appendChild(style);
})
})();