58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
import xml.etree.ElementTree as etree
|
|
from xml.etree.ElementTree import Element, SubElement
|
|
|
|
from defusedxml import minidom
|
|
from rest_framework import renderers
|
|
|
|
from funkwhale_api.playlists.models import Playlist
|
|
|
|
|
|
class PlaylistXspfRenderer(renderers.BaseRenderer):
|
|
media_type = "application/octet-stream"
|
|
format = "xspf"
|
|
|
|
def render(self, data, accepted_media_type=None, renderer_context=None):
|
|
if isinstance(data, bytes):
|
|
return data
|
|
|
|
fw_playlist = Playlist.objects.get(id=data["id"])
|
|
plt_tracks = fw_playlist.playlist_tracks.prefetch_related("track")
|
|
top = Element("playlist", version="1", xmlns="http://xspf.org/ns/0/")
|
|
title_xspf = SubElement(top, "title")
|
|
title_xspf.text = fw_playlist.name
|
|
date_xspf = SubElement(top, "date")
|
|
date_xspf.text = fw_playlist.creation_date.isoformat()
|
|
trackList_xspf = SubElement(top, "trackList")
|
|
|
|
for plt_track in plt_tracks:
|
|
track = plt_track.track
|
|
write_xspf_track_data(track, trackList_xspf)
|
|
return prettify(top)
|
|
|
|
|
|
def write_xspf_track_data(track, trackList_xspf):
|
|
"""
|
|
Insert a track into the trackList subelement of a xspf file
|
|
"""
|
|
track_xspf = SubElement(trackList_xspf, "track")
|
|
location_xspf = SubElement(track_xspf, "location")
|
|
location_xspf.text = "https://" + track.domain_name + track.listen_url
|
|
title_xspf = SubElement(track_xspf, "title")
|
|
title_xspf.text = str(track.title)
|
|
creator_xspf = SubElement(track_xspf, "creator")
|
|
creator_xspf.text = str(track.get_artist_credit_string)
|
|
if str(track.album) == "[non-album tracks]":
|
|
return
|
|
else:
|
|
album_xspf = SubElement(track_xspf, "album")
|
|
album_xspf.text = str(track.album)
|
|
|
|
|
|
def prettify(elem):
|
|
"""
|
|
Return a pretty-printed XML string for the Element.
|
|
"""
|
|
rough_string = etree.tostring(elem, "utf-8")
|
|
reparsed = minidom.parseString(rough_string)
|
|
return reparsed.toprettyxml(indent=" ")
|