Compare commits

...

155 Commits

Author SHA1 Message Date
hummypkg
a41c2ae6f9 add toolbar
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@1008 2a923420-c742-0410-a762-8d5b09965624
2012-05-19 21:44:42 +00:00
hummypkg
f56d226cf8 fix padding bug
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@1002 2a923420-c742-0410-a762-8d5b09965624
2012-05-11 20:33:04 +00:00
hummypkg
5b5485dd4c update menuicons
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@999 2a923420-c742-0410-a762-8d5b09965624
2012-05-07 00:24:12 +00:00
hummypkg
1b11c7959b fix dustbin delete of same-named file, remove toggle ENC option
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@991 2a923420-c742-0410-a762-8d5b09965624
2012-05-02 17:41:23 +00:00
hummypkg
df72a42abf 0.9.7
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@963 2a923420-c742-0410-a762-8d5b09965624
2012-04-27 19:17:31 +00:00
hummypkg
6d95ee89a4 remove mediatomb/transmission code
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@946 2a923420-c742-0410-a762-8d5b09965624
2012-04-23 19:19:23 +00:00
hummypkg
57c769a4e8 add menuplugins
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@943 2a923420-c742-0410-a762-8d5b09965624
2012-04-22 23:34:30 +00:00
hummypkg
020e1b707c add resetnew
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@933 2a923420-c742-0410-a762-8d5b09965624
2012-04-22 20:54:29 +00:00
hummypkg
3b8863a4b4 improve status
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@929 2a923420-c742-0410-a762-8d5b09965624
2012-04-18 22:46:21 +00:00
hummypkg
b45fe08fe2 tweak message
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@928 2a923420-c742-0410-a762-8d5b09965624
2012-04-18 21:19:12 +00:00
hummypkg
a5c65505e4 show current channel, retain more backups
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@927 2a923420-c742-0410-a762-8d5b09965624
2012-04-18 20:26:34 +00:00
hummypkg
6ab9318fa9 update dedup
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@926 2a923420-c742-0410-a762-8d5b09965624
2012-04-14 21:31:25 +00:00
hummypkg
52728ba471 update dedup, require new rsvsync
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@909 2a923420-c742-0410-a762-8d5b09965624
2012-04-11 20:54:59 +00:00
hummypkg
68ae915f57 change folder for events
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@897 2a923420-c742-0410-a762-8d5b09965624
2012-04-10 19:45:49 +00:00
hummypkg
3d0152e475 add dlna stuff
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@894 2a923420-c742-0410-a762-8d5b09965624
2012-04-08 23:26:38 +00:00
hummypkg
87060ef8e2 exclude more directories
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@890 2a923420-c742-0410-a762-8d5b09965624
2012-04-05 21:00:22 +00:00
hummypkg
46dad281f5 test
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@889 2a923420-c742-0410-a762-8d5b09965624
2012-04-05 20:59:08 +00:00
hummypkg
f14b2a8b2e move icons into separate package
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@888 2a923420-c742-0410-a762-8d5b09965624
2012-04-05 20:39:57 +00:00
hummypkg
79a09e1df6 move links from main page to diag
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@885 2a923420-c742-0410-a762-8d5b09965624
2012-04-05 20:30:40 +00:00
hummypkg
2de66b4f3c update version
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@880 2a923420-c742-0410-a762-8d5b09965624
2012-03-31 21:30:21 +00:00
hummypkg
2bbf69f820 schedule restructure
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@876 2a923420-c742-0410-a762-8d5b09965624
2012-03-31 21:16:31 +00:00
hummypkg
8fb6570882 fix mpg extraction progress bar
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@863 2a923420-c742-0410-a762-8d5b09965624
2012-03-28 18:59:06 +00:00
hummypkg
df8d655cc8 improvements
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@835 2a923420-c742-0410-a762-8d5b09965624
2012-03-11 00:26:14 +00:00
hummypkg
d8914e2311 enable cfw reset
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@762 2a923420-c742-0410-a762-8d5b09965624
2012-02-23 22:06:39 +00:00
hummypkg
3afef45f86 depend on file
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@759 2a923420-c742-0410-a762-8d5b09965624
2012-02-23 00:25:59 +00:00
hummypkg
4ae2604f0a checkpoint
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@758 2a923420-c742-0410-a762-8d5b09965624
2012-02-23 00:08:38 +00:00
hummypkg
973a7cdacf improve diagnostics and file editor
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@755 2a923420-c742-0410-a762-8d5b09965624
2012-02-22 19:09:46 +00:00
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
919 changed files with 10852 additions and 3048 deletions

View File

@@ -1,11 +1,9 @@
Package: webif
Priority: optional
Section: web
Version: 0.6.3-3
Version: 0.9.8
Architecture: mipsel
Maintainer: af123@hummypkg.org.uk
Depends: mongoose(>=3.0-2),jim(>=0.71-1),jim-sqlite3(>=0.71-1),jim-cgi(>=0.4),jim-oo,jim-pack,service-control,busybox(>=1.18.3-1),lsof,epg(>=1.0.2),hmt(>=1.0.6),ssmtp
Replaces: af123-webif
Conflicts: af123-webif
Suggests: ffmpeg
Depends: webif-channelicons(>=1.0.1),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,file,rsvsync(>=1.0.2),webif-charts(>=1.1)
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

