youtube continue play fix

When "Video paused, do you want to continue watching?" Appears, ignore it and continue playing automatically (hiding dialog fixed)

// ==UserScript==
// @name               youtube continue play fix
// @description        When "Video paused, do you want to continue watching?" Appears, ignore it and continue playing automatically (hiding dialog fixed)
// @namespace          https://greasyfork.org/en/users/1308740-esdeka
// @version            2025-04-28
// @author             esdeka
// @include            https://*.youtube.com/*
// @noframes
// @run-at             document-end
// @license            MIT
// ==/UserScript==

(function() {
    function searchDialog(videoPlayer){
        if(videoPlayer.currentTime < videoPlayer.duration){//防止重複播放
            let ytConfirmDialog = document.querySelector('yt-confirm-dialog-renderer') || document.querySelector('ytmusic-confirm-dialog-renderer') || document.querySelector('dialog');
            if(
                ytConfirmDialog &&
                (
                    ytConfirmDialog.parentElement.style.display != 'none' ||
                    (
                        //document.hidden
                        ytConfirmDialog.parentElement.style.display = 'none'
                    )//當網頁不可見時,DOM元件不會即時渲染,所以對話方塊的display還會是none
                )
            ){
                console.debug('被暫停了,但是我要繼續播放');
                //ytConfirmDialog.querySelector('yt-button-renderer[dialog-confirm]').click();//當網頁不可見時,觸發click是不會繼續播放的,因為要等到網頁可見時觸發UI渲染後才會把對話方塊關掉,對話方塊關掉後才會出發video的play事件
                videoPlayer.play();
                console.debug('按下"是"');
            }else{
                console.debug('對話方塊找不到或是隱藏了', ytConfirmDialog && ytConfirmDialog.parentElement, document.hidden, videoPlayer.currentTime, videoPlayer.duration);
                if(videoPlayer.paused && videoPlayer.src){
                    setTimeout(() => searchDialog(videoPlayer), 1000);//再找一次
                }
            }
        }else{
            console.debug('播放完畢');
        }
    }
    let pausedFun = function({target: videoPlayer}){
        console.debug('暫停播放');
        setTimeout(() => searchDialog(videoPlayer), 500);//確保在暫停時對話方塊一定找得到
    }
    function setOnPauseEventListener(player){
        if(!player.dataset.pauseWatcher){
            player.dataset.pauseWatcher = true;
            player.addEventListener('pause', pausedFun);
        }
    }
    function observerPlayerRoot(doc){
        let player = doc.querySelector('video');
        if(player){
            console.debug('找到播放器', player);
            setOnPauseEventListener(player);
        }
        let ycpObserver = new MutationObserver((mutationdeList, observer) => {
            mutationdeList.flatMap(i => [...i.addedNodes]).flat().forEach(doc => {
                if(doc.tagName){
                    let player = null;
                    if(doc.tagName == 'VIDEO'){
                        player = doc;
                    }else if(!["SCRIPT", "STYLE", "LINK", "MATE"].includes(doc.tagName)){
                        player = doc.querySelector('video');
                    }
                    if(player){
                        console.debug('找到播放器', player);
                        setOnPauseEventListener(player);
                    }
                }
            });
        });
        ycpObserver.observe(
            doc,
            {
                childList: true,
                subtree: true
            }
        );
    }
    let playerRoot = document.querySelector('#player');
    if(playerRoot){
        observerPlayerRoot(playerRoot);
    }else{
        let rootObserver = new MutationObserver((mutationdeList, observer) => {
            mutationdeList.flatMap(i => [...i.addedNodes]).flat().forEach(doc => {
                if (doc.tagName && !["SCRIPT", "STYLE", "LINK", "MATE"].includes(doc.tagName)){
                    let playerRoot = doc.querySelector('#player');
                    if(playerRoot){
                        observerPlayerRoot(playerRoot);
                        rootObserver.disconnect();
                    }
                }
            });
        });
        rootObserver.observe(
            document,
            {
                childList: true,
                subtree: true
            }
        );
    }
})();