Files
ViGent2/backend/app/api/publish.py
Kevin Wong 3db15cee4e 更新
2026-01-22 09:22:23 +08:00

92 lines
2.9 KiB
Python

"""
发布管理 API
"""
from fastapi import APIRouter, HTTPException, BackgroundTasks
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime
from loguru import logger
from app.services.publish_service import PublishService
router = APIRouter()
publish_service = PublishService()
class PublishRequest(BaseModel):
video_path: str
platform: str
title: str
tags: List[str] = []
description: str = ""
publish_time: Optional[datetime] = None
class PublishResponse(BaseModel):
success: bool
message: str
platform: str
url: Optional[str] = None
@router.post("/", response_model=PublishResponse)
async def publish_video(request: PublishRequest, background_tasks: BackgroundTasks):
try:
result = await publish_service.publish(
video_path=request.video_path,
platform=request.platform,
title=request.title,
tags=request.tags,
description=request.description,
publish_time=request.publish_time
)
return PublishResponse(
success=result.get("success", False),
message=result.get("message", ""),
platform=request.platform,
url=result.get("url")
)
except Exception as e:
logger.error(f"发布失败: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/platforms")
async def list_platforms():
return {"platforms": [{"id": pid, **pinfo} for pid, pinfo in publish_service.PLATFORMS.items()]}
@router.get("/accounts")
async def list_accounts():
return {"accounts": publish_service.get_accounts()}
@router.post("/login/{platform}")
async def login_platform(platform: str):
result = await publish_service.login(platform)
if result.get("success"):
return result
else:
raise HTTPException(status_code=400, detail=result.get("message"))
@router.get("/login/status/{platform}")
async def get_login_status(platform: str):
"""检查登录状态"""
# 这里简化处理,实际应该维护一个登录会话字典
cookie_file = publish_service.cookies_dir / f"{platform}_cookies.json"
if cookie_file.exists():
return {"success": True, "message": "已登录"}
else:
return {"success": False, "message": "未登录"}
@router.post("/cookies/save/{platform}")
async def save_platform_cookie(platform: str, cookie_data: dict):
"""
保存从客户端浏览器提取的Cookie
Args:
platform: 平台ID
cookie_data: {"cookie_string": "document.cookie的内容"}
"""
cookie_string = cookie_data.get("cookie_string", "")
result = await publish_service.save_cookie_string(platform, cookie_string)
if result.get("success"):
return result
else:
raise HTTPException(status_code=400, detail=result.get("message"))