subtitle_shifter 1.0.0.0 → 1.1.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.
@@ -1,25 +1,72 @@
1
1
 
2
2
  # encoding: UTF-8
3
3
 
4
+ #@example Manipulate subtitles from the command line
5
+ # $ subtitle_shifter --help
6
+ # $ subtitle_shifter --operation add --index 12 --time 2,345 source.srt dest.srt
7
+ #@example Manipulate subtitles from within a ruby program
8
+ # # This will shift all subtitles from index 12 onward by 2.345 seconds
9
+ # # or 2345 milliseconds
10
+ # subs = SubtitleShifter.new('mysubs.srt')
11
+ # subs.parse
12
+ # subs.shift(:index => 12, :time => 2345)
13
+ #@example Shift subtitles backward
14
+ # # This will shift subtitles backward, beware - you cannot shift
15
+ # # subtitles backward so that they overlap the preceding subtitles.
16
+ # # A RuntimeError exception will be raised if this occurs.
17
+ # subs.shift(:index => 12, :time => -2345) # Simply provide a negative time value
18
+ #@example Output subtitles once they've been parsed and/or manipulated
19
+ # puts subs
20
+ # # -- or --
21
+ # subs.to_s
22
+ #@see http://en.wikipedia.org/wiki/Subrip Wikipedia's article on the SubRip format
4
23
  class SubtitleShifter
5
24
  module Version
6
25
  MAJOR = 1
7
- MINOR = 0
26
+ MINOR = 1
8
27
  PATCH = 0
9
28
  BUILD = 0
10
29
 
11
30
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
12
31
  end
13
32
 
14
- attr_reader :subtitles, :parsed_ok
15
-
33
+ # A boolean flag highlighting whether or not subtitles have been parsed yet
34
+ attr_reader :parsed_ok
35
+ # A hash of the parsed subtitles. You normally wouldn't need to access this directly
36
+ # @example The format of the hash is as follows
37
+ # {1 => {:start => 107,
38
+ # :end => 5762,
39
+ # :subtitle => 'This is the first subtitle'
40
+ # },
41
+ # {2 => {:start => 5890,
42
+ # :end => 10553,
43
+ # :subtitle => 'This is the second subtitle'
44
+ # }
45
+ # @note I chose to implement internal representation of subtitle files as a hash
46
+ # and not an array, which would've been more efficient, as subtitles cannot be
47
+ # guaranteed to start at index 1
48
+ # That being said, I can already think of a way to do this using an array and offset attribute
49
+ attr_reader :subtitles
50
+
51
+ # The delimiter used for separating SubRip time stamps
16
52
  TIME_SEPERATOR = '-->'
17
53
 
54
+ # @param [String] file A string of the file name
55
+ # @param [String] linebreak A string of the linebreak pattern.
18
56
  def initialize(file, linebreak = "\r\n")
19
57
  @sub_file = file
20
58
  @linebreak = linebreak
59
+ @parsed_ok = false
21
60
  end
22
61
 
62
+ # Parses the subtitles
63
+ # @note Always call only after initialising.
64
+ # @note If your subtitle file is UTF-8 encoded, and has a Byte Order Mark as its first few bytes,
65
+ # the BOM will not be preserved when outputing the parsed and shifted subtitles. You probably don't
66
+ # need it anyway
67
+ # @example
68
+ # sub.parse if sub.parsed_ok
69
+ # @see http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark Wikipedia's article on UTF-8 and BOM
23
70
  def parse
24
71
  raw_text = File.open(@sub_file, 'r').read.force_encoding('UTF-8')
25
72
  raw_text.gsub!("\xEF\xBB\xBF".force_encoding("UTF-8"), '') #Remove stupid BOM that was causing me so much grief!
@@ -37,6 +84,12 @@ class SubtitleShifter
37
84
  @parsed_ok = true # Not very useful, but will help when error checking is added
38
85
  end
39
86
 
87
+ # Shifts subtitles forward (or backward) by a number of ms from an index
88
+ # @param [Integer] :index The index of the subtitle
89
+ # @param [Integer] :time The time (in ms) by which you wish to shift the subtitles. A negative value will shift backwards.
90
+ # @example
91
+ # sub.shift(:index => 42, :time => 10000) # Shift subs from index 42 onwards by 10 seconds.
92
+ # @raise [RuntimeError] Raises this exception when shifting backwards if index and index-1 time's overlap
40
93
  def shift(args)
