Compare commits

...

29 Commits

Author SHA1 Message Date
hummypkg
767021557f download decrypted fiels
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@285 2a923420-c742-0410-a762-8d5b09965624
2011-08-13 00:18:42 +00:00
hummypkg
4f900f47b4 download decrypted versions of files
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@284 2a923420-c742-0410-a762-8d5b09965624
2011-08-13 00:18:12 +00:00
hummypkg
8383651367 minor bugfixes, support ffmpeg 0.8
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@282 2a923420-c742-0410-a762-8d5b09965624
2011-07-19 23:10:32 +00:00
hummypkg
d764969b8f update to 0.6.3, show alternate showings
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@280 2a923420-c742-0410-a762-8d5b09965624
2011-07-18 19:26:58 +00:00
hummypkg
301336b778 updae to 0.6.2
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@277 2a923420-c742-0410-a762-8d5b09965624
2011-07-17 21:01:27 +00:00
hummypkg
1b8761b8f3 fix diskspace bug, add sortable schedule list, fix plugin bug
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@276 2a923420-c742-0410-a762-8d5b09965624
2011-07-17 20:52:33 +00:00
hummypkg
b2f5f2c48a more attempts at chunked opkg
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@274 2a923420-c742-0410-a762-8d5b09965624
2011-07-15 23:20:57 +00:00
hummypkg
64b73ee14b create chunked module and add iajax. Update pkg to handled chunked responses
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@273 2a923420-c742-0410-a762-8d5b09965624
2011-07-14 22:22:54 +00:00
hummypkg
dbc3d21807 fix diskspace problem on HD
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@272 2a923420-c742-0410-a762-8d5b09965624
2011-07-14 19:28:00 +00:00
hummypkg
d1267cbd1e update version number
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@268 2a923420-c742-0410-a762-8d5b09965624
2011-07-12 18:57:48 +00:00
hummypkg
7643a92550 scheduling updates
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@267 2a923420-c742-0410-a762-8d5b09965624
2011-07-12 18:57:30 +00:00
hummypkg
b1176d9f64 remove etc directory
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@266 2a923420-c742-0410-a762-8d5b09965624
2011-07-11 23:30:42 +00:00
hummypkg
ded9495595 re-implemented package management. Initial suppor for remote scheduling
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@265 2a923420-c742-0410-a762-8d5b09965624
2011-07-11 23:29:21 +00:00
hummypkg
2a224c1055 bug fixes, to 0.6.0-2
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@262 2a923420-c742-0410-a762-8d5b09965624
2011-07-09 20:12:33 +00:00
hummypkg
33a72aa43f include var/backup
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@261 2a923420-c742-0410-a762-8d5b09965624
2011-07-08 22:51:33 +00:00
hummypkg
ca6129abef update version
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@258 2a923420-c742-0410-a762-8d5b09965624
2011-07-08 20:53:46 +00:00
hummypkg
42b5805c45 finish restart
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@253 2a923420-c742-0410-a762-8d5b09965624
2011-07-08 20:39:57 +00:00
hummypkg
88ada938d1 commit initial backup/restore framework and restart
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@252 2a923420-c742-0410-a762-8d5b09965624
2011-07-07 22:33:19 +00:00
hummypkg
15040206ab work on restore
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@245 2a923420-c742-0410-a762-8d5b09965624
2011-07-06 23:16:20 +00:00
hummypkg
4861459aec checkpoint backup/restore
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@236 2a923420-c742-0410-a762-8d5b09965624
2011-07-05 22:59:34 +00:00
hummypkg
5523ec6a43 initial backup function
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@235 2a923420-c742-0410-a762-8d5b09965624
2011-07-05 18:38:42 +00:00
hummypkg
5f6c7a843c new reservations screen
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@234 2a923420-c742-0410-a762-8d5b09965624
2011-07-05 00:19:02 +00:00
hummypkg
e712f38bb1 fix plugin error
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@233 2a923420-c742-0410-a762-8d5b09965624
2011-07-04 22:41:24 +00:00
hummypkg
61d879e90a update to 0.5.9
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@225 2a923420-c742-0410-a762-8d5b09965624
2011-07-04 20:02:59 +00:00
hummypkg
638d2dedb3 no caching, add draghandle, less flushing
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@224 2a923420-c742-0410-a762-8d5b09965624
2011-07-04 20:01:14 +00:00
hummypkg
d1cfff8899 restructure requires, add initial plugin class and hook into settings
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@220 2a923420-c742-0410-a762-8d5b09965624
2011-07-01 22:56:53 +00:00
hummypkg
9116c6e8a9 improve new folder icon, allow [S]CRID searches from the term box
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@216 2a923420-c742-0410-a762-8d5b09965624
2011-06-30 22:10:22 +00:00
hummypkg
6efcb5bde0 group search terms together
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@215 2a923420-c742-0410-a762-8d5b09965624
2011-06-30 00:16:10 +00:00
hummypkg
444ca7370b update to 0.5.8. Add jim.pack requirement
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@213 2a923420-c742-0410-a762-8d5b09965624
2011-06-29 23:59:00 +00:00
79 changed files with 2303 additions and 593 deletions

View File

@@ -1 +0,0 @@
etc/webif.db

View File

@@ -1,11 +1,11 @@
Package: webif
Priority: optional
Section: web
Version: 0.5.7
Version: 0.6.4
Architecture: mipsel
Maintainer: af123@hummypkg.org.uk
Depends: mongoose(>=2.11-5),jim(>=0.71-1),jim-sqlite3(>=0.71-1),jim-cgi(>=0.2),jim-oo,service-control,busybox(>=1.18.3-1),lsof,epg(>=1.0.2),hmt(>=1.0.6),ssmtp
Depends: mongoose(>=3.0-2),jim(>=0.71-1),jim-sqlite3(>=0.71-1),jim-cgi(>=0.4),jim-oo,jim-pack,service-control,busybox(>=1.18.3-1),lsof,epg(>=1.0.2),hmt(>=1.0.6),ssmtp
Replaces: af123-webif
Conflicts: af123-webif
Suggests: ffmpeg
Description: A web interface for the Humax. In development.
Description: An evolving web interface for the Humax.

Binary file not shown.

View File

@@ -0,0 +1,75 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require rsv.class
set dir /mod/var/backup
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
if {![dict exists $_cgi file]} {
puts "No filename supplied."
exit
}
set file [file tail [dict get $_cgi file]]
set ffile "/$dir/$file.rbk"
if {[file exists $ffile]} {
puts "Backup file <i>$file</i> already exists."
exit
}
if {[catch { set fd [open $ffile w] } msg]} {
puts "Error creating backup file. - $msg"
exit
}
puts "Backing up scheduled recordings and events..."
set events [rsv list]
set fields [lsort [[rsv] vars]]
#puts $fd "# [join $fields "\t"]"
foreach event $events {
puts " Backing up scheduled event '[$event name]'"
puts -nonewline $fd "event\t"
foreach f $fields {
if {$f eq "aulEventToRecordInfo"} { continue }
puts -nonewline $fd "[$event get $f]\t"
}
puts $fd ""
}
puts "Done."
puts "Backing up channel favourites..."
set grp 0
foreach res [$rsvdb query {
select eFavGroup,
TBL_FAV.eSvcType,
substr(szSvcName, 2) as szSvcName
from TBL_FAV join TBL_SVC using (hSvc)
order by eFavGroup
}] {
if {$res(eFavGroup) != $grp} {
set grp $res(eFavGroup)
puts " Group $grp"
}
puts " $res(szSvcName)"
puts $fd "fav\t$res(eFavGroup)\t$res(eSvcType)\t$res(szSvcName)"
}
puts "Done."
close $fd
rsv cleanup

View File

@@ -0,0 +1,59 @@
function refresh_files()
{
$('#backup_files').load('/cgi-bin/backup/files.jim', function() {
$('input.restore').change(function() {
$('#restore_button').removeAttr('disabled')
.button('option', 'disabled', false);
$('#delete_button').removeAttr('disabled')
.button('option', 'disabled', false);
});
});
}
$(document).ready(function() {
$('button').button();
refresh_files();
$('#backup_button').click(function() {
$('#backup_working').slideDown();
$('#results').load('/cgi-bin/backup/backup.jim?' +
$('#backup_name').serialize(), function() {
$('#results').slideDown(function() {
$('#backup_working').slideUp();
refresh_files();
});
});
});
$('#delete_button').click(function() {
var backup = $('input.restore').val();
if (confirm('Confirm deletion of ' + backup))
{
$('#results').load('/cgi-bin/backup/delete.jim?' +
$('input.restore').serialize(), function() {
$('#results').slideDown(function() {
refresh_files();
});
});
}
});
$('#restore_button').click(function() {
var backup = $('input.restore').val();
if (confirm('!!!!!!!!!!!!!!!!!!!!!!!!! PLEASE CONFIRM !!!!!!!!!!!!!!!!!!!!!!!!!\n\nAre you sure you wish to erase all scheduled recordings and favourite channels and then restore them from\n' + backup + '?'))
{
$('#restore_working').slideDown();
$('#results').load('/cgi-bin/backup/restore.jim?' +
$('input.restore').serialize(), function() {
$('#results').slideDown(function() {
$('#restore_working').slideUp();
refresh_files();
$('#restore_warning').slideDown();
$('#restart_block').load(
'/cgi-bin/restartblock.jim');
});
});
}
});
});

View File

@@ -0,0 +1,31 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
set dir /mod/var/backup
puts "Content-Type: text/html"
puts "Pragma: no-cache"
puts "Expires: Thu, 01 Jan 1970 00:00:00 GMT"
puts ""
cgi_input
#cgi_dump
if {![dict exists $_cgi restore_file]} {
puts "No filename supplied."
exit
}
set file [file tail [dict get $_cgi restore_file]]
set ffile "/$dir/$file.rbk"
if {![file exists $ffile]} {
puts "Backup file <i>$file</i> does not exist."
} elseif {[catch { file delete $ffile } msg]} {
puts "Deletion failed: $msg"
} else {
puts "Successfully deleted <i>$file</i>"
}

View File

@@ -0,0 +1,39 @@
#!/mod/bin/jimsh
package require cgi
puts "Content-Type: text/html"
puts "Pragma: no-cache"
puts "Expires: Thu, 01 Jan 1970 00:00:00 GMT"
puts ""
set dir "/mod/var/backup"
proc empty {} {
puts "<font style=\"color: grey\">
<i>No current backup files.</i>
</font>"
}
if {![file isdirectory $dir]} {
empty
exit
}
set backups [glob -nocomplain "$dir/*.rbk"]
if {![llength $backups]} {
empty
exit
}
foreach backup $backups {
set b [file rootname [file tail $backup]]
puts "<input name=restore_file class=restore
type=radio value=\"$b\">$b <font class=footnote>(
[clock format [file mtime $backup] -format {%c %Z}]
)</font></input>
<br>
"
}

View File

