Greasy Fork is available in English.
在bilibili视频的播放数统计旁边添加原生MP4、转换后的ASS的下载链接。
当前为
// ==UserScript==
// @name bilibili native mp4 + converted ass download
// @namespace http://qli5.tk/
// @homepageURL http://qli5.tk/
// @description 在bilibili视频的播放数统计旁边添加原生MP4、转换后的ASS的下载链接。
// @include http://www.bilibili.com/video/av*
// @include https://www.bilibili.com/video/av*
// @include http://bangumi.bilibili.com/anime/*/play*
// @include https://bangumi.bilibili.com/anime/*/play*
// @version 0.4
// @author qli5
// @copyright qli5, 2014+, 田生
// @license Mozilla Public License 2.0; http://www.mozilla.org/MPL/2.0/
// @require http://greasyfork.icu/scripts/2231-bilibili-ass-danmaku-downloader/code/bilibili%20ASS%20Danmaku%20Downloader.user.js
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
// reset dalao's script
window.removeEventListener('DOMContentLoaded', init);
init = function() {};
initFont();
// upgrade to https
fetchXML = function (cid, callback) {
$.ajax({
method: 'GET',
url: 'https://comment.bilibili.com/{{cid}}.xml'.replace('{{cid}}', cid),
dataType: 'text',
success: function (resp) {
var content = resp.replace(/(?:[\0-\x08\x0B\f\x0E-\x1F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, "");
callback(content);
}
});
};
// init
var mp4A = document.createElement('a');
var assA = document.createElement('a');
mp4A.textContent = '原生MP4';
assA.textContent = 'ASS弹幕';
mp4A.style.color = assA.style.color = '#00a1d6';
mp4A.style.fontSize = assA.style.fontSize = '16px';
// I do not know, nor do I care about bilibili's customized events
function getPlayerWin(callback) {
function requestH5Player() {
var h=document.querySelector('div.tminfo');
h.insertBefore(document.createTextNode('[[mp4下载插件需要HTML5播放器(弹幕列表右上角三个点的按钮切换)]] '), h.firstChild);
}
function getIframeWin(callback) {
if (document.querySelector('#bofqi > iframe').contentDocument.querySelector('div.bilibili-player-video-btn.bilibili-player-video-btn-quality > div > ul > li:nth-child(2)')) {
callback(document.querySelector('#bofqi > iframe').contentWindow);
}
else {
document.querySelector('#bofqi > iframe').addEventListener("load", function () {
callback(document.querySelector('#bofqi > iframe').contentWindow);
});
}
}
if (location.host == 'bangumi.bilibili.com') {
if (document.querySelector('#bofqi > iframe')) {
getIframeWin(callback);
}
else if (MutationObserver) {
var observer = new MutationObserver(function() {
if (document.querySelector('#bofqi > iframe')) {
observer.disconnect();
getIframeWin(callback);
}
else if (document.querySelector('#bofqi > object')) {
observer.disconnect();
requestH5Player();
}
});
observer.observe(window.document.getElementById('bofqi'), {childList: true});
}
else{
var t = setInterval(function() {
if (document.querySelector('#bofqi > iframe')) {
clearInterval(t);
getIframeWin(callback);
}
else if (document.querySelector('#bofqi > object')) {
clearInterval(t);
requestH5Player();
}
}, 600);
}
}
else {
if (document.querySelector('#bofqi > object')) {
requestH5Player();
}
else {
callback(window);
}
}
}
function getPlayer(playerWin, callback) {
if (playerWin.document.querySelector('div.bilibili-player-video-btn.bilibili-player-video-btn-quality > div > ul > li:nth-child(2)')) {
callback(playerWin);
}
else if (MutationObserver) {
var observer = new MutationObserver(function() {
if (playerWin.document.querySelector('div.bilibili-player-video-btn.bilibili-player-video-btn-quality > div > ul > li:nth-child(2)')) {
observer.disconnect();
callback(playerWin);
}
});
observer.observe(playerWin.document.getElementById('bilibiliPlayer'), {childList: true});
}
else{
var t = setInterval(function() {
if (playerWin.document.querySelector('div.bilibili-player-video-btn.bilibili-player-video-btn-quality > div > ul > li:nth-child(2)')) {
clearInterval(t);
callback(playerWin);
}
}, 600);
}
}
function getInfo(playerWin) {
var jq = playerWin == window? $ : playerWin.$;
var _ajax = jq.ajax;
// jq hijack
jq.ajax = function(a, c) {
if (a.url.search('interface.bilibili.com/playurl?') != -1 || a.url.search('bangumi.bilibili.com/player/web_api/playurl?') != -1) {
var _success = a.success;
_success({});
jq.ajax = _ajax;
var cid = a.url.match(/cid=\d*/)[0].slice(4);
fetchDanmaku(cid, function (danmaku) {
var ass = generateASS(setPosition(danmaku), {
'title': name,
'ori': location.href,
});
// I would assume most users are using Windows
var blob = new Blob(['\ufeff' + ass], { type: 'application/octet-stream' });
assA.href=window.URL.createObjectURL(blob);
});
a.success = function(res) {
mp4A.href = res.durl[0].url.replace('http:', location.protocol);
assA.download = mp4A.href.match(/\d(\d|-|hd)*(?=\.mp4)/)[0] + '.ass';
var h=document.querySelector('div.tminfo');
h.insertBefore(document.createTextNode(' '), h.firstChild);
h.insertBefore(assA, h.firstChild);
h.insertBefore(document.createTextNode(' '), h.firstChild);
h.insertBefore(mp4A, h.firstChild);
};
}
_ajax(a, c);
};
playerWin.document.querySelector('div.bilibili-player-video-btn.bilibili-player-video-btn-quality > div > ul > li:nth-child(2)').click();
}
getPlayerWin(function(playerWin) {
getPlayer(playerWin, getInfo);
});
})();