return redirect(request.referrer)
-@app.get("/song/<userid>/<songid>")
+@app.get("/song/<int:userid>/<int:songid>")
def song(userid, songid):
- try:
- # Make sure values are valid integers
- int(userid)
- int(songid)
- except ValueError:
- app.logger.warning(f"Invalid song request: user: {userid}, song: {songid}")
- abort(404)
+ if request.args.get("action", None) == "view":
+ try:
+ song = Song.by_id(songid)
+ if song.userid != userid:
+ abort(404)
- return send_from_directory(DATA_DIR / "songs" / userid, songid + ".mp3")
+ return render_template(
+ "song.html",
+ song_list=render_template("song-list.html", songs=[song]), song=song)
+ except ValueError:
+ abort(404)
+ else:
+ return send_from_directory(DATA_DIR / "songs" / str(userid), str(songid) + ".mp3")
@app.get("/songs")
def songs():
<link rel="stylesheet" href="/static/styles.css">
<script src="/static/player.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1">
+ <!-- Page-specific head fields -->
+ {% block head %}
+ {% endblock %}
</head>
<body>
<div class="song-main">
<div class="song-info">
<!-- Song Title -->
- <div class="song-title">{{ song.title }}</div>
+ <div class="song-title"><a href="/song/{{ song.userid }}/{{ song.songid }}?action=view">{{ song.title }}</a></div>
<!-- Separator -->
-
--- /dev/null
+{% extends "base.html" %}
+
+{% block head %}
+<meta property="og:title" content="{{ song.title }}" />
+<meta property="og:description" content="Song by {{ song.username }}" />
+{% endblock %}
+
+{% block title %}{{ song.title }}{% endblock %}
+
+{% block body %}
+
+{{ song_list|safe }}
+
+{% endblock %}
assert songs[1]["username"] == "user1"
# Song 3 not shown, by different user
+
+def test_single_song(client):
+ _create_user(client, "user1", "password", login=True)
+ _test_upload_song(client, b"Success", user="user1", title="song1", tags="tag")
+
+ songs = _get_song_list_from_page(client, "/song/1/1?action=view")
+
+ assert len(songs) == 1
+ assert songs[0]["title"] == "song1"
+ assert songs[0]["username"] == "user1"
+