Make BiliBili Grate Again

useful tweaks for bilibili.com

La data de 03-04-2022. Vezi ultima versiune.

// ==UserScript==
// @name         Make BiliBili Grate Again
// @namespace    https://www.kookxiang.com/
// @version      1.3.1
// @description  useful tweaks for bilibili.com
// @author       kookxiang
// @match        https://*.bilibili.com/*
// @grant        unsafeWindow
// ==/UserScript==

let customStyle = `
.home-content {
    width: calc(100vw - 60px) !important;
    min-width: 1160px;
}

.home-content .center-panel {
    flex: 1 !important;
}

.home-content .center-panel .card .main-content {
    width: calc(100% - 120px) !important;
}
`

// 动态页面优化
if (location.host === "t.bilibili.com") {
    customStyle += `
#internationalHeader {
    position: sticky !important;
    top: 0;
}

.home-content .left-panel .scroll-content {
    top: 56px !important;
}

.home-content .right-panel .scroll-content {
    top: 64px !important;
}
`
}

// 去广告
if (unsafeWindow.__INITIAL_STATE__ && unsafeWindow.__INITIAL_STATE__.locsData) {
    for (const key in unsafeWindow.__INITIAL_STATE__.locsData) {
        if (!Array.isArray(unsafeWindow.__INITIAL_STATE__.locsData[key])) {
            continue;
        }
        unsafeWindow.__INITIAL_STATE__.locsData[key] = unsafeWindow.__INITIAL_STATE__.locsData[key].filter(x => !x.is_ad)
    }
}

// 修复文章区复制
if (location.href.startsWith('https://www.bilibili.com/read/cv')) {
    unsafeWindow.original.reprint = "1"
    document.querySelector('.article-holder').classList.remove("unable-reprint")
    document.querySelector('.article-holder').addEventListener('copy', e => e.stopImmediatePropagation(), true)
}

// 去 P2P CDN
if (location.href.startsWith('https://www.bilibili.com/video/') || location.href.startsWith('https://www.bilibili.com/bangumi/play/')) {
    let cdnDomain

    try {
        [ cdnDomain ] = document.head.innerHTML.match(/up[\w-]+\.bilivideo\.com/)
    } catch(e) {}

    (function(open) {
        unsafeWindow.XMLHttpRequest.prototype.open = function() {
            try {
                const urlObj = new URL(arguments[1]);
                if (urlObj.hostname.endsWith(".mcdn.bilivideo.cn")) {
                    urlObj.host = cdnDomain || 'upos-sz-mirrorcoso1.bilivideo.com'
                    urlObj.port = 443
                    console.warn(`更换视频源: ${urlObj.host}`);
                    arguments[1] = urlObj.toString()
                } else if (urlObj.hostname.endsWith(".szbdyd.com")) {
                    urlObj.host = urlObj.searchParams.get('xy_usource');
                    urlObj.port = 443;
                    console.warn(`更换视频源: ${urlObj.host}`);
                    arguments[1] = urlObj.toString();
                }
            } finally {
                return open.apply(this, arguments)
            }
        };
    })(unsafeWindow.XMLHttpRequest.prototype.open);

}

// 视频裁切
if (location.href.startsWith('https://www.bilibili.com/video/')) {
    customStyle += `
body[video-fit] .bilibili-player-video video,
body[video-fit] .bilibili-player-video bwp-video {
    object-fit: cover;
}

.bilibili-player-video-btn-setting-left-fit-mode {
    display: flex;
    width: 100%;
    height: 32px;
    line-height: 32px;
}

.bilibili-player-video-btn-setting-box.bui-panel .bui-panel-wrap,
.bilibili-player-video-btn-setting-box.bui-panel .bui-panel-item {
    min-height: 172px !important;
}
`
    let timer;
    function toggleMode(enabled) {
        if (enabled) {
            document.body.setAttribute('video-fit', '')
        } else {
            document.body.removeAttribute('video-fit')
        }
    }
    function injectButton() {
        if (!document.querySelector('.bilibili-player-video-btn-setting-left')) {
            return
        }
        clearInterval(timer)
        const parent = document.querySelector('.bilibili-player-video-btn-setting-left')
        const item = document.createElement('div')
        item.className = 'bilibili-player-video-btn-setting-left-fit-mode bui bui-switch'
        item.innerHTML = '<input class="bui-switch-input" type="checkbox"><label class="bui-switch-label"><span class="bui-switch-name">裁切模式</span><span class="bui-switch-body"><span class="bui-switch-dot"><span></span></span></span></label>'
        parent.insertBefore(item, document.querySelector('.bilibili-player-video-btn-setting-left-more'))
        document.querySelector('.bilibili-player-video-btn-setting-left-fit-mode input').addEventListener('change', e => toggleMode(e.target.checked))
        document.querySelector('.bilibili-player-video-btn-setting-box .bui-panel-item').style.height = ''
    }
    timer = setInterval(injectButton, 200)
}

const style = document.createElement('style')
style.textContent = customStyle
document.head.appendChild(style)