diff --git a/public/src/js/assets.js b/public/src/js/assets.js index 5fef59b..7220a17 100644 --- a/public/src/js/assets.js +++ b/public/src/js/assets.js @@ -36,10 +36,10 @@ var assets = { "account.js", "lyrics.js", "customsongs.js", + "rangefetcher.js", "abstractfile.js", "idb.js", "plugins.js", - "rangefetcher.js", "search.js" ], "css": [ diff --git a/public/src/js/loader.js b/public/src/js/loader.js index 7f128fd..3c64445 100644 --- a/public/src/js/loader.js +++ b/public/src/js/loader.js @@ -576,7 +576,8 @@ class Loader{ } loadScript(url){ var script = document.createElement("script") - var url = url + this.queryString + var isBlob = typeof url === "string" && (url.startsWith("blob:") || url.startsWith("data:")) + var url = isBlob ? url : (url + this.queryString) var promise = pageEvents.load(script) script.src = url document.head.appendChild(script) diff --git a/public/src/js/rangefetcher.js b/public/src/js/rangefetcher.js index 12c06f4..2ac799b 100644 --- a/public/src/js/rangefetcher.js +++ b/public/src/js/rangefetcher.js @@ -47,11 +47,26 @@ var RangeFetcher = { r.send() }) }, + _probeRange: function(url){ + return new Promise(function(resolve){ + var r = new XMLHttpRequest() + r.open("GET", url) + r.responseType = "arraybuffer" + r.setRequestHeader("Range", "bytes=0-0") + r.onload = function(){ + var ok = r.status === 206 && !!r.getResponseHeader("Content-Range") + resolve(ok) + } + r.onerror = function(){ resolve(false) } + r.send() + }) + }, _runConcurrent: function(tasks, limit){ return new Promise(function(resolve, reject){ var i = 0 var running = 0 var results = [] + var done = 0 function next(){ while(running < limit && i < tasks.length){ var idx = i++ @@ -59,7 +74,8 @@ var RangeFetcher = { tasks[idx]().then(function(res){ results[idx] = res running-- - if(results.length === tasks.length && results.every(function(v){return v !== undefined})){ resolve(results) } + done++ + if(done === tasks.length){ resolve(results) } else{ next() } }, function(e){ reject(e) }) } @@ -73,9 +89,17 @@ var RangeFetcher = { var minChunk = opts.chunkSize || 1048576 var self = this return this._head(url).then(function(info){ - if(!info.length || !info.acceptRanges || info.length < minChunk){ + if(!info.length || info.length < minChunk){ return self._getAll(url, "arraybuffer") } + if(!info.acceptRanges){ + return self._probeRange(url).then(function(supported){ + if(!supported){ + return self._getAll(url, "arraybuffer") + } + return supported + }) + } var total = info.length var parts = Math.ceil(total / minChunk) parts = Math.max(1, Math.min(parts, 16)) @@ -103,4 +127,4 @@ var RangeFetcher = { fetchText: function(url, opts){ return this.fetchBlob(url, opts).then(function(blob){ return blob.text() }) } -} \ No newline at end of file +}