Fix: prioritize real API data over demo data on startup
Browse files- backend/app/main.py +48 -7
backend/app/main.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import os
|
|
|
|
| 2 |
from contextlib import asynccontextmanager
|
| 3 |
from pathlib import Path
|
| 4 |
|
|
@@ -18,6 +19,8 @@ from app.api.tasks import router as tasks_router
|
|
| 18 |
from app.api.ai import router as ai_router
|
| 19 |
from app.scheduler.jobs import run_scheduled_crawl
|
| 20 |
|
|
|
|
|
|
|
| 21 |
Base.metadata.create_all(bind=engine)
|
| 22 |
|
| 23 |
scheduler = BackgroundScheduler()
|
|
@@ -45,13 +48,51 @@ def _auto_seed_if_empty():
|
|
| 45 |
try:
|
| 46 |
count = db.query(Video).count()
|
| 47 |
if count == 0:
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
except Exception:
|
| 56 |
pass
|
| 57 |
finally:
|
|
|
|
| 1 |
import os
|
| 2 |
+
import logging
|
| 3 |
from contextlib import asynccontextmanager
|
| 4 |
from pathlib import Path
|
| 5 |
|
|
|
|
| 19 |
from app.api.ai import router as ai_router
|
| 20 |
from app.scheduler.jobs import run_scheduled_crawl
|
| 21 |
|
| 22 |
+
logger = logging.getLogger(__name__)
|
| 23 |
+
|
| 24 |
Base.metadata.create_all(bind=engine)
|
| 25 |
|
| 26 |
scheduler = BackgroundScheduler()
|
|
|
|
| 48 |
try:
|
| 49 |
count = db.query(Video).count()
|
| 50 |
if count == 0:
|
| 51 |
+
seeded = False
|
| 52 |
+
|
| 53 |
+
if settings.YOUTUBE_API_ENABLED:
|
| 54 |
+
try:
|
| 55 |
+
from app.crawlers.youtube import YouTubeCrawler
|
| 56 |
+
from app.analyzers.viral import ViralAnalyzer
|
| 57 |
+
from app.analyzers.revenue import RevenueAnalyzer
|
| 58 |
+
|
| 59 |
+
crawler = YouTubeCrawler()
|
| 60 |
+
videos = crawler.get_trending_videos(region_code="US", max_results=50)
|
| 61 |
+
if videos:
|
| 62 |
+
crawler.save_videos_to_db(videos, db)
|
| 63 |
+
ViralAnalyzer(db).calculate_viral_scores()
|
| 64 |
+
RevenueAnalyzer(db).batch_estimate_revenue()
|
| 65 |
+
seeded = True
|
| 66 |
+
logger.info(f"使用 YouTube API 获取了 {len(videos)} 条真实数据")
|
| 67 |
+
except Exception as e:
|
| 68 |
+
logger.warning(f"YouTube API 获取失败: {e}")
|
| 69 |
+
|
| 70 |
+
if settings.TIKHUB_ENABLED and not seeded:
|
| 71 |
+
try:
|
| 72 |
+
from app.crawlers.tiktok import TikTokCrawler
|
| 73 |
+
from app.analyzers.viral import ViralAnalyzer
|
| 74 |
+
from app.analyzers.revenue import RevenueAnalyzer
|
| 75 |
+
|
| 76 |
+
crawler = TikTokCrawler(tikhub_api_key=settings.TIKHUB_API_KEY)
|
| 77 |
+
videos = crawler.get_trending_videos(count=50)
|
| 78 |
+
if videos:
|
| 79 |
+
crawler.save_videos_to_db(videos, db)
|
| 80 |
+
ViralAnalyzer(db).calculate_viral_scores()
|
| 81 |
+
RevenueAnalyzer(db).batch_estimate_revenue()
|
| 82 |
+
seeded = True
|
| 83 |
+
logger.info(f"使用 TikHub API 获取了 {len(videos)} 条真实数据")
|
| 84 |
+
except Exception as e:
|
| 85 |
+
logger.warning(f"TikHub API 获取失败: {e}")
|
| 86 |
+
|
| 87 |
+
if not seeded:
|
| 88 |
+
from app.demo.seed import generate_demo_data
|
| 89 |
+
from app.analyzers.viral import ViralAnalyzer
|
| 90 |
+
from app.analyzers.revenue import RevenueAnalyzer
|
| 91 |
+
n = generate_demo_data(db)
|
| 92 |
+
if n > 0:
|
| 93 |
+
ViralAnalyzer(db).calculate_viral_scores()
|
| 94 |
+
RevenueAnalyzer(db).batch_estimate_revenue()
|
| 95 |
+
logger.info(f"使用演示数据: {n} 条")
|
| 96 |
except Exception:
|
| 97 |
pass
|
| 98 |
finally:
|