subtitle_it 1.9.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/Gemfile +3 -0
- data/{README.rdoc → README.md} +22 -18
- data/Rakefile +13 -18
- data/bin/subtitle_it +4 -8
- data/lib/subtitle_it/bin.rb +50 -58
- data/lib/subtitle_it/fixes.rb +3 -4
- data/lib/subtitle_it/formats/ass.rb +5 -6
- data/lib/subtitle_it/formats/mpl.rb +9 -9
- data/lib/subtitle_it/formats/rsb.rb +9 -9
- data/lib/subtitle_it/formats/srt.rb +17 -14
- data/lib/subtitle_it/formats/sub.rb +7 -7
- data/lib/subtitle_it/formats/xml.rb +13 -12
- data/lib/subtitle_it/formats/yml.rb +5 -5
- data/lib/subtitle_it/generator.rb +2 -2
- data/lib/subtitle_it/languages.rb +52 -53
- data/lib/subtitle_it/movie.rb +26 -6
- data/lib/subtitle_it/platform_endl.rb +7 -5
- data/lib/subtitle_it/subdown.rb +30 -33
- data/lib/subtitle_it/subline.rb +5 -5
- data/lib/subtitle_it/substyle.rb +3 -9
- data/lib/subtitle_it/subtime.rb +19 -10
- data/lib/subtitle_it/subtitle.rb +20 -28
- data/lib/subtitle_it/version.rb +1 -7
- data/lib/subtitle_it.rb +7 -7
- data/spec/fixtures/movie.xml +2 -2
- data/spec/spec_helper.rb +6 -6
- data/spec/subtitle_it/bin_spec.rb +110 -98
- data/spec/subtitle_it/formats/ass_spec.rb +2 -3
- data/spec/subtitle_it/formats/mpl_spec.rb +26 -28
- data/spec/subtitle_it/formats/rsb_spec.rb +29 -30
- data/spec/subtitle_it/formats/srt_spec.rb +27 -30
- data/spec/subtitle_it/formats/sub_spec.rb +19 -21
- data/spec/subtitle_it/formats/xml_spec.rb +21 -21
- data/spec/subtitle_it/formats/yml_spec.rb +14 -15
- data/spec/subtitle_it/movie_spec.rb +24 -15
- data/spec/subtitle_it/subdown_spec.rb +58 -65
- data/spec/subtitle_it/subline_spec.rb +17 -18
- data/spec/subtitle_it/subtime_spec.rb +43 -44
- data/spec/subtitle_it/subtitle_spec.rb +28 -29
- data/spec/subtitle_it_spec.rb +4 -5
- data/subtitle_it.gemspec +25 -98
- metadata +121 -67
- data/.rspec +0 -2
- data/config/hoe.rb +0 -73
- data/config/requirements.rb +0 -15
- data/lib/subtitle_it/movie_hasher.rb +0 -30
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/script/txt2html +0 -82
- data/spec/subtitle_it/movie_hasher_spec.rb +0 -13
- data/tasks/deployment.rake +0 -34
- data/tasks/environment.rake +0 -7
- data/tasks/rspec.rake +0 -21
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5e89ad4165e8f6502df504f903bea91ab440fa6c
|
4
|
+
data.tar.gz: 9f771d45a07d6720aecd20edd763eadc766ef179
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4ca034e01f764d55552192df5a5036418699696d7d8b1246ef2ccf345abb83f8866f3c2fc354a0053baf18bf98727e126f7e350b93cdc970800e1282a068c68f
|
7
|
+
data.tar.gz: f8596dd83734c9271881dac335f93dfe19b3a574e146f42db828c8950b05e9aa4032c44639ac53a33914b41116124caeda67c5950e5b4db8e3fc9aed2edfdd9a
|
data/Gemfile
ADDED
data/{README.rdoc → README.md}
RENAMED
@@ -1,14 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
----\--------------/__--_/_------_/_---/----__-----/---_/_-
|
4
|
-
|
5
|
-
_(____/___(___(__(___/_(_ __/___(_ __/___(___ _ _/_ __(_ __
|
1
|
+
__ __
|
2
|
+
/ ) / , / /
|
3
|
+
----\--------------/__--_/_------_/_---/----__-----/---_/_-
|
4
|
+
\ / / / ) / / / / /___) / /
|
5
|
+
_(____/___(___(__(___/_(_ __/___(_ __/___(___ _ _/_ __(_ __
|
6
6
|
|
7
7
|
|
8
8
|
Ruby tool to download, create, convert and fix subtitles.
|
9
9
|
|
10
10
|
|
11
|
-
|
11
|
+
# FEATURES
|
12
12
|
|
13
13
|
* Automatic Download on the terminal
|
14
14
|
* To and from: SRT, SUB, XML(TT), YML, MPL2, RSB and ASS.
|
@@ -16,7 +16,7 @@ Ruby tool to download, create, convert and fix subtitles.
|
|
16
16
|
* Compatibility with "sube" (http://github.com/vic/sube)
|
17
17
|
|
18
18
|
|
19
|
-
|
19
|
+
# SYNOPSIS
|
20
20
|
|
21
21
|
Download subtitle:
|
22
22
|
|
@@ -26,8 +26,11 @@ This will search all languages for the video. You can filter:
|
|
26
26
|
|
27
27
|
subtitle_it -l Eng Cool-Video.avi
|
28
28
|
|
29
|
+
You can use -c option. It convert subtitles to given format:
|
29
30
|
|
30
|
-
|
31
|
+
subtitle_it -l Eng -c srt Cool-Video.avi
|
32
|
+
|
33
|
+
## Bash tool
|
31
34
|
|
32
35
|
Convert a srt to sub:
|
33
36
|
subtitle_it in.srt out.sub
|
@@ -41,26 +44,27 @@ Create a template
|
|
41
44
|
subtitle_it unexistent.file
|
42
45
|
|
43
46
|
|
44
|
-
|
47
|
+
# INSTALL
|
45
48
|
|
46
|
-
gem
|
47
|
-
sudo gem install nofxx-subtitle_it
|
49
|
+
gem install subtitle_it
|
48
50
|
|
49
51
|
|
50
|
-
|
52
|
+
## THE "Ruby Subtitle" Format - RSB
|
51
53
|
|
52
54
|
It`s just a easy way, proof of concept to edit subtitles.
|
53
55
|
Here is what it looks like:
|
54
56
|
|
57
|
+
```
|
55
58
|
00:32 => 00:33 == Nice police work! | Thank you!
|
56
59
|
00:35 => 3 == Nice job!
|
57
60
|
|
58
61
|
MM:SS => MM:SS or N == TEXT | NEWLINE
|
62
|
+
```
|
59
63
|
|
60
64
|
Create a template to check it out.
|
61
65
|
|
62
66
|
|
63
|
-
|
67
|
+
## Automatic Download
|
64
68
|
|
65
69
|
* OpenSubtitles.org - WORK SubtitleIt Agent
|
66
70
|
* addic7ed.com - EVIL NOAPI
|
@@ -70,7 +74,7 @@ Create a template to check it out.
|
|
70
74
|
*NOAPI = Mechanize playground...
|
71
75
|
|
72
76
|
|
73
|
-
|
77
|
+
## DEV
|
74
78
|
|
75
79
|
To run tests:
|
76
80
|
|
@@ -80,7 +84,7 @@ Documentation => doc
|
|
80
84
|
Subtitle examples => spec/fixtures
|
81
85
|
|
82
86
|
|
83
|
-
|
87
|
+
## SUBTITLE EDITORS
|
84
88
|
|
85
89
|
Try those nice editors too, if SubtitleIt does not fit your need:
|
86
90
|
|
@@ -89,20 +93,20 @@ Jubler: http://www.jubler.org/
|
|
89
93
|
Aegisub: http://www.malakith.net/aegiwiki/Main_Page
|
90
94
|
|
91
95
|
|
92
|
-
|
96
|
+
## THANKS
|
93
97
|
|
94
98
|
* Johanlunds - Opensubtitle.org code (to be used as a gem soon).
|
95
99
|
* Marcin (tiraeth) Chwedziak - Sub format first implementation.
|
96
100
|
|
97
101
|
|
98
|
-
|
102
|
+
## TODO
|
99
103
|
|
100
104
|
Please visit:
|
101
105
|
|
102
106
|
* http://github.com/nofxx/subtitle_it
|
103
107
|
* Support http://www.podnapisi.net/
|
104
108
|
|
105
|
-
|
109
|
+
## LICENSE:
|
106
110
|
|
107
111
|
(The MIT License)
|
108
112
|
|
data/Rakefile
CHANGED
@@ -1,21 +1,16 @@
|
|
1
|
-
|
2
|
-
require '
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require 'bundler/gem_tasks'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
gem.summary = "Download, edit and create subtitles."
|
9
|
-
gem.description = "Download, edit and create subtitles. Supports various formats."
|
10
|
-
gem.email = "x@nofxx.com"
|
11
|
-
gem.homepage = "http://github.com/nofxx/subtitle_it"
|
12
|
-
gem.authors = ["Marcos Piccinini"]
|
13
|
-
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
-
end
|
16
|
-
Jeweler::GemcutterTasks.new
|
17
|
-
rescue LoadError
|
18
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
4
|
+
require 'rspec/core'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
7
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
19
8
|
end
|
20
9
|
|
21
|
-
|
10
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
11
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
12
|
+
spec.rcov = true
|
13
|
+
end
|
14
|
+
|
15
|
+
task default: :spec
|
16
|
+
|
data/bin/subtitle_it
CHANGED
@@ -5,12 +5,8 @@
|
|
5
5
|
# Copyleft (c) 2008. MIT License.
|
6
6
|
#
|
7
7
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
8
|
-
begin
|
9
|
-
require 'rubygems'
|
10
|
-
rescue LoadError
|
11
|
-
# no rubygems to load, so we fail silently
|
12
|
-
end
|
13
8
|
|
9
|
+
require 'colorize'
|
14
10
|
require 'optparse'
|
15
11
|
require 'subtitle_it'
|
16
12
|
|
@@ -43,10 +39,10 @@ BANNER
|
|
43
39
|
end
|
44
40
|
|
45
41
|
opts.on("-c", "--convert=FORMAT", String,
|
46
|
-
"Format to convert to") { |
|
42
|
+
"Format to convert to") { |o| OPTIONS[:format] = o }
|
47
43
|
|
48
44
|
opts.on("-d", "--delay=DELAY", Float,
|
49
|
-
"Delay to add/remove") { |
|
45
|
+
"Delay to add/remove") { |o| OPTIONS[:delay] = o }
|
50
46
|
|
51
47
|
opts.on("-f", "--force", "Force overwrite") { OPTIONS[:force] = true }
|
52
48
|
|
@@ -54,7 +50,7 @@ BANNER
|
|
54
50
|
"Show this help message.") { puts opts; exit }
|
55
51
|
|
56
52
|
opts.on("-v", "--version",
|
57
|
-
"Show program version") {
|
53
|
+
"Show program version") { puts "SubtitleIt v#{SubtitleIt::VERSION}"; exit }
|
58
54
|
|
59
55
|
opts.parse!(ARGV)
|
60
56
|
|
data/lib/subtitle_it/bin.rb
CHANGED
@@ -1,58 +1,65 @@
|
|
1
1
|
# SubtitleIt
|
2
2
|
# Command line tool
|
3
3
|
module SubtitleIt
|
4
|
-
|
5
4
|
class Subwork
|
6
5
|
def run!(file, format)
|
7
|
-
|
6
|
+
fail unless format
|
8
7
|
content = File.open(file, 'r')
|
9
|
-
|
10
|
-
sub = Subtitle.new(
|
8
|
+
puts "Working on file #{file}..."
|
9
|
+
sub = Subtitle.new(dump: content, format: Bin.get_extension(file))
|
11
10
|
dump = sub.send :"to_#{format}"
|
12
|
-
Bin
|
11
|
+
Bin.write_out(Bin.swap_extension(file, format), dump)
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
16
15
|
class Subdownloader
|
17
|
-
def run!(movie,lang=nil)
|
16
|
+
def run!(movie, lang = nil, dst_format = nil)
|
18
17
|
@movie = Movie.new(movie)
|
19
18
|
@down = Subdown.new
|
20
19
|
@down.log_in!
|
21
|
-
res = @down.search_subtitles(@movie,
|
20
|
+
res = @down.search_subtitles(@movie, lang).sort
|
22
21
|
if res.length == 0
|
23
|
-
|
22
|
+
puts 'No results found.'
|
24
23
|
return
|
25
24
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
puts 'You can choose multiple ones separated with spaces '\
|
26
|
+
'or a range separated with a hifen.'
|
27
|
+
puts "Found #{res.size.to_s.yellow} result#{'s' if res.size > 1}:\n"
|
28
|
+
res.each_with_index { |r, i| puts print_option(r.info, i) }
|
29
|
+
STDOUT.print "Choose (1-#{res.size}): "
|
30
30
|
choose = parse_input(STDIN.gets.chomp)
|
31
|
-
choose = choose.map { |c| res[c.to_i-1] }
|
32
|
-
|
31
|
+
choose = choose.map { |c| res[c.to_i - 1] }
|
32
|
+
puts "Downloading #{choose.size} subtitle#{'s' if choose.size > 1}..."
|
33
33
|
choose.each do |sub|
|
34
|
-
down_a_sub(sub,
|
34
|
+
down_a_sub(sub, dst_format)
|
35
35
|
end
|
36
36
|
@down.log_out!
|
37
37
|
end
|
38
38
|
|
39
|
-
def down_a_sub(sub,
|
39
|
+
def down_a_sub(sub, dst_format)
|
40
|
+
dst_format ||= sub.format
|
40
41
|
dump = @down.download_subtitle(sub)
|
41
|
-
|
42
|
-
|
42
|
+
if sub.format != dst_format
|
43
|
+
subt = Subtitle.new(dump: dump, format: dst_format)
|
44
|
+
dump = subt.send :"to_#{dst_format}"
|
45
|
+
end
|
46
|
+
fname = @movie.filename[0..-4] + sub.info['SubLanguageID']
|
47
|
+
Bin.write_out("#{fname}.#{dst_format}", dump)
|
43
48
|
end
|
44
49
|
|
45
50
|
def print_option(r, index)
|
46
|
-
|
47
|
-
|
48
|
-
|
51
|
+
date = Date.parse(r['SubAddDate'])
|
52
|
+
" #{(index + 1).to_s.yellow}. #{r['LanguageName'][0,3].green}"\
|
53
|
+
" | #{r['SubFormat'].upcase.blue} | #{r['MovieName'].cyan}"\
|
54
|
+
" / #{r['MovieYear'].cyan} | #{r['SubRating'].yellow}"\
|
55
|
+
" | FPS #{r['MovieFPS']} | #{r['SubSumCD']} CDs | #{date}"
|
49
56
|
end
|
50
57
|
|
51
58
|
def parse_input(input)
|
52
|
-
choose = input.split(
|
59
|
+
choose = input.split(' ').map do |c|
|
53
60
|
if c =~ /-/
|
54
|
-
numbers = c.split(
|
55
|
-
|
61
|
+
numbers = c.split('-').map(&:to_i)
|
62
|
+
(numbers[0]..numbers[1]).to_a
|
56
63
|
else
|
57
64
|
c.to_i
|
58
65
|
end
|
@@ -62,18 +69,13 @@ module SubtitleIt
|
|
62
69
|
end
|
63
70
|
|
64
71
|
class Bin
|
65
|
-
|
66
|
-
|
67
|
-
def Bin.run! argv, lang=nil, format=nil, force=false, delay=nil
|
68
|
-
raise unless argv
|
72
|
+
def self.run!(argv, lang = nil, format = nil, force = false, _delay = nil)
|
73
|
+
fail unless argv
|
69
74
|
@force = force
|
70
75
|
@format = format
|
71
76
|
|
72
|
-
|
73
|
-
|
74
|
-
return
|
75
|
-
end
|
76
|
-
|
77
|
+
# TODO: generate_rsb
|
78
|
+
return unless File.exist?(argv[0])
|
77
79
|
|
78
80
|
@file_in = argv[0]
|
79
81
|
@file_in_ext = Bin.get_extension(@file_in)
|
@@ -82,50 +84,40 @@ module SubtitleIt
|
|
82
84
|
@file_out_ext = Bin.get_extension(@file_out)
|
83
85
|
@format = @file_out_ext
|
84
86
|
end
|
87
|
+
|
85
88
|
if MOVIE_EXTS.include? @file_in_ext
|
86
|
-
Subdownloader.new.run!(
|
89
|
+
Subdownloader.new.run!(@file_in, lang, @format)
|
87
90
|
elsif SUB_EXTS.include? @file_in_ext
|
88
91
|
Subwork.new.run!(@file_in, @format)
|
89
92
|
else
|
90
|
-
|
93
|
+
fail "Unknown file type '#{@file_in_ext}'."
|
91
94
|
end
|
92
|
-
|
93
|
-
rescue Exception => e
|
94
|
-
puts e.message
|
95
|
-
exit 1
|
96
95
|
end
|
97
96
|
|
98
|
-
def
|
99
|
-
|
100
|
-
file.split(
|
101
|
-
end
|
102
|
-
|
103
|
-
def Bin.get_enc_platform(filename)
|
104
|
-
raise unless File.exist?(filename)
|
105
|
-
File.open(filename, 'r') do |fd|
|
106
|
-
fd.gets =~ /\r\n/ ? "WIN" : "UNIX"
|
107
|
-
end
|
97
|
+
def self.get_extension(file)
|
98
|
+
fail unless file =~ /\./
|
99
|
+
file.split('.').last
|
108
100
|
end
|
109
101
|
|
110
|
-
def
|
102
|
+
def self.swap_extension(file, extension)
|
111
103
|
f = file.dup
|
112
104
|
f[-3..-1] = extension
|
113
105
|
f
|
114
106
|
end
|
115
107
|
|
116
|
-
def
|
117
|
-
|
108
|
+
def self.print_languages
|
109
|
+
puts 'CODE | LANGUAGE'
|
118
110
|
LANGS.each do |l|
|
119
|
-
|
111
|
+
puts " #{l[0]} | #{l[1]}"
|
120
112
|
end
|
121
113
|
end
|
122
114
|
|
123
|
-
def
|
124
|
-
if File.
|
125
|
-
|
115
|
+
def self.write_out(filename, dump)
|
116
|
+
if File.exist?(filename) && !@force
|
117
|
+
puts "File exist: #{filename}".red
|
126
118
|
else
|
127
|
-
File.open(filename, 'w') {|f| f.write(dump) }
|
128
|
-
|
119
|
+
File.open(filename, 'w') { |f| f.write(dump) }
|
120
|
+
puts "Done: #{filename}".yellow
|
129
121
|
end
|
130
122
|
end
|
131
123
|
end
|
data/lib/subtitle_it/fixes.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
# SubtitleIt
|
2
2
|
# ASS - http://en.wikipedia.org/wiki/SubStation_Alpha
|
3
3
|
# http://www.malakith.net/aegiwiki/ASS
|
4
|
-
#TODO ass!
|
5
|
-
module Formats
|
4
|
+
# TODO: ass!
|
5
|
+
module Formats
|
6
6
|
def parse_ass
|
7
|
-
|
8
7
|
end
|
9
|
-
|
10
|
-
#not mine!
|
8
|
+
|
9
|
+
# not mine!
|
11
10
|
def to_ass
|
12
|
-
end
|
11
|
+
end
|
13
12
|
end
|
@@ -5,25 +5,25 @@
|
|
5
5
|
#
|
6
6
|
# Where N is sec * 10
|
7
7
|
#
|
8
|
-
module Formats
|
8
|
+
module Formats
|
9
9
|
include PlatformEndLine
|
10
10
|
def parse_mpl
|
11
|
-
@raw.to_a.inject([]) do |i,l|
|
11
|
+
@raw.to_a.inject([]) do |i, l|
|
12
12
|
line_data = l.scan(/^\[([0-9]{1,})\]\[([0-9]{1,})\](.+)$/)
|
13
13
|
line_data = line_data.at 0
|
14
14
|
time_on, time_off, text = line_data
|
15
|
-
time_on, time_off = [time_on.to_i, time_off.to_i].map { |t| t.to_i * 1000 }
|
15
|
+
time_on, time_off = [time_on.to_i, time_off.to_i].map { |t| t.to_i * 1000 }
|
16
16
|
i << Subline.new(time_on, time_off, text.chomp)
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def to_mpl
|
21
|
-
endl = endline(
|
21
|
+
endl = endline(@raw)
|
22
22
|
line_ary = []
|
23
23
|
@lines.each do |l|
|
24
24
|
start, stop = [l.time_on, l.time_off].map { |val| val.to_i / 100 }
|
25
|
-
line_ary <<
|
25
|
+
line_ary << '[%d][%d]%s' % [start, stop, l.text]
|
26
26
|
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
27
|
+
line_ary.join(endl) + endl
|
28
|
+
end
|
29
|
+
end
|
@@ -15,23 +15,23 @@ module Formats
|
|
15
15
|
@title = inn.delete_at(0).split(':')[1]
|
16
16
|
@authors = inn.delete_at(0).split(':')[1]
|
17
17
|
@version = inn.delete_at(0).split(':')[1]
|
18
|
-
inn.inject([]) do |final,line|
|
19
|
-
time_on,time_off = line.split('=>').map
|
20
|
-
text = line.split('==')[1]
|
18
|
+
inn.inject([]) do |final, line|
|
19
|
+
time_on, time_off = line.split('=>').map(&:strip)
|
20
|
+
text = line.split('==')[1] # .strip
|
21
21
|
final << Subline.new(time_on, time_off, text ? text.strip : nil)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def to_rsb
|
26
|
-
endl = endline(
|
26
|
+
endl = endline(@raw)
|
27
27
|
out = ["- title: #{@title}", "- authors: #{@authors}", "- version: #{@version}"]
|
28
28
|
@lines.each do |l|
|
29
|
-
out <<
|
29
|
+
out << '%s => %s == %s' % [l.time_on.to_s, l.time_off.to_s, l.text]
|
30
30
|
end
|
31
|
-
|
32
|
-
#out = "- title: #{@title}\n- authors: #{@authors}\n- version: #{@version}\n"
|
33
|
-
#out << @lines.inject([]) do |i,l|
|
31
|
+
out.join(endl) + endl
|
32
|
+
# out = "- title: #{@title}\n- authors: #{@authors}\n- version: #{@version}\n"
|
33
|
+
# out << @lines.inject([]) do |i,l|
|
34
34
|
# i << "%s => %s == %s" % [l.time_on.to_s, l.time_off.to_s, l.text]
|
35
|
-
#end.join("\n")
|
35
|
+
# end.join("\n")
|
36
36
|
end
|
37
37
|
end
|
@@ -8,33 +8,36 @@
|
|
8
8
|
#
|
9
9
|
# Where N is the sub index number
|
10
10
|
#
|
11
|
-
module Formats
|
11
|
+
module Formats
|
12
12
|
include PlatformEndLine
|
13
|
+
|
14
|
+
def endl
|
15
|
+
endline(@raw)
|
16
|
+
end
|
17
|
+
|
13
18
|
def parse_srt
|
14
|
-
endl
|
15
|
-
@raw.split( endl*2 ).inject([]) do |final,line|
|
19
|
+
@raw.split(endl * 2).inject([]) do |final, line|
|
16
20
|
line = line.split(endl)
|
17
21
|
line.delete_at(0)
|
18
|
-
time_on,time_off = line[0].split('-->').map
|
19
|
-
line.delete_at(0)
|
20
|
-
text = line.join(
|
22
|
+
time_on, time_off = line[0].split('-->').map(&:strip)
|
23
|
+
line.delete_at(0)
|
24
|
+
text = line.join('|')
|
21
25
|
final << Subline.new(time_on, time_off, text)
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
25
29
|
def to_srt
|
26
|
-
endl = endline( @raw )
|
27
30
|
out = []
|
28
|
-
@lines.each_with_index do |l,i|
|
29
|
-
out << "#{i+1}"
|
30
|
-
out <<
|
31
|
-
out << l.text.gsub(
|
31
|
+
@lines.each_with_index do |l, i|
|
32
|
+
out << "#{i + 1}"
|
33
|
+
out << '%s --> %s' % [l.time_on.to_s(','), l.time_off.to_s(',')]
|
34
|
+
out << (l.text ? l.text.gsub('|', endl) : ' ') + endl
|
32
35
|
end
|
33
|
-
out.join(
|
34
|
-
end
|
36
|
+
out.join(endl)
|
37
|
+
end
|
35
38
|
end
|
36
39
|
|
37
|
-
#looks like subrip accepts some styling:
|
40
|
+
# looks like subrip accepts some styling:
|
38
41
|
# sdict.add(new StyledFormat(ITALIC, "i", true));
|
39
42
|
# sdict.add(new StyledFormat(ITALIC, "/i", false));
|
40
43
|
# sdict.add(new StyledFormat(BOLD, "b", true));
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# SubtitleIt
|
2
2
|
# MPSub, MicroDVD or VOBSub format
|
3
|
-
#TODO: tricky.. detect which format we got.
|
3
|
+
# TODO: tricky.. detect which format we got.
|
4
4
|
#
|
5
5
|
# {1025}{1115}You always say that.|The same thing every time.
|
6
6
|
# {1118}{1177}"l'm throug h, never again,|too dangerous."
|
@@ -17,14 +17,14 @@
|
|
17
17
|
#
|
18
18
|
module Formats
|
19
19
|
include PlatformEndLine
|
20
|
-
#between our formats, what changes can be reduced to a value
|
20
|
+
# between our formats, what changes can be reduced to a value
|
21
21
|
def ratio
|
22
|
-
|
22
|
+
1
|
23
23
|
end
|
24
24
|
|
25
25
|
def parse_sub
|
26
26
|
# FIXME: 1.8 and 1.9 way of working
|
27
|
-
@raw.send(@raw.respond_to?(:lines) ? :lines : :to_a).reduce([]) do |i,l|
|
27
|
+
@raw.send(@raw.respond_to?(:lines) ? :lines : :to_a).reduce([]) do |i, l|
|
28
28
|
line_data = l.scan(/^\{([0-9]{1,})\}\{([0-9]{1,})\}(.+)$/)
|
29
29
|
line_data = line_data.at 0
|
30
30
|
time_on, time_off, text = line_data
|
@@ -36,12 +36,12 @@ module Formats
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def to_sub
|
39
|
-
endl = endline(
|
39
|
+
endl = endline(@raw)
|
40
40
|
line_ary = []
|
41
41
|
@lines.each do |l|
|
42
|
-
line_ary <<
|
42
|
+
line_ary << '{%d}{%d}%s' % [parse_time(l.time_on), parse_time(l.time_off), l.text]
|
43
43
|
end
|
44
|
-
|
44
|
+
line_ary.join(endl) + endl
|
45
45
|
end
|
46
46
|
|
47
47
|
def parse_time(n)
|
@@ -18,34 +18,35 @@
|
|
18
18
|
# <p begin="00:00:29.02" dur="00:00:01.30" style="1">as <span tts:color="#ccc333">easy</span> as drawing on paper.</p>
|
19
19
|
# </div>
|
20
20
|
# </body>
|
21
|
-
|
22
|
-
require '
|
21
|
+
# </tt>
|
22
|
+
require 'nokogiri'
|
23
|
+
|
23
24
|
module Formats
|
24
25
|
include PlatformEndLine
|
25
26
|
|
26
27
|
def parse_xml
|
27
28
|
final = []
|
28
|
-
doc =
|
29
|
-
(doc/'tt'/'p').each do |line|
|
30
|
-
time_on, time_off =
|
31
|
-
text = line.
|
32
|
-
final << Subline.new(time_on,time_off,text)
|
29
|
+
doc = Nokogiri::XML.parse(@raw)
|
30
|
+
(doc / 'tt' / 'p').each do |line|
|
31
|
+
time_on, time_off = %w(begin dur).map { |str| line[str.to_sym] }
|
32
|
+
text = line.inner_html
|
33
|
+
final << Subline.new(time_on, time_off, text)
|
33
34
|
end
|
34
|
-
|
35
|
+
final
|
35
36
|
end
|
36
37
|
|
37
38
|
def xml_lines
|
38
|
-
endl = endline(
|
39
|
+
endl = endline(@raw)
|
39
40
|
line_ary = []
|
40
41
|
@lines.each do |l|
|
41
42
|
toff = l.time_off - l.time_on
|
42
43
|
line_ary << " <p begin=\"#{l.time_on}\" dur=\"#{toff}\">#{l.text}</p>"
|
43
44
|
end
|
44
|
-
|
45
|
+
line_ary.join(endl)
|
45
46
|
end
|
46
47
|
|
47
48
|
def to_xml
|
48
|
-
endl = endline(
|
49
|
+
endl = endline(@raw)
|
49
50
|
out = <<XML
|
50
51
|
<?xml version="1.0" encoding="UTF-8"?>
|
51
52
|
<tt xml:lang="en" xmlns="http://www.w3.org/2006/10/ttaf1" xmlns:tts="http://www.w3.org/2006/10/ttaf1#styling">
|
@@ -60,6 +61,6 @@ module Formats
|
|
60
61
|
</body>
|
61
62
|
</tt>
|
62
63
|
XML
|
63
|
-
|
64
|
+
out.chomp
|
64
65
|
end
|
65
66
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# SubtitleIt
|
2
2
|
# YML Dump
|
3
3
|
#
|
4
|
-
|
5
|
-
module Formats
|
4
|
+
|
5
|
+
module Formats
|
6
6
|
def parse_yml
|
7
|
-
@yaml = YAML
|
7
|
+
@yaml = YAML.load(@raw)
|
8
8
|
header = @yaml.delete('header')
|
9
9
|
@title = header['title']
|
10
10
|
@author = header['authors']
|
11
11
|
@version = header['version']
|
12
12
|
@yaml['lines'].map { |l| Subline.new(l[0], l[1], l[2]) }
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def to_yml
|
16
16
|
YAML.dump(self)
|
17
|
-
end
|
17
|
+
end
|
18
18
|
end
|