encoder-tools 0.0.2 → 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.
- checksums.yaml +7 -0
- data/.gitignore +12 -23
- data/.rspec +3 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -10
- data/Gemfile.lock +37 -83
- data/LICENSE +1 -1
- data/README.md +14 -0
- data/Rakefile +3 -43
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/encoder-tools.gemspec +28 -0
- data/lib/encoder-tools.rb +1 -0
- data/lib/encoder-tools/cli.rb +23 -12
- data/lib/encoder-tools/cli/subtitles.rb +1 -0
- data/lib/encoder-tools/cli/subtitles/base.rb +26 -3
- data/lib/encoder-tools/cli/subtitles/fix_lengths.rb +35 -21
- data/lib/encoder-tools/cli/subtitles/offset.rb +33 -12
- data/lib/encoder-tools/cli/subtitles/renumber.rb +3 -1
- data/lib/encoder-tools/cli/subtitles/spell_check.rb +73 -0
- data/lib/encoder-tools/subtitles/list.rb +5 -0
- data/lib/encoder-tools/subtitles/parser.rb +1 -1
- data/lib/encoder-tools/subtitles/subtitle.rb +9 -2
- data/lib/encoder-tools/util.rb +5 -0
- data/lib/encoder-tools/util/text_reader.rb +26 -0
- data/lib/encoder-tools/version.rb +3 -0
- metadata +95 -96
- data/README.rdoc +0 -17
- data/VERSION +0 -1
- data/spec/cli/subtitles/fix_lengths_spec.rb +0 -51
- data/spec/cli/subtitles/offset_spec.rb +0 -40
- data/spec/cli/subtitles/renumber_spec.rb +0 -23
- data/spec/fixtures/subtitles/adjusted-long-subtitles.srt +0 -16
- data/spec/fixtures/subtitles/bad-numbering-corrected.srt +0 -16
- data/spec/fixtures/subtitles/bad-numbering.srt +0 -16
- data/spec/fixtures/subtitles/kill-bill-vol-2.srt +0 -345
- data/spec/fixtures/subtitles/no-long-subtitles.srt +0 -16
- data/spec/fixtures/subtitles/short-example-offset-2.srt +0 -16
- data/spec/fixtures/subtitles/short-example-offset-minus-2.srt +0 -16
- data/spec/fixtures/subtitles/short-example-offset-plus-2.srt +0 -16
- data/spec/fixtures/subtitles/short-example.srt +0 -16
- data/spec/fixtures/subtitles/some-long-subtitles.srt +0 -16
- data/spec/options/title_spec.rb +0 -41
- data/spec/spec.opts +0 -2
- data/spec/spec_helper.rb +0 -31
- data/spec/strategies/movie_spec.rb +0 -23
- data/spec/subtitles/list_spec.rb +0 -57
- data/spec/subtitles/subtitle_spec.rb +0 -31
| @@ -5,6 +5,7 @@ module EncoderTools | |
| 5 5 | 
             
                  autoload :FixLengths, 'encoder-tools/cli/subtitles/fix_lengths'
         | 
| 6 6 | 
             
                  autoload :Offset,     'encoder-tools/cli/subtitles/offset'
         | 
| 7 7 | 
             
                  autoload :Renumber,   'encoder-tools/cli/subtitles/renumber'
         | 
| 8 | 
            +
                  autoload :SpellCheck, 'encoder-tools/cli/subtitles/spell_check'
         | 
| 8 9 | 
             
                end
         | 
| 9 10 | 
             
              end
         | 
| 10 11 | 
             
            end
         | 
| @@ -2,12 +2,35 @@ module EncoderTools | |
| 2 2 | 
             
              class CLI
         | 
| 3 3 | 
             
                module Subtitles
         | 
| 4 4 | 
             
                  class Base < CLI::Base
         | 
| 5 | 
            +
                    def self.parser(parser=nil)
         | 
| 6 | 
            +
                      case parser
         | 
