Files
CloudSearch/cloudsearch_enrich/search_enricher.py
admin 83cbfaf03f v0.2.7: 修复Redis连接 + 启动管理后台
- 修复Redis认证 (配置密码)
- 启动Python管理后台 (端口9531, 15个功能开关)
- 统一版本号 0.2.7
- 更新docker-compose.yml (镜像版本/Redis URL/Admin服务)
2026-05-17 02:22:18 +08:00

133 lines
4.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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)