diff --git a/api/funkwhale_api/playlists/utils.py b/api/funkwhale_api/playlists/utils.py index 72177da732c7b686ff645b7cea14f38a7237bb35..4d49a4d3bfff022c013e193c944f73624c2183d2 100644 --- a/api/funkwhale_api/playlists/utils.py +++ b/api/funkwhale_api/playlists/utils.py @@ -1,7 +1,5 @@ import logging -import os import re - # /!\ The next import have xml vulnerabilities but this shouldn't have security implication in funkwhale # since there are only used to generate xspf file. from xml.etree.ElementTree import Element, SubElement @@ -27,13 +25,7 @@ def clean_namespace_xspf(xspf_file): # This is needed because lxml error : "ValueError: Unicode strings with encoding declaration are # not supported. Please use bytes input or XML fragments without declaration." xspf_data = re.sub("'encoding='.'", "", xspf_data) - xspf_file_clean = xspf_file + "2" - if os.path.exists(xspf_file_clean): - os.remove(xspf_file_clean) - file = open(xspf_file_clean, "x") - file.write(xspf_data) - - return xspf_file_clean + return xspf_data def get_track_id_from_xspf(xspf_file): @@ -41,8 +33,8 @@ def get_track_id_from_xspf(xspf_file): Return a list of funkwhale tracks id from a xspf file. Tracks not found in database are ignored. """ track_list = [] - xspf_file_clean = clean_namespace_xspf(xspf_file) - tree = etree.parse(xspf_file_clean) + xspf_data_clean = clean_namespace_xspf(xspf_file) + tree = etree.fromstring(xspf_data_clean) tracks = tree.findall(".//track") added_track_count = 0 @@ -55,7 +47,6 @@ def get_track_id_from_xspf(xspf_file): album = track.find(".//album").text except Exception as e: logger.info(f"Error while parsing Xml file : {e!r}") - # Finding track id in the db try: artist_id = Artist.objects.get(name=artist) @@ -118,6 +109,35 @@ def generate_xspf_from_playlist(playlist_id): return prettify(top) +def generate_xspf_from_tracks_ids(tracks_ids): + """ + This returns a string containing playlist data in xspf format. It's used for test purposes. + """ + + top = Element("playlist") + top.set("version", "1") + # top.append(Element.fromstring('version="1"')) + title_xspf = SubElement(top, "title") + title_xspf.text = "An automated generated playlist" + trackList_xspf = SubElement(top, "trackList") + + for track_id in tracks_ids: + track = Track.objects.get(id=track_id) + 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.artist) + if str(track.album) == "[non-album tracks]": + continue + else: + album_xspf = SubElement(track_xspf, "album") + album_xspf.text = str(track.album) + return prettify(top) + + def prettify(elem): """ Return a pretty-printed XML string for the Element.