From 49dae65bca8129931e256b681a02bb7cf196a3e7 Mon Sep 17 00:00:00 2001 From: wenyifan Date: Sun, 28 May 2023 18:09:23 +0800 Subject: [PATCH] update --- README.md | 2 +- downloadMedia.js | 136 ++++++++++++++++++++++++++--------------------- 2 files changed, 75 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 5fbff44..9aaaaae 100644 --- a/README.md +++ b/README.md @@ -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 ``` ## 特别说明 diff --git a/downloadMedia.js b/downloadMedia.js index 967090a..7def055 100644 --- a/downloadMedia.js +++ b/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; + 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); + 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; } - } - 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 + 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(); } - } - 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.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)); }; })(); \ No newline at end of file