X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Flib%2Fplayer.py;h=721d9a67e017e2cae2ad040a795669609efeaac4;hb=1c01e4a7aa37eeef825c6918fc90b154a7f4ccc7;hp=c5c69f86a29f44f57eed9ee6b892a37c24a767f2;hpb=1cc879f39941fc302f9a841a532c9f749797cca4;p=mpd-sima.git diff --git a/sima/lib/player.py b/sima/lib/player.py index c5c69f8..721d9a6 100644 --- a/sima/lib/player.py +++ b/sima/lib/player.py @@ -1,22 +1,79 @@ # -*- coding: utf-8 -*- +# Copyright (c) 2009-2014 Jack Kaliko +# +# This file is part of sima +# +# sima is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# sima is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with sima. If not, see . +# +# # TODO: # Add decorator to filter through history? -from sima.lib.track import Track +# standard library import +import logging +from itertools import dropwhile + +# local import + +def blacklist(artist=False, album=False, track=False): + #pylint: disable=C0111,W0212 + field = (album, track) + def decorated(func): + def wrapper(*args, **kwargs): + if not args[0].database: + return func(*args, **kwargs) + cls = args[0] + boolgen = (bl for bl in field) + bl_fun = (cls.database.get_bl_album, + cls.database.get_bl_track,) + #bl_getter = next(fn for fn, bl in zip(bl_fun, boolgen) if bl is True) + bl_getter = next(dropwhile(lambda _: not next(boolgen), bl_fun)) + #cls.log.debug('using {0} as bl filter'.format(bl_getter.__name__)) + results = list() + for elem in func(*args, **kwargs): + if bl_getter(elem, add_not=True): + #cls.log.debug('Blacklisted "{0}"'.format(elem)) + continue + if track and cls.database.get_bl_album(elem, add_not=True): + # filter album as well in track mode + # (artist have already been) + cls.log.debug('Blacklisted alb. "{0.album}"'.format(elem)) + continue + results.append(elem) + return results + return wrapper + return decorated class Player(object): - """Player interface to inherit from. - When querying palyer music library for tracks, Player instance *must* return + When querying player music library for tracks, Player instance *must* return Track objects (usually a list of them) + + Player instance should expose the following immutable attributes: + * artists + * state + * current + * queue + * playlist """ def __init__(self): - self.state = {} - self.current = {} + super().__init__() + self.log = logging.getLogger('sima') def monitor(self): """Monitor player for change @@ -28,6 +85,10 @@ class Player(object): """ raise NotImplementedError + def clean(self): + """Any cleanup necessary""" + pass + def remove(self, position=0): """Removes the oldest element of the playlist (index 0) """ @@ -36,8 +97,8 @@ class Player(object): def find_track(self, artist, title=None): """ Find tracks for a specific artist or filtering with a track title - >>> player.find_track('The Beatles') - >>> player.find_track('Nirvana', title='Smells Like Teen Spirit') + >>> player.find_track(Artist('The Beatles')) + >>> player.find_track(Artist('Nirvana'), title='Smells Like Teen Spirit') Returns a list of Track objects """ @@ -46,10 +107,33 @@ class Player(object): def find_album(self, artist, album): """ Find tracks by track's album name - >>> player.find_track('Nirvana', 'Nevermind') + >>> player.find_album('Nirvana', 'Nevermind') Returns a list of Track objects """ + raise NotImplementedError + + def search_albums(self, artist): + """ + Find albums by artist's name + >>> art = Artist(name='Nirvana') + >>> player.search_albums(art) + + Returns a list of string objects + """ + raise NotImplementedError + + def search_artist(self, artist): + """ + Search artists based on a fuzzy search in the media library + >>> art = Artist(name='the beatles', mbid=) # mbid optional + >>> bea = player.search_artist(art) + >>> print(bea.names) + >>> ['The Beatles', 'Beatles', 'the beatles'] + + Returns an Artist object + """ + raise NotImplementedError def disconnect(self): """Closing client connection with the Player @@ -61,6 +145,30 @@ class Player(object): """ raise NotImplementedError + @property + def artists(self): + #pylint: disable=C0111 + raise NotImplementedError + + @property + def state(self): + #pylint: disable=C0111 + raise NotImplementedError + + @property + def current(self): + #pylint: disable=C0111 + raise NotImplementedError + + @property + def queue(self): + #pylint: disable=C0111 + raise NotImplementedError + + @property + def playlist(self): + #pylint: disable=C0111 + raise NotImplementedError + # VIM MODLINE # vim: ai ts=4 sw=4 sts=4 expandtab -