Вытаскивание субтитров с youtube
Чтобы скачать видео с ютюба есть куча онлайн сервисов.
Но некоторые видео идут с субтитрами. Их их иногда хочется скачать тоже.
Как скачивать их напрямую — не совсем понятно.
Зато их можно вытащить из кэша браузера.
Скачать субтитры можно с помощью хитрых урлов.
http://video.google.com/timedtext?hl=ЛК&v=ВИДЕОИД&type=list
отдаёт список доступных дорожек субтитров.
контент интересен наличием нужного языка и названием дорожки для него.
http://video.google.com/timedtext?hl=ЛК&v=ВИДЕОИД&type=track&name=НАЗВ&lang=ЯЗ
hl=ЛК — 2-буквенный код языка интерфейса. на контент особого влияния не оказывает.
v=ВИДЕОИД — идентификатор видеоролика
type=track — указание, что надо грузить именно субтитры, а не список доступных субтитров (type=list)
name=НАЗВ — название дорожки субтитров. узнаётся из списка доступных субтитров
lang=ЯЗ — 2-буквенный код языка субтитров
<upd>
вот здесь объяснено чуть более подробно
спасибо sust
</upd>
Файл грузится в формате XML, который можно легко преобразовать в любимый всеми плэерами SRT.
Файлы, относящиеся к ролику, можно найти в кэше по дате создания.
Либо очистить кэш, и загрузить ролик заново.
(И наверняка есть какой-нибудь плагин, позволяющий найти файлы по источнику.)
Среди появившихся с роликом файлов будут два, которые идентифицируются как «gzip compressed data» (первые два байта — 0x1F, 0x8B)
Один из них — html код, а второй — собственно субтитры, в формате xml.
Cтруктура файла такая:
<transcript>
<text start="начало" dur="длительность">строка титров</text>
...
<text start="начало" dur="длительность">строка титров</text>
</transcript>
Начало и длительность тут указаны в секундах, с точностью до тысячной.
Текст, очевидно, в кодировке, utf-8.
Пробелы и разрывы строк встерчаются только внутри строк титров.
Эти субтитры можно сконвертировать в простой и популярный формат .srt простым XSLT скриптом:
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version='1.0'>
<output method='text' encoding='utf-8'/>
<!-- или другая кодировка вывода -->
<template match="/transcription">
<apply-templates/>
</template>
<template match="text">
<value-of select="position()"/>
<text>
</text>
<call-template name="time">
<with-param name="timestamp" select="number(@start)"/>
</call-template>
<text> --> </text>
<call-template name="time">
<with-param name="timestamp" select="number(@start) + number(@dur)"/>
</call-template>
<text>
</text>
<copy-of select="text()"/>
<text>

</text>
</template>
<template name="time">
<param name="timestamp"/>
<variable name="ts" select="floor($timestamp)"/>
<variable name="s" select="$ts mod 60"/>
<variable name="tm" select="($ts - $s) div 60"/>
<variable name="m" select="$tm mod 60"/>
<variable name="h" select="($tm - $m) div 60"/>
<variable name="fs" select="substring(string($timestamp - $ts),3,3)"/>
<value-of select="$h"/>
<text>:</text>
<value-of select="$m"/>
<text>:</text>
<value-of select="$s"/>
<text>,</text>
<value-of select="$fs"/>
</template>
</stylesheet>
Теперь результат можно переименовать одинаково с сохранённым видео и наслаждаться.
Epic Update:
для автоматизации этого процесса можно воспользоваться user-скриптом для greasemonkey:
userscripts.org/scripts/show/50003/