Greasy Fork is available in English.

还我av页旧版播放器

基本实现了在bilibli的av页启用旧版播放器,剩下些布局问题和会跳转的av页问题

您查看的为 2019-12-27 提交的版本。查看 最新版本

// ==UserScript==
// @name         还我av页旧版播放器
// @namespace    Motoori Kashin
// @version      1.0
// @description  基本实现了在bilibli的av页启用旧版播放器,剩下些布局问题和会跳转的av页问题
// @author       Motoori Kashin
// @match        *://*.bilibili.com/video/av*
// @license      MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    window.stop();
    // 收回前言jquery.1.7.4.js是通过定时器载入的,而且会取代重写引入的jquery.min.js,所以还是要清除
    var highestTimeoutId = setTimeout(";");
    for (var i = 0 ; i < highestTimeoutId ; i++) {
        clearTimeout(i);//清除所有定时器,防止后续Element载入
    }
    const xhr = new XMLHttpRequest();
    xhr.open('GET', window.location.href);// 返回新播放页,为重写提供可能需要的数据,不过貌似用不到
    xhr.onload = () => {
        var html = xhr.responseText.replace(/<script\b[\s\S]*?<\/script>/g,"");// ---------------------清空所有<script>脚本
        var a = html.replace(/<style\b[\s\S]*?<\/style>/g,"");// --------------------------------------清空所有<style>布局
        a = a.replace(/<link\b[\s\S]*?>/g,"");// ------------------------------------------------------清空所有<link>引入的css布局
        html = a.replace(/<body\b[\s\S]*?<\/body>/g,"<body>xxx</body>"); // ---------------------------清空<body>并用"xxx"占位,方便重写<body>
        // 同时引入了新av页css和旧稍后再看css修复布局,现在剩下播放器在up信息之上的问题
        var wrh = '<script type="text/javascript">(function(){var ua=window.navigator.userAgent,agents=["Android","iPhone","SymbianOS","Windows Phone","iPod"],isPC=true;for(var i=0,len=agents.length;i<len;i++){if(ua.indexOf(agents[i])>0){isPC=false;break}}if(!isPC){var href=window.location.origin.replace("www","m")+"/video/"+window.location.href.match(/av([0-9]+)/g)[0]+".html"+window.location.search;window.location.href=href}})();</script><script type="text/javascript">window.spmReportData = {}window.reportConfig = { sample : 1, scrollTracker: true, msgObjects : ' + "'" + 'spmReportData' + "'" + ', errorTracker: true }</script>' +
            '<link rel="stylesheet" href="//s1.hdslb.com/bfs/static/jinkela/video/css/stardust-video.0.98c7582a48a04d7c48ad075c78ae33b16a816c7e.css">'+
            '<link rel="stylesheet" href="//s1.hdslb.com/bfs/static/phoenix/viewlater/static/css/main.d9641d2f4dc42228ea8c2650e1b98b0b.css">'+
            '<style type="text/css">.player{text-align: center;margin:0 auto;display: block;}</style></head>';// 使播放器居中
        html = html.replace(/<\/head>/g,wrh);

        // 开始重写<body>,这里未调用任何新版播放页返回的数据直接写最基本框架来测试(去除了所有依赖av号数据的内容)
        var wrb = '<div class="z-top-container has-menu" type="all" style="height:263px"></div>'+// 新添加了版头,后面还添加了版尾
            '<div id="video-page-app"></div>' +
            // 复写原生网页残留的两个函数,他们是导致播放器大小变化的罪魁祸首
            '<script type="text/javascript">function getIEVersion(){};function setSize(){};</script>' +
            // 两个最基本的js脚本,第二个应该就是旧版播放器
            '<script type="text/javascript" src="https://static.hdslb.com/js/jquery.min.js"></script>' +
            '<script type="text/javascript" src="https://static.hdslb.com/js/video.min.js"></script>' +
            '<div class="player-fix abs" id="bofqi">' +
                '<script type="text/javascript">' +
                    // 似乎是载入旧版播放器的关键代码,取自2018年5月2日旧版av页同样位置,这里的缩进表示原来的标签层次
                    // 这里警告是因为原代码中带有混用了单双引号',这里把单引号重新用双引号",包起来使其不与赋值时用到的单引号'冲突,警告是说建议不要用加号+连接两个用单引号'框起来的字符串(因为直接写在一起就行,这里由于单引号冲突'只能用加号+)
                    'window.getInternetExplorerVersion=function(){var rv=-1;if(navigator.appName=="Microsoft Internet Explorer"){var ua=navigator.userAgent;var re=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");if(re.exec(ua)!=null){rv=parseFloat(RegExp.$1)}}return rv};function getQueryString(name){var reg=new RegExp("(^|&)"+name+"=([^&]*)(&|$)");var r=window.location.search.substr(1).match(reg);if(r!=null){return unescape(r[2])}return null}var vd=window.__INITIAL_STATE__&&window.__INITIAL_STATE__.videoData;if(vd&&vd.aid&&getInternetExplorerVersion()!==9){$("#__bofqi").innerHTML=' + "'" + '<div class="bili-wrapper" id="bofqi"><div id="player_placeholder"></div></div>' + "'" + ';if(vd.embedPlayer){var p=getQueryString("p")?getQueryString("p")-1:0;var player={aid:vd.aid,cid:(vd.pages[p]&&vd.pages[p].cid)||vd.pages[0].cid};EmbedPlayer("player","https://static.hdslb.com/play.swf","cid="+player.cid+"&aid="+player.aid+"&pre_ad=")}if(vd.embed){$("#bofqi").html(vd.embed)}}else{$("#bofqi").remove()};' +
                '</script>' +
            '</div>' +
            // 2018年5月2日旧版av页的主体部分,网页显示全部内容都在这个id="app"的div里,其中很多内容(后端直接写在网页里的)需要依赖上面新av页数据返回来修改(或者用api重新获取),这里为了测试删除了下级所有标签(包括上面那个关键脚本可能依赖的标签)
            // 在审查元素界面可以看到,自动生成了很多信息,包括视频信息和up信息
            '<div id="app" data-server-rendered="true"></div><div class="footer bili-footer"></div><script type="text/javascript" src="//static.hdslb.com/common/js/footer.js"></script>';

        // 用重写的<body>替换占位的"xxx"
        html = html.replace(/xxx/g,wrb);
        document.open();
        document.write(html);
        document.close();
    };
    xhr.send();
})();