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