Explorar el Código

[playlists] Update playlists to auto generate

Colin Powell hace 3 semanas
padre
commit
dfc6404b01

+ 1 - 7
mopidy_smartplaylists/ext.conf

@@ -1,11 +1,5 @@
 [smartplaylists]
-# Root directory where music files are stored. Required.
-music_directory = /var/lib/mopidy/media
-# Comma-separated file extensions to scan
-scan_extensions = .mp3,.flac
 # Some example genres to expose as top-level playlists. You can still query any genre by URI.
 genres = rock,jazz,blues
 # Maximum number of tracks to return for a generated playlist
-max_tracks = 200
-# Whether to use case-insensitive matching for tags
-case_insensitive = true
+max_tracks = 50

+ 28 - 27
mopidy_smartplaylists/playlists.py

@@ -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"Genre: {genre}", tracks=tracks[:self.max_tracks])

+ 0 - 1
mopidy_smartplaylists/scanner.py

@@ -1 +0,0 @@
-#!/usr/bin/env python3