Greasy Fork

Greasy Fork is available in English.

哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)

跳转至BiliPlus, 贝贝工具站, 唧唧, 备份或查看某个视频的信息

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name              哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)
// @name:zh-CN        哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)
// @name:zh-TW        哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)
// @namespace         http://tampermonkey.net/
// @version           1.2.4
// @description       跳转至BiliPlus, 贝贝工具站, 唧唧, 备份或查看某个视频的信息
// @description:zh-CN 跳转至BiliPlus, 贝贝工具站, 唧唧, 备份或查看某个视频的信息
// @description:zh-TW 跳转至BiliPlus, 贝贝工具站, 唧唧, 备份或查看某个视频的信息
// @author            YTB0710
// @match             https://space.bilibili.com/*
// @grant             GM_openInTab
// ==/UserScript==

(function () {
    'use strict';

    const favlistURLRegex = /https:\/\/space\.bilibili\.com\/\d+\/favlist.*/;
    const getBVFromURLRegex = /video\/(\w+)/;
    const getCoverFromURLRegex = /\/\/([^@]*)@/;

    let onFavlistPage = false;

    const favlistObserver = new MutationObserver((_mutations, observer) => {
        if (document.querySelector('div.favlist-main')) {
            observer.disconnect();
            addMessage(true);
            biliCardDropdownPopperObserver.observe(document.body, { childList: true, attributes: false, characterData: false });
            return;
        }
        if (document.querySelector('div.fav-content.section')) {
            observer.disconnect();
            addMessage(false);
            favContentSectionObserver.observe(document.querySelector('div.fav-content.section'), { characterData: false, attributeFilter: ['class'] });
            return;
        }
    });

    const biliCardDropdownPopperObserver = new MutationObserver(mutations => {
        for (const mutation of mutations) {
            for (const addedNode of mutation.addedNodes) {
                if (addedNode.nodeType === 1 && addedNode.classList.contains('bili-card-dropdown-popper')) {
                    mainNewFreshSpace(addedNode);
                    return;
                }
            }
        }
    });

    const favContentSectionObserver = new MutationObserver(mutations => {
        for (const mutation of mutations) {
            if (!mutation.target.classList.contains('loading')) {
                main();
                return;
            }
        }
    });

    checkURL();

    const originalPushState = history.pushState;
    history.pushState = function (...args) {
        originalPushState.apply(this, args);
        checkURL();
    };

    const originalReplaceState = history.replaceState;
    history.replaceState = function (...args) {
        originalReplaceState.apply(this, args);
        checkURL();
    };

    window.addEventListener('popstate', checkURL);

    function checkURL() {
        if (favlistURLRegex.test(location.href)) {
            if (!onFavlistPage) {
                onFavlistPage = true;
                favlistObserver.observe(document.body, { subtree: true, childList: true, attributes: false, characterData: false });
            }
        } else {
            if (onFavlistPage) {
                onFavlistPage = false;
                favlistObserver.disconnect();
                biliCardDropdownPopperObserver.disconnect();
                favContentSectionObserver.disconnect();
            }
        }
    }

    function mainNewFreshSpace(divDropdownPopper) {
        const divDropdowns = document.querySelectorAll('div.bili-card-dropdown--visible');
        if (divDropdowns.length !== 1) {
            return;
        }

        let divTargetVideo;
        try {
            divTargetVideo = document.querySelector('div.items__item:has(.bili-card-dropdown--visible)');
        } catch {
            const items = document.querySelectorAll('div.items__item');
            for (const item of items) {
                if (item.contains(divDropdowns[0])) {
                    divTargetVideo = item;
                    break;
                }
            }
        }
        if (!divTargetVideo) {
            return;
        }

        if (divTargetVideo.querySelector('div.bili-cover-card__tags')) {
            return;
        }

        let disabled = false;
        if (!divTargetVideo.querySelector('div.bili-cover-card__stats')) {
            disabled = true;
        }

        const BV = divDropdowns[0].parentNode.querySelector('a').getAttribute('href').match(getBVFromURLRegex)[1];

        const dropdownJump = document.createElement('div');
        dropdownJump.classList.add('bili-card-dropdown-popper__item');
        dropdownJump.textContent = '跳转至BXJ';
        dropdownJump.addEventListener('click', () => {
            divDropdownPopper.classList.remove('visible');
            GM_openInTab(`https://www.biliplus.com/video/${BV}`, { active: disabled, insert: false, setParent: true });
            GM_openInTab(`https://xbeibeix.com/video/${BV}`, { insert: false, setParent: true });
            GM_openInTab(`https://www.jijidown.com/video/${BV}`, { insert: false, setParent: true });
        });
        divDropdownPopper.appendChild(dropdownJump);

        if (!disabled) {
            const dropdownCover = document.createElement('div');
            dropdownCover.classList.add('bili-card-dropdown-popper__item');
            dropdownCover.textContent = '封面原图';
            dropdownCover.addEventListener('click', () => {
                divDropdownPopper.classList.remove('visible');
                GM_openInTab(`https://${divTargetVideo.querySelector('img').getAttribute('src').match(getCoverFromURLRegex)[1]}`, { active: true, insert: true, setParent: true });
            });
            divDropdownPopper.appendChild(dropdownCover);
        }
    }

    function main() {
        for (const li of document.querySelectorAll('li.small-item')) {
            if (li.querySelector('div.ogv-corner-tag')) {
                continue;
            }

            const ul = li.querySelector('ul.be-dropdown-menu');
            if (!ul) {
                continue;
            }

            if (!ul.lastElementChild.classList.contains('added')) {
                ul.lastElementChild.classList.add('be-dropdown-item-delimiter');

                let disabled = false;
                if (li.classList.contains('disabled')) {
                    disabled = true;
                }

                const BV = li.getAttribute('data-aid');

                const dropdownJump = document.createElement('li');
                dropdownJump.classList.add('be-dropdown-item', 'added');
                dropdownJump.textContent = '跳转至BXJ';
                dropdownJump.addEventListener('click', () => {
                    GM_openInTab(`https://www.biliplus.com/video/${BV}`, { active: disabled, insert: false, setParent: true });
                    GM_openInTab(`https://xbeibeix.com/video/${BV}`, { insert: false, setParent: true });
                    GM_openInTab(`https://www.jijidown.com/video/${BV}`, { insert: false, setParent: true });
                });
                ul.appendChild(dropdownJump);

                if (!disabled) {
                    const dropdownCover = document.createElement('li');
                    dropdownCover.classList.add('be-dropdown-item', 'added');
                    dropdownCover.textContent = '封面原图';
                    dropdownCover.addEventListener('click', () => {
                        GM_openInTab(`https://${li.querySelector('img').getAttribute('src').match(getCoverFromURLRegex)[1]}`, { active: true, insert: true, setParent: true });
                    });
                    ul.appendChild(dropdownCover);
                }
            }
        }
    }

    function addMessage(newFreshSpace) {
        const p = document.createElement('p');
        p.innerHTML = '<a href="http://greasyfork.icu/scripts/506785" target="_blank" style="text-decoration-line: underline;">哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)</a> 的功能' +
            '已经整合进 <a href="http://greasyfork.icu/scripts/521668" target="_blank" style="text-decoration-line: underline;">哔哩哔哩(B站|Bilibili)收藏夹Fix (备份视频信息)</a>。';
        p.style.padding = newFreshSpace ? '2px 0' : '2px';
        p.style.fontSize = newFreshSpace ? '13px' : '12px';
        p.style.lineHeight = '1.5';
        document.querySelector(newFreshSpace ? 'div.favlist-aside' : 'div.fav-sidenav').appendChild(p);
    }
})();