summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2008-06-15 09:37:17 +0000
committerAndreas Brachold <vdr07@deltab.de>2008-06-15 09:37:17 +0000
commitdb214434c39583ec599a50561f6b1f308aff3fa1 (patch)
treef627f130f9196b849991707eafef3580cf9ed5cc /lib
parent0b70320be6c8a4e13e02c70f7644678157d703ee (diff)
downloadxxv-db214434c39583ec599a50561f6b1f308aff3fa1.tar.gz
xxv-db214434c39583ec599a50561f6b1f308aff3fa1.tar.bz2
* KEYWORDS: Refactoring routines to handle xml struct
Diffstat (limited to 'lib')
-rw-r--r--lib/XXV/MODULES/AUTOTIMER.pm13
-rw-r--r--lib/XXV/MODULES/KEYWORDS.pm63
-rw-r--r--lib/XXV/MODULES/RECORDS.pm55
-rw-r--r--lib/XXV/MODULES/TIMERS.pm68
4 files changed, 99 insertions, 100 deletions
diff --git a/lib/XXV/MODULES/AUTOTIMER.pm b/lib/XXV/MODULES/AUTOTIMER.pm
index 5eb010f..37f96ce 100644
--- a/lib/XXV/MODULES/AUTOTIMER.pm
+++ b/lib/XXV/MODULES/AUTOTIMER.pm
@@ -14,8 +14,7 @@ sub module {
my $args = {
Name => 'AUTOTIMER',
Prereq => {
- 'Date::Manip' => 'date manipulation routines',
- 'XML::Simple' => 'Easy API to maintain XML (esp config files)'
+ 'Date::Manip' => 'date manipulation routines'
},
Description => gettext('This module searches for EPG entries with user-defined text and creates new timers.'),
Version => (split(/ /, '$Revision$'))[1],
@@ -264,10 +263,6 @@ sub new {
# read the DB Handle
$self->{dbh} = delete $attr{'-dbh'};
- $self->{xml} = XML::Simple->new( NumericEscape => ($self->{charset} eq 'UTF-8' ? 0 : 1)
- )
- || return error("Can't create XML instance!");
-
# The Initprocess
my $erg = $self->_init or return error('Problem to initialize module');
@@ -318,6 +313,10 @@ sub _init {
|);
main::after(sub{
+ $obj->{keywords} = main::getModule('KEYWORDS');
+ unless($obj->{keywords}) {
+ return 0;
+ }
my $modE = main::getModule('EPG');
$modE->updated(
sub{
@@ -513,7 +512,7 @@ sub _autotimerLookup {
# 'eventid' => $eventid
};
$args->{'keywords'} = $keywords if($keywords);
- $event->{aux} = $obj->{xml}->XMLout($args, RootName => 'xxv');
+ $event->{aux} = $obj->{keywords}->createxml($args);
# Wished timer already exist with same data from autotimer ?
next if($obj->_timerexists($event));
diff --git a/lib/XXV/MODULES/KEYWORDS.pm b/lib/XXV/MODULES/KEYWORDS.pm
index c1c5d1a..d6f9df4 100644
--- a/lib/XXV/MODULES/KEYWORDS.pm
+++ b/lib/XXV/MODULES/KEYWORDS.pm
@@ -1,6 +1,7 @@
package XXV::MODULES::KEYWORDS;
use strict;
+use Encode;
use Tools;
# ------------------
@@ -11,7 +12,7 @@ sub module {
my $args = {
Name => 'KEYWORDS',
Prereq => {
-# 'XML::Simple' => 'Easy API to maintain XML (esp config files)'
+ 'XML::Simple' => 'Easy API to maintain XML (esp config files)'
},
Description => gettext('This module manages keywords and tag within timer and recordings.'),
Version => (split(/ /, '$Revision: 1332 $'))[1],
@@ -91,8 +92,8 @@ sub new {
# read the DB Handle
$self->{dbh} = delete $attr{'-dbh'};
- #$self->{xml} = XML::Simple->new( NumericEscape => ($self->{charset} eq 'UTF-8' ? 0 : 1))
- # || return error("Can't create XML instance!");
+ $self->{xml} = XML::Simple->new( NumericEscape => 2 )
+ || return error("Can't create XML instance!");
# The Initprocess
my $erg = $self->_init or return error('Problem to initialize modul!');
@@ -316,4 +317,60 @@ sub recording_keywords {
return $rmod->_search($watcher,$console,$query->{query}.' ) AND ( r.RecordMD5 = k.md5 ',$query->{term},$params,', KEYWORDS as k');
}
+# ------------------
+sub parsexml {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $aux = shift;
+
+ $aux =~ s/(\r|\n)//sg;
+ if($aux && $aux =~ /^<.*/ ) {
+ my $args = $self->{xml}->XMLin($aux, KeepRoot => 1 );
+ if(defined $args
+ && defined $args->{'xxv'} ) {
+ if($self->{charset} eq 'UTF-8'){
+ foreach my $k (keys %{$args->{'xxv'}}) {
+ utf8::downgrade($args->{'xxv'}->{$k});
+ }
+ } else {
+ foreach my $k (keys %{$args->{'xxv'}}) {
+ $args->{'xxv'}->{$k} = encode($self->{charset},$args->{'xxv'}->{$k});
+ }
+ }
+ return $args->{'xxv'};
+ }
+ }
+ return undef;
+}
+
+# ------------------
+sub createxml {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $xml = shift;
+
+ my $aux = '';
+ if($xml && keys %$xml) {
+ $aux = $self->{xml}->XMLout($xml, RootName => 'xxv');
+ }
+ return $aux;
+}
+
+# ------------------
+sub mergexml {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $aux = shift;
+ my $topic = shift;
+ my $value = shift;
+
+ my $xml = $self->parsexml($aux);
+ if($value) {
+# utf8::upgrade($value) if(!utf8::is_utf8($value));
+ $xml->{$topic} = $value;
+ } elsif($xml->{$topic}) {
+ delete $xml->{$topic};
+ }
+ return $self->createxml($xml);
+}
1;
diff --git a/lib/XXV/MODULES/RECORDS.pm b/lib/XXV/MODULES/RECORDS.pm
index e551da5..c1286ea 100644
--- a/lib/XXV/MODULES/RECORDS.pm
+++ b/lib/XXV/MODULES/RECORDS.pm
@@ -23,8 +23,7 @@ sub module {
Prereq => {
'Time::Local' => 'efficiently compute time from local and GMT time ',
'Digest::MD5 qw(md5_hex)' => 'Perl interface to the MD5 Algorithm',
- 'Linux::Inotify2' => 'scalable directory/file change notification',
- 'XML::Simple' => 'Easy API to maintain XML (esp config files)'
+ 'Linux::Inotify2' => 'scalable directory/file change notification'
},
Description => gettext('This module manages recordings.'),
Version => (split(/ /, '$Revision$'))[1],
@@ -264,9 +263,6 @@ sub new {
# read the DB Handle
$self->{dbh} = delete $attr{'-dbh'};
- $self->{xml} = XML::Simple->new( NumericEscape => ($self->{charset} eq 'UTF-8' ? 0 : 1))
- || return error("Can't create XML instance!");
-
# define framerate PAL 25, NTSC 30
$self->{framerate} = Tools->FRAMESPERSECOND;
@@ -329,7 +325,6 @@ sub _init {
unless($obj->{timers}) {
return 0;
}
-
$obj->{keywords} = main::getModule('KEYWORDS');
unless($obj->{keywords}) {
return 0;
@@ -1104,17 +1099,11 @@ sub readinfo {
$info->{aux} =~ s/^\s+//; # no leading white space
$info->{aux} =~ s/\s+$//; # no trailing white space
- if($info->{aux} && $info->{aux} =~ /^<.*/ ) {
- my $args = $obj->{xml}->XMLin($info->{aux}, KeepRoot => 1 );
- if(defined $args
- && defined $args->{'xxv'} ) {
- my $root = $args->{'xxv'};
-# $info->{keywords} = int($root->{'autotimer'})
-# if(defined $root->{'autotimer'} );
- $info->{keywords} = $root->{'keywords'}
- if(defined $root->{'keywords'} );
- }
- }
+ my $xml = $obj->{keywords}->parsexml($info->{aux});
+ # $info->{keywords} = $xml->{'autotimer'}
+ # if($xml && defined $xml->{'autotimer'} );
+ $info->{keywords} = $xml->{'keywords'}
+ if($xml && defined $xml->{'keywords'} );
}
}
}
@@ -2177,27 +2166,12 @@ WHERE
$info->{title} = join('~',@t);
}
- my $root = {};
- if(exists $info->{aux}) {
- $info->{aux} =~ s/(\r|\n)//sg;
- if($info->{aux} && $info->{aux} =~ /^<.*/ ) {
- my $args = $obj->{xml}->XMLin($info->{aux}, KeepRoot => 1 );
- if(defined $args
- && defined $args->{'xxv'} ) {
- $root = $args->{'xxv'};
- }
- }
- }
- #$root->{'autotimer'} = $data->{autotimerid} if($data->{autotimerid});
- $root->{'keywords'} = $info->{keywords} if($info->{keywords});
- if($root && keys %$root) {
- $info->{aux} = $obj->{xml}->XMLout($root, RootName => 'xxv');
- }
+ $info->{aux} = $obj->{keywords}->mergexml($info->{aux},'keywords',$info->{keywords});
$obj->saveinfo($rec->{Path},$info)
or return con_err($console,sprintf(gettext("Couldn't write file '%s' : %s"),$rec->{Path} . '/info.vdr',$!));
- $ChangeRecordingData = 1 if($data->{keywords} ne $status->{keywords});
+ $ChangeRecordingData = 1 if($info->{aux} ne $status->{aux});
$dropEPGEntry = 1;
}
@@ -2255,10 +2229,6 @@ WHERE
$rec->{Path} = $newPath;
}
- if($dropEPGEntry || $ChangeRecordingData) {
- $obj->{lastupdate} = 0;
- touch($obj->{videodir}."/.update");
- }
if($dropEPGEntry) { # Delete EpgOld Entrys
my $sth = $obj->{dbh}->prepare('DELETE FROM OLDEPG WHERE eventid = ?');
@@ -2270,10 +2240,13 @@ WHERE
my $sth = $obj->{dbh}->prepare('DELETE FROM RECORDS WHERE RecordMD5 = ?');
$sth->execute($recordid)
or return con_err($console,sprintf("Couldn't execute query: %s.",$sth->errstr));
-
- $obj->{keywords}->remove('recording',\[$recordid]);
+ my @todel = [$recordid];
+ $obj->{keywords}->remove('recording',\@todel);
+ }
+ if($dropEPGEntry || $ChangeRecordingData) {
+ $obj->{lastupdate} = 0;
+ touch($obj->{videodir}."/.update");
}
-
if($dropEPGEntry || $ChangeRecordingData) {
my $waiter;
diff --git a/lib/XXV/MODULES/TIMERS.pm b/lib/XXV/MODULES/TIMERS.pm
index e5b949d..2e68059 100644
--- a/lib/XXV/MODULES/TIMERS.pm
+++ b/lib/XXV/MODULES/TIMERS.pm
@@ -13,8 +13,7 @@ sub module {
Name => 'TIMERS',
Prereq => {
'Date::Manip' => 'date manipulation routines',
- 'Digest::MD5 qw(md5_hex)' => 'Perl interface to the MD5 Algorithm',
- 'XML::Simple' => 'Easy API to maintain XML (esp config files)'
+ 'Digest::MD5 qw(md5_hex)' => 'Perl interface to the MD5 Algorithm'
},
Description => gettext('This module reads timers and saves it to the database.'),
Version => (split(/ /, '$Revision$'))[1],
@@ -395,9 +394,6 @@ sub new {
# read the DB Handle
$self->{dbh} = delete $attr{'-dbh'};
- $self->{xml} = XML::Simple->new( NumericEscape => ($self->{charset} eq 'UTF-8' ? 0 : 1))
- || return error("Can't create XML instance!");
-
# The Initprocess
my $erg = $self->_init or return error('Problem to initialize modul!');
@@ -522,23 +518,8 @@ sub _saveTimer {
$data->{file} =~ s/(\r|\n)//sg;
- # Add anchor for reidentify timer
- my $root = {};
- if(exists $data->{aux}) {
- $data->{aux} =~ s/(\r|\n)//sg;
- if($data->{aux} && $data->{aux} =~ /^<.*/ ) {
- my $args = $obj->{xml}->XMLin($data->{aux}, KeepRoot => 1 );
- if(defined $args
- && defined $args->{'xxv'} ) {
- $root = $args->{'xxv'};
- }
- }
- }
- #$root->{'autotimer'} = $data->{autotimerid} if($data->{autotimerid});
- $root->{'keywords'} = $data->{keywords} if($data->{keywords});
- if($root && keys %$root) {
- $data->{aux} = $obj->{xml}->XMLout($root, RootName => 'xxv');
- }
+ # Add Keywords to timer
+ $data->{aux} = $obj->{keywords}->mergexml($data->{aux},'keywords',$data->{keywords});
my $file = $data->{file};
$file =~ s/:/|/g;
@@ -676,26 +657,20 @@ WHERE
|| (scalar keys %{$timerData} < 1)) {
return $console->err(sprintf(gettext("Timer '%s' does not exist in the database!"),$timerid));
}
+
+ if(defined $timerData->{aux}) {
+ $timerData->{aux} =~ s/(\r|\n)//sig;
+
+ my $xml = $obj->{keywords}->parsexml($timerData->{aux});
+# $timerData->{keywords} = $xml->{'autotimer'}
+# if($xml && defined $xml->{'autotimer'} );
+ $timerData->{keywords} = $xml->{'keywords'}
+ if($xml && defined $xml->{'keywords'} );
+ }
} elsif (ref $data eq 'HASH') {
$timerData = $data;
}
- if(defined $timerData->{aux}) {
- $timerData->{aux} =~ s/(\r|\n)//sig;
-
- $timerData->{keywords} = '';
- if($timerData->{aux} && $timerData->{aux} =~ /^<.*/ ) {
- my $args = $obj->{xml}->XMLin($timerData->{aux}, KeepRoot => 1 );
- if(defined $args
- && defined $args->{'xxv'} ) {
- my $root = $args->{'xxv'};
-# $aid = int($root->{'autotimer'})
-# if(defined $root->{'autotimer'} );
- $timerData->{keywords} = $root->{'keywords'}
- if(defined $root->{'keywords'} );
- }
- }
- }
my $modC = main::getModule('CHANNELS');
my $con = $console->typ eq "CONSOLE";
@@ -1130,17 +1105,12 @@ sub _insert {
# Tags
my $aid;
my $keywords;
- if($timer->{aux} && $timer->{aux} =~ /^<.*/ ) {
- my $args = $self->{xml}->XMLin($timer->{aux}, KeepRoot => 1 );
- if(defined $args
- && defined $args->{'xxv'} ) {
- my $root = $args->{'xxv'};
- $aid = int($root->{'autotimer'})
- if(defined $root->{'autotimer'} );
- $keywords = $root->{'keywords'}
- if(defined $root->{'keywords'} );
- }
- }
+ my $xml = $self->{keywords}->parsexml($timer->{aux});
+ $aid = int($xml->{'autotimer'})
+ if($xml && defined $xml->{'autotimer'} );
+ $keywords = $xml->{'keywords'}
+ if($xml && defined $xml->{'keywords'} );
+
my $sth = $self->{dbh}->prepare(
q|REPLACE INTO TIMERS VALUES
(?,?,?,?,?,?,?,?,?,?,?,FROM_UNIXTIME(?), FROM_UNIXTIME(?),0,?,?,?,?,?,NOW())