1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
class ELACData extends Object {
constructor(obj) {
super();
for (let key of Object.keys(obj)) {
this[key] = obj[key];
}
}
}
class ELACAudioStream extends Object {
constructor(obj) {
super();
for (let key of Object.keys(obj)) {
this[key] = obj[key];
}
}
}
class ELACError extends Error {
constructor(props) {
super(props);
this.name = "ELACError";
}
}
window.ELAC = {
_base64ToArrayBuffer: (base64) => {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
},
isELACData: async (data) => {
return data instanceof ELACData && data["_eqmc"];
},
isELACAudioStream: async (data) => {
return data instanceof ELACAudioStream && data["data"];
},
create: async (file) => {
try {
return new ELACData(JSON.parse(new TextDecoder("utf-8").decode(pako.inflate(new Uint8Array((await (await (await window.fetch(file)).blob()).arrayBuffer()))))));
} catch (e) {
console.error(e);
throw new ELACError("Failed to construct ELACData object");
}
},
decodeFile: async (data, file) => {
if (!await ELAC.isELACData(data)) throw new ELACError("Invalid input, expected ELACData");
if (data.files.length - 1 >= file) {
let s = data.files[file];
s["data"] = new Blob([pako.inflate(ELAC._base64ToArrayBuffer(s.data))]);
return new ELACAudioStream(s);
} else {
throw new ELACError("File index is out of range");
}
},
toAudio: async (data) => {
if (!await ELAC.isELACAudioStream(data)) throw new ELACError("Invalid input, expected ELACAudioStream");
return new Audio(window.URL.createObjectURL(data.data));
},
quickAudio: async (url, id) => {
let elac = await ELAC.create(url);
let file = await ELAC.decodeFile(elac, id);
return await elac.toAudio(file);
},
quickBlob: async (url, id) => {
let elac = await ELAC.create(url);
let file = await ELAC.decodeFile(elac, id);
return window.URL.createObjectURL(file.data);
}
}
|