YDownloader
YDownloader — локальное приложение для скачивания видео и аудио с YouTube. Оно запускает небольшой сервер на компьютере и открывает русскоязычный интерфейс в браузере. Пользователь добавляет ссылки, выбирает параметры и наблюдает за загрузками; приложение сохраняет готовые файлы в выбранную папку.
Для остановки сервера запустите stop.cmd рядом с start.cmd. Скрипт проверяет, что стандартный порт 8765 занят именно этим экземпляром YDownloader, и завершает его после остановки активных заданий. Если приложение запущено с другим портом, укажите его первым аргументом, например stop.cmd 8767. Старые версии сервера без команды плавной остановки скрипт завершает по проверенному идентификатору процесса.
Проект предназначен для личной библиотеки видео, лекций, интервью, музыки и других материалов для просмотра без интернета. Регистрация и отдельный облачный сервис не нужны: настройки, история и скачанные файлы хранятся локально. Для установки компонентов и скачивания с YouTube нужен интернет.
Настройки по умолчанию: качество до 720p, русская аудиодорожка при наличии, формат MP4, две одновременные загрузки, папка downloads внутри проекта.
Возможности
- Одиночные и пакетные загрузки. Ссылки можно вставить в поле по одной на строку или импортировать из текстового файла UTF-8. За один раз принимается до 100 ссылок.
-
Поддержка разных ссылок на ролики. Обычные ссылки YouTube, короткие
youtu.be, Shorts, встроенные видео и записи завершённых трансляций приводятся к единому виду. - Очередь с ограничением нагрузки. Одновременно выполняются от одной до трёх загрузок. Остальные задания ждут своей очереди; общий предел незавершённых заданий — 500.
- Выбор качества. Доступны ограничения до 360p, 480p, 720p, 1080p, 1440p и 2160p, а также лучшее доступное качество.
- Выбор аудиодорожки. Поддерживаются русский, английский, украинский, немецкий, французский, испанский и режим «Оригинал».
- Три выходных формата. MP4 и MKV для видео, MP3 для сохранения только звука.
- Субтитры. При наличии сохраняется отдельный файл субтитров; приложение учитывает и автоматические субтитры YouTube.
- Выбор места сохранения. Можно открыть системный диалог выбора папки или ввести путь вручную. Новые задания скачиваются непосредственно в эту папку, каждое в отдельную подпапку.
- Прогресс и управление. Интерфейс показывает этап работы, прогресс, скорость, оставшееся время, название ролика и результат. Загрузку можно отменить, а неудачное или прерванное задание — повторить.
- История и настройки между запусками. Данные сохраняются в SQLite. Повторная загрузка использует исходные настройки задания.
- Защита от дубликатов. Повторяющиеся ссылки в одном списке удаляются; ролик, который уже загружается или стоит в очереди, повторно не добавляется.
- Работа с готовыми файлами. Кнопка «Папка загрузок» открывает текущую папку сохранения в проводнике. Кнопка «Файл» позволяет сохранить дополнительную копию через браузер.
- Облако Mail.ru. Подключение через почту и токен приложения, выбор папки в облаке и загрузка отдельного готового файла с прогрессом и проверкой наличия копии.
- Удаление видеофайлов. Можно удалить файл с диска, из выбранной папки облака или из обоих мест. Перед удалением облачной копии приложение проверяет её наличие; история и субтитры сохраняются.
Подключение облака Mail.ru
- В блоке «Облако Mail.ru» нажмите «Подключить Mail.ru».
- Укажите почту аккаунта облака и токен приложения — пароль для внешнего приложения, созданный в настройках Mail.ru. Обычный пароль почты использовать не нужно. Подключение работает по WebDAV, который поддерживается Mail.ru.
- Нажмите «Выбрать папку в облаке», перейдите в нужную папку и нажмите «Выбрать эту папку». Можно выбрать корень
/. Новые папки создавайте в самом облаке. - У готового видео нажмите «Загрузить в облако». Файл загружается прямо в выбранную папку. Перед каждой передачей сервер заново проверяет наличие файла; при совпадении полного имени загрузка пропускается. Имя, которое создаёт скачиватель, включает идентификатор YouTube. Содержимое существующих файлов не сравнивается по контрольной сумме; при другом размере интерфейс показывает предупреждение. Переименованная копия считается другим файлом.
Интерфейс проверяет наличие файлов после подключения и смены папки, а затем обновляет результаты примерно раз в минуту. Кнопка «В облаке» означает, что файл с таким именем существует в текущей выбранной папке. Проверка недоступного облака возвращает ошибку и не разрешает считать файл отсутствующим.
В Windows токен хранится в SQLite в зашифрованном виде через DPAPI и связан с текущим пользователем Windows. Он не возвращается в браузер и не попадает в настройки задания. На других платформах сохраняются почта и папка, а токен остаётся только в памяти до закрытия приложения. Кнопка «Отключить облако» удаляет сохранённые данные подключения.
Передача выполняется потоково, по одному файлу, без загрузки всего видео в память. Временный файл .ydownloader-<случайный идентификатор>.part переименовывается в окончательное имя после проверки размера; существующий файл не перезаписывается даже при параллельной загрузке через другой клиент. Если приложение принудительно закрыть или потерять соединение, в облаке может остаться такой временный файл — его можно удалить в Mail.ru. Доступность WebDAV, права и ограничения размеров зависят от аккаунта Mail.ru.
Удаление с диска и из облака
Нажмите «Удалить файл» у готового видео. В диалоге отметьте нужные места: компьютер и, если копия найдена, облако. Облачный флажок изначально выключен. Диалог показывает аккаунт, полный путь и размер найденного файла. При смене папки или аккаунта, а также при изменении облачного файла потребуется новая проверка.
Если выбраны оба места, приложение сначала удаляет облачную копию. Если облако недоступно, локальный файл остаётся на месте. Можно отдельно удалить только локальный файл. Если облачная копия удалена, а локальный файл занят проигрывателем, приложение сообщит об этом; закройте проигрыватель и повторите удаление с диска.
Удаляется только готовый MP4, MKV или MP3, указанный в задании: субтитры и остальные файлы не затрагиваются. Запись остаётся в истории со статусом «Файл удалён с диска» и кнопками повтора скачивания и удаления из облака. Очистка истории, как и раньше, не удаляет файлы. Удаление нельзя отменить в YDownloader.
Стек технологий
Python — основная логика приложения
Python используется для сервера, очереди, работы с файлами, хранения данных, проверки зависимостей и запуска отдельных процессов скачивания. Минимальная версия для проекта — Python 3.11.
Стандартная библиотека покрывает значительную часть инфраструктуры: pathlib работает с путями, subprocess запускает процессы, threading обслуживает очередь, sqlite3 хранит данные, а hashlib вычисляет контрольные суммы.
FastAPI, Pydantic и Uvicorn — локальный сервер и API
FastAPI обрабатывает HTTP-запросы интерфейса: добавление заданий, изменение настроек, отмену и повтор, получение истории, выдачу файлов и открытие папок.
Pydantic описывает и проверяет входные данные. Он ограничивает допустимые качества, языки, форматы и число загрузок, а также нормализует ссылки и путь сохранения. Pydantic устанавливается как зависимость FastAPI.
Uvicorn запускает приложение как ASGI-сервер. Штатный запуск слушает только адрес 127.0.0.1, поэтому интерфейс доступен на том же компьютере.
yt-dlp — получение информации и скачивание с YouTube
yt-dlp извлекает метаданные ролика, определяет доступные видео- и аудиопотоки, выбирает подходящий вариант и скачивает его. Приложение использует Python API библиотеки и получает события прогресса через её обработчики.
Зависимость устанавливается как yt-dlp[default]: дополнительные компоненты из этого набора, включая EJS, нужны для полноценной работы с YouTube. Политика выбора качества и языка вынесена в отдельный модуль приложения.
FFmpeg и FFprobe — обработка и проверка медиа
FFmpeg объединяет отдельно скачанные видео и аудио, переносит потоки в MP4 или MKV, добавляет метаданные и преобразует звук в MP3.
FFprobe читает сведения о потоках готового файла. Он используется в проверках медиаконвейера и в сценарии реального скачивания для подтверждения результата.
Приложение сначала ищет исполняемые файлы в tools/bin, затем — в системном PATH. Установщик может подготовить локальную сборку FFmpeg для Windows x64.
Node.js или Deno, EJS — выполнение JavaScript для yt-dlp
YouTube использует JavaScript при формировании доступа к медиапотокам. yt-dlp выполняет необходимые задачи через внешний JavaScript runtime и компонент EJS (yt-dlp-ejs).
Поддерживается Node.js 22+ или Deno 2.3+. Достаточно одного из них; при наличии обоих приложение сначала проверяет Deno.
Node.js здесь также запускает тесты клиентского кода. Сам интерфейс не требует npm-зависимостей или этапа сборки.
SQLite — настройки и история
SQLite — встроенная файловая база данных, для которой не нужен отдельный сервер. Через стандартный модуль sqlite3 приложение сохраняет общие настройки и записи о заданиях, включая их статусы, параметры, ошибки и пути к готовым файлам.
По умолчанию база находится в data/app.sqlite3.
HTML, CSS и JavaScript — интерфейс в браузере
Интерфейс написан на обычных HTML, CSS и JavaScript без клиентского фреймворка. HTML задаёт структуру страницы и диалогов, CSS отвечает за оформление и адаптацию к размеру экрана, JavaScript — за действия пользователя и обновление списка загрузок.
Клиент обращается к локальному API через fetch и периодически запрашивает актуальные задания, примерно раз в 1,4 секунды. WebSocket-соединение не используется. Статические файлы сервер отдаёт напрямую из app/static.
C#, .NET Framework и Windows Forms — выбор папки в Windows
Небольшой помощник FolderPicker.cs открывает нативный диалог выбора папки. Он использует Windows Forms и компилируется при первом обращении встроенным компилятором csc.exe из .NET Framework.
Полученный файл кешируется в tools/bin; имя содержит контрольную сумму исходника, поэтому изменение кода помощника приводит к созданию новой версии. Visual Studio и отдельная сборка интерфейса не требуются.
Python-модуль windows_process.py через ctypes вызывает Windows API и запускает окно на интерактивном рабочем столе пользователя. Это позволяет показать диалог отдельно от процесса веб-сервера. Для других платформ в коде предусмотрен вариант с Tkinter.
PowerShell и CMD — установка и запуск в Windows
setup.ps1 создаёт виртуальное окружение, устанавливает Python-зависимости, подготавливает FFmpeg и проверяет готовность компонентов.
start.cmd служит точкой входа для запуска двойным щелчком. Если окружение отсутствует или компоненты не готовы, он вызывает установку.
pytest, HTTPX и Node.js Test Runner — автоматические проверки
pytest проверяет серверную логику, выбор потоков, очередь, работу с папками и обработку медиа.
HTTPX используется для потоковой передачи файлов в Mail.ru по WebDAV и тестовым клиентом для запросов к FastAPI без отдельного запущенного сервера. Тесты облака используют имитацию WebDAV без доступа к реальным аккаунтам.
Встроенный Node.js Test Runner проверяет обработку ответов API в клиентском JavaScript, включая ошибки сервера, некорректный JSON и обновление токена после перезапуска.
Диапазоны Python-зависимостей указаны в requirements.txt и requirements-dev.txt.
Архитектура и путь загрузки
Приложение состоит из браузерного интерфейса, локального HTTP API, хранилища, менеджера очереди и отдельных процессов скачивания.
- Интерфейс отправляет список ссылок и выбранные настройки в FastAPI.
- Модели данных проверяют запрос и приводят ссылки к каноническому адресу конкретного ролика.
- Хранилище создаёт запись для каждого нового задания в SQLite. Вместе с заданием сохраняется снимок его настроек.
- Менеджер очереди выбирает ожидающие задания и запускает их с учётом текущего ограничения параллельности.
-
Рабочий процесс
python -m app.workerполучает одно задание, извлекает информацию через yt-dlp, скачивает потоки и запускает обработку FFmpeg. - Обновления состояния возвращаются менеджеру строками JSON через стандартный вывод процесса. Диагностика записывается отдельно в журнал задания.
- Готовый результат фиксируется после успешного завершения процесса и проверки существования файла. Браузер получает новые данные при следующем опросе API.
Отдельный процесс для каждого задания позволяет остановить загрузку вместе с её дочерними процессами и изолировать её от HTTP-сервера. Планировщик и обработчики событий работают в потоках; количество одновременно выполняемых заданий ограничено настройками.
Статусы задания: queued → extracting → downloading → processing → completed. Возможные альтернативные состояния — failed, cancelled, interrupted и deleted после удаления готового файла с диска.
Системные требования
Основной сценарий установки и проверенная платформа — Windows x64.
Необходимы:
- Python 3.11 или новее с возможностью создать виртуальное окружение и установить пакеты через pip.
- Node.js 22+ или Deno 2.3+, доступный через
PATHлибо размещённый вtools/bin. - Современный браузер.
- Интернет для первоначальной установки и скачивания с YouTube.
- Доступ на запись в каталог проекта, каталог данных и выбранную папку сохранения.
- Для нативного выбора папки — компоненты .NET Framework с компилятором
csc.exe. Если они недоступны, путь можно указать вручную.
В коде есть отдельные ветки открытия папок и остановки процессов для Linux и macOS, но Windows-установщик на этих платформах не применяется. Там потребуются ручная установка FFmpeg/FFprobe и Tkinter для диалога выбора папки.
Установка и запуск
Все команды ниже выполняются из корня проекта в PowerShell.
Первоначальная установка
Установите Python и один JavaScript runtime, затем выполните:
powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1
Скрипт:
- Создаёт виртуальное окружение
.venv, если его ещё нет. - Устанавливает пакеты из
requirements.txt. - Проверяет FFmpeg и FFprobe; при отсутствии скачивает сборку для Windows x64 из FFmpeg-Builds проекта yt-dlp.
- Проверяет SHA-256 скачанного архива по данным релиза перед извлечением файлов.
- Проверяет наличие подходящего JavaScript runtime и компонентов yt-dlp.
FFmpeg размещается в tools/bin; установщик не меняет системный PATH. Node.js или Deno нужно установить отдельно.
Обычный запуск
Дважды щёлкните start.cmd или выполните:
.\start.cmd
Откроется браузер с приложением по адресу http://127.0.0.1:8765. Окно процесса сервера должно оставаться открытым во время работы.
Для запуска напрямую:
.\.venv\Scripts\python.exe run.py
Другой порт или запуск без автоматического открытия браузера:
.\.venv\Scripts\python.exe run.py --port 8767
.\.venv\Scripts\python.exe run.py --no-browser
Во втором случае откройте адрес приложения вручную. Для остановки сервера нажмите Ctrl+C в окне, где он запущен. Закрытие вкладки браузера само по себе сервер не останавливает.
Повторный запуск при уже работающем экземпляре с той же версией кода открывает его интерфейс. Если код изменился, программа попросит полностью остановить старый сервер и запустить приложение заново.
Использование и настройки
Добавление видео
- Вставьте ссылки по одной на строке или нажмите «Загрузить список .txt». Максимальный размер импортируемого файла — 250 КБ.
- Выберите качество, язык аудио и формат.
- При необходимости нажмите «Выбрать папку» под основными настройками.
- Нажмите «Скачать видео». Можно использовать Ctrl+Enter; на macOS — Cmd+Enter.
- Наблюдайте за заданиями в списке. Фильтры помогают найти активные, готовые и неудачные загрузки.
Если в списке есть некорректная ссылка, исправьте её перед отправкой: пакет проверяется целиком.
Качество
Числовое значение означает верхнюю границу высоты видео, а не обещание точного разрешения. Например, «До 720p» выбирает лучший доступный подходящий поток не выше 720p. Если источник предлагает только меньшее разрешение, будет использовано оно.
Режим «Лучшее доступное» снимает это ограничение. При выборе MP3 качество видео не участвует в подборе аудио.
Язык аудио
Приложение выбирает существующую дорожку YouTube и не переводит звук самостоятельно. Региональные обозначения языка, например ru-RU, учитываются по префиксу.
Если включён параметр «Другая дорожка, если нужной нет», при отсутствии запрошенного языка выбирается доступная дорожка и показывается предупреждение. Если параметр выключен, невозможность подтвердить нужный язык приводит к ошибке.
«Оригинал» снимает фильтр по языку и использует выбор yt-dlp. Если YouTube не указал язык дорожки, приложение сообщает, что выбранный язык не подтверждён.
Формат и субтитры
- MP4 / MKV: видеопотоки и аудио объединяются и переносятся в выбранный контейнер без перекодирования видео. При подборе потоков предпочтение отдаётся H.264 и AAC, если они доступны.
- MP3: сохраняется только аудио с преобразованием в MP3; целевой битрейт — 192 кбит/с.
- Субтитры: сохраняются отдельным файлом, предпочтительно VTT, на выбранном языке. Для режима «Оригинал» запрашиваются русские субтитры. При отсутствии нужных субтитров отображается предупреждение.
Папка сохранения
Кнопка «Выбрать папку» на основной странице открывает системный диалог и сразу сохраняет выбранный путь для новых заданий. Отмена диалога сохраняет прежнюю настройку.
В окне «Настройки» можно выбрать папку или ввести путь вручную; изменения применяются кнопкой «Сохранить настройки». Перед сохранением сервер проверяет возможность записи и при необходимости создаёт каталог. Относительный путь считается от корня проекта.
Файлы скачиваются непосредственно в выбранную папку. Для каждого задания создаётся подпапка из первых 12 символов его идентификатора:
выбранная-папка/
└── a1b2c3d4e5f6/
├── Название ролика [YouTube-ID].mp4
└── Название ролика [YouTube-ID].ru.vtt
Подпапки разделяют задания и их промежуточные файлы. Субтитры появляются только при включённой настройке и наличии у источника.
«Папка загрузок» открывает текущую папку в проводнике. Это отдельное действие от выбора новой папки.
Кнопка «Файл» у завершённого задания передаёт уже готовый файл браузеру для сохранения копии. Место этой копии определяется настройками браузера.
Очередь, повтор и история
Качество, язык, формат, субтитры и папка фиксируются при добавлении задания. Изменение этих параметров влияет на новые задания; существующие сохраняют исходные значения. Ограничение числа одновременных загрузок применяется менеджером очереди из текущих общих настроек.
При остановке приложения выполняемые задания получают статус «Загрузка прервана» и могут быть запущены кнопкой «Повторить». Ожидающие задания сохраняются и обрабатываются после следующего запуска.
Повтор использует ту же подпапку и исходные параметры. yt-dlp может продолжить скачивание по файлам .part, если источник и состояние промежуточных файлов это позволяют.
Очистка истории удаляет записи о завершённых, отменённых, неудачных и прерванных заданиях. Активная очередь и файлы на диске сохраняются.
Данные и структура проекта
Основные каталоги, создаваемые во время работы:
-
.venv/— виртуальное окружение Python. -
data/app.sqlite3— настройки и история заданий. -
data/logs/<job_id>.log— диагностика рабочего процесса; при повторе задания журнал перезаписывается. -
downloads/<job_id_prefix>/— медиа и промежуточные файлы при стандартной папке сохранения. -
tools/bin/— локальные исполняемые файлы FFmpeg/FFprobe и скомпилированный помощник выбора папки. -
.test-artifacts/— результаты дополнительных проверок с реальным скачиванием.
Каталог данных можно изменить переменной окружения YDOWNLOADER_DATA_DIR до запуска:
$env:YDOWNLOADER_DATA_DIR = 'D:\YDownloaderData'
.\.venv\Scripts\python.exe run.py
Она меняет место хранения базы и журналов. Папка сохранения видео настраивается отдельно в интерфейсе. При смене каталога данных приложение использует базу в новом месте; существующие данные автоматически не переносятся.
Структура исходников:
ydownloader/
├── app/
│ ├── main.py # FastAPI, маршруты, локальная защита запросов
│ ├── config.py # Пути, зависимости, контрольная сумма версии
│ ├── models.py # Модели настроек и проверка ссылок
│ ├── store.py # SQLite, история и сохранение настроек
│ ├── manager.py # Очередь, процессы, отмена и повтор
│ ├── downloader.py # Выбор потоков и параметры yt-dlp
│ ├── worker.py # Скачивание одного задания и события прогресса
│ ├── folder_picker.py # Запуск диалога выбора папки
│ ├── windows_process.py # Работа с процессом на рабочем столе Windows
│ ├── FolderPicker.cs # Нативный помощник Windows Forms
│ └── static/
│ ├── index.html # Страница и диалоги
│ ├── style.css # Оформление интерфейса
│ ├── app.js # События пользователя и запросы API
│ └── icon.svg # Иконка приложения
├── tests/ # Серверные, клиентские и медиатесты
├── tools/
│ ├── install_ffmpeg.py # Установка локального FFmpeg
│ ├── check_dependencies.py # Проверка готовности компонентов
│ └── smoke_youtube.py # Дополнительная проверка реального скачивания
├── docs/ # Скриншоты проверок интерфейса
├── run.py # Запуск сервера и открытие браузера
├── setup.ps1 # Подготовка окружения Windows
├── start.cmd # Запуск двойным щелчком
├── requirements.txt # Основные Python-зависимости
├── requirements-dev.txt # Зависимости для тестов
├── PLAN.md # План реализации и выполненные этапы
└── README.md
Локальный API и защита запросов
Интерфейс использует следующие основные маршруты:
-
GET /api/bootstrap— начальные настройки, задания, состояние компонентов и токен интерфейса. -
GET /api/health— готовность компонентов и контрольная сумма версии запущенного приложения. -
GET /api/jobs— список заданий. -
POST /api/jobs— добавление списка ссылок с настройками. -
PUT /api/settings— сохранение общих настроек. -
POST /api/jobs/{job_id}/cancelиPOST /api/jobs/{job_id}/retry— управление заданием. -
GET /api/jobs/{job_id}/fileиGET /api/jobs/{job_id}/log— готовый файл и журнал. -
DELETE /api/history— очистка неактивной истории. -
POST /api/choose-folderиPOST /api/open-folder— выбор и открытие папки.
Изменяющие запросы требуют заголовок X-App-Token, полученный через /api/bootstrap. Токен создаётся при запуске сервера. Приложение проверяет заголовки Host и Origin, ограничивает размер изменяющих запросов и задаёт политику безопасности содержимого страницы. Выдача готового файла разрешена только в пределах подпапки соответствующего задания.
Это локальное приложение: в нём нет системы пользователей или авторизации для размещения на публичном сервере. Интерактивная документация Swagger/ReDoc отключена.
Проверка и разработка
Для установки тестовых зависимостей и запуска Python-тестов:
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
.\.venv\Scripts\python.exe -m pytest
Для клиентских тестов нужен Node.js, даже если при скачивании используется Deno:
node --test tests/test_frontend.cjs
Проверки покрывают API и валидацию, выбор качества и языка, очередь и статусы заданий, повтор после остановки, обработку файлов через FFmpeg, диалог выбора папки и обнаружение устаревшего сервера. Медиатестам нужны FFmpeg/FFprobe; проверки Windows-процессов выполняются на Windows.
Текущее состояние внешних компонентов можно посмотреть отдельно:
.\.venv\Scripts\python.exe tools/check_dependencies.py
Необязательная проверка с реальным обращением к YouTube:
.\.venv\Scripts\python.exe tools/smoke_youtube.py
.\.venv\Scripts\python.exe tools/smoke_youtube.py 'https://www.youtube.com/watch?v=jNQXAC9IVRw'
Сценарий скачивает ролик и проверяет его потоки через FFprobe. Его файлы, журнал, события JSONL и итоговый отчёт сохраняются в .test-artifacts/youtube-smoke; пользовательская история не изменяется. Результат этой проверки зависит от доступности YouTube и сети.
После изменения серверного кода полностью перезапустите приложение. Контрольная сумма версии учитывает run.py, Python- и C#-модули приложения и статические файлы, чтобы повторный запуск не использовал устаревший сервер незаметно.
Ограничения и диагностика
Поддерживаемые источники
Принимаются ссылки на конкретные видео YouTube. Плейлисты и каналы не разворачиваются в список роликов. Ссылка на видео с параметром плейлиста скачивает только указанное видео.
Активные и запланированные прямые трансляции отклоняются; можно добавить запись после окончания эфира. Возможность скачать закрытые, удалённые, защищённые или требующие авторизации ролики ограничена. В интерфейсе нет импорта cookies и входа в аккаунт YouTube.
Доступные качество, языки и субтитры зависят от самого ролика. Автоматический перевод и повышение исходного разрешения не выполняются. Изменения на стороне YouTube могут потребовать обновления yt-dlp.
Не хватает компонентов
Повторно выполните setup.ps1, проверьте Node.js/Deno и затем полностью перезапустите приложение. Команда tools/check_dependencies.py показывает, какие компоненты обнаружены.
Не открывается диалог выбора папки
Сначала убедитесь, что сервер перезапущен после обновления исходников. Если помощник Windows не удалось подготовить или открыть, введите путь вручную в разделе «Настройки» и сохраните его. Проверьте доступ на запись в tools/bin и наличие компонентов .NET Framework.
«Not Found» после обновления приложения
Если новая кнопка обращается к отсутствующему маршруту, вероятно, продолжает работать старый сервер. Остановите процесс приложения, снова запустите start.cmd и обновите страницу. Одного обновления вкладки недостаточно.
Загрузка завершилась с ошибкой
Посмотрите сообщение у задания и журнал data/logs/<job_id>.log. При ошибке выбора формата измените язык или качество либо разрешите другую аудиодорожку. При сетевой ошибке проверьте доступ к YouTube и повторите задание.
Для обновления yt-dlp остановите приложение, выполните команду и запустите его снова:
.\.venv\Scripts\python.exe -m pip install --upgrade "yt-dlp[default]"
Готовый файл недоступен через интерфейс
Если файл был перемещён или удалён вручную, сохранённый путь в истории перестаёт работать. Найдите файл в выбранной папке или добавьте ролик в очередь заново.