summaryrefslogtreecommitdiff
path: root/js/player.js
blob: b623eee9c39b129d7df83b3089f94f8b9de014c5 (plain)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
_argonLoadedHooks.push(function ArgonStartupPlayer() {
    ArgonPlayer = {
        _player: document.getElementById("argon-player"),
        _current: null,
        _seekbar: true,
        _shuffle: false,
        _repeat: false,
        _endTriggered: false,
        _preferredQualityRaw: "0",
        _preferredQualityPreference: ["0"],
        _currentQuality: null,
        _qualityChangeTime: 0,
        _qualityGoingDown: false,

        _end: () => {
            if (ArgonPlayer._endTriggered) return;

            if (!ArgonPlayer._player.paused) {
                ArgonPlayer._endTriggered = true;

                if (ArgonPlayer._repeat) {
                    ArgonPlayer._player.currentTime = 0;
                    ArgonPlayer._player.play().catch(e => {
                        console.error(e);
                        if (e.name !== "NotAllowedError") alert("An error occurred while trying to play this song. Please try again later.");
                    }).then(() => {
                        ArgonPlayer._endTriggered = false;
                    });
                } else {
                    ArgonPlayer.next();
                }
            }
        },

        _qualityDown: () => {
            if (ArgonPlayer._qualityGoingDown) return;
            ArgonPlayer._qualityGoingDown = true;

            if (ArgonPlayer._currentQuality === "high") {
                ArgonPlayer._setQualityTo("medium");
            } else if (ArgonPlayer._currentQuality === "medium") {
                ArgonPlayer._setQualityTo("low");
            } else if (ArgonPlayer._currentQuality === "low") {
                ArgonPlayer._setQualityTo("verylow");
            } else if (ArgonPlayer._currentQuality === "verylow") {
                ArgonPlayer._setQualityTo("ultralow");
            } else if (ArgonPlayer._currentQuality === "ultralow") {
                ArgonPlayer._setQualityTo("superlow");
            } else {
                log("Quality is already as low as possible");
            }
        },

        _setQualityTo: (quality) => {
            log("Resolving track " + ArgonPlayer._current + "...");
            ArgonPlayer._qualityChangeTime = ArgonPlayer._player.currentTime;
            ArgonPlayer._currentQuality = quality;
            // noinspection JSUnresolvedVariable,JSUnresolvedFunction
            ELAC.quickBlob("https://" + (AppName === "Argon" ? "mediacdn.argon.minteck.org" : "music-audio-media01.familine.minteck.org") + "/" + song + "/" + ArgonPlayer._currentQuality + ".elac", 0).then((blob) => {
                ArgonPlayer._player.src = blob;
                log("Playing " + ArgonPlayer._current);
                ArgonPlayer._player.play().catch(e => {
                    console.error(e);
                    if (e.name !== "NotAllowedError") alert("An error occurred while trying to play this song. Please try again later.");
                }).then(() => {
                    ArgonPlayer._player.currentTime = ArgonPlayer._qualityChangeTime;
                    ArgonPlayer._endTriggered = false;
                    ArgonPlayer._qualityGoingDown = false;
                });
            });
        },

        play: (song) => {
            document.body.classList.add("playing");
            ArgonPlayer._current = song;
            document.getElementById("player-artwork").src = "";

            document.getElementById("player-artwork").src = "/api/get_image.php?_=" + ArgonPlayer._current;
            document.getElementById("player-info-text-title").innerHTML = "<a id='frame-viewer-header-text-linkToOriginal' onclick='document.getElementById(&quot;frame-inner&quot;).contentDocument.location.href=&quot;/_frame/library/" + ArgonPlayer._current + "&quot;'>" + _argonSongsData.songs[ArgonPlayer._current].name.replaceAll(">", "&gt;") + "</a>";
            if (_argonSongsData.songs[ArgonPlayer._current].set !== null && _argonSongsData.songs[ArgonPlayer._current].set !== undefined) {
                document.getElementById("player-info-text-set").innerHTML = _argonSongsData.songs[ArgonPlayer._current].author.replaceAll("<", "&lt;").replaceAll(">", "&gt;") + " · <a id='frame-viewer-header-text-linkToSet' onclick='document.getElementById(&quot;frame-inner&quot;).contentDocument.location.href=&quot;/_frame/library/" + _argonSongsData.songs[ArgonPlayer._current].set._id + "&quot;'>" + _argonSongsData.songs[ArgonPlayer._current].set.name.replaceAll("<", "&lt;").replaceAll(">", "&gt;") + "</a> · " + _argonSongsData.songs[ArgonPlayer._current].release.substring(0, 4).replaceAll("<", "&lt;").replaceAll(">", "&gt;");
            } else {
                document.getElementById("player-info-text-set").innerText = _argonSongsData.songs[ArgonPlayer._current].author + " · " + _argonSongsData.songs[ArgonPlayer._current].release.substring(0, 4);
            }

            log("Resolving track " + song + "...");
            if (ArgonPlayer._preferredQualityPreference[0] === "2") {
                ArgonPlayer._currentQuality = "original";
            } else if (ArgonPlayer._preferredQualityPreference[0] === "0") {
                ArgonPlayer._currentQuality = "high";
            } else {
                ArgonPlayer._currentQuality = ArgonPlayer._preferredQualityPreference[1];
            }
            // noinspection JSUnresolvedVariable,JSUnresolvedFunction
            ELAC.quickBlob("https://" + (AppName === "Argon" ? "mediacdn.argon.minteck.org" : "music-audio-media01.familine.minteck.org") + "/" + song + "/" + ArgonPlayer._currentQuality + ".elac", 0).then((blob) => {
                ArgonPlayer._player.src = blob;
                log("Playing " + song);
                ArgonPlayer._player.play().catch(e => {
                    if (e.name !== "DOMException") {
                        console.error(e);
                        if (e.name !== "NotAllowedError") alert("An error occurred while trying to play this song. Please try again later.");
                    }
                }).then(() => {
                    ArgonPlayer._endTriggered = false;
                });
            })
        },

        shuffle: () => {
            ArgonPlayer._shuffle = !ArgonPlayer._shuffle;

            if (ArgonPlayer._shuffle) {
                document.getElementById("player-button-shuffle-icon").src = "/icons/shuffle-on.svg";
            } else {
                document.getElementById("player-button-shuffle-icon").src = "/icons/shuffle-off.svg";
            }
        },

        repeat: () => {
            ArgonPlayer._repeat = !ArgonPlayer._repeat;

            if (ArgonPlayer._repeat) {
                document.getElementById("player-button-repeat-icon").src = "/icons/repeat-on.svg";
            } else {
                document.getElementById("player-button-repeat-icon").src = "/icons/repeat-off.svg";
            }
        },

        _controls: () => {
            ArgonPlayer._preferredQualityRaw = localStorage.getItem("quality") ?? "0";
            ArgonPlayer._preferredQualityPreference = (localStorage.getItem("quality") ?? localStorage.getItem("quality") ?? "0").split(":");

            if (ArgonPlayer._current !== null) {
                document.getElementById("player-inner").style.display = "";

                if (!ArgonPlayer._player.paused) {
                    if (_argonSongsData.songs[ArgonPlayer._current].original !== null) {
                        document.title = _argonSongsData.songs[ArgonPlayer._current].author + " - " + _argonSongsData.songs[ArgonPlayer._current].name + " (" + _argonSongsData.songs[ArgonPlayer._current].original + " cover)";
                    } else {
                        document.title = _argonSongsData.songs[ArgonPlayer._current].author + " - " + _argonSongsData.songs[ArgonPlayer._current].name
                    }
                } else {
                    document.title = AppName;
                }

                if (ArgonPlayer._player.currentTime >= ArgonPlayer._player.duration) {
                    ArgonPlayer._end();
                }

                if (ArgonPlayer._player.readyState === 0) {
                    document.getElementById("player-button-load").style.display = "";
                    document.getElementById("player-button-pause").style.display = "none";
                    document.getElementById("player-button-play").style.display = "none";
                    document.getElementById("player-seekbar").disabled = true;

                    document.getElementById("player-seekbar-elapsed").innerText = "-:--";
                    document.getElementById("player-seekbar-total").innerText = "-:--";
                } else {
                    document.getElementById("player-seekbar").disabled = false;

                    if (ArgonPlayer._repeat) {
                        ArgonPlayer._player.loop = true;
                    }

                    if (ArgonPlayer._player.paused) {
                        document.getElementById("player-button-play").style.display = "";
                        document.getElementById("player-button-pause").style.display = "none";
                        document.getElementById("player-button-load").style.display = "none";
                    } else {
                        document.getElementById("player-button-pause").style.display = "";
                        document.getElementById("player-button-play").style.display = "none";
                        document.getElementById("player-button-load").style.display = "none";
                    }

                    if (!ArgonPlayer._shuffle) {
                        if (_argonSongsData.sorted[_argonSongsData.sorted.indexOf(ArgonPlayer._current) + 1]) {
                            document.getElementById("player-button-next").classList.remove("player-button-disabled");
                        } else {
                            document.getElementById("player-button-next").classList.add("player-button-disabled");
                        }

                        if (_argonSongsData.sorted[_argonSongsData.sorted.indexOf(ArgonPlayer._current) - 1]) {
                            document.getElementById("player-button-previous").classList.remove("player-button-disabled");
                        } else {
                            document.getElementById("player-button-previous").classList.add("player-button-disabled");
                        }
                    } else {
                        document.getElementById("player-button-previous").classList.remove("player-button-disabled");
                        document.getElementById("player-button-next").classList.remove("player-button-disabled");
                    }

                    let current;
                    let total;
                    if (ArgonPlayer._player.duration >= 600) {
                        current = new Date(ArgonPlayer._player.currentTime * 1000).toISOString().substr(14, 5);
                        total = new Date(ArgonPlayer._player.duration * 1000).toISOString().substr(14, 5);
                    } else {
                        current = new Date(ArgonPlayer._player.currentTime * 1000).toISOString().substr(15, 4);
                        total = new Date(ArgonPlayer._player.duration * 1000).toISOString().substr(15, 4);
                    }

                    document.getElementById("player-seekbar-elapsed").innerText = current;
                    document.getElementById("player-seekbar-total").innerText = total;
                }

                if (ArgonPlayer._seekbar) {
                    document.getElementById("player-seekbar").max = ArgonPlayer._player.duration * 1000;
                    document.getElementById("player-seekbar").value = ArgonPlayer._player.currentTime * 1000;
                }
            } else {
                document.title = AppName;
                document.getElementById("player-inner").style.display = "none";
            }
        },

        next: () => {
            if (!ArgonPlayer._shuffle) {
                if (_argonSongsData.sorted[_argonSongsData.sorted.indexOf(ArgonPlayer._current) + 1]) {
                    ArgonPlayer.play(_argonSongsData.sorted[_argonSongsData.sorted.indexOf(ArgonPlayer._current) + 1]);
                }
            } else {
                items = _argonSongsData.sorted.filter(i => i !== ArgonPlayer._current)
                ArgonPlayer.play(items[Math.floor(Math.random() * items.length)]);
            }
        },

        previous: () => {
            if (!ArgonPlayer._shuffle) {
                if (_argonSongsData.sorted[_argonSongsData.sorted.indexOf(ArgonPlayer._current) - 1]) {
                    ArgonPlayer.play(_argonSongsData.sorted[_argonSongsData.sorted.indexOf(ArgonPlayer._current) - 1]);
                }
            } else {
                items = _argonSongsData.sorted.filter(i => i !== ArgonPlayer._current)
                ArgonPlayer.play(items[Math.floor(Math.random() * items.length)]);
            }
        }
    }

    setInterval(ArgonPlayer._controls);
    setInterval(() => {
        if (ArgonPlayer._current !== null) {
            if (ArgonPlayer._player.readyState <= 2) {
                if (ArgonPlayer._preferredQualityPreference[0] === "0") {
                    log("Quality is too high for network, reducing quality...");
                    ArgonPlayer._qualityDown()
                } else {
                    log("Quality is too high for network, settings does not allow reducing quality.");
                }
            }
        }
    }, 10000)
})