from enum import Enum from fastapi import FastAPI from fastapi.responses import HTMLResponse from download_service import DownloadService from music_player import MusicPlayer, PlayerState class ChangePlayerState(Enum): play = "play" pause = "pause" resume = "resume" stop = "stop" queue: list[str] = [] tags_metadata = [ {"name": "player", "description": "Interact with the Music Player"}, {"name": "experimental"}, {"name": "queue"}, ] app = FastAPI(openapi_tags=tags_metadata) player = MusicPlayer() dl_service = DownloadService() # Interface @app.get("/", response_class=HTMLResponse) async def root(): with open("interface.html") as f: return f.read() # Experimental @app.get("/queue", tags=["queue"]) def get_queue(): return player.get_queue() @app.post("/queue", tags=["queue"]) def post_to_queue(url: str): track = dl_service.download(url) player.add_to_queue(track) @app.post("/player/play", tags=["player"]) def player_play(): player.play() @app.post("/player/pause", tags=["player"]) def player_pause(): player.pause() @app.post("/player/resume", tags=["player"]) def player_resume(): player.resume() @app.post("/player/stop", tags=["player"]) def player_stop(): player.stop() @app.post("/player/skip", tags=["player"]) def player_skip(): player.next() # Player @app.put("/player/volume", tags=["player"]) def set_volume(volume: float): player.set_volume(volume) @app.get("/player/volume", tags=["player"]) def get_volume(): return {"volume": player.get_volume()} @app.get("/player", tags=["player"]) def get_player_state() -> PlayerState: return player.get_state()