| 7 | 
            +
                      when nil
         | 
| 8 | 
            +
                        @parser || EncoderTools::Subtitles::Parser
         | 
| 9 | 
            +
                      when :default
         | 
| 10 | 
            +
                        @parser = EncoderTools::Subtitles::Parser
         | 
| 11 | 
            +
                      when :relaxed
         | 
| 12 | 
            +
                        @parser = EncoderTools::Subtitles::RelaxedParser
         | 
| 13 | 
            +
                      when Class
         | 
| 14 | 
            +
                        @parser = parser
         | 
| 15 | 
            +
                      else
         | 
| 16 | 
            +
                        raise ArgumentError, "unexpected parser type: #{parser.inspect}"
         | 
| 17 | 
            +
                      end
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def parser
         | 
| 21 | 
            +
                      self.class.parser
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 5 24 | 
             
                    def parse(text)
         | 
| 6 | 
            -
                      EncoderTools::Subtitles::List.load(text)
         | 
| 25 | 
            +
                      EncoderTools::Subtitles::List.load(text, parser)
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    def read
         | 
| 29 | 
            +
                      parse(input.read)
         | 
| 7 30 | 
             
                    end
         | 
| 8 31 |  | 
| 9 | 
            -
                    def  | 
| 10 | 
            -
                       | 
| 32 | 
            +
                    def write(result)
         | 
| 33 | 
            +
                      output << result.to_s
         | 
| 11 34 | 
             
                    end
         | 
| 12 35 | 
             
                  end
         | 
| 13 36 | 
             
                end
         | 
| @@ -2,43 +2,57 @@ module EncoderTools | |
| 2 2 | 
             
              class CLI
         | 
| 3 3 | 
             
                module Subtitles
         | 
| 4 4 | 
             
                  class FixLengths < Base
         | 
| 5 | 
            -
                     | 
| 5 | 
            +
                    DEFAULT_THRESHOLD = 5
         | 
| 6 6 |  | 
| 7 7 | 
             
                    def run
         | 
| 8 | 
            -
                       | 
| 9 | 
            -
                         | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 8 | 
            +
                      begin
         | 
| 9 | 
            +
                        if long_subtitles? && fix_subtitles?
         | 
| 10 | 
            +
                          write fix_subtitles
         | 
| 11 | 
            +
                        end
         | 
| 12 12 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 13 | 
            +
                        return nil
         | 
| 14 | 
            +
                      rescue Interrupt
         | 
| 15 | 
            +
                        # just return on ^C
         | 
| 15 16 | 
             
                      end
         | 
| 17 | 
            +
                    end
         | 
| 16 18 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                         | 
| 20 | 
            -
                        range += " (#{subtitle.duration.to_i}s)\n"
         | 
| 21 | 
            -
                        lines.unshift(range)
         | 
| 22 | 
            -
                        lines << "\n" << "\n"
         | 
| 19 | 
            +
                    private
         | 
| 20 | 
            +
                      def long_subtitles?
         | 
| 21 | 
            +
                        return true if long_subtitles.any?
         | 
| 23 22 |  | 
| 24 | 
            -
                        shell.say | 
| 25 | 
            -
                         | 
| 23 | 
            +
                        shell.say "No subtitles found over #{threshold}s"
         | 
| 24 | 
            +
                        return false
         | 
| 26 25 | 
             
                      end
         | 
| 27 26 |  | 
| 28 | 
            -
                       | 
| 27 | 
            +
                      def fix_subtitles?
         | 
| 28 | 
            +
                        shell.yes?("Found #{long_subtitles.size} long subtitles. Would you like to fix them?")
         | 
| 29 | 
            +
                      end
         | 
| 29 30 |  | 
| 30 | 
            -
                       | 
| 31 | 
            -
             | 
| 31 | 
            +
                      def fix_subtitles
         | 
| 32 | 
            +
                        long_subtitles.each do |subtitle|
         | 
| 33 | 
            +
                          fix_subtitle(subtitle)
         | 
