File size: 2,785 Bytes
c4d0ee2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 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}
|