diff --git a/package.json b/package.json index 523c9ada3..249885418 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "mime-types": "^2.1.35", "moment": "2.29.4", "mongoose": "^6.10.2", + "ogv": "^1.8.9", "opencollective": "^1.0.3", "pdfmake": "^0.2.7", "prop-types": "^15.8.1", diff --git a/public/ogv/ogv-decoder-audio-opus-wasm.js b/public/ogv/ogv-decoder-audio-opus-wasm.js new file mode 100644 index 000000000..4d2b5649b --- /dev/null +++ b/public/ogv/ogv-decoder-audio-opus-wasm.js @@ -0,0 +1,523 @@ +var OGVDecoderAudioOpusW = (() => { + var _scriptDir = + typeof document !== 'undefined' && document.currentScript + ? document.currentScript.src + : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return function(OGVDecoderAudioOpusW) { + OGVDecoderAudioOpusW = OGVDecoderAudioOpusW || {}; + + var a; + a || + (a = + typeof OGVDecoderAudioOpusW !== 'undefined' + ? OGVDecoderAudioOpusW + : {}); + var l, m; + a.ready = new Promise(function(b, c) { + l = b; + m = c; + }); + var q = a, + t = Object.assign({}, a), + u = 'object' == typeof window, + w = 'function' == typeof importScripts, + x = '', + y, + A, + B, + fs, + C, + D; + if ( + 'object' == typeof process && + 'object' == typeof process.versions && + 'string' == typeof process.versions.node + ) + (x = w ? require('path').dirname(x) + '/' : __dirname + '/'), + (D = () => { + C || ((fs = require('fs')), (C = require('path'))); + }), + (y = function(b, c) { + D(); + b = C.normalize(b); + return fs.readFileSync(b, c ? void 0 : 'utf8'); + }), + (B = b => { + b = y(b, !0); + b.buffer || (b = new Uint8Array(b)); + return b; + }), + (A = (b, c, e) => { + D(); + b = C.normalize(b); + fs.readFile(b, function(d, f) { + d ? e(d) : c(f.buffer); + }); + }), + 1 < process.argv.length && process.argv[1].replace(/\\/g, '/'), + process.argv.slice(2), + process.on('unhandledRejection', function(b) { + throw b; + }), + (a.inspect = function() { + return '[Emscripten Module object]'; + }); + else if (u || w) + w + ? (x = self.location.href) + : 'undefined' != typeof document && + document.currentScript && + (x = document.currentScript.src), + _scriptDir && (x = _scriptDir), + 0 !== x.indexOf('blob:') + ? (x = x.substr(0, x.replace(/[?#].*/, '').lastIndexOf('/') + 1)) + : (x = ''), + (y = b => { + var c = new XMLHttpRequest(); + c.open('GET', b, !1); + c.send(null); + return c.responseText; + }), + w && + (B = b => { + var c = new XMLHttpRequest(); + c.open('GET', b, !1); + c.responseType = 'arraybuffer'; + c.send(null); + return new Uint8Array(c.response); + }), + (A = (b, c, e) => { + var d = new XMLHttpRequest(); + d.open('GET', b, !0); + d.responseType = 'arraybuffer'; + d.onload = () => { + 200 == d.status || (0 == d.status && d.response) + ? c(d.response) + : e(); + }; + d.onerror = e; + d.send(null); + }); + var aa = a.print || console.log.bind(console), + E = a.printErr || console.warn.bind(console); + Object.assign(a, t); + t = null; + var F; + a.wasmBinary && (F = a.wasmBinary); + var noExitRuntime = a.noExitRuntime || !0; + 'object' != typeof WebAssembly && G('no native wasm support detected'); + var H, + I = !1, + ba = 'undefined' != typeof TextDecoder ? new TextDecoder('utf8') : void 0, + ca, + J, + K; + function da() { + var b = H.buffer; + ca = b; + a.HEAP8 = new Int8Array(b); + a.HEAP16 = new Int16Array(b); + a.HEAP32 = K = new Int32Array(b); + a.HEAPU8 = J = new Uint8Array(b); + a.HEAPU16 = new Uint16Array(b); + a.HEAPU32 = new Uint32Array(b); + a.HEAPF32 = new Float32Array(b); + a.HEAPF64 = new Float64Array(b); + } + var ea, + fa = [], + ha = [], + ia = []; + function ja() { + var b = a.preRun.shift(); + fa.unshift(b); + } + var L = 0, + M = null, + N = null; + a.preloadedImages = {}; + a.preloadedAudios = {}; + function G(b) { + if (a.onAbort) a.onAbort(b); + b = 'Aborted(' + b + ')'; + E(b); + I = !0; + b = new WebAssembly.RuntimeError( + b + '. Build with -s ASSERTIONS=1 for more info.' + ); + m(b); + throw b; + } + function ka() { + return O.startsWith('data:application/octet-stream;base64,'); + } + var O; + O = 'ogv-decoder-audio-opus-wasm.wasm'; + if (!ka()) { + var la = O; + O = a.locateFile ? a.locateFile(la, x) : x + la; + } + function oa() { + var b = O; + try { + if (b == O && F) return new Uint8Array(F); + if (B) return B(b); + throw 'both async and sync fetching of the wasm failed'; + } catch (c) { + G(c); + } + } + function pa() { + if (!F && (u || w)) { + if ('function' == typeof fetch && !O.startsWith('file://')) + return fetch(O, { credentials: 'same-origin' }) + .then(function(b) { + if (!b.ok) throw "failed to load wasm binary file at '" + O + "'"; + return b.arrayBuffer(); + }) + .catch(function() { + return oa(); + }); + if (A) + return new Promise(function(b, c) { + A( + O, + function(e) { + b(new Uint8Array(e)); + }, + c + ); + }); + } + return Promise.resolve().then(function() { + return oa(); + }); + } + function S(b) { + for (; 0 < b.length; ) { + var c = b.shift(); + if ('function' == typeof c) c(a); + else { + var e = c.u; + 'number' == typeof e + ? void 0 === c.s + ? qa(e)() + : qa(e)(c.s) + : e(void 0 === c.s ? null : c.s); + } + } + } + var T = []; + function qa(b) { + var c = T[b]; + c || (b >= T.length && (T.length = b + 1), (T[b] = c = ea.get(b))); + return c; + } + var ra = [null, [], []], + sa = { + f: function() { + G(''); + }, + e: function(b, c, e) { + J.copyWithin(b, c, c + e); + }, + c: function(b) { + var c = J.length; + b >>>= 0; + if (2147483648 < b) return !1; + for (var e = 1; 4 >= e; e *= 2) { + var d = c * (1 + 0.2 / e); + d = Math.min(d, b + 100663296); + var f = Math; + d = Math.max(b, d); + f = f.min.call(f, 2147483648, d + ((65536 - (d % 65536)) % 65536)); + a: { + try { + H.grow((f - ca.byteLength + 65535) >>> 16); + da(); + var g = 1; + break a; + } catch (h) {} + g = void 0; + } + if (g) return !0; + } + return !1; + }, + d: function() { + return 0; + }, + b: function() {}, + a: function(b, c, e, d) { + for (var f = 0, g = 0; g < e; g++) { + var h = K[c >> 2], + ma = K[(c + 4) >> 2]; + c += 8; + for (var P = 0; P < ma; P++) { + var z = J[h + P], + Q = ra[b]; + if (0 === z || 10 === z) { + z = 1 === b ? aa : E; + var n = Q; + for (var p = 0, r = p + NaN, v = p; n[v] && !(v >= r); ) ++v; + if (16 < v - p && n.buffer && ba) + n = ba.decode(n.subarray(p, v)); + else { + for (r = ''; p < v; ) { + var k = n[p++]; + if (k & 128) { + var R = n[p++] & 63; + if (192 == (k & 224)) + r += String.fromCharCode(((k & 31) << 6) | R); + else { + var na = n[p++] & 63; + k = + 224 == (k & 240) + ? ((k & 15) << 12) | (R << 6) | na + : ((k & 7) << 18) | + (R << 12) | + (na << 6) | + (n[p++] & 63); + 65536 > k + ? (r += String.fromCharCode(k)) + : ((k -= 65536), + (r += String.fromCharCode( + 55296 | (k >> 10), + 56320 | (k & 1023) + ))); + } + } else r += String.fromCharCode(k); + } + n = r; + } + z(n); + Q.length = 0; + } else Q.push(z); + } + f += ma; + } + K[d >> 2] = f; + return 0; + }, + g: function(b, c, e) { + var d = H.buffer, + f = new Uint32Array(d, b, c), + g = []; + if (0 !== b) + for (b = 0; b < c; b++) { + var h = f[b]; + d.slice + ? ((h = d.slice(h, h + 4 * e)), (h = new Float32Array(h))) + : ((h = new Float32Array(d, h, e)), (h = new Float32Array(h))); + g.push(h); + } + a.audioBuffer = g; + }, + h: function(b, c) { + a.audioFormat = { channels: b, rate: c }; + a.loadedMetadata = !0; + } + }; + (function() { + function b(f) { + a.asm = f.exports; + H = a.asm.i; + da(); + ea = a.asm.q; + ha.unshift(a.asm.j); + L--; + a.monitorRunDependencies && a.monitorRunDependencies(L); + 0 == L && + (null !== M && (clearInterval(M), (M = null)), + N && ((f = N), (N = null), f())); + } + function c(f) { + b(f.instance); + } + function e(f) { + return pa() + .then(function(g) { + return WebAssembly.instantiate(g, d); + }) + .then(function(g) { + return g; + }) + .then(f, function(g) { + E('failed to asynchronously prepare wasm: ' + g); + G(g); + }); + } + var d = { a: sa }; + L++; + a.monitorRunDependencies && a.monitorRunDependencies(L); + if (a.instantiateWasm) + try { + return a.instantiateWasm(d, b); + } catch (f) { + return ( + E('Module.instantiateWasm callback failed with error: ' + f), !1 + ); + } + (function() { + return F || + 'function' != typeof WebAssembly.instantiateStreaming || + ka() || + O.startsWith('file://') || + 'function' != typeof fetch + ? e(c) + : fetch(O, { credentials: 'same-origin' }).then(function(f) { + return WebAssembly.instantiateStreaming(f, d).then(c, function( + g + ) { + E('wasm streaming compile failed: ' + g); + E('falling back to ArrayBuffer instantiation'); + return e(c); + }); + }); + })().catch(m); + return {}; + })(); + a.___wasm_call_ctors = function() { + return (a.___wasm_call_ctors = a.asm.j).apply(null, arguments); + }; + a._ogv_audio_decoder_init = function() { + return (a._ogv_audio_decoder_init = a.asm.k).apply(null, arguments); + }; + a._ogv_audio_decoder_process_header = function() { + return (a._ogv_audio_decoder_process_header = a.asm.l).apply( + null, + arguments + ); + }; + a._ogv_audio_decoder_process_audio = function() { + return (a._ogv_audio_decoder_process_audio = a.asm.m).apply( + null, + arguments + ); + }; + a._malloc = function() { + return (a._malloc = a.asm.n).apply(null, arguments); + }; + a._free = function() { + return (a._free = a.asm.o).apply(null, arguments); + }; + a._ogv_audio_decoder_destroy = function() { + return (a._ogv_audio_decoder_destroy = a.asm.p).apply(null, arguments); + }; + var U; + N = function ta() { + U || V(); + U || (N = ta); + }; + function V() { + function b() { + if (!U && ((U = !0), (a.calledRun = !0), !I)) { + S(ha); + l(a); + if (a.onRuntimeInitialized) a.onRuntimeInitialized(); + if (a.postRun) + for ( + 'function' == typeof a.postRun && (a.postRun = [a.postRun]); + a.postRun.length; + + ) { + var c = a.postRun.shift(); + ia.unshift(c); + } + S(ia); + } + } + if (!(0 < L)) { + if (a.preRun) + for ( + 'function' == typeof a.preRun && (a.preRun = [a.preRun]); + a.preRun.length; + + ) + ja(); + S(fa); + 0 < L || + (a.setStatus + ? (a.setStatus('Running...'), + setTimeout(function() { + setTimeout(function() { + a.setStatus(''); + }, 1); + b(); + }, 1)) + : b()); + } + } + a.run = V; + if (a.preInit) + for ( + 'function' == typeof a.preInit && (a.preInit = [a.preInit]); + 0 < a.preInit.length; + + ) + a.preInit.pop()(); + V(); + var W, X; + function ua(b) { + if (W && X >= b) return W; + W && a._free(W); + X = b; + return (W = a._malloc(X)); + } + var Y; + 'undefined' === typeof performance || 'undefined' === typeof performance.now + ? (Y = Date.now) + : (Y = performance.now.bind(performance)); + function Z(b) { + var c = Y(); + b = b(); + a.cpuTime += Y() - c; + return b; + } + a.loadedMetadata = !!q.audioFormat; + a.audioFormat = q.audioFormat || null; + a.audioBuffer = null; + a.cpuTime = 0; + Object.defineProperty(a, 'processing', { + get: function() { + return !1; + } + }); + a.init = function(b) { + Z(function() { + a._ogv_audio_decoder_init(); + }); + b(); + }; + a.processHeader = function(b, c) { + var e = Z(function() { + var d = b.byteLength, + f = ua(d); + new Uint8Array(H.buffer, f, d).set(new Uint8Array(b)); + return a._ogv_audio_decoder_process_header(f, d); + }); + c(e); + }; + a.processAudio = function(b, c) { + var e = Z(function() { + var d = b.byteLength, + f = ua(d); + new Uint8Array(H.buffer, f, d).set(new Uint8Array(b)); + return a._ogv_audio_decoder_process_audio(f, d); + }); + c(e); + }; + a.close = function() {}; + + return OGVDecoderAudioOpusW.ready; + }; +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = OGVDecoderAudioOpusW; +else if (typeof define === 'function' && define['amd']) + define([], function() { + return OGVDecoderAudioOpusW; + }); +else if (typeof exports === 'object') + exports['OGVDecoderAudioOpusW'] = OGVDecoderAudioOpusW; diff --git a/public/ogv/ogv-decoder-audio-opus-wasm.wasm b/public/ogv/ogv-decoder-audio-opus-wasm.wasm new file mode 100755 index 000000000..44819eef0 Binary files /dev/null and b/public/ogv/ogv-decoder-audio-opus-wasm.wasm differ diff --git a/public/ogv/ogv-demuxer-ogg-wasm.js b/public/ogv/ogv-demuxer-ogg-wasm.js new file mode 100644 index 000000000..ce67406bd --- /dev/null +++ b/public/ogv/ogv-demuxer-ogg-wasm.js @@ -0,0 +1,573 @@ +var OGVDemuxerOggW = (() => { + var _scriptDir = + typeof document !== 'undefined' && document.currentScript + ? document.currentScript.src + : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return function(OGVDemuxerOggW) { + OGVDemuxerOggW = OGVDemuxerOggW || {}; + + var a; + a || (a = typeof OGVDemuxerOggW !== 'undefined' ? OGVDemuxerOggW : {}); + var h, k; + a.ready = new Promise(function(b, c) { + h = b; + k = c; + }); + var l = Object.assign({}, a), + m = 'object' == typeof window, + n = 'function' == typeof importScripts, + p = '', + q, + r, + t, + fs, + u, + v; + if ( + 'object' == typeof process && + 'object' == typeof process.versions && + 'string' == typeof process.versions.node + ) + (p = n ? require('path').dirname(p) + '/' : __dirname + '/'), + (v = () => { + u || ((fs = require('fs')), (u = require('path'))); + }), + (q = function(b, c) { + v(); + b = u.normalize(b); + return fs.readFileSync(b, c ? void 0 : 'utf8'); + }), + (t = b => { + b = q(b, !0); + b.buffer || (b = new Uint8Array(b)); + return b; + }), + (r = (b, c, d) => { + v(); + b = u.normalize(b); + fs.readFile(b, function(e, f) { + e ? d(e) : c(f.buffer); + }); + }), + 1 < process.argv.length && process.argv[1].replace(/\\/g, '/'), + process.argv.slice(2), + process.on('unhandledRejection', function(b) { + throw b; + }), + (a.inspect = function() { + return '[Emscripten Module object]'; + }); + else if (m || n) + n + ? (p = self.location.href) + : 'undefined' != typeof document && + document.currentScript && + (p = document.currentScript.src), + _scriptDir && (p = _scriptDir), + 0 !== p.indexOf('blob:') + ? (p = p.substr(0, p.replace(/[?#].*/, '').lastIndexOf('/') + 1)) + : (p = ''), + (q = b => { + var c = new XMLHttpRequest(); + c.open('GET', b, !1); + c.send(null); + return c.responseText; + }), + n && + (t = b => { + var c = new XMLHttpRequest(); + c.open('GET', b, !1); + c.responseType = 'arraybuffer'; + c.send(null); + return new Uint8Array(c.response); + }), + (r = (b, c, d) => { + var e = new XMLHttpRequest(); + e.open('GET', b, !0); + e.responseType = 'arraybuffer'; + e.onload = () => { + 200 == e.status || (0 == e.status && e.response) + ? c(e.response) + : d(); + }; + e.onerror = d; + e.send(null); + }); + a.print || console.log.bind(console); + var w = a.printErr || console.warn.bind(console); + Object.assign(a, l); + l = null; + var x; + a.wasmBinary && (x = a.wasmBinary); + var noExitRuntime = a.noExitRuntime || !0; + 'object' != typeof WebAssembly && y('no native wasm support detected'); + var z, + A = !1; + 'undefined' != typeof TextDecoder && new TextDecoder('utf8'); + var B, C, D; + function E() { + var b = z.buffer; + B = b; + a.HEAP8 = new Int8Array(b); + a.HEAP16 = new Int16Array(b); + a.HEAP32 = D = new Int32Array(b); + a.HEAPU8 = C = new Uint8Array(b); + a.HEAPU16 = new Uint16Array(b); + a.HEAPU32 = new Uint32Array(b); + a.HEAPF32 = new Float32Array(b); + a.HEAPF64 = new Float64Array(b); + } + var F, + G = [], + H = [], + I = []; + function aa() { + var b = a.preRun.shift(); + G.unshift(b); + } + var J = 0, + K = null, + L = null; + a.preloadedImages = {}; + a.preloadedAudios = {}; + function y(b) { + if (a.onAbort) a.onAbort(b); + b = 'Aborted(' + b + ')'; + w(b); + A = !0; + b = new WebAssembly.RuntimeError( + b + '. Build with -s ASSERTIONS=1 for more info.' + ); + k(b); + throw b; + } + function M() { + return N.startsWith('data:application/octet-stream;base64,'); + } + var N; + N = 'ogv-demuxer-ogg-wasm.wasm'; + if (!M()) { + var O = N; + N = a.locateFile ? a.locateFile(O, p) : p + O; + } + function P() { + var b = N; + try { + if (b == N && x) return new Uint8Array(x); + if (t) return t(b); + throw 'both async and sync fetching of the wasm failed'; + } catch (c) { + y(c); + } + } + function ba() { + if (!x && (m || n)) { + if ('function' == typeof fetch && !N.startsWith('file://')) + return fetch(N, { credentials: 'same-origin' }) + .then(function(b) { + if (!b.ok) throw "failed to load wasm binary file at '" + N + "'"; + return b.arrayBuffer(); + }) + .catch(function() { + return P(); + }); + if (r) + return new Promise(function(b, c) { + r( + N, + function(d) { + b(new Uint8Array(d)); + }, + c + ); + }); + } + return Promise.resolve().then(function() { + return P(); + }); + } + function Q(b) { + for (; 0 < b.length; ) { + var c = b.shift(); + if ('function' == typeof c) c(a); + else { + var d = c.B; + 'number' == typeof d + ? void 0 === c.v + ? R(d)() + : R(d)(c.v) + : d(void 0 === c.v ? null : c.v); + } + } + } + var S = []; + function R(b) { + var c = S[b]; + c || (b >= S.length && (S.length = b + 1), (S[b] = c = F.get(b))); + return c; + } + var T = {}, + ca = { + f: function(b, c, d) { + C.copyWithin(b, c, c + d); + }, + d: function(b) { + var c = C.length; + b >>>= 0; + if (2147483648 < b) return !1; + for (var d = 1; 4 >= d; d *= 2) { + var e = c * (1 + 0.2 / d); + e = Math.min(e, b + 100663296); + var f = Math; + e = Math.max(b, e); + f = f.min.call(f, 2147483648, e + ((65536 - (e % 65536)) % 65536)); + a: { + try { + z.grow((f - B.byteLength + 65535) >>> 16); + E(); + var g = 1; + break a; + } catch (ea) {} + g = void 0; + } + if (g) return !0; + } + return !1; + }, + e: function(b, c, d, e) { + b = T.C(b); + c = T.A(b, c, d); + D[e >> 2] = c; + return 0; + }, + a: function(b, c, d, e) { + var f = z.buffer; + a.audioPackets.push({ + data: f.slice + ? f.slice(b, b + c) + : new Uint8Array(new Uint8Array(f, b, c)).buffer, + timestamp: d, + discardPadding: e + }); + }, + c: function(b, c) { + function d(e) { + for (var f = '', g = new Uint8Array(z.buffer); 0 != g[e]; e++) + f += String.fromCharCode(g[e]); + return f; + } + b && (a.videoCodec = d(b)); + c && (a.audioCodec = d(c)); + b = a._ogv_demuxer_media_duration(); + a.duration = 0 <= b ? b : NaN; + a.loadedMetadata = !0; + }, + b: function(b, c, d, e, f) { + var g = z.buffer; + a.videoPackets.push({ + data: g.slice + ? g.slice(b, b + c) + : new Uint8Array(new Uint8Array(g, b, c)).buffer, + timestamp: d, + keyframeTimestamp: e, + isKeyframe: !!f + }); + } + }; + (function() { + function b(f) { + a.asm = f.exports; + z = a.asm.g; + E(); + F = a.asm.s; + H.unshift(a.asm.h); + J--; + a.monitorRunDependencies && a.monitorRunDependencies(J); + 0 == J && + (null !== K && (clearInterval(K), (K = null)), + L && ((f = L), (L = null), f())); + } + function c(f) { + b(f.instance); + } + function d(f) { + return ba() + .then(function(g) { + return WebAssembly.instantiate(g, e); + }) + .then(function(g) { + return g; + }) + .then(f, function(g) { + w('failed to asynchronously prepare wasm: ' + g); + y(g); + }); + } + var e = { a: ca }; + J++; + a.monitorRunDependencies && a.monitorRunDependencies(J); + if (a.instantiateWasm) + try { + return a.instantiateWasm(e, b); + } catch (f) { + return ( + w('Module.instantiateWasm callback failed with error: ' + f), !1 + ); + } + (function() { + return x || + 'function' != typeof WebAssembly.instantiateStreaming || + M() || + N.startsWith('file://') || + 'function' != typeof fetch + ? d(c) + : fetch(N, { credentials: 'same-origin' }).then(function(f) { + return WebAssembly.instantiateStreaming(f, e).then(c, function( + g + ) { + w('wasm streaming compile failed: ' + g); + w('falling back to ArrayBuffer instantiation'); + return d(c); + }); + }); + })().catch(k); + return {}; + })(); + a.___wasm_call_ctors = function() { + return (a.___wasm_call_ctors = a.asm.h).apply(null, arguments); + }; + a._ogv_demuxer_init = function() { + return (a._ogv_demuxer_init = a.asm.i).apply(null, arguments); + }; + a._ogv_demuxer_receive_input = function() { + return (a._ogv_demuxer_receive_input = a.asm.j).apply(null, arguments); + }; + a._ogv_demuxer_process = function() { + return (a._ogv_demuxer_process = a.asm.k).apply(null, arguments); + }; + a._ogv_demuxer_destroy = function() { + return (a._ogv_demuxer_destroy = a.asm.l).apply(null, arguments); + }; + a._ogv_demuxer_media_length = function() { + return (a._ogv_demuxer_media_length = a.asm.m).apply(null, arguments); + }; + a._ogv_demuxer_media_duration = function() { + return (a._ogv_demuxer_media_duration = a.asm.n).apply(null, arguments); + }; + a._ogv_demuxer_seekable = function() { + return (a._ogv_demuxer_seekable = a.asm.o).apply(null, arguments); + }; + a._ogv_demuxer_keypoint_offset = function() { + return (a._ogv_demuxer_keypoint_offset = a.asm.p).apply(null, arguments); + }; + a._ogv_demuxer_seek_to_keypoint = function() { + return (a._ogv_demuxer_seek_to_keypoint = a.asm.q).apply(null, arguments); + }; + a._ogv_demuxer_flush = function() { + return (a._ogv_demuxer_flush = a.asm.r).apply(null, arguments); + }; + a._malloc = function() { + return (a._malloc = a.asm.t).apply(null, arguments); + }; + a._free = function() { + return (a._free = a.asm.u).apply(null, arguments); + }; + var U; + L = function da() { + U || V(); + U || (L = da); + }; + function V() { + function b() { + if (!U && ((U = !0), (a.calledRun = !0), !A)) { + Q(H); + h(a); + if (a.onRuntimeInitialized) a.onRuntimeInitialized(); + if (a.postRun) + for ( + 'function' == typeof a.postRun && (a.postRun = [a.postRun]); + a.postRun.length; + + ) { + var c = a.postRun.shift(); + I.unshift(c); + } + Q(I); + } + } + if (!(0 < J)) { + if (a.preRun) + for ( + 'function' == typeof a.preRun && (a.preRun = [a.preRun]); + a.preRun.length; + + ) + aa(); + Q(G); + 0 < J || + (a.setStatus + ? (a.setStatus('Running...'), + setTimeout(function() { + setTimeout(function() { + a.setStatus(''); + }, 1); + b(); + }, 1)) + : b()); + } + } + a.run = V; + if (a.preInit) + for ( + 'function' == typeof a.preInit && (a.preInit = [a.preInit]); + 0 < a.preInit.length; + + ) + a.preInit.pop()(); + V(); + var W, X, Y; + 'undefined' === typeof performance || 'undefined' === typeof performance.now + ? (Y = Date.now) + : (Y = performance.now.bind(performance)); + function Z(b) { + var c = Y(); + b = b(); + c = Y() - c; + a.cpuTime += c; + return b; + } + a.loadedMetadata = !1; + a.videoCodec = null; + a.audioCodec = null; + a.duration = NaN; + a.onseek = null; + a.cpuTime = 0; + a.audioPackets = []; + Object.defineProperty(a, 'hasAudio', { + get: function() { + return a.loadedMetadata && a.audioCodec; + } + }); + Object.defineProperty(a, 'audioReady', { + get: function() { + return 0 < a.audioPackets.length; + } + }); + Object.defineProperty(a, 'audioTimestamp', { + get: function() { + return 0 < a.audioPackets.length ? a.audioPackets[0].timestamp : -1; + } + }); + a.videoPackets = []; + Object.defineProperty(a, 'hasVideo', { + get: function() { + return a.loadedMetadata && a.videoCodec; + } + }); + Object.defineProperty(a, 'frameReady', { + get: function() { + return 0 < a.videoPackets.length; + } + }); + Object.defineProperty(a, 'frameTimestamp', { + get: function() { + return 0 < a.videoPackets.length ? a.videoPackets[0].timestamp : -1; + } + }); + Object.defineProperty(a, 'keyframeTimestamp', { + get: function() { + return 0 < a.videoPackets.length + ? a.videoPackets[0].keyframeTimestamp + : -1; + } + }); + Object.defineProperty(a, 'nextKeyframeTimestamp', { + get: function() { + for (var b = 0; b < a.videoPackets.length; b++) { + var c = a.videoPackets[b]; + if (c.isKeyframe) return c.timestamp; + } + return -1; + } + }); + Object.defineProperty(a, 'processing', { + get: function() { + return !1; + } + }); + Object.defineProperty(a, 'seekable', { + get: function() { + return !!a._ogv_demuxer_seekable(); + } + }); + a.init = function(b) { + Z(function() { + a._ogv_demuxer_init(); + }); + b(); + }; + a.receiveInput = function(b, c) { + Z(function() { + var d = b.byteLength; + (W && X >= d) || (W && a._free(W), (X = d), (W = a._malloc(X))); + var e = W; + new Uint8Array(z.buffer, e, d).set(new Uint8Array(b)); + a._ogv_demuxer_receive_input(e, d); + }); + c(); + }; + a.process = function(b) { + var c = Z(function() { + return a._ogv_demuxer_process(); + }); + b(!!c); + }; + a.dequeueVideoPacket = function(b) { + if (a.videoPackets.length) { + var c = a.videoPackets.shift().data; + b(c); + } else b(null); + }; + a.dequeueAudioPacket = function(b) { + if (a.audioPackets.length) { + var c = a.audioPackets.shift(); + b(c.data, c.discardPadding); + } else b(null); + }; + a.getKeypointOffset = function(b, c) { + var d = Z(function() { + return a._ogv_demuxer_keypoint_offset(1e3 * b); + }); + c(d); + }; + a.seekToKeypoint = function(b, c) { + var d = Z(function() { + return a._ogv_demuxer_seek_to_keypoint(1e3 * b); + }); + d && + (a.audioPackets.splice(0, a.audioPackets.length), + a.videoPackets.splice(0, a.videoPackets.length)); + c(!!d); + }; + a.flush = function(b) { + Z(function() { + a.audioPackets.splice(0, a.audioPackets.length); + a.videoPackets.splice(0, a.videoPackets.length); + a._ogv_demuxer_flush(); + }); + b(); + }; + a.close = function() {}; + + return OGVDemuxerOggW.ready; + }; +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = OGVDemuxerOggW; +else if (typeof define === 'function' && define['amd']) + define([], function() { + return OGVDemuxerOggW; + }); +else if (typeof exports === 'object') + exports['OGVDemuxerOggW'] = OGVDemuxerOggW; diff --git a/public/ogv/ogv-demuxer-ogg-wasm.wasm b/public/ogv/ogv-demuxer-ogg-wasm.wasm new file mode 100755 index 000000000..4dbea2637 Binary files /dev/null and b/public/ogv/ogv-demuxer-ogg-wasm.wasm differ diff --git a/public/ogv/ogv-worker-audio.js b/public/ogv/ogv-worker-audio.js new file mode 100644 index 000000000..22935d0b0 --- /dev/null +++ b/public/ogv/ogv-worker-audio.js @@ -0,0 +1,561 @@ +(() => { + var e = { + 506: e => { + (e.exports = function _assertThisInitialized(e) { + if (void 0 === e) + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); + return e; + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 575: e => { + (e.exports = function _classCallCheck(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 913: e => { + function _defineProperties(e, t) { + for (var r = 0; r < t.length; r++) { + var o = t[r]; + (o.enumerable = o.enumerable || !1), + (o.configurable = !0), + 'value' in o && (o.writable = !0), + Object.defineProperty(e, o.key, o); + } + } + (e.exports = function _createClass(e, t, r) { + return ( + t && _defineProperties(e.prototype, t), + r && _defineProperties(e, r), + Object.defineProperty(e, 'prototype', { writable: !1 }), + e + ); + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 754: e => { + function _getPrototypeOf(t) { + return ( + (e.exports = _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf + : function _getPrototypeOf(e) { + return e.__proto__ || Object.getPrototypeOf(e); + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports), + _getPrototypeOf(t) + ); + } + (e.exports = _getPrototypeOf), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 205: (e, t, r) => { + var o = r(489); + (e.exports = function _inherits(e, t) { + if ('function' != typeof t && null !== t) + throw new TypeError( + 'Super expression must either be null or a function' + ); + (e.prototype = Object.create(t && t.prototype, { + constructor: { value: e, writable: !0, configurable: !0 } + })), + Object.defineProperty(e, 'prototype', { writable: !1 }), + t && o(e, t); + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 318: e => { + (e.exports = function _interopRequireDefault(e) { + return e && e.__esModule ? e : { default: e }; + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 585: (e, t, r) => { + var o = r(8).default, + s = r(506); + (e.exports = function _possibleConstructorReturn(e, t) { + if (t && ('object' === o(t) || 'function' == typeof t)) return t; + if (void 0 !== t) + throw new TypeError( + 'Derived constructors may only return object or undefined' + ); + return s(e); + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 489: e => { + function _setPrototypeOf(t, r) { + return ( + (e.exports = _setPrototypeOf = + Object.setPrototypeOf || + function _setPrototypeOf(e, t) { + return (e.__proto__ = t), e; + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports), + _setPrototypeOf(t, r) + ); + } + (e.exports = _setPrototypeOf), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 8: e => { + function _typeof(t) { + return ( + (e.exports = _typeof = + 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator + ? function(e) { + return typeof e; + } + : function(e) { + return e && + 'function' == typeof Symbol && + e.constructor === Symbol && + e !== Symbol.prototype + ? 'symbol' + : typeof e; + }), + (e.exports.__esModule = !0), + (e.exports.default = e.exports), + _typeof(t) + ); + } + (e.exports = _typeof), + (e.exports.__esModule = !0), + (e.exports.default = e.exports); + }, + 445: (e, t, r) => { + 'use strict'; + var o = r(318); + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.default = void 0); + var s = o(r(575)), + n = o(r(913)), + a = o(r(539)), + i = '1.8.9-20220406232920-cb5f7ff', + u = { + OGVDemuxerOggW: 'ogv-demuxer-ogg-wasm.js', + OGVDemuxerWebMW: 'ogv-demuxer-webm-wasm.js', + OGVDecoderAudioOpusW: 'ogv-decoder-audio-opus-wasm.js', + OGVDecoderAudioVorbisW: 'ogv-decoder-audio-vorbis-wasm.js', + OGVDecoderVideoTheoraW: 'ogv-decoder-video-theora-wasm.js', + OGVDecoderVideoVP8W: 'ogv-decoder-video-vp8-wasm.js', + OGVDecoderVideoVP8MTW: 'ogv-decoder-video-vp8-mt-wasm.js', + OGVDecoderVideoVP9W: 'ogv-decoder-video-vp9-wasm.js', + OGVDecoderVideoVP9SIMDW: 'ogv-decoder-video-vp9-simd-wasm.js', + OGVDecoderVideoVP9MTW: 'ogv-decoder-video-vp9-mt-wasm.js', + OGVDecoderVideoVP9SIMDMTW: 'ogv-decoder-video-vp9-simd-mt-wasm.js', + OGVDecoderVideoAV1W: 'ogv-decoder-video-av1-wasm.js', + OGVDecoderVideoAV1SIMDW: 'ogv-decoder-video-av1-simd-wasm.js', + OGVDecoderVideoAV1MTW: 'ogv-decoder-video-av1-mt-wasm.js', + OGVDecoderVideoAV1SIMDMTW: 'ogv-decoder-video-av1-simd-mt-wasm.js' + }, + d = (function() { + function OGVLoaderBase() { + (0, s.default)(this, OGVLoaderBase), + (this.base = this.defaultBase()); + } + return ( + (0, n.default)(OGVLoaderBase, [ + { key: 'defaultBase', value: function defaultBase() {} }, + { + key: 'wasmSupported', + value: function wasmSupported() { + return a.default.wasmSupported(); + } + }, + { + key: 'scriptForClass', + value: function scriptForClass(e) { + return u[e]; + } + }, + { + key: 'urlForClass', + value: function urlForClass(e) { + var t = this.scriptForClass(e); + if (t) return this.urlForScript(t); + throw new Error('asked for URL for unknown class ' + e); + } + }, + { + key: 'urlForScript', + value: function urlForScript(e) { + if (e) { + var t = this.base; + return ( + void 0 === t ? (t = '') : (t += '/'), + t + e + '?version=' + encodeURIComponent(i) + ); + } + throw new Error('asked for URL for unknown script ' + e); + } + }, + { + key: 'loadClass', + value: function loadClass(e, t, r) { + var o = this; + r = r || {}; + var s = this.getGlobal(), + n = this.urlForClass(e), + a = function classWrapper(t) { + return ( + ((t = t || {}).locateFile = function(e) { + return 'data:' === e.slice(0, 5) + ? e + : o.urlForScript(e); + }), + (t.mainScriptUrlOrBlob = + o.scriptForClass(e) + + '?version=' + + encodeURIComponent(i)), + s[e](t) + ); + }; + 'function' == typeof s[e] + ? t(a) + : this.loadScript(n, function() { + t(a); + }); + } + } + ]), + OGVLoaderBase + ); + })(); + t.default = d; + }, + 713: (e, t, r) => { + 'use strict'; + var o = r(318); + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.default = void 0); + var s = o(r(575)), + n = o(r(913)), + a = o(r(205)), + i = o(r(585)), + u = o(r(754)); + function _createSuper(e) { + var t = (function _isNativeReflectConstruct() { + if ('undefined' == typeof Reflect || !Reflect.construct) return !1; + if (Reflect.construct.sham) return !1; + if ('function' == typeof Proxy) return !0; + try { + return ( + Boolean.prototype.valueOf.call( + Reflect.construct(Boolean, [], function() {}) + ), + !0 + ); + } catch (e) { + return !1; + } + })(); + return function _createSuperInternal() { + var r, + o = (0, u.default)(e); + if (t) { + var s = (0, u.default)(this).constructor; + r = Reflect.construct(o, arguments, s); + } else r = o.apply(this, arguments); + return (0, i.default)(this, r); + }; + } + var d = new ((function(e) { + (0, a.default)(OGVLoaderWorker, e); + var t = _createSuper(OGVLoaderWorker); + function OGVLoaderWorker() { + return ( + (0, s.default)(this, OGVLoaderWorker), t.apply(this, arguments) + ); + } + return ( + (0, n.default)(OGVLoaderWorker, [ + { + key: 'loadScript', + value: function loadScript(e, t) { + importScripts(e), t(); + } + }, + { + key: 'getGlobal', + value: function getGlobal() { + return self; + } + } + ]), + OGVLoaderWorker + ); + })(o(r(445)).default))(); + t.default = d; + }, + 607: (e, t, r) => { + 'use strict'; + var o = r(318); + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.default = void 0); + var s = new (o(r(172))).default( + ['loadedMetadata', 'audioFormat', 'audioBuffer', 'cpuTime'], + { + init: function init(e, t) { + this.target.init(t); + }, + processHeader: function processHeader(e, t) { + this.target.processHeader(e[0], function(e) { + t([e]); + }); + }, + processAudio: function processAudio(e, t) { + this.target.processAudio(e[0], function(e) { + t([e]); + }); + } + } + ); + t.default = s; + }, + 172: (e, t, r) => { + 'use strict'; + var o = r(318); + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.default = void 0); + var s = o(r(8)), + n = o(r(575)), + a = o(r(913)), + i = o(r(713)); + r.g.OGVLoader = i.default; + var u = (function() { + function OGVWorkerSupport(e, t) { + var r = this; + (0, n.default)(this, OGVWorkerSupport), + (this.propList = e), + (this.handlers = t), + (this.transferables = (function() { + var e = new ArrayBuffer(1024), + t = new Uint8Array(e); + try { + return ( + postMessage({ action: 'transferTest', bytes: t }, [e]), + !e.byteLength + ); + } catch (e) { + return !1; + } + })()), + (this.target = null), + (this.sentProps = {}), + (this.pendingEvents = []), + (this.handlers.construct = function(e, t) { + var o = e[0], + s = e[1]; + i.default.loadClass(o, function(e) { + e(s).then(function(e) { + for (r.target = e, t(); r.pendingEvents.length; ) + r.handleEvent(r.pendingEvents.shift()); + }); + }); + }), + addEventListener('message', function(e) { + r.workerOnMessage(e); + }); + } + return ( + (0, a.default)(OGVWorkerSupport, [ + { + key: 'handleEvent', + value: function handleEvent(e) { + var t = this; + this.handlers[e.action].call(this, e.args, function(r) { + r = r || []; + var o = {}, + s = []; + t.propList.forEach(function(e) { + var r = t.target[e]; + if (t.sentProps[e] !== r) + if ( + ((t.sentProps[e] = r), + 'duration' == e && isNaN(r) && isNaN(t.sentProps[e])) + ); + else if ('audioBuffer' == e) { + if (((o[e] = r), r)) + for (var n = 0; n < r.length; n++) + s.push(r[n].buffer); + } else + 'frameBuffer' == e + ? ((o[e] = r), + r && + (s.push(r.y.bytes.buffer), + s.push(r.u.bytes.buffer), + s.push(r.v.bytes.buffer))) + : (o[e] = r); + }); + var n = { + action: 'callback', + callbackId: e.callbackId, + args: r, + props: o + }; + t.transferables ? postMessage(n, s) : postMessage(n); + }); + } + }, + { + key: 'workerOnMessage', + value: function workerOnMessage(e) { + var t = e.data; + t && + 'object' === (0, s.default)(t) && + ('transferTest' == t.action || + ('string' != typeof t.action || + 'string' != typeof t.callbackId || + 'object' !== (0, s.default)(t.args) + ? console.log('invalid message data', t) + : t.action in this.handlers + ? 'construct' == t.action || this.target + ? this.handleEvent(t) + : this.pendingEvents.push(t) + : console.log('invalid message action', t.action))); + } + } + ]), + OGVWorkerSupport + ); + })(); + t.default = u; + }, + 539: (e, t, r) => { + 'use strict'; + var o = r(318); + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.default = void 0); + var s = o(r(8)), + n = o(r(575)), + a = o(r(913)); + var i = new ((function() { + function WebAssemblyChecker() { + (0, n.default)(this, WebAssemblyChecker), + (this.tested = !1), + (this.testResult = void 0); + } + return ( + (0, a.default)(WebAssemblyChecker, [ + { + key: 'wasmSupported', + value: function wasmSupported() { + if (!this.tested) { + try { + 'object' === + ('undefined' == typeof WebAssembly + ? 'undefined' + : (0, s.default)(WebAssembly)) + ? (this.testResult = (function testSafariWebAssemblyBug() { + var e = new Uint8Array([ + 0, + 97, + 115, + 109, + 1, + 0, + 0, + 0, + 1, + 6, + 1, + 96, + 1, + 127, + 1, + 127, + 3, + 2, + 1, + 0, + 5, + 3, + 1, + 0, + 1, + 7, + 8, + 1, + 4, + 116, + 101, + 115, + 116, + 0, + 0, + 10, + 16, + 1, + 14, + 0, + 32, + 0, + 65, + 1, + 54, + 2, + 0, + 32, + 0, + 40, + 2, + 0, + 11 + ]), + t = new WebAssembly.Module(e); + return ( + 0 !== + new WebAssembly.Instance(t, {}).exports.test(4) + ); + })()) + : (this.testResult = !1); + } catch (e) { + console.log('Exception while testing WebAssembly', e), + (this.testResult = !1); + } + this.tested = !0; + } + return this.testResult; + } + } + ]), + WebAssemblyChecker + ); + })())(); + t.default = i; + } + }, + t = {}; + function __webpack_require__(r) { + var o = t[r]; + if (void 0 !== o) return o.exports; + var s = (t[r] = { exports: {} }); + return e[r](s, s.exports, __webpack_require__), s.exports; + } + (__webpack_require__.g = (function() { + if ('object' == typeof globalThis) return globalThis; + try { + return this || new Function('return this')(); + } catch (e) { + if ('object' == typeof window) return window; + } + })()), + (() => { + 'use strict'; + __webpack_require__(318)(__webpack_require__(607)); + })(); +})(); diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index 2d05d1ea8..79a31fe5e 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -67,8 +67,15 @@ import { NOTIFICATION_DELAY } from '../Notifications/Notifications.constants'; import { EMPTY_VOICES } from '../../providers/SpeechProvider/SpeechProvider.constants'; import { DEFAULT_ROWS_NUMBER, DEFAULT_COLUMNS_NUMBER } from './Board.constants'; import PremiumFeature from '../PremiumFeature'; +import { + IS_BROWSING_FROM_APPLE_TOUCH, + IS_BROWSING_FROM_SAFARI +} from '../../constants'; //import { isAndroid } from '../../cordova-util'; +const ogv = require('ogv'); +ogv.OGVLoader.base = process.env.PUBLIC_URL + '/ogv'; + const Transition = React.forwardRef(function Transition(props, ref) { return ; }); @@ -456,10 +463,13 @@ export class BoardContainer extends Component { return url; } - playAudio(src) { - let audio = new Audio(); + async playAudio(src) { + const safariNeedHelp = + (IS_BROWSING_FROM_SAFARI || IS_BROWSING_FROM_APPLE_TOUCH) && + src.endsWith('.ogg'); + const audio = safariNeedHelp ? new ogv.OGVPlayer() : new Audio(); audio.src = src; - audio.play(); + await audio.play(); } handleEditBoardTitle = name => {