| 34 | 
            +
                        end
         | 
| 35 | 
            +
                        return list
         | 
| 36 | 
            +
                      end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                      def fix_subtitle(subtitle)
         | 
| 39 | 
            +
                        range = "%s (%s)" % [subtitle.range_string, subtitle.timestamp(subtitle.duration)]
         | 
| 40 | 
            +
                        shell.say([range, subtitle.text, '', ''].join("\n"))
         | 
| 41 | 
            +
                        subtitle.duration = BigDecimal(shell.ask("How long should it be?"))
         | 
| 42 | 
            +
                      end
         | 
| 32 43 |  | 
| 33 | 
            -
                    private
         | 
| 34 44 | 
             
                      def long_subtitles
         | 
| 35 45 | 
             
                        @long_subtitles ||= list.entries.select do |subtitle|
         | 
| 36 | 
            -
                          subtitle.duration >  | 
| 46 | 
            +
                          subtitle.duration > threshold
         | 
| 37 47 | 
             
                        end
         | 
| 38 48 | 
             
                      end
         | 
| 39 49 |  | 
| 40 50 | 
             
                      def list
         | 
| 41 | 
            -
                        @list ||=  | 
| 51 | 
            +
                        @list ||= read
         | 
| 52 | 
            +
                      end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                      def threshold
         | 
| 55 | 
            +
                        options[:threshold] || DEFAULT_THRESHOLD
         | 
| 42 56 | 
             
                      end
         | 
| 43 57 | 
             
                  end
         | 
| 44 58 | 
             
                end
         | 
| @@ -2,26 +2,47 @@ module EncoderTools | |
| 2 2 | 
             
              class CLI
         | 
| 3 3 | 
             
                module Subtitles
         | 
| 4 4 | 
             
                  class Offset < Base
         | 
| 5 | 
            +
                    NUMBER = '(\d+|\d*\.\d+)'
         | 
| 6 | 
            +
                    HH_MM_SS_OFFSET = %r{\A(?:(\d\d?):)?(\d\d?):(\d\d?)\Z}
         | 
