Spaces:
Sleeping
Sleeping
| from dotenv import load_dotenv | |
| import os | |
| import edge_tts | |
| import tempfile | |
| from uuid import uuid4 | |
| import requests | |
| load_dotenv() | |
| API_KEY = os.getenv("TMDB_API_KEY") | |
| BASE_URL = "https://api.themoviedb.org/3" | |
| IMAGE_BASE = "https://image.tmdb.org/t/p/w500" | |
| #--------------------------------- get movie id ---------------------------- | |
| def get_movie_id(movie_title): | |
| url = f"{BASE_URL}/search/movie" | |
| params = { | |
| "api_key": API_KEY, | |
| "query": movie_title | |
| } | |
| r = requests.get(url, params=params) | |
| data = r.json() | |
| if "results" in data and len(data["results"]) > 0: | |
| return data["results"][0]["id"] | |
| return None | |
| #--------------------------------- get movie reviews ---------------------------- | |
| def get_movie_reviews(movie_id, max_reviews=100): | |
| url = f"{BASE_URL}/movie/{movie_id}/reviews" | |
| params = { | |
| "api_key": API_KEY, | |
| "language": "en-US" | |
| } | |
| response = requests.get(url, params=params) | |
| if response.status_code != 200: | |
| print("TMDB Error:", response.status_code, response.text) | |
| return [] | |
| data = response.json() | |
| reviews = [] | |
| for review in data.get("results", [])[:max_reviews]: | |
| reviews.append({ | |
| "author": review.get("author"), | |
| "content": review.get("content"), | |
| "rating": review.get("author_details", {}).get("rating"), | |
| "created_at": review.get("created_at") | |
| }) | |
| return reviews | |
| #--------------------------------- get full movie details ---------------------------- | |
| def get_movie_details(movie_id): | |
| url = f"{BASE_URL}/movie/{movie_id}" | |
| params = {"api_key": API_KEY} | |
| r = requests.get(url, params=params) | |
| data = r.json() | |
| details = { | |
| "title": data.get("title"), | |
| "overview": data.get("overview"), | |
| "release_date": data.get("release_date"), | |
| "runtime": data.get("runtime"), | |
| "rating": data.get("vote_average"), | |
| "vote_count": data.get("vote_count"), | |
| "genres": [g["name"] for g in data.get("genres", [])], | |
| "poster": IMAGE_BASE + data["poster_path"] if data.get("poster_path") else None, | |
| "backdrop": IMAGE_BASE + data["backdrop_path"] if data.get("backdrop_path") else None | |
| } | |
| return details | |
| #----------------------------------------- TTS ---------------------------------------------- | |
| async def TTS(text: str) -> str: | |
| """ | |
| Saves audio to a SYSTEM TEMP folder so VS Code doesn't refresh. | |
| """ | |
| if not text: | |
| return "" | |
| # 1. Create a temp file path (e.g., C:\Users\AppData\Local\Temp\tmp123.mp3) | |
| # delete=False ensures the file stays so we can send it to frontend | |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") | |
| temp_path = temp_file.name | |
| temp_file.close() # Close handle so TTS engine can write to it | |
| # 2. Generate Audio | |
| # Assuming you are using edge-tts; if using gTTS, adjust accordingly | |
| communicate = edge_tts.Communicate(text, "en-US-AriaNeural") | |
| await communicate.save(temp_path) | |
| return temp_path |