Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
petitminion
funkwhale
Commits
4186e65b
Commit
4186e65b
authored
Jul 13, 2021
by
petitminion
Browse files
Update utils.py
parent
53e4a246
Pipeline
#15192
failed with stages
in 15 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
api/funkwhale_api/playlists/utils.py
View file @
4186e65b
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.
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment