#!/usr/bin/env python3
"""Gerbera: UPnP search results contain only the TITLE tag."""
from io import BytesIO
from pathlib import Path
import sys
import xml.etree.ElementTree as ET


def configure(data):
    for _, (prefix, uri) in ET.iterparse(BytesIO(data), events=('start-ns',)):
        if not (prefix.startswith('ns') and prefix[2:].isdigit()):
            ET.register_namespace(prefix, uri)
    parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True))
    root = ET.fromstring(data, parser=parser)
    namespace = root.tag.split('}')[0] + '}' if root.tag.startswith('{') else ''
    servers = root.findall(namespace + 'server')
    if len(servers) != 1:
        raise ValueError('Erwartet wird genau ein server-Abschnitt.')
    server = servers[0]
    upnps = server.findall(namespace + 'upnp')
    if len(upnps) > 1:
        raise ValueError('Mehrere upnp-Abschnitte: keine Änderung.')
    upnp = upnps[0] if upnps else ET.SubElement(server, namespace + 'upnp')
    for old in upnp.findall(namespace + 'search-item-result'):
        upnp.remove(old)
    setting = ET.SubElement(upnp, namespace + 'search-item-result', {'extend': 'no'})
    ET.SubElement(setting, namespace + 'add-data', {'tag': 'M_TITLE'})
    ET.indent(root, space='  ')
    result = ET.tostring(root, encoding='utf-8', xml_declaration=True) + b'\n'
    ET.fromstring(result)
    return result


if __name__ == '__main__':
    path = Path(sys.argv[1] if len(sys.argv) > 1 else '/etc/gerbera/config.xml')
    data = configure(path.read_bytes())
    path.write_bytes(data)
    print('Gerbera-Suchantwort auf M_TITLE umgestellt. Bitte Gerbera neu starten.')
