diff options
author | Andreas Mair <amair.sob@googlemail.com> | 2006-09-06 12:55:02 +0200 |
---|---|---|
committer | Andreas Mair <amair.sob@googlemail.com> | 2006-09-06 12:55:02 +0200 |
commit | b689d61d6a800ef8a74f74f08f05218770e0f52d (patch) | |
tree | da884f9eb3c93b66e60a361e3e730a044533d0f4 /vdradmind.pl | |
parent | 8652aa0a9b228e21df5dd68ccf83badb5e20bab8 (diff) | |
download | vdradmin-am-3.4.7beta.tar.gz vdradmin-am-3.4.7beta.tar.bz2 |
2006-09-06: 3.4.7betav3.4.7beta
- Fixed: Smaller bugs (see ChangeLog).
- Changed: Hide select boxes for templates and skins if it contains only a single choice.
- Fixed: Another fix for the refering pages problem(s).
- Changed: Hide "AutoTimer" menu item unless $FEATURE{AUTOTIMER} is set.
- Changed: Use date instead of empty subtitle in timers programed by AutoTimer with activated "Episode" option.
- Fixed: Don't show outdated broadcast as search result.
- Added: Display warning message if lists is empty.
- Added: UTF8 locales patch by Zoolook (see Bug #124).
- Fixed: AutoTimer test feature didn't find broadcasts if they were in vdradmind.done.
- Removed: HTML::Template dependency.
- Changed: Only use Template-Toolkit's Template.pm.
- Fixed: Hide "switch" button in prog_summary2 if broadcast is not running (Based on suggestion by Hardy Flor).
- Fixed: Initial display of rec_list was empty.
- Added: New PLAY and EDIT actions in rec_list.
- Added: Remember selected size and interval in TV.
- Added: check for features available with VDR's SVDRP, disable missing ones and show them in about.html (ATM used for RENR).
- Changed: handling of sorting in rec_list (should always keep the current sorting).
- Changed: handling of sorting in at_timer_list (should always keep the current sorting).
- New: option to autosave config on exit (also saves sorting state in lists and viewmode in prog_summary).
- Added: Czech translation (Submitted by Karel Borkovec).
- Changed: handling of sorting in timer_list (should always keep the current sorting).
- Changed: Moved favicon.ico from a template's skin folder to the template's main folder.
Diffstat (limited to 'vdradmind.pl')
-rwxr-xr-x | vdradmind.pl | 759 |
1 files changed, 317 insertions, 442 deletions
diff --git a/vdradmind.pl b/vdradmind.pl index 7450165..20aad3d 100755 --- a/vdradmind.pl +++ b/vdradmind.pl @@ -28,7 +28,7 @@ require 5.004; -my $VERSION = "3.4.6"; +my $VERSION = "3.4.7beta"; my $BASENAME; my $EXENAME; @@ -64,7 +64,6 @@ use locale; use Env qw(@PATH LANGUAGE); use CGI qw(:no_debug); use IO::Socket; -use HTML::Template::Expr(); use Template; use Time::Local qw(timelocal); use POSIX ":sys_wait_h", qw(strftime mktime locale_h); @@ -92,7 +91,7 @@ use strict; my $SEARCH_FILES_IN_SYSTEM = 0; my $VDR_MAX_SVDRP_LENGTH = 10000; # validate this value -my $SUPPORTED_LOCALE_PREFIXES = "^(de|en|es|fi|fr|nl|ru)_"; +my $SUPPORTED_LOCALE_PREFIXES = "^(cs|de|en|es|fi|fr|nl|ru)_"; my $AT_BY_EVENT_ID = 2; my $AT_BY_TIME = 1; @@ -119,6 +118,7 @@ $CONFIG{CACHE_TIMEOUT} = 60; $CONFIG{CACHE_LASTUPDATE} = 0; $CONFIG{CACHE_REC_TIMEOUT} = 60; $CONFIG{CACHE_REC_LASTUPDATE} = 0; +$CONFIG{AUTO_SAVE_CONFIG} = 1; # $CONFIG{VDR_HOST} = "localhost"; @@ -158,6 +158,8 @@ $CONFIG{AT_PRIORITY} = 99; $CONFIG{AT_MARGIN_BEGIN} = 10; $CONFIG{AT_MARGIN_END} = 10; $CONFIG{AT_TOOLTIP} = 1; +$CONFIG{AT_SORTBY}; +$CONFIG{AT_DESC}; # $CONFIG{TM_LIFETIME} = 99; @@ -166,6 +168,8 @@ $CONFIG{TM_MARGIN_BEGIN} = 10; $CONFIG{TM_MARGIN_END} = 10; $CONFIG{TM_TT_TIMELINE} = 1; $CONFIG{TM_TT_LIST} = 1; +$CONFIG{TM_SORTBY}; +$CONFIG{TM_DESC}; #$CONFIG{TM_ADD_SUMMARY} = 0; # @@ -206,12 +210,22 @@ $CONFIG{PROG_SUMMARY_COLS} = 3; # $CONFIG{TV_MIMETYPE} = "video/x-mpegurl"; $CONFIG{TV_EXT} = "m3u"; +$CONFIG{TV_INTERVAL} = "5"; +$CONFIG{TV_SIZE} = "half"; $CONFIG{REC_MIMETYPE} = "video/x-mpegurl"; $CONFIG{REC_EXT} = "m3u"; +$CONFIG{REC_SORTBY}; +$CONFIG{REC_DESC}; # $CONFIG{PS_VIEW} = "ext"; +# +my %FEATURES; +$FEATURES{STREAMDEV} = 0; +$FEATURES{REC_RENAME} = 0; +$FEATURES{AUTOTIMER} = 0; + my $SERVERVERSION = "vdradmind/$VERSION"; my $VDRVERSION = 0; # Numeric VDR version, e.g. 10344 my $VDRVERSION_HR; # Human readable VDR version, e.g. 1.3.44 @@ -245,9 +259,18 @@ my $DONE = &DONE_Read || {}; textdomain("vdradmin"); +my $UserCSS; +$UserCSS = "user.css" if (-e "$USER_CSS"); + #use Template::Constants qw( :debug ); # IMHO a better Template Modul ;-) # some useful options (see below for full list) +my $Xtemplate_vars = { usercss => $UserCSS, + gettext => sub{ $_[0] =~ s/\n\s+//g; return gettext($_[0]); }, + config => \%CONFIG, + features => \%FEATURES +}; + my $Xconfig = { START_TAG => '\<\?\%', # Tagstyle END_TAG => '\%\?\>', # Tagstyle @@ -259,6 +282,7 @@ my $Xconfig = { CACHE_SIZE => 10000, # Tuning for Templates COMPILE_EXT => 'cache', # Tuning for Templates COMPILE_DIR => '/tmp', # Tuning for Templates + VARIABLES => $Xtemplate_vars, #DEBUG => DEBUG_ALL, }; @@ -288,9 +312,6 @@ $SIG{TERM} = \&Shutdown; $SIG{HUP} = \&HupSignal; $SIG{PIPE} = 'IGNORE'; -my $UserCSS; -$UserCSS = "user.css" if (-e "$USER_CSS"); - # my $DAEMON = 1; for (my $i = 0 ; $i < scalar(@ARGV) ; $i++) { @@ -390,8 +411,9 @@ if (-e "$PIDFILE") { } if ($DAEMON) { - my ($pid) = fork; - if ($pid != 0) { + open(STDIN, "</dev/null"); + defined(my $pid = fork) or die "Cannot fork: $!\n"; + if ($pid) { printf(gettext("vdradmind.pl %s started with pid %d.") . "\n", $VERSION, $pid); writePID($pid); exit(0); @@ -412,6 +434,7 @@ my ($Socket) = die("can't start server: $!\n") if (!$Socket); $Socket->timeout($CONFIG{AT_TIMEOUT} * 60) if ($CONFIG{AT_FUNC}); $CONFIG{CACHE_LASTUPDATE} = 0; +$CONFIG{CACHE_REC_LASTUPDATE} = 0; ## # Mainloop @@ -423,7 +446,7 @@ my @TRUSTED_USER = ( @GUEST_USER, qw(at_timer_edit at_timer_new at_timer_save at_timer_test at_timer_delete timer_new_form timer_add timer_delete timer_toggle rec_delete rec_rename rec_edit config prog_switch rc_show rc_hitk grab_picture at_timer_toggle tv_show tv_switch - live_stream rec_stream force_update vdr_cmds) + live_stream rec_stream rec_play rec_cut force_update vdr_cmds) ); my $MyStreamBase = "./vdradmin."; @@ -596,13 +619,8 @@ sub EURL { #TODO: unused sub HTMLError { my $error = join("", @_); $CONFIG{CACHE_LASTUPDATE} = 0; - my $template = TemplateNew("error.html"); my $vars = { error => $error }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("error.html", $vars); } sub FillInZero { #TODO: unused @@ -999,12 +1017,10 @@ sub headerForward { return (302, 0); } -sub headerNoAuth { #TODO? - my $template = TemplateNew("noauth.html"); +sub headerNoAuth { my $vars; my $data; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$data); + $Xtemplate->process("$CONFIG{TEMPLATE}/noauth.html", $vars, \$data); PrintToClient("HTTP/1.0 401 Authorization Required", CRLF); PrintToClient("Date: ", headerTime(), CRLF); PrintToClient("Server: $SERVERVERSION", CRLF); @@ -1017,12 +1033,11 @@ sub headerNoAuth { #TODO? } sub Error { - my $template = HTML::Template->new(filename => "$TEMPLATEDIR/$CONFIG{TEMPLATE}/noperm.html"); - $template->param(title => $_[0] . " - " . $_[1], - h1 => $_[1], - error => $_[2], - ); - return (header("$_[0] $_[1]", "text/html", $template->output)); + my $vars = { title => $_[0] . " - " . $_[1], + h1 => $_[1], + error => $_[2], + }; + return showTemplate("noperm.html", $vars, $_[0], $_[1]); } sub SendFile { @@ -1174,7 +1189,7 @@ sub DONE_Write { sub DONE_Read { my $done; if (-e $DONE_FILENAME) { - open(DONE_FILE, $DONE_FILENAME) || HTMLError(sprintf($ERROR_MESSAGE{cant_open}, $AT_FILENAME)); + open(DONE_FILE, $DONE_FILENAME) || HTMLError(sprintf($ERROR_MESSAGE{cant_open}, $DONE_FILENAME)); while (<DONE_FILE>) { chomp; next if ($_ eq ""); @@ -1260,11 +1275,14 @@ sub AutoTimer { } # Hamwa schon gehabt? - my $DoneStr = sprintf('%s~%d~%s', $event->{title}, $event->{event_id}, ($event->{subtitle} ? $event->{subtitle} : ''),); + my $DoneStr; + unless ($dry_run) { + $DoneStr = sprintf('%s~%d~%s', $event->{title}, $event->{event_id}, ($event->{subtitle} ? $event->{subtitle} : ''),); - if (exists $DONE->{$DoneStr}) { - Log(LOG_DEBUG, sprintf("Auto Timer: already done \"%s\"", $DoneStr)); - next; + if (exists $DONE->{$DoneStr}) { + Log(LOG_DEBUG, sprintf("Auto Timer: already done \"%s\"", $DoneStr)); + next; + } } if (%blacklist) { @@ -1482,7 +1500,7 @@ sub AutoTimer { if ($event->{subtitle}) { $title .= "~" . $event->{subtitle}; } else { - $title .= "~ "; + $title .= "~" . my_strftime("%Y-%m-%d", $event->{start}); } } } @@ -1501,7 +1519,14 @@ sub AutoTimer { if ($dry_run) { #printf("AT found: (%s) (%s) (%s) (%s) (%s) (%s)\n", $event->{title}, $title, $event->{subtitle}, $directory, $event->{start}, $event->{stop}); - push(@at_matches, { otitle => $event->{title}, title => $title, subtitle => $event->{subtitle} ? $event->{subtitle} : "", directory => $directory, start => my_strftime("%H:%M", $event->{start}), stop => my_strftime("%H:%M", $event->{stop}), date => my_strftime("%A, %x", $event->{start}), channel => GetChannelDescByNumber($event->{vdr_id}) }); + push(@at_matches, { otitle => $event->{title}, + title => $title, + subtitle => $event->{subtitle} ? $event->{subtitle} : "", + directory => $directory, + start => my_strftime("%H:%M", $event->{start}), + stop => my_strftime("%H:%M", $event->{stop}), + date => my_strftime("%A, %x", $event->{start}), + channel => GetChannelDescByNumber($event->{vdr_id}) }); } else { Log(LOG_AT, sprintf("AutoTimer: Programming Timer \"%s\" (Event-ID %s, %s - %s)", $title, $event->{event_id}, strftime("%Y%m%d-%H%M", localtime($event->{start})), strftime("%Y%m%d-%H%M", localtime($event->{stop})))); @@ -1523,10 +1548,12 @@ sub AutoTimer { } Log(LOG_AT, "Auto Timer: Done."); - Log(LOG_AT, "Auto Timer: Purging done list... (lowtime $low_time)"); - for (keys %$DONE) { delete $DONE->{$_} if ($low_time > $DONE->{$_}) } - Log(LOG_AT, "Auto Timer: Save done list..."); - &DONE_Write($DONE) if ($DONE); + unless ($dry_run) { + Log(LOG_AT, "Auto Timer: Purging done list... (lowtime $low_time)"); + for (keys %$DONE) { delete $DONE->{$_} if ($low_time > $DONE->{$_}) } + Log(LOG_AT, "Auto Timer: Save done list..."); + &DONE_Write($DONE) if ($DONE); + } Log(LOG_AT, "Auto Timer: Done."); if ($dry_run) { @@ -1629,6 +1656,7 @@ sub AT_ProgTimer { my $qptitle = my_encode_qp($title); $smtp->datasend("Subject: AUTOTIMER: New timer created for $qptitle\n"); $smtp->datasend("From: VDRAdmin-AM AutoTimer <$CONFIG{MAIL_FROM}>\n"); + $smtp->datasend("Auto-Submitted: auto-generated\n"); # RFC 3834 $smtp->datasend("MIME-Version: 1.0\n"); $smtp->datasend("Content-Type: text/plain; charset=iso-8859-1\n"); $smtp->datasend("Content-Transfer-Encoding: 8bit\n"); @@ -2108,19 +2136,14 @@ sub salt { #TODO: unused sub SigDieHandler { my $error = $_[0]; CloseSocket(); - my ($template) = TemplateNew("error.html"); - my $vars = { - error => "Interner Fehler:<br />$error" + my $vars = { error => gettext("Internal error:") . "<br />$error" }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("error.html", $vars); } sub Shutdown { CloseSocket(); + WriteConfig() if ($CONFIG{AUTO_SAVE_CONFIG}); unlink($PIDFILE); exit(0); } @@ -2177,34 +2200,18 @@ sub Log { } } -sub my_normalize { - my $text = shift; - $text =~ s/[\t\n]//g; - return $text; -} - -sub TemplateNew { - my $file = shift; - - my $translation_filter = sub { - my $text_ref = shift; - $$text_ref =~ s/<%! (.*?) !%>/gettext(my_normalize($1))/ges; - }; +sub showTemplate { + my $file = shift; + my $vars = shift; + my $status = shift; + my $ctype = shift; - $CONFIG{TEMPLATE} = "default" if (!$CONFIG{TEMPLATE}); - $file = "$TEMPLATEDIR/$CONFIG{TEMPLATE}/$file"; - if (!-e $file) { - Log(LOG_FATALERROR, "Fatal! Can't find $file!"); - } - my $template = HTML::Template::Expr->new( - die_on_bad_params => 0, - loop_context_vars => 1, + $status = "200" unless($status); + $ctype = "text/html" unless($ctype); -# DEBUG => DEBUG_ALL, - filter => $translation_filter, - filename => $file - ); - return $template; + my $output; + $Xtemplate->process("$CONFIG{TEMPLATE}/$file", $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); + return (header($status, $ctype, $output)); } sub my_strftime { @@ -2234,18 +2241,20 @@ sub ChannelHasEPG { sub Encode_Referer { if ($_[0]) { $_ = $_[0]; } else { $_ = $Referer; } - return (MIME::Base64::encode_base64(sprintf("%s", $_))); + return (MIME::Base64::encode_base64(sprintf("%s", $_), "")); } sub Decode_Referer { - my $ref = MIME::Base64::decode_base64(shift); + my $text = shift; + $text =~ s/ /+/g; + my $ref = MIME::Base64::decode_base64($text); return ($ref); } sub encode_ref { #TODO: unused my ($tmp) = $_[0]->url(-relative => 1, -query => 1); my (undef, $query) = split(/\?/, $tmp, 2); - return (MIME::Base64::encode_base64($query)); + return (MIME::Base64::encode_base64($query, "")); } sub decode_ref { #TODO: unused @@ -2263,6 +2272,17 @@ sub access_log { return sprintf("%s %s \"%s\" %s %s \"%s\" \"%s\"", $ip, $username, $rawrequest, $http_status ? $http_status : "-", $bytes_transfered ? $bytes_transfered : "-", $request, $useragent); } +sub ValidConfig { + $CONFIG{SKIN} = "default" unless($CONFIG{SKIN}); + $CONFIG{TEMPLATE} = "default" unless($CONFIG{TEMPLATE}); + $CONFIG{TV_MIMETYPE} = "video/x-mpegurl" if (!$CONFIG{TV_MIMETYPE}); + $CONFIG{TV_EXT} = "m3u" if (!$CONFIG{TV_EXT}); + $CONFIG{REC_MIMETYPE} = "video/x-mpegurl" if (!$CONFIG{REC_MIMETYPE}); + $CONFIG{REC_EXT} = "m3u" if (!$CONFIG{REC_EXT}); + + $FEATURES{AUTOTIMER} = $CONFIG{AT_FUNC}; +} + sub ReadConfig { if (-e $CONFFILE) { open(CONF, $CONFFILE); @@ -2273,6 +2293,8 @@ sub ReadConfig { } close(CONF); + ValidConfig(); + #Migrate settings #v3.4.5 $CONFIG{MAIL_FROM} = "autotimer@" . $CONFIG{MAIL_FROMDOMAIN} if ($CONFIG{MAIL_FROM} =~ /from\@address.tld/); @@ -2381,73 +2403,22 @@ sub VideoDiskFree { # frontend ############################################################################# sub show_index { - my $template = TemplateNew("index.html"); my $page; if (defined($CONFIG{LOGINPAGE})) { $page = $LOGINPAGES[ $CONFIG{LOGINPAGE} ]; } else { $page = $LOGINPAGES[0]; } - my $vars = { usercss => $UserCSS, - loginpage => "$MyURL?aktion=$page", + my $vars = { loginpage => "$MyURL?aktion=$page", version => $VERSION, host => $CONFIG{VDR_HOST} }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("index.html", $vars); } sub show_navi { - my $template = TemplateNew("navigation.html"); - my $vars = { usercss => $UserCSS }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); -} - -sub toolbar { #TODO: unused? - my $template = TemplateNew("toolbar.html"); - - my @channel; - for my $channel (@CHAN) { - - # if its wished, display only wanted channels - if ($CONFIG{CHANNELS_WANTED_PRG}) { - my $found = 0; - for my $n (split(",", $CONFIG{CHANNELS_WANTED})) { - ($found = 1) if ($n eq $channel->{vdr_id}); - } - next if (!$found); - } - - # skip channels without EPG data - if (ChannelHasEPG($channel->{vdr_id})) { - push( - @channel, - { name => $channel->{name}, - vdr_id => $channel->{vdr_id}, - - #current => ($vdr_id == $channel->{vdr_id}) ? 1 : 0, - } - ); - } - } - - $template->param(usercss => $UserCSS, - url => $MyURL, - chanloop => \@channel - ); - return (header("200", "text/html", $template->output)); -} - -sub show_top { #TODO: unused? - my $template = TemplateNew("top.html"); - return (header("200", "text/html", $template->output)); + my $vars = { }; + return showTemplate("navigation.html", $vars); } sub prog_switch { @@ -2518,9 +2489,7 @@ sub prog_detail { $recurl = sprintf("%s?aktion=timer_new_form&epg_id=%s&vdr_id=%s&referer=%s", $MyURL, $epg_id, $vdr_id, Encode_Referer($referer)) unless ($referer =~ "timer_list"); my $now = time(); - my $template = TemplateNew("prog_detail.html"); - my $vars = { usercss => $UserCSS, - title => $displaytitle ? $displaytitle : gettext("Can't find EPG entry!"), + my $vars = { title => $displaytitle ? $displaytitle : gettext("Can't find EPG entry!"), recurl => $recurl, switchurl => ($start && $stop && $start <= $now && $now <= $stop) ? sprintf("%s?aktion=prog_switch&channel=%s", $MyURL, $vdr_id) : undef, channel_name => CGI::escapeHTML($channel_name), @@ -2536,11 +2505,7 @@ sub prog_detail { audio => $audio, video => $video, }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("prog_detail.html", $vars); } ############################################################################# @@ -2631,22 +2596,16 @@ sub prog_list { # my $now = time(); - my ($template) = TemplateNew("prog_list.html"); - my $vars = { usercss => $UserCSS, - url => $MyURL, + my $vars = { url => $MyURL, loop => \@show, chanloop => \@channel, progname => GetChannelDescByNumber($vdr_id), switchurl => "$MyURL?aktion=prog_switch&channel=$vdr_id", - streamurl => $MyStreamBase . $CONFIG{TV_EXT} . "?aktion=live_stream&channel=" . $vdr_id, - stream_live_on => $CONFIG{ST_FUNC} && $CONFIG{ST_LIVE_ON}, + streamurl => $FEATURES{STREAMDEV} ? $MyStreamBase . $CONFIG{TV_EXT} . "?aktion=live_stream&channel=" . $vdr_id : undef, + stream_live_on => $FEATURES{STREAMDEV} && $CONFIG{ST_FUNC} && $CONFIG{ST_LIVE_ON}, toolbarurl => "$MyURL?aktion=toolbar" }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("prog_list.html", $vars); } ############################################################################# @@ -2729,7 +2688,7 @@ sub prog_list2 { { channel_name => $event->{channel_name}, longdate => my_strftime("%A, %x", $event->{start}), newd => 1, - streamurl => $MyStreamBase . $CONFIG{TV_EXT} . "?aktion=live_stream&channel=" . $event->{vdr_id}, + streamurl => $FEATURES{STREAMDEV} ? $MyStreamBase . $CONFIG{TV_EXT} . "?aktion=live_stream&channel=" . $event->{vdr_id} : undef, switchurl => "$MyURL?aktion=prog_switch&channel=" . $event->{vdr_id}, proglink => "$MyURL?aktion=prog_list&vdr_id=" . $event->{vdr_id} } @@ -2788,28 +2747,22 @@ sub prog_list2 { } # - my ($template) = TemplateNew("prog_list2.html"); my $vars = { title => $day == $current_day ? gettext("Playing Today") : ($day == $current_day + 1 ? gettext("Playing Tomorrow") : sprintf(gettext("Playing on the %s"), $hash_days{$day})), now => my_strftime("%H:%M", $time), day => $day, days => \@days, - usercss => $UserCSS, url => $MyURL, loop => \@show, chanloop => \@channel, progname => GetChannelDescByNumber($vdr_id), switchurl => "$MyURL?aktion=prog_switch&channel=" . $vdr_id, - stream_live_on => $CONFIG{ST_FUNC} && $CONFIG{ST_LIVE_ON}, + stream_live_on => $FEATURES{STREAMDEV} && $CONFIG{ST_FUNC} && $CONFIG{ST_LIVE_ON}, prevdayurl => $prev_day ? "$MyURL?aktion=prog_list2&day=" . $prev_day . ($param_time ? "&time=$param_time" : undef) : undef, nextdayurl => $next_day ? "$MyURL?aktion=prog_list2&day=" . $next_day . ($param_time ? "&time=$param_time" : undef) : undef, toolbarurl => "$MyURL?aktion=toolbar" }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("prog_list2.html", $vars); } ############################################################################# @@ -2818,15 +2771,9 @@ sub prog_list2 { sub timer_list { return if (UptoDate()); - # - my $desc; - if (!defined($q->param("desc"))) { - $desc = 1; - } else { - $q->param("desc") ? ($desc = 1) : ($desc = 0); - } - my $sortby = $q->param("sortby"); - ($sortby = "day") if (!$sortby); + $CONFIG{TM_DESC} = ($q->param("desc") ? 1 : 0) if (defined($q->param("desc"))); + $CONFIG{TM_SORTBY} = $q->param("sortby") if (defined($q->param("sortby"))); + $CONFIG{TM_SORTBY} = "day" if (!$CONFIG{TM_SORTBY}); # my @timer; @@ -2843,9 +2790,9 @@ sub timer_list { } $timer->{active} = 0 unless ($timer->{active} & 1); - $timer->{delurl} = $MyURL . "?aktion=timer_delete&timer_id=" . $timer->{id} . "&sortby=" . $sortby . "&desc=" . $desc, - $timer->{modurl} = $MyURL . "?aktion=timer_new_form&timer_id=" . $timer->{id} . "&sortby=" . $sortby . "&desc=" . $desc, - $timer->{toggleurl} = sprintf("%s?aktion=timer_toggle&active=%s&id=%s&sortby=%s&desc=%s", $MyURL, ($timer->{active} & 1) ? 0 : 1, $timer->{id}, $sortby, $desc), + $timer->{delurl} = $MyURL . "?aktion=timer_delete&timer_id=" . $timer->{id}, + $timer->{modurl} = $MyURL . "?aktion=timer_new_form&timer_id=" . $timer->{id}, + $timer->{toggleurl} = sprintf("%s?aktion=timer_toggle&active=%s&id=%s", $MyURL, ($timer->{active} & 1) ? 0 : 1, $timer->{id}), #TODO: nur id? $timer->{dor} = my_strftime("%a %d.%m", $timer->{startsse}); #TODO: localize date $timer->{title} = CGI::escapeHTML($timer->{title}); @@ -2862,12 +2809,12 @@ sub timer_list { $timer->{start} = my_strftime("%H:%M", $timer->{start}); $timer->{stop} = my_strftime("%H:%M", $timer->{stop}); - $timer->{sortbyactive} = 1 if ($sortby eq "active"); - $timer->{sortbychannel} = 1 if ($sortby eq "channel"); - $timer->{sortbyname} = 1 if ($sortby eq "name"); - $timer->{sortbystart} = 1 if ($sortby eq "start"); - $timer->{sortbystop} = 1 if ($sortby eq "stop"); - $timer->{sortbyday} = 1 if ($sortby eq "day"); + $timer->{sortbyactive} = 1 if ($CONFIG{TM_SORTBY} eq "active"); + $timer->{sortbychannel} = 1 if ($CONFIG{TM_SORTBY} eq "channel"); + $timer->{sortbyname} = 1 if ($CONFIG{TM_SORTBY} eq "name"); + $timer->{sortbystart} = 1 if ($CONFIG{TM_SORTBY} eq "start"); + $timer->{sortbystop} = 1 if ($CONFIG{TM_SORTBY} eq "stop"); + $timer->{sortbyday} = 1 if ($CONFIG{TM_SORTBY} eq "day"); $timer->{transponder} = get_transponder_from_vdrid($timer->{vdr_id}); $timer->{ca} = get_ca_from_vdrid($timer->{vdr_id}); @@ -3018,64 +2965,61 @@ sub timer_list { } # - if ($sortby eq "active") { - if (!$desc) { + if ($CONFIG{TM_SORTBY} eq "active") { + if ($CONFIG{TM_DESC}) { @timer = sort({ $b->{active} <=> $a->{active} } @timer); } else { @timer = sort({ $a->{active} <=> $b->{active} } @timer); } - } elsif ($sortby eq "channel") { - if (!$desc) { + } elsif ($CONFIG{TM_SORTBY} eq "channel") { + if ($CONFIG{TM_DESC}) { @timer = sort({ lc($b->{cdesc}) cmp lc($a->{cdesc}) } @timer); } else { @timer = sort({ lc($a->{cdesc}) cmp lc($b->{cdesc}) } @timer); } - } elsif ($sortby eq "name") { - if (!$desc) { + } elsif ($CONFIG{TM_SORTBY} eq "name") { + if ($CONFIG{TM_DESC}) { @timer = sort({ lc($b->{title}) cmp lc($a->{title}) } @timer); } else { @timer = sort({ lc($a->{title}) cmp lc($b->{title}) } @timer); } - } elsif ($sortby eq "start") { - if (!$desc) { + } elsif ($CONFIG{TM_SORTBY} eq "start") { + if ($CONFIG{TM_DESC}) { @timer = sort({ $b->{start} <=> $a->{start} } @timer); } else { @timer = sort({ $a->{start} <=> $b->{start} } @timer); } - } elsif ($sortby eq "stop") { - if (!$desc) { + } elsif ($CONFIG{TM_SORTBY} eq "stop") { + if ($CONFIG{TM_DESC}) { @timer = sort({ $b->{stop} <=> $a->{stop} } @timer); } else { @timer = sort({ $a->{stop} <=> $b->{stop} } @timer); } - } elsif ($sortby eq "day") { - if (!$desc) { + } elsif ($CONFIG{TM_SORTBY} eq "day") { + if ($CONFIG{TM_DESC}) { @timer = sort({ $b->{startsse} <=> $a->{startsse} } @timer); } else { @timer = sort({ $a->{startsse} <=> $b->{startsse} } @timer); } } - my $cur_desc = $desc; - $desc ? ($desc = 0) : ($desc = 1); + my $toggle_desc = ($CONFIG{TM_DESC} ? 0 : 1); @timer2 = @timer; @timer2 = sort({ lc($a->{sortfield}) cmp lc($b->{sortfield}) } @timer2); - my $template = TemplateNew("timer_list.html"); - my $vars = { sortbydayurl => "$MyURL?aktion=timer_list&sortby=day&desc=" . (($sortby eq "day") ? $desc : $cur_desc), - sortbychannelurl => "$MyURL?aktion=timer_list&sortby=channel&desc=" . (($sortby eq "channel") ? $desc : $cur_desc), - sortbynameurl => "$MyURL?aktion=timer_list&sortby=name&desc=" . (($sortby eq "name") ? $desc : $cur_desc), - sortbyactiveurl => "$MyURL?aktion=timer_list&sortby=active&desc=" . (($sortby eq "active") ? $desc : $cur_desc), - sortbystarturl => "$MyURL?aktion=timer_list&sortby=start&desc=" . (($sortby eq "start") ? $desc : $cur_desc), - sortbystopurl => "$MyURL?aktion=timer_list&sortby=stop&desc=" . (($sortby eq "stop") ? $desc : $cur_desc), - sortbyday => ($sortby eq "day") ? 1 : 0, - sortbychannel => ($sortby eq "channel") ? 1 : 0, - sortbyname => ($sortby eq "name") ? 1 : 0, - sortbyactive => ($sortby eq "active") ? 1 : 0, - sortbystart => ($sortby eq "start") ? 1 : 0, - sortbystop => ($sortby eq "stop") ? 1 : 0, - sortby => $sortby, - desc => $desc, - cur_desc => $cur_desc, + my $vars = { sortbydayurl => "$MyURL?aktion=timer_list&sortby=day&desc=" . (($CONFIG{TM_SORTBY} eq "day") ? $toggle_desc : $CONFIG{TM_DESC}), + sortbychannelurl => "$MyURL?aktion=timer_list&sortby=channel&desc=" . (($CONFIG{TM_SORTBY} eq "channel") ? $toggle_desc : $CONFIG{TM_DESC}), + sortbynameurl => "$MyURL?aktion=timer_list&sortby=name&desc=" . (($CONFIG{TM_SORTBY} eq "name") ? $toggle_desc : $CONFIG{TM_DESC}), + sortbyactiveurl => "$MyURL?aktion=timer_list&sortby=active&desc=" . (($CONFIG{TM_SORTBY} eq "active") ? $toggle_desc : $CONFIG{TM_DESC}), + sortbystarturl => "$MyURL?aktion=timer_list&sortby=start&desc=" . (($CONFIG{TM_SORTBY} eq "start") ? $toggle_desc : $CONFIG{TM_DESC}), + sortbystopurl => "$MyURL?aktion=timer_list&sortby=stop&desc=" . (($CONFIG{TM_SORTBY} eq "stop") ? $toggle_desc : $CONFIG{TM_DESC}), + sortbyday => ($CONFIG{TM_SORTBY} eq "day") ? 1 : 0, + sortbychannel => ($CONFIG{TM_SORTBY} eq "channel") ? 1 : 0, + sortbyname => ($CONFIG{TM_SORTBY} eq "name") ? 1 : 0, + sortbyactive => ($CONFIG{TM_SORTBY} eq "active") ? 1 : 0, + sortbystart => ($CONFIG{TM_SORTBY} eq "start") ? 1 : 0, + sortbystop => ($CONFIG{TM_SORTBY} eq "stop") ? 1 : 0, + sortby => $CONFIG{TM_SORTBY}, + desc => $CONFIG{TM_DESC} ? "desc" : "asc", timer_loop => \@timer, timers => \@timer2, timers2 => \@timer2, @@ -3084,26 +3028,17 @@ sub timer_list { help_url => HelpURL("timer_list"), current => $current, title => $title, - usercss => $UserCSS, - activateurl => sprintf("%s?aktion=timer_toggle&active=1&sortby=%s&desc=%s", $MyURL,, $sortby, $cur_desc), - inactivateurl => sprintf("%s?aktion=timer_toggle&active=0&sortby=%s&desc=%s", $MyURL,, $sortby, $cur_desc), - prevdayurl => $prev_day ? sprintf("%s?aktion=timer_list&active=0&sortby=%s&desc=%s&timer=%s", $MyURL,, $sortby, $cur_desc, $prev_day) : undef, - nextdayurl => $next_day ? sprintf("%s?aktion=timer_list&active=0&sortby=%s&desc=%s&timer=%s", $MyURL,, $sortby, $cur_desc, $next_day) : undef, - config => \%CONFIG + activateurl => sprintf("%s?aktion=timer_toggle&active=1", $MyURL), + inactivateurl => sprintf("%s?aktion=timer_toggle&active=0", $MyURL), + prevdayurl => $prev_day ? sprintf("%s?aktion=timer_list&active=0&timer=%s", $MyURL, $prev_day) : undef, + nextdayurl => $next_day ? sprintf("%s?aktion=timer_list&active=0&timer=%s", $MyURL, $next_day) : undef }; - - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("timer_list.html", $vars); } sub timer_toggle { UptoDate(); my $id = $q->param("id"); - my $sortby = $q->param("sortby"); - my $desc = $q->param("desc"); if ($id) { my $active = $q->param("active"); SendCMD(sprintf("modt %s %s", $id, $active ? "on" : "off")); @@ -3129,7 +3064,7 @@ sub timer_toggle { CloseSocket(); } } - return (headerForward(RedirectToReferer("$MyURL?aktion=timer_list&sortby=$sortby&desc=$desc"))); + return (headerForward(RedirectToReferer("$MyURL?aktion=timer_list"))); } sub timer_new_form { @@ -3177,8 +3112,7 @@ sub timer_new_form { my $at_epg = $this_event->{event_id} > 0 ? can_do_eventid_autotimer($this_event->{vdr_id}) : 0; - my $vars = { usercss => $UserCSS, - url => $MyURL, + my $vars = { url => $MyURL, active => $this_event->{active} & 1, event_id => $this_event->{event_id}, starth => my_strftime("%H", $this_event->{start}), @@ -3202,14 +3136,7 @@ sub timer_new_form { referer => $ref ? Encode_Referer($ref) : undef, help_url => HelpURL("timer_new") }; - - my $template = TemplateNew("timer_new.html"); - $template->param($vars); - - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("timer_new.html", $vars); } sub timer_add { @@ -3443,15 +3370,9 @@ sub live_stream { sub at_timer_list { return if (UptoDate()); - # - my $desc; - if (!defined($q->param("desc"))) { - $desc = 1; - } else { - $q->param("desc") ? ($desc = 1) : ($desc = 0); - } - my $sortby = $q->param("sortby"); - ($sortby = "pattern") if (!$sortby); + $CONFIG{AT_DESC} = ($q->param("desc") ? 1 : 0) if (defined($q->param("desc"))); + $CONFIG{AT_SORTBY} = $q->param("sortby") if (defined($q->param("sortby"))); + $CONFIG{AT_SORTBY} = "pattern" if (!$CONFIG{AT_SORTBY}); # my @at; @@ -3468,90 +3389,79 @@ sub at_timer_list { $_->{pattern} = CGI::escapeHTML($_->{pattern}); $_->{pattern_js} =~ s/\'/\\\'/g; $_->{pattern_js} =~ s/\"/"/g; - $_->{modurl} = $MyURL . "?aktion=at_timer_edit&id=$id&sortby=$sortby&desc=$desc"; - $_->{delurl} = $MyURL . "?aktion=at_timer_delete&id=$id&sortby=$sortby&desc=$desc"; + $_->{modurl} = $MyURL . "?aktion=at_timer_edit&id=$id"; + $_->{delurl} = $MyURL . "?aktion=at_timer_delete&id=$id"; $_->{prio} = $_->{prio} ? $_->{prio} : $CONFIG{AT_PRIORITY}; $_->{lft} = $_->{lft} ? $_->{lft} : $CONFIG{AT_LIFETIME}; $_->{id} = $id; $_->{proglink} = sprintf("%s?aktion=prog_list&vdr_id=%s", $MyURL, $_->{channel}); $_->{channel} = GetChannelDescByNumber($_->{channel}); - $_->{sortbyactive} = 1 if ($sortby eq "active"); - $_->{sortbychannel} = 1 if ($sortby eq "channel"); - $_->{sortbypattern} = 1 if ($sortby eq "pattern"); - $_->{sortbystart} = 1 if ($sortby eq "start"); - $_->{sortbystop} = 1 if ($sortby eq "stop"); - $_->{toggleurl} = sprintf("%s?aktion=at_timer_toggle&active=%s&id=%s&sortby=%s&desc=%s", $MyURL, ($_->{active} & 1) ? 0 : 1, $_->{id}, $sortby, $desc), push(@at, $_); + $_->{sortbyactive} = 1 if ($CONFIG{AT_SORTBY} eq "active"); + $_->{sortbychannel} = 1 if ($CONFIG{AT_SORTBY} eq "channel"); + $_->{sortbypattern} = 1 if ($CONFIG{AT_SORTBY} eq "pattern"); + $_->{sortbystart} = 1 if ($CONFIG{AT_SORTBY} eq "start"); + $_->{sortbystop} = 1 if ($CONFIG{AT_SORTBY} eq "stop"); + $_->{toggleurl} = sprintf("%s?aktion=at_timer_toggle&active=%s&id=%s", $MyURL, ($_->{active} & 1) ? 0 : 1, $_->{id}), push(@at, $_); } my @timer = sort({ lc($a->{pattern}) cmp lc($b->{pattern}) } @at); # - if ($sortby eq "active") { - if (!$desc) { + if ($CONFIG{AT_SORTBY} eq "active") { + if ($CONFIG{AT_DESC}) { @timer = sort({ $b->{active} <=> $a->{active} } @timer); } else { @timer = sort({ $a->{active} <=> $b->{active} } @timer); } - } elsif ($sortby eq "channel") { - if (!$desc) { + } elsif ($CONFIG{AT_SORTBY} eq "channel") { + if ($CONFIG{AT_DESC}) { @timer = sort({ lc($b->{channel}) cmp lc($a->{channel}) } @timer); } else { @timer = sort({ lc($a->{channel}) cmp lc($b->{channel}) } @timer); } - } elsif ($sortby eq "pattern") { - if (!$desc) { + } elsif ($CONFIG{AT_SORTBY} eq "pattern") { + if ($CONFIG{AT_DESC}) { @timer = sort({ lc($b->{pattern}) cmp lc($a->{pattern}) } @timer); } else { @timer = sort({ lc($a->{pattern}) cmp lc($b->{pattern}) } @timer); } - } elsif ($sortby eq "start") { - if (!$desc) { + } elsif ($CONFIG{AT_SORTBY} eq "start") { + if ($CONFIG{AT_DESC}) { @timer = sort({ $b->{start} <=> $a->{start} } @timer); } else { @timer = sort({ $a->{start} <=> $b->{start} } @timer); } - } elsif ($sortby eq "stop") { - if (!$desc) { + } elsif ($CONFIG{AT_SORTBY} eq "stop") { + if ($CONFIG{AT_DESC}) { @timer = sort({ $b->{stop} <=> $a->{stop} } @timer); } else { @timer = sort({ $a->{stop} <=> $b->{stop} } @timer); } } - my $cur_desc = $desc; - $desc ? ($desc = 0) : ($desc = 1); - - my $template = TemplateNew("at_timer_list.html"); - my $vars = { usercss => $UserCSS, - sortbychannelurl => "$MyURL?aktion=at_timer_list&sortby=channel&desc=" . (($sortby eq "channel") ? $desc : $cur_desc), - sortbypatternurl => "$MyURL?aktion=at_timer_list&sortby=pattern&desc=" . (($sortby eq "pattern") ? $desc : $cur_desc), - sortbyactiveurl => "$MyURL?aktion=at_timer_list&sortby=active&desc=" . (($sortby eq "active") ? $desc : $cur_desc), - sortbystarturl => "$MyURL?aktion=at_timer_list&sortby=start&desc=" . (($sortby eq "start") ? $desc : $cur_desc), - sortbystopurl => "$MyURL?aktion=at_timer_list&sortby=stop&desc=" . (($sortby eq "stop") ? $desc : $cur_desc), - sortbychannel => ($sortby eq "channel") ? 1 : 0, - sortbypattern => ($sortby eq "pattern") ? 1 : 0, - sortbyactive => ($sortby eq "active") ? 1 : 0, - sortbystart => ($sortby eq "start") ? 1 : 0, - sortbystop => ($sortby eq "stop") ? 1 : 0, - desc => $desc, - sortby => $sortby, + my $toggle_desc = ($CONFIG{AT_DESC} ? 0 : 1); + + my $vars = { sortbychannelurl => "$MyURL?aktion=at_timer_list&sortby=channel&desc=" . (($CONFIG{AT_SORTBY} eq "channel") ? $toggle_desc : $CONFIG{AT_DESC}), + sortbypatternurl => "$MyURL?aktion=at_timer_list&sortby=pattern&desc=" . (($CONFIG{AT_SORTBY} eq "pattern") ? $toggle_desc : $CONFIG{AT_DESC}), + sortbyactiveurl => "$MyURL?aktion=at_timer_list&sortby=active&desc=" . (($CONFIG{AT_SORTBY} eq "active") ? $toggle_desc : $CONFIG{AT_DESC}), + sortbystarturl => "$MyURL?aktion=at_timer_list&sortby=start&desc=" . (($CONFIG{AT_SORTBY} eq "start") ? $toggle_desc : $CONFIG{AT_DESC}), + sortbystopurl => "$MyURL?aktion=at_timer_list&sortby=stop&desc=" . (($CONFIG{AT_SORTBY} eq "stop") ? $toggle_desc : $CONFIG{AT_DESC}), + sortbychannel => ($CONFIG{AT_SORTBY} eq "channel") ? 1 : 0, + sortbypattern => ($CONFIG{AT_SORTBY} eq "pattern") ? 1 : 0, + sortbyactive => ($CONFIG{AT_SORTBY} eq "active") ? 1 : 0, + sortbystart => ($CONFIG{AT_SORTBY} eq "start") ? 1 : 0, + sortbystop => ($CONFIG{AT_SORTBY} eq "stop") ? 1 : 0, + desc => $CONFIG{AT_DESC} ? "desc" : "asc", at_timer_loop => \@timer, at_timer_loop2 => \@timer, url => $MyURL, - help_url => HelpURL("at_timer_list"), - config => \%CONFIG + help_url => HelpURL("at_timer_list") }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("at_timer_list.html", $vars); } sub at_timer_toggle { UptoDate(); my $active = $q->param("active"); my $id = $q->param("id"); - my $sortby = $q->param("sortby"); - my $desc = $q->param("desc"); my (@at, $z); @@ -3564,7 +3474,7 @@ sub at_timer_toggle { } AT_Write(@at); - return (headerForward(RedirectToReferer("$MyURL?aktion=at_timer_list&sortby=$sortby&desc=$desc"))); + return (headerForward(RedirectToReferer("$MyURL?aktion=at_timer_list"))); } sub at_timer_edit { @@ -3590,9 +3500,7 @@ sub at_timer_edit { my $pattern = $at[ $id - 1 ]->{pattern}; $pattern =~ s/"/\"/g; - my $template = TemplateNew("at_timer_new.html"); - my $vars = { usercss => $UserCSS, - channels => \@chans, + my $vars = { channels => \@chans, id => $id, url => $MyURL, prio => $at[ $id - 1 ]->{prio} ? $at[ $id - 1 ]->{prio} : $CONFIG{AT_PRIORITY}, @@ -3616,12 +3524,7 @@ sub at_timer_edit { (map { $_ => $at[ $id - 1 ]->{weekdays}->{$_} } qw (wday_mon wday_tue wday_wed wday_thu wday_fri wday_sat wday_sun)), help_url => HelpURL("at_timer_new") }; - - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("at_timer_new.html", $vars); } sub at_timer_new { @@ -3636,9 +3539,7 @@ sub at_timer_new { push(@chans, $chan); } } - my $template = TemplateNew("at_timer_new.html"); - my $vars = { usercss => $UserCSS, - url => $MyURL, + my $vars = { url => $MyURL, active => $q->param("active"), done => $q->param("done"), title => 1, @@ -3657,11 +3558,7 @@ sub at_timer_new { newtimer => 1, help_url => HelpURL("at_timer_new") }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("at_timer_new.html", $vars); } sub at_timer_save { @@ -3811,12 +3708,10 @@ sub at_timer_test { }; my @at_matches = AutoTimer(1, @at); - my $template = TemplateNew("at_timer_new.html"); my $pattern = $q->param("pattern"); $pattern =~ s/"/\"/g; my $vars = { id => $id, - usercss => $UserCSS, url => $MyURL, channels => \@chans, @@ -3846,11 +3741,7 @@ sub at_timer_test { at_test => 1, matches => \@at_matches }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("at_timer_new.html", $vars); } sub getSplittedTime { @@ -3951,12 +3842,14 @@ sub prog_timeline { my $title = $event->{title}; $title =~ s/"/\"/g; + my $progname = $event->{channel_name}; + $progname =~ s/"/\"/g; push(@show, { start => $event->{start}, stop => $event->{stop}, title => $title, subtitle => (($event->{subtitle} && length($event->{subtitle}) > 30) ? substr($event->{subtitle}, 0, 30) . "..." : $event->{subtitle}), - progname => $event->{channel_name}, + progname => $progname, summary => $event->{summary}, vdr_id => $event->{vdr_id}, proglink => sprintf("%s?aktion=prog_list&vdr_id=%s", $MyURL, $event->{vdr_id}), @@ -3964,7 +3857,7 @@ sub prog_timeline { infurl => ($event->{summary} ? sprintf("%s?aktion=prog_detail&epg_id=%s&vdr_id=%s&referer=%s", $MyURL, $event->{event_id}, $event->{vdr_id}, $myself) : undef), recurl => sprintf("%s?aktion=timer_new_form&epg_id=%s&vdr_id=%s&referer=%s", $MyURL, $event->{event_id}, $event->{vdr_id}, $myself), anchor => $event->{event_id}, - timer => (defined $TIM->{ $event->{title} } && $TIM->{ $event->{title} }->{vdr_id} == $event->{vdr_id} && $TIM->{ $event->{title} }->{active} ? 1 : 0), + timer => (defined $TIM->{ $event->{title} } && $TIM->{ $event->{title} }->{vdr_id} == $event->{vdr_id} && $TIM->{ $event->{title} }->{active} ? 1 : 0), #TODO } ); } @@ -3976,23 +3869,15 @@ sub prog_timeline { undef @show; } - my $vars = { usercss => $UserCSS, - shows => $shows, + my $vars = { shows => $shows, shows2 => $shows, now_sec => $event_time, now => strftime("%H:%M", localtime($event_time)), datum => my_strftime("%A, %x", time), nowurl => $MyURL . "?aktion=prog_timeline", - url => $MyURL, - config => \%CONFIG + url => $MyURL }; - - my $template = TemplateNew("prog_timeline.html"); - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("prog_timeline.html", $vars); } ############################################################################# @@ -4025,6 +3910,7 @@ sub prog_summary { my (@show, @shows, @temp); for (keys(%EPG)) { for my $event (@{ $EPG{$_} }) { + next if ($event->{stop} <= $now); if (!$search) { if ($CONFIG{CHANNELS_WANTED_SUMMARY}) { my $f = 0; @@ -4102,8 +3988,8 @@ sub prog_summary { vdr_id => $event->{vdr_id}, proglink => sprintf("%s?aktion=prog_list&vdr_id=%s", $MyURL, $event->{vdr_id}), switchurl => $running ? sprintf("%s?aktion=prog_switch&channel=%s", $MyURL, $event->{vdr_id}) : undef, - streamurl => sprintf("%s%s?aktion=live_stream&channel=%s", $MyStreamBase, $CONFIG{TV_EXT}, $event->{vdr_id}), - stream_live_on => $running ? $CONFIG{ST_FUNC} && $CONFIG{ST_LIVE_ON} : undef, + streamurl => $FEATURES{STREAMDEV} ? sprintf("%s%s?aktion=live_stream&channel=%s", $MyStreamBase, $CONFIG{TV_EXT}, $event->{vdr_id}) : undef, + stream_live_on => $FEATURES{STREAMDEV} && $running ? $CONFIG{ST_FUNC} && $CONFIG{ST_LIVE_ON} : undef, infurl => $event->{summary} ? sprintf("%s?aktion=prog_detail&epg_id=%s&vdr_id=%s&referer=%s", $MyURL, $event->{event_id}, $event->{vdr_id}, $myself) : undef, recurl => sprintf("%s?aktion=timer_new_form&epg_id=%s&vdr_id=%s&referer=%s", $MyURL, $event->{event_id}, $event->{vdr_id}, $myself), find_title => uri_escape("/^" . quotemeta($event->{title} . "~" . ($event->{subtitle} ? $event->{subtitle} : "") . "~") . "/i"), @@ -4152,21 +4038,16 @@ sub prog_summary { # my $label = $next ? gettext("What's on after") : gettext("What's on at"); - my $template = TemplateNew(($view eq "ext" ? "prog_summary.html" : "prog_summary2.html")); - my $vars = { usercss => $UserCSS, - rows => \@show, + my $vars = { rows => \@show, now => $displayed_time, - title => ($search ? gettext("Suitable matches for:") . " <i>" . $search . "</i>" : $label . " " . strftime("%H:%M", localtime($event_time)) . " " . gettext("o'clock")), + title => ($search ? gettext("Suitable matches for:") . " <i>" . $search . "</i>" + : $label . " " . strftime("%H:%M", localtime($event_time)) . " " . gettext("o'clock")), switchview_url => $MyURL . "?aktion=prog_summary&view=" . ($view eq "ext" ? "sml" : "ext") . ($next ? "&next=1" : "") . ($search ? "&search=" . uri_escape($search) : "") . ($time ? "&time=$time" : ""), switchview_text => ($view eq "ext" ? gettext("short view") : gettext("long view")), times => \@times, url => $MyURL }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate($view eq "ext" ? "prog_summary.html" : "prog_summary2.html", $vars); } ############################################################################# @@ -4175,14 +4056,10 @@ sub prog_summary { sub rec_list { my @recordings; - my $desc; - if (!defined($q->param("desc"))) { - $desc = 1; - } else { - $q->param("desc") ? ($desc = 1) : ($desc = 0); - } - my $sortby = $q->param("sortby"); - ($sortby = "name") if (!$sortby); + $CONFIG{REC_DESC} = ($q->param("desc") ? 1 : 0) if (defined($q->param("desc"))); + $CONFIG{REC_SORTBY} = $q->param("sortby") if (defined($q->param("sortby"))); + $CONFIG{REC_SORTBY} = "name" if (!$CONFIG{REC_SORTBY}); + my $parent = $q->param("parent"); my $parent2; if (!$parent) { @@ -4191,7 +4068,7 @@ sub rec_list { $parent = uri_escape($parent); } - ParseRecordings($parent, $sortby, $desc); + ParseRecordings($parent); # create path array my @path; @@ -4233,8 +4110,8 @@ sub rec_list { } # - if ($sortby eq "time") { - if (!$desc) { + if ($CONFIG{REC_SORTBY} eq "time") { + if ($CONFIG{REC_DESC}) { @recordings = sort({ $b->{isfolder} <=> $a->{isfolder} || lc($b->{isfolder} ? $a->{name} : "") cmp lc($a->{isfolder} ? $b->{name} : "") || $b->{time} <=> $a->{time} } @recordings); @@ -4243,8 +4120,8 @@ sub rec_list { lc($b->{isfolder} ? $a->{name} : "") cmp lc($a->{isfolder} ? $b->{name} : "") || $a->{time} <=> $b->{time} } @recordings); } - } elsif ($sortby eq "name") { - if (!$desc) { + } elsif ($CONFIG{REC_SORTBY} eq "name") { + if ($CONFIG{REC_DESC}) { @recordings = sort({ $b->{isfolder} <=> $a->{isfolder} || lc($b->{isfolder} ? $a->{name} : "") cmp lc($a->{isfolder} ? $b->{name} : "") || lc($b->{name}) cmp lc($a->{name}) } @recordings); @@ -4253,8 +4130,8 @@ sub rec_list { lc($b->{isfolder} ? $a->{name} : "") cmp lc($a->{isfolder} ? $b->{name} : "") || lc($a->{name}) cmp lc($b->{name}) } @recordings); } - } elsif ($sortby eq "date") { - if (!$desc) { + } elsif ($CONFIG{REC_SORTBY} eq "date") { + if ($CONFIG{REC_DESC}) { @recordings = sort({ $b->{isfolder} <=> $a->{isfolder} || lc($b->{isfolder} ? $a->{name} : "") cmp lc($a->{isfolder} ? $b->{name} : "") || $b->{sse} <=> $a->{sse} } @recordings); @@ -4264,25 +4141,21 @@ sub rec_list { $a->{sse} <=> $b->{sse} } @recordings); } } - my $cur_desc = $desc; - $desc ? ($desc = 0) : ($desc = 1); + my $toggle_desc = ($CONFIG{REC_DESC} ? 0 : 1); # my ($total, $minutes_total, $free, $minutes_free, $percent) = VideoDiskFree(); my $referer = Encode_Referer($MyURL . "?" . $Query); chomp($referer); - my $template = TemplateNew("rec_list.html"); - my $vars = { usercss => $UserCSS, - recloop => \@recordings, - sortbydateurl => "$MyURL?aktion=rec_list&parent=$parent&sortby=date&parent=$parent&desc=" . (($sortby eq "date") ? $desc : $cur_desc), - sortbytimeurl => "$MyURL?aktion=rec_list&parent=$parent&sortby=time&parent=$parent&desc=" . (($sortby eq "time") ? $desc : $cur_desc), - sortbynameurl => "$MyURL?aktion=rec_list&parent=$parent&sortby=name&parent=$parent&desc=" . (($sortby eq "name") ? $desc : $cur_desc), - sortbydate => ($sortby eq "date") ? 1 : 0, - sortbytime => ($sortby eq "time") ? 1 : 0, - sortbyname => ($sortby eq "name") ? 1 : 0, - desc => $desc, - cur_sorting => "&sortby=$sortby&desc=$cur_desc", + my $vars = { recloop => \@recordings, + sortbydateurl => "$MyURL?aktion=rec_list&parent=$parent&sortby=date&parent=$parent&desc=" . (($CONFIG{REC_SORTBY} eq "date") ? $toggle_desc : $CONFIG{REC_DESC}), + sortbytimeurl => "$MyURL?aktion=rec_list&parent=$parent&sortby=time&parent=$parent&desc=" . (($CONFIG{REC_SORTBY} eq "time") ? $toggle_desc : $CONFIG{REC_DESC}), + sortbynameurl => "$MyURL?aktion=rec_list&parent=$parent&sortby=name&parent=$parent&desc=" . (($CONFIG{REC_SORTBY} eq "name") ? $toggle_desc : $CONFIG{REC_DESC}), + sortbydate => ($CONFIG{REC_SORTBY} eq "date") ? 1 : 0, + sortbytime => ($CONFIG{REC_SORTBY} eq "time") ? 1 : 0, + sortbyname => ($CONFIG{REC_SORTBY} eq "name") ? 1 : 0, + desc => $CONFIG{REC_DESC} ? "desc" : "asc", disk_total => $total, disk_free => $free, disk_percent => $percent, @@ -4295,17 +4168,11 @@ sub rec_list { stream_rec_on => $CONFIG{ST_FUNC} && $CONFIG{ST_REC_ON}, referer => "&referer=$referer" }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("rec_list.html", $vars); } sub ParseRecordings { my $parent = shift; - my $sortby = shift; - my $desc = shift; return if ((time() - $CONFIG{CACHE_REC_LASTUPDATE}) < ($CONFIG{CACHE_REC_TIMEOUT} * 60)); @@ -4444,10 +4311,11 @@ sub ParseRecordings { new => $new, id => $id, delurl => $MyURL . "?aktion=rec_delete&rec_delete=y&id=$id", - editurl => $MyURL . "?aktion=rec_edit&id=$id", + editurl => $FEATURES{REC_RENAME} ? $MyURL . "?aktion=rec_edit&id=$id" : undef, infurl => $MyURL . "?aktion=rec_detail&id=$id", - streamurl => $MyStreamBase . $CONFIG{REC_EXT} . "?aktion=rec_stream&id=$id", - stream_rec_on => $CONFIG{ST_FUNC} && $CONFIG{ST_REC_ON} + playurl => $VDRVERSION >= 10331 ? $MyURL . "?aktion=rec_play&id=$id" : undef, #TODO + cuturl => $VDRVERSION >= 10331 ? $MyURL . "?aktion=rec_cut&id=$id" : undef, #TODO + streamurl => ($CONFIG{ST_FUNC} && $CONFIG{ST_REC_ON}) ? $MyStreamBase . $CONFIG{REC_EXT} . "?aktion=rec_stream&id=$id" : undef } ); } @@ -4530,7 +4398,6 @@ sub getRecInfo { $imdb_title =~ s/^.*\~\%*([^\~]*)$/$1/; $vars = { url => $MyURL, - usercss => $UserCSS, text => $displaytext ? $displaytext : undef, title => $displaytitle ? $displaytitle : undef, subtitle => $displaysubtitle ? $displaysubtitle : undef, @@ -4563,7 +4430,6 @@ sub getRecInfo { $imdb_title =~ s/^.*\~//; $title =~ s/\~/ - /g unless($rename); $vars = { url => $MyURL, - usercss => $UserCSS, text => $text ? $text : "", imdburl => "http://akas.imdb.com/Tsearch?title=" . uri_escape($imdb_title), title => CGI::escapeHTML($title), @@ -4577,12 +4443,7 @@ sub getRecInfo { sub rec_detail { my $vars = getRecInfo($q->param('id')); - my $template = TemplateNew("prog_detail.html"); - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("prog_detail.html", $vars); } sub rec_delete { @@ -4678,13 +4539,8 @@ sub rec_edit { # determine referer (redirect to where we come from) my $ref = getReferer(); - my $template = TemplateNew("rec_edit.html"); my $vars = getRecInfo($q->param("id"), $ref ? Encode_Referer($ref) : undef, "renr"); - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("rec_edit.html", $vars); } sub rec_rename { @@ -4706,6 +4562,22 @@ sub rec_rename { } } +sub rec_play { + my $id = $q->param('id'); + if ($id) { + SendCMD("PLAY $id"); + CloseSocket(); + } +} + +sub rec_cut { + my $id = $q->param('id'); + if ($id) { + SendCMD("EDIT $id"); + CloseSocket(); + } +} + ############################################################################# # configuration ############################################################################# @@ -4725,11 +4597,9 @@ sub config { $CONFIG{$_} = $q->param($_); } } + + ValidConfig(); - $CONFIG{TV_MIMETYPE} = "video/x-mpegurl" if (!$CONFIG{TV_MIMETYPE}); - $CONFIG{TV_EXT} = "m3u" if (!$CONFIG{TV_EXT}); - $CONFIG{REC_MIMETYPE} = "video/x-mpegurl" if (!$CONFIG{REC_MIMETYPE}); - $CONFIG{REC_EXT} = "m3u" if (!$CONFIG{REC_EXT}); LoadTranslation() if ($old_lang ne $CONFIG{LANG}); UptoDate(1) if ($old_epgprune != $CONFIG{EPG_PRUNE} || $old_epgdirect != $CONFIG{EPG_DIRECT} || $old_epgfile ne $CONFIG{EPG_FILENAME}); if ($old_vdrconfdir ne $CONFIG{VDRCONFDIR}) { @@ -4849,10 +4719,7 @@ sub config { } } - my $template = TemplateNew("config.html"); - my $vars = { usercss => $UserCSS, - %CONFIG, - TEMPLATELIST => \@template, + my $vars = { TEMPLATELIST => \@template, ALL_CHANNELS => \@all_channels, SELECTED_CHANNELS => \@selected_channels, LOGINPAGES => \@loginpages, @@ -4862,27 +4729,17 @@ sub config { url => $MyURL, help_url => HelpURL("config") }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("config.html", $vars); } ############################################################################# # remote control ############################################################################# sub rc_show { - my $template = TemplateNew("rc.html"); - my $vars = { usercss => $UserCSS, - url => sprintf("%s?aktion=grab_picture", $MyURL), + my $vars = { url => sprintf("%s?aktion=grab_picture", $MyURL), host => $CONFIG{VDR_HOST} }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("rc.html", $vars); } sub rc_hitk { @@ -4900,6 +4757,11 @@ sub rc_hitk { } sub tv_show { + $CONFIG{TV_INTERVAL} = $q->param("interval") if($q->param("interval")); + $CONFIG{TV_INTERVAL} = "5" unless($CONFIG{TV_INTERVAL}); + $CONFIG{TV_SIZE} = $q->param("size") if($q->param("size")); + $CONFIG{TV_SIZE} = "half" unless($CONFIG{TV_SIZE}); + my ($cur_channel_id, $cur_channel_name); for (SendCMD("chan")) { ($cur_channel_id, $cur_channel_name) = split(" ", $_, 2); @@ -4920,21 +4782,15 @@ sub tv_show { push(@chans, $chan); } - my $template = TemplateNew("tv.html"); my $vars = { tv_only => $q->param("tv_only") ? $q->param("tv_only") : undef, - interval => $q->param("interval") ? $q->param("interval") : 5, - size => $q->param("size") ? $q->param("size") : "half", - usercss => $UserCSS, - new_win => ($q->param("new_win") && $q->param("new_win") eq "1") ? "1" : undef, + interval => $CONFIG{TV_INTERVAL}, + size => $CONFIG{TV_SIZE}, + new_win => ($q->param("new_win") && $q->param("new_win") eq "1") ? "1" : undef, url => sprintf("%s?aktion=grab_picture", $MyURL), channels => \@chans, host => $CONFIG{VDR_HOST} }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("tv.html", $vars); } sub tv_switch { @@ -4947,50 +4803,48 @@ sub tv_switch { sub show_help { my $area = $q->param("area"); my $filename = "help_" . $area . ".html"; - $CONFIG{TEMPLATE} = "default" if (!$CONFIG{TEMPLATE}); if (!-e "$TEMPLATEDIR/$CONFIG{TEMPLATE}/$filename") { $filename = "help_no.html"; } - my $template = TemplateNew($filename); - my $vars = { usercss => $UserCSS, - area => $area + my $vars = { area => $area }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate($filename, $vars); } ############################################################################# # information ############################################################################# sub about { - my $template = TemplateNew("about.html"); + my $missing_features = "RENR" unless ($FEATURES{REC_RENAME}); + unless ($FEATURES{STREAMDEV}) { + $missing_features .= ", " if ($missing_features); + $missing_features .= "streamdev-client plugin"; + } + my $vars = { vdrversion => $VDRVERSION_HR, myversion => $VERSION, - usercss => $UserCSS + missing_features => $missing_features }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("about.html", $vars); } ############################################################################# # experimental ############################################################################# sub grab_picture { - my $size = $q->param("size") ? $q->param("size") : "half"; + $CONFIG{TV_INTERVAL} = $q->param("interval") if($q->param("interval")); + $CONFIG{TV_INTERVAL} = "5" unless($CONFIG{TV_INTERVAL}); + $CONFIG{TV_SIZE} = $q->param("size") if($q->param("size")); + $CONFIG{TV_SIZE} = "half" unless($CONFIG{TV_SIZE}); + my $maxwidth = 768; my $maxheight = 576; my ($width, $height); - if ($size eq "full") { + if ($CONFIG{TV_SIZE} eq "full") { ($width, $height) = ($maxwidth, $maxheight); - } elsif ($size eq "half") { + } elsif ($CONFIG{TV_SIZE} eq "half") { ($width, $height) = ($maxwidth / 2, $maxheight / 2); - } elsif ($size eq "quarter") { + } elsif ($CONFIG{TV_SIZE} eq "quarter") { ($width, $height) = ($maxwidth / 4, $maxheight / 4); } else { ($width, $height) = ($maxwidth / 4, $maxheight / 4); @@ -5055,21 +4909,16 @@ sub vdr_cmds { @show_output = run_svdrpcmd() if ($q->param("run_svdrpcmd")); my $svdrp_cmd = "help"; $svdrp_cmd = $q->param("svdrp_cmd") if ($q->param("svdrp_cmd")); - my $template = TemplateNew("vdr_cmds.html"); + my $vars = { url => sprintf("%s?aktion=vdr_cmds", $MyURL), commands => \@vdrcmds, show_output => \@show_output, max_lines => $q->param("max_lines") ? $q->param("max_lines") : 20, svdrp_cmd => $svdrp_cmd, - vdr_cmd => $q->param("vdr_cmd") ? $q->param("vdr_cmd") : undef, - usercss => $UserCSS + vdr_cmd => $q->param("vdr_cmd") ? $q->param("vdr_cmd") : undef }; - $template->param($vars); - my $output; - my $out = $template->output; - $Xtemplate->process(\$out, $vars, \$output) || return (header("500", "text/html", $Xtemplate->error())); - return (header("200", "text/html", $output)); + return showTemplate("vdr_cmds.html", $vars); } sub run_vdrcmd { @@ -5173,14 +5022,33 @@ sub myconnect { ) || main::HTMLError(sprintf($ERROR_MESSAGE{connect_failed}, $CONFIG{VDR_HOST}, $CONFIG{VDR_PORT})) && return; + $connected = true; my $line; $line = <$SOCKET>; if (!$VDRVERSION) { $line =~ /^220.*VideoDiskRecorder (\d+)\.(\d+)\.(\d+).*;/; $VDRVERSION_HR = "$1.$2.$3"; $VDRVERSION = ($1 * 10000 + $2 * 100 + $3); + getSupportedFeatures($this); + } +} + +sub getSupportedFeatures { + my $this = shift; + if ($VDRVERSION >= 10331) { + command($this, "plug"); + while ($_ = readoneline($this)) { + if ($_ =~ /^streamdev-server/) { + $FEATURES{STREAMDEV} = 1; + } + } + } + command($this, "help"); + while ($_ = readoneline($this)) { + if ($_ =~ /\sRENR\s/) { + $FEATURES{REC_RENAME} = 1; + } } - $connected = true; } sub close { @@ -5259,4 +5127,11 @@ sub readoneline { # ############################################################################# +# Local variables: +# indent-tabs-mode: nil +# cperl-indent-level: 4 +# perl-indent-level: 4 +# tab-width: 4 +# End: + # EOF |