All pastes #2096172 Raw Edit

Unnamed

public text v1 · immutable
#2096172 ·published 2011-12-24 18:33 UTC
rendered paste body
Вытаскивание субтитров с 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>&#x0A;</text>
        <call-template name="time">
          <with-param name="timestamp" select="number(@start)"/>
        </call-template>
        <text> --&gt; </text>
        <call-template name="time">
          <with-param name="timestamp" select="number(@start) + number(@dur)"/>
        </call-template>
        <text>&#x0A;</text>
        <copy-of select="text()"/>
        <text>&#x0A;&#x0A;</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/