Добавить страницу FastAPI Integration в wiki
@@ -0,0 +1,47 @@
|
|||||||
|
# Интеграция с FastAPI
|
||||||
|
|
||||||
|
## Когда использовать
|
||||||
|
|
||||||
|
Эта библиотека удобна для API-сервисов, потому что функция `download` возвращает MP4-байты в памяти, а не только путь к файлу.
|
||||||
|
|
||||||
|
## Базовый пример
|
||||||
|
|
||||||
|
```python
|
||||||
|
from fastapi import FastAPI, HTTPException
|
||||||
|
from fastapi.responses import Response
|
||||||
|
|
||||||
|
from yt_shorts_downloader import download
|
||||||
|
from yt_shorts_downloader.exceptions import YtShortsDownloaderError
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
|
+@app.get('/download')
|
||||||
|
+def download_short(url: str) -> Response:
|
||||||
|
+ try:
|
||||||
|
+ video = download(url, 'cookies.txt')
|
||||||
|
+ except YtShortsDownloaderError as exc:
|
||||||
|
+ raise HTTPException(status_code=400, detail=str(exc)) from exc
|
||||||
|
+
|
||||||
|
+ return Response(
|
||||||
|
+ content=video.content,
|
||||||
|
+ media_type=video.media_type,
|
||||||
|
+ headers={
|
||||||
|
+ 'Content-Disposition': f'attachment; filename="{video.filename}"',
|
||||||
|
+ },
|
||||||
|
+ )
|
||||||
|
```
|
||||||
|
|
||||||
|
## Что важно учитывать
|
||||||
|
|
||||||
|
- `download` создаёт временную директорию и сам читает итоговый MP4 в память
|
||||||
|
- для больших видео нужно учитывать объём RAM на воркере
|
||||||
|
- ошибки библиотеки лучше конвертировать в понятные HTTP-ответы
|
||||||
|
- cookie-файл должен быть недоступен извне и не должен попадать в репозиторий
|
||||||
|
|
||||||
|
## Рекомендации для production
|
||||||
|
|
||||||
|
- валидируйте входной URL на уровне API-контракта
|
||||||
|
- добавьте rate limiting на endpoint скачивания
|
||||||
|
- логируйте текст `str(exc)` для диагностики ошибок авторизации и yt-dlp
|
||||||
|
- храните cookie-файл вне публичных директорий и вне docker image layer history, если это возможно
|
||||||
Reference in New Issue
Block a user