Rename web to api to reflect, that it's not serving the frontend, split FastAPI creation

This commit is contained in:
mmacierzanka committed 2026-08-21 13:31:11 +02:00
1 parent d31747e80b
commit e4776d1348
28 files changed
+69 -68

No files matched your search

+28 -3
View File
@@ -2,8 +2,13 @@ from __future__ import annotations
import asyncio
import logging
import os
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
import uvicorn
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from zyrarbot.audio.media_probe import MediaProbe
from zyrarbot.audio.track_factory import TrackFactory
@@ -17,7 +22,7 @@ from zyrarbot.storage.guild_config_repository import GuildConfigRepository
from zyrarbot.storage.history_repository import HistoryRepository
from zyrarbot.storage.json_file_store import JsonFileStore
from zyrarbot.storage.uploads_repository import UploadsRepository
from zyrarbot.ui.web.factory import create_app
from zyrarbot.ui.api.factory import mount_api
logger = logging.getLogger(__name__)
@@ -50,7 +55,9 @@ class Application:
)
self.bot.player = self.player
self.api = create_app(
self.web = FastAPI(title="ŻyrarBOT")
broadcaster = mount_api(
self.web,
settings=self.settings,
player=self.player,
guilds=self.guilds,
@@ -59,10 +66,28 @@ class Application:
config=self.config,
)
@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
self.player.on_state_change = broadcaster.broadcast
broadcaster.start()
logger.info("Panel webowy gotowy, rozgłaszanie stanu uruchomione")
try:
yield
finally:
self.player.on_state_change = None
await broadcaster.stop()
self.web.router.lifespan_context = lifespan
os.makedirs(self.settings.static_dir, exist_ok=True)
self.web.mount(
"/", StaticFiles(directory=self.settings.static_dir, html=True), name="static"
)
async def run(self) -> None:
"""Startuje serwer web, a następnie bota; panel działa też bez Discorda."""
config = uvicorn.Config(
self.api,
self.web,
host=self.settings.web_host,
port=self.settings.web_port,
log_level="info",
File renamed without changes.
File renamed without changes.
@@ -9,9 +9,9 @@ from zyrarbot.music.music_player import MusicPlayer
from zyrarbot.settings import Settings
from zyrarbot.storage.guild_config_repository import GuildConfigRepository
from zyrarbot.storage.uploads_repository import UploadsRepository
from zyrarbot.ui.web.connection_manager import ConnectionManager
from zyrarbot.ui.web.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.web.status_service import StatusService
from zyrarbot.ui.api.connection_manager import ConnectionManager
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.api.status_service import StatusService
NO_GUILD_DETAIL = "Bot has no active server context"
@@ -1,21 +1,14 @@
from __future__ import annotations
import logging
import os
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from zyrarbot.audio.track_factory import TrackFactory
from zyrarbot.ui.bot.guild_resolver import GuildResolver
from zyrarbot.music.music_player import MusicPlayer
from zyrarbot.settings import Settings
from zyrarbot.storage.guild_config_repository import GuildConfigRepository
from zyrarbot.storage.uploads_repository import UploadsRepository
from zyrarbot.ui.web.connection_manager import ConnectionManager
from zyrarbot.ui.web.routers import (
from zyrarbot.ui.api.connection_manager import ConnectionManager
from zyrarbot.ui.api.routers import (
playback_router,
queue_router,
settings_router,
@@ -24,10 +17,9 @@ from zyrarbot.ui.web.routers import (
voice_router,
websocket_router,
)
from zyrarbot.ui.web.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.web.status_service import StatusService
logger = logging.getLogger(__name__)
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.api.status_service import StatusService
from zyrarbot.ui.bot.guild_resolver import GuildResolver
ROUTERS = (
status_router.router,
@@ -40,7 +32,8 @@ ROUTERS = (
)
def create_app(
def mount_api(
app: FastAPI,
*,
settings: Settings,
player: MusicPlayer,
@@ -48,25 +41,12 @@ def create_app(
tracks: TrackFactory,
uploads: UploadsRepository,
config: GuildConfigRepository,
) -> FastAPI:
"""Buduje aplikację FastAPI i wstrzykuje zależności przez ``app.state``."""
) -> StatusBroadcaster:
"""Konfiguruje stan API i podmontowuje jego routery do aplikacji."""
connections = ConnectionManager()
status_service = StatusService(player, guilds)
broadcaster = StatusBroadcaster(status_service, connections)
@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
player.on_state_change = broadcaster.broadcast
broadcaster.start()
logger.info("Panel webowy gotowy, rozgłaszanie stanu uruchomione")
try:
yield
finally:
player.on_state_change = None
await broadcaster.stop()
app = FastAPI(title="ŻyrarBOT Queue Controller", lifespan=lifespan)
app.state.settings = settings
app.state.player = player
app.state.guilds = guilds
@@ -80,8 +60,4 @@ def create_app(
for router in ROUTERS:
app.include_router(router)
# Pliki panelu montujemy na końcu, aby nie przesłoniły tras API.
os.makedirs(settings.static_dir, exist_ok=True)
app.mount("/", StaticFiles(directory=settings.static_dir, html=True), name="static")
return app
return broadcaster
File renamed without changes.
@@ -10,18 +10,18 @@ from zyrarbot.audio.track_factory import TrackFactory
from zyrarbot.music.loop_mode import LoopMode
from zyrarbot.music.music_player import MusicPlayer
from zyrarbot.storage.uploads_repository import UploadsRepository
from zyrarbot.ui.web.dependencies import (
from zyrarbot.ui.api.dependencies import (
get_active_guild,
get_broadcaster,
get_player,
get_tracks,
get_uploads,
)
from zyrarbot.ui.web.schemas.loop_request import LoopRequest
from zyrarbot.ui.web.schemas.play_file_request import PlayFileRequest
from zyrarbot.ui.web.schemas.play_request import PlayRequest
from zyrarbot.ui.web.schemas.volume_request import VolumeRequest
from zyrarbot.ui.web.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.api.schemas.loop_request import LoopRequest
from zyrarbot.ui.api.schemas.play_file_request import PlayFileRequest
from zyrarbot.ui.api.schemas.play_request import PlayRequest
from zyrarbot.ui.api.schemas.volume_request import VolumeRequest
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
logger = logging.getLogger(__name__)
@@ -7,17 +7,17 @@ from fastapi import APIRouter, Depends, HTTPException
from zyrarbot.music.music_player import MusicPlayer
from zyrarbot.settings import Settings
from zyrarbot.ui.web.dependencies import (
from zyrarbot.ui.api.dependencies import (
get_active_guild,
get_broadcaster,
get_player,
get_settings,
)
from zyrarbot.ui.web.schemas.jump_request import JumpRequest
from zyrarbot.ui.web.schemas.remove_request import RemoveRequest
from zyrarbot.ui.web.schemas.reorder_request import ReorderRequest
from zyrarbot.ui.web.schemas.track_plays_request import TrackPlaysRequest
from zyrarbot.ui.web.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.api.schemas.jump_request import JumpRequest
from zyrarbot.ui.api.schemas.remove_request import RemoveRequest
from zyrarbot.ui.api.schemas.reorder_request import ReorderRequest
from zyrarbot.ui.api.schemas.track_plays_request import TrackPlaysRequest
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
router = APIRouter(prefix="/api", tags=["queue"])
@@ -10,16 +10,16 @@ from zyrarbot.ui.bot.guild_resolver import GuildResolver
from zyrarbot.music.music_player import MusicPlayer
from zyrarbot.settings import Settings
from zyrarbot.storage.guild_config_repository import GuildConfigRepository
from zyrarbot.ui.web.dependencies import (
from zyrarbot.ui.api.dependencies import (
get_broadcaster,
get_config,
get_guilds,
get_player,
get_settings,
)
from zyrarbot.ui.web.schemas.default_plays_request import DefaultPlaysRequest
from zyrarbot.ui.web.schemas.text_channel_request import TextChannelRequest
from zyrarbot.ui.web.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.api.schemas.default_plays_request import DefaultPlaysRequest
from zyrarbot.ui.api.schemas.text_channel_request import TextChannelRequest
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
logger = logging.getLogger(__name__)
@@ -4,8 +4,8 @@ from typing import Any
from fastapi import APIRouter, Depends
from zyrarbot.ui.web.dependencies import get_status_service
from zyrarbot.ui.web.status_service import StatusService
from zyrarbot.ui.api.dependencies import get_status_service
from zyrarbot.ui.api.status_service import StatusService
router = APIRouter(prefix="/api", tags=["status"])
@@ -5,7 +5,7 @@ from typing import Any
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
from zyrarbot.storage.uploads_repository import UploadsRepository
from zyrarbot.ui.web.dependencies import get_uploads
from zyrarbot.ui.api.dependencies import get_uploads
router = APIRouter(prefix="/api", tags=["uploads"])
@@ -6,14 +6,14 @@ from fastapi import APIRouter, Depends, HTTPException
from zyrarbot.ui.bot.guild_resolver import GuildResolver
from zyrarbot.music.music_player import MusicPlayer
from zyrarbot.music.notification_channel_resolver import NotificationChannelResolver
from zyrarbot.ui.web.dependencies import (
from zyrarbot.ui.api.dependencies import (
get_active_guild,
get_broadcaster,
get_guilds,
get_player,
)
from zyrarbot.ui.web.schemas.connect_request import ConnectRequest
from zyrarbot.ui.web.status_broadcaster import StatusBroadcaster
from zyrarbot.ui.api.schemas.connect_request import ConnectRequest
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
router = APIRouter(prefix="/api", tags=["voice"])
@@ -4,9 +4,9 @@ import logging
from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect
from zyrarbot.ui.web.connection_manager import ConnectionManager
from zyrarbot.ui.web.dependencies import get_connections, get_socket_status_service
from zyrarbot.ui.web.status_service import StatusService
from zyrarbot.ui.api.connection_manager import ConnectionManager
from zyrarbot.ui.api.dependencies import get_connections, get_socket_status_service
from zyrarbot.ui.api.status_service import StatusService
logger = logging.getLogger(__name__)
File renamed without changes.
@@ -4,8 +4,8 @@ import asyncio
import contextlib
import logging
from zyrarbot.ui.web.connection_manager import ConnectionManager
from zyrarbot.ui.web.status_service import StatusService
from zyrarbot.ui.api.connection_manager import ConnectionManager
from zyrarbot.ui.api.status_service import StatusService
logger = logging.getLogger(__name__)
File renamed without changes.