麻豆重排序

根据观看次数重新排序视频列表

// ==UserScript==
// @name         麻豆重排序
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  根据观看次数重新排序视频列表
// @author       taxueqinyin,DeepSeek
// @license      GPL-3.0
// @match        *.madou.club/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=madou.club
// @grant        none
// ==/UserScript==

(function () {
    'use strict';
    console.log('Madou Rerank');
    // 监听的目标容器选择器
    const containerSelector = 'div.excerpts.native_plug_container';
    // 视频元素选择器
    const articleSelector = 'article.excerpt.excerpt-c5';
    // 观看次数元素选择器
    const viewCountSelector = 'article footer > span';

    // 解析观看次数为数字
    function parseViewCount(text) {
        const match = text.match(/观看\((\d+(?:\.\d+)?)([KMB]?)\)/);
        if (!match) {
            console.log('未匹配到观看次数格式');
            return 0;
        }

        let num = parseFloat(match[1]);
        const unit = match[2];

        if (unit === 'K') num *= 1000;
        else if (unit === 'M') num *= 1000000;
        else if (unit === 'B') num *= 1000000000;
        return num;
    }

    // 根据观看次数排序视频
    function sortArticles() {
        const container = document.querySelector(containerSelector);
        if (!container) return;
        const articles = Array.from(container.querySelectorAll(articleSelector));
        if (articles.length < 2) return;
        // 为每个视频添加观看次数数据
        const articlesWithViews = articles.map(article => {
            const viewSpan = article.querySelector(viewCountSelector);
            const viewText = viewSpan ? viewSpan.textContent : '';
            const viewCount = parseViewCount(viewText);
            return { article, viewCount };
        });
        // 按观看次数降序排序
        articlesWithViews.sort((a, b) => b.viewCount - a.viewCount);

        // 重新插入排序后的视频
        const fragment = document.createDocumentFragment();
        articlesWithViews.forEach(({ article }) => {
            fragment.appendChild(article);
        });
        container.innerHTML = '';
        container.appendChild(fragment);
        console.log("rerank");
    }

    // 使用MutationObserver监听容器变化
    function observeContainer() {
        const container = document.querySelector(containerSelector);
        if (!container) {
            // 容器不存在,稍后重试
            setTimeout(observeContainer, 1000);
            return;
        }

        // 初始排序
        sortArticles();

        // 监听子元素变化
        // 添加防抖函数
        function debounce(func, delay) {
            let timer;
            return function () {
                clearTimeout(timer);
                timer = setTimeout(() => func.apply(this, arguments), delay);
            };
        }

        const debouncedSort = debounce(sortArticles, 300);
        let lastArticleCount = 0;

        const observer = new MutationObserver((mutations) => {
            let hasNewArticles = false;
            for (const mutation of mutations) {
                if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                    const currentCount = container.querySelectorAll(articleSelector).length;
                    if (currentCount > lastArticleCount) {
                        hasNewArticles = true;
                        lastArticleCount = currentCount;
                        break;
                    }
                }
            }
            if (hasNewArticles) {
                debouncedSort();
            }
        });

        observer.observe(container, { childList: true, subtree: true });
    }

    // 页面加载完成后开始监听
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', observeContainer);
    } else {
        observeContainer();
    }
})();