哔哩哔哩轻量化

哔哩哔哩播放器轻量化工具

// ==UserScript==
// @name         哔哩哔哩轻量化
// @namespace    https://ez118.github.io/
// @version      3.7
// @description  哔哩哔哩播放器轻量化工具
// @author       ZZY_WISU
// @match        https://*.bilibili.com/*
// @match        http://*.bilibili.com/*
// @icon         https://static.hdslb.com/images/favicon.ico
// @license      GNU GPLv3
// @grant        GM_xmlhttpRequest
// @grant        GM_download
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @run-at document-start
// ==/UserScript==

if(GM_getValue('IfNewPlayer') == null || GM_getValue('IfNewPlayer') == "" || GM_getValue('IfNewPlayer') == undefined){ GM_setValue('IfNewPlayer', true); }
/* Config*/
var ReplySumMax = 40; /* 作者提示:将"最多可显示的评论数"增加, 可能会使评论加载过程变慢 */

var EmbedPlayerUrl;
if (GM_getValue('IfNewPlayer') == true) {
    EmbedPlayerUrl = "https://player.bilibili.com/player.html?";
} else {
    EmbedPlayerUrl = "https://www.bilibili.com/blackboard/webplayer/activity-embed-other-old.html?";
}

var VideoDetail = ""; /* 用于记录当前视频简介的变量 */
var VideoTitle = ""; /* 用于记录当前视频标题的变量 */
var VideoAid = ""; /* 用于记录当前视频aid的变量(bvid不记录,api使用aid的较多) */
/* Final */


function GetAjax(url,func) {
    GM_xmlhttpRequest({
        method: "GET", url: url, data:"",
        headers: {"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"},
        onload: function(response){func(response.responseText);}, onerror: function(response){alert("[错误]\n请求失败");}
    });
}

function $GET(name){
    var reg = new RegExp('(^|&)'+name+'=([^&]*)(&|$)', 'i');
    var r = window.location.search.substr(1).match(reg);
    if (r != null) { return unescape(r[2]); }
    return "";
}

function GetRedirect(){
    /* 通过普通播放页链接获取aid或bvid */
    var str = window.location.href;
    str = str.replace("/s/", "/");
    if(str.indexOf("?") !== -1){}else{ str += "?";}
    str = str.split("/")[4].replace(str.substring(str.lastIndexOf("?")), "").replace("/", "");
    if(str[1] == "v"){
        return {"type":"aid", "id":str.replace("av", "")};
    } else {
        return {"type":"bvid", "id":str};
    }
}

function ShowVideoReplies(content){
    /* 向网页插入html元素,实现展示评论内容 */

    content = content.replace(/\[.*?\]/g,"").replace(/\r?\n/g,'<br/>').replace(/\【/g, "<b>【").replace(/\】/g, "】</b>");

    GM_addStyle(`.userscript-bilibili-replies-close { width:100%; border-radius:12px; background:#f25d8e; color:#FFF; padding:8px; border:none; margin:5px 0 5px 0; }
                 .userscript-bilibili-replies-hide { word-wrap:break-word; width:25%; height:100%; overflow-x:auto; background:#FFF; color:#000; padding:10px; border:1px solid #CCC; line-height:20px; font-size:15px; position:fixed; top:0px; right:calc(-25% + 5px); bottom:0px; z-index:999; transition:all 0.3s; }
                 .userscript-bilibili-replies-hide:hover { right:0%; }
                 .userscript-bilibili-replies-show { word-wrap:break-word; width:25%; height:100%; overflow-x:auto; background:#FFF; color:#000; padding:10px; border:1px solid #CCC; line-height:20px; font-size:15px; position:fixed; top:0px; right:0%; bottom:0px; z-index:999; }
                 .userscript-bilibili-reptitle { font-size:20px; font-weight:bold; margin-bottom:10px; color:#FFFFFF; background-color:#000000;}`);

    let MDiv = document.createElement('div');
    document.body.appendChild(MDiv);
    MDiv.setAttribute("class", "userscript-bilibili-replies-show");
    MDiv.setAttribute("id", "userscript-bilibili-replies");

    MDiv.innerHTML = `<b class="userscript-bilibili-reptitle">&nbsp;视频详情&nbsp;</b><br/>` + VideoDetail.replace(/\r?\n/g,'<br/>') + `<br/><hr/>
        <b class="userscript-bilibili-reptitle">&nbsp;视频评论&nbsp;</b><br/>` + content + `<br/>
        <button onclick='document.getElementById("userscript-bilibili-replies").remove()' class="userscript-bilibili-replies-close">关闭浏览栏</button><br/><br/>`;

    setTimeout(function(){
        document.getElementById('userscript-bilibili-replies').setAttribute('class','userscript-bilibili-replies-hide');
    }, 3000);
}

function GetVideoReplies(aid){
    /* 获取评论内容 */
    GetAjax("https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn=1&type=1&sort=2&oid=" + aid,function(result){
        let UserShow = "";
        result = eval("(" + result + ")");
        if(result.code == 0){
            for(let i = 0; i <= ReplySumMax; i ++) {
                try {
                    UserShow += "【" + result.data.replies[i].member.uname + "】 " + result.data.replies[i].content.message + "\n";
                } catch(e){console.log("Reply Sum Less Than expected (" + i + "/" + ReplySumMax + ")");}
            }
            //alert(UserShow);
            ShowVideoReplies(UserShow);
        } else {
            alert("获取评论失败!");
        }
    });
}



