Compare commits

...

176 Commits

Author SHA1 Message Date
hummypkg
aadac18796 add editor
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@753 2a923420-c742-0410-a762-8d5b09965624
2012-02-22 01:14:12 +00:00
hummypkg
955217bdd2 update dependencies and remote reset block
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@748 2a923420-c742-0410-a762-8d5b09965624
2012-02-19 22:38:36 +00:00
hummypkg
1dbd659ddb add op complete to pkg
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@737 2a923420-c742-0410-a762-8d5b09965624
2012-02-13 21:02:12 +00:00
hummypkg
57515b2941 add mpg, fix diag
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@735 2a923420-c742-0410-a762-8d5b09965624
2012-02-12 23:11:23 +00:00
hummypkg
ef1e7b82e8 version 0.9.2
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@731 2a923420-c742-0410-a762-8d5b09965624
2012-02-07 22:54:29 +00:00
hummypkg
1a7cb41a16 restructure epg, fix log newlines
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@730 2a923420-c742-0410-a762-8d5b09965624
2012-02-07 22:48:54 +00:00
hummypkg
7a66306f78 label segments with sequence number
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@726 2a923420-c742-0410-a762-8d5b09965624
2012-02-07 00:40:31 +00:00
hummypkg
a014fec23d move modules to subdirectories and split JS/CSS out
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@725 2a923420-c742-0410-a762-8d5b09965624
2012-02-07 00:17:33 +00:00
hummypkg
d307699ab1 add 45 minute split
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@724 2a923420-c742-0410-a762-8d5b09965624
2012-02-06 23:28:53 +00:00
hummypkg
3f6e8754c6 bug fixes
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@723 2a923420-c742-0410-a762-8d5b09965624
2012-02-05 22:49:27 +00:00
hummypkg
742a56485a catch more dlna database errors, bump to version 0.9.1
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@717 2a923420-c742-0410-a762-8d5b09965624
2012-02-05 20:07:49 +00:00
hummypkg
fa9905d8bd replace glob with readdir in some cases. Move paste button to clipboard
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@711 2a923420-c742-0410-a762-8d5b09965624
2012-02-01 21:02:43 +00:00
hummypkg
a3ecbe1d3f add system inuse
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@705 2a923420-c742-0410-a762-8d5b09965624
2012-01-30 21:59:18 +00:00
hummypkg
924bc72832 update to 0.9.0-2, fix vlc icons, require fixed jim
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@694 2a923420-c742-0410-a762-8d5b09965624
2012-01-28 11:15:22 +00:00
hummypkg
909605b074 fix deletions from non-mediaroot paths
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@691 2a923420-c742-0410-a762-8d5b09965624
2012-01-27 21:54:39 +00:00
hummypkg
f62904edb4 vlc working + media
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@690 2a923420-c742-0410-a762-8d5b09965624
2012-01-25 23:19:57 +00:00
hummypkg
8d36fe22dd checkpoint webif
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@687 2a923420-c742-0410-a762-8d5b09965624
2012-01-22 19:47:47 +00:00
hummypkg
2e0d49537d update jim documentation
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@686 2a923420-c742-0410-a762-8d5b09965624
2012-01-22 19:46:30 +00:00
hummypkg
572e31efcc only show transmission/mediatomb icons if running, fix pkgdev toggle
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@681 2a923420-c742-0410-a762-8d5b09965624
2012-01-21 01:27:06 +00:00
hummypkg
8ec03f2636 add SSL server support
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@679 2a923420-c742-0410-a762-8d5b09965624
2012-01-19 21:15:52 +00:00
hummypkg
95bef6f458 add network name
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@678 2a923420-c742-0410-a762-8d5b09965624
2012-01-18 22:15:20 +00:00
hummypkg
44038eb7a1 fix another size issue
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@677 2a923420-c742-0410-a762-8d5b09965624
2012-01-18 00:07:25 +00:00
hummypkg
ae607a6071 hover over synopsis, fix sizes, fix delete
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@676 2a923420-c742-0410-a762-8d5b09965624
2012-01-18 00:02:55 +00:00
hummypkg
c5de79b214 Streamline deletion. Touch files into dustbin.
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@674 2a923420-c742-0410-a762-8d5b09965624
2012-01-16 22:28:20 +00:00
hummypkg
fa839705fc rename default bin
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@672 2a923420-c742-0410-a762-8d5b09965624
2012-01-14 23:08:54 +00:00
hummypkg
3d75b93f1a allow deletions from inside dustbin
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@666 2a923420-c742-0410-a762-8d5b09965624
2012-01-14 00:29:44 +00:00
hummypkg
602f96e1ac support variable dustbin name
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@663 2a923420-c742-0410-a762-8d5b09965624
2012-01-14 00:12:07 +00:00
hummypkg
3312a76cc6 dynamic dustbin
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@661 2a923420-c742-0410-a762-8d5b09965624
2012-01-13 23:28:48 +00:00
hummypkg
88026872d9 add dustbin folder image
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@658 2a923420-c742-0410-a762-8d5b09965624
2012-01-13 21:34:24 +00:00
hummypkg
ce2dfa8338 update delete system
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@657 2a923420-c742-0410-a762-8d5b09965624
2012-01-13 21:23:03 +00:00
hummypkg
6e2a0f3e2b dustbin support + bugfix
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@648 2a923420-c742-0410-a762-8d5b09965624
2012-01-10 19:51:45 +00:00
hummypkg
ccb513be49 0.8.11
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@639 2a923420-c742-0410-a762-8d5b09965624
2012-01-08 21:10:38 +00:00
hummypkg
84b5cb9506 reinstate delete, add failed recordings
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@638 2a923420-c742-0410-a762-8d5b09965624
2012-01-08 20:54:07 +00:00
hummypkg
337a2add7a verson 0.8.10
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@636 2a923420-c742-0410-a762-8d5b09965624
2012-01-07 22:30:41 +00:00
hummypkg
4706fe6bcd disable delete
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@635 2a923420-c742-0410-a762-8d5b09965624
2012-01-07 22:30:19 +00:00
hummypkg
88d78a7d42 more verbose message
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@634 2a923420-c742-0410-a762-8d5b09965624
2012-01-06 23:57:31 +00:00
hummypkg
b442fef333 upgradable packages come first
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@632 2a923420-c742-0410-a762-8d5b09965624
2012-01-06 23:44:55 +00:00
hummypkg
f771f55017 fix pkg upgrade tab
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@631 2a923420-c742-0410-a762-8d5b09965624
2012-01-06 23:39:15 +00:00
hummypkg
267ba4fade fix avail
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@630 2a923420-c742-0410-a762-8d5b09965624
2012-01-06 23:27:35 +00:00
hummypkg
c2ec779465 allow restart cancel, improve logfile list
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@629 2a923420-c742-0410-a762-8d5b09965624
2012-01-05 22:42:45 +00:00
hummypkg
75b31696c5 dynamic databases
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@600 2a923420-c742-0410-a762-8d5b09965624
2012-01-03 12:12:07 +00:00
hummypkg
f54d162298 update to 0.8.9
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@594 2a923420-c742-0410-a762-8d5b09965624
2011-12-29 01:17:55 +00:00
hummypkg
2a0bcbc81e minor tweaks for IE9
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@593 2a923420-c742-0410-a762-8d5b09965624
2011-12-29 01:17:32 +00:00
hummypkg
4d3183ea61 working copy/paste
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@592 2a923420-c742-0410-a762-8d5b09965624
2011-12-29 00:57:18 +00:00
hummypkg
7c038a1776 checkpoint
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@588 2a923420-c742-0410-a762-8d5b09965624
2011-12-28 21:36:35 +00:00
hummypkg
822de81971 checkpoint - working on clipboard
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@587 2a923420-c742-0410-a762-8d5b09965624
2011-12-28 14:11:10 +00:00
hummypkg
09e71400a2 updates
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@585 2a923420-c742-0410-a762-8d5b09965624
2011-12-27 18:43:40 +00:00
hummypkg
18cafc8c39 handle ar/pad icons
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@576 2a923420-c742-0410-a762-8d5b09965624
2011-12-19 22:52:17 +00:00
hummypkg
593b7dbb89 fix bugs, show AR/Pad status
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@572 2a923420-c742-0410-a762-8d5b09965624
2011-12-19 15:57:03 +00:00
hummypkg
de47e46fe7 fix scheduling problem
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@566 2a923420-c742-0410-a762-8d5b09965624
2011-12-18 21:17:03 +00:00
hummypkg
509c98ee74 update
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@564 2a923420-c742-0410-a762-8d5b09965624
2011-12-14 13:55:58 +00:00
hummypkg
ddb63e68b7 7 days, not 7 hours
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@562 2a923420-c742-0410-a762-8d5b09965624
2011-12-13 22:55:42 +00:00
hummypkg
5de2ba1c37 fix bug
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@561 2a923420-c742-0410-a762-8d5b09965624
2011-12-13 21:00:27 +00:00
hummypkg
43f6281410 add flatten support
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@560 2a923420-c742-0410-a762-8d5b09965624
2011-12-12 23:45:58 +00:00
hummypkg
8166af0f1b fix IE error, fix typo in anacrontab
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@559 2a923420-c742-0410-a762-8d5b09965624
2011-12-12 21:11:08 +00:00
hummypkg
25344c5ff4 add audio extraction
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@554 2a923420-c742-0410-a762-8d5b09965624
2011-12-09 20:33:57 +00:00
hummypkg
b6ce0e3b16 fix sorting of backups
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@553 2a923420-c742-0410-a762-8d5b09965624
2011-12-09 10:57:13 +00:00
hummypkg
a189b524ab automatic daily schedule backups
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@551 2a923420-c742-0410-a762-8d5b09965624
2011-12-09 10:35:21 +00:00
hummypkg
84b00010a8 update icons
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@550 2a923420-c742-0410-a762-8d5b09965624
2011-12-09 10:12:02 +00:00
hummypkg
993958d346 update icons
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@549 2a923420-c742-0410-a762-8d5b09965624
2011-12-09 10:11:41 +00:00
hummypkg
1045587fbd fix error on default browse directory
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@545 2a923420-c742-0410-a762-8d5b09965624
2011-12-06 00:13:41 +00:00
hummypkg
659fd40fe9 update to 0.8.3
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@543 2a923420-c742-0410-a762-8d5b09965624
2011-12-05 21:45:24 +00:00
hummypkg
fcb4615c82 bug fixes
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@542 2a923420-c742-0410-a762-8d5b09965624
2011-12-05 21:44:30 +00:00
hummypkg
8146627f18 join is working, more webif functions
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@538 2a923420-c742-0410-a762-8d5b09965624
2011-11-28 15:24:38 +00:00
hummypkg
99dde5a4a5 update
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@534 2a923420-c742-0410-a762-8d5b09965624
2011-11-27 23:29:14 +00:00
hummypkg
d04d3bdb15 fix autocapitalisation
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@531 2a923420-c742-0410-a762-8d5b09965624
2011-11-24 22:25:28 +00:00
hummypkg
78d49d419a require updated busybox
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@529 2a923420-c742-0410-a762-8d5b09965624
2011-11-19 01:12:36 +00:00
hummypkg
df67594f29 updates for HD cropping
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@514 2a923420-c742-0410-a762-8d5b09965624
2011-11-16 22:55:06 +00:00
hummypkg
8cc2ef3d3f add logfiles/cat and improved images
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@512 2a923420-c742-0410-a762-8d5b09965624
2011-11-16 21:40:53 +00:00
hummypkg
ac93144789 add access control and diagnostics
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@511 2a923420-c742-0410-a762-8d5b09965624
2011-11-12 23:57:19 +00:00
hummypkg
93ebdce4e1 update decrypt
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@510 2a923420-c742-0410-a762-8d5b09965624
2011-11-12 11:12:07 +00:00
hummypkg
9ba7c3dba8 download already decrypted files in the clear
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@509 2a923420-c742-0410-a762-8d5b09965624
2011-11-06 16:34:30 +00:00
hummypkg
436db53de3 fix bugs in crop, improve screen
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@507 2a923420-c742-0410-a762-8d5b09965624
2011-11-04 20:47:27 +00:00
hummypkg
ebe6a0f64c fix bug with duplicate files
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@506 2a923420-c742-0410-a762-8d5b09965624
2011-11-04 13:54:54 +00:00
hummypkg
20b2a7e2dc fix crop progress?
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@505 2a923420-c742-0410-a762-8d5b09965624
2011-11-04 13:38:48 +00:00
hummypkg
258c3b76af updates
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@504 2a923420-c742-0410-a762-8d5b09965624
2011-11-04 13:19:56 +00:00
hummypkg
e87cc8586e add dec icon
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@503 2a923420-c742-0410-a762-8d5b09965624
2011-11-04 01:16:07 +00:00
hummypkg
eace5c5260 add decryption
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@502 2a923420-c742-0410-a762-8d5b09965624
2011-11-04 00:55:13 +00:00
hummypkg
15e33ab751 add crop
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@501 2a923420-c742-0410-a762-8d5b09965624
2011-11-03 23:43:17 +00:00
hummypkg
fa5561d200 updates
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@492 2a923420-c742-0410-a762-8d5b09965624
2011-10-31 13:47:47 +00:00
hummypkg
64da76ed64 css update
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@469 2a923420-c742-0410-a762-8d5b09965624
2011-10-25 21:25:11 +00:00
hummypkg
86424d065c remove portal code
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@464 2a923420-c742-0410-a762-8d5b09965624
2011-10-22 19:17:16 +00:00
hummypkg
2128aded40 update epg extraction
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@462 2a923420-c742-0410-a762-8d5b09965624
2011-10-20 23:24:25 +00:00
hummypkg
218ff8edfb add epg previous method
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@455 2a923420-c742-0410-a762-8d5b09965624
2011-10-13 23:32:46 +00:00
hummypkg
02f7c5aad9 version 0.7.6
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@449 2a923420-c742-0410-a762-8d5b09965624
2011-10-11 19:51:58 +00:00
hummypkg
0fa394eaa1 tweak update all
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@445 2a923420-c742-0410-a762-8d5b09965624
2011-10-07 18:18:45 +00:00
hummypkg
8949bfaa02 update pkg management and add update-all, add reset firmware button
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@443 2a923420-c742-0410-a762-8d5b09965624
2011-10-05 22:07:22 +00:00
hummypkg
c3a41bed59 update to 0.7.4
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@441 2a923420-c742-0410-a762-8d5b09965624
2011-10-04 20:06:56 +00:00
hummypkg
903a4453bb more work on dedup
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@440 2a923420-c742-0410-a762-8d5b09965624
2011-10-04 20:02:59 +00:00
hummypkg
761def1a24 checkpoint
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@439 2a923420-c742-0410-a762-8d5b09965624
2011-10-03 22:47:44 +00:00
hummypkg
e832d05b17 update 0.7.3
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@437 2a923420-c742-0410-a762-8d5b09965624
2011-10-03 09:39:17 +00:00
hummypkg
3b8720c6d4 EPG update
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@436 2a923420-c742-0410-a762-8d5b09965624
2011-10-03 09:37:24 +00:00
hummypkg
2fb26975e2 new db based EPG
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@433 2a923420-c742-0410-a762-8d5b09965624
2011-09-29 23:22:02 +00:00
hummypkg
93f1b67ba1 add epg parser
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@432 2a923420-c742-0410-a762-8d5b09965624
2011-09-29 22:58:13 +00:00
hummypkg
6daa4e28f5 add alternate epg implementations
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@427 2a923420-c742-0410-a762-8d5b09965624
2011-09-27 20:26:36 +00:00
hummypkg
9a72e40c03 improve system busy detection
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@424 2a923420-c742-0410-a762-8d5b09965624
2011-09-26 20:31:17 +00:00
hummypkg
9b2f138fd9 update
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@420 2a923420-c742-0410-a762-8d5b09965624
2011-09-25 18:25:09 +00:00
hummypkg
22db1fbbd6 add icons, fix Mux name
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@418 2a923420-c742-0410-a762-8d5b09965624
2011-09-22 22:29:43 +00:00
hummypkg
a9f4bd4f0b remove iajax code for now
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@417 2a923420-c742-0410-a762-8d5b09965624
2011-09-22 20:27:41 +00:00
hummypkg
31688eaa1c add doctype to headers, fix iajax problem
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@416 2a923420-c742-0410-a762-8d5b09965624
2011-09-22 20:15:26 +00:00
hummypkg
926a49737a add new channel icons, detect MUX
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@413 2a923420-c742-0410-a762-8d5b09965624
2011-09-21 20:21:13 +00:00
hummypkg
fbb64a2e9f fix padding
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@409 2a923420-c742-0410-a762-8d5b09965624
2011-09-19 17:11:18 +00:00
hummypkg
ff322fdc39 update channel icons, support padding
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@407 2a923420-c742-0410-a762-8d5b09965624
2011-09-18 22:19:54 +00:00
hummypkg
d29ed50f7f allow scheduling reminders; flag for reboot after event cancel
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@402 2a923420-c742-0410-a762-8d5b09965624
2011-09-15 23:08:15 +00:00
hummypkg
7113208940 add totop
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@400 2a923420-c742-0410-a762-8d5b09965624
2011-09-14 22:38:22 +00:00
hummypkg
0b566bca72 add mod version to front page
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@397 2a923420-c742-0410-a762-8d5b09965624
2011-09-14 19:59:56 +00:00
hummypkg
f235b05026 fix insert bugs
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@396 2a923420-c742-0410-a762-8d5b09965624
2011-09-14 16:58:11 +00:00
hummypkg
af87e1a66e update
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@390 2a923420-c742-0410-a762-8d5b09965624
2011-09-13 19:16:02 +00:00
hummypkg
ed225ca751 fix split events, check for duplicates
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@385 2a923420-c742-0410-a762-8d5b09965624
2011-09-11 21:59:08 +00:00
hummypkg
cfb12b7da6 move scheduling code to class, support split events
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@384 2a923420-c742-0410-a762-8d5b09965624
2011-09-11 21:23:42 +00:00
hummypkg
1d44efdcdc add channel info page
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@381 2a923420-c742-0410-a762-8d5b09965624
2011-09-09 19:38:37 +00:00
hummypkg
0eb305c32c fix bug in restore
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@372 2a923420-c742-0410-a762-8d5b09965624
2011-09-07 18:07:06 +00:00
hummypkg
6797ee4416 minor tweaks and fix system diskspace
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@364 2a923420-c742-0410-a762-8d5b09965624
2011-09-05 22:23:29 +00:00
hummypkg
510c6c7407 fix reboot busy check
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@354 2a923420-c742-0410-a762-8d5b09965624
2011-09-04 00:18:07 +00:00
hummypkg
f6bf03691d use findhsvc class
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@352 2a923420-c742-0410-a762-8d5b09965624
2011-09-03 23:26:54 +00:00
hummypkg
b378ec1b9c create system class and use it. Expand rsv fetch to include ersvtype
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@344 2a923420-c742-0410-a762-8d5b09965624
2011-09-02 19:50:10 +00:00
hummypkg
df85584352 fix sql queries to use escaped parameters
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@339 2a923420-c742-0410-a762-8d5b09965624
2011-09-01 22:20:53 +00:00
hummypkg
b7310e9765 fix rsvp table and allow scheduling
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@331 2a923420-c742-0410-a762-8d5b09965624
2011-08-31 21:55:39 +00:00
hummypkg
3f02bf8365 increment version to 0.6.6
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@329 2a923420-c742-0410-a762-8d5b09965624
2011-08-31 21:48:15 +00:00
hummypkg
1d6917a782 changes for rs
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@328 2a923420-c742-0410-a762-8d5b09965624
2011-08-31 21:47:43 +00:00
hummypkg
0852c70891 improve scheduling screen
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@311 2a923420-c742-0410-a762-8d5b09965624
2011-08-29 22:34:26 +00:00
hummypkg
981c8312cd version
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@306 2a923420-c742-0410-a762-8d5b09965624
2011-08-25 20:30:48 +00:00
hummypkg
3559a430ab add epg -day and rsv commit when necessary
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@305 2a923420-c742-0410-a762-8d5b09965624
2011-08-25 20:30:13 +00:00
hummypkg
945c6d1b4b use pending table for scheduling
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@296 2a923420-c742-0410-a762-8d5b09965624
2011-08-22 20:55:06 +00:00
hummypkg
81c3ef4f73 support same directory symlinks
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@294 2a923420-c742-0410-a762-8d5b09965624
2011-08-20 21:30:43 +00:00
hummypkg
2c61281b09 skip non-directory links
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@292 2a923420-c742-0410-a762-8d5b09965624
2011-08-20 20:50:40 +00:00
hummypkg
d5b27acd46 fix minor file browser bugs
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@291 2a923420-c742-0410-a762-8d5b09965624
2011-08-20 20:45:23 +00:00
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
hummypkg
a44be5f1ae better solution to cleaning keywords
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@212 2a923420-c742-0410-a762-8d5b09965624
2011-06-29 23:57:01 +00:00
hummypkg
4e42dcf655 show new folders
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@211 2a923420-c742-0410-a762-8d5b09965624
2011-06-29 23:53:16 +00:00
hummypkg
43db44d742 improve EPG search using drop-down options. Implement package management
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@210 2a923420-c742-0410-a762-8d5b09965624
2011-06-29 22:53:15 +00:00
hummypkg
050cb611bf working on package system
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@209 2a923420-c742-0410-a762-8d5b09965624
2011-06-28 00:20:31 +00:00
hummypkg
d068d93073 improve directory size display
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@207 2a923420-c742-0410-a762-8d5b09965624
2011-06-27 21:59:07 +00:00
hummypkg
7025cf09f5 fix lock, add guidance icons, add new icon
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@205 2a923420-c742-0410-a762-8d5b09965624
2011-06-27 19:57:32 +00:00
hummypkg
32db0c900b depend on hmt 1.0.5
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@204 2a923420-c742-0410-a762-8d5b09965624
2011-06-26 23:13:01 +00:00
hummypkg
d7dcb79dad update to version 0.5.5
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@200 2a923420-c742-0410-a762-8d5b09965624
2011-06-26 23:07:06 +00:00
hummypkg
04453c1815 finish rename function
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@199 2a923420-c742-0410-a762-8d5b09965624
2011-06-26 23:05:38 +00:00
hummypkg
3bc9f5217b add sync script
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@198 2a923420-c742-0410-a762-8d5b09965624
2011-06-25 21:02:26 +00:00
hummypkg
8d67bb82bb more work on rename
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@197 2a923420-c742-0410-a762-8d5b09965624
2011-06-25 20:59:50 +00:00
hummypkg
9faac3c8fe support HD model for EPG
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@196 2a923420-c742-0410-a762-8d5b09965624
2011-06-23 11:14:57 +00:00
hummypkg
0c858b3410 restructure browser
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@194 2a923420-c742-0410-a762-8d5b09965624
2011-06-22 23:36:30 +00:00
hummypkg
1cd0f96bf4 add missing return
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@193 2a923420-c742-0410-a762-8d5b09965624
2011-06-22 10:41:41 +00:00
hummypkg
8e839121de tweak popup
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@192 2a923420-c742-0410-a762-8d5b09965624
2011-06-22 00:32:13 +00:00
hummypkg
7400437a1f add iphone checkboxes and improve services screen
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@191 2a923420-c742-0410-a762-8d5b09965624
2011-06-22 00:21:48 +00:00
hummypkg
26e90143bf add files
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@189 2a923420-c742-0410-a762-8d5b09965624
2011-06-21 22:38:43 +00:00
hummypkg
884e17b3a7 add download option, require busybox 1.18.3-1
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@188 2a923420-c742-0410-a762-8d5b09965624
2011-06-21 22:38:20 +00:00
hummypkg
7202b7e4f8 mv
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@183 2a923420-c742-0410-a762-8d5b09965624
2011-06-17 09:30:09 +00:00
hummypkg
087532136c mv
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif~@181 2a923420-c742-0410-a762-8d5b09965624
2011-06-17 09:29:33 +00:00
282 changed files with 12479 additions and 2284 deletions

