#!/mod/bin/jimsh package require cgi source /mod/webif/lib/setup require ts.class pretty_size system.class settings.class escape browse.class jqplugin contextMenu bar enadis jscss script.js style.css header set nicesplice [system pkginst nicesplice] set flatten [system pkginst flatten] set ignore {.nts .thm .hmi} set include {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov .hmt} if {![dict exists $env REQUEST_URI]} { set env(REQUEST_URI) "" 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] 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(REQUEST_URI)?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 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 } file stat $file st set rsz $st(size) 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 img Video_TS set omenu opt if {[file exists "${base}.thm"]} { set thmok 1 } } elseif {$ext eq ".hmt"} { if {[file exists "${base}.ts"]} { continue } # 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 locked 0 set encd 0 set odencd 1 set def unknown set bx 0 set dlna 0 set shrunk 0 if {$type eq "ts"} { 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" } # HD / SD if {[$ts get definition] eq "HD"} { set def HD set img "172_1_00_HD" } else { set def SD set img "172_1_26_SD" } icon "/images/$img.png" # Locked if {[$ts flag "Locked"] > 0} { set locked 1 icon "/images/178_1_00_Icon_Lock.png" "Locked" } # Encrypted if {[$ts flag "Encrypted"] > 0} { set encd 1 icon "/images/749_1_26_Video_Encryption.png" "" } if {![$ts flag "ODEncrypted"]} { set odencd 0 icon "/img/Decrypted.png" "Decrypted" } # Guidance if {[$ts flag "Guidance"] > 0} { icon "/images/174_1_26_GuidancePolicy.png" } # Indexed if {$::model eq "HDR" && [llength [$ts dlnaloc]]} { icon "/img/dlna.png" "Indexed by DLNA Server" set dlna 1 } # Shrunk if {[$ts flag Shrunk]} { icon "/img/compress.png" "Shrunk" set shrunk 1 } set bx [$ts get bookmarks] } # Opt+ button puts " <a href=#> <img class=\"$omenu va\" border=0 width=45 type=$type did=$i locked=$locked encd=$encd def=$def new=$new bx=$bx shrunk=$shrunk rsize=$rsz odencd=$odencd 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>" } set mroot [system mediaroot] set dir [cgi_get dir $mroot] ###################################################################### # Render web page source assets.jim 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(REQUEST_URI)?dir=[cgi_quote_url $stub]\">$name</a> } puts "<span class=filesize id=dirsize></span>" puts "</legend>" # Parent directory set parent [join [lrange [split $dir /] 0 end-1] /] if {$parent ne ""} { puts " <div class=va> <a href=\"$env(REQUEST_URI)?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] } } 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(REQUEST_URI)?$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> } } puts "</div><div class=brow style=\"margin-top: 3px\">" # 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 (e.g. iPlayer/YouTube) <div id=streamstatus></div> </button> } } puts "</div>" footer