Hacker News new | ask | show | jobs
by oulipo 489 days ago
I made a small ViolentMonkey script to stop autoplay on Youtube, which is really annoying

    // ==UserScript==
    // @name        YouTube video page AutoPause
    // @namespace   https://greasyfork.org/en/users/13981-chk1
    // @description Automatically pause YouTube videos on Youtube video pages
    // @icon        https://www.youtube.com/s/desktop/536ed9a8/img/favicon_96x96.png
    // @include     https://*.youtube.com/watch*
    // @include     http://*.youtube.com/watch*
    // @version     0.3
    // @grant       none
    // @run-at      document-end
    // ==/UserScript==
    
    (function () {
        'use strict';
        /**
         * Get element with selector and call callback with it.
         * @param {string} selector Selector for the element.
         * @param {function} callback Callback function to call with the element.
         */
        function forElement(selector, callback) {
            // Init forElement.timeoutCount.
            if (forElement.timeoutCount === undefined) {
                forElement.timeoutCount = {}
            }
            // Init forElement.timeoutCount[selector].
            if (forElement.timeoutCount[selector] === undefined) {
                forElement.timeoutCount[selector] = 0
            }
    
            // Get element.
            const element = document.querySelector(selector)
    
            // If element not found.
            if (element === null) {
                // try again after timeout.
                setTimeout(
                    function () {
                        forElement(selector, callback)
                    },
                    (
                        // Base timeout.
                        100
                        *
                        // Increase timeout after each try.
                        (forElement.timeoutCount[selector]++)
                    )
                )
            }
            // If element found
            else {
                // reset timeout count
                forElement.timeoutCount[selector] = 0
                // and call callback with element.
                callback(element)
            }
        }
    
        // Init previous video ID.
        let videoIdCurr = null;
    
        // Init paused video ID.
        let videoIdPaused = null
    
        // Init video element.
        let videoElement = null
    
        /**
         * On playing event.
         */
        function onPlaying() {
            // If video ID has not changed from last paused one
            if (videoIdPaused === videoIdCurr) {
                // just return.
                return
            }
    
            // Pause video
            videoElement.pause()
    
            // Update paused video ID.
            videoIdPaused = videoIdCurr
        }
    
        /**
         * Run on url change.
         */
        function onUrlChange() {
            // Get video id from url.
            const videoIdNew = (new URLSearchParams(window.location.search)).get("v");
            // If
            if (
                // did not get video id
                videoIdNew === null
                ||
                // or video id did not change
                videoIdNew === videoIdCurr
            ) {
                // just return.
                return
            }
    
            // Update previous video id.
            videoIdCurr = videoIdNew;
    
            // Run for
            forElement(
                // video element that has src attribute
                "video[src]",
                function (video) {
                    // If video element is set
                    if (videoElement) {
                        // remove event listener from video element.
                        videoElement.removeEventListener("playing", onPlaying);
                    }
    
                    // Update video element.
                    videoElement = video
    
                    // Add event listener to video element
                    videoElement.addEventListener("playing", onPlaying);
                }
            )
        }
    
        // Add event listener for
        window.addEventListener(
            // Youtube page data updated event.
            'yt-page-data-updated',
            function () {
                onUrlChange();
            }
        );
    
        // Run on url change once on first load.
        onUrlChange();
    })();
2 comments

That could really be a gist with a link.
Good work and fantastic commenting!
Thanks :)