summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2008-01-13 12:51:22 +0000
committerAndreas Brachold <vdr07@deltab.de>2008-01-13 12:51:22 +0000
commit1f837ad310bfd99baa472c1a42123d344f7fb393 (patch)
tree734ec304dffa7be71efeec5f30d46c34884a90ef /lib
parent01a4de9d90ce8d33fd4e0a2bc8ca3c0a78225441 (diff)
downloadxxv-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.pm2
-rw-r--r--lib/XXV/MODULES/MOVETIMER.pm24
-rw-r--r--lib/XXV/MODULES/RECORDS.pm19
-rw-r--r--lib/XXV/MODULES/TIMERS.pm233
-rw-r--r--lib/XXV/OUTPUT/Html.pm21
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);