// ==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)); }; })();