Skip to main content

API for downloading media from YouTube and other platforms with various download modes, and manages cookies for accessing content that requires authorization.

Project description

ytdlp_simple_api

ytdlp_simple_api — это FastAPI-сервер для скачивания видео и аудио с YouTube и других платформ, поддерживает различные режимы загрузки: лучшее качество, аудио для транскрипции, видео для мессенджеров, полностью ручные настройки, управляет файлами cookie для доступа к контенту, требующему авторизации.

Оглавление

Особенности

  • Режимы загрузки
    • аудио в высоком качестве: Opus, 130 кбит/с.
    • аудио для транскрибации через ASR: моно, нормализованное, с передискретизацией.
    • видео для чатов: 480p/360p, низкий битрейт, сжатый звук.
    • видео в высоком качестве: VP9/AV1, Opus.
    • ручная настройка: разрешение, кодеки, битрейт, контейнер.
  • Управление cookie
    • загрузка, просмотр и удаление cookie в формате Netscape для доступа к закрытому контенту.
  • Управление загрузками
    • просмотр списка медиа-файлов, скачивание по прямой ссылке и удаление вручную.
  • Автоматическая очистка диска
    • настраиваемый период хранения файлов, чтобы диск не переполнялся.
  • Защита API
    • аутентификация по Bearer-токену.
  • Веб-интерфейс
    • скачивание медиа-файлов и управление cookie через браузер.

Установка

uv add ytdlp-simple-api

или:

pip install ytdlp-simple-api

Конфигурация

Конфигурация API осуществляется через переменные окружения. Вы можете использовать файл .env для удобства.

  1. Создайте файл .env: Скопируйте .env.example в .env и отредактируйте его:

    cp .env.example .env
    
  2. Запустите приложение:

    uvicorn ytdlp_simple_api.api:app --host 0.0.0.0 --port 7860
    

    Или используйте скрипт из __init__.py:

    python -m ytdlp_simple_api
    

Переменные окружения

Переменная Описание Значение по умолчанию
PORT порт, на котором будет слушать API 7860
WEB_UI True для включения веб-интерфейса для загрузки и управления файлами cookie в браузере. False для отключения. False
HIDE_HOME True для маскировки главной страницы (/) UI. Полезно для развертывания на HuggingFace Spaces, где главная страница может быть заменена другим контентом. Если True, / вернет JSON с информацией о состоянии, иначе - фрейм с внешним URL. False
API_TOKEN Bearer-токен для аутентификации. Если не задан, аутентификация отключена (открытый доступ). Настоятельно рекомендуется установить в производственной среде. None
DOWNLOADS_DIR директория для сохранения загруженных файлов. Если не указано, будет использоваться директория по умолчанию, управляемая библиотекой ytdlp_simple. None (автоматически)
COOKIES_FOLDER директория для хранения файлов cookies.txt. Если не указано, будет использоваться директория по умолчанию, управляемая библиотекой ytdlp_simple. None (автоматически)
FILE_RETENTION_H время в часах, в течение которого файлы будут храниться перед автоматической очисткой. Установите 0 для отключения автоматической очистки. Настоятельно рекомендуется установить значение больше 0 в производственной среде для предотвращения переполнения диска. 0

Пример файла .env:

PORT=8000
WEB_UI=True
HIDE_HOME=False
API_TOKEN=your_super_secret_token_here
DOWNLOADS_DIR=/app/downloads
COOKIES_FOLDER=/app/cookies
FILE_RETENTION_H=3

Использование API

Документация по API доступна по адресу /docs (Swagger UI) и /redoc (Redoc UI) после запуска сервера.

Аутентификация

Если переменная окружения API_TOKEN установлена, все эндпоинты, кроме UI, будут требовать аутентификации.

Для аутентификации включите заголовок Authorization в ваших запросах:

Authorization: Bearer your_super_secret_token_here

Если API_TOKEN не установлен, аутентификация отключена, и все эндпоинты доступны без токена.

Эндпоинты загрузки

Все эндпоинты загрузки возвращают DownloadResponse:

{
  "success": true,
  "file_url": "http://localhost:8000/files/video_abc123.mp4",
  "filename": "video_abc123.mp4",
  "error": null,
  "warnings": []
}

В случае ошибки:

{
  "success": false,
  "file_url": null,
  "filename": null,
  "error": "Failed to download video: This video is unavailable.",
  "warnings": ["Some warnings from yt-dlp"]
}

POST /download/best-audio

Скачивает аудио в максимально возможном качестве (обычно ~130 кбит/с Opus). Вариант использования: для музыки, подкастов, высококачественного извлечения аудио.

  • Request Body: BestAudioRequest
    {
      "url": "string",
      "prefer_lang": ["ru", "en"], // Optional, предпочтительные языки аудио
      "sponsorblock": true // Optional, удалять рекламные сегменты
    }
    

POST /download/transcription-audio

Скачивает и подготавливает аудио для моделей преобразования речи в текст (ASR). Пайплайн: низкий битрейт → нормализация → моно → передискретизация → кодирование. Вариант использования: Whisper, Qwen-3-ASR, Gemma-3n, Microsoft VibeVoice-ASR и т.д.

  • Request Body: TranscriptionAudioRequest
    {
      "url": "string",
      "sample_rate": 16000, // Optional, 16000 или 24000 Гц
      "output_format": "opus", // Optional, "opus", "flac" или "pcm"
      "prefer_lang": null // Optional, предпочтительные языки аудио
    }
    

POST /download/video-for-chat

Скачивает видео, оптимизированное для мессенджеров (Telegram/WhatsApp и т.д.). Качество: 480p/360p, минимальный битрейт, самый маленький he-aac аудио, FPS ≤ 30. Корректно обрабатывает вертикальные видео (Shorts, Reels, TikTok).

  • Request Body: VideoForChatRequest
    {
      "url": "string",
      "prefer_lang": null, // Optional
      "sponsorblock": true // Optional
    }
    

POST /download/best-quality

Скачивает видео в максимально доступном качестве. Обычно: лучшее видео VP9/AV1 + лучшее аудио Opus. Вариант использования: архивирование, редактирование, просмотр в высоком качестве.

  • Request Body: BestQualityRequest
    {
      "url": "string",
      "prefer_lang": null, // Optional
      "sponsorblock": true, // Optional
      "container": "mp4" // Optional, "mp4", "mkv", "webm", "mov"
    }
    

POST /download/manual

Полный контроль над параметрами загрузки. Укажите разрешение, кодеки, битрейт, контейнер и т.д.

  • Request Body: ManualDownloadRequest
    {
      "url": "string",
      "max_resolution": "4k", // Optional, "8k", "4k", "2k", "1080p", "720p", "480p", "360p", "240p", "144p"
      "audio_bitrate": "best", // Optional, "best", "medium", "low"
      "vcodec": "avc", // Optional, "av1", "vp9", "avc", "hevc"
      "acodec": "opus", // Optional, "opus", "aac"
      "speech_lang": "ru", // Optional, "orig", "ru", "en"
      "limit_fps": false, // Optional, ограничить до 30 FPS
      "container": "mp4", // Optional, "mp4", "mkv", "webm", "mov"
      "sponsorblock": true // Optional
    }
    

Эндпоинты файлов

GET /files

Получает список всех загруженных файлов с их метаданными.

  • Response: list[FileInfo]
    [
      {
        "filename": "video_123.mp4",
        "size_bytes": 1024000,
        "size_human": "1.0 MB",
        "created_at": "2023-10-27T10:00:00Z",
        "download_url": "/files/video_123.mp4"
      }
    ]
    

GET /files/{filename}

Скачивает ранее созданный файл по его имени. Файлы автоматически удаляются после периода хранения.

  • Path Parameter: filename (string)
  • Response: FileResponse (поток файла)

DELETE /files/{filename}

Вручную удаляет загруженный файл.

  • Path Parameter: filename (string)
  • Response:
    {
      "status": "deleted",
      "filename": "video_123.mp4"
    }
    

Эндпоинты файлов Cookie

GET /cookies

Получает список всех загруженных файлов cookie с их метаданными.

  • Response: list[CookieFileInfo]
    [
      {
        "filename": "youtube_cookies.txt",
        "size_bytes": 1500,
        "size_human": "1.5 KB",
        "modified_at": "2023-10-27T10:00:00Z",
        "is_valid": true,
        "domains": ["YouTube", "Google"]
      }
    ]
    

POST /cookies

Загружает файл cookie в формате Netscape.

  • Request Body: multipart/form-data
    • file: (тип File) Файл cookies.txt в формате Netscape.
  • Response:
    {
      "status": "uploaded",
      "filename": "my_cookies.txt",
      "size": "500 B",
      "domain_hint": ["YouTube"]
    }
    

POST /cookies/text

Создает файл cookie путем вставки текстового содержимого.

  • Request Body: CookieTextRequest
    {
      "filename": "my_pasted_cookies.txt",
      "content": "# Netscape HTTP Cookie File..." // Содержимое файла cookie
    }
    
  • Response:
    {
      "status": "created",
      "filename": "my_pasted_cookies.txt",
      "size": "500 B",
      "domains": ["YouTube"]
    }
    

GET /cookies/{filename}

Получает информацию о конкретном файле cookie.

  • Path Parameter: filename (string)
  • Response: CookieFileInfo

DELETE /cookies/{filename}

Удаляет файл cookie.

  • Path Parameter: filename (string)
  • Response:
    {
      "status": "deleted",
      "filename": "my_cookies.txt"
    }
    

Системные эндпоинты

GET /

Проверка состояния сервиса и информация о конфигурации. Если HIDE_HOME установлен в True, возвращает JSON. Если WEB_UI включен, и HIDE_HOME - False, возвращает HTML-страницу с фреймом.

  • Response (JSON, если HIDE_HOME=True):
    {
      "status": "ok",
      "service": "ytdlp-simple-api",
      "config": {
        "downloads_dir": "/tmp/ytdlp_downloads",
        "cookies_configured": true,
        "file_retention_hours": 24
      }
    }
    

POST /cleanup

Вручную запускает очистку просроченных файлов.

  • Response:
    {
      "status": "completed",
      "deleted_files": 5,
      "retention_hours": 24
    }
    

Веб-интерфейс (UI)

Если WEB_UI установлен в True, доступны два веб-интерфейса:

UI загрузки

Доступен по адресу /ui или /ui/.

Предоставляет простую форму для загрузки видео/аудио и отображает список загруженных файлов.

UI управления Cookie

Доступен по адресу /cookies-ui или /cookies-ui/.

Позволяет просматривать, загружать (через файл или текст) и удалять файлы cookie в формате Netscape.

Примечание: Если API_TOKEN установлен, в UI появится поле для ввода токена для аутентификации. Если токен не установлен, поле аутентификации будет скрыто.

Предупреждения и особенности

Управление файлами

  • Временные файлы: все загруженные файлы считаются временными если переменная окружения FILE_RETENTION_H установлена больше 0. Настоятельно рекомендуется настроить FILE_RETENTION_H для автоматической очистки, чтобы избежать переполнения диска.

Безопасность

  • API Token: если API разворачивается на публичном сервере, обязательно нужно установить API_TOKEN для защиты эндпоинтов от несанкционированного доступа.
  • Валидация имен файлов: API включает базовую валидацию имен файлов для предотвращения атак типа Path Traversal.
  • Файлы Cookie: загружайте файлы cookie только не из основных и важных аккаунтов YouTube, X.com, и т.д., поскольку эти аккаунты могут быть заблокированы из-за злоупотреблений! Так же, любой кто сможет прочитать файлы cookies с сервера - сможет получить доступ к аккаунтам. Используйте cookies если с IP сервера невозможно скачивать контент из-за ограничений, либо если требуется обходить возрастные 18+ ограничения сервисов или получать доступ к закрытому контенту.

Производительность

  • Фоновые задачи: очистка файлов запускается как фоновая задача при каждом запросе загрузки, чтобы не блокировать основной поток.
  • Конкурентные загрузки: FastAPI может обрабатывать несколько запросов одновременно, и сами загрузки yt-dlp выполняются в асинхронном контексте, но чрезмерное количество одновременных загрузок может повлиять на производительность.

Логирование

API использует стандартный Python-логгер. Вы можете настроить его уровень детализации в вашей среде. Сообщения о создании папок для cookie, UI-ссылки и предупреждения о FILE_RETENTION_H будут отображаться в консоли при запуске.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ytdlp_simple_api-0.0.1.tar.gz (33.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ytdlp_simple_api-0.0.1-py3-none-any.whl (36.7 kB view details)

Uploaded Python 3

File details

Details for the file ytdlp_simple_api-0.0.1.tar.gz.

File metadata

  • Download URL: ytdlp_simple_api-0.0.1.tar.gz
  • Upload date:
  • Size: 33.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ytdlp_simple_api-0.0.1.tar.gz
Algorithm Hash digest
SHA256 a130698d33842e95839b1c78b8667382e60c3dba725581dc488ea459fba15230
MD5 7c96350a747a0df054f8653f4f83095a
BLAKE2b-256 6ea6a686b04c8d8cc1dc4231227a2890860f3178ab37633a30c0cc92d37f544f

See more details on using hashes here.

File details

Details for the file ytdlp_simple_api-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for ytdlp_simple_api-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 aabaa2238c02ec9a852963944498b1ed73a92479240b7f432ddc1d3b83bfdcde
MD5 2f2961f12dc1fc0369ec9064f2983879
BLAKE2b-256 d1d61e246b27abfed5ac89868595dee04269b29599a0e9d6b639d46742c2e122

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page