#!/mod/bin/jimsh package require cgi source /mod/var/mongoose/lib/setup require ts.class pretty_size system.class settings.class puts "Content-Type: text/html" puts "" set nicesplice [system pkginst nicesplice] set ignore {.nts .thm .hmt .hmi} set include {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov} cgi_input #cgi_dump #set env(REQUEST_URI) '' #set _cgi(dir) "/media/My Video/\[Don't Die Young\]" if {![dict exists $env QUERY_STRING]} { set env(QUERY_STRING) "root" } set order [cgi_get order -] if {$order eq "-"} { set order [[settings new] sortorder] } else { [settings new] sortorder $order } proc directory {file bfile} { regsub -all " +" $bfile "" tbfile puts "<div class=va>" puts "<img border=0 class=va id=\"img$tbfile\" src=/images/711_1_09_Media_Folder.png>" puts "<input class=\"fs fsdir\" type=checkbox>" puts "<a class=dbf href=\"$::env(REQUEST_URI)?dir=[cgi_quote_url $file]\" file=\"$file\">" puts "$bfile</a><span class=filesize id=\"$tbfile\"> </span>" puts " <a href=#> <img class=\"dopt va\" border=0 width=45 src=/images/181_1_00_Help5_OPT_Plus.png> </a> <div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div> " puts "</div>" } proc entry {file} {{i 0}} { set bfile [file tail $file] if {[string index $bfile 0] == "\025"} { set bfile [string range $bfile 1 end] } if [file isdirectory "$file"] { directory $file $bfile continue } set ext [file extension $file] if {$ext in $::ignore || $ext ni $::include} { continue } file stat $file st set sz [pretty_size $st(size)] set base [file rootname $file] if {$ext eq ".ts" && [file exists "${base}.nts"]} { set type ts set ts [ts fetch $file 1] set img Video_TS } else { set type gen set ts 0 set img Video_Other } set new 0 if {$type eq "ts"} { if {[$ts flag "New"] > 0} { set new 1 } } else { if {![file exists "[file rootname $file].hmi"]} { set new 1 } } if {$new} { append img _New } set fscl "fs" if {$type eq "ts"} { set fscl "fs fsts" } 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 file=\"$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 if {$type eq "ts"} { # 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" } puts "<img class=va src=/images/$img.png height=21>" # Locked if {[$ts flag "Locked"] > 0} { set locked 1 puts "<img class=va src=/images/178_1_00_Icon_Lock.png height=21>" } # Encrypted if {[$ts flag "Encrypted"] > 0} { set encd 1 puts "<img class=va src=/images/749_1_26_Video_Encryption.png height=21>" } if {![$ts flag "ODEncrypted"]} { puts "<img class=va src=/img/Decrypted.png height=21>" set odencd 0 } # Guidance if {[$ts flag "Guidance"] > 0} { puts "<img class=va src=/images/174_1_26_GuidancePolicy.png height=21>" } set bx [$ts get bookmarks] } # Opt+ button puts " <a href=#> <img class=\"opt va\" border=0 width=45 type=$type did=$i locked=$locked encd=$encd def=$def new=$new bx=$bx odencd=$odencd src=/images/181_1_00_Help5_OPT_Plus.png> </a> <div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div> " puts "</div>" } set dir [cgi_get dir [system mediaroot]] ###################################################################### # Render web page header puts { <link href=/css/jquery.contextMenu.css rel=stylesheet type=text/css /> <script type="text/javascript" src="/js/jquery.contextMenu.js"></script> <ul id=optmenu class=contextMenu> <li class=delete><a href=#delete>Delete</a></li> <li><a href=#lock>Toggle Lock</a></li> <li><a href=#enc>Toggle Enc</a></li> <li><a href=#new>Toggle New</a></li> <li><a href=#rename>Rename</a></li> <li><a href=#download>Download</a></li> } if {[system model] eq "HDR"} { puts { <li class="separator"><a href=#decrypt>Decrypt</a></li> } } if $nicesplice { puts { <li class="cut separator"><a href=#crop>Crop</a></li> } } puts { </ul> <ul id=doptmenu class=contextMenu> <li class=delete><a href=#delete>Delete</a></li> <li><a href=#rename>Rename</a></li> </ul> <div id=renameform title="Rename media file" style="display: none"> <form id=renameform_form> <input type=hidden name="renameorig" id="renameorig" value=""> <input type=hidden name="titleorig" id="titleorig" value=""> <table border=0> <tr> <th> <label for="rename"> <b>New Filename</b> </label> </th> <td> <input type=text name="rename" id="rename" value="" size=70 maxlength=255 class="text ui-widget-content ui-corner-all"> </td> </tr> <tr style="display: none" class=tstype> <th> <label for="renametitle" style="padding-top: 0.5em"> <b>New Medialist Title</b> </label> </th> <td> <input type=text name="renametitle" id="renametitle" value="" size=70 maxlength=48 class="text ui-widget-content ui-corner-all"> </td> </tr> <tr style="display: none" class=tstype> <td colspan=2 id=synopsis style="font-style: italic"></td> </tr> </table> </form> </div> <div id=drenameform title="Rename directory" style="display: none"> <form id=drenameform_form> <input type=hidden name="renameorig" id="drenameorig" value=""> <table border=0> <tr> <th> <label for="drename"> <b>New Directory Name</b> </label> </th> <td> <input type=text name="rename" id="drename" value="" size=70 maxlength=255 class="text ui-widget-content ui-corner-all"> </td> </tr> </table> </form> </div> <div id=savestreamform title="Save streamed content" style="display: none"> <div class=pre id=savestream_detail></div> <form id=savestream_form> } puts "<input type=hidden name=dir value=\"$dir\">" puts { <table border=0> <tr> <th> <label for="savestream_name"> <b>Filename</b> </label> </th> <td> <input type=text name="savestream_name" id="savestream_name" value="" size=70 maxlength=255 class="text ui-widget-content ui-corner-all"> <img id=savestream_spin src=/img/loading.gif> </td> </tr> </table> </form> </div> <div id=dialogue></div> <div id=confirm title="Confirmation Required"></div> <script type=text/javascript src=/cgi-bin/browse/browse.js></script> } puts "<span style=\"display:none\" id=dir>$dir</span>" # Breadcrumb path puts " <fieldset style=\"margin: 1em\"> <legend style=\"font-size: 1.5em; padding: 0 0.5em 0.5em 0.5em;\"> " 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> " } # Strip double slashes regsub -all -- {\/+} "$dir/*" "/" dir # Escape square brackets (for glob) regsub -all {([\\[])} $dir {\\\1} dir proc s_time {a 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 } file stat $a l set at $l(ctime) file stat $b l set bt $l(ctime) if {$at < $bt} { return -1 } if {$at > $bt} { return 1 } return 0 } set files [glob -nocomplain $dir] switch $order { 1 { set files [lsort -command s_time $files] } default { set files [lsort $files] } } foreach file $files { entry $file } puts "<a href=# id=selectall>Select all</a> | <a href=# id=deselectall>none</a>" # 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 "<div class=brow>" puts { <button id=delete>Delete</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) </button> } } puts "</div>" footer