|
|
@@ -1,36 +1,37 @@
|
|
|
-from mopidy.models import Playlist, Track
|
|
|
-from mopidy.backend import PlaylistProvider
|
|
|
-from .mb_client import get_similar_artists, get_genre_tracks
|
|
|
+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):
|
|
|
- playlists = []
|
|
|
-
|
|
|
- # Genres
|
|
|
- for genre in ["rock", "jazz", "hiphop", "blues"]:
|
|
|
- playlists.append(
|
|
|
- Playlist(uri=f"smart:genre:{genre}", name=f"Genre: {genre.title()}")
|
|
|
- )
|
|
|
-
|
|
|
- # Example artist radios
|
|
|
- playlists.append(
|
|
|
- Playlist(uri="smart:artist:radio:MBID123", name="Artist Radio: Example")
|
|
|
- )
|
|
|
-
|
|
|
+ """Return available playlists"""
|
|
|
+ playlists = [
|
|
|
+ Playlist(uri=f"smart:genre:{g}", name=f"Genre: {g.title()}")
|
|
|
+ for g in self.fixed_genres
|
|
|
+ ]
|
|
|
return playlists
|
|
|
|
|
|
def lookup(self, uri):
|
|
|
parts = uri.split(":")
|
|
|
- typ = parts[1]
|
|
|
-
|
|
|
- if typ == "genre":
|
|
|
- genre = parts[2]
|
|
|
- tracks = get_genre_tracks(genre)
|
|
|
- elif typ == "artist" and parts[2] == "radio":
|
|
|
- mbid = parts[3]
|
|
|
- tracks = get_similar_artists(mbid)
|
|
|
- else:
|
|
|
+ if len(parts) < 3 or parts[1] != "genre":
|
|
|
return None
|
|
|
-
|
|
|
- return Playlist(uri=uri, name="Generated", tracks=tracks)
|
|
|
+ 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])
|