Commit 7ee8e02b authored by Kuba Orlik's avatar Kuba Orlik Committed by Agate
Browse files

Fix feed formatting so it passes w3c validation

Feeds generated by Funkwhale do not pass validation with the [w3c
validator](https://validator.w3.org/feed/check.cgi?url=https%3A%2F%2Fpodcast.midline.pl%2Fapi%2Fv1%2Fchannels%2FMidline%2Frss).
This commit addresses the problems identified during validation:

1. The `isPermalink` is not recognized -> changed it to
   `isPermaLink` (capital "L")

2. `itunes:summary` and `itunes:subtitle` are 256 characters after
   truncating, but the maximum is 255. The truncating function trims the
   text to 255 chars, but then adds `…`, so the text is one character
   too long

3. The tags within `itunes:keywords` are now separated with commas
   instead of spaces (https://validator.w3.org/feed/docs/warning/InvalidKeywords.html)
parent 055ae44a
...@@ -818,7 +818,7 @@ def rss_serialize_item(upload): ...@@ -818,7 +818,7 @@ def rss_serialize_item(upload):
data = { data = {
"title": [{"value": upload.track.title}], "title": [{"value": upload.track.title}],
"itunes:title": [{"value": upload.track.title}], "itunes:title": [{"value": upload.track.title}],
"guid": [{"cdata_value": str(upload.uuid), "isPermalink": "false"}], "guid": [{"cdata_value": str(upload.uuid), "isPermaLink": "false"}],
"pubDate": [{"value": rfc822_date(upload.creation_date)}], "pubDate": [{"value": rfc822_date(upload.creation_date)}],
"itunes:duration": [{"value": rss_duration(upload.duration)}], "itunes:duration": [{"value": rss_duration(upload.duration)}],
"itunes:explicit": [{"value": "no"}], "itunes:explicit": [{"value": "no"}],
...@@ -841,7 +841,7 @@ def rss_serialize_item(upload): ...@@ -841,7 +841,7 @@ def rss_serialize_item(upload):
], ],
} }
if upload.track.description: if upload.track.description:
data["itunes:subtitle"] = [{"value": upload.track.description.truncate(255)}] data["itunes:subtitle"] = [{"value": upload.track.description.truncate(254)}]
data["itunes:summary"] = [{"cdata_value": upload.track.description.rendered}] data["itunes:summary"] = [{"cdata_value": upload.track.description.rendered}]
data["description"] = [{"value": upload.track.description.as_plain_text}] data["description"] = [{"value": upload.track.description.as_plain_text}]
...@@ -853,7 +853,7 @@ def rss_serialize_item(upload): ...@@ -853,7 +853,7 @@ def rss_serialize_item(upload):
tagged_items = getattr(upload.track, "_prefetched_tagged_items", []) tagged_items = getattr(upload.track, "_prefetched_tagged_items", [])
if tagged_items: if tagged_items:
data["itunes:keywords"] = [ data["itunes:keywords"] = [
{"value": " ".join([ti.tag.name for ti in tagged_items])} {"value": ",".join([ti.tag.name for ti in tagged_items])}
] ]
return data return data
...@@ -903,7 +903,7 @@ def rss_serialize_channel(channel): ...@@ -903,7 +903,7 @@ def rss_serialize_channel(channel):
data["itunes:category"] = [node] data["itunes:category"] = [node]
if channel.artist.description: if channel.artist.description:
data["itunes:subtitle"] = [{"value": channel.artist.description.truncate(255)}] data["itunes:subtitle"] = [{"value": channel.artist.description.truncate(254)}]
data["itunes:summary"] = [{"cdata_value": channel.artist.description.rendered}] data["itunes:summary"] = [{"cdata_value": channel.artist.description.rendered}]
data["description"] = [{"value": channel.artist.description.as_plain_text}] data["description"] = [{"value": channel.artist.description.as_plain_text}]
......
...@@ -26,6 +26,9 @@ class FunkwhaleAccountAdapter(DefaultAccountAdapter): ...@@ -26,6 +26,9 @@ class FunkwhaleAccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request): def get_login_redirect_url(self, request):
return "noop" return "noop"
def get_signup_redirect_url(self, request):
return "noop"
def add_message(self, *args, **kwargs): def add_message(self, *args, **kwargs):
# disable message sending # disable message sending
return return
...@@ -6,7 +6,7 @@ django-environ~=0.4 ...@@ -6,7 +6,7 @@ django-environ~=0.4
# Images # Images
Pillow~=7.0 Pillow~=7.0
django-allauth~=0.42 django-allauth~=0.42.0
psycopg2-binary~=2.8 psycopg2-binary~=2.8
......
...@@ -300,13 +300,13 @@ def test_rss_item_serializer(factories): ...@@ -300,13 +300,13 @@ def test_rss_item_serializer(factories):
expected = { expected = {
"title": [{"value": upload.track.title}], "title": [{"value": upload.track.title}],
"itunes:title": [{"value": upload.track.title}], "itunes:title": [{"value": upload.track.title}],
"itunes:subtitle": [{"value": description.truncate(255)}], "itunes:subtitle": [{"value": description.truncate(254)}],
"itunes:summary": [{"cdata_value": description.rendered}], "itunes:summary": [{"cdata_value": description.rendered}],
"description": [{"value": description.as_plain_text}], "description": [{"value": description.as_plain_text}],
"guid": [{"cdata_value": str(upload.uuid), "isPermalink": "false"}], "guid": [{"cdata_value": str(upload.uuid), "isPermaLink": "false"}],
"pubDate": [{"value": serializers.rfc822_date(upload.creation_date)}], "pubDate": [{"value": serializers.rfc822_date(upload.creation_date)}],
"itunes:duration": [{"value": serializers.rss_duration(upload.duration)}], "itunes:duration": [{"value": serializers.rss_duration(upload.duration)}],
"itunes:keywords": [{"value": "pop rock"}], "itunes:keywords": [{"value": "pop,rock"}],
"itunes:explicit": [{"value": "no"}], "itunes:explicit": [{"value": "no"}],
"itunes:episodeType": [{"value": "full"}], "itunes:episodeType": [{"value": "full"}],
"itunes:season": [{"value": upload.track.disc_number}], "itunes:season": [{"value": upload.track.disc_number}],
......
Make the generated RSS feed more conformant with w3c specification (#1250)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment