From 93b2e7d4cb3c4ca44f2a4807c1f13eceefb116eb Mon Sep 17 00:00:00 2001 From: vrubel Date: Fri, 2 Jan 2026 16:59:05 +0300 Subject: [PATCH] =?UTF-8?q?test!!!=20tmdb=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=B5=D0=B2=D1=80?= =?UTF-8?q?=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 19 +++----- docker-compose.yml | 7 +-- env.example | 8 +-- telegram_bot.py | 15 +++--- tmdb-proxy/Dockerfile | 19 ++++++++ tmdb-proxy/README.md | 24 +++++++++ tmdb-proxy/docker-compose.yml | 11 +++++ tmdb-proxy/requirements.txt | 4 ++ tmdb-proxy/tmdb_proxy.py | 91 +++++++++++++++++++++++++++++++++++ 9 files changed, 172 insertions(+), 26 deletions(-) create mode 100644 tmdb-proxy/Dockerfile create mode 100644 tmdb-proxy/README.md create mode 100644 tmdb-proxy/docker-compose.yml create mode 100644 tmdb-proxy/requirements.txt create mode 100644 tmdb-proxy/tmdb_proxy.py diff --git a/app.py b/app.py index db5721e..cfa2d4d 100644 --- a/app.py +++ b/app.py @@ -24,9 +24,8 @@ app.add_middleware( # Настройка шаблонов templates = Jinja2Templates(directory="templates") -# API ключ TMDB -TMDB_API_KEY = os.getenv("TMDB_API_KEY", "6d58225585fb77af5945a964de41849f") -TMDB_BASE_URL = "https://api.themoviedb.org/3" +# URL прокси-сервиса TMDB +TMDB_PROXY_URL = os.getenv("TMDB_PROXY_URL", "http://localhost:8001") # URL torAPI TORAPI_URL = os.getenv("TORAPI_URL", "http://localhost:8088") @@ -36,13 +35,12 @@ TORRENT_SEARCH_URL = os.getenv("TORRENT_SEARCH_URL", "http://localhost:8443") TORRENT_ADD_URL = os.getenv("TORRENT_ADD_URL", "http://localhost:8444") async def search_movies(query: str) -> dict: - """Поиск фильмов через TMDB API""" + """Поиск фильмов через TMDB Proxy""" async with httpx.AsyncClient() as client: try: response = await client.get( - f"{TMDB_BASE_URL}/search/movie", + f"{TMDB_PROXY_URL}/search/movie", params={ - "api_key": TMDB_API_KEY, "query": query, "language": "ru-RU", "include_adult": False @@ -51,16 +49,15 @@ async def search_movies(query: str) -> dict: response.raise_for_status() return response.json() except httpx.HTTPError as e: - raise HTTPException(status_code=500, detail=f"TMDB API error: {str(e)}") + raise HTTPException(status_code=500, detail=f"TMDB Proxy error: {str(e)}") async def get_movie_details(movie_id: int) -> dict: - """Получение детальной информации о фильме из TMDB""" + """Получение детальной информации о фильме из TMDB через прокси""" async with httpx.AsyncClient() as client: try: response = await client.get( - f"{TMDB_BASE_URL}/movie/{movie_id}", + f"{TMDB_PROXY_URL}/movie/{movie_id}", params={ - "api_key": TMDB_API_KEY, "language": "ru-RU", "append_to_response": "external_ids" } @@ -68,7 +65,7 @@ async def get_movie_details(movie_id: int) -> dict: response.raise_for_status() return response.json() except httpx.HTTPError as e: - raise HTTPException(status_code=500, detail=f"TMDB API error: {str(e)}") + raise HTTPException(status_code=500, detail=f"TMDB Proxy error: {str(e)}") def parse_size(size_str: str) -> tuple: """Парсинг размера файла и возврат в байтах и читаемом виде""" diff --git a/docker-compose.yml b/docker-compose.yml index 0819105..2cf6346 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,8 +2,9 @@ services: movie-search: build: . container_name: movie-search + env_file: + - .env environment: - - TMDB_API_KEY=6d58225585fb77af5945a964de41849f - HOST=0.0.0.0 - PORT=8000 - TORAPI_URL=http://torrent-api:8000 @@ -57,9 +58,9 @@ services: context: . dockerfile: Dockerfile.telegram container_name: telegram-bot-findFilms + env_file: + - .env environment: - - TMDB_API_KEY=6d58225585fb77af5945a964de41849f - - TELEGRAM_BOT_TOKEN=7662650066:AAFgsfYJNYgpcSHaSe6fspsjqmhMkOBT1s4 - TORRENT_SEARCH_URL=http://host.docker.internal:8443 - TORRENT_ADD_URL=http://host.docker.internal:8088 - QBITTORRENT_USERNAME=vrubelroman diff --git a/env.example b/env.example index 9655638..0199656 100644 --- a/env.example +++ b/env.example @@ -1,9 +1,11 @@ # 🔧 Конфигурация searchTorrentDownl # Скопируйте этот файл в .env и заполните своими данными -# 🎬 TMDB API Key -# Получите на https://www.themoviedb.org/settings/api -TMDB_API_KEY=your_tmdb_api_key_here +# 🎬 TMDB Proxy URL +# URL прокси-сервиса TMDB (работает на хосте без VPN) +# Если прокси на другом хосте, укажите его IP: http://:8001 +# Если прокси на том же хосте: http://localhost:8001 +TMDB_PROXY_URL=http://localhost:8001 # 🤖 Telegram Bot Token # Получите у @BotFather в Telegram diff --git a/telegram_bot.py b/telegram_bot.py index 48e71ba..16da02b 100644 --- a/telegram_bot.py +++ b/telegram_bot.py @@ -24,8 +24,7 @@ logger = logging.getLogger(__name__) # Конфигурация TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") -TMDB_API_KEY = os.getenv("TMDB_API_KEY", "6d58225585fb77af5945a964de41849f") -TMDB_BASE_URL = "https://api.themoviedb.org/3" +TMDB_PROXY_URL = os.getenv("TMDB_PROXY_URL", "http://localhost:8001") TORRENT_SEARCH_URL = os.getenv("TORRENT_SEARCH_URL", "http://localhost:8443") TORRENT_ADD_URL = os.getenv("TORRENT_ADD_URL", "http://localhost:8444") QBITTORRENT_HOST = os.getenv("QBITTORRENT_HOST", "localhost") @@ -243,13 +242,12 @@ class MovieSearchBot: ) async def tmdb_search_movies(self, query: str) -> List[Movie]: - """Поиск фильмов через TMDB API""" + """Поиск фильмов через TMDB Proxy""" async with httpx.AsyncClient(timeout=60.0) as client: try: response = await client.get( - f"{TMDB_BASE_URL}/search/movie", + f"{TMDB_PROXY_URL}/search/movie", params={ - "api_key": TMDB_API_KEY, "query": query, "language": "ru-RU", "include_adult": False @@ -276,7 +274,7 @@ class MovieSearchBot: return movies except Exception as e: - logger.error(f"TMDB API error: {e}") + logger.error(f"TMDB Proxy error: {e}") return [] async def handle_callback(self, update: Update, context: ContextTypes.DEFAULT_TYPE): @@ -396,13 +394,12 @@ class MovieSearchBot: ) async def get_movie_details(self, movie_id: int) -> Optional[Movie]: - """Получение детальной информации о фильме""" + """Получение детальной информации о фильме через TMDB Proxy""" async with httpx.AsyncClient(timeout=60.0) as client: try: response = await client.get( - f"{TMDB_BASE_URL}/movie/{movie_id}", + f"{TMDB_PROXY_URL}/movie/{movie_id}", params={ - "api_key": TMDB_API_KEY, "language": "ru-RU", "append_to_response": "external_ids" } diff --git a/tmdb-proxy/Dockerfile b/tmdb-proxy/Dockerfile new file mode 100644 index 0000000..655469d --- /dev/null +++ b/tmdb-proxy/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.11-slim + +WORKDIR /app + +# Копируем requirements +COPY requirements.txt . + +# Устанавливаем зависимости +RUN pip install --no-cache-dir fastapi uvicorn httpx + +# Копируем прокси-сервис +COPY tmdb_proxy.py . + +# Открываем порт +EXPOSE 8001 + +# Запускаем сервис +CMD ["python", "tmdb_proxy.py"] + diff --git a/tmdb-proxy/README.md b/tmdb-proxy/README.md new file mode 100644 index 0000000..a1fc340 --- /dev/null +++ b/tmdb-proxy/README.md @@ -0,0 +1,24 @@ +# TMDB Proxy Service + +Прокси-сервис для TMDB API, который работает на хосте без VPN. + +## Запуск + +```bash +docker-compose up -d --build +``` + +Сервис будет доступен на порту `8001`. + +## Использование + +Основной сервис должен обращаться к этому прокси по адресу: +- Если на том же хосте: `http://localhost:8001` +- Если на другом хосте: `http://:8001` + +## API Endpoints + +- `GET /search/movie?query=<название>` - поиск фильмов +- `GET /movie/{movie_id}` - детали фильма +- `GET /health` - проверка работоспособности + diff --git a/tmdb-proxy/docker-compose.yml b/tmdb-proxy/docker-compose.yml new file mode 100644 index 0000000..86d295f --- /dev/null +++ b/tmdb-proxy/docker-compose.yml @@ -0,0 +1,11 @@ +services: + tmdb-proxy: + build: . + container_name: tmdb-proxy + environment: + - TMDB_API_KEY=6d58225585fb77af5945a964de41849f + - PORT=8001 + ports: + - "0.0.0.0:8001:8001" + restart: unless-stopped + diff --git a/tmdb-proxy/requirements.txt b/tmdb-proxy/requirements.txt new file mode 100644 index 0000000..8b9975d --- /dev/null +++ b/tmdb-proxy/requirements.txt @@ -0,0 +1,4 @@ +fastapi==0.115.0 +uvicorn[standard]==0.30.6 +httpx>=0.25.2,<0.28.0 + diff --git a/tmdb-proxy/tmdb_proxy.py b/tmdb-proxy/tmdb_proxy.py new file mode 100644 index 0000000..4f4d5a4 --- /dev/null +++ b/tmdb-proxy/tmdb_proxy.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +""" +TMDB API Proxy Service +Прокси-сервис для TMDB API, который работает на хосте без VPN +""" + +import os +import httpx +from fastapi import FastAPI, HTTPException, Query +from fastapi.middleware.cors import CORSMiddleware + +app = FastAPI(title="TMDB API Proxy", version="1.0.0") + +# Настройка CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# API ключ TMDB (прописываем прямо здесь) +TMDB_API_KEY = os.getenv("TMDB_API_KEY", "6d58225585fb77af5945a964de41849f") +TMDB_BASE_URL = "https://api.themoviedb.org/3" + + +@app.get("/search/movie") +async def search_movies( + query: str = Query(..., description="Поисковый запрос"), + language: str = Query("ru-RU", description="Язык"), + include_adult: bool = Query(False, description="Включать взрослый контент"), + page: int = Query(1, description="Номер страницы") +): + """Прокси для поиска фильмов через TMDB API""" + async with httpx.AsyncClient(timeout=30.0) as client: + try: + response = await client.get( + f"{TMDB_BASE_URL}/search/movie", + params={ + "api_key": TMDB_API_KEY, + "query": query, + "language": language, + "include_adult": include_adult, + "page": page + } + ) + response.raise_for_status() + return response.json() + except httpx.HTTPError as e: + raise HTTPException(status_code=500, detail=f"TMDB API error: {str(e)}") + + +@app.get("/movie/{movie_id}") +async def get_movie_details( + movie_id: int, + language: str = Query("ru-RU", description="Язык"), + append_to_response: str = Query(None, description="Дополнительные данные") +): + """Прокси для получения детальной информации о фильме из TMDB""" + async with httpx.AsyncClient(timeout=30.0) as client: + try: + params = { + "api_key": TMDB_API_KEY, + "language": language + } + if append_to_response: + params["append_to_response"] = append_to_response + + response = await client.get( + f"{TMDB_BASE_URL}/movie/{movie_id}", + params=params + ) + response.raise_for_status() + return response.json() + except httpx.HTTPError as e: + raise HTTPException(status_code=500, detail=f"TMDB API error: {str(e)}") + + +@app.get("/health") +async def health_check(): + """Проверка работоспособности сервиса""" + return {"status": "ok", "service": "tmdb-proxy"} + + +if __name__ == "__main__": + import uvicorn + port = int(os.getenv("PORT", "8001")) + print(f"Starting TMDB Proxy on 0.0.0.0:{port}") + uvicorn.run(app, host="0.0.0.0", port=port, log_level="info") +