from mopidy.models import Playlist class SmartPlaylistsProvider(PlaylistProvider): def __init__(self, backend, config): super().__init__(backend=backend) self.config = config self.max_tracks = int(config.get("max_tracks") or 50) raw_genres = config.get("genres") or "" self.fixed_genres = [g.strip() for g in raw_genres.split(",") if g.strip()] def as_list(self): """Return available playlists""" playlists = [ Playlist(uri=f"smart:genre:{g}", name=f"[Smart] Genre: {g.title()}") for g in self.fixed_genres ] return playlists def lookup(self, uri): parts = uri.split(":") if len(parts) < 3 or parts[1] != "genre": return None genre = ":".join(parts[2:]) return self._playlist_for_genre(uri, genre) def _playlist_for_genre(self, uri, genre): """Search the library for tracks with the specified genre""" tracks = [] query = {"genre": [genre]} for result in self.backend.library.search(query): for t in result.tracks: tracks.append(t) if len(tracks) >= self.max_tracks: break if len(tracks) >= self.max_tracks: break return Playlist(uri=uri, name=f"[Smart] Genre: {genre}", tracks=tracks[:self.max_tracks])