Update utils.py

This commit is contained in:
petitminion 2021-07-13 18:10:04 +00:00
parent 53e4a2464c
commit 4186e65b05

View file

@ -1,7 +1,5 @@
import logging import logging
import os
import re import re
# /!\ The next import have xml vulnerabilities but this shouldn't have security implication in funkwhale # /!\ The next import have xml vulnerabilities but this shouldn't have security implication in funkwhale
# since there are only used to generate xspf file. # since there are only used to generate xspf file.
from xml.etree.ElementTree import Element, SubElement 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 # This is needed because lxml error : "ValueError: Unicode strings with encoding declaration are
# not supported. Please use bytes input or XML fragments without declaration." # not supported. Please use bytes input or XML fragments without declaration."
xspf_data = re.sub("'encoding='.'", "", xspf_data) xspf_data = re.sub("'encoding='.'", "", xspf_data)
xspf_file_clean = xspf_file + "2" return xspf_data
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
def get_track_id_from_xspf(xspf_file): 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. Return a list of funkwhale tracks id from a xspf file. Tracks not found in database are ignored.
""" """
track_list = [] track_list = []
xspf_file_clean = clean_namespace_xspf(xspf_file) xspf_data_clean = clean_namespace_xspf(xspf_file)
tree = etree.parse(xspf_file_clean) tree = etree.fromstring(xspf_data_clean)
tracks = tree.findall(".//track") tracks = tree.findall(".//track")
added_track_count = 0 added_track_count = 0
@ -55,7 +47,6 @@ def get_track_id_from_xspf(xspf_file):
album = track.find(".//album").text album = track.find(".//album").text
except Exception as e: except Exception as e:
logger.info(f"Error while parsing Xml file : {e!r}") logger.info(f"Error while parsing Xml file : {e!r}")
# Finding track id in the db # Finding track id in the db
try: try:
artist_id = Artist.objects.get(name=artist) artist_id = Artist.objects.get(name=artist)
@ -118,6 +109,35 @@ def generate_xspf_from_playlist(playlist_id):
return prettify(top) 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): def prettify(elem):
""" """
Return a pretty-printed XML string for the Element. Return a pretty-printed XML string for the Element.