diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2007-12-02 20:34:53 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2007-12-02 20:34:53 +0000 |
| commit | 16be0fc1027a046e1a3aa1bb8d2bbcbe662f641a (patch) | |
| tree | 024e2d7eb4bbbbe81c33f1065881b1c55c0a2e9d /lib | |
| parent | 1f3c2bc25fdacdf33c7b2161a083dba3d1590d09 (diff) | |
| download | xxv-16be0fc1027a046e1a3aa1bb8d2bbcbe662f641a.tar.gz xxv-16be0fc1027a046e1a3aa1bb8d2bbcbe662f641a.tar.bz2 | |
* contrib/update-xxv: fix typo
TIMERS: On VPS assign event based vpsstarttime
RECORDS: reorder inotify function
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/XXV/MODULES/RECORDS.pm | 77 | ||||
| -rw-r--r-- | lib/XXV/MODULES/TIMERS.pm | 29 |
2 files changed, 66 insertions, 40 deletions
diff --git a/lib/XXV/MODULES/RECORDS.pm b/lib/XXV/MODULES/RECORDS.pm index f911448..106e867 100644 --- a/lib/XXV/MODULES/RECORDS.pm +++ b/lib/XXV/MODULES/RECORDS.pm @@ -298,36 +298,25 @@ sub _init { return 0; } - $obj->{inotify} = new Linux::Inotify2 - or panic "Unable to create new inotify object: $!"; - - if($obj->{inotify}) { - Event->io( + my $updatefile = sprintf("%s/.update",$obj->{videodir}); + if( -r $updatefile) { + $obj->{inotify} = new Linux::Inotify2 + or panic sprintf("Unable to create new inotify object: %s",$!); + + if($obj->{inotify}) { + # Bind watch to event::io + Event->io( fd =>$obj->{inotify}->fileno, poll => 'r', - cb => sub { - $obj->{inotify}->poll - }); - $obj->{inotify}->watch($obj->{videodir}."/.update", IN_ALL_EVENTS, #IN_UPDATE - sub { - my $e = shift; - lg sprintf "inotify events for <%s>:%d received: %x\n", $e->fullname, $e->cookie, $e->mask; - if((time - $obj->{lastupdate}) > 15 - && $obj->readData()) { - $obj->{lastupdate} = time; - # Update preview images after five minutes - Event->timer( - after => 300, - cb => sub { - $_[0]->w->cancel; - if((time - $obj->{lastupdate}) >= 250 && $obj->readData()) { - $obj->{lastupdate} = time; - } - } - ); - } - } - ); + cb => sub { $obj->{inotify}->poll } + ); + # watch update file + $obj->{inotify}->watch( + $updatefile, + IN_ALL_EVENTS, + sub { my $e = shift; $obj->_notify_readData($e); } + ); + } } # Interval to read recordings and put to DB @@ -353,6 +342,38 @@ sub _init { } # ------------------ +# Callback to reread data if /video/.update changed by VDR +# trigged by file notifcation from inotify +sub _notify_readData { +# ------------------ + my $obj = shift || return error('No object defined!'); + my $e = shift; + lg sprintf "notify events for %s:%d received: %x\n", $e->fullname, $e->cookie, $e->mask; + + if((time - $obj->{lastupdate}) > 15 # Only if last update prior 15 seconds (avoid callback chill) + && $obj->readData()) { + + $obj->{lastupdate} = time; + + # Update preview images after five minutes + my $tmod = main::getModule('TIMERS'); + my $after = ($tmod->{prevminutes}) * 2; + $after = 300 if($after <= 300); + + Event->timer( + after => $after, + cb => sub { + $_[0]->w->cancel; + if((time - $obj->{lastupdate}) >= ($after - 30) + && $obj->readData()) { + $obj->{lastupdate} = time; + } + } + ); + } +} + +# ------------------ sub dot1000 { # ------------------ my $t = reverse shift; diff --git a/lib/XXV/MODULES/TIMERS.pm b/lib/XXV/MODULES/TIMERS.pm index 8cfa91e..a4e797d 100644 --- a/lib/XXV/MODULES/TIMERS.pm +++ b/lib/XXV/MODULES/TIMERS.pm @@ -957,6 +957,7 @@ sub insert { # Search for event at EPG my $e = $obj->_getNextEpgId( { Id => $data->[0], + Status => $data->[1], ChannelID => $data->[2], File => $data->[8], NextStartTime => $data->[10], @@ -1269,7 +1270,11 @@ SELECT SQL_CACHE t.Id as Id, t.Status as Status,t.ChannelID as ChannelID, WHERE (Status & 1) AND e.eventid > 0 AND t.eventid = e.eventid - AND ((e.starttime != t.eventstarttime) OR (e.duration != t.eventduration)) + AND ( + (((t.Status & 4) = 0) AND e.starttime != t.eventstarttime) + OR ((t.Status & 4) AND e.vpstime != t.eventstarttime) + OR (e.duration != t.eventduration) + ) AND SUBSTRING_INDEX( t.File , '~', 1 ) LIKE CONCAT('%', e.title ,'%') |; my $erg = $obj->{dbh}->selectall_hashref($sql, 'Id'); @@ -1520,16 +1525,16 @@ sub _getNextEpgId { my $e; my @file = split('~', $timer->{File}); - + my $timemode = ($timer->{Status} & 4) ? 'vpstime' : 'starttime'; if(scalar @file >= 2) { # title and subtitle defined - my $sth = $obj->{dbh}->prepare(qq| - SELECT SQL_CACHE eventid,starttime,duration from EPG + my $sth = $obj->{dbh}->prepare(sprintf(qq| + SELECT SQL_CACHE eventid,%s as starttime,duration from EPG WHERE channel_id = ? - AND ((UNIX_TIMESTAMP(starttime) + (duration/2)) between ? and ? ) + AND ((UNIX_TIMESTAMP(%s) + (duration/2)) between ? and ? ) AND (title like ? or title like ? ) - ORDER BY ABS(( ? )-UNIX_TIMESTAMP(starttime)) LIMIT 1 - |); + ORDER BY ABS(( ? )-UNIX_TIMESTAMP(%s)) LIMIT 1 + |,$timemode,$timemode,$timemode)); if(!$sth->execute($timer->{ChannelID}, $timer->{NextStartTime}, $timer->{NextStopTime}, @@ -1542,14 +1547,14 @@ sub _getNextEpgId { $e = $sth->fetchrow_hashref(); } else { - my $sth = $obj->{dbh}->prepare(qq| - SELECT SQL_CACHE eventid,starttime,duration from EPG + my $sth = $obj->{dbh}->prepare(sprintf(qq| + SELECT SQL_CACHE eventid,%s as starttime,duration from EPG WHERE channel_id = ? - AND ((UNIX_TIMESTAMP(starttime) + (duration/2)) between ? and ? ) + AND ((UNIX_TIMESTAMP(%s) + (duration/2)) between ? and ? ) AND (title like ? ) - ORDER BY ABS(( ? )-UNIX_TIMESTAMP(starttime)) LIMIT 1 - |); + ORDER BY ABS(( ? )-UNIX_TIMESTAMP(%s)) LIMIT 1 + |,$timemode,$timemode,$timemode)); if(!$sth->execute($timer->{ChannelID}, $timer->{NextStartTime}, $timer->{NextStopTime}, |
