YouTube: Audio Only

No Video Streaming

目前为 2024-02-03 提交的版本。查看 最新版本

// ==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);
    })


})();