Greasy Fork

Greasy Fork is available in English.

还我av页旧版播放器

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

当前为 2019-12-27 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         还我av页旧版播放器
// @namespace    Motoori Kashin
// @version      1.0
// @description  基本实现了在bilibli的av页启用旧版播放器,剩下些布局问题和会跳转的av页问题
// @author       Motoori Kashin
// @match        *://*.bilibili.com/video/av*
// @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();
})();