forked from hummypkg/webif
403 lines
8.8 KiB
Plaintext
Executable File
403 lines
8.8 KiB
Plaintext
Executable File
#!/mod/bin/jimsh
|
|
|
|
package require cgi
|
|
source /mod/webif/lib/setup
|
|
require ts.class pretty_size system.class settings.class escape browse.class \
|
|
plugin epg.class classdump
|
|
|
|
set mroot [system mediaroot]
|
|
set dir [cgi_get dir $mroot]
|
|
|
|
jqplugin contextMenu bar enadis blockui dialogue
|
|
jscss script.js style.css
|
|
|
|
if {[system has tvdb]} { jscss tvdb/script.js tvdb/style.css }
|
|
|
|
set plugins { dmenu {} menu {} omenu {} buttons {} }
|
|
eval_plugins browse
|
|
|
|
header
|
|
|
|
set nicesplice [system pkginst nicesplice]
|
|
|
|
set ignore {.nts .thm .hmi}
|
|
set include {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov .hmt .m4v}
|
|
|
|
if {![dict exists $env SCRIPT_NAME]} {
|
|
set env(SCRIPT_NAME) ""
|
|
cgi_input
|
|
set _cgi(dir) "/media/My Video/"
|
|
}
|
|
|
|
if {![dict exists $env QUERY_STRING]} { set env(QUERY_STRING) "root" }
|
|
|
|
set config [settings new]
|
|
|
|
set order [cgi_get order -]
|
|
if {$order eq "-"} {
|
|
set order [$config sortorder]
|
|
} else {
|
|
$config sortorder $order
|
|
}
|
|
|
|
set nofcount [$config nounwatchedcount]
|
|
|
|
set model [system model]
|
|
set dustbin [system dustbin 1]
|
|
|
|
set dlnaok [system dlnastatus]
|
|
|
|
proc icon {img {hover ""} {extra ""} {class "va"}} {
|
|
puts -nonewline "<img src=\"$img\" class=\"$class\" height=21 $extra"
|
|
if {$hover ne ""} {
|
|
puts -nonewline " alt=\"$hover\" title=\"$hover\""
|
|
}
|
|
puts ">"
|
|
}
|
|
|
|
proc directory {file bfile tbfile} {
|
|
puts "<div class=\"va relative\">"
|
|
set img "/images/711_1_09_Media_Folder.png"
|
|
if {$bfile eq $::dustbin} { set img "/img/Dustbin_Folder.png" }
|
|
puts "<img border=0 class=va id=\"img$tbfile\" src=$img>"
|
|
if {!$::nofcount} { puts "<span class=foldernum></span>" }
|
|
puts "<input class=\"fs fsdir\" type=checkbox>"
|
|
puts "<a class=dbf
|
|
href=\"$::env(SCRIPT_NAME)?dir=[cgi_quote_url $file]\"
|
|
file=\"[cgi_quote_url $file]\">"
|
|
puts "$bfile</a><span class=filesize id=\"$tbfile\">
|
|
</span>"
|
|
|
|
lassign [dir iconset $file] icons attrs
|
|
|
|
puts "<span class=iconset>"
|
|
puts [join $icons ""]
|
|
puts "</span>"
|
|
|
|
if {[string first $::mroot $file] >= 0} {
|
|
set class dopt
|
|
} else {
|
|
set class doopt
|
|
}
|
|
|
|
puts -nonewline "
|
|
<a href=#>
|
|
<img class=\"$class va\" border=0 width=45 "
|
|
puts -nonewline [join $attrs " "]
|
|
puts "
|
|
src=/images/181_1_00_Help5_OPT_Plus.png>
|
|
</a>
|
|
"
|
|
|
|
puts "
|
|
<div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div>
|
|
"
|
|
puts "</div>"
|
|
}
|
|
|
|
set dircount 0
|
|
set filecount 0
|
|
|
|
proc entry {file} {{i 0}} {
|
|
global dircount filecount dinuse
|
|
|
|
set bfile [file tail $file]
|
|
regsub -all " +" $bfile "" tbfile
|
|
if {[string index $bfile 0] == "\025"} {
|
|
set bfile [string range $bfile 1 end]
|
|
}
|
|
if {[file isdirectory "$file"]} {
|
|
incr dircount
|
|
directory $file $bfile $tbfile
|
|
return
|
|
}
|
|
set ext [string tolower [file extension $file]]
|
|
if {$ext in $::ignore || $ext ni $::include} { return }
|
|
|
|
set rsz [file size $file]
|
|
set sz [pretty_size $rsz]
|
|
|
|
set base [file rootname $file]
|
|
|
|
set thmok 0
|
|
if {$ext eq ".ts" && [file exists "${base}.nts"]} {
|
|
set type ts
|
|
set ts [ts fetch $file 1]
|
|
set rstat [$ts get status]
|
|
if {$rstat eq "Valid/OK"} {
|
|
set img Video_TS
|
|
} elseif {$rstat eq "Loss of power/OK" && $bfile in $dinuse} {
|
|
set img Video_Rec
|
|
} else {
|
|
set img Video_Failed
|
|
}
|
|
set omenu opt
|
|
if {[file exists "${base}.thm"]} { set thmok 1 }
|
|
} elseif {$ext eq ".hmt"} {
|
|
if {[file exists "${base}.ts"]} { return }
|
|
# Sole hmt file indicates failure to track.
|
|
set type bad
|
|
set ts 0
|
|
set img Video_Failed
|
|
set omenu oopt
|
|
} else {
|
|
set type gen
|
|
set ts 0
|
|
set img Video_Other
|
|
set omenu oopt
|
|
}
|
|
incr filecount
|
|
|
|
set new 0
|
|
if {$type eq "ts"} {
|
|
if {[$ts flag "New"] > 0} { set new 1 }
|
|
} elseif {$type eq "gen"} {
|
|
if {![file exists "${base}.hmi"]} { set new 1 }
|
|
}
|
|
|
|
if {$new} { append img _New }
|
|
|
|
set fscl "fs"
|
|
set synopsis ""
|
|
if {$type eq "ts"} {
|
|
set fscl "fs fsts"
|
|
set synopsis [cgi_quote_html [$ts get synopsis]]
|
|
}
|
|
|
|
puts "
|
|
<div class=\"va bf\" id=[incr i]>
|
|
<img class=va border=0 src=/img/$img.png>
|
|
<input class=\"$fscl\" type=checkbox>
|
|
<a class=bf title=\"$synopsis\"
|
|
file=\"[cgi_quote_url $file]\" type=$type href=#>
|
|
$bfile
|
|
</a>
|
|
"
|
|
|
|
# Size
|
|
puts "<span class=filesize> ($sz) </span>"
|
|
|
|
# Icons
|
|
|
|
set attrs {}
|
|
if {$type eq "ts"} {
|
|
if {$bfile in $dinuse} {
|
|
icon "/img/inuse.png"
|
|
}
|
|
icon [epg channeliconpath [$ts get channel_name]] \
|
|
[$ts get channel_name] "" "va browsechannel"
|
|
set genre [$ts get genre]
|
|
set glist [ts genrelist]
|
|
if {[dict exists $glist $genre]} {
|
|
set ret $glist($genre)
|
|
} else {
|
|
set ret $glist(0)
|
|
}
|
|
lassign $ret txt img
|
|
if {$img eq "Unclassified"} {
|
|
icon "/images/173_3_26_G3_$img.png" $txt "" "va genre"
|
|
} else {
|
|
icon "/images/173_3_00_G3_$img.png" $txt "" "va genre"
|
|
}
|
|
|
|
lassign [ts iconset $ts] icons attrs
|
|
|
|
puts [join $icons ""]
|
|
}
|
|
|
|
# Indexed
|
|
set dlna 0
|
|
if {$::dlnaok && $::model eq "HDR" && [llength [
|
|
system dlnaurl [file normalize $file]]]} {
|
|
icon "/img/dlna.png" "Indexed by DLNA Server"
|
|
set dlna 1
|
|
}
|
|
|
|
# Opt+ button
|
|
|
|
puts "
|
|
<a href=#>
|
|
<img class=\"$omenu va\" border=0 width=45 type=$type did=$i
|
|
[join $attrs " "]
|
|
new=$new rsize=$rsz dlna=$dlna thmok=$thmok
|
|
src=/images/181_1_00_Help5_OPT_Plus.png>
|
|
</a>
|
|
<div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div>
|
|
"
|
|
puts "</div>"
|
|
}
|
|
|
|
######################################################################
|
|
# Render web page
|
|
|
|
source assets.jim
|
|
if {[system has tvdb]} { source tvdb/assets.jim }
|
|
|
|
if {!$dlnaok && ![system instandby]} {
|
|
puts {
|
|
<span class="blood dlnawarning cleft">
|
|
Note: Content Sharing is disabled on this system.
|
|
</span>
|
|
}
|
|
}
|
|
|
|
puts "
|
|
<span style=\"display:none\" id=dir>$dir</span>
|
|
<span style=\"display:none\" id=mediaroot>$mroot</span>
|
|
<fieldset class=cleft style=\"margin: 0 1em 1em 1em\">
|
|
<legend style=\"font-size: 1.5em; padding: 0 0.5em 0.5em 0.5em;\">
|
|
"
|
|
|
|
# Breadcrumb path
|
|
set stub ""
|
|
foreach part [split $dir /] {
|
|
if {$stub eq "/"} { set name $part } else { set name "/$part" }
|
|
append stub $name
|
|
puts "<a href=\"$env(SCRIPT_NAME)?dir=[cgi_quote_url $stub]\">$name</a>"
|
|
}
|
|
puts "<span class=filesize id=dirsize></span>"
|
|
puts "</legend>"
|
|
|
|
if {[system has tvdb] && [string length $dir] > [string length $mroot]} {
|
|
source tvdb/banner.jim
|
|
}
|
|
|
|
# Parent directory
|
|
set parent [join [lrange [split $dir /] 0 end-1] /]
|
|
if {$parent ne ""} {
|
|
puts "
|
|
<div class=va>
|
|
<a href=\"$env(SCRIPT_NAME)?dir=[cgi_quote_url $parent]\">
|
|
<img border=0 src=/images/711_3_09_Media_Folder_UP.png class=va>
|
|
\[parent directory\]</a>
|
|
</div>
|
|
"
|
|
}
|
|
|
|
proc s_time {a b} {
|
|
global dir
|
|
|
|
set a "$dir/$a"
|
|
set b "$dir/$b"
|
|
|
|
set ad [file isdirectory $a]
|
|
set bd [file isdirectory $b]
|
|
|
|
if {$ad && !$bd} { return -1 }
|
|
if {$bd && !$ad} { return 1 }
|
|
if {$ad && $bd} {
|
|
if {$a < $b} { return -1 }
|
|
if {$a > $b} { return 1 }
|
|
return 0
|
|
}
|
|
|
|
if {[catch {file stat $a l}]} { return 0}
|
|
set at $l(mtime)
|
|
if {[catch {file stat $b l}]} { return 0}
|
|
set bt $l(mtime)
|
|
|
|
if {$at < $bt} { return -1 }
|
|
if {$at > $bt} { return 1 }
|
|
return 0
|
|
}
|
|
|
|
set files [readdir -nocomplain $dir]
|
|
switch $order {
|
|
1 { set files [lsort -command s_time $files] }
|
|
default { set files [lsort -nocase $files] }
|
|
}
|
|
|
|
set dinuse [system dirinuse $dir]
|
|
foreach file $files { entry "$dir/$file" }
|
|
|
|
puts "
|
|
<a href=# id=selectall>Select all</a> | <a href=# id=deselectall>none</a>
|
|
|
|
Directories: $dircount, Files: $filecount
|
|
"
|
|
|
|
# Sort icons
|
|
puts "<div id=sortdiv>"
|
|
set sortlist {{0 sort_name name} {1 sort_date date}}
|
|
foreach sl $sortlist {
|
|
lassign $sl index img descr
|
|
|
|
if {$index} { puts " | " }
|
|
|
|
set tag "Currently sorting"
|
|
if {$order != $index} {
|
|
puts "
|
|
<a href=\"$env(SCRIPT_NAME)?$env(QUERY_STRING)&order=$index\">"
|
|
set tag "Sort"
|
|
}
|
|
puts "<img class=va border=0 src=/img/$img.gif> $tag by $descr"
|
|
if {$order != $index} {
|
|
puts "</a>"
|
|
}
|
|
}
|
|
puts "</div>"
|
|
|
|
puts "</fieldset>"
|
|
|
|
puts {
|
|
<fieldset class=left style="margin: 0 1em 1em 1em">
|
|
<legend style="font-size: 1.5em; padding: 0 0.5em 0.5em 0.5em; color: #1e5bbd;">
|
|
File Clipboard
|
|
</legend>
|
|
<div id=clipboard>
|
|
<img src=/img/loading.gif> <i>Loading...</i>
|
|
</div>
|
|
</fieldset>
|
|
}
|
|
|
|
puts "<div class=brow>"
|
|
|
|
puts {
|
|
<button id=copy>Copy</button>
|
|
<button id=cut>Cut</button>
|
|
<button id=delete>Delete</button>
|
|
<button id=newdir>New Folder</button>
|
|
<div id=deletewait class=blood style="display: none">
|
|
<img src=/img/loading.gif>Deleting may take some time, please be patient...
|
|
</div>
|
|
}
|
|
|
|
# Join
|
|
if {$nicesplice} {
|
|
puts { <button id=join>Join</button> }
|
|
}
|
|
|
|
# De-duplicate
|
|
|
|
puts {
|
|
<button id=dedup>De-duplicate/tidy this folder</button>
|
|
}
|
|
|
|
# Streamer file
|
|
|
|
if {[file exists /mnt/hd3/Streamer_down_file]} {
|
|
puts {
|
|
<button id=save_stream file=/mnt/hd3/Streamer_down_file>
|
|
Save last streamed content
|
|
<span id=streamstatus></span>
|
|
</button>
|
|
}
|
|
}
|
|
|
|
# Plugin buttons
|
|
|
|
if {[llength $plugins(buttons)]} {
|
|
puts "</div><div class=brow style=\"margin-top: 3px\">"
|
|
foreach plugin $plugins(buttons) {
|
|
lassign $plugin tag options
|
|
puts "
|
|
<button class=plugin act=\"$options(link)\">$options(desc)</button>
|
|
"
|
|
}
|
|
}
|
|
|
|
puts "</div>"
|
|
|
|
footer
|
|
|