ВСЕ ЗАПИСИ

Статьи,заметки

Скачиваем субтитры с youtube

Обновлено: 6 марта 2016

В этой заметке я расскажу о том, какими способами можно скачать субтитры (captions),которыми сопровождается видеоконтент представленный на youtube. Эту информацию мне удалось получить в процессе создания своего приложения для загрузки видео с ютуба, вы можете использовать эти методы в написании своих собственных сервисов и проектов. Следует иметь ввиду, что информация актуальна на момент написания данной статьи (май 2013),но в будущем,как уже бывало не раз, youtube может может изменить алгоритм генерации ссылок, и тогда эти способы перестанут работать.

Субтитры на youtube бывают двух типов: оригинальные, - в создании которых принимал участие владелец аккаунта,загрузивший видео, и автоматические, сгенерированные компьютером, путём преобразования голоса в текст. Также присутствует возможность получить текст субтитров,переведённый на любой из 54 языков, доступно как для авторских, так и для автоматических субтитров. Перевод,конечно же, осуществляется автоматически.

Со скачиванием оригинальных субтитров проблем нет, - давно известен способ получения списка оригинальных субтитров через стандартный ютубовский API
http://www.youtube.com/api/timedtext?type=list&v=video_id ,где video_id это идентификатор видео с субтитрами
Чтобы загрузить список субтитров, например для этого видео
http://www.youtube.com/watch?v=_F3U97uqAdc,откроем ссылку http://www.youtube.com/api/timedtext?type=list&v=_F3U97uqAdc

По этой ссылке будет загружен вот такой xml-файл

<?xml version="1.0" encoding="utf-8" ?>
<transcript_list docid="-261819042847129129">
<track id="1" name="English v0.1" lang_code="en" lang_original="English" lang_translated="English" lang_default="true" />
<track id="3" name="French v0.1" lang_code="fr" lang_original="Français" lang_translated="French" />
<track id="0" name="German v0.1" lang_code="de" lang_original="Deutsch" lang_translated="German" />
<track id="2" name="spanish v0.3" lang_code="es" lang_original="EspaГ±ol" lang_translated="Spanish" />
</transcript_list>

В данном случае видим,что доступны четыре дорожки субтитров,чтобы скачать,например английскую,нужно отправить такой запрос:

http://www.youtube.com/api/timedtext?type=track=1&name=English v0.1&lang=en&v=_F3U97uqAdc

Аналогично грузятся и остальные дорожки,просто подставляем нужные параметры в запрос.

А для того получить оригинальные субтитры в гуглопереводе, в запрос следует добавить параметр &tlang=КОД ЯЗЫКА

Например:

http://www.youtube.com/api/timedtext?type=track=3&name=French v0.1&lang=fr&tlang=ru&v=_F3U97uqAdc

- загрузятся французские субтитры в машинном переводе на русский язык

lang_code="af" Afrikaans
 lang_code="sq" Albanian
 lang_code="ar" Arabic
 lang_code="be" Belarusian
 lang_code="bg" Bulgarian
 lang_code="ca" Catalan
 lang_code="zh-Hans" Chinese (Simplified)
 lang_code="zh-Hant" Chinese (Traditional)
 lang_code="hr" Croatian
 lang_code="cs" Czech
 lang_code="da" Danish
 lang_code="nl" Dutch
 lang_code="en" English
 lang_code="eo" Esperanto
 lang_code="et" Estonian
 lang_code="fil" Filipino
 lang_code="fi" Finnish
 lang_code="fr" French
 lang_code="gl" Galician
 lang_code="de"German
 lang_code="el" Greek
 lang_code="ht" Haitian
 lang_code="iw" Hebrew
 lang_code="hi" Hindi
 lang_code="hu" Hungarian
 lang_code="is" Icelandic
 lang_code="id" Indonesian
 lang_code="ga" Irish
 lang_code="it" Italian
 lang_code="ja" lJapanese
 lang_code="ko"Korean
 lang_code="lv" Latvian
 lang_code="lt" Lithuanian
 lang_code="mk" Macedonian
 lang_code="ms" Malay
 lang_code="mt" Maltese
 lang_code="no" Norwegian
 lang_code="fa" Persian
 lang_code="pl" Polish
 lang_code="pt" Portuguese
 lang_code="ro" Romanian
 lang_code="ru" Russian
 lang_code="sr" Serbian
 lang_code="sk" Slovak
 lang_code="sl" Slovenian
 lang_code="es" Spanish
 lang_code="sw" Swahili
 lang_code="sv" Swedish
 lang_code="th" Thai
 lang_code="tr" Turkish
 lang_code="uk" Ukrainian
 lang_code="vi" Vietnamese
 lang_code="cy" Welsh
 lang_code="yi" Yiddish


