YouTube downloader C#

Я очень много качаю с ютуба. Но все существующие программы сводятся к тому, что надо скопировать из браузера ссылку на видео и вставить в программу. А потом ещё отредактировать название, подписать дату, картинку найти и скачать и т.п. И так для каждого видео. Недавно я понял, что так больше продолжаться не может и накидал свою версию скачивалки :point_down:



Хочу отметить, что это не очередная обёртка над youtube-dl, а, так сказать, самостоятельный код (сильный и почти независимый :point_up: )

Возможности:

  • Выбор качества видео (ну как же без этого? :rofl: ) выше чем 720p. Выше чем 4K не проверял.
  • Возможность скачивания адаптивных форматов без объединения их в контейнер.
  • Возможность скачивания аудио-дорожки отдельно.
  • Возможность скачивания нескольких выбранных форматов с объединением (или без) их в контейнер.
  • Перехват прямых трансляций (стримов). Для этого требуется отдельно скачать ffmpeg.exe (подходят не все версии :point_up: ).
  • Скачивание начала идущего стрима, если вы его пропустили (работает с оговорками из-за ограничений API ютуба). ffmpeg.exe при этом не требуется.
  • Получение списка видео с указанного канала в выбранном диапазоне дат (требуется ввести ключ разработчика от YouTube API V3). В будущих версиях от ввода ключа можно будет избавиться :point_up:
  • Создание списка избранных видео и каналов

Зависимости:

  • YouTubeApiLib
  • MultiThreadedDownloaderLib
  • NewtonSoft JSON
  • Object ListView

В данный момент проект находится в сыром состоянии. Есть явные косяки в GUI, о которых я уже знаю (или ещё не знаю). Например, оно крашится, если ввести ссылку на некоторые заблокированные или несуществующие видео :man_shrugging:
Сам код тоже требует рефакторинга - это тоже, со временем, будет сделано.
Чтобы процесс отлова багов шёл быстрее, мне нужны тестировщики. Если кто-то качает с ютуба - погоняйте прогу, пож :man_shrugging:
На всякий случай выкладываю скомпилированные бинарники (x86 и x64):
YouTubeDownloader.7z (455,3 КБ)

2024.07.21

2 лайка

Есть предложения/замечания.

  1. У меня программа запускается в «сжатом по вертикале» виде, из-за чего в левой части появляется вертикальная прокрутка:


    Или это так задумано?

  2. Думаю, что было бы удобнее, если рядом с полями ввода была кнопка для вставки информации из буфера обмена.
    image
    Я понимаю, что можно с помощью ПКМ вызвать контекстное меню, где можно выбрать соответствующий пункт или вообще сделать CTRL+C, но я считаю, что могут возникнуть ситуации, когда удобнее всего будет воспользоваться обсуждаемой кнопкой.

  3. Группа переключателей «Количество результатов выдачи»
    image
    Наверное, было бы удобнее, если при изменении кастомного количества результатов автоматически активировался соответствующий ему переключатель…

  4. Реализовать поддержку пресетов (наборов настроек). Например, мы задаём некий набор настроек, в частности, папку для сохранения скачанных файлов. Сохраняем этот пресет под именем «Пресет 1» (имя можно менять). Далее, создаём новый пресет «Пресет 2», которому ставим в соответствие другие значения параметров, в частности, ту же папку для результатов, например. В итоге, мы имеем два пресета, между которыми можем переключаться и, соответственно, сохранять файлы в разные директории, возможно, с разными форматами имён.

Зачем это может пригодиться?
Я скачал эту программу себе и положил её в папку на яндекс диске. Папка расшарена, поэтому пользоваться программой может другой человек. Понятно, что у него может быть своё видение относительно использования программы, например, он всегда хочет аватары видео, а я — нет; он сохраняет скачанное себе в папку, например, e:\my downloads, а у меня нет тома даже в такой буквой. Кроме того, он использует в качестве браузера firefox, а я — google chrome. Выбор того или иного пресета будет осуществляться в разделе с настройками программы.

Это нормально. Так задумано. У меня на одном компе стоит старый монитор с маленьким разрешением. Если отображать полное окно, оно занимает пол-экрана. Не удобно.

Не уверен :man_shrugging: Тогда перед вставкой придётся дополнительно проверять ссылку на валидность.
Может быть сделаю.

Тоже сомнительное удобство :man_shrugging:

А вот это неплохая идея :thinking: Надо будет запилить :point_up:

