2020-01-30 16:28:52 +00:00
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
|
2022-11-23 11:11:36 +00:00
|
|
|
from rest_framework import negotiation, renderers
|
2020-01-30 16:28:52 +00:00
|
|
|
|
|
|
|
from funkwhale_api.subsonic.renderers import dict_to_xml_tree
|
|
|
|
|
|
|
|
|
|
|
|
class PodcastRSSRenderer(renderers.JSONRenderer):
|
|
|
|
media_type = "application/rss+xml"
|
|
|
|
|
|
|
|
def render(self, data, accepted_media_type=None, renderer_context=None):
|
|
|
|
if not data:
|
|
|
|
# when stream view is called, we don't have any data
|
|
|
|
return super().render(data, accepted_media_type, renderer_context)
|
|
|
|
final = {
|
|
|
|
"version": "2.0",
|
|
|
|
"xmlns:atom": "http://www.w3.org/2005/Atom",
|
|
|
|
"xmlns:itunes": "http://www.itunes.com/dtds/podcast-1.0.dtd",
|
2021-08-05 07:58:12 +00:00
|
|
|
"xmlns:content": "http://purl.org/rss/1.0/modules/content/",
|
2020-01-30 16:28:52 +00:00
|
|
|
"xmlns:media": "http://search.yahoo.com/mrss/",
|
|
|
|
}
|
|
|
|
final.update(data)
|
|
|
|
tree = dict_to_xml_tree("rss", final)
|
2020-03-13 11:16:51 +00:00
|
|
|
return render_xml(tree)
|
2020-01-30 16:28:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
class PodcastRSSContentNegociation(negotiation.DefaultContentNegotiation):
|
|
|
|
def select_renderer(self, request, renderers, format_suffix=None):
|
|
|
|
|
|
|
|
return (PodcastRSSRenderer(), PodcastRSSRenderer.media_type)
|
2020-03-13 11:16:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
def render_xml(tree):
|
|
|
|
return b'<?xml version="1.0" encoding="UTF-8"?>\n' + ET.tostring(
|
|
|
|
tree, encoding="utf-8"
|
|
|
|
)
|