playlists.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. from mopidy.models import Playlist
  2. class SmartPlaylistsProvider(PlaylistProvider):
  3. def __init__(self, backend, config):
  4. super().__init__(backend=backend)
  5. self.config = config
  6. self.max_tracks = int(config.get("max_tracks") or 50)
  7. raw_genres = config.get("genres") or ""
  8. self.fixed_genres = [g.strip() for g in raw_genres.split(",") if g.strip()]
  9. def as_list(self):
  10. """Return available playlists"""
  11. playlists = [
  12. Playlist(uri=f"smart:genre:{g}", name=f"Genre: {g.title()}")
  13. for g in self.fixed_genres
  14. ]
  15. return playlists
  16. def lookup(self, uri):
  17. parts = uri.split(":")
  18. if len(parts) < 3 or parts[1] != "genre":
  19. return None
  20. genre = ":".join(parts[2:])
  21. return self._playlist_for_genre(uri, genre)
  22. def _playlist_for_genre(self, uri, genre):
  23. """Search the library for tracks with the specified genre"""
  24. tracks = []
  25. query = {"genre": [genre]}
  26. for result in self.backend.library.search(query):
  27. for t in result.tracks:
  28. tracks.append(t)
  29. if len(tracks) >= self.max_tracks:
  30. break
  31. if len(tracks) >= self.max_tracks:
  32. break
  33. return Playlist(uri=uri, name=f"Genre: {genre}", tracks=tracks[:self.max_tracks])