83cbfaf03f
- 修复Redis认证 (配置密码) - 启动Python管理后台 (端口9531, 15个功能开关) - 统一版本号 0.2.7 - 更新docker-compose.yml (镜像版本/Redis URL/Admin服务)
133 lines
4.0 KiB
Python
133 lines
4.0 KiB
Python
"""
|
|
CloudSearch Search Enricher v1.0.0
|
|
搜索结果增强:TMDB匹配 + 过期检测 + 内容去重
|
|
"""
|
|
|
|
import time
|
|
import logging
|
|
from typing import List, Dict, Any, Optional
|
|
from tmdb_enricher import TMDBEnricher
|
|
|
|
logger = logging.getLogger("enricher")
|
|
|
|
|
|
class SearchEnricher:
|
|
"""搜索结果增强器"""
|
|
|
|
def __init__(self, tmdb_api_key: str = "", cache_ttl: int = 86400):
|
|
self.tmdb = TMDBEnricher(tmdb_api_key, cache_ttl=cache_ttl) if tmdb_api_key else None
|
|
|
|
def enrich_results(self, results: List[Dict], keyword: str = "") -> List[Dict]:
|
|
"""批量增强搜索结果"""
|
|
if not results:
|
|
return results
|
|
|
|
enriched = []
|
|
titles_to_lookup = []
|
|
|
|
# 收集需要查 TMDB 的标题
|
|
for r in results:
|
|
title = r.get("title", "")
|
|
if title and self.tmdb:
|
|
titles_to_lookup.append(title)
|
|
|
|
# 批量查询 TMDB
|
|
tmdb_results = {}
|
|
if titles_to_lookup and self.tmdb:
|
|
tmdb_results = self.tmdb.enrich_batch(titles_to_lookup[:20], max_concurrent=5)
|
|
|
|
# 应用增强
|
|
for r in results:
|
|
title = r.get("title", "")
|
|
media = tmdb_results.get(title)
|
|
|
|
enriched_item = dict(r)
|
|
if media:
|
|
enriched_item.update({
|
|
"tmdb_id": media.tmdb_id,
|
|
"tmdb_url": media.tmdb_url,
|
|
"poster": media.poster_url,
|
|
"backdrop": media.backdrop_url,
|
|
"rating": media.rating,
|
|
"rating_count": media.rating_count,
|
|
"year": media.year,
|
|
"genres": media.genres,
|
|
"description": media.description,
|
|
"media_type": media.media_type,
|
|
"directors": media.directors,
|
|
"actors": media.actors[:5],
|
|
"enriched": True,
|
|
})
|
|
|
|
# 自动生成更好的标题
|
|
if media.year and media.rating:
|
|
enriched_item["display_title"] = (
|
|
f"{title} ({media.year}) ⭐{media.rating}"
|
|
)
|
|
|
|
enriched.append(enriched_item)
|
|
|
|
return enriched
|
|
|
|
def enrich_single(self, title: str, keyword: str = "") -> Optional[Dict]:
|
|
"""增强单个标题"""
|
|
if not self.tmdb:
|
|
return None
|
|
media = self.tmdb.enrich(title)
|
|
if not media:
|
|
return None
|
|
return {
|
|
"title": title,
|
|
"tmdb_id": media.tmdb_id,
|
|
"poster": media.poster_url,
|
|
"rating": media.rating,
|
|
"year": media.year,
|
|
"genres": media.genres,
|
|
"description": media.description,
|
|
"media_type": media.media_type,
|
|
}
|
|
|
|
|
|
# Flask API wrapper
|
|
def create_enricher_api(tmdb_key: str = ""):
|
|
from flask import Flask, request, jsonify
|
|
app = Flask(__name__)
|
|
enricher = SearchEnricher(tmdb_key)
|
|
|
|
@app.route("/health", methods=["GET"])
|
|
def health():
|
|
return jsonify({"status": "ok", "version": "1.0.0"})
|
|
|
|
@app.route("/enrich", methods=["POST"])
|
|
def enrich():
|
|
data = request.get_json() or {}
|
|
results = data.get("results", [])
|
|
keyword = data.get("keyword", "")
|
|
|
|
if not results:
|
|
return jsonify({"error": "results required"}), 400
|
|
|
|
enriched = enricher.enrich_results(results, keyword)
|
|
return jsonify({"results": enriched, "count": len(enriched)})
|
|
|
|
@app.route("/lookup", methods=["POST"])
|
|
def lookup():
|
|
data = request.get_json() or {}
|
|
title = data.get("title", "")
|
|
if not title:
|
|
return jsonify({"error": "title required"}), 400
|
|
|
|
info = enricher.enrich_single(title)
|
|
return jsonify(info or {})
|
|
|
|
return app
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import os
|
|
api_key = os.getenv("TMDB_API_KEY", "")
|
|
port = int(os.getenv("PORT", "9530"))
|
|
app = create_enricher_api(api_key)
|
|
logger.info(f"Enricher API on port {port}")
|
|
app.run(host="0.0.0.0", port=port)
|