movie_search/final_ver/backend/main.py (48 lines of code) (raw):
import traceback
import os
from typing import List
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse
import uvicorn
from search_document import search_documents_by_query
from scene_search import search_scene
from utils import generate_download_signed_url_v4, metadata_url_to_movie_blob_name
from static_content import ROOT_PAGE
# --- FastAPI アプリケーション ---
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
def root():
"""ルートエンドポイント"""
return ROOT_PAGE
@app.get("/file_search")
async def api_file_search(
q: str = Query(..., description="検索キーワード"), limit: int = Query(3, le=3, description="最大表示件数")
) -> dict:
"""ファイル検索 API
Args:
q: 検索キーワード
limit: 最大表示件数
Returns:
検索結果を含む辞書
"""
try:
response = search_documents_by_query(q)
results = []
results.append({"summary": response.summary.summary_text})
for c, item in enumerate(response.results):
url = item.document.derived_struct_data["link"]
bucket_name = url.split("//")[1].split("/", 1)[0]
blob_name = metadata_url_to_movie_blob_name(url)
signed_url = generate_download_signed_url_v4(bucket_name, blob_name)
title = item.document.derived_struct_data["title"]
results.append({"id": c+1, "title": title, "bucket_name": bucket_name, "blob_name": blob_name, "url": url, "signed_url": signed_url})
return {"results": results}
except Exception as e:
traceback.print_exc()
return {"error": str(e)}, 500
@app.get("/scene_search")
async def api_scene_search(
q: str = Query(..., description="検索キーワード"),
limit: int = Query(3, le=3, description="最大表示件数"),
top_n: int = Query(1, le=3, description="上位何件の動画に対してシーン検索を行うか")
) -> dict:
"""シーン検索 API
Args:
q: 検索キーワード
limit: 最大表示件数
top_n: 上位何件の動画に対してシーン検索を行うか
Returns:
検索結果を含む辞書
"""
try:
results = search_scene(q, top_n=top_n)
return {"results": results}
except Exception as e:
traceback.print_exc()
return {"error": str(e)}, 500
# --- アプリケーション起動 ---
if __name__ == "__main__":
port = int(os.environ.get("PORT", 8080))
uvicorn.run(app, host="0.0.0.0", port=port)