@@ -0,0 +1,142 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require rsv.class
set dir /mod/var/backup
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
#set _cgi(restore_file) "backup-2011-Jul-09-20:37"
if {![dict exists $_cgi restore_file]} {
puts "No filename supplied."
exit
}
set file [file tail [dict get $_cgi restore_file]]
set ffile "/$dir/$file.rbk"
if {![file exists $ffile]} {
puts "Backup file <i>$file</i> does not exist."
exit
}
if {[catch { set fd [open $ffile r] } msg]} {
puts "Error opening backup file. - $msg"
exit
}
proc findhsvc {channel} {
global rsvdb
set hsvc [$rsvdb query "
select hSvc
from channel.TBL_SVC
where szSvcName = '$channel'
or szSvcname = '\025$channel'
limit 1
"]
if {[llength $hsvc] == 1} {
return [lindex [lindex $hsvc 0] 1]
} else {
return 0
}
}
puts "Restoring scheduled events..."
$rsvdb query {begin transaction;}
$rsvdb query {delete from TBL_RESERVATION;}
set fields [lsort [[rsv] vars]]
set data [split [read $fd] "\n"]
foreach line $data {
set vals [split $line "\t"]
if {[lindex $vals 0] ne "event"} { continue }
set vars {}
set i 0
foreach f $fields {
if {$f eq "aulEventToRecordInfo"} { continue }
incr i
lappend vars $f [lindex $vals $i]
}
set rsv [rsv new $vars]
# Need to fix up channel and CRID mappings in case something has
# changed during a channel scan.
puts " Restoring [$rsv name]"
set bad 0
# First, the service number
set ohsvc [$rsv get hsvc]
if {$ohsvc > 0} {
set hsvc [$rsv fix_hsvc]
if {$hsvc == 0} {
puts " Cannot find channel, restore failed."
set bad 1
} elseif {$hsvc != $ohsvc} {
puts -nonewline " Service number has "
puts "changed $ohsvc -> $hsvc, fixing."
} else {
puts " No change in channel service."
}
}
if {!$bad} { $rsv insert }
}
$rsvdb query {commit transaction;}
puts "Restoring favourite channels..."
$rsvdb query {begin transaction;}
$rsvdb query {delete from channel.TBL_FAV}
set grp 0
foreach line $data {
set vals [split $line "\t"]
if {[lindex $vals 0] ne "fav"} { continue }
set group [lindex $vals 1]
set type [lindex $vals 2]
set chan [lindex $vals 3]
set hsvc [findhsvc $chan]
if {$grp != $group} {
set grp $group
puts " Group $grp"
}
puts " $chan"
if {!$hsvc} {
puts " Cannot map channel name to service."
continue
}
set query "
insert into channel.TBL_FAV(hSvc, eFavGroup, eSvcType)
values($hsvc, $group, $type);
"
$rsvdb query $query
}
$rsvdb query {commit transaction;}
close [open /tmp/.restartpending w]
close $fd
rsv cleanup

View File

@@ -1,14 +1,14 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
source /mod/var/mongoose/lib/pretty_size
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html"
puts ""
set ignore {.nts .thm .hmt .hmi}
set include {.ts .avi .mpg .wmv .mkv}
set include {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov}
cgi_input
#cgi_dump
@@ -46,15 +46,11 @@ proc entry {file} {{i 0}} {
if {$ext eq ".ts" && [file exists "${base}.nts"]} {
set type ts
set ts [ts fetch $file 1]
set img 741_1_10_Video_Title.png
set pad 0
set newpad "top: -6; left: 4;"
set img Video_TS
} else {
set type gen
set ts 0
set img 743_4_10_Video_Xvid_File.png
set pad "2"
set newpad "top: -2; left: 2;"
set img Video_Other
}
puts "
@@ -69,26 +65,9 @@ proc entry {file} {{i 0}} {
if {![file exists "[file rootname $file].hmi"]} { set new 1 }
}
if {$new} {
# Overlay the new image over the media one.
puts "
<span style=\"position: relative; left: 0; top 0;
padding: $pad\">
<img class=va border=0 width=45 src=/images/$img
style=\"padding: $pad;
position: relative; top: 0; left: 0\">
<img class=va border=0
src=/images/743_1_10_Video_New.png
style=\"position: absolute; $newpad
width: 18\">
</span>
"
} else {
puts "
<img class=va border=0 width=45 src=/images/$img
style=\"padding:$pad\">
"
}
if {$new} { append img _New }
puts "<img class=va border=0 src=/img/$img.png>"
puts "
$bfile
@@ -101,11 +80,15 @@ proc entry {file} {{i 0}} {
# Icons
set locked 0
set encd 0
set def unknown
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>"
@@ -119,6 +102,7 @@ proc entry {file} {{i 0}} {
# Encrypted
if {[$ts flag "Encrypted"] > 0} {
set encd 1
puts "<img class=va
src=/images/749_1_26_Video_Encryption.png
height=21>"
@@ -137,7 +121,7 @@ proc entry {file} {{i 0}} {
puts "
<a href=#>
<img class=\"opt va\" border=0 width=45 type=$type did=$i
locked=$locked
locked=$locked encd=$encd def=$def new=$new
src=/images/181_1_00_Help5_OPT_Plus.png>
</a>
<div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div>
@@ -154,7 +138,7 @@ if {[dict exists $_cgi dir]} {
######################################################################
# Render web page
source /mod/var/mongoose/html/lib/header.jim
header
puts {
<link href=/css/jquery.contextMenu.css rel=stylesheet type=text/css />
@@ -163,6 +147,8 @@ puts {
<ul id=optmenu class=contextMenu>
<li><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>
</ul>
@@ -231,7 +217,7 @@ if {$parent ne ""} {
puts "
<div class=va>
<a href=$env(REQUEST_URI)?dir=[cgi_quote_url $parent]>
<img src=/images/711_3_09_Media_Folder_UP.png class=va>
<img border=0 src=/images/711_3_09_Media_Folder_UP.png class=va>
\[parent directory\]</a>
</div>
"
@@ -246,5 +232,5 @@ foreach file [lsort [glob -nocomplain "$dir"]] {
puts "</fieldset>"
source /mod/var/mongoose/html/lib/footer.jim
footer

View File

@@ -39,8 +39,8 @@ function set_folder_new(folder, cnt)
{
folder = folder.replace(/ /g, '');
folder = folder.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
console.log("Folder: (%s) = (%s)", folder, cnt);
$('#img' + folder).attr('src', '/images/711_1_09_Media_Folder_C.png');
//console.log("Folder: (%s) = (%s)", folder, cnt);
$('#img' + folder).attr('src', '/img/Folder_New.png');
}
function new_folder_callback(data, status, xhr)
@@ -69,6 +69,18 @@ function lock_callback(file, type, id)
$.get(url, function() { window.location.reload(true); });
}
function enc_callback(file, type, id)
{
var url = '/cgi-bin/browse/enc.jim?file=' + encodeURIComponent(file);
$.get(url, function() { window.location.reload(true); });
}
function new_callback(file, type, id)
{
var url = '/cgi-bin/browse/new.jim?file=' + encodeURIComponent(file);
$.get(url, function() { window.location.reload(true); });
}
function rename_submit()
{
var s = $('#renameform_form').serialize();
@@ -98,6 +110,26 @@ function preparemenu(el, menu)
{
if (el.attr('type') == 'ts')
{
if (el.attr('def') == 'HD')
{
$('#optmenu').enableContextMenuItems('#enc');
if (el.attr('encd') == 1)
$(menu).changeContextMenuItem('#enc',
'Remove ENC');
else
$(menu).changeContextMenuItem('#enc',
'Set ENC');
}
else
$('#optmenu').disableContextMenuItems('#enc');
$('#optmenu').enableContextMenuItems('#new');
if (el.attr('new') == 1)
$(menu).changeContextMenuItem('#new', 'Mark watched');
else
$(menu).changeContextMenuItem('#new', 'Mark new');
$('#optmenu').enableContextMenuItems('#lock');
if (el.attr('locked') == 1)
{
@@ -114,7 +146,10 @@ function preparemenu(el, menu)
{
$('#optmenu').enableContextMenuItems('#delete');
$('#optmenu').disableContextMenuItems('#lock');
$('#optmenu').disableContextMenuItems('#enc');
$('#optmenu').disableContextMenuItems('#new');
}
}
@@ -139,6 +174,16 @@ var menuclick = function(action, el, pos)
file, type, id);
break;
case 'enc':
confirm_action('change the ENC flag on', enc_callback,
file, type, id);
break;
case 'new':
confirm_action('change the New flag on', new_callback,
file, type, id);
break;
case 'rename':
$('#rename').val(bfile);
$('#renameorig').val(file);
@@ -158,7 +203,8 @@ var menuclick = function(action, el, pos)
break;
case 'download':
window.location.href = file;
window.location.href = '/cgi-bin/browse/download.jim?file=' +
encodeURIComponent(file);
break;
default:

View File

@@ -0,0 +1,48 @@
#!/mod/bin/jimsh
package require cgi
package require sqlite3
source /mod/var/mongoose/lib/setup
require ts.class
cgi_input
#cgi_dump
set file [dict get $_cgi file]
set rfile [file normalize $file]
set ts [ts fetch $file]
set dmsfile /mnt/hd2/dms_cds.db
set url $file
set mime "video/ts"
if {[file exists $dmsfile]} {
set db [sqlite3.open /mnt/hd2/dms_cds.db]
set muri [$db query "
select tblresource.mimetype, contenturi
from tblresource join tblmedia using (mediaid)
where localurl = '$rfile'
"]
if {$muri != ""} {
set rec [lindex $muri 0]
set xuri [lindex $rec 3]
set mime [lindex $rec 1]
set url "http://$env(HTTP_HOST):9000/web/$xuri"
}
}
puts "Content-Type: text/plain"
puts "Refresh: 0; url=$url"
puts "Content-length: 0"
puts ""
#puts "Pragma: public"
#puts "Expires: 0"
#puts "Cache-Control: must-revalidate, post-check=0, pre-check=0"
#puts "Content-Type: application/force-download"
#puts "Content-Type: application/download"
#puts "Content-Type: $mime"
#puts "Content-Disposition: attachment; filename=\"[file tail $file]\""
#puts "Content-Transfer-Encoding: binary"
#puts "Content-Length: [file size $rfile]"

View File

@@ -0,0 +1,27 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
#set _cgi(file) "/media/My Video/The Walking Dead/The Walking Dead S01E06.ts"
set file [dict get $_cgi file]
set ts [ts fetch $file]
if {[set ts [ts fetch $file]] != 0} {
set action enc
if {[$ts flag "Encrypted"]} { set action unenc }
if {[$ts $action]} {
puts "Successfully [set action]ed $file."
} else {
puts "Problem [set action]ing $file,
[$ts get error]"
}
}

View File

@@ -0,0 +1,27 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
#set _cgi(file) "/media/My Video/The Walking Dead/The Walking Dead S01E06.ts"
set file [dict get $_cgi file]
set ts [ts fetch $file]
if {[set ts [ts fetch $file]] != 0} {
set action new
if {[$ts flag "New"]} { set action watched }
if {[$ts set_$action]} {
puts "Successfully marked $file as $action."
} else {
puts "Problem marking $file as $action,
[$ts get error]"
}
}

71
var/mongoose/cgi-bin/db.jim Executable file
View File

@@ -0,0 +1,71 @@
#!/mod/bin/jimsh
package require cgi
package require sqlite3
source /mod/var/mongoose/lib/setup
require altrow
puts "Content-Type: text/html"
puts ""
header
cgi_input
#cgi_dump
set ftab [cgi_get tab]
set fdb [cgi_get db]
if {$fdb != 0} {
puts "<h1><a href=/cgi-bin/db.jim>Remove filters</a></h1>"
}
proc db_info {db_file} {
global _cgi fdb ftab
if {$fdb != 0 && [file tail $db_file] ne $fdb} { return }
if {![file exists $db_file]} { return }
set db [sqlite3.open $db_file]
set tables [$db query {
select name from sqlite_master
where type='table' order by name
}]
puts "<h1><a href=/cgi-bin/db.jim?db=[file tail $db_file]>
$db_file</a></h1>"
foreach table $tables {
set table [lindex $table 1]
if {$ftab != 0 && $ftab ne $table} { continue }
set columns [$db query "pragma table_info($table)"]
set datas [$db query "SELECT * FROM $table order by 1"]
puts "<h2><a href=/cgi-bin/db.jim?db=[file tail $db_file]&tab=$table>$table</a></h2>"
puts "<table class=borders>"
puts " <tr>"
foreach column $columns {
puts " <th>[lindex $column 3]</th>"
}
puts " </tr>"
foreach data $datas {
altrow
for {set i 1} {$i < [llength $data]} {incr i 2} {
puts " <td>[lindex $data $i]</td>"
}
puts " </tr>"
}
puts "</table>"
}
$db close
}
db_info /var/lib/humaxtv/rsv.db
db_info /var/lib/humaxtv/setup.db
db_info /var/lib/humaxtv/channel.db
db_info /mnt/hd2/dms_cds.db
footer

View File

@@ -1,12 +1,13 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/setup
require epg.class
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/html/lib/header.jim
header
cgi_input
#cgi_dump
@@ -31,5 +32,6 @@ if { $raw == 0 } {
puts "</pre>"
epg cleanup
source /mod/var/mongoose/html/lib/footer.jim
footer

View File

@@ -1,7 +1,8 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/setup
require epg.class
puts "Content-Type: text/html"
puts ""
@@ -13,15 +14,26 @@ set service 0
catch { set service [dict get $_cgi service] }
set event 0
catch { set event [dict get $_cgi event] }
if {! [dict exists $_cgi bare]} {
source /mod/var/mongoose/html/lib/header.jim
}
if {! [dict exists $_cgi bare]} { header }
#set service 8384
#set event 25293
#set service 8448
#set event 30843
set record [lindex [epg fetch dump -service $service -event $event] 0]
$record get_channel_info
set others [$record othertimes]
puts {
<style type=text/css>
font.also
{
font-size: 0.9em;
font-style: italic;
color: #333;
background: transparent;
}
</style>
}
puts "
<table class=keyval>
@@ -33,10 +45,38 @@ puts "
<td>[$record get text]</td>
</tr><tr>
<th>Start</th>
<td>[clock format [$record get start] -format {%c %Z}]</td>
<td>[clock format [$record get start] -format {%c %Z}]
"
foreach o $others {
if {[$o ended]} { continue }
$o get_channel_info
$o process_sched
if {[$o get series_crid] eq ""} { set ro 1 } else { set ro 2 }
puts -nonewline "<br><font class=also>&nbsp;&nbsp;&nbsp;&nbsp;"
puts -nonewline "Also: "
puts -nonewline "<a class=event href=# xs=[$o get service_id] "
puts -nonewline "xe=[$o get event_id] "
puts -nonewline "sch=[$o get sched_type] rec=$ro>"
puts -nonewline "[clock format [$o get start] -format {%c %Z}]"
puts -nonewline " on "
puts -nonewline [$o channel_icon 16]
puts -nonewline "[$o get channel_name] "
puts "</a>"
puts "</font>"
}
puts "
</td>
</tr><tr>
<th>Duration</th>
<td>[clock format [$record get duration] -format %T]</td>
<td>[clock format [$record get duration] -format %T]
"
if {[$record showing]} {
puts [progressbar [$record percent]]
}
puts "
</td>
</tr><tr>
<th>Type</th>
<td>[$record get content_type] ([$record get content_code])</td>
@@ -55,8 +95,13 @@ if {[$record get warning] != ""} {
if {[$record get event_crid] != ""} {
puts "
<tr>
<th>CRID</th>
<td>[$record get channel_crid][$record get event_crid]</td>
<th>CRID</th><td>
<a href=/cgi-bin/epg_search.jim?crid=[$record get event_crid]>
<img border=0 height=14
src=/images/421_1_00_CH_Title_2R_Arrow.png>
[$record get channel_crid][$record get event_crid]
</a>
</td>
</tr>
"
}
@@ -104,8 +149,8 @@ puts "
</a>
"
epg cleanup
if {! [dict exists $_cgi bare]} {
source /mod/var/mongoose/html/lib/footer.jim
}
puts "<div id=epginfo_extra class=footnote></div>"
epg cleanup
if {! [dict exists $_cgi bare]} { footer }

View File

@@ -0,0 +1,83 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require epg.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
#set _cgi(service) 4170
#set _cgi(event) 38584
#set _cgi(type) 2
if {![dict exists $_cgi service] || ![dict exists $_cgi event]} {
puts "Error, insufficient parameters passed."
exit
}
set service $_cgi(service)
set event $_cgi(event)
set type 1
if {[dict exists $_cgi type]} { set type $_cgi(type) }
set event [lindex [epg fetch dump -service $service -event $event] 0]
if {$event eq ""} {
puts "Error, cannot find event to schedule."
exit
}
if {[$event percent] > 0} {
puts "Error, cannot record programme which has already started showing"
puts "or occurred in the past."
exit
}
$event get_channel_info
set args {}
set args(ersvtype) 3
set args(hsvc) [$event get channel_hsvc]
set args(nsttime) [$event get start]
set args(nduration) [$event get duration]
set args(usevtid) [$event get event_id]
set args(szevtname) "\025[$event get name]"
set args(eReady) 30
set ccrid [$event get channel_crid]
if {$type == 1} {
# Event
set args(ucCRIDType) 49
set args(ucRecKind) 1
set args(szCRID) "$ccrid[$event get event_crid]"
set args(szEventToRecord) "1$args(szCRID)|"
} else {
# Series
set args(ucCRIDType) 50
set args(ucRecKind) 4
set args(szCRID) "$ccrid[$event get series_crid]"
set args(szFPBRecPath) "$args(szevtname)"
set progs [lmap i [epg fetch dump -scrid [$event get series_crid]] {
if {[set ecrid [$i get event_crid]] eq ""} { continue }
list "1$::ccrid$ecrid"
}]
set args(szEventToRecord) "[join $progs "|"]|"
}
#puts $args
set msg ""
if {![file exists /mod/.schedule.testing]} { set msg "Disabled during testing" }
if {$msg ne "" || [catch {[rsv new $args] insert} msg]} {
puts "Error encountered while scheduling the recording: <i>$msg</i>"
} else {
puts "Successfully scheduled recording of <i>[$event get name]</i>"
close [open /tmp/.restartpending w]
}
epg cleanup

View File

@@ -1,36 +1,19 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/spinner.class
source /mod/var/mongoose/lib/altrow
source /mod/var/mongoose/lib/setup
require epg.class spinner.class altrow
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/html/lib/header.jim
header
puts "<script type=text/javascript src=/js/highlight.js></script>"
puts "<script type=text/javascript src=/js/jquery.highlight.js></script>"
cgi_input
#cgi_dump
source /mod/var/mongoose/lib/epg_search
[spinner new {
text "Searching EPG..."
size "1.2em"
style "margin: 1em;"
}] start
source /mod/var/mongoose/lib/epg_popup
#set _cgi [dict create term "doctor who"]
#set env(REQUEST_URI) "test"
set cmd "search"
if {$searchfull} { set cmd "searchall" }
set ct 0
catch { set ct [dict get $_cgi ct] }
set crid ""
@@ -38,6 +21,36 @@ catch { set crid [dict get $_cgi crid] }
set scrid ""
catch { set scrid [dict get $_cgi scrid] }
if {[dict exists $_cgi term]} {
set lterm [dict get $_cgi term]
if {[string match {CRID:*} $lterm]} {
set crid [string range $lterm 5 end]
} elseif {[string match {SCRID:*} $lterm]} {
set scrid [string range $lterm 6 end]
}
} elseif {$crid ne ""} {
set _cgi(term) "CRID:$crid"
} elseif {$scrid ne ""} {
set _cgi(term) "SCRID:$scrid"
}
require epg_search
[spinner new {
text "Searching EPG..."
size "1.2em"
style "margin: 1em;"
}] start
require epg_popup
#set _cgi [dict create term "doctor who"]
#set env(REQUEST_URI) "test"
set cmd "search"
if {$searchfull} { set cmd "searchall" }
if {$ct > 0 } {
set records [epg fetch dump -type $ct]
} elseif {$crid ne ""} {
@@ -82,9 +95,14 @@ foreach record [lsort -command rsort $records] {
}
altrow
$record get_channel_info
puts "<td nowrap>
set ended [$record ended]
if $ended { puts "<td nowrap class=blood>" } else { puts "<td nowrap>"}
puts "
[clock format [$record get start] -format "%a %d %b %Y"]<br>
[clock format [$record get start] -format "%H:%M %Z"]</td>"
[clock format [$record get start] -format "%H:%M %Z"]"
puts "</td>"
puts "<td>[$record get channel_num]</td>"
puts "<td>[$record channel_icon 50]</td>"
puts "<td nowrap>
@@ -94,19 +112,17 @@ foreach record [lsort -command rsort $records] {
puts [$record cell]
puts "<td>[$record get text]</td><td>[$record get warning]</td>"
puts "</tr>"
flush stdout
}
puts "</table>"
if {$searchterm != ""} {
puts "
<script type=text/javascript>
highlight(document.getElementById(\"results\"),
\"$searchterm\");
\$('#results').highlight('$searchterm');
</script>
"
}
epg cleanup
source /mod/var/mongoose/html/lib/footer.jim
footer

View File

@@ -1,15 +1,13 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/spinner.class
source /mod/var/mongoose/lib/altrow
source /mod/var/mongoose/lib/cat
source /mod/var/mongoose/lib/setup
require epg.class spinner.class altrow
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/html/lib/header.jim
header
[spinner new {
text "Loading EPG Data..."
@@ -20,12 +18,9 @@ source /mod/var/mongoose/html/lib/header.jim
cgi_input
#cgi_dump
source /mod/var/mongoose/lib/epg_popup
set service 0
set service 4351
catch { set service [dict get $_cgi service] }
require epg_popup
set service [cgi_get service 4351]
set records [epg fetch dump -service $service]
set tr [lindex $records 0]
@@ -56,21 +51,22 @@ puts {
set i 0
foreach record $records {
altrow
$record get_channel_info
set ended [$record ended]
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>"
if $ended { puts "<td nowrap class=blood>" } else { puts "<td nowrap>" }
puts "[clock format [$record get start] -format "%a %d %b %Y"]</td>"
if $ended { puts "<td nowrap class=blood>" } else { puts "<td nowrap>" }
puts "[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
footer

View File

@@ -1,18 +1,29 @@
#!/mod/bin/jimsh
package require cgi
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/lib/setup
require pkg.class chunked
cgi_input
#cgi_dump
#set _cgi(cmd) {remove binutils}
set cmd [cgi_get cmd update]
if {![dict exists $_cgi cmd]} { set _cgi(cmd) status }
start_chunked
set cmd [dict get $_cgi cmd]
set bcmd "|/mod/var/mongoose/lib/opkg $cmd"
set fd [open $bcmd r]
while {[gets $fd line] >= 0} {
chunk "$line\r\n"
#chunk_pad
}
close $fd
puts [exec /mod/var/mongoose/lib/opkg {*}$cmd]
if {$cmd eq "update"} {
chunk "Updating package meta information\r\n"
pkg fetchmeta
chunk "Done.\r\n"
}
end_chunked

98
var/mongoose/cgi-bin/pkg.jim Executable file
View File

@@ -0,0 +1,98 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require settings.class pkg.class altrow
if {[[settings] pkgdev]} { set filter 0 } else { set filter 1 }
puts "Content-Type: text/html"
puts "Pragma: no-cache"
puts "Expires: Thu, 01 Jan 1970 00:00:00 GMT"
puts ""
cgi_input
#cgi_dump
if {![dict exists $_cgi type]} { set _cgi(type) avail }
proc pkgrow {pkg} {
set name [$pkg get name]
altrow
puts "
<td nowrap>$name</td>
"
if {$::type eq "avail"} {
puts "<td nowrap>[$pkg get latest]</td>"
} else {
puts "<td nowrap>[$pkg get installed]</td>"
}
if {$::type eq "upgr"} {
puts "<td nowrap>[$pkg get latest]</td>"
}
if {[dict exists $::pkgmeta $name]} {
puts "<td>$::pkgmeta($name)</td>"
} else {
puts "<td>[$pkg get descr]</td>"
}
if {![$pkg is installed]} {
set type Install
} elseif {$::type eq "upgr" && [$pkg is upgradable]} {
set type Upgrade
} else {
set type Remove
}
puts "<td align=center><small><button id=\"[$pkg get name]\"
action=[string tolower $type]
class=[string tolower $type]>$type</button></small></td>"
puts "</tr>"
}
pkg loadmeta
set type $_cgi(type)
set pkgs [pkg $type]
if {[llength $pkgs] > 0} {
puts "<table><tr><th>Package</th>"
if {$type eq "avail"} {
puts "<th>Available</th>"
} else {
puts "<th>Installed</th>"
}
if {$type eq "upgr"} {
puts "<th>Avail</th>"
}
puts "
<th>Description</th>
<th>&nbsp;&nbsp;Action&nbsp;&nbsp;</th>
</tr>
"
foreach pkg $pkgs {
if {$filter && ![dict exists $::pkgmeta $pkg]} { continue }
pkgrow [pkg load $pkg]
}
puts "</table>"
if {$filter} {
puts "<font class=footnote>This is a filtered package list. To show all packages, enable the <i>Show development and advanced packages</i> in the settings screen.</font>"
}
} else {
puts "<i>No packages "
switch $type {
inst { puts "are installed." }
upgr { puts "are available for upgrade." }
avail { puts "are available for installation." }
}
puts "</i>"
}

View File

@@ -0,0 +1,9 @@
#!/mod/bin/jimsh
puts "Content-Type: text/html"
puts ""
#puts [exec /etc/init.d/S90settop restart]
#file delete /tmp/.restartpending
puts [exec killall humaxtv]

View File

@@ -0,0 +1,7 @@
#!/mod/bin/jimsh
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/include/restart.jim

View File

@@ -1,7 +1,9 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/settings.class
package require cgi
source /mod/var/mongoose/lib/setup
require settings.class
require plugin
puts "Content-Type: text/html"
puts ""
@@ -14,11 +16,11 @@ set settings [settings new]
set hostname [$settings hostname]
set smtp_server [$settings smtp_server]
set channel_group [$settings channel_group]
set pkgdev [$settings pkgdev]
# Handle updates
#set _cgi(smtp_server) "fred.bob"
#set env(REQUEST_URI) ''
if {![dict exists $env REQUEST_URI]} { set env(REQUEST_URI) "" }
proc _handle_update {class var old text} {
global _cgi
@@ -49,18 +51,20 @@ proc handle_str_update {var old {text "Value"}} {
handle_str_update hostname $hostname Hostname
_handle_update ascii smtp_server $smtp_server "SMTP Server"
handle_int_update channel_group $channel_group "Channel Group"
if {[dict exists $_cgi pkgdevoff] && ![dict exists $_cgi pkgdev]} {
set _cgi(pkgdev) 0
}
handle_int_update pkgdev $pkgdev "Development Package Display"
header
source /mod/var/mongoose/html/lib/header.jim
puts {<script type="text/javascript" src="/js/jquery.form.js"></script>}
puts {
<style type=text/css>
.ui-button, .ui-button-text { padding: 0; font-size: 10px; }
</style>
<script type=text/javascript>
$(document).ready(function () {
$(":submit").button();
$('form').each(function(i, el) {
$('form.auto').each(function(i, el) {
var id = $(this).attr('id');
var output = '#' + id + '_output'
$(this).ajaxForm({
@@ -77,6 +81,9 @@ puts {
}
puts "
<link href=/css/iphone-style-checkboxes.css rel=stylesheet type=text/css />
<script type=\"text/javascript\" src=\"/js/iphone-style-checkboxes.js\">
</script>
<fieldset style=\"display: inline\">
<legend>
General Settings
@@ -86,12 +93,14 @@ puts "
puts "
<tr>
<form id=hostname method=get action=$env(REQUEST_URI)>
<form class=auto id=hostname method=get action=$env(REQUEST_URI)>
<th class=key>Hostname</th>
<td><input name=hostname value=\"$hostname\"
class=\"text ui-widget-content ui-corner-all\"
length=20 maxlength=50>
<small>
<input id=hostname_submit value=\"change\" type=submit>
</small>
<div id=hostname_output></div>
</td>
</form>
@@ -100,7 +109,7 @@ puts "
puts "
<tr>
<form id=channel_group method=get action=$env(REQUEST_URI)>
<form class=auto id=channel_group method=get action=$env(REQUEST_URI)>
<th class=key>Channel Group for EPG</th>
<td><select id=channel_group name=channel_group
class=\"text ui-widget-content ui-corner-all\"
@@ -120,7 +129,9 @@ foreach grp [$settings channel_groups] {
puts "
</select>
<small>
<input name=channel_group value=\"set\" type=submit>
</small>
<div id=channel_group_output></div>
</td>
</form>
@@ -138,12 +149,14 @@ puts "
puts "
<tr>
<form id=smtp_server method=get action=$env(REQUEST_URI)>
<form class=auto id=smtp_server method=get action=$env(REQUEST_URI)>
<th class=key>SMTP Server for outbound email</th>
<td><input name=smtp_server value=\"$smtp_server\"
class=\"text ui-widget-content ui-corner-all\"
length=20 maxlength=50>
<small>
<input id=smtp_server_submit value=\"change\" type=submit>
</small>
<div id=smtp_server_output></div>
</td>
</form>
@@ -153,7 +166,37 @@ puts "
puts "
</table>
</fieldset>
<br><br>
<fieldset style=\"display: inline\">
<legend> Advanced Settings </legend>
<table>
"
source /mod/var/mongoose/html/lib/footer.jim
puts "
<tr>
<form class=auto id=pkgdev method=get action=$env(REQUEST_URI)>
<th class=key>Show development and advanced packages?</th>
<td><input name=pkgdevoff value=0 type=hidden>
<input name=pkgdev id=pkgdev value=1 type=checkbox
"
if {$pkgdev} { puts " checked" }
puts {
>
<small>
<input id=pkgdev_submit value="save" type=submit>
</small>
<div id=pkgdev_output></div>
</td>
</form>
</tr>
}
puts "
</table>
</fieldset>
"
eval_plugins settings
footer

View File

@@ -3,10 +3,6 @@
puts "Content-Type: text/html"
puts ""
#puts "<img style=\"vertical-align: middle\" src=/images/745_1_11_Video_1REC.png><span style=\"vertical-align: middle\">Recording one thing</span>"
#puts "<img style=\"vertical-align: middle\" src=/images/745_1_11_Video_1REC.png><span style=\"vertical-align: middle\">Recording another thing</span>"
#puts "<img style=\"vertical-align: middle\" src=/images/745_1_10_Video_2Live.png><span style=\"vertical-align: middle\">Watching something else</span>"
if {[catch {set pid [exec pgrep humaxtv]}]} { exit }
if {[catch {set data [exec lsof -p $pid | grep Video | fgrep .ts]} ]} {

View File

@@ -0,0 +1,13 @@
#!/mod/bin/jimsh
set url "http://$env(HTTP_HOST):9091/"
puts "Content-Type: text/html
Location: $url
<meta http-equiv=refresh content=\"0; url=$url\">
Transmission is available <a href=$url>here</a>
"

View File

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

View File

@@ -1,62 +1,62 @@
/* Generic context menu styles */
.contextMenu {
position: absolute;
width: 120px;
z-index: 99999;
border: solid 1px #CCC;
background: #EEE;
padding: 0px;
margin: 0px;
display: none;
}
.contextMenu LI {
list-style: none;
padding: 0px;
margin: 0px;
}
.contextMenu A {
color: #333;
text-decoration: none;
display: block;
line-height: 20px;
height: 20px;
background-position: 6px center;
background-repeat: no-repeat;
outline: none;
padding: 1px 5px;
padding-left: 28px;
}
.contextMenu LI.hover A {
color: #FFF;
background-color: #3399FF;
}
.contextMenu LI.disabled A {
color: #AAA;
cursor: default;
}
.contextMenu LI.hover.disabled A {
background-color: transparent;
}
.contextMenu LI.separator {
border-top: solid 1px #CCC;
}
/*
Adding Icons
You can add icons to the context menu by adding
classes to the respective LI element(s)
*/
.contextMenu LI.edit A { background-image: url(images/page_white_edit.png); }
.contextMenu LI.cut A { background-image: url(images/cut.png); }
.contextMenu LI.copy A { background-image: url(images/page_white_copy.png); }
.contextMenu LI.paste A { background-image: url(images/page_white_paste.png); }
.contextMenu LI.delete A { background-image: url(images/page_white_delete.png); }
.contextMenu LI.quit A { background-image: url(images/door.png); }
/* Generic context menu styles */
.contextMenu {
position: absolute;
width: 150px;
z-index: 99999;
border: solid 1px #CCC;
background: #EEE;
padding: 0px;
margin: 0px;
display: none;
}
.contextMenu LI {
list-style: none;
padding: 0px;
margin: 0px;
}
.contextMenu A {
color: #333;
text-decoration: none;
display: block;
line-height: 20px;
height: 20px;
background-position: 6px center;
background-repeat: no-repeat;
outline: none;
padding: 1px 5px;
padding-left: 28px;
}
.contextMenu LI.hover A {
color: #FFF;
background-color: #3399FF;
}
.contextMenu LI.disabled A {
color: #AAA;
cursor: default;
}
.contextMenu LI.hover.disabled A {
background-color: transparent;
}
.contextMenu LI.separator {
border-top: solid 1px #CCC;
}
/*
Adding Icons
You can add icons to the context menu by adding
classes to the respective LI element(s)
*/
.contextMenu LI.edit A { background-image: url(images/page_white_edit.png); }
.contextMenu LI.cut A { background-image: url(images/cut.png); }
.contextMenu LI.copy A { background-image: url(images/page_white_copy.png); }
.contextMenu LI.paste A { background-image: url(images/page_white_paste.png); }
.contextMenu LI.delete A { background-image: url(images/page_white_delete.png); }
.contextMenu LI.quit A { background-image: url(images/door.png); }

View File

@@ -52,6 +52,13 @@ div.footer
padding-top: 2em;
}
div.warningbox
{
background: url('/img/redshade.png') repeat-x;
padding: 0.5em;
margin: 1em;
}
table
{
empty-cells: show;
@@ -236,8 +243,18 @@ img.progress
display: block;
}
.hidden
{
display: none;
}
input.text
{
padding: .4em;
}
.highlight
{
background-color: yellow;
}

View File

@@ -0,0 +1,21 @@
table.tablesorter .header {
background-image: url(/img/tsort/bg.png);
background-repeat: no-repeat;
border-left: 1px solid #FFF;
border-right: 1px solid #000;
border-top: 1px solid #FFF;
padding-left: 30px;
padding-top: 8px;
height: auto;
}
table.tablesorter .headerSortUp {
background-image: url(/img/tsort/asc.png);
background-repeat: no-repeat;
}
table.tablesorter .headerSortDown {
background-image: url(/img/tsort/desc.png);
background-repeat: no-repeat;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -19,6 +19,8 @@ $(document).ready(function() {
});
</script>
<div style="clear: both">
<div style="float: left">
<center>
<a href=/cgi-bin/browse.jim>
@@ -39,7 +41,7 @@ $(document).ready(function() {
</a>
<br>
<a href=/sched.shtml>
<b>Scheduled Recordings</b>
<b>Scheduled Events</b>
</a>
<br>
</center>
@@ -56,8 +58,11 @@ $(document).ready(function() {
<br>
</center>
</div>
</div>
<div style="float: left; clear: left">
<div style="clear: both; padding-top: 1em">
<div style="float: left">
<center>
<a href=/services.shtml>
<img src=/img/spanner.jpg border=0 width=217 height=228>
@@ -72,11 +77,11 @@ $(document).ready(function() {
<div style="float: left">
<center>
<a href=/packages.shtml>
<a href=/pkg.shtml>
<img src=/img/packages.jpg border=0 width=217 height=228>
</a>
<br>
<a href=/packages.shtml>
<a href=/pkg.shtml>
<b>Package Management</b>
</a>
<br>
@@ -97,13 +102,16 @@ $(document).ready(function() {
</center>
</div>
</div>
<div style="clear: both">
<!--#exec cmd="/mod/var/mongoose/include/mediatomb.jim" -->
<!--#exec cmd="/mod/var/mongoose/include/transmission.jim" -->
</div>
<div class=footer>
<ul>
<li>
<!--#exec cmd="/mod/var/mongoose/include/mediatomb.jim" -->
MediaTomb Web Interface</a>
</li><li>
<a href=/db.shtml target=_blank>SQLite3 Database Dump</a>
<a href=/cgi-bin/db.jim target=_blank>SQLite3 Database Dump</a>
</li><li>
<a href=/jim/ref.html target=_blank>Jim Reference Manual</a> |
<a href=/jim/oo.html target=_blank>OO</a> |

View File

@@ -0,0 +1,50 @@
jQuery.ajaxPrefilter(function(options, _, jqXHR) {
if (jQuery.isFunction(options.progress)) {
var xhrFactory = options.xhr,
interval;
options.xhr = function() {
var xhr = xhrFactory.apply(this, arguments),
partial = "",
prevcount = 1;
interval = setInterval(function() {
var responseText,
jQueryPartial;
try {
responseText = xhr.responseText;
if (responseText && (responseText.length > partial.length))
{
partial = responseText;
jQueryPartial = $(partial).filter("*")
if (jQueryPartial.length > prevcount) {
prevcount = jQueryPartial.length;
options.progress(jQueryPartial.filter("*:not(:last)"));
}
}
} catch(e) {
alert(e);
}
}, options.progressInterval);
return xhr;
};
function stop()
{
if (interval)
clearInterval(interval);
}
jqXHR.then(stop, stop);
}
});

View File

@@ -0,0 +1,53 @@
/*
highlight v3
Highlights arbitrary terms.
<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>
MIT license.
Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>
*/
jQuery.fn.highlight = function(pat) {
function innerHighlight(node, pat) {
var skip = 0;
if (node.nodeType == 3) {
var pos = node.data.toUpperCase().indexOf(pat);
if (pos >= 0) {
var spannode = document.createElement('span');
spannode.className = 'highlight';
var middlebit = node.splitText(pos);
var endbit = middlebit.splitText(pat.length);
var middleclone = middlebit.cloneNode(true);
spannode.appendChild(middleclone);
middlebit.parentNode.replaceChild(spannode, middlebit);
skip = 1;
}
}
else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
for (var i = 0; i < node.childNodes.length; ++i) {
i += innerHighlight(node.childNodes[i], pat);
}
}
return skip;
}
return this.each(function() {
innerHighlight(this, pat.toUpperCase());
});
};
jQuery.fn.removeHighlight = function() {
return this.find("span.highlight").each(function() {
this.parentNode.firstChild.nodeName;
with (this.parentNode) {
replaceChild(this.firstChild, this);
normalize();
}
}).end();
};

File diff suppressed because one or more lines are too long

View File

@@ -1,33 +0,0 @@
$(document).ready(function() {
$('button').button();
var $dialog = $('#dialogue').dialog({
title: "Package Management Results",
modal: false, autoOpen: false,
height: 500, width: 700,
show: 'scale', hide: 'fade',
draggable: true, resizable: true,
buttons: { "Close":
function() {$(this).dialog('close');}},
close: function(e,u) { window.location.reload(true); }
});
var opkg = '/cgi-bin/opkg.jim?cmd=';
$('#opkgupdate').click(function() {
$('#result_txt').load(opkg + 'update');
$('#results').show('slow');
});
$('button.remove, button.install, button.upgrade').click(function() {
$('#dspinner').show();
$('#dresults').load(
opkg + encodeURIComponent(
$(this).attr('action') + ' ' + $(this).attr('id')
),
function() { $('#dspinner').hide('slow') });
$dialog.dialog('open');
});
});

View File

@@ -16,6 +16,9 @@ puts {
}
source /mod/var/mongoose/html/lib/topbar.jim
puts "<div id=restart_block>"
source /mod/var/mongoose/include/restart.jim
puts "</div>"
puts {
<div style="clear: both">

View File

@@ -1,6 +1,8 @@
<html>
<head>
<title><!--#exec cmd="/mod/var/mongoose/include/model.jim" --></title>
<meta http-equiv="expires" value="Thu, 01 Jan 1970 00:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<link rel="shortcut icon" href=/img/favicon.ico />
<link href=/css/style.css rel=stylesheet type=text/css />
<link type="text/css" href="/css/jquery-ui.css" rel="Stylesheet" />
@@ -10,6 +12,9 @@
<body>
<!--#include virtual="/lib/topbar.shtml" -->
<div id=restart_block>
<!--#exec cmd="/mod/var/mongoose/include/restart.jim" -->
</div>
<div style="clear: both">

View File

@@ -4,17 +4,18 @@ puts {
<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;">
}
source /mod/var/mongoose/include/model.jim
puts {
</span>
<!-- Start include diskspace -->
<!-- Start include diskspace - above other items to work around IE feature.. -->
}
source /mod/var/mongoose/include/diskspace.jim
puts {
<!-- End include diskspace -->
<img border=0 src=/images/516_1_26_Freeview_Logo.png>
<span style="display: inline; font-size: 150%;
padding: 0 0 0 2em;">
}
source /mod/var/mongoose/include/model.jim
puts {
</span>
</div>
<div class=right><img src=/images/154_1_00_WIN_MD116_3R.png></div>
</div>

View File

@@ -3,13 +3,13 @@
<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;">
<!--#exec cmd="/mod/var/mongoose/include/model.jim" -->
</span>
<!-- Start include diskspace -->
<!-- Start include diskspace - above other items to work around IE feature.. -->
<!--#exec cmd="/mod/var/mongoose/include/diskspace.jim" -->
<!-- End include diskspace -->
<img border=0 src=/images/516_1_26_Freeview_Logo.png>
<span style="font-size: 1.5em; padding: 0 0 0 2em;">
<!--#exec cmd="/mod/var/mongoose/include/model.jim" -->
</span>
</div>
<div class=right><img src=/images/154_1_00_WIN_MD116_3R.png></div>
</div>

View File

@@ -1,21 +0,0 @@
<!--#include virtual="/lib/header.shtml" -->
<h1 class=vam>Package Management
<button class=vam id=opkgupdate>Update package list from Internet</button>
</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>
<div id=dialogue style="display: none; align: center">
<pre id=dresults></pre>
<div id=dspinner><img src=/img/loading.gif>Processing...</div>
</div>
<!--#exec cmd="/mod/var/mongoose/include/packages.jim" -->
<!--#include virtual="/lib/footer.shtml" -->

141
var/mongoose/html/pkg.shtml Normal file
View File

@@ -0,0 +1,141 @@
<!--#include virtual="/lib/header.shtml" -->
<style type=text/css>
button.install
{
display: none;
background-image: none;
background: #ccff99;
}
button.remove
{
display: none;
background-image: none;
background: #ff6666;
}
button.upgrade
{
display: none;
}
</style>
<div class=va style="padding: 0 0 1em 0">
<h1 style="display: inline" class=va>Package Management</h1>
<small>
<button class=va id=opkgupdate style="display: none">
Update package list from Internet
</button>
</small>
</div>
<div id=results class=shadowbox
style="width: 90%; display: none; margin: 1 0 1em 0">
<div>
<pre id=result_txt>
Updating package list...
</pre>
</div>
</div>
<div id=dialogue style="display: none; align: center">
<pre id=dresults></pre>
<div id=dspinner><img border=0 src=/img/loading.gif>Processing request...</div>
</div>
<script type=text/javascript src=/js/iajax.js></script>
<script type=text/javascript>
var opkg = '/cgi-bin/opkg.jim?cmd=';
$(document).ready(function() {
$('#opkgupdate')
.button()
.click(function() { execopkg('update'); })
.fadeIn('slow');
$('#pkgtabs').tabs({
load: setup_buttons,
spinner: '<img border=0 src=/img/loading.gif> ' +
'<em>Loading...</em>'
});
var $dialog = $('#dialogue').dialog({
title: "Package Management Results",
modal: false, autoOpen: false,
height: 500, width: 700,
show: 'scale', hide: 'fade',
draggable: true, resizable: true,
buttons: { "Close":
function() {$(this).dialog('close');}},
close: function(e,u) { window.location.reload(true); }
});
jQuery.ajaxSetup({progressInterval: 1});
function loaddata(data, isfinal)
{
console.log('loaddata called, final=' + isfinal);
console.log('Data: ' + data);
$('#dresults').append(data);
if (isfinal)
$('#dspinner').hide('slow');
}
function execopkg(arg)
{
$('#dspinner').show();
$dialog.dialog('open');
$('#dresults').empty();
$.ajax({
type: "GET",
url: opkg + arg,
progress: loaddata,
success: function(data) {
console.log("ajax success");
loaddata(data, true);
},
error: function(_, _, e) {
console.log("ajax error");
alert(e);
}
});
}
function setup_buttons()
{
$('button.remove, button.install, button.upgrade')
.button()
.click(function() {
if ($(this).attr('action') == 'remove' &&
!confirm('Please confirm removal of the ' +
$(this).attr('id') + ' package.'))
return;
execopkg(encodeURIComponent($(this).attr('action') +
' ' + $(this).attr('id')));
}).fadeIn('slow');
}
});
</script>
<div id=pkgtabs>
<ul>
<li>
<a href=/cgi-bin/pkg.jim?type=inst>
<span>Installed</span>
</a>
</li><li>
<a href=/cgi-bin/pkg.jim?type=upgr>
<span>Upgrades</span>
</a>
</li><li>
<a href=/cgi-bin/pkg.jim?type=avail>
<span>Available</span>
</a>
</li>
</ul>
</div>
<!--#include virtual="/lib/footer.shtml" -->

View File

@@ -1,4 +1,6 @@
<!--#include virtual="/lib/header.shtml" -->
<script type="text/javascript" src="/js/jquery.tablesorter.js"></script>
<link type=text/css href=/css/tsort.css rel=Stylesheet />
<!--#exec cmd="/mod/var/mongoose/include/sched.jim" -->
<!--#include virtual="/lib/footer.shtml" -->

66
var/mongoose/include/backup.jim Executable file
View File

@@ -0,0 +1,66 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/setup
require altrow rsv.class
puts {
<script type=text/javascript src=/cgi-bin/backup/backup.js></script>
<h2>Backup/Restore</h2>
<div id=restore_warning class="hidden warningbox">
<center>
<b>!!!!!!!!!!!!!! PLEASE NOTE !!!!!!!!!!!!!!
<br><br>
After restoring the scheduled recordings you <b>MUST</b> restart the box using
the link at the top of the screen or via the remote control and then add
at least one scheduled entry using the remote control
(which you can then delete).
</div>
<div style="clear: both; float: left; width: 40%; border: 1px solid grey;
padding: 1em">
To create a backup of your current favourite channel configuration and
scheduled recordings, enter a name in the box below and click the button.
A suggested name has been entered for you.
<p>
}
puts "<input type=text size=30 maxlength=50 id=backup_name name=file
class=\"text ui-widget-content ui-corner-all\"
value=\"[clock format [clock seconds] -format "backup-%Y-%b-%d-%H:%M"]\">"
puts "<button id=backup_button>Create Backup</button>"
puts {
<br>
<div id=backup_working class=va style="display: none;">
<img class=va src=/img/loading.gif>&nbsp;
<font class=footnote>Backing up...</font>
</div>
</div>
<div id=backup_files_outer
style="float: left; width: 40%; border: 1px solid grey; margin-left: 1em;
padding: 0 1em 1em 1em">
<h3>Available Backups</h3>
<div id=backup_files style="padding: 0 0 0 2em">
<img src=/img/loading.gif>Retrieving list of backups...
</div>
<br>
<button id=restore_button disabled>Restore Backup</button>
<button id=delete_button disabled>Delete Backup</button>
<br>
<div id=restore_working class=va style="display: none;">
<img class=va src=/img/loading.gif>&nbsp;
<font class=footnote>Restoring...</font>
</div>
</div>
<div id=results class=pre
style="display: none; clear: both; float: left; padding: 1em;
margin-top: 1em; border: 1px solid grey; width: 70%">
</div>
}

View File

@@ -1,43 +0,0 @@
#!/mod/bin/jimsh
package require sqlite3
source /mod/var/mongoose/lib/altrow
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 " <th>[lindex $column 3]</th>"
}
puts " </tr>"
foreach data $datas {
altrow
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

@@ -1,30 +1,49 @@
#!/mod/bin/jimsh
if {[os.gethostname] eq "hosting"} {
set size "1TB"
set used "100GB"
set perc "10"
} else {
foreach df [split [exec df -h 2>>/dev/null] "\n\r"] {
if [string match *sd*2* $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] "%"]
}
proc extract {line} {
regsub -all -- {[[:space:]]+} $line " " line
set fields [split $line]
set ::size [lindex $fields 1]
set ::used [lindex $fields 2]
set ::perc [string trimright [lindex $fields 4] "%"]
}
set used 0
set size 0
set perc 0
foreach df [split [exec df -h 2>>/dev/null] "\n\r"] {
if {[string match *sd?2* $df]} {
extract $df
break;
}
if {[string match *media/drive? $df]} {
extract $df
}
}
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>"
# The HD model only has the USB images which are blue. I prefer the green
# one so use those if available.
if {[file exists /opt/share/images/blue/345_2_14_ST_HDD_01.png]} {
set prefix 345_2_14_ST_HDD
} else {
set prefix 345_1_27_ST_USB
}
puts "
<span style=\"float: right;
background:url('/images/345_1_27_ST_USB_BG.png')
no-repeat\">
<img src=/images/${prefix}_$file.png>
</span>
<span style=\"float: right\">
<br>
Total space: $size<br>
Used: $used ($perc%)
</span>
"

View File

@@ -1,10 +1,8 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/spinner.class
source /mod/var/mongoose/lib/altrow
source /mod/var/mongoose/lib/epg_search
source /mod/var/mongoose/lib/setup
require epg.class spinner.class altrow epg_search
[spinner new {
text "Loading Now/Next Information..."
@@ -12,7 +10,7 @@ source /mod/var/mongoose/lib/epg_search
style "margin: 1em;"
}] start
source /mod/var/mongoose/lib/epg_popup
require epg_popup
set start [clock milliseconds]
set records [epg fetch dump -time [clock seconds]]

View File

@@ -8,5 +8,18 @@ close $fd
regexp {URL=([^"]*)} $data match
set url [string range $match 4 [string length $match]]
puts "<a href=$url>";
puts "
<div style=\"float: left; padding-top: 5em\">
<center>
<a href=$url>
<img border=0 src=/img/mediatomb.png width=180>
</a>
<br>
<a href=$url>
<b>MediaTomb</b>
</a>
<br>
</center>
</div>
"

View File

@@ -1,58 +0,0 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/pkg.class
puts {
<style type=text/css>
.ui-button, .ui-button-text { padding: 0; font-size: 12px; }
</style>
<script type=text/javascript src=/js/packages.js></script>
<table class=borders>
<tr>
<th>Package</th>
<th>Installed</th>
<th>Avail</th>
<th>Description</th>
</tr>
}
set avail [pkg avail]
foreach name [lsort [array names avail]] {
set pkg [pkg load $name $avail($name)]
if {![$pkg is installed]} {
puts "<tr>"
} elseif {[$pkg is upgradable]} {
puts "<tr class=yellowshade>"
} else {
puts "<tr class=greenshade>"
}
puts "
<td>$name</td>
<td>[$pkg get installed]</td>
<td>[$pkg get latest]</td>
<td>[$pkg get descr]</td>
"
if {![$pkg is installed]} {
set type Install
} elseif {[$pkg is upgradable]} {
set type Upgrade
} else {
set type Remove
}
puts "<td align=center><button id=\"$name\"
action=[string tolower $type]
class=[string tolower $type]>$type</button></td>"
puts "</tr>"
}
puts "</table>"

46
var/mongoose/include/pkg.jim Executable file
View File

@@ -0,0 +1,46 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/setup
puts {
<script type=text/javascript src=/js/packages.js></script>
<style type=text/css>
button.install
{
display: none;
background-image: none;
background: #ccff99;
}
button.remove
{
display: none;
background-image: none;
background: #ff6666;
}
button.upgrade
{
display: none;
}
</style>
<div id=pkgtabs>
<ul>
<li>
<a href=/cgi-bin/pkg.jim?type=inst>
<span>Installed</span>
</a>
</li><li>
<a href=/cgi-bin/pkg.jim?type=upgr>
<span>Upgrades</span>
</a>
</li><li>
<a href=/cgi-bin/pkg.jim?type=avail>
<span>Available</span>
</a>
</li>
</ul>
</div>
}

View File

@@ -0,0 +1,52 @@
#!/mod/bin/jimsh
if {[file exists /tmp/.restartpending]} {
puts {
<center>
<div style="width: 60%; height: 0.7em;
background: url(/img/stripes.gif) repeat-x;"></div>
<div style="font-size: 1.2em; width: 60%; text-align: center; padding: 0.5em">
A restart is required in order to complete a scheduling operation.
<br>
<font class=blood>
}
# Is humaxtv doing anything?
set pid [exec pgrep humaxtv]
set c 0
catch { set c [exec /mod/bin/lsof -p $pid | grep Video | fgrep .ts | wc -l] }
if {$c > 0} {
puts "Cannot restart whilst box is busy."
} else {
puts {
Restart via the remote control or
<small><button id=restart_humaxtv>Restart now</button></small>
}
}
puts {
</font>
</div>
<div style="width: 60%; height: 0.7em; margin-bottom: 2em;
background: url(/img/stripes.gif) repeat-x;"></div>
</center>
<script type=text/javascript>
$('#restart_humaxtv').button();
$('#restart_humaxtv').click(function() {
if (confirm('Are you sure you wish to perform a warm restart now?'))
{
$.ajax({
url: '/cgi-bin/restart.jim',
success: function() {
window.location.reload(true);
}
});
}
});
</script>
}
}

View File

@@ -1,62 +1,84 @@
#!/mod/bin/jimsh
package require sqlite3
source /mod/var/mongoose/lib/setup
require altrow rsv.class progressbar
source /mod/var/mongoose/lib/altrow
set events [rsv list]
set db [sqlite3.open /var/lib/humaxtv/rsv.db]
$db query {attach database '/var/lib/humaxtv/channel.db' as channel}
puts {
<script type=text/javascript>
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
}]
$.tablesorter.addParser({
id: 'programme',
is: function () { return false; },
format: function(s) {
return s.toLowerCase().replace(/---/, 'zzz');
},
type: 'text'
});
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>Event/Series ID</th>"
puts "</tr>"
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 ""
}
$.tablesorter.addParser({
id: 'date',
is: function () { return false; },
format: function(s) {
var d = new Date(s.substring(0, s.length - 4));
return d.getTime();
},
type: 'numeric'
});
$(document).ready(function() {
$('#schedtable').tablesorter({
headers: {
1: { sorter: false },
3: { sorter: 'programme' },
4: { sorter: 'date' },
5: { sorter: 'date' },
5: { sorter: false },
6: { sorter: false },
7: { sorter: false }
}
});
});
</script>
<table id=schedtable class="borders tablesorter">
<thead>
<tr>
<th></th>
<th>&nbsp;</th><th>Channel</th>
<th>Programme</th>
<th>Start Time</th>
<th>Duration</th>
<th>Mode</th>
<th>Event/Series ID</th>
<th>Events</th>
</tr>
</thead>
<tbody>
}
foreach event $events {
set name [$event name]
altrow
set rsvicon ""
set alta ""
switch $r(ersvtype) {
switch [$event get 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 "Auto Update" }
default { set alta "Unknown type $r(ersvtype)" }
5 { set rsvicon "745_1_10_Video_2Live.png" }
6 { set rsvicon "745_1_11_Video_1REC.png" }
7 { set rsvicon "345_6_08_ST_Ad_Hoc.png" }
}
if {$name == ""} { set name "-- $alta --" }
set series 0
if {$r(ucRecKind) == 4} {
if {[$event get ucRecKind] == 4} {
set RKIcon "175_1_11_Series_Record.png"
set series 1
} else {
switch $r(erepeat) {
switch [$event get 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"}
@@ -66,38 +88,100 @@ foreach r $res {
}
if {$rsvicon ne ""} {
set rsvicon "<img src='images/$rsvicon' height=15>
set rsvicon "<img src='images/$rsvicon' height=20>
}
if {$RKIcon ne ""} {
set RKIcon "<img src='images/$RKIcon' height=15>
set RKIcon "<img src='images/$RKIcon' height=20>
}
# 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>"
if { $r(nsttime) < [clock seconds] } {
puts "<td class=blood>"
puts "<td>[$event get ulslot]</td>"
if {[$event get usLcn] ne ""} {
puts "
<td>
<img src=\"/img/channels/[$event channel_name].png\"
width=50>
</td>
<td nowrap>[$event get usLcn]<br>
[$event channel_name]</td>
"
} else {
puts "<td>"
puts "<td>&nbsp;<br><br></td><td>&nbsp;</td>"
}
puts "[clock format $r(nsttime) -format {%c %Z}]</td>"
puts "<td>$rsvicon $RKIcon</td>"
puts "<td>"
set crid [join [lrange [split $r(szCRID) "/"] 1 end]]
puts "<td nowrap>$name</td>"
set s [$event get nsttime]
set d [$event get nduration]
set e $($s + $d)
set n [clock seconds]
if { $n > $e } {
puts "<td class=blood nowrap class=va>"
} else {
puts "<td nowrap class=va>"
}
puts "[clock format $s -format "%a %d %b %Y"]<br>
[clock format $s -format "%H:%M %Z"]"
if {$d > 0 && $n > $s && $n < $e} {
puts "<br>"
set perc [expr [expr $n - $s] * 100 / $d]
puts "<img class=va src=/images/745_1_11_Video_1REC.png>"
puts [progressbar $perc]
}
puts "</td>"
puts "<td>[clock format [$event get nduration] -format %T]</td>"
puts "<td nowrap>$rsvicon $RKIcon</td>"
puts "<td nowrap>"
set crid [join [lrange [split [$event get szCRID] /] 1 end]]
if {$crid != ""} {
puts -nonewline "<a href=/cgi-bin/epg_search.jim?"
if $series { puts -nonewline "s" }
puts "crid=/$crid>
<img border=0 src=/images/421_1_00_CH_Title_2R_Arrow.png
height=14>
$r(szCRID)"
[$event get szCRID]"
puts "</a>"
}
puts "</td>"
puts "<td nowrap>"
set flag 0
foreach ev [split [$event get szEventToRecord] "|"] {
if {$ev eq ""} { continue }
set ev [string range $ev 1 end]
if {$flag} { puts "<br>" }
incr flag
set crid [join [lrange [split $ev /] 1 end]]
puts -nonewline "<a href=/cgi-bin/epg_search.jim?"
puts "crid=/$crid>
<img border=0 src=/images/421_1_00_CH_Title_2R_Arrow.png
height=14>
$ev"
puts "</a>"
}
puts "</td>"
if {[$event get aulEventToRecordInfo] != ""} {
puts "<td>*</td>"
}
puts "</tr>"
}
puts "</table>"
puts "</tbody></table>"
puts "<font class=footnote>Click on the CRID to view episodes.</font>"
$db close
puts {
<small>
<button onclick="window.location='/backup.shtml';">
Backup/Restore Scheduled Recordings/Events
</button>
<button onclick="window.location='/cgi-bin/db.jim?db=rsv.db&tab=TBL_RESERVATION';">
Raw database view
</button>
<script type=text/javascript>
$('button').button();
</script>
}

View File

@@ -1,35 +0,0 @@
#!/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>"

View File

@@ -0,0 +1,21 @@
#!/mod/bin/jimsh
if {![file exists /mod/sbin/transmission-daemon]} { exit 0 }
set url "/cgi-bin/transmission.jim"
puts "
<div style=\"float: left; padding-top: 5em\">
<center>
<a href=$url>
<img border=0 src=/img/transmission.png>
</a>
<br>
<a href=$url>
<b>Transmission</b>
</a>
<br>
</center>
</div>
"

21
var/mongoose/lib/chunked Executable file
View File

@@ -0,0 +1,21 @@
proc chunk {chk} {
puts -nonewline [format "%x\r\n" [string length $chk]]
puts -nonewline "$chk\r\n"
flush stdout
}
proc chunk_pad {{len 256}} {
incr len
chunk [string range [format "%${len}d" 0] 1 end-1]
}
proc start_chunked {{type "text/html"}} {
puts -nonewline "Content-Type: $type\r\n"
puts -nonewline "Transfer-Encoding: chunked\r\n\r\n"
}
proc end_chunked {} {
puts -nonewline "0\r\n\r\n\r\n"
}

View File

@@ -1,20 +1,20 @@
source /mod/var/mongoose/lib/setup
if {[expr ! [exists -proc class ]]} { package require oo }
if {[expr ! [exists -proc sqlite3.open ]]} { package require sqlite3 }
if {[expr ! [exists -proc settings ]]} {
source /mod/var/mongoose/lib/settings.class
if {![exists -proc class ]} { package require oo }
if {![exists -proc sqlite3.open ]} { package require sqlite3 }
require settings.class progressbar rsv.class
set ::channeldb 0
catch { set ::channeldb [sqlite3.open /var/lib/humaxtv/channel.db] }
set ::epgpath /mnt/hd1/dvbepg/epg.dat
set ::hdepgpath /media/drive1/epgsavedata
if {![file exists $::epgpath] && [file exists $::hdepgpath]} {
set ::epgpath $::hdepgpath
}
source /mod/var/mongoose/lib/progressbar
set channeldb 0
catch { set channeldb [sqlite3.open /var/lib/humaxtv/channel.db] }
set epgpath /mnt/hd1/dvbepg/epg.dat
set hdepgpath /media/drive1/epgsavedata
if {![file exists $epgpath] && [file exists $hdepgpath]} {
set epgpath $hdepgpath
}
set ::rsvlookup [rsv lookuptab]
# * service_id, event_id, start, duration, encrypted, name, text
# * warning, content code, content type,
@@ -38,6 +38,10 @@ class epg {
channel_num 0
channel_name ""
channel_crid ""
channel_hsvc 0
sched_type 0
rsv 0
}
epg method _parse {line} {
@@ -66,8 +70,15 @@ epg method percent {} {
}
epg method showing {} {
set percent [$self percent]
if {$percent > 0 && $percent < 100} { return 1 } else { return 0 }
set now [clock seconds]
if {$start > $now} { return 0 }
if {$start + $duration < $now} { return 0 }
return 1
}
epg method ended {} {
if {$start + $duration < [clock seconds]} { return 1 }
return 0
}
epg method elapsed {} {
@@ -83,7 +94,7 @@ epg method remaining {} {
epg method type_icon {} {
set img ""
switch -- [$self get content_code] {
switch -- $content_code {
1 { set img "Movie" }
2 { set img "News" }
3 { set img "Show" }
@@ -111,7 +122,7 @@ proc {epg channelicon} {name {width 0} {style ""}} {
}
epg method channel_icon {{width 0} {style ""}} {
set str "<img src=\"/img/channels/[$self get channel_name].png\"";
set str "<img src=\"/img/channels/$channel_name.png\"";
if {$width > 0} { append str " width=$width" }
if {$style ne ""} { append str " style=\"$style\" }
append str " alt=\"\">"
@@ -123,13 +134,38 @@ epg method get_channel_info {} {
if {!$channel_num && $channeldb != ""} {
set chan [lindex [$channeldb query {
select szSvcName, usLcn, aucDefaultAuthority
select szSvcName, usLcn, aucDefaultAuthority, hsvc
from TBL_SVC
where usSvcId = %s} "[$self get service_id]"
where usSvcId = %s} $service_id
] 0]
set channel_num $chan(usLcn)
set channel_name [string range $chan(szSvcName) 1 end]
set channel_crid [string toupper $chan(aucDefaultAuthority)]
if {[dict exists $chan usLcn]} {
set channel_num $chan(usLcn)
set channel_name [string range $chan(szSvcName) 1 end]
set channel_crid [string toupper $chan(aucDefaultAuthority)]
set channel_hsvc $chan(hSvc)
}
}
}
epg method get_rsv {} {
if {$hsvc == 0} { $self get_channel_info }
if {$hsvc == 0} { return }
if {$rsv == 0 && $event_crid ne ""} {
set rsv [rsv entry $event_crid $hsvc]
}
if {$rsv == 0 && $series_crid ne ""} {
set rsv [rsv entry $series_crid $hsvc]
}
}
epg method process_sched {} {
set sched_type 0
if {$event_crid ne "" && "$channel_hsvc$event_crid" in $::rsvlookup} {
set sched_type 1
} elseif {$series_crid ne "" &&
"$channel_hsvc$series_crid" in $::rsvlookup} {
set sched_type 2
}
}
@@ -139,40 +175,55 @@ epg method icon_set {{height 0}} {
set set ""
if {$icon != ""} {
lappend set "<img src=$icon $height
alt=\"[$self get content_type]\"
title=\"[$self get content_type]\">"
alt=\"$content_type\" title=\"$content_type\">"
}
if {[$self get rec_crid] != ""} {
$self process_sched
if {$sched_type == 1} {
lappend set \
"<img src=/images/178_1_26_Icon_Recommend.png $height>"
"<img src=/images/175_1_11_Reservation_Record.png $height>"
}
if {[$self get series_crid] != ""} {
if {$sched_type == 2} {
lappend set \
"<img src=/images/175_1_11_Series_Record.png $height>"
} elseif {$series_crid ne ""} {
lappend set \
"<img src=/images/178_1_00_Icon_Serise.png $height>"
}
if {$rec_crid ne ""} {
lappend set \
"<img src=/images/178_1_26_Icon_Recommend.png $height>"
}
return $set
}
epg method cell {} {
set name [$self get name]
set text [$self get text]
set percent [$self percent]
puts "<td nowrap valign=top title=\"$text\">"
puts [join [$self icon_set 14] ""]
if {$series_crid ne ""} {
set recopts 2
} else {
set recopts 1
}
puts "
<a class=event href=# xs=[$self get service_id]
xe=[$self get event_id]>
$name</a>"
<a class=event href=# xs=$service_id xe=$event_id
sch=$sched_type rec=$recopts>
$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])"
puts "[clock format $start -format %H:%M]"
puts " ([clock format $duration -format %T])"
if {$percent > 0 && $percent < 100} {
puts "<br>[progressbar $percent]"
puts "$percent% [clock format [$self elapsed] -format %T] /
@@ -183,8 +234,8 @@ epg method cell {} {
}
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]
set tm $($start + $duration + 60)
set nextlist [epg fetch dump -service $service_id -time $tm]
if {[llength nextlist] > 0} {
return [lindex $nextlist 0]
@@ -195,13 +246,25 @@ epg method next {} {
epg method recommended {} {
set rec ""
if {[$self get rec_crid] != ""} {
if {$rec_crid ne ""} {
catch { set rec [lindex [
epg fetch dump -crid [$self get rec_crid]] 0] }
epg fetch dump -crid $rec_crid] 0] }
}
return $rec
}
epg method othertimes {} {
if {$event_crid eq ""} { return "" }
set others ""
foreach other [epg fetch dump -crid $event_crid] {
if {[$other get service_id] == $service_id &&
[$other get event_id] == $event_id} { continue }
lappend others $other
}
return $others
}
proc {epg parse} {line} {
set e [epg new]
$e _parse $line
@@ -265,3 +328,15 @@ proc {epg favlist} {} {
"] { lindex $i end }]
}
proc {epg channellist} {} {
global channeldb
set channels {}
lmap i [$channeldb query "
select usSvcid, szSvcName
from TBL_SVC
"] { set channels([string range [lindex $i 3] 1 end]) [lindex $i 1] }
return $channels
}

View File

@@ -1,27 +1,70 @@
puts {
<div id=dialogue></div>
<script type=text/javascript>
$(document).ready(function() {
var $dialog = $('#dialogue').dialog({
title: "Programme Details",
modal: false, autoOpen: false,
height: 500, width: 700,
show: 'scale', hide: 'fade',
draggable: true, resizable: true,
buttons: { "Close":
function() {$(this).dialog('close');}},
close: function(e,u) { $('#dialogue').empty().html(
'<img src="/img/loading.gif" alt="loading">'); }
});
$('a.event').click(function(e) {
e.preventDefault();
var url = '/cgi-bin/epg_info.jim?service=' +
$(this).attr('xs') + '&event=' +
$(this).attr('xe') + '&bare=1';
$('#dialogue').load(url);
$dialog.dialog('open');
$(document).ready(function() {
function doschedule(type)
{
$('#epginfo_extra').load('/cgi-bin/epg_schedule.jim?' +
'service=' +
encodeURIComponent($('#dialogue').attr('xs')) +
'&event=' +
encodeURIComponent($('#dialogue').attr('xe')) +
'&type=' + type, function() {
$('#restart_block')
.load('/cgi-bin/restartblock.jim');
});
$(":button:contains('Record')").fadeOut('slow');
}
var $buttons1 = {
"Close" : function() {$(this).dialog('close');}
};
var $buttons2 = $.extend(
{"Record Programme": function() { doschedule(1) }},
$buttons1);
var $buttons3 = $.extend(
{"Record Series": function() { doschedule(2) }},
$buttons2);
var $dialog = $('#dialogue').dialog({
title: "Programme Details",
modal: false, autoOpen: false,
height: 500, width: 700,
show: 'scale', hide: 'fade',
draggable: true, resizable: true,
buttons: $buttons1,
close: function(e,u) { $('#dialogue').empty().html(
'<img src="/img/loading.gif" alt="loading">'); }
});
function epgpopup(e, o)
{
e.preventDefault();
var sch = o.attr('sch');
var rec = o.attr('rec');
if (sch != 0)
$dialog.dialog("option", "buttons", $buttons1);
else if (rec == 2)
$dialog.dialog("option", "buttons", $buttons3);
else if (rec == 1)
$dialog.dialog("option", "buttons", $buttons2);
else
$dialog.dialog("option", "buttons", $buttons1);
var url = '/cgi-bin/epg_info.jim?service=' +
o.attr('xs') + '&event=' +
o.attr('xe') + '&bare=1';
$('#dialogue').load(url, function() {
$('#dialogue a.event').click(function(e) {
epgpopup(e, $(this));
});
});
$('#dialogue')
.attr('xs', o.attr('xs'))
.attr('xe', o.attr('xe'));
$dialog.dialog('open');
}
$('a.event').click(function(e) { epgpopup(e, $(this)) });
});
</script>
}

View File

@@ -38,8 +38,10 @@ proc cts {type img text} {
puts {
<br>
<fieldset>
<legend>Content Type Searches</legend>
<table>
<tr><td rowspan=2 valign=top>Content Type Searches</td>
<tr>
<td>
}
@@ -53,6 +55,8 @@ cts 9 "Education" "Education/Science/Factual"
puts "</td><td>"
cts 10 "Leisure" "Leisure"
puts "</td><td><a href=/epg.shtml>Now/Next</a>"
puts "</td></tr><tr><td>"
cts 7 "Art" "Arts/Culture"
@@ -65,7 +69,7 @@ cts 8 "Society" "Social/Political/Economic"
puts "</td><td>"
cts 6 "Music" "Music/Ballet/Dance"
puts "</tr></table>"
puts "</tr></table></fieldset>"
set db [sqlite3.open /var/lib/humaxtv/setup.db]
set res [$db query {
@@ -75,8 +79,12 @@ set res [$db query {
$db close
if {[llength $res] > 0} {
puts "<table cellpadding=5>"
puts "<tr><td>Keyword Searches</td>"
puts "
<fieldset>
<legend>Keyword Searches</legend>
<table cellpadding=5>
<tr>
"
foreach keyword $res {
set kw [string range [lindex $keyword 1] 1 end]
# Clean the keyword string.
@@ -84,8 +92,11 @@ if {[llength $res] > 0} {
puts "<td><a href=/cgi-bin/epg_search.jim?term=[cgi_quote_url $kw]>$kw
</a></td>"
}
puts "</tr>"
puts "</table>"
puts "
</tr>
</table>
</fieldset>
"
}
puts "

View File

@@ -1,8 +1,14 @@
#!/bin/sh
/mod/bin/ffmpeg "$@" 2>&1 | sed '
1,8d
$d
'
if [ -x /mod/bin/ffprobe ]; then
/mod/bin/ffprobe "$@" 2>&1 | sed '
1,10d
'
else
/mod/bin/ffmpeg "$@" 2>&1 | sed '
1,8d
$d
'
fi
exit 0

View File

@@ -1,6 +1,6 @@
#!/bin/sh
# stderr is always unbuffered so use that...
/bin/opkg "$@" 1>&2
/bin/opkg "$@" 2>&1
exit 0

View File

@@ -3,25 +3,25 @@ if {[expr ! [exists -proc class ]]} { package require oo }
class pkg {
name ""
latest ""
descr ""
installed ""
latest ""
install_time 0
}
pkg method _load {nm info} {
set name $nm
set latest [lindex $info 0]
set descr [lrange $info 1 end]
set ::pkgmeta {}
foreach line [split [exec /bin/opkg status $name] "\n"] {
if {[string match {Version: *} $line]} {
set installed [string range $line 9 end]
}
if {[string match {Installed-Time: } $line]} {
set install_time [string range $line 16 end]
}
}
pkg method _load {nm} {
set name $nm
set info [join [split [exec /bin/opkg list $nm] "\n"] " "]
regexp {^([^ ]+) - ([^ ]+) - (.*)$} $info full xname latest descr
set info [exec /bin/opkg list-installed $nm]
regexp {^([^ ]+) - ([^ ]+)$} $info full xname installed
return $self
}
proc {pkg load} {nm} {
return [[pkg] _load $nm]
}
pkg method is {what} {
@@ -38,28 +38,19 @@ pkg method is {what} {
return 0
}
proc {pkg load} {nm info} {
set e [pkg]
$e _load $nm $info
return $e
}
proc {pkg avail} {} {
set inst_pkgs [pkg inst]
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>"
if [regexp {^ } $pkg] { continue }
if {[regexp {^([^ ]+)} $pkg name] == 0} { continue }
if {$name ni $inst_pkgs} { lappend avail_pkgs $name }
#puts "New: $name<br>"
}
return $avail_pkgs
}
proc {pkg installed} {} {
proc {pkg inst} {} {
# Build a list of installed packages - just the names
set inst_pkgs {}
foreach pkg [split [exec /bin/opkg list-installed] "\n"] {
@@ -70,15 +61,43 @@ proc {pkg installed} {} {
return $inst_pkgs
}
proc {pkg upgradable} {} {
proc {pkg upgr} {} {
#webif - 0.5.3 - 0.5.7
set upgr_pkgs {}
foreach pkg [split [exec /bin/opkg list-upgradable] "\n"] {
if {[regexp {^([^ ]+) - ([^ ]+) - (.*)$} $pkg \
dummy name oldver newver] == 0} { continue }
set upgr_pkgs($name) [concat $oldver $newver]
#puts "Set: $name = ($oldver, $newver)<br>"
if {[regexp {^([^ ]+)} $pkg name] == 0} { continue }
lappend upgr_pkgs $name
#puts "Upgr: $name<br>"
}
return $upgr_pkgs
}
proc {pkg loadmeta} {} {
if {[llength $::pkgmeta]} { return }
if {![file exists "/mod/var/pkg.meta"]} {
pkg fetchmeta
} else {
set meta [open "/mod/var/pkg.meta" r]
set ::pkgmeta [read $meta]
$meta close
}
}
proc {pkg fetchmeta} {} {
set f [socket stream hummypkg.org.uk:80]
$f puts -nonewline "GET /pkg.meta HTTP/1.1\r\n"
$f puts -nonewline "Host: hummypkg.org.uk\r\n"
$f puts -nonewline "\r\n"
set line [string trim [$f gets]]
while {[string length $line]} {
set line [string trim [$f gets]]
}
set ::pkgmeta [$f read]
$f close
set ff [open "/mod/var/pkg.meta" w]
puts $ff $::pkgmeta
$ff close
}

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

@@ -0,0 +1,9 @@
proc eval_plugins {hook} {
foreach plugin [glob -nocomplain /mod/var/mongoose/plugin/*] {
if {[file isfile "$plugin/$hook.hook"]} {
uplevel source "$plugin/$hook.hook"
}
}
}

184
var/mongoose/lib/rsv.class Executable file
View File

@@ -0,0 +1,184 @@
source /mod/var/mongoose/lib/setup
if {![exists -proc class ]} { package require oo }
if {![exists -proc sqlite3.open ]} { package require sqlite3 }
if {![exists -proc settings ]} { require settings.class }
set rsvdb [sqlite3.open /var/lib/humaxtv/rsv.db]
$rsvdb query {attach database '/var/lib/humaxtv/channel.db' as channel}
catch { $rsvdb query {.mode tcl} }
class rsv {
ulslot -1
ersvtype 0
hsvc 0
nsttime 0
szsttime "00000000000000"
nduration 0
erepeat 0
usevtid 0
szevtname {}
ulPreOffset 0
ulPostOffset 0
ulProgramId 0
ulSeriesId 0
ucVolume 0
ucInputMode 0
usChNum 0
ucRecKind 0
ucCRIDType 0
szCRID {}
szFPBRecPath {}
szRecordedProgCrid {}
szEventToRecord {}
aulEventToRecordInfo {}
bRecomRsv 0
usLastRecordedEvtId 0
eReady 0
szSvcName {}
usLcn 0
sort 0
}
rsv method name {} {
set name [string range $szevtname 1 end]
if {[string first "i7" $name] == 0} {
set name [string range $name 2 end]
}
if {$name == ""} {
switch $ersvtype {
5 { set name "--- Wake-up ---" }
6 { set name "--- Sleep ---" }
7 { set name "--- Auto Update ---" }
11 { set name "--- DSO Event? ---" }
default { set name "--- Unknown event type $ersvtype ---" }
}
}
return $name
}
rsv method channel_name {} {
return [string range $szSvcName 1 end]
}
rsv method fix_hsvc {} {
global rsvdb
set _hsvc [$rsvdb query "
select hSvc
from channel.TBL_SVC
where szSvcName = '$szSvcName'
or szSvcname = '\025$szSvcName'
limit 1
"]
if {[llength $_hsvc] == 1} {
set hsvc [lindex [lindex $_hsvc 0] 1]
} else {
set hsvc 0
}
return $hsvc
}
rsv method insert {} {
global rsvdb
# Find a spare slot.
if {$ulslot < 0} {
set slots [lmap i [
$rsvdb query {
select ulslot FROM TBL_RESERVATION
order by ulslot;
}] {lindex $i 1}]
set max [lindex $i end]
for {set i 0} {$i < $max} {incr i} {
if {$i ni $slots} {
set ulslot $i
break
}
}
if {$ulslot == -1} { set ulslot $($max + 1) }
}
set fields [lsort [$self vars]]
foreach field {aulEventToRecordInfo szSvcName usLcn sort} {
set df [lsearch $fields $field]
set fields [lreplace $fields $df $df]
}
set vals {}
foreach field $fields {
# Escape any quotes embedded in the data.
regsub -all {'} [$self get $field] {''} f
lappend vals "'$f'"
#lappend vals "'[$self get $field]'"
}
set query "insert into TBL_RESERVATION("
append query [join $fields ","]
append query ") values("
append query [join $vals ","]
append query ");"
$rsvdb query $query
}
proc {rsv list} {} {
set res [$::rsvdb query {
select tbl_reservation.*,
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
}]
set records {}
foreach rec $res {
lappend records [rsv new $rec]
}
return $records
}
proc {rsv lookuptab} {} {
set res [$::rsvdb query {
select tbl_reservation.szCRID, channel.TBL_SVC.hSvc
from tbl_reservation left join channel.TBL_SVC
on main.TBL_RESERVATION.hSvc = channel.TBL_SVC.hSvc
where ersvtype <= 3
}]
set records {}
foreach rec $res {
lappend records "$rec(hSvc)/[file tail $rec(szCRID)]"
}
return $records
}
proc {rsv entry} {crid svc} {
set res [$::rsvdb query {
select tbl_reservation.*,
channel.TBL_SVC.szSvcName, channel.TBL_SVC.usLcn
from tbl_reservation
left join channel.TBL_SVC
on main.TBL_RESERVATION.hSvc = channel.TBL_SVC.hSvc
where szCRID like '%%%s' and tbl_reservation.hsvc = '%s'
} $crid $svc]
if {[llength $res] > 0} {
return [rsv new [lindex $res 0]]
}
return 0
}
proc {rsv cleanup} {} {
catch {$::rsvdb close}
}

View File

@@ -1,13 +1,26 @@
if {[expr ! [exists -proc class ]]} { package require oo }
if {[expr ! [exists -proc sqlite3.open ]]} { package require sqlite3 }
if {![exists -proc class ]} { package require oo }
if {![exists -proc sqlite3.open ]} { package require sqlite3 }
set settingsdb [sqlite3.open /mod/etc/webif.db]
if {![file exists /mod/etc/webif.db]} {
set settingsdb [sqlite3.open /mod/etc/webif.db]
catch {
$settingsdb query {
CREATE TABLE settings(name text, nval int, tval text);
}
$settingsdb query {
CREATE UNIQUE INDEX key on settings(name);
}
}
} else {
set settingsdb [sqlite3.open /mod/etc/webif.db]
}
class settings {
hostname ""
channel_group 0
smtp_server ""
pkgdev 0
}
settings method hostname {{name ""}} {
@@ -86,6 +99,10 @@ settings method channel_group {{group -1}} {
return [$self _nval_setting channel_group $group]
}
settings method pkgdev {{val -1}} {
return [$self _nval_setting pkgdev $val]
}
settings method channel_groups {} {
set ret ""
set db [sqlite3.open /var/lib/humaxtv/setup.db]

20
var/mongoose/lib/setup Normal file
View File

@@ -0,0 +1,20 @@
if {![exists -proc require]} {
proc require {args} {{done {}}} {
foreach file $args {
if {$file ni $done} {
uplevel source "/mod/var/mongoose/lib/$file"
lappend $done $file
}
}
}
proc header {} {
uplevel source /mod/var/mongoose/html/lib/header.jim
}
proc footer {} {
uplevel source /mod/var/mongoose/html/lib/footer.jim
}
}

View File

@@ -1,5 +1,5 @@
if {[expr ! [exists -proc class ]]} { package require oo }
if {![exists -proc class ]} { package require oo }
class ts {
file ""
@@ -45,14 +45,36 @@ ts method flag {f} {
ts method unlock {} {
set cmd [list /mod/bin/hmt -lock $file]
#puts "CMD: $cmd"
exec {*}$cmd
return 1
}
ts method lock {} {
set cmd [list /mod/bin/hmt +lock $file]
#puts "CMD: $cmd"
exec {*}$cmd
return 1
}
ts method unenc {} {
set cmd [list /mod/bin/hmt -protect $file]
exec {*}$cmd
return 1
}
ts method enc {} {
set cmd [list /mod/bin/hmt +protect $file]
exec {*}$cmd
return 1
}
ts method set_new {} {
set cmd [list /mod/bin/hmt +new $file]
exec {*}$cmd
return 1
}
ts method set_watched {} {
set cmd [list /mod/bin/hmt -new $file]
exec {*}$cmd
return 1
}