Оригинальные субтитры - это хорошо,но большая часть видео на youtube сопровождена автоматическими субтитрами.

Мне захотелось разобраться,как их можно сохранить,тем более что известная мне программа для загрузки субтитров Google2SRT ,которая загружает оригинальные сабы,автоматических субтитров не видит,сайты,которые выдают прямые ссылки на видео и субтитры - тоже. Поиск информации в инете по этому вопросу ничего не дал; простой метод скачивания автоматических субтитров путём подачи стандартного запроса через youtube API неизвестен.

Я проанализировал http-запросы,которые посылает браузер при проигрывании видео с youtube (для этого использовалась программа Fiddler), и я выяснил алгоритм формирования прямой ссылки для автоматических субтитров. Вот пример ссылки для видеоролика Mytho Logique (http://www.youtube.com/watch?v=U5Bo04Uuh4M)

http://www.youtube.com/api/timedtext? asr_langs= es%2Cit%2Cpt%2Cnl%2C fr%2Cde%2Cru%2Cen %2Cko%2Cja &caps= asr & expire=1369595220 &format= 1&hl=&key=yttt1&kind= asr& lang= fr & name= & signature= 30D6AB040F929E97CD60 8B6D089A516950D38F31. D50CBCBE87D5D35CA00FB 9930E509036A90E71FE &sparams= asr_langs%2Ccaps %2Cv%2Cexpire&ts= &type=track& v= U5Bo04Uuh4M

Красным цветом выделены уникальные параметры,которые можно получить, запросив страницу по адресу видеоролика http://www.youtube.com/watch?v=U5Bo04Uuh4M, либо сделав запрос

http://www.youtube.com/get_video_ info?video_id=U5Bo04Uuh4M

Но я работал именно со страницей, там данные представлены в формате ,более удобном для восприятия,и не требующем дополнительной перекодировки, в отличии от файла get_video_info ,поэтому привожу здесь пример разбора страницы. Нужные нам значения следует искать с того места, где встретится ключевое сочетание 'TTS_URL': "

Вот нужный участок кода страницы:

'TTS_URL': "http:\/\/www.youtube.com\/api\/ timedtext? expire= 1369595220\u0026v=U5Bo04Uuh4M

\u0026asr_langs= es%2Cit%2Cpt%2Cnl %2Cfr%2Cde%2Cru %2Cen%2Cko%2Cja\u0026

sparams= asr_langs%2Ccaps%2Cv%2Cexpire\ u0026

signature=30D6AB040 F929E97CD608B6D089A5 16950D38F31.D50CBCBE 87D5D35CA00FB9930E50 9036A90E71FE\u0026

key= yttt1\u0026hl= en_US\u0026caps= asr",

В этом участке, начиная от 'TTS_URL': " (раньше в этом месте было "ttsurl":, но теперь на youtube изменили код страницы) и заканчивая там, где впервые встретится сочетание кавычки с запятой ", выделены значения,которые можно программно отпарсить по названию и вставить в шаблон:

http://www.youtube.com/api/timedtext?asr_langs=значение&caps=asr&

expire=значение &format= 1&hl=&key= yttt1&kind= asr& lang= значение &name= значение

&signature= значение&sparams= asr_langs%2Ccaps%2Cv%2Cexpire&ts= &type= track&v= значение

чтобы получилась прямая ссылка на дорожку с субтитрами.

Как получить значения lang и name,которых здесь нет,будет рассказано ниже, а пока хочу обратить внимание на то,что значения параметров всегда генерируются случайным образом при каждом обращении к странице и могут располагаться в коде в любом порядке,но не важно,в каком порядке они расположены, главное - расположить их в той последовательности, как показано в приведённом шаблоне. Добавлю ещё, что параметр key=yttt1 ,вероятно не всегда может равняться этому значению, и не мешало бы его тоже проверять, но на практике такие случаи мне почти не встречались,можно им пренебречь. Что касается значений параметров hl=, ts= эти параметры можно оставлять пустыми,даже если в коде страницы они им присваивается какое-либо значение.

Внимание

Думаю,вы знаете,что прямые ссылки на видеофайлы также содержат параметры signature и expire, но их значения отличаются от тех, что для субтитров,так что использовать их не получится.

А теперь расскажу о том,как получить параметр lang ,значение которого определяет язык автоматической дорожки,- без него скачать субтитры невозможно, и name ,правда,обычно, этот параметр - пустой.

Для этого, используем значения параметров asr_langs, expire, signature, которые мы уже получили, и идентификатор видео (U5Bo04Uuh4M в данном примере) и отправляем такой запрос:

http://www.youtube.com/api/timedtext? asr_langs= es%2Cit%2Cpt%2Cnl %2Cfr%2Cde%2Cru %2Cen %2Cko%2Cja &asrs= 1&caps= asr& expire= 1369595220&fmts= 1&hl=&key= yttt1&signature= 30D6AB040F929E97CD608B6D08 9A516950D38F31.D50CBCBE87D 5D35CA00FB9930E509036A90E7 1FE&sparams= asr_langs%2Ccaps%2Cv%2Cexpire& tlangs= 1&ts=&type=list&v=U5Bo04Uuh4M

или, вот шаблон,куда подставляем параметры

http://www.youtube.com/api/timedtext?asr_langs=значение &asrs= 1&caps= asr& expire =значение&fmts= 1&hl=&key= yttt1 &signature= значение&sparams= asr_langs%2Ccaps%2Cv %2Cexpire&tlangs= 1&ts=&type= list&v= значение

В ответ на запрос загрузится xml-файл со списком языков, пропарсив который можно извлечь необходимые параметры

<?xml version="1.0" encoding="utf-8" ?>
<transcript_list docid="6021427959476160387">
<format fmt_code="1" default="true" />

<format fmt_code="sbv" />

<format fmt_code="srt" />

<target id="52" lang_code="af" lang_original="Afrikaans" lang_translated="Afrikaans" />

<target id="38" lang_code="sq" lang_original="Shqip" lang_translated="Albanian" />

<target id="41" lang_code="ar" lang_original="???????" lang_translated="Arabic" />

<target id="39" lang_code="be" lang_original="Беларуская" lang_translated="Belarusian" />

<target id="25" lang_code="bg" lang_original="Български" lang_translated="Bulgarian" />

<target id="42" lang_code="ca" lang_original="Catala" lang_translated="Catalan" />

<target id="16" lang_code="zh-Hans" lang_original="??(????)" lang_translated="Chinese (Simplified)" />

<target id="49" lang_code="zh-Hant" lang_original="??(????)" lang_translated="Chinese (Traditional)" />

<target id="26" lang_code="hr" lang_original="Hrvatski" lang_translated="Croatian" />

<target id="17" lang_code="cs" lang_original="Cestina" lang_translated="Czech" />

<target id="1" lang_code="da" lang_original="Dansk" lang_translated="Danish" />

<target id="2" lang_code="nl" lang_original="Nederlands" lang_translated="Dutch" />

<target id="0" lang_code="en" lang_original="English" lang_translated="English" lang_default="true" />

<target id="43" lang_code="eo" lang_original="Esperanto" lang_translated="Esperanto" />

<target id="24" lang_code="et" lang_original="Eesti" lang_translated="Estonian" />

<target id="30" lang_code="fil" lang_original="Filipino" lang_translated="Filipino" />

<target id="3" lang_code="fi" lang_original="Suomi" lang_translated="Finnish" />


<track id="0" kind="asr" name="" lang_code="fr" lang_original="Francais" lang_translated="French" cantran="true" />

<target id="4" lang_code="fr" lang_original="Francais" lang_translated="French" />

<target id="29" lang_code="gl" lang_original="Galego" lang_translated="Galician" />

<target id="5" lang_code="de" lang_original="Deutsch" lang_translated="German" />

<target id="18" lang_code="el" lang_original="????????" lang_translated="Greek" />

<target id="53" lang_code="ht" lang_original="Haitian" lang_translated="Haitian" />

<target id="6" lang_code="iw" lang_original="?????" lang_translated="Hebrew" />

<target id="33" lang_code="hi" lang_original="??????" lang_translated="Hindi" />

<target id="23" lang_code="hu" lang_original="Magyar" lang_translated="Hungarian" />

<target id="19" lang_code="is" lang_original="Islenska" lang_translated="Icelandic" />

<target id="35" lang_code="id" lang_original="Bahasa Indonesia" lang_translated="Indonesian" />

<target id="28" lang_code="ga" lang_original="Gaeilge" lang_translated="Irish" />

<target id="7" lang_code="it" lang_original="Italiano" lang_translated="Italian" />

<target id="8" lang_code="ja" lang_original="???" lang_translated="Japanese" />

<target id="9" lang_code="ko" lang_original="???" lang_translated="Korean" />

<target id="20" lang_code="lv" lang_original="Latviesu" lang_translated="Latvian" />

<target id="21" lang_code="lt" lang_original="Lietuviu" lang_translated="Lithuanian" />

<target id="34" lang_code="mk" lang_original="Македонски" lang_translated="Macedonian" />

<target id="36" lang_code="ms" lang_original="Bahasa Melayu" lang_translated="Malay" />

<target id="46" lang_code="mt" lang_original="Malti" lang_translated="Maltese" />

<target id="10" lang_code="no" lang_original="Norsk" lang_translated="Norwegian" />

<target id="50" lang_code="fa" lang_original="?????" lang_translated="Persian" />

<target id="11" lang_code="pl" lang_original="Polski" lang_translated="Polish" />

<target id="12" lang_code="pt" lang_original="Portugues" lang_translated="Portuguese" />

<target id="22" lang_code="ro" lang_original="Romana" lang_translated="Romanian" />

<target id="13" lang_code="ru" lang_original="Русский" lang_translated="Russian" />

<target id="27" lang_code="sr" lang_original="Српски" lang_translated="Serbian" />

<target id="48" lang_code="sk" lang_original="Slovencina" lang_translated="Slovak" />

<target id="45" lang_code="sl" lang_original="Slovenscina" lang_translated="Slovenian" />

<target id="14" lang_code="es" lang_original="Espanol" lang_translated="Spanish" />

<target id="44" lang_code="sw" lang_original="Kiswahili" lang_translated="Swahili" />

<target id="15" lang_code="sv" lang_original="Svenska" lang_translated="Swedish" />

<target id="40" lang_code="th" lang_original="???" lang_translated="Thai" />

<target id="31" lang_code="tr" lang_original="Turkce" lang_translated="Turkish" />

<target id="32" lang_code="uk" lang_original="Українська" lang_translated="Ukrainian" />

<target id="47" lang_code="vi" lang_original="Ti?ng Vi?t" lang_translated="Vietnamese" />

<target id="37" lang_code="cy" lang_original="Cymraeg" lang_translated="Welsh" />

<target id="51" lang_code="yi" lang_original="Yiddish" lang_translated="Yiddish" />

</transcript_list>



Находим строку, она должна выделяться из остальных, там обязательно будет прописано: track id= ,и там же будут нужные нам параметры lang и name, вот она:

<track id="0" kind="asr" name="" lang_code="fr" lang_original="Francais" lang_translated="French" cantran="true" />

Теперь,наконец, мы имеем все необходимые значения, и получили прямую ссылку на скачивание сабов:

http://www.youtube.com/api/timedtext? asr_langs= es%2Cit%2Cpt%2Cnl%2Cfr%2Cde%2Cru %2Cen%2Cko%2Cja &caps= asr& expire= 1369595220&format= 1&hl=&key= yttt1&kind= asr& lang=fr &name= & signature= 30D6AB040F929E97CD 608B6D089A516950D3 8F31.D50CBCBE87D5D 35CA00FB9930E50903 6A90E71FE&sparams= asr_langs%2Ccaps%2Cv%2Cexpire &ts=&type= track&v= U5Bo04Uuh4M

Геморрой ,конечно, ещё тот (разработчики ютубовского ПО злорадно хихикают),но программно реализовать этот алгоритм достаточно просто,как я сделал в это своей проге - Tube-DownloadDirect. Если существует способ попроще, было бы интересно узнать о нём.

Подсказки:

Как узнать ,присутствуют ли субтитры для конкретного видеоролика, анализом кода страницы?

Можно например так: пропарсить страницу на точное соответствие 'TTS_URL': "", если найдено (между кавычками пусто), то субтитры отсутствуют, иначе - сабы есть.

Доступны, или нет ,автоматические субтитры можно определить проанализировав участок кода 'TTS_URL': ".............", для видео без сабов asr_langs= не будет найден, вот пример:

'TTS_URL': "http:\/\/www.youtube.com\/api\/ timedtext?v=h8OFL9Yf1cA\u0026key=yttt1\u0026

signature= CB1EE33FF94951 3BBAAA4599A4D2 8614604 494D.38FACF7BA 1A42FF884216AF 60DEB08F672FB2 20F\u0026

expire= 1369706591\u0026sparams= caps%2Cv%2Cexpire\u0026hl= en_US\u0026caps=",

Автоматические субтитры также скачиваются в машинном переводе,не знаю ,правда, какая польза от них для практического применения, вот шаблон урл:

http://www.youtube.com/api/timedtext?asr_langs= значение

&caps= asr&expire= значение

&format= 1&hl=&key=yttt1&kind= asr&lang=en

&name= значение&signature= значение

&sparams= asr_langs%2Ccaps %2Cv%2Cexpire

&tlang= ru

&ts=&type= track&v= значение

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

Добавлено: май 2013

Обновлено: 6 марта 2016

©Veterock




комментарии (9)



написал MorrisAnano
Предлагаю Рассылку в Хрумере за 10 usd круглосуточно на 7-30 млн свежих ресурсов. Обучаю желающих интернет рекламе. Лучшее, что знаю и применяю на практике. Опыт с 1993 года. Реклама частникам и Предприятиям. Ответы в скайпе evg7773 Viber +380976131437
добавлено: 28.09.18 09:50
написал MorrisAnano
Предлагаю Рассылку в Хрумере за 10 usd круглосуточно на 7-30 млн свежих ресурсов. Обучаю желающих интернет рекламе. Лучшее, что знаю и применяю на практике. Опыт с 1993 года. Реклама частникам и Предприятиям. Ответы в скайпе evg7773 Viber +380976131437
добавлено: 28.09.18 09:50
написал MorrisAnano
Предлагаю Рассылку в Хрумере за 10 usd круглосуточно на 7-30 млн свежих ресурсов. Обучаю желающих интернет рекламе. Лучшее, что знаю и применяю на практике. Опыт с 1993 года. Реклама частникам и Предприятиям. Ответы в скайпе evg7773 Viber +380976131437
добавлено: 28.09.18 09:50
написал MorrisAnano
Предлагаю Рассылку в Хрумере за 10 usd круглосуточно на 7-30 млн свежих ресурсов. Обучаю желающих интернет рекламе. Лучшее, что знаю и применяю на практике. Опыт с 1993 года. Реклама частникам и Предприятиям. Ответы в скайпе evg7773 Viber +380976131437
добавлено: 28.09.18 09:50
написал MorrisAnano
Предлагаю Рассылку в Хрумере за 10 usd круглосуточно на 7-30 млн свежих ресурсов. Обучаю желающих интернет рекламе. Лучшее, что знаю и применяю на практике. Опыт с 1993 года. Реклама частникам и Предприятиям. Ответы в скайпе evg7773 Viber +380976131437
добавлено: 28.09.18 09:50
написал William Kuest
Все стало еще хуже, когда я пошел на курсы Delphi в старших классах школы. Мы делали всякие прыгающие шарики и прочие глупости, что меня не впечатлило совершенно, поэтому я твердо для себя решил, что заниматься программированием - это как-то не мое. Однако же это мне не помешало сделать windows tweaker на том же delphi и взять приз за оригинальность на оригинальном конкурсе по программированию для школьников.
добавлено: 19.07.18 00:55
написал Stephenemelm
Jarle Thorsen itel global group, Jarle Thorsen SiteTalk, Jarle Thorsen Swietokrzyskie, Jarle Thorsen SiteTalk Reviews, Jarle Thorsen SiteTalk
добавлено: 07.05.18 23:43
написал Yaroslavspesk
{Где найти денег срочно без кредита?, варианты, где быстро найти деньги, советы, где взять.. |Когда нужно срочно #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] деньги. Для этого следует иметь несколько вариантов.. |Где найти кредита. #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] найти срочную 31год,мне срочно нужны деньги.. |Где можно срочно #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] деньги без кредита можно срочно найти деньги только под.. |По вопросам получения кредита. Найти деньги в срочно деньги в.. |Помогите найти деньги в найти деньги в долг срочно 331 быстрый кредита до 50000.. |Где и как найти деньги срочно, #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] займы и кредиты где найти денег срочно без кредита?.. |Ломбард можно найти деньги срочно #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] по срокам выплаты кредита.. |Срочно деньги в долг срочно #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] справок и оформление кредита в удобном для.. |Найти: кредит в виде невозвратного кредита на карту банка #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] нужны деньги в сумме.. |Как и где срочно найти деньги. Когда я могу внести всю сумму кредита.. |Кредитование помощь в получении #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] трудно найти деньги в долг срочно.. |В нашей компании вы можете быстро получить деньги в когда срочно кредита в.. |Срочно помогу с деньгами до срочно нужны деньги, помощь #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] получение кредита физ.. |Если срочно нужны деньги #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] четыре кредита , объявлений и найти.. |Процента и где найти срочно деньги в #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] кредитной истории. Взять займ от частного лица.. |Срочный кредит или деньги срочно в полученную сумму #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] как найти кредит на.. |Вопрос, где быстро найти деньги, волнует многих граждан, которым срочно понадобились.. |Где взять деньги без кредита срочно. Где можно срочно взять деньги без найти: карта.. |Найти деньги в долг, помощь #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] получении кредита online! срочно деньги в долг.. |Помощь в #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] кредита гра
добавлено: 27.04.18 20:13
написал Irineygig
Для оплаты заказа вы будете перенаправлены на платежную страницу банка для ввода реквизитов вашей карты. Что нужно знать: вашей кредитной карты;. Cрок окончания действия вашей кредитной карты, ме.. Игровые приставки playstation 4 (ps4) купить в минске. Обмен игр на (ps4) бесплатно. Игровые приставки.. Погашения кредита; для индивидуальных предпринимателей дополнительно: свидетельство инн и огрн. Стаж на текущем месте работы не менее 3 месяцев. *клиент, на основании политики конфиденциальности, остав.. HNU9ujujh
добавлено: 21.04.18 11:59
Имя

Сообщение

введите защитный код


Обновить

Powered by ©Veterock Studio 2013