let menu1 = GM_registerMenuCommand('查看视频详情&评论菜单', function () {
    /* 查看视频详情&评论菜单 */

    let domain = window.location.href.split("/");

    if(domain[2] == "player.bilibili.com" || (domain[2] == "www.bilibili.com" && domain[4] == "webplayer") ){
        /* 如果是播放页,那么执行获取评论的函数 */
        GetVideoReplies(VideoAid);
    }else {
        /* 如果不是,则向用户提示: */
        alert("未支持的页面(若误判,请反馈)");
    }
}, 'R');


let menu2 = GM_registerMenuCommand('在BiliBili客户端中查看视频', function () {
    /* 在BiliBili客户端中查看视频菜单功能 */

    let domain = window.location.href.split("/");
    if(domain[2] == "www.bilibili.com" && ( domain[3] == "video" || domain[3] == "s")){
        /* 这是针对普通播放器的功能(目前没有意义,因为凡是启用脚本,就会跳转到轻量播放器,没有使用普通播放器的机会) */
        /*
        let cb = GetRedirect();
        if(cb.type == "bvid"){
            GetAjax("https://api.bilibili.com/x/web-interface/view?bvid=" + cb.id, function(aid){
                aid = eval("("+aid+")");
                location.href = "bilibili://video/" + aid.data.aid;
            });
        } else {
            location.href = "bilibili://video/" + cb.id;
        }*/
        alert("未支持的页面(若误判,请反馈)");
    } else if(domain[2] == "player.bilibili.com" || (domain[2] == "www.bilibili.com" && domain[4] == "webplayer") ) {
        /* 如果是轻量播放器,则直接使用页面加载时存储的aid创建链接 */
        location.href = "bilibili://video/" + VideoAid;
    }
}, 'O');

let menu3 = GM_registerMenuCommand('更改视频播放器', function () {
    /* 让用户决定是否使用新版播放器 */

    var test_value = confirm("【请选择】\n请选择是否使用新版播放器(点击确定表示使用新版,点击取消表示使用旧版)");
    if(test_value == true) { GM_setValue('IfNewPlayer', true); }
    else { GM_setValue('IfNewPlayer', false); }
}, 'O');



(function() {
    'use strict';

    var domain = window.location.href.split("/");

    if(domain[2] == "www.bilibili.com" && ( domain[3] == "video" || domain[3] == "s")){
        /* 如果当前页面为普通播放页 */
        let cb = GetRedirect();
        top.location.href = EmbedPlayerUrl + cb.type + "=" + cb.id + "&page=1&danmaku=0"; /* 便于自定义 */
    } else if(domain[2] == "www.bilibili.com" && domain[4] == "webplayer") {
        /* 旧版播放器 */

        /* 获取视频标题和详情文本,方便后续获取,减少后续请求所用时长 */
        let DataStr = "";
        if($GET("bvid") != ""){ DataStr = "bvid=" + $GET("bvid"); }
        else { DataStr = "aid=" + $GET("aid"); }
        GetAjax("https://api.bilibili.com/x/web-interface/view?" + DataStr, function(aid){
            aid = eval("("+aid+")");
            try{ VideoDetail = aid.data.desc; } catch(e){ console.log("[USERSCRIPT/哔哩哔哩轻量化] 获取视频详情文本失败"); }
            try{ VideoTitle = aid.data.title; } catch(e){ console.log("[USERSCRIPT/哔哩哔哩轻量化] 获取视频标题失败"); }
            try{ VideoAid = aid.data.aid; } catch(e){ console.log("[USERSCRIPT/哔哩哔哩轻量化] 获取视频aid失败"); }
        });

        /* 删除播放器多余控件,更改视频标题 */
        setTimeout(function() {
            document.getElementsByClassName("bilibili-player-video-sendjumpbar")[0].remove();
            document.getElementsByClassName("bilibili-player-video-pause-panel-container-qrcode")[0].remove();
            document.getElementsByTagName("title")[0].innerText = VideoTitle + "_哔哩哔哩_bilibili";
        }, 3000);
    } else if(domain[2] == "player.bilibili.com") {
        /* 新版播放器 */

        /* 获取视频标题和详情文本,方便后续获取,减少后续请求所用时长 */
        let DataStr = "";
        if($GET("bvid") != ""){ DataStr = "bvid=" + $GET("bvid"); }
        else { DataStr = "aid=" + $GET("aid"); }
        GetAjax("https://api.bilibili.com/x/web-interface/view?" + DataStr, function(aid){
            aid = eval("("+aid+")");
            try{ VideoDetail = aid.data.desc; } catch(e){ console.log("[USERSCRIPT/哔哩哔哩轻量化] 获取视频详情文本失败"); }
            try{ VideoTitle = aid.data.title; } catch(e){ console.log("[USERSCRIPT/哔哩哔哩轻量化] 获取视频标题失败"); }
            try{ VideoAid = aid.data.aid; } catch(e){ console.log("[USERSCRIPT/哔哩哔哩轻量化] 获取视频aid失败"); }
        });

        /* 删除播放器多余控件,更改视频标题 */
        setTimeout(function() {
            document.getElementsByClassName("bpx-player-relation-button")[0].remove();
            document.getElementsByClassName("bpx-player-inputbar-mask")[0].remove();
            document.getElementsByClassName("bpx-player-enter-button")[0].remove();
            GM_addStyle(".bpx-player-video-wrap video{pointer-events: none;!important;}")
            //document.getElementsByClassName("bpx-player-dialog-area")[0].remove();
            document.getElementsByTagName("title")[0].innerText = VideoTitle + "_哔哩哔哩_bilibili";
            //document.querySelectorAll("*")
            document
                .getElementsByClassName("bpx-player-video-perch")
                .forEach(node =>
                    node.addEventListener(
                        "click",
                        event => event.stopImmediatePropagation(),
                        true
                    )
                );
        }, 3000);
    }
})();