49 lines
992 B
Ruby
49 lines
992 B
Ruby
class DurationTimecode
|
|
def self.parse(timecode)
|
|
if match = DURATION_TIMECODE_REGEX.match(timecode)
|
|
hours = match[1].to_i
|
|
minutes = match[2].to_i
|
|
seconds = match[3].to_i
|
|
new(hours, minutes, seconds)
|
|
else
|
|
raise ArgumentError.new("Must be HH:MM:SS format")
|
|
end
|
|
end
|
|
|
|
def self.from_seconds(total_seconds)
|
|
hours = total_seconds / 60 / 60
|
|
minutes = total_seconds / 60 % 60
|
|
seconds = total_seconds % 60
|
|
|
|
DurationTimecode.new(hours, minutes, seconds)
|
|
end
|
|
|
|
attr_reader :hours, :minutes, :seconds
|
|
|
|
def initialize(hours, minutes, seconds)
|
|
@hours = hours
|
|
@minutes = minutes
|
|
@seconds = seconds
|
|
end
|
|
|
|
def to_s
|
|
[hours, minutes, seconds].map { |t| t.to_s.rjust(2,'0') }.join(':')
|
|
end
|
|
|
|
def to_i
|
|
[
|
|
hours * 60 * 60,
|
|
minutes * 60,
|
|
seconds
|
|
].sum
|
|
end
|
|
|
|
def +(other)
|
|
DurationTimecode.from_seconds(to_i + other.to_i)
|
|
end
|
|
|
|
private
|
|
|
|
DURATION_TIMECODE_REGEX = /\A(\d+):(\d+):(\d+)\z/
|
|
end
|