diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2008-06-15 09:37:17 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2008-06-15 09:37:17 +0000 |
| commit | db214434c39583ec599a50561f6b1f308aff3fa1 (patch) | |
| tree | f627f130f9196b849991707eafef3580cf9ed5cc /lib | |
| parent | 0b70320be6c8a4e13e02c70f7644678157d703ee (diff) | |
| download | xxv-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.pm | 13 | ||||
| -rw-r--r-- | lib/XXV/MODULES/KEYWORDS.pm | 63 | ||||
| -rw-r--r-- | lib/XXV/MODULES/RECORDS.pm | 55 | ||||
| -rw-r--r-- | lib/XXV/MODULES/TIMERS.pm | 68 |
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()) |
