Bilibili Search Results Sorter

Sort Bilibili search results by date and display in a new table

目前为 2024-06-01 提交的版本。查看 最新版本

// ==UserScript==
// @name         Bilibili Search Results Sorter
// @namespace    http://tampermonkey.net/
// @version      1.8
// @description  Sort Bilibili search results by date and display in a new table
// @author       Zola
// @license      MIT
// @match        https://search.bilibili.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Function to convert date strings to Date objects
    // 将日期字符串转换为 Date 对象的函数
    function parseDate(dateStr) {
        const now = new Date();
        const relativeTimeMatch = dateStr.match(/(\d+)(分钟|小时|天)前/);
        if (relativeTimeMatch) {
            const value = parseInt(relativeTimeMatch[1], 10);
            const unit = relativeTimeMatch[2];
            if (unit === '分钟') {
                return new Date(now.getTime() - value * 60000); // 处理“几分钟前”的情况
            } else if (unit === '小时') {
                return new Date(now.getTime() - value * 3600000); // 处理“几小时前”的情况
            } else if (unit === '天') {
                return new Date(now.getTime() - value * 86400000); // 处理“几天前”的情况
            }
        }

        if (dateStr === '昨天') {
            return new Date(now.getTime() - 86400000); // 处理“昨天”的情况
        }

        const parts = dateStr.split('-').map(Number);
        if (parts.length === 2) { // 当前年份的日期格式
            const currentYear = new Date().getFullYear();
            return new Date(currentYear, parts[0] - 1, parts[1]);
        } else if (parts.length === 3) { // 包含年份的完整日期格式
            return new Date(parts[0], parts[1] - 1, parts[2]);
        }
        return new Date(NaN); // 无效日期
    }

    // Function to sort search results by date
    // 按日期排序搜索结果的函数
    function sortResults() {
        const container = document.querySelector('.video.i_wrapper.search-all-list');
        if (!container) return;
        
        const items = Array.from(container.querySelectorAll('.bili-video-card'));
        const videoData = items.map(item => {
            const title = item.querySelector('.bili-video-card__info--tit').innerText.trim();
            const dateStr = item.querySelector('.bili-video-card__info--date').innerText.trim().replace('· ', '');
            const date = parseDate(dateStr);
            const link = item.querySelector('a').href;
            const thumbnail = item.querySelector('.bili-video-card__cover img').src;
            const author = item.querySelector('.bili-video-card__info--author').innerText.trim();
            return { title, date, link, thumbnail, author };
        });

        // Sort video data by date, latest first
        // 按日期排序视频数据,最新的排在前面
        videoData.sort((a, b) => b.date - a.date);

        // Create new table to display sorted results
        // 创建新的表格来显示排序后的结果
        const newTable = document.createElement('table');
        newTable.style.width = '100%';
        newTable.style.borderCollapse = 'collapse';
        newTable.innerHTML = `
            <thead>
                <tr>
                    <th style="border: 1px solid #ddd; padding: 8px;">Thumbnail</th>
                    <th style="border: 1px solid #ddd; padding: 8px;">Title</th>
                    <th style="border: 1px solid #ddd; padding: 8px;">Date</th>
                    <th style="border: 1px solid #ddd; padding: 8px;">Author</th>
                </tr>
            </thead>
            <tbody>
                ${videoData.map(video => `
                    <tr>
                        <td style="border: 1px solid #ddd; padding: 8px;"><img src="${video.thumbnail}" alt="Thumbnail" style="width: 100px;"></td>
                        <td style="border: 1px solid #ddd; padding: 8px;"><a href="${video.link}" target="_blank">${video.title}</a></td>
                        <td style="border: 1px solid #ddd; padding: 8px;">${video.date.toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })}</td>
                        <td style="border: 1px solid #ddd; padding: 8px;">${video.author}</td>
                    </tr>
                `).join('')}
            </tbody>
        `;

        // Replace original content with new table
        // 用新表格替换原来的内容
        container.innerHTML = '';
        container.appendChild(newTable);
    }

    // Execute the sort function after the page loads
    // 页面加载后执行排序函数
    window.addEventListener('load', sortResults);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址