]> littlesong.place Git - littlesongplace.git/commitdiff
Allow users to download their own songs
authorChris Fulljames <christianfulljames@gmail.com>
Fri, 4 Jul 2025 01:48:12 +0000 (21:48 -0400)
committerChris Fulljames <christianfulljames@gmail.com>
Fri, 4 Jul 2025 01:48:12 +0000 (21:48 -0400)
src/littlesongplace/songs.py
src/littlesongplace/static/lsp_btn_download02.gif [new file with mode: 0644]
src/littlesongplace/static/nav.js
src/littlesongplace/templates/song.html

index a8c25f8c5a20e094291467bd0e30cac41e22c559..fbb7cccddd69d35ae494b08b6a27f0622e02e629 100644 (file)
@@ -548,17 +548,22 @@ def delete_song(songid):
 
 @bp.get("/song/<int:userid>/<int:songid>")
 def song(userid, songid):
-    if request.args.get("action", None) == "view":
+    action = request.args.get("action", None)
+    if action in ["view", "download"]:
         try:
             song = by_id(songid)
             if song.userid != userid:
                 abort(404)
 
-            return render_template(
-                    "song.html",
-                    songs=[song],
-                    song=song,
-                    **users.get_user_colors(userid))
+            if action == "view":
+                return render_template(
+                        "song.html",
+                        songs=[song],
+                        song=song,
+                        **users.get_user_colors(userid))
+            else:  # download
+                return send_from_directory(
+                    datadir.get_user_songs_path(userid), str(songid) + ".mp3", as_attachment=True, download_name=song.title + ".mp3")
         except ValueError:
             abort(404)
     else:
diff --git a/src/littlesongplace/static/lsp_btn_download02.gif b/src/littlesongplace/static/lsp_btn_download02.gif
new file mode 100644 (file)
index 0000000..9137bc8
Binary files /dev/null and b/src/littlesongplace/static/lsp_btn_download02.gif differ
index 932430cc34b3c1011f3f4dc5dd9f17d9af60e4e7..53ea65550d547cfb4a588514886356b92b36a075 100644 (file)
@@ -8,7 +8,9 @@ document.addEventListener("DOMContentLoaded", async (e) => {
     // Handle link clicks with AJAX
     document.querySelectorAll("a").forEach((anchor) => {
         anchor.removeEventListener("click", onLinkClick);
-        anchor.addEventListener("click", onLinkClick);
+        if (!anchor.download) {
+            anchor.addEventListener("click", onLinkClick);
+        }
     });
 
     // Handle form submissions with AJAX
index 6e1e49f6c08d63144179b9598616d8d0a0ea2c35..85a4983c90b29dfac849bbb85f8c94ffb326a8e9 100644 (file)
@@ -24,6 +24,7 @@
 {% if session["userid"] == song.userid -%}
 <a href="/edit-song?songid={{ song.songid }}" class="song-list-button" title="Edit"><img class="lsp_btn_edit02" /></a>
 <a href="/delete-song/{{ song.songid }}" class="song-list-button" onclick="return confirm('Are you sure you want to delete this song?')" title="Delete"><img class="lsp_btn_delete02" /></a>
+<a href="/song/{{ song.userid }}/{{ song.songid }}?action=download" class="song-list-button" download="{{ song.title }}.mp3" title="Download mp3 File"><img class="lsp_btn_download02" /></a>
 {%- endif %}
 </p>