modified: FGI/OYK.pm
[GalaxyCodeBases.git] / tools / srt2ass.rb
blob8c15040cdab22da7a370e1ccb3a92ba48d9aecee
1 #!/usr/bin/ruby
2 # == Synopsis
4 # str_ass: converts srt files in directory into ass files
6 # == Usage
8 # srt_ass.rb [OPTIONS]
10 # --help, -h
11 #    show help.
13 # --directory .(-d .)
14 #    directory to parse. current is default
16 # --mask anime_#(-m anime_#)
17 #    a mask which will be used in files replacement
18 require "getoptlong"
19 require 'rdoc/usage'
20 require "pp"
21 $KCODE = "u"
23 opts = GetoptLong.new(
24   [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
25   [ '--directory', '-d', GetoptLong::OPTIONAL_ARGUMENT ],
26   [ '--mask', '-m', GetoptLong::OPTIONAL_ARGUMENT ]
29 dir = "."
30 mask = nil
32 opts.each do |opt, arg|
33   case opt
34     when '--help'
35       RDoc::usage
37     when '--directory'
38       dir = arg.to_s
40     when '--mask'
41       mask = arg.to_s.sub("#", '\\\1')
42   end
43 end
45 # ass data
46 ass_header = "[Script Info]
47 Title: <untitled>
48 Original Script: <unknown>
49 Script Type: v4.00+
50 PlayResX: 0
51 PlayResY: 0
52 PlayDepth: 0
54 [V4+ Styles]
55 Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
56 Style: Default,Flibustier,22,&H00FFFFFF,&H000000FF,&H0016360E,&H0017460B,0,0,0,0,100,100,0,0,1,1.4,0.6,2,10,10,10,1
58 [Events]
59 Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text
62 #Style: Default,Comic Sans MS,23,&H00C3FFD2,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,1,2,10,10,12,204
65 ass_line = 'Dialogue: 0,\1.\2,\3.\4,Default,,0000,0000,0000,,\5'+"{ENDOFTEXT}\n"+'\6'
66 srt_line = /^\d+\n(\d\d:\d\d:\d\d),(\d\d)\d[\ ]?-->[\ ]?(\d\d:\d\d:\d\d),(\d\d)\d(?:  SSA.*)?\n([\s\S]+?)\n(^\d+\n\d\d:\d\d:\d\d)/
69 # get files
70 Dir.foreach(dir) do |f|
71   next if [".", ".."].include?(f) || !f.match(/\.srt$/)
73   data = nil
74   File.open(dir+'/'+f, 'r') {|file| data = file.read }
75   data = data.gsub("\r\n", "\n").gsub(/[\s\n]+$/m, '')+"\n0\n00:00:00"
77   while data.match(srt_line) do
78     data.gsub(srt_line) do |entry|
79       tmp = entry.sub(srt_line, ass_line).split("{ENDOFTEXT}")
80       tmp[0] = tmp[0].gsub("\n", "\\N").gsub(/\\N$/, '')
81       new_entry = tmp.join("")
83       data = data.sub(entry, new_entry)
84       break
85     end
86   end
87   if mask
88     new_filename = (dir == "." ? "" : dir)+f.sub(/\.srt$/ ,'').sub(/.*\b(\d{4}|\d{3}|\d{2})\b.*/, mask)
89     new_filename = new_filename+".ass" unless new_filename.match(/\.ass$/)
90   else
91     new_filename = dir+'/'+f.sub(/\.srt$/, '.ass')
92   end
93   p new_filename
94   File.open(new_filename, 'w') {|file| file << ass_header << data.gsub(/\n0\n00:00:00$/m, '') }
95 end