[web] Allow direct injection of smart lists to queue
This commit is contained in:
@ -19,6 +19,7 @@ from mopidy_smartplaylists.generators import (
|
|||||||
build_decade_mix,
|
build_decade_mix,
|
||||||
build_genre_mix,
|
build_genre_mix,
|
||||||
build_instant_mix,
|
build_instant_mix,
|
||||||
|
build_smart_queue_tracks,
|
||||||
refresh_smart_playlists,
|
refresh_smart_playlists,
|
||||||
save_smart_playlist,
|
save_smart_playlist,
|
||||||
)
|
)
|
||||||
@ -248,6 +249,76 @@ class InstantMixHandler(tornado.web.RequestHandler):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class QueueInsertNextHandler(tornado.web.RequestHandler):
|
||||||
|
def initialize(
|
||||||
|
self, core: CoreProxy, uris: list[Uri] | None = None,
|
||||||
|
variety_chance: float = 0.15,
|
||||||
|
) -> None:
|
||||||
|
self.core = core
|
||||||
|
self.uris = uris
|
||||||
|
self.variety_chance = variety_chance
|
||||||
|
|
||||||
|
def post(self) -> None:
|
||||||
|
data = json.loads(self.request.body)
|
||||||
|
track_uri = data.get("uri", "")
|
||||||
|
count = data.get("count", 15)
|
||||||
|
if not track_uri:
|
||||||
|
self.set_status(400)
|
||||||
|
self.write({"error": "Missing 'uri' in request body"})
|
||||||
|
return
|
||||||
|
tracks = build_smart_queue_tracks(
|
||||||
|
self.core, track_uri, count,
|
||||||
|
uris=self.uris, variety_chance=self.variety_chance,
|
||||||
|
)
|
||||||
|
if not tracks:
|
||||||
|
self.write({"tracks": 0})
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
current = self.core.playback.get_current_tl_track().get()
|
||||||
|
except Exception:
|
||||||
|
current = None
|
||||||
|
if current:
|
||||||
|
try:
|
||||||
|
idx = self.core.tracklist.index(current).get()
|
||||||
|
except Exception:
|
||||||
|
idx = None
|
||||||
|
if idx is not None:
|
||||||
|
self.core.tracklist.add(tracks, at_position=idx + 1).get()
|
||||||
|
else:
|
||||||
|
self.core.tracklist.add(tracks).get()
|
||||||
|
else:
|
||||||
|
self.core.tracklist.add(tracks).get()
|
||||||
|
self.write({"tracks": len(tracks)})
|
||||||
|
|
||||||
|
|
||||||
|
class QueueInsertEndHandler(tornado.web.RequestHandler):
|
||||||
|
def initialize(
|
||||||
|
self, core: CoreProxy, uris: list[Uri] | None = None,
|
||||||
|
variety_chance: float = 0.15,
|
||||||
|
) -> None:
|
||||||
|
self.core = core
|
||||||
|
self.uris = uris
|
||||||
|
self.variety_chance = variety_chance
|
||||||
|
|
||||||
|
def post(self) -> None:
|
||||||
|
data = json.loads(self.request.body)
|
||||||
|
track_uri = data.get("uri", "")
|
||||||
|
count = data.get("count", 15)
|
||||||
|
if not track_uri:
|
||||||
|
self.set_status(400)
|
||||||
|
self.write({"error": "Missing 'uri' in request body"})
|
||||||
|
return
|
||||||
|
tracks = build_smart_queue_tracks(
|
||||||
|
self.core, track_uri, count,
|
||||||
|
uris=self.uris, variety_chance=self.variety_chance,
|
||||||
|
)
|
||||||
|
if not tracks:
|
||||||
|
self.write({"tracks": 0})
|
||||||
|
return
|
||||||
|
self.core.tracklist.add(tracks).get()
|
||||||
|
self.write({"tracks": len(tracks)})
|
||||||
|
|
||||||
|
|
||||||
class RefreshHandler(tornado.web.RequestHandler):
|
class RefreshHandler(tornado.web.RequestHandler):
|
||||||
def initialize(self, core: CoreProxy, config: Config) -> None:
|
def initialize(self, core: CoreProxy, config: Config) -> None:
|
||||||
self.core = core
|
self.core = core
|
||||||
@ -367,6 +438,10 @@ def app_factory(config: Config, core: CoreProxy) -> list[tuple]:
|
|||||||
{"core": core, "prefix": prefix, "playlist_dir": playlist_dir}),
|
{"core": core, "prefix": prefix, "playlist_dir": playlist_dir}),
|
||||||
(r"/instant-mix", InstantMixHandler,
|
(r"/instant-mix", InstantMixHandler,
|
||||||
{"core": core, "prefix": prefix, "uris": uris, "playlist_dir": playlist_dir}),
|
{"core": core, "prefix": prefix, "uris": uris, "playlist_dir": playlist_dir}),
|
||||||
|
(r"/queue-next", QueueInsertNextHandler,
|
||||||
|
{"core": core, "uris": uris, "variety_chance": 0.15}),
|
||||||
|
(r"/queue-end", QueueInsertEndHandler,
|
||||||
|
{"core": core, "uris": uris, "variety_chance": 0.15}),
|
||||||
(r"/refresh", RefreshHandler, {"core": core, "config": config}),
|
(r"/refresh", RefreshHandler, {"core": core, "config": config}),
|
||||||
(r"/status", StatusHandler, {"core": core, "prefix": prefix}),
|
(r"/status", StatusHandler, {"core": core, "prefix": prefix}),
|
||||||
(r"/smart-queue", SmartQueueControlHandler, {}),
|
(r"/smart-queue", SmartQueueControlHandler, {}),
|
||||||
|
|||||||
Reference in New Issue
Block a user