Skip to content
Snippets Groups Projects
Verified Commit a119a5d9 authored by Eliot Berriot's avatar Eliot Berriot
Browse files

See #170: fixed several feed parsing issues

parent b43d0f70
No related branches found
No related tags found
No related merge requests found
...@@ -589,13 +589,21 @@ def get_cached_upload(uploads, expected_track_uuid): ...@@ -589,13 +589,21 @@ def get_cached_upload(uploads, expected_track_uuid):
return upload return upload
class PermissiveIntegerField(serializers.IntegerField):
def to_internal_value(self, v):
try:
return super().to_internal_value(v)
except serializers.ValidationError:
return self.default
class RssFeedItemSerializer(serializers.Serializer): class RssFeedItemSerializer(serializers.Serializer):
id = serializers.CharField() id = serializers.CharField()
title = serializers.CharField() title = serializers.CharField()
rights = serializers.CharField(required=False, allow_blank=True) rights = serializers.CharField(required=False, allow_blank=True)
itunes_season = serializers.IntegerField(required=False) itunes_season = serializers.IntegerField(required=False)
itunes_episode = serializers.IntegerField(required=False) itunes_episode = PermissiveIntegerField(required=False, default=None)
itunes_duration = ItunesDurationField() itunes_duration = ItunesDurationField(required=False)
links = serializers.ListField() links = serializers.ListField()
tags = serializers.ListField(required=False) tags = serializers.ListField(required=False)
summary_detail = serializers.DictField(required=False) summary_detail = serializers.DictField(required=False)
...@@ -627,12 +635,12 @@ class RssFeedItemSerializer(serializers.Serializer): ...@@ -627,12 +635,12 @@ class RssFeedItemSerializer(serializers.Serializer):
if row.get("rel") != "enclosure": if row.get("rel") != "enclosure":
continue continue
try: try:
size = int(row.get("length")) size = int(row.get("length", 0)) or None
except (TypeError, ValueError): except (TypeError, ValueError):
raise serializers.ValidationError("Invalid size") raise serializers.ValidationError("Invalid size")
data["audio"] = { data["audio"] = {
"mimetype": row["type"], "mimetype": common_utils.get_audio_mimetype(row["type"]),
"size": size, "size": size,
"source": row["href"], "source": row["href"],
} }
...@@ -703,7 +711,7 @@ class RssFeedItemSerializer(serializers.Serializer): ...@@ -703,7 +711,7 @@ class RssFeedItemSerializer(serializers.Serializer):
"source": validated_data["links"]["audio"]["source"], "source": validated_data["links"]["audio"]["source"],
"size": validated_data["links"]["audio"]["size"], "size": validated_data["links"]["audio"]["size"],
"mimetype": validated_data["links"]["audio"]["mimetype"], "mimetype": validated_data["links"]["audio"]["mimetype"],
"duration": validated_data["itunes_duration"], "duration": validated_data.get("itunes_duration"),
"import_status": "finished", "import_status": "finished",
"library": channel.library, "library": channel.library,
} }
......
...@@ -396,3 +396,8 @@ def get_mimetype_from_ext(path): ...@@ -396,3 +396,8 @@ def get_mimetype_from_ext(path):
"gif": "image/gif", "gif": "image/gif",
} }
return match.get(ext) return match.get(ext)
def get_audio_mimetype(mt):
aliases = {"audio/x-mp3": "audio/mpeg", "audio/mpeg3": "audio/mpeg"}
return aliases.get(mt, mt)
...@@ -37,10 +37,13 @@ def compute_status(jobs): ...@@ -37,10 +37,13 @@ def compute_status(jobs):
AUDIO_EXTENSIONS_AND_MIMETYPE = [ AUDIO_EXTENSIONS_AND_MIMETYPE = [
# keep the most correct mimetype for each extension at the bottom
("mp3", "audio/mpeg3"),
("mp3", "audio/x-mp3"),
("mp3", "audio/mpeg"),
("ogg", "video/ogg"), ("ogg", "video/ogg"),
("ogg", "audio/ogg"), ("ogg", "audio/ogg"),
("opus", "audio/opus"), ("opus", "audio/opus"),
("mp3", "audio/mpeg"),
("aac", "audio/x-m4a"), ("aac", "audio/x-m4a"),
("m4a", "audio/x-m4a"), ("m4a", "audio/x-m4a"),
("flac", "audio/x-flac"), ("flac", "audio/x-flac"),
......
<template> <template>
<time :datetime="`${duration}s`"> <time :datetime="`${duration}s`">
<template v-if="durationObj.hours">{{ durationObj.hours|padDuration }}</template>{{ durationObj.minutes|padDuration }}:{{ durationObj.seconds|padDuration }} <template v-if="durationObj.hours">{{ durationObj.hours|padDuration }}:</template>{{ durationObj.minutes|padDuration }}:{{ durationObj.seconds|padDuration }}
</time> </time>
</template> </template>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment