tidalf/plugin.audio.qobuz

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

Summary

Maintainability
C
7 hrs
Test Coverage
'''
    qobuz.node.collection
    ~~~~~~~~~~~~~~~~~~~~~

    :part_of: kodi-qobuz
    :copyright: (c) 2012-2018 by Joachim Basmaison, Cyril Leclerc
    :license: GPLv3, see LICENSE for more details.
'''
from qobuz.api import api
from qobuz.debug import getLogger
from qobuz.gui.util import getImage, lang
from qobuz.node import Flag, getNode
from qobuz.node.inode import INode
from qobuz.util.converter import converter

logger = getLogger(__name__)
dialogHeading = 'Collection'


class Node_collection(INode):
    def __init__(self, parent=None, parameters=None, data=None):
        parameters = {} if parameters is None else parameters
        super(Node_collection, self).__init__(
            parent=parent, parameters=parameters, data=data)
        self.nt = Flag.COLLECTION
        self.url = None
        self.image = getImage('songs')
        self.search_type = self.get_parameter('search-type')
        self.query = self.get_parameter('query', to='unquote')
        self.source = self.get_parameter('source')
        self.content_type = 'albums'

    def get_label(self, default=None):
        if self.search_type is None:
            return lang(30194)
        return '%s - %s' % (lang(30194), self.search_type.capitalize())

    def get_image(self):
        return getImage('album')

    def make_url(self, **ka):
        if self.search_type is not None:
            ka['search-type'] = self.search_type
        query = self.get_parameter('query')
        if self.query is not None:
            ka['query'] = query
        return super(Node_collection, self).make_url(**ka)

    def fetch(self, options=None):
        if self.search_type is None:
            return {}
        query = self.get_parameter('query', to='unquote')
        if not query:
            from qobuz.gui.util import Keyboard
            k = Keyboard('', 'My %s' % self.search_type)
            k.doModal()
            if not k.isConfirmed():
                return None
            query = k.getText().strip()
        if query == '':
            return None
        kwargs = {'query': converter.quote(query)}
        if self.source is not None:
            kwargs['source'] = self.source
        logger.info('SEARCH %s', kwargs)
        if self.search_type == 'albums':
            return api.get('/collection/getAlbums', **kwargs)
        elif self.search_type == 'artists':
            return api.get('/collection/getArtists', **kwargs)
        elif self.search_type == 'tracks':
            return api.get('/collection/getTracks', **kwargs)
        return None

    @classmethod
    def get_description(cls):
        return None

    @classmethod
    def _populate_albums(cls, data=None, parameters=None):
        parameters = {} if parameters is None else parameters
        return getNode(Flag.ALBUM, data=data, parameters=parameters)

    @classmethod
    def _populate_tracks(cls, data=None, parameters=None):
        parameters = {} if parameters is None else parameters
        return getNode(Flag.TRACK, data=data, parameters=parameters)

    @classmethod
    def _populate_artists(cls, data=None, parameters=None):
        parameters = {} if parameters is None else parameters
        return getNode(Flag.ARTIST, data=data, parameters=parameters)

    def populate(self, options=None):
        if self.search_type is None:
            for search_type in ['albums', 'tracks', 'artists']:
                self.add_child(
                    getNode(
                        Flag.COLLECTION,
                        parameters={'search-type': search_type}))
            return True
        if self.data is None:
            return False
        method = getattr(self, '_populate_%s' % self.search_type)
        for item in self.data['items']:
            self.add_child(
                method(
                    data=item,
                    parameters={'query': self.get_parameter('query')}))
        return True