HotTrack / backend /app /api /analytics.py
chanfasf's picture
Initial deployment: HotTrack - YouTube & TikTok Analyzer
c4d0ee2
Raw
History Blame Contribute Delete
2.79 kB
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}