Скрипт для выдирания субтитров в формате SRT из видео файла на youtube
Использование: tt2srt <идентификатор видео> [язык (напр. ru, по умолчанию en)]
Вывод полученных субтитров идет на stdout
Если кому пригодится и нужны дополнения, пишите сюда.
#!/usr/bin/ruby
# coding:utf-8
require 'open-uri'
subst = { '"'=>/"/m,"'"=>/'/m,'&'=>/&/m,'<'=>/</m,
'>'=>/>/m,' '=>/ /m,'¡'=>/¡/m,'¢'=>/¢/m,
'£'=>/£/m,'¤'=>/¤/m,'¥'=>/¥/m,'¦'=>/¦/m,
'§'=>/§/m,'¨'=>/¨/m,'©'=>/©/m,'ª'=>/ª/m,
'«'=>/«/m,'¬'=>/¬/m,''=>/­/m,'®'=>/®/m,
'¯'=>/¯/m,'°'=>/°/m,'±'=>/±/m,'²'=>/²/m,
'³'=>/³/m,'´'=>/´/m,'µ'=>/µ/m,'¶'=>/¶/m,
'·'=>/·/m,'¸'=>/¸/m,'¹'=>/¹/m,'º'=>/º/m,
'»'=>/»/m,'¼'=>/¼/m,'½'=>/½/m,'¾'=>/¾/m,
'¿'=>/¿/m,'×'=>/×/m,'÷'=>/÷/m,'À'=>/À/m,
'Á'=>/Á/m,'Â'=>/Â/m,'Ã'=>/Ã/m,'Ä'=>/Ä/m,
'Å'=>/Å/m,'Æ'=>/Æ/m,'Ç'=>/Ç/m,'È'=>/È/m,
'É'=>/É/m,'Ê'=>/Ê/m,'Ë'=>/Ë/m,'Ì'=>/Ì/m,
'Í'=>/Í/m,'Î'=>/Î/m,'Ï'=>/Ï/m,'Ð'=>/Ð/m,
'Ñ'=>/Ñ/m,'Ò'=>/Ò/m,'Ó'=>/Ó/m,'Ô'=>/Ô/m,
'Õ'=>/Õ/m,'Ö'=>/Ö/m,'Ø'=>/Ø/m,'Ù'=>/Ù/m,
'Ú'=>/Ú/m,'Û'=>/Û/m,'Ü'=>/Ü/m,'Ý'=>/Ý/m,
'Þ'=>/Þ/m,'ß'=>/ß/m,'à'=>/à/m,'á'=>/á/m,
'â'=>/â/m,'ã'=>/ã/m,'ä'=>/ä/m,'å'=>/å/m,
'æ'=>/æ/m,'ç'=>/ç/m,'è'=>/è/m,'é'=>/é/m,
'ê'=>/ê/m,'ë'=>/ë/m,'ì'=>/ì/m,'í'=>/í/m,
'î'=>/î/m,'ï'=>/ï/m,'ð'=>/ð/m,'ñ'=>/ñ/m,
'ò'=>/ò/m,'ó'=>/ó/m,'ô'=>/ô/m,'õ'=>/õ/m,
'ö'=>/ö/m,'ø'=>/ø/m,'ù'=>/ù/m,'ú'=>/ú/m,
'û'=>/û/m,'ü'=>/ü/m,'ý'=>/ý/m,'þ'=>/þ/m,
'ÿ'=>/ÿ/m}
if ARGV.count < 1 or ARGV.count > 2
puts "tt2srt SRT subtitles downloader from youtube"
puts "usage: tt2srt [language]"
else
uri = '
http://video.google.com/timedtext?lang=%%s&v=%s' % [ ARGV[0] ]
if ( f = open(URI.parse(uri % [ARGV[1].nil? ? 'en' : ARGV[1]])).read.strip).empty? and
( ARGV.count==1 or (f=open(URI.parse(uri % ['en'])).read.strip).empty? )
puts "!!!ERROR: No subtitles for video"
else
cnt, e = 0, {}
def tt(t) return "%0.2d:%0.2d:%.3f" % [Integer(t)/3600, Integer(t)/60, t%60 ] end
f.gsub(/(.*?)<\/text>/m) do
a,b,c = [Float($1), Float($2), $3.gsub(/&#(\d+);/) {Integer($1).chr(Encoding::UTF_8) }.strip]
subst.each { |k,v| c.gsub!(v,k)}
c.gsub(/&(.*?);/) { e[$1] = c }
puts "%d\n%s --> %s\n%s\n\n" % [cnt+=1, tt(a), tt(a+b), c ]
end
e.each {|k,v| puts("!!!ERROR: Unknown entity: %s in <<%s>>" % [k,v])}
end
end