From 099d82c9f96ee6d2779792d806e652cd4f70a798 Mon Sep 17 00:00:00 2001 From: Eliot Berriot <contact@eliotberriot.com> Date: Fri, 31 Jan 2020 11:48:38 +0100 Subject: [PATCH] Fixed a CDATA issue with RSS feeds --- api/funkwhale_api/subsonic/renderers.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/api/funkwhale_api/subsonic/renderers.py b/api/funkwhale_api/subsonic/renderers.py index ceab2c5ee..b628f9c61 100644 --- a/api/funkwhale_api/subsonic/renderers.py +++ b/api/funkwhale_api/subsonic/renderers.py @@ -5,6 +5,29 @@ from rest_framework import renderers import funkwhale_api +# from https://stackoverflow.com/a/8915039 +# because I want to avoid a lxml dependency just for outputting cdata properly +# in a RSS feed +def CDATA(text=None): + element = ET.Element("![CDATA[") + element.text = text + return element + + +ET._original_serialize_xml = ET._serialize_xml + + +def _serialize_xml(write, elem, qnames, namespaces, **kwargs): + if elem.tag == "![CDATA[": + write("<%s%s]]>" % (elem.tag, elem.text)) + return + return ET._original_serialize_xml(write, elem, qnames, namespaces, **kwargs) + + +ET._serialize_xml = ET._serialize["xml"] = _serialize_xml +# end of tweaks + + def structure_payload(data): payload = { "status": "ok", @@ -56,7 +79,7 @@ def dict_to_xml_tree(root_tag, d, parent=None): if key == "value": root.text = str(value) elif key == "cdata_value": - root.text = "<![CDATA[{}]]>".format(str(value)) + root.append(CDATA(value)) else: root.set(key, str(value)) return root -- GitLab