tidalf/plugin.audio.qobuz

View on GitHub
resources/lib/qobuz/node/artist.py

Summary

Maintainability
B
6 hrs
Test Coverage
'''
    qobuz.node.artist
    ~~~~~~~~~~~~~~~~~

    :part_of: kodi-qobuz
    :copyright: (c) 2012-2018 by Joachim Basmaison, Cyril Leclerc
    :license: GPLv3, see LICENSE for more details.
'''
from kodi_six import xbmcgui  # pylint:disable=E0401

from qobuz.api import api
from qobuz.debug import getLogger
from qobuz.gui.contextmenu import contextMenu
from qobuz.gui.util import getImage
from qobuz.node import Flag, helper
from qobuz.node.inode import INode

logger = getLogger(__name__)


def helper_album_list_genre(data, default=None):
    default = [] if default is None else default
    if data is None or 'albums' not in data:
        return default
    genres = {}
    for album in data['albums']['items']:
        if 'genre' not in album:
            continue
        genres[album['genre']['name']] = 1
    return genres.keys()


class Node_artist(INode):
    def __init__(self, parent=None, parameters=None, data=None):
        parameters = {} if parameters is None else parameters
        super(Node_artist, self).__init__(
            parent=parent, parameters=parameters, data=data)
        self.nt = Flag.ARTIST
        self.content_type = 'artists'
        self.nid = self.get_parameter('nid', default=None)

    def fetch(self, options=None):
        return api.get('/artist/get', artist_id=self.nid, extra='albums')

    def populate(self, options=None):
        albums = self.get_property('albums/items')
        if len(albums) == 0:
            return False
        for album in albums:
            node = helper.get_node_album(album)
            self.add_child(node)
        return True

    def get_artist_id(self):
        return self.nid

    def get_image(self):
        return self.get_property(
            [
                'image/extralarge', 'image/mega', 'image/large',
                'image/medium', 'image/small', 'picture'
            ],
            default=getImage('artist'))

    def get_label(self, default=None):
        fmt = '%a (%C)'
        fmt = fmt.replace(
            '%Cc',
            self.get_property(
                'albums_as_primary_composer_count', default='0', to='string'))
        fmt = fmt.replace(
            '%Ca',
            self.get_property(
                'albums_as_primary_artist_count', default='0', to='string'))
        fmt = fmt.replace('%a', self.get_artist())
        fmt = fmt.replace('%G', self.get_genre())
        fmt = fmt.replace(
            '%C', str(self.get_property(
                'albums_count', default=0)))
        return fmt

    def get_title(self):
        return self.get_name()

    def get_artist(self):
        return self.get_name()

    def get_name(self):
        return self.get_property('name')

    def get_genre(self):
        return ', '.join(helper_album_list_genre(self.data))

    def get_owner(self):
        return self.get_property('owner/name')

    def get_description(self):
        return self.get_property(
            'biography/content', default='', to='strip_html')

    def makeListItem(self, **ka):
        replaceItems = ka['replaceItems'] if 'replaceItems' in ka else False
        genre = self.get_genre()
        item = xbmcgui.ListItem(self.get_label(),
                                self.get_label(),
                                self.get_image(),
                                self.get_image(), self.make_url())
        if not item:
            logger.warn('Error: Cannot make xbmc list item')
            return None
        item.setPath(self.make_url())
        item.setInfo(
            'Music',
            infoLabels={
                'artist': self.get_artist(),
                'genre': genre,
                'comment': self.get_description()
            })
        ctxMenu = contextMenu()
        self.attach_context_menu(item, ctxMenu)
        item.addContextMenuItems(ctxMenu.getTuples(), replaceItems)
        return item