update
This commit is contained in:
parent
8472b29247
commit
49dae65bca
@ -37,7 +37,7 @@ ffmpeg -i audio.aac -i video.mp4 -c copy -bsf:a aac_adtstoasc out.mp4
|
||||
|
||||
## 大文件分段需要先文件合并
|
||||
```
|
||||
copy /b mediasource_0_0_*.mp4 out.mp4
|
||||
copy /b media_0_*.mp4 out.mp4
|
||||
```
|
||||
|
||||
## 特别说明
|
||||
|
128
downloadMedia.js
128
downloadMedia.js
@ -1,7 +1,7 @@
|
||||
// ==UserScript==
|
||||
// @name Universal encrypted video downloader
|
||||
// @namespace http://tampermonkey.net/
|
||||
// @version 0.1
|
||||
// @version 1.1
|
||||
// @description Bypass the encrypted video download protection via js hook
|
||||
// @author Evan
|
||||
// @match https://www.bilibili.com/video/*
|
||||
@ -15,70 +15,81 @@
|
||||
jsMedia = new Object();
|
||||
jsMedia.mediaSources = [];
|
||||
jsMedia.enableAutoDownload = true;
|
||||
//1G
|
||||
jsMedia.fragmentSize = 1024*1024*1024;
|
||||
|
||||
(function () {
|
||||
let mediaSourceSeq = 0;
|
||||
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" }))
|
||||
jsMedia.addZero = function(num){
|
||||
return ('00' + num).slice(-3);
|
||||
};
|
||||
jsMedia.downloadBlob = function (buff, fileName) {
|
||||
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);
|
||||
link.setAttribute('download', fileName);
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
};
|
||||
jsMedia.calcBlobLength = function (buffList) {
|
||||
let totalLength = 0;
|
||||
for (let i = 0; i < buffList.length; i++) {
|
||||
totalLength = totalLength + buffList[i].byteLength;
|
||||
}
|
||||
return totalLength;
|
||||
};
|
||||
jsMedia.MyMediaSourceBuffer = function () {
|
||||
this.id = 0;
|
||||
this.rawData1 = [];
|
||||
this.rawData2 = [];
|
||||
let currentSlot = 0;
|
||||
let downloadedIndex = 0;
|
||||
this.download = function () {
|
||||
let lastSlot = currentSlot;
|
||||
if (currentSlot === 0) {
|
||||
currentSlot = 1;
|
||||
} else {
|
||||
currentSlot = 0;
|
||||
}
|
||||
|
||||
if (lastSlot == 0) {
|
||||
jsMedia.downloadBlob(this.rawData1, 'media_' + this.id + '_' + jsMedia.addZero(downloadedIndex) + '.mp4');
|
||||
this.rawData1 = [];
|
||||
} else {
|
||||
jsMedia.downloadBlob(this.rawData2, 'media_' + this.id + '_' + jsMedia.addZero(downloadedIndex) + '.mp4');
|
||||
this.rawData2 = [];
|
||||
}
|
||||
downloadedIndex++;
|
||||
};
|
||||
this.appendBuffer = function (buf) {
|
||||
let totalLength = 0;
|
||||
if (currentSlot === 0) {
|
||||
this.rawData1.push(buf);
|
||||
totalLength = jsMedia.calcBlobLength(this.rawData1);
|
||||
} else {
|
||||
this.rawData2.push(buf);
|
||||
totalLength = jsMedia.calcBlobLength(this.rawData2);
|
||||
}
|
||||
if (totalLength >= jsMedia.fragmentSize) {
|
||||
this.download();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
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.download = function(){
|
||||
for (let i = 0, length = jsMedia.mediaSources.length; i < length; i++) {
|
||||
jsMedia.mediaSources[i].download();
|
||||
}
|
||||
};
|
||||
|
||||
jsMedia.setSpeed = function (speed) {
|
||||
for (let i = 0, length = jsMedia.videos.length; i < length; i++) {
|
||||
jsMedia.videos[i].playbackRate = 10;
|
||||
jsMedia.videos[i].playbackRate = speed;
|
||||
}
|
||||
};
|
||||
|
||||
@ -86,30 +97,31 @@ jsMedia.enableAutoDownload = true;
|
||||
MediaSource.prototype.addSourceBuffer = function (mimeType) {
|
||||
var mediaSourceThis = this;
|
||||
|
||||
jsMedia.mediaSources.push(this);
|
||||
this.lastPos = 0;
|
||||
var retSourceBuffer = proxy_addSourceBuffer.apply(this, [].slice.call(arguments));
|
||||
if (this.rawSources == undefined) {
|
||||
this.rawSources = [];
|
||||
}
|
||||
|
||||
retSourceBuffer.mySourceBuffer = new jsMedia.MyMediaSourceBuffer();
|
||||
retSourceBuffer.mySourceBuffer.id = mediaSourceSeq;
|
||||
jsMedia.mediaSources.push(retSourceBuffer.mySourceBuffer);
|
||||
|
||||
|
||||
if (jsMedia.enableAutoDownload) {
|
||||
this.onsourceended = function () {
|
||||
jsMedia.download();
|
||||
};
|
||||
this.onsourceclose = function () {
|
||||
jsMedia.downloadMediaSource(this);
|
||||
jsMedia.download();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
var retSourceBuffer = proxy_addSourceBuffer.apply(this, [].slice.call(arguments));
|
||||
if (this.rawSources == undefined) {
|
||||
this.rawSources = [];
|
||||
}
|
||||
var buffList = [];
|
||||
this.rawSources.push(buffList);
|
||||
retSourceBuffer.rawData = buffList;
|
||||
mediaSourceSeq++;
|
||||
return retSourceBuffer;
|
||||
};
|
||||
var proxy_appendBuffer = SourceBuffer.prototype.appendBuffer;
|
||||
SourceBuffer.prototype.appendBuffer = function (buf) {
|
||||
this.rawData.push(buf);
|
||||
this.mySourceBuffer.appendBuffer(buf);
|
||||
return proxy_appendBuffer.apply(this, [].slice.call(arguments));
|
||||
};
|
||||
})();
|
Loading…
Reference in New Issue
Block a user