1
0
mirror of https://github.com/spl0k/supysonic.git synced 2024-12-22 17:06:17 +00:00

Merge branch 'playlist-export'

This commit is contained in:
Alban Féron 2021-04-10 15:49:54 +02:00
commit 9d34270227
No known key found for this signature in database
GPG Key ID: 8CE0313646D16165
4 changed files with 60 additions and 3 deletions

View File

@ -7,7 +7,7 @@
import uuid import uuid
from flask import flash, redirect, render_template, request, url_for from flask import Response, flash, redirect, render_template, request, url_for
from pony.orm import ObjectNotFound from pony.orm import ObjectNotFound
from ..db import Playlist from ..db import Playlist
@ -41,6 +41,29 @@ def playlist_details(uid):
return render_template("playlist.html", playlist=playlist) return render_template("playlist.html", playlist=playlist)
@frontend.route("/playlist/<uid>/export")
def playlist_export(uid):
try:
uid = uuid.UUID(uid)
except ValueError:
flash("Invalid playlist id")
return redirect(url_for("frontend.playlist_index"))
try:
playlist = Playlist[uid]
except ObjectNotFound:
flash("Unknown playlist")
return redirect(url_for("frontend.playlist_index"))
return Response(
render_template("playlist_export.m3u", playlist=playlist),
mimetype="audio/mpegurl",
headers={
"Content-disposition": "attachment; filename={}.m3u".format(playlist.name)
},
)
@frontend.route("/playlist/<uid>", methods=["POST"]) @frontend.route("/playlist/<uid>", methods=["POST"])
def playlist_update(uid): def playlist_update(uid):
try: try:

View File

@ -12,6 +12,6 @@ $(function () {
$('[data-toggle="tooltip"]').tooltip() $('[data-toggle="tooltip"]').tooltip()
}); });
$('#confirm-delete').on('show.bs.modal', function(e) { $('.modal').on('show.bs.modal', function(e) {
$(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href')); $(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href'));
}); });

View File

@ -0,0 +1,12 @@
{#-
This file is part of Supysonic.
Supysonic is a Python implementation of the Subsonic server API.
Copyright (C) 2013-2018 Alban 'spl0k' Féron
2017 Óscar García Amor
Distributed under terms of the GNU AGPLv3 license.
-#}
{% for t in playlist.get_tracks() %}
{{ t.path }}
{% endfor %}

View File

@ -21,7 +21,7 @@
{% else %} {% else %}
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr><th>Playlist</th><th>Tracks</th><th>Public</th><th></th></tr> <tr><th>Playlist</th><th>Tracks</th><th>Public</th><th>Export</th><th>Delete</th></tr>
</thead> </thead>
<tbody> <tbody>
{% for p in mine %} {% for p in mine %}
@ -32,6 +32,8 @@
aria-label="Public playlist"></span>{% else %}<span aria-label="Public playlist"></span>{% else %}<span
class="glyphicon glyphicon-unchecked" class="glyphicon glyphicon-unchecked"
aria-label="Private playlist"></span>{% endif %}</td> aria-label="Private playlist"></span>{% endif %}</td>
<td><button class="btn btn-primary btn-xs" data-href="{{ url_for('frontend.playlist_export', uid = p.id) }}" data-toggle="modal" data-target="#confirm-export" aria-label="Export playlist">
<span class="glyphicon glyphicon-arrow-down" aria-hidden="true" data-toggle="tooltip" data-placement="top" title="Export M3U playlist"></span></button></td>
<td><button class="btn btn-danger btn-xs" data-href="{{ url_for('frontend.playlist_delete', uid = p.id) }}" data-toggle="modal" data-target="#confirm-delete" aria-label="Delete playlist"> <td><button class="btn btn-danger btn-xs" data-href="{{ url_for('frontend.playlist_delete', uid = p.id) }}" data-toggle="modal" data-target="#confirm-delete" aria-label="Delete playlist">
<span class="glyphicon glyphicon-remove-circle" aria-hidden="true" data-toggle="tooltip" data-placement="top" title="Delete playlist"></span></button></td> <span class="glyphicon glyphicon-remove-circle" aria-hidden="true" data-toggle="tooltip" data-placement="top" title="Delete playlist"></span></button></td>
</tr> </tr>
@ -75,4 +77,24 @@
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
</div><!-- /.modal --> </div><!-- /.modal -->
<div class="modal fade" id="confirm-export" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Warning</h4>
</div>
<div class="modal-body">
<p>The exported playlist will use the same local paths the server uses itself. This means the playlist will only
work on the very same system the Supysonic server is running. If you were to export it from another machine it
won't be usable.
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Oh ok. Forget it</button>
<a type="button" class="btn btn-primary btn-ok">Got it, export the playlist</a>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
{% endblock %} {% endblock %}