Greasy Fork

Greasy Fork is available in English.

YouTube: Audio Only

No Video Streaming

当前为 2024-12-27 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name                YouTube: Audio Only
// @description         No Video Streaming
// @namespace           UserScript
// @version             2.0.0
// @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
// @grant               GM.listValues
// @grant               GM.deleteValue
// @run-at              document-start
// @license             MIT
// @compatible          chrome
// @compatible          firefox
// @compatible          opera
// @compatible          edge
// @compatible          safari
// @allFrames           true
//
// ==/UserScript==

(async function () {
    'use strict';

    // document.mfk33 = new Set([
    //     'html5_enable_ssap_autoplay_debug_logging', // 1
    //     // 'enable_visit_advertiser_support_on_ipad_mweb',
    //     // 'html5_shorts_onesie_mismatched_fix',
    //     // 'html5_early_media_for_drm',
    //     // 'allow_vp9_1080p_mq_enc',
    //     // 'html5_onesie_preload_use_content_owner',
    //     'html5_exponential_memory_for_sticky', // 1
    //     // 'html5_perf_cap_override_sticky',
    //     // 'html5_perserve_av1_perf_cap',
    //     // 'html5_disable_low_pipeline',
    //     'html5_publish_all_cuepoints', // 2
    //     'html5_ultra_low_latency_subsegment_readahead', // 2
    //     // 'html5_disable_move_pssh_to_moov',
    //     'html5_sunset_aac_high_codec_family', // 2
    //     // 'html5_enable_ssap_seteos',
    //     // 'html5_catch_errors_for_rollback',
    //     // 'html5_sabr_enable_utc_seek_requests',
    //     // 'html5_sabr_enable_live_clock_offset',
    //     // 'html5_disable_client_resume_policy_for_sabr',
    //     'html5_trigger_loader_when_idle_network', // 2
    //     'web_key_moments_markers', // 3
    //     'embeds_use_parent_visibility_in_ve_logging', // 1
    //     'html5_onesie' // 1
    // ]);

    // URL.revokeObjectURL = function(objectURL){
    //     console.log('revokeObjectURL', ...arguments)
    //     return;
    // }

    !window.TTP && (() => {
        // credit to Benjamin Philipp
        // original source: http://greasyfork.icu/en/scripts/433051-trusted-types-helper

        // --------------------------------------------------- Trusted Types Helper ---------------------------------------------------

        const overwrite_default = false; // If a default policy already exists, it might be best not to overwrite it, but to try and set a custom policy and use it to manually generate trusted types. Try at your own risk
        const prefix = `TTP`;
        var passThroughFunc = function (string, sink) {
            return string; // Anything passing through this function will be returned without change
        }
        var TTPName = "passthrough";
        var TTP_default, TTP = { createHTML: passThroughFunc, createScript: passThroughFunc, createScriptURL: passThroughFunc }; // We can use TTP.createHTML for all our assignments even if we don't need or even have Trusted Types; this should make fallbacks and polyfills easy
        var needsTrustedHTML = false;
        function doit() {
            try {
                if (typeof window.isSecureContext !== 'undefined' && window.isSecureContext) {
                    if (window.trustedTypes && window.trustedTypes.createPolicy) {
                        needsTrustedHTML = true;
                        if (trustedTypes.defaultPolicy) {
                            log("TT Default Policy exists");
                            if (overwrite_default)
                                TTP = window.trustedTypes.createPolicy("default", TTP);
                            else
                                TTP = window.trustedTypes.createPolicy(TTPName, TTP); // Is the default policy permissive enough? If it already exists, best not to overwrite it
                            TTP_default = trustedTypes.defaultPolicy;

                            log("Created custom passthrough policy, in case the default policy is too restrictive: Use Policy '" + TTPName + "' in var 'TTP':", TTP);
                        }
                        else {
                            TTP_default = TTP = window.trustedTypes.createPolicy("default", TTP);
                        }
                        log("Trusted-Type Policies: TTP:", TTP, "TTP_default:", TTP_default);
                    }
                }
            } catch (e) {
                log(e);
            }
        }

        function log(...args) {
            if ("undefined" != typeof (prefix) && !!prefix)
                args = [prefix + ":", ...args];
            if ("undefined" != typeof (debugging) && !!debugging)
                args = [...args, new Error().stack.replace(/^\s*(Error|Stack trace):?\n/gi, "").replace(/^([^\n]*\n)/, "\n")];
            console.log(...args);
        }

        doit();

        // --------------------------------------------------- Trusted Types Helper ---------------------------------------------------

        window.TTP = TTP;

    })();

    function createHTML(s) {
        if (typeof TTP !== 'undefined' && typeof TTP.createHTML === 'function') return TTP.createHTML(s);
        return s;
    }

    let trustHTMLErr = null;
    try {
        document.createElement('div').innerHTML = createHTML('1');
    } catch (e) {
        trustHTMLErr = e;
    }

    if (trustHTMLErr) {
        console.log(`trustHTMLErr`, trustHTMLErr);
        trustHTMLErr(); // exit userscript
    }

    /** @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', createHTML(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 kEventListener = (evt) => {
        if (document.documentElement.hasAttribute('forceRefresh032')) {
            evt.stopImmediatePropagation();
            evt.stopPropagation();
        }
    }
    window.addEventListener('beforeunload', kEventListener, false);

    const pageInjectionCode = function () {

        let debugFlg001 = false;
        // let debugFlg002 = false;
        let globalPlayer = null;
        const SHOW_VIDEO_STATIC_IMAGE = true;
        const PATCH_MEDIA_PUBLISH = true;

        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_;
                    }
                }
            };
        })();

        /* globals WeakRef:false */

        /** @type {(o: Object | null) => WeakRef | null} */
        const mWeakRef = typeof WeakRef === 'function' ? (o => o ? new WeakRef(o) : null) : (o => o || null);

        /** @type {(wr: Object | null) => Object | null} */
        const kRef = (wr => (wr && wr.deref) ? wr.deref() : wr);

        /*

            g.k.playVideo = function(a) {
                this.logger.debug(function() {
                    return "play video, player type " + a
                });
                var b = g.rT(this, a);
                b && (this.appState === 2 ? (g.BR(this.X) && $U(this.Rb),
                N0(this)) : g.pF(b.getPlayerState(), 2) ? (b = 36,
                this.getVideoData().nk() && (b = 37),
                this.seekTo(0, void 0, void 0, void 0, b)) : b.playVideo())
            }

            g.k.getPresentingPlayerType = function(a) {
                if (this.appState === 1)
                    return 1;
                if (J0(this))
                    return 3;
                var b;
                if (a && ((b = this.ye) == null ? 0 : b.vl(this.getCurrentTime())))
                    return 2;
                var c;
                return g.zS(this.getVideoData()) && ((c = this.wb) == null ? 0 : c.vl()) ? 2 : g.rT(this).getPlayerType()
            }

            g.k.rS = function() {
                var a = this.app.getPresentingPlayerType();
                if (a === 2 && !this.app.Jf()) {
                    var b = zV(this.app.zb());
                    if (!Dkb(b) || Ekb(b))
                        return
                }
                a === 3 ? AT(this.app.zb()).iG("control_play") : this.app.U().L("html5_ssap_ignore_play_for_ad") && g.zS(this.app.Od()) && a === 2 || this.app.playVideo(a)
            }
        */

        // const onDurationAvailable = async function(player_, media){
        //     if (media instanceof HTMLMediaElement && media.__canPlayPromise__ && media.duration > 0 && media.networkState >= 2 && media.readyState >= 1) {
        //         skipPause = true;
        //         skipVisibility = true;
        //         debugFlg002 && console.log(1991, player_.getPresentingPlayerType())
        //         await player_.cancelPlayback();
        //         debugFlg002 && console.log(1992, player_.getPresentingPlayerType())
        //         await player_.pauseVideo();
        //         debugFlg002 && console.log(1993, player_.getPresentingPlayerType())
        //         // window.m33e = 1;
        //         window.m34e = player_;
        //         // await player_.clearQueue();
        //         await player_.playVideo();
        //         skipVisibility = false;
        //         skipPause = false;

        //         debugFlg002 && console.log('HTMLMediaElement A2', [media.readyState, media.paused, media.networkState]);
        //         if (media instanceof HTMLMediaElement && media.__canPlayPromise__ && media.duration > 0 && media.networkState >= 2 && media.readyState >= 4) {
        //             media.__canPlayPromise__.resolve();
        //             media.__canPlayPromise__ = null;
        //         }
        //     }
        // }

        // let skipPause = false;
        // let skipVisibility = false;
        // const durationchangeListener = async function (evt) {
        //     const media = evt ? evt.target : null;
        //     if (media instanceof HTMLMediaElement && media.__canPlayPromise__ && media.duration > 0 && media.networkState >= 2 && media.readyState >= 1) {
        //         if (media.readyState < 4) {
        //             debugFlg002 && console.log('HTMLMediaElement A1', [media.readyState, media.paused, media.networkState])
        //             const player_ = kRef(globalPlayer);
        //             if (player_) {
        //                 onDurationAvailable(player_, media);
        //             } else {
        //                 console.error("HTMLMediaElement", "player_ is not found when HTMLMediaElement duration change");
        //             }
        //         } else {
        //             debugFlg002 && console.log('HTMLMediaElement B', [media.readyState, media.paused, media.networkState])
        //             media.__canPlayPromise__.resolve();
        //             media.__canPlayPromise__ = null;
        //         }
        //     }
        // }

        // const canplayListener = function (evt) {
        //     const media = evt ? evt.target : null;
        //     if (media && media.__canPlayPromise__) {
        //         debugFlg002 && console.log('HTMLMediaElement canplay', [media.readyState, media.paused, media.networkState]);
        //         media.__canPlayPromise__.resolve();
        //         media.__canPlayPromise__ = null;
        //     }
        //     debugFlg002 && console.log('HTMLMediaElement canplay')
        // }

        // let x6CGdPr = null;
        // window.addEventListener('message', (evt)=>{
        //   if((evt||0).data === 'x6CGd' && x6CGdPr!==null) x6CGdPr.resolve();
        // });
        // const timelineResolve = async () => {
        //   if (x6CGdPr !== null) {
        //     await x6CGdPr.then();
        //     return;
        //   }
        //   x6CGdPr = new PromiseExternal();
        //   window.postMessage('x6CGd');
        //   await x6CGdPr.then();
        //   x6CGdPr = null;
        // }

        // let playWId = 0;

        // const mediaPlay = HTMLMediaElement.prototype.play
        // HTMLMediaElement.prototype.play = function () {
        //     debugFlg002 && console.log('HTMLMediaElement play')
        //     if (playWId > 1e9) playWId = 9;
        //     const tid = ++playWId;
        //     if (!this.paused) {
        //         return mediaPlay.apply(this, arguments);
        //     }
        //     if (this.readyState >= 4) return mediaPlay.apply(this, arguments);
        //     try {
        //         if (!this.__canPlayPromise__ && this.closest('#player')) {
        //             this.__canPlayPromise__ = new PromiseExternal();
        //             const player_ = kRef(globalPlayer);
        //             debugFlg002 && console.log('HTMLMediaElement play x', this.duration, player_)
        //             if (!(this.duration > 0)) {
        //                 this.removeEventListener('durationchange', durationchangeListener);
        //                 this.addEventListener('durationchange', durationchangeListener);
        //                 this.removeEventListener('canplay', canplayListener);
        //                 this.addEventListener('canplay', canplayListener);
        //             } else if (player_) {
        //                 this.removeEventListener('canplay', canplayListener);
        //                 this.addEventListener('canplay', canplayListener);
        //                 onDurationAvailable(player_, this);
        //             } else {
        //                 console.error("HTMLMediaElement", "player_ is not found when HTMLMediaElement plays");
        //             }

        //             //---------------


        //             // this.addEventListener('canplaythrough', function(){
        //             //     console.log('HTMLMediaElement canplaythrough')
        //             // });
        //             // this.addEventListener('loadeddata', function(){
        //             //     console.log('HTMLMediaElement loadeddata')
        //             // });
        //             // this.addEventListener('loadedmetadata', function(){
        //             //     console.log('HTMLMediaElement loadedmetadata')
        //             // });

        //             //---------------

        //             // this.addEventListener('abort', function(){
        //             //     console.log('HTMLMediaElement abort')
        //             // });
        //             // this.addEventListener('emptied', function(){
        //             //     console.log('HTMLMediaElement emptied')
        //             // });
        //             // this.addEventListener('error', function(){
        //             //     console.log('HTMLMediaElement error')
        //             // });
        //             // this.addEventListener('ended', function(){
        //             //     console.log('HTMLMediaElement ended')
        //             // });
        //             // this.addEventListener('loadstart', function(){
        //             //     console.log('HTMLMediaElement loadstart')
        //             // });
        //         }

        //     } catch (e) {
        //         console.log('HTMLMediaElement.prototype.play error');
        //         console.error(e);
        //         this.__canPlayPromise__ = Promise.resolve();
        //     }
        //     const promise = this.__canPlayPromise__;
        //     return (async () => {
        //         await promise.then();
        //         if (tid !== playWId) return;
        //         return await mediaPlay.apply(this, arguments);
        //     })();
        // }
        // const mediaPause = HTMLMediaElement.prototype.pause
        // HTMLMediaElement.prototype.pause = function () {
        //     if (skipPause) return;
        //     debugFlg002 && console.log('HTMLMediaElement pause')
        //     if (playWId > 1e9) playWId = 9;
        //     const tid = ++playWId;
        //     const promise = this.__canPlayPromise__;
        //     if (promise) {
        //         promise.resolve();
        //         this.__canPlayPromise__ = null;
        //     }
        //     return mediaPause.apply(this, arguments);
        // }



        // const createPipeline = () => {
        //     let pipelineMutex = Promise.resolve();
        //     const pipelineExecution = fn => {
        //         return new Promise((resolve, reject) => {
        //             pipelineMutex = pipelineMutex.then(async () => {
        //                 let res;
        //                 try {
        //                     res = await fn();
        //                 } catch (e) {
        //                     console.log('error_F1', e);
        //                     reject(e);
        //                 }
        //                 resolve(res);
        //             }).catch(console.warn);
        //         });
        //     };
        //     return pipelineExecution;
        // }

        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);

        const prototypeInherit = (d, b) => {
            const m = Object.getOwnPropertyDescriptors(b);
            for (const p in m) {
                if (!Object.getOwnPropertyDescriptor(d, p)) {
                    Object.defineProperty(d, p, m[p]);
                }
            }
        };

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

        };


        const attachOneTimeEvent = function (eventType, callback) {
            let kz = false;
            document.addEventListener(eventType, function (evt) {
                if (kz) return;
                kz = true;
                callback(evt);
            }, { capture: true, passive: true, once: true });
        }

        function removeTempObjectProp01() {
            delete Object.prototype['kevlar_non_watch_unified_player'];
            delete Object.prototype['kevlar_unified_player'];
        }

        function ytConfigFix(config__) {
            const config_ = config__;

            if (config_) {

                const playerKevlar = ((config_ || 0).WEB_PLAYER_CONTEXT_CONFIGS || 0).WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH || 0;

                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,'')
                    }

                }

                removeTempObjectProp01();

                let configs = config_.WEB_PLAYER_CONTEXT_CONFIGS || {};
                for (const [key, entry] of Object.entries(configs)) {

                    if (entry && typeof entry.serializedExperimentFlags === 'string' && entry.serializedExperimentFlags.length > 16) {
                        // 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;

                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;
                }

            }
        }

        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 fa = 0;

        let cv = null;
        let durationchangeForMobile = false;
        function fixThumbnailURL(src) {
            if (typeof src === 'string' && src.length >= 4) {
                let m = /\b[a-z0-9]{4,13}\.jpg\b/.exec(src);
                if (m && m[0]) {
                    const t = m[0];
                    let idx = src.indexOf(t);
                    let nSrc = idx >= 0 ? src.substring(0, idx + t.length) : '';
                    return nSrc;
                }
            }
            return src;
        }

        const isDesktopSite = location.origin === 'https://www.youtube.com' && !location.pathname.startsWith('/embed/');

        const getThumbnailUrlFromThumbnails = (thumbnails) => {

            let thumbnailUrl = '';
            if (thumbnails && thumbnails.length >= 1) {
                const arr = thumbnails.map(e => {
                    return e.url ? [e.width * e.height, e.url] : typeof e === 'string' ? [0, e] : [0, '']
                });
                arr.sort((a, b) => b[0] - a[0]);
                thumbnailUrl = arr[0][1]
                if (typeof thumbnailUrl === 'string') {
                    thumbnailUrl = fixThumbnailURL(thumbnailUrl);
                }
            }
            return thumbnailUrl;
        }

        const pmof = () => {

            if (SHOW_VIDEO_STATIC_IMAGE) {

                const medias = [...document.querySelectorAll('ytd-watch-flexy #player .html5-video-container .video-stream.html5-main-video')].filter(e => !e.closest('[hidden]'));
                if (medias.length !== 1) return;
                const mediaElement = medias[0];

                const container = mediaElement ? mediaElement.closest('.html5-video-container') : null;
                if (!container) return;

                let thumbnailUrl = '';
                const ytdPage = container.closest('ytd-watch-flexy');
                if (ytdPage && ytdPage.is === 'ytd-watch-flexy') {
                    const cnt = insp(ytdPage);
                    let thumbnails = null;
                    try {
                        thumbnails = cnt.polymerController.__data.playerData.videoDetails.thumbnail.thumbnails
                        // thumbnails = cnt.__data.watchNextData.playerOverlays.playerOverlayRenderer.autoplay.playerOverlayAutoplayRenderer.background.thumbnails
                    } catch (e) { }

                    thumbnailUrl = getThumbnailUrlFromThumbnails(thumbnails);
                }


                if (thumbnailUrl && typeof thumbnailUrl === 'string') {
                    container.style.setProperty('--audio-only-thumbnail-image', `url(${thumbnailUrl})`);
                } else {
                    container.style.removeProperty('--audio-only-thumbnail-image')
                }

            }


        }
        const pmo = new MutationObserver(pmof);

        isDesktopSite && document.addEventListener('yt-navigate-finish', () => {
            const ytdWatchFlexy = document.querySelector('ytd-watch-flexy');
            if (ytdWatchFlexy) {
                pmo.observe(ytdWatchFlexy, { attributes: true });
                ytdWatchFlexy.setAttribute('ytzNavigateFinish', Date.now());
            }
        });
        document.addEventListener('durationchange', (evt) => {
            const target = (evt || 0).target;
            if (!(target instanceof HTMLMediaElement)) return;
            const targetClassList = target.classList || 0;
            const isPlayerVideo = typeof targetClassList.contains === 'function' ? targetClassList.contains('video-stream') && targetClassList.contains('html5-main-video') : false;

            if (durationchangeForMobile || isPlayerVideo) {
                if (target.readyState !== 1) {
                    fa = 1;
                } else {
                    fa = 2;
                }
            }

            if (isPlayerVideo) {

                if (target.readyState === 1 && target.networkState === 2) {
                    target.__spfgs__ = true;
                    if (cv) {
                        cv.resolve();
                        cv = null;
                    }
                } else {
                    target.__spfgs__ = false;
                }

                if (isDesktopSite) {
                    const ytdWatchFlexy = document.querySelector('ytd-watch-flexy');
                    if (ytdWatchFlexy) {
                        ytdWatchFlexy.setAttribute('ytzMediaDurationChanged', Date.now());
                    }
                }

                if (onVideoChangeForMobile) {
                    onVideoChangeForMobile();
                }

            }
        }, 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 onVideoChangeForMobile = null;

        let removeBottomOverlayForMobile = null;

        let clickLockFn = null;
        let clickTarget = null;
        if (location.origin === 'https://m.youtube.com') {

            EventTarget.prototype.addEventListener322 = EventTarget.prototype.addEventListener;

            const dummyFn = () => { };
            EventTarget.prototype.addEventListener = function (evt, fn, opts) {

                let hn = fn;

                // if (evt === 'player-error') {
                // } else if (evt === 'player-detailed-error') {
                // } else if (evt === 'video-data-change') {
                // } else if (evt === 'player-state-change') {
                // } else
                if (evt === 'player-autonav-pause' || evt === 'visibilitychange') {
                    evt += 'y'
                    fn = dummyFn;
                } else if (evt === 'click' && this.id === 'movie_player') {
                    clickLockFn = fn;
                    clickTarget = this;
                }
                return this.addEventListener322(evt, hn, opts)

            }

        }



        (() => {

            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;
                prototypeInherit(c.prototype, XMLHttpRequest_.prototype);
                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 updateLastActiveTimeAsync_ = (player_) => {
            if (player_ && typeof player_.updateLastActiveTime === 'function') {
                player_.updateLastActiveTime();
            }
        };

        const updateLastActiveTimeAsync = (evt) => {
            Promise.resolve(evt?.updateLastActiveTime ? evt : evt?.target).then(updateLastActiveTimeAsync_);
        };



        const { setupAudioPlaying } = (() => {

            let key_mediaElementT = '';

            let internalAppXT = null;
            let standardAppXT = null;
            let playerAppXT = null;

            const internalAppUT = new Set();
            const standardAppUT = new Set();
            const playerAppUT = new Set();
            let dirtyMark = 1 | 2 | 4;


        const getMediaElement = ()=>{

            const internalApp = internalAppXM();
            const standardApp = standardAppXM();

            let t;

            if (t = internalApp?.mediaElement?.[key_mediaElementT]) return t;


            if (t = standardApp?.mediaElement?.[key_mediaElementT]) return t;

            return null;

            

        }
            const updateInternalAppFn = (x) => {
                if (x !== internalAppXT) dirtyMark = 1 | 2 | 4;
                internalAppUT.add(x);
                internalAppXT = x;
                // videoData
                // stopVideo
                // pauseVideo 
            }

            window.gt3 = () => internalAppXM();
            const internalAppXM = () => {
                if (!(dirtyMark & 4)) return internalAppXT;
                if (!key_mediaElementT) return internalAppXT;
                let result = null;
                for (const p of internalAppUT) {
                    if (!p.mediaElement) {
                        internalAppUT.delete(p);
                    } else {
                        const element = p.mediaElement[key_mediaElementT];
                        if (element instanceof Element) {
                            if (element.closest('[hidden]')) {

                            } else if (result === null) {
                                result = p;
                            }
                        }
                    }
                }
                internalAppXT = result;
                if (dirtyMark & 4) dirtyMark -= 4;
                return result;
            }

            const updateStandardAppFn = (x) => {
                if (x !== standardAppXT) dirtyMark = 1 | 2 | 4;
                standardAppUT.add(x);
                standardAppXT = x;
                // isAtLiveHead
                // cancelPlayback
                // stopVideo
                // pauseVideo
            }
            window.gt2 = () => standardAppXM();

            const loadVideoByPlayerVarsP20 = {};
            const loadVideoByPlayerVarsQ20 = new Map();
            

            const standardAppXM = () => {

                if (!(dirtyMark & 2)) return standardAppXT;

                const internalApp = internalAppXM();
                if (!internalApp) return standardAppXT;
                const mediaElement = internalApp.mediaElement;


                let result = null;
                for (const p of standardAppUT) {
                    if (!p.mediaElement) {
                        standardAppUT.delete(p);
                    } else {
                        if (p.mediaElement === mediaElement) result = p;
                    }
                }
                standardAppXT = result;
                if (dirtyMark & 2) dirtyMark -= 2;
                return result;

            }

            // player could be just a DOM element without __proto__
            // will this update fail?
            const updatePlayerAppFn = (x) => {
                if (x !== playerAppXT) dirtyMark = 1 | 2 | 4;
                console.log('updatePlayerAppFn')
                playerAppUT.add(x);
                playerAppXT = x;


                const player_ = playerAppXT;
                if(!player_.__onVideoProgressF381__){
                    player_.__onVideoProgressF381__ = true;
                    player_.addEventListener('onVideoProgress', updateLastActiveTimeAsync); // desktop
                }
            }
            const playerAppXM = () => {

                if (!(dirtyMark & 1)) return playerAppXT;

                const standardApp = standardAppXM();
                if (!standardAppXM) return playerAppXT;

                const playerAppUA = [...playerAppUT];
                loadVideoByPlayerVarsQ20.clear();
                for (let i = 0; i < playerAppUA.length; i++) {
                    const playerApp = playerAppUA[i];
                    loadVideoByPlayerVarsP20.index = i;
                    try {
                        playerApp.loadVideoByPlayerVars(loadVideoByPlayerVarsP20, 0, 0);
                    } catch (e) { }
                    loadVideoByPlayerVarsP20.index = -1;
                }
                window.loadVideoByPlayerVarsQ20 = loadVideoByPlayerVarsQ20;

                const j = loadVideoByPlayerVarsQ20.get(standardApp);

                const result = Number.isFinite(j) && j >= 0 ? playerAppUA[j] : null;

                const idxSet = new Set(loadVideoByPlayerVarsQ20.values());

                for (let i = 0; i < playerAppUA.length; i++) {
                    if (!idxSet.has(i)) playerAppUT.delete(playerAppUA[i]);
                }
                // loadVideoByPlayerVarsQ20.clear();

                playerAppXT = result;
                if (dirtyMark & 1) dirtyMark -= 1;
                return result;

            }
            window.gt1 = () => playerAppXM();


            const isIterable = (x) => Symbol.iterator in Object(x);
            let setupFnsB = false;
            const setupFns = () => {
                if (setupFnsB) return;
                setupFnsB = true;

                try {


                    {

                        const internalApp = internalAppXM();

                        console.log('[yt-audio-only] internalApp', !internalApp ? 0 : [!!internalApp.playVideo, !!internalApp.pauseVideo, !!internalApp.stopVideo, !internalApp.cancelPlayback])
                        {
                            const { playVideo, pauseVideo, stopVideo } = internalApp;

                            console.log('[yt-audio-only] internalApp', { playVideo, pauseVideo, stopVideo });
                        }



                    }

                    let internalAppPT_ = null;
                    let standardAppPT_ = null;

                    {

                        const internalApp = internalAppXM();


                        const standardApp = standardAppXM();


                        internalAppPT_ = (internalApp ? internalApp.__proto__ : null) || 0;

                        standardAppPT_ = (standardApp ? standardApp.__proto__ : null) || 0;
                    }



                    const internalAppPT = internalAppPT_;

                    const standardAppPT = standardAppPT_;



                    const flags_ = {}
                    let qma = 0;
                    const flagOn_ = (flags, key, bool) => {
                        flags_[key] = flags[key];
                        flags[key] = typeof flags[key] === 'boolean' ? bool : `${bool}`;
                    }
                    const flagOn = () => {
                        // return;
                        const internalApp = internalAppXM();
                        if (!key_yn) return;
                        const flags = internalApp?.[key_yn]?.experiments?.flags || 0;
                        if (!flags) return;
                        if (qma < 0) return;
                        qma++;
                        if (qma > 1) return;
                        flagOn_(flags, 'html5_enable_ssap_autoplay_debug_logging', false);
                        // flagOn_(flags, 'enable_visit_advertiser_support_on_ipad_mweb', false);
                        // flagOn_(flags, 'html5_shorts_onesie_mismatched_fix', false);
                        // flagOn_(flags, 'html5_early_media_for_drm', false);
                        // flagOn_(flags, 'allow_vp9_1080p_mq_enc', false);
                        // flagOn_(flags, 'html5_onesie_preload_use_content_owner', false);
                        flagOn_(flags, 'html5_exponential_memory_for_sticky', false);
                        // flagOn_(flags, 'html5_perf_cap_override_sticky', false);
                        // flagOn_(flags, 'html5_perserve_av1_perf_cap', false);
                        // flagOn_(flags, 'html5_disable_low_pipeline', false);
                        flagOn_(flags, 'html5_publish_all_cuepoints', false);
                        flagOn_(flags, 'html5_ultra_low_latency_subsegment_readahead', false);
                        // flagOn_(flags, 'html5_disable_move_pssh_to_moov', false);
                        flagOn_(flags, 'html5_sunset_aac_high_codec_family', false);
                        // flagOn_(flags, 'html5_enable_ssap_seteos', false);

                        // flagOn_(flags, 'html5_catch_errors_for_rollback', false);
                        // flagOn_(flags, 'html5_sabr_enable_utc_seek_requests', false);
                        // flagOn_(flags, 'html5_sabr_enable_live_clock_offset', false);
                        // flagOn_(flags, 'html5_disable_client_resume_policy_for_sabr', false);
                        flagOn_(flags, 'html5_trigger_loader_when_idle_network', false);

                        flagOn_(flags, 'web_key_moments_markers', false);
                        flagOn_(flags, 'embeds_use_parent_visibility_in_ve_logging', false);
                        flagOn_(flags, 'html5_onesie', false);
                        qma = 1;
                    }

                    const flagOff = () => {

                        // return;
                        const internalApp = internalAppXM();
                        if (!key_yn) return;
                        const flags = internalApp?.[key_yn]?.experiments?.flags || 0;
                        if (!flags) return;
                        if (qma <= 0) return;
                        qma--;
                        if (qma > 1) return;
                        for (const [key, value] of Object.entries(flags_)) {
                            flags[key] = value;
                        }
                        qma = 0;
                    }

                    if (internalAppPT && internalAppPT.playVideo && !internalAppPT.playVideo9391) {
                        internalAppPT.playVideo9391 = internalAppPT.playVideo;

                        internalAppPT.playVideo = function (p, C) {
                            updateInternalAppFn(this);
                            console.log('[yt-audio-only] internalApp.playVideo');
                            try {
                                flagOn();
                                return this.playVideo9391(...arguments);
                            } catch (e) {
                                console.warn(e);
                            } finally {
                                flagOff();
                            }
                        }
                        internalAppPT.playVideo.toString = internalAppPT.playVideo9391.toString.bind(internalAppPT.playVideo9391);



                    }


                    if (internalAppPT && internalAppPT.pauseVideo && !internalAppPT.pauseVideo9391) {

                        internalAppPT.pauseVideo9391 = internalAppPT.pauseVideo;

                        internalAppPT.pauseVideo = function (p) {
                            updateInternalAppFn(this);
                            console.log('[yt-audio-only] internalApp.pauseVideo');
                            try {
                                flagOn();
                                return this.pauseVideo9391(...arguments);
                            } catch (e) {
                                console.warn(e);
                            } finally {
                                flagOff();
                            }
                        }
                        internalAppPT.pauseVideo.toString = internalAppPT.pauseVideo9391.toString.bind(internalAppPT.pauseVideo9391);


                    }


                    if (internalAppPT && internalAppPT.stopVideo && !internalAppPT.stopVideo9391) {

                        internalAppPT.stopVideo9391 = internalAppPT.stopVideo;

                        internalAppPT.stopVideo = function () {
                            updateInternalAppFn(this);
                            console.log('[yt-audio-only] internalApp.stopVideo');
                            try {
                                flagOn();
                                return this.stopVideo9391(...arguments);
                            } catch (e) {
                                console.warn(e);
                            } finally {
                                flagOff();
                            }
                        }
                        internalAppPT.stopVideo.toString = internalAppPT.stopVideo9391.toString.bind(internalAppPT.stopVideo9391);


                    }


                    if (internalAppPT && internalAppPT.seekTo && !internalAppPT.seekTo9391 && 0) {

                        internalAppPT.seekTo9391 = internalAppPT.seekTo;

                        internalAppPT.seekTo = function (p) {
                            updateInternalAppFn(this);
                            console.log('[yt-audio-only] internalApp.seekTo');
                            const isPlaying = this.isPlaying();
                            try {
                                flagOn();
                                return this.seekTo9391(...arguments);
                            } catch (e) {
                                console.warn(e);
                            } finally {
                                flagOff();
                                isPlaying && this.playVideo();
                            }
                        }
                        internalAppPT.seekTo.toString = internalAppPT.seekTo9391.toString.bind(internalAppPT.seekTo9391);


                    }


                    let key_yn = '';
                    let key_nS = '';

                    {

                        const internalApp = internalAppXM();

                        for (const [key, value] of Object.entries(internalApp)) {
                            if (typeof (value || 0) === 'object' && value.experiments && value.experiments.flags && !isIterable(value)) {
                                key_yn = key;
                            } else if (typeof (value || 0) === 'object' && 'videoTrack' in value && 'audioTrack' in value && 'isSuspended' in value && !isIterable(value)) {


                                key_nS = key;
                            }
                        }
                    }



                    {



                        const internalApp = internalAppXM();



                        if (internalApp && typeof (internalApp.mediaElement || 0) === 'object') {
                            for (const [key, value] of Object.entries(internalApp.mediaElement)) {
                                if (value instanceof HTMLMediaElement) {
                                    key_mediaElementT = key;
                                }
                            }
                        }


                    }

                    let lastRecord = [];

                    if (standardAppPT && typeof standardAppPT.loadVideoByPlayerVars === 'function' && !standardAppPT.loadVideoByPlayerVars311) {

                        standardAppPT.loadVideoByPlayerVars311 = standardAppPT.loadVideoByPlayerVars;

                        standardAppPT.loadVideoByPlayerVars = function (p, C, V, N, H) {
                            if (p === loadVideoByPlayerVarsP20) {
                                // console.log('loadVideoByPlayerVarsP20', p, p.index)
                                loadVideoByPlayerVarsQ20.set(this, p.index);
                                return;
                            }
                            updateStandardAppFn(this)
                            if (p && typeof p === 'object') {

                                const { adPlacements, adSlots } = p.raw_player_response || {};
                                if (isIterable(adPlacements)) adPlacements.length = 0;
                                if (isIterable(adSlots)) adSlots.length = 0;

                                lastRecord.length = 0;
                                lastRecord.push(...[p, C, V, N, H]);
                                console.log('lastRecord 03022', [...lastRecord])
                            }

                            return this.loadVideoByPlayerVars311(...arguments);
                        }
                    }






                    // let bypass2 = false;
                    // let bypass3 = false;

                    // if (!HTMLAudioElement.prototype.pause3828) {

                    //     HTMLAudioElement.prototype.pause3828 = HTMLAudioElement.prototype.pause;


                    //     HTMLAudioElement.prototype.pause = async function () {

                    //         if (bypass2) return await this.pause3828();
                    //         bypass2 = true;


                    //         const audio = this;

                    //         const stateObject = player_ ? player_.getPlayerStateObject() : {};

                    //         const isBuffering = stateObject.isBuffering === true;

                    //         if ((isBuffering || stateObject.isSeeking) && !stateObject.isEnded && !stateObject.isError && !stateObject.isCued && player_.isReady() && !stateObject.isOrWillBePlaying) {



                    //             Promise.resolve().then(async () => {

                    //                 await delayPn(100);

                    //                 const stateObject = player_ ? player_.getPlayerStateObject() : {};

                    //                 if (player_.getPlayerState() > 0 && (stateObject.isBuffering === true || stateObject.isSeeking) && !stateObject.isEnded && !stateObject.isError && !stateObject.isCued && player_.isReady() && !stateObject.isOrWillBePlaying) {
                    //                     bypass2 = true
                    //                     bypass3 = true
                    //                     await player_.cancelPlayback();

                    //                     bypass2 = false
                    //                     bypass3 = false


                    //                     await delayPn(8)

                    //                     bypass2 = true
                    //                     bypass3 = true
                    //                     await player_.pauseVideo();

                    //                     bypass2 = false
                    //                     bypass3 = false

                    //                 }


                    //             }).catch(console.warn);


                    //         }

                    //         try {

                    //             bypass2 = true
                    //             return await this.pause3828();
                    //         } catch (e) {

                    //         } finally {

                    //             bypass2 = false
                    //         }

                    //     }



                    // }

                    const clearVideoAndQueue = async () => { // avoid error in live streaming
                        const player_ = playerAppXM();
                        const standardApp = standardAppXM();
                        if (standardApp && standardApp.clearQueue) {
                            return await standardApp.clearQueue();
                        } else if (player_ && player_.clearQueue) {
                            return await player_.clearQueue();
                        } else {
                            return null;
                        }
                    }

                    const cancelPlayback = async () => {

                        const player_ = playerAppXM();
                        const standardApp = standardAppXM();
                        const internalApp = internalAppXM();

                        if (internalApp && internalApp.stopVideo && internalApp.pauseVideo && !internalApp.cancelPlayback) {
                            return await internalApp.stopVideo();
                        } else if (standardApp && standardApp.cancelPlayback) {
                            return await standardApp.cancelPlayback();
                        } else if (player_ && player_.cancelPlayback) {
                            return await player_.cancelPlayback();
                        } else {
                            return null;
                        }
                    }

                    const pauseVideo = async () => {


                        const player_ = playerAppXM();
                        const standardApp = standardAppXM();
                        const internalApp = internalAppXM();

                        if (internalApp && internalApp.stopVideo && internalApp.pauseVideo && !internalApp.cancelPlayback) {
                            return await internalApp.pauseVideo();
                        } else if (standardApp && standardApp.pauseVideo) {
                            return await standardApp.pauseVideo();
                        } else if (player_ && player_.pauseVideo) {
                            return await player_.pauseVideo();
                        } else {
                            return null
                        }
                    }

                    const playVideo = async () => {

                        const player_ = playerAppXM();
                        const standardApp = standardAppXM();
                        const internalApp = internalAppXM();

                        if (internalApp && internalApp.stopVideo && internalApp.pauseVideo && !internalApp.cancelPlayback && internalApp.playVideo) {
                            return await internalApp.playVideo();
                        } else if (standardApp && standardApp.playVideo) {
                            return await standardApp.playVideo();
                        } else if (player_ && player_.playVideo) {
                            return await player_.playVideo();
                        } else {
                            return null
                        }
                    }

                    const isAtLiveHeadW = async () => {

                        const player_ = playerAppXM();
                        const standardApp = standardAppXM();
                        const internalApp = internalAppXM();


                        if (internalApp && internalApp.isAtLiveHead) {
                            return await internalApp.isAtLiveHead()
                        } else if (standardApp && standardApp.isAtLiveHead) {
                            return await standardApp.isAtLiveHead()
                        } else if (player_ && player_.isAtLiveHead) {
                            return await player_.isAtLiveHead()
                        } else {
                            return null;
                        }
                    }


                    const isAdW = async () => {

                        const standardApp = standardAppXM();
                        const internalApp = internalAppXM();

                        const vd = (internalApp ? internalApp.videoData : (standardApp?standardApp.getVideoData():null)  ) || 0;

                        if (vd && typeof vd.isAd === 'function') {
                            return await vd.isAd();
                        } else if (vd && typeof vd.isAd === 'boolean') {

                            return vd.isAd;

                        } else {
                            return null;
                        }
                    }

                    const isLoadedW = async () => {

                        const standardApp = standardAppXM();
                        const internalApp = internalAppXM();


                        const vd = (internalApp ? internalApp.videoData : (standardApp?standardApp.getVideoData():null)  ) || 0;

                        if (vd && typeof vd.isLoaded === 'function') {
                            return await vd.isLoaded();
                        } else if (vd && typeof vd.isLoaded === 'boolean') {

                            return vd.isLoaded;

                        } else {
                            return null;
                        }

                    }

                    const getPlayerWrappedStateObject = ()=>{
                        

                        // g.h.oD = function(p) {
                        //     p = this.app.getPlayerStateObject(p);
                        //     return {
                        //         isBuffering: g.r(p, 1),
                        //         isCued: p.isCued(),
                        //         isDomPaused: g.r(p, 1024),
                        //         isEnded: g.r(p, 2),
                        //         isError: g.r(p, 128),
                        //         isOrWillBePlaying: p.isOrWillBePlaying(),
                        //         isPaused: p.isPaused(),
                        //         isPlaying: p.isPlaying(),
                        //         isSeeking: g.r(p, 16),
                        //         isUiSeeking: g.r(p, 32),
                        //         isUnstarted: g.r(p, 64)
                        //     }
                        // }
                        

                        const standardApp = standardAppXM();
                        const player_ = playerAppXM();
                        if (standardApp && typeof standardApp.getPlayerStateObject === 'function') {
                            const fo = standardApp.getPlayerStateObject();
                            const flag = fo ? (fo.state || 0) : 0;
                            return {
                                isBuffering: (flag & 1) === 1,
                                isCued: (flag & 64) === 64 && (flag & 8) === 0 && (flag & 4) === 0,
                                isDomPaused: (flag & 1024) === 1024,
                                isEnded: (flag & 2) === 2,
                                isError: (flag & 128) === 128,
                                isOrWillBePlaying: (flag & 8) === 8 && (flag & 2) === 0 && (flag & 1024) === 0,
                                isPaused: (flag & 4) === 4,
                                isPlaying: (flag & 8) === 8 && (flag & 512) === 0 && (flag & 64) === 0 && (flag & 2) === 0,
                                isSeeking: (flag & 16) === 16,
                                isUiSeeking: (flag & 32) === 32,
                                isUnstarted: (flag & 64) === 64,
                            };
                        } else if (player_ && typeof player_.getPlayerStateObject === 'function') {
                            return player_.getPlayerStateObject();
                        } else {
                            return {};
                        }

                    }

                    // if(internalApp?.videoData?.dispose && !internalApp.videoData.dispose838){
                    //     internalApp.videoData.dispose838 = internalApp.videoData.dispose;
                    //     internalApp.videoData.dispose = function(){
                    //         console.log('internalApp.videoData.dispose');
                    //     }
                    // }

                    // internalApp.mediaElement993 = internalApp.mediaElement;

                    // Object.defineProperty(internalApp, 'mediaElement', {
                    //     get(){
                    //         return this.mediaElement993;
                    //     },
                    //     set(nv){
                    //         return true;
                    //     }
                    // });


                    if (!internalAppPT.setMediaElement661 && internalAppPT.setMediaElement) {


                        internalAppPT.setMediaElement661 = internalAppPT.setMediaElement;

                        internalAppPT.setMediaElement = function (p) {

                            updateInternalAppFn(this);

                            console.log('setMediaElement', p)
                            return this.setMediaElement661(...arguments);
                        }


                    }

                    let playBusy = 0;
                    if (!HTMLAudioElement.prototype.play3828 && !HTMLAudioElement.prototype.pause3828) {



                        HTMLAudioElement.prototype.pause3828 = HTMLAudioElement.prototype.pause;

                        // HTMLAudioElement.prototype.pause = function(){

                        //     if (playBusy>0) return this.pause3828();


                        //     const player_ = playerAppXM();
                        //     if(player_ ){

                        //         const stateObject = player_ ? player_.getPlayerStateObject() : {};
                        //     }
                        //     try{
                        //         return this.pause3828();
                        //     }catch(e){
                        //         console.warn(e);
                        //     }finally{
                        //         this.play3828();
                        //     }


                        // }

                        let u3t = null;

                        HTMLAudioElement.prototype.play3828 = HTMLAudioElement.prototype.play;

                        HTMLAudioElement.prototype.play = async function () {

                            if (playBusy > 0) return await this.play3828();

                            console.log('video.play 01')
                            dirtyMark = 1 | 2 | 4;


                            const player_ = playerAppXM();
                            const internalApp = internalAppXM();
                            const standardApp = standardAppXM();

                            // setTimeout_(()=>{

                            //     const stateObject = player_ ? player_.getPlayerStateObject() : {};

                            //     if(stateObject.isPlaying === true && stateObject.isOrWillBePlaying === true && stateObject.isPaused === false){

                            //         const sdStateObject = standardApp.getPlayerStateObject();
                            //         if(sdStateObject && (sdStateObject.state & 8) === 8){

                            //             sdStateObject.state -=8;
                            //         }

                            //     }

                            // }, 300);



                            const audio = this;

                            if (audio !== internalApp?.mediaElement?.[key_mediaElementT]) return await this.play3828();

                            console.log('video.play 02')
                            // if ((await isAdW()) === true) return;

                            u3t = new PromiseExternal();

                            let isAtLiveHead = await isAtLiveHeadW();
                            Promise.resolve().then(async () => {
                                dirtyMark = 1 | 2 | 4;

                                console.log('video.play 03')


                                // p.G("html5_onesie")

                                u3t = u3t || new PromiseExternal();
                                await Promise.race([u3t, delayPn(80)]);
                                u3t = null;
                                // await delayPn(80);
                                dirtyMark = 1 | 2 | 4;


                                console.log('video.play 04')
                                // if ((await isAdW()) === true) return;

                                if (player_ !== playerAppXM()) return;
                                if (internalApp !== internalAppXM()) return;

                                if (audio !== internalApp?.mediaElement?.[key_mediaElementT]) return;


                                console.log('video.play 05')

                                const stateObject = getPlayerWrappedStateObject();


                                if (stateObject.isOrWillBePlaying === false || stateObject.isPaused === true || stateObject.isEnded === true) return;

                                console.log(1293, stateObject);

                                let bool = false;
                                let longDelay = false;
                                if (stateObject.isBuffering && !stateObject.isEnded && !stateObject.isError && stateObject.isSeeking && stateObject.isUnstarted && !stateObject.isCued) {
                                    bool = true;
                                    longDelay = true;
                                } else if (stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued && stateObject.isPlaying) {
                                    bool = true;
                                    // } else if( stateObject.isBuffering && !stateObject.isSeeking && !stateObject.isCued && !stateObject.isEnded && !stateObject.isError && stateObject.isOrWillBePlaying && stateObject.isPlaying && !stateObject.isUnstarted){
                                    //     // bool = true;
                                }


                                if (!isAtLiveHead && stateObject.isUnstarted === true && stateObject.isOrWillBePlaying) {

                                    const vd = internalApp.videoData;
                                    if (vd.isLivePlayback && vd.isLiveHeadPlayable) {
                                        console.log('isAtLiveHead: false -> true')
                                        isAtLiveHead = true;
                                    }

                                }

                                console.log(3882, bool, isAtLiveHead)

                                if (bool) {

                                    playBusy++;

                                    if (longDelay) await delayPn(80);

                                    if ((await isLoadedW()) === false) {

                                        await clearVideoAndQueue();
                                        await cancelPlayback();


                                    } else {

                                        await cancelPlayback();
                                    }
                                    dirtyMark = 1 | 2 | 4;



                                    // await delayPn(40);
                                    // await audio.pause();

                                    if (isAtLiveHead) {

                                        try {
                                            await player_.seekToLiveHead();
                                            if ((await player_.isAtLiveHead()) === true) {
                                                await player_.seekToStreamTime();
                                            }
                                        } catch (e) { }
                                        dirtyMark = 1 | 2 | 4;
                                    }

                                    // await delayPn(40);





                                    const qX = getPlayerWrappedStateObject();
                                    if (qX.isBuffering || qX.isSeeking || qX.isUnstarted) {

                                        await playVideo();
                                        dirtyMark = 1 | 2 | 4;
                                    }
                                    playBusy--;


                                    const q0 = getPlayerWrappedStateObject();
                                    if (q0.isBuffering || q0.isSeeking || q0.isUnstarted) {

                                        await delayPn(100);
                                        dirtyMark = 1 | 2 | 4;
                                        playBusy++;
                                        await Promise.race([audio.play(), delayPn(400)]).catch(console.warn);
                                        playBusy--;
                                        dirtyMark = 1 | 2 | 4;

                                    }

                                    if (longDelay) {

                                        const q1 = getPlayerWrappedStateObject();
                                        if (q1.isBuffering || q1.isSeeking || q1.isUnstarted) {


                                            await delayPn(80);
                                            dirtyMark = 1 | 2 | 4;

                                            await playVideo();
                                            dirtyMark = 1 | 2 | 4;
                                        }
                                        const q2 = getPlayerWrappedStateObject();
                                        if (q2.isBuffering || q2.isSeeking || q2.isUnstarted) {


                                            await delayPn(80);
                                            dirtyMark = 1 | 2 | 4;

                                            await playVideo();
                                            dirtyMark = 1 | 2 | 4;
                                        }
                                    }

                                }



                            }).catch(console.warn);


                            try {
                                dirtyMark = 1 | 2 | 4;
                                playBusy++;

                                return await this.play3828();
                            } catch (e) {

                            } finally {


                                playBusy--;
                                u3t && u3t.resolve();
                                dirtyMark = 1 | 2 | 4;
                            }



                        }


                    }



                    // -------------------------------------------- BACKUP ----------------------------------------------
                    // if (!HTMLAudioElement.prototype.play3828) {

                    //     HTMLAudioElement.prototype.play3828 = HTMLAudioElement.prototype.play;

                    //     HTMLAudioElement.prototype.play = async function () {

                    //         if (bypass3) return await this.play3828();



                    //         const audio = this;

                    //         const stateObject = player_.getPlayerStateObject();

                    //         const isBuffering = stateObject.isBuffering === true;


                    //         console.log(1291, player_.getPlayerState(), player_.getPlayerStateObject(), isBuffering);


                    //         if (player_.getPlayerState() === 5 && stateObject.isUnstarted === true && !stateObject.isOrWillBePlaying && !stateObject.isPaused) {


                    //             await clearVideoAndQueue();
                    //             await cancelPlayback();

                    //             setTimeout_(()=>{
                    //                 audio.pause();
                    //             }, 10);


                    //         }


                    //         if (player_.isReady()) {




                    //             if ((player_.getPlayerState() === -1 || player_.getPlayerState() === 5) && isBuffering && !stateObject.isEnded && !stateObject.isError && !stateObject.isPaused && stateObject.isSeeking && stateObject.isUnstarted && !stateObject.isCued) {

                    //                 Promise.resolve().then(async () => {




                    //                     await delayPn(300);

                    //                     const stateObject = player_ ? player_.getPlayerStateObject() : {};
                    //                     console.log(1293, stateObject);


                    //                     if (stateObject.isBuffering && !stateObject.isEnded && !stateObject.isError && stateObject.isSeeking && stateObject.isUnstarted && !stateObject.isCued) {

                    //                         console.log(1293, 1);

                    //                         bypass2 = true
                    //                         await pauseVideo();

                    //                         bypass2 = false
                    //                         bypass2 = true
                    //                         bypass3 = true
                    //                         await clearVideoAndQueue();
                    //                         await cancelPlayback();

                    //                         bypass2 = false
                    //                         bypass3 = false


                    //                         try {
                    //                             bypass2 = true
                    //                             bypass3 = true
                    //                             await player_.seekToLiveHead();
                    //                             if ((await player_.isAtLiveHead()) === true) {
                    //                                 bypass2 = true
                    //                                 bypass3 = true
                    //                                 await player_.seekToStreamTime();
                    //                             }
                    //                         } catch (e) { }



                    //                         bypass3 = true
                    //                         await playVideo();
                    //                         bypass3 = false

                    //                         //     await delayPn(8)

                    //                         // let p = 9, pc = 0;

                    //                         // while (p !== 9 && ++pc < 4) {

                    //                         //     p = await Promise.race([delayPn(100).then(() => 9), this.play3828()]);

                    //                         // }





                    //                         await delayPn(100);

                    //                         console.log(1293, 2);
                    //                         bypass3 = false
                    //                         await audio.play();
                    //                         bypass3 = false


                    //                         //         await delayPn(240)


                    //                         // const stateObjectX = player_ ? player_.getPlayerStateObject() : {};
                    //                         //     if(stateObjectX.isBuffering && !bypass3){
                    //                         //        this.play(); 
                    //                         //     }


                    //                     }

                    //                 }).catch(console.warn);

                    //             } else if (player_.getPlayerState() === 3 && isBuffering && !stateObject.isEnded && !stateObject.isError && !stateObject.isPaused && stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued) {


                    //                 Promise.resolve().then(async () => {



                    //                     await delayPn(80)
                    //                     const stateObject = player_ ? player_.getPlayerStateObject() : {};

                    //                     console.log(1292, player_.getPlayerState(), stateObject);

                    //                     if (player_.getPlayerState() === 3 && stateObject.isBuffering && !stateObject.isEnded && !stateObject.isError && !stateObject.isPaused && stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued) {




                    //                         console.log(1292, 1);
                    //                         bypass2 = true
                    //                         bypass3 = true
                    //                         await cancelPlayback();

                    //                         bypass2 = false
                    //                         bypass3 = false

                    //                         console.log(1292, 1, 29);
                    //                         await delayPn(8)
                    //                         bypass2 = true
                    //                         await pauseVideo();
                    //                         bypass2 = false

                    //                         console.log(1292, 1, 28);
                    //                         await delayPn(8)
                    //                         bypass3 = true
                    //                         await playVideo();
                    //                         bypass3 = false


                    //                         console.log(1292, 1, 27);
                    //                         await delayPn(8)

                    //                         console.log(1292, 1, 26);

                    //                         let p = 9, pc = 0;

                    //                         while (p !== 9 && ++pc < 4) {

                    //                             p = await Promise.race([delayPn(100).then(() => 9), this.play3828()]);

                    //                         }


                    //                         console.log(1292, 1, 25);

                    //                         await delayPn(400);


                    //                         const stateObject = player_ ? player_.getPlayerStateObject() : {};
                    //                         if (player_.getPlayerState() === 3 && stateObject.isBuffering && !stateObject.isEnded && !stateObject.isError && !stateObject.isPaused && stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued && !bypass3 && !bypass2) {
                    //                             this.play();
                    //                         }


                    //                     }
                    //                 }).catch(console.warn);

                    //             } else if (isBuffering && stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued) {



                    //                 Promise.resolve().then(async () => {



                    //                     const stateObject = player_ ? player_.getPlayerStateObject() : {};
                    //                     console.log(1298, stateObject);

                    //                     if (stateObject.isBuffering && stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued) {


                    //                         bypass2 = true
                    //                         bypass3 = true
                    //                         await cancelPlayback();

                    //                         bypass2 = false
                    //                         bypass3 = false

                    //                         await delayPn(8)
                    //                         bypass2 = true
                    //                         await pauseVideo();
                    //                         bypass2 = false

                    //                         await delayPn(8)
                    //                         bypass3 = true
                    //                         await playVideo();
                    //                         bypass3 = false


                    //                         await delayPn(8)

                    //                         let p = 9, pc = 0;

                    //                         while (p !== 9 && ++pc < 4) {

                    //                             p = await Promise.race([delayPn(100).then(() => 9), this.play3828()]);

                    //                         }

                    //                         //         await delayPn(240)

                    //                         // const stateObjectX = player_ ? player_.getPlayerStateObject() : {};

                    //                         //     if(stateObjectX.isBuffering && !bypass3){
                    //                         //        this.play(); 
                    //                         //     }


                    //                     }
                    //                 }).catch(console.warn);

                    //             } else if (player_.getPlayerState() === 1 && !stateObject.isBuffering && stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued && stateObject.isPlaying) {


                    //                 Promise.resolve().then(async () => {

                    //                     await delayPn(80)

                    //                     const stateObject = player_ ? player_.getPlayerStateObject() : {};
                    //                     console.log(1218, player_.getPlayerState(), stateObject);

                    //                     if (player_.getPlayerState() === 3 && stateObject.isBuffering && stateObject.isOrWillBePlaying && stateObject.isSeeking && !stateObject.isCued && stateObject.isPlaying) {
                    //                         console.log(1218, 1);

                    //                         bypass2 = true
                    //                         bypass3 = true
                    //                         // await player_.cancelPlayback();

                    //                         bypass2 = false
                    //                         bypass3 = false

                    //                         bypass2 = true
                    //                         // await player_.pauseVideo();
                    //                         bypass2 = false


                    //                         try {
                    //                             bypass2 = true
                    //                             bypass3 = true
                    //                             await player_.seekToLiveHead();
                    //                             if ((await player_.isAtLiveHead()) === true) {
                    //                                 bypass2 = true
                    //                                 bypass3 = true
                    //                                 await player_.seekToStreamTime();
                    //                             }
                    //                         } catch (e) { }


                    //                         bypass3 = true
                    //                         await playVideo();
                    //                         bypass3 = false


                    //                         await delayPn(8)

                    //                         let p = 9, pc = 0;

                    //                         while (p !== 9 && ++pc < 4) {

                    //                             p = await Promise.race([delayPn(100).then(() => 9), this.play3828()]);

                    //                         }


                    //                         //         await delayPn(240)


                    //                         // const stateObjectX = player_ ? player_.getPlayerStateObject() : {};
                    //                         //     if(stateObjectX.isBuffering && !bypass3){
                    //                         //        this.play(); 
                    //                         //     }


                    //                     }




                    //                 });


                    //             }

                    //         }


                    //         try {

                    //             bypass3 = true
                    //             return await this.play3828();
                    //         } catch (e) {

                    //         } finally {

                    //             bypass3 = false
                    //         }




                    //     }

                    // }




                    // -------------------------------------------- BACKUP ----------------------------------------------




                    // let mck = Promise.resolve();
                    // if (!HTMLAudioElement.prototype.pause3828) {

                    //     HTMLAudioElement.prototype.pause3828 = HTMLAudioElement.prototype.pause;


                    //     HTMLAudioElement.prototype.pause = async function () {

                    //         if (bypass2) return await this.pause3828();

                    //         const fn = async ()=>{


                    //             const audio = this;

                    //             const stateObject = {...player_.getPlayerStateObject()};


                    //             if(stateObject.isBuffering || stateObject.isSeeking){

                    //                 await delayPn(80);

                    //                 bypass3 = true;
                    //                 bypass2 = true;
                    //                 player_.cancelPlayback();
                    //                 bypass3 = true;
                    //                 bypass2 = true;
                    //                 player_.pauseVideo();
                    //                 bypass3 = false;
                    //                 bypass2 = false;

                    //                 if(stateObject.isOrWillBePlaying){

                    //                     await delayPn(80)
                    //                     player_.playVideo();
                    //                 }


                    //             }

                    //         }

                    //         try{
                    //             bypass2 = true;
                    //             const r = await this.pause3828();
                    //             Promise.resolve(fn);
                    //             return r;
                    //         }catch(e){
                    //             console.warn(e)
                    //         } finally{
                    //             bypass2 = false;
                    //         }                            

                    //     }
                    // }



                    // if (!HTMLAudioElement.prototype.play3828) {

                    //     HTMLAudioElement.prototype.play3828 = HTMLAudioElement.prototype.play;

                    //     HTMLAudioElement.prototype.play = async function () {

                    //         if (bypass3) return await this.play3828();

                    //         const fn = async ()=>{

                    //             await delayPn(80);

                    //             const audio = this;

                    //             const stateObject = player_.getPlayerStateObject();


                    //             if(stateObject.isBuffering || stateObject.isSeeking){
                    //                 bypass3 = true;
                    //                 bypass2 = true;
                    //                 player_.cancelPlayback();
                    //                 bypass3 = true;
                    //                 bypass2 = true;
                    //                 player_.pauseVideo();
                    //                 bypass3 = false;
                    //                 bypass2 = false;

                    //                 await delayPn(80)
                    //                 bypass3 = true;
                    //                 bypass2 = true;
                    //                 player_.playVideo();
                    //                 bypass3 = false;
                    //                 bypass2 = false;

                    //             }

                    //         }

                    //         try{
                    //             bypass3 = true;
                    //             const r = await this.play3828();
                    //             Promise.resolve(fn);
                    //             return r;
                    //         }catch(e){
                    //             console.warn(e)
                    //         } finally{
                    //             bypass3 = false;
                    //         }                            

                    //     }
                    // }



                    // const USE_STATE_CHANGE = false;

                    // if(USE_STATE_CHANGE){


                    // let busy = false;
                    // let nqj = 0;
                    // let mdd = null;
                    // let byPassPause = false;

                    //     if (!HTMLAudioElement.prototype.play3828 && !HTMLAudioElement.prototype.pause3828) {

                    //         HTMLAudioElement.prototype.play3828 = HTMLAudioElement.prototype.play;
                    //         HTMLAudioElement.prototype.pause3828 = HTMLAudioElement.prototype.pause;
                    //         //     HTMLAudioElement.prototype.play3828 = HTMLAudioElement.prototype.play;

                    //         HTMLAudioElement.prototype.pause = function () {
                    //             if (byPassPause) {
                    //                 try {
                    //                     return this.pause3828();
                    //                 } finally {
                    //                     this.play3828();
                    //                 }

                    //             }
                    //             if (busy) return this.pause3828();
                    //             // const t = ++nqj;
                    //             this.__audioPlayState33__ = -1;
                    //             mdd = this;

                    //             // while (busy) {
                    //             //     if (t !== nqj) return;
                    //             //     await delayPn(40);
                    //             // }
                    //             return this.pause3828();

                    //         }
                    //         HTMLAudioElement.prototype.play = async function () {
                    //             if (busy) return await this.play3828();
                    //             // const t = ++nqj;
                    //             this.__audioPlayState33__ = 1;
                    //             mdd = this;

                    //             // while (busy) {
                    //             //     if (t !== nqj) return;
                    //             //     await delayPn(40);
                    //             // }
                    //             return await this.play3828();

                    //         }
                    //     }


                    //     let qje = null;
                    //     let qjf = null;

                    //     let utf = null;
                    //      player_.addEventListener('onStateChange', async () => {

                    //         const t = ++nqj;
                    //         // if(utf){
                    //         //     utf.resolve();
                    //         //     return;
                    //         // }

                    //         console.log('onStateChange 0939001')

                    //         while (busy) {
                    //             if (t !== nqj) return;
                    //             await delayPn(40);
                    //         }
                    //         let stateObject = { ...player_.getPlayerStateObject() };
                    //         console.log(12312, stateObject, busy)
                    //         try {


                    //             // if(key_mediaElementT && !internalApp.mediaElement){

                    //             //     while (key_mediaElementT && !internalApp.mediaElement) {
                    //             //         if (t !== nqj) return;
                    //             //         await delayPn(40);
                    //             //     }

                    //             //     const stateObjectT = { ...player_.getPlayerStateObject() };
                    //             //     stateObject = stateObjectT;
                    //             // }


                    //             const qt1 = !busy && (stateObject.isBuffering || stateObject.isSeeking) && !stateObject.isEnded && !stateObject.isCued && player_.getPlayerState() < 5

                    //             const qt2 = !busy && !(stateObject.isBuffering || stateObject.isSeeking) && !stateObject.isEnded && stateObject.isCued && stateObject.isUnstarted;

                    //             if(!internalApp.mediaElement){
                    //                 try{
                    //                     player_.stopVideo();
                    //                     player_.cancelPlayback();
                    //                     player_.clearQueue();
                    //                     player_.clearVideo();
                    //                     player_.stopVideo();
                    //                     player_.cancelPlayback();
                    //                 }catch(e){}
                    //             }

                    //             window.gt3 = internalApp;

                    //             window.emm = window.emm || internalApp.mediaElement || null;
                    //             if(window.emm && !internalApp.mediaElement) {
                    //                 try{
                    //                 internalApp.setMediaElement( window.emm);
                    //                 }catch(e){}
                    //                 internalApp.mediaElement = window.emm
                    //             }
                    //             else if(internalApp.mediaElement && internalApp.mediaElement!==window.emm) window.emm = internalApp.mediaElement;
                    //         console.log(12313, qt1, qt2)
                    //             if (qt1 || qt2) {

                    //                 console.log(1929, {... internalApp[key_nS]});


                    //                 if(internalApp[key_nS]){

                    //                     if(!qjf) qjf = Object.assign({}, internalApp[key_nS].videoTrack);

                    //                     if(!qje) qje = internalApp[key_nS].videoTrack.T.info.video.__proto__
                    //                     // internalApp[key_nS].videoTrack  = null;
                    //                     console.log(838, internalApp[key_nS].videoTrack)
                    //                     // internalApp[key_nS].videoTrack  = internalApp[key_nS].audioTrack;


                    //                     internalApp[key_nS].videoTrack=  Object.assign({}, qjf);
                    //                     const o = {

                    //                         "width": 0,
                    //                         "height": 0,
                    //                         "quality": "auto",
                    //                         "T": 0,
                    //                         "fps": 0,
                    //                         "stereoLayout": 0,
                    //                         "projectionType": "UNKNOWN",
                    //                         "qualityLabel": "自動",
                    //                         "C": "",
                    //                         "primaries": ""

                    //                 }
                    //                 Object.setPrototypeOf(o,qje);
                    //                     internalApp[key_nS].videoTrack.T.info.video = o
                    //                     // internalApp[key_nS].videoTrack.T.info.video = internalApp[key_nS].videoTrack.T.info.audio

                    //                 }

                    //                 console.log(12313.2, internalApp,  internalApp?.videoData?.isLoaded() === false ,stateObject.isUnstarted === true , !stateObject.isError , !stateObject.isEnded)

                    //                 /*
                    //                 if (internalApp && internalApp?.videoData?.isLoaded() === false &&  stateObject.isUnstarted === true && !stateObject.isError && !stateObject.isEnded){

                    //                     internalApp.set
                    //                     await delayPn(80);

                    //                     if (t !== nqj) return;
                    //                     internalApp.stopVideo();

                    //                     internalApp.playVideo();
                    //                     await delayPn(80);
                    //                     if (t !== nqj) return;


                    //                     const stateObjectT = { ...player_.getPlayerStateObject() };
                    //                     stateObject = stateObjectT;

                    //                 }
                    //                 */

                    //                 if(qt2)console.log(12481);

                    //                 if (internalApp && internalApp?.videoData?.isAd() === true) return;
                    //                 if(qt2)console.log(12482);
                    //                 if (internalApp && internalApp?.videoData?.isLoaded() === false){

                    //                     if(qt2){

                    //                         while (internalApp && internalApp?.videoData?.isLoaded() === false) {
                    //                             if (t !== nqj) return;
                    //                             await delayPn(40);
                    //                         }
                    //                         if (t !== nqj) return;
                    //                         const stateObjectT = { ...player_.getPlayerStateObject() };
                    //                         stateObject = stateObjectT;
                    //                     }

                    //                 }

                    //                 const media = key_mediaElementT ? ( internalApp && internalApp.mediaElement  ? internalApp.mediaElement[key_mediaElementT] : null)  : mdd;

                    //                 if(qt2)console.log(12483);
                    //                 const isAtLiveHead = internalApp ? internalApp?.isAtLiveHead() : player_.isAtLiveHead();

                    //                 if(qt2)console.log(12484);


                    //                 // if(!media || media.isConnected === false) return;

                    //                 if(qt2)console.log(12485);

                    //                 busy = true;


                    //                 const shallPlay = (stateObject.isOrWillBePlaying || (media ? media.__audioPlayState33__ === 1 : false) ) && stateObject.isPaused !== true;
                    //                 console.log(12312, 1, stateObject,media?.__audioPlayState33__ )

                    //                 if (internalApp && internalApp.stopVideo && internalApp.pauseVideo && !internalApp.cancelPlayback) {

                    //                     bypass3 = true;
                    //                     bypass2 = true;
                    //                     byPassPause = true;
                    //                     // const c = internalApp.pauseVideo 
                    //                     // internalApp.pauseVideo  = ()=>{}; 
                    //                     internalApp.stopVideo();
                    //                     console.log('isAtLiveHead', isAtLiveHead)
                    //                     // internalApp.pauseVideo  = c;

                    //                     byPassPause = false;
                    //                     bypass3 = true;
                    //                     bypass2 = true;
                    //                     stopped = false;

                    //                 } else {

                    //                     bypass3 = true;
                    //                     bypass2 = true;
                    //                     byPassPause = true;
                    //                     player_.cancelPlayback();
                    //                     byPassPause = false;

                    //                     bypass3 = true;
                    //                     bypass2 = true;

                    //                     byPassPause = true;
                    //                     player_.pauseVideo();
                    //                     byPassPause = false;

                    //                     bypass3 = false;
                    //                     bypass2 = false;
                    //                 }

                    //                 // player_.cancelPlayback();
                    //                 // if(stateObject.isUnstarted){
                    //                 //     player_.clearVideo();
                    //                 //     player_.clearQueue();
                    //                 // }
                    //                 // if(shallPlay) byPassPause = true; else byPassPause = false;

                    //                 // byPassPause = false;


                    //                 if (internalApp && internalApp?.videoData?.isLoaded() === false) {


                    //                     while (internalApp && internalApp?.videoData?.isLoaded() === false) {
                    //                         if (t !== nqj) return;
                    //                         await delayPn(40);
                    //                     }

                    //                 }



                    //                 if (shallPlay) {
                    //                     console.log('onStateChange 0939025')


                    //                     await delayPn(80)

                    //                     console.log('onStateChange 0939026')


                    //                     let bPlayHead = false;
                    //                     if(stateObject.isUnstarted && (internalApp ? internalApp?.videoData?.isLiveHeadPlayable !== false : true)) bPlayHead =true;
                    //                     if(isAtLiveHead && (internalApp ? internalApp?.videoData?.isLiveHeadPlayable !== false : true)) bPlayHead =true;


                    //                     if (bPlayHead) {

                    //                         try {
                    //                             bypass2 = true
                    //                             bypass3 = true
                    //                             await player_.seekToLiveHead();
                    //                             if ((await player_.isAtLiveHead()) === true) {
                    //                                 bypass2 = true
                    //                                 bypass3 = true
                    //                                 await player_.seekToStreamTime();
                    //                             }
                    //                         } catch (e) { }
                    //                     }

                    //                     console.log('onStateChange 0939027')


                    //                     if (internalApp && internalApp.playVideo) {

                    //                         bypass3 = true;
                    //                         bypass2 = true;
                    //                         internalApp.playVideo();
                    //                         bypass3 = false;
                    //                         bypass2 = false;
                    //                         console.log('onStateChange 0939028')

                    //                     } else {

                    //                         bypass3 = true;
                    //                         bypass2 = true;
                    //                         player_.playVideo();
                    //                         bypass3 = false;
                    //                         bypass2 = false;
                    //                         console.log('onStateChange 0939028')


                    //                     }

                    //                     await delayPn(80)
                    //                 } else {
                    //                     console.log('onStateChange 0939036')
                    //                     await Promise.race([utf, delayPn(80)])
                    //                 }


                    //                 if (internalApp && internalApp?.videoData?.isLoaded() === false) {


                    //                     while (internalApp && internalApp?.videoData?.isLoaded() === false) {
                    //                         if (t !== nqj) return;
                    //                         await delayPn(40);
                    //                     }

                    //                 }

                    //                 console.log(12312, 2)
                    //                 busy = false;


                    //             }

                    //         } catch (e) {
                    //             console.warn(e)
                    //         } finally {
                    //             busy = false;
                    //             bypass3 = false;
                    //             bypass2 = false;
                    //             byPassPause = false;
                    //         }
                    //     });


                    // }





                    console.log('[yt-audio-only] DONE')

                } catch (e) {
                    console.warn(e);
                }




            }

            const setupAudioPlaying = (player00_) => {

                // console.log(5939,player00_);

                try {
                    const player_ = player00_;
                    if (!player_) return;
                    if (player_.__audio544__) return;
                    player_.__audio544__ = 1;

                    globalPlayer = mWeakRef(player_);
                    window.gp3 = player_;


                    const objectSets = new Set();
                    Function.prototype.apply129 = Function.prototype.apply;
                    Function.prototype.apply = function () {
                        objectSets.add([this, ...arguments]);
                        return this.apply129(...arguments)
                    }
                    player_.getPlayerState();

                    Function.prototype.apply = Function.prototype.apply129;

                    console.log(39912, [...objectSets]);
                    let filteredObjects = [...objectSets].filter(e => {
                        return Object(e[1]).getPlayerState === e[0]
                    });
                    console.log(39914, filteredObjects)

                    if (filteredObjects.length > 1) {
                        filteredObjects = filteredObjects.filter((e) => !(e[1] instanceof Node));
                    }

                    let standardApp_ = null;

                    {

                        let quu = null;
                        if (filteredObjects.length === 1) {
                            // console.log(39945,)
                            quu = filteredObjects[0][1];
                        }

                        let qww = '';
                        if (quu) {
                            for (const [key, value] of Object.entries(quu.__proto__)) {
                                if (typeof value === 'function' && value.length === 0 && `${value}`.endsWith('(this.app)}')) {
                                    qww = key;
                                    break;
                                }
                            }
                        }

                        // window.gs3= quu;
                        let internalApp = null;
                        if (qww) {
                            internalApp = quu[qww]();

                            if (internalApp) {


                                console.log(internalApp)
                            }

                        }
                        updateInternalAppFn(internalApp);
                        standardApp_ = quu.app || 0;

                    }


                    const standardApp = standardApp_;

                    updateStandardAppFn(standardApp);



                    const playerPT = player_.__proto__;

                    if (playerPT && typeof playerPT.getPlayerStateObject === 'function' && !playerPT.getPlayerStateObject949) {

                        playerPT.getPlayerStateObject949 = playerPT.getPlayerStateObject;
                        playerPT.getPlayerStateObject = function () {
                            updatePlayerAppFn(this);
                            return this.getPlayerStateObject949(...arguments);
                        }
                    } else if ( player_ && typeof player_.getPlayerStateObject === 'function' && !player_.getPlayerStateObject949){

                        player_.getPlayerStateObject949 = player_.getPlayerStateObject;
                        player_.getPlayerStateObject = function () {
                            updatePlayerAppFn(this);
                            return this.getPlayerStateObject949(...arguments);
                        }
                        
                    }

                    updatePlayerAppFn(player_);

                    setupFns();



                } catch (e) {
                    console.warn(e);
                }
            }

            if (!window.__ugAtg3747__) {
                window.__ugAtg3747__ = true;
                const updateLastActiveTimeGeneral = () => {
                    // player_ -> yuu
                    const player_ = playerAppXM();
                    if (player_) player_.updateLastActiveTime();
                };
                document.addEventListener('timeupdate', updateLastActiveTimeGeneral, true);
            }

            return { setupAudioPlaying };

        })();


        if (location.origin === 'https://www.youtube.com') {



            if (location.pathname.startsWith('/embed/')) {

                // youtube embed

                const ytEmbedReady = observablePromise(() => document.querySelector('#player > .ytp-embed')).obtain();

                const embedConfigFix = (async () => {
                    while (true) {
                        const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
                        if (config_) {
                            ytConfigFix(config_);
                            break;
                        }
                        await delayPn(60);
                    }
                });

                ytEmbedReady.then(async (embedPlayer) => {

                    embedConfigFix();

                    const player_ = embedPlayer;
                    console.log(5919,player_)

                    setupAudioPlaying(player_); // dekstop embed

                    // const asyncStateChange = async (audio, k) => {
                    //     const refreshAllStaleEntitiesForNonReadyAudio = async () => {
                    //         try {
                    //             if (audio.readyState == 0) await player_.refreshAllStaleEntities();
                    //         } catch (e) {
                    //         }
                    //     };
                    //     const triggerPlaying = async () => {
                    //         await player_.pauseVideo();
                    //         await player_.playVideo();
                    //     };
                    //     const seekToLiveHeadForLiveStream = async () => {
                    //         try {
                    //             await player_.seekToLiveHead();
                    //             if ((await player_.isAtLiveHead()) === true) {
                    //                 await player_.seekToStreamTime();
                    //                 return true;
                    //             }
                    //         } catch (e) {
                    //             console.log('error_F3', e);
                    //         }
                    //     };
                    //     const fixLiveAudioFn = async () => {
                    //         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);
                    //                 }
                    //             }
                    //             if (k === -1) {
                    //                 await refreshAllStaleEntitiesForNonReadyAudio();
                    //             } else if (k === 3) {
                    //                 while (audio.readyState === 0) {
                    //                     await refreshAllStaleEntitiesForNonReadyAudio();
                    //                     await triggerPlaying();
                    //                     await delayPn(300);
                    //                 }
                    //             }
                    //         } else if (audio.paused === false) {

                    //             if (!player_.isAtLiveHead()) {
                    //                 if (await seekToLiveHeadForLiveStream()) await delayPn(60);
                    //             }
                    //             while (audio.readyState === 0) {
                    //                 await refreshAllStaleEntitiesForNonReadyAudio();
                    //                 await triggerPlaying();
                    //                 await delayPn(300);
                    //             }
                    //             if (!player_.isAtLiveHead()) {
                    //                 if (await seekToLiveHeadForLiveStream()) await delayPn(60);
                    //             }
                    //             await refreshAllStaleEntitiesForNonReadyAudio();
                    //             if (audio.readyState > 0 && audio.paused === true) {
                    //                 await triggerPlaying();
                    //             }
                    //         }

                    //     }
                    //     try {
                    //         let ns23 = audio.networkState == 2 || audio.networkState == 3;

                    //         if (!ns23 && k === player_.getPlayerState()) {
                    //             if (k === -1 && audio.readyState === 0) {
                    //                 const et = await mediaNetworkStateReady(audio);
                    //                 if (audio.isConnected === false || player_.getPlayerState() === 5) return;
                    //                 ns23 = audio.networkState == 2 || audio.networkState == 3;
                    //                 // console.log(503, ns23, et, player_.getPlayerState());
                    //                 if (player_.getPlayerState() !== -1) return;
                    //             } else {
                    //                 console.log(507, k, audio.readyState, audio.networkState)
                    //             }
                    //         }

                    //         if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
                    //             await delayPn(200);
                    //             if (k === -1 && player_.getPlayerState() === -1 && audio.readyState === 0 && ns23) {
                    //                 await fixLiveAudioFn();
                    //             }
                    //         } 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) {
                    //                 await fixLiveAudioFn();
                    //             }
                    //         } 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) {
                    //                 await fixLiveAudioFn();
                    //             }
                    //         }

                    //     } catch (e) {
                    //         console.log('error_F4', e)
                    //     }

                    // };

                    // // console.log(299, player_)
                    // const _onPlayerStateChange = (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('error_F5', e)
                    //     }
                    // };

                    // player_.addEventListener('onStateChange', _onPlayerStateChange);
                    // const state0 = player_.getPlayerState();
                    // if (typeof state0 === 'number') {
                    //     _onPlayerStateChange(state0);
                    // }

                    // player_.addEventListener('onVideoProgress', () => {
                    //     updateLastActiveTimeAsync(player_);
                    // });

                    // console.log(1231)

                    if (SHOW_VIDEO_STATIC_IMAGE) {

                        let displayImage = '';
                        let html5Container = null;


                        const moviePlayer = document.querySelector('#movie_player .html5-video-container .video-stream.html5-main-video');
                        if (moviePlayer) {
                            html5Container = moviePlayer.closest('.html5-video-container');
                        }

                        if (html5Container) {

                            const overlayImage = document.querySelector('#movie_player .ytp-cued-thumbnail-overlay-image[style]');
                            if (overlayImage) {

                                const cStyle = window.getComputedStyle(overlayImage);
                                const cssImageValue = cStyle.backgroundImage;
                                if (cssImageValue && typeof cssImageValue === 'string' && cssImageValue.startsWith('url(')) {
                                    displayImage = cssImageValue;

                                }

                            }

                            if (!displayImage) {

                                const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
                                let embedded_player_response = null;
                                if (config_) {
                                    embedded_player_response = ((config_.PLAYER_VARS || 0).embedded_player_response || 0)
                                }
                                if (embedded_player_response && typeof embedded_player_response === 'string') {

                                    let idx1 = embedded_player_response.indexOf('"defaultThumbnail"');
                                    let idx2 = idx1 >= 0 ? embedded_player_response.lastIndexOf('"defaultThumbnail"') : -1;

                                    if (idx1 === idx2 && idx1 > 0) {

                                        let bk = 0;
                                        let j = -1;
                                        for (let i = idx1; i < embedded_player_response.length; i++) {
                                            if (i > idx1 + 40 && bk === 0) {
                                                j = i;
                                                break;
                                            }
                                            let t = embedded_player_response.charAt(i);
                                            if (t === '{') bk++;
                                            else if (t === '}') bk--;
                                        }

                                        if (j > idx1) {

                                            let defaultThumbnailString = embedded_player_response.substring(idx1, j);
                                            let defaultThumbnailObject = null;

                                            try {
                                                defaultThumbnailObject = JSON.parse(`{${defaultThumbnailString}}`);

                                            } catch (e) { }

                                            const thumbnails = ((defaultThumbnailObject.defaultThumbnail || 0).thumbnails || 0);

                                            if (thumbnails && thumbnails.length >= 1) {

                                                let thumbnailUrl = getThumbnailUrlFromThumbnails(thumbnails);

                                                if (thumbnailUrl && thumbnailUrl.length > 3) {
                                                    displayImage = `url(${thumbnailUrl})`;
                                                }
                                            }
                                        }

                                    }


                                }


                            }

                            if (displayImage) {

                                html5Container.style.setProperty('--audio-only-thumbnail-image', `${displayImage}`);
                            } else {
                                html5Container.style.removeProperty('--audio-only-thumbnail-image')
                            }

                        }


                    }

                });


            } else {


                // youtube normal

                attachOneTimeEvent('yt-action', () => {
                    const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
                    ytConfigFix(config_);
                });

                let r3 = new PromiseExternal();
                document.addEventListener('yt-action', ()=>{
                    let u = document.querySelector('ytd-watch-flexy');
                    if(u && typeof insp(u).calculateCurrentPlayerSize_ === 'function'){
                        r3.resolve(u);
                    }

                },true);

                r3.then((watchFlexy)=>{
                    // for offline video, without audio -> so no size

                    if(!watchFlexy) return;
                    const cnt = insp(watchFlexy);
                    if(typeof cnt.calculateCurrentPlayerSize_ ==='function' && !cnt.calculateCurrentPlayerSize3991_){

                        cnt.calculateCurrentPlayerSize3991_ = cnt.calculateCurrentPlayerSize_;
                        cnt.calculateCurrentPlayerSize_ = function(){
                            const r =  this.calculateCurrentPlayerSize3991_(...arguments);

                            if(r && r.width > 10 && !Number.isFinite(r.height)){
                                r.height = Math.round(r.width / 16 * 9);
                            }
                            return r;

                        }

                    }

                });



                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_;
                    const configFixBeforeCreate = () => {
                        try {
                            const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
                            if (config_) {
                                ytConfigFix(config_);
                            }
                        } catch (e) { }
                    }
                    cProto.createMainAppPlayer_ = function (a, b, c) {
                        configFixBeforeCreate();
                        let r = this.createMainAppPlayer932_(a, b, c);
                        try {
                            (async () => {
                                const e = await this.mainAppPlayer_.api;
                                setupAudioPlaying(e); // desktop normal
                            })();
                        } finally {
                            return r;
                        }
                    }
                    cProto.initPlayer_ = function (a) {
                        configFixBeforeCreate();
                        let r = this.initPlayer932_(a);
                        try {
                            (async () => {
                                const e = await r;
                                setupAudioPlaying(this.player_); // desktop normal
                            })();
                        } finally {
                            return r;
                        }
                    }
                })

                // let useStopAndReload = !isWatchPageURL();
                // 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();
                // });

            }


        } else if (location.origin === 'https://m.youtube.com') {

            removeBottomOverlayForMobile = async (delay) => {


                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) {
                        if (delay) {
                            await delayPn(delay);
                        }
                        btn.click();
                    }
                }

            }

            const getAppJSON = () => {
                let t;
                t = document.querySelector('player-microformat-renderer.PlayerMicroformatRendererHost script[type="application/ld+json"]');
                if (t) return t;
                t = document.querySelector('player-microformat-renderer.playerMicroformatRendererHost script[type="application/ld+json"]');
                if (t) return t;

                console.log('[mobile youtube audio only] getAppJSON fails.', document.querySelectorAll('script[type="application/ld+json"]').length);
                return null;

            }


            let lastPlayerInfoText = '';
            let mz = 0;
            onVideoChangeForMobile = async () => {


                let html5Container = null;

                const moviePlayer = document.querySelector('#player .html5-video-container .video-stream.html5-main-video');
                if (moviePlayer) {
                    html5Container = moviePlayer.closest('.html5-video-container');
                }

                console.log('STx00', html5Container)
                if (!html5Container) return;
                let thumbnailUrl = '';

                if (mz > 1e9) mz = 9;
                let mt = ++mz;
                const scriptText = await observablePromise(() => {
                    if (mt !== mz) return 1;
                    const t = getAppJSON();
                    const tt = (t ? t.textContent : '') || '';
                    if (tt === lastPlayerInfoText) return;
                    return tt;
                }).obtain();
                if (typeof scriptText !== 'string') return; // 1
                lastPlayerInfoText = scriptText;

                if (!scriptText) return;


                if (SHOW_VIDEO_STATIC_IMAGE) {
                    console.log('STx01')

                    let idx1 = scriptText.indexOf('"thumbnailUrl"');
                    let idx2 = idx1 >= 0 ? scriptText.lastIndexOf('"thumbnailUrl"') : -1;

                    if (idx1 === idx2 && idx1 > 0) {

                        let bk = 0;
                        let j = -1;
                        for (let i = idx1; i < scriptText.length; i++) {
                            if (i > idx1 + 20 && bk === 0) {
                                j = i;
                                break;
                            }
                            let t = scriptText.charAt(i);
                            if (t === '[') bk++;
                            else if (t === ']') bk--;
                            else if (t === '{') bk++;
                            else if (t === '}') bk--;
                        }


                        if (j > idx1) {

                            let thumbnailUrlString = scriptText.substring(idx1, j);
                            let thumbnailUrlObject = null;

                            try {
                                thumbnailUrlObject = JSON.parse(`{${thumbnailUrlString}}`);

                            } catch (e) { }

                            const thumbnails = thumbnailUrlObject.thumbnailUrl;

                            if (thumbnails && thumbnails.length >= 1 && typeof thumbnails[0] === 'string') {
                                if (thumbnails[0] && thumbnails[0].length > 3) {
                                    thumbnailUrl = thumbnails[0];
                                }
                            }
                        }

                    }
                    console.log('STx02', thumbnailUrl)

                    // const ytipr = (typeof ytInitialPlayerResponse !== 'undefined' ? ytInitialPlayerResponse : null) || 0;

                    // const thumbnails = (((ytipr.videoDetails || 0).thumbnail || 0).thumbnails || 0);

                    // if (thumbnails && thumbnails.length >= 1) {
                    //     thumbnailUrl = getThumbnailUrlFromThumbnails(thumbnails);

                    // }
                    if (thumbnailUrl && typeof thumbnailUrl === 'string') {
                        html5Container.style.setProperty('--audio-only-thumbnail-image', `url(${thumbnailUrl})`);
                    } else {
                        html5Container.style.removeProperty('--audio-only-thumbnail-image')
                    }

                }


                if (removeBottomOverlayForMobile) await removeBottomOverlayForMobile(40);

                await delayPn(80);
                const audio = moviePlayer;
                if (audio && audio.muted === true && audio.isConnected === true && audio.readyState >= 0 && audio.networkState >= 2 && audio.paused === false) {
                    await audio.click();
                }

            }

            let player0 = null;
            const mff = function (e) {
                const target = (e || 0).target || 0;
                if (target !== player0 && target && typeof target.getPlayerState === 'function') {
                    player0 = target;
                    setupAudioPlaying(target); // mobile 
                }
            }

            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);

 

            document.addEventListener('video-progress', updateLastActiveTimeAsync, true); // mobile
 
 

            //       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;
                ytConfigFix(config_);

                try {
                    if (clickLockFn && clickTarget) {

                        let a = HTMLElement.prototype.querySelector.call(clickTarget, '.video-stream.html5-main-video');
                        if (!a) 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();

                            clickLockFn.call(clickTarget, mockEvent({ type: 'click', target: clickTarget, detail: 1 }));
                            await delayPn(1);

                            if (a.muted === false && a.__spfgs__ !== true && a.paused === true && a.networkState === 0 && a.readyState === 0) {
                                clickLockFn.call(clickTarget, mockEvent({ type: 'click', target: clickTarget, detail: 1 }));
                                await delayPn(1);
                            }

                            delayRun(pr);

                        }

                    }

                } catch (e) { console.log('error_F12', 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;
                } else if (a.muted === true) {
                    return;
                } else if (a.muted === false && a.readyState === 0 && a.networkState === 2) {
                    if (a.paused === false) return;
                } else {
                    return;
                }

                if (document.querySelector('.player-controls-content')) return;

                if (a.paused === true && a.muted === false && a.readyState === 0 && a.networkState === 2) {

                    clickLockFn.call(clickTarget, mockEvent({ type: 'click', target: clickTarget, detail: 1 }));

                }

                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();
                    }
                }

            }

            durationchangeForMobile = true;

        }


        attachOneTimeEvent('yt-action', function () {
            const config_ = typeof yt !== 'undefined' ? (yt || 0).config_ : 0;
            ytConfigFix(config_);
        });

        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)) {

                    const p = typeof v === 'function' ? v.prototype : 0;

                    if (p
                        && typeof p.clone === 'function'
                        && typeof p.get === 'function' && typeof p.set === 'function'
                        && typeof p.isEmpty === 'undefined' && typeof p.forEach === 'undefined'
                        && typeof p.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;
                prototypeInherit(_yt_player[key].prototype, ClassX.prototype);
            }

        }
        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();


        PATCH_MEDIA_PUBLISH && (async () => {


            const _yt_player_observable = observablePromise(() => {
                return (((window || 0)._yt_player || 0) || 0);
            });


            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 getD0 = (_yt_player) => {

                    const w = 'D0';

                    let arr = [];

                    for (const [k, v] of Object.entries(_yt_player)) {

                    const p = typeof v === 'function' ? v.prototype : 0;
                    if (p
                        && typeof p.playVideo === 'function' && p.playVideo.length === 1
                        && typeof p.getVisibilityState === 'function' && p.getVisibilityState.length === 8
                        && typeof p.getVideoData === 'function' && p.getVideoData.length === 0
                        && typeof p.seekTo === 'function' && p.seekTo.length === 5
                        && typeof p.pauseVideo === 'function' && p.pauseVideo.length === 2
                        && typeof p.stopVideo === 'function' && p.stopVideo.length === 1
                        && typeof p.getPresentingPlayerType === 'function' && p.getPresentingPlayerType.length === 1
                        && typeof p.getCurrentTime === 'function' && p.getCurrentTime.length === 3
                        && typeof p.cancelPlayback === 'function' && p.cancelPlayback.length === 2
                        // && !p.getPlayerType

                    ) {
                        arr = addProtoToArr(_yt_player, k, arr) || arr;


                    }

                    }

                    if (arr.length === 0) {

                    console.warn(`Key does not exist. [${w}]`);
                    } else {

                    console.log(`[${w}]`, arr);
                    return arr[0];
                    }

                }
            */

            const gets0 = (_yt_player) => {

                const w = 's0';

                let arr = [];

                for (const [k, v] of Object.entries(_yt_player)) {

                    const p = typeof v === 'function' ? v.prototype : 0;
                    if (p
                        && typeof p.isBackground === 'function' && p.isBackground.length === 0
                        && typeof p.getPlaybackRate === 'function' && p.getPlaybackRate.length === 0
                        && typeof p.publish === 'function' && p.publish.length === 2
                        && typeof p.isAtLiveHead === 'function' && p.isAtLiveHead.length === 2



                        // && !p.getPlayerType

                    ) {
                        arr = addProtoToArr(_yt_player, k, arr) || arr;


                    }

                }

                if (arr.length === 0) {

                    console.warn(`Key does not exist. [${w}]`);
                } else {

                    console.log(`[${w}]`, arr);
                    return arr[0];
                }

            };

            const printObject = (b) => {
                return JSON.stringify(Object.entries(b || {}).filter(e => typeof (e[1] || 0) !== 'object'));
            };

            /*
                (async () => {
                    // rAf scheduling

                    const _yt_player = await _yt_player_observable.obtain();

                    if (!_yt_player || typeof _yt_player !== 'object') return;

                    let keyD0 = getD0(_yt_player);


                    if (!keyD0) return;


                    const g = _yt_player
                    let k = keyD0

                    const gk = g[k];
                    if (typeof gk !== 'function') return;
                    const gkp = gk.prototype;


                    gkp.playVideo48 = gkp.playVideo;
                    gkp.playVideo = function(a) {
                        let r =  this.playVideo48(a);
                        // console.log('gkpD0 playVideo',r, a)
                        return r;
                    }

                    gkp.getVisibilityState48 = gkp.getVisibilityState;
                    gkp.getVisibilityState = function(a, b, c, d, e, f, h, l) {
                        let r =  this.getVisibilityState48(a, b, c, d, e, f, h, l);
                        // console.log('gkpD0 getVisibilityState',r, a,b,c,d,e,f,h,l)
                        r = 0;
                        return r;
                    }


                    gkp.getVideoData48 = gkp.getVideoData;
                    gkp.getVideoData = function() {
                        let r =  this.getVideoData48();
                        // console.log('gkpD0 getVideoData',r)
                        return r;
                    }

                    gkp.seekTo48 = gkp.seekTo;
                    gkp.seekTo = function(a, b, c, d, e) {
                        let r =  this.seekTo48(a, b, c, d, e);
                        // console.log('gkpD0 seekTo',r, a,b,c,d,e)
                        return r;
                    }


                    gkp.pauseVideo48 = gkp.pauseVideo;
                    gkp.pauseVideo = function(a, b) {
                        let r =  this.pauseVideo48(a, b);
                        // console.log('gkpD0 pauseVideo',r, a,b);
                        return r;
                    }


                    gkp.stopVideo48 = gkp.stopVideo;
                    gkp.stopVideo = function(a) {
                        let r =  this.stopVideo48(a);
                        // console.log('gkpD0 stopVideo',r,a)
                        return r;
                    }




                    gkp.getPresentingPlayerType48 = gkp.getPresentingPlayerType;
                    gkp.getPresentingPlayerType = function(a) {
                        let r =  this.getPresentingPlayerType48(a);
                        // console.log('gkpD0 getPresentingPlayerType',r,a)
                        return r;
                    }

                    gkp.getCurrentTime48 = gkp.getCurrentTime;
                    gkp.getCurrentTime = function(a, b, c) {
                        let r =  this.getCurrentTime48(a, b, c);
                        // console.log('gkpD0 getCurrentTime',r, a,b,c)
                        return r;
                    }


                    gkp.cancelPlayback48 = gkp.cancelPlayback;
                    gkp.cancelPlayback = function(a, b) {
                        let r =  this.cancelPlayback48(a, b);
                        // console.log('gkpD0 cancelPlayback',r, a,b);
                        return r;
                    }

                })();
            */



            /**
             *
             *

                g.k.mL = function(a) {
                    var b = a.target.Gf();
                    if (this.mediaElement && this.mediaElement.Gf() && this.mediaElement.Gf() === b) {
                        ehb(this, a.type);
                        switch (a.type) {
                        case "error":
                            var c = yFa(this.mediaElement) || ""
                            , d = this.mediaElement.xf();
                            if (c === "capability.changed") {
                                this.L("html5_restart_on_capability_change") ? (this.ma("capchg", {
                                    msg: d
                                }),
                                F_(this, !0)) : u0(this);
                                return
                            }
                            if (this.mediaElement.hasError() && (Ndb(this.al, c, {
                                msg: d
                            }) || g.zS(this.videoData) && this.wb && this.wb.handleError(c)))
                                return;
                            if (this.isBackground() && this.mediaElement.fh() === 4) {
                                this.So();
                                x0(this, "unplayable");
                                return
                            }
                            break;
                        case "durationchange":
                            c = this.mediaElement.getDuration();
                            isFinite(c) && (!this.Qa || c > 0) && c !== 1 && this.Hl(c);
                            break;
                        case "ratechange":
                            this.ya && this.ya.setPlaybackRate(this.mediaElement.getPlaybackRate());
                            xfb(this.Ch);
                            this.wc().onPlaybackRateChange(this.getPlaybackRate());
                            break;
                        case "loadedmetadata":
                            ghb(this);
                            this.publish("onLoadedMetadata");
                            W5a(this);
                            c = this.bf();
                            this.videoData.SB && (this.videoData.SB = c);
                            break;
                        case "loadstart":
                            W5a(this);
                            break;
                        case "progress":
                        case "suspend":
                            this.Uc();
                            this.publish("onLoadProgress", this, this.Sw());
                            break;
                        case "playing":
                            this.Rb.uv("plev");
                            this.bT && !k0(this) && (this.bT = !1,
                            this.isAtLiveHead() || (this.logger.debug("seek to infinity on PLAYING"),
                            this.seekTo(Infinity, {
                                kd: "videoplayer_onPlaying"
                            })));
                            break;
                        case "timeupdate":
                            c = this.mediaElement && !this.mediaElement.getCurrentTime();
                            d = this.mediaElement && this.mediaElement.Tk() === 0;
                            if (c && (!this.VK || d))
                                return;
                            this.VK = this.VK || !!this.mediaElement.getCurrentTime();
                            Vgb(this);
                            this.Uc();
                            if (!this.mediaElement || this.mediaElement.Gf() !== b)
                                return;
                            this.publish("onVideoProgress", this, this.getCurrentTime());
                            break;
                        case "waiting":
                            if (this.mediaElement.Vw().length > 0 && this.mediaElement.Eh().length === 0 && this.mediaElement.getCurrentTime() > 0 && this.mediaElement.getCurrentTime() < 5 && this.ya)
                                return;
                            this.L("html5_ignore_unexpected_waiting_cfl") && (this.mediaElement.isPaused() || this.mediaElement.Tk() > 2 || !this.mediaElement.isSeeking() && aK(this.mediaElement.Eh(), this.mediaElement.getCurrentTime())) && (c = this.mediaElement.uc(),
                            c.bh = sK(this.mediaElement).toFixed(3),
                            this.ma("uwe", c));
                            g.zS(this.videoData) && this.wb && n7a(this.wb, this.mediaElement.getCurrentTime());
                            break;
                        case "resize":
                            ghb(this);
                            this.videoData.B && this.videoData.B.video.quality === "auto" && this.publish("internalvideoformatchange", this.videoData, !1);
                            break;
                        case "pause":
                            if (this.TW && g.pF(this.playerState, 8) && !g.pF(this.playerState, 1024) && this.getCurrentTime() === 0 && g.VB) {
                                x0(this, "safari_autoplay_disabled");
                                return
                            }
                        }
                        if (this.mediaElement && this.mediaElement.Gf() === b) {
                            dgb(this.Tc, a, this.wb || void 0);
                            this.publish("videoelementevent", a);
                            b = this.playerState;
                            d = this.bE;
                            var e = this.mediaElement;
                            c = this.videoData.clientPlaybackNonce;
                            var f = g.zS(this.videoData) && this.wb ? jY(this.wb) : void 0;
                            if (!g.pF(b, 128)) {
                                var h = b.state;
                                e = e ? e : a.target;
                                var l = e.getCurrentTime();
                                if (!g.pF(b, 64) || a.type !== "ended" && a.type !== "pause") {
                                    f = f || e.getDuration();
                                    f = e.isEnded() || l > 1 && Math.abs(l - f) < 1.1;
                                    var m = a.type === "pause" && e.isEnded();
                                    l = a.type === "ended" || a.type === "waiting" || a.type === "timeupdate" && !g.pF(b, 4) && !a0(d, l);
                                    if (m || f && l)
                                        e.KJ() > 0 && e.Gf() && (h = 14);
                                    else
                                        switch (a.type) {
                                        case "error":
                                            yFa(e) && (h |= 128);
                                            break;
                                        case "pause":
                                            g.pF(b, 256) ? (h ^= 256) || (h = 64) : g.pF(b, 32) || g.pF(b, 2) || g.pF(b, 4) || (h = 4,
                                            g.pF(b, 1) && g.pF(b, 8) && (h |= 1));
                                            break;
                                        case "playing":
                                            l = h;
                                            h = (h | 8) & -1093;
                                            l & 4 ? (h |= 1,
                                            uK(d, e)) : a0(d, e.getCurrentTime()) && (h &= -2);
                                            g.pF(b, 1) && uK(d, e) && (h |= 1);
                                            break;
                                        case "seeking":
                                            h |= 16;
                                            g.pF(b, 8) && (h |= 1);
                                            h &= -3;
                                            break;
                                        case "seeked":
                                            h &= -17;
                                            uK(d, e);
                                            break;
                                        case "waiting":
                                            g.pF(b, 2) || (h |= 1);
                                            uK(d, e);
                                            break;
                                        case "timeupdate":
                                            l = g.pF(b, 16),
                                            f = g.pF(b, 4),
                                            (g.pF(b, 8) || l) && !f && a0(d, e.getCurrentTime()) && (h = 8),
                                            uK(d, e) && (h |= 1)
                                        }
                                }
                                d = h;
                                h = null;
                                d & 128 && (h = a.target,
                                e = yFa(h),
                                l = 1,
                                e ? (e === "capability.changed" && (l = 2),
                                f = "GENERIC_WITHOUT_LINK",
                                m = h.uc(),
                                m.mediaElem = "1",
                                /AUDIO_RENDERER/.test(h.xf()) && (f = "HTML5_AUDIO_RENDERER_ERROR"),
                                h = {
                                    errorCode: e,
                                    errorMessage: g.JV[f] || "",
                                    bP: f,
                                    KL: yJ(m),
                                    rJ: l,
                                    cpn: b.Pg ? b.Pg.cpn : ""
                                }) : h = null,
                                h && (h.cpn = c));
                                b = vK(b, d, h)
                            }
                            !g.pF(this.playerState, 1) && g.pF(b, 1) && dhb(this, "evt" + a.type);
                            this.Ic(b)
                        }
                    }
                }
                ;
             *
             *
             */




            (async () => {
                // rAf scheduling

                const _yt_player = await _yt_player_observable.obtain();

                if (!_yt_player || typeof _yt_player !== 'object') return;

                let keys0 = gets0(_yt_player);


                if (!keys0) return;


                const g = _yt_player
                let k = keys0

                const gk = g[k];
                if (typeof gk !== 'function') return;
                const gkp = gk.prototype;


                // gkp.isBackground48 = gkp.isBackground;
                // gkp.isBackground = function() {
                //     if(!this?.visibility?.isBackground88){
                //         this.visibility.isBackground88 = 1;
                //         this.visibility.isBackground = function(){
                //             return false;
                //         }
                //     }
                //     // console.log('gkps0', 'isBackground', this.visibility)
                //     // return false;
                //     // if(!this.mediaElement || !(this.mediaElement.readyState>=4)){
                //     //     return false;
                //     // }
                //     // console.log(1882,)
                //     return this.isBackground48();
                // }

                gkp.publish48 = gkp.publish;
                gkp.publish33 = async function (a, b) {

                    const player_ = kRef(globalPlayer);
                    let publishStatus = 0;
                    const media = this.mediaElement;

                    if (a === 'internalaudioformatchange' && typeof (b.author || 0) === 'string' && media && player_) {

                        await player_.clearVideo(); // avoid error in live streaming
                        await player_.clearQueue(); // avoid error in live streaming
                        await refreshAllStaleEntitiesForNonReadyAudio();
                        // await player_.cancelPlayback();
                        publishStatus = media.__publishStatus17__ = 100;
                    }





                    const domMedia = media ? Object.values(media).filter(e => e instanceof HTMLMediaElement) : [];
                    if (this.mediaElement && a !== 'internalvideoformatchange' && player_ && domMedia.length === 1) {

                        const audio = domMedia[0];



                        const refreshAllStaleEntitiesForNonReadyAudio = async () => {
                            try {
                                if (audio.readyState == 0 && audio.isConnected === true) await player_.refreshAllStaleEntities();
                            } catch (e) {
                            }
                        };
                        // const triggerPlaying = async () => {
                        //     await player_.cancelPlayback();
                        //     this.pauseVideo();
                        //     this.playVideo();
                        //     await player_.pauseVideo();
                        //     await player_.playVideo();
                        // };
                        const seekToLiveHeadForLiveStream = async () => {
                            try {
                                audio.isConnected === true && await player_.seekToLiveHead();
                                if (audio.isConnected === true && (await player_.isAtLiveHead()) === true) {
                                    audio.isConnected === true && await player_.seekToStreamTime();
                                    return true;
                                }
                            } catch (e) {
                                console.log('error_F7', e);
                            }
                        };


                        if (a.includes('error')) {

                            if (!media.__publishStatus17__ || media.__publishStatus17__ < 200) {

                                await player_.clearVideo(); // avoid error in live streaming
                                await player_.clearQueue(); // avoid error in live streaming
                                await refreshAllStaleEntitiesForNonReadyAudio();
                                // await player_.cancelPlayback();

                            }




                        } else {



                            media.__publishStatus17__ = media.__publishStatus17__ || 100;



                            if (media.__publishStatus17__ === 100) await refreshAllStaleEntitiesForNonReadyAudio();
                            if (media.__publishStatus17__ === 100 && audio.duration > 0 && player_.getPlayerState() === 3) {



                                media.__publishStatus17__ = 200
                                // await refreshAllStaleEntitiesForNonReadyAudio();

                                await player_.cancelPlayback();
                                await this.pauseVideo();
                                // this.playVideo();
                                // await player_.pauseVideo();
                                await player_.playVideo();
                                await seekToLiveHeadForLiveStream();


                                // fixLiveAudioFn(domMedia0, player_, player_.getPlayerState())


                                // skipPause = true;
                                // skipVisibility = true;
                                //  player_.cancelPlayback();
                                //  player_.pauseVideo();
                                //  player_.playVideo();
                                //  skipPause = false;
                                //  skipVisibility = false;


                            }



                            if (a === 'onLoadedMetadata' && media.__publishStatus17__ === 200) media.__publishStatus17__ = 201;
                            if (a === 'videoelementevent' && b.type === 'loadedmetadata' && media.__publishStatus17__ === 201) media.__publishStatus17__ = 202;
                            if (a === 'videoelementevent' && b.type === 'progress' && media.__publishStatus17__ === 202) {

                                media.__publishStatus17__ = 203;
                                window.debug_mfk = this;
                                window.debug_mfp = player_;

                                // (async ()=>{
                                //     await timelineResolve();
                                //     const domMedia = Object.values(this.mediaElement).filter(e=>e instanceof HTMLMediaElement);
                                //     if(domMedia.length === 1){
                                //         const domMedia0 = domMedia[0]

                                //         if(domMedia0.duration >0 && domMedia0.readyState >= 4){

                                //             await timelineResolve();
                                //             console.log(939, domMedia0, domMedia0.paused, domMedia0.duration, domMedia0.readyState)
                                //             this.pauseVideo();
                                //             await timelineResolve();
                                //             this.playVideo();

                                //         }
                                //         // this.mediaElement.pause();
                                //         // this.mediaElement.play();
                                //     }

                                // })();
                            }
                            if (media.__publishStatus17__ === 203 && audio && audio.readyState === 1) {


                                media.__publishStatus17__ = 204;

                                // await timelineResolve();
                                // await player_.cancelPlayback();
                                await this.pauseVideo();
                                // this.playVideo();
                                // await timelineResolve();
                                // await player_.pauseVideo();
                                await player_.playVideo();
                                // await timelineResolve();
                                await seekToLiveHeadForLiveStream();



                            }


                            if (media.__publishStatus17__ < 300 && media.__publishStatus17__ >= 200 && a === 'videoelementevent' && b.type === 'timeupdate' && !audio.paused && audio.readyState >= 4 && audio.duration > 0) {
                                media.__publishStatus17__ = 300;
                                if (!player_.isAtLiveHead()) await seekToLiveHeadForLiveStream();
                            }


                        }


                        publishStatus = media.__publishStatus17__;

                        if (debugFlg001) console.log('gkps0 publish | ' + publishStatus, a, printObject(b))

                    }
                }
                gkp.publish = function (a, b) {

                    this.publish33(a, b);

                    return this.publish48.apply(this, arguments);
                }

                // console.log(23488)

            })();

        })();


    //# sourceURL=debug://userscript/yt-audio-only.js

    
    }

    const getVideoIdByURL = () => {
        // It's almost certainly going to stay at 11 characters. The individual characters come from a set of 64 possibilities (A-Za-z0-9_-).
        // base64 form; 26+26+10+2; 64^len
        // Math.pow(64,11) = 73786976294838210000

        const url = new URL(location.href);
        let m;

        if (m = /^\/watch\?v=([A-Za-z0-9_-]+)/.exec(`${url.pathname}?v=${url.searchParams.get('v')}`)) return `${m[1]}`;
        if (m = /^\/live\/([A-Za-z0-9_-]+)/.exec(url.pathname)) return `${m[1]}`;

        if (m = /^\/embed\/live_stream\?channel=([A-Za-z0-9_-]+)/.exec(`${url.pathname}?channel=${url.searchParams.get('channel')}`)) return `L:${m[1]}`;
        if (m = /^\/embed\/([A-Za-z0-9_-]+)/.exec(url.pathname)) return `${m[1]}`;

        if (m = /^\/channel\/([A-Za-z0-9_-]+)\/live\b/.exec(url.pathname)) return `L:${m[1]}`;
        if (url.hostname === 'youtu.be' && (m = /\/([A-Za-z0-9_-]+)/.exec(url.pathname))) return `${m[1]}`;

        return '';

    };

    const getVideoIdByElement = () => {
        const videoIdElements = [...document.querySelectorAll('[video-id]')].filter(v => !v.closest('[hidden]'));
        const videoId = videoIdElements.length > 0 ? videoIdElements[0].getAttribute('video-id') : null;
        return videoId || '';
    };

    const getEnableValue = async () => {
        const videoId = getVideoIdByURL() || getVideoIdByElement();
        const siteVal = videoId ? await GM.getValue(`isEnable_aWsjF_${videoId}`, null) : null;
        return (siteVal !== null) ? siteVal : await GM.getValue("isEnable_aWsjF", true);
    };

    const setEnableVal = async (val) => {
        const videoId = getVideoIdByURL() || getVideoIdByElement();
        if (videoId) {
            try {
                const cv = await GM.getValue(`isEnable_aWsjF_${videoId}`, null);
                if (typeof cv === typeof val) await GM.setValue(`isEnable_aWsjF_${videoId}`, val);
            } catch (e) { }
        }
        await GM.setValue("isEnable_aWsjF", val);
    }

    const isEnable = (typeof GM !== 'undefined' && typeof GM.getValue === 'function') ? await getEnableValue() : null;
    if (typeof isEnable !== 'boolean') throw new DOMException("Please Update your browser", "NotSupportedError");
    if (isEnable) {
        const element = document.createElement('button');
        element.setAttribute('onclick', createHTML(`(${pageInjectionCode})()`));
        element.click();
    }

    GM_registerMenuCommand(`Turn ${isEnable ? 'OFF' : 'ON'} YouTube Audio Mode`, async function () {
        await setEnableVal(!isEnable);
        await GM.setValue('lastCheck_bWsm5', Date.now());
        document.documentElement.setAttribute('forceRefresh032', '');
        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 setEnableVal(!isEnable);
                        await GM.setValue('lastCheck_bWsm5', Date.now());
                        document.documentElement.setAttribute('forceRefresh032', '');
                        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 (evt) => {
            try {
                evt.stopPropagation();
                evt.stopImmediatePropagation();
            } catch (e) { }
            await setEnableVal(!isEnable);
            await GM.setValue('lastCheck_bWsm5', Date.now());
            document.documentElement.setAttribute('forceRefresh032', '');
            location.reload();
        });
        let t;
        let h = 0;
        t = btn.closest('.ytp-panel-menu[style*="height"]');
        if (t) t.style.height = t.scrollHeight + 'px';
        t = btn.closest('.ytp-panel[style*="height"]');
        if (t) t.style.height = (h = t.scrollHeight) + 'px';
        t = btn.closest('.ytp-popup.ytp-contextmenu[style*="height"]');
        if (t && h > 0) t.style.height = h + 'px';
    }


    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 (evt) => {
            try {
                evt.stopPropagation();
                evt.stopImmediatePropagation();
            } catch (e) { }
            await setEnableVal(!isEnable);
            await GM.setValue('lastCheck_bWsm5', Date.now());
            document.documentElement.setAttribute('forceRefresh032', '');
            location.reload();
        });
    }

    const lastEntry = (arr) => {
        return arr.length > 0 ? arr[arr.length - 1] : null;
    }

    function mobileMenuItemAppearedV2Fn(target) {

        const btn = target.closest('yt-list-item-view-model');
        if (!(btn instanceof HTMLElement)) return;
        if (btn.parentNode.querySelector('yt-list-item-view-model.audio-only-toggle-btn')) return;
        const parentNode = btn.closest('player-settings-menu');
        if (!parentNode) return;
        let qt = 1E9;
        let targetBtnO = lastEntry([...parentNode.getElementsByTagName(btn.nodeName)].filter(e => e.parentElement === btn.parentElement).map((elm) => {
            const count = elm.getElementsByTagName('*').length;
            if (count < qt) qt = count;
            return {
                elm: elm,
                count: count
            }
        }).filter((o) => o.count === qt));

        const targetBtn = targetBtnO && targetBtnO.elm instanceof HTMLElement ? targetBtnO.elm : btn;


        const newBtn = targetBtn.cloneNode(true);
        if (newBtn instanceof HTMLElement) {
            document.documentElement.classList.add('with-audio-only-toggle-btn');

            let newBtnContentElm = newBtn;
            let layerCN = 8;
            while (newBtnContentElm.childElementCount === 1 && layerCN--) {
                newBtnContentElm = newBtnContentElm.firstElementChild;
            }
            if (!(newBtnContentElm instanceof HTMLElement)) newBtnContentElm = newBtn;
            let t;
            if (t = lastEntry(newBtnContentElm.querySelectorAll('span[role="text"]'))) {
                newBtnContentElm = t;
                newBtnContentElm.classList.add('audio-only-toggle-btn-content2');
            } else if (t = lastEntry(newBtnContentElm.querySelectorAll('[role="text"]'))) {
                newBtnContentElm = t;
                newBtnContentElm.classList.add('audio-only-toggle-btn-content2');
            } else if (t = lastEntry(newBtnContentElm.querySelectorAll('span'))) {
                newBtnContentElm = t;
                newBtnContentElm.classList.add('audio-only-toggle-btn-content2');
            } else if (t = lastEntry(newBtnContentElm.querySelector('.yt-core-attributed-string'))) {
                newBtnContentElm = t;
                newBtnContentElm.classList.add('audio-only-toggle-btn-content2');
            }
            newBtnContentElm.textContent = `Turn ${isEnable ? 'OFF' : 'ON'} YouTube Audio Mode`;
            newBtn.classList.add('audio-only-toggle-btn');
            newBtnContentElm.classList.add('audio-only-toggle-btn-content');
            btn.parentNode.insertBefore(newBtn, btn.nextSibling);
            newBtn.addEventListener('click', async (evt) => {
                try {
                    evt.stopPropagation();
                    evt.stopImmediatePropagation();
                } catch (e) { }
                await setEnableVal(!isEnable);
                await GM.setValue('lastCheck_bWsm5', Date.now());
                document.documentElement.setAttribute('forceRefresh032', '');
                location.reload();
            });
            const contentWrapper = newBtn.closest('#content-wrapper');
            if (contentWrapper) {
                contentWrapper.style.height = 'unset';
                contentWrapper.style.maxHeight = 'unset';
            }
        }
    }

    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);
            if (animationName === 'mobileMenuItemAppearedV2') mobileMenuItemAppearedV2Fn(evt.target);

        }, true);

        const cssForEnabled = isEnable ? `

            .html5-video-player {
                background-color: black;
            }

            [style*="--audio-only-thumbnail-image"]{
                background-image: var(--audio-only-thumbnail-image);
                object-fit: contain;
                background-position: center;
                background-size: contain;
                background-repeat: no-repeat;
            }
            .html5-video-player.ended-mode [style*="--audio-only-thumbnail-image"]{
                background-image: none;
            }

            .html5-video-player.ytp-ce-shown .html5-video-container {
                opacity: 0.5;
                transition: opacity 0.5s;
            }

            ytd-video-preview #media-container div#player-container,
            ytd-video-preview #media-container div#thumbnail-container{
                transition: initial !important;
                transition-duration:0ms !important;
                transition-delay:0ms !important;
            }
            ytd-video-preview #media-container div#thumbnail-container{
                /* pointer-events:none !important; */
                opacity:0;
                /* z-index:-1; */
            }
            ytd-video-preview #media-container div#player-container,
            ytd-video-preview #media-container div#inline-preview-player{
                background-color:transparent !important;
                background-image:none !important;
            }

            #movie_player > .html5-video-container:not(:empty) {
                box-sizing: border-box;
                height: 100%;
            }

            #movie_player [style*="--audio-only-thumbnail-image"] ~ .ytp-cued-thumbnail-overlay > .ytp-cued-thumbnail-overlay-image[style*="background-image"] {
                opacity: 0;
            }

            #movie_player [style*="--audio-only-thumbnail-image"]::before {
                content: '';
                display: block;
                position: absolute;
                left: 0;
                top: 0;
                bottom: 0;
                right: 0;
                /* background: transparent; */


                /* We use multiple backgrounds: one gradient per side */
                background:
                    /* Left border gradient */
                    linear-gradient(to right, rgba(0,0,0,0.4), transparent) left center,
                    /* Right border gradient */
                    linear-gradient(to left, rgba(0,0,0,0.4), transparent) right center,
                    /* Top border gradient */
                    linear-gradient(to bottom, rgba(0,0,0,0.4), transparent) center top,
                    /* Bottom border gradient */
                    linear-gradient(to top, rgba(0,0,0,0.4), transparent) center bottom;

                /* Prevents repetition of gradients */
                background-repeat: no-repeat;

                /* Set the size of each gradient "border" */
                background-size:
                    12% 100%, /* left border width and full height */
                    12% 100%, /* right border width and full height */
                    100% 12%, /* top border full width and small height */
                    100% 12%; /* bottom border full width and small height */

                /* Optional: a base background color inside the element */
                /* background-color: #fff; */
                /* background-color: var(--blinker-fmw83-bgc, transparent); */

                    opacity: var(--fmw83-opacity, 1);

                    pointer-events: none !important;
                    z-index:-1;

            }

            /*
            @keyframes blinker-fmw83 {
                0%, 60%, 100% {
                    opacity: 1;
                }
                30% {
                    opacity: 0.96;
                }
            }
                */


            #movie_player.playing-mode [style*="--audio-only-thumbnail-image"]{
                /* animation: blinker-fmw83 1.74s linear infinite; */
                --fmw83-opacity: 0.6;

            }



        `: "";

        const style = document.createElement('style');
        style.id = 'fm9v0';
        style.textContent = `

        ${cssForEnabled}

        @keyframes mobileMenuItemAppeared {
            0% {
                background-position-x: 3px;
           }
            100% {
                background-position-x: 4px;
           }
       }

        @keyframes mobileMenuItemAppearedV2 {
            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;
       }

       player-settings-menu > yt-list-item-view-model:last-of-type {
            animation: mobileMenuItemAppearedV2 1ms linear 0s 1 normal forwards;
       }


       player-settings-menu .audio-only-toggle-btn-content {
            padding: 14px 24px;
            box-sizing: border-box;
            font-size: 130%;
       }

       player-settings-menu .audio-only-toggle-btn-content2 {
            padding: 0;
            box-sizing: border-box;
            font-size: inherit;
       }


        @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;
       }
        #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);

    });


    const pNavigateFinished = new Promise(resolve => {
        document.addEventListener('yt-navigate-finish', resolve, true);
    });

    pNavigateFinished.then(() => {
        const inputs = document.querySelectorAll('#masthead input[type="text"][name]');

        let lastInputTextValue = null;
        let busy = false;
        let disableMonitoring = false;
        const setGV = async (val) => {

            const videoId = getVideoIdByURL() || getVideoIdByElement();
            if (videoId) {
                const cgv = await GM.getValue(`isEnable_aWsjF_${videoId}`, null);
                if (cgv !== val || isEnable !== val) {
                    disableMonitoring = true;
                    await GM.setValue(`isEnable_aWsjF_${videoId}`, val);
                    await GM.setValue('lastCheck_bWsm5', Date.now());
                    document.documentElement.setAttribute('forceRefresh032', '');
                    location.reload();
                }

            }
        }
        const checkTextChangeF = async (evt) => {
            busy = false;
            const inputElem = (evt || 0).target;
            if (inputElem instanceof HTMLInputElement && !disableMonitoring) {
                const cv = inputElem.value;
                if (cv === lastInputTextValue) return;
                lastInputTextValue = cv;
                if (cv === 'vvv') {

                    await setGV(false);

                } else if (cv === 'aaa') {

                    await setGV(true);

                }
            }
        }
        const checkTextChange = (evt) => {
            if (busy) return;
            busy = true;
            Promise.resolve(evt).then(checkTextChangeF)
        };
        for (const input of inputs) {
            input.addEventListener('input', checkTextChange, false);
            input.addEventListener('keydown', checkTextChange, false);
            input.addEventListener('keyup', checkTextChange, false);
            input.addEventListener('keypress', checkTextChange, false);
            input.addEventListener('change', checkTextChange, false);
        }
    });

    const autoCleanUpKey = async () => {

        const lastCheck = await GM.getValue('lastCheck_bWsm5', null) || 0;
        if (Date.now() - lastCheck < 16000) return; // 16s
        GM.setValue('lastCheck_bWsm5', Date.now());
        pLoad.then(async () => {
            const rArr = [];
            const arr = await GM.listValues();
            const cv = await GM.getValue("isEnable_aWsjF", null);
            const fn = async (entry) => {
                try {
                    if (typeof entry === 'string' && entry.length > 15 && entry.startsWith('isEnable_aWsjF_')) {
                        const res = await GM.getValue(entry, null);
                        if (typeof res === 'boolean' && res === cv) {
                            await GM.deleteValue(entry);
                            rArr.push(entry);
                        }
                    }
                } catch (e) {
                    console.warn(e);
                }
            }
            arr.length > 1 && (await Promise.all(arr.map(fn)));
            rArr.length > 0 && console.log('[YouTube Audio Only] autoCleanUpKey', rArr);
        });
    };

    autoCleanUpKey();





})();