Это как? Разве яндекс-диск можно подключать как сетевую папку? :thinking: Первый раз слышу.

Там и так сейчас нет проверки на валидность перед отправкой запроса на скачивание. Может, и при вставке не требуется? Ну, ладно, я просто предложил.

Для папки на яндексДиске можно настроить общий доступ

После выбора этого пункта система предложит ввести e-mail пользователя, которому нужно открыть доступ. Если у того пользователя есть десктопное приложение яДиска, то расшариваемая папка появится на его компьютере, и с ней можно будет работать так же, как и с папкой, расшаренной в пределах локальной сети. При этом, она будет работать, даже если компьютер хозяина папки будет выключен.

Всмысле нет? :thinking: Там же проверяется ссылка

        private void btnSearchByUrl_Click(object sender, EventArgs e)
        {
            DisableControls();

            string url = editSearchUrl.Text;
            if (string.IsNullOrEmpty(url) || string.IsNullOrWhiteSpace(url))
            {
                MessageBox.Show("Не введена ссылка!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                EnableControls();
                return;
            }

            string videoId = ExtractVideoIdFromUrl(url); //<<<<<вот тут
            if (string.IsNullOrEmpty(videoId) || string.IsNullOrWhiteSpace(videoId))
            {
                MessageBox.Show("Не удалось распознать ID видео!", "Ошибатор ошибок",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                EnableControls();
                return;
            }

            if (videoId.Length != 11)
            {
                MessageBox.Show("Введённый вами или автоматически определённый ID видео " +
                    $"имеет длину {videoId.Length} символов. Такого не может быть!", "Ошибатор ошибок",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                EnableControls();
                return;
            }
           ...........

Вот этого не знал.

Ну это понятно. Файлы же у яндекса лежат.

Код проверяет только ситуации, когда поле ввода пустое или заполнено пробелами. Но не обрабатываются ситуации, когда вместо валидного url введено что-то другое. Я чётко помню, что я вводил что-то такое в поле для ссылки или id, отчего у меня программа крашилась, но сейчас я что-то не могу воспроизвести такую ситуацию, но до этого сталкивался дважды. Если столкнусь снова, сообщу.

Кстати, есть, например, вполне валидные ссылки, которые программа тоже отвергает. Например, для такой ссылки https://www.youtube.com/embed/b7tu0jWVkSU программа говорит, что не может извлечь id видео.

А ещё вопрос. Зачем перед показом сообщения об ошибке дисейблить контролы? Ведь показываемые сообщения являются модальными окнами, которые и так блокируют форму до тех пор, пока не будут закрыты…

Введите любые 11 символов без https:// в начале и получите краш. Это потому что программа считает, что вы вводите ID видео. А так как проверки на существование видео нет - то получается краш.
Пару часов назад я уже исправил эту ошибку (но коммиты ещё не заливал).

Ок, допилю парсер.

Это просто старая привычка :man_shrugging:

1 лайк

@BlackRain666
Скажите, а что по поводу скачивания аудио в формате mp3? Я понимаю, что, как я читал, он умер, но всё же? Я верно понимаю, что вы от него отказались?

Вопрос вдогонку. Что означает чёрно-белая полоса под прогресс-баром в секции скачивания файла?
image

Я ни от чего не отказывался. Ютуб хранит аудио в двух форматах - m4a (который AAC) и weba (который OPUS Audio). Каждый из них - в нескольких вариантах - с разным битрейтом. MP3 там просто нет :man_shrugging: Если какая-то скачивалка (или сайт) может достать МР3 - это конвертация. Моя программа ничего не конвертирует, а просто качает как есть.
Подключать какую-то библиотеку для конвертации - нафиг не хочу :nauseated_face: Потому что M4A даже встроенным в винду плеером нормально играется :man_shrugging:

Это недопиленный скроллбар :slightly_smiling_face: У меня всегда что-то недопилено.
Но зато можно взяться за пустую область
Screenshot
и потащить.

1 лайк

Запилил важную имба-функцию:

Такого точно ни в одной качалке нет (по совершенно непонятным мне причинам :man_shrugging: ).
Можно даже скачать несколько дорожек видео, а потом в плеере их переключать. Правда, не знаю ни одного плеера, который так может (кроме моего :grin: ). Хотя и не утверждаю, что их не существует :man_shrugging:
Короче, просьба потестить новую функцию.

А зачем это надо?? Пользователю как правило нужно видео в хорошем качестве без регистрации и смс а форматы его мало волнуют. Если видос не грузится то пользователь в бешенстве ставит минус и идет искать то место где будет грузится.
Кому нужны эти контейнеры?

Пример 1: У меня слабый комп, который плохо тянет 4K. А я очень часто делаю так: ставлю на один монитор какое-то видео без звука (чтобы оно там постоянно крутилось), а на втором мониторе что-то делаю. Естественно, если включить видео в максимальном качестве, то всё будет тормозить. По-этому, приходится качать видео два раза в разных вариантах качества, как-то их подписывать и т.п. При этом, оба файла будут содержать одну и ту же звуковую дорожку. А зачем? :thinking: Если можно скачать нужные дорожки, объединить их в контейнер, и в плеере переключать.
Пример 2: Ютуб иногда создаёт видео в большем разрешении, но с меньшем битрейтом. И в меньшем разрешении, но с бОльшим битрейтом. Какой же выбрать? :thinking: А зачем выбирать, если можно скачать оба формата, объединить их в контейнер и в плеере переключать? :bulb:

Для HDR, 3D (VR) и т.п. версий возможно полезно )

Обычно лучше просто быстро оценить что больше нравится и выкинуть остальное освободив место.

Такой комп сейчас не просто найти. Даже мини-ПК за 200 евро должны тянуть.

image

Я так не могу :neutral_face:

Я в 2017 нашел :grinning:

Ну не все пользователи такие. Мало кто толком понимает что такое форматы и прочая лабуда. У людей бумагу то в принтер вставить не всегда получается. Или папку открыть на рабочем столе вызывает коллапс головного мозга, а вы им про форматы и контейнеры …

хз … у меня в штате есть компы с core2Duo так даже они вроде без отдельной видяхи показывают такое видео, а уж от 17 года так точно должны.

Но это не значит, что нужно сознательно ограничивать функционал программы. Продают же кому-то 4K video downloader с каким-то “умным режимом” за 1000 рублей :sweat_smile: Интересно, насколько он там умный.

Это ещё сильно от битрейта и декодера зависит. Если битрейт сравнительно небольшой, то всё нормально. Только вот смысл такого 4К, которое на квадратики рассыпается, мне категорически не ясен :man_shrugging:

Запилил ещё одну имба-фичу. Можно использовать оперативную память для хранения временных файлов (только в билде х64).
Для чего это надо? Сейчас закачка происходит следующим образом:

  1. Во временную папку скачиваются сегменты (чанки) видео-файла.
  2. Чанки объединяются в целый файл во второй временной папке.
    2.1) При этом, если обе папки находятся на одном физическом диске - всё будет тормозить. Потому что происходит запись на тот же диск, с которого читается.
  3. Если формат видео адаптивный, то происходит слияние дорожек в единый контейнер.

Я часто качаю большие файлы (по 2-3 гигабайта). Для ускорения приходится гонять дополнительный HDD. Но теперь можно просто использовать оперативную память (которой у меня, обычно, свободно 5GB). Это позволяет пропустить пункт 2.1 и ускорить процесс объединения чанков. Особенно сильно это помогает на ноутбуках, где вообще один HDD (а они там заметно медленнее, чем на компах).

Ещё запилил:

  • Проверка свободного места (требуются дополнительные 10% от общего объёма скачиваемых файлов). Но, с учётом возможности выбора папок, алгоритм проверки довольно запутанный. Не уверен, что всё правильно работает :man_shrugging:
  • Сортировка списка форматов. Файлы сортируются по размеру (бОльшие сверху).
  • Настройки размера шрифтов некоторых элементов GUI.

Запилил кучу новых бесполезных настроек :grin:

Недавно с ютубом опять что-то стало. При попытке поиска по ссылке (или ID) программа крашится с какими-то странными ошибками. Сейчас точно не вспомню текст ошибок. Что-то типа “Удалённый сервер вовремя не ответил на подключение” и “Не удалось установить соединение с сервером <какой-то-там-IP-адрес>.”. Если повторять попытку много раз, то поиск сработает. При попытке скачивания, где-нибудь в середине выдаёт ошибку “Данный ключ отсутствует в словаре”.
Но если подождать пару часов (или сутки), то на тех же видео ошибки пропадают.
Это у всех так или только у меня?

2024.06.27

Много исправлений. Все не помню. Можно посмотреть в коммитах.
Главное видимое улучшение в том, что теперь меню выбора формата выглядит вот так:


А не так:

Размер шрифта можно уменьшить в настройках, если это нужно.