diff options
Diffstat (limited to 'backend.py')
| -rw-r--r-- | backend.py | 63 |
1 files changed, 52 insertions, 11 deletions
@@ -10,6 +10,8 @@ import os app = Flask(__name__) print_lock = threading.Lock() +music_process = None + load_dotenv("/srv/automation/remote-automation/.env") @app.get("/automate/hack_this_club") @@ -45,10 +47,12 @@ def print_queue(): @app.get("/automate/music") def music(): - NAVIDROME_URL = os.environ.get("NAVIDROME_URL", "127.0.0.1") - USERNAME = os.environ.get("NAVIDROME_USER", "user") - PASSWORD = os.environ.get("NAVIDROME_PASSWORD", "password123") - PLAYLIST_ID = os.environ.get("NAVIDROME_PLAYLIST_ID", "6767baldniko67") + global music_process + + NAVIDROME_URL = os.environ["NAVIDROME_URL"] + USERNAME = os.environ["NAVIDROME_USER"] + PASSWORD = os.environ["NAVIDROME_PASSWORD"] + PLAYLIST_ID = os.environ["NAVIDROME_PLAYLIST_ID"] params = { "u": USERNAME, @@ -60,12 +64,22 @@ def music(): "id": PLAYLIST_ID, } - response = requests.get(f"{NAVIDROME_URL}/rest/getPlaylist.view", params=params) + response = requests.get( + f"{NAVIDROME_URL}/rest/getPlaylist.view", + params=params, + ) response.raise_for_status() - songs = response.json()["subsonic-response"]["playlist"]["entry"] + data = response.json()["subsonic-response"] + + if data["status"] != "ok": + return {"status": "error", "message": data.get("error", {})}, 500 + + songs = data["playlist"]["entry"] song = random.choice(songs) + stream_url = f"{NAVIDROME_URL}/rest/stream.view" + stream_params = { "u": USERNAME, "p": PASSWORD, @@ -75,19 +89,46 @@ def music(): "id": song["id"], } - stream_url = f"{NAVIDROME_URL}/rest/stream.view" + stream_request = requests.Request( + "GET", + stream_url, + params=stream_params, + ).prepare() - subprocess.Popen([ + # Stop previous song + if music_process and music_process.poll() is None: + music_process.terminate() + + music_process = subprocess.Popen([ "mpv", "--no-video", "--audio-device=pipewire", "--", - requests.Request("GET", stream_url, params=stream_params).prepare().url, - ]) + stream_request.url, + ]) print(f"Playing: {song['title']} - {song.get('artist', 'Unknown Artist')}") - return f"Playing: {song['title']} - {song.get('artist', 'Unknown Artist')}" + return { + "status": "playing", + "title": song["title"], + "artist": song.get("artist", "Unknown Artist"), + } + [email protected]("/automate/music/next") +def music_next(): + return music() + [email protected]("/automate/music/stop") +def music_stop(): + global music_process + + if music_process and music_process.poll() is None: + music_process.terminate() + music_process = None + return {"status": "stopped"} + + return {"status": "not_playing"} if __name__ == "__main__": app.run(host="0.0.0.0", port=6732) |
