|
|
@@ -0,0 +1,49 @@
|
|
|
+from mopidy.backend import LibraryProvider
|
|
|
+from mopidy.models import Ref
|
|
|
+
|
|
|
+class SmartLibrary(LibraryProvider):
|
|
|
+ def __init__(self, backend, config):
|
|
|
+ super().__init__(backend)
|
|
|
+ self.config = config
|
|
|
+
|
|
|
+ def browse(self, uri):
|
|
|
+ if uri == "smart:":
|
|
|
+ return [
|
|
|
+ Ref.directory(uri="smart:genres", name="Genres"),
|
|
|
+ Ref.directory(uri="smart:artists", name="Artists"),
|
|
|
+ ]
|
|
|
+
|
|
|
+ if uri == "smart:genres":
|
|
|
+ return [
|
|
|
+ Ref.directory(uri=f"smart:genre:{g}", name=g.title())
|
|
|
+ for g in ["rock", "jazz", "blues"]
|
|
|
+ ]
|
|
|
+
|
|
|
+ if uri.startswith("smart:genre:"):
|
|
|
+ genre = uri.split(":", 2)[2]
|
|
|
+ tracks = self._tracks_for_genre(genre)
|
|
|
+ return [
|
|
|
+ Ref.track(uri=t.uri, name=t.name)
|
|
|
+ for t in tracks
|
|
|
+ ]
|
|
|
+
|
|
|
+ return []
|
|
|
+
|
|
|
+ def lookup(self, uri):
|
|
|
+ # return full Track models for playback
|
|
|
+ if uri.startswith("smart:genre:"):
|
|
|
+ genre = uri.split(":", 2)[2]
|
|
|
+ return self._tracks_for_genre(genre)
|
|
|
+
|
|
|
+ return []
|
|
|
+
|
|
|
+ def _tracks_for_genre(self, genre):
|
|
|
+ # WORKS: Use Mopidy’s global search API
|
|
|
+ results = self.backend.actor.root.actor.library.search(
|
|
|
+ {"genre": [genre]}
|
|
|
+ )
|
|
|
+ tracks = []
|
|
|
+ for r in results:
|
|
|
+ if r.tracks:
|
|
|
+ tracks.extend(r.tracks)
|
|
|
+ return tracks[:50] # enforce max
|