diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2007-12-18 19:34:26 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2007-12-18 19:34:26 +0000 |
| commit | 4c8cb0291dde6a3d237011f6514f68081d9212c9 (patch) | |
| tree | 8e5183977138ed057338d51bdd856ff4dabef725 /lib | |
| parent | b32e9ad19dd2ee50f3ad814fb39640ada6704d18 (diff) | |
| download | xxv-4c8cb0291dde6a3d237011f6514f68081d9212c9.tar.gz xxv-4c8cb0291dde6a3d237011f6514f68081d9212c9.tar.bz2 | |
* TIMERS: Parse date with locale format
* AUTOTIMER: Avoid double timers
* AUTOTIMER: Show vps-time if use on dumped table
* AUTOTIMER: Adjust timers set by the autotimer, now if event changed +/- five minutes.
* TIMERS: use date format from VDR 1.4, %Y-%m-%d
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/XXV/MODULES/AUTOTIMER.pm | 151 | ||||
| -rw-r--r-- | lib/XXV/MODULES/GRAB.pm | 12 | ||||
| -rw-r--r-- | lib/XXV/MODULES/TIMERS.pm | 49 |
3 files changed, 120 insertions, 92 deletions
diff --git a/lib/XXV/MODULES/AUTOTIMER.pm b/lib/XXV/MODULES/AUTOTIMER.pm index bf85632..950307e 100644 --- a/lib/XXV/MODULES/AUTOTIMER.pm +++ b/lib/XXV/MODULES/AUTOTIMER.pm @@ -354,11 +354,11 @@ sub _autotimerLookup { # Get Autotimer my $sth; if($autotimerid) { - $sth = $obj->{dbh}->prepare('SELECT SQL_CACHE * from AUTOTIMER where Activ = "y" AND Id = ? order by Id'); + $sth = $obj->{dbh}->prepare('SELECT SQL_CACHE * from AUTOTIMER where Activ = "y" AND Id = ? order by Id'); $sth->execute($autotimerid) or return error sprintf("Couldn't execute query: %s.",$sth->errstr); } else { - $sth = $obj->{dbh}->prepare('SELECT SQL_CACHE * from AUTOTIMER where Activ = "y" order by Id'); + $sth = $obj->{dbh}->prepare('SELECT SQL_CACHE * from AUTOTIMER where Activ = "y" order by Id'); $sth->execute() or return error sprintf("Couldn't execute query: %s.",$sth->errstr); } @@ -400,6 +400,7 @@ sub _autotimerLookup { or return error sprintf("Couldn't execute query: %s.",$sth->errstr); } + my $now = time; # Get Timersmodule my $timermod = main::getModule('TIMERS'); foreach my $id (sort keys %$att) { @@ -424,97 +425,106 @@ sub _autotimerLookup { [gettext("Title") , $events->{$Id}->{Title}], [gettext("Subtitle") , $events->{$Id}->{Subtitle}], [gettext("Channel") , $events->{$Id}->{Channel}], - [gettext("Start") , strftime("%x %X", localtime($events->{$Id}->{starttime}))], - [gettext("Stop") , strftime("%x %X", localtime($events->{$Id}->{stoptime}))], - [gettext("Description"), $events->{$Id}->{description}], ]; + if($events->{$Id}->{vpsstart} and $a->{VPS}) { + push(@$output, [gettext("Start") , strftime("%x %X", localtime($events->{$Id}->{vpsstart}))]); + push(@$output, [gettext("Stop") , strftime("%x %X", localtime($events->{$Id}->{vpsstop}))]); + } else { + push(@$output, [gettext("Start") , strftime("%x %X", localtime($events->{$Id}->{starttime}))]); + push(@$output, [gettext("Stop") , strftime("%x %X", localtime($events->{$Id}->{stoptime}))]); + } + push(@$output,[gettext("Description"), $events->{$Id}->{description}]); $console->table($output); }; } + my @done; + @done = split(',', $a->{Done}) if($a->{Done}); + # Every found and save this as timer my $c = 0; my $m = 0; foreach my $Id (sort keys %$events) { - $events->{$Id}->{Activ} = 'y'; - $events->{$Id}->{VPS} = ''; - $events->{$Id}->{Priority} = $a->{Priority}; - $events->{$Id}->{Lifetime} = $a->{Lifetime}; + my $event = $events->{$Id}; + + $event->{Activ} = 'y'; + $event->{Priority} = $a->{Priority}; + $event->{Lifetime} = $a->{Lifetime}; - $events->{$Id}->{File} = $obj->_placeholder($events->{$Id}, $a); + $event->{File} = $obj->_placeholder($event, $a); - if($events->{$Id}->{vpsstart} and $a->{VPS}) { - $events->{$Id}->{VPS} = 'y'; - $events->{$Id}->{starttime} = $events->{$Id}->{vpsstart}; - $events->{$Id}->{stoptime} = $events->{$Id}->{vpsstop}; + if($event->{vpsstart} and $a->{VPS}) { + $event->{VPS} = 'y'; + $event->{starttime} = $event->{vpsstart}; + $event->{stoptime} = $event->{vpsstop}; + } else { + $event->{VPS} = ''; } - # Add anchor for reidentify timer - my $aidcomment = sprintf('#~AT[%d]', $id); + # ignore outdated event + next if($event->{stoptime} < $now); - $events->{$Id}->{aux} = $aidcomment; + # Add anchor for reidentify timer + $event->{aux} = sprintf('#~AT[%d]', $id); # Wished timer already exist with same data from autotimer ? - next if($obj->_timerexists($events->{$Id}, $aidcomment)); + next if($obj->_timerexists($event)); # Adjust timers set by the autotimer - my $timerID = $obj->_timerexistsfuzzy($events->{$Id}, $aidcomment); + my $timerID = $obj->_timerexistsfuzzy($event); - if(!$timerID && $a->{Done}) { - - my @done = split(',', $a->{Done}); + if(scalar @done) { # Ignore timer if it already with same title recorded - if(grep(/^chronicle$/, @done) && $obj->_chronicleexists($events->{$Id}, $aidcomment)) { - lg sprintf("Don't create timer from AT(%d) '%s', because found same data on chronicle", $id, $events->{$Id}->{File}); + if(grep(/^chronicle$/, @done) && $obj->_chronicleexists($event)) { + lg sprintf("Don't create timer from AT(%d) '%s', because found same data on chronicle", $id, $event->{File}); next; } # Ignore timer if it already with same title recorded - if(grep(/^recording$/, @done) && $obj->_recordexists($events->{$Id}, $aidcomment)){ - lg sprintf("Don't create timer from AT(%d) '%s', because found same data on recordings", $id, $events->{$Id}->{File}); + if(grep(/^recording$/, @done) && $obj->_recordexists($event)){ + lg sprintf("Don't create timer from AT(%d) '%s', because found same data on recordings", $id, $event->{File}); next; } # Ignore timer if it already a timer with same title programmed, on other place - if(grep(/^timer$/, @done) && $obj->_timerexiststitle($events->{$Id}, $aidcomment)){ - lg sprintf("Don't create timer from AT(%d) '%s', because found same data on other timers", $id, $events->{$Id}->{File}); + if(grep(/^timer$/, @done) && $obj->_timerexiststitle($event)){ + lg sprintf("Don't create timer from AT(%d) '%s', because found same data on other timers", $id, $event->{File}); next; } } my $error = 0; - my ($bsec,$bmin,$bhour,$bmday,$bmon,$byear,$bwday,$byday,$bisdst) = localtime($events->{$Id}->{starttime}); - my ($esec,$emin,$ehour,$emday,$emon,$eyear,$ewday,$eyday,$eisdst) = localtime($events->{$Id}->{stoptime}); + my ($bsec,$bmin,$bhour,$bmday,$bmon,$byear,$bwday,$byday,$bisdst) = localtime($event->{starttime}); + my ($esec,$emin,$ehour,$emday,$emon,$eyear,$ewday,$eyday,$eisdst) = localtime($event->{stoptime}); - if($timermod->{newTimerFormat}) { - $events->{$Id}->{Day} = sprintf("%04d-%02d-%02d",$byear+1900,$bmon+1,$bmday); - } else { - $events->{$Id}->{Day} = sprintf("%02d",$bmday); - } - $events->{$Id}->{Start} = sprintf("%02d%02d",$bhour,$bmin); - $events->{$Id}->{Stop} = sprintf("%02d%02d",$ehour,$emin); + $event->{Day} = sprintf("%04d-%02d-%02d",$byear+1900,$bmon+1,$bmday); + $event->{Start} = sprintf("%02d%02d",$bhour,$bmin); + $event->{Stop} = sprintf("%02d%02d",$ehour,$emin); - my $erg = $timermod->saveTimer($events->{$Id}, $timerID ? $timerID : undef); + my $erg = $timermod->saveTimer($event, $timerID ? $timerID : undef); foreach my $zeile (@$erg) { if($zeile =~ /^(\d{3})\s+(.+)/) { $error = $2 if(int($1) >= 500); } } if($error) { - $console->err(sprintf(gettext("Could not save timer for '%s' : %s"), $events->{$Id}->{File}, $error)) - if(ref $console && $autotimerid); + $console->err(sprintf(gettext("Could not save timer for '%s' : %s"), $event->{File}, $error)) + if(ref $console && $autotimerid); } else { if($timerID) { - ++$m; - $console->message(sprintf(gettext("Modified timer for '%s'."), $events->{$Id}->{File})) - if(ref $console && $autotimerid); + ++$m; + $console->message(sprintf(gettext("Modified timer for '%s'."), $event->{File})) + if(ref $console && $autotimerid); } else { - ++$c; - $console->message(sprintf(gettext("Timer for '%s' has been created."), $events->{$Id}->{File})) - if(ref $console && $autotimerid); + ++$c; + $console->message(sprintf(gettext("Timer for '%s' has been created."), $event->{File})) + if(ref $console && $autotimerid); } } + + # create only one timer if single event requested + last if(scalar @done && grep(/^timer$/, @done)); } $C += $c; $M += $m; @@ -584,7 +594,7 @@ sub autotimerEdit { my $epg; if($timerid and not ref $data) { - my $sth = $obj->{dbh}->prepare("SELECT SQL_CACHE * from AUTOTIMER where Id = ?"); + my $sth = $obj->{dbh}->prepare("SELECT SQL_CACHE * from AUTOTIMER where Id = ?"); $sth->execute($timerid) or return $console->err(sprintf(gettext("The autotimer '%s' does not exist in the database."),$timerid)); $epg = $sth->fetchrow_hashref(); @@ -908,7 +918,7 @@ You can also fine tune your search : $obj->_insert($data); - $data->{Id} = $obj->{dbh}->selectrow_arrayref('SELECT SQL_CACHE max(ID) FROM AUTOTIMER')->[0] + $data->{Id} = $obj->{dbh}->selectrow_arrayref('SELECT SQL_CACHE max(ID) FROM AUTOTIMER')->[0] if(not $data->{Id}); $console->message(gettext('Autotimer saved!')); @@ -965,7 +975,7 @@ sub autotimerToggle { my @timers = reverse sort{ $a <=> $b } split(/[^0-9]/, $timerid); - my $sql = sprintf('SELECT SQL_CACHE Id,Activ FROM AUTOTIMER where Id in (%s)', join(',' => ('?') x @timers)); + my $sql = sprintf('SELECT SQL_CACHE Id,Activ FROM AUTOTIMER where Id in (%s)', join(',' => ('?') x @timers)); my $sth = $obj->{dbh}->prepare($sql); if(!$sth->execute(@timers)) { error sprintf("Couldn't execute query: %s.",$sth->errstr); @@ -1195,7 +1205,10 @@ FROM CHANNELS as c WHERE ( $search ) - AND ( e.channel_id = c.Id )|; + AND ( e.channel_id = c.Id ) +ORDER BY + e.starttime + |; #dumper $sql; @@ -1210,10 +1223,9 @@ sub _timerexists { # ------------------ my $obj = shift || return error('No object defined!'); my $eventdata = shift || return error('No data defined!'); - my $aidcomment = shift || return error('No data defined!'); # Avoid Timer already defined (the timer with the same data again do not put on) - my $sql = "SELECT SQL_CACHE count(*) as cc from TIMERS where + my $sql = "SELECT SQL_CACHE count(*) as cc from TIMERS where ChannelID = ? and UNIX_TIMESTAMP(NextStartTime) = ? and UNIX_TIMESTAMP(NextStopTime) = ? @@ -1221,14 +1233,13 @@ sub _timerexists { and Lifetime = ? and ( ( Status & 1 = '0' ) - or ( File = ? and aux = ? ) - or ( aux not like ? ) + or ( File = ? ) )"; my $sth = $obj->{dbh}->prepare($sql); $sth->execute($eventdata->{ChannelID},$eventdata->{starttime},$eventdata->{stoptime}, $eventdata->{Priority},$eventdata->{Lifetime}, - $eventdata->{File},$eventdata->{aux},"%".$aidcomment) + $eventdata->{File}) or return error sprintf("Couldn't execute query: %s.",$sth->errstr); my $erg = $sth->fetchrow_hashref(); return $erg->{cc} @@ -1242,20 +1253,21 @@ sub _timerexistsfuzzy { # ------------------ my $obj = shift || return error('No object defined!'); my $eventdata = shift || return error('No data defined!'); - my $aidcomment = shift || return error('No data defined!'); - # Adjust timers set by the autotimer - my $timerID = 0; - my $sql = "SELECT SQL_CACHE ID from TIMERS where + # Adjust timers set by the autotimer, if event changed +/- five minutes. + my $sql = "SELECT SQL_CACHE ID from TIMERS where ChannelID = ? - and UNIX_TIMESTAMP(NextStartTime) = ? - and UNIX_TIMESTAMP(NextStopTime) = ? - and aux like ? - order by length(aux) desc;"; + and ? between (UNIX_TIMESTAMP(NextStartTime) - 300) AND (UNIX_TIMESTAMP(NextStartTime) + 300) + and ? between (UNIX_TIMESTAMP(NextStopTime) - 300) AND (UNIX_TIMESTAMP(NextStopTime) + 300) + and File = ? + and aux like ?"; my $sth = $obj->{dbh}->prepare($sql); - $sth->execute($eventdata->{ChannelID},$eventdata->{starttime},$eventdata->{stoptime}, - "%".$aidcomment) + $sth->execute($eventdata->{ChannelID}, + $eventdata->{starttime}, + $eventdata->{stoptime}, + $eventdata->{File}, + "%".$eventdata->{aux}) or return error sprintf("Couldn't execute query: %s.",$sth->errstr); my $erg = $sth->fetchrow_hashref(); return $erg->{ID} @@ -1268,10 +1280,9 @@ sub _recordexists { # ------------------ my $obj = shift || return error('No object defined!'); my $eventdata = shift || return error('No data defined!'); - my $aidcomment = shift || return error('No data defined!'); # Ignore timer if it already with same title recorded - my $sql = "SELECT SQL_CACHE count(*) as cc + my $sql = "SELECT SQL_CACHE count(*) as cc FROM RECORDS as r, OLDEPG as e WHERE e.eventid = r.EventId AND CONCAT_WS('~',e.title,IF(e.subtitle<>'',e.subtitle,NULL)) = ?"; @@ -1290,13 +1301,12 @@ sub _chronicleexists { # ------------------ my $obj = shift || return error('No object defined!'); my $eventdata = shift || return error('No data defined!'); - my $aidcomment = shift || return error('No data defined!'); my $chroniclemod = main::getModule('CHRONICLE'); return 0 unless($chroniclemod and $chroniclemod->{active} eq 'y'); - my $sql = "SELECT SQL_CACHE count(*) as cc from CHRONICLE where title = ?"; + my $sql = "SELECT SQL_CACHE count(*) as cc from CHRONICLE where title = ?"; my $sth = $obj->{dbh}->prepare($sql); $sth->execute($eventdata->{File}) or return error sprintf("Couldn't execute query: %s.",$sth->errstr); @@ -1311,9 +1321,8 @@ sub _timerexiststitle { # ------------------ my $obj = shift || return error('No object defined!'); my $eventdata = shift || return error('No data defined!'); - my $aidcomment = shift || return error('No data defined!'); - my $sql = "SELECT SQL_CACHE count(*) as cc from TIMERS where File = ?"; + my $sql = "SELECT SQL_CACHE count(*) as cc from TIMERS where File = ?"; my $sth = $obj->{dbh}->prepare($sql); $sth->execute($eventdata->{File}) diff --git a/lib/XXV/MODULES/GRAB.pm b/lib/XXV/MODULES/GRAB.pm index 9aa2eee..b341a76 100644 --- a/lib/XXV/MODULES/GRAB.pm +++ b/lib/XXV/MODULES/GRAB.pm @@ -166,15 +166,16 @@ sub grab { $binary .= MIME::Base64::decode_base64($l); } } - $binary = $obj->_noise() unless($binary); + # create noised image as failback. + $binary = $obj->_noise() + unless($binary); - if($binary) { + if($data && $binary) { # Make overlay on image $binary = $obj->makeImgText($binary, $obj->{overlay}) if($obj->{overlay}); - return $binary; } - return undef; + return $binary; } # ------------------ @@ -209,10 +210,11 @@ sub makeImgText { my $color = $image->colorClosest(255,255,255); my $shadow = $image->colorClosest(0,0,0); + my $event = main::getModule('EPG')->NowOnChannel(undef,undef); # Hier sollten noch mehr Informationen dazu kommen my $vars = { - event => main::getModule('EPG')->NowOnChannel(undef,undef), + event => $event, }; my $output = ''; diff --git a/lib/XXV/MODULES/TIMERS.pm b/lib/XXV/MODULES/TIMERS.pm index ab06713..3d8fc91 100644 --- a/lib/XXV/MODULES/TIMERS.pm +++ b/lib/XXV/MODULES/TIMERS.pm @@ -13,7 +13,7 @@ sub module { my $args = { Name => 'TIMERS', Prereq => { - # 'Perl::Module' => 'Description', + 'Date::Manip' => 'date manipulation routines', }, Description => gettext('This module reads timers and saves it to the database.'), Version => (split(/ /, '$Revision$'))[1], @@ -407,7 +407,6 @@ sub _init { ) COMMENT = '$version' |); - $obj->{newTimerFormat} = 0; $obj->{after_updated} = []; main::after(sub{ @@ -493,7 +492,6 @@ sub newTimer { my $epgid = shift || 0; my $epg = shift || 0; - my $dayFormat = $obj->{newTimerFormat}?"%Y-%m-%d":"%d"; if($epgid and not ref $epg) { my $sql = qq| SELECT SQL_CACHE @@ -501,10 +499,10 @@ SELECT SQL_CACHE channel_id, description, CONCAT_WS('~', title, subtitle) as File, - DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(starttime) - ? ), '$dayFormat') as Day, + DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(starttime) - ? ), '%Y-%m-%d') as Day, DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(starttime) - ? ), '%H%i') as Start, DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(starttime) + duration + ? ), '%H%i') as Stop, - DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(vpstime)), '$dayFormat') as VpsDay, + DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(vpstime)), '%Y-%m-%d') as VpsDay, DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(vpstime)), '%H%i') as VpsStart, DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(vpstime) + duration), '%H%i') as VpsStop FROM @@ -522,7 +520,7 @@ WHERE channel_id => '', File => '', description => '', - Day => my_strftime($dayFormat,$t), + Day => my_strftime("%Y-%m-%d",$t), Start => my_strftime("%H%M",$t), Stop => my_strftime("%H%M",$t) }; @@ -626,16 +624,37 @@ WHERE }, 'Day' => { typ => $con ? 'string' : 'date', - def => $timerData->{Day}, - msg => gettext("Enter a day (1 to 31) or weekday in format 'MTWTFSS'"), + def => sub{ + # Convert day from VDR format to locale format + my $value = $timerData->{Day}; + if($value and $value =~ /^\d{4}\-\d{2}-\d{2}$/) { + Date_Init("Language=English"); + my $d = ParseDate($value); + if($d) { + my $t = UnixDate($d,gettext("%Y-%m-%d")); + return $t if($t); + } + } + return $value; + }, + msg => gettext("Enter a day (1 to 31) or weekday in format 'MTWTFSS'."), req => gettext("This is required!"), check => sub{ my $value = shift || return; - if(($value =~ /^\d+$/ and int($value) <= 31 and int($value) > 0) # 13 - or ($obj->{newTimerFormat} and $value =~ /^\d{4}\-\d{2}-\d{2}$/sig) # 2005-03-13 - or $value =~ /^\S{7}\@\d{4}\-\d{2}-\d{2}$/sig # MTWTFSS@2005-03-13 - or $value =~ /^\S{7}\@\d{2}$/sig # MTWTFSS@13 - or $value =~ /^\S{7}$/) { # MTWTFSS + # Convert locale format to VDR format %Y-%m-%d + if($value and $value !~ /^\d+$/ and $value =~ /^\d+/) { + Date_Init(split(',',gettext("Language=English"))); + my $d = ParseDate($value); + if($d) { + my $t = UnixDate($d,'%Y-%m-%d'); + return $t if($t); + } + } + if(($value =~ /^\d+$/ and int($value) <= 31 and int($value) > 0)# 13 + or $value =~ /^\d{4}\-\d{2}-\d{2}$/sig # 2005-03-13 + or $value =~ /^\S{7}\@\d{4}\-\d{2}-\d{2}$/sig # MTWTFSS@2005-03-13 + or $value =~ /^\S{7}\@\d{2}$/sig # MTWTFSS@13 + or $value =~ /^\S{7}$/) { # MTWTFSS return $value; } else { return undef, gettext('The day is incorrect or was in a wrong format!'); @@ -1268,7 +1287,6 @@ SELECT SQL_CACHE t.Id as Id, t.Status as Status,t.ChannelID as ChannelID, |; my $erg = $obj->{dbh}->selectall_hashref($sql, 'Id'); - my $dayFormat = $obj->{newTimerFormat}?"%Y-%m-%d":"%d"; foreach my $t (keys %$erg) { my %tt; @@ -1295,7 +1313,7 @@ SELECT SQL_CACHE t.Id as Id, t.Status as Status,t.ChannelID as ChannelID, ChannelID => $erg->{$t}->{ChannelID}, File => $erg->{$t}->{File}, aux => $erg->{$t}->{aux}, - Day => my_strftime($dayFormat,$start), + Day => my_strftime("%Y-%m-%d",$start), Start => my_strftime("%H%M",$start), Stop => my_strftime("%H%M",$stop), Priority => $erg->{$t}->{Priority}, @@ -1611,7 +1629,6 @@ sub getNextTime { $stopsse = my_mktime(substr($stop, 2, 2), substr($stop, 0, 2), $stop > $start ? $3 : $3 + 1, ($2 - 1), $1); - $obj->{newTimerFormat} = 1; } else { # vdr < 1.3.23 => 13 $startsse = my_mktime(substr($start, 2, 2), |
