Нативный загрузчик видео и аудио на C++20 / Qt 6 Widgets. Движок — yt-dlp с явным подключением Deno; объединение потоков и обработка аудио выполняются FFmpeg.
- Простые пресеты: Лучшее, 1080p, 720p, 480p и MP3.
- Расширенный выбор после проверки ссылки: разрешение, кодек, частота кадров, оригинальное аудио и MP3 с целевым битрейтом 192/320 кбит/с. Оценка размера показывается при наличии данных; размер отдельного видеопотока подписан отдельно.
- Очередь с ограничением параллельности, настоящим прогрессом и этапом обработки. Отмена остаётся отменой; неудачные и отменённые задачи можно повторять.
- Незавершённая очередь сохраняется атомарно и восстанавливается после перезапуска. Закрытие приложения не удаляет скачанные файлы.
- Метаданные: до трёх процессов одновременно, объединение одинаковых запросов и кеш на 128 ссылок. Ошибка проверки не запрещает загрузку с простым пресетом.
- Завершённые карточки удаляются из интерфейса и памяти.
- История до 500 записей: поиск, открытие файла/папки, повтор, копирование ссылки и удаление записи. Интерфейс показывает время MSK (UTC+3), хранение — UTC.
- Фоновое обновление runtime с прогрессом, отменой сетевой стадии, таймаутом, SHA256 и откатом. FFmpeg и ffprobe заменяются вместе.
- Диагностика с удалением секретов; журналы ограничены 2 МБ на файл и одной резервной копией.
Вставьте HTTP(S)-ссылку, выберите пресет и нажмите «Добавить в очередь». «Проверить» показывает название, автора, длительность и форматы. Расширенный выбор необязателен.
Ctrl+L — ссылка, Ctrl+I — проверка, Ctrl+D — добавить, Ctrl+O — папка загрузок, Ctrl+Q — выход.
«Инструменты» показывает версии, пути и целостность всех четырёх компонентов. Во время их использования конфликтующие обновления недоступны. Сетевую загрузку обновления можно отменить; стадия установки должна завершиться для сохранения целостности runtime.
Опубликованные релизы доступны отдельно от этой рабочей ветки. Реализация 5.0 не означает публикацию нового релиза.
Локальная сборка создаёт:
dist/VideoDownloaderPro-<version>-win-x64.zip— переносная Windows-версия;dist/VideoDownloaderPro-Setup-<version>.exe— установщик без обязательных прав администратора;dist/VideoDownloaderPro-<version>-macos-x64.zip— macOS Intel;SHA256SUMS-windows.txt/SHA256SUMS-macos.txt.
Qt и runtime входят в пакеты. Python для запуска приложения не нужен; стандартная библиотека Python используется только в скриптах подготовки релиза.
%LOCALAPPDATA%/VideoDownloaderPro/
├── runtime/ yt-dlp, Deno, ffmpeg/bin, manifest.json
├── data/settings.ini совместимые ключи настроек
├── data/history.json чтение прежнего массива, запись schema 1
├── data/queue.json незавершённые задачи, schema 1
├── logs/ app.log, downloads.log, runtime.log
└── cache/ временные файлы обновлений
macOS использует ~/Library/Application Support/VideoDownloaderPro. Тесты и smoke задают отдельный VDP_DATA_ROOT — корневую папку данных приложения — и не затрагивают пользовательские настройки/runtime.
Повреждённая очередь сохраняется в .recovery-<id>.json; приложение сообщает об ошибке и продолжает запуск. Непонятный формат истории не перезаписывается. У прежних установленных инструментов целостность может быть неизвестной; проверенный пакет или обновление добавляют подтверждённый SHA256 в manifest.
CMake 3.21+, Ninja, C++20-компилятор, Qt 6.6+ (Core, Widgets, Network, Test). Python 3.11+ нужен для packaging и его тестов. Локально проверяются Qt 6.8.3 / MSVC 2022 x64. Для MSVC используйте Developer PowerShell или окружение vcvars64.bat. Qt bin должен быть в PATH при запуске тестов.
cmake -S . -B build-cpp/pro5 -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$env:Qt6_DIR" -DBUILD_TESTING=ON
cmake --build build-cpp/pro5 --clean-first --parallel 4
ctest --test-dir build-cpp/pro5 --output-on-failure
python -m unittest discover -s scripts -p test_release_tools.py -v
python scripts/release_tools.py validate-lockТесты не обращаются к YouTube: используются локальные дочерние процессы, подставной HTTPS-транспорт и временные файлы; GUI проверяется через Qt Test. Packaging также проверяет настоящий yt-dlp на собственном видео с локального HTTP-сервера, извлечение MP3 через FFmpeg/ffprobe и запуск упакованного приложения с изолированными данными.
Windows требует Inno Setup 6:
./scripts/build_release_windows.ps1 -QtDir "$env:Qt6_DIR" -InnoSetupCompiler "$env:ISCC_PATH"-SkipToolDownloads принимает только кеш с проверяемым manifest и совпадающими SHA256. Сборка использует build-cpp/pro5-package; другие каталоги сборок не очищаются.
На macOS:
QT_ROOT_DIR=/path/to/Qt/6.8.3/macos bash scripts/build_release.shПроверенные FFmpeg-пакеты Evermeet — Intel. На Apple Silicon для них требуется Rosetta; нативная совместимость этого runtime не заявляется. Сборку, smoke и подпись необходимо подтвердить на macOS.
runtime/toolchain-lock.json — общий источник артефактов для приложения и packaging. yt-dlp, Deno и Windows FFmpeg проверяются по HTTPS-документам SHA256 с выбором точного имени файла. Для macOS FFmpeg/ffprobe зафиксированы реальные SHA256 архивов, проверенных по подписям поставщика. Несовпадение, отсутствие контрольной суммы или неудачный запуск отменяют установку с сохранением предыдущего runtime.
Каноническая версия находится в CMake project(... VERSION ...); python scripts/release_tools.py version выводит её для скриптов. PR и push в main проверяют обе платформы. Только тег v<version> запускает выпуск, требующий успешных Windows/macOS jobs и прикладывающий оба пакета с SHA256SUMS. Локальные build-скрипты не делают push или публикацию.
Необязательная подпись: Windows — VDP_SIGN_CERT_PATH / VDP_SIGN_CERT_PASSWORD; macOS — VDP_MAC_SIGN_IDENTITY / VDP_MAC_NOTARY_PROFILE. Без них Windows-сборка неподписанная, macOS использует ad-hoc подпись. Секреты CI задаются вне репозитория.
О компонентах и обязанностях при распространении: THIRD_PARTY_NOTICES.md. Лицензия проекта от имени владельца не назначалась.
Плейлисты, субтитры, клипы, cookies браузера, proxy UI и самообновление приложения отложены как P2. Фактические acceptance gates и ограничения: отчёт реализации.