class Captions::SRT

Public Instance Methods

dump(file) click to toggle source
# File lib/captions/formats/srt.rb, line 43
def dump(file)
  base_dump(file) do |file|
    @cue_list.each do |cue|
      file.write(cue.number)
      file.write("\n")
      file.write(msec_to_timecode(cue.start_time).gsub!('.' , ','))
      file.write(" --> ")
      file.write(msec_to_timecode(cue.end_time).gsub!('.' , ','))
      file.write("\n")
      file.write(cue.text)
      file.write("\n\n")
    end
  end
end
format_time(text) click to toggle source
# File lib/captions/formats/srt.rb, line 63
def format_time(text)
  text.strip.gsub(/,/,".")
end
get_time(line) click to toggle source
# File lib/captions/formats/srt.rb, line 58
def get_time(line)
  data = line.split('-->')
  return format_time(data[0]), format_time(data[1])
end
is_number?(text) click to toggle source
# File lib/captions/formats/srt.rb, line 67
def is_number?(text)
  !!text.match(/^\d+$/)
end
is_text?(text) click to toggle source
# File lib/captions/formats/srt.rb, line 75
def is_text?(text)
  !text.empty? and text.is_a?(String)
end
is_time?(text) click to toggle source
# File lib/captions/formats/srt.rb, line 71
def is_time?(text)
  !!text.match(/^\d{2}:\d{2}:\d{2},\d{3}.*\d{2}:\d{2}:\d{2},\d{3}$/)
end
parse() click to toggle source
# File lib/captions/formats/srt.rb, line 4
def parse
  base_parser do
    count = 0
    state = :new_cue
    cue = nil
    loop do
      count += 1
      line = @file.gets
      break if line.nil? ## End of file
      line.strip!
      case state
      when :new_cue
        next if line.empty?  ## just another blank line, remain in new_cue state
        begin
          cue = Cue.new(Integer(line))
        rescue ArgumentError
          raise InvalidSubtitle, "Invalid Cue Number at line #{count}"
        end
        state = :time
      when :time
        raise InvalidSubtitle, "Invalid Time Format at line #{count}" unless is_time?(line)
        start_time, end_time = get_time(line)
        cue.set_time(start_time, end_time)
        state = :text
      when :text
        if line.empty?
          ## end of previous cue
          @cue_list.append(cue) if cue && cue.start_time
          cue = nil
          state = :new_cue
        else
          cue.add_text(line)
        end
      end
    end
    @cue_list.append(cue) if cue && cue.start_time
  end
end