Skip to content
Snippets Groups Projects
renderers.py 2.04 KiB
Newer Older
import xml.etree.ElementTree as ET

from rest_framework import renderers


class SubsonicJSONRenderer(renderers.JSONRenderer):
    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 = {
            "subsonic-response": {
                "status": "ok",
                "version": "1.16.0",
                "type": "funkwhale",
                "funkwhale-version": funkwhale_api.__version__,
            }
        }
Eliot Berriot's avatar
Eliot Berriot committed
        final["subsonic-response"].update(data)
        if "error" in final:
            # an error was returned
Eliot Berriot's avatar
Eliot Berriot committed
            final["subsonic-response"]["status"] = "failed"
        return super().render(final, accepted_media_type, renderer_context)


class SubsonicXMLRenderer(renderers.JSONRenderer):
Eliot Berriot's avatar
Eliot Berriot committed
    media_type = "text/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 = {
Eliot Berriot's avatar
Eliot Berriot committed
            "xmlns": "http://subsonic.org/restapi",
            "status": "ok",
            "version": "1.16.0",
Eliot Berriot's avatar
Eliot Berriot committed
        if "error" in final:
            # an error was returned
Eliot Berriot's avatar
Eliot Berriot committed
            final["status"] = "failed"
        tree = dict_to_xml_tree("subsonic-response", final)
        return b'<?xml version="1.0" encoding="UTF-8"?>\n' + ET.tostring(
            tree, encoding="utf-8"
        )


def dict_to_xml_tree(root_tag, d, parent=None):
    root = ET.Element(root_tag)
    for key, value in d.items():
        if isinstance(value, dict):
            root.append(dict_to_xml_tree(key, value, parent=root))
        elif isinstance(value, list):
            for obj in value:
                root.append(dict_to_xml_tree(key, obj, parent=root))
        else:
            root.set(key, str(value))
    return root