115 lines
4.0 KiB
Python
115 lines
4.0 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
import discord
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
from zyrarbot.music.music_player import MusicPlayer
|
|
from zyrarbot.settings import Settings
|
|
from zyrarbot.ui.api.dependencies import (
|
|
get_active_guild,
|
|
get_broadcaster,
|
|
get_player,
|
|
get_settings,
|
|
)
|
|
from zyrarbot.ui.api.requests.default_plays_request import DefaultPlaysRequest
|
|
from zyrarbot.ui.api.requests.jump_request import JumpRequest
|
|
from zyrarbot.ui.api.requests.remove_request import RemoveRequest
|
|
from zyrarbot.ui.api.requests.reorder_request import ReorderRequest
|
|
from zyrarbot.ui.api.requests.track_plays_request import TrackPlaysRequest
|
|
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
|
|
|
|
router = APIRouter(prefix="/api", tags=["queue"])
|
|
|
|
|
|
@router.post("/queue/restore")
|
|
async def restore_queue(
|
|
guild: discord.Guild = Depends(get_active_guild),
|
|
player: MusicPlayer = Depends(get_player),
|
|
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
|
|
) -> dict[str, int | str]:
|
|
count = await player.restore_queue(guild.id)
|
|
if count == 0:
|
|
raise HTTPException(status_code=404, detail="No saved queue for this server")
|
|
await broadcaster.broadcast()
|
|
return {"status": "restored", "count": count}
|
|
|
|
|
|
@router.post("/default_plays")
|
|
async def set_default_plays(
|
|
request: DefaultPlaysRequest,
|
|
guild: discord.Guild = Depends(get_active_guild),
|
|
player: MusicPlayer = Depends(get_player),
|
|
settings: Settings = Depends(get_settings),
|
|
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
|
|
) -> dict[str, int | str]:
|
|
if not settings.is_valid_plays(request.default_plays):
|
|
raise HTTPException(status_code=400, detail="Invalid default plays value")
|
|
|
|
player.set_default_plays(guild.id, request.default_plays)
|
|
await broadcaster.broadcast()
|
|
return {"status": "success", "default_plays": request.default_plays}
|
|
|
|
|
|
@router.post("/jump")
|
|
async def jump(
|
|
request: JumpRequest,
|
|
guild: discord.Guild = Depends(get_active_guild),
|
|
player: MusicPlayer = Depends(get_player),
|
|
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
|
|
) -> dict[str, str]:
|
|
queue = player.state(guild.id).queue
|
|
if not 0 <= request.index < len(queue):
|
|
raise HTTPException(status_code=400, detail="Invalid track index")
|
|
|
|
await player.jump(guild.id, request.index)
|
|
await broadcaster.broadcast()
|
|
return {"status": "jumped"}
|
|
|
|
|
|
@router.post("/remove")
|
|
async def remove(
|
|
request: RemoveRequest,
|
|
guild: discord.Guild = Depends(get_active_guild),
|
|
player: MusicPlayer = Depends(get_player),
|
|
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
|
|
) -> dict[str, str]:
|
|
if not await player.remove(guild.id, request.id):
|
|
raise HTTPException(status_code=404, detail="Track not found in queue")
|
|
|
|
await broadcaster.broadcast()
|
|
return {"status": "removed"}
|
|
|
|
|
|
@router.post("/reorder")
|
|
async def reorder(
|
|
request: ReorderRequest,
|
|
guild: discord.Guild = Depends(get_active_guild),
|
|
player: MusicPlayer = Depends(get_player),
|
|
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
|
|
) -> dict[str, str]:
|
|
player.reorder(guild.id, request.queue_ids)
|
|
await broadcaster.broadcast()
|
|
return {"status": "success"}
|
|
|
|
|
|
@router.post("/queue/plays")
|
|
async def set_track_plays(
|
|
request: TrackPlaysRequest,
|
|
guild: discord.Guild = Depends(get_active_guild),
|
|
player: MusicPlayer = Depends(get_player),
|
|
settings: Settings = Depends(get_settings),
|
|
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
|
|
) -> dict[str, Any]:
|
|
if not settings.is_valid_plays(request.plays):
|
|
raise HTTPException(status_code=400, detail="Invalid plays value")
|
|
|
|
track = player.state(guild.id).find(request.id)
|
|
if track is None:
|
|
raise HTTPException(status_code=404, detail="Track not found in queue")
|
|
|
|
track.plays_left = request.plays
|
|
await broadcaster.broadcast()
|
|
return {"status": "success", "id": request.id, "plays": request.plays}
|