diff --git a/src/mopidy_smartplaylists/static/index.html b/src/mopidy_smartplaylists/static/index.html index 7fb91dd..8f8e7dc 100644 --- a/src/mopidy_smartplaylists/static/index.html +++ b/src/mopidy_smartplaylists/static/index.html @@ -236,10 +236,10 @@

Instant Mix

-

Generate a mix or insert into queue based on a track URI (same genre + similar artists).

+

Generate a mix from a track, album, artist, or playlist URI (same genre + similar artists).

- +
diff --git a/src/mopidy_smartplaylists/web.py b/src/mopidy_smartplaylists/web.py index 593b2e2..0b6f54c 100644 --- a/src/mopidy_smartplaylists/web.py +++ b/src/mopidy_smartplaylists/web.py @@ -166,30 +166,24 @@ class InstantMixHandler(tornado.web.RequestHandler): def post(self) -> None: data = json.loads(self.request.body) - track_uri = data.get("uri", "") + uri = data.get("uri", "") limit = data.get("limit", 50) - if not track_uri: + if not uri: self.set_status(400) self.write({"error": "Missing 'uri' in request body"}) return - tracks = build_instant_mix(self.core, track_uri, limit, uris=self.uris) + + seed = self._resolve_seed_track(uri) + if not seed or not seed.uri: + self.write({"playlist": None, "tracks": 0}) + return + + tracks = build_instant_mix(self.core, seed.uri, limit, uris=self.uris) if not tracks: self.write({"playlist": None, "tracks": 0}) return - try: - lookup_result = self.core.library.lookup([track_uri]).get() - except Exception: - logger.exception("Track lookup failed for %s", track_uri) - self.write({"playlist": None, "tracks": 0}) - return - seed_name = "Instant Mix" - for uri_tracks in lookup_result.values(): - for t in uri_tracks: - if t.name: - seed_name = t.name - break - + seed_name = seed.name or "Instant Mix" playlist = save_smart_playlist( self.core, self.prefix, f"Instant Mix: {seed_name}", tracks, playlist_dir=self.playlist_dir, @@ -204,6 +198,25 @@ class InstantMixHandler(tornado.web.RequestHandler): } ) + def _resolve_seed_track(self, uri: str): + try: + lookup = self.core.library.lookup([uri]).get() + except Exception: + lookup = None + if lookup: + tracks = [t for ts in lookup.values() for t in (ts or []) if t.uri] + if tracks: + return random.choice(tracks) + try: + pl = self.core.playlists.lookup(uri).get() + except Exception: + pl = None + if pl and pl.tracks: + valid = [t for t in pl.tracks if t.uri] + if valid: + return random.choice(valid) + return None + class PlaylistMixHandler(tornado.web.RequestHandler): def initialize(