- 修复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)
|