View File

@@ -1,10 +1,9 @@
Package: webif
Priority: optional
Section: web
Version: 0.5.1
Version: 0.9.3
Architecture: mipsel
Maintainer: af123@hummypkg.org.uk
Depends: mongoose(>=2.11-4),jim-sqlite3,jim-cgi,service-control,busybox,lsof,jim-oo,epg(>=1.0.2)
Replaces: af123-webif
Conflicts: af123-webif
Description: A web interface for the Humax. In development.
Depends: mongoose(>=3.0-7),jim(>=0.73-1),jim-oo,jim-sqlite3(>=0.73),jim-cgi(>=0.5),service-control(>=1.2),busybox(>=1.19.3-1),lsof,epg(>=1.0.9),hmt(>=1.1.6),ssmtp,anacron,trm,openssl-command,nicesplice,id3v2
Suggests: ffmpeg,webif-iphone
Description: An evolving web interface for the Humax.

17
CONTROL/postinst Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/sh
export tmpf=/tmp/cronf.$$
# Add anacron jobs
ana=$PKG_ROOT/etc/anacrontab
grep -v 'backup/backup.jim' $ana > $tmpf
(
cat $tmpf
echo "1 8 sched_backup /mod/var/mongoose/cgi-bin/backup/backup.jim"
) > $ana
$PKG_ROOT/etc/init.d/S02anacron start < /dev/null > /dev/null 2>&1 &
exit 0

10
CONTROL/prerm Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/sh
export tmpf=/tmp/cronf.$$
ana=/mod/etc/anacrontab
grep -v 'backup/backup.jim' $ana > $tmpf
cp $tmpf $ana
exit 0

24
etc/init.d/S60parseepg Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/sh
if [ -f /mnt/hd1/dvbepg/epg.dat ]; then
epg=/mnt/hd1/dvbepg/epg.dat
epgdb=/mnt/hd1/epg.db
else
epg=/media/drive1/epgsavedata
epgdb=/media/drive1/epg.db
fi
case "$1" in
start)
/mod/bin/epg -f $epg sqlitedumpd $epgdb > /tmp/epgd.log &
;;
stop)
killall -q epg
;;
*)
exit 1
;;
esac
exit 0

View File

@@ -0,0 +1,86 @@
#!/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 now [clock seconds]
set file [file tail [cgi_get file \
[clock format $now -format "auto-%Y-%b-%d-%H:%M"]]]
if {[string match {auto-*} $file]} {
# Delete any automatic backups over 7 days old.
set mt $(7 * 86400)
foreach af [glob -nocomplain "$dir/auto-*"] {
set aft [file mtime $af]
set diff $($now - $aft)
if {$diff > $mt} {
puts "Removing $af"
file delete $af
}
}
}
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:checked').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:checked').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,50 @@
#!/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
}
proc s_time {a b} {
file stat $a l
set at $l(ctime)
file stat $b l
set bt $l(ctime)
if {$at < $bt} { return -1 }
if {$at > $bt} { return 1 }
return 0
}
set backups [lsort -command s_time [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,128 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require rsv.class findhsvc system.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 <i>$file</i> - $msg"
exit
}
puts "Restoring scheduled events from <i>$file</i>..."
$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} {
if {[catch {$rsv insert pending 1} msg]} {
puts " Error inserting event, $msg"
}
}
}
$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 [get_channel_attr $chan]
if {$grp != $group} {
set grp $group
puts " Group $grp"
}
puts " $chan"
if {$hsvc eq ""} {
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;}
system restartpending
close $fd
rsv cleanup

View File

