Comments 37
Техчасть объяснена грамотно: код компактный, без лишних зависимостей, логика понятная. Использование FFmpeg через .NET - решение простое и рабочее.
Если разработка утилиты не самоцель, то рациональнее просто взять готовый yt-dlp
Условия использования у YoutubeExplode кстати интересные
спасибо за комментарий! Вы абсолютно правы, yt-dlp - это мощнейший и, пожалуй, лучший универсальный инструмент для этой задачи.
Цель моей статьи была скорее образовательная: показать, как с помощью C# и такой удобной библиотеки, как YoutubeExplode, можно собрать подобный инструмент самостоятельно, для души или для встраивания в свои .NET-проекты. Это больше про "как это сделать", а не про "какой готовый инструмент лучше".
И отдельное спасибо, что обратили внимание на "интересные" условия использования YoutubeExplode. Вы очень точно подметили их, скажем так, нетривиальность. Это довольно известная особенность библиотеки, и, насколько я знаю, именно она объясняет такое большое количество форков на GitHub. При желании этот специфичный код довольно легко найти и убрать из локальной копии.
Хочется простой и быстрый инструмент для скачивания видео с YouTube? Решение есть — написать его самому!
Плохое решение. Стабильно раз в месяц youtube меняет алгоритмы, поэтому старые утилиты для скачивания с него видео перестают работать. Так что вам придётся постоянно следить за её актуальностью, иначе ваша утилита через месяц перестанет нормально работать.
Более того, ютуб будет троттлить такую закачку. Там же скрипт-детектор выполняется на клиенте. Тут была статья про это. Тот же yt-dlp это использует. А для закачки нужно знать только 2 команды: -F для получения списка потоков и -fY+X для закачивания, где X и Y номера потоков из предыдущей команды.
огромное спасибо за такой глубокий технический комментарий! Это именно тот ценный инсайт, который обогащает статью и показывает, насколько сложнее всё устроено «под капотом».
Вы совершенно правы насчет троттлинга. То, что yt-dlp умеет обходить это с помощью эмуляции клиентских скриптов - это действительно высший пилотаж и одна из причин, почему он по праву считается лучшим инструментом в своем классе.
Я и сам, кстати, столкнулся с этим на практике, что только подтверждает ваши слова. Когда я тестировал утилиту и пытался скачать подряд несколько видео для отладки, YouTube действительно временно заблокировал доступ с ошибкой 403. Однако, ограничение проходит само собой через некоторое время.
Поэтому для моей цели -скачать для личных нужд пару роликов в день - это не стало критичной проблемой. Но ваше замечание абсолютно в точку: как только речь заходит о больших объемах, без продвинутых техник, которые использует yt-dlp, уже не обойтись.
Еще раз спасибо, что поделились своим опытом и знаниями. Такие комментарии делают Хабр лучше!
вы затронули самую главную "боль" всех подобных проектов! И вы совершенно правы: поддерживать такую утилиту в одиночку - это огромный труд.
Именно поэтому я и сделал ставку на библиотеку YoutubeExplode. Её автор и сообщество как раз и занимаются тем, что оперативно отслеживают изменения YouTube и выпускают обновления. Таким образом, "поддержка" моей утилиты сводится к простому обновлению NuGet-пакета. Это хороший пример того, как использование библиотек с активной поддержкой решает сложные проблемы.
Или используем Hitomi downloader. Он там вообще с приличного списка сайтов может качать. В виде программы для windows на гитхабе он есть.
Любят же люди себе жизнь усложнять.
Все просто:
Создаете группу тг и добавляете туда как участника любого бота для скачивания видео (даете ему максимальные права)
Через "собака"vid ищете сылку на видео и отправляете ее чат. В ту же секунду бот присылает сообщение, где можно выбрать формат скачивания.


