auto show more for YouTube

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

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