@@ -1,74 +1,85 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
source /mod/var/mongoose/lib/setup
require ts.class pretty_size system.class settings.class escape
puts "Content-Type: text/html"
puts ""
set ignore {.nts .thm .hmt .hmi}
set standard {.avi .mpg .wmv .mkv}
set nicesplice [system pkginst nicesplice]
set flatten [system pkginst flatten]
set ignore {.nts .thm .hmi}
set include {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov .hmt}
cgi_input
#cgi_dump
#set _cgi(tsfile) "/media/My Video/Family Guy/2.19._Excellence_in_Broadcasting.ts"
#set _cgi(action) "delete"
#set env(REQUEST_URI) ''
proc tsfile {file bfile {ajax 0}} {{i 0}} {
set ts [ts fetch $file]
if {$ajax == 0} { puts "<div class=\"va tsfile\" id=[incr i]>" }
puts "
<a class=ts file=\"$file\" href=#>
<img class=va border=0 width=45
src=/images/741_1_10_Video_Title.png>
$bfile
</a>
"
if {[$ts get definition] eq "HD"} {
puts "<img class=va src=/images/172_1_00_HD.png height=21>"
} else {
puts "<img class=va src=/images/172_1_26_SD.png height=21>"
}
set locked 0
if {[$ts flag "Locked"] > 0} {
set locked 1
puts "<img class=va src=/images/178_1_00_Icon_Lock.png
height=21>"
}
puts "
<a class=tsopt file=\"$file\" href=#>
<img class=\"opt va\" border=0 width=45 did=$i locked=$locked
src=/images/181_1_00_Help5_OPT_Plus.png>
</a>
<div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div>
"
if {$ajax == 0} { puts "</div>" }
if {![dict exists $env REQUEST_URI]} {
set env(REQUEST_URI) ""
set _cgi(dir) "/media/My Video/"
}
proc genfile {file bfile} {
puts "
<div class=va>
<a href=#>
<img class=va border=0 width=45 style=\"padding: 0.3em 0\"
src=/images/743_4_10_Video_Xvid_File.png>
$bfile
</a>
</div>
"
if {![dict exists $env QUERY_STRING]} { set env(QUERY_STRING) "root" }
set order [cgi_get order -]
if {$order eq "-"} {
set order [[settings new] sortorder]
} else {
[settings new] sortorder $order
}
set model [system model]
set dustbin [system dustbin 1]
proc icon {img {hover ""} {extra ""}} {
puts -nonewline "<img src=$img class=va height=21 $extra"
if {$hover ne ""} {
puts -nonewline " alt=\"$hover\" title=\"$hover\""
}
puts ">"
}
proc directory {file bfile} {
global flatten
regsub -all " +" $bfile "" tbfile
puts "<div class=va>"
puts "<a href=$::env(REQUEST_URI)?dir=[cgi_quote_url $file]>"
puts "<img border=0 class=va src=/images/711_1_09_Media_Folder.png>"
puts "$bfile</a></div>"
set img "/images/711_1_09_Media_Folder.png"
if {$bfile eq $::dustbin} { set img "/img/Dustbin_Folder.png" }
puts "<img border=0 class=va id=\"img$tbfile\" src=$img>"
puts "<input class=\"fs fsdir\" type=checkbox>"
puts "<a class=dbf
href=\"$::env(REQUEST_URI)?dir=[cgi_quote_url $file]\"
file=\"[cgi_quote_url $file]\">"
puts "$bfile</a><span class=filesize id=\"$tbfile\">
</span>"
set noflat 0
if $flatten {
if {[string match {\[*\]} [file tail $file]]} { set noflat 1 }
if {[file exists "$file/.noflatten"]} { set noflat 1 }
if $noflat { icon "/img/flat-tyre.png" "No-flatten" }
}
puts -nonewline "
<a href=#>
<img class=\"dopt va\" border=0 width=45 "
if $flatten { puts -nonewline "noflat=$noflat " }
puts "
src=/images/181_1_00_Help5_OPT_Plus.png>
</a>
"
puts "
<div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div>
"
puts "</div>"
}
proc entry {file {ajax 0}} {
set bfile [lindex [split $file /] end]
proc entry {file} {{i 0}} {
set bfile [file tail $file]
if {[string index $bfile 0] == "\025"} {
set bfile [string range $bfile 1 end]
}
@@ -77,275 +88,277 @@ proc entry {file {ajax 0}} {
continue
}
set ext [file extension $file]
if {$ext eq ".ts"} {
tsfile $file $bfile $ajax
continue
}
if {$ext in $::ignore} { continue }
if {$ext in $::standard} {
genfile $file $bfile
continue
}
}
if {$ext in $::ignore || $ext ni $::include} { continue }
if {[dict exists $_cgi tsfile]} {
set file [dict get $_cgi tsfile]
set ts [ts fetch $file]
file stat $file st
set rsz $st(size)
set sz [pretty_size $rsz]
if {[dict exists $_cgi action]} {
switch [dict get $_cgi action] {
entry {
entry $file 1
}
delete {
if {[$ts delete]} {
puts "Successfully deleted $file."
} else {
puts "Problem deleting $file, [$ts get error]"
}
}
lock {
set action lock
if {[$ts flag "Locked"]} { set action unlock }
if {[$ts $action]} {
puts "Successfully [set action]ed $file."
} else {
puts "Problem [set action]ing $file,
[$ts get error]"
}
}
}
exit
set base [file rootname $file]
if {$ext eq ".ts" && [file exists "${base}.nts"]} {
set type ts
set ts [ts fetch $file 1]
set img Video_TS
} elseif {$ext eq ".hmt"} {
if {[file exists "${base}.ts"]} { continue }
# Sole hmt file indicates failure to track.
set type bad
set ts 0
set img Video_Failed
} else {
set type gen
set ts 0
set img Video_Other
}
source /mod/var/mongoose/lib/epg.class
set new 0
if {$type eq "ts"} {
if {[$ts flag "New"] > 0} { set new 1 }
} elseif {$type eq "gen"} {
if {![file exists "${base}.hmi"]} { set new 1 }
}
if {$new} { append img _New }
set fscl "fs"
set synopsis ""
if {$type eq "ts"} {
set fscl "fs fsts"
set synopsis [cgi_quote_html [$ts get synopsis]]
}
puts "
<table class=keyval>
<tr>
<th>Title</th>
<td>[$ts get title]</td>
</tr><tr>
<th>Synopsis</th>
<td>[$ts get synopsis]</td>
</tr><tr>
<th>Definition</th>
<td>
<div class=\"va bf\" id=[incr i]>
<img class=va border=0 src=/img/$img.png>
<input class=\"$fscl\" type=checkbox>
<a class=bf title=\"$synopsis\"
file=\"[cgi_quote_url $file]\" type=$type href=#>
$bfile
</a>
"
if {[$ts get definition] eq "HD"} {
puts "<img class=va src=/images/172_1_00_HD.png height=21>"
} else {
puts "<img class=va src=/images/172_1_26_SD.png height=21>"
# Size
puts "<span class=filesize> ($sz) </span>"
# Icons
set locked 0
set encd 0
set odencd 1
set def unknown
set bx 0
set dlna 0
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"
}
icon "/images/$img.png"
# Locked
if {[$ts flag "Locked"] > 0} {
set locked 1
icon "/images/178_1_00_Icon_Lock.png" "Locked"
}
# Encrypted
if {[$ts flag "Encrypted"] > 0} {
set encd 1
icon "/images/749_1_26_Video_Encryption.png" ""
}
if {![$ts flag "ODEncrypted"]} {
set odencd 0
icon "/img/Decrypted.png" "Decrypted"
}
# Guidance
if {[$ts flag "Guidance"] > 0} {
icon "/images/174_1_26_GuidancePolicy.png"
}
# Indexed
if {$::model eq "HDR" && [llength [$ts dlnaloc]]} {
icon "/img/dlna.png" "Indexed by DLNA Server"
set dlna 1
}
set bx [$ts get bookmarks]
}
puts "</td>
</tr><tr>
<th>Channel</th>
<td>[epg channelicon [$ts get channel_name] 50 "vertical-align: middle"]
[$ts get channel_num] - [$ts get channel_name]</td>
</tr><tr>
<th>Start Time</th>
<td>"
puts [clock format [$ts get start] -format "%c %Z"]
puts "</td>
</tr><tr>
<th>End Time</th>
<td>"
puts [clock format [$ts get end] -format "%c %Z"]
puts "</td>
</tr><tr>
<th>Duration</th>
<td>[$ts duration] minute(s).</td>
</tr><tr>
<th>Size</th>
<td>[$ts size] MiB</td>
</tr><tr>
<th>Flags</th>
<td>[$ts get flags]</td>
</tr>
</table>
# Opt+ button
puts "
<a href=#>
<img class=\"opt va\" border=0 width=45 type=$type did=$i
locked=$locked encd=$encd def=$def new=$new bx=$bx
rsize=$rsz
odencd=$odencd dlna=$dlna
src=/images/181_1_00_Help5_OPT_Plus.png>
</a>
<div class=\"results blood\" style=\"margin: 0 0 0 5em\"></div>
"
exit
puts "</div>"
}
if {[dict exists $_cgi dir]} {
set dir [dict get $_cgi dir]
} else {
set dir "/media/My Video"
set dir [cgi_get dir [system mediaroot]]
######################################################################
# Render web page
header
puts {
<link href=/css/jquery.contextMenu.css rel=stylesheet type=text/css />
<script type="text/javascript" src="/js/jquery.contextMenu.js"></script>
<link href=/css/jquery.bar.css rel=stylesheet type=text/css />
<script type="text/javascript" src="/js/jquery.bar.js"></script>
<script type=text/javascript src=/js/enadis.js></script>
<script type=text/javascript src=/cgi-bin/browse/browse.js></script>
<link type=text/css rel=stylesheet href=/cgi-bin/browse/style.css />
}
source /mod/var/mongoose/html/lib/header.jim
source /mod/var/mongoose/cgi-bin/browse/assets.jim
puts {
<link href=/css/jquery.contextMenu.css rel=stylesheet type=text/css />
<script type="text/javascript" src="/js/jquery.contextMenu.js"></script>
<ul id=optmenu class=contextMenu>
<li><a href=#delete>Delete</a></li>
<li><a href=#lock>Toggle Lock</a></li>
<li><a href=#rename>Rename</a></li>
<li><a href=#title>Change Title</a></li>
</ul>
<div id=dialogue></div>
<div id=confirm title="Confirmation Required"></div>
<script type=text/javascript>
function bindmenu(selector)
{
$(selector).contextMenu(
{
menu: 'optmenu',
leftButton: true,
beforeShow:
function(el, menu)
{
if (el.attr('locked') == 1)
{
$(menu).changeContextMenuItem('#lock', 'Unlock');
$('#optmenu').disableContextMenuItems('#delete');
}
else
{
$(menu).changeContextMenuItem('#lock', 'Lock');
$('#optmenu').enableContextMenuItems('#delete');
}
}
},
function (action, el, pos)
{
var ts = $(el).parent().prevAll('a.ts').last().attr('file');
var did = $(el).attr('did');
switch (action)
{
case 'delete':
confirm_action('delete', delete_callback, ts, did);
break;
case 'lock':
confirm_action('change the lock on', lock_callback, ts, did);
break;
default:
alert('Unhandled action: ' + action);
break;
}
}
);
}
var $confirm = $('#confirm').dialog({
modal: true, autoOpen: false,
height: 160, width: 500,
show: 'fade', hide: 'fade',
draggable: false, resizable: false
});
var confirm_action = function(action, callback, ts, id) {
var bts = ts.replace(/.*\/|\.[^.]*$/g, '');
$confirm.dialog('option', 'buttons', {
'Yes': function() { $(this).dialog('close');
callback(ts, id); },
'No': function() {$(this).dialog('close');}
});
$('#confirm').empty().html(
'Are you sure you wish to ' + action + '<br>' +
'<i>' + bts + '</i> ?'
);
$confirm.dialog('open');
}
var delete_callback = function(ts, id) {
var el = 'div.tsfile#' + id;
var results = el + ' .results';
var url = window.location.pathname + '?tsfile=' +
encodeURIComponent(ts) + '&action=delete';
$(results).load(url, function() {
$(el).delay(3000).slideUp(300, function() {
$(el).remove();
});
});
}
var lock_callback = function(ts, id) {
var el = 'div.tsfile#' + id;
var results = el + ' .results';
var url = window.location.pathname + '?tsfile=' +
encodeURIComponent(ts) + '&action=';
$(results).load(url + 'lock', function() {
$(results).delay(3000).slideUp(150,
function() {
$(el).load(url + 'entry', function() {
bindmenu(el + ' img.opt');
});;
}
);
});
}
// Dialogue init
var $dialog = $('#dialogue').dialog({
title: "Recording Details",
modal: false, autoOpen: false,
height: 600, 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">'); }
});
$(document).ready(function() {
$('#optmenu').disableContextMenuItems('#rename,#title');
bindmenu('img.opt');
$('a.ts').click(function(e) {
e.preventDefault();
var file = $(this).attr('file');
var url = window.location.pathname + '?tsfile=' +
encodeURIComponent(file);
$('#dialogue').load(url);
$dialog.dialog('open');
});
});
</script>
}
puts { <div style="border: 1px solid grey; padding: 1em"> }
puts "
<span style=\"display:none\" id=dir>$dir</span>
<fieldset class=cleft style=\"margin: 0 1em 1em 1em\">
<legend style=\"font-size: 1.5em; padding: 0 0.5em 0.5em 0.5em;\">
"
# Breadcrumb path
puts "<h1>"
set stub ""
foreach part [split $dir /] {
if {$stub eq "/"} { set name $part } else { set name "/$part" }
append stub $name
puts "<a href=$env(REQUEST_URI)?dir=[cgi_quote_url $stub]>$name</a>
}
puts "</h1>"
puts "<span class=filesize id=dirsize></span>"
puts "</legend>"
# Parent directory
set parent [join [lrange [split $dir /] 0 end-1] /]
if {$parent ne ""} {
puts "
<div class=va>
<a href=$env(REQUEST_URI)?dir=[cgi_quote_url $parent]>
<img 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>
"
}
regsub -all -- {\/+} "$dir/*" "/" dir
proc s_time {a b} {
global dir
foreach file [lsort [glob -nocomplain "$dir"]] {
entry $file
set a "$dir/$a"
set b "$dir/$b"
set ad [file isdirectory $a]
set bd [file isdirectory $b]
if {$ad && !$bd} { return -1 }
if {$bd && !$ad} { return 1 }
if {$ad && $bd} {
if {$a < $b} { return -1 }
if {$a > $b} { return 1 }
return 0
}
file stat $a l
set at $l(ctime)
file stat $b l
set bt $l(ctime)
if {$at < $bt} { return -1 }
if {$at > $bt} { return 1 }
return 0
}
set files [readdir -nocomplain $dir]
switch $order {
1 { set files [lsort -command s_time $files] }
default { set files [lsort $files] }
}
foreach file $files { entry "$dir/$file" }
puts "<a href=# id=selectall>Select all</a> | <a href=# id=deselectall>none</a>"
# Sort icons
puts "<div id=sortdiv>"
set sortlist {{0 sort_name name} {1 sort_date date}}
foreach sl $sortlist {
lassign $sl index img descr
if {$index} { puts " | " }
set tag "Currently sorting"
if {$order != $index} {
puts "
<a href=$env(REQUEST_URI)?$env(QUERY_STRING)&order=$index>"
set tag "Sort"
}
puts "<img class=va border=0 src=/img/$img.gif> $tag by $descr"
if {$order != $index} {
puts "</a>"
}
}
puts "</div>"
puts "</fieldset>"
puts {
<fieldset class=left style="margin: 0 1em 1em 1em">
<legend style="font-size: 1.5em; padding: 0 0.5em 0.5em 0.5em; color: #1e5bbd;">
File Clipboard
</legend>
<div id=clipboard>
<img src=/img/loading.gif> <i>Loading...</i>
</div>
</fieldset>
}
puts "<div class=brow>"
puts {
<button id=copy>Copy</button>
<button id=cut>Cut</button>
<button id=delete>Delete</button>
<button id=newdir>New Folder</button>
<div id=deletewait class=blood style="display: none">
<img src=/img/loading.gif>Deleting may take some time, please be patient...
</div>
}
# Join
if $nicesplice {
puts { <button id=join>Join</button> }
}
puts "</div><div class=brow style=\"margin-top: 3px\">"
# De-duplicate
puts {
<button id=dedup>De-duplicate/tidy this folder</button>
}
# Streamer file
if {[file exists /mnt/hd3/Streamer_down_file]} {
puts {
<button id=save_stream file=/mnt/hd3/Streamer_down_file>
Save last streamed content (e.g. iPlayer/YouTube)
</button>
}
}
puts "</div>"
source /mod/var/mongoose/html/lib/footer.jim
footer

View File

@@ -0,0 +1,167 @@
#!/mod/bin/jimsh
puts {
<div id=jbar></div>
<ul id=optmenu class=contextMenu style="width: 160px">
<li class=delete><a href=#delete>Delete</a></li>
<li class=cut><a href=#cut>Cut to clipboard</a></li>
<li class=pwcopy><a href=#copy>Copy to clipboard</a></li>
<li class=separator><a href=#rename>Rename</a></li>
<li><a href=#download>Download</a></li>
}
if {$model eq "HDR"} {
puts { <li class="separator"><a href=#decrypt>Decrypt</a></li> }
}
if {[system pkginst ffmpeg]} {
puts {
<li><a href=#audio>Extract Audio</a></li>
<li><a href=#mpg>Extract to MPG</a></li>
}
}
if $nicesplice {
puts {
<li class="cut"><a href=#crop>Crop</a></li>
<li class="cut"><a href=#chunk>Split (45m parts)</a></li>
}
}
puts {
<li class=separator><a href=#lock>Toggle Lock</a></li>
<li><a href=#enc>Toggle Enc</a></li>
<li><a href=#new>Toggle New</a></li>
</ul>
<ul id=doptmenu class=contextMenu style="width: 160px">
<li class=delete><a href=#delete>Delete</a></li>
<li class=cut><a href=#cut>Cut to clipboard</a></li>
<li class=pwcopy><a href=#copy>Copy to clipboard</a></li>
<li class=separator><a href=#rename>Rename</a></li>
}
if $flatten {
puts { <li class="separator"><a href=#flat>No-Flatten</a></li> }
}
puts {
</ul>
<div id=renameform title="Rename media file" style="display: none">
<form id=renameform_form>
<input type=hidden name="renameorig" id="renameorig" value="">
<input type=hidden name="titleorig" id="titleorig" value="">
<table border=0>
<tr>
<th>
<label for="rename">
<b>New Filename</b>
</label>
</th>
<td>
<input type=text name="rename" id="rename"
value="" size=70 maxlength=255
class="text ui-widget-content ui-corner-all">
</td>
</tr>
<tr style="display: none" class=tstype>
<th>
<label for="renametitle" style="padding-top: 0.5em">
<b>New Medialist Title</b>
</label>
</th>
<td>
<input type=text name="renametitle" id="renametitle"
value="" size=70 maxlength=48
class="text ui-widget-content ui-corner-all">
</td>
</tr>
<tr style="display: none" class=tstype>
<td colspan=2 id=synopsis style="font-style: italic"></td>
</tr>
</table>
</form>
</div>
<div id=drenameform title="Rename directory" style="display: none">
<form id=drenameform_form>
<input type=hidden name="renameorig" id="drenameorig" value="">
<table border=0>
<tr>
<th>
<label for="drename">
<b>New Directory Name</b>
</label>
</th>
<td>
<input type=text name="rename" id="drename"
value="" size=70 maxlength=255
class="text ui-widget-content ui-corner-all">
</td>
</tr>
</table>
</form>
</div>
<div id=savestreamform title="Save streamed content"
style="display: none">
<div class=pre id=savestream_detail></div>
<form id=savestream_form>
}
puts "<input type=hidden name=dir value=\"$dir\">"
puts {
<table border=0>
<tr>
<th>
<label for="savestream_name">
<b>Filename</b>
</label>
</th>
<td>
<input type=text name="savestream_name"
id="savestream_name"
value="" size=70 maxlength=255
class="text ui-widget-content ui-corner-all">
<img id=savestream_spin src=/img/loading.gif>
</td>
</tr>
</table>
</form>
</div>
<div id=newdirform title="New Folder" style="display: none">
<form id=newdirform_form>
}
puts "<input type=hidden name=dir value=\"$dir\">"
puts {
<table border=0>
<tr>
<th>
<label for="newdirname">
<b>New Folder Name</b>
</label>
</th>
<td>
<input type=text name="newdirname" id="newdirname"
value="" size=70 maxlength=255
class="text ui-widget-content ui-corner-all">
</td>
</tr>
</table>
</form>
</div>
<div id=dialogue></div>
<div id=confirm title="Confirmation Required"></div>
<div id=pwdialogue style="display: none">
<center>
<img src=/img/loading.gif>
<br><br>
Please wait...
<div id=pwfeedback></div>
</center>
</div>
}

View File

@@ -0,0 +1,52 @@
#!/mod/bin/jimsh
package require sqlite3
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class system.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
header
puts "
<link href=/css/jquery.progressbar.css rel=stylesheet type=text/css />
<script type=text/javascript src=/js/jquery.progressbar.js></script>
<script type=text/javascript src=audio.js></script>
<fieldset class=cleft>
<legend>Audio Extraction</legend>
<table class=keyval cellpadding=5>
<tr><th>File:</th><td>$rfile</td></tr>
<tr><th>Length:</th><td>[clock format $len -format "%T"]</td></tr>
</table>
<span class=hidden id=params
dir=\"[cgi_quote_url $dir]\"
rfile=\"[cgi_quote_url $rfile]\"
></span>
<div id=audiodiv style=\"padding: 1em\">
<button id=audioit>Perform audio extraction</button>
</div>
<div id=progressdiv class=hidden>
Extracting audio: <div id=progressbar></div>
</div>
<button id=back class=hidden>Back to media list</button>
<div id=output class=pre style=\"margin-top: 10px\"></div>
</fieldset>
"

View File

@@ -0,0 +1,35 @@
var handle = 0;
function update()
{
$.get('progress.jim?file=' + $('#params').attr('rfile'),
function(data) {
if (handle)
$('#progressbar').reportprogress(data);
});
}
$(document).ready(function() {
$('#progressbar').reportprogress(0);
$('#back').button().click(function() {
window.location = '/cgi-bin/browse.jim?dir=' + $('#params').attr('dir');
});
$('#audioit').button().click(function() {
$('#audiodiv').hide('slow');
$('#progressdiv').show('slow');
handle = setInterval("update()", 1000);
$('#output').load('execute.jim?file=' + $('#params').attr('rfile'),
function() {
clearInterval(handle);
handle = 0;
$('#back').show();
$('#progressbar').reportprogress(100);
});
});
});

View File

@@ -0,0 +1,39 @@
#!/mod/bin/jimsh
package require sqlite3
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class system.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
set xstart [clock milliseconds]
set base [file rootname $rfile]
set shname [file tail $base]
puts "Processing $shname"
puts [exec /mod/bin/ffmpeg -y -benchmark -v 0 \
-i $rfile -f mp3 \
-vn -acodec copy "${base}.mp3"]
if {[system pkginst id3v2]} {
puts [exec /mod/bin/id3v2 \
--song "[$ts get title]" \
--comment "[$ts get synopsis]" \
--album "[$ts get channel_name]" \
--year "[clock format [$ts get start] -format {%Y}]" \
"${base}.mp3"]
}
set xtime [expr [expr [clock milliseconds] - $xstart] / 1000.0]
puts "Time taken: $xtime"

View File

@@ -0,0 +1,26 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set tsfile [cgi_get file]
set rfile [file normalize $tsfile]
set bfile [file rootname $rfile]
if {![file exists "${bfile}.mp3"]} {
puts "0"
} else {
set sz [file size $rfile]
set nsz [expr [file size "${bfile}.mp3"] / 0.3]
set perc [expr $nsz * 100 / $sz]
if {$perc > 100} { set perc 100 }
puts $perc
}

View File

@@ -0,0 +1,709 @@
var dir;
function disableall()
{
$('button,a,input').disable();
}
function reloadclipboard()
{
$('#clipboard')
.empty()
.html('<img src=/img/loading.gif> <i>Loading...</i>')
.load('/cgi-bin/browse/clipboard.jim', function() {
// Start Clipboard post-load actions
if ($('#clipclear').length)
$('#paste').enable();
else
$('#paste').disable();
$('#clipclear').button().click(function() {
$.get('/cgi-bin/browse/clipboard.jim?act=clear', function() {
reloadclipboard();
});
});
$('a.clipdel').click(function() {
$.get('/cgi-bin/browse/clipboard.jim?act=remove&path=' +
$(this).attr('path'), function() {
reloadclipboard();
});
});
$('#paste').button()
.click(function() {
disableall();
$('#pwdialogue').dialog({
title: "Pasting from clipboard",
modal: true, autoOpen: true,
height: 'auto', width: 'auto',
show: 'scale', hide: 'fade',
draggable: false, resizable: false,
closeOnEscape: false,
open: function() {
$('.ui-dialog-titlebar-close').hide();
}
});
$('#pwfeedback').load(
'/cgi-bin/browse/clipboard.jim?act=paste&dir='
+ encodeURIComponent(dir), function() {
$('#pwdialogue').dialog('close');
window.location.reload(true);
});
});
// End Clipboard post-load actions
});
}
function epginfo_callback(data, status, xhr)
{
var width = 85;
if (status != 'success')
return;
//console.log(status);
//console.dir(data);
$('#titleorig').val(data.title);
$('#renametitle').val(data.title);
if (data.synopsis.length > width)
data.synopsis = data.synopsis.substring(0, width) + '...';
$('#synopsis').html(data.synopsis);
$('tr.tstype').show('slow');
}
function insert_folder_size(folder, size)
{
folder = folder.replace(/ /g, '');
folder = folder.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
//console.log("Folder: (%s) = (%s)", folder, size);
if (folder == "")
$('#dirsize').text(' (' + size + 'iB)');
else
$('#' + folder).text(' (' + size + 'iB)');
}
function folder_size_callback(data, status, xhr)
{
//console.log("Status: %s", status);
//console.dir(data);
$.each(data, insert_folder_size);
}
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', '/img/Folder_New.png');
}
function new_folder_callback(data, status, xhr)
{
//console.log("Status: %s", status);
//console.dir(data);
$.each(data, set_folder_new);
}
function delete_callback(file, dir, id)
{
var el = 'div.bf#' + id;
var results = el + ' .results';
$(results)
.html('<img src=/img/loading.gif>Deleting, please wait...')
.slideDown('slow')
.load('/cgi-bin/browse/delete.jim', {
'dir': dir,
'files': [decodeURIComponent(file)]
}, function() {
$(el).delay(3000).slideUp(300, function() {
$(el).remove();
});
});
}
function lock_callback(file, type, id)
{
var url = '/cgi-bin/browse/lock.jim?file=' + file;
$.get(url, function() { window.location.reload(true); });
}
function enc_callback(file, type, id)
{
var url = '/cgi-bin/browse/enc.jim?file=' + file;
$.get(url, function() { window.location.reload(true); });
}
function new_callback(file, type, id)
{
var url = '/cgi-bin/browse/new.jim?file=' + file;
$.get(url, function() { window.location.reload(true); });
}
function rename_submit()
{
var s = $('#renameform_form').serialize();
$.get('/cgi-bin/browse/rename.jim?' + s,
function() { window.location.reload(true); });
}
function drename_submit()
{
var s = $('#drenameform_form').serialize();
$.get('/cgi-bin/browse/rename.jim?' + s,
function() { window.location.reload(true); });
}
function newdir_submit()
{
var s = $('#newdirform_form').serialize();
$.get('/cgi-bin/browse/mknewdir.jim?' + s,
function() { window.location.reload(true); });
}
function savestream_submit()
{
var s = $('#savestream_form').serialize();
var sf = $('#save_stream').attr('file');
$('#savestream_spin').show();
$.get('/cgi-bin/browse/savestream.jim?sfile=' +
encodeURIComponent(sf) + '&' + s,
function() {
window.location.reload(true);
});
}
var $confirm; // Populated after DOM is loaded.
function confirm_action(action, callback, file, type, id)
{
var bfile = file.replace(/.*\/|\.[^.]*$/g, '');
$confirm.dialog('option', 'buttons', {
'Yes': function() { $(this).dialog('close');
callback(file, type, id); },
'No': function() {$(this).dialog('close');}
});
$('#confirm').empty().html(
'Are you sure you wish to ' + action + '<br>' +
'<i>' + decodeURIComponent(bfile) + '</i> ?'
);
$confirm.dialog('open');
}
function preparemenu(el, menu)
{
if (el.attr('type') == 'ts')
{
if (el.attr('def') == 'HD')
{
$(menu).enableContextMenuItems('#enc');
if (el.attr('encd') == 1)
$(menu).changeContextMenuItem('#enc',
'Remove Enc');
else
$(menu).changeContextMenuItem('#enc',
'Set Enc');
}
if (el.attr('bx') > 0)
$(menu).enableContextMenuItems('#crop');
else
$(menu).disableContextMenuItems('#crop');
if (el.attr('rsize') > 4294967296)
$(menu).enableContextMenuItems('#chunk');
else
$(menu).disableContextMenuItems('#chunk');
$(menu).enableContextMenuItems('#new');
if (el.attr('new') == 1)
$(menu).changeContextMenuItem('#new', 'Mark watched');
else
$(menu).changeContextMenuItem('#new', 'Mark new');
$(menu).enableContextMenuItems('#lock');
if (el.attr('locked') == 1)
{
$(menu).changeContextMenuItem('#lock', 'Unlock');
$(menu).disableContextMenuItems('#delete');
}
else
{
$(menu).changeContextMenuItem('#lock', 'Lock');
$(menu).enableContextMenuItems('#delete');
}
if (el.attr('odencd') == 1 && el.attr('dlna') == 1)
$(menu).enableContextMenuItems('#decrypt');
else
$(menu).disableContextMenuItems('#decrypt');
if (el.attr('odencd') == 1)
{
$(menu).disableContextMenuItems('#audio');
$(menu).disableContextMenuItems('#mpg');
}
else
{
$(menu).enableContextMenuItems('#audio');
$(menu).enableContextMenuItems('#mpg');
}
}
else
{
$(menu).enableContextMenuItems('#delete');
$(menu).disableContextMenuItems('#lock');
$(menu).disableContextMenuItems('#enc');
$(menu).disableContextMenuItems('#new');
$(menu).disableContextMenuItems('#decrypt');
$(menu).disableContextMenuItems('#audio');
$(menu).disableContextMenuItems('#mpg');
$(menu).disableContextMenuItems('#crop');
$(menu).disableContextMenuItems('#chunk');
}
}
function preparedmenu(el, menu)
{
if (el.attr('noflat') != undefined)
{
if (el.attr('noflat') > 0)
$(menu).changeContextMenuItem('#flat', 'Allow Flatten');
else
$(menu).changeContextMenuItem('#flat',
'Prevent Flatten');
}
}
$(document).ready(function() {
dir = $('#dir').text();
var menuclick = function(action, el, pos)
{
var file = $(el).parent().prevAll('a.bf').last().attr('file');
var bfile = file.replace(/.*\/|\.[^.]*$/g, '');
bfile = bfile.replace(/[\x00-\x1f]+/g, '');
var type = $(el).attr('type');
var id = $(el).attr('did');
switch (action)
{
case 'delete':
confirm_action('delete', delete_callback, file,
dir, id);
break;
case 'copy':
if (!confirm('Are you sure? Copying recordings takes a long time!'))
break;
// Fallthrough
case 'cut':
$.get('/cgi-bin/browse/clipboard.jim?act=add&mode=' + action +
'&path=' + file, function() {
reloadclipboard();
});
break;
case 'lock':
confirm_action('change the lock on', lock_callback,
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(decodeURIComponent(bfile));
$('#renameorig').val(decodeURIComponent(file));
$('#titleorig').val('');
$('#renametitle').val('');
$('#synopsis').val('');
$('tr.tstype').css('display', 'none');
if (type == 'ts')
{
$.getJSON('/cgi-bin/browse/epgtitle.jim?file=' +
file, epginfo_callback);
}
$('#renameform').dialog('open');
break;
case 'download':
window.location.href = '/cgi-bin/browse/download.jim?file=' +
file;
break;
case 'crop':
window.location.href = '/cgi-bin/browse/crop/crop.jim?file=' +
file;
break;
case 'chunk':
window.location.href = '/cgi-bin/browse/chunk/chunk.jim?file=' +
file;
break;
case 'decrypt':
window.location.href =
'/cgi-bin/browse/decrypt/decrypt.jim?file=' + file;
break;
case 'audio':
window.location.href = '/cgi-bin/browse/audio/audio.jim?file=' +
file;
break;
case 'mpg':
window.location.href = '/cgi-bin/browse/mpg/mpg.jim?file=' +
file;
break;
default:
alert('Unhandled action: ' + action);
break;
}
};
var dmenuclick = function(action, el, pos)
{
var direl = $(el).parent().parent();
var file = $(el).parent().prevAll('a.dbf').last().attr('file');
var bfile = file.replace(/.*\//g, '');
bfile = bfile.replace(/[\x00-\x1f]+/g, '');
var results = $(el).parent().next('div.results');
switch (action)
{
case 'delete':
if (confirm('Are you sure you wish to delete "' +
decodeURIComponent(file) +
'" and all files within it?'))
{
$(results)
.html('<img src=/img/loading.gif>' +
'Deleting, please wait...')
.slideDown('slow')
.load('/cgi-bin/browse/delete.jim', {
'dir': dir,
'files': [decodeURIComponent(file)]
}, function() {
$(direl).delay(3000).slideUp(300, function() {
$(direl).remove();
});
});
}
break;
case 'copy':
if (!confirm('Are you sure? Copying directories can take a very long time!'))
break;
// Fallthrough
case 'cut':
$.get('/cgi-bin/browse/clipboard.jim?act=add&mode=' + action +
'&path=' + file, function() {
reloadclipboard();
});
break;
case 'rename':
$('#drename').val(decodeURIComponent(bfile));
$('#drenameorig').val(decodeURIComponent(file));
$('#drenameform').dialog('open');
break;
case 'flat':
var url = '/cgi-bin/browse/flat.jim?file=' + file;
$.get(url, function() { window.location.reload(true); });
break;
default:
alert('Unhandled action: ' + action);
break;
}
};
// Bind context menu to opt+ image
$('img.opt').contextMenu(
{
menu: 'optmenu',
leftButton: true,
beforeShow: preparemenu
},
menuclick
);
$('img.dopt').contextMenu(
{
menu: 'doptmenu',
leftButton: true,
beforeShow: preparedmenu
},
dmenuclick
);
// Disable items which are not yet implemented.
$('#optmenu').disableContextMenuItems('#title');
var $buttons = {
"Close" : function() {$(this).dialog('close');}
};
var $buttonsp = $.extend(
{"Play" : function() { doplay(); }},
$buttons);
// Create reusable dialogue.
var $dialog = $('#dialogue').dialog({
title: "Media Details",
modal: false, autoOpen: false,
height: 600, width: 700,
show: 'scale', hide: 'fade',
draggable: true, resizable: true,
buttons: $buttons,
close: function(e,u) { $('#dialogue').empty().html(
'<img src="/img/loading.gif" alt="loading">'); }
});
function doplay()
{
var file = $dialog.attr('file');
var type = $dialog.attr('type');
disableall();
window.location = '/cgi-bin/browse/play.jim?' +
'dir=' + encodeURIComponent(dir) +
'&file=' + file;
}
// Bind dialogue open to filenames.
$('a.bf').click(function(e) {
e.preventDefault();
var file = $(this).attr('file');
var type = $(this).attr('type');
var opt = $(this).nextAll('a').find('img.opt');
var url = '/cgi-bin/browse/file.jim?file=' + file
+ '&type=' + type;
$dialog.load(url);
$dialog.attr('file', file);
$dialog.attr('type', type);
if (type == 'ts' &&
(opt.attr('odencd') == 0 || opt.attr('dlna') == 1))
$dialog.dialog("option", "buttons", $buttonsp);
else
$dialog.dialog("option", "buttons", $buttons);
$dialog.dialog('open');
});
$('#renameform').dialog({
autoOpen: false,
height: 'auto', width: 'auto',
modal: true,
buttons: {
"Update": rename_submit,
"Close": function() {
$(this).dialog('close');
}
},
close: function() { $('#rename').val(''); }
});
$('#drenameform').dialog({
autoOpen: false,
height: 'auto', width: 'auto',
modal: true,
buttons: {
"Update": drename_submit,
"Close": function() {
$(this).dialog('close');
}
},
close: function() { $('#drename').val(''); }
});
$('#savestreamform').dialog({
autoOpen: false,
height: 'auto', width: 'auto',
modal: true,
buttons: {
"Save": savestream_submit,
"Cancel": function() {
$(this).dialog('close');
}
},
close: function() { $('#savestream_name').val(''); }
});
// Create re-usable confirmation dialogue.
$confirm = $('#confirm').dialog({
modal: true, autoOpen: false,
height: 160, width: 500,
show: 'fade', hide: 'fade',
draggable: false, resizable: false
});
// Load folder sizes
$.getJSON('/cgi-bin/browse/sizes.jim?dir=' + encodeURIComponent(dir),
folder_size_callback);
// Flag folders with unwatched items
$.getJSON('/cgi-bin/browse/newdir.jim?dir=' + encodeURIComponent(dir),
new_folder_callback);
// Load clipboard
reloadclipboard();
// Uncheck everything
$('input.fs:checked').attr('checked', false);
// Buttons
$('#dedup').button().click(function() {
window.location = '/cgi-bin/dedup.jim?dir='
+ encodeURIComponent(dir);
});
$('#save_stream').button().click(function() {
$('#savestream_spin').hide();
$('#savestreamform').dialog('open');
$('#savestream_detail').load(
'/cgi-bin/browse/ffmpeg.jim?file=' +
encodeURIComponent($('#save_stream').attr('file')));
});
$('#selectall').click(function(e) {
e.preventDefault();
$('input.fs').attr('checked', true).trigger('change');
});
$('#deselectall').click(function(e) {
e.preventDefault();
$('input.fs:checked').attr('checked', false).trigger('change');
});
$('#join').button().disable()
.click(function() {
var files = new Array();
var els = $('input.fsts:checked + a').each(function() {
files.push($(this).attr('file'));
});
//console.log("%o", files);
window.location.href = '/cgi-bin/browse/join/join.jim?files=' +
files.join();
});
$('#delete').button().disable()
.click(function() {
var files = new Array();
var els = $('input.fs:checked + a').each(function() {
files.push(decodeURIComponent($(this).attr('file')));
});
//console.log("%o", files);
var str = 'Are you sure you want to delete ' + files.length +
' file';
if (files.length != 1) str += 's';
str += '?';
if (confirm(str))
{
disableall();
$('#deletewait').slideDown('slow');
$('#pwdialogue').dialog({
title: "Deleting",
modal: true, autoOpen: true,
height: 'auto', width: 'auto',
show: 'scale', hide: 'fade',
draggable: false, resizable: false,
closeOnEscape: false,
open: function() {
$('.ui-dialog-titlebar-close').hide();
}
});
$('#pwfeedback').load(
'/cgi-bin/browse/delete.jim', {
'dir': dir,
'files': files
}, function() {
$('#pwdialogue').dialog('close');
window.location.reload(true);
});
}
});
$('#copy,#cut').button().disable()
.click(function() {
var files = new Array();
var els = $('input.fs:checked + a').each(function() {
files.push(decodeURIComponent($(this).attr('file')));
});
//console.log("%o", files);
var action = $(this).attr('id');
if (action == 'copy' && !confirm('Are you sure? ' +
'Copying recordings can take a very long time!'))
return;
$.post('/cgi-bin/browse/clipboard.jim', {
'act': 'add',
'dir': dir,
'mode': action,
'path': files
}, function() {
reloadclipboard();
$('input.fs:checked').attr('checked', false);
});
});
$('#newdir').button().click(function() {
$('#newdirform').dialog({
autoOpen: true,
height: 'auto', width: 'auto',
modal: true,
buttons: {
"Create": newdir_submit,
"Cancel": function() {
$(this).dialog('close');
}
},
close: function() { $('#newdirname').val(''); }
});
});
$('input.fs').change(function() {
var num = $('input.fs:checked').size();
if (num > 0)
$('#delete,#cut,#copy').enable();
else
$('#delete,#cut,#copy').disable();
var num = $('input.fsts:checked').size();
if (num > 1)
$('#join').enable();
else
$('#join').disable();
});
});

View File

@@ -0,0 +1,6 @@
div.progressbar
{
width: 200px;
}

View File

@@ -0,0 +1,72 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
# 45 minute chunks
set max $(45 * 60)
set len [$ts duration 1]
set esttime $(int($len * 0.025))
if {[$ts get definition] eq "HD"} { set esttime $($esttime * 4) }
header
puts "
<script type=text/javascript src=/js/jquery.progressbar.js></script>
<script type=text/javascript src=chunk.js></script>
<link href=/css/jquery.progressbar.css rel=stylesheet type=text/css />
<link href=chunk.css rel=stylesheet type=text/css />
<fieldset class=cleft>
<legend>Split recording into 45 minute segments</legend>
<table class=keyval cellpadding=5>
<tr><th>File:</th><td>$rfile</td></tr>
<tr><th>Length:</th><td>[clock format $len -format "%T"]</td></tr>
<tr><th>Size:</th><td>[pretty_size [$ts size]] ([$ts get definition])</td></tr>
<tr><th>Time:</th>
<td>Splitting will take around [clock format $esttime -format "%T"]</td></tr>
"
set bytesperminute $([$ts size] / ($len / 60))
while {$len > 0} {
incr part
incr len -$max
puts "<tr class=\"part hidden\">
<th>Part $part</th><td>
<div id=progresspart$part class=progressbar></div>
<div id=progressstat$part class=also>waiting...</div>
</td></tr>"
}
puts "
</table>
<span class=hidden id=params parts=$part bpm=$bytesperminute
file=\"[cgi_quote_url $rfile]\">
</span>
<div id=chunkdiv style=\"padding: 1em\">
<button id=chunkit>Split recording into $part parts</button>
</div>
<div id=findiv style=\"padding: 1em\" class=hidden>
<button id=back dir=\"[cgi_quote_url [file dirname $rfile]]\">
Back to Media Browser
</button>
</div>
</fieldset>
"

View File

@@ -0,0 +1,76 @@
var handle;
var currentpart = 0;
var stime = 0;
function xprogress()
{
var file = $('#params').attr('file');
var bpm = $('#params').attr('bpm');
if (currentpart > 0)
$.get('progress.jim?part=' + currentpart + '&file=' + file,
function(data) {
if (currentpart > 0)
{
perc = (data / bpm) * 100 / 45;
$('#progresspart' + currentpart)
.reportprogress(perc);
}
});
}
function xpart(part)
{
var parts = $('#params').attr('parts');
var file = $('#params').attr('file');
if (part++ < parts)
{
currentpart = part;
$('#progressstat' + part)
.text('extracting...')
.addClass('blood');
stime = new Date().getTime();
$.get('extract.jim?parts=' + parts +
'&part=' + part +
'&file=' + file,
function(data) {
var taken = (new Date().getTime() - stime) / 1000;
$('#progressstat' + part)
.text('done... (' + taken + ' seconds)')
.removeClass('blood');
currentpart = 0;
$('#progresspart' + part)
.reportprogress(100);
xpart(part);
});
}
else
{
clearInterval(handle);
$('#findiv').show('slow');
}
}
$(function() {
$('div.progressbar').reportprogress(0);
$('#chunkit').button().click(function(e) {
e.preventDefault();
$('#chunkdiv').hide('slow');
$('tr.part').show('slow');
handle = setInterval("xprogress()", 1000);
xpart(0);
});
$('#back').button().click(function(e) {
e.preventDefault();
var dir = $(this).attr('dir');
window.location = '/cgi-bin/browse.jim?dir=' + dir;
});
});

View File

@@ -0,0 +1,38 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set part [cgi_get part -]
set parts [cgi_get parts "?"]
if {$part eq "-"} exit
set start $(($part - 1) * 45 * 600 - 600)
set end $($part * 45 * 600 + 600)
puts "START: $start"
puts "END: $end"
set ts [ts fetch $rfile]
set base [file rootname $rfile]
set cmd [list /mod/bin/nicesplice -in $base -out "$base.part$part"]
if {$start > 0} { lappend cmd -cut 0 $start }
lappend cmd -cut $end 9999999
puts "CMD: ($cmd)"
puts [exec {*}$cmd]
set ts [ts fetch "$base.part$part.ts"]
$ts settitle "$part/$parts. [string range [ts get $title] 0 40]"

View File

@@ -0,0 +1,17 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set file [cgi_get file]
set part [cgi_get part]
set rfile "[file rootname $file].part$part"
puts [file size $rfile]

View File

@@ -0,0 +1,119 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require clipboard.class ts.class
puts "Content-Type: text/html; no-cache"
puts "Expires: Thu, 01 Jan 1970 00:00:00 GMT"
puts "Pragma: nocache"
puts ""
cgi_input 1
#cgi_dump
set cb [[clipboard new {path "/tmp/webif-browse.cb"}] load]
set action [cgi_get act list]
switch $action {
list {
if {![$cb size]} {
puts "<i>Clipboard is empty</i>"
break
}
puts "<div class=cliplist>"
foreach file [$cb get items] {
set img "page_white_copy"
if {[$file get action] eq "cut"} {
set img "cut"
}
set path [$file get path]
set xpath [cgi_quote_html $path]
puts "<span title=\"$xpath\" alt=\"$xpath\">"
puts "<img src=/img/context/$img.png>"
set dfile [file tail $path]
if {[string length $dfile] > 25} {
set dfile "[string range $dfile 0 22]..."
}
if {[file isdirectory $path]} {
puts "<img height=16
src=/images/711_1_09_Media_Folder.png>"
}
puts [cgi_quote_html $dfile]
puts "<a class=clipdel href=# alt=\"Remove\" title=\"Remove\"
path=\"[cgi_quote_url $path]\">
<img border=0 src=/img/close.png height=16></a>"
puts "</span>"
}
puts "</div>"
puts "<button id=paste>Paste to current folder</button>"
puts "<button id=clipclear>Empty clipboard</button>"
}
add {
if {[set path [cgi_get path]] eq "0"} {
puts "No path."
exit
}
set dir [cgi_unquote_input [cgi_get dir]]
set mode [cgi_get mode copy]
foreach p $path {
set p [cgi_unquote_input $p]
if {$dir ne "0" && ![string match "$dir/*" $p]} {
puts "$p not in directory<br>"
continue
}
if {![$cb present $p]} {
$cb add $mode $p
puts "Added $p for $mode<br>"
}
}
$cb save
}
remove {
$cb remove [cgi_unquote_input [cgi_get path]]
$cb save
}
clear {
$cb clear
$cb save
}
paste {
set dir [cgi_unquote_input [cgi_get dir]]
foreach item [$cb get items] {
set path [$item get path]
set file [file tail $path]
set mode [$item get action]
puts "Pasting $file"
if {[file isdirectory $path]} {
# Directory
if {$mode eq "cut"} {
catch {file rename $path "$dir/$file"}
} else {
catch {puts [exec /mod/bin/busybox/cp -r \
$path $dir]}
}
} else {
set root [file rootname $path]
# Protect special characters in root.
# In particular [] characters which are used a lot
# for torrent names.
regsub -all {([\\["$])} $root {\\\1} root
foreach f [glob -nocomplain "${root}.*"] {
if {$mode eq "cut"} {
catch {file rename $f \
"$dir/[file tail $f]"}
} else {
catch {file copy $f \
"$dir/[file tail $f]"}
}
}
}
}
$cb clear
$cb save
}
}

View File

@@ -0,0 +1,117 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
header
puts "
<link href=/css/jquery.progressbar.css rel=stylesheet type=text/css />
<script type=text/javascript src=/js/jquery.progressbar.js></script>
<script type=text/javascript src=crop.js></script>
<fieldset class=cleft>
<legend>Crop recording</legend>
<table class=keyval cellpadding=5>
<tr><th>File:</th><td>$rfile</td></tr>
<tr><th>Length:</th><td>[clock format $len -format \"%T\"]</td></tr>
<tr><th>Size:</th><td>[pretty_size [$ts size]] ([$ts get definition])</td></tr>
<tr><th>Bookmarks:</th><td>[$ts get bookmarks] @ "
set flag 0
foreach b [$ts bookmarks] {
if $flag { puts -nonewline ", " }
incr flag
puts -nonewline [clock format $b -format "%T"]
}
puts "</td></tr><tr><th>File</th><td>"
puts "<div style=\"position: relative; top: -10px\">"
proc div {type left right} {
set width $($right - $left)
puts "<div class=$type style=\"left: ${left}px; width: ${width}px\">
$type</div>"
}
set keeping 0
set last 0
set start -1
foreach b [$ts bookmarks] {
if {$start < 0} {
set start $b
continue
}
set end $b
incr keeping $($end - $start)
set left $($start * 500 / $len)
set right $($end * 500 / $len)
div cut $last $($left - 1)
div keep $left $($right - 1)
set last $right
set start -1
}
if {$start > 0} {
incr keeping $($len - $start)
set left $($start * 500 / $len)
div cut $last $($left - 1)
div keep $left 500
} else {
div cut $last 500
}
set keepperc $($keeping * 100.0 / $len)
set esttime $(int($keeping * 0.025))
if {[$ts get definition] eq "HD"} { set esttime $($esttime * 4) }
puts "
</div>
</td></tr>
<tr><th>Keeping:</th><td>
[clock format $keeping -format "%T"] ([format "%.2f" $keepperc]%)
</td></tr>
<tr><th>Time:</th>
<td>Cropping will take around [clock format $esttime -format "%T"]</td></tr>
</table>
<span class=hidden id=params
file=\"[cgi_quote_url $rfile]\"
perc=\"$keepperc\"
dir=\"[cgi_quote_url $dir]\"
></span>
<div id=cropdiv style=\"padding: 1em\">
<button id=cropit>Perform crop operation</button>
</div>
<div id=progressdiv class=hidden>
Cropping: <div id=progressbar></div>
</div>
<button id=back class=hidden>Back to media list</button>
<div id=output class=pre style=\"margin-top: 10px\"></div>
</fieldset>
"

View File

@@ -0,0 +1,38 @@
var handle = 0;
function update()
{
var perc = $('#params').attr('perc');
var file = $('#params').attr('file');
$.get('progress.jim' + '?perc=' + perc + '&file=' + file,
function(data) {
if (handle)
$('#progressbar').reportprogress(data);
});
}
$(document).ready(function() {
$('#progressbar').reportprogress(0);
$('#back').button().click(function() {
window.location = '/cgi-bin/browse.jim?dir=' + $('#params').attr('dir');
});
$('#cropit').button().click(function() {
$('#cropdiv').hide('slow');
$('#progressdiv').show('slow');
handle = setInterval("update()", 1000);
$('#output').text('Please do not interrupt...')
.load('execute.jim?file=' + $('#params').attr('file'),
function() {
clearInterval(handle);
handle = 0;
$('#back').show();
$('#progressbar').reportprogress(100);
});
});
});

View File

@@ -0,0 +1,52 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
set cropstart [clock milliseconds]
set base [file rootname $rfile]
set origdir "$dir/_original"
if {![file exists $origdir]} { file mkdir $origdir }
set shname [file tail $base]
puts "Processing $shname"
if {[file exists "$origdir/$shname.ts"]} {
puts "This recording already exists within _original"
puts "Cannot continue."
exit
}
puts "Moving recording to $origdir"
foreach f [glob -nocomplain "${base}.*"] {
set tail [file tail $f]
puts " $tail"
file rename $f "$origdir/$tail"
}
puts [exec /mod/bin/nicesplice \
-in "$origdir/$shname" \
-out "$dir/$shname" \
-cutBookMarks]
set newname "$shname-[clock seconds]"
puts "Renaming file group to $newname"
ts renamegroup "$dir/$shname.ts" $newname
exec /mod/bin/hmt "+setfilename=$newname" "$dir/$newname.hmt"
set croptime [expr [expr [clock milliseconds] - $cropstart] / 1000.0]
puts "Time taken: $croptime"

View File

@@ -0,0 +1,29 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set perc [cgi_get perc 100]
set tsfile [file normalize [cgi_get file]]
set origfile "[file dirname $tsfile]/_original/[file tail $tsfile]"
set newfile [file rootname $tsfile]
if {![file exists $newfile]} {
puts "0"
} else {
set sz [file size $origfile]
set expected $($sz / 100 * $perc)
set nsz [file size $newfile]
set perc [expr $nsz * 100 / $expected]
if {$perc > 100} { set perc 100 }
puts $perc
}

View File

@@ -0,0 +1,64 @@
#!/mod/bin/jimsh
package require sqlite3
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
lassign [$ts dlnaloc] url
header
puts "
<link href=/css/jquery.progressbar.css rel=stylesheet type=text/css />
<script type=text/javascript src=/js/jquery.progressbar.js></script>
<script type=text/javascript src=decrypt.js></script>
<fieldset class=cleft>
<legend>Decrypt in-place</legend>
<table class=keyval cellpadding=5>
<tr><th>File:</th><td>$rfile</td></tr>
<tr><th>Length:</th><td>[clock format $len -format "%T"]</td></tr>
<tr><th>DLNA URL</th><td>$url</td></tr>
</table>
"
if {$url eq ""} {
puts "This file has not been indexed by the media server.
Cannot decrypt."
puts "Have you enabled <i>Content Sharing</i> in the Humax menus?"
exit
}
puts "
<span class=hidden id=params
dir=\"[cgi_quote_url $dir]\"
file=\"[cgi_quote_url $rfile]\"
></span>
<div id=decryptdiv style=\"padding: 1em\">
<button id=decryptit>Perform decryption</button>
</div>
<div id=progressdiv class=hidden>
Decrypting: <div id=progressbar></div>
</div>
<button id=back class=hidden>Back to media list</button>
<div id=output class=pre style=\"margin-top: 10px\"></div>
</fieldset>
"

View File

@@ -0,0 +1,35 @@
var handle = 0;
function update()
{
$.get('progress.jim?file=' + $('#params').attr('file'),
function(data) {
if (handle)
$('#progressbar').reportprogress(data);
});
}
$(document).ready(function() {
$('#progressbar').reportprogress(0);
$('#back').button().click(function() {
window.location = '/cgi-bin/browse.jim?dir=' + $('#params').attr('dir');
});
$('#decryptit').button().click(function() {
$('#decryptdiv').hide('slow');
$('#progressdiv').show('slow');
handle = setInterval("update()", 1000);
$('#output').load('execute.jim?file=' + $('#params').attr('file'),
function() {
clearInterval(handle);
handle = 0;
$('#back').show();
$('#progressbar').reportprogress(100);
});
});
});

View File

@@ -0,0 +1,55 @@
#!/mod/bin/jimsh
package require sqlite3
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
lassign [$ts dlnaloc] url
set xstart [clock milliseconds]
set base [file rootname $rfile]
set origdir "$dir/_original"
if {![file exists $origdir]} { file mkdir $origdir }
set shname [file tail $base]
puts "Processing $shname"
exec wget -O "$rfile.decrypting" $url
puts "Moving recording to $origdir"
foreach f [glob -nocomplain "${base}.*"] {
if {[file extension $f] eq ".decrypting"} { continue }
set tail [file tail $f]
puts " $tail"
file rename $f "${origdir}/$tail"
}
file rename "$rfile.decrypting" $rfile
foreach ext {nts hmt thm} {
set sidecar "$shname.$ext"
if {[file exists "$origdir/$sidecar"]} {
puts "Copying back sidecar $ext"
file copy "$origdir/$sidecar" "$dir/$sidecar"
}
}
if {[file exists "$dir/$shname.hmt"]} {
exec /mod/bin/hmt -encrypted "$dir/$shname.hmt"
}
set xtime [expr [expr [clock milliseconds] - $xstart] / 1000.0]
puts "Time taken: $xtime"

View File

@@ -0,0 +1,23 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set tsfile [cgi_get file]
set rfile [file normalize $tsfile]
if {![file exists "$rfile.decrypting"]} {
puts "0"
} else {
set sz [file size $rfile]
set nsz [file size "$rfile.decrypting"]
puts [expr $nsz * 100 / $sz]
}

View File

@@ -0,0 +1,101 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size system.class tdelete
puts "Content-Type: text/html\r\n"
cgi_input
#cgi_dump
set dir [cgi_get dir]
regsub -all {([\\["$])} $dir {\\\1} dir
#puts "DIR: ($dir)"
if {[system pkginst undelete]} {
set dustbin [system dustbin]
} else {
set dustbin ""
}
proc bindir {file} {
global dustbin
set dir [file dirname $file]
regsub "^[system mediaroot]" $dir $dustbin ndir
if {$dir eq $ndir} { set ndir $dustbin }
system mkdir_p $ndir
return $ndir
}
proc touch {file} {
exec /mod/bin/busybox/touch $file
}
puts "<div id=deleting class=blood><img src=/img/loading.gif>Deleting...</div>"
puts "<ul style=\"list-style-type: square\">"
foreach file [cgi_get files] {
puts -nonewline "<li>\"$file\"..."
if {![string match "$dir/*" $file]} {
puts "Error - outside directory."
continue
}
if {$dustbin ne "" && [string first $dustbin $file] > -1} {
set ldustbin ""
} else {
set ldustbin $dustbin
}
set done 0
if {[file isdirectory $file]} {
puts -nonewline "Directory..."
if {$ldustbin ne ""} {
set ndir "[bindir $file]/[file tail $file]"
while {[file isdirectory $ndir]} { append ndir "_" }
file rename $file $ndir
touch $ndir
} else {
tdelete $file
}
puts -nonewline "Done..."
set done 1
} elseif {[string match {*.ts} $file]} {
set ts [ts fetch $file]
# Check TS validity
if {![catch {$ts get file}]} {
if {$ldustbin ne ""} {
$ts move [bindir $file] 1
} else {
if {[$ts delete]} {
puts "Successfully deleted $file."
} else {
puts "Problem deleting $file, [$ts get error]"
}
}
set done 1
}
# else treat as normal file.
}
if {!$done} {
if {$ldustbin ne ""} {
set nfile "[bindir $file]/[file tail $file]"
file rename $file $nfile
touch $nfile
} else {
tdelete $file
}
catch {file delete "[file rootname $file].hmi"}
puts -nonewline "Done..."
}
puts "</li>"
}
puts "</ul>"

View File

@@ -0,0 +1,47 @@
#!/mod/bin/jimsh
package require cgi
package require sqlite3
source /mod/var/mongoose/lib/setup
require ts.class
#puts "Content-Type: text/plain\r\n\r\n"
cgi_input
#cgi_dump
set file [cgi_get file]
# Default to just downloading the raw file.
set url $file
set mime "video/ts"
if {[string match {*.ts} $file]} {
if {![catch {set ts [ts fetch $file]}]} {
# If it's encrypted on disk and the DLNA option is available,
# then use the server to perform decryption on the fly.
if {[$ts flag "ODEncrypted"] > 0} {
set dlna [$ts dlnaloc]
if {[llength $dlna]} { lassign $dlna url mime }
#puts "DLNA: $dlna"
}
}
}
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,22 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
puts "Content-Type: application/json"
puts ""
cgi_input
#cgi_dump
#set _cgi(file) "/media/My Video/Doctor Who/6.13._The_Almost_People.ts"
if {![dict exists $_cgi file]} { exit }
set file [dict get $_cgi file]
set ts [ts fetch $file]
puts "{"
puts "\"title\" : \"[$ts get title]\","
puts "\"synopsis\" : \"[$ts get synopsis]\""
puts "}"

View File

@@ -0,0 +1,17 @@
#!/mod/bin/jimsh
package require cgi
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
if [file exists /mod/bin/ffmpeg] {
set file [dict get $_cgi file]
puts [exec /mod/var/mongoose/lib/ffmpeg -i $file]
} else {
puts "Install ffmpeg package for more information..."
}

View File

@@ -0,0 +1,133 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/pretty_size
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
#set _cgi(file) "/media/My Video/Dangermouse/Series 1/01_rogue_robots.avi"
if {![dict exists $_cgi file]} { exit }
set file [dict get $_cgi file]
set type [dict get $_cgi type]
file stat $file st
set sz [pretty_size $st(size)]
if {$type eq "ts"} {
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/ts.class
set ts [ts fetch $file]
puts "
<table class=keyval>
<tr>
<th>Title</th>
<td>[$ts get title]</td>
</tr><tr>
<th>Synopsis</th>
<td>[$ts get synopsis]</td>
</tr><tr>
"
if {[$ts flag "Guidance"] > 0} {
puts "
<th>Guidance</th>
<td><img class=va
src=/images/174_1_26_GuidancePolicy.png height=21>
[$ts get guidance]
</td>
</tr><tr>
"
}
puts "
<th>Definition</th>
<td>
"
if {[$ts get definition] eq "HD"} {
puts "<img class=va src=/images/172_1_00_HD.png height=21>"
} else {
puts "<img class=va src=/images/172_1_26_SD.png height=21>"
}
puts "</td>
</tr><tr>
<th>Channel</th>
<td>[epg channelicon [$ts get channel_name] 50 "vertical-align: middle"]
[$ts get channel_num] - [$ts get channel_name]</td>
</tr><tr>
<th>Start Time</th>
<td>"
puts [clock format [$ts get start] -format "%c %Z"]
puts "<font class=also>(Scheduled: [
clock format [$ts get schedstart] -format "%c %Z"])</font>"
puts "</td>
</tr><tr>
<th>End Time</th>
<td>"
puts [clock format [$ts get end] -format "%c %Z"]
puts "<font class=also>(Scheduled: [clock format \
[expr [$ts get schedstart] + [$ts get scheddur]] \
-format "%c %Z"])</font>"
puts "</td>
</tr><tr>
<th>Duration</th>
<td>[$ts duration] minute(s).
<font class=also>(Scheduled: [expr [$ts get scheddur] / 60])
</font></td>
</tr><tr>
<th>Size</th>
<td>$sz</td>
"
lassign [$ts dlnaloc] url
if {$url ne ""} {
puts "</tr><tr><th>DLNA&nbsp;URL</th>
<td><a href=\"$url\">$url</a></td>"
}
puts "
</tr><tr>
<th>Flags</th>
<td>[$ts get flags]
"
if {[$ts get bookmarks]} {
puts " \[Bookmarks: [$ts get bookmarks]\]"
}
puts "</tr>"
puts "</table>"
exit
}
# Otherwise, for a general file.
puts "
<table class=keyval>
<tr>
<th>File</th>
<td>$file</td>
</tr><tr>
<th>Size</th>
<td>$sz</td>
</tr><tr>
<th>Info</th>
<td class=pre id=ffmpeg>
<img src=/img/loading.gif><i>Loading...</i>
</td>
</tr>
</table>
"
set url "/cgi-bin/browse/ffmpeg.jim?file=[cgi_quote_url $file]"
puts { <script type="text/javascript"> }
puts "var url = \"$url\";"
puts {
$('#ffmpeg').load(url);
</script>
}

View File

@@ -0,0 +1,28 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set dir [cgi_get file]
if {![file isdirectory $dir]} { exit }
set noflat 0
if {[string match {\[*\]} [file tail $dir]]} {
set ndir [string range [file tail $dir] 1 end-1]
file rename $dir "[file dirname $dir]/$ndir"
puts "Unflagged directory as noflatten."
exit
}
if {[file exists "$dir/.noflatten"]} {
file delete "$dir/.noflatten"
puts "Unflagged directory as noflatten."
} else {
close [open "$dir/.noflatten" w]
puts "Flagged directory as noflatten."
}

View File

@@ -0,0 +1,32 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n\r\n"
cgi_input 1
#cgi_dump
set joinstart [clock milliseconds]
set cmd {/mod/bin/nicesplice}
set dst [file rootname [cgi_get dest "joined"]]
foreach file [split [cgi_get files] ","] {
set file [cgi_unquote_input $file]
lappend cmd "-in" [file rootname $file]
set dir [file dirname $file]
}
lappend cmd "-out" "$dir/$dst"
puts "($cmd)"
puts [exec {*}$cmd]
set ts [ts fetch "$dir/$dst.ts"]
$ts settitle $dst
set jointime [expr [expr [clock milliseconds] - $joinstart] / 1000.0]
puts "Time taken: $jointime"

View File

@@ -0,0 +1,6 @@
#filelist { list-style-type: none; margin: 0; padding: 0; }
#filelist li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em;
height: 35px; }
#filelist li span { position: absolute; margin-left: -1.3em; }
span.pl { padding-left: 2em; }

View File

@@ -0,0 +1,65 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n\r\n"
header
cgi_input 1
#cgi_dump
puts "
<link href=/css/jquery.progressbar.css rel=stylesheet type=text/css />
<link href=join.css rel=stylesheet type=text/css />
<script type=text/javascript src=/js/jquery.progressbar.js></script>
<script type=text/javascript src=/js/touchbridge.js></script>
<script type/text/javascript src=join.js></script>
<p><b>
Drag the files below into order, enter a name for the resulting file and then
click the <i>Join</i> button.</b>
"
puts "<ul id=filelist>"
set esize 0
foreach file [split [cgi_get files] ","] {
set file [cgi_unquote_input $file]
set dir [file dirname $file]
set ts [ts fetch $file]
puts "<li class=\"va ui-state-default\" id=\"$file\"><span
class=\"va ui-icon ui-icon-arrowthick-2-n-s\"></span>
<img class=va src=/img/Video_TS.png>
<span class=pl>
$file ([clock format [$ts duration 1] -format "%T"])
\[[pretty_size [$ts size]]\]
<br><i style=\"font-size: 0.8em\">[$ts get title]</i>
</span>
</li>"
incr esize [$ts size]
}
puts "</ul>"
puts "
<br><br>
<div id=joindiv>
Name for joined file:
<input id=dest name=dfile class=\"text ui-widget-content ui-corner-all\"
length=20 maxlength=50>
<button id=dojoin>Join</button>
</div>
<div id=progressdiv style=\"display: none\">
Joining: <div id=progressbar></div>
<button id=back
dir=\"[cgi_quote_url $dir]\"
esize=\"$esize\"
style=\"display: none\">Back to media list</button>
<div id=output class=pre style=\"margin-top: 10px\"></div>
</div>
"
footer

View File

@@ -0,0 +1,62 @@
$('#filelist li').hover(
function() { $(this).css('cursor', 'pointer'); },
function() { $(this).css('cursor', 'auto'); }
);
var handle = 0;
function update()
{
$.get('progress.jim'
+ '?esize=' + $('#back').attr('esize')
+ '&file=' + $('#back').attr('dir') + '/' + $('#dest').val(),
function(data) {
if (handle)
$('#progressbar').reportprogress(data);
});
}
$(document).ready(function() {
$('#progressbar').reportprogress(0);
$('#back').button().click(function() {
window.location = '/cgi-bin/browse.jim?dir=' + $(this).attr('dir');
});
$('#filelist').sortable().disableSelection();
$('#dojoin').button().attr('disabled', true).addClass('ui-state-disabled')
.click(function() {
var files = $('#filelist').sortable('toArray');
var sfiles = new Array();
for (x in files)
sfiles.push(encodeURIComponent(files[x]));
$('#joindiv').hide('slow');
$('#progressdiv').show('slow');
handle = setInterval("update()", 1000);
$('#output').text('Please do not interrupt...')
.load('execute.jim?files=' +
sfiles.join() + '&dest=' + $('#dest').val(),
function() {
clearInterval(handle);
handle = 0;
$('#back').show();
$('#progressbar').reportprogress(100);
});
});
$('#dest').val('').keyup(function() {
if ($(this).val().length > 0)
$('#dojoin')
.removeProp('disabled').removeClass('ui-state-disabled');
else
$('#dojoin')
.prop('disabled', true).addClass('ui-state-disabled');
});
});

View File

@@ -0,0 +1,23 @@
#!/mod/bin/jimsh
package require cgi
#source /mod/var/mongoose/lib/setup
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set expected [cgi_get esize 1]
set file [file normalize [cgi_get file]]
if {![file exists $file]} {
puts "0"
} else {
set sz [file size $file]
set perc [expr $sz * 100 / $expected]
if {$perc > 100} { set perc 100 }
puts $perc
}

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 lock
if {[$ts flag "Locked"]} { set action unlock }
if {[$ts $action]} {
puts "Successfully [set action]ed $file."
} else {
puts "Problem [set action]ing $file,
[$ts get error]"
}
}

View File

@@ -0,0 +1,15 @@
#!/mod/bin/jimsh
package require cgi
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set dir [cgi_get dir -]
set name [cgi_get newdirname "New Folder"]
file mkdir "$dir/$name"

View File

@@ -0,0 +1,31 @@
#!/mod/bin/jimsh
package require sqlite3
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class system.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
set xstart [clock milliseconds]
set base [file rootname $rfile]
set shname [file tail $base]
puts "Processing $shname"
puts [exec /mod/bin/ffmpeg -y -benchmark -v 0 \
-i $rfile \
-map 0:0 -map 0:1 \
-vcodec copy -acodec copy "${base}.mpg"]
set xtime [expr [expr [clock milliseconds] - $xstart] / 1000.0]
puts "Time taken: $xtime"

View File

@@ -0,0 +1,52 @@
#!/mod/bin/jimsh
package require sqlite3
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class system.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set rfile [cgi_get file]
set ts [ts fetch $rfile]
set dir [file dirname $rfile]
set len [$ts duration 1]
header
puts "
<link href=/css/jquery.progressbar.css rel=stylesheet type=text/css />
<script type=text/javascript src=/js/jquery.progressbar.js></script>
<script type=text/javascript src=mpg.js></script>
<fieldset class=cleft>
<legend>Audio Extraction</legend>
<table class=keyval cellpadding=5>
<tr><th>File:</th><td>$rfile</td></tr>
<tr><th>Length:</th><td>[clock format $len -format "%T"]</td></tr>
</table>
<span class=hidden id=params
dir=\"[cgi_quote_url $dir]\"
rfile=\"[cgi_quote_url $rfile]\"
></span>
<div id=mpgdiv style=\"padding: 1em\">
<button id=mpgit>Perform mpg extraction</button>
</div>
<div id=progressdiv class=hidden>
Extracting mpg: <div id=progressbar></div>
</div>
<button id=back class=hidden>Back to media list</button>
<div id=output class=pre style=\"margin-top: 10px\"></div>
</fieldset>
"

View File

@@ -0,0 +1,35 @@
var handle = 0;
function update()
{
$.get('progress.jim?file=' + $('#params').attr('rfile'),
function(data) {
if (handle)
$('#progressbar').reportprogress(data);
});
}
$(document).ready(function() {
$('#progressbar').reportprogress(0);
$('#back').button().click(function() {
window.location = '/cgi-bin/browse.jim?dir=' + $('#params').attr('dir');
});
$('#mpgit').button().click(function() {
$('#mpgdiv').hide('slow');
$('#progressdiv').show('slow');
handle = setInterval("update()", 1000);
$('#output').load('execute.jim?file=' + $('#params').attr('rfile'),
function() {
clearInterval(handle);
handle = 0;
$('#back').show();
$('#progressbar').reportprogress(100);
});
});
});

View File

@@ -0,0 +1,26 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
set tsfile [cgi_get file]
set rfile [file normalize $tsfile]
set bfile [file rootname $rfile]
if {![file exists "${bfile}.mpg"]} {
puts "0"
} else {
set sz [file size $rfile]
set nsz [expr [file size "${bfile}.mpg"] / 0.3]
set perc [expr $nsz * 100 / $sz]
if {$perc > 100} { set perc 100 }
puts $perc
}

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]"
}
}

View File

@@ -0,0 +1,34 @@
#!/mod/bin/jimsh
package require cgi
package require pack
puts "Content-Type: application/json"
puts ""
cgi_input
#cgi_dump
#set _cgi(dir) "/media/My Video"
set root [dict get $_cgi dir]
# Strip double slashes
regsub -all -- {\/+} "$root/*" "/" root
puts "{"
foreach dir [glob -nocomplain "$root"] {
if {[file exists "$dir/.series"]} {
set fd [open "$dir/.series"]
set bytes [read $fd 8]
set recs [unpack $bytes -uintle 0 32]
set plays [unpack $bytes -uintle 32 32]
set diff $($recs - $plays)
if {$diff != 0} {
set node [lindex [split $dir /] end]
puts "\"$node\": $diff,"
}
}
}
puts "\"dummy\" : 0"
puts "}"

View File

@@ -0,0 +1,51 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n"
cgi_input
#cgi_dump
header
set rfile [cgi_get file]
set ts [ts fetch $rfile]
if {[catch {$ts get file}]} {
puts "Invalid TS file, '$rfile'"
exit
}
if {![$ts flag "ODEncrypted"]} {
set url $rfile
} else {
lassign [$ts dlnaloc] url
if {$url eq ""} {
alert("Media is encrypted and not indexed by the DLNA Server.");
}
}
puts "
<span id=url style=\"display: none\">$url</span>
"
puts {
<script language="javascript" src="/js/jquery-vlc.js"></script>
<link rel="stylesheet" type="text/css" href="/css/vlc.css" />
<script type=text/javascript src=play.js></script>
<fieldset class=cleft style="margin: 0 1em 1em 1em">
<legend>VLC Player</legend>
}
puts "<span class=also>Now playing: $rfile, [$ts duration] minutes.</span>"
puts {
<div id=vlc></div>
<div class=also id=info style="float: right">
</div>
</fieldset>
}

View File

@@ -0,0 +1,13 @@
$(document).ready(function() {
var url = $('#url').text();
var vlc = VLCobject.embedPlayer('vlc', 800, 450, true);
vlc.play(encodeURI(url));
if (window.console)
console.log("Playing: %o", url);
});

View File

@@ -0,0 +1,53 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
#renameorig
#titleorig
#rename
#renametitle
#set _cgi(renameorig) "/media/My Video/The Walking Dead/The Walking Dead_20110521_2201.ts"
#set _cgi(rename) "Last Episode"
if {![dict exists $_cgi renameorig]} { exit }
set file [dict get $_cgi renameorig]
set newfile [dict get $_cgi rename]
if {[string length [string trim $newfile]] == 0 || $file eq $newfile} {
set newfile ""
}
if {[file isdirectory $file]} {
#puts "Directory."
if {$newfile ne ""} {
set dir [file dirname $file]
set newfile "${dir}/${newfile}"
file rename $file $newfile
}
} elseif {[set ts [ts fetch $file]] != 0} {
#puts "TS file."
catch {
set title [dict get $_cgi renametitle]
set titleorig [dict get $_cgi titleorig]
if {[string length [string trim $title]] > 0 &&
$title ne $titleorig} {
$ts settitle $title
}
}
if {$newfile ne ""} { ts renamegroup $file $newfile }
} else {
#puts "Normal file."
if {$newfile ne ""} { ts renamegroup $file $newfile }
}

View File

@@ -0,0 +1,21 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set dir [cgi_get dir "/media/My Video"]
set file [file tail [cgi_get savestream_name]]
set sfile [cgi_get savestream_source "/mnt/hd3/Streamer_down_file"]
if {$file == "0"} { exit }
if {[string length [string trim $file]] == 0} { exit }
if {[file extension $file] ne ".mp4"} { append file ".mp4" }
file copy $sfile "$dir/$file"

View File

@@ -0,0 +1,45 @@
#!/mod/bin/jimsh
package require cgi
#puts "Content-Type: text/plain"
puts "Content-Type: application/json"
puts ""
cgi_input
#cgi_dump
#set _cgi(dir) "/media/My Video"
set dir [dict get $_cgi dir]
#9.4G /media/My Video/Archive
#1.4G /media/My Video/CSI_ Crime Scene Investigation
puts "{"
regsub -all {([\\["$])} $dir {\\\1} xdir
foreach line [split [exec /mod/bin/busybox/du -h -d 1 "$dir/"] "\n"] {
lassign [split $line "\t"] size node
regsub -- "^$xdir/" $node "" node
puts "\"$node\" : \"$size\","
}
# Handle symbolic links.
foreach file [glob -nocomplain "$dir/*"] {
if {[catch {set lk [file readlink $file]}]} continue
if {![string match "/*" $lk]} { set lk "$dir/$lk" }
if {![file isdirectory $lk]} continue
foreach line [split [exec /mod/bin/busybox/du -h "$lk"] "\n"] {
set fields [split $line "\t"]
if {[lindex $fields 1] eq $lk} {
set node [file tail $file]
set size [lindex $fields 0]
puts "\"$node\" : \"@$size\","
}
}
}
puts "\"dummy\" : \"\""
puts "}"

View File

@@ -0,0 +1,17 @@
div.brow
{
float: left;
clear: left;
}
div.cliplist span
{
display: block;
}
#clipclear
{
margin-top: 1em;
}

25
var/mongoose/cgi-bin/cat.jim Executable file
View File

@@ -0,0 +1,25 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require system.class chunked pretty_size
cgi_input
#cgi_dump
set file [cgi_get file "-"]
if {$file eq "-"} { exit }
start_chunked
if {![file exists $file]} {
chunk ">>> File $file does not exist.\r\n"
} else {
chunk ">>> Contents of $file [pretty_size [file size $file]]\r\n"
set fp [open $file r]
chunk [read $fp]
close $fp
}
end_chunked

7
var/mongoose/cgi-bin/cfwreset Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
echo "Content-Type: text/plain"
echo
/bin/rm -rf /mod/*

138
var/mongoose/cgi-bin/channel.jim Executable file
View File

@@ -0,0 +1,138 @@
#!/mod/bin/jimsh
package require cgi
package require sqlite3
source /mod/var/mongoose/lib/setup
require altrow progressbar epg.class
puts "Content-Type: text/html"
puts ""
header
cgi_input
proc f2c {frequency} {
set ch int($((($frequency / 1000) - 303.25) / 8))
return [expr int($ch)]
}
if {[catch {set db [sqlite3.open /var/lib/humaxtv/channel.db]} msg]} {
puts "Error opening channel database: $msg"
exit
}
puts "
<button id=expandall>Expand All</button>
<button id=collapseall>Collapse All</button>
<br><br>
<table class=borders>
<tr>
<th>Channel</th>
<th>Frequency</th>
<th>Signal Strength</th>
<th>Signal Quality</th>
<th>Network</th>
<th>Mux</th>
<th>Channels</th>
<th>&gt;799</th>
</tr>
"
foreach tw [$db query {
select tsIdx, szNetName, usTsID, ulFrequency, ucLevel, ucQuality
from TBL_TS join TBL_NET using (netIdx)
order by ulFrequency
}] {
lassign $tw \
x tsIdx x netName x usTsID x ulFrequency x ucLevel x ucQuality
altrow
puts "
<td>[f2c $ulFrequency]</td>
<td>[expr $ulFrequency / 1000.0] MHz</td>
"
puts "<td>[progressbar $ucLevel]</td>"
puts "<td>[progressbar $ucQuality]</td>"
puts "<td>[string range $netName 3 end]</td>"
set channels [$db query {
select usLcn, szSvcName, szPrvName, aucDefaultAuthority
from TBL_SVC left join TBL_PRV using (prvIdx)
where tsIdx = %s
order by usLcn
} $tsIdx]
set mux "Local"
set ehs 0
foreach chan $channels {
lassign $chan x lcn x name
set name [string range $name 1 end]
if {$lcn >= 800} { incr ehs }
switch $name {
"BBC ONE" { set mux "PSB1/BBC A" }
"ITV1" { set mux "PSB2/D3&amp;4" }
"BBC One HD" { set mux "PSB3/BBC B (HD)" }
"ITV3" { set mux "COM4/SDN" }
"Dave" { set mux "COM5/ARQ A" }
"Film4" { set mux "COM6/ARQ B" }
"Movies4Men" { set mux "Local" }
}
}
puts "<td>$mux</td>"
puts "<td>[llength $channels]
<a class=mchan ts=$tsIdx href=#>
<img border=0 height=14
src=/images/421_1_00_CH_Title_2R_Arrow.png>
view
</a></td>"
puts "<td>$ehs</th>"
puts "</tr>"
puts "<tr id=mchan_$tsIdx class=mchan style=\"display: none\">
<td colspan=5>"
puts "<table style=\"margin-left: 5em\">"
puts "<tr>
<th colspan=3>Channel</th>
<th>Provider</th>
<th>Authority</th>
</tr>"
foreach chan $channels {
lassign $chan x lcn x name x prv x auth
set name [string range $name 1 end]
set prv [string range $prv 3 end]
altrow
puts "<td class=va>"
puts "[epg channelicon $name 50]</td>
<td>$lcn</td><td>$name</td>"
puts "</td><td>"
puts $prv
puts "</td><td>"
puts $auth
puts "</td>"
puts "</tr>"
}
puts "</table>"
puts "</td></tr>"
}
puts "</table>"
puts {
<script type=text/javascript>
$(document).ready(function() {
$('a.mchan').click(function(e) {
e.preventDefault();
$('#mchan_' + $(this).attr('ts')).slideToggle('slow');
});
$('#expandall').button().click(function() {
$('tr.mchan').slideDown('slow');
});
$('#collapseall').button().click(function() {
$('tr.mchan').slideUp('slow');
});
});
</script>
}

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

@@ -0,0 +1,80 @@
#!/mod/bin/jimsh
package require cgi
package require sqlite3
source /mod/var/mongoose/lib/setup
require altrow
puts "Content-Type: text/html"
puts ""
set databases [glob /var/lib/humaxtv/*.db]
lappend databases "/mnt/hd2/dms_cds.db"
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
}
if {$fdb == 0} {
puts "Please choose database to view:<ul>"
foreach db $databases {
puts "<li><a href=$::env(REQUEST_URI)?db=[file tail $db]>
$db</a></li>"
}
puts "</ul>"
} else {
foreach db $databases { db_info $db }
}
footer

122
var/mongoose/cgi-bin/dedup.jim Executable file
View File

@@ -0,0 +1,122 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size altrow
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set dir [cgi_get dir "/media/My Video"]
set doit [cgi_get doit 0]
header
puts "<fieldset style=\"display: inline\">
<legend>De-duplicate <span id=dir>$dir</span></legend>
<table class=borders>
<tr>
<th>File</th>
<th>Proposed Filename</th>
<th>Proposed Title</th>
<th>Status</th>
</tr>
"
set seen {}
foreach file [readdir $dir] {
set file "$dir/$file"
if {[file extension $file] ne ".hmt"} { continue }
altrow
set ts [ts fetch $file 1]
set base [file tail [file rootname $file]]
puts "<td nowrap>$base</td>"
set syn [$ts get synopsis]
regsub -nocase -all -- {^new series\.* *} $syn "" syn
regsub -nocase -all -- {^cbeebies\. *} $syn "" syn
regsub -all -- { *[:].*$} $syn "" syn
if {[string length $syn] > 40} {
lassign [split $syn "."] v w
set syn $v
if {[string length $syn] < 6 && [string length $w] < 6} {
append syn "_$w"
}
}
if {[string length $syn] < 10} {
if {[string match "${syn}*" [$ts get title]]} {
set syn [$ts get title]
} else {
append syn " [$ts get title]"
}
}
regsub -all -- {[\/ &]} $syn "_" fn
puts "<td>$fn</td>"
puts "<td>$syn</td>"
puts "<td>"
if {$fn in $seen} {
puts -nonewline "Duplicate"
if {$doit} {
set dupdir "$dir/_duplicates"
if {![file exists $dupdir]} { file mkdir $dupdir }
while {[file exists $dupdir/$fn.hmt]} {
append fn "~"
}
ts renamegroup $file "_duplicates/$fn"
puts -nonewline " - Renamed to _duplicates/$fn"
}
} elseif {[string length $syn] > 40} {
puts -nonewline "Cannot process"
} elseif {$base eq $fn} {
puts -nonewline "Nothing to do"
} elseif {[file exists "$dir/$fn.ts"]} {
puts -nonewline "Preserving"
} elseif {$doit} {
# Dooooo, it.
$ts settitle $syn
ts renamegroup $file $fn
puts -nonewline "Done"
}
lappend seen $fn
puts "</td>"
puts "</tr>"
}
puts {
</table>
</fieldset>
<div style="padding-top: 2em">
<small>
<button id=browse>Back to media browser</button>
}
if {!$doit} { puts "<button id=dedup>Process folder</button>" }
puts {
</small>
</div>
<script type=text/javascript>
$('#browse').button().click(function() {
window.location = '/cgi-bin/browse.jim?dir=' +
encodeURIComponent($('#dir').text());
});
}
if {!$doit} {
puts {
$('#dedup').button().click(function() {
window.location = window.location + '&doit=1';
});
}
}
puts "</script>"
footer

33
var/mongoose/cgi-bin/diag.jim Executable file
View File

@@ -0,0 +1,33 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require system.class chunked
cgi_input
#cgi_dump
set diag [cgi_get diag general]
start_chunked
if {[system modversion 1] < 113} {
chunk ">>> Diagnostics only available with customised firmware 1.13 or above."
end_chunked
exit
}
chunk ">>> Beginning diagnostic $diag\r\n"
set bcmd "|/bin/diag $diag"
set fd [open $bcmd r]
while {[gets $fd line] >= 0} {
chunk "$line\r\n"
#chunk_pad
}
close $fd
chunk "\r\n"
chunk ">>> Ending diagnostic $diag\r\n"
end_chunked

View File

@@ -0,0 +1,43 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
puts "Content-Type: text/html"
puts ""
header
cgi_input
#cgi_dump
set file [cgi_get file "/tmp/hosts"]
puts "
<script type=text/javascript src=/js/enadis.js></script>
<script type=text/javascript src=/js/tabsupport.js></script>
<script type=text/javascript src=script.js></script>
<link rel=stylesheet href=style.css type=text/css />
<fieldset class=cleft>
<legend>File Editor</legend>
<div class=blood style=\"padding-bottom: 0.7em\">
Editing: <span id=filename>$file</span>
</div>
<textarea cols=80 rows=15 id=editor class=loading>
Loading file...
</textarea>
<br>
<button class=afterload id=revert>Revert</button>
<button class=afterload id=save>Save</button>
<div id=result class=\"blood hidden\"></div>
</fieldset>
<div class=cleft>
<button id=back>Back to diagnostics</button>
</div>
"
footer

View File

@@ -0,0 +1,24 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require chunked
cgi_input
#cgi_dump
set file [cgi_get file "/tmp/hosts"]
if {$file eq "-"} { exit }
start_chunked
if {![file exists $file]} {
chunk ">>> File $file does not exist.\r\n"
} else {
set fp [open $file r]
chunk [read $fp]
close $fp
}
end_chunked

View File

@@ -0,0 +1,23 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set file [cgi_get file "/tmp/testfile"]
if {$file eq "-"} { exit }
set data [cgi_get data]
if {[catch {set fp [open $file w]} msg]} {
puts "Error, $msg"
} else {
$fp puts -nonewline $data
close $fp
puts "File saved."
}

View File

@@ -0,0 +1,51 @@
$(function() {
var file = $('#filename').text();
function loadfile()
{
$('button.afterload').disable();
$('#editor')
.addClass('loading')
.val('Loading file...');
$.get('get.jim?file=' + encodeURIComponent(file), function(data) {
$('#editor')
.removeClass('loading')
.val(data);
$('button.afterload').enable();
});
}
$('#save')
.button()
.click(function() {
$.post('put.jim', {
'file': file,
'data': $('#editor').val()
}, function(data) {
$('#result')
.html(data)
.slideDown('slow')
.delay(5000)
.slideUp('slow');
});
});
$('#revert')
.button()
.click(function() {
loadfile();
});
$('#back')
.button()
.click(function() {
window.location = '/diag.shtml';
});
$('#editor').tabsupport();
loadfile();
});

View File

@@ -0,0 +1,18 @@
textarea
{
background: white;
font-color: black;
}
#filename
{
font-style: italic;
}
.loading
{
font-style: italic;
color: #aaa;
background: white;
}

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 ""
@@ -9,19 +10,13 @@ puts ""
cgi_input
#cgi_dump
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
}
#set service 8384
#set event 25293
set service [cgi_get service 0]
set event [cgi_get event 0]
if {! [dict exists $_cgi bare]} { header }
set record [lindex [epg fetch dump -service $service -event $event] 0]
$record get_channel_info
set others [$record othertimes]
puts "
<table class=keyval>
@@ -33,10 +28,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 +78,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>
"
}
@@ -65,7 +93,7 @@ if {[$record get series_crid] != ""} {
puts "
<tr>
<th nowrap>Series CRID</th><td>
<a href=/cgi-bin/epg_search.jim?scrid=[$record get series_crid]>
<a href=/cgi-bin/epg/search.jim?scrid=[$record get series_crid]>
<img border=0 height=14
src=/images/421_1_00_CH_Title_2R_Arrow.png>
[$record get channel_crid][$record get series_crid]
@@ -79,7 +107,7 @@ if {[$record get rec_crid] != ""} {
set rec [$record recommended]
if {$rec != ""} {
puts "<tr><th>Recommends</th><td>
<a href=/cgi-bin/epg_search.jim?crid=[$rec get event_crid]>
<a href=/cgi-bin/epg/search.jim?crid=[$rec get event_crid]>
<img border=0 height=14
src=/images/421_1_00_CH_Title_2R_Arrow.png>
[$rec get name]
@@ -98,14 +126,14 @@ puts "
</tr>
</table>
<a class=footnote href=/cgi-bin/epg_dump.jim?service=[$record get service_id]&event=[$record get event_id]&raw=1>
<a class=footnote href=/cgi-bin/epg/dump.jim?service=[$record get service_id]&event=[$record get event_id]&raw=1>
<img border=0 src=/images/532_1_00_Find_Path_Arrow.png>
Show raw EPG info
</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,43 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require epg.class system.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
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
}
set r [rsv construct $event $type]
if {[catch {$r insert} msg]} {
puts "Error encountered while scheduling: <i>$msg</i>"
} else {
puts "Successfully scheduled <i>[$event get name]</i>"
system restartpending
}
epg cleanup

View File

@@ -0,0 +1,130 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require epg.class spinner.class altrow
puts "Content-Type: text/html"
puts ""
header
require totop
puts "<script type=text/javascript src=/js/jquery.highlight.js></script>"
cgi_input
#cgi_dump
set ct 0
catch { set ct [dict get $_cgi ct] }
set crid ""
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 ""} {
set records [epg fetch dump -crid $crid]
} elseif {$scrid ne ""} {
set records [epg fetch dump -scrid $scrid]
} elseif {$searchterm ne ""} {
set records [epg fetch $cmd -extra $searchterm]
} else {
set records {}
}
set favlist [epg favlist]
if {[llength $records] > 0} {
puts {
<table class=borders id=results style="clear: both;margin: 0.5em 0 0 0">
<tr>
<th>Date</th>
<th colspan=3>Channel</th>
<th>Programme</th>
<th>Synopsis</th>
</tr>
}
} else {
puts "No results found."
}
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] {
if {$favlist != "" && [$record get service_id] ni $favlist} {
continue
}
altrow
$record get_channel_info
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"]"
puts "</td>"
puts "<td>[$record get channel_num]</td>"
puts "<td>[$record channel_icon 50]</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>"
}
puts "</table>"
if {$searchterm != ""} {
puts "
<script type=text/javascript>
\$('#results').highlight('$searchterm');
</script>
"
}
epg cleanup
footer

View File

@@ -1,15 +1,15 @@
#!/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
require totop
[spinner new {
text "Loading EPG Data..."
@@ -20,12 +20,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 +53,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,164 +0,0 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/epg.class
source /mod/var/mongoose/lib/altrow
source /mod/var/mongoose/lib/cat
puts "Content-Type: text/html"
puts ""
source /mod/var/mongoose/html/lib/header.jim
puts "<script type=text/javascript src=/js/highlight.js></script>"
source /mod/var/mongoose/lib/epg_popup
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] }
set crid ""
catch { set crid [dict get $_cgi crid] }
set scrid ""
catch { set scrid [dict get $_cgi scrid] }
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>
<table>
<tr><td rowspan=2>Content Type Searches</td>
<td>
}
cts 1 "Movie" "Film/Drama"
puts "</td><td>"
cts 2 "News" "News/Current affairs"
puts "</td><td>"
cts 4 "Sports" "Sport"
puts "</td><td>"
cts 9 "Education" "Education/Science/Factual"
puts "</td><td>"
cts 10 "Leisure" "Leisure"
puts "</td></tr><tr><td>"
cts 7 "Art" "Arts/Culture"
puts "</td><td>"
cts 3 "Show" "Show/Game show"
puts "</td><td>"
cts 5 "Children" "Children"
puts "</td><td>"
cts 8 "Society" "Social/Political/Economic"
puts "</td><td>"
cts 6 "Music" "Music/Ballet/Dance"
puts "</tr></table>"
puts "<table cellpadding=5>"
if {[llength $res] > 0} {
puts "<tr><td>Keyword Searches</td>"
foreach keyword $res {
set kw [string range [lindex $keyword 1] 1 end]
puts "<td><a href=$env(REQUEST_URI)?term=[cgi_quote_url $kw]>$kw
</a></td>"
}
puts "</tr>"
}
puts "</table>"
$db close
puts "</form>"
if {$ct > 0 } {
set records [epg fetch dump -type $ct]
} elseif {$crid ne ""} {
set records [epg fetch dump -crid $crid]
} elseif {$scrid ne ""} {
set records [epg fetch dump -scrid $scrid]
} elseif {$term ne ""} {
set records [epg fetch $cmd -extra $term]
}
set favlist [epg favlist]
puts {
<table class=borders id=results style="clear: both;margin: 0.5em 0 0 0">
<tr>
<th>Date</th>
<th colspan=3>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] {
if {$favlist != "" && [$record get service_id] ni $favlist} {
continue
}
altrow
$record get_channel_info
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>[$record channel_icon 50]</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

36
var/mongoose/cgi-bin/opkg.jim Executable file
View File

@@ -0,0 +1,36 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require pkg.class chunked
cgi_input
#cgi_dump
set cmd [cgi_get cmd update]
proc opkg {cmd} {
chunk ">>> opkg $cmd\r\n"
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
chunk "\r\n"
}
start_chunked
if {$cmd eq "upgrade"} { opkg update }
opkg $cmd
if {$cmd eq "update" || $cmd eq "upgrade"} {
chunk "Updating package meta information\r\n"
pkg fetchmeta
chunk "Done.\r\n"
}
end_chunked

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

@@ -0,0 +1,99 @@
#!/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=\"va [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 {$type ne "upgr" && $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; try updating the package list from the Internet using the button above." }
avail { puts "are available for installation." }
}
puts "</i>"
}

View File

@@ -0,0 +1,62 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require rsv.class system.class
puts "Content-Type: text/html"
puts ""
cgi_input
if {[cgi_get act] eq "cancel"} {
file delete /tmp/.restartpending
exit
}
if {[cgi_get now] eq "yes"} {
# - Busybox reboot does sync the disk but may still not be clean enough.
puts "Restarting."
system reboot
exit
}
file delete /tmp/.restartpending
header
# Commit pending reservations on older mod versions.
if {![file exists /sbin/rsvsync] && ![file exists /mod/boot/rsvsync]} {
rsv commit
}
puts {
<link href=/css/jquery.progressbar.css rel=stylesheet type=text/css />
<script type="text/javascript" src="/js/jquery.progressbar.js"></script>
<script type=text/javascript>
var handle = 0;
var pct = 0;
function update()
{
$('#progressbar').reportprogress(++pct);
if (pct == 100)
{
clearInterval(handle);
pct = 0;
window.location = '/';
}
}
$(document).ready(function() {
$('#progressbar').reportprogress(0);
handle = setInterval("update()", 300);
$.get('/cgi-bin/restart.jim?now=yes');
});
</script>
Please wait while the Humax restarts...<br>
<div id=progressbar></div>
}
footer

View File

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

View File

@@ -0,0 +1,28 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require rsv.class system.class
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set slot [cgi_get slot 0]
set table [cgi_get table TBL_RESERVATION]
set event [rsv slot $table $slot]
if {$table eq "pending"} {
$event remove_pending
exit
}
$event clear_ulslot
$event set_delete
$event insert
system restartpending

View File

@@ -0,0 +1,134 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require rsv.class progressbar
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set table [cgi_get table TBL_RESERVATION]
set slot [cgi_get slot 0]
set event [rsv slot $table $slot]
set rsvicon [$event icon]
if {$rsvicon ne ""} {
set rsvicon "<img src='images/$rsvicon' height=20>"
if {[$event get ersvtype] == 3} {
if {[$event padded]} {
set padding "<- [expr [$event get ulPreOffset] / 60], [expr [$event get ulPostOffset] / 60] ->"
append rsvicon \
"<img src=/img/pad.png height=20
title=\"$padding\" alt=\"$padding\">"
} else {
append rsvicon \
"<img src=/img/ar.png height=20>"
}
}
}
set RKIcon [$event RKIcon]
if {$RKIcon ne ""} {
set RKIcon "<img src='images/$RKIcon' height=20>"
}
if {[$event get ucRecKind] == 4} {
set series 1
} else {
set series 0
}
puts "
<table class=keyval>
<tr>
<th>Event [$event get ulslot]</th>
<td class=va>$rsvicon $RKIcon</td>
</tr><tr>
<th>Channel</th>
<td class=va>
"
if {[$event get usLcn] ne ""} {
puts "
<img class=va width=50
src=\"/img/channels/[$event channel_name].png\">
- [$event get usLcn] - [$event channel_name]
"
}
puts "
</td>
</tr><tr>
<th>Event Name</th>
<td>[$event name]</td>
</tr><tr>
<th>Start</th>
"
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"]
[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>
</tr><tr>
<th>Duration</th>
<td>[clock format [$event get nduration] -format %T]</td>
</tr>
"
set crid [join [lrange [split [$event get szCRID] /] 1 end]]
if {$crid != ""} {
puts "<tr><th>"
if $series { puts "Series" } else { puts "Event" }
puts " CRID</th><td>"
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>
[$event get szCRID]"
puts "</a></td></tr>"
}
puts "<tr><th>Events</th><td>"
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></tr>"
puts "<tr><th>Accepted</th><td>"
if {[$event get aulEventToRecordInfo] ne ""} {
puts "Yes"
}
puts "</td></tr>"
puts "</table>"

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 ""
@@ -9,16 +11,28 @@ puts ""
cgi_input
#cgi_dump
if {[cgi_get act] eq "https"} {
if {[cgi_get val off] eq "off"} {
file delete /mod/etc/mongoose.cert
puts "HTTPS Server will be disabled after next reboot."
} else {
exec /mod/sbin/mongoose_mkcert
puts "HTTPS Server will be enabled after next reboot."
}
exit
}
set settings [settings new]
set hostname [$settings hostname]
set smtp_server [$settings smtp_server]
set channel_group [$settings channel_group]
set epg_style [$settings epg_style]
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,54 +63,102 @@ 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"
handle_str_update epg_style $epg_style "EPG Type"
handle_int_update pkgdev $pkgdev "Development Package Display"
source /mod/var/mongoose/html/lib/header.jim
puts {<script type="text/javascript" src="/js/jquery.form.js"></script>}
set acluser [cgi_get acluser "-"]
set aclpass [cgi_get aclpass "-"]
set aclpassc [cgi_get aclpassc "-"]
if {$acluser ne "-" && $aclpass ne "-"} {
if {![string length $acluser]} {
puts "No username provided."
exit
}
if {$aclpass ne $aclpassc} {
puts "Passwords do not match."
exit
}
if {[string length $aclpass] < 4} {
puts "Password is too short (< 4 characters)"
exit
}
puts [$settings addacluser $acluser $aclpass]
exit
}
set aclact [cgi_get aclact "-"]
if {$aclact ne "-" && $acluser ne "-"} {
switch $aclact {
"del" { puts [$settings delacluser $acluser] }
}
exit
}
header
puts {
<script type=text/javascript>
$(document).ready(function () {
//$(":submit").button();
//$(":submit").height(20);
$('form').each(function(i, el) {
var id = $(this).attr('id');
var output = '#' + id + '_output'
$(this).ajaxForm({
target: output,
success: function() {
$(output).css('font-style', 'italic');
$(output).show('slow');
$(output).delay(2000).fadeOut('slow');
}
});
});
});
</script>
<script type="text/javascript" src="/cgi-bin/settings.js"></script>
<script type="text/javascript" src="/js/jquery.form.js"></script>
<script type="text/javascript" src="/js/jconfirmaction.jquery.js"></script>
<link href=/css/jconfirmaction.jquery.css rel=stylesheet type=text/css />
<script type="text/javascript" src="/js/iphone-style-checkboxes.js"></script>
<link href=/css/iphone-style-checkboxes.css rel=stylesheet type=text/css />
}
puts "
<h1>Settings</h1>
<table class=keyval>
<fieldset style=\"display: inline\">
<legend>
General Settings
</legend>
<table>
"
puts "
<tr>
<form id=hostname method=get action=$env(REQUEST_URI)>
<th>Hostname</th>
<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>
</tr>
"
puts -nonewline "
<tr>
<th class=key>HTTPS web server?</th>
<td><input id=https_toggle name=https type=checkbox value=yes"
if {[file exists /mod/etc/mongoose.cert]} { puts -nonewline " checked" }
puts ">
<div id=https_output></div>
</td>
</tr>
"
puts "
<tr>
<form id=smtp_server method=get action=$env(REQUEST_URI)>
<th>SMTP Server for outbound email</th>
<td><input name=smtp_server value=\"$smtp_server\"
length=20 maxlength=50>
<input id=smtp_server_submit value=\"change\" type=submit>
<div id=smtp_server_output></div>
<form class=auto id=epg_style method=get action=$env(REQUEST_URI)>
<th class=key>Default Now/Next style</th>
<td><select id=epg_style name=epg_style
class=\"text ui-widget-content ui-corner-all\">
"
puts "<option value=standard"
if {$epg_style ne "grid"} { puts " selected" }
puts ">Standard\n"
puts "<option value=grid"
if {$epg_style eq "grid"} { puts " selected" }
puts ">Grid\n"
puts "
</select>
<small>
<input name=epg_style value=\"set\" type=submit>
</small>
<div id=epg_style_output></div>
</td>
</form>
</tr>
@@ -104,10 +166,10 @@ puts "
puts "
<tr>
<form id=channel_group method=get action=$env(REQUEST_URI)>
<th>Channel Group for EPG</th>
<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
value=[$settings channel_group]>
class=\"text ui-widget-content ui-corner-all\">
"
set i 0
@@ -123,7 +185,9 @@ foreach grp [$settings channel_groups] {
puts "
</select>
<input name=channel_group value=\"change\" type=submit>
<small>
<input name=channel_group value=\"set\" type=submit>
</small>
<div id=channel_group_output></div>
</td>
</form>
@@ -132,11 +196,163 @@ puts "
puts "
</table>
</form>
<br>
More coming soon...
<br>
<br>
</fieldset>
<br><br>
<fieldset style=\"display: inline\">
<legend> Email Settings </legend>
<table>
"
source /mod/var/mongoose/html/lib/footer.jim
puts "
<tr>
<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>
</tr>
"
puts "
</table>
</fieldset>
"
puts "
<br><br>
<fieldset style=\"display: inline\">
<legend> Web Interface User Access Control </legend>
<table>
"
set aclusers [$settings aclusers]
if {[llength $aclusers]} {
puts "<tr><th colspan=5 class=odd>Existing Users</th></tr>"
foreach user [$settings aclusers] {
lassign $user user
puts "<tr><td align=center style=\"font-weight: bold\">
$user</td>"
puts "<th class=key>New password:
<input
class=\"aclpass text ui-widget-content ui-corner-all\"
type=password size=20 maxlength=50><br>"
puts "Again:
<input
class=\"aclpassc text ui-widget-content ui-corner-all\"
type=password size=20 maxlength=50></td>"
puts "<th class=key><button class=pwchange>
Change</button></td>"
puts "<th class=key><button class=userdel>
Delete User</button></td>"
puts "</tr>"
}
puts "<tr><td colspan=5 id=aclusermod_output>&nbsp;</td></tr>"
puts "<tr><td colspan=5>&nbsp;</td></tr>"
} else {
puts "<tr><td colspan=5 class=blood><b>
Add a user to enable authentication.</b></td></tr>"
}
puts "<tr><th colspan=5 class=odd>Add New User</th></tr>"
puts "
<form id=aclnewuser method=get action=$env(REQUEST_URI)>
<tr><th class=key>New User:</th><td>
<input
class=\"text ui-widget-content ui-corner-all\"
id=acluser name=acluser size=20 maxlength=50></td></tr>
<tr><th class=key>Password:</th><td>
<input type=password
class=\"text ui-widget-content ui-corner-all\"
id=aclpass name=aclpass size=20 maxlength=50></td></tr>
<tr><th class=key>Password (confirm):</th><td>
<input type=password
class=\"text ui-widget-content ui-corner-all\"
id=aclpassc name=aclpassc size=20 maxlength=50></td></tr>
<tr><td><input id=aclnewuser_submit value=\"Add User\" type=submit>
</td></tr>
</form>
</table>
<div id=aclnewuser_output></div>
</fieldset>
"
puts {
<script type=text/javascript>
$('#aclnewuser').ajaxForm({
target: '#aclnewuser_output',
success: function(txt) {
if (txt.indexOf('Success') >= 0)
window.location.reload(true);
}
});
$('button.userdel').click(function(el) {
var user = $('td:first', $(this).parents('tr')).text().trim();
$('#aclusermod_output').load(
'/cgi-bin/settings.jim?aclact=del&acluser=' +
encodeURIComponent(user), function(txt) {
if (txt.indexOf('Success') >= 0)
window.location.reload(true);
});
});
$('button.pwchange').click(function(el) {
var tr = $(this).parents('tr');
var user = $('td:first', $(tr)).text().trim();
var pass = $(tr).find('input.aclpass').val();
var passc = $(tr).find('input.aclpassc').val();
$('#aclusermod_output').load('/cgi-bin/settings.jim?' +
'acluser=' + encodeURIComponent(user) + '&' +
'aclpass=' + encodeURIComponent(pass) + '&' +
'aclpassc=' + encodeURIComponent(passc));
});
</script>
}
puts -nonewline "
<br><br>
<fieldset style=\"display: inline\">
<legend> Advanced Settings </legend>
<table>
<tr>
<th class=key>Show development and advanced packages?</th>
<td><input name=pkgdev id=pkgdev value=1 type=checkbox
"
if {$pkgdev} { puts -nonewline " checked" }
puts ">
</td>
</tr>
</table>
<div id=pkgdev_output></div>
</fieldset>
"
eval_plugins settings
#puts {
#<br><br>
#<fieldset style="display: inline">
#<legend> Reset Custom Firmware </legend>
#<button id=cfwreset>
#Click to remove all packages and settings installed by the custom firmware.
#</button>
#</fieldset>
#<script type=text/javascript>
#$('#cfwreset').jConfirmAction({
# yesAnswer: "Delete"
#}, function(el) {
# $('html').html('Restart the Humax using the remote control.');
# $.get('/cgi-bin/cfwreset');
#});
#</script>
#
#}
footer

View File

@@ -0,0 +1,77 @@
(function($)
{
$.fn.enable = function()
{
return this.each(function() {
$(this)
.removeClass('ui-state-disabled')
.removeProp('disabled');
});
};
$.fn.disable = function()
{
return this.each(function() {
$(this)
.addClass('ui-state-disabled')
.prop('disabled', true);
});
};
})(jQuery);
$(document).ready(function () {
$(":submit").button();
$(":checkbox").iphoneStyle();
$('form.auto').each(function(i, el) {
var id = $(this).attr('id');
var output = '#' + id + '_output'
$(this).ajaxForm({
target: output,
success: function() {
$(output).css('font-style', 'italic');
$(output).show('slow');
$(output).delay(2000).fadeOut('slow');
}
});
});
$('#pkgdev').change(function() {
var arg = '0';
if ($(this).attr('checked'))
arg = '1';
$(this).disable();
$('#pkgdev_output')
.empty()
.show('slow')
.load('/cgi-bin/settings.jim?pkgdev=' + arg,
function() {
$('#pkgdev').enable();
$('#pkgdev_output')
.css('font-style', 'italic')
.delay(2000).fadeOut('slow');
});
});
$('#https_toggle').change(function() {
var arg = 'off';
if ($(this).attr('checked'))
arg = 'on';
$(this).disable();
$('#https_output')
.empty()
.html('<img src=/img/loading.gif>Please Wait...')
.show('slow')
.load('/cgi-bin/settings.jim?act=https&val=' + arg,
function() {
$('#https_toggle').enable();
$('#https_output')
.css('font-style', 'italic')
.delay(2000).fadeOut('slow');
});
});
});

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]} ]} {
@@ -43,9 +39,8 @@ foreach line $lines {
incr seen($name)
lappend output "<img style=\"vertical-align: middle\"
src=/images/$icon><span
style=\"vertical-align: middle\">$mode&nbsp;$name</span>"
lappend output "<img class=va src=/images/$icon><span class=va>
$mode&nbsp;$name</span><br>"
}
if {[llength $output]} {

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>
"

229
var/mongoose/cgi-bin/xepg.jim Executable file
View File

@@ -0,0 +1,229 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
puts "Content-Type: text/html"
puts ""
header
require epg.class spinner.class altrow epg_search totop
cgi_input
puts {<link type="text/css" href="/css/xepg.css" rel="Stylesheet" />}
[spinner new {
text "Loading Now/Next Information..."
size "1.2em"
style "margin: 1em;"
}] start
require epg_popup
set stt [cgi_get stt [clock seconds]]
if {$stt <= [clock seconds]} {
set stt [clock seconds]
set current 1
} else {
set current 0
}
set favlist [epg favlist]
set hours 4.0
set seconds $($hours * 3600)
set ostt $stt
set stt [expr int($stt / 1800.0) * 1800]
set ett $(int($stt + $seconds))
set offset $(($ostt - $stt) / 1800.0)
set chanpx 120
set eventpx 1000
set totalpx $($chanpx + $eventpx)
set contwidth $($totalpx + 50)
set hourpx $($eventpx / $hours)
set minpx $($hourpx / 60.0)
set secpx $($minpx / 60.0)
set start [clock milliseconds]
if {$::qepg} {
set records [epg dbfetch dump -trange "$stt:$ett"]
} else {
require channelsort
set records [channelsort [epg fetch dump -trange "$stt:$ett"]]
}
set got [clock milliseconds]
puts "<div id=buttons style=\"width: $eventpx; margin-left: ${chanpx}px;\">"
if {$stt > [clock seconds]} {
puts "<button id=earlier>&lt;&lt;&lt; Earlier</button>"
}
puts "<button id=later>Later &gt;&gt;&gt;</button>"
puts "</div>"
puts "
<div id=xepg style=\"min-width: ${contwidth}px; overflow: auto\">
<div id=xepgnow></div>
<div id=xegrid>
"
puts "<div id=epgdate style=\"width: ${eventpx}px; margin-left: ${chanpx}px;\">"
puts [clock format $stt -format {%a %D}]
puts "</div>"
puts "<div class=xechan style=\"width: ${chanpx}px;\">&nbsp;</div>"
for {set i 0} {$i < $hours * 2} {incr i} {
puts "<div class=xetime id=xe$i
style=\"width: [expr $minpx * 30]px\">"
puts "[clock format $($stt + 1800 * $i) -format "%H:%M"]</div>"
}
set lim 0
set lcn 0
set bg "odd"
foreach e $records {
if {$favlist != "" && [$e get service_id] ni $favlist} {
continue
}
set chnum [$e get channel_num]
if {$chnum == 0} { continue }
if {$chnum != $lcn} {
puts "<div class=xechan style=\"width: ${chanpx}px;\">"
puts "[$e channel_icon 30]&nbsp;"
puts "$chnum
<a href=/cgi-bin/epg/service.jim?service=[$e get service_id]
title=\"[$e get channel_name]\">
[$e get channel_name]
</a></div>"
set lcn $chnum
set le 0
set pos 0
if {$bg eq "odd"} { set bg "even" } else { set bg "odd" }
}
set es [$e get start]
set ee [expr $es + [$e get duration]]
if {$es < $le} continue
if {$es < $stt} { set es $stt }
if {$ee > $ett} { set ee $ett }
set le $ee
set left [expr int(($es - $stt) * $secpx)]
set right [expr int(($ee - $stt - 1) * $secpx)]
set px $($right - $left)
if {$pos < $left} {
set px $($px + $left - $pos - 1)
} elseif {$pos > $left} {
set px $($px - ($pos - $left - 1))
}
incr pos $px
$e process_sched
set recopts 1
if {[$e get series_crid] ne ""} { set recopts 2 }
set perc [$e percent]
set showing 0
if {$perc > 0 && $perc < 100} { set showing 1 }
set txt "[cgi_quote_html [$e get name]] <span>([\
clock format $es -format "%H:%M"] - [\
clock format $ee -format "%H:%M"])"
if {$showing} { append txt " ($perc%)" }
append txt "</span>"
set htxt "[cgi_quote_html [$e get name]] ([\
clock format $es -format "%H:%M"] - [\
clock format $ee -format "%H:%M"])"
if {$showing} { append hxt " ($perc%)" }
puts "<div class=\"xeprog $bg\"
style=\"width: [expr $px - 4]px;\" title=\"$htxt\">
<a class=event href=# xs=[$e get service_id]
xe=[$e get event_id] sch=[$e get sched_type]
rec=$recopts>"
puts $txt
puts "</a>"
puts "</div>"
}
puts "<div id=keypos style=\"float: left; clear: left;\"></div>"
puts "</div>"
puts "</div>"
set earlier $($stt - 3600 * 4)
puts "
<div style=\"clear: both;\">
<small><button id=epgswitch>
Switch to standard now/next display.
</button></small>
</div>
<script type=text/javascript>
\$(document).ready(function() {
\$('#epgswitch').button().click(function() {
window.location = '/epg.shtml';
});
\$('#earlier').button().click(function() {
window.location = '/cgi-bin/xepg.jim?stt=$earlier';
});
\$('#later').button().click(function() {
window.location = '/cgi-bin/xepg.jim?stt=$ett';
});
"
if {$current} {
puts {
var kt = $('#xe0');
var ktpos = kt.position();
var height = $('#keypos').position().top - ktpos.top;
}
puts "var nowpos = ktpos.left + (kt.width() * $offset);"
puts {
if (window.console)
console.log('NOWPOS: %d', nowpos);
$('#xepgnow')
.css('left', nowpos + 'px')
.css('top', ktpos.top)
.height(height)
.show('slow');
}
}
puts "
});
</script>
"
puts "
<a href=/cgi-bin/settings.jim>
<img border=0 height=14 src=/images/421_1_00_CH_Title_2R_Arrow.png>
Visit settings to change EPG options.
</a><br>
"
set end [clock milliseconds]
puts "<font class=footnote>
Retrieved in: [expr [expr $got - $start] / 1000.0] seconds.
</font>"
epg cleanup
footer

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

@@ -0,0 +1,75 @@
.iPhoneCheckContainer {
position: relative;
height: 27px;
cursor: pointer;
overflow: hidden; }
.iPhoneCheckContainer input {
position: absolute;
top: 5px;
left: 30px;
opacity: 0;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); }
.iPhoneCheckContainer label {
white-space: nowrap;
font-size: 17px;
line-height: 17px;
font-weight: bold;
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
text-transform: uppercase;
cursor: pointer;
display: block;
height: 27px;
position: absolute;
width: auto;
top: 0;
padding-top: 5px;
overflow: hidden; }
.iPhoneCheckContainer, .iPhoneCheckContainer label {
user-select: none;
-moz-user-select: none;
-khtml-user-select: none; }
.iPhoneCheckDisabled {
opacity: 0.5;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50); }
label.iPhoneCheckLabelOn {
color: white;
background: url('/img/iphone-style-checkboxes/on.png?1282083753') no-repeat;
text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.6);
left: 0;
padding-top: 5px; }
label.iPhoneCheckLabelOn span {
padding-left: 8px; }
label.iPhoneCheckLabelOff {
color: #8b8b8b;
background: url('/img/iphone-style-checkboxes/off.png?1282083753') no-repeat right 0;
text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.6);
text-align: right;
right: 0; }
label.iPhoneCheckLabelOff span {
padding-right: 8px; }
.iPhoneCheckHandle {
display: block;
height: 27px;
cursor: pointer;
position: absolute;
top: 0;
left: 0;
width: 0;
background: url('/img/iphone-style-checkboxes/slider_left.png?1282083753') no-repeat;
padding-left: 3px; }
.iPhoneCheckHandleRight {
height: 100%;
width: 100%;
padding-right: 3px;
background: url('/img/iphone-style-checkboxes/slider_right.png?1282083753') no-repeat right 0; }
.iPhoneCheckHandleCenter {
height: 100%;
width: 100%;
background: url('/img/iphone-style-checkboxes/slider_center.png?1282083753'); }

View File

@@ -0,0 +1,37 @@
.jcaquestion {
position: absolute;
display: inline;
text-align: center;
width: 174px;
height: 78px;
font-size: 13px;
line-height: 1.5em;
background: url('/img/bubble.png') left top no-repeat;
padding: 10px 0 0 0;
text-shadow: 0px 1px 0px #fff;
margin-left: -7em;
margin-top: -6em;
opacity: 0;
}
.jcayes, .jcacancel {
margin-top: .5em;
margin-right: .5em;
cursor: pointer;
display: inline-block;
width: 63px;
height: 21px;
color: #fff;
text-shadow: 0px 1px 0px #000;
background: url('/img/button.png') left top no-repeat;
}
.jcatitle {
font-size: 30px;
margin-bottom: 1.5em;
font-weight: bold;
font-style: italic;
text-shadow: 0px 2px 0px #fff;
}

View File

@@ -0,0 +1,48 @@
.jbar{
height:50px;
width:100%;
background-color: #ffffcc;
color: #ff4000;
position:fixed;
filter:progid:DXImageTransform.Microsoft.Alpha(opacity=95);
opacity: 0.95;
-moz-opacity: 0.95;
text-align:center;
left:0px;
z-index:9999999;
margin:0px;
padding:0px;
}
.jbar-top{
top:0px;
border-top:2px solid #fff;
border-bottom: 1px solid #ebebeb;
}
.jbar-bottom{
bottom:0px;
border-bottom:2px solid #fff;
border-top: 1px solid #ebebeb;
color:#777;
}
.jbar-content{
line-height:46px;
font-size: 18px;
font-family:'Lucida Grande',sans-serif;
}
a.jbar-cross{
position:absolute;
width:31px;
height:31px;
background:transparent url(/images/cross.png) no-repeat top left;
cursor:pointer;
right:10px;
}
a.jbar-cross:hover{
background-image: url(/images/cross_hover.png)
}
.jbar-top a.jbar-cross{
top:8px;
}
.jbar-bottom a.jbar-cross{
bottom:8px;
}

View File

@@ -1,62 +1,68 @@
/* 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.pwedit A { background-image: url(/img/context/page_white_edit.png); }
.contextMenu LI.pwcopy A { background-image: url(/img/context/page_white_copy.png); }
.contextMenu LI.pwpaste A { background-image: url(/img/context/page_white_paste.png); }
.contextMenu LI.pwdelete A { background-image: url(/img/context/page_white_delete.png); }
.contextMenu LI.edit A { background-image: url(/img/context/edit.png); }
.contextMenu LI.copy A { background-image: url(/img/context/copy.png); }
.contextMenu LI.paste A { background-image: url(/img/context/paste.png); }
.contextMenu LI.delete A { background-image: url(/img/context/delete.png); }
.contextMenu LI.cut A { background-image: url(/img/context/cut.png); }
.contextMenu LI.quit A { background-image: url(/img/context/door.png); }

View File

@@ -0,0 +1,31 @@
/* progress bar container */
.progressbar, #progressbar{
border:1px solid black;
width:200px;
height:20px;
position:relative;
color:black;
}
/* color bar */
.progressbar div.progress,#progressbar div.progress{
position:absolute;
width:0;
height:100%;
overflow:hidden;
background-color:#369;
}
/* text on bar */
.progressbar div.progress .text,#progressbar div.progress .text{
position:absolute;
text-align:center;
color:white;
}
/* text off bar */
.progressbar div.text,#progressbar div.text{
position:absolute;
width:100%;
height:100%;
text-align:center;
}

View File

@@ -13,6 +13,19 @@ html>body
font-size: small;
}
.left, .cleft
{
float: left;
}
.cleft
{
clear: left;
}
fieldset.left, fieldset.cleft
{
display: inline;
}
div.container
{
position: relative;
@@ -52,6 +65,13 @@ div.footer
padding-top: 2em;
}
div.warningbox
{
background: url('/img/redshade.png') repeat-x;
padding: 0.5em;
margin: 1em;
}
table
{
empty-cells: show;
@@ -63,18 +83,24 @@ table.borders, table.borders td, table.borders th
empty-cells: show;
}
table tr.odd
.odd
{
background: #ccff99;
color: black;
}
table tr.even
.even
{
background: #ffffcc;
color: black;
}
.hover
{
background: #f6ff5b;
color: black;
}
table td,table th
{
font-size: small;
@@ -86,7 +112,7 @@ table th
text-align: left;
}
table.keyval th
table.keyval th, th.key
{
background: #ccff99;
font-weight: bold;
@@ -101,7 +127,7 @@ table.keyval td
color: black;
}
pre
pre, .pre, .prelike
{
font-family: Consolas, 'Courier New', Courier, monospace;
color: black;
@@ -119,7 +145,10 @@ pre
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
-khtml-border-top-right-radius: 4px;
}
pre, .pre
{
white-space: pre-wrap;
white-space: -moz-pre-wrap !important;
white-space: -pre-wrap;
@@ -174,6 +203,12 @@ pre
background: transparent;
}
.filesize
{
color: #6a6aff;
background: transparent;
}
.footnote
{
color: #ff4000;
@@ -225,3 +260,69 @@ img.progress
vertical-align: middle;
}
.block
{
display: block;
}
.hidden
{
display: none;
}
input.text
{
padding: .4em;
}
.highlight
{
background-color: yellow;
}
.focused
{
border: 2px solid red;
}
div.cut, div.keep
{
position: absolute;
top: 0px;
text-align: center;
overflow: hidden;
border-radius: 5px;
-moz-border-radius: 5px;
}
div.keep
{
background: green;
color: white;
}
div.cut
{
background: #ff4000;
color: black;
}
.ui-button-text
{
font-size: inherit !important;
}
.ui-button, .ui-button-text
{
padding: 0;
font-size: 12px;
}
.also
{
font-size: 0.9em;
font-style: italic;
color: #333;
background: transparent;
}

View File

@@ -0,0 +1,31 @@
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 .headerplain {
background-image: url(/img/tsort/bgplain.png);
background-repeat: no-repeat;
border-left: 1px solid #FFF;
border-right: 1px solid #000;
border-top: 1px solid #FFF;
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;
}

View File

@@ -0,0 +1,30 @@
#toTop {
background: url("/img//ui.totop.png") no-repeat scroll left top transparent;
border: medium none;
bottom: 110px;
display: none;
height: 51px;
margin-left: 50px;
overflow: hidden;
position: fixed;
text-decoration: none;
text-indent: -999px;
width: 77px;
z-index: 2000;
}
#toTopHover {
background: url("/img/ui.totop.png") no-repeat scroll left -51px transparent;
display: block;
float: left;
height: 51px;
opacity: 0;
overflow: hidden;
width: 77px;
}
#toTop:active, #toTop:focus {
outline: medium none;
}

View File

@@ -0,0 +1,60 @@
.x-vlc-slider {
background:#C7F2FF;
text-align:center;
}
.x-vlc-slider-thumb {
background:#4EAECC;
width:3px;
}
.x-vlc-main {
}
.x-vlc-toolbar {
color:black;
}
.x-vlc-toolbar * {
vertical-align:top;
}
.x-vlc-btn {
padding-right:10px;
}
.x-vlc-btn-fullscreen {
background:url(/img/vlc/fullscreen2.gif) no-repeat;
}
.x-vlc-btn-plus {
background:url(/img/vlc/plus2.gif) no-repeat;
}
.x-vlc-btn-moins {
background:url(/img/vlc/moins2.gif) no-repeat;
}
.x-vlc-btn:hover {
color:red;
}
.x-vlc-btn-play {
background:url(/img/vlc/play2.gif) no-repeat;
}
.x-vlc-btn-stop {
background:url(/img/vlc/stop2.gif) no-repeat;
}
.x-vlc-btn-pause {
background:url(/img/vlc/pause2.gif) no-repeat;
}
.x-vlc-timer {
width:100px;
font-size:12px;
vertical-align:top;
text-align:center
}
.x-vlc-about {
font-size:10px;
}

View File

@@ -0,0 +1,113 @@
div#xepg
{
position: relative;
}
div#xepgnow
{
display: none;
position: absolute;
width: 2px;
height: 100%;
background: yellow;
top: 0px;
left: 0px;
z-index: 9999;
box-shadow: 2px 2px 11px #666;
-moz-box-shadow: 2px 2px 11px #666;
-webkit-box-shadow: 2px 2px 11px #666;
opacity:0.7;
/*filter:alpha(opacity=70);*/
}
div.xetick
{
display: none;
position: absolute;
width: 1px;
height: 100%;
background: #ccc;
top: 0px;
left: 0px;
/*
z-index: 9999;
box-shadow: 2px 2px 11px #666;
-moz-box-shadow: 2px 2px 11px #666;
-webkit-box-shadow: 2px 2px 11px #666;
opacity:0.7;
*/
/*filter:alpha(opacity=70);*/
}
div#epgdate
{
border-left: 1px solid #669933;
border-right: 1px solid #669933;
border-top: 1px solid #669933;
clear: left;
float: left;
}
/*
div#xegrid
{
}
*/
div.xerow
{
}
div.xechan
{
vertical-align: middle;
float: left;
clear: left;
white-space: nowrap;
overflow: hidden;
height: 25px;
padding: 3px 0;
margin: 3px 0;
}
div.xechan img
{
vertical-align: middle;
}
div.xetime
{
float: left;
border-left: 1px solid #669933;
}
div.xeprog
{
overflow: hidden;
white-space: nowrap;
float: left;
vertical-align: middle;
height: 25px;
padding: 4px 0 3px 2px;
margin: 3px 0 3px 2px;
border: 1px solid #ccc;
border-radius: 10px;
-moz-border-radius: 10px;
}
div.xeprog span
{
font-style: italic;
font-size: 0.7em;
}
div#buttons
{
padding: 0.5em;
}
button#later
{
margin-left: 2em;
}

View File

@@ -0,0 +1,61 @@
<!--#include virtual="/lib/header.shtml" -->
<script type=text/javascript src=/js/enadis.js></script>
<fieldset class=cleft>
<legend>Diagnostics</legend>
Diagnostic:
<input name=seq id=seq autocorrect=off autocapitalize=off
value=general size=30 maxlength=50
class="text ui-widget-content ui-corner-all">
<button id=rundiag>Run Diagnostic</button>
</fieldset>
<fieldset class=cleft>
<legend>File Editor</legend>
File:
<input name=editfile id=editfile autocorrect=off autocapitalize=off
value='' size=30 maxlength=50
class="text ui-widget-content ui-corner-all">
<button id=runedit>Edit File</button>
</fieldset>
<fieldset class=cleft>
<legend>Log Files</legend>
<!--#exec cmd="/mod/var/mongoose/include/logfiles.jim" -->
</fieldset>
<div style="margin-top: 2em; display: none; float: left; clear: left"
id=results></div>
<script type=text/javascript>
$('#rundiag').button().click(function() {
$('#results')
.slideDown()
.text('\n\nRunning diagnostic, please wait...\n\n')
.load('/cgi-bin/diag.jim?diag=' +
encodeURIComponent($('#seq').val()), function() {
$('#results').wrapInner('<pre>');
});
});
$('#runedit').button().click(function() {
if ($('#editfile').val().length)
window.location = '/cgi-bin/edit/edit.jim?file=' +
encodeURIComponent($('#editfile').val());
});
$('a.log').click(function() {
$('#results')
.slideDown()
.text('\n\nLoading log, please wait...\n\n')
.load('/cgi-bin/cat.jim?file=' +
encodeURIComponent($(this).attr('file')), function() {
$('#results').wrapInner('<pre>');
});
});
</script>
<!--#include virtual="/lib/footer.shtml" -->

View File

@@ -1,9 +1,4 @@
<!--#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 cmd="/mod/var/mongoose/include/epg.jim" -->
<!--#include virtual="/lib/footer.shtml" -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Some files were not shown because too many files have changed in this diff Show More