js-mediaDownloader/downloadMedia.js
2023-01-28 17:50:46 +08:00

115 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==
jsMedia = new Object();
jsMedia.mediaSources = [];
jsMedia.enableAutoDownload = true;
(function () {
jsMedia.videos = document.getElementsByTagName('video');
jsMedia.downloadRawData = function (bufferList, fileName = 'out', ext = '.mp4') {
var buffList = new Array();
var totalLength = 0;
for (var i = 0; i < bufferList.length; i++) {
totalLength += bufferList[i].byteLength;
if (totalLength > 1073741824 || i == bufferList.length - 1) {
buffList.push(new Uint8Array(totalLength));
totalLength = 0;
}
}
var lastLength = 0;
var part = 0;
for (var ix = 0; ix < bufferList.length; ix++) {
//10485760
//1073741824
buffList[part].set(new Uint8Array(bufferList[ix]), lastLength);
lastLength += bufferList[ix].byteLength;
if (lastLength > 1073741824) {
part++;
lastLength = 0
}
}
for (var iz = 0; iz < buffList.length; iz++) {
var buff = buffList[iz];
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 + "_" + iz + ext);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
};
jsMedia.download = function () {
for (var i = 0; i < jsMedia.mediaSources.length; i++) {
var currentItem = jsMedia.mediaSources[i];
if (currentItem.downloaded == undefined || currentItem.downloaded == false) {
for (var x = 0; x < currentItem.rawSources.length; x++) {
jsMedia.downloadRawData(currentItem.rawSources[x], 'mediasource_' + i + '_' + x);
}
}
currentItem.downloaded = true;
}
};
jsMedia.downloadMediaSource = function (mediaSource) {
for (var x = 0; x < mediaSource.rawSources.length; x++) {
jsMedia.downloadRawData(mediaSource.rawSources[x], 'mediasource_' + x);
mediaSource.downloaded = true;
}
};
jsMedia.setSpeed = function (speed) {
for (let i = 0, length = jsMedia.videos.length; i < length; i++) {
jsMedia.videos[i].playbackRate = 10;
}
};
var proxy_addSourceBuffer = MediaSource.prototype.addSourceBuffer;
MediaSource.prototype.addSourceBuffer = function (mimeType) {
var mediaSourceThis = this;
jsMedia.mediaSources.push(this);
this.lastPos = 0;
if (jsMedia.enableAutoDownload) {
this.onsourceended = function () {
jsMedia.download();
};
this.onsourceclose = function () {
jsMedia.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;
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));
};
})();