class Main:

    def __init__(self):
        xbmcplugin.setContent(HANDLE, 'audio')

        self.curl = HTTPComm()
        self.name = ARGS.get('foldername', None)
        self.mode = ARGS.get('mode', None)
        self.thumbnailImage = 'special://home/addons/%s/icon.png' % ADDON_ID


    def run(self):

        if self.mode is None:

            # Create streams directory
            url = self.build_url({'mode': 'folder', 'foldername': 'streams'})
            li = xbmcgui.ListItem(ADDON.getLocalizedString(30100), iconImage='DefaultFolder.png')
            xbmcplugin.addDirectoryItem(handle=HANDLE, url=url, listitem=li, isFolder=True)

            # Create queue directory
            url = self.build_url({'mode': 'folder', 'foldername': 'queue'})
            li = xbmcgui.ListItem(ADDON.getLocalizedString(30101), iconImage='DefaultFolder.png')
            xbmcplugin.addDirectoryItem(handle=HANDLE, url=url, listitem=li, isFolder=True)
            xbmcplugin.endOfDirectory(HANDLE)

        elif self.mode[0] == 'folder' and self.name[0] == 'streams':

            streams = self.get_streams()
            for stream in streams:
                li = xbmcgui.ListItem(stream['name'], iconImage='DefaultAudio.png', thumbnailImage=self.thumbnailImage)
                li.setInfo(type="Music", infoLabels={"Size": stream['bitrate'] * 1024})
                li.setProperty("IsPlayable", "true")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url=stream['url'], listitem=li, isFolder=False)

            xbmcplugin.endOfDirectory(HANDLE)

        elif self.mode[0] == 'folder' and self.name[0] == 'queue':

            history = self.get_history()

            # Currently Playing
            self.add_heading(ADDON.getLocalizedString(30200))
            for item in history[0]:
                li = xbmcgui.ListItem(item["artist"] + " - " + item["song"], thumbnailImage=self.thumbnailImage)
                li.setProperty("IsPlayable", "false")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)


            # Queue
            self.add_heading(ADDON.getLocalizedString(30201), True)
            for item in history[1]:
                li = xbmcgui.ListItem(item["artist"] + " - " + item["song"], thumbnailImage=self.thumbnailImage)
                li.setProperty("IsPlayable", "false")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)


            # History
            self.add_heading(ADDON.getLocalizedString(30202), True)
            for item in history[2]:
                li = xbmcgui.ListItem(item["artist"] + " - " + item["song"], thumbnailImage=self.thumbnailImage)
                li.setProperty("IsPlayable", "false")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)

            xbmcplugin.endOfDirectory(HANDLE)

        else:

            # Add items
            url = 'http://necta.pedroja.tech/necta192.mp3'
            li = xbmcgui.ListItem(ADDON.getLocalizedString(30199), iconImage='DefaultAudio.png')


            xbmcplugin.addDirectoryItem(handle=HANDLE, url=url, listitem=li, isFolder=False)
            xbmcplugin.endOfDirectory(HANDLE)


    def build_url(self, query):
        return BASE_URL + '?' + urllib.urlencode(query)

    def get_streams(self):
        streams = []
        xml = self.curl.request(pluginConfig.get('urls', 'stream_xml'), 'get')
        dom = minidom.parseString(xml)

        for node in dom.getElementsByTagName('stream'):
            id = node.attributes["id"].value
            name = node.getElementsByTagName('name')[0].firstChild.nodeValue
            url = node.getElementsByTagName('url')[0].firstChild.nodeValue
            bitrate = int(node.getElementsByTagName('bitrate')[0].firstChild.nodeValue)
            country = node.getElementsByTagName('country')[0].firstChild.nodeValue
            type = node.getElementsByTagName('type')[0].firstChild.nodeValue

            streams.append({"id": id, "name": name, "url": url, 'bitrate': bitrate, 'country': country, 'type': type})

        streams = sorted(streams, key=lambda d: (d['name'][:6].lower(), -d['bitrate'])) #itemgetter('bitrate')
        return streams

    def get_history(self):
        current = []
        queue = []
        history = []

        xml = self.curl.request(pluginConfig.get('urls', 'history_xml'), 'get')
        dom = minidom.parseString(xml)

        # Currently Playing

        currentsong = dom.getElementsByTagName('now')[0]
        artist = currentsong.getElementsByTagName('artist')[0].firstChild.nodeValue
        song = currentsong.getElementsByTagName('song')[0].firstChild.nodeValue
        current.append({"artist": artist, "song": song})

        # Read queue

        for entry in dom.getElementsByTagName('queue')[0].getElementsByTagName('entry'):
            artist = entry.getElementsByTagName('artist')[0].firstChild.nodeValue
            song = entry.getElementsByTagName('song')[0].firstChild.nodeValue
            play_start = entry.getElementsByTagName('playstart')[0].firstChild.nodeValue
            queue.append({"artist": artist, "song": song, "play_start": play_start})

        # Read history

        for entry in dom.getElementsByTagName('history')[0].getElementsByTagName('entry'):
            artist = entry.getElementsByTagName('artist')[0].firstChild.nodeValue
            song = entry.getElementsByTagName('song')[0].firstChild.nodeValue
            play_start = entry.getElementsByTagName('playstart')[0].firstChild.nodeValue
            history.append({"artist": artist, "song": song, "play_start": play_start})

        return [current, queue, history]

    def add_heading(self, title, linebreak=False):
        # Linebreak
        if linebreak:
            li = xbmcgui.ListItem(thumbnailImage=self.thumbnailImage)
            li.setProperty("IsPlayable", "false")
            xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)

        li = xbmcgui.ListItem(label="[COLOR FF007EFF]" + title + "[/COLOR]", thumbnailImage=self.thumbnailImage)
        li.setProperty("IsPlayable", "false")
        xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)
