106 lines
4.0 KiB
JavaScript
106 lines
4.0 KiB
JavaScript
// ==UserScript==
|
|
// @name Universal encrypted video downloader
|
|
// @namespace http://tampermonkey.net/
|
|
// @version 0.1
|
|
// @description Bypass the encrypted video download protection via js hook
|
|
// @author Evan
|
|
// @match https://www.bilibili.com/video/*
|
|
// @match https://www.bilibili.com/bangumi/play/*
|
|
// @match https://www.youtube.com/watch*
|
|
// @match https://www.huya.com/*
|
|
// @match https://live.bilibili.com/*
|
|
// @grant none
|
|
// ==/UserScript==
|
|
|
|
evanEnv = new Object();
|
|
evanEnv.mediaSources = [];
|
|
evanEnv.enableAutoForward = true;
|
|
evanEnv.enableAutoDownload = true;
|
|
|
|
(function () {
|
|
evanEnv.videos = document.getElementsByTagName('video');
|
|
evanEnv.buildArrayBuffer = function (bufferList) {
|
|
var totalLength = 0;
|
|
for (var i = 0; i < bufferList.length; i++) {
|
|
totalLength += bufferList[i].byteLength;
|
|
}
|
|
var tmp = new Uint8Array(totalLength);
|
|
var lastLength = 0;
|
|
for (var ix = 0; ix < bufferList.length; ix++) {
|
|
tmp.set(new Uint8Array(bufferList[ix]), lastLength);
|
|
lastLength += bufferList[ix].byteLength;
|
|
}
|
|
return tmp.buffer;
|
|
};
|
|
evanEnv.downloadRawData = function (bufferList, fileName = 'out.mp4') {
|
|
var buff = evanEnv.buildArrayBuffer(bufferList);
|
|
let url = window.URL.createObjectURL(new Blob([buff], {type: "arraybuffer"}))
|
|
const link = document.createElement('a');
|
|
link.style.display = 'none';
|
|
link.href = url;
|
|
link.setAttribute('download', fileName);
|
|
document.body.appendChild(link);
|
|
link.click();
|
|
document.body.removeChild(link);
|
|
};
|
|
|
|
evanEnv.download = function () {
|
|
for (var i = 0; i < evanEnv.mediaSources.length; i++) {
|
|
var currentItem = evanEnv.mediaSources[i];
|
|
if (currentItem.downloaded == undefined || currentItem.downloaded == false) {
|
|
for (var x = 0; x < currentItem.rawSources.length; x++) {
|
|
evanEnv.downloadRawData(currentItem.rawSources[x], 'mediasource_' + i + '_' + x + '.mp4');
|
|
}
|
|
}
|
|
currentItem.downloaded = true;
|
|
}
|
|
};
|
|
evanEnv.downloadMediaSource = function (mediaSource) {
|
|
for (var x = 0; x < mediaSource.rawSources.length; x++) {
|
|
evanEnv.downloadRawData(mediaSource.rawSources[x], 'mediasource_' + x + '.mp4');
|
|
mediaSource.downloaded = true;
|
|
}
|
|
};
|
|
|
|
var proxy_addSourceBuffer = MediaSource.prototype.addSourceBuffer;
|
|
MediaSource.prototype.addSourceBuffer = function (mimeType) {
|
|
var mediaSourceThis = this;
|
|
|
|
evanEnv.mediaSources.push(this);
|
|
this.lastPos = 0;
|
|
if (evanEnv.enableAutoDownload) {
|
|
this.onsourceended = function () {
|
|
evanEnv.download();
|
|
};
|
|
this.onsourceclose = function () {
|
|
evanEnv.downloadMediaSource(this);
|
|
};
|
|
}
|
|
|
|
|
|
var retSourceBuffer = proxy_addSourceBuffer.apply(this, [].slice.call(arguments));
|
|
if (this.rawSources == undefined) {
|
|
this.rawSources = [];
|
|
}
|
|
var buffList = [];
|
|
this.rawSources.push(buffList);
|
|
retSourceBuffer.rawData = buffList;
|
|
if (evanEnv.enableAutoForward) {
|
|
retSourceBuffer.onupdate = function () {
|
|
if (this.buffered != this.buffered.length > 0) {
|
|
var endPos = this.buffered.end(0);
|
|
if (endPos > 5 && endPos - mediaSourceThis.lastPos > 25) {
|
|
evanEnv.videos[0].currentTime = endPos - 3;
|
|
mediaSourceThis.lastPos = evanEnv.videos[0].currentTime;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
return retSourceBuffer;
|
|
};
|
|
var proxy_appendBuffer = SourceBuffer.prototype.appendBuffer;
|
|
SourceBuffer.prototype.appendBuffer = function (buf) {
|
|
this.rawData.push(buf);
|
|
return proxy_appendBuffer.apply(this, [].slice.call(arguments));
|
|
};
|
|
})(); |