348 lines
7.9 KiB
Ruby
348 lines
7.9 KiB
Ruby
require 'options'
|
|
|
|
class VDR::Timer
|
|
attr_reader :vdr, :status, :channel, :day, :start, :stop, :priority
|
|
attr_reader :file, :summary, :number, :lifetime
|
|
|
|
def initialize vdr, status = VDR::Timer::Status.new, channel = 1,
|
|
day = VDR::Timer::Day.new, start = VDR::Timer::Clock.new,
|
|
stop = VDR::Timer::Clock.new, priority = 0, lifetime = 0,
|
|
file = "", summary = "", number = 0
|
|
|
|
@vdr = vdr
|
|
self.status, self.channel, self.day, self.start, self.stop,
|
|
self.priority, self.lifetime, self.file, self.summary,
|
|
@number = if status.kind_of? String
|
|
status = /^((\d+) )?(.*)$/.match status
|
|
status[3].split( ':', 9) + [ status[2].to_i ]
|
|
else [ status, channel, day, start, stop, priority,
|
|
lifetime, file, summary, number ]
|
|
end
|
|
end
|
|
|
|
def status= value
|
|
value = VDR::Timer::Status.new value if [ String, Fixnum ].include? value.class
|
|
Kernel.expect VDR::Timer::Status, value
|
|
@status = value
|
|
end
|
|
|
|
def priority= value
|
|
value = value.to_i
|
|
Kernel.expect 0..99, value
|
|
@priority = value
|
|
end
|
|
|
|
def file= value
|
|
@file = value.to_s.gsub ":", "|"
|
|
end
|
|
|
|
def channel= value
|
|
value = value.to_i
|
|
Kernel.expect Fixnum, value
|
|
@channel = value
|
|
end
|
|
|
|
def start= value
|
|
case value
|
|
when String, Integer: value = VDR::Timer::Clock.new value
|
|
end
|
|
Kernel.expect VDR::Timer::Clock, value
|
|
@start = value
|
|
end
|
|
|
|
def stop_time
|
|
day, stop = self.day, self.stop
|
|
t = Time.gm day.year, day.month, day.day, stop.hour, stop.minute
|
|
t += 1440 if self.start > stop
|
|
t
|
|
end
|
|
|
|
def stop_time= t
|
|
t = Time.local t if t === Integer
|
|
@stop = VDR::Timer::Clock.new t.hour, t.min
|
|
end
|
|
|
|
def start_time
|
|
day, start = self.day, self.start
|
|
Time.gm day.year, day.month, day.day, start.hour, start.minute
|
|
end
|
|
|
|
def start_time= t
|
|
t = Time.local t if t === Integer
|
|
@day = VDR::Timer::Day.new t.year, t.month, t.day
|
|
@start = VDR::Timer::Clock.new t.hour, t.min
|
|
end
|
|
|
|
def stop= value
|
|
case value
|
|
when String, Integer: value = VDR::Timer::Clock.new value
|
|
end
|
|
Kernel.expect VDR::Timer::Clock, value
|
|
@stop = value
|
|
end
|
|
|
|
def summary= value
|
|
@summary = value.to_s.gsub "\n", "|"
|
|
end
|
|
|
|
def lifetime= value
|
|
value = value.to_i
|
|
Kernel.expect 0..99, value
|
|
@lifetime = value
|
|
end
|
|
|
|
def day= value
|
|
value = VDR::Timer::Day.new value if value.kind_of? String
|
|
Kernel.expect VDR::Timer::Day, value
|
|
@day = value
|
|
end
|
|
|
|
def to_s
|
|
"#{@status}:#{@channel}:#{@day}:#{@start}:#{@stop}:#{@priority}:#{@lifetime}:#{@file}:#{@summary}"
|
|
end
|
|
|
|
def =~ value
|
|
start, stop, vstart, vstop = self.start_time, self.stop_time,
|
|
value.start_time, value.stop_time
|
|
pre, post = (vstart..vstop) === start, (vstart..vstop) === stop
|
|
if pre && post then true
|
|
elsif pre then -1
|
|
elsif post then 1
|
|
elsif (start..stop) === vstart then 0
|
|
else false
|
|
end
|
|
end
|
|
end
|
|
|
|
class VDR::Timer::Status
|
|
%w{ACTIVE INSTANT USE_VPS RECORDING}.each_with_index do |l,i|
|
|
i, m = i**2, l.downcase
|
|
consts_multiset i, l
|
|
c = lambda {|| @repeat&i == i }
|
|
define_method m, &c
|
|
define_method "#{m}?", &c
|
|
define_method "#{m}=" do |value|
|
|
@repeat = @repeat & ~i | (value ? i : 0)
|
|
end
|
|
end
|
|
|
|
attr_reader :status
|
|
|
|
def initialize( status = 0) self.status = status end
|
|
def to_s() @status.to_s end
|
|
|
|
def status= value
|
|
value = value.to_i
|
|
Kernel.expect [Bignum, Fixnum], value
|
|
@status = value
|
|
end
|
|
end
|
|
|
|
class VDR::Timer::Clock
|
|
attr_reader :hour, :minute
|
|
|
|
def initialize hour = 0, minute = nil
|
|
self.hour, self.minute = if minute.nil?
|
|
case hour
|
|
when String then [ hour[0..1], hour[2..3] ]
|
|
when Integer then [ hour/60, hour%60 ]
|
|
else [ 0, 0 ]
|
|
end
|
|
else
|
|
[ hour, minute ]
|
|
end
|
|
end
|
|
|
|
def minute= value
|
|
value = value.to_i
|
|
Kernel.expect 0..60, value
|
|
@minute = value
|
|
end
|
|
|
|
def hour= value
|
|
value = value.to_i
|
|
Kernel.expect 0..23, value
|
|
@hour = value
|
|
end
|
|
|
|
def -( value) self.class.new self.to_i - value end
|
|
def +( value) self.class.new self.to_i + value end
|
|
def <( value) self.to_i < value.to_i end
|
|
def >( value) self.to_i > value.to_i end
|
|
|
|
def to_i= value
|
|
Kernel.expect Integer, value
|
|
self.hour, self.minute = value/60, value%60
|
|
end
|
|
|
|
def to_i() @hour*60 + @minute end
|
|
def to_s() "%02i%02i" % [ @hour, @minute ] end
|
|
def to_a() [@hour, @minute] end
|
|
def <=>() value self.to_i <=> value.to_i end
|
|
end
|
|
|
|
class VDR::Timer::Day
|
|
<<-EOD.split( "\n").each_with_index do |l,i|
|
|
MON MO MONDAY MONTAG
|
|
TUE DI TUESDAY DIENSTAG
|
|
WED MI WEDNESDAY MITTWOCH
|
|
THU DO THURSDAY DONNERSTAG
|
|
FRI FR FRIDAY FREITAG
|
|
SAT SA SATURDAY SAMSTAG
|
|
SUN SO SUNDAY SONNTAG
|
|
EOD
|
|
l = l.split( /\s+/)[1..-1]
|
|
i, m = i**2, l[2].downcase
|
|
consts_multiset i, *l
|
|
c = lambda {|| @repeat&i == i }
|
|
define_method m, &c
|
|
define_method "#{m}?", &c
|
|
define_method "#{m}=" do |value|
|
|
@repeat = @repeat & ~i | (value ? i : 0)
|
|
end
|
|
end
|
|
|
|
<<-EOD.split( "\n").each_with_index { |l,i| consts_multiset i, l }
|
|
DEL DELETE
|
|
JAN JANUARY JANUAR
|
|
FEB FEBRUARY FEBRUAR
|
|
MAR MARCH MAERZ
|
|
APR APRIL
|
|
MAY MAI
|
|
JUN JUNE JUNI
|
|
JUL JULY JULI
|
|
AUG AUGUST
|
|
SEP SEPTEMBER
|
|
OCT OCTOBER
|
|
NOV NOVEMBER
|
|
DEC DEZ DECEMBER DEZEMBER
|
|
EOD
|
|
|
|
attr_reader :year, :month, :day, :repeat
|
|
|
|
def initialize *paras
|
|
# year = Time.new.year, month = Time.new.month, day = Time.new.day, repeat = 0
|
|
x = nil
|
|
|
|
if paras.size == 1
|
|
x = case paras[0]
|
|
when String
|
|
value = paras[0]
|
|
if days = /^(\d{4})-(\d{2})-(\d{2})$/.match( value)
|
|
days = days.to_a[0..-1]
|
|
days[0] = 0
|
|
days
|
|
elsif days = /^([a-zA-Z\-]{7})@(\d{4})-(\d{2})-(\d{2})$/.match( value)
|
|
days.to_a[1..-1]
|
|
elsif /^[a-zA-Z\-]{7}$/.match value
|
|
[ value, 0, 0, 0 ]
|
|
else raise ArgumentError, "Not a valid Day-string (#{value})"
|
|
end
|
|
when Time
|
|
t = paras[0]
|
|
[ 0, t.year, t.month, t.day ]
|
|
end
|
|
end
|
|
self.repeat, self.year, self.month, self.day = *x || [ paras[3] || 0, paras[0] || Time.new.year, paras[1] || Time.new.month, paras[2] || Time.new.day ]
|
|
end
|
|
|
|
def year= value
|
|
value = value.to_i
|
|
Kernel.expect Fixnum, value
|
|
@year = value
|
|
end
|
|
|
|
def month= value
|
|
value = case value.to_s.downcase
|
|
when %w{del delete} then 0
|
|
when %w{jan january januar} then 1
|
|
when %w{feb february februar} then 2
|
|
when %w{mar march maerz} then 3
|
|
when %w{apr april} then 4
|
|
when %w{may mai} then 5
|
|
when %w{jun june juni} then 6
|
|
when %w{jul july juli} then 7
|
|
when %w{aug august} then 8
|
|
when %w{sep september} then 9
|
|
when %w{oct october} then 10
|
|
when %w{nov november} then 11
|
|
when %w{dec december dez dezember} then 12
|
|
else value.to_s.to_i
|
|
end if value.kind_of?( String) || value.kind_of?( Symbol)
|
|
Kernel.expect 0..12, value
|
|
@month = value
|
|
end
|
|
|
|
def day= value
|
|
value = value.to_i
|
|
Kernel.expect 0..31, value
|
|
@day = value
|
|
end
|
|
|
|
def repeat= value
|
|
if value.kind_of? String
|
|
d = value
|
|
value = 0
|
|
(0...7).each do |i|
|
|
j = i**2
|
|
value |= j unless d[i] ==?-
|
|
end
|
|
end
|
|
Kernel.expect 0..MON|TUE|WED|THU|FRI|SAT|SUN, value
|
|
@repeat = value
|
|
end
|
|
|
|
def -( value) self + -value end
|
|
def <=>( value) self.to_i||0 <=> value.to_i||0 end
|
|
def to_a() [ @repeat, @month, @day, @year ] end
|
|
|
|
def to_i
|
|
@repeat == 0 ? nil : (Time.local( @year, @month, @day).to_i / 86400)
|
|
end
|
|
|
|
def to_s
|
|
if (@month | @day | @year == 0) && @repeat == 0
|
|
""
|
|
elsif @repeat == 0
|
|
"%04i-%02i-%02i" % [ @year, @month, @day]
|
|
else
|
|
str = "MTWTFSS"
|
|
str += "@%04i-%02i-%02i" % [ @year, @month, @day] unless [ @year, @month, @day ].include? 0
|
|
(0...7).each do |i|
|
|
j = i**2
|
|
str[i] = '-' unless @repeat&j == j
|
|
end
|
|
str
|
|
end
|
|
end
|
|
|
|
def + value
|
|
t = if @year | @month | @day == 0
|
|
[ 0, 0, 0]
|
|
else
|
|
t = Time.gm( @year, @month, @day) + 86400*value
|
|
[ t.year, t.month, t.day ]
|
|
end
|
|
self.class.new t[0], t[1], t[2], @repeat && (((@repeat + (@repeat << 7)) >> (value%7)) & 127)
|
|
end
|
|
|
|
def =~ value
|
|
day = self.to_i
|
|
if day
|
|
case value
|
|
when Time then day == value.to_i / 86400
|
|
when Integer then day == value
|
|
else super value
|
|
end
|
|
else
|
|
case value
|
|
when Time
|
|
day = 2**value.wday
|
|
self.repeat & day == day
|
|
when Integer then self === Time.at( value)
|
|
else super value
|
|
end
|
|
end
|
|
end
|
|
end
|