@@ -13,12 +13,23 @@ puts ""
cgi_input
#cgi_dump
if {![dict exists $_cgi file]} {
puts "No filename supplied."
exit
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 $(15 * 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 file [file tail [dict get $_cgi file]]
set ffile "/$dir/$file.rbk"
if {[file exists $ffile]} {

View File

@@ -27,7 +27,7 @@ $(document).ready(function() {
});
});
$('#delete_button').click(function() {
var backup = $('input.restore').val();
var backup = $('input.restore:checked').val();
if (confirm('Confirm deletion of ' + backup))
{
$('#results').load('/cgi-bin/backup/delete.jim?' +
@@ -39,7 +39,7 @@ $(document).ready(function() {
}
});
$('#restore_button').click(function() {
var backup = $('input.restore').val();
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();

View File

@@ -20,7 +20,18 @@ if {![file isdirectory $dir]} {
exit
}
set backups [glob -nocomplain "$dir/*.rbk"]
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

View File

@@ -3,7 +3,7 @@
package require cgi
source /mod/var/mongoose/lib/setup
require rsv.class
require rsv.class findhsvc system.class
set dir /mod/var/backup
@@ -29,29 +29,11 @@ if {![file exists $ffile]} {
}
if {[catch { set fd [open $ffile r] } msg]} {
puts "Error opening backup file. - $msg"
puts "Error opening <i>$file</i> - $msg"
exit
}
proc findhsvc {channel} {
global rsvdb
set hsvc [$rsvdb query "
select hSvc
from channel.TBL_SVC
where szSvcName = '$channel'
or szSvcname = '\025$channel'
limit 1
"]
if {[llength $hsvc] == 1} {
return [lindex [lindex $hsvc 0] 1]
} else {
return 0
}
}
puts "Restoring scheduled events..."
puts "Restoring scheduled events from <i>$file</i>..."
$rsvdb query {begin transaction;}
$rsvdb query {delete from TBL_RESERVATION;}
@@ -71,6 +53,9 @@ foreach line $data {
lappend vars $f [lindex $vals $i]
}
# Don't restore DSO events.
if {$vars(ersvtype) == 11} { continue }
set rsv [rsv new $vars]
# Need to fix up channel and CRID mappings in case something has
@@ -94,7 +79,11 @@ foreach line $data {
}
}
if {!$bad} { $rsv insert }
if {!$bad} {
if {[catch {$rsv insert pending 1} msg]} {
puts " Error inserting event, $msg"
}
}
}
$rsvdb query {commit transaction;}
@@ -103,6 +92,14 @@ puts "Restoring favourite channels..."
$rsvdb query {begin transaction;}
$rsvdb query {delete from channel.TBL_FAV}
$rsvdb query {drop table if exists pending.fav}
$rsvdb query {create table pending.fav (
favIdx integer primary key autoincrement unique,
hSvc integer(4),
eFavGroup integer(4),
[eSvcType] integer(4)
)}
set grp 0
foreach line $data {
set vals [split $line "\t"]
@@ -111,7 +108,7 @@ foreach line $data {
set group [lindex $vals 1]
set type [lindex $vals 2]
set chan [lindex $vals 3]
set hsvc [findhsvc $chan]
set hsvc [get_channel_attr $chan]
if {$grp != $group} {
set grp $group
@@ -120,13 +117,13 @@ foreach line $data {
puts " $chan"
if {!$hsvc} {
if {$hsvc eq ""} {
puts " Cannot map channel name to service."
continue
}
set query "
insert into channel.TBL_FAV(hSvc, eFavGroup, eSvcType)
insert into pending.fav(hSvc, eFavGroup, eSvcType)
values($hsvc, $group, $type);
"
@@ -135,7 +132,7 @@ foreach line $data {
$rsvdb query {commit transaction;}
close [open /tmp/.restartpending w]
system restartpending
close $fd
rsv cleanup

View File

@@ -2,28 +2,80 @@
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
require ts.class pretty_size system.class settings.class escape
puts "Content-Type: text/html"
puts ""
set ignore {.nts .thm .hmt .hmi}
set include {.ts .avi .mpg .mpeg .wmv .mkv .mp3 .mp4 .mov}
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 env(REQUEST_URI) ''
#set _cgi(dir) "/media/My Video/Chuggington"
if {![dict exists $env REQUEST_URI]} {
set env(REQUEST_URI) ""
set _cgi(dir) "/media/My Video/"
}
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 id=\"img$tbfile\"
src=/images/711_1_09_Media_Folder.png>"
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></div>"
</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} {{i 0}} {
@@ -39,7 +91,8 @@ proc entry {file} {{i 0}} {
if {$ext in $::ignore || $ext ni $::include} { continue }
file stat $file st
set sz [pretty_size $st(size)]
set rsz $st(size)
set sz [pretty_size $rsz]
set base [file rootname $file]
@@ -47,31 +100,42 @@ proc entry {file} {{i 0}} {
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
}
puts "
<div class=\"va bf\" id=[incr i]>
<a class=bf file=\"$file\" type=$type href=#>
"
set new 0
if {$type eq "ts"} {
if {[$ts flag "New"] > 0} { set new 1 }
} else {
if {![file exists "[file rootname $file].hmi"]} { set new 1 }
} elseif {$type eq "gen"} {
if {![file exists "${base}.hmi"]} { set new 1 }
}
if {$new} { append img _New }
puts "<img class=va border=0 src=/img/$img.png>"
set fscl "fs"
set synopsis ""
if {$type eq "ts"} {
set fscl "fs fsts"
set synopsis [cgi_quote_html [$ts get synopsis]]
}
puts "
$bfile
</a>
<div class=\"va bf\" id=[incr i]>
<img class=va border=0 src=/img/$img.png>
<input class=\"$fscl\" type=checkbox>
<a class=bf title=\"$synopsis\"
file=\"[cgi_quote_url $file]\" type=$type href=#>
$bfile
</a>
"
# Size
@@ -81,7 +145,10 @@ proc entry {file} {{i 0}} {
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"} {
@@ -91,29 +158,36 @@ proc entry {file} {{i 0}} {
set def SD
set img "172_1_26_SD"
}
puts "<img class=va src=/images/$img.png height=21>"
icon "/images/$img.png"
# Locked
if {[$ts flag "Locked"] > 0} {
set locked 1
puts "<img class=va src=/images/178_1_00_Icon_Lock.png
height=21>"
icon "/images/178_1_00_Icon_Lock.png" "Locked"
}
# Encrypted
if {[$ts flag "Encrypted"] > 0} {
set encd 1
puts "<img class=va
src=/images/749_1_26_Video_Encryption.png
height=21>"
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} {
puts "<img class=va
src=/images/174_1_26_GuidancePolicy.png
height=21>"
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]
}
# Opt+ button
@@ -121,7 +195,9 @@ proc entry {file} {{i 0}} {
puts "
<a href=#>
<img class=\"opt va\" border=0 width=45 type=$type did=$i
locked=$locked encd=$encd def=$def new=$new
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>
@@ -129,11 +205,7 @@ proc entry {file} {{i 0}} {
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
@@ -142,66 +214,23 @@ header
puts {
<link href=/css/jquery.contextMenu.css rel=stylesheet type=text/css />
<script type="text/javascript" src="/js/jquery.contextMenu.js"></script>
<ul id=optmenu class=contextMenu>
<li><a href=#delete>Delete</a></li>
<li><a href=#lock>Toggle Lock</a></li>
<li><a href=#enc>Toggle Enc</a></li>
<li><a href=#new>Toggle New</a></li>
<li><a href=#rename>Rename</a></li>
<li><a href=#download>Download</a></li>
</ul>
<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 EPG 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=dialogue></div>
<div id=confirm title="Confirmation Required"></div>
<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 />
}
puts "<span style=\"display:none\" id=dir>$dir</span>"
source /mod/var/mongoose/cgi-bin/browse/assets.jim
# Breadcrumb path
puts "
<fieldset style=\"margin: 1em\">
<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
set stub ""
foreach part [split $dir /] {
if {$stub eq "/"} { set name $part } else { set name "/$part" }
@@ -223,14 +252,113 @@ if {$parent ne ""} {
"
}
# Strip double slashes
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>"
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=#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>
<li class=separator><a href=#resetnew>Reset new flag</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

@@ -1,4 +1,66 @@
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;
@@ -50,13 +112,17 @@ function new_folder_callback(data, status, xhr)
$.each(data, set_folder_new);
}
function delete_callback(file, type, id)
function delete_callback(file, dir, id)
{
var el = 'div.bf#' + id;
var results = el + ' .results';
var url = '/cgi-bin/browse/delete.jim?file=' +
encodeURIComponent(file) + '&type=' + type;
$(results).load(url, function() {
$(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();
});
@@ -65,19 +131,19 @@ function delete_callback(file, type, id)
function lock_callback(file, type, id)
{
var url = '/cgi-bin/browse/lock.jim?file=' + encodeURIComponent(file);
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=' + encodeURIComponent(file);
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=' + encodeURIComponent(file);
var url = '/cgi-bin/browse/new.jim?file=' + file;
$.get(url, function() { window.location.reload(true); });
}
@@ -88,6 +154,32 @@ function rename_submit()
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)
@@ -101,7 +193,7 @@ function confirm_action(action, callback, file, type, id)
});
$('#confirm').empty().html(
'Are you sure you wish to ' + action + '<br>' +
'<i>' + bfile + '</i> ?'
'<i>' + decodeURIComponent(bfile) + '</i> ?'
);
$confirm.dialog('open');
}
@@ -110,51 +202,93 @@ function preparemenu(el, menu)
{
if (el.attr('type') == 'ts')
{
if (el.attr('def') == 'HD')
{
$('#optmenu').enableContextMenuItems('#enc');
if (el.attr('encd') == 1)
$(menu).changeContextMenuItem('#enc',
'Remove ENC');
else
$(menu).changeContextMenuItem('#enc',
'Set ENC');
}
else
$('#optmenu').disableContextMenuItems('#enc');
// if (el.attr('def') == 'HD')
// {
// $(menu).enableContextMenuItems('#enc');
// if (el.attr('encd') == 1)
// $(menu).changeContextMenuItem('#enc',
// 'Remove Enc');
// else
// $(menu).changeContextMenuItem('#enc',
// 'Set Enc');
// }
$('#optmenu').enableContextMenuItems('#new');
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');
$('#optmenu').enableContextMenuItems('#lock');
$(menu).enableContextMenuItems('#lock');
if (el.attr('locked') == 1)
{
$(menu).changeContextMenuItem('#lock', 'Unlock');
$('#optmenu').disableContextMenuItems('#delete');
$(menu).disableContextMenuItems('#delete');
}
else
{
$(menu).changeContextMenuItem('#lock', 'Lock');
$('#optmenu').enableContextMenuItems('#delete');
$(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
{
$('#optmenu').enableContextMenuItems('#delete');
$('#optmenu').disableContextMenuItems('#lock');
$('#optmenu').disableContextMenuItems('#enc');
$('#optmenu').disableContextMenuItems('#new');
$(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');
@@ -166,7 +300,18 @@ var menuclick = function(action, el, pos)
{
case 'delete':
confirm_action('delete', delete_callback, file,
type, id);
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':
@@ -174,10 +319,10 @@ var menuclick = function(action, el, pos)
file, type, id);
break;
case 'enc':
confirm_action('change the ENC flag on', enc_callback,
file, type, id);
break;
// case '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,
@@ -185,8 +330,8 @@ var menuclick = function(action, el, pos)
break;
case 'rename':
$('#rename').val(bfile);
$('#renameorig').val(file);
$('#rename').val(decodeURIComponent(bfile));
$('#renameorig').val(decodeURIComponent(file));
$('#titleorig').val('');
$('#renametitle').val('');
@@ -196,7 +341,7 @@ var menuclick = function(action, el, pos)
if (type == 'ts')
{
$.getJSON('/cgi-bin/browse/epgtitle.jim?file=' +
encodeURIComponent(file), epginfo_callback);
file, epginfo_callback);
}
$('#renameform').dialog('open');
@@ -204,7 +349,96 @@ var menuclick = function(action, el, pos)
case 'download':
window.location.href = '/cgi-bin/browse/download.jim?file=' +
encodeURIComponent(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?dir=' + file;
$.get(url, function() { window.location.reload(true); });
break;
case 'resetnew':
var url = '/cgi-bin/browse/resetnew.jim?dir=' + file;
$.get(url, function() { window.location.reload(true); });
break;
default:
@@ -223,9 +457,25 @@ var menuclick = function(action, el, pos)
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",
@@ -233,23 +483,43 @@ var menuclick = function(action, el, pos)
height: 600, width: 700,
show: 'scale', hide: 'fade',
draggable: true, resizable: true,
buttons: {
"Close": function() {
$(this).dialog('close');
}
},
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 url = '/cgi-bin/browse/file.jim?file=' +
encodeURIComponent(file) + '&type=' + type;
$('#dialogue').load(url);
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');
});
@@ -266,6 +536,32 @@ var menuclick = function(action, el, pos)
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,
@@ -273,8 +569,6 @@ var menuclick = function(action, el, pos)
show: 'fade', hide: 'fade',
draggable: false, resizable: false
});
var dir = $('#dir').text();
// Load folder sizes
$.getJSON('/cgi-bin/browse/sizes.jim?dir=' + encodeURIComponent(dir),
@@ -283,5 +577,138 @@ var menuclick = function(action, el, pos)
// 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 = '/dedup/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,72 @@
#!/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
}
if {![system is_listening 9000]} {
puts "The Humax media server is not running, cannot decrypt."
puts "Have you enabled <i>Content Sharing</i> in the Humax menus?"
puts "It can sometimes turn itself off so it's worth double checking."
puts "If it is on then try turning sharing off and on again."
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,66 @@
#!/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
if {$url eq ""} {
puts "This file has not been indexed by the media server.
Cannot decrypt."
exit
}
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"
if {[file exists "$origdir/$shname.ts"]} {
puts "The file already exists in _original, cannot decrypt."
exit
}
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

@@ -1,27 +1,105 @@
#!/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 tdelete
puts "Content-Type: text/html"
puts ""
puts "Content-Type: text/html\r\n"
cgi_input
#cgi_dump
set file [dict get $_cgi file]
set type [dict get $_cgi type]
set dir [cgi_get dir]
regsub -all {([\\["$])} $dir {\\\1} dir
if {$type eq "ts"} {
set ts [ts fetch $file]
if {[$ts delete]} {
puts "Successfully deleted $file."
} else {
puts "Problem deleting $file, [$ts get error]"
}
exit
#puts "DIR: ($dir)"
if {[system pkginst undelete]} {
set dustbin [system dustbin]
} else {
set dustbin ""
}
file delete $file
puts "Successfully deleted $file."
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]"
if {$force} {
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 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

@@ -5,29 +5,28 @@ 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 [dict get $_cgi file]
set rfile [file normalize $file]
set ts [ts fetch $file]
set dmsfile /mnt/hd2/dms_cds.db
set file [cgi_get file]
# Default to just downloading the raw file.
set url $file
set mime "video/ts"
if {[file exists $dmsfile]} {
set db [sqlite3.open /mnt/hd2/dms_cds.db]
set muri [$db query "
select tblresource.mimetype, contenturi
from tblresource join tblmedia using (mediaid)
where localurl = '$rfile'
"]
if {$muri != ""} {
set rec [lindex $muri 0]
set xuri [lindex $rec 3]
set mime [lindex $rec 1]
set url "http://$env(HTTP_HOST):9000/web/$xuri"
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"
}
}
}

View File

@@ -65,24 +65,42 @@ if {$type eq "ts"} {
<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).</td>
<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]</td>
</tr>
</table>
"
<td>[$ts get flags]
"
if {[$ts get bookmarks]} {
puts " \[Bookmarks: [$ts get bookmarks]\]"
}
puts "</tr>"
puts "</table>"
exit
}

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 dir]
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,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>Extract to MPG</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.75]
set perc [expr $nsz * 100 / $sz]
if {$perc > 100} { set perc 100 }
puts $perc
}

View File

@@ -1,7 +1,8 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/ts.class
source /mod/var/mongoose/lib/setup
require ts.class
puts "Content-Type: text/html"
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,49 @@
#!/mod/bin/jimsh
package require cgi
package require pack
source /mod/var/mongoose/lib/setup
require ts.class hexdump
puts "Content-Type: text/html"
puts ""
cgi_input
#cgi_dump
set dir [cgi_get dir]
if {![file isdirectory $dir]} { exit }
if {![file exists "$dir/.series"]} { exit }
set tot 0
set watched 0
foreach file [readdir -nocomplain $dir] {
if {![string match {*.ts} $file]} { continue }
#puts "FILE: $file"
incr tot
if {[set ts [ts fetch "$dir/$file"]] != 0} {
if {![$ts flag "New"]} { incr watched }
}
}
set fd [open "$dir/.series"]
set bytes [read $fd]
close $fd
set recs [unpack $bytes -uintle 0 32]
set played [unpack $bytes -uintle 32 32]
puts "Current: $played/$recs"
#hexdump $bytes
puts "Calculated: $watched/$tot"
pack bytes $tot -intle 32 0
pack bytes $watched -intle 32 32
#hexdump $bytes
set fd [open "$dir/.series" "w"]
puts -nonewline $fd $bytes
close $fd

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

@@ -2,6 +2,7 @@
package require cgi
#puts "Content-Type: text/plain"
puts "Content-Type: application/json"
puts ""
@@ -15,12 +16,30 @@ set dir [dict get $_cgi dir]
#9.4G /media/My Video/Archive
#1.4G /media/My Video/CSI_ Crime Scene Investigation
puts "{"
foreach line [split [exec /mod/bin/busybox/du -h "$dir/"] "\n"] {
set fields [split $line "\t"]
set size [lindex $fields 0]
set node [lindex [split [lindex $fields 1] /] end]
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

View File

@@ -0,0 +1,7 @@
#!/bin/sh
echo "Content-Type: text/plain"
echo
touch /var/lib/humaxtv/mod/_RESET_CUSTOM_FIRMWARE_ENVIRONMENT

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

View File

@@ -8,6 +8,9 @@ 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
@@ -62,10 +65,16 @@ proc db_info {db_file} {
$db close
}
db_info /var/lib/humaxtv/rsv.db
db_info /var/lib/humaxtv/setup.db
db_info /var/lib/humaxtv/channel.db
db_info /mnt/hd2/dms_cds.db
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

8
var/mongoose/cgi-bin/env.jim Executable file
View File

@@ -0,0 +1,8 @@
#!/mod/bin/jimsh
puts "Content-type: text/plain\n"
foreach f [dict keys $env] {
puts "$f = $env($f)"
}

View File

@@ -10,31 +10,14 @@ 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] }
set service [cgi_get service 0]
set event [cgi_get event 0]
if {! [dict exists $_cgi bare]} { header }
#set service 8448
#set event 30843
set record [lindex [epg fetch dump -service $service -event $event] 0]
$record get_channel_info
set others [$record othertimes]
puts {
<style type=text/css>
font.also
{
font-size: 0.9em;
font-style: italic;
color: #333;
background: transparent;
}
</style>
}
puts "
<table class=keyval>
<tr>
@@ -96,7 +79,7 @@ if {[$record get event_crid] != ""} {
puts "
<tr>
<th>CRID</th><td>
<a href=/cgi-bin/epg_search.jim?crid=[$record get event_crid]>
<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]
@@ -110,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]
@@ -124,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]
@@ -143,7 +126,7 @@ 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>

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

@@ -9,6 +9,8 @@ puts ""
header
require totop
puts "<script type=text/javascript src=/js/jquery.highlight.js></script>"
cgi_input
@@ -106,7 +108,7 @@ foreach record [lsort -command rsort $records] {
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]>
<a href=/cgi-bin/epg/service.jim?service=[$record get service_id]>
[$record get channel_name]
</a></td>"
puts [$record cell]

View File

@@ -9,6 +9,8 @@ puts ""
header
require totop
[spinner new {
text "Loading EPG Data..."
size "1.2em"

View File

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

View File

@@ -9,17 +9,24 @@ cgi_input
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
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
if {$cmd eq "upgrade"} { opkg update }
opkg $cmd
if {$cmd eq "update"} {
if {$cmd eq "update" || $cmd eq "upgrade"} {
chunk "Updating package meta information\r\n"
pkg fetchmeta
chunk "Done.\r\n"

View File

@@ -48,7 +48,7 @@ proc pkgrow {pkg} {
puts "<td align=center><small><button id=\"[$pkg get name]\"
action=[string tolower $type]
class=[string tolower $type]>$type</button></small></td>"
class=\"va [string tolower $type]\">$type</button></small></td>"
puts "</tr>"
}
@@ -79,7 +79,8 @@ if {[llength $pkgs] > 0} {
"
foreach pkg $pkgs {
if {$filter && ![dict exists $::pkgmeta $pkg]} { continue }
if {$type ne "upgr" && $filter && \
![dict exists $::pkgmeta $pkg]} { continue }
pkgrow [pkg load $pkg]
}
puts "</table>"
@@ -90,7 +91,7 @@ if {[llength $pkgs] > 0} {
puts "<i>No packages "
switch $type {
inst { puts "are installed." }
upgr { puts "are available for upgrade." }
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

@@ -1,9 +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 ""
#puts [exec /etc/init.d/S90settop restart]
#file delete /tmp/.restartpending
puts [exec killall humaxtv]
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()", 350);
$.get('/cgi-bin/restart.jim?now=yes');
});
</script>
Please wait while the Humax restarts...<br>
<div id=progressbar></div>
}
footer

View File

@@ -11,11 +11,23 @@ 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
@@ -51,39 +63,49 @@ proc handle_str_update {var old {text "Value"}} {
handle_str_update hostname $hostname Hostname
_handle_update ascii smtp_server $smtp_server "SMTP Server"
handle_int_update channel_group $channel_group "Channel Group"
if {[dict exists $_cgi pkgdevoff] && ![dict exists $_cgi pkgdev]} {
set _cgi(pkgdev) 0
}
handle_str_update epg_style $epg_style "EPG Type"
handle_int_update pkgdev $pkgdev "Development Package Display"
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" src="/js/jquery.form.js"></script>}
puts {
<script type=text/javascript>
$(document).ready(function () {
$(":submit").button();
$('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');
}
});
});
});
</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 "
<link href=/css/iphone-style-checkboxes.css rel=stylesheet type=text/css />
<script type=\"text/javascript\" src=\"/js/iphone-style-checkboxes.js\">
</script>
<fieldset style=\"display: inline\">
<legend>
General Settings
@@ -107,13 +129,47 @@ puts "
</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 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>
"
puts "
<tr>
<form class=auto id=channel_group method=get action=$env(REQUEST_URI)>
<th class=key>Channel Group for EPG</th>
<td><select id=channel_group name=channel_group
class=\"text ui-widget-content ui-corner-all\"
value=[$settings channel_group]>
class=\"text ui-widget-content ui-corner-all\">
"
set i 0
@@ -166,33 +222,114 @@ puts "
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>
"
puts "
<tr>
<form class=auto id=pkgdev method=get action=$env(REQUEST_URI)>
<th class=key>Show development and advanced packages?</th>
<td><input name=pkgdevoff value=0 type=hidden>
<input name=pkgdev id=pkgdev value=1 type=checkbox
<td><input name=pkgdev id=pkgdev value=1 type=checkbox
"
if {$pkgdev} { puts " checked" }
puts {
>
<small>
<input id=pkgdev_submit value="save" type=submit>
</small>
<div id=pkgdev_output></div>
if {$pkgdev} { puts -nonewline " checked" }
puts ">
</td>
</form>
</tr>
}
puts "
</table>
<div id=pkgdev_output></div>
</fieldset>
"

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

@@ -1,49 +1,111 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/setup
require system.class findhsvc epg.class
puts "Content-Type: text/html"
puts ""
if {[catch {set pid [exec pgrep humaxtv]}]} { exit }
if {[catch {set data [exec lsof -p $pid | grep Video | fgrep .ts]} ]} {
exit
if {[catch {set pid [exec pgrep humaxtv]}]} {
puts "Cannot find humaxtv process."
exit
}
set lines [split $data "\n"]
foreach line $lines {
regsub -all -- {[[:space:]]+} $line " " line
set fields [split $line " "]
set name [lindex [split $line "/"] end]
set size($name) [lindex $fields 6]
set seen($name) 0
}
proc get_data {} {
global pid
sleep 2
set data [exec lsof -p $pid | grep Video | fgrep .ts]
regsub -all -- {[[:space:]]+} $line " " line
set lines [split $data "\n"]
foreach line $lines {
regsub -all -- {[[:space:]]+} $line " " line
set fields [split $line " "]
set name [lindex [split $line "/"] end]
set size2 [lindex $fields 6]
if { $size2 > $size($name) && $seen($name) < 1 } {
set mode "Recording"
set icon "745_1_11_Video_1REC.png"
set ret {}
if {[catch {set data \
[exec /mod/bin/lsof -p $pid | grep Video | fgrep .ts]} ]} {
set ret {}
} else {
set mode "Watching"
set icon "745_1_10_Video_2Live.png"
foreach line [split $data "\n"] {
regsub -all -- {[[:space:]]+} $line " " line
set name [file rootname [file tail $line]]
if {[dict exists $ret $name]} {
set ret($name) -1
} else {
set size [lindex [split $line " "] 6]
set ret($name) $size
}
}
}
return $ret
}
incr seen($name)
set play 0
set rec 0
set seen {}
set output {}
lappend output "<img class=va src=/images/$icon><span class=va>
$mode&nbsp;$name</span><br>"
set data [get_data]
if {[llength $data]} {
sleep 2
set ndata [get_data]
foreach name [array names ndata] {
if {![dict exists $seen $name]} { set seen($name) 0 }
if {![dict exists $data $name]} { set data($name) 0 }
if {$ndata($name) == -1} {
incr rec
incr play
set mode "Chase Playing"
set icon "745_1_11_Video_3REC_Live.png"
} elseif {$ndata($name) > $data($name) && $seen($name) < 1} {
incr rec
set mode "Recording"
set icon "745_1_11_Video_1REC.png"
} else {
incr play
set mode "Playing"
set icon "745_1_10_Video_2Live.png"
}
incr seen($name)
lappend output "<img class=va src=/images/$icon><span class=va>
$mode&nbsp;<i>$name</i></span>"
}
}
if {![system instandby] && $play < 1} {
set hsvc [system param CUR_SVC Value USERCONFIG]
set ff [$rsvdb query "
select usSvcid as svcid, usLcn as lcn,
substr(szSvcName, 2) as name
from channel.TBL_SVC
where hSvc = $hsvc
limit 1
"]
if {[llength $ff] == 1} {
lassign [lindex $ff 0] x svcid x lcn x name
set epgs [epg dbfetch get \
-service $svcid \
-time [clock seconds]\
]
set prog ""
if {[llength $epgs] == 1} {
lassign $epgs epg
set prog "- [$epg get name] ("
append prog "[clock format [$epg get start] -format %H:%M] - "
append prog "[clock format $([$epg get start] + [$epg get duration]) -format %H:%M]"
append prog ") \[[$epg percent]%\]"
}
lappend output "[epg channelicon $name 30 \
{vertical-align: middle; padding: 0 4px 0 2px}]
<span class=va> Watching <i>$lcn: $name $prog</i></span>"
}
}
if {[system instandby]} {
lappend output "<img class=va width=28 style=\"padding: 0 4px\"
src=/img/standby.png>
<span class=va>System is in standby.</span>"
}
if {[llength $output]} {
puts [join $output " "]
puts [join $output "<br>"]
}

View File

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

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

@@ -54,9 +54,15 @@
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); }
.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

@@ -0,0 +1,91 @@
UL.jqueryFileTree {
font-family: Verdana, sans-serif;
font-size: 11px;
line-height: 18px;
padding: 0px;
margin: 0px;
}
UL.jqueryFileTree LI {
list-style: none;
padding: 0px;
padding-left: 20px;
margin: 0px;
white-space: nowrap;
}
UL.jqueryFileTree A {
color: #333;
text-decoration: none;
display: block;
padding: 0px 2px;
}
UL.jqueryFileTree A:hover {
background: #BDF;
}
/* Core Styles */
.jqueryFileTree LI.directory { background: url(/img/filetree/directory.png) left top no-repeat; }
.jqueryFileTree LI.expanded { background: url(/img/filetree/folder_open.png) left top no-repeat; }
.jqueryFileTree LI.file { background: url(/img/filetree/file.png) left top no-repeat; }
.jqueryFileTree LI.wait { background: url(/img/filetree/spinner.gif) left top no-repeat; }
/* File Extensions*/
.jqueryFileTree LI.ext_3gp { background: url(/img/filetree/film.png) left top no-repeat; }
.jqueryFileTree LI.ext_afp { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_afpa { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_asp { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_aspx { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_avi { background: url(/img/filetree/film.png) left top no-repeat; }
.jqueryFileTree LI.ext_bat { background: url(/img/filetree/application.png) left top no-repeat; }
.jqueryFileTree LI.ext_bmp { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_c { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_cfm { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_cgi { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_com { background: url(/img/filetree/application.png) left top no-repeat; }
.jqueryFileTree LI.ext_cpp { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_css { background: url(/img/filetree/css.png) left top no-repeat; }
.jqueryFileTree LI.ext_doc { background: url(/img/filetree/doc.png) left top no-repeat; }
.jqueryFileTree LI.ext_exe { background: url(/img/filetree/application.png) left top no-repeat; }
.jqueryFileTree LI.ext_gif { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_fla { background: url(/img/filetree/flash.png) left top no-repeat; }
.jqueryFileTree LI.ext_h { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_htm { background: url(/img/filetree/html.png) left top no-repeat; }
.jqueryFileTree LI.ext_html { background: url(/img/filetree/html.png) left top no-repeat; }
.jqueryFileTree LI.ext_jar { background: url(/img/filetree/java.png) left top no-repeat; }
.jqueryFileTree LI.ext_jpg { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_jpeg { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_js { background: url(/img/filetree/script.png) left top no-repeat; }
.jqueryFileTree LI.ext_lasso { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_log { background: url(/img/filetree/txt.png) left top no-repeat; }
.jqueryFileTree LI.ext_m4p { background: url(/img/filetree/music.png) left top no-repeat; }
.jqueryFileTree LI.ext_mov { background: url(/img/filetree/film.png) left top no-repeat; }
.jqueryFileTree LI.ext_mp3 { background: url(/img/filetree/music.png) left top no-repeat; }
.jqueryFileTree LI.ext_mp4 { background: url(/img/filetree/film.png) left top no-repeat; }
.jqueryFileTree LI.ext_mpg { background: url(/img/filetree/film.png) left top no-repeat; }
.jqueryFileTree LI.ext_mpeg { background: url(/img/filetree/film.png) left top no-repeat; }
.jqueryFileTree LI.ext_ogg { background: url(/img/filetree/music.png) left top no-repeat; }
.jqueryFileTree LI.ext_pcx { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_pdf { background: url(/img/filetree/pdf.png) left top no-repeat; }
.jqueryFileTree LI.ext_php { background: url(/img/filetree/php.png) left top no-repeat; }
.jqueryFileTree LI.ext_png { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_ppt { background: url(/img/filetree/ppt.png) left top no-repeat; }
.jqueryFileTree LI.ext_psd { background: url(/img/filetree/psd.png) left top no-repeat; }
.jqueryFileTree LI.ext_pl { background: url(/img/filetree/script.png) left top no-repeat; }
.jqueryFileTree LI.ext_py { background: url(/img/filetree/script.png) left top no-repeat; }
.jqueryFileTree LI.ext_rb { background: url(/img/filetree/ruby.png) left top no-repeat; }
.jqueryFileTree LI.ext_rbx { background: url(/img/filetree/ruby.png) left top no-repeat; }
.jqueryFileTree LI.ext_rhtml { background: url(/img/filetree/ruby.png) left top no-repeat; }
.jqueryFileTree LI.ext_rpm { background: url(/img/filetree/linux.png) left top no-repeat; }
.jqueryFileTree LI.ext_ruby { background: url(/img/filetree/ruby.png) left top no-repeat; }
.jqueryFileTree LI.ext_sql { background: url(/img/filetree/db.png) left top no-repeat; }
.jqueryFileTree LI.ext_swf { background: url(/img/filetree/flash.png) left top no-repeat; }
.jqueryFileTree LI.ext_tif { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_tiff { background: url(/img/filetree/picture.png) left top no-repeat; }
.jqueryFileTree LI.ext_txt { background: url(/img/filetree/txt.png) left top no-repeat; }
.jqueryFileTree LI.ext_vb { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_wav { background: url(/img/filetree/music.png) left top no-repeat; }
.jqueryFileTree LI.ext_wmv { background: url(/img/filetree/film.png) left top no-repeat; }
.jqueryFileTree LI.ext_xls { background: url(/img/filetree/xls.png) left top no-repeat; }
.jqueryFileTree LI.ext_xml { background: url(/img/filetree/code.png) left top no-repeat; }
.jqueryFileTree LI.ext_zip { background: url(/img/filetree/zip.png) left top no-repeat; }

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;
@@ -70,18 +83,24 @@ table.borders, table.borders td, table.borders th
empty-cells: show;
}
table tr.odd, table td.odd, table th.odd
.odd
{
background: #ccff99;
color: black;
}
table tr.even, table td.even, table th.even
.even
{
background: #ffffcc;
color: black;
}
.hover
{
background: #f6ff5b;
color: black;
}
table td,table th
{
font-size: small;
@@ -108,7 +127,7 @@ table.keyval td
color: black;
}
pre, .pre
pre, .pre, .prelike
{
font-family: Consolas, 'Courier New', Courier, monospace;
color: black;
@@ -126,7 +145,10 @@ pre, .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;
@@ -258,3 +280,81 @@ input.text
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;
}
#toolbarouter
{
position: relative;
}
#toolbar
{
position: absolute;
top: -20px;
left: 30px;
z-index: 29;
display: none;
width: 80%;
border: 1px solid #899caa;
box-shadow: 2px 2px 11px #666;
-moz-box-shadow: 2px 2px 11px #666;
-webkit-box-shadow: 2px 2px 11px #666;
border-radius: 5px;
-moz-border-radius: 5px;
margin-top: -1px;
background: #d2e0ea;
padding: 6px;
}
span.toolbarcell
{
float: left;
border-right: 1px solid #ccc;
text-align: center;
padding: 0 1em;
}

View File

@@ -10,6 +10,16 @@ table.tablesorter .header {
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;

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;
}

77
var/mongoose/html/dedup/dedup Executable file
View File

@@ -0,0 +1,77 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/setup
require ts.class
source /mod/var/mongoose/html/dedup/normalise.jim
source /mod/var/mongoose/html/dedup/process.jim
set dirs {}
set doit 0
foreach arg $argv {
if {$arg eq "-yes"} {
set doit 1
} else {
lappend dirs $arg
}
}
if {![llength $dirs]} { lappend dirs [exec pwd] }
foreach dir $dirs {
if {[string index $dir end] eq "/"} {
set dir [string range $dir 0 end-1]
}
puts "\[$dir\]"
foreach file [readdir $dir] {
if {[file extension $file] ne ".hmt"} { continue }
set file "$dir/$file"
set base [file tail [file rootname $file]]
lassign [dedupprocess $file] stat ts syn fn
puts -nonewline "$base -> "
switch $stat {
inuse {
puts -nonewline "In Use"
}
dup {
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"
}
}
error {
puts -nonewline "Cannot process"
}
nothing {
puts -nonewline "Nothing to do"
}
preserve {
puts -nonewline "Preserving"
}
ok {
puts -nonewline $fn
if {$doit} {
# Dooooo, it.
$ts settitle $syn
ts renamegroup $file $fn
puts -nonewline "Done"
}
}
}
puts ""
}
}

103
var/mongoose/html/dedup/dedup.jim Executable file
View File

@@ -0,0 +1,103 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require ts.class pretty_size altrow
source normalise.jim
source process.jim
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 "<script type=text/javascript src=script.js></script>"
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 }
set base [file tail [file rootname $file]]
lassign [dedupprocess $file] stat ts syn fn
altrow
puts "<td nowrap>$base</td>"
puts "<td>$fn</td>"
puts "<td>$syn</td>"
puts "<td>"
switch $stat {
inuse {
puts -nonewline "In Use"
}
dup {
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"
}
}
error {
puts -nonewline "Cannot process"
}
nothing {
puts -nonewline "Nothing to do"
}
preserve {
puts -nonewline "Preserving"
}
ok {
if {$doit} {
# Dooooo, it.
$ts settitle $syn
ts renamegroup $file $fn
puts -nonewline "Done"
}
}
}
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>
}
footer

View File

@@ -0,0 +1,48 @@
#!/mod/bin/jimsh
set dedup_prefixes {
{^new series\.* *}
{^cbeebies\.* *}
{^cbbc\.* *}
{^brand new series *-* *}
{^\.+}
}
proc dedupnormalise {title {reserve ""}} {
global dedup_prefixes
# Strip common prefixes
foreach prefix $dedup_prefixes {
regsub -nocase -all -- $prefix $title "" title
}
# Strip anything following a colon.
regsub -all -- { *[:].*$} $title "" title
# If the resulting string is longer than 40 characters then
# split around . and take the left hand side if appropriate.
if {[string length $title] > 40} {
lassign [split $title "."] v w
set title $v
if {[string length $title] < 6 && [string length $w] < 6} {
append title "_$w"
}
}
# if still short, add the reserve string.
if {[string length $title] < 10} {
if {[string match "${title}*" $reserve]} {
set title $reserve
} else {
append title " $reserve"
}
}
# Shorten if too long.
if {[string length $title] > 40} {
set title [string range $title 0 39]
}
return $title
}

View File

@@ -0,0 +1,31 @@
#!/mod/bin/jimsh
require system.class
proc dedupprocess {file} {{seen {}}} {
set ts [ts fetch $file 1]
set dir [file dirname $file]
set base [file tail [file rootname $file]]
set syn [dedupnormalise [$ts get synopsis] [$ts get title]]
# Escape special characters to create the filename.
regsub -all -- {[\/ &]} $syn "_" fn
regsub -all -- {[?]} $fn "" fn
set stat ok
if {[system inuse [file rootname $file]]} {
set stat inuse
} elseif {$fn in $seen} {
set stat dup
} elseif {[string length $syn] > 40} {
set stat error
} elseif {$base eq $fn} {
set stat nothing
} elseif {[file exists "$dir/$fn.ts"]} {
set stat preserve
}
lappend seen $fn
return [list $stat $ts $syn $fn]
}

View File

@@ -0,0 +1,14 @@
$(function() {
$('#browse').button().click(function() {
window.location = '/cgi-bin/browse.jim?dir=' +
encodeURIComponent($('#dir').text());
});
$('#dedup').button().click(function() {
window.location = window.location + '&doit=1';
});
});

139
var/mongoose/html/diag/diag.jim Executable file
View File

@@ -0,0 +1,139 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require pretty_size
puts "Content-Type: text/html"
puts ""
header
puts {
<script type=text/javascript src=/js/enadis.js></script>
<script type=text/javascript src=script.js></script>
<fieldset class=cleft>
<legend>Utilities</legend>
<table>
<tr>
<td>Run Diagnostic:</td>
<td><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>
</td>
</tr>
<tr>
<td>Package:</td>
<td><input name=fopkg id=fopkg autocorrect=off autocapitalize=off
value='' size=30 maxlength=50
class="text ui-widget-content ui-corner-all">
<button id=runfopkg>Force re-install</button>
</td>
</tr>
<tr><td colspan=2 style="height: 10px"></td></tr>
<tr>
<td colspan=2 align=center>
<button id=runedit style="width: 48%">File Editor</button>
<button id=dbinfo style="width: 48%">Database Browser</button>
</td>
</tr>
<tr>
<td colspan=2 align=center>
<button id=channelinfo style="width: 48%">Channel Information</button>
</td>
</tr>
}
if {[system model] eq "HDR"} {
puts {
<tr>
<td colspan=2 align=center>
<button id=dlna style="width: 48%">DLNA Server</button>
</td>
</tr>
}
}
puts {
<tr><td colspan=2 style="height: 10px"></td></tr>
<tr>
<td colspan=2>
<button id=reboot style="width: 100%">Reboot System</button>
</td>
</tr>
<tr>
<td colspan=2>
<button id=runreset style="width: 100%"
}
if {[system modversion 1] < 200} {
puts -nonewline " disabled class=ui-state-disabled"
}
puts {
>
Remove all custom firmware packages and settings
</button>
}
if {[system modversion 1] < 200} {
puts {
<div class=footnote style="text-align: center">
(Install custom firmware v2.00 to enable this option)
</div>
}
}
puts {
<div id=resetdone class="hidden blood">
Restart your Humax with the remote control.<br>
Allow it to turn off completely before restarting.<br>
</div>
</td>
</tr>
</table>
<span class=also style="padding-left: 5px">
View:
<a href=/jim/ref.html target=_blank>Jim Reference Manual</a> |
<a href=/jim/oo.html target=_blank>OO</a> |
<a href=/jim/sqlite.html target=_blank>Sqlite</a>
</span>
</fieldset>
<fieldset class=left>
<legend>View Log Files</legend>
}
foreach file [lsort [concat \
[glob -nocomplain /var/log/*.log] \
[glob -nocomplain /mod/tmp/*.log] \
]] {
puts "<a href=# class=log file=\"$file\">
<img border=0 height=14 src=/images/421_1_00_CH_Title_2R_Arrow.png>
[file tail $file]</a> ([pretty_size [file size $file]]) <br>"
}
puts {
</fieldset>
<div style="margin-top: 2em; display: none; float: left; clear: left"
id=results></div>
}
footer

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,83 @@
$(function() {
$('button').button();
$('#rundiag').click(function() {
$('#results')
.slideDown()
.text('\n\nRunning diagnostic, please wait...\n\n')
.load('rundiag.jim?diag=' +
encodeURIComponent($('#seq').val()), function() {
$('#results').wrapInner('<pre>');
});
});
$('#runfopkg').click(function() {
$('#results')
.slideDown()
.text('\n\nForcibly re-installing package, please wait...\n\n')
.load('/cgi-bin/opkg.jim?cmd=install+--force-reinstall+' +
encodeURIComponent($('#fopkg').val()), function() {
$('#results').wrapInner('<pre>');
$('#fopkg').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>');
});
});
$('#runedit').click(function(e) {
e.preventDefault();
window.location = '/edit/edit.jim';
});
$('#dbinfo').click(function(e) {
e.preventDefault();
window.location = '/cgi-bin/db.jim';
});
$('#channelinfo').click(function(e) {
e.preventDefault();
window.location = '/cgi-bin/channel.jim';
});
$('#dlna').click(function(e) {
e.preventDefault();
window.location = '/dlna/dlna.jim';
});
$('#reboot').click(function(e) {
e.preventDefault();
if (confirm('Are you sure you wish to perform a reboot now?'))
if (confirm('Really sure?\n\nThere is a small chance the ' +
' Humax may not restart\n' +
'without physical intervention.\n\n' +
'i.e. pressing the standby button or using the remote control'))
window.location = '/cgi-bin/restart.jim';
});
$('#runreset').click(function(e) {
e.preventDefault();
if (!confirm('Are you sure? This will completely remove all packages and settings.'))
return;
if (!confirm('Are you really sure?'))
return;
if (!confirm('One last time, are you sure?'))
return;
$.get('/cgi-bin/cfwreset.cgi', function() {
$('button').disable();
$('#resetdone').slideDown();
});
});
});

84
var/mongoose/html/dlna/dlna.jim Executable file
View File

@@ -0,0 +1,84 @@
#!/mod/bin/jimsh
package require cgi
package require sqlite3
source /mod/var/mongoose/lib/setup
require ts.class pretty_size
puts "Content-Type: text/html\r\n\r\n"
cgi_input
#cgi_dump
header
#append dmsfile ".rr"
set vars {
object.container 0
object.item.videoItem.movie 0
object.item.imageItem.photo 0
object.item.audioItem.musicTrack 0
}
if {[file exists $dmsfile] && ![catch {set db [sqlite3.open $dmsfile]}]} {
catch {
foreach ret [$db query "
select class, count(*) from tblObject group by 1
"] {
lassign $ret x class x num
set vars($class) $num
}
}
$db close
}
if {[system param DMS_START_ON]} {
set cfgstat "Enabled"
} else {
set cfgstat "Disabled"
}
if {[system is_listening 9000]} {
set stat "Running."
set img "745_1_10_Video_2Live.png"
} else {
set stat "Not running."
set img "745_1_11_Video_1REC.png"
}
puts "
<script type=text/javascript src=script.js></script>
<fieldset class=cleft>
<legend>DLNA Server Information</legend>
<table class=keyval cellpadding=5>
<tr>
<th>Server Status</th>
<td class=va>$cfgstat - <img class=va src=/images/$img> $stat</td>
</tr><tr>
<th>Folders Indexed</th>
<td>$vars(object.container)</td>
</tr><tr>
<th>Movies Indexed</th>
<td>$vars(object.item.videoItem.movie)</td>
</tr><tr>
<th>Photos Indexed</th>
<td>$vars(object.item.imageItem.photo)</td>
</tr><tr>
<th>Music Tracks Indexed</th>
<td>$vars(object.item.audioItem.musicTrack)</td>
</tr><tr>
</table>
</fieldset>
<div class=cleft style=\"padding-top: 0.5em\">
<button id=dlnareset>Reset DLNA Database</button>
</div>
<div id=results class=\"cleft hidden blood\"
style=\"border: solid 1px #ccc; margin: 1em; padding: 1em;\">
</div>
"
footer

View File

@@ -0,0 +1,27 @@
#!/mod/bin/jimsh
source /mod/var/mongoose/lib/setup
require system.class
puts "Content-Type: text/html"
puts ""
set menupath "Settings-&gt;System-&gt;Internet Setting-&gt;Content Share"
set dbpath "/mnt/hd2/dms_cds.db"
if {[system param DMS_START_ON] || [system is_listening 9000]} {
puts "To reset the DLNA Database, disable <i>Content Sharing</i>"
puts " in the Humax menus at<br>"
puts "<span class=also style=\"padding-left: 5em\">$menupath</span><br>"
puts "and click the button again."
} elseif {![file exists $dbpath]} {
puts "The DLNA Database does not exist.<br>"
puts "(already reset?)"
} else {
file delete $dbpath
puts "The DLNA Database has been reset.<br>"
puts "You can now re-enable <i>Content Sharing</i> in the Humax menus."
puts "<br>"
puts "<span class=also style=\"padding-left: 5em\">$menupath</span><br>"
}

View File

@@ -0,0 +1,11 @@
$(function() {
$('button').button();
$('#dlnareset').click(function(e) {
e.preventDefault();
$('#results').empty().slideDown().load('reset.jim');
});
});

53
var/mongoose/html/edit/edit.jim Executable file
View File

@@ -0,0 +1,53 @@
#!/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=/js/jqueryFileTree.js></script>
<link rel=stylesheet type=text/css href=/css/jqueryFileTree.css />
<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 id=msg class=blood style="padding-bottom: 0.7em">
Use the <i>Open</i> button below to begin.
</div>
<textarea cols=80 rows=20 id=editor></textarea>
<br>
<button class=xeditactive id=open>Open</button>
<button class=editactive id=save>Save</button>
<button class=editactive id=revert>Revert</button>
<div id=result class="blood hidden" />
</fieldset>
<div class=cleft>
<button id=back>Back to diagnostics</button>
</div>
<div id=chooserd>
<i>Humax Filesystem</i>
<div id=chooser></div>
</div>
}
footer

View File

@@ -0,0 +1,43 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
cgi_input
#cgi_dump
puts "Content-Type: text/html"
puts ""
set root [cgi_get dir]
set files [lsort [readdir -nocomplain $root]]
puts "<ul class=jqueryFileTree class=hidden>"
foreach dir $files {
set path "$root/$dir"
regsub -all -- {\/+} $path "/" path
if {![file isdirectory $path]} continue
puts -nonewline "<li class=\"directory collapsed\"><a href=# rel=\""
puts -nonewline [cgi_quote_html $path]
puts "\">[cgi_quote_html $dir]</a></li>"
}
foreach file $files {
set path "$root/$file"
regsub -all -- {\/+} $path "/" path
if {[file isdirectory $path]} continue
set ext [file extension $file]
puts -nonewline "<li class=\"file"
if {[string length $ext]} {
puts -nonewline " ext_[string range $ext 1 end]"
}
puts -nonewline "\">"
puts -nonewline "<a href=# rel=\"[cgi_quote_html $path]\">"
puts -nonewline [cgi_quote_html $file]
puts "</a></li>"
}
puts "</ul>"

32
var/mongoose/html/edit/get.jim Executable file
View File

@@ -0,0 +1,32 @@
#!/mod/bin/jimsh
package require cgi
source /mod/var/mongoose/lib/setup
require chunked pretty_size
cgi_input
#cgi_dump
set file [cgi_get file "/tmp/hosts"]
if {$file eq "-"} { exit }
start_chunked "text/plain"
if {![file exists $file]} {
chunk ">>> File $file does not exist.\r\n"
} else {
set type [exec /mod/bin/file --brief --mime-type --dereference $file]
if {![string match {text/*} $type]} {
chunk ">>> File $file is not a plain file ($type)"
} elseif {[file size $file] > 102400} {
chunk ">>> File $file is too large."
chunk ">>> [pretty_size [file size $file]]"
} else {
set fp [open $file r]
chunk [read $fp]
close $fp
}
}
end_chunked

23
var/mongoose/html/edit/put.jim Executable file
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,107 @@
$(function() {
var file = null;
var changed = false;
$('button').button();
$('button.editactive').disable();
$('#editor').tabsupport().disable();
function loadfile(f)
{
if (!f)
f = file;
$('button.editactive').disable();
$('#editor').disable().val('');
$('#msg').text('Loading ' + f);
$.get('get.jim?file=' + encodeURIComponent(f), function(data) {
if (data.match('^>>>'))
{
$('#msg').text(data);
file = null;
changed = false;
}
else
{
$('#editor').val(data).enable();
$('button.editactive').enable();
$('#msg').html('Editing <i>' + f + '</i>');
file = f;
changed = false;
}
});
}
function result(msg)
{
$('#result')
.html(msg)
.slideDown('slow')
.delay(5000)
.slideUp('slow');
}
$('#chooser').fileTree({
root: '/',
script: 'files.jim',
multiFolder: false
}, function(file) {
$('#chooserd').dialog('close');
loadfile(file);
});
$('#chooserd').dialog({
title: "Choose File to Edit",
modal: true, autoOpen: false,
height: '500', width: '600',
draggable: true, resizable: true,
closeOnEscape: true,
buttons: {
"Cancel" : function() {$(this).dialog('close');}
}
});
$('#open').click(function() {
$('#chooserd').dialog('open');
});
$('#editor').change(function() {
changed = true;
});
$('#save').click(function() {
if (!changed)
{
result('No changes to save.');
return;
}
if (!confirm('Save file?'))
return;
$.post('put.jim', {
'file': file,
'data': $('#editor').val()
}, function(data) {
result(data);
});
});
$('#revert').click(function() {
if (!changed)
{
result('No changes to revert.');
return;
}
if (!confirm('Discard changes and re-load file?'))
return;
loadfile();
});
$('#back').click(function() {
window.location = '/diag/diag.jim';
});
});

View File

@@ -0,0 +1,24 @@
textarea
{
background: white;
color: black;
}
#filename
{
font-style: italic;
}
.loading
{
font-style: italic;
color: #aaa;
background: white;
}
#chooser
{
border: solid 1px #bbb;
padding: 5px;
}

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: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

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