| from typing import Optional |
| from fastapi import APIRouter, Depends, Query, HTTPException |
| from sqlalchemy.orm import Session |
|
|
| from app.database import get_db |
| from app.models.video import Platform |
| from app.analyzers.viral import ViralAnalyzer |
| from app.analyzers.revenue import RevenueAnalyzer |
|
|
| router = APIRouter(prefix="/analytics", tags=["analytics"]) |
|
|
|
|
| def _parse_platform(platform: Optional[str]) -> Optional[Platform]: |
| if not platform: |
| return None |
| try: |
| return Platform(platform) |
| except ValueError: |
| valid = [p.value for p in Platform] |
| raise HTTPException(status_code=422, detail=f"无效的平台参数: {platform},有效值: {valid}") |
|
|
|
|
| @router.get("/viral") |
| def get_viral_videos( |
| platform: Optional[str] = Query(None, description="平台筛选: youtube 或 tiktok"), |
| limit: int = Query(50, ge=1, le=200), |
| min_views: int = Query(1000, ge=0, description="最低播放量"), |
| hours: int = Query(720, ge=1, le=2160, description="发布时间范围(小时)"), |
| db: Session = Depends(get_db), |
| ): |
| p = _parse_platform(platform) |
| analyzer = ViralAnalyzer(db) |
| return analyzer.get_fastest_growing_videos(platform=p, limit=limit, min_views=min_views, hours_threshold=hours) |
|
|
|
|
| @router.post("/viral/calculate") |
| def calculate_viral_scores( |
| hours_threshold: float = Query(168, ge=1, le=720, description="最大发布时长(小时)"), |
| db: Session = Depends(get_db), |
| ): |
| analyzer = ViralAnalyzer(db) |
| records = analyzer.calculate_viral_scores(hours_threshold=hours_threshold) |
| return {"message": f"已计算 {len(records)} 条视频的爆红指数", "count": len(records)} |
|
|
|
|
| @router.get("/revenue") |
| def get_revenue_ranking( |
| platform: Optional[str] = Query(None, description="平台筛选: youtube 或 tiktok"), |
| limit: int = Query(50, ge=1, le=200), |
| db: Session = Depends(get_db), |
| ): |
| p = _parse_platform(platform) |
| analyzer = RevenueAnalyzer(db) |
| return analyzer.get_top_revenue_videos(platform=p, limit=limit) |
|
|
|
|
| @router.get("/revenue/ranking") |
| def get_revenue_ranking_alias( |
| platform: Optional[str] = Query(None, description="平台筛选: youtube 或 tiktok"), |
| limit: int = Query(50, ge=1, le=200), |
| db: Session = Depends(get_db), |
| ): |
| p = _parse_platform(platform) |
| analyzer = RevenueAnalyzer(db) |
| return analyzer.get_top_revenue_videos(platform=p, limit=limit) |
|
|
|
|
| @router.post("/revenue/calculate") |
| def calculate_revenue( |
| platform: Optional[str] = Query(None, description="平台筛选: youtube 或 tiktok"), |
| db: Session = Depends(get_db), |
| ): |
| p = _parse_platform(platform) |
| analyzer = RevenueAnalyzer(db) |
| count = analyzer.batch_estimate_revenue(platform=p) |
| return {"message": f"已估算 {count} 条视频的收入", "count": count} |
|
|