check in initial web interface

git-svn-id: file:///root/webif/svn/humax/pkg/src/webif@161 2a923420-c742-0410-a762-8d5b09965624
This commit is contained in:
hummypkg 2011-06-07 13:26:45 +00:00
parent 8450b22473
commit d3e7adfd1f
41 changed files with 2479 additions and 0 deletions

View File

@ -0,0 +1,35 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/html/lib/header.jim
cgi_input
#cgi_dump
set service 0
set service 4351
catch { set service [dict get $_cgi service] }
set event 0
catch { set event [dict get $_cgi event] }
set raw 0
catch { set raw [dict get $_cgi raw] }
puts "<pre>"
if { $raw == 0 } {
puts [epg exec dump -raw 1 -service $service -event $event]
puts "<a href=$env(REQUEST_URI)?$env(QUERY_STRING)&raw=1>
Click here for extended dump</a>"
} else {
puts [epg exec dumpraw -raw 1 -service $service -event $event]
}
puts "</pre>"
epg cleanup
source /mod/var/mongoose/html/lib/footer.jim

View File

@ -0,0 +1,144 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/altrow
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/html/lib/header.jim
puts "<script type=text/javascript src=/js/highlight.js></script>"
cgi_input
#cgi_dump
#set _cgi [dict create term "doctor who"]
#set env(REQUEST_URI) "test"
set term ""
catch { set term [dict get $_cgi term] }
set cmd "search"
if {[dict exists $_cgi full]} { set cmd "searchall" }
set ct 0
catch { set ct [dict get $_cgi ct] }
puts "
<form method=get action=/cgi-bin/epg_search.jim>
Search EPG: <input name=term size=20 maxlength=255 value=\"$term\">
<input type=checkbox name=full"
if {[dict exists $_cgi full]} { puts " checked" }
puts ">Search descriptions as well as titles.
<input type=submit value=Search>
"
set db [sqlite3.open /var/lib/humaxtv/setup.db]
set res [$db query {
select itemBlob from TBL_USERCONFIG
where itemName like 'EPG\_KEYWORD\_%%' ESCAPE '\'
}]
proc cts {type img text} {
puts "<a href=$::env(REQUEST_URI)?ct=$type>
<img height=18 border=0 src=/images/173_3_00_G3_$img.png>&nbsp;$text</a>";
}
puts {
<br>
<div style="float: left; clear: left; width: 15em">
Content Type Searches:
</div>
<div style="float: left">
}
cts 1 "Movie" "Film/Drama"
cts 2 "News" "News/Current affairs"
cts 3 "Show" "Show/Game show"
cts 4 "Sports" "Sport"
cts 5 "Children" "Children"
cts 10 "Leisure" "Leisure"
puts {
</div>
<div style="float: left; margin-left: 15em">
}
cts 6 "Music" "Music/Ballet/Dance"
cts 7 "Art" "Arts/Culture"
cts 8 "Society" "Social/Political/Economic"
cts 9 "Education" "Education/Science/Factual"
puts { </div> }
if {[llength $res] > 0} {
puts {
<div style="float: left; clear: left; width: 15em">
Keyword Searches:
</div>
<div style="float: left">
}
set done 0
foreach keyword $res {
if {$done == 1} { puts "&nbsp;|&nbsp;" } else { incr done }
set kw [string range [lindex $keyword 1] 1 end]
puts "<a href=$env(REQUEST_URI)?term=[cgi_quote_url $kw]>$kw
</a>"
}
puts "</div>"
}
$db close
puts "</form>"
if {$ct > 0 } {
set records [epg fetch dump -type $ct]
} elseif {$term ne ""} {
set records [epg fetch $cmd -extra $term]
}
puts {
<table class=borders id=results style="clear: both;margin: 0.5em 0 0 0">
<tr>
<th>Date</th>
<th colspan=2>Channel</th>
<th>Programme</th>
<th>Synopsis</th>
</tr>
}
proc rsort {v1 v2} {
set v1s [$v1 get start]
set v2s [$v2 get start]
if {$v1s == $v2s} { return 0 }
if {$v1s > $v2s } { return 1 }
return -1
}
set i 0
foreach record [lsort -command rsort $records] {
altrow
puts "<td nowrap>
[clock format [$record get start] -format "%a %d %b %Y"]<br>
[clock format [$record get start] -format "%H:%M %Z"]</td>"
puts "<td>[$record get channel_num]</td>"
puts "<td nowrap>
<a href=/cgi-bin/epg_service.jim?service=[$record get service_id]>
[$record get channel_name]
</a></td>"
puts [$record cell]
puts "<td>[$record get text]</td><td>[$record get warning]</td>"
puts "</tr>"
flush stdout
}
puts "</table>"
if {$term != ""} {
puts "
<script type=text/javascript>
highlight(document.getElementById(\"results\"), \"$term\");
</script>
"
}
epg cleanup
source /mod/var/mongoose/html/lib/footer.jim

View File

@ -0,0 +1,57 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/altrow
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/html/lib/header.jim
cgi_input
#cgi_dump
set service 0
set service 4351
catch { set service [dict get $_cgi service] }
set records [epg fetch dump -service $service]
set channel_num [[lindex $records 0] get channel_num]
set channel_name [[lindex $records 0] get channel_name]
puts "<h3>Channel: $channel_num - $channel_name</h3>"
puts {
<table class=borders>
<tr>
<th></th>
<th>Date</th>
<th>Time</th>
<th>Programme</th>
<th>Synopsis</th>
</tr>
}
set i 0
foreach record $records {
altrow
if {[$record showing]} {
puts "<td><img src=/images/111_1_00_Cursor_2R_Arrow.png></td>"
} else { puts "<td></td>" }
puts "<td nowrap>
[clock format [$record get start] -format "%a %d %b %Y"]</td>"
puts "<td nowrap>
[clock format [$record get start] -format "%H:%M"]</td>"
puts [$record cell]
puts "<td>[$record get text]</td>"
puts "<td>[$record get warning]</td>"
puts "</tr>"
flush stdout
}
puts "</table>"
epg cleanup
source /mod/var/mongoose/html/lib/footer.jim

View File

@ -0,0 +1,15 @@
#!/mod/bin/jimsh
package require cgi
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
catch { set service [dict get $_cgi service] }
catch { set action [dict get $_cgi action] }
catch { puts [exec /mod/bin/service $action $service] }

47
var/mongoose/cgi-bin/status.jim Executable file
View File

@ -0,0 +1,47 @@
#!/mod/bin/jimsh
set pid [exec pgrep humaxtv]
if {[catch {set data [exec lsof -p $pid | grep Video | fgrep .ts]} ]} {
exit
}
set lines [split $data "\n"]
foreach line $lines {
regsub -all -- {[[:space:]]+} $line " " line
set fields [split $line " "]
set name [lindex [split $line "/"] end]
set size($name) [lindex $fields 6]
set seen($name) 0
}
sleep 2
set data [exec lsof -p $pid | grep Video | fgrep .ts]
regsub -all -- {[[:space:]]+} $line " " line
set lines [split $data "\n"]
foreach line $lines {
regsub -all -- {[[:space:]]+} $line " " line
set fields [split $line " "]
set name [lindex [split $line "/"] end]
set size2 [lindex $fields 6]
if { $size2 > $size($name) && $seen($name) < 1 } {
set mode "Recording"
set icon "745_1_11_Video_1REC.png"
} else {
set mode "Watching"
set icon "745_1_10_Video_2Live.png"
}
incr seen($name)
lappend output "<img src=/images/$icon>$mode $name"
}
if {[llength $output]} {
puts "Content-Type: text/html"
puts ""
puts [join $output "<br>\n"]
}

View File

@ -0,0 +1,201 @@
html body
{
line-height: 1.55em;
font-family: "Lucida Grande", verdana, lucida, helvetica, sans-serif;
background-color: #f8f8f8;
margin: 1em;
padding: 0;
font-size: small;
}
html>body
{
font-size: small;
}
div.container
{
position: relative;
padding-left: 30px;
padding-right: 30px;
height: 116px;
}
div.container .left
{
position: absolute;
left: 0px;
top: 0px;
width: 30px;
height: 116px;
}
div.container .right
{
position: absolute;
right: 0px;
top: 0px;
width: 30px;
height: 116px;
}
div.container .middle
{
background-image: url('/images/154_1_00_WIN_MD116_2C.png');
background-repeat: repeat-x;
height: 116px;
}
div.footer
{
clear: both;
padding-top: 2em;
}
table
{
empty-cells: show;
}
table.borders, table.borders td, table.borders th
{
border: 1px solid #669933;
empty-cells: show;
}
table tr.odd
{
background: #ccff99;
color: black;
}
table tr.even
{
background: #ffffcc;
color: black;
}
table td,table th
{
font-size: small;
}
table th
{
font-weight: bold;
text-align: left;
}
pre
{
font-family: Consolas, 'Courier New', Courier, monospace;
color: black;
background: #f9d9b0 url('/img/prebg.png') repeat-x top;
line-height: 1.24;
padding: 3px 8px;
margin: 0 5em 1em 5em;
border-color: #f9d9b0;
border-bottom: 1px solid #f9bc6d;
border-top-left-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
-khtml-border-top-left-radius: 4px;
border-top-right-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
-khtml-border-top-right-radius: 4px;
white-space: pre-wrap;
white-space: -moz-pre-wrap !important;
white-space: -pre-wrap;
white-space: -o-pre-wrap;
white-space: break-word;
}
.shadowbox
{
background: #ccc;
position: relative;
width: 60%;
top: 2px;
left: 2px;
}
.shadowbox div
{
background: white;
color: #005000;
border: 1px solid #7a4707;
padding: 10px;
position: relative;
top: -2px;
left: -2px;
}
:link:focus,
:visited:focus,
:link,
:visited,
:link:active,
:visited:active
{
text-decoration: none;
color: #1e5bbd;
background-color: transparent;
}
/*
:link:hover,
:visited:hover
{
text-decoration: underline;
background-color: #b4d5ff;
color: #1559B3;
}
*/
.footnote
{
color: #ff4000;
background: transparent;
font-size: 70%;
font-weight: bold;
}
.blueshade
{
background: #b9daff;
color: black;
}
.yellowshade
{
background: #f6ff5b;
color: black;
}
.pinkshade
{
background: #ffccff;
color: black;
}
.greenshade
{
background: #e4faa8;
color: black;
}
.orangeshade
{
background: #ffeeaa;
color: black;
}
img.progress
{
background: transparent url(/img/percentback.png) top left no-repeat;
padding: 0;
margin: 0;
background-position: 1px 0;
}

View File

@ -0,0 +1,4 @@
<!--#include virtual="/lib/header.shtml" -->
<!--#exec "/mod/var/mongoose/include/db.jim" -->
<!--#include virtual="/lib/footer.shtml" -->

View File

@ -0,0 +1,9 @@
<!--#include virtual="/lib/header.shtml" -->
<form method=get action=/cgi-bin/epg_search.jim>
Search EPG: <input name=term size=20 maxlength=255>
<input type=checkbox name=full>Search descriptions as well as titles.
<input type=submit value=Search>
</form>
<!--#exec "/mod/var/mongoose/include/epg.jim" -->
<!--#include virtual="/lib/footer.shtml" -->

1040
var/mongoose/html/img.html Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,108 @@
<!--#include virtual="/lib/header.shtml" -->
<div id=status class=shadowbox
style="width: 60%; display: none; margin: 1 0 1em 0">
<div>
<span id=status_txt>
Status...
</span>
</div>
</div>
<script type=text/javascript src=/js/ajax.js></script>
<script type=text/javascript>
function updateResults()
{
var r = document.getElementById('status');
if (r && request.readyState == 4 && request.status == 200)
{
r.style.display = 'block';
var t = document.getElementById('status_txt');
t.innerHTML = request.responseText;
}
}
function go()
{
var url = "/cgi-bin/status.jim";
request.open("GET", url, true);
request.onreadystatechange = updateResults;
request.send(null);
}
go();
</script>
<div style="float: left">
<center>
<a href=/media>
<img src=/images/323_1_10_Menu_Video.png border=0 width=217 height=228>
</a>
<br>
<a href=/media>
<b>Browse Media Files</b>
</a>
<br>
<font class=footnote>
(NOTE: The files are encrypted if they were<br>
recorded off air.)
</font>
</center>
</div>
<div style="float: left">
<center>
<a href=/sched.shtml>
<img src=/images/321_1_00_Menu_CHList.png border=0 width=217 height=228>
</a>
<br>
<a href=/sched.shtml>
<b>Scheduled Recordings</b>
</a>
<br>
</center>
</div>
<div style="float: left">
<center>
<a href=/epg.shtml>
<img src=/images/328_1_26_Menu_TV_Guide.png border=0 width=217 height=228>
</a>
<br>
<a href=/epg.shtml>
<b>EPG</b>
</a>
<br>
</center>
</div>
<div style="float: left; clear: left">
<center>
<a href=/services.shtml>
<img src=/img/spanner.jpg border=0 width=217 height=228>
</a>
<br>
<a href=/services.shtml>
<b>Service Management</b>
</a>
<br>
</center>
</div>
<div style="float: left">
<center>
<a href=/packages.shtml>
<img src=/img/packages.jpg border=0 width=217 height=228>
</a>
<br>
<a href=/packages.shtml>
<b>Package Management</b>
</a>
<br>
</center>
</div>
<!--#include virtual="/lib/footer.shtml" -->

View File

@ -0,0 +1,24 @@
var request = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try
{
request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
request = new ActiveXObject("Microsoft.XMLHTTP");
}
case (e2)
{
request = false;
}
}
@end @*/
if (!request && typeof XMLHttpRequest != 'undefined')
request = new XMLHttpRequest();

View File

@ -0,0 +1,44 @@
function highlight(obj, searchTerm)
{
var bodyText = obj.innerHTML;
stag = "<span class=yellowshade>";
etag = "</span>";
var newText = "";
var i = -1;
var lcSearchTerm = searchTerm.toLowerCase();
var lcBodyText = bodyText.toLowerCase();
while (bodyText.length > 0)
{
i = lcBodyText.indexOf(lcSearchTerm, i + 1);
if (i < 0)
{
newText += bodyText;
bodyText = "";
}
else
{
if (bodyText.lastIndexOf(">", i) >=
bodyText.lastIndexOf("<", i))
{
if (lcBodyText.lastIndexOf("/script>", i) >=
lcBodyText.lastIndexOf("<script", i))
{
newText += bodyText.substring(0, i) +
stag +
bodyText.substr(i,
searchTerm.length) + etag;
bodyText = bodyText.substr(i +
searchTerm.length);
lcBodyText = bodyText.toLowerCase();
i = -1;
}
}
}
}
obj.innerHTML = newText;
}

View File

@ -0,0 +1,24 @@
set rendertime [expr [expr [clock milliseconds] - $renderstart] / 1000.0]
puts "<font class=footnote>Rendered in: $rendertime seconds</font>"
puts {
<!-- Start of footer -->
<div class=footer>
<ul>
<li>
}
source /mod/var/mongoose/include/mediatomb.jim
puts {
MediaTomb Web Interface</a>
</li>
<li>
<a href=/db.shtml> SQLite3 Database Dump </a>
</li>
</ul>
</div>
</div>
</body>
</html>
}

View File

@ -0,0 +1,15 @@
<!-- Start of footer -->
<div class=footer>
<ul>
<li><!--#exec "/mod/var/mongoose/include/mediatomb.jim" -->
MediaTomb Web Interface</a>
</li>
<li>
<a href=/db.shtml> SQLite3 Database Dump </a>
</li>
</ul>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,20 @@
puts {
<html>
<head>
<title>Humax HD[R] Fox T2</title>
<link rel="shortcut icon" href=/img/favicon.ico>
<link href=/css/style.css rel=stylesheet type=text/css>
</head>
<body>
}
source /mod/var/mongoose/html/lib/topbar.jim
puts {
<div style="clear: both">
<!-- end of header -->
}
set renderstart [clock milliseconds]

View File

@ -0,0 +1,13 @@
<html>
<head>
<title>Humax HD[R] Fox T2</title>
<link rel="shortcut icon" href=/img/favicon.ico>
<link href=/css/style.css rel=stylesheet type=text/css>
</head>
<body>
<!--#include virtual="/lib/topbar.shtml" -->
<div style="clear: both">
<!-- end of header -->

View File

@ -0,0 +1,22 @@
puts {
<!-- start of topbar -->
<div class=container onclick="location.href='/'; return false;">
<div class=left><img src=/images/154_1_00_WIN_MD116_1L.png></div>
<div class=middle>
<img border=0 src=/images/516_1_26_Freeview_Logo.png>
<span style="font-size: 150%; padding: 0 0 0 2em;">
Humax HD[R] Fox T2
</span>
<!-- Start include diskspace -->
}
source /mod/var/mongoose/include/diskspace.jim
puts {
<!-- End include diskspace -->
</div>
<div class=right><img src=/images/154_1_00_WIN_MD116_3R.png></div>
</div>
<!-- end of topbar -->
}

View File

@ -0,0 +1,17 @@
<!-- start of topbar -->
<div class=container onclick="location.href='/'; return false;">
<div class=left><img src=/images/154_1_00_WIN_MD116_1L.png></div>
<div class=middle>
<img border=0 src=/images/516_1_26_Freeview_Logo.png>
<span style="font-size: 150%; padding: 0 0 0 2em;">
Humax HD[R] Fox T2
</span>
<!-- Start include diskspace -->
<!--#exec "/mod/var/mongoose/include/diskspace.jim" -->
<!-- End include diskspace -->
</div>
<div class=right><img src=/images/154_1_00_WIN_MD116_3R.png></div>
</div>
<!-- end of topbar -->

View File

@ -0,0 +1,14 @@
<!--#include virtual="/lib/header.shtml" -->
<h1>Package Management</h1>
<div id=results class=shadowbox style="width: 90%; display: none; margin: 1 0 1em 0">
<div>
<pre id=result_txt>
Results...
</pre>
</div>
</div>
<!--#exec "/mod/var/mongoose/include/packages.jim" -->
<!--#include virtual="/lib/footer.shtml" -->

View File

@ -0,0 +1,4 @@
<!--#include virtual="/lib/header.shtml" -->
<!--#exec "/mod/var/mongoose/include/sched.jim" -->
<!--#include virtual="/lib/footer.shtml" -->

View File

@ -0,0 +1,58 @@
<!--#include virtual="/lib/header.shtml" -->
<script type=text/javascript src=/js/ajax.js></script>
<script type=text/javascript>
function updateResults()
{
var r = document.getElementById('results');
if (r && request.readyState == 4 && request.status == 200)
{
r.style.display = 'block';
var t = document.getElementById('result_txt');
t.innerHTML = request.responseText;
}
}
function go(service, action)
{
if (service == null || service == "" ||
action == null || action == "")
return;
var url = "/cgi-bin/service.jim?service=" + escape(service) +
"&action=" + escape(action);
request.open("GET", url, true);
request.onreadystatechange = updateResults;
request.send(null);
}
function toggle(obj)
{
if (obj.src.search("on") > -1)
obj.src = '/img/off.png';
else
obj.src = '/img/on.png';
}
</script>
<h1>Service Management</h1>
<div id=results class=shadowbox style="width: 90%; display: none; margin: 1 0 1em 0">
<div>
<pre id=result_txt>
Results...
</pre>
</div>
</div>
<table class=borders cellpadding=5>
<tr class=greenshade>
<th>Service</th>
<th>Auto Startup</th>
<th>Status</th>
</tr>
<!--#exec "/mod/var/mongoose/include/services.jim" -->
</table>
<!--#include virtual="/lib/footer.shtml" -->

40
var/mongoose/include/db.jim Executable file
View File

@ -0,0 +1,40 @@
#!/mod/bin/jimsh
package require sqlite3
proc db_info {db_file} {
set db [sqlite3.open $db_file]
set tables [$db query {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}]
puts "<h1>$db_file</h1>"
foreach table $tables {
set table_name [lindex $table 1]
set columns [$db query "pragma table_info($table_name)"]
set datas [$db query "SELECT * FROM $table_name"]
puts "<h2>$table_name</h2>"
puts "<table>"
puts " <tr>"
foreach column $columns {
puts " <td>[lindex $column 3]</td>"
}
puts " </tr>"
foreach data $datas {
puts " <tr>"
for {set i 1} {$i < [llength $data]} {incr i 2} {
puts " <td>[lindex $data $i]</td>"
}
puts " </tr>"
}
puts "</table>"
}
$db close
}
puts {<style type="text/css">table, td, th {border-collapse:collapse; border:1px solid black;}</style>}
db_info /var/lib/humaxtv/rsv.db
db_info /var/lib/humaxtv/setup.db
db_info /var/lib/humaxtv/channel.db

View File

@ -0,0 +1,24 @@
#!/mod/bin/jimsh
foreach df [split [exec df -h] "\n\r"] {
if [string match *sda2* $df] {
regsub -all -- {[[:space:]]+} $df " " df
set fields [split $df]
set size [lindex $fields 1]
set used [lindex $fields 2]
set perc [string trimright [lindex $fields 4] "%"]
}
}
set file [format "%02d" [expr {$perc * 25 / 100 + 1}]]
puts "<div style=\"float: right; background:url('/images/345_1_27_ST_USB_BG.png')\">"
puts "<img src=/images/345_2_14_ST_HDD_$file.png>"
puts "</div>"
puts "<span style=\"float: right\">"
puts "<br>"
puts "Total space: $size<br>"
puts "Used: $used ($perc%)"
puts "</span>"

49
var/mongoose/include/epg.jim Executable file
View File

@ -0,0 +1,49 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/altrow
set start [clock milliseconds]
set records [epg fetch dump -time [clock seconds]]
set got [clock milliseconds]
puts {
<table class=borders>
<tr>
<th colspan=2>Channel</th>
<th>On Now</th>
<th>On Next</th>
</tr>
}
proc rsort {v1 v2} {
set v1s [$v1 get channel_num]
set v2s [$v2 get channel_num]
if {$v1s == $v2s} { return 0 }
if {$v1s > $v2s } { return 1 }
return -1
}
set i 0
foreach record [lsort -command rsort $records] {
altrow
puts "<td>[$record get channel_num]</td>"
puts "<td>
<a href=/cgi-bin/epg_service.jim?service=[$record get service_id]>
[$record get channel_name]
</a></td>"
puts [$record cell]
puts [[$record next] cell]
puts "</tr>"
}
puts "</table>"
set end [clock milliseconds]
puts "<font class=footnote>
Retrieved now in: [expr [expr $got - $start] / 1000.0] seconds.<br>
All rendered in: [expr [expr $end - $start] / 1000.0] seconds.
</font>"
epg cleanup

View File

@ -0,0 +1,12 @@
#!/mod/bin/jimsh
if { [catch {set fd [open "/mod/mediatomb/config/mediatomb.html" r]} fid] } {
exit 0
}
set data [read $fd]
close $fd
regexp {URL=([^"]*)} $data match
set url [string range $match 4 [string length $match]]
puts "<a href=$url>";

View File

@ -0,0 +1,54 @@
#!/mod/bin/jimsh
# Build a list of available packages
set avail_pkgs {}
foreach pkg [split [exec /bin/opkg list] "\n"] {
if [regexp {^ } $pkg] {
append descr $pkg
} else {
if {[regexp {^([^ ]+) - ([^ ]+) - (.*)$} \
$pkg full name ver descr] == 0} { continue }
}
set avail_pkgs($name) [concat $ver "$descr"]
#puts "Set: $name = ($ver, $descr)<br>"
}
# Build a list of installed packages - just the names
set inst_pkgs {}
foreach pkg [split [exec /bin/opkg list-installed] "\n"] {
if {[regexp {^([^ ]+)} $pkg name] == 0} { continue }
lappend inst_pkgs $name
#puts "Inst: $name<br>"
}
puts "<table class=borders>"
puts "<tr>"
puts "<th>Installed</th>"
puts "<th>Name</th>"
puts "<th>Version</th>"
puts "<th>Description</th>"
puts "</tr>"
foreach name [lsort [array names avail_pkgs]] {
set value $avail_pkgs($name)
set ver [lindex $value 0]
set descr [lrange $value 1 [llength $value]]
puts "<tr>"
puts "<td>"
if {[lsearch $inst_pkgs $name] > -1} {
puts "<img src=/img/on.png>"
} else {
puts "<img src=/img/off.png>"
}
puts "</td>"
puts "<td>$name</td>"
puts "<td>$ver</td>"
puts "<td>$descr</td>"
puts "</tr>"
}
puts "</table>"

86
var/mongoose/include/sched.jim Executable file
View File

@ -0,0 +1,86 @@
#!/mod/bin/jimsh
package require sqlite3
source /mod/var/mongoose/lib/altrow
set db [sqlite3.open /var/lib/humaxtv/rsv.db]
$db query {attach database '/var/lib/humaxtv/channel.db' as channel}
set res [$db query {
select *, channel.TBL_SVC.szSvcName, channel.TBL_SVC.usLcn,
case when ersvtype > 3 then 1 else 0 end as sort
from tbl_reservation
left join channel.TBL_SVC
on main.TBL_RESERVATION.hSvc = channel.TBL_SVC.hSvc
order by sort, nsttime
}]
puts "<table class=borders>"
puts "<tr>"
#puts "<th>Slot</th>"
puts "<th colspan=2>Programme</th>"
puts "<th>Duration</th>"
puts "<th colspan=2>Channel</th>"
puts "<th>Date/Time</th>"
puts "<th>Mode</th>"
puts "<th>Series ID</th>"
puts "</tr>"
set i 0
foreach r $res {
set name [string range $r(szevtname) 1 end]
if {[string first "i7" $name] == 0} {
set name [string range $name 2 end]
set b "*"
} else {
set b ""
}
altrow
set rsvicon ""
set alta ""
switch $r(ersvtype) {
1 { set rsvicon "175_1_00_Reservation_Watch.png" }
2 { set rsvicon "175_1_00_Reservation_Watch.png" }
3 { set rsvicon "175_1_11_Reservation_Record.png" }
5 { set rsvicon "745_1_10_Video_2Live.png"; set alta "Wake-up" }
6 { set rsvicon "745_1_11_Video_1REC.png"; set alta "Sleep" }
7 { set rsvicon "345_6_08_ST_Ad_Hoc.png"
set alta "Software Update" }
default { set alta "Unknown type $r(ersvtype)" }
}
if {$name == ""} { set name "-- $alta --" }
if {$r(ucRecKind) == 4} {
set RKIcon "175_1_11_Series_Record.png"
} else {
switch $r(erepeat) {
1 {set RKIcon "521_1_00_RP_Daily_C.png"}
2 {set RKIcon "521_1_00_RP_Weekly_C.png"}
3 {set RKIcon "521_1_00_RP_Weekdays_C.png"}
4 {set RKIcon "521_1_00_RP_Weekend_C.png"}
default {set RKIcon ""}
}
}
if {$rsvicon ne ""} {
set rsvicon "<img src='images/$rsvicon' height=15>
}
if {$RKIcon ne ""} {
set RKIcon "<img src='images/$RKIcon' height=15>
}
# puts "<td>{$r(ulslot)}</td>"
puts "<td>$b</td><td>$name</td>"
puts "<td>[clock format $r(nduration) -format %T]</td>"
puts "<td>$r(usLcn)</td>"
puts "<td>[string range $r(szSvcName) 1 end]</td>"
puts "<td>[clock format $r(nsttime) -format {%c %Z}]</td>"
puts "<td>$rsvicon $RKIcon</td>"
puts "<td>$r(szCRID)</td>"
puts "</tr>"
}
puts "</table>"
$db close

View File

@ -0,0 +1,41 @@
#!/mod/bin/jimsh
set services [split [exec /mod/bin/service mlist]]
proc button {state service action} {
puts -nonewline "<a href=#>"
puts -nonewline "<img border=0 src=/img/$state.png"
puts -nonewline " onClick=\"go('$service', '$action'); "
puts -nonewline "toggle(this); return false\">"
puts "</a>"
}
proc control {s a} {
return "<a href=/cgi-bin/service.jim?action=$a&service=$s>"
}
foreach service $services {
set data [split $service ":"]
set name [lindex $data 0]
set installed [lindex $data 1]
set auto [lindex $data 2]
set running [lindex $data 3]
puts "<tr class=even><td>$name</td>"
if (!$installed) {
puts "<td colspan=3><i>Not installed</i></td></tr>"
continue
}
puts "<td>"
if ($auto) { button on $name auto } else { button off $name auto }
puts "</td>"
puts "<td>"
if ($running) { button on $name toggle } else {
button off $name toggle }
puts "</td>"
puts "</tr>"
}

35
var/mongoose/include/status.jim Executable file
View File

@ -0,0 +1,35 @@
#!/mod/bin/jimsh
set ::env(PATH) "/mod/bin/busybox:/mod/bin:/bin"
set pid [exec pgrep humaxtv]
if {[catch {set line [exec lsof -p $pid | grep Video | fgrep .ts]} ]} {
exit
}
regsub -all -- {[[:space:]]+} $line " " line
set fields [split $line " "]
set size [lindex $fields 6]
sleep 2
set line [exec lsof -p $pid | grep Video | fgrep .ts]
regsub -all -- {[[:space:]]+} $line " " line
set fields [split $line " "]
set size2 [lindex $fields 6]
if { $size2 > $size } {
set mode "Recording"
set icon "745_1_11_Video_1REC.png"
} else {
set mode "Watching"
set icon "745_1_10_Video_2Live.png"
}
set name [lindex [split $line "/"] end]
puts "<div class=shadowbox><div>"
puts "<img src=/images/$icon>$mode $name"
puts "</div></div>"

12
var/mongoose/lib/altrow Normal file
View File

@ -0,0 +1,12 @@
if {[expr ! [exists -proc altrow ]]} {
proc altrow {} {{i 0}} {
if { $i == 0 } {
puts "<tr class=odd>"
} else {
puts "<tr class=even>"
}
set i [expr ! $i]
}
}

9
var/mongoose/lib/cat Normal file
View File

@ -0,0 +1,9 @@
if {[expr ! [exists -proc cat ]]} {
proc cat {file} {
if {[catch {set fp [open $file r]]} { return }
puts [read $fp]
close $fp
}
}

192
var/mongoose/lib/epg.class Normal file
View File

@ -0,0 +1,192 @@
if {[expr ! [exists -proc class ]]} { package require oo }
if {[expr ! [exists -proc sqlite3.open ]]} { package require sqlite3 }
source /mod/var/mongoose/lib/progressbar
set channeldb [sqlite3.open /var/lib/humaxtv/channel.db]
# * service_id, event_id, start, duration, encrypted, name, text
# * warning, content code, content type,
# * event CRID, series CRID, rec CRID
class epg {
service_id 0
event_id 0
start 0
duration 0
encrypted 0
name ""
text ""
warning ""
content_code 0
content_type ""
event_crid ""
series_crid ""
rec_crid ""
channel_num 0
channel_name ""
}
epg method channel {chnum chname} {
set channel_num $chnum
set channel_name $chname
}
epg method _parse {line} {
set vars [split $line "\t"]
set service_id [lindex $vars 0]
set event_id [lindex $vars 1]
set start [lindex $vars 2]
set duration [lindex $vars 3]
set encrypted [lindex $vars 4]
set name [lindex $vars 5]
set text [lindex $vars 6]
set warning [lindex $vars 7]
set content_code [lindex $vars 8]
set content_type [lindex $vars 9]
set event_crid [lindex $vars 10]
set series_crid [lindex $vars 11]
set rec_crid [lindex $vars 12]
}
epg method percent {} {
set now [clock seconds]
if {$start > $now} { return 0 }
if {$start + $duration < $now} { return 100 }
return [expr [expr $now - $start] * 100 / $duration]
}
epg method showing {} {
set percent [$self percent]
if {$percent > 0 && $percent < 100} { return 1 } else { return 0 }
}
epg method elapsed {} {
set percent [$self percent]
if {$percent == 0} { return 0 }
if {$percent == 100} { return $duration }
return [expr $duration * $percent / 100]
}
epg method remaining {} {
return [expr $duration - [$self elapsed]]
}
epg method cell {} {
set name [$self get name]
set text [$self get text]
set percent [$self percent]
puts "<td nowrap valign=top title=\"$text\">"
set img ""
switch -- [$self get content_code] {
1 { set img "Movie" }
2 { set img "News" }
3 { set img "Show" }
4 { set img "Sports" }
5 { set img "Children" }
6 { set img "Music" }
7 { set img "Art" }
8 { set img "Society" }
9 { set img "Education" }
10 { set img "Leisure" }
}
if {$img != ""} {
puts "<img src=/images/173_3_00_G3_$img.png height=14
alt=\"[$self get content_type]\"
title=\"[$self get content_type]\"
>"
}
if {[$self get series_crid] != ""} {
puts "<img src=/images/178_1_00_Icon_Serise.png height=14>"
}
puts "
<a href=/cgi-bin/epg_dump.jim?service=[$self get service_id]&event=[$self get event_id]>
$name</a>"
puts "<br>"
puts "<font class=footnote>"
puts "[clock format [$self get start] -format %H:%M]"
puts " ([clock format [$self get duration] -format %T])"
if {$percent > 0 && $percent < 100} {
puts "<br>[progressbar $percent]"
puts "$percent% [clock format [$self elapsed] -format %T] /
[clock format [$self remaining] -format %T]"
}
puts "</font>"
puts "</td>"
}
epg method next {} {
set tm [expr [$self get start] + [$self get duration] + 60]
set nextlist [epg fetch dump -service [$self get service_id] -time $tm]
if {[llength nextlist] > 0} {
return [lindex $nextlist 0]
} else {
return ""
}
}
proc {epg parse} {line} {
set e [epg new]
$e _parse $line
return $e
}
proc {epg cleanup} {} {
global channeldb
$channeldb close
}
proc {epg exec} {mode args} {
set raw 0
set cmd [list /mod/bin/epg]
set extra ""
foreach arg $args {
if {[string first "-" $arg] == 0} {
switch -- $arg {
-raw { set raw 1 }
-crid { lappend cmd -C $args($arg) }
-type { lappend cmd -T $args($arg) }
-service { lappend cmd -S $args($arg) }
-event { lappend cmd -E $args($arg) }
-time { lappend cmd -@ $args($arg) }
-extra { set extra $args($arg) }
default { error "Invalid option, $arg" }
}
}
}
if { $raw == 0 } { lappend cmd -p }
lappend cmd $mode
lappend cmd $extra
#puts "CMD -$cmd-"
return [exec {*}$cmd]
}
proc {epg fetch} {mode args} {
global channeldb
foreach line [split [epg exec $mode {*}$args] "\n"] {
set record [epg parse $line]
set chan [lindex [$channeldb query {
select szSvcName, usLcn from TBL_SVC
where usSvcId = %s} "[$record get service_id]"
] 0]
$record channel $chan(usLcn) \
[string range $chan(szSvcName) 1 end]
lappend records $record
}
return $records
}

View File

@ -0,0 +1,10 @@
if {[expr ! [exists -proc progressbar ]]} {
proc progressbar {percent} {
set pos [expr 118 - $percent / 100.0 * 118]
return "<img src=/img/percentimage.png
alt=\"$percent%\" class=progress
style=\"background-position: -${pos}px 0;\">"
}
}