Source code for rdiosock.metadata

from rdiosock.exceptions import RdioApiError
from rdiosock.objects.collection import RdioList


[docs]class SEARCH_TYPES: """Metadata search types""" NONE = 0 ARTIST = 1 ALBUM = 2 TRACK = 4 PLAYLIST = 8 USER = 16 LABEL = 32 ALL = ( ARTIST | ALBUM | TRACK | PLAYLIST | USER | LABEL ) _MAP = { ARTIST: 'Artist', ALBUM: 'Album', TRACK: 'Track', PLAYLIST: 'Playlist', USER: 'User', LABEL: 'Label' } @classmethod def parse(cls, value): if type(value) is int: value = cls._parse_bit(value) items = [] for key in value: items.append(cls._MAP[key]) return items @classmethod def _parse_bit(cls, value): items = [] for key in cls._MAP: if (value & key) == key: items.append(key) return items
[docs]class SEARCH_EXTRAS: """Metadata search extras""" NONE = 0 LOCATION = 1 USERNAME = 2 STATIONS = 4 DESCRIPTION = 8 FOLLOWER_COUNT = 16 FOLLOWING_COUNT = 32 FAVORITE_COUNT = 64 SET_COUNT = 128 ICON_250x375 = 256 ICON_500x750 = 512 ICON_250x333 = 1024 ICON_500x667 = 2048 ALL = ( LOCATION | USERNAME | STATIONS | DESCRIPTION | FOLLOWER_COUNT | FOLLOWING_COUNT | FAVORITE_COUNT | SET_COUNT | ICON_250x375 | ICON_500x750 | ICON_250x333 | ICON_500x667 ) _MAP = { LOCATION: 'location', USERNAME: 'username', STATIONS: 'stations', DESCRIPTION: 'description', FOLLOWER_COUNT: 'followerCount', FOLLOWING_COUNT: 'followingCount', FAVORITE_COUNT: 'favoriteCount', SET_COUNT: 'setCount', ICON_250x375: 'icon250x375', ICON_500x750: 'icon500x750', ICON_250x333: 'icon250x333', ICON_500x667: 'icon500x667' } @classmethod def parse(cls, value): if type(value) is int: value = cls._parse_bit(value) items = [] for key in value: items.append(cls._MAP[key]) return items @classmethod def _parse_bit(cls, value): items = [] for key in cls._MAP: if (value & key) == key: items.append(key) return items
[docs]class RdioMetadata(object): def __init__(self, sock): """ :type sock: RdioSock """ self._sock = sock
[docs] def search(self, query, search_types=SEARCH_TYPES.ALL, search_extras=SEARCH_EXTRAS.ALL): """Search for media item. :param query: Search query :type query: str :param search_types: Search type (:class:`rdiosock.metadata.SEARCH_TYPES` bitwise-OR or list) :type search_types: int or list of int :param search_extras: Search result extras to include (:class:`rdiosock.metadata.SEARCH_EXTRAS` bitwise-OR or list) :type search_extras: int or list of int """ result = self._sock._api_post('search', { 'query': query, 'types[]': SEARCH_TYPES.parse(search_types) }, secure=False, extras=SEARCH_EXTRAS.parse(search_extras)) if result['status'] == 'error': raise RdioApiError(result) result = result['result'] if result['type'] == 'list': return RdioList.parse(result) else: raise NotImplementedError()