Pull to refresh

Скачиваем видео с YouTube

Reading time7 min
Views99K
Эта история берет начало в далеком 2006-м году… Я тогда был в начале своей программистской карьеры и работал в одной говноконторе развивающейся ноунейм фирме. Тогда у нас было несколько заказов на сайты с похожим функционалом: нужно было сделать портал, на который люди могли бы заливать видео/картинки/музыку и потом этот контент просматривать, комментировать, а заодно и смотреть рекламу принося прибыль доброму дяде владельцу. Все бы хорошо, но чтобы завлечь людей на сайт нужно чтобы там уже было много контента. Таким образом создавалось бы впечатление что сайт работает давно и успешно. И вот заказчик ставит грандиозную цель: наполнить новоиспеченный портал видео с youtube.com. Еще не зная, что меня ждет, я с радостью взялся за работу…

Все конечно же оказалось не так просто. Наверняка ты знаешь, что ютуб никогда не давал прямых ссылок на свои файлы. Те ссылки, что можно выпарсить из страницы с плейером не дадут нужного результата. В лучшем случае ты упрешься в то, что получив наконец желаемую «прямую» ссылку на файл будешь получать 403-ю ошибку (нет прав доступа к файлу). Тогда, в 2006-м, я на этом и остановился после нескольких дней поиска и гугления. Кстати, тогда ютуб еще не был приобретением великого и ужасно доброго Гугла (спасибо anmipo за исправление). Я решил, что такой возможности как скачать видео с ютуба просто не существует. Как оказалось, я ошибся…

Прошло несколько лет… К теме скачивания видео я вернулся совершенно случайно уже в 2012-м. Наткнулся на один сайт, где можно было онлайн конвертировать видео файлы из одного формата в другой и там же была возможность скачать видео с ютуба просто сабмитнув ссылку на это видео. Старая тема всплыла в моей памяти. Очень кстати я как раз занимался изученнием платформы Android. Я решил написать приложение для андроида, которое позволяло бы пользователю скачать полюбившийся ролик на свой телефон.
В итоге я принялся снова изучать и пытаться понять, что же я делал не так первый раз…

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

Итак, перейдем к делу и рассмотрим процесс скачивания видео с ютуба пошагово.

Исходные данные


Ссылка на видео, например www.youtube.com/watch?v=JCYIwiT0X98&feature=g-all-esi&context=G265c44fFAAAAAAAAHAA

Первый шаг


Нужно получить метаинформацию о видео.
Делается это запросом на www.youtube.com/get_video_info?video_id=JCYIwiT0X98
Видео ID берем из исходных данных, это параметр v=JCYIwiT0X98

В результате получаем текстовый стрим примерно такого вида:
dl.dropbox.com/u/26865519/get_video_info_example

Второй шаг


Получить ссылки на скачивание видео.
Сылки на видео содержатся в параметре url_encoded_fmt_stream_map. Формат этого параметра следующий:
url_encoded_fmt_stream_map=Url encoded(url=url 1,url=url 2,...,url=url n)

