Вытаскивание субтитров с 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

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


Реклама

Сообщества

Загрузка...