diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2008-01-13 12:51:22 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2008-01-13 12:51:22 +0000 |
| commit | 1f837ad310bfd99baa472c1a42123d344f7fb393 (patch) | |
| tree | 734ec304dffa7be71efeec5f30d46c34884a90ef /lib | |
| parent | 01a4de9d90ce8d33fd4e0a2bc8ca3c0a78225441 (diff) | |
| download | xxv-1f837ad310bfd99baa472c1a42123d344f7fb393.tar.gz xxv-1f837ad310bfd99baa472c1a42123d344f7fb393.tar.bz2 | |
* Update translations
* RECORDS: use File::stat
* MOVETIMER: Add redirect if move timer updated
* TIMER: tnew with fast=1 create timer from event, without prompt
* Skins/search: program timer from selected events by joined list
* Skins/redirect: close frame automated after 3 seconds
* xstyle: Fix searchbox+cancel => call command <undef>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/XXV/MODULES/CHANNELS.pm | 2 | ||||
| -rw-r--r-- | lib/XXV/MODULES/MOVETIMER.pm | 24 | ||||
| -rw-r--r-- | lib/XXV/MODULES/RECORDS.pm | 19 | ||||
| -rw-r--r-- | lib/XXV/MODULES/TIMERS.pm | 233 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/Html.pm | 21 |
5 files changed, 185 insertions, 114 deletions
diff --git a/lib/XXV/MODULES/CHANNELS.pm b/lib/XXV/MODULES/CHANNELS.pm index d0719e8..438d46a 100644 --- a/lib/XXV/MODULES/CHANNELS.pm +++ b/lib/XXV/MODULES/CHANNELS.pm @@ -967,7 +967,7 @@ sub deleteChannel { my $confirm = $console->confirm({ typ => 'confirm', def => 'y', - msg => gettext('Do you want to delete this channel?'), + msg => gettext('Would you like to delete this channel?'), }, $answer); next if(! $answer eq 'y'); } diff --git a/lib/XXV/MODULES/MOVETIMER.pm b/lib/XXV/MODULES/MOVETIMER.pm index 5f9ded0..087e953 100644 --- a/lib/XXV/MODULES/MOVETIMER.pm +++ b/lib/XXV/MODULES/MOVETIMER.pm @@ -31,7 +31,7 @@ sub module { movetimer => { description => gettext("Manual move timer between channels"), short => 'mt', - callback => sub{ $self->movetimer(@_) }, + callback => sub{ $self->movetimermanual(@_) }, Level => 'user', DenyClass => 'tedit', }, @@ -146,7 +146,7 @@ sub _init { return 0 if($self->{active} ne 'y'); lg 'Start timer callback to move timer!'; - return $self->movetimer(); + return $self->_movetimer(); }); return 1; @@ -156,7 +156,23 @@ sub _init { } # ------------------ -sub movetimer { +sub movetimermanual { +# ------------------ + my $self = shift || return error('No object defined!'); + my $watcher = shift; + my $console = shift; + my $id = shift; + + return 0 unless($self->_movetimer($watcher,$console,$id)); + + $console->redirect({url => '?cmd=movetimerlist', wait => 1}) + if($console->typ eq 'HTML'); + + return 1; +} + +# ------------------ +sub _movetimer { # ------------------ my $self = shift || return error('No object defined!'); my $watcher = shift; @@ -438,7 +454,7 @@ sub movetimeredit { ( $console->{USER} && $console->{USER}->{Name} ? sprintf(' from user: %s', $console->{USER}->{Name}) : "" ) ); - $self->movetimer($watcher, $console, $data->{id}); + $self->_movetimer($watcher, $console, $data->{id}); $console->redirect({url => '?cmd=movetimerlist', wait => 1}) if($console->typ eq 'HTML'); diff --git a/lib/XXV/MODULES/RECORDS.pm b/lib/XXV/MODULES/RECORDS.pm index 6b959ee..b48b588 100644 --- a/lib/XXV/MODULES/RECORDS.pm +++ b/lib/XXV/MODULES/RECORDS.pm @@ -519,21 +519,21 @@ sub readData { } # Get state from used harddrive (/video) - my $stat = $obj->{svdrp}->command('stat disk'); + my $disk = $obj->{svdrp}->command('stat disk'); my ($total, $totalUnit, $free, $freeUnit, $percent); my $totalDuration = 0; my $totalSpace = 0; - if($stat->[1] and $stat->[1] =~ /^250/s) { + if($disk->[1] and $disk->[1] =~ /^250/s) { #250 473807MB 98028MB 79% ($total, $totalUnit, $free, $freeUnit, $percent) - = $stat->[1] =~ /^250[\-|\s](\d+)(\S+)\s+(\d+)(\S+)\s+(\S+)/s; + = $disk->[1] =~ /^250[\-|\s](\d+)(\S+)\s+(\d+)(\S+)\s+(\S+)/s; $obj->{CapacityMessage} = sprintf(gettext("Used %s, total %s%s, free %s%s"),$percent, dot1000($total), $totalUnit, dot1000($free), $freeUnit); $obj->{CapacityPercent} = int($percent); } else { - error("Couldn't get disc state : ".join("\n", @$stat)); + error("Couldn't get disc state : ".join("\n", @$disk)); $obj->{CapacityMessage} = gettext("Unknown disc capacity!"); $obj->{CapacityPercent} = 0; @@ -1696,7 +1696,7 @@ sub delete { my $confirm = $console->confirm({ typ => 'confirm', def => 'y', - msg => gettext('Are you sure to delete this recording?'), + msg => gettext('Would you like to delete this recording?'), }, $answer); next if(! $answer eq 'y'); } @@ -2300,12 +2300,13 @@ sub _recordinglength { my $f = sprintf("%s/index.vdr", $path); my $r = sprintf("%s/001.vdr", $path); + my $fst = stat($f); + my $rst = stat($r); # Pseudo Recording (DIR) - return 0 if(! -r $f and ! -s $r); + return 0 unless($fst and $rst); - if(-r $f) { - my $bytes = stat($f)->size; - return int(($bytes / 8) / $obj->{framerate}); + if($fst->mode & 00400) { # mode & S_IRUSR + return int(($fst->size / 8) / $obj->{framerate}); } else { error sprintf("Couldn't read : '%s'", $f); } diff --git a/lib/XXV/MODULES/TIMERS.pm b/lib/XXV/MODULES/TIMERS.pm index 87d8080..00d9ec3 100644 --- a/lib/XXV/MODULES/TIMERS.pm +++ b/lib/XXV/MODULES/TIMERS.pm @@ -444,14 +444,14 @@ sub _init { return 0; } - $obj->readData(); + $obj->_readData(); # Interval to read timers and put to DB Event->timer( interval => $obj->{interval}, prio => 6, # -1 very hard ... 6 very low cb => sub{ - $obj->readData(); + $obj->_readData(); } ); return 1; @@ -468,16 +468,51 @@ sub saveTimer { my $data = shift || return error('No data defined!'); my $timerid = shift || 0; - my $status = ($data->{Activ} eq 'y' ? 1 : 0); - $status |= ($data->{VPS} eq 'y' ? 4 : 0); + $obj->_saveTimer($data,$timerid); + if($obj->{svdrp}->queue_cmds('COUNT')) { + my $erg = $obj->{svdrp}->queue_cmds("CALL"); # Aufrufen der Kommandos + + # Save shortly this timer in DB if this only a new timer (at) + # Very Important for Autotimer! + my $pos = $1 if($erg->[1] =~ /^250\s+(\d+)/); + if(! $timerid and $pos) { + $obj->insert([ + $data->{Status}, + $data->{ChannelID}, + $data->{Day}, + $data->{Start}, + $data->{Stop}, + int($data->{Priority}), + int($data->{Lifetime}), + $data->{File}, + ($data->{aux} || '') + ], $pos); + } + + event sprintf('Save timer "%s" with id: "%d"', $data->{File}, $pos || 0); + + return $erg; + } + return 0; +} + +# ------------------ +sub _saveTimer { +# ------------------ + my $obj = shift || return error('No object defined!'); + my $data = shift || return error('No data defined!'); + my $timerid = shift || 0; + + $data->{Status} = ($data->{Activ} eq 'y' ? 1 : 0); + $data->{Status} |= ($data->{VPS} eq 'y' ? 4 : 0); $data->{File} =~ s/:/|/g; $data->{File} =~ s/(\r|\n)//sig; - my $erg = $obj->{svdrp}->command( + $obj->{svdrp}->queue_cmds( sprintf("%s %s:%s:%s:%s:%s:%s:%s:%s:%s", $timerid ? "modt $timerid" : "newt", - $status, + $data->{Status}, $data->{ChannelID}, $data->{Day}, $data->{Start}, @@ -488,29 +523,25 @@ sub saveTimer { ($data->{aux} || '') ) ); +} - # Save shortly this timer in DB if this only a new timer (at) - # Very Important for Autotimer! - my $pos = $1 if($erg->[1] =~ /^250\s+(\d+)/); - if(! $timerid and $pos) { - $obj->insert([ - $status, - $data->{ChannelID}, - $data->{Day}, - $data->{Start}, - $data->{Stop}, - int($data->{Priority}), - int($data->{Lifetime}), - $data->{File}, - ($data->{aux} || '') - ], $pos); - } +sub _newTimerdefaults { + my $obj = shift || return error('No object defined!'); + my $epg = shift; - event sprintf('Save timer "%s" with id: "%d"', $data->{File}, $pos || 0); + $epg->{Activ} = 'y'; + $epg->{Priority} = $obj->{Priority}; + $epg->{Lifetime} = $obj->{Lifetime}; - return $erg; + if($epg->{VpsStart} && $obj->{usevpstime} eq 'y') { + $epg->{VPS} = 'y'; + $epg->{Day} = $epg->{VpsDay}; + $epg->{Start} = $epg->{VpsStart}; + $epg->{Stop} = $epg->{VpsStop}; + } else { + $epg->{VPS} = 'n'; + } } - # ------------------ sub newTimer { # ------------------ @@ -520,11 +551,13 @@ sub newTimer { my $epgid = shift || 0; my $epg = shift || 0; - if($epgid and not ref $epg) { + my $fast = (ref $epg and exists $epg->{fast}) ? 1 : 0; + if($epgid and ( (not ref $epg) || $fast) ) { + my @events = reverse sort{ $a <=> $b } split(/[^0-9]/, $epgid); my $sql = qq| SELECT SQL_CACHE eventid, - channel_id, + channel_id as ChannelID, description, CONCAT_WS('~', title, subtitle) as File, DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(starttime) - ? ), '%Y-%m-%d') as Day, @@ -535,44 +568,41 @@ SELECT SQL_CACHE DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(vpstime) + duration), '%H%i') as VpsStop FROM EPG -WHERE - eventid = ?|; +WHERE|; + $sql .= sprintf(" eventid in (%s)", join(',' => ('?') x @events)); + my $sth = $obj->{dbh}->prepare($sql); - $sth->execute($obj->{prevminutes} * 60, $obj->{prevminutes} * 60, $obj->{afterminutes} * 60, $epgid) - or return $console->err(sprintf(gettext("Event '%s' does not exist in the database!"),$epgid)); - $epg = $sth->fetchrow_hashref(); + $sth->execute($obj->{prevminutes} * 60, $obj->{prevminutes} * 60, $obj->{afterminutes} * 60, @events) + or return $console->err(sprintf(gettext("Event '%s' does not exist in the database!"),join(',',@events))); + + my $data = $sth->fetchall_hashref('eventid') + or return $console->err(sprintf(gettext("Event '%s' does not exist in the database!"),join(',',@events))); + + my $count = 1; + foreach my $eventid (keys %{$data}) { + $epg = $data->{$eventid}; + $obj->_newTimerdefaults($epg); + $epg->{action} = 'save' if(scalar keys %{$data} > 1 || $fast ); + $obj->_editTimer($watcher, $console, 0, $epg) if($count < scalar keys %{$data}); + $count += 1; + } } if(not ref $epg) { - my $t = time; - $epg = { - channel_id => '', - File => '', - description => '', + my $t = time; + $epg = { + ChannelID => '', + File => gettext('New timer'), Day => my_strftime("%Y-%m-%d",$t), Start => my_strftime("%H%M",$t), Stop => my_strftime("%H%M",$t) }; + $obj->_newTimerdefaults($epg); } - - $epg->{Status} = '1' - if(not defined $epg->{Status}); - $epg->{Priority} = $obj->{Priority} - if(not defined $epg->{Priority}); - $epg->{Lifetime} = $obj->{Lifetime} - if(not defined $epg->{Lifetime}); - - if($epg->{VpsStart} && $obj->{usevpstime} eq 'y') { - $epg->{Status} |= 4; - $epg->{Day} = $epg->{VpsDay}; - $epg->{Start} = $epg->{VpsStart}; - $epg->{Stop} = $epg->{VpsStop}; - } - $obj->editTimer($watcher, $console, 0, $epg); } # ------------------ -sub editTimer { +sub _editTimer { # ------------------ my $obj = shift || return error('No object defined!'); my $watcher = shift || return error('No watcher defined!'); @@ -586,7 +616,7 @@ sub editTimer { qq| SELECT SQL_CACHE Id, - ChannelID as channel_id, + ChannelID, File, aux, Start, @@ -594,7 +624,8 @@ SELECT SQL_CACHE Day, Priority, Lifetime, - Status + IF(Status & 1,'y','n') as Activ, + IF(Status & 4,'y','n') as VPS FROM TIMERS WHERE @@ -620,17 +651,17 @@ WHERE }, 'Activ' => { typ => 'confirm', - def => (defined $timerData->{Status} and ($timerData->{Status} & 1) ? 'y' : 'n'), + def => $timerData->{Activ}, msg => gettext('Enable this timer'), }, 'VPS' => { typ => 'confirm', - def => (defined $timerData->{Status} and ($timerData->{Status} & 4) ? 'y' : 'n'), + def => $timerData->{VPS}, msg => gettext('Use PDC time to control timer'), }, 'ChannelID' => { typ => 'list', - def => $con ? $mod->ChannelToPos($timerData->{channel_id}) : $timerData->{channel_id}, + def => $con ? $mod->ChannelToPos($timerData->{ChannelID}) : $timerData->{ChannelID}, choices => $con ? $mod->ChannelArray('Name') : $mod->ChannelIDArray('Name'), msg => gettext('Which channel should recorded'), req => gettext("This is required!"), @@ -782,33 +813,49 @@ WHERE : gettext('New timer')), $questions, $data); if(ref $datasave eq 'HASH') { - my $erg = $obj->saveTimer($datasave, $timerid); - - my $error; - foreach my $zeile (@$erg) { + $obj->_saveTimer($datasave, $timerid); + return 1; + } + return 0; +} +# ------------------ +sub editTimer { +# ------------------ + my $obj = shift || return error('No object defined!'); + my $watcher = shift || return error('No watcher defined!'); + my $console = shift || return error('No console defined!'); + my $timerid = shift; # If timerid the edittimer + my $data = shift; # Data for defaults + + if($obj->_editTimer($watcher,$console,$timerid,$data) + && $obj->{svdrp}->queue_cmds('COUNT')) { + my $erg = $obj->{svdrp}->queue_cmds("CALL"); # Aufrufen der Kommandos + my $error; + foreach my $zeile (@$erg) { if($zeile =~ /^(\d{3})\s+(.+)/) { $error = $2 if(int($1) >= 500); } - } + } - unless($error) { + unless($error) { debug sprintf('%s timer with title "%s" is saved%s', ($timerid ? 'Changed' : 'New'), $data->{File}, ( $console->{USER} && $console->{USER}->{Name} ? sprintf(' from user: %s', $console->{USER}->{Name}) : "" ) ); $console->message($erg); - } else { + } else { error sprintf('%s timer with title "%s" does\'nt saved : %s', ($timerid ? 'Changed' : 'New'), $data->{File}, $error ); $console->err($erg); - } - $obj->readData($watcher,$console); - $console->redirect({url => '?cmd=tlist', wait => 1}) - if($console->typ eq 'HTML'); + } + if($obj->_readData($watcher,$console)) { + $console->redirect({url => '?cmd=tlist', wait => 1}) + if(!$error && $console->typ eq 'HTML'); + } } } @@ -843,7 +890,7 @@ sub deleteTimer { my $confirm = $console->confirm({ typ => 'confirm', def => 'y', - msg => gettext('Are you sure to delete this timer?'), + msg => gettext('Would you like to delete this timer?'), }, $answer); next if(!$answer eq 'y'); } @@ -865,10 +912,10 @@ sub deleteTimer { sleep(1); - $obj->readData($watcher,$console); - - $console->redirect({url => '?cmd=tlist', wait => 1}) + if($obj->_readData($watcher,$console)) { + $console->redirect({url => '?cmd=tlist', wait => 1}) if(ref $console and $console->typ eq 'HTML'); + } } else { $console->err(gettext("No timer to delete!")); } @@ -922,10 +969,10 @@ sub toggleTimer { $console->msg($erg, $obj->{svdrp}->err) if(ref $console and $console->typ ne 'AJAX'); - $obj->readData($watcher, $console); - - $console->redirect({url => '?cmd=tlist', wait => 1}) + if($obj->_readData($watcher, $console)) { + $console->redirect({url => '?cmd=tlist', wait => 1}) if(ref $console and $console->typ eq 'HTML'); + } if(ref $console and $console->typ eq 'AJAX') { # { "data" : [ [ ID, ON, RUN, CONFLICT ], .... ] } @@ -959,8 +1006,10 @@ sub insert { $data->[0] &= 15; # change pos to channelid, because change to telnet reader - $data->[1] = $obj->{channels}->{$data->[1]}->{Id} - if(index($data->[1], '-') < 0); + if(index($data->[1], '-') < 0) { + $data->[1] = main::getModule('CHANNELS')->ToCID($data->[1]) + or return error(sprintf("Couldn't get channel from this data: %s", join(',', @$data))); + } # POS unshift(@$data, $pos); @@ -968,7 +1017,7 @@ sub insert { # NextTime my $nexttime = $obj->getNextTime( $data->[3], $data->[4], $data->[5] ) - or return error(sprintf("Couldn't get time form this data: %s", join(' ', @$data))); + or return error(sprintf("Couldn't get time from this data: %s", join(',', @$data))); push(@$data, $nexttime->{start}, $nexttime->{stop}); # insert placeholder @@ -1005,9 +1054,9 @@ sub insert { } -# Read from svdrp (better for future development) +# Read data # ------------------ -sub readData { +sub _readData { # ------------------ my $obj = shift || return error('No object defined!'); my $watcher = shift; @@ -1021,9 +1070,7 @@ sub readData { $obj->{dbh}->do('DELETE FROM TIMERS'); - # read from svdrp, because the - # vdr edit the timers.conf to lazy ;) - $obj->{channels} = main::getModule('CHANNELS')->ChannelHash('POS'); + # read from svdrp my $tlist = $obj->{svdrp}->command('lstt'); my $c = 0; @@ -1062,12 +1109,22 @@ sub readData { $console->message(sprintf(gettext("%d timer written to database."), $c), {overlapping => $overlapping}) if(ref $console and $console->typ ne 'AJAX'); - $console->redirect({url => '?cmd=tlist', wait => 1}) - if(ref $console and $console->typ eq 'HTML'); - return 1; } +# ------------------ +sub readData { +# ------------------ + my $obj = shift || return error('No object defined!'); + my $watcher = shift; + my $console = shift; + + if($obj->_readData($watcher,$console)) { + $console->redirect({url => '?cmd=tlist', wait => 1}) + if(ref $console and $console->typ eq 'HTML'); + } +} + # Routine um Callbacks zu registrieren und # diese nach dem Aktualisieren der Timer zu starten # ------------------ @@ -1295,8 +1352,6 @@ SELECT SQL_CACHE t.Id as Id, t.Status as Status,t.ChannelID as ChannelID, foreach my $t (keys %$erg) { my %tt; -# dumper($erg->{$t}); - # Adjust start and stop times my $start; my $stop; diff --git a/lib/XXV/OUTPUT/Html.pm b/lib/XXV/OUTPUT/Html.pm index af98b59..5eb70e6 100644 --- a/lib/XXV/OUTPUT/Html.pm +++ b/lib/XXV/OUTPUT/Html.pm @@ -8,6 +8,7 @@ use Tools; use XXV::OUTPUT::HTML::WAIT; use File::Path; use File::Basename; +use File::stat; use Fcntl; $SIG{CHLD} = 'IGNORE'; @@ -611,12 +612,12 @@ sub datei { my %args = (); - my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks) = stat($file); - unless($blocks and ($mode & 00400)) { + my $fst = stat($file); + unless($fst and ($fst->mode & 00400)) { # mode & S_IRUSR error sprintf("Couldn't stat file '%s' : %s",$file,$!); return $obj->status404($file,$!); } + my $size = $fst->size; $typ = $obj->{mime}->{lc((split('\.', $file))[-1])} unless($typ); @@ -627,14 +628,14 @@ sub datei { if($typ =~ /image\// || $typ =~ /video\//); # header only if caching - $args{'ETag'} = sprintf('%x-%x-%x',$ino, $size, $mtime); + $args{'ETag'} = sprintf('%x-%x-%x',$fst->ino, $size, $fst->mtime); return $obj->statusmsg(304,undef,undef,$typ) if($obj->{browser}->{'Match'} && $args{'ETag'} eq $obj->{browser}->{'Match'}); my(@MON)=qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/; my(@WDAY) = qw/Sun Mon Tue Wed Thu Fri Sat/; - my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime($mtime); + my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime($fst->mtime); $args{'Last-Modified'} = sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", $WDAY[$wday],$mday,$MON[$mon],$year + 1900,$hour,$min,$sec); $args{'attachment'} = basename($file); @@ -663,15 +664,13 @@ sub stream { my $total = 0; foreach my $file (@{$files}) { - - my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks) = stat($file); - unless($blocks and ($mode & 00400)) { + + my $fst = stat($file); + unless($fst and ($fst->mode & 00400)) { # mode & S_IRUSR error sprintf("Couldn't stat file '%s' : %s",$file,$!); return $obj->status404($file,$!); } - - $total += $size; + $total += $fst->size; } $args{'Content-Length'} = ($total - $offset); |