41
94
  first = args[:index] # used for checking first go round.
42
95
  index = first
@@ -58,6 +111,9 @@ class SubtitleShifter
58
111
  end
59
112
  end
60
113
 
114
+ # Outputs parsed subtitles
115
+ # @raise [RuntimeError] Will raise this exception if an attempt is made to output the subs before parsing has taken place
116
+ # @see SubtitleShifter#parsed_ok
61
117
  def to_s
62
118
  raise RuntimeError, 'File has not been parsed yet' unless @parsed_ok
63
119
 
@@ -0,0 +1,64 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{subtitle_shifter}
8
+ s.version = "1.1.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Gabriel Fortuna}]
12
+ s.date = %q{2011-12-13}
13
+ s.description = %q{A simple little gem for modifying SubRip subtitle files. Done as a mentoring exercise with Citizen428, and taken from the Ruby Programming Challenge For Newbies}
14
+ s.email = %q{gee.forr@gmail.com}
15
+ s.executables = [%q{shift_subtitle}]
16
+ s.extra_rdoc_files = [
17
+ "LICENSE.txt",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".document",
22
+ "LICENSE.txt",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "bin/shift_subtitle",
27
+ "lib/.subtitle_shifter.rb.swp",
28
+ "lib/subtitle_shifter.rb",
29
+ "subtitle_shifter.gemspec",
30
+ "test/The.Big.Bang.Theory.srt",
31
+ "test/helper.rb",
32
+ "test/subtitle_shifter_spec.rb"
33
+ ]
34
+ s.homepage = %q{http://github.com/gee-forr/subtitle_shifter}
35
+ s.licenses = [%q{MIT}]
36
+ s.require_paths = [%q{lib}]
37
+ s.rubygems_version = %q{1.8.6}
38
+ s.summary = %q{A simple library for adjusting SubRip (.srt) subtitles}
39
+
40
+ if s.respond_to? :specification_version then
41
+ s.specification_version = 3
42
+
43
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
44
+ s.add_development_dependency(%q<minitest>, [">= 0"])
45
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
46
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
47
+ s.add_development_dependency(%q<rcov>, [">= 0"])
48
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
49
+ else
50
+ s.add_dependency(%q<minitest>, [">= 0"])
51
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
52
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
53
+ s.add_dependency(%q<rcov>, [">= 0"])
54
+ s.add_dependency(%q<rdoc>, [">= 0"])
55
+ end
56
+ else
57
+ s.add_dependency(%q<minitest>, [">= 0"])
58
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
59
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
60
+ s.add_dependency(%q<rcov>, [">= 0"])
61
+ s.add_dependency(%q<rdoc>, [">= 0"])
62
+ end
63
+ end
64
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: subtitle_shifter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.0
4
+ version: 1.1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-12-13 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
16
- requirement: &70285953842120 !ruby/object:Gem::Requirement
16
+ requirement: &70158991265800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70285953842120
24
+ version_requirements: *70158991265800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &70285953840700 !ruby/object:Gem::Requirement
27
+ requirement: &70158987679900 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70285953840700
35
+ version_requirements: *70158987679900
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &70285953839740 !ruby/object:Gem::Requirement
38
+ requirement: &70158987678000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.6.4
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70285953839740
46
+ version_requirements: *70158987678000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rcov
49
- requirement: &70285953838260 !ruby/object:Gem::Requirement
49
+ requirement: &70158987676420 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70285953838260
57
+ version_requirements: *70158987676420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rdoc
60
- requirement: &70285953837240 !ruby/object:Gem::Requirement
60
+ requirement: &70158987674940 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70285953837240
68
+ version_requirements: *70158987674940
69
69
  description: A simple little gem for modifying SubRip subtitle files. Done as a mentoring
70
70
  exercise with Citizen428, and taken from the Ruby Programming Challenge For Newbies
71
71
  email: gee.forr@gmail.com
@@ -84,6 +84,7 @@ files:
84
84
  - bin/shift_subtitle
85
85
  - lib/.subtitle_shifter.rb.swp
86
86
  - lib/subtitle_shifter.rb
87
+ - subtitle_shifter.gemspec
87
88
  - test/The.Big.Bang.Theory.srt
88
89
  - test/helper.rb
89
90
  - test/subtitle_shifter_spec.rb