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