chore: bump version to 0.7.1

This commit is contained in:
ethan.chen
2025-05-27 14:16:48 +08:00
commit 63eda91fd6
103 changed files with 15868 additions and 0 deletions

86
backend/main.py Normal file
View File

@@ -0,0 +1,86 @@
'''
Date: 2025-05-06 09:26:51
LastEditors: 陈子健
LastEditTime: 2025-05-26 17:14:17
FilePath: /mac-lyric-vue/backend/main.py
'''
"""
lyroc 后端主程序
负责初始化应用和启动服务器
"""
import uvicorn
import os
import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
# 导入自定义模块
from modules.websocket_manager import ConnectionManager
from modules.background_tasks import start_background_task, cancel_all_tasks, background_tasks
from modules.routes import register_routes
# 配置日志
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
# 应用支持目录和歌词目录在lyrics模块中已定义
# Lifespan 上下文管理器,替代 on_event
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("正在启动API服务...")
try:
# 启动时创建后台任务
start_background_task(manager)
logger.info("后台任务已启动")
except Exception as e:
logger.error(f"启动后台任务失败: {e}")
yield # 应用正常运行
# 关闭时清理任务
try:
cancel_all_tasks()
logger.info("后台任务已关闭")
except Exception as e:
logger.error(f"关闭后台任务失败: {e}")
# 创建FastAPI应用
app = FastAPI(lifespan=lifespan)
# 确保在应用启动时直接启动任务(作为后备方案)
@app.on_event("startup")
async def startup_event():
# 仅当通过 lifespan 未启动任务时才启动
if not background_tasks:
logger.info("通过startup_event启动后台任务...")
try:
start_background_task(manager)
logger.info("后台任务通过startup_event成功启动")
except Exception as e:
logger.error(f"通过startup_event启动后台任务失败: {e}")
# 配置CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 创建WebSocket连接管理器
manager = ConnectionManager()
# 注册API路由
register_routes(app, manager)
if __name__ == "__main__":
# 从环境变量获取端口号如果未设置则默认使用5000
port = int(os.environ.get("PORT", 5000))
logger.info(f"启动后端服务器在端口: {port}")
uvicorn.run("main:app", host="127.0.0.1", port=port, reload=True)