diff --git a/api/funkwhale_api/subsonic/renderers.py b/api/funkwhale_api/subsonic/renderers.py index ceab2c5eed06c56a8dce6ef035140044fef823a9..b628f9c61f20687156999757e1c9ac88d606eed8 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