Вытаскивание субтитров с youtube [приватный] | Дневник pmb

Чтобы скачать видео с ютюба есть куча онлайн сервисов.
Но некоторые видео идут с субтитрами. Их их иногда хочется скачать тоже.
Как скачивать их напрямую — не совсем понятно.
Зато их можно вытащить из кэша браузера.
Файлы, относящиеся к ролику, можно найти в кэше по дате создания.
Либо очистить кэш, и загрузить ролик заново.
(И наверняка есть какой-нибудь плагин, позволяющий найти файлы по источнику.)

Среди появившихся с роликом файлов будут два, которые идентифицируются как «gzip compressed data» (первые два байта — 0x1F, 0x8B)
Один из них — html код, а второй — собственно субтитры, в формате xml.
Cтруктура файла такая:
<transcript>
  <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,6)"/>
    <value-of select="$h"/>
    <text>:</text>
    <value-of select="$m"/>
    <text>:</text>
    <value-of select="$s"/>
    <text>,</text>
    <value-of select="$fs"/>
  </template>
</stylesheet>

Теперь результат можно переименовать одинаково с сохранённым видео и наслаждаться.
  • 0
  • 8 июня 2009, 09:25
  • pmb

Комментарии (2)

RSS свернуть / развернуть
+
0
Не получается преобразовать timedtext.xml в .srt.
Скажите пожалуйста, в какую часть скрипта вставлять:
строка титров


т.е. содержимое .xml субтитров, и в каком формате потом сохранять?

Спасибо.
avatar

Raduga2012

  • 20 апреля 2013, 03:59
+
0
Не получается преобразовать timedtext.xml в .srt.
Скажите пожалуйста, в какую часть скрипта вставлять:
содержимое .xml субтитров и в каком формате потом сохранять?

Спасибо.
avatar

Raduga2012

  • 20 апреля 2013, 04:01

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.


Реклама

Сообщества