все намного проще чем свой код писать
Классное решение, но код писать тоже просто =)
Зачем группа, можно сразу написать боту?
все намного проще чем свой код писать
но код есть на гитхабе, его не нужно писать, если не хочется. странная ремарка.
к тому же здесь вроде как большинство людей любит писать код. по крайней мере я очень на это надеюсь)
Так самое интересное же как раз в библиотеке YoutubeExplode! Я-то думал, тут как раз расскажут, как ссылки на видео и аудио найти, как чанки в нужном качестве скачать, че там за формат, какие кодеки, как из них целый видос собрать.
А тут статья вида «берем готовую либу и используем (
Тоже ждал написание логики с нуля, а не готовую либу
Вау, классный комментарии. Я понимаю ваши ожидания. Тема разбора внутреннего устройства YouTube, поиска ссылок на чанки и их сборки - невероятно интересная и сложная.
Честно говоря, такой глубокий анализ потянул бы на целую серию статей, а не на один гайд. Моей целью было показать, как можно быстро решить практическую задачу, используя современные инструменты в экосистеме .NET.
Но ваша обратная связь очень ценна. Она показывает, что есть интерес и к более "низкоуровневым" статьям. Возможно, в будущем я попробую разобрать какой-то из этих аспектов отдельно. Спасибо вам огромное за то, что поделились своим мнением и подтолкнули в этом направлении. Это ценно!
оно даже не компилится
Ошибка сборки.
C:\wprt\ytdcs\Program.cs(2,18): error CS0246: Не удалось найти тип или имя пространства имен "ConfigurationBuilder" (возможно, отсутствует директива using или ссылка на сборку). [C:\wprt\ytdcs\ytdcs.csproj]
C:\wprt\ytdcs\Program.cs(13,19): error CS0246: Не удалось найти тип или имя пространства имен "YoutubeClient" (возможно, отсутствует директива using или ссылка на сборку). [C:\wprt\ytdcs\ytdcs.csproj]
C:\wprt\ytdcs\Program.cs(21,32): error CS0103: Имя "Container" не существует в текущем контексте. [C:\wprt\ytdcs\ytdcs.csproj]
C:\wprt\ytdcs\Program.cs(30,36): error CS0103: Имя "Container" не существует в текущем контексте. [C:\wprt\ytdcs\ytdcs.csproj]
C:\wprt\ytdcs\Program.cs(43,32): error CS0103: Имя "Container" не существует в текущем контексте. [C:\wprt\ytdcs\ytdcs.csproj]
C:\wprt\ytdcs\Program.cs(60,7): error CS0103: Имя "AnsiConsole" не существует в текущем контексте. [C:\wprt\ytdcs\ytdcs.csproj]
Предупреждений: 0
Ошибок: 6
Огромное спасибо, что нашли время попробовать код из статьи и, что еще важнее, сообщили об этой проблеме. Вы абсолютно правы - код, скопированный прямо из статьи, не скомпилируется, и это мое упущение, что я не сделал на этом акцент.
В статьях для краткости часто опускают using директивы в начале файла. Чтобы все заработало, достаточно добавить в самое начало вашего файла Program.cs вот эти строки:
using Microsoft.Extensions.Configuration;
using Spectre.Console;
using YoutubeExplode;
using YoutubeExplode.Converter;
using YoutubeExplode.Videos.Streams;
Кстати, чтобы сэкономить ваше время на следующем шаге, хочу сразу подсказать еще один момент. Когда программа скомпилируется, для скачивания ей понадобится утилита ffmpeg.exe. Как я упоминал в статье, ее нужно скачать отдельно (например, с Release Zeranoe FFmpeg builds · tomaszzmuda/Xabe.FFmpeg ) и положить файл ffmpeg.exe в папку с вашей скомпилированной программой (обычно это bin/Debug/...). Без него программа запустится, но при попытке скачать видео выдаст ошибку.
Ваш комментарий очень помог мне увидеть это слабое место в статье. Я обязательно добавлю уточнения и про using-директивы, и про ffmpeg, чтобы у других читателей не возникло таких сложностей.
Спасибо. Получилось. Но дальше....
System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
Попробовал yt-dlp:
EOF occurred in violation of protocol
Выше посоветовали взять какой-нибудь телеграм-бот. Попробовал несколько разных. Нет, не ругаются. Но ничего не скачивают. Ни один.
Спасибо, что отписались! И отдельное огромное спасибо за то, что проверили на yt-dlp и ботах - это суперценная информация, которая помогает найти причину.
Предположительно при скачивании видеопотока, кто-то принудительно оборвал соединение. Программа ожидала получить данные, а получила "конец файла".
Ты воспроизводишь схожую ошибку в нескольких инструментах, что вероятнее всего проблема не в коде, а в вашей сети. Скорее всего, это ваш интернет-провайдер (или, возможно, корпоративный файрвол, если вы в рабочей сети) блокирует прямые загрузки с YouTube.
Я написал вам в личные сообщения. Если у вас будет желание, давайте попробуем разобраться в ситуации вместе. Мне и самому очень интересно, в чем там дело.
Я знаю кто-то блокирует, если пользоваться ими с наших айпи. Надо именно с ВПН.
Такое ощущение что все комменты написаны gpt4. Много оборотов, прилагательных, "вы правы", "особенно ценно" и тд, на создание максимально дружелюбного диалога. Люди так не пишут, а если и пишут, то не в 100% ответов
Вы меня поймали! Это, пожалуй, самый проницательный комментарий из всех.
Буду честен: это моя первая статья, и я очень хотел, чтобы диалог с сообществом получился максимально уважительным и конструктивным. Поэтому я действительно старался отвечать по всем канонам "искусства общения".
Ваш комментарий - отличное напоминание, что когда слишком сильно стараешься следовать правилам, можно потерять в человечности и звучать немного... как вежливый робот :) Спасибо, что подметили. Буду работать над этим!
Пользуйтесь свободным от хохлятских соплей форком пакета: https://www.nuget.org/packages/Etherna.YoutubeDownloader/.
Я для себя пишу self-hosted telegram bot враппер для yt-dlp. Больше для того, чтоб чуть научиться go (не программист, ни разу, админ). Тоже сначала замахнулся на «напишу свой клиент», а потом увидел список поддерживаемых платформ у yt-dlp и махнул рукой.
А можно для совсем новичков. А какой инструментарий использовать? Про библиотеки то понятно. А какую IDE использовать? Visual Studio саму последнюю версию? А какие компоненты включить, если VS с нуля ставить придется?
Спасибо за хороший и очень важный вопрос. Самый простой и удобный путь для старта - это Visual Studio.
Скачайте Visual Studio Community с официального сайта Microsoft. Это полнофункциональная и, что важно, бесплатная версия. Самая последняя версия (на данный момент 2022) это то, что вам нужно.
При установке Visual Studio вам будет предложено выбрать так называемые «Рабочие нагрузки» (Workloads). Для нашего консольного проекта вам будет достаточно всего одной: «Разработка классических приложений .NET» (или .NET desktop development, если у вас английская версия). В нем будет всё необходимое: компилятор, библиотеки (.NET SDK) и шаблоны для создания консольных приложений. Больше ничего для этого проекта не понадобится.
После установки вы сможете либо создать свой проект с нуля (Файл -> Создать -> Проект -> Консольное приложение), либо, что еще проще, открыть мой готовый проект, скачанный GitHub.
Можно также запустить без редактора и отдельно установить .NET SDK. Шаги будут следующими.
Установите .NET SDK (Software Development Kit). Это самое главное — сам движок .NET, который позволяет создавать и запускать код.
Перейдите на официальный сайт .NET.
На этой странице найдите и скачайте установщик для .NET SDK. Важно: скачивайте именно SDK, а не Runtime. Обычно это самая большая и заметная кнопка. (версия например, .NET 9).
Чтобы убедиться, что всё установилось, откройте терминал (на Windows это PowerShell или Командная строка, на macOS/Linux — Terminal) и введите команду:
dotnet --version
Должно отобразиться установленная версия. Если команда выполнилась успешно и вы увидели ту версию, которую скачивали, значит, всё прошло успешно! Дальше проще.
Получение кода проекта
В открытом терминале перейдите в папку, где бы хотели что бы был данный проект. Команда например
cd C:\github
Теперь выполните одну команду, которая скачает весь мой проект с GitHub в эту папку:
git clone
https://github.com/DNsam/YoutubeDownloader.git
Эта команда создаст новую папку YoutubeDownloader со всем необходимым внутри.(Если у вас нет Git: просто зайдите на страницу https://github.com/DNsam/YoutubeDownloader, нажмите зеленую кнопку <> Code и выберите Download ZIP. Скачайте архив и обязательно распакуйте его в удобное для вас место.)
Запуск программы! Это финальный шаг.
В терминале перейдите в папку с проектом, которую вы только что скачали например:
cd C:\github\YoutubeDownloader
Теперь выполните команду:
dotnet run
Эта команда автоматически восстановит все зависимости (библиотеки), скомпилирует проект и запустит его.
После выполнения команды вы увидите в консоли приглашение:Enter a YouTube video URL:.
Поздравляю, у вас всё получилось
Если возникнут еще трудности - смело спрашивайте
11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 11010001 10000001 11010001 10000010 11010000 10110010 11010001 10000011 11010001 10001110 00100000 11010001 10000010 11010000 10110101 11010000 10110001 11010001 10001111 00100000 11010000 10110001 11010001 10000000 11010000 10110000 11010001 10000010 00101100 00100000 11010001 10000010 11010000 10110010 11010000 10111110 11010001 10001111 00100000 11010001 10000001 11010001 10000010 11010000 10110000 11010001 10000010 11010001 10001100 11010001 10001111 00100000 11010000 10111111 11010000 10111110 11010000 10111011 11010001 10000011 11010001 10000111 11010000 10111000 11010000 10111011 11010000 10111110 11010001 10000001 11010001 10001100 00100000 11010000 10111110 11010001 10000111 11010000 10110101 11010000 10111101 11010001 10001100 00100000 11010001 10000101 11010000 10111110 11010001 10000000 11010000 10111110 11010001 10001000 11010000 10111000 11010000 10111100 00101100 00100000 11010001 10000010 11010001 10001011 00100000 11010001 10000101 11010000 10111110 11010001 10000000 11010000 10111110 11010001 10001000 11010000 10111110 00100000 11010000 10111000 11010000 10111101 11010001 10000010 11010000 10110101 11010000 10110011 11010001 10000000 11010000 10111000 11010001 10000000 11010000 10111110 11010000 10110010 11010000 10110000 11010000 10111011 11010001 10000001 11010001 10001111 00100000 11010000 10110010 00100000 11010001 10000111 11010000 10110101 11010000 10111011 11010000 10111110 11010000 10110010 11010000 10110101 11010001 10000111 11010000 10110101 11010001 10000001 11010000 10111010 11010000 10111110 11010000 10110101 00100000 11010000 10111110 11010000 10110001 11010001 10001001 11010000 10110101 11010001 10000001 11010001 10000010 11010000 10110010 11010000 10111110 00101100 00100000 11010001 10000010 11010000 10110000 11010000 10111010 00100000 11010000 10110100 11010000 10110101 11010001 10000000 11010000 10110110 11010000 10110000 11010001 10000010 11010001 10001100 00101100 00100000 11010001 10000010 11010000 10111110 11010000 10111011 11010001 10001100 11010000 10111010 11010000 10111110 00100000 11010001 10001101 11010001 10000010 11010000 10111000 00100000 11010000 10111010 11010000 10111110 11010000 10110110 11010000 10110000 11010000 10111101 11010001 10001011 11010000 10110101 00100000 11010000 10111100 11010000 10110101 11010001 10001000 11010000 10111010 11010000 10111000 00100000 11010000 10110010 00100000 11010000 10111010 11010000 10111110 11010000 10111100 11010000 10111100 11010000 10110101 11010000 10111101 11010001 10000010 11010000 10110000 11010001 10000000 11010000 10111000 11010001 10001111 11010001 10000101 00100000 11010000 10111101 11010000 10110000 11010001 10000111 11010000 10111000 11010000 10111101 11010000 10110000 11010001 10001110 11010001 10000010 00100000 11010001 10000111 11010001 10000010 11010000 10111110 00100000 11010001 10000010 11010000 10111110 00100000 11010000 10111111 11010000 10111110 11010000 10110100 11010000 10111110 11010000 10110111 11010001 10000000 11010000 10110101 11010000 10110010 11010000 10110000 11010001 10000010 11010001 10001100 00101100 00100000 11010000 10111110 11010000 10111101 11010000 10111000 00100000 11010000 10111101 11010000 10110101 00100000 11010000 10110100 11010000 10111110 11010000 10111011 11010000 10110110 11010000 10111101 11010001 10001011 00100000 11010000 10110111 11010000 10110000 11010000 10111111 11010000 10111110 11010000 10110100 11010000 10111110 11010000 10110111 11010001 10000000 11010000 10111000 11010001 10000010 11010001 10001100 00100000 11010000 10111101 11010000 10110000 11010001 10001000 11010000 10110101 00100000 11010000 10110010 11010000 10111110 11010001 10000001 11010001 10000001 11010001 10000010 11010000 10110000 11010000 10111101 11010000 10111000 11010000 10110101 00101100 00100000 11010000 10110100 11010000 10110000 00100000 11010000 10111111 11010001 10000000 11010000 10111000 11010000 10110001 11010001 10000011 11010000 10110100 11010000 10110101 11010001 10000010 00100000 11010001 10000001 00100000 11010001 10000010 11010000 10111110 11010000 10110001 11010000 10111110 11010000 10111001 00100000 11010001 10000001 11010000 10111010 11010000 10110000 11010000 10111001 11010000 10111101 11010000 10110101 11010001 10000010 00100001
Я бы не стал тащить в свой проект библиотеку, которую создали явно политизированные люди. Где гарантия, что у них не "протечёт" крыша и они встроят зловед? Учитывая опыт последних лет, когда откровенные шизики встраивали деструктивную логику в опенсоурсные пакеты.
Проще использовать yt-dlp
Скачиваем с YouTube без рекламы и SMS: гайд по созданию консольной утилиты на C#