X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Fplugins%2Finternal%2Frandomfallback.py;h=ee0be20b78822ed645a92bf754a93aab0d91646a;hb=c2c435f2d5a6e13d610f91d16764a62ae6cb315a;hp=12673de22c6489ccf5c850eb2a9495270a39f453;hpb=24993cd99b847733894f57fd004ed52b5390244a;p=mpd-sima.git diff --git a/sima/plugins/internal/randomfallback.py b/sima/plugins/internal/randomfallback.py index 12673de..ee0be20 100644 --- a/sima/plugins/internal/randomfallback.py +++ b/sima/plugins/internal/randomfallback.py @@ -28,10 +28,14 @@ import random # local import from ...lib.plugin import Plugin -from ...lib.track import Track +from ...lib.meta import Artist class RandomFallBack(Plugin): + """Add random track as fallback + TODO: refactor, this plugin does not look good to me. + callback_need_track_fb/get_trk articulation is not elegant at all + """ def __init__(self, daemon): super().__init__(daemon) @@ -39,9 +43,9 @@ class RandomFallBack(Plugin): if not self.plugin_conf: return self.mode = self.plugin_conf.get('flavour', None) - if self.mode not in ['pure', 'sensible', 'genre']: + if self.mode not in ['pure', 'sensible']: self.log.warning('Bad value for flavour, ' - '{} not in ["pure", "sensible", "genre"]'.format(self.mode)) + '"{}" not in ["pure", "sensible"]'.format(self.mode)) self.mode = 'pure' def get_played_artist(self,): @@ -50,21 +54,46 @@ class RandomFallBack(Plugin): duration = self.daemon.config.getint('sima', 'history_duration') tracks_from_db = self.daemon.sdb.get_history(duration=duration) # Construct Track() objects list from database history - artists = [ tr[-1] for tr in tracks_from_db ] + artists = [tr[-1] for tr in tracks_from_db] return set(artists) def callback_need_track_fb(self): - art = random.choice(self.player.list('artist')) - self.log.debug('Random art: {}'.format(art)) - if self.mode == 'sensitive': + trks = list() + target = self.plugin_conf.getint('track_to_add') + limit = 0 + while len(trks) < target: + trk = self.get_trk() + if trk: + trks.append(trk) + else: + limit += 1 + if limit > 3: + return trks + return trks + + def get_trk(self): + """Get a single track according to random flavour + """ + trk = None + art = None + artists = list(self.player.artists) + if self.mode == 'sensible': played_art = self.get_played_artist() - while 42: - art = random.choice(self.player.list('artist')) + while artists: + art = random.choice(artists) if art not in played_art: break - trk = random.choice(self.player.find_track(art)) - self.log.info('random fallback ({}): {}'.format(self.mode, trk)) - return [trk] + artists.pop(art) + elif self.mode == 'pure': + art = random.choice(artists) + if art is None: + return None + self.log.debug('Random art: {}'.format(art)) + trks = self.player.find_track(Artist(art)) + if trks: + trk = random.choice(trks) + self.log.info('random fallback ({}): {}'.format(self.mode, trk)) + return trk