v0.2.7: 修复Redis连接 + 启动管理后台
- 修复Redis认证 (配置密码) - 启动Python管理后台 (端口9531, 15个功能开关) - 统一版本号 0.2.7 - 更新docker-compose.yml (镜像版本/Redis URL/Admin服务)
This commit is contained in:
132
cloudsearch_enrich/search_enricher.py
Normal file
132
cloudsearch_enrich/search_enricher.py
Normal file
@@ -0,0 +1,132 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user