| 7 | 
            +
                    ABSOLUTE_OFFSET = %r{\A#{NUMBER}\Z}
         | 
| 8 | 
            +
                    NEGATIVE_OFFSET = %r{\A-#{NUMBER}\Z}
         | 
| 9 | 
            +
                    POSITIVE_OFFSET = %r{\A\+#{NUMBER}\Z}
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    MIN_PER_HOUR = 60
         | 
| 12 | 
            +
                    SEC_PER_MIN  = 60
         | 
| 13 | 
            +
             | 
| 5 14 | 
             
                    def run
         | 
| 6 | 
            -
                       | 
| 15 | 
            +
                      value = if options[:set]
         | 
| 16 | 
            +
                                options[:set]
         | 
| 17 | 
            +
                              elsif options[:add]
         | 
| 18 | 
            +
                                "+#{options[:add]}"
         | 
| 19 | 
            +
                              elsif options[:subtract]
         | 
| 20 | 
            +
                                "-#{options[:subtract]}"
         | 
| 21 | 
            +
                              else
         | 
| 22 | 
            +
                                raise ArgumentError, "Must provide a set, add, or subtract option to determine the offset"
         | 
| 23 | 
            +
                              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      write offset(read, value)
         | 
| 7 26 | 
             
                    end
         | 
| 8 27 |  | 
| 9 28 | 
             
                    protected
         | 
| 10 | 
            -
                      def offset(list,  | 
| 11 | 
            -
                        list.offset = parse_offset(list,  | 
| 29 | 
            +
                      def offset(list, value)
         | 
| 30 | 
            +
                        list.offset = parse_offset(list, value)
         | 
| 12 31 | 
             
                        return list
         | 
| 13 32 | 
             
                      end
         | 
| 14 33 |  | 
| 15 | 
            -
                      def parse_offset(list,  | 
| 16 | 
            -
                        case  | 
| 34 | 
            +
                      def parse_offset(list, value)
         | 
| 35 | 
            +
                        case value
         | 
| 17 36 | 
             
                        when Fixnum
         | 
| 18 | 
            -
                           | 
| 19 | 
            -
                        when  | 
| 20 | 
            -
                           | 
| 21 | 
            -
                        when  | 
| 22 | 
            -
                          list.offset  | 
| 23 | 
            -
                        when  | 
| 24 | 
            -
                          offset | 
| 37 | 
            +
                          value
         | 
| 38 | 
            +
                        when HH_MM_SS_OFFSET
         | 
| 39 | 
            +
                          ((BigDecimal($1 || '0') * MIN_PER_HOUR) + BigDecimal($2)) * SEC_PER_MIN + BigDecimal($3)
         | 
| 40 | 
            +
                        when POSITIVE_OFFSET
         | 
| 41 | 
            +
                          list.offset + BigDecimal($1)
         | 
| 42 | 
            +
                        when NEGATIVE_OFFSET
         | 
| 43 | 
            +
                          list.offset - BigDecimal($1)
         | 
| 44 | 
            +
                        when ABSOLUTE_OFFSET
         | 
| 45 | 
            +
                          BigDecimal(value)
         | 
| 25 46 | 
             
                        end
         | 
| 26 47 | 
             
                      end
         | 
| 27 48 | 
             
                  end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            require 'set'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module EncoderTools
         | 
| 4 | 
            +
              class CLI
         | 
| 5 | 
            +
                module Subtitles
         | 
| 6 | 
            +
                  class SpellCheck < Base
         | 
| 7 | 
            +
                    DEFAULT_DICT = '/usr/share/dict/words'.freeze
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def run
         | 
| 10 | 
            +
                      write(read.each do |subtitle|
         | 
| 11 | 
            +
                        subtitle.text.gsub!(/\w+/) do |word|
         | 
| 12 | 
            +
                          fix_word(word)
         | 
| 13 | 
            +
                        end
         | 
| 14 | 
            +
                      end)
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    private
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def fix_word(word)
         | 
| 20 | 
            +
                      return word if word?(word)
         | 
| 21 | 
            +
                      fix_ls_that_should_be_is(word)
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    def fix_ls_that_should_be_is(word)
         | 
| 25 | 
            +
                      # example: word == "bllllng"
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                      ls = []
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      word.each_char.with_index do |char, i|
         | 
| 30 | 
            +
                        ls << i if char == 'l'
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                      # ls == [1, 2, 3, 4]
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      ls.size.downto(1) do |n|
         | 
| 36 | 
            +
                        # substitute all 'l' with 'i' to start, then one less, etc
         | 
| 37 | 
            +
                        ls.combination(n) do |to_change|
         | 
| 38 | 
            +
                          # to_change == [1, 2, 3, 4], then [1, 2, 3], [1, 3, 4], etc
         | 
| 39 | 
            +
                          candidate = word.dup
         | 
| 40 | 
            +
                          to_change.each do |pos|
         | 
| 41 | 
            +
                            candidate[pos] = 'i'
         | 
| 42 | 
            +
                          end
         | 
| 43 | 
            +
                          # candidate == "biiiing", "biliing", "biiling", etc
         | 
| 44 | 
            +
                          return candidate if word?(candidate)
         | 
| 45 | 
            +
                        end
         | 
| 46 | 
            +
                      end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                      return word
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    def word?(word)
         | 
| 52 | 
            +
                      words.include?(word.downcase)
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    def words
         | 
| 56 | 
            +
                      @words ||= read_words
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    def read_words
         | 
| 60 | 
            +
                      if dict
         | 
| 61 | 
            +
                        Set.new(File.read(dict).split($/).map {|w| w.downcase })
         | 
| 62 | 
            +
                      else
         | 
| 63 | 
            +
                        raise ArgumentError, "Must provide a dictionary of valid words"
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                    def dict
         | 
| 68 | 
            +
                      options.fetch(:dict, File.exist?(DEFAULT_DICT) ? DEFAULT_DICT : nil)
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
| @@ -29,12 +29,19 @@ module EncoderTools | |
| 29 29 | 
             
                      other.text == self.text
         | 
| 30 30 | 
             
                  end
         | 
| 31 31 |  | 
| 32 | 
            +
                  def range_string
         | 
| 33 | 
            +
                    "#{timestamp range.begin} --> #{timestamp range.end}"
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 32 36 | 
             
                  def to_s
         | 
| 33 | 
            -
                     | 
| 37 | 
            +
                    [range_string, text].join("\n")
         | 
| 34 38 | 
             
                  end
         | 
| 35 39 |  | 
| 36 | 
            -
                  private
         | 
| 37 40 | 
             
                  def timestamp(value)
         | 
| 41 | 
            +
                    self.class.timestamp(value)
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  def self.timestamp(value)
         | 
| 38 45 | 
             
                    seconds = value.to_i
         | 
| 39 46 | 
             
                    millis = ((value - seconds) * 1000).to_i
         | 
| 40 47 | 
             
                    minutes, seconds = seconds.divmod(60)
         | 
| @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            module EncoderTools
         | 
| 2 | 
            +
              module Util
         | 
| 3 | 
            +
                class TextReader
         | 
| 4 | 
            +
                  ENCODING_MARKER = "\xef\xbb\xbf".freeze
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def initialize(input)
         | 
| 7 | 
            +
                    @input = input
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def read
         | 
| 11 | 
            +
                    strip_encoding_marker(
         | 
| 12 | 
            +
                      @input.respond_to?(:read) ?  @input.read : @input)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def self.read(input)
         | 
| 16 | 
            +
                    new(input).read
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  private
         | 
| 20 | 
            +
                    def strip_encoding_marker(string)
         | 
| 21 | 
            +
                      string[0, ENCODING_MARKER.size] == ENCODING_MARKER ?
         | 
| 22 | 
            +
                        string[ENCODING_MARKER.size..-1] : string
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,66 +1,92 @@ | |
| 1 | 
            -
            --- !ruby/object:Gem::Specification | 
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: encoder-tools
         | 
| 3 | 
            -
            version: !ruby/object:Gem::Version | 
| 4 | 
            -
              version: 0.0 | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 | 
            -
            authors: | 
| 6 | 
            +
            authors:
         | 
| 7 7 | 
             
            - Brian Donovan
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 | 
            -
            bindir:  | 
| 9 | 
            +
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
            dependencies: 
         | 
| 15 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 11 | 
            +
            date: 2017-12-22 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 16 14 | 
             
              name: thor
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - "~>"
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: 0.18.1
         | 
| 17 20 | 
             
              type: :runtime
         | 
| 18 | 
            -
               | 
| 19 | 
            -
              version_requirements: !ruby/object:Gem::Requirement | 
| 20 | 
            -
                requirements: | 
| 21 | 
            -
                - - " | 
| 22 | 
            -
                  - !ruby/object:Gem::Version | 
| 23 | 
            -
                    version:  | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
               | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - "~>"
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: 0.18.1
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: bundler
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - "~>"
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '1.16'
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - "~>"
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '1.16'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: rake
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '10.0'
         | 
| 27 48 | 
             
              type: :development
         | 
| 28 | 
            -
               | 
| 29 | 
            -
              version_requirements: !ruby/object:Gem::Requirement | 
| 30 | 
            -
                requirements: | 
| 31 | 
            -
                - - " | 
| 32 | 
            -
                  - !ruby/object:Gem::Version | 
| 33 | 
            -
                    version:  | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
               | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '10.0'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: rspec
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '3.0'
         | 
| 37 62 | 
             
              type: :development
         | 
| 38 | 
            -
               | 
| 39 | 
            -
              version_requirements: !ruby/object:Gem::Requirement | 
| 40 | 
            -
                requirements: | 
| 41 | 
            -
                - - " | 
| 42 | 
            -
                  - !ruby/object:Gem::Version | 
| 43 | 
            -
                    version:  | 
| 44 | 
            -
                version: 
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '3.0'
         | 
| 45 69 | 
             
            description: Tools for ripping, encoding, and subtitling movies and TV shows
         | 
| 46 | 
            -
            email: | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 70 | 
            +
            email:
         | 
| 71 | 
            +
            - me@brian-donovan.com
         | 
| 72 | 
            +
            executables: []
         | 
| 49 73 | 
             
            extensions: []
         | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
            -  | 
| 53 | 
            -
            -  | 
| 54 | 
            -
             | 
| 55 | 
            -
            - . | 
| 56 | 
            -
            - . | 
| 74 | 
            +
            extra_rdoc_files: []
         | 
| 75 | 
            +
            files:
         | 
| 76 | 
            +
            - ".document"
         | 
| 77 | 
            +
            - ".gitignore"
         | 
| 78 | 
            +
            - ".rspec"
         | 
| 79 | 
            +
            - ".travis.yml"
         | 
| 80 | 
            +
            - CODE_OF_CONDUCT.md
         | 
| 57 81 | 
             
            - Gemfile
         | 
| 58 82 | 
             
            - Gemfile.lock
         | 
| 59 83 | 
             
            - LICENSE
         | 
| 60 | 
            -
            - README. | 
| 84 | 
            +
            - README.md
         | 
| 61 85 | 
             
            - Rakefile
         | 
| 62 | 
            -
            -  | 
| 86 | 
            +
            - bin/console
         | 
| 63 87 | 
             
            - bin/encoder-tools
         | 
| 88 | 
            +
            - bin/setup
         | 
| 89 | 
            +
            - encoder-tools.gemspec
         | 
| 64 90 | 
             
            - lib/encoder-tools.rb
         | 
| 65 91 | 
             
            - lib/encoder-tools/cli.rb
         | 
| 66 92 | 
             
            - lib/encoder-tools/cli/base.rb
         | 
| @@ -69,6 +95,7 @@ files: | |
| 69 95 | 
             
            - lib/encoder-tools/cli/subtitles/fix_lengths.rb
         | 
| 70 96 | 
             
            - lib/encoder-tools/cli/subtitles/offset.rb
         | 
| 71 97 | 
             
            - lib/encoder-tools/cli/subtitles/renumber.rb
         | 
| 98 | 
            +
            - lib/encoder-tools/cli/subtitles/spell_check.rb
         | 
| 72 99 | 
             
            - lib/encoder-tools/options.rb
         | 
| 73 100 | 
             
            - lib/encoder-tools/options/title.rb
         | 
| 74 101 | 
             
            - lib/encoder-tools/strategies.rb
         | 
| @@ -80,59 +107,31 @@ files: | |
| 80 107 | 
             
            - lib/encoder-tools/subtitles/parser.rb
         | 
| 81 108 | 
             
            - lib/encoder-tools/subtitles/relaxed_parser.rb
         | 
| 82 109 | 
             
            - lib/encoder-tools/subtitles/subtitle.rb
         | 
| 83 | 
            -
            -  | 
| 84 | 
            -
            -  | 
| 85 | 
            -
            -  | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
            -  | 
| 89 | 
            -
             | 
| 90 | 
            -
            - spec/fixtures/subtitles/no-long-subtitles.srt
         | 
| 91 | 
            -
            - spec/fixtures/subtitles/short-example-offset-2.srt
         | 
| 92 | 
            -
            - spec/fixtures/subtitles/short-example-offset-minus-2.srt
         | 
| 93 | 
            -
            - spec/fixtures/subtitles/short-example-offset-plus-2.srt
         | 
| 94 | 
            -
            - spec/fixtures/subtitles/short-example.srt
         | 
| 95 | 
            -
            - spec/fixtures/subtitles/some-long-subtitles.srt
         | 
| 96 | 
            -
            - spec/options/title_spec.rb
         | 
| 97 | 
            -
            - spec/spec.opts
         | 
| 98 | 
            -
            - spec/spec_helper.rb
         | 
| 99 | 
            -
            - spec/strategies/movie_spec.rb
         | 
| 100 | 
            -
            - spec/subtitles/list_spec.rb
         | 
| 101 | 
            -
            - spec/subtitles/subtitle_spec.rb
         | 
| 102 | 
            -
            has_rdoc: true
         | 
| 103 | 
            -
            homepage: http://github.com/eventualbuddha/encoder-tools
         | 
| 104 | 
            -
            licenses: []
         | 
| 105 | 
            -
             | 
| 110 | 
            +
            - lib/encoder-tools/util.rb
         | 
| 111 | 
            +
            - lib/encoder-tools/util/text_reader.rb
         | 
| 112 | 
            +
            - lib/encoder-tools/version.rb
         | 
| 113 | 
            +
            homepage: https://github.com/eventualbuddha/encoder-tools
         | 
| 114 | 
            +
            licenses:
         | 
| 115 | 
            +
            - MIT
         | 
| 116 | 
            +
            metadata: {}
         | 
| 106 117 | 
             
            post_install_message: 
         | 
| 107 | 
            -
            rdoc_options: 
         | 
| 108 | 
            -
             | 
| 109 | 
            -
            require_paths: 
         | 
| 118 | 
            +
            rdoc_options: []
         | 
| 119 | 
            +
            require_paths:
         | 
| 110 120 | 
             
            - lib
         | 
| 111 | 
            -
            required_ruby_version: !ruby/object:Gem::Requirement | 
| 112 | 
            -
              requirements: | 
| 121 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 122 | 
            +
              requirements:
         | 
| 113 123 | 
             
              - - ">="
         | 
| 114 | 
            -
                - !ruby/object:Gem::Version | 
| 115 | 
            -
                  version:  | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
              requirements: 
         | 
| 124 | 
            +
                - !ruby/object:Gem::Version
         | 
| 125 | 
            +
                  version: '0'
         | 
| 126 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 127 | 
            +
              requirements:
         | 
| 119 128 | 
             
              - - ">="
         | 
| 120 | 
            -
                - !ruby/object:Gem::Version | 
| 121 | 
            -
                  version:  | 
| 122 | 
            -
              version: 
         | 
| 129 | 
            +
                - !ruby/object:Gem::Version
         | 
| 130 | 
            +
                  version: '0'
         | 
| 123 131 | 
             
            requirements: []
         | 
| 124 | 
            -
             | 
| 125 132 | 
             
            rubyforge_project: 
         | 
| 126 | 
            -
            rubygems_version:  | 
| 133 | 
            +
            rubygems_version: 2.5.2
         | 
| 127 134 | 
             
            signing_key: 
         | 
| 128 | 
            -
            specification_version:  | 
| 129 | 
            -
            summary:  | 
| 130 | 
            -
            test_files: 
         | 
| 131 | 
            -
            - spec/cli/subtitles/fix_lengths_spec.rb
         | 
| 132 | 
            -
            - spec/cli/subtitles/offset_spec.rb
         | 
| 133 | 
            -
            - spec/cli/subtitles/renumber_spec.rb
         | 
| 134 | 
            -
            - spec/options/title_spec.rb
         | 
| 135 | 
            -
            - spec/spec_helper.rb
         | 
| 136 | 
            -
            - spec/strategies/movie_spec.rb
         | 
| 137 | 
            -
            - spec/subtitles/list_spec.rb
         | 
| 138 | 
            -
            - spec/subtitles/subtitle_spec.rb
         | 
| 135 | 
            +
            specification_version: 4
         | 
| 136 | 
            +
            summary: Tools for ripping, encoding, and subtitling movies and TV shows
         | 
| 137 | 
            +
            test_files: []
         |