YouTube downloader C#

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


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

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

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

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

  • NewtonSoft JSON
  • Object ListView

В данный момент проект находится в сыром состоянии. Есть явные косяки в GUI, о которых я знаю. Например, оно крашится, если ввести ссылку на заблокированное или несуществующее видео :man_shrugging: Исправлю это в ближайшее время, как только допилю ветку api (сейчас она тестируется). Создавать больше одной дополнительной ветки - не хочу :point_up:
Сам код тоже требует рефакторинга - это тоже, со временем, будет сделано.
Чтобы процесс шёл быстрее, мне нужны тестировщики. Если кто-то качает с ютуба - погоняйте прогу, пож :man_shrugging:

1 симпатия

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

  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 симпатия