mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-05 10:29:28 +02:00
clening exeptions
This commit is contained in:
parent
5555382f64
commit
2830134a75
2 changed files with 74 additions and 20 deletions
|
@ -1,5 +1,7 @@
|
||||||
from xml.etree.ElementTree import Element
|
from xml.etree.ElementTree import Element
|
||||||
|
|
||||||
|
from django.db.models.fields import CharField, IntegerField
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from funkwhale_api.federation import serializers as federation_serializers
|
from funkwhale_api.federation import serializers as federation_serializers
|
||||||
|
@ -110,7 +112,30 @@ class PlaylistSerializer(serializers.ModelSerializer):
|
||||||
full_urls.append(url)
|
full_urls.append(url)
|
||||||
return full_urls
|
return full_urls
|
||||||
|
|
||||||
def generate_xspf_from_playlist(playlist_id):
|
|
||||||
|
class PlaylistAddManySerializer(serializers.Serializer):
|
||||||
|
tracks = serializers.PrimaryKeyRelatedField(
|
||||||
|
many=True, queryset=Track.objects.for_nested_serialization()
|
||||||
|
)
|
||||||
|
allow_duplicates = serializers.BooleanField(required=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
fields = "allow_duplicates"
|
||||||
|
|
||||||
|
|
||||||
|
class XspfSerializer(serializers.Serializer):
|
||||||
|
title = CharField()
|
||||||
|
playlist_id = IntegerField()
|
||||||
|
class Meta:
|
||||||
|
fields = (
|
||||||
|
"title",
|
||||||
|
"playlist_id",
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_title():
|
||||||
|
return "test"
|
||||||
|
|
||||||
|
def generate_xspf_from_playlist():
|
||||||
"""
|
"""
|
||||||
This returns a string containing playlist data in xspf format
|
This returns a string containing playlist data in xspf format
|
||||||
"""
|
"""
|
||||||
|
@ -126,12 +151,3 @@ class PlaylistSerializer(serializers.ModelSerializer):
|
||||||
utils.write_xspf_track_data(track, xspf_tracklist)
|
utils.write_xspf_track_data(track, xspf_tracklist)
|
||||||
return utils.prettify(xspf_playlist)
|
return utils.prettify(xspf_playlist)
|
||||||
|
|
||||||
|
|
||||||
class PlaylistAddManySerializer(serializers.Serializer):
|
|
||||||
tracks = serializers.PrimaryKeyRelatedField(
|
|
||||||
many=True, queryset=Track.objects.for_nested_serialization()
|
|
||||||
)
|
|
||||||
allow_duplicates = serializers.BooleanField(required=False)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
fields = "allow_duplicates"
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ from xml.etree.ElementTree import Element, SubElement
|
||||||
|
|
||||||
from defusedxml import ElementTree as etree
|
from defusedxml import ElementTree as etree
|
||||||
from defusedxml import minidom
|
from defusedxml import minidom
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
|
||||||
|
|
||||||
from funkwhale_api.music.models import Album, Artist, Track
|
from funkwhale_api.music.models import Album, Artist, Track
|
||||||
|
|
||||||
|
@ -30,9 +30,30 @@ def clean_namespace_xspf(xspf_file):
|
||||||
return xspf_data
|
return xspf_data
|
||||||
|
|
||||||
|
|
||||||
|
def album_exist(track, artist_id):
|
||||||
|
try:
|
||||||
|
album = track.find(".//album").text
|
||||||
|
except AttributeError as e:
|
||||||
|
logger.info(
|
||||||
|
f"Couldn't find the following attribute while parsing the xml : {e!r}. No album information."
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
album_id = Album.objects.get(title=album, artist_id=artist_id)
|
||||||
|
except Exception as e:
|
||||||
|
logger.info(f"Error while quering database for album : {e!r}")
|
||||||
|
return
|
||||||
|
except MultipleObjectsReturned as e:
|
||||||
|
album_id = Album.objects.filter(title=album, artist_id=artist_id).first
|
||||||
|
return album_id
|
||||||
|
return album_id
|
||||||
|
|
||||||
|
|
||||||
def get_track_id_from_xspf(xspf_file):
|
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.
|
||||||
|
Usefull to generate playlist from xspf files.
|
||||||
"""
|
"""
|
||||||
track_list = []
|
track_list = []
|
||||||
xspf_data_clean = clean_namespace_xspf(xspf_file)
|
xspf_data_clean = clean_namespace_xspf(xspf_file)
|
||||||
|
@ -46,27 +67,44 @@ def get_track_id_from_xspf(xspf_file):
|
||||||
try:
|
try:
|
||||||
artist = track.find(".//creator").text
|
artist = track.find(".//creator").text
|
||||||
title = track.find(".//title").text
|
title = track.find(".//title").text
|
||||||
album = track.find(".//album").text
|
|
||||||
except AttributeError as e:
|
except AttributeError as e:
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Couldn't find the following attribute while parsing the xml file : {e!r}"
|
f"Couldn't find the following attribute while parsing the xml file for artist and title data : {e!r}. \
|
||||||
|
Switching to next track..."
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 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)
|
||||||
album_id = Album.objects.get(title=album)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.info(f"Error while quering database : {e!r}")
|
logger.info(f"Error while quering database : {e!r}. Switching to next track.")
|
||||||
try:
|
continue
|
||||||
track_id = Track.objects.get(
|
except MultipleObjectsReturned as e:
|
||||||
title=title, artist=artist_id.id, album=album_id.id
|
artist_id = Artist.objects.filter(name=artist).first()
|
||||||
)
|
|
||||||
except ObjectDoesNotExist:
|
album_id = album_exist(track, artist_id)
|
||||||
|
if album_id:
|
||||||
|
try:
|
||||||
|
track_id = Track.objects.get(
|
||||||
|
title=title, artist=artist_id.id, album=album_id.id
|
||||||
|
)
|
||||||
|
except ObjectDoesNotExist as e :
|
||||||
|
logger.info(f"Couldn't find track in the database : {e!r}. Trying without album...")
|
||||||
|
except MultipleObjectsReturned as e:
|
||||||
|
track_id = Track.objects.filter(
|
||||||
|
title=title, artist=artist_id.id, album=album_id.id
|
||||||
|
).first()
|
||||||
|
|
||||||
|
else:
|
||||||
try:
|
try:
|
||||||
track_id = Track.objects.get(title=title, artist=artist_id.id)
|
track_id = Track.objects.get(title=title, artist=artist_id.id)
|
||||||
except ObjectDoesNotExist as e:
|
except ObjectDoesNotExist as e:
|
||||||
logger.info(f"Couldn't find track in the database : {e!r}")
|
logger.info(f"Couldn't find track in the database : {e!r}")
|
||||||
|
continue
|
||||||
|
except MultipleObjectsReturned as e:
|
||||||
|
track_id = Track.objects.filter(title=title, artist=artist_id.id).first()
|
||||||
|
|
||||||
if track_id:
|
if track_id:
|
||||||
track_list.append(track_id.id)
|
track_list.append(track_id.id)
|
||||||
added_track_count = added_track_count + 1
|
added_track_count = added_track_count + 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue