summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2007-12-02 15:23:26 +0000
committerAndreas Brachold <vdr07@deltab.de>2007-12-02 15:23:26 +0000
commit1dff121c6ee45d01f3f8a8f162f29d3bc99e25df (patch)
treeb2662172cb2b8ec9238c48d2f9e09e463f9571f2
parent06ca688c86ff96d96fd4346f7f20efb60ab769cc (diff)
downloadxxv-1dff121c6ee45d01f3f8a8f162f29d3bc99e25df.tar.gz
xxv-1dff121c6ee45d01f3f8a8f162f29d3bc99e25df.tar.bz2
* AUTOTIMER: Allow search without topic, e.g. any event inside time range
* buildsearch: Allow simple wildcard search with single *
-rw-r--r--lib/Tools.pm16
-rw-r--r--lib/XXV/MODULES/RECORDS.pm64
2 files changed, 62 insertions, 18 deletions
diff --git a/lib/Tools.pm b/lib/Tools.pm
index 97a483d..2f15fcf 100644
--- a/lib/Tools.pm
+++ b/lib/Tools.pm
@@ -335,14 +335,14 @@ sub _buildsearchcomma {
my $out;
foreach my $su (split(/\s*,\s*/, $Search)) {
$su =~ s/\./\\\./sg;
-# $su =~ s/\'/\\\'/sg;
-# $su =~ s/\"/\./sg;
- $su =~ s/\*/\\\*/sg;
+# $su =~ s/\*/\\\*/sg;
$su =~ s/\+/\\\+/sg;
$su =~ s/\?/\\\?/sg;
$su =~ s/\(/\\\(/sg;
$su =~ s/\)/\\\)/sg;
+ $su =~ s/\*/\.*/sg;
+
$out .= ' AND ' if($out);
if($su =~ s/^\-+//) {
$out .= qq| ($queryField NOT RLIKE ?)|;
@@ -353,7 +353,7 @@ sub _buildsearchcomma {
push(@$term,$su);
}
}
-# dumper($out);
+
return {
query => $out,
term => $term
@@ -384,21 +384,21 @@ sub _buildsearchlogical {
$out .= " AND" unless($op);
$su =~ s/\./\\\./sg;
-# $su =~ s/\'/\\\'/sg;
-# $su =~ s/\"/\./sg;
- $su =~ s/\*/\\\*/sg;
+# $su =~ s/\*/\\\*/sg;
$su =~ s/\+/\\\+/sg;
$su =~ s/\?/\\\?/sg;
$su =~ s/\(/\\\(/sg;
$su =~ s/\)/\\\)/sg;
+ $su =~ s/\*/\.*/sg;
+
$out .= qq| ($queryField RLIKE ?)|;
push(@$term,$su);
$op = 0;
}
}
$out .= " )";
-# dumper($out);
+
return {
query => $out,
term => $term
diff --git a/lib/XXV/MODULES/RECORDS.pm b/lib/XXV/MODULES/RECORDS.pm
index 043309f..9f0ae18 100644
--- a/lib/XXV/MODULES/RECORDS.pm
+++ b/lib/XXV/MODULES/RECORDS.pm
@@ -9,6 +9,7 @@ use File::Path;
use File::Basename;
use File::stat;
use Locale::gettext;
+use Linux::Inotify2;
$SIG{CHLD} = 'IGNORE';
@@ -22,7 +23,8 @@ sub module {
Name => 'RECORDS',
Prereq => {
'Time::Local' => 'efficiently compute time from local and GMT time ',
- 'Digest::MD5 qw(md5_hex)' => 'Perl interface to the MD5 Algorithm'
+ 'Digest::MD5 qw(md5_hex)' => 'Perl interface to the MD5 Algorithm',
+ 'Linux::Inotify2' => 'scalable directory/file change notification'
},
Description => gettext('This module manages recordings.'),
Version => (split(/ /, '$Revision$'))[1],
@@ -286,6 +288,7 @@ sub _init {
$obj->{JOBS} = [];
$obj->{after_updated} = [];
$obj->{countReading} = 0;
+ $obj->{inotify} = undef;
main::after(sub{
$obj->{svdrp} = main::getModule('SVDRP');
@@ -294,6 +297,33 @@ sub _init {
return 0;
}
+ $obj->{inotify} = new Linux::Inotify2
+ or panic "Unable to create new inotify object: $!";
+ if($obj->{inotify}) {
+ 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 "events for <%s>:%d received: %x\n", $e->fullname, $e->cookie, $e->mask;
+ #lg sprintf "$e->{w}{name} was accessed\n" if $e->IN_ACCESS;
+ #lg sprintf "$e->{w}{name} was modified\n" if $e->IN_MODIFY;
+ #lg sprintf "$e->{w}{name} is no longer mounted\n" if $e->IN_UNMOUNT;
+ #lg sprintf "events for $e->{w}{name} have been lost\n" if $e->IN_Q_OVERFLOW;
+ $obj->readData() if($e->mask == 4);
+ # Update preview images
+ Event->timer(after => 300, cb => sub {
+ $_[0]->w->cancel;
+ $obj->readData();
+ });
+ }
+ );
+ }
+
# Interval to read recordings and put to DB
Event->timer(
interval => $obj->{interval},
@@ -1461,6 +1491,7 @@ sub delete {
my @rcs = split(/_/, $record);
my @todelete;
+ my @md5delete;
my %rec;
foreach my $item (@rcs) {
@@ -1485,7 +1516,8 @@ sub delete {
# Make hash for better reading
my $r = {
Id => $recording->[0],
- Title => $recording->[1]
+ Title => $recording->[1],
+ MD5 => $recording->[2]
};
if(ref $console and $console->{TYP} eq 'CONSOLE') {
@@ -1507,6 +1539,7 @@ sub delete {
$obj->{svdrp}->queue_cmds(sprintf("delr %s",$r->{Id}));
push(@todelete,$r->{Title}); # Remember title
+ push(@md5delete,$r->{MD5}); # Remember hash
# Delete recordings from request, if found in database
my $i = 0;
@@ -1532,6 +1565,7 @@ sub delete {
if($obj->{svdrp}->err) {
$console->err($erg) if(ref $console);
} else {
+
if(ref $console) {
if($console->typ eq 'HTML') {
$waiter = $console->wait($msg,0,1000,'no');
@@ -1539,11 +1573,18 @@ sub delete {
$console->msg($msg);
}
}
+
+ my $dsql = sprintf("DELETE FROM RECORDS WHERE RecordMD5 IN (%s)", join(',' => ('?') x @md5delete));
+ my $dsth = $obj->{dbh}->prepare($dsql);
+ $sth->execute(@md5delete)
+ or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
+
}
- sleep(1);
- if($obj->readData($watcher,$console,$waiter)
- && ref $console && $console->typ eq 'HTML') {
+ $obj->readData($watcher,$console,$waiter)
+ unless($obj->{inotify});
+
+ if(ref $console && $console->typ eq 'HTML') {
my @t = split('~', $todelete[0]);
if(scalar @t > 1) { # Remove subtitle
delete $t[-1];
@@ -1869,6 +1910,10 @@ WHERE
$rec->{Path} = $newPath;
}
+ if($touchVDR) { #Ab 1.3.11 resync with touch /video/.update
+ touch($obj->{videodir}."/.update");
+ }
+
if($dropEPGEntry) { # Delete EpgOld Entrys
my $sth = $obj->{dbh}->prepare('DELETE FROM OLDEPG WHERE eventid = ?');
$sth->execute($rec->{EventId})
@@ -1881,10 +1926,6 @@ WHERE
or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
}
- if($touchVDR) { #Ab 1.3.11 resync with touch /video/.update
- touch($obj->{videodir}."/.update");
- }
-
my $waiter;
if(ref $console) {
if($console->typ eq 'HTML') {
@@ -1893,7 +1934,10 @@ WHERE
$console->msg(gettext('Recording edited!'));
}
}
- $obj->readData($watcher,$console,$waiter);
+ sleep(1);
+
+ $obj->readData($watcher,$console,$waiter)
+ unless($obj->{inotify});
$console->redirect({url => sprintf('?cmd=rdisplay&data=%s',md5_hex($rec->{Path})), wait => 1})
if(ref $console and $console->typ eq 'HTML');