Введение

Всё началось с комментирования статьи: «Как я написал современный GUI для yt-dlp на Python» ( https://habr.com/ru/articles/930260/ ).

Программа автора мне понравилась, и я обещал ему попробовать сделать аналогичный проект на C++ / WTL.

Так вот, не прошло и полгода, как первая версия аналогичной программы уже готова. Её рабочее название – MiniDL, а исходники доступны на сайтах:

http://polezp.narod.ru/Prg/MiniDL100.zip

и

http://lecole.free.nf/Prg/MiniDL100.zip

или

https://disk.yandex.ru/d/yGQDXbkpk6LPqw

Архив содержит также скомпилированные бинарники для 32-х и 64-х разрядных, релизных версий, под Windows («MiniDL32r.exe» и «MiniDL64r.exe»).

Естественно, создать конкурентный интерфейс профессиональной библиотеке CustomTkinter, для Питона, на сверхлегком движке WTL, за обозримое время, практически невозможно. Но такая задача и не ставилась. Хотелось просто реализовать идею автора – работать с удобной графической оболочкой для консольной программы, в данном случае – внешнем загрузчике медиа-контента из Ютуба и других, поддерживаемых им сайтов.

Ради простоты, пришлось отказаться от попытки реализовать все интерфейсные плюшки автора и ограничиться минималистским вариантом. Тем более что, лично меня он вполне устраивает. Более того, поскольку я привык работать в Total Commander, то там вполне удобно использовать и консольные программы, особенно в паре с командным файлом их запуска, что позволяет перенести туда все параметры командной строки. А, в случае с загрузчиком yt-dlp.exe ситуация оказалась еще лучше, так как, он поддерживает конфигурационный файл, с мощными настройками. Если их хорошо освоить, то, в принципе, ничего больше и не надо. Ведь, эти настройки позволяют легко скачивать не только аудио и видео файлы, но и субтитры к ним и тому подобное. Также, легко и просто указать каталог загрузки, но уже в нашей программе, и не мучиться, как автор, с сохранением их на рабочий стол.

Поэтому, если цель стоит просто загрузить любимые «видосики» из Ютуба, как порознь, так и целиком весь плейлист и, даже канал, то пишем нужный URL (один либо несколько) в командном файле и, при необходимости, меняем настройки в конфигурационном файле, затем, нажимаем клавишу «Enter» на *.cmd файле и вуаля! Процесс запушен, нужные файлы грузятся (при необходимости пользуемся вэпээном) – можно идти заниматься другими делами.

Т.е., я хочу сказать, что консольный вариант работы с программой загрузки меня вполне устраивает, а использование для неё графической оболочки, это не более, чем вопрос вкуса и дополнительного удобства.

Тем не менее, польза от проекта имеется.

Прежде всего, следует сказать, что WTL не предназначена для разработки серьезного графического интерфейса пользователя, хотя, с ее помощью можно делать неплохие вещи. Для примера, смотрите скриншот моей неопубликованной программы «МедиаТекст» для ручного ввода встроенных субтитров видео (рис.1)

Рис. 1. Пример интерфейса программы, на C++ / WTL.
Рис. 1. Пример интерфейса программы, на C++ / WTL.

В данном случае, хотелось, прежде всего, реализовать, на WTL. «тёмную» тему. Китайцы создали для подобных задач свою библиотеку DuiLib, в которой пользовательский интерфейс задаётся во внешних xml-файлах и, более того, даже реализовали собственный редактор DuiLib Editor для модификации GUI извне. В целом, эти вещи неплохие, но громоздкие, как для меня. Поэтому, я предпочел сделать минималистский интерфейс, не только по возможностям, но и по объему кода.

Часть Первая – Результирующая

Скомпилированные файлы, для проекта MiniDL, занимают, по размеру, менее 300 килобайт. Это, конечно, несопоставимо с объемом файлов на Питоне. У автора программы «yt-dlp-gui.exe» размер, «всего лишь» 28 Мегабайт. Правда, сюда входит искомый движок «yt-dlp.exe», который я тоже использую. Но его размер – 18 Мегабайт. Соответственно, на интерфейс CustomTkinter, программы автора, приходится порядка 10 Мегабайт. Понятно, что с таким объемом кода тягаться трудно. Поэтому, видео предосмотр, как у автора, я даже не пытался делать. Да и зачем? Предварительно просмотреть видео можно непосредственно в браузере, на самом Ютубе.

Но, вот «темную» тему попытался реализовать (рис. 2). Соответственно, цвета компонентов, в коде, можно менять по собственному усмотрению.

При первом запуске, программа проверяет, если ли внешний загрузчик, в месте ее расположения. Если нет, то просит его загрузить (рис. 2). Также она смотрит на наличие каталога загрузки «Downloads» в корне программы, которое задано в коде проекта. Если такой папки нет, то она создаётся.

Программа позволяет использовать два вида загрузки данных из Интернета: внешний («yt-dlp.exe») и внутренний («WinInet»). Второй позволяет скачивать «обычные» файлы и страницы из Интернета.

В этом режиме, вы можете нажать клавишу «Enter» либо кнопку «WinInet». Если же внешний загрузчик уже существует, то «Enter» срабатывает для него. Для обычной загрузки – жмите соответствующую кнопку, а не клавишу.

Рис.2. Скриншот программы MiniDL4r.exe при отсутствии внешнего загрузчика.
Рис.2. Скриншот программы MiniDL4r.exe при отсутствии внешнего загрузчика.

На рис. 3 показан процесс «обычной» загрузки, для произвольных URL, Соответственно, можно скачивать и другие файлы, например, первую версию обучающей программы «L'école» (рис. 4). Если же, нужна более свежая версия, то она доступна на Яндекс-Диске: https://disk.yandex.ru/d/5yjYP4JP1aVnIw , и загружается только в браузере, так как, прямая ссылка, там всегда временная и привязана к нему.

Рис. 3. Процесс «обычной» загрузки файла «yt-dlp.exe».
Рис. 3. Процесс «обычной» загрузки файла «yt-dlp.exe».
Рис. 4. Процесс «обычной» загрузки для другого файла.
Рис. 4. Процесс «обычной» загрузки для другого файла.

Посмотрим, теперь, как загрузить плейлист, с нашего канала (в данном случае они совпадают). Для примера, выберем ссылку: https://www.youtube.com/@scholium9807 (рис. 5).

Рис. 5. Скриншот выбранного канала на Ютубе, который будет загружен программой MiniDL64r.exe.
Рис. 5. Скриншот выбранного канала на Ютубе, который будет загружен программой MiniDL64r.exe.

Процесс загрузки показан на рис. 6.

Рис. 6. Пример загрузки выбранного канала.
Рис. 6. Пример загрузки выбранного канала.

Как мы видим, загружено только пять файлов из девяти. Это связано с настройками в конфигурационном файле «yt-dlp.conf»:

#--no-playlist

-I, --playlist-items 1:5          / Скачать диапазон с 1 по 20 видео в плейлисте

Мы заблокировали запрет на скачивание плейлистов (символ «#») и, наоборот, разблокировали строку с максимальным количеством загружаемых видео в плейлисте (но уменьшили значение, по умолчанию, 20 до 5).

Также в конфигурационном файле, по умолчанию, можно менять формат имени загружаемых файлов, максимальное качество видео («bestvideo*[height<=1080]»), частоту кадров («[fps<=30]») и максимальное качество звука («+bestaudio»). Кроме того, для субтитров мы указали флаги:

--sub-langs "fr, ru, en"

--sub-format "srt/best"

--write-subs

Соответственно, субтитры, в формате *.srt, на французском, русском и английском языках, будут загружаться в наш корневой каталог «Downloads», если они присутствуют в оригинале. Естественно, все указанные параметры можно менять на свой вкус. Однако в мою задачу не входит их подробное объяснение

Часть Вторая – Техническая

Я не буду подробно говорить о коде проекта. Он небольшой, хорошо структурирован и прокомментирован. При желании, вполне можно разобраться.

Скажу только, что без использования ИИ-сервисов (бесплатных, платными я не пользуюсь) мне бы не удалось решить проблемы с эмуляцией собственного фрейма, изменения его размеров, работы с собственными системными кнопками и кастомизацией стандартных элементов управле��ия.

Особенно важно, для меня, было разобраться со стилем кнопок «BS_OWNERDRAW», который позволяет использовать пользовательское рисование, без применения сабклассинга и перегрузки внешних изображений.

Так что, если ИИ (даже бесплатному) задавать очень конкретные вопросы, в стиле know-how («знать как»), то вполне можно получить значимый ответ, буквально, с первой попытки. Только, код, при этом, все равно, нужно будет шлифовать и наводить там «красоту». В целом, (бесплатный) ИИ склонен давать «грязный» код и отнюдь не стремиться делать его оптимальным. Скомпилировался – это уже успех. Тем не менее, поддержку от него я получил существенную.

Кроме того, реализован достаточно неочевидный процесс перехвата потока сообщений консольной программы и перенаправление его в стандартный многострочный редактор, типа, CEdit.

Выводы

Несмотря на то, что представленный проект MiniDL, не слишком важен, сам по себе, он достаточно полезен для разбора тонких вопросов по созданию, точнее, эмуляции «тёмной» темы средствами C++ / WTL и оптимальной кастомизцией стандартных компонентов Windows.

Ну, а какую программу использовать: «yt-dlp-gui.exe» либо «MiniDL64r.exe» (можно и другие, но мы говорим здесь, об этих) решать уже вам. Мне, естественно, больше нравится собственная программа.