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