library.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from mopidy.backend import LibraryProvider
  2. from mopidy.models import Ref
  3. class SmartLibrary(LibraryProvider):
  4. def __init__(self, backend, config):
  5. super().__init__(backend)
  6. self.config = config
  7. def browse(self, uri):
  8. if uri == "smart:":
  9. return [
  10. Ref.directory(uri="smart:genres", name="Genres"),
  11. Ref.directory(uri="smart:artists", name="Artists"),
  12. ]
  13. if uri == "smart:genres":
  14. return [
  15. Ref.directory(uri=f"smart:genre:{g}", name=g.title())
  16. for g in ["rock", "jazz", "blues"]
  17. ]
  18. if uri.startswith("smart:genre:"):
  19. genre = uri.split(":", 2)[2]
  20. tracks = self._tracks_for_genre(genre)
  21. return [
  22. Ref.track(uri=t.uri, name=t.name)
  23. for t in tracks
  24. ]
  25. return []
  26. def lookup(self, uri):
  27. # return full Track models for playback
  28. if uri.startswith("smart:genre:"):
  29. genre = uri.split(":", 2)[2]
  30. return self._tracks_for_genre(genre)
  31. return []
  32. def _tracks_for_genre(self, genre):
  33. # WORKS: Use Mopidy’s global search API
  34. results = self.backend.actor.root.actor.library.search(
  35. {"genre": [genre]}
  36. )
  37. tracks = []
  38. for r in results:
  39. if r.tracks:
  40. tracks.extend(r.tracks)
  41. return tracks[:50] # enforce max