aboutsummaryrefslogtreecommitdiff
path: root/static/@solitude/js/welcome.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/@solitude/js/welcome.js')
-rw-r--r--static/@solitude/js/welcome.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/static/@solitude/js/welcome.js b/static/@solitude/js/welcome.js
new file mode 100644
index 00000000..d8921075
--- /dev/null
+++ b/static/@solitude/js/welcome.js
@@ -0,0 +1,113 @@
+Object.defineProperty(Array.prototype, "shuffle", {
+ value: function () {
+ for (let i = this.length - 1; i > 0; i--) {
+ const j = Math.floor(Math.random() * (i + 1));
+ [this[i], this[j]] = [this[j], this[i]];
+ }
+ return this;
+ },
+});
+
+const tracks = Object.entries(playlistTracks)
+ .map((track) => track[1])
+ .shuffle();
+
+const controls = document.querySelector(".controls");
+const audio = document.querySelector("#audio");
+const trackTitle = document.querySelector("#track-title");
+const trackArtist = document.querySelector("#track-artist");
+const albumArt = document.querySelector("#album-art");
+const minElap = document.querySelector("#min-elap");
+const secElap = document.querySelector("#sec-elap");
+const minDur = document.querySelector("#min-dur");
+const secDur = document.querySelector("#sec-dur");
+
+let currentTrack = 0;
+
+const loadAudio = new Promise((resolve, reject) => {
+ audio.addEventListener("canplaythrough", () => {
+ resolve(audio);
+ });
+});
+
+async function playAudio() {
+ audio.src = tracks[currentTrack].location;
+ const duration = audio.duration;
+ audio.play().catch((e) => {
+ window.addEventListener(
+ "click",
+ () => {
+ controls.click();
+ audio.play();
+ },
+ { once: true }
+ );
+ });
+ return audio;
+}
+
+function pauseAudio() {
+ audio.pause();
+}
+
+function nextTrack() {
+ currentTrack = (currentTrack + 1) % tracks.length;
+ audio.currentTime = 0;
+ playTrack();
+}
+
+function playTrack() {
+ const track = tracks[currentTrack];
+ trackTitle.textContent = track.title;
+ trackArtist.textContent = track.artist;
+ albumArt.src = track.cover_art;
+ playAudio().then((audio) => {
+ audio.addEventListener("ended", nextTrack);
+ });
+}
+
+function updateIntervals() {
+ const duration = audio.duration;
+ const currentTime = audio.currentTime;
+ const elapsed = Math.floor(currentTime);
+ const total = Math.floor(duration);
+ const minutesElapsed = Math.floor(elapsed / 60);
+ const secondsElapsed = elapsed % 60;
+ const minutesTotal = Math.floor(total / 60) || 0;
+ const secondsTotal = total % 60 || 0;
+ minElap.textContent =
+ minutesElapsed < 10 ? `0${minutesElapsed}` : minutesElapsed;
+ secElap.textContent =
+ secondsElapsed < 10 ? `0${secondsElapsed}` : secondsElapsed;
+ minDur.textContent = minutesTotal < 10 ? `0${minutesTotal}` : minutesTotal;
+ secDur.textContent = secondsTotal < 10 ? `0${secondsTotal}` : secondsTotal;
+}
+
+function togglePlayPause() {
+ const buttons = Array.from(this.children);
+ let triggeredButton;
+ buttons.forEach((button) => {
+ if (!button.classList.contains("hidden")) {
+ triggeredButton = button;
+ }
+ button.classList.toggle("hidden");
+ });
+ signalTrigger(triggeredButton);
+}
+
+function signalTrigger(button) {
+ const role = button.getAttribute("role");
+ switch (role) {
+ case "play":
+ playAudio();
+ break;
+ case "pause":
+ pauseAudio();
+ break;
+ }
+}
+
+audio.currentTime = 0;
+controls.addEventListener("click", togglePlayPause);
+audio.addEventListener("timeupdate", updateIntervals);
+playTrack();