class Main:

    def __init__(self):
        xbmcplugin.setContent(HANDLE, 'audio')

        self.curl = HTTPComm()
        self.name = ARGS.get('foldername', None)
        self.mode = ARGS.get('mode', None)
        self.thumbnailImage = 'special://home/addons/%s/icon.png' % ADDON_ID


    def run(self):

        if self.mode is None:

            # Create streams directory
            url = self.build_url({'mode': 'folder', 'foldername': 'streams'})
            li = xbmcgui.ListItem(ADDON.getLocalizedString(30100), iconImage='DefaultFolder.png')
            xbmcplugin.addDirectoryItem(handle=HANDLE, url=url, listitem=li, isFolder=True)

            # Create queue directory
            url = self.build_url({'mode': 'folder', 'foldername': 'queue'})
            li = xbmcgui.ListItem(ADDON.getLocalizedString(30101), iconImage='DefaultFolder.png')
            xbmcplugin.addDirectoryItem(handle=HANDLE, url=url, listitem=li, isFolder=True)
            xbmcplugin.endOfDirectory(HANDLE)

        elif self.mode[0] == 'folder' and self.name[0] == 'streams':

            streams = self.get_streams()
            for stream in streams:
                li = xbmcgui.ListItem(stream['name'], iconImage='DefaultAudio.png', thumbnailImage=self.thumbnailImage)
                li.setInfo(type="Music", infoLabels={"Size": stream['bitrate'] * 1024})
                li.setProperty("IsPlayable", "true")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url=stream['url'], listitem=li, isFolder=False)

            xbmcplugin.endOfDirectory(HANDLE)

        elif self.mode[0] == 'folder' and self.name[0] == 'queue':

            history = self.get_history()

            # Currently Playing
            self.add_heading(ADDON.getLocalizedString(30200))
            for item in history[0]:
                li = xbmcgui.ListItem(item["artist"] + " - " + item["song"], thumbnailImage=self.thumbnailImage)
                li.setProperty("IsPlayable", "false")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)


            # Queue
            self.add_heading(ADDON.getLocalizedString(30201), True)
            for item in history[1]:
                li = xbmcgui.ListItem(item["artist"] + " - " + item["song"], thumbnailImage=self.thumbnailImage)
                li.setProperty("IsPlayable", "false")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)


            # History
            self.add_heading(ADDON.getLocalizedString(30202), True)
            for item in history[2]:
                li = xbmcgui.ListItem(item["artist"] + " - " + item["song"], thumbnailImage=self.thumbnailImage)
                li.setProperty("IsPlayable", "false")
                xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)

            xbmcplugin.endOfDirectory(HANDLE)

        else:

            # Add items
            url = 'http://no.scenemusic.net:9000/necta.m3u'
            li = xbmcgui.ListItem(ADDON.getLocalizedString(30199), iconImage='DefaultAudio.png')


            xbmcplugin.addDirectoryItem(handle=HANDLE, url=url, listitem=li, isFolder=False)
            xbmcplugin.endOfDirectory(HANDLE)


    def build_url(self, query):
        return BASE_URL + '?' + urllib.urlencode(query)

    def get_streams(self):
        streams = []
        xml = self.curl.request(pluginConfig.get('urls', 'stream_xml'), 'get')
        dom = minidom.parseString(xml)

        for node in dom.getElementsByTagName('stream'):
            id = node.attributes["id"].value
            name = node.getElementsByTagName('name')[0].firstChild.nodeValue
            url = node.getElementsByTagName('url')[0].firstChild.nodeValue
            bitrate = int(node.getElementsByTagName('bitrate')[0].firstChild.nodeValue)
            country = node.getElementsByTagName('country')[0].firstChild.nodeValue
            type = node.getElementsByTagName('type')[0].firstChild.nodeValue

            streams.append({"id": id, "name": name, "url": url, 'bitrate': bitrate, 'country': country, 'type': type})

        streams = sorted(streams, key=lambda d: (d['name'][:6].lower(), -d['bitrate'])) #itemgetter('bitrate')
        return streams

    def get_history(self):
        current = []
        queue = []
        history = []

        xml = self.curl.request(pluginConfig.get('urls', 'history_xml'), 'get')
        dom = minidom.parseString(xml)

        # Currently Playing

        currentsong = dom.getElementsByTagName('now')[0]
        artist = currentsong.getElementsByTagName('artist')[0].firstChild.nodeValue
        song = currentsong.getElementsByTagName('song')[0].firstChild.nodeValue
        current.append({"artist": artist, "song": song})

        # Read queue

        for entry in dom.getElementsByTagName('queue')[0].getElementsByTagName('entry'):
            artist = entry.getElementsByTagName('artist')[0].firstChild.nodeValue
            song = entry.getElementsByTagName('song')[0].firstChild.nodeValue
            play_start = entry.getElementsByTagName('playstart')[0].firstChild.nodeValue
            queue.append({"artist": artist, "song": song, "play_start": play_start})

        # Read history

        for entry in dom.getElementsByTagName('history')[0].getElementsByTagName('entry'):
            artist = entry.getElementsByTagName('artist')[0].firstChild.nodeValue
            song = entry.getElementsByTagName('song')[0].firstChild.nodeValue
            play_start = entry.getElementsByTagName('playstart')[0].firstChild.nodeValue
            history.append({"artist": artist, "song": song, "play_start": play_start})

        return [current, queue, history]

    def add_heading(self, title, linebreak=False):
        # Linebreak
        if linebreak:
            li = xbmcgui.ListItem(thumbnailImage=self.thumbnailImage)
            li.setProperty("IsPlayable", "false")
            xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)

        li = xbmcgui.ListItem(label="[COLOR FF007EFF]" + title + "[/COLOR]", thumbnailImage=self.thumbnailImage)
        li.setProperty("IsPlayable", "false")
        xbmcplugin.addDirectoryItem(handle=HANDLE, url="nnn", listitem=li, isFolder=False)