return redirect(request.referrer)
+@app.get("/delete-song/<userid>/<songid>")
+def delete_song(userid, songid):
+ try:
+ # Make sure values are valid integers
+ int(userid)
+ int(songid)
+ except ValueError:
+ abort(404)
+
+ # Users can only delete their own songs
+ if int(userid) != session["userid"]:
+ abort(401)
+
+ if not query_db("select * from songs where songid = ?", [songid]):
+ abort(404) # Song doesn't exist
+
+ # Delete tags, collaborators
+ query_db("delete from song_tags where songid = ?", [songid])
+ query_db("delete from song_collaborators where songid = ?", [songid])
+
+ # Delete song database entry
+ query_db("delete from songs where songid = ?", [songid])
+ get_db().commit()
+
+ # Delete song file from disk
+ songpath = DATA_DIR / "songs" / userid / (songid + ".mp3")
+ if songpath.exists():
+ os.remove(songpath)
+
+ return redirect(request.referrer)
+
@app.get("/song/<userid>/<songid>")
def song(userid, songid):
try:
<!-- TODO: This is duplicated in songs-by-tag.html -->
{% for song in songs %}
<div class="song">
- <div class="song-title">{{ song["title"] }}</div>
+ <!-- Song Title -->
+ <div class="song-title"><h3>{{ song["title"] }}</h3></div>
+
+ <!-- Owner-Specific Buttons (Edit/Delete) -->
+ {% if name == username %}
+ <!-- TODO: Edit button -->
+ <div class="song-delete-button">
+ <a href="/delete-song/{{ song["userid"] }}/{{ song["songid"] }}">Delete</a>
+ </div>
+ {% endif %}
+
+ <!-- Play Button -->
<audio src="/song/{{ song["userid"] }}/{{ song["songid"] }}" controls></audio>
+
+ <!-- Song Description -->
<div class="song-description">{{ song["description"] }}</div>
+
+ <!-- Song Tags -->
<div class="song-tags">
{% for tag in songs_tags[song["songid"]] %}
<a href="/songs-by-tag/{{ tag["tag"] }}">{{ tag["tag"] }}</a>
{% endfor %}
</div>
+
+ <!-- Song Collaborators -->
<div class="song-collabs">
{% for collab in songs_collaborators[song["songid"]] %}
{% if collab["name"].startswith("@") %}