]> littlesong.place Git - littlesongplace.git/commitdiff
Static song queue for all songs on page
authorChris Fulljames <christianfulljames@gmail.com>
Sat, 11 Jan 2025 19:20:48 +0000 (14:20 -0500)
committerChris Fulljames <christianfulljames@gmail.com>
Sat, 11 Jan 2025 19:20:48 +0000 (14:20 -0500)
main.py
static/player.js
templates/song-list.html
todo.txt

diff --git a/main.py b/main.py
index 6643997cb5d1c087ae34889f0a4ffa94337bb5ad..e5135f079e775a7815f4a914299a29b05c58c8c8 100644 (file)
--- a/main.py
+++ b/main.py
@@ -1,3 +1,4 @@
+import json
 import os
 import shutil
 import sqlite3
@@ -451,6 +452,9 @@ class Song:
     tags: list[str]
     collaborators: list[str]
 
+    def json(self):
+        return json.dumps(vars(self))
+
     @classmethod
     def by_id(cls, songid):
         songs = cls._from_db("select * from songs where songid = ?", [songid])
index 50e8e2711da857ef6be9413e4ab9b11bbb8561ed..2e0066205be73905660d428702c9569e8468510e 100644 (file)
@@ -1,8 +1,20 @@
+var m_allSongs = [];
+var m_songIndex = 0;
+
 // Play a new song from the list in the player
-function play(userid, songid) {
+function play(event) {
+    var song = event.target.parentElement;
+    m_songIndex = m_allSongs.indexOf(song);
+    playCurrentSong();
+}
+
+function playCurrentSong() {
+    var song = m_allSongs[m_songIndex];
+    var songData = JSON.parse(song.dataset.song);
+
     var audio = document.getElementById("player-audio");
     audio.pause();
-    audio.src = `/song/${userid}/${songid}`;
+    audio.src = `/song/${songData.userid}/${songData.songid}`;
     audio.currentTime = 0;
     audio.play();
 }
@@ -20,16 +32,25 @@ function songPlayPause() {
 
 // Play the next song in the queue
 function songNext() {
-    // TODO
+    m_songIndex = (m_songIndex + 1) % m_allSongs.length;
+    playCurrentSong();
 }
 
 // Play the previous song in the queue
 function songPrevious() {
-    // TODO
+    m_songIndex = m_songIndex - 1;
+    if (m_songIndex < 0) {
+        m_songIndex = m_allSongs.length - 1;
+    }
+    playCurrentSong();
 }
 
 // Convert float seconds to "min:sec"
 function getTimeString(time) {
+    if (isNaN(time))
+    {
+        time = 0.0;
+    }
     var minute = Math.floor(time / 60);
     var second = Math.floor(time % 60);
     var secondStr = second.toString();
@@ -108,14 +129,24 @@ function updateScrubPosition(dot, audio, dotPosition, maxPosition) {
 // Add event listeners
 document.addEventListener("DOMContentLoaded", (event) => {
 
-    // Audio playback position
+    // Audio playback position while playing
     var audio = document.getElementById("player-audio");
     audio.addEventListener("timeupdate", songUpdate);
 
+    // Next song on audio playback end
+    audio.addEventListener("ended", songNext);
+
+    // Audio position scrubbing
     var playerPosition = document.getElementById("player-position");
     playerPosition.addEventListener("mousedown", songScrub);
     playerPosition.addEventListener("mouseup", songScrub);
     playerPosition.addEventListener("mouseleave", songScrub);
     playerPosition.addEventListener("mousemove", songScrub);
+
+    // Song play
+    for (const element of document.getElementsByClassName("song-play-button")) {
+        m_allSongs.push(element.parentElement);
+        element.addEventListener("click", play);
+    }
 });
 
index c27f46c17812b0c2be8e58c0cf1a4fd240cc0910..27fb38b9ebd9864b228fe06e4b0d5e6e5eeb9d36 100644 (file)
@@ -1,5 +1,5 @@
 {% for song in songs %}
-<div class="song">
+<div class="song" data-song="{{ song.json() }}">
     <!-- Song Title -->
     <div class="song-title">{{ song.title }}</div>
 
     {% endif %}
 
     <!-- Play Button -->
-    <!-- <audio src="/song/{{ song.userid }}/{{ song.songid }}" controls></audio> -->
-    <div class="song-play-button">
-        <a href="javascript:play({{ song.userid }}, {{ song.songid }})">Play</a>
-    </div>
+    <a href="#" class="song-play-button">Play</a>
 
     <!-- Song Description -->
     <div class="song-description">{{ song.description }}</div>
index 6777e4444109013d037f143fd6742f75a4e9dc1b..80618358f71b5418736db7ccaea5754515b14044 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -1,9 +1,10 @@
 - automated tests
 
 - javascript song player:
-    - scrubbing
     - song queue
 
+- limit input length for form fields (back and front end)
+
 - song search
 - admin account(s)
 - logging