48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
from defusedxml.ElementTree import parse
|
|
from rest_framework.parsers import BaseParser
|
|
|
|
|
|
# from https://github.com/jpadilla/django-rest-framework-xml/blob/master/rest_framework_xml/parsers.py
|
|
class XspfParser(BaseParser):
|
|
"""
|
|
Takes a xspf stream, validate it, and return an xspf json
|
|
"""
|
|
|
|
media_type = "application/octet-stream"
|
|
|
|
def parse(self, stream, media_type=None, parser_context=None):
|
|
playlist = {"tracks": []}
|
|
|
|
tree = parse(stream, forbid_dtd=True)
|
|
root = tree.getroot()
|
|
|
|
# Extract playlist information
|
|
playlist_info = root.find(".")
|
|
if playlist_info is not None:
|
|
playlist["title"] = playlist_info.findtext(
|
|
"{http://xspf.org/ns/0/}title", default=""
|
|
)
|
|
playlist["creator"] = playlist_info.findtext(
|
|
"{http://xspf.org/ns/0/}creator", default=""
|
|
)
|
|
playlist["creation_date"] = playlist_info.findtext(
|
|
"{http://xspf.org/ns/0/}date", default=""
|
|
)
|
|
playlist["version"] = playlist_info.attrib.get("version", "")
|
|
|
|
# Extract track information
|
|
for track in root.findall(".//{http://xspf.org/ns/0/}track"):
|
|
track_info = {
|
|
"location": track.findtext(
|
|
"{http://xspf.org/ns/0/}location", default=""
|
|
),
|
|
"title": track.findtext("{http://xspf.org/ns/0/}title", default=""),
|
|
"creator": track.findtext("{http://xspf.org/ns/0/}creator", default=""),
|
|
"album": track.findtext("{http://xspf.org/ns/0/}album", default=""),
|
|
"duration": track.findtext(
|
|
"{http://xspf.org/ns/0/}duration", default=""
|
|
),
|
|
}
|
|
playlist["tracks"].append(track_info)
|
|
return playlist
|