webif/webif/cgi-bin/status.jim

368 lines
7.8 KiB
Plaintext
Executable File

#!/mod/bin/jimsh
package require cgi
source /mod/webif/lib/setup
require system.class findhsvc epg.class rsv.class plugin
set runmode cli
if {[string match {*jim} $argv0]} { set runmode cgi }
set schedtime 1200
switch $runmode {
cgi {
set type [cgi_get type "full"]
httpheader
}
cli {
set type "full"
if {"-X" in $argv} { set schedtime 7200 }
}
}
if {"-d" in $argv} {
proc debug {arg} { puts $arg }
} else {
proc debug {arg} {}
}
if {[catch {set pid [exec pgrep -n humaxtv]}]} {
puts "Cannot find humaxtv process."
exit
}
set exts {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov .hmt .m4v .m4a}
set statusops {
decrypt { "Decrypting"
"/img/decrypt.png style=\"padding: 0 0.2em 0 0.5em\""
}
mpg { "Extracting MPG"
"/img/mpg.png style=\"padding: 0 0.2em 0 0.5em\""
}
mp3 { "Extracting MP3"
"/img/mp3.png style=\"padding: 0 0.2em 0 0.5em\""
}
shrink { "Shrinking"
"/img/compress.png style=\"padding: 0 0.2em 0 0.5em\""
}
crop { "Cropping"
"/img/cut.png style=\"padding: 0 0.2em 0 0.5em\""
}
join { "Joining"
"/img/cut.png style=\"padding: 0 0.2em 0 0.5em\""
}
}
proc register_statusop {op name icon} {
set ::statusops($op) [list $name $icon]
}
eval_plugins status 1
proc get_data {} {
global pid exts
set ret {}
if {[catch {set data \
[exec /mod/webif/lib/bin/lsof -X -Fns -p $pid]} msg]} {
set ret {}
} else {
set size 0
foreach line [split $data "\n"] {
set typ [string index $line 0]
switch $typ {
s {
set size [string range $line 1 end]
}
n {
if {[string first Video/ $line] == -1 && \
[string first /media/ $line] == -1} {
continue
}
regsub -- { \([^\)]+\)$} $line "" line
set ext [file extension $line]
if {$ext ni $exts} continue
set file [string range $line 1 end]
# Skip HD-Fox TSR buffer
if {$file eq "/media/drive1/.tsr/0.ts"} {
continue
}
# Handle chase play (same file open twice
# and recently written)
if {[dict exists $ret $file] && \
$ext eq ".ts"} {
set age [expr [clock seconds] - \
[file mtime $file]]
if {$age < 60} {
set ret($file) -1
}
} else {
set ret($file) $size
}
}
}
}
}
foreach file [dict keys $::ops] {
if {![dict exists $ret $file]} {
if {[file exists $file]} {
set ret($file) [file size $file]
} else {
set ret($file) 0
}
}
}
return $ret
}
proc add_output {icon mode name} {
global runmode output
if {$runmode eq "cgi"} {
if {[string first "/" $icon] == -1} {
set icon "/images/$icon"
}
lappend output [concat \
"<span class=\"va stitem\">\n" \
" <img class=va src=$icon>\n" \
" <span>$mode&nbsp;<i>$name</i></span>\n" \
"</span>\n" \
]
} else {
lappend output "$mode $name"
}
}
set play 0
set rec 0
set output {}
set ops {}
set model [system model]
foreach opfile [glob -nocomplain -directory /tmp -tails -- ".bgop.*"] {
set op [string range $opfile 6 end]
lassign [split [file read "/tmp/$opfile"] "\n"] file oppid
if {$model eq "HDR"} {
set file [string map {/media/ /mnt/hd2/} $file]
}
# Check that the lock is still held
if {![system checkop $op]} {
debug "$op - $file - $oppid - process not found."
file delete "/tmp/$opfile"
} else {
set ops($file) $op
}
}
debug "OPS: $ops"
set data {}
if {$type eq "full"} {
set data [get_data]
}
if {[llength $data]} {
debug " DATA: ($data)"
if {![file exists /tmp/.rractive]} {
sleep 3
set ndata [get_data]
debug " NDATA: ($ndata)"
set rr 0
} else {
sleep 1
set ndata [get_data]
debug " NDATA: ($ndata)"
foreach k [array names data] {
if {![dict exists $ndata $k]} {
dict unset data $k
}
}
set rr 1
set recs {}
loop i 0 2 {
catch {
set fd [open "/tmp/.rec$i" r]
lappend recs "[$fd read -nonewline].ts"
$fd close
}
}
debug " RECS: $recs"
}
foreach file [array names data] {
set bname [file rootname [file tail $file]]
set name [string map {
"/mnt/hd2/My Video/" ""
"/media/drive1/Video/" ""
"/media/" ""
".ts" ""
} $file]
if {$data($file) == -1} {
set mode chase
} elseif {$rr} {
if {$file in $recs} {
set mode rec
} else {
set mode play
}
} else {
if {![dict exists $ndata $file]} continue
if {$ndata($file) > $data($file)} {
set mode rec
} else {
set mode play
}
}
if {[dict exists $ops $file]} {
if {$mode eq "rec" || $mode eq "chase"} {
set mode "Recording"
set icon "745_1_11_Video_1REC.png"
add_output $icon $mode $name
}
set mode $ops($file)
}
regexp -- {^([^0-9]+)} $mode x mode
switch $mode {
chase {
incr rec
incr play
set mode "Chase Playing"
set icon "745_1_11_Video_3REC_Live.png"
}
rec {
incr rec
set mode "Recording"
set icon "745_1_11_Video_1REC.png"
}
play {
incr play
set mode "Playing"
set icon "745_1_10_Video_2Live.png"
}
default {
if {[dict exists $statusops $mode]} {
lassign $statusops($mode) mode icon
} else {
set mode "Unknown"
set icon "/img/blank.gif"
}
}
}
add_output $icon $mode $name
}
}
######################################################################
# Live viewing information
if {![system instandby] && $play < 1} {
set hsvc [system param CUR_SVC Value USERCONFIG]
set ff [[rsv dbhandle] query "
select usSvcid as svcid, usLcn as lcn,
substr(szSvcName, 2) as name
from channel.TBL_SVC
where hSvc = $hsvc
limit 1
"]
if {[llength $ff] == 1} {
lassign [lindex $ff 0] x svcid x lcn x name
set epgs [epg dbfetch get \
-service $svcid \
-time [clock seconds]\
]
set prog ""
if {[llength $epgs] == 1} {
lassign $epgs epg
set prog "- [$epg get name] ("
append prog "[clock format [$epg get start] -format %H:%M] - "
append prog "[clock format $([$epg get start] + [$epg get duration]) -format %H:%M]"
append prog ") \[[$epg percent]%\]"
}
if {$runmode eq "cgi"} {
set s "
<span class=\"va stitem\">
[epg channelicon $name 30 \
{vertical-align: middle; padding: 0 4px 0 2px}]
<span>Watching <i>$lcn: $name $prog</i></span>
"
append s "</span>"
lappend output $s
} else {
set s "Watching $lcn: $name $prog"
lappend output $s
}
}
}
######################################################################
# In standby
if {[system instandby]} {
if {$runmode eq "cgi"} {
lappend output [concat \
"<span class=\"va stitem\">\n" \
" <img class=va width=28 style=\"padding: 0 4px\"" \
"src=/img/standby.png>\n" \
" <span>System is in standby.</span>\n" \
"</span>" \
]
} else {
lappend output "System is in standby."
}
}
######################################################################
# Upcoming recordings
set events [rsv list tbl_reservation \
" where ersvtype = 3 and nsttime - [clock seconds] < $schedtime
and nsttime > [clock seconds] "]
foreach event $events {
if {$runmode eq "cgi"} {
set icon "175_1_11_Reservation_Record.png"
lappend output [concat \
"<span class=\"va stitem\">\n" \
" <img class=va src=/images/$icon width=20>\n" \
" <span>Will record <i>[$event name]</i>" \
" on [$event channel_name] at"\
" [clock format [$event get nsttime] -format {%H:%M}]" \
" </span>\n" \
"</span>\n" \
]
} else {
lappend output [concat \
"Will record '[$event name]' " \
"on [$event channel_name] at " \
"[clock format [$event get nsttime] -format {%H:%M}]" \
]
}
}
######################################################################
# Idle Time
if {$runmode ne "cgi"} {
lappend output "Idle: [clock format [system idletime] -format %T]"
}
######################################################################
# Output
if {[llength $output]} {
if {$runmode eq "cgi"} {
puts [join $output "\n<br>\n"]
} else {
puts [join $output "\n"]
}
}