[Перевод] Как появилась на свет программа youtube-dl
Как известно, в данный момент репозиторий youtube-dl на GitHub заблокирован по DMCA-запросу от RIAA. Хотя я не могу комментировать текущие планы мейнтейнеров или текущие дискуссии, но после сделанных обвинений RIAA я подумал, что мне как создателю программы и первому мейнтейнеру будет полезно рассказать о первых годах youtube-dl.
Сборщики меди
В любой хорошей истории должен быть злодей, и в качестве такого персонажа я решил выбрать сборщиков меди — воришек, которые собирали цветные металлы в округе. Именно они подтолкнули к созданию youtube-dl. В далёком 2006 году мой посёлок находился в 5–10 километрах от небольшого города Авилес на севере Испании. Жители Авилеса наслаждались хорошей инфраструктурой и услугами, включая кабельное телевидение и ADSL-доступ в интернет. В моём районе ничего такого не было: слишком далеко от телефонной станции с ADSL, а сборщики меди годами воровали медные провода по пути к ней, время от времени вызывая перебои в телефонной связи и заставляя телефонную компанию заменять эти провода более слабыми и тонкими, потому что их тоже, скорее всего, украдут. Это продолжалось несколько лет.
Единственным вариантом выхода в интернет из дома был модем 56k V. 90. На самом деле качество связи было настолько плохим, что приходилось для стабильности снижать скорость до 33,6 Кбит/с. Фактическая скорость загрузки редко превышала 4 КБ/с. В то же время в интернете появился интересный видеосервис YouTube, он быстро набирал популярность, а в конце того же года его купила компания Google.
Не спать всю ночь, чтобы посмотреть кусочек
Просмотр любого видео на YouTube по соединению 33,6 Кбит/с был мучительным опытом. Практически любое видео загружалось целую вечность. Например, загрузка короткого 10-мегабайтного видео, если посчитать, занимает 40 минут, что делает потоковую передачу невозможной. Более длинное и качественное видео требует несколько часов и полностью занимает канал, не говоря уже о том, что соединение может в любой момент прерваться — и загрузку придётся начинать заново! А представьте, что вам очень понравилось конкретное видео и вы хотите посмотреть его во второй или третий раз. Повторение этого процесса становилось практически актом мазохизма.
В такой ситуации я начал думать о возможностях загрузки видеофайлов: если видео было интересным, наличие копии позволяет пересмотреть его впоследствии несколько раз. А если программа загрузки действительно хороша, то после прерванного соединения сможет возобновлять загрузку с того же места!
В то время существовали и другие решения для загрузки видео с YouTube, в том числе довольно популярный скрипт Greasemonkey. По чистой случайности я не смог настроить для работы ни одно из существующих решений, поэтому решил написать собственный инструмент. Примерно так появилась программа youtube-dl. Мне было удобнее и быстрее запускать её из консоли, поэтому графический интерфейс не предусмотрен. Выбор Python обусловлен наличием обширной стандартной библиотеки, с приятным побочным эффектом, что она будет работать на любой платформе.
Запуск Ethereal
Первая версия работала только на YouTube. У программы практически не было никакой нормальной архитектуры, потому что она была не нужна. Написанная как простой скрипт, она шла прямо к сути. Размер программы 223 строки, причём только 143 фактически кода, 44 строки комментариев и 36 пустые. Название выбрано из чистого удобства: youtube-dl очевидно, понятно, трудно забыть и можно интуитивно ввести как «Y-O-U-TAB» в консоли.
Поскольку я уже несколько лет пользовался Linux, то решил опубликовать программу под свободной лицензией (MIT в первых версиях) на случай, если кто-то найдёт её полезной. Тогда GitHub ещё не появился и нам приходилось обходиться SourceForge. Но там при создании нового проекта следовало заполнять утомительную форму. Поэтому вместо SourceForge я по-быстрому выложил код на личной страничке, которую давал интернет-провайдер. Хотя сегодня это кажется необычным, но в то время провайдеры обычно выдавали пользователям адрес электронной почты и немного хостинга, куда можно было загрузить файлы по FTP. Таким образом, вы могли поднять собственный личный сайт в сети. Первая версия программы опубликована 08.08.2006, хотя к тому времени я уже несколько недель использовал её.
В процессе разработке нужно было понять операции браузера Firefox при просмотре видео на YouTube. Если я правильно помню, в Firefox ещё не встроили инструменты разработки для анализа сетевой активности. Соединения шли в основном по HTTP, так что неоценимым инструментом для анализа сетевого трафика стала программа Wireshark, известная в то время как Ethereal. Я написал youtube-dl с конкретной целью сделать то же самое, что делал веб-браузер при извлечении видео. Программа даже отправляла такую же строку user-agent, дословно скопированную из Firefox для Linux, чтобы убедиться, что сайт отправит программе те же веб-страницы, что и браузеру.
Кроме того, тогда YouTube использовал плеер Adobe Flash. Видео подавались в виде флэш-видеофайлов (FLV), поэтому для просмотра в браузере требовался проприетарный плагин (многие вспомнят страшную библиотеку libflashplayer.so), поэтому любые инструменты разработки в браузере были бесполезными. Этот проприетарный плагин являлся постоянным источником уязвимостей безопасности и проблем. У меня стояло расширение Firefox под названием Flashblock, которое не позволяло контенту загружаться по умолчанию и заменяло его элементами-заполнителями с кликабельным значком, поэтому контент загружался только по запросу, а библиотека плагинов не использовалась, если пользователь её не запрашивал.
Кроме повышения безопасности, у Flashblock было ещё два преимущества. Во-первых, он удалял много шумных и неприятных баннеров, которые тоже могли стать источником проблем безопасности. Во-вторых, облегчал анализ процесса загрузки видео в плеер. Я ждал, пока страница полностью загрузится, а затем уже запускал Wireshark непосредственно перед тем, как нажать на значок Flashblock, запуская загрузку видео. Таким образом, единственный трафик для анализа был связан с плагином, загружающим приложение видеоплеера, и самим приложением, загружающим видео.
Стоит также отметить, что плагин Flash Player в то время уже загружал копию видео на жёсткий диск (под Linux они хранились в /tmp
), и многие пользователи полагались на эту функциональность, чтобы сделать копию без дополнительных инструментов. Так что youtube-dl был удобнее только потому, что извлекал название видео и присваивал его файлу в автоматическом режиме, например.
О, свежее мясо!
В конечном итоге Flash Player изменили, так что видео стало труднее извлекать. Одной из первых мер было разорвать связь с видеофайлом после его создания, чтобы i-node всё ещё существовал и был доступен использующему его процессу (до тех пор, пока не будет закрыт), сохраняя файл невидимым с точки зрения файловой системы. По-прежнему можно было захватить файл с помощью файловой системы /proc
для изучения файловых дескрипторов, используемых процессом браузера, но с каждым из этих небольших шагов youtube-dl становился всё более и более удобным.
Как и многие энтузиасты опенсорса в то время, я использовал Freshmeat для подписки на новые выпуски проектов, которые меня интересовали. Когда я создавал youtube-dl, я также создал запись проекта на этом веб-сайте, чтобы пользователи могли получать уведомления о новых выпусках и журнал изменений с перечислением новых функций, исправлений и улучшений. В каталоге Freshmeat можно было искать новые и интересные проекты, на первой странице публиковались последние обновления, обычно несколько десятков в день. Предполагаю, что именно таким способом Джо Барр (покойся с миром), редактор linux.com, узнал о программе и решил написать о ней статью ещё в 2006 году. В то время Linux.com был одним из самых популярных ресурсов для энтузиастов Linux вместе с другими классическими сайтами, такими как Slashdot или Linux Weekly News. По крайней мере, для меня.
С этого момента популярность youtube-dl начала расти, а мне время от времени стали приходить письма с благодарностями за создание и поддержку программы.
Подсчёт трафика
Перенесёмся в 2008 год. Популярность youtube-dl продолжала медленно расти, и пользователи часто просили сделать подобные программы для загрузки с других сайтов, и я несколько раз уступал этой просьбе. Именно в этот момент я решил переписать программу с нуля, чтобы внедрить изначальную поддержку несколько видеосайтов. У меня имелось несколько простых идей, как разделить внутренности программы на несколько частей, чтобы упростить наиболее важные части: отдельно загрузчик файлов, общий для всех веб-сайтов, а отдельно — экстракторы информации: объекты (классы), которые содержат код, специфичный для конкретного видеосайта. Когда задаётся URL или псевдо-URL, запрашиваются экстракторы, чтобы узнать, какой из них может обработать этот тип URL, а затем запрашивается извлечение информации об этом видео или списке видео, с основной целью получения URL видео или списка URL-адресов с доступными форматами, а также некоторых других метаданных, таких как заголовки, например.
Я также воспользовался возможностью сменить систему контроля версий и перенести проект на другой хостинг. В тот момент Git выигрывал войну распределённых систем управления версиями, но у Mercurial тоже было много пользователей. Я протестировал оба и решил, что Mercurial нравится немного больше, чем Git. Я начал использовать его для youtube-dl и разместил проект на Bitbucket, что было естественным выбором. В то время на Bitbucket размещались только репозитории Mercurial, а на GitHub — только Git. Оба запустились в 2008 году и стали глотком свежего воздуха по сравнению с SourceForge. Разные пространства имён проектов для каждого пользователя (то есть имя вашего проекта не обязательно должно быть глобально уникальным, а уникальным только для ваших проектов) с распределёнными системами управления версиями означало, что вы можете публиковать свои личные проекты в течение нескольких минут на любом из двух сайтов. В любом случае, перенос истории проекта в Git и перенос проекта на GitHub последовали через пару лет.
При переписывании проекта мне, без сомнения, следовало воспользоваться возможностью и переименовать его, но я не хотел смущать существующих пользователей и оставил название в попытке сохранить небольшую популярность программы.
Технологический контекст также немного изменился в тот год. Начали набирать обороты мобильные планы с передачей данных, и в конце того же года я купил себе 3G-модем и тарифный план, который впервые позволил мне просматривать веб-страницы на приличной скорости. В любом случае, это не заставило меня прекратить использовать youtube-dl. Я платил 45 евро в месяц, но ежемесячный лимит данных был ограничен 5 ГБ, то есть я мог использовать в среднем только около 150 МБ в день. А скорость позволяла скачать гораздо больше, так что приходилось следить за трафиком и избирательно выбирать контент, избегая больших загрузок, если это возможно. Поэтому youtube-dl очень помог предотвратить многократную загрузку больших видеофайлов и не выйти за пределы тарифного плана.
Эпизод: новый дом
Некоторое время спустя, в конце 2009 года, я переехал и, наконец, начал жить со своей девушкой (теперь моей женой и матерью двоих детей) в Авилесе. Впервые у меня появился высокоскоростной интернет, который был стандартом для многих моих друзей и семьи в течение многих лет. Помню, что это было кабельное соединение 100/10 Мбит/с (вниз/вверх) без ограничения трафика. Это определённо знаменовало поворотный момент в том, как часто я использовал youtube-dl и сколько внимания уделял проекту.
Чуть позже я, наконец, перенёс код в Git и GitHub. В то время YouTube начал экспериментировать с видео HTML5, которое станет вариантом по умолчанию примерно в 2015 году. В 2011 году я уже несколько лет как работал полный рабочий день в качестве инженера-программиста, и в целом по возвращении с работы мне не очень хотелось программировать и настраивать youtube-dl или реализовывать по просьбе пользователей функции, который я сам не собирался использовать лично.
Во второй половине 2011 года в разгаре другого важного проекта я решил уйти с поста мейнтейнера youtube-dl, поскольку уже несколько месяцев не справлялся с задачей. Филипп Хагемейстер показал себя как отличный программист, и он прислал несколько пул-реквестов на GitHub с исправлениями, которые интересовали многих людей. Я дал ему доступ на коммиты к моему репозиторию youtube-dl, и по сути это был конец истории с моей стороны. Логи основной ветки показывают у меня непрерывный поток коммитов до марта 2011 года, а затем скачок на август 2011 года с мерджем от Филиппа. С тех пор я сделал единственный коммит в 2013 году для изменения в исходном коде rg3.github.com на rg3.github.io, когда GitHub перемещал пользовательские страницы с USERNAME.github.com на USERNAME.github.io, чтобы избежать проблем безопасности с вредоносным кодом на собственном домене, если я правильно помню.
Хотя я не участвовал в разработке youtube-dl, в течение многих лет официальная страница проекта по-прежнему лежала под моим аккаунтом на https://github.com/rg3/youtube-dl
и https://rg3.github.io/youtube-dl/
. Мне нужно было появляться, когда Филипп или другие мейнтейнеры просили дать доступ на коммиты дополнительным разработчикам, таким как Филиппо Вальсорда или Сергей М., один из нынешних мейнтейнеров. К сожалению, в 2019 году случилась небольшая проблема с троллями в трекере, а блокировать пользователей разрешено только владельцам проектов. Это заставило нас наконец перенести проект в организацию GitHub, куда были приглашены все, кто имел доступ на коммиты (хотя и не все присоединились). Организация GitHub позволила мейнтейнерам действовать более свободно, не дёргая меня по малейшему поводу.
Хочу ещё раз выразить самую искреннюю благодарность различным мейнтейнерам проекта в течение этих лет, которые значительно улучшили код, смогли создать вокруг реальное сообщество и которые сделали проект гораздо более популярным, чем он был, когда я ушёл почти 10 лет назад.
Офлайн и бесплатно
Хотел бы ещё раз отметить, что назначение youtube-dl как инструмента практически не изменилось за 14 лет его существования. До и после получения письма DMCA от RIAA многие рассказывали, как они используют youtube-dl для разныхцелей.
Для меня это всегда был офлайн-доступ к видео, которые уже доступны широкой публике в интернете. В мире мобильных сетей и постоянного подключения вы можете спросить, действительно ли это необходимо. Я думаю, что да, если Netflix, Amazon, Disney и HBO реализовали подобную функциональность в своих чрезвычайно популярных стриминговых приложениях. Для длительных автомобильных поездок или поездок за границу, особенно с детьми, или под землёй, или в самолёте, или в месте с плохой связью или ограниченными соединениями — невероятно удобно иметь автономный доступ к подкасту, лекции, обзору, новости или произведению искусства.
Дополнительным побочным эффектом youtube-dl является доступ к контенту, когда онлайн-интерфейс не справляется с задачей. Старый проприетарный флэш-плагин работал не для каждой платформы и архитектуры. В настоящее время браузеры могут воспроизводить видео, но иногда не способны воспользоваться преимуществами эффективного декодирования GPU, тратя при этом большой заряд батареи. Youtube-dl можно использовать с собственным плеером, чтобы сделать воспроизведение некоторых видео возможным и/или эффективным. Например, плеер mpv включает встроенную поддержку youtube-dl. Вам нужно только передать ему URL, и он использует youtube-dl для доступа к видеопотоку и воспроизведения, ничего не сохраняя на вашем жёстком диске.
В дефолтном онлайн-интерфейсе может не быть специальных возможностей, которые необходимы для навигации некоторым людям, или цветовых фильтров для дальтоников, опять же, доступных из собственного приложения видеоплеера.
И последнее, но не менее важное: такие инструменты, как youtube-dl, позволяют получать доступ к онлайн-видео, используя только бесплатное программное обеспечение. Я понимаю, что в мире не так уж много сторонников строго свободного и открытого ПО. Я даже себя не считаю таковым, по большому счёту. Проприетарный софт постоянно присутствует в нашей современной жизни и поставляется нам каждый день в виде огромного количества строк Javascript в браузере, с множеством различных целей и не всегда в лучших интересах пользователей. Доказательством является появление GDPR, со всеми его недостатками и проблемами. Доступ к онлайн-видео с помощью youtube-dl гарантирует вам полное душевное спокойствие в режиме инкогнито там, где uBlock Origin или Privacy Badger только едва успокаивают.