Compare commits
282 Commits
0.6.6
...
0.7.0Alpha
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa6b8199cb | ||
|
|
f2fffd8c0a | ||
|
|
eda7d3b560 | ||
|
|
7559804cbc | ||
|
|
0630cd35d6 | ||
|
|
28554e787c | ||
|
|
965e69b378 | ||
|
|
f9c3a9441a | ||
|
|
5ece2ce844 | ||
|
|
20c857dc31 | ||
|
|
2a5ec5a65d | ||
|
|
6654f75699 | ||
|
|
14d52a4ae7 | ||
|
|
b07214b706 | ||
|
|
a929d9d8ce | ||
|
|
386601ccdd | ||
|
|
75677d88cf | ||
|
|
1e8d51d921 | ||
|
|
9dadef60e7 | ||
|
|
edb39c34b7 | ||
|
|
be96f029a2 | ||
|
|
e741a6644a | ||
|
|
55e60a3e8e | ||
|
|
75e8381924 | ||
|
|
bf3a1b8d43 | ||
|
|
4c5e8a57c5 | ||
|
|
7c5e9b7874 | ||
|
|
1f35bc58e1 | ||
|
|
da105ba12f | ||
|
|
fa0474611d | ||
|
|
610c2c7f0f | ||
|
|
643f20048b | ||
|
|
6dc59f0d9a | ||
|
|
30cbe48f10 | ||
|
|
dc6f8a19e3 | ||
|
|
1da2c73ce0 | ||
|
|
15537de378 | ||
|
|
c72ecf0373 | ||
|
|
2b6adc90c9 | ||
|
|
5878ac81d7 | ||
|
|
92f12911ea | ||
|
|
5863ec6878 | ||
|
|
aeb83d3c93 | ||
|
|
6571788800 | ||
|
|
c335371b77 | ||
|
|
9f534f788f | ||
|
|
bf6b2c3809 | ||
|
|
ab00c54270 | ||
|
|
6932ccbfcd | ||
|
|
dd07dd44ba | ||
|
|
81ad6c1b05 | ||
|
|
4aa902429e | ||
|
|
8a683e4ef0 | ||
|
|
9046658d0f | ||
|
|
4c259d8d2b | ||
|
|
05ab19b5a6 | ||
|
|
9fb74616e8 | ||
|
|
eea2dab3a8 | ||
|
|
a133bb28cd | ||
|
|
b7cda43d36 | ||
|
|
3bee9b3ec0 | ||
|
|
6281684c46 | ||
|
|
41bc05a108 | ||
|
|
da2c0d5539 | ||
|
|
ac1c77d862 | ||
|
|
eccece6799 | ||
|
|
7dd5c03f64 | ||
|
|
406e155284 | ||
|
|
63069407b8 | ||
|
|
1314219d78 | ||
|
|
c602eadfa8 | ||
|
|
ea28b7023f | ||
|
|
c5580f8de4 | ||
|
|
c6b361950e | ||
|
|
4a12acc82c | ||
|
|
a1594f4915 | ||
|
|
be96a611af | ||
|
|
2104f3cb81 | ||
|
|
6761338dfe | ||
|
|
08966da22d | ||
|
|
d497ab0232 | ||
|
|
ff371e1328 | ||
|
|
0a0a8aae4b | ||
|
|
b98ef1817c | ||
|
|
e9f2abd954 | ||
|
|
2a7117d324 | ||
|
|
816850f211 | ||
|
|
45d14f92e5 | ||
|
|
9fa1840c31 | ||
|
|
47854f491b | ||
|
|
bd94148648 | ||
|
|
a54df8f2be | ||
|
|
3563b6450b | ||
|
|
5bb995f601 | ||
|
|
649ca5ad9a | ||
|
|
fed1c16524 | ||
|
|
e9a6f4b9bc | ||
|
|
8bb6d676ef | ||
|
|
8b3954d31b | ||
|
|
fa7ef0fc65 | ||
|
|
b9f42f689e | ||
|
|
9f85063eb3 | ||
|
|
f5a0ba59e5 | ||
|
|
8f553199a4 | ||
|
|
c9347eece8 | ||
|
|
b94c3ede4a | ||
|
|
0fafbd6f2e | ||
|
|
db8f9b5f8c | ||
|
|
76449721b1 | ||
|
|
bb29eb9dbc | ||
|
|
15a66b1f28 | ||
|
|
722c523893 | ||
|
|
9f553fd61f | ||
|
|
b16b625c7c | ||
|
|
dd7335c257 | ||
|
|
e6cb6d0171 | ||
|
|
af54add471 | ||
|
|
f812e9f6e6 | ||
|
|
96e1b81179 | ||
|
|
8b2bcc8d10 | ||
|
|
140cb53485 | ||
|
|
975bbbdbcd | ||
|
|
fe6d4f3673 | ||
|
|
095f3576c4 | ||
|
|
753ed1c846 | ||
|
|
ab80e2b15b | ||
|
|
11b5d2e998 | ||
|
|
3568d067be | ||
|
|
f85f5bf317 | ||
|
|
3f772b3ba7 | ||
|
|
293882b2bb | ||
|
|
103f71fa01 | ||
|
|
f30b5b1063 | ||
|
|
ae6deed7cd | ||
|
|
eaa1efb910 | ||
|
|
c5b7e021cd | ||
|
|
7b3c400124 | ||
|
|
6e31d55941 | ||
|
|
7ae2396167 | ||
|
|
d6bb30c84b | ||
|
|
9ffb2c2438 | ||
|
|
c0a12d5a11 | ||
|
|
ed720fffec | ||
|
|
a7e0cffe0f | ||
|
|
cf6eca6789 | ||
|
|
d5e60bf250 | ||
|
|
93f0f6f08c | ||
|
|
7ef486c44e | ||
|
|
36704e4ad6 | ||
|
|
c735e1da89 | ||
|
|
2ae38c8c04 | ||
|
|
9b79188526 | ||
|
|
d792ef30f9 | ||
|
|
60e1569016 | ||
|
|
de8ba245e9 | ||
|
|
1f125ca0fc | ||
|
|
bb30a5600a | ||
|
|
0229335c15 | ||
|
|
d3d16da3f0 | ||
|
|
4b959da7d2 | ||
|
|
eae8f65e15 | ||
|
|
816ea12993 | ||
|
|
7d186e4585 | ||
|
|
b128f4fa89 | ||
|
|
7c7cb84fd1 | ||
|
|
d3b2fba6a1 | ||
|
|
330b836e08 | ||
|
|
a7defa37bf | ||
|
|
a7724069b5 | ||
|
|
e4bba37ccb | ||
|
|
28aff1e8f3 | ||
|
|
8c060dbd44 | ||
|
|
c2ade817e7 | ||
|
|
681c466a18 | ||
|
|
d328762cd3 | ||
|
|
7299b61244 | ||
|
|
361c7dd51e | ||
|
|
cb2922a805 | ||
|
|
17e33def2e | ||
|
|
d817af8897 | ||
|
|
2904075724 | ||
|
|
730c2ec631 | ||
|
|
8b45af529a | ||
|
|
fbb5bc608c | ||
|
|
87bfcd4fb4 | ||
|
|
0fb45ba563 | ||
|
|
2eb62bf8c9 | ||
|
|
4f87b33df7 | ||
|
|
97de9cb93e | ||
|
|
72cfd48135 | ||
|
|
a886253bea | ||
|
|
d6363252ea | ||
|
|
d2c4f316c7 | ||
|
|
cdec953d96 | ||
|
|
0bc0d4b0e8 | ||
|
|
ec0555a86f | ||
|
|
e89ad70701 | ||
|
|
95c8440c36 | ||
|
|
a814b45851 | ||
|
|
0730f86304 | ||
|
|
84029045ba | ||
|
|
37cd87f3f4 | ||
|
|
b362ae3d8a | ||
|
|
a39cfa485b | ||
|
|
b4ae208943 | ||
|
|
45369fb5b2 | ||
|
|
713993140f | ||
|
|
57476ef7b7 | ||
|
|
176e6b6afd | ||
|
|
5ecbf795af | ||
|
|
42b1202b06 | ||
|
|
37acad6ec7 | ||
|
|
74d90b8361 | ||
|
|
952682d557 | ||
|
|
c1f3e44fb8 | ||
|
|
fa2a6c673c | ||
|
|
b46ae4782d | ||
|
|
6ebbc81792 | ||
|
|
1d7170f193 | ||
|
|
3dea948ecc | ||
|
|
1e960ae2e9 | ||
|
|
e6b21f1ca5 | ||
|
|
ebd3cbd932 | ||
|
|
b8fb5cbfbf | ||
|
|
01494bd010 | ||
|
|
dd95becdff | ||
|
|
8d532a75ee | ||
|
|
27ac80c154 | ||
|
|
15058c37b3 | ||
|
|
6b85bf0a49 | ||
|
|
2b24ec2ece | ||
|
|
d99369d4f0 | ||
|
|
f85ec9007c | ||
|
|
f89ca6b390 | ||
|
|
6571ba90ca | ||
|
|
a638d182ab | ||
|
|
d5caeddb30 | ||
|
|
d818020915 | ||
|
|
9a0c8aa660 | ||
|
|
dd4918b6d8 | ||
|
|
11f7260b40 | ||
|
|
052746e16f | ||
|
|
c03921ad55 | ||
|
|
b0cd07dfc0 | ||
|
|
7e635e1f3d | ||
|
|
c5d675ac88 | ||
|
|
94b3629fa5 | ||
|
|
0956915d33 | ||
|
|
5e3cd8d77b | ||
|
|
53aed799a1 | ||
|
|
3a95707d79 | ||
|
|
c59a7a91a9 | ||
|
|
cdc086f2db | ||
|
|
6dd4c0551e | ||
|
|
8225dae182 | ||
|
|
9999065f0a | ||
|
|
90d11ada6b | ||
|
|
67a1ee3cde | ||
|
|
0f8df0f072 | ||
|
|
9c9936e7ae | ||
|
|
92926a4825 | ||
|
|
92ac787315 | ||
|
|
2cc53e8dc3 | ||
|
|
18cb5710f9 | ||
|
|
11b8f23528 | ||
|
|
cf72abedfd | ||
|
|
31f92ebdd5 | ||
|
|
39a6635229 | ||
|
|
a87a70d9c6 | ||
|
|
2d79e2ac92 | ||
|
|
7982ef2f11 | ||
|
|
9280daad41 | ||
|
|
e22709b5ff | ||
|
|
ed37330fee | ||
|
|
f1fb3f904b | ||
|
|
a3b6bb9ad9 | ||
|
|
54e6431d11 | ||
|
|
3e6f46483c | ||
|
|
f7aadb1b61 | ||
|
|
c7d5ea6ecd | ||
|
|
1060f15463 | ||
|
|
559d3064a9 |
15
.bzreol
@@ -1,15 +0,0 @@
|
||||
[LF]
|
||||
.bzreol
|
||||
.bzrignore
|
||||
*.py
|
||||
*.tmpl
|
||||
*.js
|
||||
*.css
|
||||
*.txt
|
||||
*.po
|
||||
*.pot
|
||||
*.sh
|
||||
[CRLF]
|
||||
*.bat
|
||||
*.cmd
|
||||
*.nsi
|
||||
10
.bzrignore
@@ -1,10 +0,0 @@
|
||||
*.pyc
|
||||
*.pyo
|
||||
build
|
||||
dist
|
||||
locale
|
||||
srcdist
|
||||
cherrypy
|
||||
*.wpr
|
||||
*.keep
|
||||
*.bak
|
||||
13
.bzrtab
@@ -1,13 +0,0 @@
|
||||
[NOTAB]
|
||||
*.py
|
||||
*.txt
|
||||
*.po
|
||||
*.pot
|
||||
*.sh
|
||||
*.bat
|
||||
*.cmd
|
||||
*.nsi
|
||||
*.tmpl
|
||||
*.js
|
||||
*.css
|
||||
[TAB]
|
||||
28
.gitignore
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
#Compiled python
|
||||
*.py[co]
|
||||
|
||||
# Working folders for Win build
|
||||
build/
|
||||
dist/
|
||||
locale/
|
||||
srcdist/
|
||||
|
||||
# Generated email templates
|
||||
email/
|
||||
|
||||
# Romanian ro.po is generated from ro.px, due to mapping to latin-1
|
||||
po/*/ro.po
|
||||
|
||||
# Build results
|
||||
SABnzbd*.zip
|
||||
SABnzbd*.exe
|
||||
SABnzbd*.gz
|
||||
SABnzbd*.dmg
|
||||
|
||||
# WingIDE project file
|
||||
*.wpr
|
||||
|
||||
# General junk
|
||||
*.keep
|
||||
*.bak
|
||||
*.log
|
||||
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "interfaces/Config"]
|
||||
path = interfaces/Config
|
||||
url = https://github.com/thezoggy/sabnzbd-uni_Config.git
|
||||
13
ABOUT.txt
@@ -1,5 +1,5 @@
|
||||
*******************************************
|
||||
*** This is SABnzbd 0.6.6 ***
|
||||
*** This is SABnzbd 0.7.0 ***
|
||||
*******************************************
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
It simplifies the process of downloading from Usenet dramatically,
|
||||
@@ -12,8 +12,8 @@ and offers a complete API for third-party applications to hook into.
|
||||
There is an extensive Wiki on the use of SABnzbd.
|
||||
http://wiki.sabnzbd.org/
|
||||
|
||||
IMPORTANT INFORMATION about release 0.6.0:
|
||||
http://wiki.sabnzbd.org/introducing-0-6-0
|
||||
IMPORTANT INFORMATION about release 0.7.0:
|
||||
http://wiki.sabnzbd.org/introducing-0-7-0
|
||||
|
||||
|
||||
Please also read the file "ISSUES.txt"
|
||||
@@ -54,10 +54,3 @@ an nzb backup folder, or temporarily go back to 0.4.x until your queue is comple
|
||||
|
||||
The history is now stored in a better format meaning future upgrades should be backwards
|
||||
compatible.
|
||||
|
||||
|
||||
*******************************************
|
||||
*** Changes since 0.5.6 ***
|
||||
*******************************************
|
||||
|
||||
See: http://wiki.sabnzbd.org/introducing-0-6-0
|
||||
|
||||
817
CHANGELOG.txt
@@ -1,786 +1,33 @@
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.6Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Prevent crashes when running into disk-full situations.
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.6RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- When "Download only" is used, do not send downloaded NZB files to the queue
|
||||
- Fix bad links coming from nzbclub.com
|
||||
- A job sometimes fails verification when the option "don't download samples" is used.
|
||||
Now this option will be ignored when you click "Retry" in the history.
|
||||
- File an error message when the RSS-email template is missing.
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.6Beta2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix sending of duplicate emails when using a list of recipients
|
||||
- Fix handle leakage on Windows
|
||||
- On OSX, SABnzbd didn't handle "Open With" of nzb.gz files properly
|
||||
- Limit the amount of retries when getting a partial NZB from an index site
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.6Beta1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Compatible with OSX Lion
|
||||
- End-of-queue action now ignores paused items in the queue
|
||||
- Fetching extra par2 files now obeys pause too
|
||||
- Extension-based cleanup now also cleans sub-folders
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.5Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Since 0.6.3, all end-of-queue actions failed.
|
||||
- Generic sort: failed to recognize years surounded by underscores.
|
||||
- When running the Wizard in German, the last page crashed.
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.4Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix silly error in the Wizard
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.3Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Save bookmark memory file right after reading newzbin's bookmarks
|
||||
- Add new command line option --new to force new SABnzbd instance
|
||||
- Plush: add "missing articles" to queue entry hover-over popup
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.3RC3 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Regression error: paused duplicates did not end in the queue
|
||||
- Better support for standby and hibernate on Linux
|
||||
- Remove the delay when items go from the download queue to History
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.3RC2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- On OSX, the top menu sometimes uses the wrong URL to start the browser
|
||||
- API: jsonp-callback now also supported in error responses
|
||||
- When a job is individually pause, save admin immediately
|
||||
- Sorting: support %fn parameter in folder names
|
||||
- Allow a server definition with a non-resolving name to be disabled.
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.3RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Move option "Check unpack results" to Config->Switches
|
||||
You may want to set this on because the default was off.
|
||||
- Automatic redirection when addressing the HTTPS port using the HTTP url.
|
||||
- Option to store the files of all jobs in a single category folder
|
||||
(enable this by appending a '*' to the storage path)
|
||||
- The smpl skin failed to save the attributes of the default category
|
||||
- Replace double quote characters in job folder names (to avoid Samba issues)
|
||||
- When using the download button in an RSS overview, the title wasn't used as job name
|
||||
- Another attempt to fix the NZB-association problem on Windows 7 with HTTPS
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.2Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed association of NZB files with SABnzbd, when using HTTPS-only on Windows Vista/7
|
||||
(resulted in multiple running copies of SABnzbd instead of an NZB upload)
|
||||
- Fixed incorrect email date header when using other language than English
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.1Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed association of NZB files with SABnzbd (for real this time).
|
||||
(resulted in multiple running copies of SABnzbd instead of an NZB upload)
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.1RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed association of NZB files with SABnzbd
|
||||
(resulted in multiple running copies of SABnzbd instead of an NZB upload)
|
||||
- Fixed display of warning when upgrading from 0.4.x
|
||||
- Fixed problem when entering NZB files with names containing accented characters
|
||||
(happened only on OSX with Firefox 4)
|
||||
- Fixed several textual issues
|
||||
- Add PID file support for OSX/Unix (--pid <path>)
|
||||
- Fix attribute error caused by missing category field in nzbmatrix RSS feeds
|
||||
- Fix nzbmatrix category support by just reading the whole "Description" field.
|
||||
- Pause downloader when downloaded file cannot be written to disk.
|
||||
- Fix "~/" (home-dir) support for Unix/OSX and disable for Windows
|
||||
- Add Romanian translation
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix handling of semicolon in parameters for user scripts.
|
||||
- Fix attribute handling of 'addlocalfile' API.
|
||||
- Fixed broken Mobile skin
|
||||
- Prevent loss of sabnzbd.ini when disk is full
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0RC4 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed History in Classic skin
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0RC3 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed History paging with regards to queued jobs
|
||||
- Changing category in the queue failed to change to the PP setting.
|
||||
- Add support for categories in RSS feeds from nzb.su
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0RC2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Category returned by pre-queue script wasn't handled properly
|
||||
- Stop warning about duplicate articles in an NZB, just summarize after download
|
||||
- Speed-up the generation of RSS filter/preview page
|
||||
- "paused" priority at the RSS feed-level wasn't handled properly
|
||||
- Plush: fix some display issues
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix hangup during scheduled restart.
|
||||
- OSX: Launch browser from menu bar with HTTPS when only HTTPS is available.
|
||||
- Fix problem that caused SABnzbd always to startup in paused state.
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Beta5 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Plush: added TopMenu-toggle and show warning-line only when needed
|
||||
- Plush: added "Now" menu entries for bookmarks, RSS and watched folder
|
||||
- Fix failing scheduled event "pause-postprocessing"
|
||||
- Improve handling of nzbmatrix waiting times
|
||||
- Fix sub-optimal handling of password tries on encrypted rar files
|
||||
- Allow "Default" category to be picked for all Sort functions
|
||||
- Fix server test function
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Beta4 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Unix/OSX: fixed download hangup when having non-responding servers
|
||||
- Fixed paging problem in Plush
|
||||
- Plush now uses full window width
|
||||
- New server could be not added in "disabled" mode
|
||||
- Prevent a discarded duplicate job from showing up as an orphan
|
||||
- Fixed disabled default script in Plush
|
||||
- Emails to multiple recipients are now sent per recipient
|
||||
allowing more flexibility in email templates.
|
||||
- Moved "email test" button to Config->Email
|
||||
- Plush cookies renamed to prevent interference by older versions
|
||||
- Stop "growl"-ing all queued jobs at startup (OSX)
|
||||
- Unix/OSX: prevent queue lockup when server connect times out
|
||||
- Fix problem with setting a scheduled server action
|
||||
- The API should give the same byte totals as the UI
|
||||
- Move email test to Config->Email
|
||||
- Fix loss of PP settings when retrying
|
||||
- When re-evaluating RSS entries, use original RSS categories
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Beta3 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed odd post-processing after upgrade
|
||||
- Fixed "Send Group" option
|
||||
- Fixed incorrect error handling for nzbmatrix unbookmarking
|
||||
- Remove "unknown decoding" message for files without any downloaded articles
|
||||
- Unstarted jobs inherited after upgrade would not download properly
|
||||
- Fix failing server test after change of server address
|
||||
- Add "Read all feeds now" button (will read and process all enabled feeds)
|
||||
- Add 'nzb_key' for "add nzb"-only API access
|
||||
- Prevent crash when incorrect host address triggers unexpected error code
|
||||
- Interpret 0-sized NZB files from nzbmatrix as "not found" (and don't retry forever)
|
||||
- Three way option for duplicate detection (off/ignore/pause)
|
||||
- Plush: lots of styling, navigation and browser compatibility fixes
|
||||
- Windows installer will now add a "Safe" entry to the Start menu
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Beta2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix problem in smpl skin's RSS download buttons
|
||||
- Fix paging and flag display in Wizard
|
||||
- Add clear-downloaded jobs in RSS
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Beta1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Text and translation fixes
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha13 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Duplicate NZBs will not be rejected but entered the queue
|
||||
as "paused" and flagged. Manual resuming will start the download anyway.
|
||||
- Add INI-only option to ignore unrar timestamps
|
||||
- More Plush touch-ups
|
||||
- Translation updates
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha12 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Delete from History did not always work
|
||||
- "Add server" dialog was broken
|
||||
- Add confirmation dialog to deleting from RSS feed table
|
||||
- Improve Queue and History deletion and purge in Plush
|
||||
- Cosmetic improvements to Plush
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha11 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Plush tweaks
|
||||
- Failed URL-based NZB fetches were not moved to History but became dead queue entries
|
||||
- Empty NZB files are now refused
|
||||
- Make some hard-coded texts in Plush translatable
|
||||
- Encrypted rar files without available password were not reported properly
|
||||
- Remove race condition which could cause crash of URL-based NZB fetches
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha10 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed issue in email that prevented HTML emails templates from working
|
||||
- Identical host:port combos are allowed for Usenet servers now
|
||||
- After auto-pause om encrypted files don't stop again after the user resumes
|
||||
- In RSS feeds give the feed-level category priority over the trackers's derived category
|
||||
- Add API handlers for new [rss] and [categories] entries.
|
||||
- Fix incorrect handling of End-Of-Queue script when NICE or IONICE parameters have been set
|
||||
- Filter hidden files and folders from script pick list
|
||||
- Make "folder_check" accessible from the UI
|
||||
- End-of-queue action could be be cleared properly from the INI file
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha9 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Plush top menu and navigation improvements
|
||||
- Active jobs sometimes showed up as orphaned jobs
|
||||
- Post processing retries in SMPL skin (not fully funtional)
|
||||
- Apply category attributes to RSS feed jobs correctly
|
||||
- Drop support for Python 2.4
|
||||
- Add json-p support by support 'callback' parameter in API
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha8 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Prevent active and waiting post-processing jobs from showing up
|
||||
in the orphans list.
|
||||
- Simplified Wizard (No skin selection, Usenet server first)
|
||||
- Accept non-alphanumerical characters in {{category}}name.nzb
|
||||
- Add priority support to RSS feeds
|
||||
- Add 'paused' as an extra priority in RSS feeds
|
||||
- Add %dn to Series terms (original job name)
|
||||
- Add hidden option "never_repair".
|
||||
- The Windows version writes its API URL to the registry
|
||||
- Colons were removed from folder names
|
||||
- Fix crash when an RSS feed had no filters
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha7 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Post-processing would crash on empty category folder
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha6 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Features:
|
||||
- Plush now has tabbed Config pages
|
||||
- Add retention time parameter to servers so that articles too old will not be tried
|
||||
- Disable top_only option (interferes with "retention" implementation)
|
||||
- Option to automatically remove nzbmatrix bookmark after successful download
|
||||
Bugs:
|
||||
- Prevent blocking of RSS preview by automatic RSS read-out
|
||||
- Windows binary had issues with sending non-english emails
|
||||
- Explicit RSS filter attributes (category, script, pp) influenced each other
|
||||
within a feed definition
|
||||
- rss_scan is now a scheduable event and will override the rss_rate option.
|
||||
- Improve handling of colon characters in filenames (compensating for par2 issues)
|
||||
- NZBs would be left behind, despite ".nzb" being in the cleanup-list
|
||||
- When only individually paused jobs are in the queue, unpausing them
|
||||
would not always resume downloading
|
||||
- Use nzbmatrix.com's new V1.1 api.
|
||||
- Sanitize nzbname parameter coming from API calls (led to problems with some
|
||||
third-party utilities)
|
||||
- NZB-chaining should ignore the duplicate NZB check and fix cleanup
|
||||
of "complete" folder after NZB-chaining.
|
||||
- Plush did not save end-of-queue action.
|
||||
- Zipped NZB files from URLs were not accepted.
|
||||
- OSX: The end-of-queue action "Hibernate" shut down the system.
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha5 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Plush now has multi operations for the queue
|
||||
- You can now see any orphaned folders in "temporary download folder"
|
||||
and choose to delete or to re-add to the queue (Classic: Config-Main, others: Connections)
|
||||
(This replaces the "Scan" button, which was a blunt instrument)
|
||||
- There is now Default category, which provides attributes for all "Default" settings.
|
||||
The default PP, script and priority in Config->Switches are therefor removed.
|
||||
- nzbmatrix bookmarks are removed after successful download/post-processing
|
||||
(If you really don't want that, use the INI-only 'del_bookmark' option)
|
||||
- NZB chaining now ignores duplicate check.
|
||||
(Chaining is automatic re-queuing of a download containing only NZB(s))
|
||||
- Improve sorting of rar files to enable streaming
|
||||
- Normally when enabling HTTPS, the HTTP port will still be active.
|
||||
Now you can choose to run HTTPS-only on the standard port.
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha4 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix crash after queue repair cycle, which prevented restart
|
||||
- end-of-queue hibernate on OSX did shutdown instead of sleep
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha3 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Season sort got confused when show title contained a dot
|
||||
- Restore newzbin support in Plush
|
||||
- Show speeds from MB and higher with one decimal
|
||||
- Restore detection of empty downloads
|
||||
- Fix crash in post-processor caused by non-plain-ASCII in user script output
|
||||
- Proper converion of 0.5.x language codes and skin names
|
||||
- A repair scan would pick up folders waiting for retry in History, creating double entries
|
||||
- Small fixes
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Proper packaging
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.0Alpha1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Redesign of the download queue allowing repairs and retries of post-processing
|
||||
- pre-queue user script
|
||||
- optional email sent when RSS sends jobs to the queue
|
||||
- Redesign of the Config-RSS pages (note: "smpl" does not work here)
|
||||
- Full Windows Service support
|
||||
- Byte counters per server and independent of History database
|
||||
- Many bugfixes
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.5RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Add Norwegian translation
|
||||
- Remove illegal characters from nzbname parameter in API calls
|
||||
- Add INI-only option "api_warnings" to enable/disable warnings
|
||||
about unauthenticated access to the API.
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.4Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Ensure that sabnzbd.ini has no group/world access (Unix, OSX)
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.4RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Support unpacking of rar-files embedded in zip-files
|
||||
- Compensate for IPV6 issues of Chrome on OSX
|
||||
- Changes in dirscan-speed are now immediately effective
|
||||
- Reduce amount of logging
|
||||
- On Windows, detect whether sqlite3.dll is missing. If so, panic and
|
||||
complain about lame virus scanner.
|
||||
- Add hidden option "queue_complete_pers" to select non-persistence of
|
||||
non-script end-of-queue actions.
|
||||
- Restrict square bracket substitution to server names
|
||||
- Add hidden option "allow_64bit_tools" to allow or prevent use of 64bit par2 and unrar.
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.3Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Embed nzbmatrix categories in SABnzbd (preventing problem in OSX)
|
||||
- Remove leading spaces in user script output display
|
||||
- Solve problems with passing filenames with '&' as parameter in user scripts
|
||||
- Allow leading empty lines in email templates
|
||||
- Prevent oversized logfile when logging fails
|
||||
- Remove double header in email (some email server choke on that)
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.3RC2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed error in 101 season/episode handling (prevent years like 2010 from matching)
|
||||
- Fixed error in saving some email options
|
||||
- Accept ".nzb.gz" files coming from an URL fetch.
|
||||
- Make sysload support for Linux more universal
|
||||
- Restore newzbin support in UI
|
||||
- RSS feeds are now listed in alphabetic order
|
||||
- Fixed error handling & in names sent to post-processing script (Windows)
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.3RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Support of nzbmatrix categories
|
||||
- Support of X-DNZB headers for all indexing sites (allows categories for nzbs.org)
|
||||
- Support 101 season/episode notation
|
||||
- Use all text after the season/episode element as episode name (don't require '-')
|
||||
- Support of categories in RSS feeds
|
||||
(only for compatible feeds, like nzbmatrix.com and nzbs.org)
|
||||
- Accumulate all groups from an NZB (for category matching)
|
||||
- After reducing connections SABnzbd should retry full amount 10 min later
|
||||
This event was sometimes missed
|
||||
- Recursive unpack of archives should be done in nested folders instead of base folder
|
||||
- Sort strings with an absolute path were not handled properly
|
||||
- Restore compatibility with Python 2.4
|
||||
- Several fixes to improve robustness of NZB retrieval from indexers
|
||||
- Solved crash in NZB retrieval from indexers when explicit PP value was set
|
||||
- Remove newzbin features from UI
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.2 Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- API: &nzbname= was ignored for some sites
|
||||
- API: Server rename did not work properly
|
||||
- Remember end-of-queue action for next end-of-queue
|
||||
- Some updates to Danish
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.2 RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fixed: Large queue caused very slow UI and high memory usage
|
||||
- Fixed: Some very large rar sets failed to unpack
|
||||
- Fixed: garbled emails were sent
|
||||
- Python user scripts now run properly on OSX
|
||||
- Fixed: SeasonSort could produce trailing spaces, which fail on Windows
|
||||
- Fixed: unpacking errors not properly reported to user script
|
||||
- Keep trying when receiving garbage from nzbmatrix.com
|
||||
- Add total-size fields to API-call History.
|
||||
- Auto-search for free port when specified port is occupied
|
||||
- Improve reporting of newzbin errors
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.1 Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix accented character problems in emails
|
||||
- Warn when user doesn't have permission to use a web port (Linux/OSX)
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.1 RC2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Accept comma-separated email address in "email_to" option.
|
||||
- Allow manual retry of URL-based NZB fetches when a bad NZB is received
|
||||
- Add INI-file option "size_limit" that sets any oversized job
|
||||
to paused and low priority.
|
||||
- Added French translation of email template
|
||||
- Add Danish translation
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.1 RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Add 'size_limit' option. Any job bigger than this limit will be set to
|
||||
low priority and be paused.
|
||||
- TV Season sort now has "affected categories" too. Check your settings!!
|
||||
- Fixed problems that could lead to an infinite unpacking loop
|
||||
(when using a "sick" NZB and using +U instead of +D postprocessing)
|
||||
- Duplicate title checking in RSS is now done across all feeds
|
||||
- Fixed issues with accented characters in NZB names when using RSS
|
||||
- Fixed issues with accented characters in category folder names when using RSS
|
||||
- Plush: fix nzo range selection when clicking checkboxes
|
||||
- When detecting an unsupported unrar on Posix systems, drop unsupported features
|
||||
(This may lead to files being lost when duplicate names exist.)
|
||||
- Sorting examples were sometimes wrong
|
||||
- Sorting couldn't handle some pattern combinations
|
||||
- Fixed priority handling for RSS feeds and newzbin bookmarks
|
||||
- Fixed crash occuring when user profile contains characters outside ISO-8859-1
|
||||
- Allow nzb-backup folder field to be cleared
|
||||
- When using only manual newzbin bookmark reading, allow automatic un-bookmarking
|
||||
- Fixed several translation errors and omissions
|
||||
- Keep Windows awake during post-processing of last job (while queue is already empty)
|
||||
- Make it possible to run Python user scripts on OSX
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Relabeled to 0.5.0
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC8 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Add par2_multicore option to Config->Switches
|
||||
- Windows/OSX: Replaced OpenSSL libraries
|
||||
- Windows: Replaced par2-multicore by new version
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC7 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- When priority of newzbin or RSS job comes from the category, it wasn't effective.
|
||||
- When unpacked file and directly download file have the same name,
|
||||
the latter got lost
|
||||
- Make nzbmatrix error handling robust
|
||||
- When apikey is present in API call, do not require username/password
|
||||
- Windows installer is now multi-language too
|
||||
- Windows installer warns about queue when upgrading from 0.4.x
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC6 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Changes:
|
||||
- Add INI-only option "par2_multicore" to enable/disable par2-multicore
|
||||
Fixes:
|
||||
- Prevent crash in RSS due to odd characters
|
||||
- Prevent deadlock in downloader when server is blocked
|
||||
- Unrar option -ai should only be used on Windows
|
||||
- Prevent deletion of par files of other sets in multi-set NZBs
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC5 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- Incorrect job rename in SMPL skin on Windows
|
||||
- INI-only option "no_penalties" to limit timeout penalties for
|
||||
non-optional servers to 1 minute
|
||||
- HTTPS certificate paths should default to admin_dir directive
|
||||
- The second parameter of the user script should be the original NZB file name,
|
||||
even when the job has been renamed.
|
||||
- Show clear error message when RSS feed preview or force-download fails.
|
||||
- Don't warn about RSS reading problems when a scheduled scan is done.
|
||||
- Ignore empty "username" and "apikey" parameters in nzbmatrix.com URLs
|
||||
and add stored values.
|
||||
- Suppress authentication warning for API call "get_scripts".
|
||||
It's used by some external utilities to determine if username/password is required.
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC4 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- Ignore read-only attributes of files in a RAR archive
|
||||
- Remove potential crash on OSX when handling corrupt par2 file
|
||||
- Enable manual unblocking of permantly blocked servers
|
||||
- Retry permanently blocked servers after 30 minutes (compensate for shoddy servers)
|
||||
- INI-only option "folder_length_max" for trimming folder name size
|
||||
(default 128 for Windows, for others 256)
|
||||
- Give unrar preference over rar when both installed on a Posix system
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC3 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- Avoid potential crash when server closes connection
|
||||
- On Connections Page: show original error message sent by server
|
||||
- Make sure unrar check isn't done for OSX
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- Increase timeout for nzb fetches from URLs to 60 sec
|
||||
- Duplicate title checking in RSS is now case-insensitive
|
||||
- Only warn about presense of old queue when no new queue is present yet
|
||||
- Don't warn when a supported RAR (instead of UNRAR) program is present
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- Fix broken server test in Wizard and Config->Servers
|
||||
- Add tbbmalloc.dll to par2 program (prevents problems when you have
|
||||
another version of that file on your system)
|
||||
- Fix uneven download speed of very large NZBs
|
||||
- Include special par2 variant for OSX 10.6+ (automatically selected)
|
||||
- Fix problem with the script folder path containing a space
|
||||
- Fix disabling of RSS feeds when changing settings
|
||||
- When forcing disconnect don't try to send "Quit" to a non-responding server
|
||||
- Warn user (once) about presence of old queue file
|
||||
- Updated German texts
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Beta6 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- Solve problems with unwilling servers and "random" server time-outs.
|
||||
- Do not generate warnings for intermittent server problems.
|
||||
- Joinable rar-sets were not always properly joined.
|
||||
- Fixed timing problems when SABnzbd is running behind an Apache server
|
||||
- Don't report failed default permissions setting when the user has set none
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Beta5 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
- Removed potential deadlock from Downloader
|
||||
- Allow backup servers to be used when all primaries blocked or inactive
|
||||
- Scheduled PAUSE_ALL failed to stop downloading
|
||||
- Will now continue unpacking other rar-sets when one rar-set fails to unpack
|
||||
(but only when option "Post-process Verified jobs" is off)
|
||||
- QuickPar messed up the par files of multi-set NZBs
|
||||
- When the par2 tool joined multi-part files of a multi-NZB, it mixed up files
|
||||
from other sets
|
||||
- Work-around for a bug in par2-tbb (making if fail to join some multi-part jobs).
|
||||
- When scaling down the number of connections of a server,
|
||||
will now retry with the full amount 10 minutes later.
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Beta4 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
* Fixed poor reliability of reading RSS feeds and subsequent NZB fetches
|
||||
(caused by a too short time-out value).
|
||||
* Posix: when user has not set a permissions value, use the account's
|
||||
default permissions (prevents problems with permissions coming from rar files)
|
||||
* When option "Post-process only verified jobs" is set, do not execute
|
||||
user-script when job fails
|
||||
* NZB files read in from categorized watched folder did not inherit
|
||||
the category's priority
|
||||
* Fixed error reporting about incorrect NZB file
|
||||
* Improved year recognition in tvsort
|
||||
* Some skin fixes
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Beta3 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes:
|
||||
* Solved problems with adding NZB by URL (also through RSS)
|
||||
* Proper display of download speed in OSX menu
|
||||
* Fixed compatibility of Plush and IE8
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Beta2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Fixes
|
||||
* nzbmatrix.com support fixed (fetch NZB and Wizard settings)
|
||||
* Problems on some systems because of reading NZB-spec from newzbin
|
||||
for each NZB file
|
||||
* When an RSS feed has more than 9 filters, the order was disturbed
|
||||
* Fixed several TVSort problems including a hangup
|
||||
* Each RSS preview added jobs marked "will not be downloaded"
|
||||
instead of just the very first scan.
|
||||
* Email reporting disk-full was malformed
|
||||
* Sample detection was to eager to detect
|
||||
* Improve detection of 64bit versions of Windows Vista/7/Server2008
|
||||
* Explicit priorities in nzb upload were ignored
|
||||
* Corrections in translations
|
||||
Improvements
|
||||
* INI-only option to reduce the amount of admin saves (important for very large NZBs)
|
||||
* INI-only option to enable/disable final folder renaming (__UNPACK/__FAILED)
|
||||
* Fixed OSX uninstaller so that it will leave extra skins on the disk
|
||||
* Association of NZB files with SABnzbd for OSX
|
||||
* Retry folder renames and deletions on Windows
|
||||
* Don't save RSS admin to disk, when no feeds are active
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Beta1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Highlights
|
||||
* Multi-language UI: English, French, Dutch, German and Swedish
|
||||
* Start-up Wizard to get you going fast
|
||||
* QuickCheck : on-the-fly par2 check. When a download is correct,
|
||||
the normal par2 check is skipped
|
||||
* Configuration changes take immediate effect (except skins and some system folders)
|
||||
* Job priorities, individual job pausing, job renaming
|
||||
* Flexible server setup (scheduled on/off, optional servers)
|
||||
* The Plush and Smpl skins have been improved and are a lot faster than before
|
||||
and they have paging
|
||||
* New "Mobile" skin (replaces iPhone-skin)
|
||||
* RSS supports more sites and has generally improved
|
||||
* For Windows distribution: 64-bit par2 and unrar are used
|
||||
on 64-bit Vista/Win7/Server2008
|
||||
* Support for password protected rar-files (limited)
|
||||
* Expanded TV/Movie sorting
|
||||
More Tech stuff
|
||||
* HTTPS support for the Web-UI
|
||||
* Email templates to design your own emails (including multiple recipients)
|
||||
* Extensive API for utility developers
|
||||
* History survives a full queue/admin clean and future upgrades
|
||||
* Windows: optional association of NZB files with SABnzbd (double-click support)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha12 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Drop country names from language strings
|
||||
* Fixed crash when setting script to None
|
||||
* Add missing "Restart required" messages in Config->General in Classic and Smpl
|
||||
* When pause-download-while-pp is reset, resume downloading immediately
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha11 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Fix foreign character problems in several places
|
||||
* Add Swedish translation
|
||||
* Plush tweaks
|
||||
* Allow foreign characters in email templates
|
||||
* Prevent selection of "Mobile" skin as primary
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha10 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Fix foreign character problems in several places
|
||||
* top_only option wasn't changable on-the-fly
|
||||
* Windows uninstaller left behind some files
|
||||
* Complete the API with the del_config function
|
||||
* German translation
|
||||
* Plush tweaks
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha9 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Fixed bug in handling fetching of additional par2 files
|
||||
* Fixed nzbmatrix support properly
|
||||
* Fixed potential urlgrabber crash on startup
|
||||
* Fixed problem with NZB files containing space before ".nzb"
|
||||
* Fixed Windows Vista/7/Server2008 x64 detection
|
||||
* Allow feed:// syntax in RSS feeds
|
||||
* Restore 0.4.x compatibility for the RSS URL.
|
||||
* Even more Plush improvements
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha8 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Fixed failing RSS filters
|
||||
* Fixed nzbmatrix.com RSS support
|
||||
Note: you URL must contain username and ApiKey
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha7 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Use RSS titles for job names instead of downloaded filename.
|
||||
(This bypasses newzbin's filename mangling).
|
||||
* URL grabber will do 5 retries before giving up (and generate
|
||||
correct retry links in History).
|
||||
* RSS support for nzbserien.org (and slight improvement for nzbs.org)
|
||||
* Plush overhaul
|
||||
* "smpl" is now the preferred skin, "Default" renamed to "Classic".
|
||||
* Detect internal problems and restart SABnzbd if found
|
||||
* Enable "hibernate" and "standby" as end-of-queue actions for Linux systems
|
||||
(Will only work if supported by the kernel of your platform)
|
||||
* Update to unrar 3.90 (OSX and Windows)
|
||||
* Remove segment files after par2-based joining
|
||||
* Internationalisation of all texts in History
|
||||
* Internationalisation of email templates
|
||||
* Prevent crash when encountering a corrupt par2 file during QuickCheck
|
||||
* Added new api call: api?mode=warnings&name=clear
|
||||
* Added new api call: api?mode=translate&value=ACRONYM&output=json
|
||||
* Priorities in RSS feeds now work properly
|
||||
* Add "Require" filter type for RSS feeds
|
||||
* Add SSL type (V23, V2, V3), only needed for som odd ISP's
|
||||
* Add INI-file-only option to skip the check after unrar.
|
||||
This is to support people with consistently failing checks.
|
||||
* Passwords for encrypted RARs can be set in the job title
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha6 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Add 64bit unrar/rar 3.90 for Windows
|
||||
* "Mobile" skin (limited functionality)
|
||||
* Removed a number category-related problems
|
||||
* Scan enabled RSS feeds 15 sec after startup
|
||||
* Get newzbin bookmarks 20 sec after startup
|
||||
* Add scheduled pause-all command thats stops all disk activity
|
||||
* Improved handling of accented characters (also in par2)
|
||||
* Unrelated empty folders are no longer removed from "incomplete" folder
|
||||
* Initial runs of RSS will no longer be downloaded by "download" button
|
||||
instead thay are marked and can be downloaded individually
|
||||
* TV Sort: Fixed double brackets () naming on items with the country in the name.
|
||||
* Disable password completion by browsers on Config pages.
|
||||
* Retry links in History were incorrrect
|
||||
* Solved lots of small bugs
|
||||
* Skin improvements
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha5 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Less bugs
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha4 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Less bugs
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha3 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Session/API key system ported from 0.4.11
|
||||
* Multi-language, including Dutch and French translations
|
||||
* Less bugs
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
* Fixed failing delete-bookmark-on-newzbin feature.
|
||||
* Wizard improvements
|
||||
* Plush improvements
|
||||
* par2 for OSX replaced
|
||||
* Added penalty timeout for unresponsive servers (when flagged as "optional").
|
||||
* Fixed some incompatibilities with Python 2.4 and 2.6
|
||||
* TV sorting improved
|
||||
* Support for :: or [::] as valid hostnames. :: listens on all ipv6 addresses.
|
||||
* Allow non-conforming RSS feeds (fixes nzbmatrix.com issue)
|
||||
-------------------------------------------------------------------------------
|
||||
0.5.0Alpha1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
Core Stuff:
|
||||
* Updated Cherrypy - Among other things, this means you can now use HTTPS for the
|
||||
web ui and have a prettier login window if you use a login/pass.
|
||||
We have also dropped the need for /sabnzbd/ in the urls you use to access sabnzbd.
|
||||
It'll still work with /sabnzbd/, but it will also work without it now.
|
||||
* New XML Parser - Results in lower memory usage when reading .nzb files, especially large ones.
|
||||
* File Quick-Check - We can now skip par2 verification altogether in some cases by performing
|
||||
a quick-check of file hashes before post-processing.
|
||||
* New Quick-Start Wizard - If you don't have any servers set, you'll get a neat little
|
||||
five-page wizard allowing you to change all the config settings you really need to worry about.
|
||||
Stuff like "How should SABnzbd be accessible? Remotely or locally?" and "What's your server address",
|
||||
in a step by step manner. Features a button on the server page to test the connection to the news server,
|
||||
to make sure you have entered your details correctly.
|
||||
* Revamped Config System - The configuration backend was overhauled in 0.5.
|
||||
Many of the config pages have been changed around to make more sense,
|
||||
you can now easily enable/disable servers, and in general all server interaction is much faster than before.
|
||||
* E-mail Templates - The e-mail system from 0.4.x has been updated to have a full template system,
|
||||
allowing you to customize e-mail alerts.
|
||||
* File Association - .nzb files are now associated with SABnzbd, so you can just double click them
|
||||
to load the file into your queue. Currently only Windows is fully supported, however
|
||||
you can launch SABnzbd with arguments containing a path, or multiple paths to local nzb/rar/zip files.
|
||||
* .TS Filejoining - File joining has been improved to allow support for joining multiple .TS files into one file.
|
||||
* Date Sorting - To compliment series sorting, sorting has now been added for downloads with dates in their names,
|
||||
allowing you to place files in daily, monthly, yearly folders with proper naming
|
||||
* General Sorting - Sorting for general downloads allows users to expand the series sorting into
|
||||
other types of downloads. Has support for years in titles allowing files to be placed in folders
|
||||
depending on the decade.
|
||||
The API:
|
||||
* Totally overhauled for 0.5. Basically, you now have full access to near everything about
|
||||
SABnzbd via POST and XML/JSON. See the full docs for more details. Why does this matter?
|
||||
It means if you know any programming language and understand how to parse XML/JSON and POST data to an URI,
|
||||
then you can write some application which can communicate with SABnzbd almost as easily as a template can.
|
||||
The Queue & History:
|
||||
* Per-Item Pause - Now, in addition to being able to pause the whole queue, you can also pause
|
||||
individual items in the queue. You can also force downloads to start while the whole queue is paused.
|
||||
* Priorities - The queue now has four priorities, Normal, High, Low and force.
|
||||
Think of this as an easy method to move things around your queue, or to insert things into
|
||||
specific areas of your queue. One use case is to set everything to "normal" by default,
|
||||
so it works like 0.4.x. However, you can then add a new post or RSS feed as high-priority to have it be
|
||||
inserted to the top of the queue, or add one as low-priority to have it inserted at the bottom of the queue
|
||||
and keep below normal downloads that are added. Forced items will go straight to the top of the queue,
|
||||
and will continue to download even if the queue is paused.
|
||||
* New History Backend - The history is now stored in a database, so we can handle larger histories better,
|
||||
and store more information about downloads.
|
||||
Skins:
|
||||
* General Template Changes - Templates have all been updated to support all the neat new features.
|
||||
So if you're one of those guys still married to Default, don't worry about missing out on all this new stuff.
|
||||
* Plush - Complete backend rewrite to work almost exclusively off the API [so it's MUCH faster],
|
||||
and a reorganized (and more accessible!) main menu.
|
||||
* SMPL - Has been reworked to be much faster and friendlier to use.
|
||||
The default page now shows the top 5 items from the queue and history.
|
||||
The queue and history are also now pages to stop loading a massive number of items.
|
||||
Bugfixes:
|
||||
* Sure!
|
||||
0.7.0Alpha2 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Fix disabled options in Config skin
|
||||
- Remove flags from the Wizard and Config skin
|
||||
- Replace real spaces in RSS-urls with %20
|
||||
- Prevent double entries in History's "Source" section
|
||||
- Prevent crash when OSDNotify doesn't work properly
|
||||
- Small improvents in Windows installer
|
||||
-------------------------------------------------------------------------------
|
||||
0.7.0Alpha1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Not tracked
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.15Final by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Flag post-processing as failed when files cannot be moved/copied to destination
|
||||
- Fixed another newzbin link
|
||||
-------------------------------------------------------------------------------
|
||||
0.6.15RC1 by The SABnzbd-Team
|
||||
-------------------------------------------------------------------------------
|
||||
- Change newzbin URL
|
||||
- Prevent setting watched-folder speed to 0 (while having no watched-folder)
|
||||
from triggering an inifinite loop.
|
||||
- Move "locale" construction from Plush skin to Python code.
|
||||
Some embedded Linux platforms show unstable behavior with the original construction.
|
||||
- Extend OSX menu with troubleshooting options
|
||||
- Add trailing slashes to internal Plush paths to support reverse proxies better.
|
||||
- Ignore whitespace around regular expressions in RSS filters.
|
||||
- Prevent crash on restoring URL-fetches when using --repair-all option
|
||||
- Fix "Repair" button on smpl Connection page. Current path fails when using a reverse proxy
|
||||
- Suppress "incompatible feed" error when doing a scheduled/automatic RSS read-out.
|
||||
- Add special setting to use "pickle" library instead of cPickle.
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
|
||||
The SABnzbd-team is:
|
||||
|
||||
Current team:
|
||||
Active team:
|
||||
ShyPike <shypike@sabnzbd.org>
|
||||
inpheaux <inpheaux@sabnzbd.org>
|
||||
zoggy <zoggy@sabnzbd.org>
|
||||
Sleeping members
|
||||
sw1tch <switch@sabnzbd.org>
|
||||
pairofdimes <pairofdimes@sabnzbd.org>
|
||||
inpheaux <inpheaux@sabnzbd.org>
|
||||
rAf <rAf@sabnzbd.org>
|
||||
Honorary member (and original author)
|
||||
Gregor Kaufmann <tdian@users.sourceforge.net>
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
|
||||
37
INSTALL.txt
@@ -1,10 +1,10 @@
|
||||
SABnzbd 0.6.6
|
||||
SABnzbd 0.7.0
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
0) LICENSE
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
@@ -39,9 +39,14 @@ Start the SABnzbd.exe program.
|
||||
Within 5-10 seconds your web browser will start and show the user interface.
|
||||
Use the "Help" button in the web-interface to be directed to the Help Wiki.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
3) INSTALL pre-built OSX binaries
|
||||
-------------------------------------------------------------------------------
|
||||
Download teh DMG file, mount and drag the SABnzbd icon to Programs.
|
||||
Just like you do with so many apps.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
3) INSTALL with only sources
|
||||
4) INSTALL with only sources
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
You need to have Python installed and some modules.
|
||||
@@ -49,13 +54,16 @@ You need to have Python installed and some modules.
|
||||
Unix/Linux/OSX
|
||||
Python-2.5, 2.6 or 2.7 http://www.python.org
|
||||
|
||||
OSX Leopard/SnowLeopard
|
||||
Python 2.6 http://www.activestate.com
|
||||
|
||||
OSX Lion Apple Python 2.7 (included in OSX)
|
||||
|
||||
Windows
|
||||
Python-2.5.latest http://www.activestate.com
|
||||
Python-2.6.latest
|
||||
Python-2.7.latest
|
||||
Python-2.7.latest http://www.activestate.com
|
||||
|
||||
Essential modules
|
||||
cheetah-2.0.1+ http://www.cheetahtemplate.org/
|
||||
cheetah-2.0.1+ http://www.cheetahtemplate.org/ (or use "pypm install cheetah")
|
||||
yenc module >= 0.3 http://sabnzbd.sourceforge.net/yenc-0.3.tar.gz
|
||||
http://sabnzbd.sourceforge.net/yenc-0.3-w32fixed.zip (Win32-only)
|
||||
par2cmdline >= 0.4 http://parchive.sourceforge.net/
|
||||
@@ -65,22 +73,25 @@ Optional modules
|
||||
unrar >= 3.90+ http://www.rarlab.com/rar_add.htm
|
||||
unzip >= 5.52 http://www.info-zip.org/
|
||||
gnu gettext http://www.gnu.org/software/gettext/
|
||||
gntp https://github.com/kfdm/gntp/ (or use "pypm install gntp")
|
||||
|
||||
Optional modules Windows
|
||||
pyopenssl >= 0.11 http://pypi.python.org/pypi/pyOpenSSL
|
||||
(Binaries, including the OpenSSL libraries)
|
||||
|
||||
Optional modules Unix/Linux/OSX
|
||||
pyopenssl >= 0.10 http://pypi.python.org/pypi/pyOpenSSL
|
||||
pyopenssl >= 0.11 http://pypi.python.org/pypi/pyOpenSSL
|
||||
openssl => v0.9.8g+ http://www.openssl.org/
|
||||
Make sure the OpenSSL libraries match with PyOpenSSL
|
||||
pynotify Should be part of GTK for Python support on Debian/Ubuntu
|
||||
If not, you cannot use the NotifyOSD feature.
|
||||
|
||||
Embedded modules (only use the included version)
|
||||
CherryPy-3.2 rev2138 with patches http://www.cherrypy.org
|
||||
|
||||
|
||||
Unpack the ZIP-file containing the SABnzbd sources to any folder of your liking.
|
||||
If fou want multiple languages, you need to compile the translations.
|
||||
If you want multiple languages, you need to compile the translations.
|
||||
Start this from a shell terminal (or command prompt):
|
||||
python tools/make_mo.py
|
||||
|
||||
@@ -91,7 +102,7 @@ Use the "Help" button in the web-interface to be directed to the Help Wiki.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
4) TROUBLESHOOTING
|
||||
5) TROUBLESHOOTING
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Your browser may start up with just an error page.
|
||||
@@ -109,7 +120,7 @@ This will show a black window where logging information will be shown. This
|
||||
may help you solve problems easier.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
5) MORE INFORMATION
|
||||
6) MORE INFORMATION
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Visit the WIKI site:
|
||||
@@ -117,9 +128,9 @@ Visit the WIKI site:
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
6) CREDITS
|
||||
7) CREDITS
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Serveral parts of SABnzbd were built by other people, illustrating the
|
||||
Several parts of SABnzbd were built by other people, illustrating the
|
||||
wonderful world of Free Open Source Software.
|
||||
See the licences folder of the main program and of the skin folders.
|
||||
|
||||
30
ISSUES.txt
@@ -2,8 +2,8 @@
|
||||
*** Known issues ***
|
||||
*******************************************
|
||||
|
||||
- To prevent unexpectedly large NZBs from eating your quotum you can set
|
||||
the option 'size_limit' in the INI file.
|
||||
- To prevent unexpectedly large NZBs from eating your download quota you can set
|
||||
the option 'size_limit' on the Config->Special page.
|
||||
Any NZB larger than this size will be set to paused and get a low priority.
|
||||
|
||||
- When par2 or unrar hang up, never just stop SABnzbd.
|
||||
@@ -27,18 +27,19 @@
|
||||
For Windows the default is 128 and for others 256.
|
||||
A quite safe value for Windows would be 64.
|
||||
SABnzbd will take care of overlapping names.
|
||||
See: http://wiki.sabnzbd.org/configure-special
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
|
||||
- Some Usenet servers have intermittent login (or other) problems.
|
||||
For these the server blocking method is not very favourable.
|
||||
There is an INI-only option that will limit blocks to 1 minute.
|
||||
no_penalties = 1
|
||||
See: http://wiki.sabnzbd.org/configure-special
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
|
||||
- Some third-party utilties try to probe SABnzbd API in such a way that you will
|
||||
often see warnings about unauthenticated access.
|
||||
If you are sure these probes are harmless, you can suppress the warnings by
|
||||
setting the option "api_warnings" to 0 in the file sabnzbd.ini
|
||||
setting the option "api_warnings" to 0.
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
|
||||
- On OSX you may encounter downloaded files with foreign characters.
|
||||
The par2 repair may fail when the files were created on a Windows system.
|
||||
@@ -48,6 +49,8 @@
|
||||
- On Linux when you download files they may have the wrong character encoding.
|
||||
You will see this only when downloaded files contain accented characters.
|
||||
You need to fix it yourself by running the convmv utility (availaible for most Linux platforms).
|
||||
Possible the file system override setting 'fsys_type' might be solve things:
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
|
||||
- The "Watched Folder" sometimes fails to delete the NZB files it has
|
||||
processed. This happens when other software still accesses these files.
|
||||
@@ -55,10 +58,6 @@
|
||||
We cannot solve this problem, because the Operating System (read Windows)
|
||||
prevents the removal.
|
||||
|
||||
- Jobs deleted from the queue will leave downloaded files behind
|
||||
in the "incomplete" folder.
|
||||
You will have to remove these files manually.
|
||||
|
||||
- Memory usage can sometimes have high peaks. This makes using SABnzbd on very low
|
||||
memory systems (eg a SAN device) a challenge.
|
||||
|
||||
@@ -73,3 +72,16 @@
|
||||
make sure that the drives are mounted.
|
||||
The operating system wil simply redirect your files to alternative locations.
|
||||
You may have trouble finding the files when mounting the drive later.
|
||||
On OSX, SABnzbd will not create new folders in /Volumes.
|
||||
The result will be a failed job that can be retried once the volume has been mounted.
|
||||
|
||||
- On some operating systems it looks like there is a problem with one of the standard Python libraries.
|
||||
It is possible that you get errors about saving admin files and even unexplained crashes.
|
||||
If so, you can enable the option for the alternative library.
|
||||
It has the same functionality, but is slower.
|
||||
We've had reports about this issue on non-mainstream Linux platforms.
|
||||
- OpenElec
|
||||
- Squeeze Linux
|
||||
There is a "special" option that will allow you to select an alternative library.
|
||||
use_pickle = 1
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
|
||||
1031
NSIS_Installer.nsi
4
PKG-INFO
@@ -1,7 +1,7 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: SABnzbd
|
||||
Version: 0.6.6
|
||||
Summary: SABnzbd-0.6.6
|
||||
Version: 0.7.0Aplha2
|
||||
Summary: SABnzbd-0.7.0Alpha2
|
||||
Home-page: http://sourceforge.net/projects/sabnzbdplus
|
||||
Author: The SABnzbd Team
|
||||
Author-email: team@sabnzbd.org
|
||||
|
||||
54
README.md
Normal file
@@ -0,0 +1,54 @@
|
||||
SABnzbd - The automated Usenet download tool
|
||||
============================================
|
||||
|
||||
SABnzbd is an Open Source Binary Newsreader written in Python.
|
||||
|
||||
It's totally free, incredibly easy to use, and works practically everywhere.
|
||||
|
||||
SABnzbd makes Usenet as simple and streamlined as possible by automating everything we can. All you have to do is add an .nzb. SABnzbd takes over from there, where it will be automatically downloaded, verified, repaired, extracted and filed away with zero human interaction.
|
||||
|
||||
If you want to know more you can head over to our website: http://sabnzbd.org.
|
||||
|
||||
## Resolving Dependencies
|
||||
|
||||
SABnzbd has a good deal of dependencies you'll need before you can get running. If you've previously run SABnzbd from one of the various Linux packages floating around (Ubuntu, Debian, Fedora, etc), then you likely already have all the needed dependencies. If not, here's what you're looking for:
|
||||
|
||||
- `python` (We support Python 2.5-2.7, preferably 2.6 or 2.7.)
|
||||
- `python-cheetah`
|
||||
- `python-configobj`
|
||||
- `python-feedparser`
|
||||
- `python-dbus`
|
||||
- `python-openssl`
|
||||
- `python-support`
|
||||
- `python-yenc`
|
||||
- `par2` (Multi-threaded par2 can be downloaded from [ChuChuSoft](http://chuchusoft.com/par2_tbb/download.html) )
|
||||
- `unrar` (Make sure you get the "official" non-free version of unrar)
|
||||
- `unzip`
|
||||
|
||||
Your package manager should supply these. If not, we've got links in our more in-depth [installation guide](https://github.com/sabnzbd/sabnzbd/blob/master/INSTALL.txt).
|
||||
|
||||
## Running SABnzbd from source
|
||||
|
||||
Once you've sorted out all the dependencies, simply run:
|
||||
|
||||
```
|
||||
python SABnzbd.py
|
||||
```
|
||||
|
||||
Or, if you want to run in the background:
|
||||
|
||||
```
|
||||
python -d -f /path/to/sabnzbd.ini
|
||||
```
|
||||
|
||||
If you want multi-language support, run:
|
||||
|
||||
```
|
||||
python tools/make_mo.py
|
||||
```
|
||||
|
||||
Our many other commandline options are explained in depth [here](http://wiki.sabnzbd.org/command-line-parameters).
|
||||
|
||||
## About Our Repo
|
||||
|
||||
We're going to be attempting to follow the [gitflow model](http://nvie.com/posts/a-successful-git-branching-model/), so you can consider "master" to be whatever our present stable release build is (presently 0.6.x) and "develop" to be whatever our next build will be (presently 0.7.x). Once we transition from unstable to stable dev builds we'll create release branches, and encourage you to follow along and help us test.
|
||||
27
README.rtf
@@ -4,25 +4,24 @@
|
||||
\paperw11900\paperh16840\vieww16360\viewh15680\viewkind0
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
|
||||
|
||||
\f0\b\fs48 \cf0 SABnzbd 0.6.6\
|
||||
\f0\b\fs48 \cf0 SABnzbd 0.7.0Alpha2\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
|
||||
|
||||
\b0\fs26 \cf0 \
|
||||
|
||||
\b What's new
|
||||
\b0 \
|
||||
- Compatible with OSX Lion\
|
||||
- End-of-queue action now ignores paused items in the queue\
|
||||
- Fetching extra par2 files now obeys pause too\
|
||||
- Extension-based cleanup now also cleans sub-folders\
|
||||
- When "Download only" is used, do not send downloaded NZB files to the queue\
|
||||
- Fix bad links coming from nzbclub.com\
|
||||
- A job sometimes fails verification when the option "don't download samples" is used.\
|
||||
Now this option will be ignored when you click "Retry" in the history.\
|
||||
- File an error message when the RSS-email template is missing.\
|
||||
- Fix sending of duplicate emails when using a list of recipients\
|
||||
- Fix handle leakage on Windows\
|
||||
- On OSX, SABnzbd didn't handle "Open With" of nzb.gz files properly\
|
||||
- Download quota management\
|
||||
- Windows: simple system tray menu\
|
||||
- Multi-platform Growl support\
|
||||
- NotifyOSD support for Linux distros that have it\
|
||||
- Option to set maximum number of retries for servers (prevents deadlock)\
|
||||
- Pre-download check to estimate completeness (reliability is limited)\
|
||||
- Prevent partial downloading of par2 files that are not needed yet\
|
||||
- Config->Special for settings previously only available in the sabnzbd.ini file\
|
||||
- For Usenet servers with multiple IP addresses, pick a random one per connection\
|
||||
- Add pseudo-priority "Stop" that will send the job immediately to the post-processing queue\
|
||||
- Allow jobs still waiting for post-processing to be deleted too\
|
||||
\
|
||||
|
||||
\b About
|
||||
@@ -34,6 +33,8 @@ built-in post-processing options that automatically verify, repair,\
|
||||
extract and clean up posts downloaded from Usenet.\
|
||||
SABnzbd also has a fully customizable user interface,\
|
||||
and offers a complete API for third-party applications to hook into.\
|
||||
\
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>\
|
||||
\
|
||||
There is an extensive Wiki on the use of SABnzbd.\
|
||||
{\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/"}}{\fldrslt http://wiki.sabnzbd.org/}}\
|
||||
|
||||
28
README.txt
@@ -1,18 +1,18 @@
|
||||
************************ SABnzbd 0.6.6 ************************
|
||||
************************ SABnzbd 0.7.0Alpha2 ************************
|
||||
|
||||
What's new:
|
||||
- Compatible with OSX Lion
|
||||
- End-of-queue action now ignores paused items in the queue
|
||||
- Fetching extra par2 files now obeys pause too
|
||||
- Extension-based cleanup now also cleans sub-folders
|
||||
- When "Download only" is used, do not send downloaded NZB files to the queue
|
||||
- Fix bad links coming from nzbclub.com
|
||||
- A job sometimes fails verification when the option "don't download samples" is used.
|
||||
Now this option will be ignored when you click "Retry" in the history.
|
||||
- File an error message when the RSS-email template is missing.
|
||||
- Fix sending of duplicate emails when using a list of recipients
|
||||
- Fix handle leakage on Windows
|
||||
- On OSX, SABnzbd didn't handle "Open With" of nzb.gz files properly
|
||||
|
||||
- Download quota management
|
||||
- Windows: simple system tray menu
|
||||
- Multi-platform Growl support
|
||||
- NotifyOSD support for Linux distros that have it
|
||||
- Option to set maximum number of retries for servers (prevents deadlock)
|
||||
- Pre-download check to estimate completeness (reliability is limited)
|
||||
- Prevent partial downloading of par2 files that are not needed yet
|
||||
- Config->Special for settings previously only available in the sabnzbd.ini file
|
||||
- For Usenet servers with multiple IP addresses, pick a random one per connection
|
||||
- Add pseudo-priority "Stop" that will send the job immediately to the post-processing queue
|
||||
- Allow jobs still waiting for post-processing to be deleted too
|
||||
|
||||
About:
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
@@ -21,4 +21,4 @@ About:
|
||||
built-in post-processing options that automatically verify, repair,
|
||||
extract and clean up posts downloaded from Usenet.
|
||||
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
|
||||
193
SABnzbd.py
@@ -78,7 +78,7 @@ import sabnzbd.config as config
|
||||
import sabnzbd.cfg
|
||||
import sabnzbd.downloader
|
||||
from sabnzbd.encoding import unicoder, latin1
|
||||
from sabnzbd.utils import osx
|
||||
import sabnzbd.growler as growler
|
||||
|
||||
from threading import Thread
|
||||
|
||||
@@ -231,7 +231,7 @@ def print_help():
|
||||
print " -t --templates <templ> Template directory [*]"
|
||||
print " -2 --template2 <templ> Secondary template dir [*]"
|
||||
print
|
||||
print " -l --logging <0..2> Set logging level (0= least, 2= most) [*]"
|
||||
print " -l --logging <0..2> Set logging level (-1=off, 0= least, 2= most) [*]"
|
||||
print " -w --weblogging <0..2> Set cherrypy logging (0= off, 1= on, 2= file-only) [*]"
|
||||
print
|
||||
print " -b --browser <0..1> Auto browser launch (0= off, 1= on) [*]"
|
||||
@@ -251,6 +251,7 @@ def print_help():
|
||||
print " with full data reconstruction"
|
||||
print " --https <port> Port to use for HTTPS server"
|
||||
print " --log-all Log all article handling (for developers)"
|
||||
print " --console Force console logging for OSX app"
|
||||
print " --new Run a new instance of SABnzbd"
|
||||
|
||||
def print_version():
|
||||
@@ -320,7 +321,8 @@ def Web_Template(key, defweb, wdir):
|
||||
wdir = ''
|
||||
if not wdir:
|
||||
wdir = defweb
|
||||
key.set(wdir)
|
||||
if key:
|
||||
key.set(wdir)
|
||||
if not wdir:
|
||||
# No default value defined, accept empty path
|
||||
return ''
|
||||
@@ -330,6 +332,10 @@ def Web_Template(key, defweb, wdir):
|
||||
logging.info("Web dir is %s", full_dir)
|
||||
|
||||
if not os.path.exists(full_main):
|
||||
# Temporarily fix that allows missing Config
|
||||
if defweb == DEF_STDCONFIG:
|
||||
return ''
|
||||
# end temp fix
|
||||
logging.warning(Ta('Cannot find web template: %s, trying standard template'), full_main)
|
||||
full_dir = real_path(sabnzbd.DIR_INTERFACES, DEF_STDINTF)
|
||||
full_main = real_path(full_dir, DEF_MAIN_TMPL)
|
||||
@@ -359,12 +365,14 @@ def fix_webname(name):
|
||||
xname = name.title()
|
||||
else:
|
||||
xname = ''
|
||||
if xname in ('Default',):
|
||||
if xname in ('Default', ):
|
||||
return 'Classic'
|
||||
elif xname in ('Classic', 'Plush', 'Mobile'):
|
||||
return xname
|
||||
elif xname in ('Smpl', 'Wizard'):
|
||||
return name.lower()
|
||||
elif xname in ('Config',):
|
||||
return 'Plush'
|
||||
else:
|
||||
return name
|
||||
|
||||
@@ -491,6 +499,31 @@ def print_modules():
|
||||
logging.info("pyOpenSSL... NOT found - try apt-get install python-pyopenssl (SSL is optional)")
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
def all_localhosts():
|
||||
""" Return all unique values of localhost in order of preference """
|
||||
ips = ['127.0.0.1']
|
||||
try:
|
||||
# Check whether IPv6 is available and enabled
|
||||
info = socket.getaddrinfo('::1', None)
|
||||
af, socktype, proto, canonname, sa = info[0]
|
||||
s = socket.socket(af, socktype, proto)
|
||||
s.close()
|
||||
except socket.error:
|
||||
return ips
|
||||
try:
|
||||
info = socket.getaddrinfo('localhost', None)
|
||||
except:
|
||||
# localhost does not resolve
|
||||
return ips
|
||||
ips = []
|
||||
for item in info:
|
||||
item = item[4][0]
|
||||
if item not in ips:
|
||||
ips.append(item)
|
||||
return ips
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
def get_webhost(cherryhost, cherryport, https_port):
|
||||
""" Determine the webhost address and port,
|
||||
@@ -604,7 +637,7 @@ def get_webhost(cherryhost, cherryport, https_port):
|
||||
# if the https port was specified, assume they want HTTPS enabling also
|
||||
sabnzbd.cfg.enable_https.set(True)
|
||||
|
||||
if cherryport == https_port:
|
||||
if cherryport == https_port and sabnzbd.cfg.enable_https():
|
||||
sabnzbd.cfg.enable_https.set(False)
|
||||
# Should have a translated message, but that's not available yet
|
||||
#logging.error(Ta('HTTP and HTTPS ports cannot be the same'))
|
||||
@@ -613,6 +646,18 @@ def get_webhost(cherryhost, cherryport, https_port):
|
||||
return cherryhost, cherryport, browserhost, https_port
|
||||
|
||||
|
||||
def attach_server(host, port, cert=None, key=None):
|
||||
""" Define and attach server, optionally HTTPS
|
||||
"""
|
||||
http_server = _cpwsgi_server.CPWSGIServer()
|
||||
http_server.bind_addr = (host, port)
|
||||
if cert and key:
|
||||
http_server.ssl_certificate = cert
|
||||
http_server.ssl_private_key = key
|
||||
adapter = _cpserver.ServerAdapter(cherrypy.engine, http_server, http_server.bind_addr)
|
||||
adapter.subscribe()
|
||||
|
||||
|
||||
def is_sabnzbd_running(url):
|
||||
""" Return True when there's already a SABnzbd instance running.
|
||||
"""
|
||||
@@ -643,7 +688,10 @@ def find_free_port(host, currentport):
|
||||
|
||||
def check_for_sabnzbd(url, upload_nzbs, allow_browser=True):
|
||||
""" Check for a running instance of sabnzbd(same version) on this port
|
||||
allow_browser==True|None will launch the browser, False will not.
|
||||
"""
|
||||
if allow_browser is None:
|
||||
allow_browser = True
|
||||
if is_sabnzbd_running(url):
|
||||
# Upload any specified nzb files to the running instance
|
||||
if upload_nzbs:
|
||||
@@ -652,6 +700,7 @@ def check_for_sabnzbd(url, upload_nzbs, allow_browser=True):
|
||||
upload_file(url, f)
|
||||
else:
|
||||
# Launch the web browser and quit since sabnzbd is already running
|
||||
# Trim away everything after the final slash in the URL
|
||||
url = url[:url.rfind('/')+1]
|
||||
launch_a_browser(url, force=allow_browser)
|
||||
exit_sab(0)
|
||||
@@ -769,7 +818,7 @@ def commandline_handler(frozen=True):
|
||||
'weblogging=', 'server=', 'templates',
|
||||
'template2', 'browser=', 'config-file=', 'force',
|
||||
'version', 'https=', 'autorestarted', 'repair', 'repair-all',
|
||||
'log-all', 'no-login', 'pid=', 'new', 'sessions',
|
||||
'log-all', 'no-login', 'pid=', 'new', 'sessions', 'console',
|
||||
# Below Win32 Service options
|
||||
'password=', 'username=', 'startup=', 'perfmonini=', 'perfmondll=',
|
||||
'interactive', 'wait=',
|
||||
@@ -843,6 +892,7 @@ def main():
|
||||
pid_path = None
|
||||
new_instance = False
|
||||
force_sessions = False
|
||||
osx_console = False
|
||||
|
||||
service, sab_opts, serv_opts, upload_nzbs = commandline_handler()
|
||||
|
||||
@@ -891,8 +941,8 @@ def main():
|
||||
try:
|
||||
logging_level = int(arg)
|
||||
except:
|
||||
logging_level = -1
|
||||
if logging_level < 0 or logging_level > 2:
|
||||
logging_level = -2
|
||||
if logging_level < -1 or logging_level > 2:
|
||||
print_help()
|
||||
exit_sab(1)
|
||||
elif opt in ('-v', '--version'):
|
||||
@@ -924,7 +974,11 @@ def main():
|
||||
elif opt in ('--new',):
|
||||
new_instance = True
|
||||
elif opt in ('--sessions',):
|
||||
re_argv.append(opt)
|
||||
force_sessions = True
|
||||
elif opt in ('--console',):
|
||||
re_argv.append(opt)
|
||||
osx_console = True
|
||||
|
||||
sabnzbd.MY_FULLNAME = os.path.normpath(os.path.abspath(sabnzbd.MY_FULLNAME))
|
||||
sabnzbd.MY_NAME = os.path.basename(sabnzbd.MY_FULLNAME)
|
||||
@@ -942,11 +996,11 @@ def main():
|
||||
consoleLogging = consoleLogging and not sabnzbd.DAEMON
|
||||
|
||||
# No console logging needed for OSX app
|
||||
noConsoleLoggingOSX = (sabnzbd.DIR_PROG.find('.app/Contents/Resources') > 0)
|
||||
noConsoleLoggingOSX = (not osx_console) and (sabnzbd.DIR_PROG.find('.app/Contents/Resources') > 0)
|
||||
if noConsoleLoggingOSX:
|
||||
consoleLogging = 1
|
||||
|
||||
LOGLEVELS = (logging.WARNING, logging.INFO, logging.DEBUG)
|
||||
LOGLEVELS = (logging.FATAL, logging.WARNING, logging.INFO, logging.DEBUG)
|
||||
|
||||
# Setup primary logging to prevent default console logging
|
||||
gui_log = guiHandler(MAX_WARNINGS)
|
||||
@@ -963,6 +1017,8 @@ def main():
|
||||
# Detect Windows variant
|
||||
if sabnzbd.WIN32:
|
||||
vista_plus, vista64 = windows_variant()
|
||||
sabnzbd.WIN64 = vista64
|
||||
|
||||
|
||||
if not SQLITE_DLL:
|
||||
panic_sqlite(sabnzbd.MY_FULLNAME)
|
||||
@@ -1129,7 +1185,7 @@ def main():
|
||||
rollover_log.addFilter(FilterCP3())
|
||||
sabnzbd.LOGHANDLER = rollover_log
|
||||
logger.addHandler(rollover_log)
|
||||
logger.setLevel(LOGLEVELS[logging_level])
|
||||
logger.setLevel(LOGLEVELS[logging_level+1])
|
||||
|
||||
except IOError:
|
||||
print "Error:"
|
||||
@@ -1157,7 +1213,7 @@ def main():
|
||||
if consoleLogging:
|
||||
console = logging.StreamHandler()
|
||||
console.addFilter(FilterCP3())
|
||||
console.setLevel(LOGLEVELS[logging_level])
|
||||
console.setLevel(LOGLEVELS[logging_level+1])
|
||||
console.setFormatter(logging.Formatter(format))
|
||||
logger.addHandler(console)
|
||||
if noConsoleLoggingOSX:
|
||||
@@ -1176,7 +1232,6 @@ def main():
|
||||
suffix = ' (=Vista+)'
|
||||
if vista64:
|
||||
suffix = ' (=Vista+ x64)'
|
||||
sabnzbd.WIN64 = True
|
||||
try:
|
||||
logging.info('Platform=%s%s Class=%s', platform.platform(), suffix, os.name)
|
||||
except:
|
||||
@@ -1219,12 +1274,14 @@ def main():
|
||||
|
||||
web_dir = Web_Template(sabnzbd.cfg.web_dir, DEF_STDINTF, fix_webname(web_dir))
|
||||
web_dir2 = Web_Template(sabnzbd.cfg.web_dir2, '', fix_webname(web_dir2))
|
||||
web_dirc = Web_Template(None, DEF_STDCONFIG, '')
|
||||
|
||||
wizard_dir = os.path.join(sabnzbd.DIR_INTERFACES, 'wizard')
|
||||
#sabnzbd.lang.install_language(os.path.join(wizard_dir, DEF_INT_LANGUAGE), sabnzbd.cfg.language(), 'wizard')
|
||||
|
||||
sabnzbd.WEB_DIR = web_dir
|
||||
sabnzbd.WEB_DIR2 = web_dir2
|
||||
sabnzbd.WEB_DIRC = web_dirc
|
||||
sabnzbd.WIZARD_DIR = wizard_dir
|
||||
|
||||
sabnzbd.WEB_COLOR = CheckColor(sabnzbd.cfg.web_color(), web_dir)
|
||||
@@ -1238,21 +1295,12 @@ def main():
|
||||
# Save the INI file
|
||||
config.save_config(force=True)
|
||||
|
||||
logging.info('Starting %s-%s', sabnzbd.MY_NAME, sabnzbd.__version__)
|
||||
try:
|
||||
sabnzbd.start()
|
||||
except:
|
||||
logging.exception("Failed to start %s-%s", sabnzbd.MY_NAME, sabnzbd.__version__)
|
||||
sabnzbd.halt()
|
||||
if sabnzbd.WIN32 and sabnzbd.cfg.win_menu() and not sabnzbd.DAEMON:
|
||||
import sabnzbd.sabtray
|
||||
sabnzbd.WINTRAY = sabnzbd.sabtray.SABTrayThread()
|
||||
|
||||
print_modules()
|
||||
|
||||
# Upload any nzb/zip/rar/nzb.gz files from file association
|
||||
if upload_nzbs:
|
||||
from sabnzbd.utils.upload import add_local
|
||||
for f in upload_nzbs:
|
||||
add_local(f)
|
||||
|
||||
cherrylogtoscreen = False
|
||||
sabnzbd.WEBLOGFILE = None
|
||||
|
||||
@@ -1281,18 +1329,38 @@ def main():
|
||||
logging.warning(Ta('Disabled HTTPS because of missing CERT and KEY files'))
|
||||
enable_https = False
|
||||
|
||||
if enable_https:
|
||||
if https_port:
|
||||
# Prepare an extra server for the HTTP port
|
||||
http_server = _cpwsgi_server.CPWSGIServer()
|
||||
http_server.bind_addr = (cherryhost, cherryport)
|
||||
#secure_server.ssl_certificate = https_cert
|
||||
#secure_server.ssl_private_key = https_key
|
||||
adapter = _cpserver.ServerAdapter(cherrypy.engine, http_server, http_server.bind_addr)
|
||||
adapter.subscribe()
|
||||
cherryport = https_port
|
||||
cherrypy.config.update({'server.ssl_certificate' : https_cert,
|
||||
'server.ssl_private_key' : https_key })
|
||||
# Determine if this system has multiple definitions for 'localhost'
|
||||
hosts = all_localhosts()
|
||||
multilocal = len(hosts) > 1 and cherryhost in ('localhost', '0.0.0.0')
|
||||
|
||||
# For 0.0.0.0 CherryPy will always pick IPv4, so make sure the secondary localhost is IPv6
|
||||
if multilocal and cherryhost == '0.0.0.0' and hosts[1] == '127.0.0.1':
|
||||
hosts[1] = '::1'
|
||||
|
||||
# The Windows binary requires numeric localhost as primary address
|
||||
if multilocal and cherryhost == 'localhost' and hosts[1] == '127.0.0.1':
|
||||
cherryhost = '::1'
|
||||
|
||||
if enable_https:
|
||||
if https_port:
|
||||
# Extra HTTP port for primary localhost
|
||||
attach_server(cherryhost, cherryport)
|
||||
if multilocal:
|
||||
# Extra HTTP port for secondary localhost
|
||||
attach_server(hosts[1], cherryport)
|
||||
# Extra HTTPS port for secondary localhost
|
||||
attach_server(hosts[1], https_port, https_cert, https_key)
|
||||
cherryport = https_port
|
||||
elif multilocal:
|
||||
# Extra HTTPS port for secondary localhost
|
||||
attach_server(hosts[1], cherryport, https_cert, https_key)
|
||||
|
||||
cherrypy.config.update({'server.ssl_certificate' : https_cert,
|
||||
'server.ssl_private_key' : https_key })
|
||||
elif multilocal:
|
||||
# Extra HTTP port for secondary localhost
|
||||
attach_server(hosts[1], cherryport)
|
||||
|
||||
|
||||
if no_login:
|
||||
sabnzbd.cfg.username.set('')
|
||||
@@ -1315,17 +1383,21 @@ def main():
|
||||
'engine.reexec_retry' : 100,
|
||||
'tools.encode.on' : True,
|
||||
'tools.gzip.on' : True,
|
||||
'tools.gzip.mime_types' : ['text/html', 'text/plain', 'text/javascript', 'text/css', 'application/x-javascript'],
|
||||
'tools.sessions.on' : bool(sessions),
|
||||
'tools.sessions.storage_type' : 'file',
|
||||
'tools.sessions.storage_path' : sessions,
|
||||
'tools.sessions.timeout' : 60,
|
||||
'request.show_tracebacks': True,
|
||||
'checker.check_localhost' : bool(consoleLogging),
|
||||
'error_page.401': sabnzbd.panic.error_page_401
|
||||
'error_page.401': sabnzbd.panic.error_page_401,
|
||||
'error_page.404': sabnzbd.panic.error_page_404
|
||||
})
|
||||
|
||||
|
||||
static = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(web_dir, 'static')}
|
||||
if web_dirc:
|
||||
staticcfg = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(web_dirc, 'staticcfg')}
|
||||
wizard_static = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(wizard_dir, 'static')}
|
||||
|
||||
appconfig = {'/sabnzbd/api' : {'tools.basic_auth.on' : False},
|
||||
@@ -1340,6 +1412,9 @@ def main():
|
||||
'/sabnzbd/wizard/static': wizard_static,
|
||||
'/wizard/static': wizard_static
|
||||
}
|
||||
if web_dirc:
|
||||
appconfig['/sabnzbd/staticcfg'] = staticcfg
|
||||
appconfig['/staticcfg'] = staticcfg
|
||||
|
||||
if web_dir2:
|
||||
static2 = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(web_dir2, 'static')}
|
||||
@@ -1350,8 +1425,11 @@ def main():
|
||||
appconfig['/m/static'] = static2
|
||||
appconfig['/sabnzbd/m/wizard/static'] = wizard_static
|
||||
appconfig['/m/wizard/static'] = wizard_static
|
||||
if web_dirc:
|
||||
appconfig['/sabnzbd/m/staticcfg'] = staticcfg
|
||||
appconfig['/m/staticcfg'] = staticcfg
|
||||
|
||||
login_page = sabnzbd.interface.MainPage(web_dir, '/', web_dir2, '/m/', first=2)
|
||||
login_page = sabnzbd.interface.MainPage(web_dir, '/', web_dir2, '/m/', web_dirc, first=2)
|
||||
cherrypy.tree.mount(login_page, '/', config=appconfig)
|
||||
|
||||
# Set authentication for CherryPy
|
||||
@@ -1386,9 +1464,9 @@ def main():
|
||||
|
||||
if enable_https:
|
||||
browser_url = "https://%s:%s/sabnzbd" % (browserhost, cherryport)
|
||||
cherrypy.wsgiserver.REDIRECT_URL = browser_url
|
||||
else:
|
||||
browser_url = "http://%s:%s/sabnzbd" % (browserhost, cherryport)
|
||||
cherrypy.wsgiserver.REDIRECT_URL = browser_url
|
||||
|
||||
sabnzbd.BROWSER_URL = browser_url
|
||||
if not autorestarted:
|
||||
@@ -1396,12 +1474,12 @@ def main():
|
||||
if sabnzbd.FOUNDATION:
|
||||
import sabnzbd.osxmenu
|
||||
sabnzbd.osxmenu.notify("SAB_Launched", None)
|
||||
osx.sendGrowlMsg('SABnzbd %s' % (sabnzbd.__version__),"http://%s:%s/sabnzbd" % (browserhost, cherryport),osx.NOTIFICATION['startup'])
|
||||
growler.send_notification('SABnzbd %s' % (sabnzbd.__version__),
|
||||
"http://%s:%s/sabnzbd" % (browserhost, cherryport), 'startup')
|
||||
# Now's the time to check for a new version
|
||||
check_latest_version()
|
||||
autorestarted = False
|
||||
|
||||
|
||||
mail = None
|
||||
if sabnzbd.WIN32:
|
||||
if enable_https:
|
||||
@@ -1425,6 +1503,20 @@ def main():
|
||||
if pid_path:
|
||||
sabnzbd.pid_file(pid_path, cherryport)
|
||||
|
||||
# Start all SABnzbd tasks
|
||||
logging.info('Starting %s-%s', sabnzbd.MY_NAME, sabnzbd.__version__)
|
||||
try:
|
||||
sabnzbd.start()
|
||||
except:
|
||||
logging.exception("Failed to start %s-%s", sabnzbd.MY_NAME, sabnzbd.__version__)
|
||||
sabnzbd.halt()
|
||||
|
||||
# Upload any nzb/zip/rar/nzb.gz files from file association
|
||||
if upload_nzbs:
|
||||
from sabnzbd.utils.upload import add_local
|
||||
for f in upload_nzbs:
|
||||
add_local(f)
|
||||
|
||||
# Have to keep this running, otherwise logging will terminate
|
||||
timer = 0
|
||||
while not sabnzbd.SABSTOP:
|
||||
@@ -1444,7 +1536,7 @@ def main():
|
||||
# Check for loglevel changes
|
||||
if LOG_FLAG:
|
||||
LOG_FLAG = False
|
||||
level = LOGLEVELS[sabnzbd.cfg.log_level()]
|
||||
level = LOGLEVELS[sabnzbd.cfg.log_level()+1]
|
||||
logger.setLevel(level)
|
||||
if consoleLogging:
|
||||
console.setLevel(level)
|
||||
@@ -1510,6 +1602,9 @@ def main():
|
||||
|
||||
config.save_config()
|
||||
|
||||
if sabnzbd.WINTRAY:
|
||||
sabnzbd.WINTRAY.terminate = True
|
||||
|
||||
if sabnzbd.WIN_SERVICE and mail:
|
||||
mail.send('stop')
|
||||
if sabnzbd.WIN32:
|
||||
@@ -1522,8 +1617,7 @@ def main():
|
||||
if getattr(sys, 'frozen', None) == 'macosx_app':
|
||||
AppHelper.stopEventLoop()
|
||||
else:
|
||||
if sabnzbd.DARWIN:
|
||||
osx.sendGrowlMsg('SABnzbd',T('SABnzbd shutdown finished'),osx.NOTIFICATION['startup'])
|
||||
growler.send_notification('SABnzbd',T('SABnzbd shutdown finished'), 'startup')
|
||||
os._exit(0)
|
||||
|
||||
|
||||
@@ -1646,7 +1740,14 @@ def HandleCommandLine(allow_service=True):
|
||||
#
|
||||
if __name__ == '__main__':
|
||||
|
||||
sabnzbd.CMDLINE = ', '.join(['"%s"' % latin1(p) for p in sys.argv])
|
||||
args = []
|
||||
for txt in sys.argv:
|
||||
if ' ' in txt:
|
||||
txt = '"%s"' % latin1(txt)
|
||||
else:
|
||||
txt = latin1(txt)
|
||||
args.append(txt)
|
||||
sabnzbd.CMDLINE = ' '.join(args)
|
||||
|
||||
if sabnzbd.WIN32:
|
||||
if not HandleCommandLine(allow_service=not hasattr(sys, "frozen")):
|
||||
|
||||
22
email/badfetch-en.tmpl
Normal file
@@ -0,0 +1,22 @@
|
||||
##
|
||||
## Bad URL Fetch Email template for SABnzbd
|
||||
## This a Cheetah template
|
||||
## Documentation: http://sabnzbd.wikidot.com/email-templates
|
||||
##
|
||||
## Newlines and whitespace are significant!
|
||||
##
|
||||
## These are the email headers
|
||||
To: $to
|
||||
From: $from
|
||||
Date: $date
|
||||
Subject: SABnzbd failed to fetch an NZB
|
||||
X-priority: 5
|
||||
X-MS-priority: 5
|
||||
## After this comes the body, the empty line is required!
|
||||
|
||||
Hi,
|
||||
|
||||
SABnzbd has failed to retrieve the NZB from $url.
|
||||
The error message was: $msg
|
||||
|
||||
Bye
|
||||
441
gntp/__init__.py
Normal file
@@ -0,0 +1,441 @@
|
||||
import re
|
||||
import hashlib
|
||||
import time
|
||||
import platform
|
||||
|
||||
__version__ = '0.4'
|
||||
|
||||
class BaseError(Exception):
|
||||
pass
|
||||
|
||||
class ParseError(BaseError):
|
||||
def gntp_error(self):
|
||||
error = GNTPError(errorcode=500,errordesc='Error parsing the message')
|
||||
return error.encode()
|
||||
|
||||
class AuthError(BaseError):
|
||||
def gntp_error(self):
|
||||
error = GNTPError(errorcode=400,errordesc='Error with authorization')
|
||||
return error.encode()
|
||||
|
||||
class UnsupportedError(BaseError):
|
||||
def gntp_error(self):
|
||||
error = GNTPError(errorcode=500,errordesc='Currently unsupported by gntp.py')
|
||||
return error.encode()
|
||||
|
||||
class _GNTPBase(object):
|
||||
info = {
|
||||
'version':'1.0',
|
||||
'messagetype':None,
|
||||
'encryptionAlgorithmID':None
|
||||
}
|
||||
_requiredHeaders = []
|
||||
headers = {}
|
||||
resources = {}
|
||||
def add_origin_info(self):
|
||||
self.add_header('Origin-Machine-Name',platform.node())
|
||||
self.add_header('Origin-Software-Name','gntp.py')
|
||||
self.add_header('Origin-Software-Version',__version__)
|
||||
self.add_header('Origin-Platform-Name',platform.system())
|
||||
self.add_header('Origin-Platform-Version',platform.platform())
|
||||
def __str__(self):
|
||||
return self.encode()
|
||||
def _parse_info(self,data):
|
||||
'''
|
||||
Parse the first line of a GNTP message to get security and other info values
|
||||
@param data: GNTP Message
|
||||
@return: GNTP Message information in a dictionary
|
||||
'''
|
||||
#GNTP/<version> <messagetype> <encryptionAlgorithmID>[:<ivValue>][ <keyHashAlgorithmID>:<keyHash>.<salt>]
|
||||
match = re.match('GNTP/(?P<version>\d+\.\d+) (?P<messagetype>REGISTER|NOTIFY|SUBSCRIBE|\-OK|\-ERROR)'+
|
||||
' (?P<encryptionAlgorithmID>[A-Z0-9]+(:(?P<ivValue>[A-F0-9]+))?) ?'+
|
||||
'((?P<keyHashAlgorithmID>[A-Z0-9]+):(?P<keyHash>[A-F0-9]+).(?P<salt>[A-F0-9]+))?\r\n', data,re.IGNORECASE)
|
||||
|
||||
if not match:
|
||||
raise ParseError('ERROR_PARSING_INFO_LINE')
|
||||
|
||||
info = match.groupdict()
|
||||
if info['encryptionAlgorithmID'] == 'NONE':
|
||||
info['encryptionAlgorithmID'] = None
|
||||
|
||||
return info
|
||||
def set_password(self,password,encryptAlgo='MD5'):
|
||||
'''
|
||||
Set a password for a GNTP Message
|
||||
@param password: Null to clear password
|
||||
@param encryptAlgo: Supports MD5,SHA1,SHA256,SHA512
|
||||
@todo: Support other hash functions
|
||||
'''
|
||||
hash = {
|
||||
'MD5': hashlib.md5,
|
||||
'SHA1': hashlib.sha1,
|
||||
'SHA256': hashlib.sha256,
|
||||
'SHA512': hashlib.sha512,
|
||||
}
|
||||
|
||||
self.password = password
|
||||
self.encryptAlgo = encryptAlgo.upper()
|
||||
if not password:
|
||||
self.info['encryptionAlgorithmID'] = None
|
||||
self.info['keyHashAlgorithm'] = None;
|
||||
return
|
||||
if not self.encryptAlgo in hash.keys():
|
||||
raise UnsupportedError('INVALID HASH "%s"'%self.encryptAlgo)
|
||||
|
||||
hashfunction = hash.get(self.encryptAlgo)
|
||||
|
||||
password = password.encode('utf8')
|
||||
seed = time.ctime()
|
||||
salt = hashfunction(seed).hexdigest()
|
||||
saltHash = hashfunction(seed).digest()
|
||||
keyBasis = password+saltHash
|
||||
key = hashfunction(keyBasis).digest()
|
||||
keyHash = hashfunction(key).hexdigest()
|
||||
|
||||
self.info['keyHashAlgorithmID'] = self.encryptAlgo
|
||||
self.info['keyHash'] = keyHash.upper()
|
||||
self.info['salt'] = salt.upper()
|
||||
def _decode_hex(self,value):
|
||||
'''
|
||||
Helper function to decode hex string to `proper` hex string
|
||||
@param value: Value to decode
|
||||
@return: Hex string
|
||||
'''
|
||||
result = ''
|
||||
for i in range(0,len(value),2):
|
||||
tmp = int(value[i:i+2],16)
|
||||
result += chr(tmp)
|
||||
return result
|
||||
def _decode_binary(self,rawIdentifier,identifier):
|
||||
rawIdentifier += '\r\n\r\n'
|
||||
dataLength = int(identifier['Length'])
|
||||
pointerStart = self.raw.find(rawIdentifier)+len(rawIdentifier)
|
||||
pointerEnd = pointerStart + dataLength
|
||||
data = self.raw[pointerStart:pointerEnd]
|
||||
if not len(data) == dataLength:
|
||||
raise ParseError('INVALID_DATA_LENGTH Expected: %s Recieved %s'%(dataLength,len(data)))
|
||||
return data
|
||||
def _validate_password(self,password):
|
||||
'''
|
||||
Validate GNTP Message against stored password
|
||||
'''
|
||||
self.password = password
|
||||
if password == None: raise Exception()
|
||||
keyHash = self.info.get('keyHash',None)
|
||||
if keyHash is None and self.password is None:
|
||||
return True
|
||||
if keyHash is None:
|
||||
raise AuthError('Invalid keyHash')
|
||||
if self.password is None:
|
||||
raise AuthError('Missing password')
|
||||
|
||||
password = self.password.encode('utf8')
|
||||
saltHash = self._decode_hex(self.info['salt'])
|
||||
|
||||
keyBasis = password+saltHash
|
||||
key = hashlib.md5(keyBasis).digest()
|
||||
keyHash = hashlib.md5(key).hexdigest()
|
||||
|
||||
if not keyHash.upper() == self.info['keyHash'].upper():
|
||||
raise AuthError('Invalid Hash')
|
||||
return True
|
||||
def validate(self):
|
||||
'''
|
||||
Verify required headers
|
||||
'''
|
||||
for header in self._requiredHeaders:
|
||||
if not self.headers.get(header,False):
|
||||
raise ParseError('Missing Notification Header: '+header)
|
||||
|
||||
def _format_info(self):
|
||||
'''
|
||||
Generate info line for GNTP Message
|
||||
@return: Info line string
|
||||
'''
|
||||
info = u'GNTP/%s %s'%(
|
||||
self.info.get('version'),
|
||||
self.info.get('messagetype'),
|
||||
)
|
||||
if self.info.get('encryptionAlgorithmID',None):
|
||||
info += ' %s:%s'%(
|
||||
self.info.get('encryptionAlgorithmID'),
|
||||
self.info.get('ivValue'),
|
||||
)
|
||||
else:
|
||||
info+=' NONE'
|
||||
|
||||
if self.info.get('keyHashAlgorithmID',None):
|
||||
info += ' %s:%s.%s'%(
|
||||
self.info.get('keyHashAlgorithmID'),
|
||||
self.info.get('keyHash'),
|
||||
self.info.get('salt')
|
||||
)
|
||||
|
||||
return info
|
||||
def _parse_dict(self,data):
|
||||
'''
|
||||
Helper function to parse blocks of GNTP headers into a dictionary
|
||||
@param data:
|
||||
@return: Dictionary of headers
|
||||
'''
|
||||
dict = {}
|
||||
for line in data.split('\r\n'):
|
||||
match = re.match('([\w-]+):(.+)', line)
|
||||
if not match: continue
|
||||
|
||||
key = match.group(1).strip()
|
||||
val = match.group(2).strip()
|
||||
dict[key] = val
|
||||
return dict
|
||||
def add_header(self,key,value):
|
||||
if isinstance(value, unicode):
|
||||
self.headers[key] = value
|
||||
else:
|
||||
self.headers[key] = unicode('%s'%value,'utf8','replace')
|
||||
def decode(self,data,password=None):
|
||||
'''
|
||||
Decode GNTP Message
|
||||
@param data:
|
||||
'''
|
||||
self.password = password
|
||||
self.raw = data
|
||||
parts = self.raw.split('\r\n\r\n')
|
||||
self.info = self._parse_info(data)
|
||||
self.headers = self._parse_dict(parts[0])
|
||||
def encode(self):
|
||||
'''
|
||||
Encode a GNTP Message
|
||||
@return: GNTP Message ready to be sent
|
||||
'''
|
||||
self.validate()
|
||||
EOL = u'\r\n'
|
||||
|
||||
message = self._format_info() + EOL
|
||||
#Headers
|
||||
for k,v in self.headers.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
message += EOL
|
||||
return message
|
||||
class GNTPRegister(_GNTPBase):
|
||||
"""Represents a GNTP Registration Command"""
|
||||
notifications = []
|
||||
_requiredHeaders = [
|
||||
'Application-Name',
|
||||
'Notifications-Count'
|
||||
]
|
||||
_requiredNotificationHeaders = ['Notification-Name']
|
||||
def __init__(self,data=None,password=None):
|
||||
'''
|
||||
@param data: (Optional) See decode()
|
||||
@param password: (Optional) Password to use while encoding/decoding messages
|
||||
'''
|
||||
self.info['messagetype'] = 'REGISTER'
|
||||
|
||||
if data:
|
||||
self.decode(data,password)
|
||||
else:
|
||||
self.set_password(password)
|
||||
self.add_header('Application-Name', 'pygntp')
|
||||
self.add_header('Notifications-Count', 0)
|
||||
self.add_origin_info()
|
||||
def validate(self):
|
||||
'''
|
||||
Validate required headers and validate notification headers
|
||||
'''
|
||||
for header in self._requiredHeaders:
|
||||
if not self.headers.get(header,False):
|
||||
raise ParseError('Missing Registration Header: '+header)
|
||||
for notice in self.notifications:
|
||||
for header in self._requiredNotificationHeaders:
|
||||
if not notice.get(header,False):
|
||||
raise ParseError('Missing Notification Header: '+header)
|
||||
def decode(self,data,password):
|
||||
'''
|
||||
Decode existing GNTP Registration message
|
||||
@param data: Message to decode.
|
||||
'''
|
||||
self.raw = data
|
||||
parts = self.raw.split('\r\n\r\n')
|
||||
self.info = self._parse_info(data)
|
||||
self._validate_password(password)
|
||||
self.headers = self._parse_dict(parts[0])
|
||||
|
||||
for i,part in enumerate(parts):
|
||||
if i==0: continue #Skip Header
|
||||
if part.strip()=='': continue
|
||||
notice = self._parse_dict(part)
|
||||
if notice.get('Notification-Name',False):
|
||||
self.notifications.append(notice)
|
||||
elif notice.get('Identifier',False):
|
||||
notice['Data'] = self._decode_binary(part,notice)
|
||||
#open('register.png','wblol').write(notice['Data'])
|
||||
self.resources[ notice.get('Identifier') ] = notice
|
||||
|
||||
def add_notification(self,name,enabled=True):
|
||||
'''
|
||||
Add new Notification to Registration message
|
||||
@param name: Notification Name
|
||||
@param enabled: Default Notification to Enabled
|
||||
'''
|
||||
notice = {}
|
||||
notice['Notification-Name'] = u'%s'%name
|
||||
notice['Notification-Enabled'] = u'%s'%enabled
|
||||
|
||||
self.notifications.append(notice)
|
||||
self.add_header('Notifications-Count', len(self.notifications))
|
||||
def encode(self):
|
||||
'''
|
||||
Encode a GNTP Registration Message
|
||||
@return: GNTP Registration Message ready to be sent
|
||||
'''
|
||||
self.validate()
|
||||
EOL = u'\r\n'
|
||||
|
||||
message = self._format_info() + EOL
|
||||
#Headers
|
||||
for k,v in self.headers.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
#Notifications
|
||||
if len(self.notifications)>0:
|
||||
for notice in self.notifications:
|
||||
message += EOL
|
||||
for k,v in notice.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
message += EOL
|
||||
return message
|
||||
|
||||
class GNTPNotice(_GNTPBase):
|
||||
"""Represents a GNTP Notification Command"""
|
||||
_requiredHeaders = [
|
||||
'Application-Name',
|
||||
'Notification-Name',
|
||||
'Notification-Title'
|
||||
]
|
||||
def __init__(self,data=None,app=None,name=None,title=None,password=None):
|
||||
'''
|
||||
|
||||
@param data: (Optional) See decode()
|
||||
@param app: (Optional) Set Application-Name
|
||||
@param name: (Optional) Set Notification-Name
|
||||
@param title: (Optional) Set Notification Title
|
||||
@param password: (Optional) Password to use while encoding/decoding messages
|
||||
'''
|
||||
self.info['messagetype'] = 'NOTIFY'
|
||||
|
||||
if data:
|
||||
self.decode(data,password)
|
||||
else:
|
||||
self.set_password(password)
|
||||
if app:
|
||||
self.add_header('Application-Name', app)
|
||||
if name:
|
||||
self.add_header('Notification-Name', name)
|
||||
if title:
|
||||
self.add_header('Notification-Title', title)
|
||||
self.add_origin_info()
|
||||
def decode(self,data,password):
|
||||
'''
|
||||
Decode existing GNTP Notification message
|
||||
@param data: Message to decode.
|
||||
'''
|
||||
self.raw = data
|
||||
parts = self.raw.split('\r\n\r\n')
|
||||
self.info = self._parse_info(data)
|
||||
self._validate_password(password)
|
||||
self.headers = self._parse_dict(parts[0])
|
||||
|
||||
for i,part in enumerate(parts):
|
||||
if i==0: continue #Skip Header
|
||||
if part.strip()=='': continue
|
||||
notice = self._parse_dict(part)
|
||||
if notice.get('Identifier',False):
|
||||
notice['Data'] = self._decode_binary(part,notice)
|
||||
#open('notice.png','wblol').write(notice['Data'])
|
||||
self.resources[ notice.get('Identifier') ] = notice
|
||||
def encode(self):
|
||||
'''
|
||||
Encode a GNTP Notification Message
|
||||
@return: GNTP Notification Message ready to be sent
|
||||
'''
|
||||
self.validate()
|
||||
EOL = u'\r\n'
|
||||
|
||||
message = self._format_info() + EOL
|
||||
#Headers
|
||||
for k,v in self.headers.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
message += EOL
|
||||
return message
|
||||
|
||||
class GNTPSubscribe(_GNTPBase):
|
||||
"""Represents a GNTP Subscribe Command"""
|
||||
def __init__(self,data=None,password=None):
|
||||
self.info['messagetype'] = 'SUBSCRIBE'
|
||||
self._requiredHeaders = [
|
||||
'Subscriber-ID',
|
||||
'Subscriber-Name',
|
||||
]
|
||||
if data:
|
||||
self.decode(data,password)
|
||||
else:
|
||||
self.set_password(password)
|
||||
self.add_origin_info()
|
||||
|
||||
class GNTPOK(_GNTPBase):
|
||||
"""Represents a GNTP OK Response"""
|
||||
_requiredHeaders = ['Response-Action']
|
||||
def __init__(self,data=None,action=None):
|
||||
'''
|
||||
@param data: (Optional) See _GNTPResponse.decode()
|
||||
@param action: (Optional) Set type of action the OK Response is for
|
||||
'''
|
||||
self.info['messagetype'] = '-OK'
|
||||
if data:
|
||||
self.decode(data)
|
||||
if action:
|
||||
self.add_header('Response-Action', action)
|
||||
self.add_origin_info()
|
||||
|
||||
class GNTPError(_GNTPBase):
|
||||
_requiredHeaders = ['Error-Code','Error-Description']
|
||||
def __init__(self,data=None,errorcode=None,errordesc=None):
|
||||
'''
|
||||
@param data: (Optional) See _GNTPResponse.decode()
|
||||
@param errorcode: (Optional) Error code
|
||||
@param errordesc: (Optional) Error Description
|
||||
'''
|
||||
self.info['messagetype'] = '-ERROR'
|
||||
if data:
|
||||
self.decode(data)
|
||||
if errorcode:
|
||||
self.add_header('Error-Code', errorcode)
|
||||
self.add_header('Error-Description', errordesc)
|
||||
self.add_origin_info()
|
||||
def error(self):
|
||||
return self.headers['Error-Code'],self.headers['Error-Description']
|
||||
|
||||
def parse_gntp(data,password=None):
|
||||
'''
|
||||
Attempt to parse a message as a GNTP message
|
||||
@param data: Message to be parsed
|
||||
@param password: Optional password to be used to verify the message
|
||||
'''
|
||||
match = re.match('GNTP/(?P<version>\d+\.\d+) (?P<messagetype>REGISTER|NOTIFY|SUBSCRIBE|\-OK|\-ERROR)',data,re.IGNORECASE)
|
||||
if not match:
|
||||
raise ParseError('INVALID_GNTP_INFO')
|
||||
info = match.groupdict()
|
||||
if info['messagetype'] == 'REGISTER':
|
||||
return GNTPRegister(data,password=password)
|
||||
elif info['messagetype'] == 'NOTIFY':
|
||||
return GNTPNotice(data,password=password)
|
||||
elif info['messagetype'] == 'SUBSCRIBE':
|
||||
return GNTPSubscribe(data,password=password)
|
||||
elif info['messagetype'] == '-OK':
|
||||
return GNTPOK(data)
|
||||
elif info['messagetype'] == '-ERROR':
|
||||
return GNTPError(data)
|
||||
raise ParseError('INVALID_GNTP_MESSAGE')
|
||||
172
gntp/notifier.py
Normal file
@@ -0,0 +1,172 @@
|
||||
"""
|
||||
The gntp.notifier module is provided as a simple way to send notifications
|
||||
using GNTP
|
||||
|
||||
.. note::
|
||||
This class is intended to mostly mirror the older Python bindings such
|
||||
that you should be able to replace instances of the old bindings with
|
||||
this class.
|
||||
`Original Python bindings <http://code.google.com/p/growl/source/browse/Bindings/python/Growl.py>`_
|
||||
|
||||
"""
|
||||
import gntp
|
||||
import socket
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class GrowlNotifier(object):
|
||||
"""Helper class to simplfy sending Growl messages
|
||||
|
||||
:param string applicationName: Sending application name
|
||||
:param list notification: List of valid notifications
|
||||
:param list defaultNotifications: List of notifications that should be enabled
|
||||
by default
|
||||
:param string applicationIcon: Icon URL
|
||||
:param string hostname: Remote host
|
||||
:param integer port: Remote port
|
||||
"""
|
||||
applicationName = 'Python GNTP'
|
||||
notifications = []
|
||||
defaultNotifications = []
|
||||
applicationIcon = None
|
||||
passwordHash = 'MD5'
|
||||
|
||||
#GNTP Specific
|
||||
password = None
|
||||
hostname = 'localhost'
|
||||
port = 23053
|
||||
|
||||
def __init__(self, applicationName=None, notifications=None, defaultNotifications=None, applicationIcon=None, hostname=None, password=None, port=None):
|
||||
if applicationName:
|
||||
self.applicationName = applicationName
|
||||
assert self.applicationName, 'An application name is required.'
|
||||
|
||||
if notifications:
|
||||
self.notifications = list(notifications)
|
||||
assert self.notifications, 'A sequence of one or more notification names is required.'
|
||||
|
||||
if defaultNotifications is not None:
|
||||
self.defaultNotifications = list(defaultNotifications)
|
||||
elif not self.defaultNotifications:
|
||||
self.defaultNotifications = list(self.notifications)
|
||||
|
||||
if applicationIcon is not None:
|
||||
self.applicationIcon = self._checkIcon(applicationIcon)
|
||||
elif self.applicationIcon is not None:
|
||||
self.applicationIcon = self._checkIcon(self.applicationIcon)
|
||||
|
||||
#GNTP Specific
|
||||
if password:
|
||||
self.password = password
|
||||
|
||||
if hostname:
|
||||
self.hostname = hostname
|
||||
assert self.hostname, 'Requires valid hostname'
|
||||
|
||||
if port:
|
||||
self.port = int(port)
|
||||
assert isinstance(self.port, int), 'Requires valid port'
|
||||
|
||||
def _checkIcon(self, data):
|
||||
'''
|
||||
Check the icon to see if it's valid
|
||||
@param data:
|
||||
@todo Consider checking for a valid URL
|
||||
'''
|
||||
return data
|
||||
|
||||
def register(self):
|
||||
"""Send GNTP Registration
|
||||
|
||||
.. warning::
|
||||
Before sending notifications to Growl, you need to have
|
||||
sent a registration message at least once
|
||||
"""
|
||||
logger.info('Sending registration to %s:%s', self.hostname, self.port)
|
||||
register = gntp.GNTPRegister()
|
||||
register.add_header('Application-Name', self.applicationName)
|
||||
for notification in self.notifications:
|
||||
enabled = notification in self.defaultNotifications
|
||||
register.add_notification(notification, enabled)
|
||||
if self.applicationIcon:
|
||||
register.add_header('Application-Icon', self.applicationIcon)
|
||||
if self.password:
|
||||
register.set_password(self.password, self.passwordHash)
|
||||
response = self._send('register', register.encode())
|
||||
if isinstance(response, gntp.GNTPOK):
|
||||
return True
|
||||
logger.error('Invalid response %s', response.error())
|
||||
return response.error()
|
||||
|
||||
def notify(self, noteType, title, description, icon=None, sticky=False, priority=None):
|
||||
"""Send a GNTP notifications
|
||||
|
||||
.. warning::
|
||||
Must have registered with growl beforehand or messages will be ignored
|
||||
|
||||
:param string noteType: One of the notification names registered earlier
|
||||
:param string title: Notification title (usually displayed on the notification)
|
||||
:param string description: The main content of the notification
|
||||
:param string icon: Icon URL path
|
||||
:param boolean sticky: Sticky notification
|
||||
:param integer priority: Message priority level from -2 to 2
|
||||
"""
|
||||
logger.info('Sending notification [%s] to %s:%s', noteType, self.hostname, self.port)
|
||||
assert noteType in self.notifications
|
||||
notice = gntp.GNTPNotice()
|
||||
notice.add_header('Application-Name', self.applicationName)
|
||||
notice.add_header('Notification-Name', noteType)
|
||||
notice.add_header('Notification-Title', title)
|
||||
if self.password:
|
||||
notice.set_password(self.password, self.passwordHash)
|
||||
if sticky:
|
||||
notice.add_header('Notification-Sticky', sticky)
|
||||
if priority:
|
||||
notice.add_header('Notification-Priority', priority)
|
||||
if icon:
|
||||
notice.add_header('Notification-Icon', self._checkIcon(icon))
|
||||
if description:
|
||||
notice.add_header('Notification-Text', description)
|
||||
response = self._send('notify', notice.encode())
|
||||
if isinstance(response, gntp.GNTPOK):
|
||||
return True
|
||||
logger.error('Invalid response %s', response.error())
|
||||
return response.error()
|
||||
|
||||
def subscribe(self, id, name, port):
|
||||
"""Send a Subscribe request to a remote machine"""
|
||||
sub = gntp.GNTPSubscribe()
|
||||
sub.add_header('Subscriber-ID', id)
|
||||
sub.add_header('Subscriber-Name', name)
|
||||
sub.add_header('Subscriber-Port', port)
|
||||
if self.password:
|
||||
sub.set_password(self.password, self.passwordHash)
|
||||
response = self._send('subscribe', sub.encode())
|
||||
if isinstance(response, gntp.GNTPOK):
|
||||
return True
|
||||
logger.error('Invalid response %s', response.error())
|
||||
return response.error()
|
||||
|
||||
def _send(self, type, data):
|
||||
"""Send the GNTP Packet"""
|
||||
#logger.debug('To : %s:%s <%s>\n%s', self.hostname, self.port, type, data)
|
||||
#Less verbose please
|
||||
logger.debug('To : %s:%s <%s>', self.hostname, self.port, type)
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
s.connect((self.hostname, self.port))
|
||||
s.send(data.encode('utf8', 'replace'))
|
||||
try:
|
||||
s.settimeout(10)
|
||||
except:
|
||||
pass
|
||||
response = gntp.parse_gntp(s.recv(1024))
|
||||
s.close()
|
||||
|
||||
#logger.debug('From : %s:%s <%s>\n%s', self.hostname, self.port, response.__class__, response)
|
||||
#Less verbose please
|
||||
logger.debug('From : %s:%s <%s>', self.hostname, self.port, response.__class__)
|
||||
|
||||
return response
|
||||
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 281 KiB After Width: | Height: | Size: 281 KiB |
BIN
icons/sabnzbd16.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
icons/sabnzbd16green.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
icons/sabnzbd16paused.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath=".."#-->
|
||||
<!--#set global $helpsubject="Configure"#-->
|
||||
<!--#set global $helpsubject="Configure-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu=""#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="configure-categories"#-->
|
||||
<!--#set global $helpsubject="configure-categories-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="categories"#-->
|
||||
@@ -72,6 +72,7 @@ $T('explain-relFolder') $defdir<br/>
|
||||
<option value="1" <!--#if $slot.priority == 1 then 'selected' else ''#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == 0 then 'selected' else ''#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == -1 then 'selected' else ''#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $slot.priority == -2 then 'selected' else ''#-->>$T('pr-paused')</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Directories+V2"#-->
|
||||
<!--#set global $helpsubject="Configure+Folders-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="directories"#-->
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+General+V2"#-->
|
||||
<!--#set global $helpsubject="Configure+General-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="general"#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Index+Sites"#-->
|
||||
<!--#set global $helpsubject="Configure+Indexers-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="newzbin"#-->
|
||||
@@ -49,7 +49,7 @@ $T('explain-bookmark_rate')<br>
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('processedBM')</legend>
|
||||
<!--#for $msgid in $bookmarks_list#-->
|
||||
<a href="https://www.newzbin.com/browse/post/$msgid/" target="_blank">$msgid</a>
|
||||
<a href="https://$newzbin_url/browse/post/$msgid/" target="_blank">$msgid</a>
|
||||
<!--#end for#-->
|
||||
</fieldset>
|
||||
<!--#end if#-->
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Email"#-->
|
||||
<!--#set global $helpsubject="Configure+Notifications-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl" #-->
|
||||
|
||||
<!--#set global $submenu="email"#-->
|
||||
@@ -52,11 +52,39 @@ $T('explain-email_account')<br>
|
||||
<strong>$T('opt-email_pwd'):</strong><br>
|
||||
$T('explain-email_pwd')<br>
|
||||
<input type="password" size="35" name="email_pwd" value="$email_pwd">
|
||||
<input type="hidden" name="session" value="$session">
|
||||
</fieldset>
|
||||
|
||||
<!--#if $have_growl or $have_ntfosd#-->
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('growlSettings')</legend>
|
||||
<!--#if $have_ntfosd#-->
|
||||
<label><input type="checkbox" name="ntfosd_enable" value="1" <!--#if $ntfosd_enable != "0" then "checked=1" else ""#--> /> <strong>$T('opt-ntfosd_enable'):</strong></label><br>
|
||||
$T('explain-ntfosd_enable')
|
||||
<br/>
|
||||
<br/>
|
||||
<!--#end if#-->
|
||||
<!--#if $have_growl#-->
|
||||
<label><input type="checkbox" name="growl_enable" value="1" <!--#if $growl_enable != "0" then "checked=1" else ""#--> /> <strong>$T('opt-growl_enable'):</strong></label><br>
|
||||
$T('explain-growl_enable')
|
||||
<br/>
|
||||
<br/>
|
||||
<strong>$T('opt-growl_server'):</strong><br>
|
||||
$T('explain-growl_server')<br>
|
||||
<input type="text" size="35" name="growl_server" value="$growl_server">
|
||||
<br>
|
||||
<br>
|
||||
<strong>$T('opt-growl_password'):</strong><br>
|
||||
$T('explain-growl_password')<br>
|
||||
<input type="password" size="35" name="growl_password" value="$growl_password">
|
||||
</fieldset>
|
||||
<!--#end if#-->
|
||||
<!--#end if#-->
|
||||
|
||||
</div>
|
||||
<input type="hidden" name="session" value="$session">
|
||||
<p><input type="submit" value="$T('button-saveChanges')">
|
||||
<input type="button" onclick="if (confirm('$T('askTestEmail').replace("'","`") ')) { this.form.action='testmail?session=$session&'; this.form.submit(); return false;}" value="$T('link-testEmail')"/>
|
||||
<input type="button" onclick="this.form.action='testnotification?session=$session&'; this.form.submit(); return false;"value="$T('testNotify')"/>
|
||||
</p>
|
||||
</form>
|
||||
<!--#if $lastmail#-->
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+RSS+V2"#-->
|
||||
<!--#set global $helpsubject="Configure+RSS-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="rss"#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Scheduling+V2"#-->
|
||||
<!--#set global $helpsubject="Configure+Scheduling-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="scheduling"#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Servers+V2"#-->
|
||||
<!--#set global $helpsubject="Configure+Servers-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="servers"#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Sorting"#-->
|
||||
<!--#set global $helpsubject="Configure+Sorting-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="sorting"#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Switches+V3"#-->
|
||||
<!--#set global $helpsubject="Configure+Switches-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="switches"#-->
|
||||
@@ -14,6 +14,9 @@
|
||||
<label><input type="checkbox" name="quick_check" value="1" <!--#if $quick_check > 0 then "checked=1" else ""#--> /> <strong>$T('opt-quick_check')</strong></label><br/>
|
||||
$T('explain-quick_check')<br>
|
||||
<br/>
|
||||
<label><input type="checkbox" name="pre_check" value="1" <!--#if $pre_check > 0 then "checked=1" else ""#--> /> <strong>$T('opt-pre_check')</strong></label><br/>
|
||||
$T('explain-pre_check')<br>
|
||||
<br/>
|
||||
<label><input type="checkbox" name="enable_unrar" value="1" <!--#if $enable_unrar > 0 then "checked=1" else ""#--> /> <strong>$T('opt-enable_unrar')</strong></label><br>
|
||||
$T('explain-enable_unrar')<br>
|
||||
<br>
|
||||
@@ -97,6 +100,13 @@
|
||||
</fieldset>
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('otherSwitches')</legend>
|
||||
<label><strong>$T('opt-max_art_tries')</strong></label><br>
|
||||
$T('explain-max_art_tries')<br>
|
||||
<input type="text" size=5" name="max_art_tries" value="$max_art_tries" />
|
||||
<br><br>
|
||||
<label><input type="checkbox" name="max_opt_only" value="1" <!--#if $max_opt_only > 0 then "checked=1" else ""#--> /> <strong>$T('opt-max_opt_only')</strong></label><br>
|
||||
$T('explain-max_opt_only')<br>
|
||||
<br>
|
||||
<label><input type="checkbox" name="auto_disconnect" value="1" <!--#if $auto_disconnect > 0 then "checked=1" else ""#--> /> <strong>$T('opt-auto_disconnect')</strong></label><br>
|
||||
$T('explain-auto_disconnect')<br>
|
||||
<br>
|
||||
@@ -146,6 +156,32 @@
|
||||
</select>
|
||||
<br/>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="EntryFieldSet">
|
||||
<strong>$T('opt-quota_size'):</strong><br/>
|
||||
$T('explain-quota_size')<br/>
|
||||
<input type="text" name="quota_size" value="$quota_size"/>
|
||||
<br>
|
||||
<br>
|
||||
<strong>$T('opt-quota_period'):</strong><br>
|
||||
$T('explain-quota_period')<br>
|
||||
<select name="ssl_type">
|
||||
<option value="m" <!--#if $quota_period == 'm' then 'selected' else ''#--> >$T('month')</option>
|
||||
<option value="w" <!--#if $quota_period == 'w' then 'selected' else ''#--> >$T('week')</option>
|
||||
<option value="d" <!--#if $quota_period == 'd' then 'selected' else ''#--> >$T('day')</option>
|
||||
<option value="x" <!--#if $quota_period == 'x' then 'selected' else ''#--> >$T('manual')</option>
|
||||
</select>
|
||||
<br/><br/>
|
||||
<strong>$T('opt-quota_day'):</strong><br/>
|
||||
$T('explain-quota_day')<br/>
|
||||
<input type="text" name="quota_day" value="$quota_day"/>
|
||||
<br>
|
||||
<br>
|
||||
<legend>$T('swtag-quota')</legend>
|
||||
<label><input type="checkbox" name="quota_resume" value="1" <!--#if $quota_resume > 0 then "checked=1" else ""#--> /> <strong>$T('opt-quota_resume')</strong></label><br>
|
||||
$T('explain-quota_resume')<br>
|
||||
<br/>
|
||||
</fieldset>
|
||||
</div>
|
||||
<p><input type="submit" value="$T('button-saveChanges')"></p>
|
||||
</form>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<span class="SubMenu">
|
||||
<a href="./purge?session=$session" onclick="return confirm('$T('purgeHistConf').replace("'","`") ');">$T('purgeHist')</a> |
|
||||
<a href="./purge_failed?session=$session" onclick="return confirm('$T('purgeHistFailedConf').replace("'","`") ');">$T('purgeHistFailed')</a> |
|
||||
<a href="./purge_failed?session=$session&del_files=1" onclick="return confirm('$T('purgeFailed-Files').replace("'","`") ');">$T('purgeFailed-Files')</a> |
|
||||
<!--#if $isverbose#-->
|
||||
<a href="./tog_verbose?session=$session">$T('hideDetails')</a> |
|
||||
<!--#else#-->
|
||||
|
||||
@@ -9,14 +9,17 @@
|
||||
<br>
|
||||
<!--#if int($cache_max)#-->
|
||||
<!--#set $msg=$T('ft-buffer@2')%($cache_art, $cache_size)#-->
|
||||
$msg<br>
|
||||
$msg
|
||||
<!--#end if#-->
|
||||
<!--#if $have_quota#-->
|
||||
| <strong>$T('quota-left'):</strong> $left_quota ⁄ $quota</strong>
|
||||
<!--#end if#-->
|
||||
<!--#if $new_release#-->
|
||||
<!--#set $msg=$T('ft-newRelease@1')%($new_release)#-->
|
||||
<b>$msg <a href="$new_rel_url/" target="_blank">SF.net</a></b><br>
|
||||
<!--#end if#-->
|
||||
<!--#if $have_warnings != "0"#-->
|
||||
<strong><a href="$statpath/connections/">$T('ft-warning')($have_warnings)!</a></strong>
|
||||
<strong><a href="$statpath/status/">$T('ft-warning')($have_warnings)!</a></strong>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
<!--#set $mbleftrnd = str(int(float($mbleft)))#-->
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
<a href="$cpath/general/">$T('cmenu-general')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="directories"#-->
|
||||
<!--#if $submenu=="folders"#-->
|
||||
<a class="current" href="./">$T('cmenu-folders')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$cpath/directories/">$T('cmenu-folders')</a> |
|
||||
<a href="$cpath/folders/">$T('cmenu-folders')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="switches"#-->
|
||||
@@ -41,16 +41,16 @@
|
||||
<a href="$cpath/rss/">$T('cmenu-rss')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="email"#-->
|
||||
<a class="current" href="./">$T('cmenu-email')</a> |
|
||||
<!--#if $submenu=="notify"#-->
|
||||
<a class="current" href="./">$T('cmenu-notif')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$cpath/email/">$T('cmenu-email')</a> |
|
||||
<a href="$cpath/notify/">$T('cmenu-notif')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="newzbin"#-->
|
||||
<!--#if $submenu=="indexers"#-->
|
||||
<a class="current" href="./">$T('cmenu-newzbin')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$cpath/newzbin/">$T('cmenu-newzbin')</a> |
|
||||
<a href="$cpath/indexers/">$T('cmenu-newzbin')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="categories"#-->
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<!--#if $topmenu=='connections'#-->
|
||||
<a class="current" href="$mypath/">$T('menu-cons')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$statpath/connections/">$T('menu-cons')</a> |
|
||||
<a href="$statpath/status/">$T('menu-cons')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--[if IE]>
|
||||
|
||||
@@ -103,6 +103,7 @@ $T('onQueueFinish'):
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=1" <!--#if $slot.priority == "High" then "selected" else ""#-->>$T('pr-high')</option>
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=0" <!--#if $slot.priority == "Normal" then "selected" else ""#-->>$T('pr-normal')</option>
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=-1" <!--#if $slot.priority == "Low" then "selected" else ""#-->>$T('pr-low')</option>
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=-4" <!--#if $slot.priority == "Stop" then "selected" else ""#-->>$T('pr-stop')</option>
|
||||
</select></form>
|
||||
<!--#end if#-->
|
||||
</td>
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
<!--#set global $have_refresh=5#-->
|
||||
<!--#set global $topmenu="connections"#-->
|
||||
<!--#set global $statpath=".."#-->
|
||||
<!--#set global $helpsubject="GUI+Connections"#-->
|
||||
<!--#set global $helpsubject="GUI+Status-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<span class="SubMenu">
|
||||
<!--#set $msg=$T('askTestEmail')#-->
|
||||
<!--#if $have_quota#-->
|
||||
<a href="./reset_quota?session=$session">$T('link-resetQuota')</a> |
|
||||
<!--#end if#-->
|
||||
<a href="./disconnect?session=$session">$T('link-forceDisc')</a> |
|
||||
<a href="./showlog?session=$session">$T('link-showLog')</a>
|
||||
$T('logging'):
|
||||
1
interfaces/Config
Submodule
@@ -4,7 +4,7 @@
|
||||
<!-- start Nzo footer -->
|
||||
#else#
|
||||
<!-- start other footer -->
|
||||
#if $pane!="Connections" and $pane !="RSS"#</div>#end if#
|
||||
#if $pane!="Status" and $pane !="RSS"#</div>#end if#
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#if $pane=="Connections" or $pane=="Config"#
|
||||
#if $pane=="Status" or $pane=="Config"#
|
||||
#set global $path = '../'#
|
||||
#else if $pane=="Main"#
|
||||
#set global $path = ''#
|
||||
@@ -13,7 +13,7 @@
|
||||
<title>SABnzbd $version - $T('queued'): $mbleft $T('MB')</title>
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="${path}rss?mode=history"/>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${path}static/stylesheets/jqueryui/overcast/jquery-ui-1.8.9.custom.css?$version"/>
|
||||
<link rel="stylesheet" type="text/css" href="${path}static/stylesheets/jqueryui/overcast/jquery-ui-1.8.15.custom.css?$version"/>
|
||||
#if $color_scheme#
|
||||
<link rel="shortcut icon" type="image/ico" href="${path}static/stylesheets/colorschemes/$color_scheme/images/sabnzbdplus.ico"/>
|
||||
<link rel="stylesheet" type="text/css" href="${path}static/stylesheets/colorschemes/$color_scheme/${color_scheme}.css?$version"/>
|
||||
@@ -83,16 +83,16 @@
|
||||
</ul>
|
||||
<ul class="menu" id="navigation_menu_left">
|
||||
<li#if $pane=="Main"# class="active first"#else# class="first"#end if#><a href="${path}"><span class="icon_nav_download">$T('Plush-downloads').capitalize()</span></a></li>
|
||||
<li#if $pane=="Connections"# class="active"#end if#><a href="${path}connections"><span class="icon_nav_connections">$T('menu-cons').capitalize()</span></a></li>
|
||||
<li#if $pane=="RSS"# class="active"#end if#><a href="${path}config/rss"><span class="icon_nav_rss">$T('rss').upper()</span></a></li>
|
||||
<li#if $pane!="RSS" and $pane!="Nzo" and ($pane=="Config" or $path=='../../')# class="active last"#else# class="last"#end if#><a href="${path}config"><span class="icon_nav_config">$T('menu-config').capitalize()</span></a></li>
|
||||
<li#if $pane=="Status"# class="active"#end if#><a href="${path}status/"><span class="icon_nav_connections">$T('menu-cons').capitalize()</span></a></li>
|
||||
<li#if $pane=="RSS"# class="active"#end if#><a href="${path}config/rss/"><span class="icon_nav_rss">$T('rss').upper()</span></a></li>
|
||||
<li#if $pane!="RSS" and $pane!="Nzo" and ($pane=="Config" or $path=='../../')# class="active last"#else# class="last"#end if#><a href="${path}config/"><span class="icon_nav_config">$T('menu-config').capitalize()</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="nav_text_right">
|
||||
#if $loadavg#$T('ft-sysload'): <span id="loadavg">$loadavg</span>#end if#
|
||||
</div>
|
||||
<div id="nav_text_left">
|
||||
<span id="warning_box"><b><a href="${path}connections/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
|
||||
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
|
||||
#if $pane=="Main"#
|
||||
#if $new_release#⋅ <a href="$new_rel_url" id="new_release" target="_blank">$T('Plush-updateAvailable').replace(' ',' ')</a>#end if#
|
||||
#if $warning#⋅ <a id="warning_message">$warning.replace(' ',' ')</a>#end if#
|
||||
@@ -105,33 +105,35 @@
|
||||
|
||||
#if $pane=="Main"#
|
||||
#else if $pane=="Nzo"#
|
||||
#else if $pane=="Connections" or $pane =="RSS"#
|
||||
#else if $pane=="Status" or $pane =="RSS"#
|
||||
<div id="config_container" class="config_margin_status lang-$active_lang">
|
||||
<div id="config_content">
|
||||
#else#
|
||||
#if $pane=="Connections"#
|
||||
#if $pane=="Status"#
|
||||
#else if $pane=="RSS"#
|
||||
#else#
|
||||
<div class="config_nav">
|
||||
<ul>
|
||||
<li><a class="#if $pane=="General"#nav_active#end if#" id="config_nav_general" href="${path}config/general">
|
||||
<li><a class="#if $pane=="General"#nav_active#end if#" id="config_nav_general" href="${path}config/general/">
|
||||
<div class="config_sprite_container sprite_config_nav_general">$T('cmenu-general')</div></a></li>
|
||||
<li><a class="#if $pane=="Folders"#nav_active#end if#" id="config_nav_directories" href="${path}config/directories">
|
||||
<li><a class="#if $pane=="Folders"#nav_active#end if#" id="config_nav_directories" href="${path}config/folders/">
|
||||
<div class="config_sprite_container sprite_config_nav_folders">$T('cmenu-folders')</div></a></li>
|
||||
<li><a class="#if $pane=="Switches"#nav_active#end if#" id="config_nav_switches" href="${path}config/switches">
|
||||
<li><a class="#if $pane=="Switches"#nav_active#end if#" id="config_nav_switches" href="${path}config/switches/">
|
||||
<div class="config_sprite_container sprite_config_nav_switches">$T('cmenu-switches')</div></a></li>
|
||||
<li><a class="#if $pane=="Servers"#nav_active#end if#" id="config_nav_server" href="${path}config/server">
|
||||
<li><a class="#if $pane=="Servers"#nav_active#end if#" id="config_nav_server" href="${path}config/server/">
|
||||
<div class="config_sprite_container sprite_config_nav_servers">$T('cmenu-servers')</div></a></li>
|
||||
<li><a class="#if $pane=="Scheduling"#nav_active#end if#" id="config_nav_scheduling" href="${path}config/scheduling">
|
||||
<li><a class="#if $pane=="Scheduling"#nav_active#end if#" id="config_nav_scheduling" href="${path}config/scheduling/">
|
||||
<div class="config_sprite_container sprite_config_nav_scheduling">$T('Plush-cmenu-scheduling')</div></a></li>
|
||||
<li><a class="#if $pane=="Email"#nav_active#end if#" id="config_nav_email" href="${path}config/email">
|
||||
<div class="config_sprite_container sprite_config_nav_email">$T('cmenu-email')</div></a></li>
|
||||
<li><a class="#if $pane=="Index Sites"#nav_active#end if#" id="config_nav_index_sites" href="${path}config/newzbin">
|
||||
<li><a class="#if $pane=="Email"#nav_active#end if#" id="config_nav_email" href="${path}config/notify/">
|
||||
<div class="config_sprite_container sprite_config_nav_email">$T('cmenu-notif')</div></a></li>
|
||||
<li><a class="#if $pane=="Index Sites"#nav_active#end if#" id="config_nav_index_sites" href="${path}config/indexers/">
|
||||
<div class="config_sprite_container sprite_config_nav_indexsites">$T('cmenu-newzbin')</div></a></li>
|
||||
<li><a class="#if $pane=="Categories"#nav_active#end if#" id="config_nav_categories" href="${path}config/categories">
|
||||
<li><a class="#if $pane=="Categories"#nav_active#end if#" id="config_nav_categories" href="${path}config/categories/">
|
||||
<div class="config_sprite_container sprite_config_nav_categories">$T('cmenu-cat')</div></a></li>
|
||||
<li><a class="#if $pane=="Sorting"#nav_active#end if#" id="config_nav_sorting" href="${path}config/sorting">
|
||||
<li><a class="#if $pane=="Sorting"#nav_active#end if#" id="config_nav_sorting" href="${path}config/sorting/">
|
||||
<div class="config_sprite_container sprite_config_nav_sorting">$T('cmenu-sorting')</div></a></li>
|
||||
<li><a class="#if $pane=="Special"#nav_active#end if#" id="config_nav_special" href="${path}config/special/">
|
||||
<div class="config_sprite_container sprite_config_nav_special">$T('cmenu-special')</div></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
#end if#
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
<div id="plush_options_modal">
|
||||
|
||||
<p><a href="connections/disconnect?session=$session" class="juiButton">$T('link-forceDisc')</a></p>
|
||||
<p><a href="status/disconnect?session=$session" class="juiButton">$T('link-forceDisc')</a></p>
|
||||
<p><a href="config/restart?session=$session" class="juiButton" id="sabnzbd_restart" rel="#echo $T('explain-Restart').replace("<br />","\n")#">$T('sch-restart')</a>
|
||||
<a href="shutdown?session=$session" class="juiButton" id="sabnzbd_shutdown" rel="$T('shutdownOK?')">$T('sch-shutdown')</a></p>
|
||||
<br/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Config"#-->
|
||||
<!--#set global $help_uri="Configure"#-->
|
||||
<!--#set global $help_uri="Configure-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<div id="config-components">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Categories"#-->
|
||||
<!--#set global $help_uri="configure-categories"#-->
|
||||
<!--#set global $help_uri="configure-categories-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<div style="padding:10px; overflow:auto;">
|
||||
@@ -55,6 +55,7 @@
|
||||
<option value="1" <!--#if $slot.priority == 1 then 'selected' else ''#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == 0 then 'selected' else ''#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == -1 then 'selected' else ''#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $slot.priority == -2 then 'selected' else ''#-->>$T('pr-paused')</option>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Folders"#-->
|
||||
<!--#set global $help_uri="Configure+Directories+V2"#-->
|
||||
<!--#set global $help_uri="Configure+Folders-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveDirectories" method="post" name="fullform" id="fullform">
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="General"#-->
|
||||
<!--#set global $help_uri="Configure+General+V2"#-->
|
||||
<!--#set global $help_uri="Configure+General-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveGeneral" method="post" name="fullform" id="fullform" autocomplete="off">
|
||||
@@ -112,6 +112,7 @@
|
||||
<span class="component-title">$T('opt-apikey')</span>
|
||||
<input type="text" id="apikey" value="$session" class="apikey">
|
||||
<input type="button" class="juiButton" value="$T('button-apikey')" id="generate_new_apikey" rel="$T('Plush-confirm')">
|
||||
<input type="button" class="juiButton show_qrcode" value="$T('qr-code')" title="$T('explain-qr-code')" href="https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=$session" >
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
@@ -123,6 +124,7 @@
|
||||
<span class="component-title">$T('opt-nzbkey')</span>
|
||||
<input type="text" id="nzbkey" value="$nzb_key" class="apikey">
|
||||
<input type="button" class="juiButton" value="$T('button-apikey')" id="generate_new_nzbkey" rel="$T('Plush-confirm')">
|
||||
<input type="button" class="juiButton show_qrcode" value="$T('qr-code')" title="$T('explain-qr-code')" href="https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=$nzb_key" >
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Index Sites"#-->
|
||||
<!--#set global $help_uri="Configure+Index+Sites"#-->
|
||||
<!--#set global $help_uri="Configure+Indexers-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveNewzbin" method="post" name="fullform" id="fullform" autocomplete="off">
|
||||
@@ -121,7 +121,7 @@
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<!--#for $msgid in $bookmarks_list#-->
|
||||
<a href="https://www.newzbin.com/browse/post/$msgid/" target="_blank">$msgid</a><br/>
|
||||
<a href="https://$newzbin_url/browse/post/$msgid/" target="_blank">$msgid</a><br/>
|
||||
<!--#end for#-->
|
||||
</fieldset>
|
||||
</div><!-- /component-group4 -->
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Email"#-->
|
||||
<!--#set global $help_uri="Configure+Email"#-->
|
||||
<!--#set global $help_uri="Configure+Notifications-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<script>
|
||||
@@ -111,6 +111,54 @@
|
||||
</fieldset>
|
||||
</div><!-- /component-group2 -->
|
||||
|
||||
<!--#if $have_growl or $have_ntfosd#-->
|
||||
<div id="core-component-group3" class="component-group clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3>$T('growlSettings')</h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<!--#if $have_ntfosd#-->
|
||||
<div class="field-pair">
|
||||
<input type="checkbox" name="ntfosd_enable" id="ntfosd_enable" value="1" <!--#if $ntfosd_enable != "0" then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="ntfosd_enable">
|
||||
<span class="component-title">$T('opt-ntfosd_enable')</span>
|
||||
<span class="component-desc">$T('explain-ntfosd_enable')</span>
|
||||
</label>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
<!--#if $have_growl#-->
|
||||
<div class="field-pair">
|
||||
<input type="checkbox" name="growl_enable" id="growl_enable" value="1" <!--#if $growl_enable != "0" then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="growl_enable">
|
||||
<span class="component-title">$T('opt-growl_enable')</span>
|
||||
<span class="component-desc">$T('explain-growl_enable')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="growl_server">
|
||||
<span class="component-title">$T('opt-growl_server')</span>
|
||||
<input type="text" name="growl_server" id="growl_server" value="$growl_server"/>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-growl_server')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="growl_password">
|
||||
<span class="component-title">$T('opt-growl_password')</span>
|
||||
<input type="password" size="35" name="growl_password" id="growl_password" value="$growl_password"/>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-growl_password')</span>
|
||||
</label>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
</fieldset>
|
||||
</div><!-- /component-group3 -->
|
||||
<!--#end if#-->
|
||||
|
||||
<div class="component-group-last clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3> </h3>
|
||||
@@ -120,6 +168,8 @@
|
||||
<a id="save"><span class="config_sprite_container sprite_config_save"> </span> $T('button-saveChanges')</a>
|
||||
<a id="test_email" href="testmail?session=$session" rel="$T('askTestEmail')">
|
||||
<span class="config_sprite_container sprite_config_email_test"> </span> $T('link-testEmail')</a>
|
||||
<a id="test_notification" href="testnotification?session=$session">
|
||||
<span class="config_sprite_container sprite_config_email_test"> </span> $T('testNotify')</a>
|
||||
</div>
|
||||
<!--#if $lastmail#-->
|
||||
$T('emailResult') = <b>$lastmail</b>
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="RSS"#-->
|
||||
<!--#set global $help_uri="Configure+RSS+V2"#-->
|
||||
<!--#set global $help_uri="Configure+RSS-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
|
||||
@@ -179,7 +179,7 @@ $T('explain-RSS')
|
||||
<th>$T('rss-filter')</th>
|
||||
<!--#if $rss[$feed]['pick_cat']#--><th>$T('category')</th><!--#end if#-->
|
||||
<th>$T('priority')</th>
|
||||
<th>Mode</th>
|
||||
<th>$T('mode')</th>
|
||||
<!--#if $rss[$feed]['pick_script']#--><th>$T('script')</th><!--#end if#-->
|
||||
<th>$T('Plush-rss-actions')</th>
|
||||
</tr>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Scheduling"#-->
|
||||
<!--#set global $help_uri="Configure+Scheduling+V2"#-->
|
||||
<!--#set global $help_uri="Configure+Scheduling-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<%
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Servers"#-->
|
||||
<!--#set global $help_uri="Configure+Servers+V2"#-->
|
||||
<!--#set global $help_uri="Configure+Servers-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<div id="config-components">
|
||||
@@ -118,6 +118,8 @@
|
||||
<span> </span>
|
||||
<br/><br/>
|
||||
<input type="button" class="juiButton delServer" style="padding:4px;" value="$T('button-delServer')" rel="$T('Plush-confirm') "/>
|
||||
<br/><br/>
|
||||
<input type="button" class="juiButton clrServer" style="padding:4px;" value="$T('button-clrServer')" rel="$T('Plush-confirm') "/>
|
||||
</p>
|
||||
|
||||
<!--#if 'amounts' in $servers[$server]#-->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Sorting"#-->
|
||||
<!--#set global $help_uri="Configure+Sorting"#-->
|
||||
<!--#set global $help_uri="Configure+Sorting-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<script type="text/javascript">
|
||||
@@ -244,16 +244,29 @@ function showDiv(id)
|
||||
</tr></thead>
|
||||
<tr>
|
||||
<td align="right"><strong>$T('show-name'):</strong></td>
|
||||
<td>%sn</td>
|
||||
<td>%sN</td>
|
||||
<td>$T('show-sp-name')</td>
|
||||
</tr><tr>
|
||||
<td></td>
|
||||
<td>%s.n</td>
|
||||
<td>%s.N</td>
|
||||
<td>$T('show-dot-name')</td>
|
||||
</tr><tr>
|
||||
<td></td>
|
||||
<td>%s_n</td>
|
||||
<td>%s_N</td>
|
||||
<td>$T('show-us-name')</td>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>%sn</td>
|
||||
<td>$T('show-sp-name') ($T('case-adjusted'))</td>
|
||||
</tr><tr>
|
||||
<td></td>
|
||||
<td>%s.n</td>
|
||||
<td>$T('show-dot-name') ($T('case-adjusted'))</td>
|
||||
</tr><tr>
|
||||
<td></td>
|
||||
<td>%s_n</td>
|
||||
<td>$T('show-us-name') ($T('case-adjusted'))</td>
|
||||
</tr><tr>
|
||||
<td align="right"><strong>$T('show-seasonNum'):</strong></td>
|
||||
<td>%s</td>
|
||||
|
||||
66
interfaces/Plush/templates/config_special.tmpl
Normal file
@@ -0,0 +1,66 @@
|
||||
<!--#set global $pane="Specials"#-->
|
||||
<!--#set global $help_uri="Configure+Special-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveSpecial" method="post" name="fullform" id="fullform">
|
||||
<input type="hidden" name="session" id="session" value="$session">
|
||||
|
||||
<div id="config-components">
|
||||
|
||||
<p><br>
|
||||
$T('explain-special')
|
||||
</p>
|
||||
|
||||
<div id="core-component-group1" class="component-group clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3>$T('sptag-boolean')</h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
|
||||
<!--#for $option in $switches#-->
|
||||
<div class="field-pair">
|
||||
<input type="checkbox" name="$option[0]" id="$option[0]" value="1" <!--#if $option[1] > 0 then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="$option[0]">
|
||||
<span class="component-title">$option[0] (<!--#if $option[2] then $T('on') else $T('off')#-->)</span>
|
||||
</label>
|
||||
</div>
|
||||
<!--#end for#-->
|
||||
|
||||
</fieldset>
|
||||
</div><!-- /component-group1 -->
|
||||
|
||||
<div id="core-component-group2" class="component-group clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3>$T('sptag-entries')</h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
|
||||
<!--#for $option in $entries#-->
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="$option[0]">
|
||||
<span class="component-title">$option[0] ($option[2])</span>
|
||||
<input type="text" name="$option[0]" id="$option[0]" value="$option[1]"/>
|
||||
</label>
|
||||
</div>
|
||||
<!--#end for#-->
|
||||
|
||||
</fieldset>
|
||||
</div><!-- /component-group1 -->
|
||||
|
||||
|
||||
<div class="component-group-last clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3> </h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<div class="left_links">
|
||||
<a id="save"><span class="config_sprite_container sprite_config_save"> </span> $T('button-saveChanges')</a>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /component-group -->
|
||||
|
||||
</div><!-- /config-components -->
|
||||
|
||||
</form>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer.tmpl"#-->
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Switches"#-->
|
||||
<!--#set global $help_uri="Configure+Switches+V3"#-->
|
||||
<!--#set global $help_uri="Configure+Switches-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveSwitches" method="post" name="fullform" id="fullform">
|
||||
@@ -35,7 +35,7 @@
|
||||
</label>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
</fieldset>
|
||||
</fieldset>
|
||||
</div><!-- /component-group1 -->
|
||||
|
||||
<div id="core-component-group2" class="component-group clearfix">
|
||||
@@ -43,6 +43,23 @@
|
||||
<h3>$T('swtag-server')</h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="max_art_tries">
|
||||
<span class="component-title">$T('opt-max_art_tries')</span>
|
||||
<input type="text" size="10" name="max_art_tries" id="max_art_tries" value="$max_art_tries" />
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-max_art_tries')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<input type="checkbox" name="max_opt_only" id="max_opt_only" value="1" <!--#if $max_opt_only > 0 then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="max_opt_only">
|
||||
<span class="component-title">$T('opt-max_opt_only')</span>
|
||||
<span class="component-desc">$T('explain-max_opt_only')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="checkbox" name="auto_disconnect" id="auto_disconnect" value="1" <!--#if $auto_disconnect > 0 then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="auto_disconnect">
|
||||
@@ -79,6 +96,13 @@
|
||||
<h3>$T('swtag-queue')</h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<div class="field-pair alt">
|
||||
<input type="checkbox" name="pre_check" id="pre_check" value="1" <!--#if $pre_check > 0 then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="pre_check">
|
||||
<span class="component-title">$T('opt-pre_check')</span>
|
||||
<span class="component-desc">$T('explain-pre_check')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="no_dupes">
|
||||
<span class="component-title">$T('opt-no_dupes')</span>
|
||||
@@ -311,6 +335,56 @@
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div><!-- /component-group6 -->
|
||||
<div id="core-component-group6" class="component-group clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3>$T('swtag-quota')</h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="quota_size">
|
||||
<span class="component-title">$T('opt-quota_size')</span>
|
||||
<input type="text" name="quota_size" id="quota_size" value="$quota_size"/>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-quota_size')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="nocheck clearfix" for="quota_period">
|
||||
<span class="component-title">$T('opt-quota_period')</span>
|
||||
<select name="quota_period" id="quota_period">
|
||||
<option value="m" <!--#if $quota_period == "m" then 'selected' else ''#--> >$T('month')</option>
|
||||
<option value="w" <!--#if $quota_period == "w" then 'selected' else ''#--> >$T('week')</option>
|
||||
<option value="d" <!--#if $quota_period == "d" then 'selected' else ''#--> >$T('day')</option>
|
||||
<option value="x" <!--#if $quota_period == "x" then 'selected' else ''#--> >$T('manual')</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-quota_period')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="quota_day">
|
||||
<span class="component-title">$T('opt-quota_day')</span>
|
||||
<input type="text" name="quota_day" id="quota_day" value="$quota_day"/>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-quota_day')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<input type="checkbox" name="quota_resume" id="quota_resume" value="1" <!--#if $quota_resume > 0 then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="quota_resume">
|
||||
<span class="component-title">$T('opt-quota_resume')</span>
|
||||
<span class="component-desc">$T('explain-quota_resume')</span>
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /component-group5 -->
|
||||
|
||||
<div class="component-group-last clearfix">
|
||||
|
||||
@@ -61,18 +61,14 @@
|
||||
</td>
|
||||
<td>
|
||||
<!--#if $line.report #-->
|
||||
<a href="https://www.newzbin.com/browse/post/$line.report/" target="_blank">
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_report pointer" title='$T('Plush-openSourceURL')<br><br>https://www.newzbin.com/browse/post/$line.report'> </div>
|
||||
<a href="https://$newzbin_url/browse/post/$line.report/" target="_blank">
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_report pointer" title='$T('Plush-openSourceURL')<br><br>https://$newzbin_url/browse/post/$line.report'> </div>
|
||||
</a>
|
||||
<!--#else if $varExists('newzbinDetails')#-->
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_report hvFaded"> </div>
|
||||
<!--#end if#-->
|
||||
<!--#if $line.url_info #-->
|
||||
<a href="$line.url_info" target="_blank">
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_star pointer" title="$T('Plush-openInfoURL')<br><br>$line.url_info"> </div>
|
||||
</a>
|
||||
<!--#else if $varExists('newzbinDetails')#-->
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_star hvFaded"> </div>
|
||||
<!--#end if#-->
|
||||
<!--#if $line.size or $line.category or $line.path or $line.storage#-->
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_stats" title='<!--#if $line.size#-->$T('size'): $line.size<!--#end if#--><!--#if $line.category#--><br>$T('category'): $line.category<!--#end if#-->'> </div>
|
||||
@@ -90,7 +86,9 @@
|
||||
<!--#end for#-->
|
||||
<!--#end if#-->
|
||||
<!--#else#-->
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_$stage.name.lower()" title='<!--#for $action in $stage.actions#--><!--#echo $action.replace("'","’") #--><br><!--#end for#-->'> </div>
|
||||
<!--#if $stage.name != "Source"#-->
|
||||
<div class="icon_history_verbose main_sprite_container sprite_hv_$stage.name.lower()" title='<!--#for $action in $stage.actions#--><!--#echo $action.replace("'","’") #--><br><!--#end for#-->'> </div>
|
||||
<!--#end if#-->
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
<!--#if $line.retry#-->
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
<li class="main_sprite_container sprite_q_queue">
|
||||
<a class="sf-with-ul">$T('menu-queue')</a>
|
||||
<ul>
|
||||
<!--#if $have_quota#--><li><a id="reset_quota_now" class="pointer">$T('link-resetQuota')</a></li><!--#end if#-->
|
||||
<!--#if $varExists('newzbinDetails')#--><li><a id="get_bookmarks_now" class="pointer">$T('link-getBookmarks')</a></li><!--#end if#-->
|
||||
<!--#if $have_rss_defined#--><li><a id="get_rss_now" class="pointer">$T('button-rssNow')</a></li><!--#end if#-->
|
||||
<!--#if $have_watched_dir#--><li><a id="get_watched_now" class="pointer">$T('sch-scan_folder')</a></li><!--#end if#-->
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
<% import locale %>
|
||||
<% locale.setlocale(locale.LC_ALL, "") %>
|
||||
|
||||
<script type="text/javascript">
|
||||
if (typeof( jQuery ) == 'undefined')
|
||||
window.location = "../"; // redirect to main on direct template hit
|
||||
@@ -15,6 +12,9 @@
|
||||
|
||||
// set lower-right queue stats
|
||||
var stats = '';
|
||||
<!--#if $have_quota#-->
|
||||
stats += '<strong>$left_quota ⁄ $quota</strong> $T('quota-left') ';
|
||||
<!--#end if#-->
|
||||
<!--#if $noofslots > 0#-->
|
||||
stats += '<strong>$mbleft ⁄ $mb $T('MB')</strong> $T('Plush-remaining')';
|
||||
<!--#end if#-->
|
||||
@@ -62,14 +62,14 @@
|
||||
<td>
|
||||
<div class="main_sprite_container sprite_progressbar_bg">
|
||||
<div class="main_sprite_container sprite_progress_done" style="background-position: -<!--#if $slot.mb == "0.00" then "120" else int(120 - 120.0 / 100.0 * int(100 - float($slot.mbleft) / float($slot.mb) * 100))#-->px -401px">
|
||||
<div class="totalDownload"><!--#echo locale.format('%d', int(float($slot.mb)), True)#--> <small>$T('MB')</small></div>
|
||||
<div class="currentDownload"><!--#if $slot.mb!=$slot.mbleft#--><!--#echo locale.format('%d', int(float($slot.mb)-float($slot.mbleft)), True)#--> <small>$T('MB') $T('AofB')</small><!--#end if#--></div>
|
||||
<div class="totalDownload">$slot.mb_fmt <small>$T('MB')</small></div>
|
||||
<div class="currentDownload"><!--#if $slot.mb!=$slot.mbleft#-->$slot.mbdone_fmt <small>$T('MB') $T('AofB')</small><!--#end if#--></div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<td class="eta nowrap">
|
||||
<!--#if not $paused and $slot.status != "Paused"#-->
|
||||
<!--#if not $paused and $slot.status not in ("Paused", "Checking")#-->
|
||||
<span title="$slot.eta">$slot.timeleft $T('Plush-left')</span>
|
||||
<!--#else#-->
|
||||
$T('post-'+$slot.status)
|
||||
@@ -89,6 +89,7 @@
|
||||
<option value="1" <!--#if $slot.priority == "High" then "selected" else ""#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == "Normal" then "selected" else ""#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == "Low" then "selected" else ""#-->>$T('pr-low')</option>
|
||||
<option value="-4" <!--#if $slot.priority == "Stop" then "selected" else ""#-->>$T('pr-stop')</option>
|
||||
</optgroup></select>
|
||||
<select class="change_opts"><optgroup label="$T('pp')">
|
||||
<option value="0" <!--#if $slot.unpackopts == "0" then "selected " else ""#-->>$T('pp-none')</option>
|
||||
|
||||
@@ -25,6 +25,7 @@ jQuery(document).ready(function($){
|
||||
$("#help").colorbox({ inline:true, href:"#help_modal", title:$("#help").text(),
|
||||
innerWidth:"375px", innerHeight:"350px", initialWidth:"375px", initialHeight:"350px", speed:0, opacity:0.7
|
||||
});
|
||||
$(".show_qrcode").colorbox({ photo:true, innerHeight:"300px", innerWidth:"300px", speed:0, opacity: 0.7, scrolling:false });
|
||||
|
||||
// jqueryui tabs/buttons
|
||||
$('.juiButton').button();
|
||||
@@ -79,27 +80,27 @@ jQuery(document).ready(function($){
|
||||
|
||||
// selections
|
||||
$("#nzo_select_all").click(function(){
|
||||
$("INPUT[type='checkbox']").attr('checked', true).trigger('change');
|
||||
$("INPUT[type='checkbox']").prop('checked', true).trigger('change');
|
||||
});
|
||||
var last1, last2;
|
||||
$("#nzo_select_range").click(function(){
|
||||
if (last1 && last2 && last1 < last2)
|
||||
$("INPUT[type='checkbox']").slice(last1,last2).attr('checked', true).trigger('change');
|
||||
$("INPUT[type='checkbox']").slice(last1,last2).prop('checked', true).trigger('change');
|
||||
else if (last1 && last2)
|
||||
$("INPUT[type='checkbox']").slice(last2,last1).attr('checked', true).trigger('change');
|
||||
$("INPUT[type='checkbox']").slice(last2,last1).prop('checked', true).trigger('change');
|
||||
});
|
||||
$("#nzo_select_invert").click(function(){
|
||||
$("INPUT[type='checkbox']").each( function() {
|
||||
$(this).attr('checked', !$(this).attr('checked')).trigger('change');
|
||||
$(this).prop('checked', !$(this).prop('checked')).trigger('change');
|
||||
});
|
||||
});
|
||||
$("#nzo_select_none").click(function(){
|
||||
$("INPUT[type='checkbox']").attr('checked', false).trigger('change');
|
||||
$("INPUT[type='checkbox']").prop('checked', false).trigger('change');
|
||||
});
|
||||
|
||||
// click filenames to select
|
||||
$('#config_content .nzoTable .nzf_row').click(function(event) {
|
||||
$('#box-'+$(event.target).parent().attr('id')).attr('checked', !$('#box-'+$(event.target).parent().attr('id')).attr('checked')).trigger('change');
|
||||
$('#box-'+$(event.target).parent().attr('id')).prop('checked', !$('#box-'+$(event.target).parent().attr('id')).prop('checked')).trigger('change');
|
||||
|
||||
// range event interaction -- see further above
|
||||
if (last1) last2 = last1;
|
||||
@@ -108,7 +109,7 @@ jQuery(document).ready(function($){
|
||||
|
||||
//
|
||||
$('#config_content .nzoTable .nzf_row input').change(function(e){
|
||||
if ($(e.target).attr('checked'))
|
||||
if ($(e.target).prop('checked'))
|
||||
$(e.target).parent().parent().addClass("nzo_highlight");
|
||||
else
|
||||
$(e.target).parent().parent().removeClass("nzo_highlight");
|
||||
@@ -121,7 +122,7 @@ jQuery(document).ready(function($){
|
||||
break;
|
||||
|
||||
|
||||
case 'Connections':
|
||||
case 'Status':
|
||||
$('#logging_level').change(function(event){
|
||||
window.location = './change_loglevel?loglevel='+$(event.target).val()+'&session='+apikey;
|
||||
});
|
||||
@@ -178,6 +179,11 @@ jQuery(document).ready(function($){
|
||||
$(event.target).parents('form:first').attr('action','delServer').submit();
|
||||
return false;
|
||||
});
|
||||
$('form .clrServer').click(function(event){ // clear server
|
||||
if(confirm($(event.target).attr('rel')))
|
||||
$(event.target).parents('form:first').attr('action','clrServer').submit();
|
||||
return false;
|
||||
});
|
||||
break;
|
||||
|
||||
case 'Categories':
|
||||
|
||||
@@ -116,6 +116,20 @@ jQuery(function($){
|
||||
function(){ $(this).removeClass('sprite_q_queuesfHover'); }
|
||||
);
|
||||
|
||||
// fix for touch devices -- toggle visibility
|
||||
$('.sprite_q_menu_pausefor').bind('touchend', function(e) {
|
||||
e.preventDefault();
|
||||
if( $(this).hasClass('sprite_q_menu_pauseforsfHover') ) {
|
||||
$(this).find("ul").toggle();
|
||||
}
|
||||
});
|
||||
$('.sprite_q_queue').bind('touchend', function(e) {
|
||||
e.preventDefault();
|
||||
if( $(this).hasClass('sprite_q_queuesfHover') ) {
|
||||
$(this).find("ul").toggle();
|
||||
}
|
||||
});
|
||||
|
||||
// modals
|
||||
$("#help").colorbox({ inline:true, href:"#help_modal", title:$("#help").text(),
|
||||
innerWidth:"375px", innerHeight:"350px", initialWidth:"375px", initialHeight:"350px", speed:0, opacity:0.7
|
||||
@@ -161,20 +175,20 @@ jQuery(function($){
|
||||
}).trigger('change');
|
||||
|
||||
// Confirm Queue Deletions toggle
|
||||
$("#confirmDeleteQueue").attr('checked', $.plush.confirmDeleteQueue ).change( function() {
|
||||
$.plush.confirmDeleteQueue = $("#confirmDeleteQueue").attr('checked');
|
||||
$("#confirmDeleteQueue").prop('checked', $.plush.confirmDeleteQueue ).change( function() {
|
||||
$.plush.confirmDeleteQueue = $("#confirmDeleteQueue").prop('checked');
|
||||
$.cookie('plushConfirmDeleteQueue', $.plush.confirmDeleteQueue ? 1 : 0, { expires: 365, path: '/' });
|
||||
});
|
||||
|
||||
// Confirm History Deletions toggle
|
||||
$("#confirmDeleteHistory").attr('checked', $.plush.confirmDeleteHistory ).change( function() {
|
||||
$.plush.confirmDeleteHistory = $("#confirmDeleteHistory").attr('checked');
|
||||
$("#confirmDeleteHistory").prop('checked', $.plush.confirmDeleteHistory ).change( function() {
|
||||
$.plush.confirmDeleteHistory = $("#confirmDeleteHistory").prop('checked');
|
||||
$.cookie('plushConfirmDeleteHistory', $.plush.confirmDeleteHistory ? 1 : 0, { expires: 365, path: '/' });
|
||||
});
|
||||
|
||||
// Block Refreshes on Hover toggle
|
||||
$("#blockRefresh").attr('checked', $.plush.blockRefresh ).change( function() {
|
||||
$.plush.blockRefresh = $("#blockRefresh").attr('checked');
|
||||
$("#blockRefresh").prop('checked', $.plush.blockRefresh ).change( function() {
|
||||
$.plush.blockRefresh = $("#blockRefresh").prop('checked');
|
||||
$.cookie('plushBlockRefresh', $.plush.blockRefresh ? 1 : 0, { expires: 365, path: '/' });
|
||||
});
|
||||
|
||||
@@ -271,6 +285,16 @@ jQuery(function($){
|
||||
});
|
||||
});
|
||||
|
||||
// Reset Quota
|
||||
$('#reset_quota_now').click(function() {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "tapi",
|
||||
data: {mode:'reset_quota', apikey: $.plush.apikey},
|
||||
success: $.plush.RefreshQueue
|
||||
});
|
||||
});
|
||||
|
||||
// Get RSS
|
||||
$('#get_rss_now').click(function() {
|
||||
$.ajax({
|
||||
@@ -690,22 +714,22 @@ $.plush.queueprevslots = $.plush.queuenoofslots; // for the next refresh
|
||||
|
||||
// selections
|
||||
$("#multiops_select_all").click(function(){
|
||||
$("INPUT[type='checkbox']","#queueTable").attr('checked', true).trigger('change');
|
||||
$("INPUT[type='checkbox']","#queueTable").prop('checked', true).trigger('change');
|
||||
});
|
||||
var last1, last2;
|
||||
$("#multiops_select_range").click(function(){
|
||||
if (last1 && last2 && last1 < last2)
|
||||
$("INPUT[type='checkbox']","#queueTable").slice(last1,last2).attr('checked', true).trigger('change');
|
||||
$("INPUT[type='checkbox']","#queueTable").slice(last1,last2).prop('checked', true).trigger('change');
|
||||
else if (last1 && last2)
|
||||
$("INPUT[type='checkbox']","#queueTable").slice(last2,last1).attr('checked', true).trigger('change');
|
||||
$("INPUT[type='checkbox']","#queueTable").slice(last2,last1).prop('checked', true).trigger('change');
|
||||
});
|
||||
$("#multiops_select_invert").click(function(){
|
||||
$("INPUT[type='checkbox']","#queueTable").each( function() {
|
||||
$(this).attr('checked', !$(this).attr('checked')).trigger('change');
|
||||
$(this).prop('checked', !$(this).prop('checked')).trigger('change');
|
||||
});
|
||||
});
|
||||
$("#multiops_select_none").click(function(){
|
||||
$("INPUT[type='checkbox']","#queueTable").attr('checked', false).trigger('change');
|
||||
$("INPUT[type='checkbox']","#queueTable").prop('checked', false).trigger('change');
|
||||
});
|
||||
$("#queue").delegate('.multiops','change',function(event) {
|
||||
// range event interaction
|
||||
@@ -713,7 +737,7 @@ $.plush.queueprevslots = $.plush.queuenoofslots; // for the next refresh
|
||||
last1 = $(event.target).parent()[0].rowIndex ? $(event.target).parent()[0].rowIndex : $(event.target).parent().parent()[0].rowIndex;
|
||||
|
||||
// checkbox state persistence
|
||||
if ($(this).attr('checked'))
|
||||
if ($(this).prop('checked'))
|
||||
$.plush.multiOpsChecks[$(this).parent().parent().attr('id')] = true;
|
||||
else if ($.plush.multiOpsChecks[$(this).parent().parent().attr('id')])
|
||||
delete $.plush.multiOpsChecks[$(this).parent().parent().attr('id')];
|
||||
@@ -740,7 +764,7 @@ $("a","#multiops_inputs").click(function(e){
|
||||
nzo_ids = nzo_ids.substr(1);
|
||||
if (!nzo_ids) return;
|
||||
|
||||
$(this).attr('disabled',true);
|
||||
$(this).prop('disabled',true);
|
||||
|
||||
if ($('#multi_status').val())
|
||||
$.ajax({
|
||||
@@ -777,7 +801,7 @@ $("a","#multiops_inputs").click(function(e){
|
||||
data: {mode: 'change_script', value: nzo_ids, value2: $('#multi_script').val(), apikey: $.plush.apikey}
|
||||
});
|
||||
|
||||
$(this).attr('disabled',false);
|
||||
$(this).prop('disabled',false);
|
||||
$.plush.RefreshQueue();
|
||||
});
|
||||
|
||||
@@ -908,10 +932,10 @@ $("a","#multiops_inputs").click(function(e){
|
||||
$('#delete_nzb_modal_title').text( $(this).parent().prev().prev().children('a:first').text() );
|
||||
$('#delete_nzb_modal_job').val( $(this).parent().parent().attr('id') );
|
||||
$('#delete_nzb_modal_mode').val( 'history' );
|
||||
if ($(this).parent().parent().children('td:first').children().hasClass('sprite_hv_error'))
|
||||
$('#delete_nzb_modal_remove_files').button('enable');
|
||||
else
|
||||
if ($(this).parent().parent().children('td:first').children().hasClass('sprite_hv_star'))
|
||||
$('#delete_nzb_modal_remove_files').button('disable');
|
||||
else
|
||||
$('#delete_nzb_modal_remove_files').button('enable');
|
||||
$.colorbox({ inline:true, href:"#delete_nzb_modal", title:$(this).text(),
|
||||
innerWidth:"600px", innerHeight:"150px", initialWidth:"600px", initialHeight:"150px", speed:0, opacity:0.7
|
||||
});
|
||||
@@ -1073,7 +1097,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
|
||||
$('<input type="checkbox" class="multiops" />').appendTo('#queue tr td.nzb_status_col');
|
||||
if ($.plush.multiOpsChecks) // checkbox state persistence
|
||||
for (var nzo_id in $.plush.multiOpsChecks)
|
||||
$('#'+nzo_id+' .multiops').attr('checked',true);
|
||||
$('#'+nzo_id+' .multiops').prop('checked',true);
|
||||
|
||||
|
||||
$('#queue-pagination span').removeClass('loading'); // Remove spinner graphic from pagination
|
||||
|
||||
@@ -287,7 +287,7 @@ body {
|
||||
}
|
||||
|
||||
.navigation ul li a {
|
||||
color:#fff;
|
||||
color:#efefef;
|
||||
font-weight:bold;
|
||||
display: block;
|
||||
padding: 0 8px 0 0;
|
||||
@@ -297,9 +297,10 @@ body {
|
||||
line-height: 25px;
|
||||
background-color:#363636;
|
||||
/* background : -webkit-gradient(linear, right top, right bottom, from(rgb(168,168,168)), to(rgb(69,69,69)));
|
||||
background : -moz-linear-gradient(top, rgb(168,168,168), rgb(69,69,69)); */
|
||||
background : -moz-linear-gradient(top, rgb(168,168,168), rgb(69,69,69));
|
||||
-webkit-transition-property: background;
|
||||
-webkit-transition-duration: 700ms;
|
||||
*/
|
||||
-moz-transition-property: background;
|
||||
-moz-transition-duration: 700ms;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 129 B |
|
Before Width: | Height: | Size: 96 B After Width: | Height: | Size: 142 B |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 5.2 KiB |
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* jQuery UI CSS Framework 1.8.9
|
||||
* jQuery UI CSS Framework 1.8.15
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
|
||||
/*
|
||||
* jQuery UI CSS Framework 1.8.9
|
||||
* jQuery UI CSS Framework 1.8.15
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
@@ -280,20 +280,44 @@
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; }
|
||||
.ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
|
||||
.ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
|
||||
.ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
|
||||
.ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
|
||||
.ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
|
||||
.ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
|
||||
.ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
|
||||
.ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; }
|
||||
.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; }
|
||||
.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; }
|
||||
.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
|
||||
.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay { background: #eeeeee url(images/ui-bg_flat_0_eeeeee_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); }
|
||||
.ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0pxdow=0px; -webkit-border-radius: 0pxdow=0px; border-radius: 0pxdow=0px; }/*
|
||||
* jQuery UI Button 1.8.9
|
||||
.ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0pxdow=0px; -khtml-border-radius: 0pxdow=0px; -webkit-border-radius: 0pxdow=0px; border-radius: 0pxdow=0px; }/*
|
||||
* jQuery UI Resizable 1.8.15
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Resizable#theming
|
||||
*/
|
||||
.ui-resizable { position: relative;}
|
||||
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
|
||||
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
|
||||
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
|
||||
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
|
||||
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
|
||||
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
|
||||
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
|
||||
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
||||
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
||||
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
|
||||
* jQuery UI Selectable 1.8.15
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Selectable#theming
|
||||
*/
|
||||
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
|
||||
/*
|
||||
* jQuery UI Button 1.8.15
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
@@ -331,7 +355,28 @@ input.ui-button { padding: .4em 1em; }
|
||||
/* workarounds */
|
||||
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
|
||||
/*
|
||||
* jQuery UI Tabs 1.8.9
|
||||
* jQuery UI Dialog 1.8.15
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Dialog#theming
|
||||
*/
|
||||
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
|
||||
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
|
||||
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
|
||||
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
|
||||
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
|
||||
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
|
||||
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
|
||||
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
|
||||
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
|
||||
.ui-draggable .ui-dialog-titlebar { cursor: move; }
|
||||
/*
|
||||
* jQuery UI Tabs 1.8.15
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Connections"#-->
|
||||
<!--#set global $help_uri="GUI+Connections"#-->
|
||||
<!--#set global $pane="Status"#-->
|
||||
<!--#set global $help_uri="GUI+Status-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<div class="tabs">
|
||||
@@ -1,4 +1,4 @@
|
||||
<a href="${helpuri}configure-categories" id="help" target="_blank">$T('menu-help')</a>
|
||||
<a href="${helpuri}configure-categories-0-7" id="help" target="_blank">$T('menu-help')</a>
|
||||
<h3>$T('configCat')</h3>
|
||||
<br/>
|
||||
$T('explain-configCat')<br/>
|
||||
@@ -61,7 +61,8 @@ $T('explain-relFolder') $defdir<br/>
|
||||
<option value="2" <!--#if $slot.priority == 2 then "selected" else ""#-->>$T('pr-force')</option>
|
||||
<option value="1" <!--#if $slot.priority == 1 then "selected" else ""#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == 0 then "selected" else ""#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == -1 then "selected" else ""#-->>$T('pr-low')</option>>
|
||||
<option value="-1" <!--#if $slot.priority == -1 then "selected" else ""#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $slot.priority == -2 then "selected" else ""#-->>$T('pr-paused')</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
<a href="${helpuri}Configure+Directories+V2" id="help" target="_blank">$T('menu-help')</a>
|
||||
<a href="${helpuri}Configure+Folders-0-7" id="help" target="_blank">$T('menu-help')</a>
|
||||
<h3>$T('folderConfig')</h3>
|
||||
<!--action="config/directories/saveDirectories" method="post"-->
|
||||
<!--action="config/folders/saveDirectories" method="post"-->
|
||||
<form id="configFolders" class="cmxform" action="">
|
||||
<div class="EntryBlock">
|
||||
<fieldset class="EntryFieldSet">
|
||||
@@ -85,7 +85,7 @@ $T('systemFolders')<br />
|
||||
|
||||
|
||||
</div><br class="clear" />
|
||||
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/directories/saveDirectories', this, 'configFolders')">
|
||||
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/folders/saveDirectories', this, 'configFolders')">
|
||||
</form>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<a href="${helpuri}Configure+General+V2" id="help" target="_blank">$T('menu-help')</a><h3>$T('generalConfig')</h3>
|
||||
<a href="${helpuri}Configure+General-0-7" id="help" target="_blank">$T('menu-help')</a><h3>$T('generalConfig')</h3>
|
||||
<form class="cmxform" id="configGeneral" autocomplete="off">
|
||||
|
||||
<fieldset class="EntryFieldSet">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<a href="${helpuri}Configure+Index+Sites" id="help" target="_blank">$T('menu-help')</a><h3>Newzbin</h3>
|
||||
<a href="${helpuri}Configure+Indexers-0-7" id="help" target="_blank">$T('menu-help')</a><h3>Newzbin</h3>
|
||||
<form id="configNewzbin" class="cmxform" autocomplete="off">
|
||||
|
||||
$T('explain-newzbin')<br/>
|
||||
@@ -44,9 +44,9 @@ $T('explain-newzbin')<br/>
|
||||
|
||||
<a class="config" onClick="getBookmarks();">$T('link-getBookmarks')</a>
|
||||
<!--#if $bookmarks_list#-->
|
||||
<a class="config" onClick="lr('config/newzbin/hideBookmarks');">$T('link-HideBM')</a>
|
||||
<a class="config" onClick="lr('config/indexers/hideBookmarks');">$T('link-HideBM')</a>
|
||||
<!--#else#-->
|
||||
<a class="config" onClick="lr('config/newzbin/showBookmarks');">$T('link-ShowBM')</a>
|
||||
<a class="config" onClick="lr('config/indexers/showBookmarks');">$T('link-ShowBM')</a>
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $bookmarks_list#-->
|
||||
@@ -54,7 +54,7 @@ $T('explain-newzbin')<br/>
|
||||
<legend>$T('processedBM')</legend>
|
||||
<hr />
|
||||
<!--#for $msgid in $bookmarks_list#-->
|
||||
<a href="https://www.newzbin.com/browse/post/$msgid/" target="_blank">$msgid</a>
|
||||
<a href="https://$newzbin_url/browse/post/$msgid/" target="_blank">$msgid</a>
|
||||
<!--#end for#-->
|
||||
<br class="clear" />
|
||||
</fieldset>
|
||||
@@ -93,6 +93,6 @@ $T('explain-nzbmatrix')<br/>
|
||||
</fieldset>
|
||||
|
||||
<p>
|
||||
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/newzbin/saveNewzbin', this, 'configNewzbin')">
|
||||
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/indexers/saveNewzbin', this, 'configNewzbin')">
|
||||
</p>
|
||||
</form>
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<a href="${helpuri}Configure+Email" id="help" target="_blank">$T('menu-help')</a><h3>$T('configEmail')</h3>
|
||||
<a href="${helpuri}Configure+Notifications-0-7" id="help" target="_blank">$T('menu-help')</a><h3>$T('configEmail')</h3>
|
||||
<form id="configEmail" class="cmxform" autocomplete="off">
|
||||
<div class="EntryBlock">
|
||||
<fieldset class="EntryFieldSet">
|
||||
@@ -67,13 +67,44 @@
|
||||
<br class="clear" />
|
||||
|
||||
</fieldset>
|
||||
|
||||
<!--#if $have_growl or $have_ntfosd#-->
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('growlSettings')</legend>
|
||||
<hr />
|
||||
<!--#if $have_ntfosd#-->
|
||||
<label><span class="label">$T('opt-ntfosd_enable'):</span>
|
||||
<input class="radio" type="checkbox" name="ntfosd_enable" value="1" <!--#if $ntfosd_enable != "0" then "checked=1" else ""#--> />
|
||||
<span class="tips">$T('explain-ntfosd_enable')</span></label>
|
||||
<br class="clear" />
|
||||
<!--#end if#-->
|
||||
<!--#if $have_growl#-->
|
||||
<label><span class="label">$T('opt-growl_enable'):</span>
|
||||
<input class="radio" type="checkbox" name="growl_enable" value="1" <!--#if $growl_enable != "0" then "checked=1" else ""#--> />
|
||||
<span class="tips">$T('explain-growl_enable')</span></label>
|
||||
<br class="clear" />
|
||||
|
||||
<label class="label">$T('opt-growl_server'):</label>
|
||||
<input type="text" size="35" name="growl_server" value="$growl_server">
|
||||
<span class="tips">$T('explain-growl_server')</span>
|
||||
<br class="clear" />
|
||||
|
||||
<label class="label">$T('opt-growl_password'):</label>
|
||||
<input type="password" size="35" name="growl_password" value="$growl_password">
|
||||
<span class="tips">$T('explain-growl_password')</span>
|
||||
<br class="clear" />
|
||||
<!--#end if#-->
|
||||
|
||||
</fieldset>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/email/saveEmail', this, 'configEmail')">
|
||||
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/notify/saveEmail', this, 'configEmail')">
|
||||
</p>
|
||||
<br class="clear" />
|
||||
<a class="config" onClick="testemail();">Test E-Mail</a>
|
||||
<a class="config" onClick="testemail();">$T('link-testEmail')</a>
|
||||
<a class="config" onClick="testnotification();">$T('testNotify')</a>
|
||||
<!--#if $lastmail#-->
|
||||
$T('emailResult') = <b>$lastmail</b>
|
||||
<!--#end if#-->
|
||||
@@ -2,7 +2,7 @@
|
||||
<script type="text/javascript">
|
||||
MochiKit.DOM.addLoadEvent(location = "../../#config-rss");
|
||||
</script>
|
||||
<a href="${helpuri}Configure+RSS+V2" id="help" target="_blank">$T('menu-help')</a>
|
||||
<a href="${helpuri}Configure+RSS-0-7" id="help" target="_blank">$T('menu-help')</a>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<a href="${helpuri}Configure+Scheduling+V2" id="help" target="_blank">$T('menu-help')</a>
|
||||
<a href="${helpuri}Configure+Scheduling-0-7" id="help" target="_blank">$T('menu-help')</a>
|
||||
<h3>$T('configSchedule')</h3>
|
||||
<div class="EntryBlock">
|
||||
<form class="cmxform" id="schedule">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<a href="${helpuri}Configure+Servers+V2" id="help" target="_blank">$T('menu-help')</a>
|
||||
<a href="${helpuri}Configure+Servers-0-7" id="help" target="_blank">$T('menu-help')</a>
|
||||
<h3>$T('configServer')</h3>
|
||||
<div class="EntryBlock">
|
||||
<!--#set $slist = $servers.keys()#-->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<a href="${helpuri}Configure+Sorting" id="help" target="_blank">$T('menu-help')</a><h3>$T('configSort')</h3>
|
||||
<a href="${helpuri}Configure+Sorting-0-7" id="help" target="_blank">$T('menu-help')</a><h3>$T('configSort')</h3>
|
||||
<!--action="config/directories/saveDirectories" method="post"-->
|
||||
<form id="configSorting" class="cmxform" action="">
|
||||
<div class="EntryBlock">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<a href="${helpuri}Configure+Switches+V3" id="help" target="_blank">$T('menu-help')</a>
|
||||
<a href="${helpuri}Configure+Switches-0-7" id="help" target="_blank">$T('menu-help')</a>
|
||||
<h3>$T('switchesConfig')</h3>
|
||||
<div class="EntryBlock">
|
||||
<form id="configSwitches" class="cmxform">
|
||||
@@ -11,6 +11,11 @@
|
||||
<span class="tips">$T('explain-quick_check')</span>
|
||||
<br class="clear" />
|
||||
|
||||
<label><span class="label">$T('opt-pre_check'):</span>
|
||||
<input class="radio" type="checkbox" name="pre_check" value="1" <!--#if $pre_check > 0 then 'checked="1"' else ""#--> /></label>
|
||||
<span class="tips">$T('explain-pre_check')</span>
|
||||
<br class="clear" />
|
||||
|
||||
<label><span class="label">$T('opt-enable_unrar'):</span>
|
||||
<input class="radio" type="checkbox" name="enable_unrar" value="1" <!--#if $enable_unrar == 1 then 'checked="1"' else ""#--> />
|
||||
<span class="tips">$T('explain-enable_unrar')</span></label>
|
||||
@@ -123,6 +128,16 @@
|
||||
<hr />
|
||||
|
||||
|
||||
<label><span class="label">$T('opt-max_art_tries'):</span>
|
||||
<input type="text" size="5" name="max_art_tries" value="$max_art_tries" />
|
||||
<span class="tips">$T('explain-max_art_tries')</span></label>
|
||||
<br class="clear" />
|
||||
|
||||
<label><span class="label">$T('opt-max_opt_only'):</span>
|
||||
<input class="radio" type="checkbox" name="max_opt_only" value="1" <!--#if $max_opt_only > 0 then 'checked="1"' else ""#--> />
|
||||
<span class="tips">$T('explain-max_opt_only')</span></label>
|
||||
<br class="clear" />
|
||||
|
||||
<label><span class="label">$T('opt-auto_disconnect'):</span>
|
||||
<input class="radio" type="checkbox" name="auto_disconnect" value="1" <!--#if $auto_disconnect > 0 then 'checked="1"' else ""#--> />
|
||||
<span class="tips">$T('explain-auto_disconnect')</span></label>
|
||||
@@ -193,6 +208,38 @@
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('swtag-quota')</legend>
|
||||
<hr />
|
||||
|
||||
<span class="label">$T('opt-quota_size'):</span>
|
||||
<input type="text" name="quota_size" value="$quota_size"/>
|
||||
<span class="tips">$T('explain-quota_size')</span></label>
|
||||
<br class="clear" />
|
||||
|
||||
<span class="label">$T('opt-quota_period'):</span>
|
||||
<select name="quota_period" id="quota_period" class="select">
|
||||
<option value="m" <!--#if $quota_period == "m" then 'selected' else ''#--> >$T('month')</option>
|
||||
<option value="w" <!--#if $quota_period == "w" then 'selected' else ''#--> >$T('week')</option>
|
||||
<option value="d" <!--#if $quota_period == "d" then 'selected' else ''#--> >$T('day')</option>
|
||||
<option value="x" <!--#if $quota_period == "x" then 'selected' else ''#--> >$T('manual')</option>
|
||||
</select>
|
||||
<span class="tips">$T('explain-quota_period')</span>
|
||||
<br class="clear" />
|
||||
|
||||
|
||||
<span class="label">$T('opt-quota_day'):</span>
|
||||
<input type="text" name="quota_day" value="$quota_day"/>
|
||||
<span class="tips">$T('explain-quota_day')</span></label>
|
||||
<br class="clear" />
|
||||
|
||||
<label><span class="label">$T('opt-quota_resume'):</span>
|
||||
<input class="radio" type="checkbox" name="quota_resume" value="1" <!--#if $quota_resume > 0 then 'checked="1"' else ""#--> />
|
||||
<span class="tips">$T('explain-quota_resume')</span></label>
|
||||
<br class="clear" />
|
||||
|
||||
</fieldset>
|
||||
|
||||
|
||||
<p>
|
||||
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/switches/saveSwitches', this, 'configSwitches')">
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
<div class="centerLinks"><br />
|
||||
<a onClick="if(confirm('$T('purgeHistConf')')){javascript:loadSearch('history/purge', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);}">$T('smpl-purgehist')</a> |
|
||||
<a onClick="if(confirm('$T('smpl-purgefailhistOK?')')){javascript:loadSearch('history/purge_failed', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);}">$T('smpl-purgefailhist')</a> |
|
||||
<a onClick="if(confirm('$T('smpl-purgefailhistOK?')')){javascript:loadSearch('history/purge_failed', 'historySearch', 'limit=$limit&start=0&del_files=1', -1,this.parentNode.parentNode.id);}">$T('purgeFailed-Files')</a> |
|
||||
<a onClick="javascript:loadSearch('history/tog_verbose', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);"><!--#if $isverbose then $T('hideDetails') else $T('showDetails')#--></a> |
|
||||
<a onClick="javascript:loadSearch('history/tog_failed_only', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);"><!--#if $failed_only then $T('showAllHis') else $T('showFailedHis')#--></a>
|
||||
</span>
|
||||
@@ -35,7 +36,7 @@
|
||||
<td>$line.name<!--#if $line.action_line#--> - <span class="action_message">$line.action_line</span><!--#else if $line.fail_message#--> - <span class="fail_message">$line.fail_message</span><!--#end if#--></td>
|
||||
<td>
|
||||
<!--#if $line.report#-->
|
||||
<a href="https://www.newzbin.com/browse/post/$line.report"><img class="imglink" src="static/images/newzbin.png" /></a>
|
||||
<a href="https://$newzbin_url/browse/post/$line.report"><img class="imglink" src="static/images/newzbin.png" /></a>
|
||||
<!--#end if#-->
|
||||
<!--#if $line.url_info#-->
|
||||
<a href="$line.url_info"><img class="imglink" src="static/images/browser.png" /></a>
|
||||
@@ -98,6 +99,9 @@ t = time.strftime(time_format("%H:%M:%S on %A %d %B %Y"), completed)
|
||||
<!--#end if#-->
|
||||
</table>
|
||||
<div class="centerLinks">
|
||||
<!--#if $have_quota#-->
|
||||
$T('quota-left'): <strong>$left_quota ⁄ $quota</strong> |
|
||||
<!--#end if#-->
|
||||
$T('smpl-size'): <span class="bold">$total_size</span> | $T('thisMonth'): <span class="bold">$month_size</span> | $T('thisWeek'): <span class="bold">$week_size</span> | $T('today'): <span class="bold">$day_size</span>
|
||||
</div>
|
||||
<br />
|
||||
|
||||
@@ -424,7 +424,7 @@ function loadtitle() {
|
||||
case 'queue':
|
||||
lr('queue/','limit=15',1);
|
||||
break;
|
||||
case 'connections':
|
||||
case 'status':
|
||||
lr(url,'',1)
|
||||
default:
|
||||
lr(url)
|
||||
@@ -732,7 +732,7 @@ function lrb(url, extra, refresh)
|
||||
|
||||
function testemail()
|
||||
{
|
||||
d = doSimpleXMLHttpRequest('config/email/testmail?session='+session);
|
||||
d = doSimpleXMLHttpRequest('config/notify/testmail?session='+session);
|
||||
d.addCallback(function (d)
|
||||
{
|
||||
alert("$T('smpl-emailsent')");
|
||||
@@ -740,9 +740,19 @@ function lrb(url, extra, refresh)
|
||||
d.addErrback(handleServerError);
|
||||
}
|
||||
|
||||
function testnotification()
|
||||
{
|
||||
d = doSimpleXMLHttpRequest('config/notify/testnotification?session='+session);
|
||||
d.addCallback(function (d)
|
||||
{
|
||||
alert("$T('smpl-notesent')");
|
||||
});
|
||||
d.addErrback(handleServerError);
|
||||
}
|
||||
|
||||
function unblock_server(host, port)
|
||||
{
|
||||
d = doSimpleXMLHttpRequest('connections/unblock_server?server='+host+':'+port+'&session='+session);
|
||||
d = doSimpleXMLHttpRequest('status/unblock_server?server='+host+':'+port+'&session='+session);
|
||||
}
|
||||
|
||||
function getBookmarks()
|
||||
@@ -750,6 +760,11 @@ function lrb(url, extra, refresh)
|
||||
d = doSimpleXMLHttpRequest('tapi?mode=newzbin&name=get_bookmarks&session='+session);
|
||||
}
|
||||
|
||||
function resetQuota()
|
||||
{
|
||||
d = doSimpleXMLHttpRequest('tapi?mode=reset_quota&session='+session);
|
||||
}
|
||||
|
||||
function changequeueoptions(page)
|
||||
{
|
||||
d = doSimpleXMLHttpRequest('queue/'+page);
|
||||
@@ -1096,48 +1111,56 @@ function loadingJSON(){
|
||||
<br />
|
||||
<div class="centerLinks header-margin light-grey"><a onclick="javascript:toggle('addNew','',{duration:0.2})">[$T('smpl-toggleadd')]</a></div>
|
||||
</div>
|
||||
<!--#if $uniconfig#-->
|
||||
<!--#set prefix="."#-->
|
||||
<!--#else#-->
|
||||
<!--#set prefix="#"#-->
|
||||
<!--#end if#-->
|
||||
<div id="Content">
|
||||
<div id="Left">
|
||||
<ul id="menu">
|
||||
<li><a class="current" href="./">$T('menu-home')</a></li>
|
||||
<li><a href="#/queue/" onClick="lr('queue/', 'limit=15', 1, 0);">$T('menu-queue')</a></li>
|
||||
<li><a href="#/history/" onClick="lr('history/','limit=15', 1, 0);">$T('menu-history')</a></li>
|
||||
<li><a href="#/dv1/" onClick="lr('queue/','', 1, 1);lrb('history/','limit=15',1);">$T('smpl-dualView1')</a></li>
|
||||
<li><a href="#/dv2/" onClick="lr('queue/','', 1, 2);lrb('history/','limit=15',1);">$T('smpl-dualView2')</a></li>
|
||||
<li><a href="#/config/" onClick="toggle('hiddenNav','blind',{duration:0.2})">$T('menu-config')</a></li>
|
||||
<li><a href="#/queue/" onclick="lr('queue/', 'limit=15', 1, 0);">$T('menu-queue')</a></li>
|
||||
<li><a href="#/history/" onclick="lr('history/','limit=15', 1, 0);">$T('menu-history')</a></li>
|
||||
<li><a href="#/dv1/" onclick="lr('queue/','', 1, 1);lrb('history/','limit=15',1);">$T('smpl-dualView1')</a></li>
|
||||
<li><a href="#/dv2/" onclick="lr('queue/','', 1, 2);lrb('history/','limit=15',1);">$T('smpl-dualView2')</a></li>
|
||||
<li><a href="$prefix/config/" class="bold">$T('menu-config')</a> <a onclick="toggle('hiddenNav','blind',{duration:0.2})"><img src="static/images/bullet_arrow_down.png" border=0 /></a></li>
|
||||
<ul id="hiddenNav" class="secondul">
|
||||
<li><a class="config" href="#/config/general/" onClick="lr('config/general/','', 0, 0);">$T('cmenu-general')</a></li>
|
||||
<li><a class="config" href="#/config/directories/" onClick="lr('config/directories/','', 0, 0);">$T('cmenu-folders')</a> </li>
|
||||
<li><a class="config" href="#/config/switches/" onClick="lr('config/switches/','', 0, 0);">$T('cmenu-switches')</a> </li>
|
||||
<li><a class="config" href="#/config/server" onClick="lr('config/server/','', 0, 0);">$T('cmenu-servers')</a> </li>
|
||||
<li><a class="config" href="#/config/scheduling/" onClick="lr('config/scheduling/','', 0, 0);">$T('cmenu-scheduling')</a> </li>
|
||||
<li><a class="config" href="#/config/rss/" onClick="lr('config/rss/','', 0, 0);">$T('cmenu-rss')</a> </li>
|
||||
<li><a class="config" href="#/config/email/" onClick="lr('config/email/','', 0, 0);">$T('cmenu-email')</a></li>
|
||||
<li><a class="config" href="#/config/newzbin/" onClick="lr('config/newzbin/', '', 0, 0);">$T('cmenu-newzbin')</a></li>
|
||||
<li><a class="config" href="#/config/categories/" onClick="lr('config/categories/', '', 0, 0);">$T('cmenu-cat')</a></li>
|
||||
<li><a class="config" href="#/config/sorting/" onClick="lr('config/sorting/', '', 0, 0);">$T('cmenu-sorting')</a></li>
|
||||
<li><a class="config" href="$prefix/config/general/" onclick="lr('config/general/','', 0, 0);">$T('cmenu-general')</a></li>
|
||||
<li><a class="config" href="$prefix/config/folders/" onclick="lr('config/folders/','', 0, 0);">$T('cmenu-folders')</a> </li>
|
||||
<li><a class="config" href="$prefix/config/switches/" onclick="lr('config/switches/','', 0, 0);">$T('cmenu-switches')</a> </li>
|
||||
<li><a class="config" href="$prefix/config/server" onclick="lr('config/server/','', 0, 0);">$T('cmenu-servers')</a> </li>
|
||||
<li><a class="config" href="$prefix/config/scheduling/" onclick="lr('config/scheduling/','', 0, 0);">$T('cmenu-scheduling')</a> </li>
|
||||
<li><a class="config" href="$prefix/config/rss/" onclick="lr('config/rss/','', 0, 0);">$T('cmenu-rss')</a> </li>
|
||||
<li><a class="config" href="$prefix/config/notify/" onclick="lr('config/notify/','', 0, 0);">$T('cmenu-notif')</a></li>
|
||||
<li><a class="config" href="$prefix/config/indexers/" onclick="lr('config/indexers/', '', 0, 0);">$T('cmenu-newzbin')</a></li>
|
||||
<li><a class="config" href="$prefix/config/categories/" onclick="lr('config/categories/', '', 0, 0);">$T('cmenu-cat')</a></li>
|
||||
<li><a class="config" href="$prefix/config/sorting/" onclick="lr('config/sorting/', '', 0, 0);">$T('cmenu-sorting')</a></li>
|
||||
</ul>
|
||||
<li><a href="#/connections/" onClick="lr('connections/','', 1, 0);">$T('menu-cons')</a></li>
|
||||
<li><a href="#/connections/" onClick="lr('connections/','', 1, 0);">$T('smpl-warnings')(<span id="have_warnings">$have_warnings</span>)</a></li>
|
||||
<li><a href="#/status/" onclick="lr('status/','', 1, 0);">$T('menu-cons')</a></li>
|
||||
<li><a href="#/status/" onclick="lr('status/','', 1, 0);">$T('smpl-warnings')(<span id="have_warnings">$have_warnings</span>)</a></li>
|
||||
<br />
|
||||
<li><a class="bold" id="status2" onClick="toggle_paused()">$statusstr2</a> <a onClick="toggle('hiddenTimedPause','blind',{duration:0.2})"><img src="static/images/bullet_arrow_down.png" border=0 /></a></li>
|
||||
<li><a class="bold" id="status2" onclick="toggle_paused()">$statusstr2</a> <a onclick="toggle('hiddenTimedPause','blind',{duration:0.2})"><img src="static/images/bullet_arrow_down.png" border=0 /></a></li>
|
||||
<ul id="hiddenTimedPause" class="secondul">
|
||||
<li><a class="config" onClick="javascript:timedPause(5)">5 $T("minutes")</a></li>
|
||||
<li><a class="config" onClick="javascript:timedPause(15)">15 $T("minutes")</a></li>
|
||||
<li><a class="config" onClick="javascript:timedPause(30)">30 $T("minutes")</a></li>
|
||||
<li><a class="config" onClick="javascript:timedPause(60)">1 $T("hours")</a></li>
|
||||
<li><a class="config" onClick="javascript:timedPause(120)">2 $T("hours")</a></li>
|
||||
<li><a class="config" onClick="javascript:timedPause(180)">3 $T("hours")</a></li>
|
||||
<li><a class="config" onClick="javascript:timedPause(300)">5 $T("hours")</a></li>
|
||||
<li><a class="config" onClick="javascript:timedPause()">$T("smpl-custom")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause(5)">5 $T("minutes")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause(15)">15 $T("minutes")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause(30)">30 $T("minutes")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause(60)">1 $T("hours")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause(120)">2 $T("hours")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause(180)">3 $T("hours")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause(300)">5 $T("hours")</a></li>
|
||||
<li><a class="config" onclick="javascript:timedPause()">$T("smpl-custom")</a></li>
|
||||
|
||||
</ul>
|
||||
<!--#if $varExists('newzbinDetails')#-->
|
||||
<li><a onClick="getBookmarks()">$T('smpl-getbookmarks')</a></li>
|
||||
<li><a onclick="getBookmarks()">$T('smpl-getbookmarks')</a></li>
|
||||
<!--#end if#-->
|
||||
<!--#if $have_quota#-->
|
||||
<li><a onclick="resetQuota()">$T('link-resetQuota')</a></li>
|
||||
<!--#end if#-->
|
||||
<br />
|
||||
<li><a style="text-decoration:underline;cursor:pointer;" onClick="if(confirm('$T('smpl-restartOK?')')){restart()}">$T('button-restart')</a></li>
|
||||
<li><a style="text-decoration:underline;cursor:pointer;" onClick="if(confirm('$T('shutdownOK?')')){shutdown()}">$T('link-shutdown')</a></li>
|
||||
<li><a style="text-decoration:underline;cursor:pointer;" onclick="if(confirm('$T('smpl-restartOK?')')){restart()}">$T('button-restart')</a></li>
|
||||
<li><a style="text-decoration:underline;cursor:pointer;" onclick="if(confirm('$T('shutdownOK?')')){shutdown()}">$T('link-shutdown')</a></li>
|
||||
<br/>
|
||||
<li><a href="$helpuri" target="_blank">$T('menu-wiki')</a></li>
|
||||
<li><a href="http://forums.sabnzbd.org" target="_blank">$T('menu-forums')</a></li>
|
||||
@@ -1260,7 +1283,7 @@ function loadingJSON(){
|
||||
<option value="300" >5 $T("minutes")</option>
|
||||
<option value="0" >$T("none")</option>
|
||||
</select>
|
||||
<br />SABnzbd $T('version'): $version | smpl $T('version'): 1.3</a></p>
|
||||
<br />SABnzbd $T('version'): $version | smpl skin</a></p>
|
||||
<!--#if $warning#-->
|
||||
<h2>$T('ft-warning')</h2>
|
||||
<b>$warning</b><br />
|
||||
|
||||
@@ -91,6 +91,7 @@ $T('smpl-timeleft'): <strong>$timeleft</strong> $T('eta'): <strong>$eta</strong>
|
||||
<option value="1" <!--#if $slot.priority == "High" then "selected" else ""#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == "Normal" then "selected" else ""#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == "Low" then "selected" else ""#-->>$T('pr-low')</option>
|
||||
<option value="-4" <!--#if $slot.priority == "Stop" then "selected" else ""#-->>$T('pr-stop')</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
<!--#end if#-->
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<script type="text/javascript">
|
||||
window.onload = function() {
|
||||
location = "../#/connections"
|
||||
location = "../#/status"
|
||||
};
|
||||
</script>
|
||||
<h3>$T('connections')</h3>
|
||||
<a class="config" onClick="lr('connections/disconnect', '', '-1', this.parentNode.id);">$T('link-forceDisc')</a> |
|
||||
<a class="config" onClick="lr('status/disconnect', '', '-1', this.parentNode.id);">$T('link-forceDisc')</a> |
|
||||
<a class="config" onClick="testemail();">$T('link-testEmail')</a> |
|
||||
<a class="config" href="connections/showlog?session=$session">$T('link-showLog')</a>
|
||||
<a class="config" href="status/showlog?session=$session">$T('link-showLog')</a>
|
||||
$T('logging'):
|
||||
<select onChange="javascript:lr('connections/change_loglevel','loglevel='+this.options[this.selectedIndex].value)">
|
||||
<select onChange="javascript:lr('status/change_loglevel','loglevel='+this.options[this.selectedIndex].value)">
|
||||
<option value="0" <!--#if $loglevel == "0" then "selected" else ""#-->>$T('log-errWarn')</option>
|
||||
<option value="1" <!--#if $loglevel == "1" then "selected" else ""#-->>$T('log-info')</option>
|
||||
<option value="2" <!--#if $loglevel == "2" then "selected" else ""#-->>$T('log-debug')</option>
|
||||
@@ -19,7 +19,7 @@ $T('logging'):
|
||||
<li>
|
||||
$server[0]: $server[2] <!--#if int($server[4])#--><img src="static/images/nuvola/kgpg.png" /><!--#end if#-->
|
||||
<!--#if not $server[5]#-->
|
||||
<a class="config" href="./connections/unblock_server?server=$server[0]&session=$session">
|
||||
<a class="config" href="./status/unblock_server?server=$server[0]&session=$session">
|
||||
($T('server-blocked'))</a>
|
||||
$server[6]
|
||||
<!--#end if#-->
|
||||
@@ -38,7 +38,7 @@ $T('logging'):
|
||||
$lastmail
|
||||
<!--#end if#-->
|
||||
<!--#if $warnings#-->
|
||||
<h2>$T('lastWarnings') (<a class="config" onClick="lr('connections/clearwarnings','', '-1', this.parentNode.id);">$T('clearWarnings')</a>)</h2>
|
||||
<h2>$T('lastWarnings') (<a class="config" onClick="lr('status/clearwarnings','', '-1', this.parentNode.id);">$T('clearWarnings')</a>)</h2>
|
||||
<!--#for $warn in $warnings#-->
|
||||
$warn<br/>
|
||||
<!--#end for#-->
|
||||
@@ -64,7 +64,7 @@ $T('explain-orphans')<br/>
|
||||
<form action="delete" method="get">
|
||||
<input type="hidden" value="$folder" name="name">
|
||||
<input type="hidden" value="$session" name="session">
|
||||
<input type="submit" onclick="this.form.action='connections/delete?session=$session'; this.form.submit(); return false;" value="$T('button-delCat')"/>
|
||||
<input type="submit" onclick="this.form.action='status/delete?session=$session'; this.form.submit(); return false;" value="$T('button-delCat')"/>
|
||||
</form>
|
||||
</td>
|
||||
|
||||
@@ -72,7 +72,7 @@ $T('explain-orphans')<br/>
|
||||
<form action="add" method="get">
|
||||
<input type="hidden" value="$folder" name="name">
|
||||
<input type="hidden" value="$session" name="session">
|
||||
<input type="submit" onclick="this.form.action='connections/add?session=$session'; this.form.submit(); return false;" value="$T('button-add')"/>
|
||||
<input type="submit" onclick="this.form.action='status/add?session=$session'; this.form.submit(); return false;" value="$T('button-add')"/>
|
||||
</form>
|
||||
</td>
|
||||
|
||||
@@ -86,6 +86,6 @@ $T('explain-orphans')<br/>
|
||||
<!--#end if#-->
|
||||
$T('explain-Repair')<br/>
|
||||
<form action="saveGeneral" method="post">
|
||||
<input type="submit" onclick="this.form.action='../config/repair?session=$session'; this.form.submit(); return false;" value="$T('button-repair')"/>
|
||||
<input type="submit" onclick="this.form.action='config/repair?session=$session'; this.form.submit(); return false;" value="$T('button-repair')"/>
|
||||
</form>
|
||||
|
||||
@@ -15,7 +15,6 @@ Please choose your prefered language<br /><br />
|
||||
<!--#for $l, $language in $languages#-->
|
||||
<div class="language">
|
||||
<label class="skin-select">
|
||||
<img src="static/images/flags/${l}.png" border="0" />
|
||||
<br />$language<br /><input type="radio" name="lang" id="$l" value="$l" <!--#if $lang == $l then 'checked=true' else ''#-->>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
@@ -13,7 +13,7 @@ $(document).ready(function() {
|
||||
$("#serverTest").click(function(){
|
||||
$('#serverResponse').html(txtChecking);
|
||||
$.getJSON(
|
||||
"/tapi?mode=config&name=test_server&output=json",
|
||||
"../tapi?mode=config&name=test_server&output=json",
|
||||
$("form").serialize(),
|
||||
function(result) {
|
||||
if (result.value.result){
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<form action="./four" method="post" autocomplete="off">
|
||||
<p>$T('wizard-index-explain')</p>
|
||||
<div id="serverDetails">
|
||||
<h3><a href="http://newzbin.com" target="_blank">Newzbin.com</a> ($T('wizard-optional'))</h3>
|
||||
<h3><a href="http://$newzbin_url" target="_blank">Newzbin2.es</a> ($T('wizard-optional'))</h3>
|
||||
<label class="label">$T('srv-username'):</label><input type="text" size="20" value="$newzbin_user" name="newzbin_user">
|
||||
<br class="clear" />
|
||||
<label class="label">$T('srv-password'):</label><input type="password" size="20" value="$newzbin_pass" name="newzbin_pass">
|
||||
|
||||
@@ -1,21 +1,16 @@
|
||||
The module feedparser.py-4.1 is (c) Mark Pilgrim
|
||||
The module feedparser.py-5.1 is (c) Mark Pilgrim and Kurt McKee
|
||||
|
||||
We use only the feedparser itself, all additional material
|
||||
was removed.
|
||||
We use only the feedparser itself, all additional material was removed.
|
||||
|
||||
Home of the feedparser module:
|
||||
http://www.feedparser.org
|
||||
https://code.google.com/p/feedparser
|
||||
|
||||
It is covered by the following license.
|
||||
|
||||
|
||||
Universal Feed Parser (feedparser.py), its testing harness (feedparsertest.py),
|
||||
and its unit tests (everything in the tests/ directory) are released under the
|
||||
following license:
|
||||
|
||||
----- begin license block -----
|
||||
|
||||
Copyright (c) 2002-2005, Mark Pilgrim
|
||||
Copyright (c) 2010-2011 Kurt McKee <contactme@kurtmckee.org>
|
||||
Copyright (c) 2002-2008 Mark Pilgrim
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
@@ -37,6 +32,6 @@ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
POSSIBILITY OF SUCH DAMAGE."""
|
||||
|
||||
----- end license block -----
|
||||
|
||||
29
licenses/License-gntp.txt
Normal file
@@ -0,0 +1,29 @@
|
||||
The module gntp is (C) Paul Traylor
|
||||
|
||||
Home of the module:
|
||||
https://github.com/kfdm/gntp/
|
||||
|
||||
It is covered by the following license.
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
Copyright (c) 2011 Paul Traylor
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-------------------------------------------------------------------------
|
||||
8
licenses/License-systrayicon.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
On http://www.brunningonline.net/simon/blog/archives/001835.html,
|
||||
the author licensed SysTrayIcon.py under a variant of the WTFPL:
|
||||
|
||||
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
|
||||
> "Aleister Crowley" style license - "Do what thou wilt shall be the
|
||||
> only law".
|
||||
>
|
||||
> Err, but don't sue me if it doesn't work. ;-)
|
||||
BIN
osx/image/sabnzbd.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
osx/image/sabnzbd_leopard.png
Normal file
|
After Width: | Height: | Size: 64 KiB |