]> littlesong.place Git - littlesongplace.git/commitdiff
Add songs-by-tag view
authorChris Fulljames <christianfulljames@gmail.com>
Mon, 6 Jan 2025 02:12:49 +0000 (21:12 -0500)
committerChris Fulljames <christianfulljames@gmail.com>
Mon, 6 Jan 2025 02:12:49 +0000 (21:12 -0500)
main.py
templates/songs-by-tag.html [new file with mode: 0644]

diff --git a/main.py b/main.py
index 6b67547c11e97f8e0f6f6d0fd9000f46777d1389..55002e8912bfc2aa687272734b5f935b4c85122f 100644 (file)
--- a/main.py
+++ b/main.py
@@ -113,20 +113,15 @@ def users_profile(profile_username):
     # Get songs for current profile
     profile_userid = profile_data["userid"]
     profile_songs_data = query_db("select * from songs where userid = ?", [profile_userid])
-    profile_songs_tags = {}
-    profile_songs_collabs = {}
-    for song in profile_songs_data:
-        songid = song["songid"]
-        profile_songs_tags[songid] = query_db("select (tag) from song_tags where songid = ?", [songid])
-        profile_songs_collabs[songid] = query_db("select (name) from song_collaborators where songid = ?", [songid])
+    tags, collabs = get_tags_and_collabs_for_songs(profile_songs_data)
 
     return render_template(
             "profile.html",
             name=profile_username,
             username=username,
             songs=profile_songs_data,
-            songs_tags=profile_songs_tags,
-            songs_collaborators=profile_songs_collabs)
+            songs_tags=tags,
+            songs_collaborators=collabs)
 
 @app.post("/uploadsong")
 def upload_song():
@@ -220,6 +215,19 @@ def song(userid, songid):
 
     return send_from_directory(DATA_DIR / "songs" / userid, songid + ".mp3")
 
+@app.get("/songs-by-tag/<tag>")
+def songs_by_tag(tag):
+    songs_data = query_db("select * from song_tags inner join songs on song_tags.songid = songs.songid where tag = ?", [tag])
+    tags, collabs = get_tags_and_collabs_for_songs(songs_data)
+
+    return render_template(
+            "songs-by-tag.html",
+            tag=tag,
+            username=session["username"],
+            songs=songs_data,
+            songs_tags=tags,
+            songs_collaborators=collabs)
+
 ################################################################################
 # Database
 ################################################################################
@@ -253,6 +261,14 @@ def init_db():
             db.cursor().executescript(f.read())
         db.commit()
 
+def get_tags_and_collabs_for_songs(songs):
+    tags = {}
+    collabs = {}
+    for song in songs:
+        songid = song["songid"]
+        tags[songid] = query_db("select (tag) from song_tags where songid = ?", [songid])
+        collabs[songid] = query_db("select (name) from song_collaborators where songid = ?", [songid])
+    return tags, collabs
 
 ################################################################################
 # Generate Session Key
diff --git a/templates/songs-by-tag.html b/templates/songs-by-tag.html
new file mode 100644 (file)
index 0000000..2342f86
--- /dev/null
@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+
+{% block title %}Songs with Tag: {{ tag }}{% endblock %}
+
+{% block body %}
+
+<h1 class="tag-name">Songs tagged with '{{ tag }}'</h1>
+
+{% for song in songs %}
+<div class="song">
+    <div class="song-title">{{ song["title"] }}</div>
+    <audio src="/song/{{ song["userid"] }}/{{ song["songid"] }}" controls></audio>
+    <div class="song-description">{{ song["description"] }}</div>
+    <div class="song-tags">
+        {% for tag in songs_tags[song["songid"]] %}
+        <a href="/songs-by-tag/{{ tag["tag"] }}">{{ tag["tag"] }}</a>
+        {% endfor %}
+    </div>
+    <div class="song-collabs">
+        {% for collab in songs_collaborators[song["songid"]] %}
+            {% if collab["name"].startswith("@") %}
+            <a href="/users/{{ collab["name"][1:] }}" class="collab-link">{{ collab["name"] }}</a>
+            {% else %}
+            <span class="collab-name">{{ collab["name"] }}</span>
+            {% endif %}
+        {% endfor %}
+    </div>
+</div>
+{% endfor %}
+
+{% endblock %}