auto show more for YouTube

this plugin will press "show more" button when it displayed by scrolling.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

"use strict";
// ==UserScript==
// @name           auto show more for YouTube
// @name:ja        YouTubeの「もっと見る」ボタンを自動で押す
// @description    this plugin will press "show more" button when it displayed by scrolling.
// @description:ja YouTube.comの「もっと見る」ボタンが、スクロールによって画面に表示された瞬間、自動で押されます。
// @namespace      https://twitter.com/sititou70
// @license        MIT
// @include        /https*:\/\/www\.youtube\.com\/.*/
// @version        2.2.4
// @grant          none
// ==/UserScript==
// settings
var scroll_event_interval = 200;
var adjust_scroll_px = 0;
var target_infos = [
    {
        name: 'comment reply',
        selector: 'ytd-comment-thread-renderer > div > ytd-comment-replies-renderer > div > ytd-button-renderer',
        click_times: 1,
    },
    {
        name: 'more comment replies',
        selector: 'ytd-comment-thread-renderer > div > ytd-comment-replies-renderer > div > div > div > yt-next-continuation > tp-yt-paper-button',
        click_times: Infinity,
    },
    {
        name: 'comment read more',
        selector: 'ytd-comment-thread-renderer ytd-comment-renderer ytd-expander > tp-yt-paper-button',
        click_times: 1,
    },
    {
        name: 'video info',
        selector: 'ytd-expander.ytd-video-secondary-info-renderer > tp-yt-paper-button',
        click_times: 1,
    },
];
// global variables
var button_caches = {};
var initButtonCaches = function () {
    return target_infos.forEach(function (x) {
        button_caches[x.name] = [];
    });
};
initButtonCaches();
// utils
var user_agent = window.navigator.userAgent.toLowerCase();
var fireClickEvent = function (elem) {
    if (user_agent.match(/(msie|MSIE)/) || user_agent.match(/(T|t)rident/)) {
        elem.fireEvent('onclick');
    }
    else {
        var event_1 = document.createEvent('MouseEvents');
        event_1.initEvent('click', true, true);
        elem.dispatchEvent(event_1);
    }
};
// events
var scrollHandler = function () {
    return target_infos.forEach(function (target_info) {
        document.querySelectorAll(target_info.selector).forEach(function (elem) {
            var button_cahce = button_caches[target_info.name].find(function (y) { return y.elem === elem; });
            if (button_cahce === undefined) {
                button_cahce = {
                    elem: elem,
                    click_times: 0,
                };
                button_caches[target_info.name].push(button_cahce);
            }
            var click_times_flg = button_cahce.click_times < target_info.click_times;
            var button_position_flg = elem.getBoundingClientRect().y - window.innerHeight + adjust_scroll_px <
                0;
            if (click_times_flg && button_position_flg) {
                fireClickEvent(elem);
                button_cahce.click_times++;
                // highlight clicked button for debugging
                // (elem as any).style.border = '1px solid #f00';
            }
        });
    });
};
var waiting_for_scroll_event_interval = false;
document.addEventListener('scroll', function () {
    if (waiting_for_scroll_event_interval)
        return;
    waiting_for_scroll_event_interval = true;
    setTimeout(function () {
        waiting_for_scroll_event_interval = false;
    }, scroll_event_interval);
    scrollHandler();
});
document.addEventListener('click', function (e) {
    //let target = e.target;
    var event_target = e.target instanceof HTMLElement ? e.target : undefined;
    if (event_target === undefined)
        return;
    var current_target = event_target;
    while (current_target instanceof HTMLElement &&
        current_target !== document.body) {
        if (current_target.tagName === 'A') {
            initButtonCaches();
            return;
        }
        current_target = current_target.parentElement;
    }
});