diff --git a/CONTROL/control b/CONTROL/control
index 2b8eb31..2e5023a 100644
--- a/CONTROL/control
+++ b/CONTROL/control
@@ -1,10 +1,10 @@
Package: webif
Priority: optional
Section: web
-Version: 1.4.0
+Version: 1.4.0-1
Architecture: mipsel
Maintainer: af123@hpkg.tv
-Depends: tcpfix,webif-channelicons(>=1.1.24),lighttpd(>=1.4.39-1),jim(>=0.77),jim-oo(>=0.77),jim-sqlite3(>=0.76),jim-cgi(>=0.7-1),jim-binary(>=0.76),service-control(>=2.3),busybox(>=1.20.2-1),lsof(>=4.87),epg(>=1.2.5),hmt(>=2.0.10),ssmtp,cron-daemon(>=1.18.3-3),at(>=3.1.18),anacron,trm(>=1.1),openssl-command,nicesplice,id3v2,file,rsvsync(>=1.1.10),webif-charts(>=1.2-1),stripts(>=1.2.5-3),tmenu(>=1.21-2),ffmpeg,id3v2,multienv(>=1.6),tcpping(>=1.1),e2fsprogs,wireless-tools(>=29-1),dbupdate,recmon(>=2.0.7),hwctl,nugget(>=0.95),sqlite3(>=3.15.1)
+Depends: tcpfix,webif-channelicons(>=1.1.25),lighttpd(>=1.4.39-1),jim(>=0.77),jim-oo(>=0.77),jim-sqlite3(>=0.76),jim-cgi(>=0.7-1),jim-binary(>=0.76),service-control(>=2.3),busybox(>=1.20.2-1),lsof(>=4.87),epg(>=1.2.5),hmt(>=2.0.10),ssmtp,cron-daemon(>=1.18.3-3),at(>=3.1.18),anacron,trm(>=1.1),openssl-command,nicesplice,id3v2,file,rsvsync(>=1.1.10),webif-charts(>=1.2-1),stripts(>=1.2.5-3),tmenu(>=1.21-2),ffmpeg,id3v2,multienv(>=1.6),tcpping(>=1.1),e2fsprogs,wireless-tools(>=29-1),dbupdate,recmon(>=2.0.7),hwctl,nugget(>=0.95),sqlite3(>=3.15.1)
Suggests:
Description: An evolving web interface for the Humax.
Tags: http://hummy.tv/forum/threads/7619/
diff --git a/webif/html/diag/queue/fetch.jim b/webif/html/diag/queue/fetch.jim
index 6143f9f..7e7399b 100755
--- a/webif/html/diag/queue/fetch.jim
+++ b/webif/html/diag/queue/fetch.jim
@@ -8,6 +8,7 @@ httpheader "application/json"
set s [settings]
set autolast [$s autolast]
set autofreq [$s autofreq]
+if {$autofreq == 0} { set autofreq 10 }
puts "{"
puts " \"autofreq\": \"$autofreq\","
puts " \"autolast\": \"[clock format $autolast] ([clock format [expr \
diff --git a/webif/html/img/queuep.png b/webif/html/img/queuep.png
index 8bf27b3..2685835 100644
Binary files a/webif/html/img/queuep.png and b/webif/html/img/queuep.png differ
diff --git a/webif/html/img/queuep128.png b/webif/html/img/queuep128.png
new file mode 100644
index 0000000..8bf27b3
Binary files /dev/null and b/webif/html/img/queuep128.png differ
diff --git a/webif/html/settings/modules/advanced/settings.hook b/webif/html/settings/modules/advanced/settings.hook
index 92ad15a..afcf097 100755
--- a/webif/html/settings/modules/advanced/settings.hook
+++ b/webif/html/settings/modules/advanced/settings.hook
@@ -40,22 +40,8 @@ puts "
"
-puts -nonewline "
-
-
-
-"
+setting_number logkeep "How many rotated logs to keep" $logkeep \
+ 1 100
if {[system modversion 1] >= 214} {
setting_toggle "Disable telnet menu?" "xtelnet" \
diff --git a/webif/html/settings/modules/auto/settings.hook b/webif/html/settings/modules/auto/settings.hook
index 75d8f60..c08bac5 100755
--- a/webif/html/settings/modules/auto/settings.hook
+++ b/webif/html/settings/modules/auto/settings.hook
@@ -81,7 +81,7 @@ setting_number autokeep \
"How many days should completed entries stay in the queue?" $autokeep \
1 365
-setting_toggle "Show queue icon in toolbar?" "toolbarqueue" $toolbarqueue
+setting_toggle "Show queue icon in menu/toolbar?" "toolbarqueue" $toolbarqueue
puts {
diff --git a/webif/include/menuicons.jim b/webif/include/menuicons.jim
index 79d0ad8..9e2ea1a 100755
--- a/webif/include/menuicons.jim
+++ b/webif/include/menuicons.jim
@@ -3,23 +3,28 @@
source /mod/webif/lib/setup
require system.class settings.class plugin
+set settings [settings]
+
+set menuwrap 4
+
proc menuitem {title icon link {width 217} {height 0} {extra ""}} {{num 0}} {
+ global menuwrap
if {$title eq "-reset"} {
set num 0
return
}
- incr num
if {$title eq ""} return
- if {$num > 4} {
- puts {}
- set num 1
- }
+# incr num
+# if {$num > $menuwrap} {
+# puts {
}
+# set num 1
+# }
if {$extra ne ""} { append extra " " }
puts -nonewline "
-
@@ -34,8 +39,6 @@ proc menuitem {title icon link {width 217} {height 0} {extra ""}} {{num 0}} {
"
}
-set settings [settings]
-
puts {}
menuitem "Browse Media Files" "/images/323_1_10_Menu_Video.png" \
@@ -63,6 +66,11 @@ menuitem "Settings" "/images/326_1_00_Menu_Settings.png" \
menuitem "Diagnostics" "/img/diagnostics.png" \
/go/mm_diag 217 228
+if {[[settings] toolbarqueue]} {
+ menuitem "Queue" "/img/queuep.png" \
+ "/go/mm_queue" 217 228
+}
+
eval_plugins menu
puts {
}
diff --git a/webif/include/toolbar.jim b/webif/include/toolbar.jim
index aa1a442..59f0ebf 100755
--- a/webif/include/toolbar.jim
+++ b/webif/include/toolbar.jim
@@ -40,7 +40,7 @@ tb "/img/packages.png" "Packages" "/go/mm_pkg"
tb "/images/326_1_00_Menu_Settings.png" "Settings" "/go/mm_settings"
tb "/img/diagnostics.png" "Diag" "/go/mm_diag"
if {[[settings] toolbarqueue]} {
- tb "/img/queuep.png" "Queue" "/go/mm_queue"
+ tb "/img/queuep128.png" "Queue" "/go/mm_queue"
}
eval_plugins toolbar
diff --git a/webif/lib/auto/plugin/decrypt/queue.hook b/webif/lib/auto/plugin/decrypt/queue.hook
index 8cdcee3..7db29d1 100644
--- a/webif/lib/auto/plugin/decrypt/queue.hook
+++ b/webif/lib/auto/plugin/decrypt/queue.hook
@@ -53,11 +53,17 @@ proc ::decrypt::dequeue {q ts} {
"Already decrypted but the HMT flag was wrong (fixed)"}
}
+ lassign [$ts dlnaloc "127.0.0.1"] url
+
if {[$ts flag "Encrypted"]} {
- return {"DEFER" "Protected (Enc flag)"}
+ #return {"DEFER" "Protected (Enc flag)"}
+ # Unset the flag but use the DLNA helper to decrypt
+ # this file since the DLNA database will be wrong.
+ log " $file - ENC flag set, using helper."
+ $ts unenc
+ set url ""
}
- lassign [$ts dlnaloc "127.0.0.1"] url
if {$url ne ""} {
log " $file - has been indexed."
set helper 0
diff --git a/webif/lib/bin/auto b/webif/lib/bin/auto
deleted file mode 100755
index 26a698e..0000000
--- a/webif/lib/bin/auto
+++ /dev/null
@@ -1,1009 +0,0 @@
-#!/mod/bin/jimsh
-
-exit
-
-# No longer used, see /mod/webif/lib/auto/
-
-###source /mod/webif/lib/setup
-###require lock system.class ts.class pretty_size browse.class \
-### safe_delete settings.class plugin queue.class rsv.class
-###
-###set settings [settings]
-###set loglevel [$settings autolog]
-###set audiomp3 [$settings audiomp3]
-###
-###set modules {decrypt dedup shrink mpg mp3 expire}
-###
-###set queue_actions {
-### decrypt do_decrypt
-### strip do_shrink
-### shrink do_shrink
-### mpg do_mpg
-### mp3 do_mp3
-###}
-###
-###set root [system mediaroot]
-###
-###set logfile "/mod/tmp/auto.log"
-###
-###set logfd "unset"
-###set logprefix ""
-###set prelocked 0
-###set earlyexit 0
-###while {[llength $argv]} {
-### switch -- [lindex $argv 0] {
-### -d {
-### set loglevel 2
-### set logfd stdout
-### }
-### -prelocked {
-### set prelocked 1
-### }
-### -logprefix {
-### set argv [lrange $argv 1 end]
-### if {[llength $argv]} {
-### set logprefix [lindex $argv 0]
-### }
-### }
-### -test {
-### set earlyexit 1
-### }
-### default {
-### # Pass to rest of script.
-### break
-### }
-### }
-### set argv [lrange $argv 1 end]
-###}
-###
-###set manualrun $([llength $argv] > 0)
-###if {$loglevel > 1} {
-### if {$logfd ne "unset"} {
-### puts $logfd "Manual run: $manualrun"
-### }
-###}
-###
-############################################################################
-###
-#### Acquire lock
-###if {$logfd ne "unset"} {
-### puts $logfd "Acquiring lock..."
-###}
-###if {!$prelocked && ![acquire_lock webif_auto]} {
-### if {$loglevel > 1} {
-### system plog auto "Could not acquire lock."
-### }
-### puts "Could not acquire exclusive lock, terminating."
-### exit
-###}
-###
-#### Rotate log file if large enough.
-###if {[file exists $logfile] && [file size $logfile] > 2097152} {
-### file copy -force $logfile "/mod/tmp/auto_old.log"
-### file delete $logfile
-###}
-###
-#### Open log file
-###if {$logfd eq "unset"} {
-### set logfd [open "/mod/tmp/auto.log" "a+"]
-###}
-###
-############################################################################
-###
-###proc log {msg {level 1}} {
-### if {$level > $::loglevel} return
-### puts $::logfd "[system logtimestamp] - $::logprefix$msg"
-### flush $::logfd
-###}
-###
-###proc oktorun {} {
-### global settings
-###
-### set now [clock seconds]
-###
-### # Ongoing scheduled recording
-### if {[$settings noautorec]} {
-### # Use redring helper files if available.
-### set recs [glob -nocomplain /tmp/.rec*]
-### set events [rsv list tbl_reservation \
-### " where ersvtype = 3
-### and nsttime - ulPreOffset <= $now
-### and nsttime + nduration + ulPostOffset >= $now "]
-### if {[llength $recs] || [llength $events]} {
-### log "Aborted, recording in progress." 2
-### exit
-### }
-### }
-###
-### # Imminent recording
-### if {[$settings noautorecimm]} {
-### set autorecperiod $([$settings autorecperiod] * 60)
-### set events [rsv list tbl_reservation \
-### " where ersvtype = 3
-### and nsttime - $now < $autorecperiod
-### and nsttime > $now "]
-### if {[llength $events]} {
-### set event [lindex $events 0]
-### log [concat \
-### "Aborted, will record '[$event name]' " \
-### "on [$event channel_name] at " \
-### "[clock format [$event get nsttime] -format {%H:%M}]" \
-### ] 2
-### exit
-### }
-### }
-###
-### # Non-running hours
-### set hour $([clock format [clock seconds] -format %H] + 0)
-### if {$hour in [$settings noautohours]} {
-### log "Aborted, not running during hour $hour" 2
-### exit
-### }
-###}
-###
-###proc dsc {{size 0}} {
-### set free [system diskfree]
-###
-### # Required disk space is 1GiB + 3 times the file size.
-### set req $($size * 3 + 1073741824)
-###
-### if {$free < $req} {
-### log "Insufficient disk space. Require=$req, Free=$free" 0
-### exit
-### }
-###}
-###
-#### Determine if it's time to run
-###
-###if {[system uptime] < 180} {
-### log "Aborting, system has just booted." 2
-### exit
-###}
-###
-###dsc
-###oktorun
-###if {!$manualrun} {
-### set autofreq [$settings autofreq]
-### if {$autofreq == 0} { set autofreq 20 }
-###
-### set timesincelast $(([clock seconds] - [$settings autolast]) / 60)
-### if {![queue size] && $timesincelast < $autofreq} {
-### log "Aborting, not yet time to run." 2
-### log " elapsed (minutes): $timesincelast (<$autofreq)" 2
-### exit
-### }
-###}
-###
-###if {$earlyexit} {
-### if {!$manualrun} {
-### $settings autolast [clock seconds]
-### }
-### puts "Early exit."
-### exit
-###}
-###
-############################################################################
-###
-###proc inuse {ts} {
-### set retries 5
-### while {$retries > 0 && [$ts inuse]} {
-### log "inuse($retries) - [$ts get file]"
-### incr retries -1
-### sleep 1
-### }
-### return [$ts inuse]
-###}
-###
-###proc specialdir {dir} {
-### if {[string match {\[*} [string trimleft [file tail $dir]]]} {
-### return 1
-### }
-### return 0
-###}
-###
-###proc elapsed {start} {
-### return $(([clock milliseconds] - $start) / 1000.0)
-###}
-###
-###proc startclock {} {
-### set ::startclock_s [clock milliseconds]
-###}
-###
-###proc endclock {size} {
-### set el [elapsed $::startclock_s]
-### set rate $($size / $el)
-### return "[pretty_size $size] in $el seconds - [pretty_size $rate]/s"
-###}
-###
-###foreach mod $modules {
-### set "hook_pre${mod}scan" {}
-### set "hook_pre$mod" {}
-### set "hook_post$mod" {}
-### set "hook_post${mod}scan" {}
-### set "hook_pre${mod}singledir" {}
-### set "hook_post${mod}singledir" {}
-###}
-###
-###proc register {type fn {priority 50}} {
-### global "hook_$type"
-### if {[info exists "hook_$type"]} {
-### lappend "hook_$type" [list $fn $priority]
-### log "Registered $fn for $type hook with priority $priority."
-### } else {
-### log "Unknown hook hook_$type" 0
-### }
-###}
-###
-###proc register_queue {action function} {
-### set ::queue_actions($action) $function
-###}
-###
-###proc runplugin {name {ts 0}} {
-### set var "hook_$name"
-### global $var
-### foreach p [lsort -index end -decreasing -integer [subst $$var]] {
-### lassign $p fn priority
-### log "Running $name plugin $fn (priority $priority) \[$ts]" 2
-### if {[catch {uplevel 1 [list $fn $ts]} msg]} {
-### log "Plugin error: $msg" 0
-### foreach {proc file line} [info stacktrace] {
-### log " @ $file:$proc:$line" 0
-### }
-### }
-### log "Completed $name plugin $fn" 2
-### }
-###}
-###
-############################################################################
-###
-###eval_plugins auto 1
-###
-###set scanstart [clock milliseconds]
-###log "-------------------------------------------------------"
-###
-#### dlnastatus is relatively expensive so it is checked once globally at
-#### the start and then if the server is not listening then no decrypt
-#### operations will be attempted for this run, even if the server starts
-#### up halfway through. Otherwise the server is checked for every decryption
-#### and if it goes away then decryption will not be attempted for the rest
-#### of the run.
-###if {[system dlnastatus]} {
-### set dlnaok 1
-### log "DLNA Server is running." 2
-###} else {
-### set dlnaok 0
-### log "DLNA Server is NOT running." 2
-### if {[system instandby]} {
-### log "System is in standby." 2
-### } elseif {[system param DMS_START_ON] ne "1"} {
-### log "DLNA is disabled." 2
-### } else {
-### log "Giving DLNA more time to start..." 2
-### loop x 0 10 {
-### sleep 10
-### if {[system dlnastatus]} {
-### set dlnaok 1
-### log "DLNA Server is running." 2
-### break
-### }
-### log "DLNA Server not yet running, waiting..." 2
-### }
-### }
-###}
-###
-###log "Auto processing starting, DLNA server status: $dlnaok"
-###
-###dsc
-###
-###set tmp "/mod/tmp/webif_auto"
-###if {![file exists $tmp]} {
-### if {[catch {file mkdir $tmp} msg]} {
-### log "Cannot create temporary directory - $tmp ($msg)" 0
-### exit
-### }
-###} elseif {![file isdirectory $tmp]} {
-### log "Cannot create temporary directory - $tmp (file exists)" 0
-### exit
-###}
-###
-#### Clean-up the temporary directory
-###foreach file [readdir -nocomplain $tmp] { file tdelete "$tmp/$file" }
-###
-###if {[system pkginst undelete]} {
-### set dustbin "[system dustbin]"
-###} else {
-### set dustbin ""
-###}
-###
-###log "Dustbin: $dustbin" 2
-###
-###set recalc 0
-###
-###proc dorecalc {dir} {
-### global recalc
-### if {!$recalc} return
-### log "Running unwatched recalculation for $dir" 2
-### ts resetnew $dir
-### incr recalc -1
-###}
-###
-###proc dedup {dir {flag ""}} {
-### log "DEDUP: \[$dir]" 2
-### loop i 0 1 {
-### foreach line [split \
-### [exec /mod/webif/html/dedup/dedup -yes -auto $dir] "\n"] {
-### log $line 2
-### }
-### }
-### incr ::recalc
-###}
-###
-###proc do_shrink {ts} {
-### global tmp dustbin tsgroup processed_files
-### set file [$ts get file]
-###
-### if {[$ts flag "Shrunk"]} {
-### log " $file - already shrunk." 2
-### return
-### }
-###
-### # If the directory is flagged for decryption as well as shrink
-### # then check to see if decryption has already occured. If not,
-### # defer the shrink for now.
-### set dir [file dirname $file]
-### if {[file exists "$dir/.autodecrypt"] || [scanup $dir decrypt] == 1} {
-### log " $dir is also set for decryption." 2
-### if {[$ts flag "ODEncrypted"]} {
-### log " $file - deferring shrink until decrypted."
-### return
-### }
-### }
-###
-### set file [file rootname [$ts get file]]
-###
-### if {[inuse $ts]} {
-### log " $file - in use." 2
-### return
-### }
-###
-### if {[catch {
-### set perc [exec /mod/bin/stripts -aq $file]
-### } msg]} {
-### log " Error: $msg" 0
-### return
-### }
-### if {[string match {*%} $perc]} {
-### set perc [string range $perc 0 end-1]
-### } else {
-### set perc 0
-### }
-###
-### if {$perc == 0} {
-### log " $file - already shrunk." 2
-### $ts set_shrunk
-### return
-### }
-### oktorun
-### set size [$ts size]
-### dsc $size
-### system startop shrink [$ts get file]
-### runplugin preshrink $ts
-### startclock
-### log " SHRINK: $file" 0
-### log " Estimate $perc% saving." 0
-### log " Shrinking..." 0
-### if {[catch {
-### foreach line [split \
-### [exec nice -n 19 /mod/bin/stripts -q $file $tmp/shrunk] \
-### "\n"] {
-### log $line 0
-### }
-### } msg]} {
-### log "Error during shrink: $msg" 0
-### system notify "$file - auto-shrink - error $msg."
-### system endop shrink
-### return
-### }
-###
-### # The following steps are structured to minimise the risk of
-### # things being left in an inconsistent state if the system goes
-### # into standby. Renames within the same filesystem are very
-### # quick so the risk is small, but even so...
-###
-### # Move the shrunken version back to the local directory.
-### foreach f [glob "$tmp/shrunk.*"] {
-### set ext [file extension $f]
-### file rename $f "${file}_shrunk${ext}"
-### # Set the file time to match the old file
-### file touch "${file}_shrunk${ext}" [$ts get file]
-### }
-###
-### # Remove the old recording (-> bin if undelete is installed)
-### safe_delete [$ts get file] "webif_autoshrink"
-###
-### # Finally, rename the shrunken recording again.
-### foreach ext $tsgroup {
-### set f "${file}_shrunk.$ext"
-### if {[file exists $f]} {
-### file rename $f "${file}.$ext"
-### }
-### }
-### $ts set_shrunk
-### log "Done... [endclock $size]" 0
-### lappend processed_files [$ts get file]
-### runplugin postshrink $ts
-### system endop shrink
-###}
-###
-###proc do_decrypt {ts} {
-### global tmp dustbin processed_files
-###
-### set file [$ts get file]
-### set rfile [file rootname $file]
-### set bfile [file tail $file]
-###
-### if {![$ts flag "ODEncrypted"]} {
-### log " $file - Already decrypted." 2
-### return
-### }
-###
-### if {[$ts flag "Encrypted"]} {
-### log " $file - Protected (Enc flag)." 2
-### return
-### }
-###
-### if {![system dlnastatus]} {
-### log " $file - DLNA Server not running." 2
-### set ::dlnaok 0
-### return
-### }
-###
-### if {[inuse $ts]} {
-### log " $file - In use."
-### return
-### }
-###
-### # Check that the file is not already decrypted by analysing it.
-### set anencd [exec /mod/bin/stripts -qE $rfile]
-### if {$anencd != "1"} {
-### log " $file - already decrypted but the HMT flag is wrong." 0
-### # Fix...
-### exec /mod/webif/lib/bin/fixencflags $file
-### return
-### }
-###
-### lassign [$ts dlnaloc "127.0.0.1"] url
-### if {$url ne ""} {
-### log " $file - has been indexed."
-### set helper 0
-### } else {
-### log " $file - Not yet indexed, trying helper."
-### if {[catch {
-### lassign [system dlnahelper [file normalize $file]] url
-### } msg]} {
-### log " $file - $msg"
-### }
-### if {$url eq ""} {
-### log " $file - Can't use helper."
-### return
-### }
-### set helper 1
-### }
-###
-### # Perform the decryption by requesting the file from the DLNA server.
-### oktorun
-### set size [$ts size]
-### dsc $size
-### runplugin predecrypt $ts
-### system startop decrypt $file
-### startclock
-### log " DECRYPT: $rfile" 0
-### log " DLNA: $url" 0
-### exec wget -O "$tmp/$bfile" $url
-###
-### # Release the helper lock once finished.
-### if {$helper} { system dlnahelper -release }
-###
-### if {[file size $file] != [file size "$tmp/$bfile"]} {
-### log " $file - File size mismatch." 0
-### file tdelete "$tmp/$bfile"
-### system endop decrypt
-### return
-### }
-###
-### # Check if the file is in use. It is possible that the file is
-### # now being played even though it was free when decryption started.
-### if {[inuse $ts]} {
-### log " $file - In use."
-### file tdelete "$tmp/$bfile"
-### system endop decrypt
-### return
-### }
-###
-### # Copy the HMT file over for stripts
-### set thmt "$tmp/[file rootname $bfile].hmt"
-### file copy "$rfile.hmt" $thmt
-### # Check that the file is no longer encrypted by analysing it.
-### set anencd [exec /mod/bin/stripts -qE "$tmp/[file rootname $bfile]"]
-### file delete $thmt
-###
-### if {$anencd != "0"} {
-### log " $file - File did not decrypt properly." 0
-### file tdelete "$tmp/$bfile"
-### if {[clock seconds] - [$ts get end] > 3 * 3600} {
-### system notify "$file - auto-decrypt failed."
-### }
-### system endop decrypt
-### return
-### }
-###
-### # Move the encrypted file out of the way.
-### file rename $file "$rfile.encrypted"
-### # Move the decrypted copy into place.
-### file rename "$tmp/$bfile" $file
-### # Set the file time to match the old file
-### file touch $file "$rfile.encrypted"
-### # Patch the HMT - quickest way to get back to a playable file.
-### exec /mod/bin/hmt -encrypted "$rfile.hmt"
-###
-### log " Removing/binning old copy." 0
-### # Move the old recording to the bin if undelete is installed.
-### if {$dustbin ne ""} {
-### set bin [_del_bindir $file "webif_autodecrypt"]
-### set tail [file tail $rfile]
-### file rename "$rfile.encrypted" "$bin/$tail.ts"
-### foreach ext {nts hmt thm} {
-### if {[file exists "$rfile.$ext"]} {
-### file copy $rfile.$ext "$bin/$tail.$ext"
-### if {$ext eq "hmt"} {
-### # Patch the binned HMT back
-### exec /mod/bin/hmt +encrypted \
-### "$bin/$tail.hmt"
-### }
-### }
-### }
-### } else {
-### file tdelete "$rfile.encrypted"
-### }
-### log "Done... [endclock $size]" 0
-### lappend processed_files [$ts get file]
-### $ts unflag "ODEncrypted"
-### runplugin postdecrypt $ts
-### system endop decrypt
-###}
-###
-###proc do_mpg {ts} {
-### global tmp tsgroup processed_files
-###
-### set file [file rootname [$ts get file]]
-###
-### if {[file exists $file.mpg]} {
-### # Already done.
-### return
-### }
-###
-### if {[$ts flag "ODEncrypted"]} {
-### log " $file - Not decrypted." 2
-### return
-### }
-###
-### if {[$ts get definition] eq "HD"} {
-### # Cannot extract a useful MPG from a HD recording.
-### return
-### }
-###
-### if {[inuse $ts]} {
-### log " $file - In use."
-### return
-### }
-### oktorun
-### system startop mpg [$ts get file]
-### runplugin prempg $ts
-### dsc [$ts size]
-###
-### log " MPG: $file" 0
-### log " Converting..." 0
-### if {[catch {
-### foreach line [split \
-### [exec nice -n 19 /mod/bin/ffmpeg -y -benchmark -v 0 \
-### -i $file.ts \
-### -map 0:0 -map 0:1 \
-### -vcodec copy -acodec copy $tmp/mpg.mpg] "\n"] {
-### log $line 0
-### }
-### } msg]} {
-### log "Error during mpg extract: $msg" 0
-### system notify "$file - auto-mpg - error $msg."
-### system endop mpg
-### return
-### }
-###
-### # Move the MPG into the local directory
-### file rename $tmp/mpg.mpg $file.mpg
-### lappend processed_files [$ts get file]
-### runplugin postmpg $ts
-### system endop mpg
-###}
-###
-###proc do_mp3 {ts} {
-### global tmp tsgroup processed_files
-###
-### set file [file rootname [$ts get file]]
-###
-### if {[file exists $file.mp3]} {
-### # Already done.
-### return
-### }
-###
-### if {[$ts flag "ODEncrypted"]} {
-### log " $file - Not decrypted." 2
-### return
-### }
-###
-### if {[$ts get definition] eq "HD"} {
-### # Cannot extract a useful MP3 from a HD recording.
-### log " $file - High definition." 2
-### return
-### }
-###
-### if {[inuse $ts]} {
-### log " $file - In use."
-### return
-### }
-### oktorun
-### system startop mp3 [$ts get file]
-### runplugin premp3 $ts
-### dsc [$ts size]
-###
-### log " MP3: $file" 0
-### log " Converting... [$::settings audiomp3descr $::audiomp3]" 0
-### if {[catch {
-### set cmd [list nice -n 19 \
-### /mod/bin/ffmpeg -y -benchmark -v 0 -i "$file.ts" \
-### -f mp3 -vn]
-### if {!$::audiomp3} { lappend cmd -acodec copy }
-### lappend cmd "$tmp/mp3.mp3"
-### foreach line [split [exec {*}$cmd] "\n"] {
-### log $line 0
-### }
-### } msg]} {
-### log "Error during mp3 extract: $msg" 0
-### system notify "$file - auto-mp3 - error $msg."
-### system endop mp3
-### return
-### }
-###
-### if {[system pkginst id3v2]} {
-### log [exec /mod/bin/id3v2 \
-### --song "[$ts get title]" \
-### --comment "[$ts get synopsis]" \
-### --album "[$ts get channel_name]" \
-### --year "[clock format [$ts get start] -format {%Y}]" \
-### "$tmp/mp3.mp3"] 0
-### }
-###
-### # Move the MP3 into the local directory
-### file rename $tmp/mp3.mp3 $file.mp3
-### lappend processed_files [$ts get file]
-### runplugin postmp3 $ts
-### system endop mp3
-###}
-###
-###proc entries {dir callback {flag ""}} {
-### foreach entry [readdir -nocomplain $dir] {
-### if {$flag ne "" && ![file exists $flag]} {
-### log "Flag $flag disappeared mid-run, aborting." 0
-### break
-### }
-### if {![string match {*.ts} $entry]} continue
-### if {[catch {set ts [ts fetch "$dir/$entry"]}]} continue
-### if {$ts == 0} continue
-### $callback $ts
-### }
-###}
-###
-###proc shrink {dir {flag ""}} {
-### log "SHRINK: \[$dir]" 2
-### entries $dir do_shrink $flag
-###}
-###
-###proc decrypt {dir {flag ""}} {
-### log "DECRYPT: \[$dir]" 2
-### if {$::dlnaok} { entries $dir do_decrypt $flag }
-###}
-###
-###proc mpg {dir {flag ""}} {
-### log "MPG: \[$dir]" 2
-### entries $dir do_mpg $flag
-###}
-###
-###proc mp3 {dir {flag ""}} {
-### log "MP3: \[$dir]" 2
-### entries $dir do_mp3 $flag
-###}
-###
-###proc expire {dir {flag ""}} {
-### log "EXPIRE: \[$dir]" 2
-###
-### # type 0 keep {} days 2 keepnew 0
-### set ax [dir expiry $dir]
-### log " $ax" 2
-### if {![string is integer -strict $ax(keep)]} { set ax(keep) 0 }
-### if {![string is integer -strict $ax(days)]} { set ax(days) 0 }
-###
-### if {!$ax(keep) && !$ax(days)} {
-### log "Expire error ($dir): neither keep nor days set ($ax)" 0
-### return
-### }
-###
-### if {$ax(type) eq "0"} {
-### set getter [lambda {ts} { list [$ts get end] }]
-### } else {
-### set getter [lambda {ts} { list [$ts lastmod] }]
-### }
-###
-### set entries [lsort \
-### -command [lambda {a b} {upvar getter g; expr [$g $a] - [$g $b]}]\
-### [lmap i [readdir -nocomplain $dir] {
-### if {![string match {*.ts} $i]} continue
-### if {[catch {set ts [ts fetch "$dir/$i"]}]} continue
-### if {$ts == 0} continue
-### list $ts
-### }]]
-###
-### # Entries are now sorted with oldest first, according to the selected
-### # criterion.
-###
-### set num [llength $entries]
-### log " Entries: $num" 2
-### foreach e $entries { log " [file tail [$e get file]]" 2 }
-###
-### set now [clock seconds]
-### foreach ts $entries {
-### set file [$ts get file]
-### if {$num <= $ax(keep)} {
-### log " Remaining ($num) <= keep ($ax(keep))" 2
-### break
-### }
-### log " [file tail $file]"
-### if {[inuse $ts]} {
-### log " In use, skipping."
-### continue
-### }
-### if {$ax(keepnew) ne "0" && [$ts flag New]} {
-### log " Unwatched, skipping."
-### continue
-### }
-### if {$ax(days) > 0} {
-### # Calculate age in days
-### set age $(($now - [$getter $ts]) / 86400.0)
-### log " $age days (cf. $ax(days))"
-### if {$age < $ax(days)} {
-### log " Too new, skipping."
-### continue
-### }
-### }
-### log " Removing."
-### runplugin preexpire $ts
-### if {![safe_delete $file]} {
-### log "Unknown error in safe_delete, aborting." 0
-### break
-### }
-### log " EXPIRE: removed $file" 0
-### runplugin postexpire $ts
-### incr ::recalc
-### incr num -1
-### }
-###}
-###
-###proc scan_run {dir flag callback {seen {}}} {
-### global dustbin
-###
-### if {$dir eq $dustbin} return
-###
-### if {[specialdir $dir]} return
-###
-### file stat $dir st
-### set key "$st(dev):$st(ino)"
-### if {$key in $seen} {
-### log "Already seen $dir ($key)" 2
-### return
-### }
-### lappend seen $key
-###
-### if {[file exists "$dir/.$flag"]} { $callback $dir }
-###
-### foreach entry [readdir -nocomplain $dir] {
-### if {[file isdirectory "$dir/$entry"]} {
-### scan_run "$dir/$entry" $flag $callback $seen
-###
-### file stat "$dir/$entry" st
-### set key "$st(dev):$st(ino)"
-### lappend seen $key
-### }
-### }
-###}
-###
-###proc xscan {dir attr {force 0} {recurse 1} {seen {}}} {{indent 0} {forceflag ""}} {
-### global dustbin
-###
-### incr indent 2
-###
-### log "[string repeat " " $indent]\[$dir]" 2
-###
-### if {$dir eq $dustbin} {
-### log "[string repeat " " $indent]Dustbin, skipping." 2
-### incr indent -2
-### return
-### }
-###
-### file stat "$dir/" st
-###
-### if {[specialdir $dir]} {
-### # Special folder
-### if {$st(dev) != $::rootdev} {
-### log "[string repeat " " $indent]Special folder on different device, skipping." 2
-### incr indent -2
-### return
-### }
-### if {$force} {
-### set force 0
-### set forceflag ""
-### log "[string repeat " " $indent]Special folder, overriding recursion." 2
-### }
-### }
-###
-### # Already seen
-### set key "$st(dev):$st(ino)"
-### if {$key in $seen} {
-### log "[string repeat " " $indent]Already seen, skipping." 2
-### incr indent -2
-### return
-### }
-### lappend seen $key
-###
-### # Recursion
-### if {!$force && [file exists "$dir/.auto${attr}r"]} {
-### log "[string repeat " " $indent] (R)" 2
-### set force 1
-### set forceflag "$dir/.auto${attr}r"
-### }
-###
-### oktorun
-### dsc
-###
-### if {$force} {
-### $attr $dir $forceflag
-### } elseif {[file exists "$dir/.auto$attr"]} {
-### $attr $dir "$dir/.auto$attr"
-### }
-###
-### foreach entry [readdir -nocomplain $dir] {
-### if {$recurse && [file isdirectory "$dir/$entry"]} {
-### xscan "$dir/$entry" $attr $force $recurse $seen
-### file stat "$dir/$entry" st
-### set key "$st(dev):$st(ino)"
-### lappend seen $key
-### }
-### }
-###
-### dorecalc $dir
-###
-### incr indent -2
-###}
-###
-###proc scanup {dir flag} {
-### global root
-###
-### set rl [string length $root]
-### while {[string length $dir] >= $rl} {
-### if {[specialdir $dir]} {
-### return -1
-### }
-### if {[file exists "$dir/.auto${flag}r"]} {
-### log "scanup: Found ${flag}r ($dir)" 2
-### return 1
-### }
-### set dir [file dirname $dir]
-### }
-###
-### return 0
-###}
-###
-###proc scansingle {dirs} {
-### global modules root
-###
-### foreach dir $dirs {
-### log "Scanning single directory '$dir'"
-### foreach arg $modules {
-### set st [clock milliseconds]
-### set sup [scanup $dir $arg]
-### if {$sup == -1} {
-### log "Encountered special directory."
-### break
-### }
-### runplugin "pre${arg}singledir" $dir
-### xscan $dir $arg $sup 0
-### runplugin "post${arg}singledir" $dir
-### log "$arg scan completed in [elapsed $st] seconds."
-### }
-### }
-###}
-###
-###proc process_queue {} {
-### global settings
-### log "Processing queue..." 2
-### queue startup [$settings autokeep]
-### while {[llength [set q [queue pop]]]} {
-### oktorun
-###
-### if {[catch {set ts [ts fetch [$q get file]]}]} {
-### $q update FAILED "Could not open recording." 1
-### continue
-### }
-### if {$ts == 0} {
-### $q update FAILED "Could not open recording." 1
-### continue
-### }
-### set act [$q get action]
-### if {![dict exists $::queue_actions $act]} {
-### log "Unknown queue action, $act"
-### $q update FAILED "Unknown queue action, $act" 1
-### continue
-### }
-### set func $::queue_actions($act)
-### $q update RUNNING "Started at [clock format [clock seconds]]"
-### set start [clock seconds]
-### if {[catch {$func $ts} msg]} {
-### $q update FAILED "$msg" 1
-### continue
-### }
-### set elapsed $([clock seconds] - $start)
-### $q update COMPLETE \
-### "Completed at [clock format [clock seconds]]" 0 $elapsed
-### }
-###}
-###
-###file stat "$root/" rootstat
-###set rootdev $rootstat(dev)
-###log "Root device: $rootdev" 2
-###
-#########################################################################
-###
-###if {[lindex $argv 0] eq "-singledir"} {
-### scansingle [lrange $argv 1 end]
-###} elseif {[lindex $argv 0] eq "-queue"} {
-### process_queue
-###} elseif {[llength $argv] > 0} {
-### set loglevel 2
-### foreach arg $argv {
-### set st [clock milliseconds]
-### if {$arg ni $modules} {
-### log "Unknown scan type: $arg"
-### continue
-### }
-### log "$arg scan starting."
-### set processed_files {}
-### runplugin "pre${arg}scan"
-### xscan $root $arg
-### runplugin "post${arg}scan" processed_files
-### log "$arg scan completed in [elapsed $st] seconds."
-### }
-###} else {
-### process_queue
-### foreach arg $modules {
-### set st [clock milliseconds]
-### log "$arg scan starting."
-### set processed_files {}
-### runplugin "pre${arg}scan"
-### xscan $root $arg
-### runplugin "post${arg}scan" processed_files
-### log "$arg scan completed in [elapsed $st] seconds."
-### }
-### $settings autolast [clock seconds]
-###}
-###
-###if {!$prelocked} { release_lock webif_auto }
-###
-###log "Auto processing completed in [elapsed $scanstart] seconds."
-###
diff --git a/webif/lib/rsv.class b/webif/lib/rsv.class
index db5cc14..4f401b7 100755
--- a/webif/lib/rsv.class
+++ b/webif/lib/rsv.class
@@ -1017,9 +1017,8 @@ proc {rsv restore} {file} {
puts " $chan"
- if {[dict exists $chanmap $chan]} {
- set hsvc $chanmap($chan)
- } else {
+ set hsvc [get_channel_attr $szSvcName]
+ if {$hsvc eq ""} {
puts " Cannot map channel name to service."
continue
}