summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2007-12-18 19:34:26 +0000
committerAndreas Brachold <vdr07@deltab.de>2007-12-18 19:34:26 +0000
commit4c8cb0291dde6a3d237011f6514f68081d9212c9 (patch)
tree8e5183977138ed057338d51bdd856ff4dabef725 /lib
parentb32e9ad19dd2ee50f3ad814fb39640ada6704d18 (diff)
downloadxxv-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.pm151
-rw-r--r--lib/XXV/MODULES/GRAB.pm12
-rw-r--r--lib/XXV/MODULES/TIMERS.pm49
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),