You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.7 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import time
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
from multiprocessing import Process, Event, freeze_support, Manager
from loguru import logger
from liveMan import DouyinLiveWebFetcher, DouyinLiveWebReply
from helper import PromptQueue, LiveChatConfig
logger.add('log.log', encoding='utf-8', rotation="500MB")
# FastAPI应用实例
app = FastAPI(title="直播状态控制接口")
# 请求体模型
class SpeakingStatus(BaseModel):
is_speaking: bool
# 全局变量用于在FastAPI进程中存储共享字典引用
app.state.shared_config = None
# 接口更新is_speaking状态
@app.post("/speaking-status", summary="更新说话状态")
def update_speaking_status(status: SpeakingStatus):
if app.state.shared_config is None:
return {"error": "服务未初始化"}
app.state.shared_config['is_speaking'] = status.is_speaking
# logger.info(f"通过API更新is_speaking状态为: {status.is_speaking}")
return {
"message": "状态更新成功",
"current_status": {
"is_speaking": app.state.shared_config['is_speaking'],
}
}
# 启动FastAPI服务的函数接收共享字典作为参数
def start_fastapi_server(shared_config):
# 将共享字典存储到FastAPI应用的状态中
app.state.shared_config = shared_config
# 启动UVicorn服务器
uvicorn.run(app, host="0.0.0.0", port=8000)
def fetch_user_chat_content(ws_open_event, queue):
fetcher = DouyinLiveWebFetcher(ws_open_event, queue)
fetcher.start()
def reply_user_chat_content(queue, config):
reply = DouyinLiveWebReply(queue, config)
reply()
if __name__ == '__main__':
freeze_support()
LiveChatConfig().update_chat_enable_status('启动中')
with Manager() as manager:
# 创建共享字典,包含所有需要的键
shared_config = manager.dict({
'is_speaking': False
})
queue = PromptQueue(10)
ws_open_event = Event()
# 创建进程时将共享字典传递给FastAPI服务
api_process = Process(
target=start_fastapi_server,
args=(shared_config,),
name="FastAPI Server"
)
fetch_process = Process(
target=fetch_user_chat_content,
args=(ws_open_event, queue)
)
reply_process = Process(
target=reply_user_chat_content,
args=(queue, shared_config)
)
# 启动所有进程
api_process.start()
fetch_process.start()
ws_open_event.wait()
reply_process.start()
# 等待所有进程完成
fetch_process.join()
reply_process.join()
api_process.join()