Holodex - Auto Click Sort Dropdown and Select Most Viewers (With Load Detection)

Automatically clicks the sort dropdown and selects "Most Viewers" on Holodex.net with load detection

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Holodex - Auto Click Sort Dropdown and Select Most Viewers (With Load Detection)
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Automatically clicks the sort dropdown and selects "Most Viewers" on Holodex.net with load detection
// @author       ChatGPT
// @match        https://holodex.net/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function () {
    'use strict';

    // 정렬 아이콘 클릭을 위한 함수
    function findSortButton() {
        return [...document.querySelectorAll('svg.v-icon__svg')].find(svg => {
            const path = svg.querySelector('path');
            return path?.getAttribute('d') === 'M6,13H18V11H6M3,6V8H21V6M10,18H14V16H10V18Z';
        })?.closest('button');
    }

    // "Sort" 탭 클릭
    function clickSortTab() {
        const sortTab = document.querySelector('.v-select__selection--comma');
        if (sortTab && sortTab.textContent.includes('Latest')) {
            console.log('[Tampermonkey] "Sort" tab found, clicking...');
            sortTab.click();
        } else {
            console.log('[Tampermonkey] "Sort" tab not found!');
        }
    }

    // "Most Viewers" 항목 선택
    function selectMostViewers() {
        const listItems = document.querySelectorAll('.v-list-item');
        for (const item of listItems) {
            if (item.textContent.includes('Most Viewers')) {
                console.log('[Tampermonkey] "Most Viewers" found, selecting...');
                item.click();
                return true;
            }
        }
        return false;
    }

    // 첫 번째 정렬 버튼 클릭 및 이후 단계 처리
    function trySortClickAndSelect() {
        const sortButton = findSortButton();
        if (sortButton) {
            console.log('[Tampermonkey] Sort button found, clicking...');
            sortButton.click();

            // 바로 "Sort" 탭 클릭
            clickSortTab();

            // "Most Viewers" 항목을 바로 선택 시도
            if (!selectMostViewers()) {
                console.log('[Tampermonkey] "Most Viewers" not found yet, retrying...');
                // 만약 아직 항목이 준비되지 않았다면 다시 시도
                setTimeout(() => {
                    console.log('[Tampermonkey] Retry select "Most Viewers"...');
                    selectMostViewers();
                }, 300);
            }
        } else {
            console.log('[Tampermonkey] Sort button not found!');
        }
    }

    // 로딩 완료 감지 함수
    function detectPageLoad() {
        // 페이지 로딩이 완료되고 나면 클릭 작업 시작
        if (document.readyState === 'complete') {
            console.log('[Tampermonkey] Page loaded, starting sort click...');
            trySortClickAndSelect();
        }
    }

    // 페이지 로딩 상태 감지
    window.addEventListener('load', detectPageLoad);

    // DOM 변화 감지
    const observer = new MutationObserver(() => {
        const sortButton = findSortButton();
        if (sortButton) {
            sortButton.click();
            console.log('[Tampermonkey] Sort dropdown button clicked');
            observer.disconnect(); // 버튼 클릭 후 감지 종료

            // 버튼 클릭 후 나머지 작업 수행
            trySortClickAndSelect();
        }
    });

    // 페이지 로드 후 감지 시작
    window.addEventListener('load', () => {
        console.log('[Tampermonkey] Script loaded, starting observer...');
        observer.observe(document.body, { childList: true, subtree: true });
    });
})();