То есть в урле закодированы другие урлы, для этого и понадобилось из заенкодить. Если мы раскодируем наши ссылки то получим следующее:
url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v11.lscache8.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Cratebypass%252Ccp%26fexp%3D916601%252C900203%26itag%3D45%26ip%3D91.0.0.0%26signature%3D84EA8CE08129B8AAF41D1F7898420BED2E2C3438.57CDB11E07D00A54C99F905DE0DA77AEBC0E9038%26sver%3D3%26ratebypass%3Dyes%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=hd720&fallback_host=tc.v11.cache8.c.youtube.com&type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22&itag=45,url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v15.lscache1.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Cratebypass%252Ccp%26fexp%3D916601%252C900203%26itag%3D22%26ip%3D91.0.0.0%26signature%3D1AC166895886593943D1346017A82762AFF47E9C.59C7B7E9030474710D768847DDD0433DE42D0A19%26sver%3D3%26ratebypass%3Dyes%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=hd720&fallback_host=tc.v15.cache1.c.youtube.com&type=video%2Fmp4%3B+codecs%3D%22avc1.64001F%2C+mp4a.40.2%22&itag=22,url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v21.lscache1.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Cratebypass%252Ccp%26fexp%3D916601%252C900203%26itag%3D44%26ip%3D91.0.0.0%26signature%3D0E18ABF397609CD176F02A026E6827BF89EDEEC1.AF7A313EFC85510A908760E20F3B88A69F9BC871%26sver%3D3%26ratebypass%3Dyes%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=large&fallback_host=tc.v21.cache1.c.youtube.com&type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22&itag=44,url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v8.lscache6.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Calgorithm%252Cburst%252Cfactor%252Ccp%26fexp%3D916601%252C900203%26algorithm%3Dthrottle-factor%26itag%3D35%26ip%3D91.0.0.0%26burst%3D40%26sver%3D3%26signature%3D3946508038978141EA2FE1E8A691C237497B20A8.5C4F1CAA8BFF22B061A304281162831BBDF8F3C1%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26factor%3D1.25%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=large&fallback_host=tc.v8.cache6.c.youtube.com&type=video%2Fx-flv&itag=35,url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v22.lscache3.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Cratebypass%252Ccp%26fexp%3D916601%252C900203%26itag%3D43%26ip%3D91.0.0.0%26signature%3D25CE0D32BEF98C0B631656DCBCE204F44DB0678F.810337E9249E7AF4B5D06592FC3664AE81A054C7%26sver%3D3%26ratebypass%3Dyes%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=medium&fallback_host=tc.v22.cache3.c.youtube.com&type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22&itag=43,url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v7.lscache6.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Calgorithm%252Cburst%252Cfactor%252Ccp%26fexp%3D916601%252C900203%26algorithm%3Dthrottle-factor%26itag%3D34%26ip%3D91.0.0.0%26burst%3D40%26sver%3D3%26signature%3D639B6C6CE89DA078D0F236F2E6EF25D6699E92B3.8E643652167A642565D7CF46356702AB4240B039%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26factor%3D1.25%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=medium&fallback_host=tc.v7.cache6.c.youtube.com&type=video%2Fx-flv&itag=34,url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v3.lscache3.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Cratebypass%252Ccp%26fexp%3D916601%252C900203%26itag%3D18%26ip%3D91.0.0.0%26signature%3D806E129CEA4EE91ABABDB54ABE1A57A133C97BCA.4807466495C2C05D71A918357D275F04CDDE1AFF%26sver%3D3%26ratebypass%3Dyes%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=medium&fallback_host=tc.v3.cache3.c.youtube.com&type=video%2Fmp4%3B+codecs%3D%22avc1.42001E%2C+mp4a.40.2%22&itag=18,url=http%3A%2F%2Fo-o.preferred.uarnet-kbp1.v23.lscache1.c.youtube.com%2Fvideoplayback%3Fsparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Csource%252Calgorithm%252Cburst%252Cfactor%252Ccp%26fexp%3D916601%252C900203%26algorithm%3Dthrottle-factor%26itag%3D5%26ip%3D91.0.0.0%26burst%3D40%26sver%3D3%26signature%3D8CED45631A15BD0E90EDB77AEFEEE2C421F122F1.9C1BC70FB6A2ED45D3491A5A082A96F029A228CB%26source%3Dyoutube%26expire%3D1328198927%26key%3Dyt1%26ipbits%3D8%26factor%3D1.25%26cp%3DU0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5%26id%3D242608c224f45fdf&quality=small&fallback_host=tc.v23.cache1.c.youtube.com&type=video%2Fx-flv&itag=5&


Это все урлы нашего видео в различных форматах. За формат отвечает параметр itag. Вот возможные значения этого параметра:

itag=5 - FLV 320 x 240
itag=34 - FLV 640 x 360
itag=35 - FLV 854 x 480
itag=18 - MP4 640 x 360
itag=22 - MP4 1280 x 720
itag=37 - MP4 1920 x 1080
itag=38 - MP4 4096 x 1714
itag=43 - WEBM 640 x 360
itag=44 - WEBM 854 x 480
itag=45 - WEBM 1280 x 720


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

Для примера возьмем первый урл и декодируем его:
http://o-o.preferred.uarnet-kbp1.v15.lscache1.c.youtube.com/videoplayback?sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Csource%2Cratebypass
%2Ccp&fexp=916601%2C900203&itag=22&ip=91.0.0.0&signature=1AC166895886593943D1346017A82762AFF47E9C.59C7B7E9030474710D768847DDD0433DE42D0A19&sver=3&ratebypass=yes&source=youtube&expire=1328198927&key=yt1&ipbits=8&cp=U0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5&id=242608c224f45fdf&quality=hd720&fallback_host=tc.v15.cache1.c.youtube.com&type=video/mp4; codecs="avc1.64001F, mp4a.40.2"&itag=22


Если сейчас вставить его в браузерную строку, то получим нашу любимую 403-ю ошибку. Для того чтобы получить валидную ссылку на поток, нужно отбросить все параметры после id и добавить в конец "&title=Наш тайтл", то есть в нашем случае получаем:

http://o-o.preferred.uarnet-kbp1.v15.lscache1.c.youtube.com/videoplayback?sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Csource%2Cratebypass
%2Ccp&fexp=916601%2C900203&itag=22&ip=91.0.0.0&signature=1AC166895886593943D1346017A82762AFF47E9C.59C7B7E9030474710D768847DDD0433DE42D0A19&sver=3&ratebypass=yes&source=youtube&expire=1328198927&key=yt1&ipbits=8&cp=U0hRTVFUVl9HUUNOMV9JTlpKOldSRTY2Tk9hSmU5&id=242608c224f45fdf&title=%D0%9F%D1%8B%D0%BB%D1%8C+%D0%BD%D0%B0+%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%B8++%D1%80%D0%B6%D0%B0%D0%B2%D1%87%D0%B8%D0%BD%D0%B0+%D0%BD%D0%B0+%D1%81%D0%B5%D1%80%D0%B4%D1%86%D0%B5


Вот она — желанная ссылка на поток! :-) Кстати, тайтл для последнего параметра взят из шага 1, самый последний параметр из метаинформации.

Ну и напоследок даю ссылку на приложение для Андроида которое демонстрирует показанную здесь теорию на практике:
market.android.com/details?id=com.youtubedownloader

Источники




UPD: Поправил место где написано насчет «творения Гугла»
Tags:
Hubs:
Total votes 82: ↑62 and ↓20+42
Comments80

Articles