Все конечно же оказалось не так просто. Наверняка ты знаешь, что ютуб никогда не давал прямых ссылок на свои файлы. Те ссылки, что можно выпарсить из страницы с плейером не дадут нужного результата. В лучшем случае ты упрешься в то, что получив наконец желаемую «прямую» ссылку на файл будешь получать 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
Источники
- www.google.com
- Код браузерного плагина для скачивания видео с ютуба: userscripts.org/scripts/review/25105
- meyerweb.com/eric/tools/dencoder — полезная тулза для кодирования/декодирования урлов онлайн
UPD: Поправил место где написано насчет «творения Гугла»

