Compare commits

..

427 Commits

Author SHA1 Message Date
ShyPike
b73570fe2a Update text files for 0.7.0 RC2 2012-06-02 21:24:08 +02:00
shypike
d1357875c9 Update translations 2012-06-02 21:23:33 +02:00
ShyPike
037c7661ea Suppress permission errors on paths containing ".AppleDouble" or ".DS_Store".
Common on NAS systems that support OSX with AFP shares.
2012-06-02 21:17:13 +02:00
ShyPike
5337ade3fb Set article cache to 200M when not already set. 2012-06-02 15:57:08 +02:00
ShyPike
504ce5458f Pre-check: lower default minimum completion rate to 100.2% 2012-06-01 19:43:07 +02:00
ShyPike
d8d3b60cbc Update text files for 0.7.0 RC1 2012-05-30 21:32:02 +02:00
ShyPike
0b0e7d5531 Pre-check: the required ratio for NZBs without par2 files should be 100% and not the "safe" ratio. 2012-05-30 21:28:24 +02:00
ShyPike
18cd9ab7ca Update text files for 0.7.0 RC1 2012-05-30 20:32:17 +02:00
shypike
1392b3b1eb Update translations 2012-05-30 20:29:56 +02:00
ShyPike
cd93abfab1 Fix for rare crash in par2 fetching. 2012-05-30 20:09:16 +02:00
ShyPike
9fede00949 Fix failing nomedia marker file (again). 2012-05-27 21:10:26 +02:00
ShyPike
6ddc3fec96 Windows SystemTray menu code sometimes times out when coming out of standby/hibernate. Catch exception and hope for the best... 2012-05-27 20:53:04 +02:00
ShyPike
f1030f9b6f Quota reset wasn't done when quota-reset-time was passed while SABnzbd wasn't running.
Due to not setting self.have_quota before reading the totals9.sab file.
2012-05-27 12:46:45 +02:00
shypike
6a8ff22f96 Fix error message. 2012-05-26 09:06:31 +02:00
ShyPike
1e82b79c16 Update text files for 0.7.0 Beta8. 2012-05-25 20:26:58 +02:00
shypike
d85bc90cbb Update translations 2012-05-25 20:22:25 +02:00
ShyPike
fdce48376a Add completion rate info to email notifying about failed pre-check run. 2012-05-25 20:11:55 +02:00
ShyPike
58cc6b2e7d Rename special option "marker_file" to "nomedia_marker" and disable it by default. 2012-05-25 19:48:10 +02:00
ShyPike
5ebad3cb70 Fix signing of OSX Leopard app. 2012-05-22 20:21:47 +02:00
ShyPike
d4757a0a74 Update text files for 0.7.0 Beta7 2012-05-22 19:57:15 +02:00
shypike
0406a4b901 Update translations 2012-05-22 19:53:34 +02:00
ShyPike
95684fbe3a Do removal of ".nomedia" marker file earlier, just after unpacking. So before it can be moved by the Sorting functions.
This also solves the problem of the NZB-chaining being disabled.
2012-05-22 19:39:23 +02:00
ShyPike
a4f8155138 Prevent crash when Wizard tries to resolve the system's name to an IP (and name cannot resolve). 2012-05-22 19:09:00 +02:00
ShyPike
cddb1ba7f3 Remove junk code. 2012-05-21 18:41:39 +02:00
ShyPike
73b2930a0b Remove potential exe.log file in Windows uninstaller. 2012-05-21 18:40:48 +02:00
ShyPike
e74519ca43 When the Sort functions look to rename auxiliary files after a main file, they should ignore casing of the original names. 2012-05-20 14:09:07 +02:00
ShyPike
f75fad9c6a Add Polish to NSIS script. 2012-05-18 14:12:48 +02:00
ShyPike
2d8805a49f Spend more effort to track down and delete the .nomedia marker file at the end of post-processing. 2012-05-18 12:45:21 +02:00
ShyPike
fc3a19a816 Translatable hover-over texts for Windows Tray icon. 2012-05-18 11:31:18 +02:00
ShyPike
e1b2d49341 Update POT files. 2012-05-17 22:37:18 +02:00
ShyPike
2cb6890dac Add two Wizard texts for later Unicode release. 2012-05-17 22:36:07 +02:00
ShyPike
e6bef729ed Add some type safety to database.py (preparing for Unicode). 2012-05-17 14:26:15 +02:00
ShyPike
1545f7a4ef Handle newline idiosyncrasies of gettext for NSIS template. 2012-05-17 14:24:59 +02:00
ShyPike
3f9446a336 Update text files for 0.7.0 Beta6 2012-05-17 10:44:46 +02:00
shypike
7b3ab90a95 Update translations 2012-05-16 22:51:58 +02:00
shypike
636b264432 OSX: Make "10.1 MB/s" fit in menu bar status by omitting the space. 2012-05-16 22:30:33 +02:00
ShyPike
59fd6bf23d Lower default threshold for pre-check to 100.5% 2012-05-16 20:33:31 +02:00
ShyPike
59b4bbcdaa Don't retry bookmark removals for nzbmatrix.com.
Currently it causes a crash, but otherwise the site would be hammered.
2012-05-16 17:50:36 +02:00
ShyPike
a82bdd9f74 Always use URL when complaining about unsuccessful NZB fetches. 2012-05-15 20:10:49 +02:00
ShyPike
a4f10e7577 Prevent crash in rare case of a timeout on a connection that has just been cleared by the "unreliable-server" detection. 2012-05-15 19:32:19 +02:00
shypike
71f3231487 Update translations 2012-05-14 18:05:30 +02:00
ShyPike
2133092402 Add Polish translation (with reduced character set). 2012-05-14 17:58:08 +02:00
ShyPike
20e47ab099 Use readable substitutions for quote and apostrophe. 2012-05-13 14:27:40 +02:00
ShyPike
3e9c8c3ff8 Update INSTALL.txt 2012-05-12 23:09:55 +02:00
ShyPike
731f331502 Upgrade unzip for Windows to 6.0 2012-05-12 23:05:22 +02:00
ShyPike
b15efb4d38 Clean up package.py. 2012-05-12 23:04:08 +02:00
shypike
ccfb0df819 Remove .nomedia marker file also when it has been moved by Sorting. 2012-05-12 19:57:12 +02:00
shypike
620ef9fc64 Extension-based cleanup list should also remove extension-only files like ".sfv". 2012-05-12 19:48:59 +02:00
shypike
f799fc08f7 Remove some debugging lines. 2012-05-12 19:47:51 +02:00
ShyPike
11a1ce4a6c Set UI-ready flag sooner. 2012-05-12 16:04:04 +02:00
shypike
9610a5a0dd Do HTML quoting for " and ' characters in skin texts.
Improve skin text translation cache implementation.
2012-05-12 15:54:44 +02:00
ShyPike
0b39afcd18 Fix incorrect README.rtf. 2012-05-09 21:08:45 +02:00
ShyPike
abe53b8a8a Fix error in OSX signing. 2012-05-09 20:59:42 +02:00
ShyPike
bffdf77d9a Fix crash of Sorting preview when using accented characters in example. 2012-05-09 20:37:19 +02:00
shypike
31a7016c15 Merge pull request #37 from thezoggy/uniConfig
Integrate Config skin (previously a submodule)
2012-05-09 11:15:50 -07:00
ShyPike
b92bd6aa0d Remove submodule Config. 2012-05-09 20:12:25 +02:00
ShyPike
ed4a6567c3 Update text files for 0.7.0 Beta5 2012-05-09 20:07:15 +02:00
Jonathon Saine
1988977d7c Remove submodule and just use clone of uniConfig master branch. 2012-05-08 16:43:08 -05:00
ShyPike
9f33bb4bb3 Improve rounding of ratio in pre-check so that you don't get messages like "101.0% is less than required 101.0%". 2012-05-08 22:46:17 +02:00
shypike
02a8141de2 Create unified DMG file for all OSX versions. 2012-05-08 22:29:51 +02:00
ShyPike
c852b44dcd Update translatable texts. 2012-05-07 22:11:29 +02:00
ShyPike
1a44b38308 Add special option required completeness percentage when doing pre-check.
Set default to 101.
2012-05-07 22:11:00 +02:00
ShyPike
743bf88d28 Enable randomization of multiple Usenet server IPs by default. 2012-05-07 15:14:43 +02:00
ShyPike
c0250c2c29 Fix incorrect formatting of source URL in history. 2012-05-07 15:12:40 +02:00
shypike
50990a8a01 Fix crash in newswrapper.py when dealing with single line server responses. 2012-05-05 23:51:09 +02:00
shypike
03c12a65ac Update translations 2012-05-04 14:54:14 +02:00
ShyPike
3f7967326b Make Usenet server provider IP randomization an option instead of always on. 2012-05-04 12:08:55 +02:00
ShyPike
6d47ba30b9 Prevent exception messages being logged when evaluating incomplete Sort expressions in Config->Sorting's preview mode. 2012-05-04 10:43:12 +02:00
ShyPike
c4459e2238 Add support for ".nomedia" marker in "final" folder in order to disable scanning by media players during unpack. 2012-05-03 19:02:30 +02:00
ShyPike
cba0d3f890 Extend the Windows SysTray menu. 2012-05-01 22:15:42 +02:00
ShyPike
95182b8fe5 Update text files for 0.7.0 Beta4 2012-05-01 21:18:56 +02:00
ShyPike
0436247269 Update translations. 2012-05-01 21:18:32 +02:00
ShyPike
b41f4f0cb2 Uniform favicons for all skins. 2012-05-01 20:33:03 +02:00
ShyPike
840ec9cb05 Update translatable texts. 2012-05-01 20:26:45 +02:00
ShyPike
774ebf4cd5 Fix RSS filter enabling logic. 2012-05-01 20:14:37 +02:00
ShyPike
13b7d75ee8 More cleanup. 2012-04-30 15:22:55 +02:00
ShyPike
6171caa0e9 Cleanup NSIS_Installer.nsi and package.py. 2012-04-30 15:01:47 +02:00
ShyPike
04c74be144 Don't patch translations into the NSIS_Installer.nsi file, but create a temporary file to be used by the packager. 2012-04-30 14:14:20 +02:00
shypike
84ff098527 Fix error in displaying current language (side-effect of previous change). 2012-04-29 17:19:40 +02:00
ShyPike
3afb1e37cb Some more fixes for Brazilian Portuguese support. 2012-04-29 14:31:18 +02:00
ShyPike
5c4cd2c343 Remove program start option from the Windows installer.
This is troublesome because SABnzbd would be started as admin instead of actual user.
2012-04-29 14:29:32 +02:00
ShyPike
4949782afd Add some translatable texts for Config skin. 2012-04-29 14:27:16 +02:00
ShyPike
9dbb43b4e7 Replace current icon files with smaller ones (thanks, inpheaux). 2012-04-29 12:29:53 +02:00
ShyPike
3667e7e596 Add Portuguese (Brasil) to translations. 2012-04-29 12:04:02 +02:00
ShyPike
eb7dc19732 Fix error in package.py which incorrectly still added "curl" to Windows distro when using Python 2.6+ 2012-04-28 15:31:46 +02:00
ShyPike
5daa7487fa Update main POT file. 2012-04-28 15:15:52 +02:00
ShyPike
2a9ba72fcd Merge branch 'opencomplete' of https://github.com/lordp/sabnzbd into develop.
Change "directory" to "folder". Make new entry the second one.
2012-04-28 14:24:14 +02:00
ShyPike
20507eacc8 Update Config skin. 2012-04-28 14:18:06 +02:00
shypike
f0897fd046 Update main POT file. 2012-04-28 13:55:53 +02:00
shypike
6f546d608b Update translations 2012-04-28 13:51:01 +02:00
shypike
41cf240cb4 Add support for OSX code-signing. 2012-04-28 13:08:23 +02:00
Darryl Hamilton
3ec13769fa Add option to tray to open the complete download directory 2012-04-27 21:38:50 +12:00
ShyPike
0153141394 Correct provisional extraction of filename from the subject. It went wrong when more than one quoted string is present (e.g. 'This post "file1.rar" "1of10" yEnc'. 2012-04-21 20:31:14 +02:00
ShyPike
b8359cc7de Quota wasn't initialized properly when deriving initial download amount from History database. 2012-04-20 19:44:42 +02:00
ShyPike
6becfafb6d Merge branch 'develop' of github.com:sabnzbd/sabnzbd into develop 2012-04-20 19:05:56 +02:00
ShyPike
e20f2cde02 Prepare RSS for enable/disable per filter.
This is the 7th parameter of the filter line.
"0" is disabled, anything else is enabled.
2012-04-20 19:05:24 +02:00
ShyPike
88c1ef8d93 Never show pre-checked jobs that have insufficient data as 100.0% (due to rounding), force to 99.9% 2012-04-19 17:57:18 +02:00
shypike
52329b7372 Merge pull request #30 from thezoggy/develop-fix_smpl
smpl update
2012-04-18 13:16:45 -07:00
ShyPike
fbdf71c0e5 Provisional fix for Growl icon.
For remote Growl client send an sf.net URL for the icon.
The problem is that the current GNTP library doesn't support icon embedding.
2012-04-18 21:49:23 +02:00
ShyPike
fdd14125ff Fix response from test_notify. 2012-04-18 20:36:01 +02:00
Jonathon Saine
1629676330 Cosmetic change, onclick should be all lower. 2012-04-17 19:16:00 -05:00
Jonathon Saine
9a56a3238d Fix the edit nzb details 'All / None / Invert' selection. 2012-04-17 18:53:05 -05:00
ShyPike
a02fc91a1e Add "newshost.za.net" to list of bad gzipping indexers. 2012-04-17 21:02:04 +02:00
ShyPike
f5f501a6c2 In Classic skin, the Status page still called itself "Connections". 2012-04-17 19:07:40 +02:00
ShyPike
b4232369fe Add "xcat" parameter to api-calls "addfile" and "addlocalfile" allowing an indexer category to be sent. This category will be mapped to a user-defined category. 2012-04-17 18:59:14 +02:00
shypike
a9eb107503 Add missing "B/s" to speed indicator in OSX menu. 2012-04-15 18:54:42 +02:00
ShyPike
9f7b5412da Update text files for 0.7.0 Beta3 2012-04-15 15:02:13 +02:00
ShyPike
130c996bc2 Update Config.
Remove dummy option.
2012-04-15 14:23:00 +02:00
shypike
5f5905138c Apply file/folder permissions also to the "temporary download folder".
Do so for root folder, job folders and downloaded files (so not for __admin__).
This will make streaming during download more useful.
2012-04-15 13:31:31 +02:00
shypike
69d4859ec5 Fix crash in api-call "switch" when using ascii output. 2012-04-15 10:09:35 +02:00
ShyPike
b11710a32a Rename option "max_opt_only" to "max_art_opt" to give it a sensible default (False). 2012-04-14 16:24:06 +02:00
ShyPike
f5673b190a Stop distributing CURL with 0.7.x (due to typo in package.py). 2012-04-14 16:00:19 +02:00
ShyPike
ff21d6d4d1 Disable gzip HTTP compression when getting files from nzbsa.co.za,
because that site uses compression in a way that Python's HTTP library doesn't understand.
2012-04-11 22:49:10 +02:00
ShyPike
951d5e6797 Fix crash in urlgrabber.py when an invalid file received. 2012-04-11 22:40:29 +02:00
ShyPike
52a8e7a7e8 Log all external API-calls at debug level. 2012-04-11 20:34:04 +02:00
ShyPike
19be644888 Fix backward compatibility of API-calls "addurl" and "addid" by returning "ok" in ASCII mode (instead of the more sensible status/nzo_ids).
Fix unjustified error message when sending a single item with API-calls "addfile" and "addlocalfile".
2012-04-11 19:47:48 +02:00
ShyPike
460f510ce1 Accept multiple items in API-calls "addurl" and "addid".
The "name" and "nzbname" keywords can be repeated.
2012-04-10 21:48:53 +02:00
ShyPike
10a564c02e Fix growler.py fix, because it has side-effects.
Now pynotify will simply be disabled when using Python 2.5
2012-04-10 20:59:22 +02:00
ShyPike
dc70f5e3cd Restore Python2.5 compatibility in growler.py. 2012-04-10 19:52:35 +02:00
ShyPike
760eb5b2be After a language change, Growl needs to be registered again. 2012-04-09 23:09:24 +02:00
ShyPike
5fca90a8e2 Sync Config skin. 2012-04-09 21:04:54 +02:00
ShyPike
444b65f003 Windows: fix problem with latin1 encoded par2 files when retrying from history. 2012-04-09 21:03:24 +02:00
ShyPike
ad0eb94e63 Fix detection of retry-able history entries for case-insensitive file systems. 2012-04-09 20:24:43 +02:00
ShyPike
567d86b715 Fix the api-call "auth". 2012-04-07 14:12:42 +02:00
ShyPike
9394bc0f0b API-calls "addfile" and "addlocalfile" returned an incorrect status value. 2012-04-07 13:38:19 +02:00
ShyPike
7c4e3b20cc Add support for the peculiar Usenet provider "free.xsusenet.com". 2012-04-06 20:31:36 +02:00
ShyPike
55118154d3 OSX menu should use the same code for formatting the speed as the skins.
(And so show a single decimal digit for M and G speeds.)
2012-04-06 19:18:58 +02:00
ShyPike
595fbc4313 Replace "Spanish Castilian" with "Spanish" in make_mo.py, because NSIS can only handle "Spanish". 2012-04-04 21:02:54 +02:00
ShyPike
868df5fb46 Update text files for 0.7.0 Beta2 2012-04-04 20:33:01 +02:00
ShyPike
11bae22827 Fix Wiki link in the installer (temporary). 2012-04-04 20:03:23 +02:00
shypike
5bbf8e9d89 Update translations 2012-04-04 19:57:40 +02:00
shypike
e544c7e9c4 Update Spanish translation. 2012-04-03 23:20:05 +02:00
shypike
41c2b6ff62 Add Spanish translation. 2012-04-03 22:54:54 +02:00
shypike
fca9d0b89e Ensure proper handling of web host address 0.0.0.0 when localhost does not resolve as expected. 2012-04-03 22:28:01 +02:00
ShyPike
af274c0f1c Sync with Config 2012-04-02 21:13:58 +02:00
shypike
7929cabb87 Update translations 2012-04-02 21:08:55 +02:00
ShyPike
e2de82979e Update text files for 0.7.0Beta1 2012-04-02 21:05:46 +02:00
ShyPike
0c89a69229 Add missing queue status (Status.*) replacements. 2012-03-31 16:41:35 +02:00
shypike
a1a45debdc Merge pull request #28 from alexfu/develop
Define queue status strings in a class.
2012-03-31 06:59:31 -07:00
Alex Fu
6c3f22573a Merged status.py with constants.py and fixed imports 2012-03-31 09:40:05 -04:00
ShyPike
b934b64468 Don't allow the "complete" folder to be a subfolder of "incomplete". 2012-03-31 11:49:18 +02:00
Alex Fu
c2998590fb Fixed NameError error 2012-03-30 21:37:06 -04:00
Alex Fu
01bd6fb979 Externalized all status strings using status.py 2012-03-30 16:22:38 -04:00
Alex Fu
4e8a384004 New file to isolate status strings. 2012-03-30 16:22:17 -04:00
ShyPike
8c515da6c0 Add "special" option to allow incomplete NZB files (in paused mode). 2012-03-29 22:17:32 +02:00
shypike
c18a1bba10 Merge pull request #27 from thezoggy/nzbmatrix-cat
NZBmatrix category update
2012-03-29 12:09:46 -07:00
Jonathon Saine
be002f8281 Updated nzbmatrix category mapping to current values and names. 2012-03-28 11:19:06 -05:00
ShyPike
b3b067c8fa Fix RSS link in the smpl skin so that it is compatible with an Apache proxy. 2012-03-27 19:54:08 +02:00
shypike
08c3d0f511 Set X bit of unrar-leopard. 2012-03-26 22:42:24 +02:00
ShyPike
c39ea87ef8 Update text files for 0.7.0 Alpha 3. 2012-03-26 22:29:01 +02:00
ShyPike
ba1693a853 OSX: Use unrar 4.10 for Leopard and older to keep PPC support.
(SL and Lion will get unrar 4.11)
2012-03-26 22:21:50 +02:00
ShyPike
9e36c64bb8 Sync Config skin. 2012-03-26 22:08:32 +02:00
ShyPike
40f08f04e4 Sync Config skin. 2012-03-26 20:32:57 +02:00
ShyPike
b9efcaa5a1 Update copyright stuff. 2012-03-26 19:29:29 +02:00
shypike
79cba85aba Update translations 2012-03-25 14:13:37 +02:00
ShyPike
cf105e144b When addressing a non-existent NZB detail page, return to queue page instead of showing a CherryPy crash message. 2012-03-25 13:59:59 +02:00
ShyPike
3a35402f1b Prevent crashes in the API when trying to access non-existing history elements. 2012-03-25 13:21:37 +02:00
ShyPike
f7f40d0c75 When determining set names, the setname was stored in lowercase (regression from 0.6.x).
This leads to later problems when matching files to sets in post-processing.
2012-03-24 10:54:15 +01:00
ShyPike
fa6b8199cb Update text files for 0.7.0Alpha2 2012-03-23 19:34:13 +01:00
shypike
f2fffd8c0a Update translations 2012-03-23 19:31:01 +01:00
ShyPike
eda7d3b560 Improve detection of older versions in Windows installer.
Remove more residue in Windows uninstaller.
2012-03-23 19:21:04 +01:00
ShyPike
7559804cbc Sync Config skin. 2012-03-23 16:47:01 +01:00
ShyPike
0630cd35d6 Update CHANGELOG.txt 2012-03-23 16:42:56 +01:00
ShyPike
28554e787c Prevent potential cash in par2-check when no par2 blocks are available. 2012-03-22 21:19:51 +01:00
ShyPike
965e69b378 ntfosd_enable should default to False for OSX and Windows. 2012-03-22 21:02:08 +01:00
ShyPike
f9c3a9441a Prevent double entries in History's "Source" section. 2012-03-22 20:13:27 +01:00
ShyPike
5ece2ce844 Replace real spaces in RSS-urls with %20. 2012-03-21 19:18:17 +01:00
ShyPike
20c857dc31 Update COPYRIGHT.txt file. 2012-03-20 20:55:20 +01:00
ShyPike
2a5ec5a65d Remove flags from the Wizard. 2012-03-20 20:54:50 +01:00
ShyPike
6654f75699 Prevent .git residue from ending up in the distribution files.
Add removal of Config skin in Windows uninstaller.
2012-03-20 19:26:36 +01:00
ShyPike
14d52a4ae7 Prevent crash when NotifyOSD support is not working on a Posix system. 2012-03-20 19:11:36 +01:00
ShyPike
b07214b706 Add Config skin to Win/GZ distros. 2012-03-19 21:35:39 +01:00
ShyPike
a929d9d8ce Update text files for 0.7.0 Alpha 1 2012-03-19 19:22:21 +01:00
shypike
386601ccdd Update translations 2012-03-19 19:04:47 +01:00
ShyPike
75677d88cf Fix crash in urlgrabber shutdown. 2012-03-18 21:57:42 +01:00
ShyPike
1e8d51d921 Test explicitly for hourly/daily limit messages from nzbmatrix. 2012-03-18 21:14:45 +01:00
ShyPike
9dadef60e7 Sync Config skin. 2012-03-18 11:29:16 +01:00
ShyPike
edb39c34b7 Update main POT file. 2012-03-18 11:26:02 +01:00
ShyPike
be96f029a2 Major changes in url-grabber and newzbin queues:
Keep retrying, add variable delays depending on problem, show waiting time in queue.
Only explicit problems (like bad credentials) will move item as "failed" to history.
2012-03-18 11:25:14 +01:00
ShyPike
e741a6644a When newzbin isn't reachable, the report number was dropped from the queue instead of re-added. 2012-03-17 14:25:17 +01:00
ShyPike
55e60a3e8e Update Config skin. 2012-03-15 22:14:36 +01:00
ShyPike
75e8381924 Update POT file. 2012-03-15 21:58:22 +01:00
ShyPike
bf3a1b8d43 Add new universal Config skin as a submodule. 2012-03-15 21:41:09 +01:00
ShyPike
4c5e8a57c5 Add text to skintext.py 2012-03-15 21:38:25 +01:00
shypike
7c5e9b7874 Update translations 2012-03-13 21:22:10 +01:00
ShyPike
1f35bc58e1 Add base_url to RSS page so that RSS "favicons" can be queried. 2012-03-13 20:30:50 +01:00
ShyPike
da105ba12f Update POT file. 2012-03-12 19:18:31 +01:00
ShyPike
fa0474611d Rewrite of file-joining function.
It couldn't handle sequences starting with .000 and the code was needlessly complex.
2012-03-11 21:56:22 +01:00
ShyPike
610c2c7f0f Remove potential crash when dealing with rar segments joined by par2. 2012-03-11 21:52:52 +01:00
shypike
643f20048b Update translations 2012-03-11 17:46:16 +01:00
shypike
6dc59f0d9a Merge pull request #25 from thezoggy/gzip-headers
Gzip headers
2012-03-10 23:35:14 -08:00
Jonathon Saine
30cbe48f10 Defined what mime types for cherrypy to gzip. text/* and javascript. 2012-03-10 23:43:39 -06:00
shypike
dc6f8a19e3 Update Win installer translations. 2012-03-10 12:35:37 +01:00
shypike
1da2c73ce0 Update translations 2012-03-10 12:31:03 +01:00
ShyPike
15537de378 Update POT files. 2012-03-09 18:54:24 +01:00
ShyPike
c72ecf0373 Remove Config skin from Config->General's skin pick lists. 2012-03-07 23:27:42 +01:00
ShyPike
2b6adc90c9 Update copyright dates. 2012-03-07 21:56:08 +01:00
ShyPike
5878ac81d7 Make '$my_lcldata' and '$my_home' available on all UI pages. 2012-03-07 21:32:43 +01:00
ShyPike
92f12911ea Always do a QuickCheck. When the user disabled QC, also do the par2 check and log a warning when QC and par2 have a different outcome. 2012-03-06 19:14:01 +01:00
ShyPike
5863ec6878 Protect launch_a_browser() against None parameter. 2012-03-06 19:08:18 +01:00
ShyPike
aeb83d3c93 Fix Plush speed/pause/options menu behavior for touch devices. 2012-03-05 21:38:09 +01:00
ShyPike
6571788800 Add "special" option "start_paused". 2012-03-02 19:37:29 +01:00
ShyPike
c335371b77 Send email when post-processing crashes.
Fix translation of stages in notification email.
2012-03-02 19:28:26 +01:00
shypike
9f534f788f Prevent hangup of OSX binary after Panic message.
OSX panic messages failed to reach the browser because OSX needs the prefix "file:///"  when showing a file in the browser.
2012-02-29 20:32:03 +01:00
ShyPike
bf6b2c3809 Fix pathbrowser.py further by suppressing CDROM drives and Unix/OSX names starting with ".". 2012-02-28 22:48:36 +01:00
ShyPike
ab00c54270 Improve pathbrowser.py by not showing problematic folders on Windows. 2012-02-28 21:23:57 +01:00
ShyPike
6932ccbfcd Assume user base folder as base for pathbrowser. 2012-02-27 22:40:00 +01:00
ShyPike
dd07dd44ba Flag and pause incomplete NZB files. 2012-02-27 20:40:02 +01:00
ShyPike
81ad6c1b05 Update unrar for Windows to 4.11 2012-02-25 16:05:45 +01:00
shypike
4aa902429e Update unrar for OSX to 4.11 2012-02-25 13:49:44 +01:00
shypike
8a683e4ef0 Fix api call error in Wizard that prevented Server Test from working behind Apache. 2012-02-25 13:07:40 +01:00
shypike
9046658d0f Add URL to "empty NZB" warning. 2012-02-25 13:01:33 +01:00
shypike
4c259d8d2b nzbmatrix changed "TV: Divx/Xvid" category into "TV: SD". 2012-02-25 12:44:04 +01:00
shypike
05ab19b5a6 Email notification for failed URL fetches. 2012-02-25 12:42:27 +01:00
shypike
9fb74616e8 Make newzbin fetch queue more robust. 2012-02-24 16:14:11 +01:00
ShyPike
eea2dab3a8 API call "browse" should expect UTF-8 input and convert that to the appropriate platform encoding. 2012-02-23 21:23:26 +01:00
ShyPike
a133bb28cd Add loglevel -1 to suppress logging altogether. 2012-02-22 22:01:06 +01:00
shypike
b7cda43d36 Merge pull request #22 from thezoggy/api-browse_tweak
Api browse tweak
2012-02-22 12:31:17 -08:00
Jonathon Saine
3bee9b3ec0 Due to the migration of the autocomplete module the api browse&compact command needed to be tweaked. 2012-02-22 14:25:35 -06:00
ShyPike
6281684c46 The schedule evaluator should pass effective server status to the downloader.
This prevents active use of schedule-disabled servers at startup.
2012-02-21 23:19:20 +01:00
ShyPike
41bc05a108 Enable "uniconfig" option by default. 2012-02-21 21:32:24 +01:00
ShyPike
da2c0d5539 Fix encoding issue in API calls "browse" and "get_scripts". 2012-02-21 20:50:37 +01:00
ShyPike
ac1c77d862 Fix for systems that have Python with an incomplete "locale" implementation. 2012-02-21 20:13:20 +01:00
ShyPike
eccece6799 Fix failure to decode uuencoded downloads.
Fix decoding of articles that use \n instead of \r\n as line terminators.
2012-02-16 18:58:14 +01:00
ShyPike
7dd5c03f64 Fix potential crash in API-call queue/sort. 2012-02-14 19:52:08 +01:00
shypike
406e155284 Make "par2_multicore" visible in Config->Special. 2012-02-12 12:33:50 +01:00
shypike
63069407b8 Add "Clear" button for server download stats. 2012-02-11 17:42:04 +01:00
ShyPike
1314219d78 Clean up "osx_menu" option code. 2012-02-08 19:27:51 +01:00
shypike
c602eadfa8 Add missing text. 2012-02-05 20:53:59 +01:00
shypike
ea28b7023f In Sorting expressions, add %sN, %s.N and %s_N for show/movie names without case-adjustment. 2012-02-05 20:49:10 +01:00
ShyPike
c5580f8de4 Update readme files. 2012-02-05 13:58:33 +01:00
ShyPike
c6b361950e API calls "addfile" and "addlocalfile" now return a list of nzo_ids which can be used to access queue items.
Json example:
{"status":0,"nzo_ids":["SABnzbd_nzo_bjibsz", "SABnzbd_nzo_ihfghs"]}
ZIP-files with NZBs will return multiple nzo_ids.
2012-02-05 13:54:44 +01:00
ShyPike
4a12acc82c build_header() did not set newzbin_url variable. 2012-02-05 13:44:31 +01:00
shypike
a1594f4915 Update text files to reflect current 0.7.x status. 2012-02-05 11:12:51 +01:00
ShyPike
be96a611af Fix api call "addfile" (for adding local NZB file). 2012-02-03 20:47:33 +01:00
ShyPike
2104f3cb81 OSX troubleshoot menu: when using 127.0.0.1 also reset http and https ports. 2012-02-03 20:47:20 +01:00
ShyPike
6761338dfe Flag post-processing as failed when files cannot be moved/copied to destination. 2012-01-29 00:15:14 +01:00
ShyPike
08966da22d Replace newzbin.com with newzbin2.es
Add an INI setting for its base URL.
2012-01-29 00:05:20 +01:00
ShyPike
d497ab0232 Don't keep Windows awake when there are only 'paused' items in the queue. 2012-01-23 20:43:26 +01:00
ShyPike
ff371e1328 Update feedparser license file. 2012-01-21 22:32:19 +01:00
ShyPike
0a0a8aae4b Update feedparser.py to version 5.1 2012-01-21 22:01:55 +01:00
ShyPike
b98ef1817c Add special setting to use "pickle" library instead of cPickle. 2012-01-15 14:48:08 +01:00
ShyPike
e9f2abd954 Suppress "incompatible feed" error when doing a scheduled/automatic RSS read-out. 2012-01-15 14:41:50 +01:00
ShyPike
2a7117d324 Windows un-installer now only offers to remove "settings", which is all of the AppLocal data of SABnzbd.
The "cache" part had no meaning since 0.6.0.
2012-01-07 12:39:24 +01:00
ShyPike
816850f211 Prevent crash on restoring URL-fetches when using --repair-all option. 2012-01-06 21:55:56 +01:00
ShyPike
45d14f92e5 Fix "Repair" button on smpl Connection page. Current path fails when using a reverse proxy. 2012-01-06 21:54:25 +01:00
ShyPike
9fa1840c31 Make QR texts translatable. 2012-01-02 21:08:37 +01:00
inpheaux
47854f491b Adds a QR Code popup to Plush Config -> General, as per a feature request on the forums
http://forums.sabnzbd.org/viewtopic.php?f=4&t=9710
2012-01-01 22:17:28 -05:00
ShyPike
bd94148648 Remove all embedded newlines in translated texts that contain HTML elements. 2011-12-31 13:24:21 +01:00
ShyPike
a54df8f2be Ignore whitespace around regular expressions in RSS filters. 2011-12-31 13:22:54 +01:00
shypike
3563b6450b Merge pull request #17 from thezoggy/pathbrowser-adjustment
Pathbrowser adjustment
2011-12-29 11:50:08 -08:00
Jonathon Saine
5bb995f601 Keep the '..' at the top, to return to the previous directory. 2011-12-29 12:22:31 -06:00
shypike
649ca5ad9a Merge pull request #16 from thezoggy/smpl_update_for_uc
Smpl update for Universal Config
2011-12-28 12:25:52 -08:00
Jonathon Saine
fed1c16524 Corrected smpl changes so it works for secondary skins. Also changed onClick to onclick to be proper (mainly cosmetic). 2011-12-28 12:38:35 -06:00
ShyPike
e9a6f4b9bc Preparation for Universal Config pages.
Will use 'Config' skin for configuration pages for all other skins.
Disabled by default, can be enabled by 'uniconfig' setting in [misc] section.
2011-12-28 17:57:50 +01:00
shypike
8bb6d676ef Make Growl on OSX find its icon again. 2011-12-28 09:24:56 +01:00
ShyPike
8b3954d31b Move all icons into a folder.
Windows SysTray started a bit earlier.
2011-12-27 22:56:33 +01:00
ShyPike
fa7ef0fc65 Further tuning of Windows Tray.
Move generic systrayiconthread.py to utils.
Cleanup text and other small stuff.
2011-12-27 21:47:14 +01:00
ShyPike
b9f42f689e Improvements for Windows SysTray. 2011-12-27 16:12:49 +01:00
shypike
9f85063eb3 Merge pull request #7 from janschejbal/develop
Tray icon for Windows
2011-12-27 06:17:28 -08:00
ShyPike
f5a0ba59e5 Update translation master. 2011-12-26 13:59:05 +01:00
shypike
8f553199a4 Improve OSX version detection and give Leopard image the name "*-osx-leopard.dmg". 2011-12-23 15:41:27 +01:00
shypike
c9347eece8 Extend OSX menu with Troubleshoot items and "Scan watched folder". 2011-12-23 15:38:44 +01:00
ShyPike
b94c3ede4a Move "locale" construction from Plush skin to Python code.
Some embedded Linux platforms show bizarre behavior with the original construction.
2011-12-21 19:29:17 +01:00
ShyPike
0fafbd6f2e Work-around for malfunctioning IPv6 one some Linux platforms.
Specifically: situation where "localhost" resolves to "::1" and "127.0.0.1" while IPV6 is disabled and therefor "::1" not really working.
2011-12-18 12:28:52 +01:00
ShyPike
db8f9b5f8c Typo in previous commit. 2011-12-17 21:08:43 +01:00
ShyPike
76449721b1 Only try to remove a nzbmatrix bookmark when an URL is known. 2011-12-17 20:57:35 +01:00
ShyPike
bb29eb9dbc misc.format_source_url() crashed when receiving newzbin report number. 2011-12-17 14:47:44 +01:00
ShyPike
15a66b1f28 Add config item for the movie rename threshold and lower the default to 100M. 2011-12-16 21:15:24 +01:00
ShyPike
722c523893 Plush: Don't show newzbin icons in history when they have no info. 2011-12-13 22:46:11 +01:00
ShyPike
9f553fd61f Make "speedlimit" translatable in Config->Scheduler and show value 0 as "off". 2011-12-13 21:57:17 +01:00
ShyPike
b16b625c7c Don't accept the scheduler event "speedlimit" without a proper speed value. 2011-12-12 18:51:46 +01:00
shypike
dd7335c257 Use default Python interpreter only for non-executable Python scripts (OSX and Unix). 2011-12-11 20:35:09 +01:00
ShyPike
e6cb6d0171 Merge remote-tracking branch 'remotes/origin/develop' into develop 2011-12-11 16:08:55 +01:00
ShyPike
af54add471 Add NZB source to History (for watched-folder files and URL-based). 2011-12-11 16:05:53 +01:00
shypike
f812e9f6e6 Improve support for old RAR multipart numbering schema (r01, s01, t01 etc.) 2011-12-10 13:58:45 +01:00
shypike
96e1b81179 Only warn about identical port for HTTP and HTTPS when HTTPS is actually enabled. 2011-12-10 13:53:46 +01:00
shypike
8b2bcc8d10 Prevent setting watched-folder speed to 0 (while having no watched-folder) from triggering an inifinite loop. 2011-12-10 11:50:05 +01:00
ShyPike
140cb53485 Prevent "watched folder" from being reset to default when it cannot be created at startup time. 2011-12-10 11:49:55 +01:00
ShyPike
975bbbdbcd Prevent potential crash in RSS link analysis. 2011-12-08 21:55:23 +01:00
shypike
fe6d4f3673 Add --console option to force console logging for OSX app. This will help diagnose startup problems. 2011-12-08 21:55:12 +01:00
ShyPike
095f3576c4 Make sure that paths coming from Sorting are normalized. 2011-12-08 21:55:00 +01:00
ShyPike
753ed1c846 Prevent crash when 'localhost' does not resolve in all_localhosts(). 2011-12-07 20:25:21 +01:00
ShyPike
ab80e2b15b When retrying an URL fetch from History, remove the History entry and don't show a re-queue message anymore. 2011-12-05 20:46:02 +01:00
ShyPike
11b5d2e998 Report failed URL fetches to Growl. 2011-12-05 19:33:59 +01:00
ShyPike
3568d067be Handle OS-es that returns multiple identical IPs for localhost (like Ubuntu-s). 2011-12-05 18:42:33 +01:00
ShyPike
f85f5bf317 Movie sort failed to created specified job folder (regression error). 2011-12-05 18:33:14 +01:00
ShyPike
3f772b3ba7 Don't ask for gzip compression when getting a ZIP file from a web site. 2011-12-02 21:30:44 +01:00
ShyPike
293882b2bb Prevent rare crash in TestServer function. 2011-11-29 23:09:43 +01:00
ShyPike
103f71fa01 Modify analysis of RSS feeds so that links in a Yahoo pipe are handled
conform the rules for the original index site.
2011-11-29 23:09:13 +01:00
ShyPike
f30b5b1063 Handle incorrect date fields in NZB files and accept the NZB anyway. 2011-11-23 19:28:18 +01:00
ShyPike
ae6deed7cd Fix two potential crashes. 2011-11-20 14:14:50 +01:00
ShyPike
eaa1efb910 When secondary web-ui is not defined, redirect to primary web-ui. 2011-11-20 13:00:18 +01:00
ShyPike
c5b7e021cd Use the mini-par2 file instead of the smallest vol-par2 file.
Send all the vol-par2 files immediately to the end of the queue so that nothing of it is downloaded when not needed.
2011-11-19 21:41:00 +01:00
ShyPike
7b3c400124 Store verified status in job admin, so that when retrying from History, a successful verification isn't repeated. 2011-11-19 21:31:26 +01:00
ShyPike
6e31d55941 Handle special case of joined RAR files.
This prevents the joined files from being seen as an extra RAR-set.
2011-11-19 21:22:50 +01:00
ShyPike
7ae2396167 When trying passwords on encrypted RAR files, only log failure once. 2011-11-19 21:18:40 +01:00
ShyPike
d6bb30c84b Make sure SFV check isn't done when more par2 files can still be downloaded. 2011-11-17 21:10:31 +01:00
ShyPike
9ffb2c2438 Handle unknown Growl errors too. 2011-11-17 20:56:26 +01:00
ShyPike
c0a12d5a11 Further improvement of detection of encrypted RAR files. 2011-11-17 20:55:21 +01:00
ShyPike
ed720fffec Improve detection of encrypted rar files. 2011-11-17 20:55:09 +01:00
ShyPike
a7e0cffe0f api call "get_bookmarks" should ignore "auto-fetch bookmark" setting too. 2011-11-14 20:55:20 +01:00
ShyPike
cf6eca6789 After failed par2 verification do an SFV check (if enabled and SFV files available).
Previously an SFV check was only done when no par2 files were available.
2011-11-11 22:05:31 +01:00
shypike
d5e60bf250 Make "Get Bookmarks Now" (newzbin) button work when auto-fetch for bookmarks is off. 2011-11-11 19:56:00 +01:00
shypike
93f0f6f08c Prevent crash after failed Growl registration. 2011-11-08 21:27:44 +01:00
shypike
7ef486c44e Fix logging of Pre-Q script result. 2011-11-08 21:26:31 +01:00
shypike
36704e4ad6 Fix crash in pre-queue script due to incorrect parameter in SeriesSorter call. 2011-11-08 21:17:35 +01:00
ShyPike
c735e1da89 Always run Python user scripts, despite not being "executable". 2011-11-04 22:21:36 +01:00
ShyPike
2ae38c8c04 Log invocation of par2 command (debug level). 2011-11-02 20:20:40 +01:00
ShyPike
9b79188526 Only run extension-based cleanup when verification was OK.
Otherwise the user may lose par2 files if .par2 was in the cleanup list.
2011-11-02 20:20:30 +01:00
ShyPike
d792ef30f9 Re-apply patch to GNTP. 2011-10-22 21:43:47 +02:00
ShyPike
60e1569016 Update GNTP module. 2011-10-22 21:35:45 +02:00
ShyPike
de8ba245e9 Eliminate extra (temporary) folder level when using GenericSort. 2011-10-22 17:50:37 +02:00
Jan Schejbal
1f125ca0fc windows systray: fixed newlines, file locations and names 2011-10-21 02:33:08 +02:00
ShyPike
bb30a5600a Growl improvements.
Reduce GNTP logging.
Limit GNTP timeout to 10 seconds (if Python version supports it).
Start GNTP notification in separate thread to prevent lockups when server does not respond.
2011-10-18 23:00:07 +02:00
ShyPike
0229335c15 Make sure that "complete" and "incomplete" paths are different.
If needed, make "incomplete" a sub folder of "complete".
This is to avoid name clashes between complete and incomplete jobs.
2011-10-18 22:29:35 +02:00
shypike
d3d16da3f0 OSX menu should show 10 queued items (like the text claims) instead of 9. 2011-10-18 22:00:09 +02:00
ShyPike
4b959da7d2 Make SABnzbd listen on all available localhost equivalents (usually 127.0.0.1 and [::1]).
Add command line option --stack with values '4', '6', 'b' meaning IPv4-only, IPv6-only and both, respectively.
This will fix connection problems on systems with an ambiguous localhost.
2011-10-18 21:07:48 +02:00
ShyPike
eae8f65e15 Prevent reading newzbin bookmarks when no newzbin credentials are known. 2011-10-17 12:03:33 +02:00
ShyPike
816ea12993 Add sabnzbd.ico to OSX dmg so that Growl can use it. 2011-10-16 22:11:32 +02:00
ShyPike
7d186e4585 Add remark about pynotify. 2011-10-16 20:57:39 +02:00
ShyPike
b128f4fa89 Make sure that having Growl support will not override NotifyOSD. 2011-10-16 16:34:50 +02:00
ShyPike
7c7cb84fd1 Fix small typo. 2011-10-16 16:20:06 +02:00
ShyPike
d3b2fba6a1 When reading file names from an SFV file, convert to encoding suitable for the platform. 2011-10-16 12:13:27 +02:00
ShyPike
330b836e08 Render ambiguous Windows paths like "D:" and "D:folder" as "D:\" and "D:\folder". 2011-10-12 23:28:44 +02:00
ShyPike
a7defa37bf Add gntp module to source distribution file. 2011-10-12 23:28:19 +02:00
shypike
a7724069b5 OSX: Generate a SnowLeopard/Lion DMG and a Leopard DMG. 2011-10-12 23:27:45 +02:00
ShyPike
e4bba37ccb Create backup of the INI file before changing it.
Add some more steps in an order that avoids damaging it at all times.
2011-10-12 23:27:05 +02:00
ShyPike
28aff1e8f3 Fix failure to recognize "encrypted file" message from unrar 4.01. 2011-10-12 23:26:18 +02:00
ShyPike
8c060dbd44 Merge remote-tracking branch 'remotes/origin/master' into develop 2011-10-12 23:05:01 +02:00
ShyPike
c2ade817e7 Enable "with" statement in growler.py for Python 2.5. 2011-10-11 21:24:55 +02:00
shypike
681c466a18 Merge pull request #8 from mjc/displayvar-warning
Suppress pynotify gtk display warning during startup when DISPLAY environment variable is not set
2011-10-11 12:23:13 -07:00
Michael J. Cohen
d328762cd3 turn warnings into exceptions during loading of pynotify, preventing a console outputed warning when X11 is not available 2011-10-11 03:25:17 -04:00
ShyPike
7299b61244 OSX: Detect presence of pre-1.3 Growl.
If found, then use old-style SDK otherwise assume GNTP protocol.
2011-10-08 16:09:07 +02:00
shypike
361c7dd51e OSX: prevent changes to App after first run. Remove site.py from DMG distribution so that the compiled site.pyc file cannot change anymore. 2011-10-08 12:22:07 +02:00
ShyPike
cb2922a805 Add license text for GNTP module. 2011-10-05 20:52:22 +02:00
ShyPike
17e33def2e Fix failing app build. 2011-10-05 20:33:52 +02:00
ShyPike
d817af8897 Fix Plush's bad links due to having added one slash too much. 2011-10-04 21:17:14 +02:00
Jan Schejbal
2904075724 tray icon update frequency decreased, newlines added 2011-10-04 16:33:50 +02:00
Jan Schejbal
730c2ec631 tray icon 2011-10-04 16:20:15 +02:00
ShyPike
8b45af529a Fix regression error that made the no-folders option in Config->Categories impossible. 2011-09-30 20:41:46 +02:00
ShyPike
fbb5bc608c Fixed failing loglevel in Plush.
Fixed missing trailing slashes in Plush config paths.
2011-09-26 21:21:34 +02:00
ShyPike
87bfcd4fb4 Make default for size_limit option "0" instead of an empty string. 2011-09-26 21:05:40 +02:00
ShyPike
0fb45ba563 Refuse to add empty RSS filter.
Update text.
2011-09-26 20:00:09 +02:00
ShyPike
2eb62bf8c9 Add Config->Special page.
Meant to give access to rarely used options which were up to now INI-file only.
(Plush only)
2011-09-25 21:43:34 +02:00
ShyPike
4f87b33df7 Add save_rss_feed method to ConfigRSS (this one will handle the 'enable' parameter). 2011-09-25 16:40:31 +02:00
ShyPike
97de9cb93e Refuse to store a new RSS feed without a name or URI. 2011-09-25 14:49:33 +02:00
ShyPike
72cfd48135 Missed a link in Classic in previous commit. 2011-09-25 14:42:57 +02:00
ShyPike
a886253bea Rename several Web-UI pages to follow their current visible naming.
Config->Directories ==> Config->Folders
Config->Newzbin ==> Config->Indexers
Config->Email ==> Config->Notify
Connection_info ==> Status
2011-09-25 14:28:31 +02:00
ShyPike
d6363252ea Fix text typo. 2011-09-24 12:06:40 +02:00
ShyPike
d2c4f316c7 Fix text typo. 2011-09-24 12:05:50 +02:00
ShyPike
cdec953d96 Make scheduler show hh:mm instead of h:mm. 2011-09-23 21:52:41 +02:00
ShyPike
0bc0d4b0e8 Add hidden (for now) option fsys_type to override 8bitASCII/UTF-8 detection on Posix systems.
0 = automatic, 1 = 8bit-ASCII, 2 = UTF-8
2011-09-23 21:46:47 +02:00
ShyPike
ec0555a86f Postpone substitution of %ext in folder names until the phase that the extension is known. 2011-09-23 21:19:30 +02:00
ShyPike
e89ad70701 Fix preview of Generic Sort, element multipart. 2011-09-23 21:01:54 +02:00
ShyPike
95c8440c36 Fix eval_sort API call. 2011-09-21 21:24:23 +02:00
ShyPike
a814b45851 Sanitize the "name" parameter in eval_sort API call. 2011-09-20 23:17:57 +02:00
ShyPike
0730f86304 Add API calls "test_email" and "test_notif".
Return error messages when Growl (gntp) notifications fail.
Prevent creation of an registration object for each OSX Growl notification, just re-use it.
2011-09-20 16:33:54 +02:00
shypike
84029045ba Fix api function "eval_sort". 2011-09-20 00:30:10 +02:00
shypike
37cd87f3f4 Show original command line in Config->Base 2011-09-15 21:08:37 +02:00
shypike
b362ae3d8a Don't let make_mo.py depend on having executable .py files on Windows. 2011-09-13 20:51:31 +02:00
shypike
a39cfa485b Work-around for Python bug when dealing with space in script path on Windows. 2011-09-13 20:00:49 +02:00
shypike
b4ae208943 Support spaces in the current path when running tools/make_mo.py 2011-09-13 18:56:56 +02:00
shypike
45369fb5b2 Suppress unreliable ETA predictions when pre-checking jobs. 2011-09-11 11:10:55 +02:00
shypike
713993140f Update text files for 0.6.9 Final. 2011-09-10 10:57:25 +02:00
ShyPike
57476ef7b7 Merge remote-tracking branch 'remotes/origin/master' into develop 2011-09-08 22:00:34 +02:00
shypike
176e6b6afd Merge pull request #4 from sabnzbd/0.6.x
Merge 0.6.9RC2 into master.
2011-09-08 12:42:33 -07:00
ShyPike
5ecbf795af Merge remote-tracking branch 'remotes/origin/master' into 0.6.x
Conflicts:
	.gitignore
2011-09-08 21:39:43 +02:00
shypike
42b1202b06 Extend OSX DMG background images to avoid obscuring by the path bar. 2011-09-07 21:53:49 +02:00
shypike
37acad6ec7 Update text files for 0.6.9 RC2 2011-09-06 20:18:49 +02:00
shypike
74d90b8361 Correct formatting errors in translations. 2011-09-06 19:12:59 +02:00
shypike
952682d557 Update translations 2011-09-06 19:02:37 +02:00
shypike
c1f3e44fb8 Add hidden option "allow_64bit_tools" to allow or prevent use of 64bit par2 and unrar. 2011-09-04 16:37:38 +02:00
shypike
fa2a6c673c Improve handling of non-creatable "complete" and category folders.
Remove the tendency of the status-api to create final folders prematurely.
Make error message about folder creation translatable.
2011-09-04 13:00:32 +02:00
shypike
b46ae4782d GenericSorter should always uppercase the initial letter of "the", "a", "of" etc. at the start of a title.
"the way of the few" => "The Way of the Few".
2011-09-03 13:43:24 +02:00
shypike
6ebbc81792 Change the OSX DMG window size so that the optional "path bar" doesn't obsure part of the background image. 2011-09-03 13:12:35 +02:00
shypike
1d7170f193 Fix and I18N the "Downloaded in X days Y hours Z seconds" text in the history report. 2011-09-01 21:42:46 +02:00
shypike
3dea948ecc Update text files for 0.6.9 RC1. 2011-09-01 18:58:25 +02:00
shypike
1e960ae2e9 Check email parameters also when only email_rss option is enabled. 2011-09-01 18:55:44 +02:00
shypike
e6b21f1ca5 Attempt to remove memory leak due to pickling the admin files. Use Pickler object (and clear_memo) instead of pickle function. 2011-08-30 23:32:17 +02:00
shypike
ebd3cbd932 When removing a job folder in the "incomplete" folder, also remove files in subfolders and the subfolders. This is necessary because some operating systems produce stray files/folders. 2011-08-30 22:28:17 +02:00
shypike
b8fb5cbfbf Setting of WIN64 flag was done only after selecting unrar/par2 variants.
The result was that the x64 variants were never used.
Closes #3
2011-08-29 21:54:49 +02:00
shypike
01494bd010 When using the Download button in RSS feeds for newzbin, the nzb name was incorrect. Closes #2 2011-08-29 20:04:21 +02:00
ShyPike
dd95becdff Fix small differences caused by the rebase of "develop" to "master". 2011-08-27 11:10:45 +02:00
ShyPike
8d532a75ee Servers with square brackets in the name were not removed from the INI file.
The reason was that the required substitution of "[]" with "{}" wasn't done in all situations.
2011-08-27 10:18:32 +02:00
ShyPike
27ac80c154 Make package.py work in a git environment.
Remove bazaar specials and add .gitignore

Signed-off-by: ShyPike <shypike@sabnzbd.org>
2011-08-27 10:18:32 +02:00
ShyPike
15058c37b3 Move sabnzbd-template.sparseimage.zip from root to sub folder. 2011-08-27 10:18:32 +02:00
ShyPike
6b85bf0a49 Fix crash in test email due to incorrect type. 2011-08-27 10:18:31 +02:00
ShyPike
2b24ec2ece Windows binaries are now based on Python 2.6 or 2.7.
Installer will detect missing MS runtimes and offer to download and install.
2011-08-27 10:18:31 +02:00
ShyPike
d99369d4f0 Allow 'paused' as priority in Config->Categories. 2011-08-27 10:18:30 +02:00
ShyPike
f85ec9007c Fix failing server test (due to introduction of random IP pick). 2011-08-27 10:18:30 +02:00
ShyPike
f89ca6b390 Fix unset variable that prevented save of "future" queue item. 2011-08-27 10:18:30 +02:00
ShyPike
6571ba90ca Limited article retries for servers.
This will prevent most deadlock situations, if configured right.
2011-08-27 10:18:30 +02:00
ShyPike
a638d182ab For Usenet servers with multiple IP addresses, pick a random one per connection. 2011-08-27 10:17:00 +02:00
ShyPike
d5caeddb30 Remove smpl skin version number. 2011-08-27 10:17:00 +02:00
ShyPike
d818020915 Add pseudo-priority "Stop" that will send the job immediately to the post-processing queue. 2011-08-27 10:17:00 +02:00
ShyPike
9a0c8aa660 The -p command line parameter must override auto-resume by quota management at startup. 2011-08-27 10:16:47 +02:00
ShyPike
dd4918b6d8 Add missing 'week' text in skintext.py.
Update translations.
2011-08-27 10:16:47 +02:00
ShyPike
11f7260b40 Fixes for handling of priorities in job's attrib file. 2011-08-27 10:14:48 +02:00
ShyPike
052746e16f Update POT file. 2011-08-27 10:14:48 +02:00
ShyPike
c03921ad55 Rename some bps variables.
Rename quotum to quota.
2011-08-27 10:13:09 +02:00
ShyPike
b0cd07dfc0 Add manual quotum period.
Add reset-quotum button.
2011-08-27 10:05:59 +02:00
ShyPike
7e635e1f3d Improve quotum-period end-detection, despite SABnzbd not running during end event. 2011-08-27 10:05:36 +02:00
ShyPike
c5d675ac88 Webserver 404 (NotFound) errors will automatically redirect to the main page. 2011-08-27 10:05:35 +02:00
ShyPike
94b3629fa5 Bump version to 0.7.x. 2011-08-27 10:05:35 +02:00
ShyPike
0956915d33 Show quotum overshoot by showing negative numbers.
Better initial situation after upgrading from previous totals9.sab file.
2011-08-27 10:05:35 +02:00
ShyPike
5e3cd8d77b Rename "email" menu to "Notifications". 2011-08-27 10:05:35 +02:00
ShyPike
53aed799a1 Add universal Growl support.
- Windows: through GNTP library
- OSX: through Growl library for local server and GTNP for remote server
- Unix/Linux: through GNTP library
For Ubuntu there's support for NotifyOSD.
Made Growl class texts translatable.
2011-08-27 10:05:35 +02:00
ShyPike
3a95707d79 Implement pre-check.
Check presence of articles on the servers before actual downloading.
If the amount is too small for a successful download & repair, fail the job.
2011-08-27 09:59:56 +02:00
ShyPike
c59a7a91a9 Use a separate field for quotum period (m/w/d). 2011-08-27 09:56:19 +02:00
ShyPike
cdc086f2db Add support for quotum management. 2011-08-27 09:52:16 +02:00
Jon Saine
6dd4c0551e Reverted hoverIntent version back to r5. It was breaking the menu.
Forgot to upgrade plush.js for jquery 1.6.x compatibility.
2011-08-22 09:09:04 -05:00
Jon Saine
8225dae182 Converted some jquery code for 1.6.x compliance.
With jquery 1.6.x the attributes module was modified slightly to eliminate ambiguity between attributes and properties.
Long story short, $('blah').attr('checked', true) is now $('blah').prop('checked', true).
2011-08-22 09:09:03 -05:00
Jon Saine
9999065f0a jQuery 1.5.1 -> 1.6.2
-- http://blog.jquery.com/2011/06/30/jquery-162-released/
 -- 1.5 to 1.6 notes: http://blog.jquery.com/2011/05/12/jquery-1-6-1-released/
jQuery UI 1.8.10 -> 1.8.15
 -- http://jqueryui.com/docs/Changelog/1.8.15
 -- Several additional modules was included due to dependency for the upcoming folder browser code.
ColorBox 1.3.15 -> 1.3.17
 -- http://colorpowered.com/colorbox/core/README
jQuery.hoverIntent r5 -> r6
 -- http://cherne.net/brian/resources/jquery.hoverIntent.html#defects
2011-08-22 09:09:03 -05:00
Jeff George
90d11ada6b Kill .bzr stuff, add .gitignore & a pretty README.md for GitHub. 2011-08-22 09:09:03 -05:00
shypike
67a1ee3cde Update translations. 2011-08-20 17:00:40 +02:00
shypike
0f8df0f072 Update POT files. 2011-08-20 16:11:13 +02:00
shypike
9c9936e7ae Update UnRAR to release 4.01 2011-08-20 15:26:34 +02:00
shypike
92926a4825 Use different background images for Lion and (Snow)Leopard DMG files. 2011-08-20 12:10:13 +02:00
Jeff George
92ac787315 Kill .bzr stuff, add .gitignore & a pretty README.md for GitHub. 2011-08-16 16:17:27 -04:00
shypike
2cc53e8dc3 Make package.py work in a git environment.
Remove bazaar specials and add .gitignore
2011-08-16 10:43:55 +02:00
ShyPike
18cb5710f9 Servers with square brackets in the name were not removed from the INI file.
The reason was that the required substitution of "[]" with "{}" wasn't done in all situations.
2011-08-16 10:32:33 +02:00
ShyPike
11b8f23528 Fix crash of emailer.py when email notification is on, without having proper email settings. 2011-08-16 10:30:22 +02:00
ShyPike
cf72abedfd Update text files or 0.6.8 Final. 2011-08-11 20:42:14 +02:00
ShyPike
31f92ebdd5 Update text files for 0.6.8 RC1 2011-08-08 16:22:41 +02:00
ShyPike
39a6635229 Prevent occasional exit crashes of the Kronos module. 2011-08-08 14:11:00 +02:00
ShyPike
a87a70d9c6 Solve several RSS issues:
- Remove links from feeds that have been deleted from rss_data.sab
- Expired links should be re-examined when they re-appear in the feed
- Sanity check of rss_data.sab at startup could expire links without reason
- Reduce storage of expired links from 7 days to 3 days.
- Duplicates detected were not given the pseudo-priority "Duplicate" (if that option was set by the user)
2011-08-07 16:11:05 +02:00
244 changed files with 36488 additions and 15177 deletions

15
.bzreol
View File

@@ -1,15 +0,0 @@
[LF]
.bzreol
.bzrignore
*.py
*.tmpl
*.js
*.css
*.txt
*.po
*.pot
*.sh
[CRLF]
*.bat
*.cmd
*.nsi

View File

@@ -1,10 +0,0 @@
*.pyc
*.pyo
build
dist
locale
srcdist
cherrypy
*.wpr
*.keep
*.bak

13
.bzrtab
View File

@@ -1,13 +0,0 @@
[NOTAB]
*.py
*.txt
*.po
*.pot
*.sh
*.bat
*.cmd
*.nsi
*.tmpl
*.js
*.css
[TAB]

28
.gitignore vendored Normal file
View File

@@ -0,0 +1,28 @@
#Compiled python
*.py[co]
# Working folders for Win build
build/
dist/
locale/
srcdist/
# Generated email templates
email/*.tmpl
# Romanian ro.po is generated from ro.px, due to mapping to latin-1
ro.po
# Build results
SABnzbd*.zip
SABnzbd*.exe
SABnzbd*.gz
SABnzbd*.dmg
# WingIDE project file
*.wpr
# General junk
*.keep
*.bak
*.log

View File

@@ -1,5 +1,5 @@
*******************************************
*** This is SABnzbd 0.6.7 ***
*** 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

View File

@@ -1,797 +1,132 @@
-------------------------------------------------------------------------------
0.6.7Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Prevent immediate exit after startup when queue is empty and
an end-of-queue action like "shutdown" was set
- Fix failure to launch browser when clicking shortcut the second time
- Allow jobs still waiting for post-processing to be deleted
- Delay starting of dowload task until after webserver is started.
- Plush: button "Purge failed NZBs & delete files" will now actually delete files
- Classic/smpl: add link "Purge failed NZBs & delete files"
- Plush: fix flashing top menu in Safari 5.1
-------------------------------------------------------------------------------
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.0RC2 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Suppress permission errors on paths containing ".AppleDouble" or ".DS_Store"
(Required for NAS systems that support Apple AFP shares)
- OSX/Windows: Set article cache to 200M when not already set.
- Pre-check: lower default minimum completion rate to 100.2%
-------------------------------------------------------------------------------
0.7.0RC1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix for rare crash in par2 fetching
- Another /nomedia fix
- Quota reset wasn't done when quota-reset-time was passed while SABnzbd wasn't running.
- Pre-check: required ratio for NZB without par2 files should be 100%
and not the "safe" ratio
-------------------------------------------------------------------------------
0.7.0Beta8 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Disabled the .nomedia marker file feature.
Those who want to try it, use the "nomedia_marker" setting in Config->Special
It remains an experimental feature without guarantees
- Add missing info in email about failed pre-check
- Updated translations
-------------------------------------------------------------------------------
0.7.0Beta7 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix for .nomedia files not being deleted
- Fix NZB re-queueing (due to .nomedia remaining)
- Polish was missing in Windows installer and Dutch was incorrect
- When Sort renames auxillirary files, it should disregard case
- Fix crash in Wizard on some Linux systems
-------------------------------------------------------------------------------
0.7.0Beta6 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Upgrade unzip for Windows to 6.00 (supports ZIPs above 2G)
- Lower threshold for pre-check to 100.5%
- Fix removal of .nomedia file when using Sorting
- Add Polish translation (using reduced character set)
- Extension-based cleanup list now also removes extension-only files like ".sfv".
- Several small issues
-------------------------------------------------------------------------------
0.7.0Beta5 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Solved serious connection problem with some providers
- Windows Tray has the "restart" entries no under a Troubleshoot menu
- Fix newzbin entries in History's "Source" field
- During unpacking the destination folder will contain a ".nomedia" file
which will keep mediaplayers temporarily from indexing
- Pre-check jobs now require 101% completion rate (with a "special" parameter)
- Unified OSX DMG
-------------------------------------------------------------------------------
0.7.0Beta4 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Add Portuguese (Brazil) language
- Updated translations
- Some odd NZB files led to blank initial filenames in file overview
- Jobs that have 99.91%-99.99% completion rate should not be rounded to 100.0%
- Windows Tray icon now has entry to show "complete" folder
- Some minor fixes in code and Config skin
- Individual RSS filter toggle
-------------------------------------------------------------------------------
0.7.0Beta3 by The SABnzbd-Team
-------------------------------------------------------------------------------
- OSX/Linux: permissions are now also applied to the "temporary download folder"
- Fix some issues in the Config skin.
- The default for "apply max retries only on optional servers" is now 0,
thus enabling the new anti-deadlock behaviour for all servers
- Fix incompatibility with nzbsa.co.za indexer
- Log all API calls (in debug mode)
- Restore Python2.5 compatibility in growler.py
- After a language change, register again with Growl
- Clean up the api-call auth. It will now give preference to 'apikey'.
- Fix detection of retry-able history entries for case-insensitive file systems.
- API-calls "addfile" and "addlocalfile" returned an incorrect status value.
- Add support for the peculiar Usenet provider "free.xsusenet.com".
- OSX menu now uses the same formatting for speed as the skins.
- Accept multiple items in API-calls "addurl" and "addid".
The "name" and "nzbname" keywords can be repeated.
-------------------------------------------------------------------------------
0.7.0Beta2 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix behavior when using host address 0.0.0.0 on a system
that doesn't resolve localhost properly
- Add Spanish translation
-------------------------------------------------------------------------------
0.7.0Beta1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Updated nzbmatrix categories
- "Special" option allows incomplete/partial NZB files
- Forbid "complete" being a subfolder of "incomplete"
-------------------------------------------------------------------------------
0.7.0Alpha3 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix failing join-by-par2
- Prevent API crash when deleting non-existing history item
- Prevent UI crash message when looking at NZB details page of finished job
- Config skin: fix path complettion in Config->Folders
- Config skin: fixes to support "hide behind proxy"
- Keep using unrar 4.10 for OSX Leopard and older, due to PPC support
-------------------------------------------------------------------------------
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.

View File

@@ -1,17 +1,32 @@
(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>
The main contributors and moderators of the translations
Danish: Rene (nordjyden6)
Dutch: ShyPike
French : rAf and Fox Ace
German: Severin Heiniger
Norwegian: Protx
Romanian: nicusor
Serbian: Ozzii
Swedish: Malmis
Spanish: Syquus
Portuguese (Brazil): lrrosa
Russian: Pavel Maryanov
Polish: Tomasz 'Zen' Napierala
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License

View File

@@ -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,48 +39,62 @@ 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 the DMG file, mount and drag the SABnzbd icon to Programs.
Just like you do with so many apps.
Make sure you pick the right folder, depending on your OSX version.
-------------------------------------------------------------------------------
3) INSTALL with only sources
4) INSTALL with only sources
-------------------------------------------------------------------------------
You need to have Python installed and some modules.
You need to have Python installed plus some non-standard Python modules
and a few tools.
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/
yenc module >= 0.3 http://sabnzbd.sourceforge.net/yenc-0.3.tar.gz
http://sabnzbd.sourceforge.net/yenc-0.3-w32fixed.zip (Win32-only)
cheetah-2.0.1+ http://www.cheetahtemplate.org/ (or use "pypm install cheetah")
par2cmdline >= 0.4 http://parchive.sourceforge.net/
http://chuchusoft.com/par2_tbb/index.html (multi-core)
Optional modules
unrar >= 3.90+ http://www.rarlab.com/rar_add.htm
unzip >= 5.52 http://www.info-zip.org/
yenc module >= 0.3 http://sabnzbd.sourceforge.net/yenc-0.3.tar.gz
http://sabnzbd.sourceforge.net/yenc-0.3-w32fixed.zip (Win32-only)
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 +105,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 +123,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 +131,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.

View File

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

View File

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

View File

@@ -1,469 +1,459 @@
; -*- coding: latin-1 -*-
;
; Copyright 2008-2011 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
; as published by the Free Software Foundation; either version 2
; of the License, or (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
!addplugindir win\nsis\Plugins
!addincludedir win\nsis\Include
!include "MUI2.nsh"
!include "registerExtension.nsh"
Name "${SAB_PRODUCT}"
OutFile "${SAB_FILE}"
; Some default compiler settings (uncomment and change at will):
; SetCompress auto ; (can be off or force)
; SetDatablockOptimize on ; (can be off)
; CRCCheck on ; (can be off)
; AutoCloseWindow false ; (can be true for the window go away automatically at end)
; ShowInstDetails hide ; (can be show to have them shown, or nevershow to disable)
; SetDateSave off ; (can be on to have files restored to their orginal date)
WindowIcon on
InstallDir "$PROGRAMFILES\SABnzbd"
InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
;DirText $(MsgSelectDir)
;Vista redirects $SMPROGRAMS to all users without this
RequestExecutionLevel admin
FileErrorText "If you have no admin rights, try to install into a user directory."
;--------------------------------
;Variables
Var MUI_TEMP
Var STARTMENU_FOLDER
;--------------------------------
;Interface Settings
!define MUI_ABORTWARNING
;Show all languages, despite user's codepage
!define MUI_LANGDLL_ALLLANGUAGES
!define MUI_ICON "interfaces/Classic/templates/static/images/favicon.ico"
;--------------------------------
;Pages
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
!define MUI_COMPONENTSPAGE_NODESC
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
;Start Menu Folder Page Configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\SABnzbd"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "SABnzbd"
;Remember the installer language
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
!define MUI_LANGDLL_REGISTRY_KEY "Software\SABnzbd"
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
!define MUI_FINISHPAGE_RUN_TEXT $(MsgStartSab)
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\README.txt"
!define MUI_FINISHPAGE_SHOWREADME_TEXT $(MsgShowRelNote)
;!define MUI_FINISHPAGE_LINK "View the SABnzbdPlus Wiki"
;!define MUI_FINISHPAGE_LINK_LOCATION "http://wiki.sabnzbd.org/"
!define MUI_FINISHPAGE_LINK $(MsgSupportUs)
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.sabnzbd.org/contribute/"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!define MUI_UNPAGE_COMPONENTSPAGE_NODESC
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
;Languages
; Set supported languages
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German"
!insertmacro MUI_LANGUAGE "Dutch"
!insertmacro MUI_LANGUAGE "Swedish"
!insertmacro MUI_LANGUAGE "Danish"
!insertmacro MUI_LANGUAGE "NORWEGIAN"
!insertmacro MUI_LANGUAGE "Romanian"
;--------------------------------
;Reserve Files
;If you are using solid compression, files that are required before
;the actual installation should be stored first in the data block,
;because this will make your installer start faster.
!insertmacro MUI_RESERVEFILE_LANGDLL
Function LaunchLink
ExecShell "" "$INSTDIR\SABnzbd.exe"
FunctionEnd
;--------------------------------
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
;make sure sabnzbd.exe isnt running..if so abort
loop:
StrCpy $0 "SABnzbd.exe"
KillProc::FindProcesses
StrCmp $0 "0" endcheck
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgCloseSab) IDOK loop IDCANCEL exitinstall
exitinstall:
Abort
endcheck:
FunctionEnd
Section "SABnzbd" SecDummy
SetOutPath "$INSTDIR"
IfFileExists $INSTDIR\sabnzbd.exe 0 endWarnExist
IfFileExists $INSTDIR\locale\nl\LC_MESSAGES\SABnzbd.mo endWarnExist 0
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgOldQueue) IDOK endWarnExist IDCANCEL 0
Abort
endWarnExist:
; add files / whatever that need to be installed here.
File /r "dist\*"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" "" "$INSTDIR"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayName" "SABnzbd ${SAB_VERSION}"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayVersion" '${SAB_VERSION}'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Publisher" 'The SABnzbd Team'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "HelpLink" 'http://forums.sabnzbd.org/'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLInfoAbout" 'http://wiki.sabnzbd.org/'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLUpdateInfo" 'http://sabnzbd.org/'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Comments" 'The automated Usenet download tool'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayIcon" '$INSTDIR\interfaces\Classic\templates\static\images\favicon.ico'
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "EstimatedSize" 18400
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoRepair" -1
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoModify" -1
; write out uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;Create shortcuts
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - SafeMode.lnk" "$INSTDIR\SABnzbd.exe" "--server 127.0.0.1:8080 -b1 --no-login -t Plush"
WriteINIStr "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - Documentation.url" "InternetShortcut" "URL" "http://wiki.sabnzbd.org/"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd ; end of default section
Section /o $(MsgRunAtStart) startup
CreateShortCut "$SMPROGRAMS\Startup\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe" "-b0"
SectionEnd ;
Section $(MsgIcon) desktop
CreateShortCut "$DESKTOP\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
SectionEnd ; end of desktop icon section
Section /o $(MsgAssoc) assoc
${registerExtension} "$INSTDIR\nzb.ico" "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
;${registerExtension} "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
SectionEnd ; end of file association section
; begin uninstall settings/section
UninstallText $(MsgUninstall)
Section "un.$(MsgDelProgram)" Uninstall
;make sure sabnzbd.exe isnt running..if so shut it down
StrCpy $0 "sabnzbd.exe"
DetailPrint "Searching for processes called '$0'"
KillProc::FindProcesses
StrCmp $1 "-1" wooops
DetailPrint "-> Found $0 processes"
StrCmp $0 "0" completed
Sleep 1500
StrCpy $0 "sabnzbd.exe"
DetailPrint "Killing all processes called '$0'"
KillProc::KillProcesses
StrCmp $1 "-1" wooops
DetailPrint "-> Killed $0 processes, failed to kill $1 processes"
Goto completed
wooops:
DetailPrint "-> Error: Something went wrong :-("
Abort
completed:
DetailPrint "Process Killed"
; add delete commands to delete whatever files/registry keys/etc you installed here.
Delete "$INSTDIR\uninstall.exe"
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd"
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd"
; Delete installation files are carefully as possible
; Using just rmdir /r "$instdir" is considered unsafe!
Delete "$INSTDIR\email\email-de.tmpl"
Delete "$INSTDIR\email\email-en.tmpl"
Delete "$INSTDIR\email\email-nl.tmpl"
Delete "$INSTDIR\email\email-fr.tmpl"
Delete "$INSTDIR\email\email-sv.tmpl"
Delete "$INSTDIR\email\email-da.tmpl"
Delete "$INSTDIR\email\email-nb.tmpl"
Delete "$INSTDIR\email\email-ro.tmpl"
Delete "$INSTDIR\email\rss-de.tmpl"
Delete "$INSTDIR\email\rss-en.tmpl"
Delete "$INSTDIR\email\rss-nl.tmpl"
Delete "$INSTDIR\email\rss-fr.tmpl"
Delete "$INSTDIR\email\rss-sv.tmpl"
Delete "$INSTDIR\email\rss-da.tmpl"
Delete "$INSTDIR\email\rss-nb.tmpl"
Delete "$INSTDIR\email\rss-ro.tmpl"
RMDir "$INSTDIR\email"
RMDir /r "$INSTDIR\locale"
RMDir /r "$INSTDIR\interfaces\Classic"
RMDir /r "$INSTDIR\interfaces\Plush"
RMDir /r "$INSTDIR\interfaces\smpl"
RMDir /r "$INSTDIR\interfaces\Mobile"
RMDir /r "$INSTDIR\interfaces\wizard"
RMDir "$INSTDIR\interfaces"
RMDir /r "$INSTDIR\win\par2"
RMDir /r "$INSTDIR\win\unrar"
RMDir /r "$INSTDIR\win\unzip"
RMDir /r "$INSTDIR\win"
Delete "$INSTDIR\licenses\*.txt"
Delete "$INSTDIR\licenses\Python\*.txt"
RMDir "$INSTDIR\licenses\Python"
RMDir "$INSTDIR\licenses"
Delete "$INSTDIR\lib\libeay32.dll"
Delete "$INSTDIR\lib\pywintypes25.dll"
Delete "$INSTDIR\lib\ssleay32.dll"
Delete "$INSTDIR\lib\sabnzbd.zip"
Delete "$INSTDIR\lib\*.pyd"
RMDir /r "$INSTDIR\lib\"
RMDir /r "$INSTDIR\po\email"
RMDir /r "$INSTDIR\po\main"
RMDir /r "$INSTDIR\po\nsis"
RMDIR "$INSTDIR\po"
Delete "$INSTDIR\CHANGELOG.txt"
Delete "$INSTDIR\COPYRIGHT.txt"
Delete "$INSTDIR\email.tmpl"
Delete "$INSTDIR\GPL2.txt"
Delete "$INSTDIR\GPL3.txt"
Delete "$INSTDIR\INSTALL.txt"
Delete "$INSTDIR\ISSUES.txt"
Delete "$INSTDIR\LICENSE.txt"
Delete "$INSTDIR\nzbmatrix.txt"
Delete "$INSTDIR\MSVCR71.dll"
Delete "$INSTDIR\nzb.ico"
Delete "$INSTDIR\PKG-INFO"
Delete "$INSTDIR\python25.dll"
Delete "$INSTDIR\python26.dll"
Delete "$INSTDIR\README.txt"
Delete "$INSTDIR\SABnzbd-console.exe"
Delete "$INSTDIR\SABnzbd.exe"
Delete "$INSTDIR\SABnzbd-helper.exe"
Delete "$INSTDIR\SABnzbd-service.exe"
Delete "$INSTDIR\Sample-PostProc.cmd"
Delete "$INSTDIR\Uninstall.exe"
Delete "$INSTDIR\w9xpopen.exe"
RMDir "$INSTDIR"
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - SafeMode.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - Documentation.url"
RMDir "$SMPROGRAMS\$MUI_TEMP"
Delete "$SMPROGRAMS\Startup\SABnzbd.lnk"
Delete "$DESKTOP\SABnzbd.lnk"
DeleteRegKey HKEY_CURRENT_USER "Software\SABnzbd"
${unregisterExtension} ".nzb" "NZB File"
SectionEnd ; end of uninstall section
Section "un.$(MsgDelSettings)" DelSettings
Delete "$LOCALAPPDATA\sabnzbd\sabnzbd.ini"
RMDir /r "$LOCALAPPDATA\sabnzbd\admin"
SectionEnd
Section "un.$(MsgDelLogs)" DelLogs
RMDir /r "$LOCALAPPDATA\sabnzbd\logs"
SectionEnd
Section "un.$(MsgDelCache)" DelCache
RMDir /r "$LOCALAPPDATA\sabnzbd\cache"
RMDir "$LOCALAPPDATA\sabnzbd"
SectionEnd
; eof
;--------------------------------
;Language strings
; MsgWarnRunning 'Please close "SABnzbd.exe" first'
LangString MsgStartSab ${LANG_ENGLISH} "Start SABnzbd (hidden)"
LangString MsgStartSab ${LANG_DANISH} "Start SABnzbd"
LangString MsgStartSab ${LANG_GERMAN} "SABnzbd starten (unsichtbar)"
LangString MsgStartSab ${LANG_FRENCH} "D<EFBFBD>marrer SABnzbd (cach<63>)"
LangString MsgStartSab ${LANG_NORWEGIAN} "Start SABnzbd (hidden)"
LangString MsgStartSab ${LANG_DUTCH} "Start SABnzbd (verborgen)"
LangString MsgStartSab ${LANG_ROMANIAN} "Porneste SABnzbd (ascuns)"
LangString MsgStartSab ${LANG_SWEDISH} "Starta SABnzbd (dold)"
LangString MsgShowRelNote ${LANG_ENGLISH} "Show Release Notes"
LangString MsgShowRelNote ${LANG_DANISH} "Vis udgivelsesbem<65>rkninger"
LangString MsgShowRelNote ${LANG_GERMAN} "Versionshinweise anzeigen"
LangString MsgShowRelNote ${LANG_FRENCH} "Afficher les notes de version"
LangString MsgShowRelNote ${LANG_NORWEGIAN} "Show Release Notes"
LangString MsgShowRelNote ${LANG_DUTCH} "Toon vrijgave bericht"
LangString MsgShowRelNote ${LANG_ROMANIAN} "Arat<EFBFBD> Notele de Publicare"
LangString MsgShowRelNote ${LANG_SWEDISH} "Visa release noteringar"
LangString MsgSupportUs ${LANG_ENGLISH} "Support the project, Donate!"
LangString MsgSupportUs ${LANG_DANISH} "St<EFBFBD>tte projektet, donere!"
LangString MsgSupportUs ${LANG_GERMAN} "Bitte unterst<73>tzen Sie das Projekt durch eine Spende!"
LangString MsgSupportUs ${LANG_FRENCH} "Supportez le projet, faites un don !"
LangString MsgSupportUs ${LANG_NORWEGIAN} "Support the project, Donate!"
LangString MsgSupportUs ${LANG_DUTCH} "Steun het project, Doneer!"
LangString MsgSupportUs ${LANG_ROMANIAN} "Sustine proiectul, Doneaz<61>!"
LangString MsgSupportUs ${LANG_SWEDISH} "Donera och st<73>d detta projekt!"
LangString MsgCloseSab ${LANG_ENGLISH} "Please close $\"SABnzbd.exe$\" first"
LangString MsgCloseSab ${LANG_DANISH} "Luk 'SABnzbd.exe' f<>rst"
LangString MsgCloseSab ${LANG_GERMAN} "Schliessen Sie bitte zuerst $\"SABnzbd.exe$\"."
LangString MsgCloseSab ${LANG_FRENCH} "Quittez $\"SABnzbd.exe$\" avant l'installation, SVP"
LangString MsgCloseSab ${LANG_NORWEGIAN} "Please close $\"SABnzbd.exe$\" first"
LangString MsgCloseSab ${LANG_DUTCH} "Sluit $\"SABnzbd.exe$\" eerst af"
LangString MsgCloseSab ${LANG_ROMANIAN} "<EFBFBD>nchideti mai <20>nt<6E>i $\"SABnzbd.exe$\""
LangString MsgCloseSab ${LANG_SWEDISH} "Var v<>nlig st<73>ng $\"SABnzbd.exe$\" f<>rst"
LangString MsgOldQueue ${LANG_ENGLISH} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !"
LangString MsgOldQueue ${LANG_DANISH} " >>>> WARNING <<<<$\r$\n$\r$\nVenligst, kontroll<6C>r f<>rst udgivelsesnoter eller g<> til http://wiki.sabnzbd.org/introducing-0-6-0 !"
LangString MsgOldQueue ${LANG_GERMAN} " >>>> WARNUNG <<<<$\r$\n$\r$\nBitte zuerst die Versionsanmerkungen lesen oder $\"http://wiki.sabnzbd.org/introducing-0-6-0 besuchen!$\""
LangString MsgOldQueue ${LANG_FRENCH} " >>>> AVERTISSEMENT<<<<$\r$\n$\r$\nS'il vous pla<6C>t, v<>rifiez d'abord les notes de version ou visiter http://wiki.sabnzbd.org/introducing-0-6-0 !"
LangString MsgOldQueue ${LANG_NORWEGIAN} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !"
LangString MsgOldQueue ${LANG_DUTCH} " >>>> WAARSCHUWING <<<<$\r$\n$\r$\nLees eerst het vrijgave bericht of ga naar $\"http://wiki.sabnzbd.org/introducing-0-6-0 !$\""
LangString MsgOldQueue ${LANG_ROMANIAN} " >>>> ATENTIE <<<<$\r$\n$\r$\nV<6E> rug<75>m, verificati mai <20>nt<6E>i notele de publicare sau mergeti la http://wiki.sabnzbd.org/introducing-0-6-0 !"
LangString MsgOldQueue ${LANG_SWEDISH} " >>>> VARNING <<<<$\r$\n$\r$\nVar v<>nlig och l<>s versions noteringarna eller g<> till http://wiki.sabnzbd.org/introducing-0-6-0 !"
LangString MsgUninstall ${LANG_ENGLISH} "This will uninstall SABnzbd from your system"
LangString MsgUninstall ${LANG_DANISH} "Dette vil afinstallere SABnzbd fra dit system"
LangString MsgUninstall ${LANG_GERMAN} "Dies entfernt SABnzbd von Ihrem System"
LangString MsgUninstall ${LANG_FRENCH} "Ceci d<>sinstallera SABnzbd de votre syst<73>me"
LangString MsgUninstall ${LANG_NORWEGIAN} "This will uninstall SABnzbd from your system"
LangString MsgUninstall ${LANG_DUTCH} "Dit verwijdert SABnzbd van je systeem"
LangString MsgUninstall ${LANG_ROMANIAN} "Acest lucru va dezinstala SABnzbd din sistem"
LangString MsgUninstall ${LANG_SWEDISH} "Detta kommer att avinstallera SABnzbd fr<66>n systemet"
LangString MsgRunAtStart ${LANG_ENGLISH} "Run at startup"
LangString MsgRunAtStart ${LANG_DANISH} "K<EFBFBD>r ved opstart"
LangString MsgRunAtStart ${LANG_GERMAN} "Beim Systemstart ausf<73>hren"
LangString MsgRunAtStart ${LANG_FRENCH} "Lancer au d<>marrage"
LangString MsgRunAtStart ${LANG_NORWEGIAN} "Run at startup"
LangString MsgRunAtStart ${LANG_DUTCH} "Opstarten bij systeem start"
LangString MsgRunAtStart ${LANG_ROMANIAN} "Executare la pornire"
LangString MsgRunAtStart ${LANG_SWEDISH} "K<EFBFBD>r vid uppstart"
LangString MsgIcon ${LANG_ENGLISH} "Desktop Icon"
LangString MsgIcon ${LANG_DANISH} "Skrivebords ikon"
LangString MsgIcon ${LANG_GERMAN} "Desktop-Symbol"
LangString MsgIcon ${LANG_FRENCH} "Ic<EFBFBD>ne sur le Bureau"
LangString MsgIcon ${LANG_NORWEGIAN} "Desktop Icon"
LangString MsgIcon ${LANG_DUTCH} "Pictogram op bureaublad"
LangString MsgIcon ${LANG_ROMANIAN} "Icoan<EFBFBD> Desktop"
LangString MsgIcon ${LANG_SWEDISH} "Skrivbordsikon"
LangString MsgAssoc ${LANG_ENGLISH} "NZB File association"
LangString MsgAssoc ${LANG_DANISH} "NZB filtilknytning"
LangString MsgAssoc ${LANG_GERMAN} "Mit NZB-Dateien verkn<6B>pfen"
LangString MsgAssoc ${LANG_FRENCH} "Association des fichiers NZB"
LangString MsgAssoc ${LANG_NORWEGIAN} "NZB File association"
LangString MsgAssoc ${LANG_DUTCH} "NZB bestanden koppelen aan SABnzbd"
LangString MsgAssoc ${LANG_ROMANIAN} "Asociere cu Fisierele NZB"
LangString MsgAssoc ${LANG_SWEDISH} "NZB Filassosication"
LangString MsgDelProgram ${LANG_ENGLISH} "Delete Program"
LangString MsgDelProgram ${LANG_DANISH} "Slet program"
LangString MsgDelProgram ${LANG_GERMAN} "Programm l<>schen"
LangString MsgDelProgram ${LANG_FRENCH} "Supprimer le programme"
LangString MsgDelProgram ${LANG_NORWEGIAN} "Delete Program"
LangString MsgDelProgram ${LANG_DUTCH} "Verwijder programma"
LangString MsgDelProgram ${LANG_ROMANIAN} "Sterge Program"
LangString MsgDelProgram ${LANG_SWEDISH} "Ta bort programmet"
LangString MsgDelSettings ${LANG_ENGLISH} "Delete Settings"
LangString MsgDelSettings ${LANG_DANISH} "Slet instillinger"
LangString MsgDelSettings ${LANG_GERMAN} "Einstellungen l<>schen"
LangString MsgDelSettings ${LANG_FRENCH} "Supprimer les Param<61>tres"
LangString MsgDelSettings ${LANG_NORWEGIAN} "Delete Settings"
LangString MsgDelSettings ${LANG_DUTCH} "Verwijder instellingen"
LangString MsgDelSettings ${LANG_ROMANIAN} "Stergeti Set<65>ri"
LangString MsgDelSettings ${LANG_SWEDISH} "Ta bort inst<73>llningar"
LangString MsgDelLogs ${LANG_ENGLISH} "Delete Logs"
LangString MsgDelLogs ${LANG_DANISH} "Slet logs"
LangString MsgDelLogs ${LANG_GERMAN} "Protokoll l<>schen"
LangString MsgDelLogs ${LANG_FRENCH} "Supprimer les logs"
LangString MsgDelLogs ${LANG_NORWEGIAN} "Delete Logs"
LangString MsgDelLogs ${LANG_DUTCH} "Verwijder logging"
LangString MsgDelLogs ${LANG_ROMANIAN} "Stergeti Activitate"
LangString MsgDelLogs ${LANG_SWEDISH} "Ta bort logg"
LangString MsgDelCache ${LANG_ENGLISH} "Delete Cache"
LangString MsgDelCache ${LANG_DANISH} "Slet hukommelse"
LangString MsgDelCache ${LANG_GERMAN} "Cache l<>schen"
LangString MsgDelCache ${LANG_FRENCH} "Supprimer le Cache"
LangString MsgDelCache ${LANG_NORWEGIAN} "Delete Cache"
LangString MsgDelCache ${LANG_DUTCH} "Verwijder Cache"
LangString MsgDelCache ${LANG_ROMANIAN} "Stergeti Cache"
LangString MsgDelCache ${LANG_SWEDISH} "Ta bort tempor<6F>r-mapp"
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
; -*- coding: latin-1 -*-
;
; Copyright 2008-2012 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
; as published by the Free Software Foundation; either version 2
; of the License, or (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
!addplugindir win\nsis\Plugins
!addincludedir win\nsis\Include
!include "MUI2.nsh"
!include "registerExtension.nsh"
!include "LogicLib.nsh"
!include "WinVer.nsh"
!include "WinSxSQuery.nsh"
;------------------------------------------------------------------
;
; Marco for removing existing and the current installation
; It share buy the installer and the uninstaller.
; Make sure it covers 0.5.x, 0.6.x and 0.7.x in one go.
;
!define RemovePrev "!insertmacro RemovePrev"
!macro RemovePrev idir
Delete "${idir}\email\email-de.tmpl"
Delete "${idir}\email\email-en.tmpl"
Delete "${idir}\email\email-nl.tmpl"
Delete "${idir}\email\email-fr.tmpl"
Delete "${idir}\email\email-sv.tmpl"
Delete "${idir}\email\email-da.tmpl"
Delete "${idir}\email\email-nb.tmpl"
Delete "${idir}\email\email-pl.tmpl"
Delete "${idir}\email\email-ro.tmpl"
Delete "${idir}\email\email-sr.tmpl"
Delete "${idir}\email\email-es.tmpl"
Delete "${idir}\email\email-pt_BR.tmpl"
Delete "${idir}\email\email-sr.tmpl"
Delete "${idir}\email\email-ru.tmpl"
Delete "${idir}\email\rss-de.tmpl"
Delete "${idir}\email\rss-en.tmpl"
Delete "${idir}\email\rss-nl.tmpl"
Delete "${idir}\email\rss-pl.tmpl"
Delete "${idir}\email\rss-fr.tmpl"
Delete "${idir}\email\rss-sv.tmpl"
Delete "${idir}\email\rss-da.tmpl"
Delete "${idir}\email\rss-nb.tmpl"
Delete "${idir}\email\rss-ro.tmpl"
Delete "${idir}\email\rss-sr.tmpl"
Delete "${idir}\email\rss-es.tmpl"
Delete "${idir}\email\rss-pt_BR.tmpl"
Delete "${idir}\email\rss-sr.tmpl"
Delete "${idir}\email\rss-ru.tmpl"
Delete "${idir}\email\badfetch-da.tmpl"
Delete "${idir}\email\badfetch-de.tmpl"
Delete "${idir}\email\badfetch-en.tmpl"
Delete "${idir}\email\badfetch-fr.tmpl"
Delete "${idir}\email\badfetch-nb.tmpl"
Delete "${idir}\email\badfetch-nl.tmpl"
Delete "${idir}\email\badfetch-pl.tmpl"
Delete "${idir}\email\badfetch-ro.tmpl"
Delete "${idir}\email\badfetch-sr.tmpl"
Delete "${idir}\email\badfetch-sv.tmpl"
Delete "${idir}\email\badfetch-sr.tmpl"
Delete "${idir}\email\badfetch-es.tmpl"
Delete "${idir}\email\badfetch-pt_BR.tmpl"
Delete "${idir}\email\badfetch-ru.tmpl"
RMDir "${idir}\email"
RMDir /r "${idir}\locale"
RMDir /r "${idir}\interfaces\Classic"
RMDir /r "${idir}\interfaces\Plush"
RMDir /r "${idir}\interfaces\smpl"
RMDir /r "${idir}\interfaces\Mobile"
RMDir /r "${idir}\interfaces\wizard"
RMDir /r "${idir}\interfaces\Config"
RMDir "${idir}\interfaces"
RMDir /r "${idir}\win\par2"
RMDir /r "${idir}\win\unrar"
RMDir /r "${idir}\win\unzip"
RMDir /r "${idir}\win"
RMDir /r "${idir}\licenses"
RMDir /r "${idir}\lib\"
RMDir /r "${idir}\po\email"
RMDir /r "${idir}\po\main"
RMDir /r "${idir}\po\nsis"
RMDir "${idir}\po"
RMDir /r "${idir}\icons"
Delete "${idir}\CHANGELOG.txt"
Delete "${idir}\COPYRIGHT.txt"
Delete "${idir}\email.tmpl"
Delete "${idir}\GPL2.txt"
Delete "${idir}\GPL3.txt"
Delete "${idir}\INSTALL.txt"
Delete "${idir}\ISSUES.txt"
Delete "${idir}\LICENSE.txt"
Delete "${idir}\nzbmatrix.txt"
Delete "${idir}\MSVCR71.dll"
Delete "${idir}\nzb.ico"
Delete "${idir}\sabnzbd.ico"
Delete "${idir}\PKG-INFO"
Delete "${idir}\python25.dll"
Delete "${idir}\python26.dll"
Delete "${idir}\python27.dll"
Delete "${idir}\README.txt"
Delete "${idir}\README.rtf"
Delete "${idir}\ABOUT.txt"
Delete "${idir}\IMPORTANT_MESSAGE.txt"
Delete "${idir}\SABnzbd-console.exe"
Delete "${idir}\SABnzbd.exe"
Delete "${idir}\SABnzbd.exe.log"
Delete "${idir}\SABnzbd-helper.exe"
Delete "${idir}\SABnzbd-service.exe"
Delete "${idir}\Sample-PostProc.cmd"
Delete "${idir}\Uninstall.exe"
Delete "${idir}\w9xpopen.exe"
RMDir "${idir}"
!macroend
;------------------------------------------------------------------
; Define names of the product
Name "${SAB_PRODUCT}"
OutFile "${SAB_FILE}"
InstallDir "$PROGRAMFILES\SABnzbd"
InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
;DirText $(MsgSelectDir)
;------------------------------------------------------------------
; Some default compiler settings (uncomment and change at will):
SetCompress auto ; (can be off or force)
SetDatablockOptimize on ; (can be off)
CRCCheck on ; (can be off)
AutoCloseWindow false ; (can be true for the window go away automatically at end)
ShowInstDetails hide ; (can be show to have them shown, or nevershow to disable)
SetDateSave off ; (can be on to have files restored to their orginal date)
WindowIcon on
;------------------------------------------------------------------
; Vista/Win7 redirects $SMPROGRAMS to all users without this
RequestExecutionLevel admin
FileErrorText "If you have no admin rights, try to install into a user directory."
;------------------------------------------------------------------
;Variables
Var MUI_TEMP
Var STARTMENU_FOLDER
;------------------------------------------------------------------
;Interface Settings
!define MUI_ABORTWARNING
;Show all languages, despite user's codepage
!define MUI_LANGDLL_ALLLANGUAGES
!define MUI_ICON "interfaces/Classic/templates/static/images/favicon.ico"
;--------------------------------
;Pages
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
!define MUI_COMPONENTSPAGE_NODESC
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
;Start Menu Folder Page Configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\SABnzbd"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "SABnzbd"
;Remember the installer language
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
!define MUI_LANGDLL_REGISTRY_KEY "Software\SABnzbd"
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
!define MUI_FINISHPAGE_RUN_TEXT $(MsgGoWiki)
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\README.txt"
!define MUI_FINISHPAGE_SHOWREADME_TEXT $(MsgShowRelNote)
!define MUI_FINISHPAGE_LINK $(MsgSupportUs)
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.sabnzbd.org/contribute/"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!define MUI_UNPAGE_COMPONENTSPAGE_NODESC
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
;------------------------------------------------------------------
; Set supported languages
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German"
!insertmacro MUI_LANGUAGE "Dutch"
!insertmacro MUI_LANGUAGE "Polish"
!insertmacro MUI_LANGUAGE "Swedish"
!insertmacro MUI_LANGUAGE "Danish"
!insertmacro MUI_LANGUAGE "NORWEGIAN"
!insertmacro MUI_LANGUAGE "Romanian"
!insertmacro MUI_LANGUAGE "Spanish"
!insertmacro MUI_LANGUAGE "PortugueseBR"
;------------------------------------------------------------------
;Reserve Files
;If you are using solid compression, files that are required before
;the actual installation should be stored first in the data block,
;because this will make your installer start faster.
!insertmacro MUI_RESERVEFILE_LANGDLL
;------------------------------------------------------------------
Function LaunchLink
ExecShell "" "http://wiki.sabnzbd.org/"
FunctionEnd
;------------------------------------------------------------------
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
;--------------------------------
;make sure that the requires MS Runtimes are installed
;
runtime_loop:
push 'msvcr90.dll'
push 'Microsoft.VC90.CRT,version="9.0.21022.8",type="win32",processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b"'
call WinSxS_HasAssembly
pop $0
StrCmp $0 "1" nodownload
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgNoRuntime) /SD IDOK IDOK download IDCANCEL noinstall
download:
inetc::get /BANNER $(MsgDLRuntime) \
"http://download.microsoft.com/download/1/1/1/1116b75a-9ec3-481a-a3c8-1777b5381140/vcredist_x86.exe" \
"$TEMP\vcredist_x86.exe"
Pop $0
DetailPrint "Downloaded MS runtime library"
StrCmp $0 "OK" dlok
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgDLError) /SD IDCANCEL IDCANCEL exitinstall IDOK download
dlok:
ExecWait "$TEMP\vcredist_x86.exe" $1
DetailPrint "VCRESULT=$1"
DetailPrint "Tried to install MS runtime library"
delete "$TEMP\vcredist_x86.exe"
StrCmp $1 "0" nodownload
noinstall:
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgDLNeed) /SD IDOK IDOK runtime_loop IDCANCEL exitinstall
Abort
nodownload:
;------------------------------------------------------------------
;make sure user terminates sabnzbd.exe or else abort
;
loop:
StrCpy $0 "SABnzbd.exe"
KillProc::FindProcesses
StrCmp $0 "0" endcheck
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgCloseSab) /SD IDCANCEL IDOK loop IDCANCEL exitinstall
exitinstall:
Abort
endcheck:
FunctionEnd
;------------------------------------------------------------------
; SECTION main program
;
Section "SABnzbd" SecDummy
SetOutPath "$INSTDIR"
;------------------------------------------------------------------
; Make sure old versions are gone
IfFileExists $INSTDIR\sabnzbd.exe 0 endWarnExist
IfFileExists $INSTDIR\python25.dll 0 endWarnExist
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(MsgRemoveOld)$\n$\n$(MsgRemoveOld2)" IDOK uninst
Abort
uninst:
${RemovePrev} "$INSTDIR"
endWarnExist:
; add files / whatever that need to be installed here.
File /r "dist\*"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" "" "$INSTDIR"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayName" "SABnzbd ${SAB_VERSION}"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayVersion" '${SAB_VERSION}'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Publisher" 'The SABnzbd Team'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "HelpLink" 'http://forums.sabnzbd.org/'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLInfoAbout" 'http://wiki.sabnzbd.org/'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLUpdateInfo" 'http://sabnzbd.org/'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Comments" 'The automated Usenet download tool'
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayIcon" '$INSTDIR\interfaces\Classic\templates\static\images\favicon.ico'
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "EstimatedSize" 18400
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoRepair" -1
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoModify" -1
; write out uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;Create shortcuts
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - SafeMode.lnk" "$INSTDIR\SABnzbd.exe" "--server 127.0.0.1:8080 -b1 --no-login -t Plush"
WriteINIStr "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - Documentation.url" "InternetShortcut" "URL" "http://wiki.sabnzbd.org/"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd ; end of default section
Section /o $(MsgRunAtStart) startup
CreateShortCut "$SMPROGRAMS\Startup\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe" "-b0"
SectionEnd ;
Section $(MsgIcon) desktop
CreateShortCut "$DESKTOP\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
SectionEnd ; end of desktop icon section
Section /o $(MsgAssoc) assoc
${registerExtension} "$INSTDIR\nzb.ico" "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
;${registerExtension} "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
SectionEnd ; end of file association section
; begin uninstall settings/section
UninstallText $(MsgUninstall)
Section "un.$(MsgDelProgram)" Uninstall
;make sure sabnzbd.exe isnt running..if so shut it down
StrCpy $0 "sabnzbd.exe"
DetailPrint "Searching for processes called '$0'"
KillProc::FindProcesses
StrCmp $1 "-1" wooops
DetailPrint "-> Found $0 processes"
StrCmp $0 "0" completed
Sleep 1500
StrCpy $0 "sabnzbd.exe"
DetailPrint "Killing all processes called '$0'"
KillProc::KillProcesses
StrCmp $1 "-1" wooops
DetailPrint "-> Killed $0 processes, failed to kill $1 processes"
Goto completed
wooops:
DetailPrint "-> Error: Something went wrong :-("
Abort
completed:
DetailPrint "Process Killed"
; add delete commands to delete whatever files/registry keys/etc you installed here.
Delete "$INSTDIR\uninstall.exe"
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd"
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd"
${RemovePrev} "$INSTDIR"
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - SafeMode.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - Documentation.url"
RMDir "$SMPROGRAMS\$MUI_TEMP"
Delete "$SMPROGRAMS\Startup\SABnzbd.lnk"
Delete "$DESKTOP\SABnzbd.lnk"
DeleteRegKey HKEY_CURRENT_USER "Software\SABnzbd"
${unregisterExtension} ".nzb" "NZB File"
SectionEnd ; end of uninstall section
Section "un.$(MsgDelSettings)" DelSettings
DetailPrint "Uninstall settings $LOCALAPPDATA"
Delete "$LOCALAPPDATA\sabnzbd\sabnzbd.ini"
RMDir /r "$LOCALAPPDATA\sabnzbd"
SectionEnd
; eof
;--------------------------------
;Language strings
LangString MsgGoWiki ${LANG_ENGLISH} "Go to the SABnzbd Wiki"
LangString MsgShowRelNote ${LANG_ENGLISH} "Show Release Notes"
LangString MsgSupportUs ${LANG_ENGLISH} "Support the project, Donate!"
LangString MsgCloseSab ${LANG_ENGLISH} "Please close $\"SABnzbd.exe$\" first"
LangString MsgOldQueue ${LANG_ENGLISH} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !"
LangString MsgUninstall ${LANG_ENGLISH} "This will uninstall SABnzbd from your system"
LangString MsgRunAtStart ${LANG_ENGLISH} "Run at startup"
LangString MsgIcon ${LANG_ENGLISH} "Desktop Icon"
LangString MsgAssoc ${LANG_ENGLISH} "NZB File association"
LangString MsgDelProgram ${LANG_ENGLISH} "Delete Program"
LangString MsgDelSettings ${LANG_ENGLISH} "Delete Settings"
LangString MsgNoRuntime ${LANG_ENGLISH} "This system requires the Microsoft runtime library VC90 to be installed first. Do you want to do that now?"
LangString MsgDLRuntime ${LANG_ENGLISH} "Downloading Microsoft runtime installer..."
LangString MsgDLError ${LANG_ENGLISH} "Download error, retry?"
LangString MsgDLNeed ${LANG_ENGLISH} "Cannot install without runtime library, retry?"
LangString MsgRemoveOld ${LANG_ENGLISH} "You cannot overwrite an existing installation. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
LangString MsgRemoveOld2 ${LANG_ENGLISH} "Your settings and data will be preserved."
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd

View File

@@ -1,7 +1,7 @@
Metadata-Version: 1.0
Name: SABnzbd
Version: 0.6.7
Summary: SABnzbd-0.6.7
Version: 0.7.0RC2
Summary: SABnzbd-0.7.0RC2
Home-page: http://sourceforge.net/projects/sabnzbdplus
Author: The SABnzbd Team
Author-email: team@sabnzbd.org

54
README.md Normal file
View 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.

View File

@@ -1,22 +1,35 @@
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf320
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw11900\paperh16840\vieww16360\viewh15680\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\f0\b\fs48 \cf0 SABnzbd 0.6.7\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
\f0\b\fs48 \cf0 SABnzbd 0.7.0RC2\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
\b0\fs26 \cf0 \
\b What's new
\b0 \
- Prevent immediate exit after startup when queue is empty and an end-of-queue action like "shutdown" was set\
- Fix failure to launch browser when clicking shortcut the second time\
- Allow jobs still waiting for post-processing to be deleted\
- Plush: button "Purge failed NZBs & delete files" will now actually delete files\
- Classic/smpl: add link "Purge failed NZBs & delete files"\
- Plush: fix flashing top menu in Safari 5.1\
- 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\
- More persistent retries for unreliable indexers\
- Single Configuration skin for all others skins (there is an option for the old style)\
- Config->Special for settings that were previously only changeable in the sabnzbd.ini file\
- Add Spanish, Portuguese (Brazil) and Polish translations\
- Individual RSS filter toggle\
- Unified OSX DMG\
\
For problems fixed in the various Betas, see CHANGELOG.txt\
\
\b About
@@ -28,19 +41,21 @@ 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/}}\
\
\b IMPORTANT INFORMATION
\b0 about release 0.6.0:\
{\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/introducing-0-6-0"}}{\fldrslt http://wiki.sabnzbd.org/introducing-0-6-0}}\
\b0 about release 0.7.0:\
{\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/introducing-0-7-0"}}{\fldrslt http://wiki.sabnzbd.org/introducing-0-7-0}}\
\
\b Known problems and solutions\
\b0 Read the file"ISSUES.txt"
\b0 Read the file "ISSUES.txt"
\b \
\b0 \
@@ -81,10 +96,4 @@ from the older version of SABnzbd, you can either re-import the nzb files if you
an nzb backup folder, or temporarily go back to 0.4.x until your queue is complete.\
The history is now stored in a better format meaning future upgrades should be backwards\
compatible.\
\
\
\b\fs40 Changes since 0.5.6
\b0\fs26 \
See: {\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/introducing-0-6-0"}}{\fldrslt http://wiki.sabnzbd.org/introducing-0-6-0}}\
}

View File

@@ -1,13 +1,27 @@
************************ SABnzbd 0.6.7 ************************
************************ SABnzbd 0.7.0RC2 ************************
What's new:
- Prevent immediate exit after startup when queue is empty and
an end-of-queue action like "shutdown" was set
- Fix failure to launch browser when clicking shortcut the second time
- Allow jobs still waiting for post-processing to be deleted
- Plush: button "Purge failed NZBs & delete files" will now actually delete files
- Classic/smpl: add link "Purge failed NZBs & delete files"
- Plush: fix flashing top menu in Safari 5.1
- 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
- More persistent retries for unreliable indexers
- Single Configuration skin for all others skins (there is an option for the old style)
- Config->Special for settings that were previously only changeable in the sabnzbd.ini file
- Add Spanish, Portuguese (Brazil) and Polish translations
- Individual RSS filter toggle
- Unified OSX DMG
For problems fixed in the various Betas, see CHANGELOG.txt
About:
SABnzbd is an open-source cross-platform binary newsreader.
@@ -16,4 +30,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>

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2008-2011 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2008-2012 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

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2008-2011 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2008-2012 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
@@ -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,13 +251,14 @@ 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():
print """
%s-%s
Copyright (C) 2008-2011, The SABnzbd-Team <team@sabnzbd.org>
Copyright (C) 2008-2012, The SABnzbd-Team <team@sabnzbd.org>
SABnzbd comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. It is licensed under the
@@ -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,11 +499,57 @@ 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 ipv_localhost(v):
""" Return True if localhost resolves to some IPV4 ('4') or IPV6 ('6') address
"""
try:
info = socket.getaddrinfo('localhost', None)
except:
# localhost does not resolve
return False
for item in info:
item = item[4][0]
if v == '4' and ':' not in item:
return True
elif v == '6' and ':' in item:
return True
return False
#------------------------------------------------------------------------------
def get_webhost(cherryhost, cherryport, https_port):
""" Determine the webhost address and port,
return (host, port, browserhost)
"""
if cherryhost == '0.0.0.0' and not ipv_localhost('4'):
cherryhost = ''
elif cherryhost == '::' and not ipv_localhost('6'):
cherryhost = ''
if cherryhost is None:
cherryhost = sabnzbd.cfg.cherryhost()
else:
@@ -604,7 +658,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 +667,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.
"""
@@ -773,7 +839,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=',
@@ -847,6 +913,7 @@ def main():
pid_path = None
new_instance = False
force_sessions = False
osx_console = False
service, sab_opts, serv_opts, upload_nzbs = commandline_handler()
@@ -895,8 +962,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'):
@@ -928,7 +995,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)
@@ -946,11 +1017,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)
@@ -967,6 +1038,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)
@@ -1133,7 +1206,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:"
@@ -1161,7 +1234,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:
@@ -1180,7 +1253,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:
@@ -1223,12 +1295,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)
@@ -1242,6 +1316,10 @@ def main():
# Save the INI file
config.save_config(force=True)
if sabnzbd.WIN32 and sabnzbd.cfg.win_menu() and not sabnzbd.DAEMON:
import sabnzbd.sabtray
sabnzbd.WINTRAY = sabnzbd.sabtray.SABTrayThread()
print_modules()
cherrylogtoscreen = False
@@ -1272,18 +1350,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('')
@@ -1306,17 +1404,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},
@@ -1331,6 +1433,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')}
@@ -1341,8 +1446,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
@@ -1377,9 +1485,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:
@@ -1387,12 +1495,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:
@@ -1449,7 +1557,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)
@@ -1515,6 +1623,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:
@@ -1527,8 +1638,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)
@@ -1651,7 +1761,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")):

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

22
email/badfetch-en.tmpl Normal file
View 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
View 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
View 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

BIN
icons/nzb.ico Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
icons/sabnzbd.ico Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
icons/sabnzbd16.ico Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
icons/sabnzbd16green.ico Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
icons/sabnzbd16paused.ico Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,5 +1,5 @@
#
# Copyright 2008-2011 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2008-2012 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

View File

@@ -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=""#-->

View File

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

View File

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

View File

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

View File

@@ -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>&nbsp;
<a href="https://$newzbin_url/browse/post/$msgid/" target="_blank">$msgid</a>&nbsp;
<!--#end for#-->
</fieldset>
<!--#end if#-->

View File

@@ -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')">&nbsp;&nbsp;
<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#-->

View File

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

View File

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

View File

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

View File

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

View File

@@ -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_art_opt" value="1" <!--#if $max_art_opt > 0 then "checked=1" else ""#--> /> <strong>$T('opt-max_art_opt')</strong></label><br>
$T('explain-max_art_opt')<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>

View File

@@ -9,14 +9,17 @@
<br>
<!--#if int($cache_max)#-->
<!--#set $msg=$T('ft-buffer@2')%($cache_art, $cache_size)#-->
$msg<br>
$msg&nbsp;&nbsp;
<!--#end if#-->
<!--#if $have_quota#-->
| &nbsp;&nbsp;<strong>$T('quota-left'):</strong>&nbsp;&nbsp;$left_quota&nbsp;&frasl;&nbsp;$quota</strong>&nbsp;&nbsp;&nbsp;
<!--#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)))#-->

View File

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

View File

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

View File

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

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,11 +1,14 @@
<!--#set global $have_refresh=5#-->
<!--#set global $topmenu="connections"#-->
<!--#set global $topmenu="status"#-->
<!--#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'):

View File

@@ -0,0 +1,54 @@
uniConfig for SABnzbd 0.7.x
zoggy@sabnzbd.org
========================================================
LIBRARIES USED
jQuery
* Project repository: https://github.com/jquery/jquery
* Dual licensed under the MIT and GPL licenses:
* http://www.gnu.org/licenses/gpl.html
* http://www.opensource.org/licenses/mit-license.php
jQuery UI
* Project repository: https://github.com/jquery/jquery-ui
* Dual licensed under the MIT and GPL licenses:
* http://www.gnu.org/licenses/gpl.html
* http://www.opensource.org/licenses/mit-license.php
jQuery Form Plugin
* Project repository: https://github.com/malsup/form
* Dual licensed under the MIT and GPL licenses:
* http://www.gnu.org/licenses/gpl.html
* http://www.opensource.org/licenses/mit-license.php
jQuery Tools (tabs)
* Project repository: https://github.com/jquerytools/jquerytools
Formalize
* Project repository: https://github.com/nathansmith/formalize
* Dual licensed under the MIT and GPL licenses:
* http://www.gnu.org/licenses/gpl.html
* http://www.opensource.org/licenses/mit-license.php
normalize.css
* Project repository: https://github.com/necolas/normalize.css
* Licensed under public domain
qTip2
* Project repository: https://github.com/craga89/qtip2
* Dual licensed under the MIT and GPL licenses:
* http://www.gnu.org/licenses/gpl.html
* http://www.opensource.org/licenses/mit-license.php
========================================================
IMAGES USED
/images/loading-*.gif
- source: http://www.AjaxLoad.info
/images/flags/*
- source: http://www.famfamfam.com/lab/icons/flags/

View File

@@ -0,0 +1,14 @@
<!-- Content end -->
</div>
<script>
function is_touch_device() {
return !!('ontouchstart' in window) ? 1 : 0;
}
if (is_touch_device() === 1) {
// touch device found
\$('#content').css('overflow-y', 'inherit');
\$('html').css('overflow-y', 'scroll');
}
</script>
</body>
</html>

View File

@@ -0,0 +1,152 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>SABnzbd $version - $T('queued'): $mbleft $T('MB')</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="noindex">
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
#if $pane == "Config"#
#set global $root = '../'#
#else#
#set global $root = '../../'#
#end if#
<link rel="shortcut icon" href="${root}staticcfg/ico/favicon.ico">
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="${root}staticcfg/ico/apple-touch-icon-144x144-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="${root}staticcfg/ico/apple-touch-icon-114x114-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="${root}staticcfg/ico/apple-touch-icon-72x72-precomposed.png">
<link rel="apple-touch-icon-precomposed" href="${root}staticcfg/ico/apple-touch-icon-57x57-precomposed.png">
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/style.css" />
<script src="${root}staticcfg/js/script.js"></script>
<script type="text/javascript">
\$.Browser = {
defaults: {
title: 'Choose Directory',
url: '${root}api?mode=browse&output=json&apikey=$session',
autocompleteURL: '${root}api?mode=browse&output=json&compact=1&apikey=$session'
}
};
var config_pane = "$pane";
var help_uri = "$help_uri";
var apikey = "$session";
var confirmWithoutSavingPrompt = "$T('Plush-confirmWithoutSavingPrompt')";
function config_success() {
\$('.saveButton').each(function () {
\$(this).removeAttr("disabled").attr("value", "$T('button-saveChanges')");
});
}
function config_failure() {
\$('.saveButton').each(function () {
\$(this).removeAttr("disabled").attr("value", "$T('smpl-failed')");
});
}
\$(document).ready(function () {
\$('.col2 H3').click(function () { \$(this).parent().next().toggle() });
\$('.sabnzbd_restart').click(function () {
\$('.sabnzbd_restart').each(function () {
\$(this).attr("disabled", "disabled");
});
var msg = "$T('explain-Restart')";
if (confirm(msg.replace(/\<br(\s*\/|)\>/g, '\n'))) {
\$(this).attr("value", "$T('wizard-restarting')");
location.href = '${root}config/restart?session=$session';
}
\$('.sabnzbd_restart').each(function () {
\$(this).removeAttr("disabled");
});
return false;
});
\$('#fullform').ajaxForm({
beforeSubmit: function () {
\$('.saveButton').each(function () {
\$(this).attr("disabled", "disabled").attr("value", "$T('smpl-saving')");
});
},
success: function () {
setTimeout(config_success, 1000);
},
error: function () {
setTimeout(config_failure, 1000);
},
timeout: 3000
});
\$("#sidebar-trigger").click(function () {
if (\$("#sidebar-trigger").hasClass("trigger-left")) {
\$("#sidebar").animate({marginLeft: "-150px", queue: false}, 250);
\$("#sidebar-pane").animate({marginLeft: "-150px", queue: false}, 250);
\$("#content").animate({left: "6px", queue: false}, 250);
\$("#sidebar-trigger").removeClass("trigger-left").addClass("trigger-right");
} else {
\$("#sidebar").animate({marginLeft: "0px", queue: false}, 250);
\$("#sidebar-pane").animate({marginLeft: "0px", queue: false}, 250);
\$("#content").animate({left: "156px", queue: false}, 250);
\$("#sidebar-trigger").removeClass("trigger-right").addClass("trigger-left");
}
});
});
</script>
</head>
<body class="$pane">
<div id="sidebar">
<a href="${root}"><img src="${root}staticcfg/images/logo.png" width="120" height="45" id="logo" alt="[home]" /></a>
<div id="tab-container">
<a href="${root}config/">
<div #if $pane == "Config" then 'class="active"' else ""#>$T('menu-config')</div>
</a>
<a href="${root}config/general/">
<div #if $pane == "General" then 'class="active"' else ""#>$T('cmenu-general')</div>
</a>
<a href="${root}config/folders/">
<div #if $pane == "Folders" then 'class="active"' else ""#>$T('cmenu-folders')</div>
</a>
<a href="${root}config/switches/">
<div #if $pane == "Switches" then 'class="active"' else ""#>$T('cmenu-switches')</div>
</a>
<a href="${root}config/server/">
<div #if $pane == "Servers" then 'class="active"' else ""#>$T('cmenu-servers')</div>
</a>
<a href="${root}config/scheduling/">
<div #if $pane == "Scheduling" then 'class="active"' else ""#>$T('Plush-cmenu-scheduling')</div>
</a>
<a href="${root}config/notify/">
<div #if $pane == "Email" then 'class="active"' else ""#>$T('cmenu-notif')</div>
</a>
<a href="${root}config/indexers/">
<div #if $pane == "Index Sites" then 'class="active"' else ""#>$T('cmenu-newzbin')</div>
</a>
<a href="${root}config/categories/">
<div #if $pane == "Categories" then 'class="active"' else ""#>$T('cmenu-cat')</div>
</a>
<a href="${root}config/sorting/">
<div #if $pane == "Sorting" then 'class="active"' else ""#>$T('cmenu-sorting')</div>
</a>
<a href="${root}config/special/">
<div #if $pane == "Special" then 'class="active"' else ""#>$T('cmenu-special')</div>
</a>
<a href="${root}config/rss/">
<div #if $pane == "RSS" then 'class="active"' else ""#>$T('cmenu-rss')</div>
</a>
<br/>
<a href="$helpuri$help_uri" target="_blank">
<div>$T('menu-help')</div>
</a>
</div>
</div>
<div id="sidebar-pane"><div id="sidebar-trigger" class="trigger-left"></div></div>
<div id="content">
<!-- Content start -->

View File

@@ -0,0 +1,29 @@
<!--#set global $pane="Config"#-->
<!--#set global $help_uri="configure-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="section padTable">
<table id="infoTable">
<tbody>
<tr class="alt"><td class="infoTableHeader">$T('version'): </td><td class="infoTableCell">$version</td></tr>
<tr><td class="infoTableHeader">$T('uptime'): </td><td class="infoTableCell">$uptime</td></tr>
<tr class="alt"><td class="infoTableHeader">$T('confgFile'): </td><td class="infoTableCell">$configfn</td></tr>
<tr><td class="infoTableHeader">$T('cache').capitalize(): </td><td class="infoTableCell"><!--#set $msg=$T('ft-buffer@2')%($cache_art, $cache_size)#-->$msg</td></tr>
<tr class="alt"><td class="infoTableHeader">$T('parameters'): </td><td class="infoTableCell">$cmdline</td></tr>
<tr><td class="infoTableHeader">$T('pythonVersion'): </td><td class="infoTableCell">$sys.version[:120]</td></tr>
<tr class="infoTableSeperator alt"><td class="infoTableHeader">$T('homePage') </td><td class="infoTableCell"><a href="http://sabnzbd.org/" target="_blank">http://sabnzbd.org/</a></td></tr>
<tr><td class="infoTableHeader">$T('menu-wiki') </td><td class="infoTableCell"><a href="http://wiki.sabnzbd.org/faq" target="_blank">http://wiki.sabnzbd.org/faq</a></td></tr>
<tr class="alt"><td class="infoTableHeader">$T('menu-forums') </td><td class="infoTableCell"><a href="http://forums.sabnzbd.org/" target="_blank">http://forums.sabnzbd.org/</a></td></tr>
<tr><td class="infoTableHeader">$T('source') </td><td class="infoTableCell"><a href="https://github.com/sabnzbd/sabnzbd" target="_blank">https://github.com/sabnzbd/sabnzbd</a></td></tr>
<tr class="alt"><td class="infoTableHeader">$T('menu-irc') </td><td class="infoTableCell"><a href="irc://irc.synirc.net/#sabnzbd"><i>#sabnzbd</i> on <i>irc.synirc.net</i></a> $T('or') (<a href="http://sabnzbd.org/live-chat/" target="_blank">webchat</a>)</td></tr>
</tbody>
</table>
</div>
<div class="padding alt">
<h5 class="copyright">Copyright &copy; 2008-2012 The SABnzbd Team &lt;<span style="color: #0000ff;">team@sabnzbd.org</span>&gt;</h5>
<p class="copyright"><small>$T('yourRights')</small></p>
</div>
</div>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,115 @@
<!--#set global $pane="Categories"#-->
<!--#set global $help_uri="configure-categories-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="section">
<div class="padTable">
<p>
$T('explain-catTags') $T('explain-catTags2')<br/>
</p>
<div class="field-pair">
<h5 class="darkred nomargin">$T('explain-relFolder'): <span class="path">$defdir</span></h5>
</div>
<!--#set $odd = False#-->
<!--#set $cur = 0#-->
<!--#for $slot in $slotinfo#-->
<!--#set $odd = not $odd#-->
<!--#set $cur = $cur+1#-->
<form action="save" method="get">
<table class="catTable">
<!--#if $cur == 1#-->
<tr>
<th>$T('category')</th>
<th>$T('priority')</th>
<th>$T('mode')</th>
<!--#if $script_list#--><th>$T('script')</th><!--#end if#-->
<th>$T('catFolderPath')</th>
<th>$T('catTags')</th>
<th>&nbsp;</th>
</tr>
<!--#end if#-->
<tr class="<!--#if $odd then "alt" else ""#-->" <!--#if $slot.name == '*'#-->style="background-color: #FFFFE0;"<!--#end if#-->>
<td>
<input type="hidden" name="session" value="$session" />
<input type="hidden" value="$slot.name" name="name" />
<!--#if $slot.name != '*'#-->
<input type="text" name="newname" value="$slot.name" size="10" />
<!--#else#-->
<input type="text" name="newname" value="$T('default')" disabled="disabled" size="10" />
<!--#end if#-->
</td>
<td>
<select name="priority">
<!--#if $slot.name != '*'#-->
<option value="-100" <!--#if $slot.priority == -100 then 'selected="selected" class="selected"' else ""#-->>$T('default')</option>
<!--#end if#-->
<option value="2" <!--#if $slot.priority == 2 then 'selected="selected" class="selected"' else ""#-->>$T('pr-force')</option>
<option value="1" <!--#if $slot.priority == 1 then 'selected="selected" class="selected"' else ""#-->>$T('pr-high')</option>
<option value="0" <!--#if $slot.priority == 0 then 'selected="selected" class="selected"' else ""#-->>$T('pr-normal')</option>
<option value="-1" <!--#if $slot.priority == -1 then 'selected="selected" class="selected"' else ""#-->>$T('pr-low')</option>
<option value="-2" <!--#if $slot.priority == -2 then 'selected="selected" class="selected"' else ""#-->>$T('pr-paused')</option>
</select>
</td>
<td>
<select name="pp">
<!--#if $slot.name != '*'#-->
<option value="" <!--#if $slot.pp == "" then 'selected="selected" class="selected"' else ""#-->>$T('default')</option>
<!--#end if#-->
<option value="0" <!--#if $slot.pp == "0" then 'selected="selected" class="selected"' else ""#-->>$T('pp-none')</option>
<option value="1" <!--#if $slot.pp == "1" then 'selected="selected" class="selected"' else ""#-->>$T('pp-repair')</option>
<option value="2" <!--#if $slot.pp == "2" then 'selected="selected" class="selected"' else ""#-->>$T('pp-unpack')</option>
<option value="3" <!--#if $slot.pp == "3" then 'selected="selected" class="selected"' else ""#-->>$T('pp-delete')</option>
</select>
</td>
<!--#if $script_list#-->
<td>
<select name="script">
<!--#for $sc in $script_list#-->
<!--#if not ($sc == 'Default' and $slot.name == '*')#-->
<option value="$sc" <!--#if $slot.script.lower() == $sc.lower() then 'selected="selected" class="selected"' else ""#-->>$Tspec($sc)</option>
<!--#end if#-->
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td><input type="text" name="dir" value="$slot.dir" size="30" /></td>
<td><input type="text" name="newzbin" value="$slot.newzbin" size="30" /></td>
<td class="nowrap">
<input type="submit" class="Save" value="<!--#if $cur == 2 then $T('button-add') else $T('button-save')#-->" />
<!--#if $slot.name and $slot.name != '*'#-->
<input type="button" class="delCat" value="$T('button-x')" />
<!--#end if#-->
</td>
</tr>
</table>
</form>
<!--#end for#-->
</div>
</div>
</div>
<script>
\$(document).ready(function(){
\$('.delCat').click(function(){
var theForm = \$(this).closest("form");
theForm.attr("action", "delete").submit();
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,118 @@
<!--#set global $pane="Folders"#-->
<!--#set global $help_uri="configure-folders-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveDirectories" method="post" name="fullform" id="fullform">
<input type="hidden" id="session" name="session" value="$session" />
<div class="section">
<div class="col2">
<h3>$T('userFolders')</h3>
<p>$T('explain-folderConfig')</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair">
<h5 class="darkred nomargin">$T('base-folder'): <span class="path">$my_home</span></h5>
</div>
<div class="field-pair alt">
<label class="config" for="download_dir">$T('opt-download_dir')</label>
<input type="text" name="download_dir" id="download_dir" value="$download_dir" size="45" />
<span class="desc">$T('explain-download_dir')</span>
</div>
<div class="field-pair">
<label class="config" for="download_free">$T('opt-download_free')</label>
<input type="text" name="download_free" id="download_free" value="$download_free" size="8" />
<span class="desc">$T('explain-download_free')</span>
</div>
<div class="field-pair alt">
<label class="config" for="complete_dir">$T('opt-complete_dir')</label>
<input type="text" name="complete_dir" id="complete_dir" value="$complete_dir" size="45" />
<span class="desc">$T('explain-complete_dir')</span>
</div>
<div class="field-pair <!--#if $nt then "disabled" else "" #-->">
<label class="config" for="permissions">$T('opt-permissions')</label>
<input type="text" name="permissions" id="permissions" value="$permissions" size="8" <!--#if $nt then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-permissions')</span>
</div>
<div class="field-pair alt">
<label class="config" for="dirscan_dir">$T('opt-dirscan_dir')</label>
<input type="text" name="dirscan_dir" id="dirscan_dir" value="$dirscan_dir" size="45" />
<span class="desc">$T('explain-dirscan_dir')</span>
</div>
<div class="field-pair">
<label class="config" for="dirscan_speed">$T('opt-dirscan_speed')</label>
<input type="number" name="dirscan_speed" id="dirscan_speed" value="$dirscan_speed" size="8" min="0" max="3600" />
<span class="desc">$T('explain-dirscan_speed')</span>
</div>
<div class="field-pair alt">
<label class="config" for="script_dir">$T('opt-script_dir')</label>
<input type="text" name="script_dir" id="script_dir" value="$script_dir" size="45" />
<span class="desc">$T('explain-script_dir')</span>
</div>
<div class="field-pair">
<label class="config" for="email_dir">$T('opt-email_dir')</label>
<input type="text" name="email_dir" id="email_dir" value="$email_dir" size="45" />
<span class="desc">$T('explain-email_dir')</span>
</div>
<div class="field-pair alt">
<label class="config" for="password_file">$T('opt-password_file')</label>
<input type="text" name="password_file" id="password_file" value="$password_file" size="45" />
<span class="desc">$T('explain-password_file')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('systemFolders')</h3>
<p>$T('explain-folderConfig')</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair">
<h5 class="darkred nomargin">$T('base-folder'): <span class="path">$my_lcldata</span></h5>
</div>
<div class="field-pair alt">
<label class="config" for="admin_dir">$T('opt-admin_dir')</label>
<input type="text" name="admin_dir" id="admin_dir" value="$admin_dir" size="45" />
<span class="desc">$T('explain-admin_dir1')</span>
<span class="desc">$T('explain-admin_dir2')</span>
</div>
<div class="field-pair">
<label class="config" for="log_dir">$T('opt-log_dir')</label>
<input type="text" name="log_dir" id="log_dir" value="$log_dir" size="45" />
<span class="desc">$T('explain-log_dir')</span>
</div>
<div class="field-pair alt">
<label class="config" for="nzb_backup_dir">$T('opt-nzb_backup_dir')</label>
<input type="text" name="nzb_backup_dir" id="nzb_backup_dir" value="$nzb_backup_dir" size="45" />
<span class="desc">$T('explain-nzb_backup_dir')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="padding alt">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</form>
</div><!-- /colmask -->
<script>
\$(document).ready(function(){
\$('#download_dir').fileBrowser({ title: 'Select $T('opt-download_dir')' });
\$('#complete_dir').fileBrowser({ title: 'Select $T('opt-complete_dir')' });
\$('#dirscan_dir').fileBrowser({ title: 'Select $T('opt-dirscan_dir')' });
\$('#script_dir').fileBrowser({ title: 'Select $T('opt-script_dir')' });
\$('#email_dir').fileBrowser({ title: 'Select $T('opt-email_dir')' });
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,231 @@
<!--#set global $pane="General"#-->
<!--#set global $help_uri="configure-general-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveGeneral" method="post" name="fullform" id="fullform" novalidate>
<input type="hidden" id="session" name="session" value="$session" />
<div class="section">
<div class="col2">
<h3>$T('webServer')</h3>
<p><b>$T('restartRequired')</b></p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="host">$T('opt-host')</label>
<input type="url" name="host" id="host" value="$host" size="40" />
<span class="desc">$T('explain-host')</span>
</div>
<div class="field-pair">
<label class="config" for="port">$T('opt-port')</label>
<input type="text" name="port" id="port" value="$port" size="8" />
<span class="desc">$T('explain-port')</span>
</div>
<div class="field-pair alt">
<label class="config" for="username">$T('opt-web_username')</label>
<input type="text" name="username" id="username" value="$username" size="30" />
<span class="desc">$T('explain-web_username')</span>
</div>
<div class="field-pair">
<label class="config" for="password">$T('opt-web_password')</label>
<input type="password" name="password" id="password" value="$password" size="30" />
<span class="desc">$T('explain-web_password')</span>
</div>
<div class="field-pair alt">
<label class="config" for="web_dir">$T('opt-web_dir')</label>
<select name="web_dir" id="web_dir">
<!--#for $webline in $web_list#-->
<!--#if $webline.lower() == $web_dir.lower()#-->
<option value="$webline" selected="selected" class="selected">$webline</option>
<!--#else#-->
<option value="$webline">$webline</option>
<!--#end if#-->
<!--#end for#-->
</select>
<span class="desc">$T('explain-web_dir')</span>
</div>
<div class="field-pair">
<label class="config" for="web_dir2">$T('opt-web_dir2')</label>
<select name="web_dir2" id="web_dir2">
<!--#for $webline in $web_list2#-->
<!--#if $webline.lower() == $web_dir2.lower()#-->
<option value="$webline" selected="selected" class="selected">$webline</option>
<!--#else#-->
<option value="$webline">$webline</option>
<!--#end if#-->
<!--#end for#-->
</select>
<span class="desc">$T('explain-web_dir2')</span>
</div>
<div class="field-pair alt">
<label class="config" for="language">$T('opt-language')</label>
<select name="language" id="language" id="language" class="select">
<!--#for $webline in $lang_list#-->
<!--#if $webline[0].lower() == $language.lower()#-->
<option value="$webline[0]" selected="selected" class="selected">$webline[1]</option>
<!--#else#-->
<option value="$webline[0]">$webline[1]</option>
<!--#end if#-->
<!--#end for#-->
</select>
<span class="desc">$T('explain-language')</span>
</div>
<div class="field-pair">
<label class="config" for="disable_api_key">$T('opt-disableApikey')</label>
<input type="checkbox" name="disable_api_key" id="disable_api_key" value="1" <!--#if int($disable_api_key) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-disableApikey')</span>
</div>
<div class="field-pair alt">
<label class="config" for="apikey">$T('opt-apikey')</label>
<input type="text" id="apikey" value="$session" size="35" />
<input type="button" value="$T('button-apikey')" id="generate_new_apikey" />
<input type="button" value="$T('qr-code')" title="$T('explain-qr-code')" class="show_qrcode" rel="$session" />
<span class="desc">$T('explain-apikey')</span>
</div>
<div class="field-pair">
<label class="config" for="nzbkey">$T('opt-nzbkey')</label>
<input type="text" id="nzbkey" value="$nzb_key" size="35" />
<input type="button" value="$T('button-apikey')" id="generate_new_nzbkey" />
<input type="button" value="$T('qr-code')" title="$T('explain-qr-code')" class="show_qrcode" rel="$nzb_key" />
<span class="desc">$T('explain-nzbkey')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('httpsSupport')</h3>
<p><b>$T('restartRequired')</b></p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair">
<h5 class="darkred nomargin">$T('base-folder'): <span class="path">$my_lcldata</span></h5>
</div>
<div class="field-pair alt <!--#if int($have_ssl) == 0 then "disabled" else ""#-->">
<label class="config" for="enable_https">$T('opt-enable_https')</label>
<input type="checkbox" name="enable_https" id="enable_https" value="1" <!--#if int($enable_https) > 0 then 'checked="checked"' else ""#--> <!--#if int($have_ssl) == 0 then "disabled" else ""#--> />
<span class="desc">$T('explain-enable_https')</span>
</div>
<div class="field-pair">
<label class="config" for="https_port">$T('opt-https_port')</label>
<input type="text" name="https_port" id="https_port" value="$https_port" size="8" />
<span class="desc">$T('explain-https_port')</span>
</div>
<div class="field-pair alt">
<label class="config" for="https_cert">$T('opt-https_cert')</label>
<input type="text" name="https_cert" id="https_cert" value="$https_cert" size="50" />
<span class="desc">$T('explain-https_cert')</span>
</div>
<div class="field-pair">
<label class="config" for="https_key">$T('opt-https_key')</label>
<input type="text" name="https_key" id="https_key" value="$https_key" size="50" />
<span class="desc">$T('explain-https_key')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('tuning')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="bandwidth_limit">$T('opt-bandwidth_limit')</label>
<input type="number" name="bandwidth_limit" id="bandwidth_limit" value="$bandwidth_limit" size="8" step="1024" min="0" />
<span class="desc">$T('explain-bandwidth_limit')</span>
</div>
<div class="field-pair">
<label class="config" for="cache_limit">$T('opt-cache_limitstr')</label>
<input type="text" name="cache_limit" id="cache_limit" value="$cache_limit" size="8" />
<span class="desc">$T('explain-cache_limitstr')</span>
</div>
<div class="field-pair alt">
<label class="config" for="cleanup_list">$T('opt-cleanup_list')</label>
<input type="text" name="cleanup_list" id="cleanup_list" value="$cleanup_list" size="50" placeholder=".nfo, .sfv" />
<span class="desc">$T('explain-cleanup_list')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="padding alt">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</form>
</div><!-- /colmask -->
<script>
\$(document).ready(function(){
\$('#apikey, #nzbkey').click(function () { \$(this).select() });
\$('#generate_new_apikey').click(function () {
if (confirm("$T('Plush-confirm')")) {
$.ajax({
type: "POST",
url: "../../tapi",
data: {mode:'config', name:'set_apikey', apikey: \$('#apikey').val()},
success: function(msg){
\$('#apikey').val(msg);
window.location.reload();
}
});
}
});
\$('#generate_new_nzbkey').click(function () {
if (confirm("$T('Plush-confirm')")) {
$.ajax({
type: "POST",
url: "../../tapi",
data: {mode:'config', name:'set_nzbkey', apikey: \$('#apikey').val()},
success: function(msg){
\$('#nzbkey').val(msg);
window.location.reload();
}
});
}
});
\$('.show_qrcode').each(function () {
var qrkey = \$(this).attr('rel'),
qrcode = \$('<img />', {
src: 'https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=' + qrkey,
alt: 'loading...',
width: 300,
height: 300
});
\$(this).qtip( {
content: {
text: qrcode
},
position: {
my: 'center',
at: 'center',
target: \$(window)
},
show: {
event: 'click',
solo: true,
modal: true
},
hide: false,
style: 'ui-tooltip-light ui-tooltip-rounded ui-tooltip-shadow ui-tooltip-qrcode'
});
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,157 @@
<!--#set global $pane="Index Sites"#-->
<!--#set global $help_uri="configure-indexers-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveNewzbin" method="post" name="fullform" id="fullform">
<input type="hidden" id="session" name="session" value="$session" />
<div class="section">
<div class="col2">
<h3>NzbMatrix $T('accountInfo')</h3>
<p>$T('explain-nzbmatrix')</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="matrix_username">$T('opt-username_matrix')</label>
<input type="text" name="matrix_username" id="matrix_username" value="$matrix_username" size="30" />
<span class="desc">$T('explain-username_matrix')</span>
</div>
<div class="field-pair">
<label class="config" for="matrix_apikey">$T('opt-apikey_matrix')</label>
<input type="text" name="matrix_apikey" id="matrix_apikey" value="$matrix_apikey" size="35" />
<span class="desc">$T('explain-apikey_matrix')</span>
</div>
<div class="field-pair alt">
<label class="config" for="matrix_del_bookmark">$T('opt-newzbin_unbookmark')</label>
<input type="checkbox" name="matrix_del_bookmark" id="matrix_del_bookmark" value="1" <!--#if int($matrix_del_bookmark) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-newzbin_unbookmark')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>Newzbin $T('accountInfo')</h3>
<p>$T('explain-newzbin')</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="username_newzbin">$T('opt-username_newzbin')</label>
<input type="text" name="username_newzbin" id="username_newzbin" value="$username_newzbin" size="30" />
<span class="desc">$T('explain-username_newzbin')</span>
</div>
<div class="field-pair">
<label class="config" for="password_newzbin">$T('opt-password_newzbin')</label>
<input type="password" name="password_newzbin" id="password_newzbin" value="$password_newzbin" size="30" />
<span class="desc">$T('explain-password_newzbin')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>Newzbin $T('newzbinBookmarks')</h3>
<p>
<input type="button" id="getBookmarks" value="$T('link-getBookmarks')" />
<span id="getBookmarks-result" class="icon">&nbsp;</span>
<br/><br/>
<!--#if $bookmarks_list#-->
<input type="button" id="hideBookmarks" value="$T('link-HideBM')" />
<!--#else#-->
<input type="button" id="showBookmarks" value="$T('link-ShowBM')" />
<!--#end if#-->
</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="newzbin_bookmarks">$T('opt-newzbin_bookmarks')</label>
<input type="checkbox" name="newzbin_bookmarks" id="newzbin_bookmarks" value="1" <!--#if int($newzbin_bookmarks) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-newzbin_bookmarks')</span>
</div>
<div class="field-pair">
<label class="config" for="newzbin_unbookmark">$T('opt-newzbin_unbookmark')</label>
<input type="checkbox" name="newzbin_unbookmark" id="newzbin_unbookmark" value="1" <!--#if int($newzbin_unbookmark) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-newzbin_unbookmark')</span>
</div>
<div class="field-pair alt">
<label class="config" for="bookmark_rate">$T('opt-bookmark_rate')</label>
<input type="number" name="bookmark_rate" id="bookmark_rate" value="$bookmark_rate" size="8" min="15" max="1440" />
<span class="desc">$T('explain-bookmark_rate')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<!--#if $bookmarks_list#-->
<div class="section">
<div class="col2">
<h3>Newzbin Bookmarks</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<!--#set $odd = False#-->
<!--#for $msgid in $bookmarks_list#-->
<!--#set $odd = not $odd#-->
<div class="field-pair <!--#if $odd then "alt" else ""#-->">
<a href="https://$newzbin_url/browse/post/$msgid/" target="_blank">$msgid</a><br/>
</div>
<!--#end for#-->
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<!--#end if#-->
<div class="padding alt">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</form>
</div><!-- /colmask -->
<script>
\$(document).ready(function(){
\$('#matrix_apikey').click(function(){ \$(this).select() });
\$('#getBookmarks2').click(function(){ window.location='getBookmarks?session='+apikey; });
\$('#hideBookmarks').click(function(){ window.location='hideBookmarks?session='+apikey; });
\$('#showBookmarks').click(function(){ window.location='showBookmarks?session='+apikey; });
});
</script>
<script>
\$(document).ready(function(){
\$('#getBookmarks').click(function(event){
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode: 'newzbin', name: 'get_bookmarks', output: 'json', apikey: '$session' },
beforeSend: function(){
\$('#getBookmarks').attr("disabled", "disabled");
\$('#getBookmarks-result').removeClass("success failure").addClass("loading");
},
complete: function(){
\$('#getBookmarks').removeAttr("disabled");
\$('#getBookmarks-result').removeClass("loading");
},
success: function(data){
if(data.status == true)
\$('#getBookmarks-result').addClass("success");
else {
\$('#getBookmarks-result').addClass("failure")
alert(data.error);
}
}
});
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,175 @@
<!--#set global $pane="Email"#-->
<!--#set global $help_uri="configure-notifications-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveEmail" method="post" name="fullform" id="fullform" novalidate>
<input type="hidden" id="session" name="session" value="$session" />
<div class="section">
<div class="col2">
<h3>$T('emailOptions')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="email_endjob_radio">$T('opt-email_endjob')</label>
<select name="email_endjob" id="email_endjob">
<option value="0" <!--#if int($email_endjob) == 0 then 'selected="selected" class="selected"' else ""#--> >$T('email-never')</option>
<option value="1" <!--#if int($email_endjob) == 1 then 'selected="selected" class="selected"' else ""#--> >$T('email-always')</option>
<option value="2" <!--#if int($email_endjob) == 2 then 'selected="selected" class="selected"' else ""#--> >$T('email-errorOnly')</option>
</select>
</div>
<div class="field-pair">
<label class="config" for="email_full">$T('opt-email_full')</label>
<input type="checkbox" name="email_full" id="email_full" value="1" <!--#if int($email_full) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-email_full')</span>
</div>
<div class="field-pair alt">
<label class="config" for="email_rss">$T('opt-email_rss')</label>
<input type="checkbox" name="email_rss" id="email_rss" value="1" <!--#if int($email_rss) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-email_rss')</span>
</div>
<div class="field-pair">
<label class="config" for="email_dir">$T('opt-email_dir')</label>
<input type="text" name="email_dir" id="email_dir" value="$email_dir" size="45" />
<span class="desc">$T('explain-email_dir')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('emailAccount')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="email_server">$T('opt-email_server')</label>
<input type="url" name="email_server" id="email_server" value="$email_server" size="40" />
<span class="desc">$T('explain-email_server')</span>
</div>
<div class="field-pair">
<label class="config" for="email_to">$T('opt-email_to')</label>
<input type="email" name="email_to" id="email_to" value="$email_to" size="40" />
<span class="desc">$T('explain-email_to')</span>
</div>
<div class="field-pair alt">
<label class="config" for="email_from">$T('opt-email_from')</label>
<input type="email" name="email_from" id="email_from" value="$email_from" size="40" />
<span class="desc">$T('explain-email_from')</span>
</div>
<div class="field-pair">
<label class="config" for="email_account">$T('opt-email_account')</label>
<input type="email" name="email_account" id="email_account" value="$email_account" size="30" />
<span class="desc">$T('explain-email_account')</span>
</div>
<div class="field-pair alt">
<label class="config" for="email_pwd">$T('opt-email_pwd')</label>
<input type="password" name="email_pwd" id="email_pwd" value="$email_pwd" size="30" />
<span class="desc">$T('explain-email_pwd')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('link-testEmail')" id="test_email" rel="$T('askTestEmail')" />
<span id="testmail-result" class="icon path darkred">&nbsp;</span>
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('growlSettings')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt <!--#if not $have_ntfosd then "disabled" else "" #-->">
<label class="config" for="ntfosd_enable">$T('opt-ntfosd_enable')</label>
<input type="checkbox" name="ntfosd_enable" id="ntfosd_enable" value="1" <!--#if int($ntfosd_enable) > 0 then 'checked="checked"' else ""#--> <!--#if not $have_ntfosd then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-ntfosd_enable')</span>
</div>
<div class="field-pair">
<label class="config" for="growl_enable">$T('opt-growl_enable')</label>
<input type="checkbox" name="growl_enable" id="growl_enable" value="1" <!--#if int($growl_enable) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-growl_enable')</span>
</div>
<div class="field-pair alt">
<label class="config" for="growl_server">$T('opt-growl_server')</label>
<input type="url" name="growl_server" id="growl_server" value="$growl_server" size="40" />
<span class="desc">$T('explain-growl_server')</span>
</div>
<div class="field-pair">
<label class="config" for="growl_password">$T('opt-growl_password')</label>
<input type="password" name="growl_password" id="growl_password" value="$growl_password" size="30" />
<span class="desc">$T('explain-growl_password')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('testNotify')" id="test_notification" />
<span id="testnotice-result" class="icon path darkred">&nbsp;</span>
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="padding alt">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</form>
</div><!-- /colmask -->
<script>
\$(document).ready(function(){
\$('#email_dir').fileBrowser({ title: 'Select $T('opt-email_dir')' });
\$('#test_email').click(function () {
if (confirm(\$('#test_email').attr('rel'))) {
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode: 'test_email', apikey: '$session', output: 'json' },
beforeSend: function () {
\$('#test_email').attr("disabled", "disabled");
\$('#testmail-result').removeClass("success failure").addClass("loading").html('$T('post-Verifying')');
},
complete: function () {
\$('#test_email').removeAttr("disabled");
\$('#testmail-result').removeClass("loading");
},
success: function (data) {
if (data.status == true) {
\$('#testmail-result').addClass("success").html('$T('smpl-emailsent')');
} else {
\$('#testmail-result').addClass("failure").html(data.error);
}
}
});
}
});
\$('#test_notification').click(function () {
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode: 'test_notif', apikey: '$session', output: 'json' },
beforeSend: function () {
\$('#test_notification').attr("disabled", "disabled");
\$('#testnotice-result').removeClass("success failure").addClass("loading").html('$T('post-Verifying')');
},
complete: function () {
\$('#test_notification').removeAttr("disabled");
\$('#testnotice-result').removeClass("loading");
},
success: function (data) {
if (data.status == true) {
\$('#testnotice-result').addClass("success").html('$T('smpl-notesent')');
} else {
\$('#testnotice-result').addClass("failure").html(data.error);
}
}
});
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,570 @@
<!--#set global $pane="RSS"#-->
<!--#set global $help_uri="configure-rss-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<!--#if not $active_feed#-->
<div class="section">
<div class="padTable">
<p>$T('explain-RSS')</p>
<form action="add_rss_feed" method="post" novalidate>
<input type="hidden" name="session" value="$session">
<table class="catTable">
<tr>
<th>&nbsp;</th>
<th>$T('name')</th>
<th>$T('feed') URL</th>
<th>&nbsp;</th>
</tr>
<tr class="even">
<td><input type="checkbox" name="enable" value="1" /></td>
<td><input type="text" name="feed" size="20" value="$feed" placeholder="unique feed name" /></td>
<td><input type="url" name="uri" size="35" /></td>
<td class="nowrap">
<input type="submit" class="Save" value="$T('button-add')" />
</td>
</tr>
</table>
</form>
<br/>
<form action="save_rss_feed" method="post" novalidate>
<input type="hidden" name="session" value="$session" />
<table id="subscriptions">
<tbody>
<!--#set $feeds = sorted($rss.keys(), cmp=lambda x,y: cmp(x.lower(), y.lower()))#--><!--#slurp#-->
<!--#set $odd = False#--><!--#slurp#-->
<!--#for $feed_item in $feeds#--><!--#slurp#-->
<!--#set $odd = not $odd#--><!--#slurp#-->
<tr class="data-row <!--#if $odd then "alt" else ""#-->" >
<td class="chk">
<input type="checkbox" class="toggleFeedCheckbox" name="enable" value="1" <!--#if int($rss[$feed_item]['enable']) != 0 then 'checked="checked"' else ""#--> rel="$feed_item" />
</td>
<td class="title">
<div class="subscription-title">
<a href="?feed=$rss[$feed_item]['link']" class="path feed">
<div class="favicon" style="background-image: url(&quot;http://www.google.com/s2/favicons?domain=$rss[$feed_item]['baselink']&amp;alt=feed&quot;);"></div>
<span class="<!--#if int($rss[$feed_item]['enable']) != 0 then 'feed_enabled"' else "feed_disabled"#-->">$feed_item</span>
</a>
</div>
<!-- <input type="text" name="newfeed" value="$feed_item" size="25" readonly="readonly" class="readonly" /> -->
</td>
<td class="controls">
<input type="button" class="testFeed" value="$T('Read')" rel="$feed_item" />
<input type="hidden" name="uri" value="$rss[$feed_item]['uri']" size="75" />
<input type="button" class="editFeed" value="$T('Edit') URL" rel="$feed_item" />
<input type="button" class="delFeed" value="$T('button-x')" rel="$feed_item" />
</td>
</tr>
<tr class="feed-row <!--#if $odd then "alt" else ""#-->">
<td></td>
<td colspan="2">
<div>$rss[$feed_item]['uri']</div>
</td>
</tr>
<!--#end for#-->
</tbody>
</table>
</form>
<!--#if $feeds#-->
<br/>
<form action="rss_now" method="post" novalidate>
<input type="hidden" name="session" value="$session" />
<input type="submit" class="readAll" value="$T('button-rssNow')" />
</form>
<!--#end if#-->
</div>
</div>
<div class="section">
<form action="save_rss_rate" method="post">
<input type="hidden" name="session" value="$session" />
<div class="col1">
<fieldset>
<div class="field-pair">
<label class="config narrow" for="rss_rate">$T('opt-rss_rate')</label>
<input type="number" name="rss_rate" id="rss_rate" value="$rss_rate" size="8" min="15" max="1440" />
<input type="submit" value="$T('button-save')" />
<span class="desc narrow">$T('explain-rss_rate')</span>
</div>
</fieldset>
</div><!-- /col1 -->
</form>
</div>
<!--#end if#-->
<!--#if $active_feed#-->
<!--#set $feed = $active_feed#-->
<div class="section">
<div class="padTable">
<h2 class="nomargin activeRSS"><a href="${root}config/rss/">$T('cmenu-rss')</a> &raquo; <a href="$rss[$active_feed]['uri']" onclick="window.open(this.href); return false;">$active_feed</a></h2>
<!--#if $error#-->
<h3 class="darkred">$error</h3>
<!--#end if#-->
<form action="upd_rss_feed" method="post">
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="feed" value="$feed" />
<input type="hidden" name="uri" value="$rss[$feed]['uri']" />
<table class="catTable">
<thead>
<tr>
<th>&nbsp;</th>
<th>$T('rss-order')</th>
<th>$T('rss-type')</th>
<th>$T('rss-filter')</th>
<!--#if $rss[$feed]['pick_cat']#-->
<th>$T('category')</th>
<!--#end if#-->
<th>$T('priority')</th>
<th>$T('mode')</th>
<!--#if $rss[$feed]['pick_script']#-->
<th>$T('script')</th>
<!--#end if#-->
<th>&nbsp;</th>
</tr>
</thead>
<!-- default / global filter -->
<tbody>
<tr class="default">
<td>
<input type="checkbox" disabled="disabled" class="hidden" />
</td>
<td>
<input type="text" disabled="disabled" size="1" class="hidden" />
</td>
<td>
<select name="filter_type" disabled="disabled" class="hidden" >
<option value="A" selected="selected"> $T('rss-accept')</option>
<option value="M"> $T('rss-must')</option>
<option value="R"> $T('rss-reject')</option>
<option value="C"> $T('rss-mustcat')</option>
</select>
</td>
<td>
<input type="text" disabled="disabled" value="" size="25" class="hidden" />
</td>
<!--#if $rss[$feed]['pick_cat']#-->
<td>
<select name="cat">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct == $rss[$feed]['cat'] then 'selected="selected"' else ""#-->>$Tspec($ct)</option><!--#slurp#-->
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td>
<select name="priority">
<option value="-100" <!--#if $rss[$feed]['priority'] == -100 then 'selected="selected"' else ''#-->>$T('default')</option>
<option value="2" <!--#if $rss[$feed]['priority'] == 2 then 'selected="selected"' else ''#-->>$T('pr-force')</option>
<option value="1" <!--#if $rss[$feed]['priority'] == 1 then 'selected="selected"' else ''#-->>$T('pr-high')</option>
<option value="0" <!--#if $rss[$feed]['priority'] == 0 then 'selected="selected"' else ''#-->>$T('pr-normal')</option>
<option value="-1" <!--#if $rss[$feed]['priority'] == -1 then 'selected="selected"' else ''#-->>$T('pr-low')</option>
<option value="-2" <!--#if $rss[$feed]['priority'] == -2 then 'selected="selected"' else ''#-->>$T('pr-paused')</option>
</select>
</td>
<td>
<select name="pp">
<option value="" <!--#if $rss[$feed]['pp'] == "" then 'selected="selected"' else ''#-->>$T('default')</option>
<option value="0" <!--#if $rss[$feed]['pp'] == "0" then 'selected="selected"' else ''#-->>$T('pp-none')</option>
<option value="1" <!--#if $rss[$feed]['pp'] == "1" then 'selected="selected"' else ''#-->>$T('pp-repair')</option>
<option value="2" <!--#if $rss[$feed]['pp'] == "2" then 'selected="selected"' else ''#-->>$T('pp-unpack')</option>
<option value="3" <!--#if $rss[$feed]['pp'] == "3" then 'selected="selected"' else ''#-->>$T('pp-delete')</option>
</select>
</td>
<!--#if $rss[$feed]['pick_script']#-->
<td>
<select name="script">
<!--#for $sc in $script_list#-->
<option value="$sc" <!--#if $sc == $rss[$feed]['script'] then 'selected="selected"' else ""#-->>$Tspec($sc)</option><!--#slurp#-->
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td>
<input type="submit" class="Save" value="$T('button-save')" />
</td>
</tr>
</tbody>
</table>
</form>
<!-- add new filter -->
<form action="upd_rss_filter" method="post">
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="index" value="$rss[$feed]['filtercount']" />
<input type="hidden" name="feed" value="$feed" />
<table class="catTable">
<tbody>
<tr>
<td>
<input type="checkbox" name="enabled" value="1" checked="checked" />
</td>
<td>
<input type="text" name="new_index" size="1" />
</td>
<td>
<select name="filter_type">
<option value="A" selected="selected"> $T('rss-accept')</option>
<option value="M"> $T('rss-must')</option>
<option value="R"> $T('rss-reject')</option>
<option value="C"> $T('rss-mustcat')</option>
</select>
</td>
<td>
<input type="text" name="filter_text" value="" size="25" />
</td>
<!--#if $rss[$feed]['pick_cat']#-->
<td>
<select name="cat">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct == 'Default' then 'selected="selected"' else ""#-->>$Tspec($ct)</option><!--#slurp#-->
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td>
<select name="priority">
<option value="-100" selected="selected">$T('default')</option>
<option value="2">$T('pr-force')</option>
<option value="1">$T('pr-high')</option>
<option value="0">$T('pr-normal')</option>
<option value="-1">$T('pr-low')</option>
<option value="-2">$T('pr-paused')</option>
</select>
</td>
<td>
<select name="pp">
<option value="" selected="selected">$T('default')</option>
<option value="0">$T('pp-none')</option>
<option value="1">$T('pp-repair')</option>
<option value="2">$T('pp-unpack')</option>
<option value="3">$T('pp-delete')</option>
</select>
</td>
<!--#if $rss[$feed]['pick_script']#-->
<td>
<select name="script">
<!--#for $sc in $script_list#-->
<option value="$sc" <!--#if $sc == 'Default' then 'selected="selected"' else ""#-->>$Tspec($sc)</option><!--#slurp#-->
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td>
<input type="submit" class="Save" value="$T('button-add')" />
</td>
</tr>
</tbody>
</table>
</form>
<!--#set $odd = False#--><!--#slurp#-->
<!--#set $fnum = 0#--><!--#slurp#-->
<!--#for $filter in $rss[$feed].filters#--><!--#slurp#-->
<!--#set $odd = not $odd#--><!--#slurp#-->
<form action="upd_rss_filter" method="post">
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="index" value="$fnum" />
<input type="hidden" name="feed" value="$feed" />
<table class="catTable">
<tbody>
<tr class="<!--#if $odd then "alt" else ""#-->">
<td>
<input type="checkbox" name="enabled" value="1" <!--#if $filter[6] == '1' then 'checked="checked"' else ""#--> />
</td>
<td>
<input type="text" name="new_index" value="$fnum" size="1" />
</td>
<td>
<select name="filter_type">
<option value="A" <!--#if $filter[3] == "A" then 'selected="selected"' else ""#-->> $T('rss-accept')</option>
<option value="M" <!--#if $filter[3] == "M" then 'selected="selected"' else ""#-->> $T('rss-must')</option>
<option value="R" <!--#if $filter[3] == "R" then 'selected="selected"' else ""#-->> $T('rss-reject')</option>
<option value="C" <!--#if $filter[3] == "C" then 'selected="selected"' else ""#-->> $T('rss-mustcat')</option>
</select>
</td>
<td>
<input type="text" name="filter_text" value="$filter[4]" size="25" />
</td>
<!--#if $rss[$feed]['pick_cat']#-->
<td>
<select name="cat">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct == $filter[0] then 'selected="selected"' else ""#-->>$Tspec($ct)</option><!--#slurp#-->
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td>
<select name="priority">
<option value="-100" <!--#if $filter[5] == "-100" then 'selected="selected"' else ""#-->>$T('default')</option>
<option value="2" <!--#if $filter[5] == "2" then 'selected="selected"' else ""#-->>$T('pr-force')</option>
<option value="1" <!--#if $filter[5] == "1" then 'selected="selected"' else ""#-->>$T('pr-high')</option>
<option value="0" <!--#if $filter[5] == "0" then 'selected="selected"' else ""#-->>$T('pr-normal')</option>
<option value="-1" <!--#if $filter[5] == "-1" then 'selected="selected"' else ""#-->>$T('pr-low')</option>
<option value="-2" <!--#if $filter[5] == "-2" then 'selected="selected"' else ""#-->>$T('pr-paused')</option>
</select>
</td>
<td>
<select name="pp">
<option value="" <!--#if $filter[1] == "" then 'selected="selected"' else ""#-->>$T('default')</option>
<option value="0" <!--#if $filter[1] == "0" then 'selected="selected"' else ""#-->>$T('pp-none')</option>
<option value="1" <!--#if $filter[1] == "1" then 'selected="selected"' else ""#-->>$T('pp-repair')</option>
<option value="2" <!--#if $filter[1] == "2" then 'selected="selected"' else ""#-->>$T('pp-unpack')</option>
<option value="3" <!--#if $filter[1] == "3" then 'selected="selected"' else ""#-->>$T('pp-delete')</option>
</select>
</td>
<!--#if $rss[$feed]['pick_script']#-->
<td>
<select name="script">
<!--#for $sc in $script_list#-->
<option value="$sc" <!--#if $sc == $filter[2] then 'selected="selected"' else ""#-->>$Tspec($sc)</option><!--#slurp#-->
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td>
<input type="submit" class="Save" value="$T('button-save')" />
<input type="button" class="delFilter" value="$T('button-x')" />
</td>
</tr>
</tbody>
</table>
</form>
<!--#set $fnum = $fnum+1#-->
<!--#end for#-->
<form action="download_rss_feed" method="post">
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="feed" value="$feed" />
<div class="padding">
<input type="button" class="testFeed" value="$T('button-preFeed')" rel="$feed" />
<input type="submit" value="$T('button-forceFeed')" />
<input type="button" class="cleanFeed" value="$T('button-clear') $T('link-download')" />
</div>
</form>
</div>
</div>
<br/>
<div style="padding-left: 10px; border-bottom: 1px solid #DFDEDE;">
<ul class="tabs">
<li><a href="#">$T('rss-matched') <span class="count"><!--#echo len($matched)#--></span></a></li>
<li><a href="#">$T('rss-notMatched') <span class="count"><!--#echo len($unmatched)#--></span></a></li>
<li><a href="#">$T('rss-done') <span class="count"><!--#echo len($downloaded)#--></span></a></li>
</ul>
</div>
<div class="tab-content padTable">
<!--#if $matched#-->
<table class="catTable">
<!--#set $odd = False#--><!--#slurp#-->
<!--#set $cur = 0#--><!--#slurp#-->
<!--#for $job in $matched#--><!--#slurp#-->
<!--#set $odd = not $odd#--><!--#slurp#-->
<!--#set $cur = $cur+1#--><!--#slurp#-->
<!--#if $cur == 1#-->
<thead>
<tr>
<th>$T('link-download')</th>
<th>$T('rss-skip')</th>
<th>$T('rss-filter')</th>
<th>$T('sort-title')</th>
</tr>
</thead>
<!--#end if#-->
<tr class="infoTableSeperator <!--#if $odd then "alt" else ""#-->">
<td>
<form action="download" method="get">
<input type="hidden" value="$feed" name="feed" />
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="url" value="$job[0]" />
<input type="hidden" name="nzbname" value="$job[4]" />
<input type="submit" value="$T('link-download')" />
</form>
</td>
<td class="align-center">$job[2]</td>
<td class="align-center">
<span>$job[3]</span>
</td>
<td>$job[1]</td>
</tr>
<!--#end for#-->
</table>
<!--#else#-->
$T('none')
<!--#end if#-->
</div>
<div class="tab-content padTable">
<!--#if $unmatched#-->
<table class="catTable">
<!--#set $odd = False#--><!--#slurp#-->
<!--#set $cur = 0#--><!--#slurp#-->
<!--#for $job in $unmatched#--><!--#slurp#-->
<!--#set $odd = not $odd#--><!--#slurp#-->
<!--#set $cur = $cur+1#--><!--#slurp#-->
<!--#if $cur == 1#-->
<thead>
<tr>
<th>$T('link-download')</th>
<th>$T('rss-skip')</th>
<th>$T('rss-filter')</th>
<th>$T('sort-title')</th>
</tr>
</thead>
<!--#end if#-->
<tr class="infoTableSeperator <!--#if $odd then "alt" else ""#-->">
<td>
<form action="download" method="get">
<input type="hidden" value="$feed" name="feed" />
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="url" value="$job[0]" />
<input type="hidden" name="nzbname" value="$job[4]" />
<input type="submit" value="$T('link-download')" />
</form>
</td>
<td class="align-center">$job[2]</td>
<td class="align-center">
<span>$job[3]</span>
</td>
<td>$job[1]</td>
</tr>
<!--#end for#-->
</table>
<!--#else#-->
$T('none')
<!--#end if#-->
</div>
<div class="tab-content padTable">
<!--#if $downloaded#-->
<form action="clean_rss_jobs" method="post">
<input type="hidden" value="$feed" name="feed" />
<input type="hidden" name="session" value="$session" />
<table class="catTable">
<!--#set $odd = False#--><!--#slurp#-->
<!--#set $cur = 0#--><!--#slurp#-->
<!--#for $job in $downloaded#--><!--#slurp#-->
<!--#set $odd = not $odd#--><!--#slurp#-->
<!--#set $cur = $cur+1#--><!--#slurp#-->
<!--#if $cur == 1#-->
<thead>
<tr>
<th>$T('sort-title')</th>
</tr>
</thead>
<!--#end if#-->
<tr class="infoTableSeperator <!--#if $odd then "alt" else ""#-->">
<td>$job</td>
</tr>
<!--#end for#-->
</table>
</form>
<!--#else#-->
$T('none')
<!--#end if#-->
</div>
<!--#end if#-->
</div><!-- /colmask -->
<script>
\$(document).ready(function(){
\$('.editFeed').click(function(){
var oldURI = \$(this).prev().val();
var newURI = prompt("$T('feed') URL", oldURI );
if(newURI != "" && newURI !== null) {
var whichFeed = \$(this).attr("rel");
\$.ajax({
type: "POST",
url: "save_rss_feed",
data: {feed: whichFeed, uri: newURI, session: "$session" }
}).done(function( msg ) {
location.reload();
});
} else {
return false;
}
});
\$('.delFeed').click(function(e){
e.preventDefault();
if ( confirm("$T('confirm')") ) {
var whichFeed = \$(this).attr("rel");
\$.ajax({
type: "POST",
url: "del_rss_feed",
data: {feed: whichFeed, session: "$session" }
}).done(function( msg ) {
location.reload();
});
}
});
\$('.testFeed').click(function(){
var whichFeed = \$(this).attr("rel");
\$.ajax({
type: "POST",
url: "test_rss_feed",
data: {feed: whichFeed, session: "$session" }
}).done(function( msg ) {
location = '?feed=' + whichFeed;
// location.reload();
});
});
\$('.toggleFeedCheckbox').click(function(){
var whichFeed = \$(this).attr("rel");
\$.ajax({
type: "POST",
url: "toggle_rss_feed",
data: {feed: whichFeed, session: "$session" }
}).done(function() {
location.reload();
});
});
\$('.cleanFeed').click(function(){
var theForm = \$(this).closest("form");
theForm.attr("action", "clean_rss_jobs").submit();
});
\$('.delFilter').click(function(){
var theForm = \$(this).closest("form");
theForm.attr("action", "del_rss_filter").submit();
});
\$(function() {
\$("ul.tabs").tabs("div.tab-content");
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,101 @@
<!--#set global $pane="Scheduling"#-->
<!--#set global $help_uri="configure-scheduling-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<%
import time
t = time.localtime()
hour = t[3]
if hour != 23:
hour += 1
else:
hour = 0
%>
<div class="colmask">
<div class="section">
<div class="col2">
<h3>$T('addSchedule')</h3>
</div><!-- /col2 -->
<form action="addSchedule" method="post">
<input type="hidden" id="session" name="session" value="$session" />
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="hour">$T('hour').capitalize() : $T('minute').capitalize()</label>
<select name="hour" id="hour">
<!--#for $i in range(24)#-->
<option value="$i" <!--#if hour == i then 'selected="selected"' else ""#--> > $str($i).zfill(2) </option>
<!--#end for#-->
</select>&nbsp;<b>:</b>&nbsp;<select name="minute" id="minute">
<!--#for $i in range(60)#-->
<option value="$i"> $str($i).zfill(2) </option>
<!--#end for#-->
</select>
</div>
<div class="field-pair">
<label class="config" for="dayofweek">$T('sch-frequency')</label>
<select name="dayofweek" id="dayofweek">
<option value="*" selected="selected">$T('daily')</option>
<option value="1">$T('monday')</option>
<option value="2">$T('tuesday')</option>
<option value="3">$T('wednesday')</option>
<option value="4">$T('thursday')</option>
<option value="5">$T('friday')</option>
<option value="6">$T('saturday')</option>
<option value="7">$T('sunday')</option>
</select>
</div>
<div class="field-pair alt">
<label class="config" for="action">$T('sch-action')</label>
<select name="action" id="action">
<!--#for $action in $actions#-->
<option value="$action">$actions_lng[$action]</option>
<!--#end for#-->
</select>
</div>
<div class="field-pair">
<label class="config" for="arguments">$T('sch-arguments')</label>
<input type="text" name="arguments" id="arguments" value="" size="20" />
</div>
<div class="field-pair">
<input type="submit" value="$T('button-addSchedule')" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
</form>
<div class="section">
<div class="col2">
<h3>$T('currentSchedules')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<!--#if $schedlines#-->
<!--#set $schednum = 0#-->
<!--#set $odd = True#-->
<!--#for $line in $schedlines#-->
<!--#set $odd = not $odd#-->
<form action="delSchedule" method="post">
<input type="hidden" name="session" id="session" value="$session">
<input type="hidden" name="line" id="line" value="$line"/>
<div class="field-pair infoTableSeperator<!--#if $odd then "" else " alt"#-->">
<input class="float-left" type="submit" value="$T('button-x')" />
<div class="scheduleEntry">
<span class="time">$taskinfo[$schednum][1]:$taskinfo[$schednum][2]</span><span class="frequency">$taskinfo[$schednum][3]</span> <span class="darkred">$taskinfo[$schednum][4]</span>
</div>
</div>
</form>
<!--#set $schednum = $schednum+1#-->
<!--#end for#-->
<!--#else#-->
<div class="field-pair">
<label class="config">$T('none')</label>
</div>
<!--#end if#-->
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
</div><!-- /colmask -->
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,194 @@
<!--#set global $pane="Servers"#-->
<!--#set global $help_uri="configure-servers-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="addServer" method="post" novalidate>
<input type="hidden" name="session" value="$session" />
<div id="addServer">
<div class="padding alt">
<input type="button" value="$T('button-addServer')" id="addServerButton" />
</div>
</div>
<div class="section" id="addServerContent" style="display: none;">
<div class="col2">
<h3>$T('addServer')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="enable">$T('srv-enable')</label>
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
<span class="desc">$T('srv-enable')</span>
</div>
<div class="field-pair">
<label class="config" for="host">$T('srv-host')</label>
<input type="url" name="host" id="host" size="40" />
</div>
<div class="field-pair alt">
<label class="config" for="port">$T('srv-port')</label>
<input type="text" name="port" id="port" size="8" />
</div>
<div class="field-pair">
<label class="config" for="username">$T('srv-username')</label>
<input type="text" name="username" id="username" size="30" />
</div>
<div class="field-pair alt">
<label class="config" for="password">$T('srv-password')</label>
<input type="text" name="password" id="password" size="30" />
</div>
<div class="field-pair">
<label class="config" for="connections">$T('srv-connections')</label>
<input type="number" name="connections" id="connections" size="8" min="0" max="100" />
</div>
<div class="field-pair alt">
<label class="config" for="retention">$T('srv-retention')</label>
<input type="number" name="retention" id="retention" size="8" min="0" /> <i>$T('days')</i>
</div>
<div class="field-pair">
<label class="config" for="timeout">$T('srv-timeout')</label>
<input type="number" name="timeout" id="timeout" size="8" min="30" /> <i>$T('seconds')</i>
</div>
<div class="field-pair alt <!--#if int($have_ssl) == 0 then "disabled" else ""#-->">
<label class="config" for="ssl">$T('srv-ssl')</label>
<input type="checkbox" name="ssl" id="ssl" value="1" <!--#if int($have_ssl) == 0 then "disabled=\"disabled\"" else ""#--> />
<span class="desc">$T('srv-ssl')</span>
</div>
<div class="field-pair">
<label class="config" for="fillserver">$T('srv-fillserver')</label>
<input type="checkbox" name="fillserver" id="fillserver" value="1" />
<span class="desc">$T('srv-fillserver')</span>
</div>
<div class="field-pair alt">
<label class="config" for="optional">$T('srv-optional')</label>
<input type="checkbox" name="optional" id="optional" value="1" />
<span class="desc">$T('srv-optional')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-addServer')" />
<input type="button" value="$T('button-testServer')" class="testServer" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
</form>
<!--#set $slist = $servers.keys()#-->
<!--#$slist.sort()#-->
<!--#set $cur = 0#-->
<!--#for $server in $slist#-->
<!--#set $cur = $cur + 1#-->
<form action="saveServer" method="post" id="fullform" novalidate>
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="server" value="$server" />
<div class="section">
<div class="col2">
<h3>$servers[$server]['name']</h3>
<!--#if 'amounts' in $servers[$server]#-->
<p>
<b>$T('srv-bandwidth'):</b><br/>
$T('total'): $servers[$server]['amounts'][0]<br/>
$T('today'): $servers[$server]['amounts'][3]<br/>
$T('thisWeek'): $servers[$server]['amounts'][2]<br/>
$T('thisMonth'): $servers[$server]['amounts'][1]
</p>
<input type="button" value="$T('button-clrServer')" class="clrServer" />
<!--#end if#-->
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="enable$cur">$T('srv-enable')</label>
<input type="checkbox" name="enable" id="enable$cur" value="1" <!--#if int($servers[$server]['enable']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('srv-enable')</span>
</div>
<div class="field-pair">
<label class="config" for="host$cur">$T('srv-host')</label>
<input type="url" name="host" id="host$cur" value="$servers[$server]['host']" size="40" />
</div>
<div class="field-pair alt">
<label class="config" for="port$cur">$T('srv-port')</label>
<input type="text" name="port" id="port$cur" value="$servers[$server]['port']" size="8" />
</div>
<div class="field-pair">
<label class="config" for="username$cur">$T('srv-username')</label>
<input type="text" name="username" id="username$cur" value="$servers[$server]['username']" size="30" />
</div>
<div class="field-pair alt">
<label class="config" for="password$cur">$T('srv-password')</label>
<input type="password" name="password" id="password$cur" value="$servers[$server]['password']" size="30" />
</div>
<div class="field-pair">
<label class="config" for="connections$cur">$T('srv-connections')</label>
<input type="number" name="connections" id="connections$cur" value="$servers[$server]['connections']" size="8" min="0" max="100" />
</div>
<div class="field-pair alt">
<label class="config" for="retention$cur">$T('srv-retention')</label>
<input type="number" name="retention" id="retention$cur" value="$servers[$server]['retention']" size="8" min="0" /> <i>$T('days')</i>
</div>
<div class="field-pair">
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
<input type="number" name="timeout" id="timeout$cur" value="$servers[$server]['timeout']" size="8" min="30" /> <i>$T('seconds')</i>
</div>
<div class="field-pair alt <!--#if int($have_ssl) == 0 then "disabled" else ""#-->">
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($servers[$server]['ssl']) != 0 and int($have_ssl) == 1 then 'checked="checked"' else ""#--> <!--#if int($have_ssl) == 0 then "disabled=\"disabled\"" else ""#--> />
<span class="desc">$T('srv-ssl')</span>
</div>
<div class="field-pair">
<label class="config" for="fillserver$cur">$T('srv-fillserver')</label>
<input type="checkbox" name="fillserver" id="fillserver$cur" value="1" <!--#if int($servers[$server]['fillserver']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('srv-fillserver')</span>
</div>
<div class="field-pair alt">
<label class="config" for="optional$cur">$T('srv-optional')</label>
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($servers[$server]['optional']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('srv-optional')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-testServer')" class="testServer" />
<input type="button" value="$T('button-delServer')" class="delServer" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
</form>
<!--#end for#-->
</div><!-- /colmask -->
<script>
\$(document).ready(function(){
\$('#addServerButton').click(function(){
\$('#addServer').hide();
\$('#addServerContent').show();
});
\$('.testServer').click(function(event){
\$(this).attr("disabled", "disabled")
\$.ajax({
type: "POST",
url: "../../tapi",
data: "mode=config&amp;name=test_server&amp;" + \$(this).parents('form:first').serialize() + "&amp;apikey=" + \$('#apikey').val(),
success: function(msg){
alert(msg);
\$(event.target).removeAttr("disabled")
}
});
});
\$('.delServer').click(function(){
if( confirm("$T('Plush-confirm')") )
\$(this).parents('form:first').attr('action','delServer').submit();
return false;
});
\$('.clrServer').click(function(){
if( confirm("$T('Plush-confirm')") )
\$(this).parents('form:first').attr('action','clrServer').submit();
return false;
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,538 @@
<!--#set global $pane="Sorting"#-->
<!--#set global $help_uri="configure-sorting-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveSorting" method="post" name="fullform" id="fullform">
<input type="hidden" id="session" name="session" value="$session" />
<input id="complete_dir" type="hidden" value="$complete_dir" />
<div class="section">
<div class="col2">
<h3>$T('seriesSorting')</h3>
<p>
<b>$T('affectedCat')</b><br/>
<select name="tv_cat" multiple="multiple" class="multiple_cats">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct in $tv_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
<!--#end for#-->
</select>
</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair">
<h5 class="darkred nomargin">$T('ft-download'): <span class="path">$complete_dir</span></h5>
</div>
<div class="field-pair alt">
<label class="config wide" for="enable_tv_sorting">$T('opt-tvsort')</label>
<input type="checkbox" name="enable_tv_sorting" id="enable_tv_sorting" value="1" <!--#if int($enable_tv_sorting) > 0 then 'checked="checked"' else ""#--> />
</div>
<div class="field-pair">
<label class="config" for="tvfoldername">$T('sortString')</label>
<input type="text" id="tvfoldername" name="tv_sort_string" value="$tv_sort_string" size="50" />
<input type="button" value="$T('button-clear')" class="clearBtn" />
</div>
<div class="field-pair alt">
<label class="config">$T('presetSort')</label>
<div class="presets float-left">
<input type="button" onclick="tvSet('%sn/Season %s/%sn - %sx%0e - %en.%ext')" value="$T('button-Season1x05')" />
<input type="button" onclick="tvSet('%sn/Season %s/%sn - S%0sE%0e - %en.%ext')" value="$T('button-SeasonS01E05')" /><br/>
<input type="button" onclick="tvSet('%sn/%sx%0e - %en/%sn - %sx%0e - %en.%ext')" value="$T('button-Ep1x05')" />
<input type="button" onclick="tvSet('%sn/S%0sE%0e - %en/%sn - S%0sE%0e - %en.%ext')" value="$T('button-EpS01E05')" />
</div>
</div>
<div id="previewtv" class="example">
<div class="field-pair">
<label class="config" for="tvsamplename">Test Data</label>
<input type="text" id="tvsamplename" name="tvsamplename" placeholder="$T('show-name') S01E05 - $T('ep-name') [DTS]" size="50" />
<input type="button" value="$T('button-clear')" class="clearBtn" />
</div>
<div class="field-pair">
<label class="config">$T('sortResult')</label>
<span class="desc path" id="previewtv-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<label class="config">$T('sort-legenda')</label>
<input type="button" value="$T('sort-legenda')" onclick="jQuery(this).hide(); jQuery('#Key1').show();" />
<table id="Key1" class="Key">
<thead>
<tr>
<th class="align-right">$T('sort-meaning')</th>
<th>$T('sort-pattern')</th>
<th>$T('sort-result')</th>
</tr>
</thead>
<tbody>
<tr>
<td class="align-right"><b>$T('show-name'):</b></td>
<td>%sn</td>
<td>$T('show-sp-name')</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%s.n</td>
<td>$T('show-dot-name')</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>%s_n</td>
<td>$T('show-us-name')</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('show-name'):</b></td>
<td>%sN</td>
<td>$T('show-sp-name') ($T('case-adjusted'))</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>%s.N</td>
<td>$T('show-dot-name') ($T('case-adjusted'))</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%s_N</td>
<td>$T('show-us-name') ($T('case-adjusted'))</td>
</tr>
<tr>
<td class="align-right"><b>$T('show-seasonNum'):</b></td>
<td>%s</td>
<td>1</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%0s</td>
<td>01</td>
</tr>
<tr>
<td class="align-right"><b>$T('show-epNum'):</b></td>
<td>%e</td>
<td>5</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%0e</td>
<td>05</td>
</tr>
<tr>
<td class="align-right"><b>$T('ep-name'):</b></td>
<td>%en</td>
<td>$T('ep-sp-name')</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%e.n</td>
<td>$T('ep-dot-name')</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>%e_n</td>
<td>$T('ep-us-name')</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('fileExt'):</b></td>
<td>%ext</td>
<td>avi</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgFilename'):</b></td>
<td>%fn</td>
<td>$T("sort-File")</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('orgDirname'):</b></td>
<td>%dn</td>
<td>$T("sort-Folder")</td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
<td>{$T('TEXT')}</td>
<td>$T('text')</td>
</tr>
</tbody>
</table>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('genericSort')</h3>
<p>
<b>$T('affectedCat')</b><br/>
<select name="movie_cat" multiple="multiple" class="multiple_cats">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct in $movie_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
<!--#end for#-->
</select>
</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair">
<h5 class="darkred nomargin">$T('ft-download'): <span class="path">$complete_dir</span></h5>
</div>
<div class="field-pair alt">
<label class="config wide" for="enable_movie_sorting">$T('opt-movieSort')</label>
<input type="checkbox" name="enable_movie_sorting" id="enable_movie_sorting" value="1" <!--#if int($enable_movie_sorting) > 0 then 'checked="checked"' else ""#--> />
</div>
<div class="field-pair">
<label class="config wide" for="movie_extra_folder">$T('opt-movieExtra')</label>
<input type="checkbox" name="movie_extra_folder" id="movie_extra_folder" value="1" <!--#if int($movie_extra_folder) > 0 then 'checked="checked"' else ""#--> />
</div>
<div class="field-pair alt">
<label class="config" for="moviefoldername">$T('sortString')</label>
<input type="text" name="movie_sort_string" id="moviefoldername" value="$movie_sort_string" size="50" />
<input type="button" value="$T('button-clear')" class="clearBtn" />
</div>
<div class="field-pair">
<label class="config" for="movieextra">$T('multiPartLabel')</label>
<input type="text" name="movie_sort_extra" id="movieextra" value="$movie_sort_extra" size="50" />
<input type="button" value="$T('button-clear')" class="clearBtn" />
</div>
<div class="field-pair alt">
<label class="config">$T('presetSort')</label>
<div class="presets float-left">
<input type="button" onclick="movieSet('%title (%y)/%title (%y).%ext',' CD%1');movieExtraFolder(false)" value="$T('button-inFolders')" />
<input type="button" onclick="movieSet('%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('button-noFolders')" />
<input type="button" onclick="movieSet('%0decade/%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="Decades 1" />
</div>
</div>
<div id="previewmovie" class="example">
<div class="field-pair">
<label class="config" for="moviesamplename">Test Data</label>
<input type="text" id="moviesamplename" name="moviesamplename" placeholder="$T('movie-sp-name') (2009)" size="50" />
<input type="button" value="$T('button-clear')" class="clearBtn" />
</div>
<div class="field-pair">
<label class="config">$T('sortResult')</label>
<span class="desc path" id="previewmovie-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<label class="config">$T('sort-legenda')</label>
<input type="button" value="$T('sort-legenda')" onclick="jQuery(this).hide(); jQuery('#Key2').show();" />
<table id="Key2" class="Key">
<thead>
<tr>
<th class="align-right">$T('sort-meaning')</th>
<th>$T('sort-pattern')</th>
<th>$T('sort-result')</th>
</tr>
</thead>
<tbody>
<tr>
<td class="align-right"><b>$T('sort-title'):</b></td>
<td>%title</td>
<td>$T('movie-sp-name')</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%.title</td>
<td>$T('movie-dot-name')</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>%_title</td>
<td>$T('movie-us-name')</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('year'):</b></td>
<td>%y</td>
<td>2009</td>
</tr>
<tr>
<td class="align-right"><b>$T('extension'):</b></td>
<td>%ext</td>
<td>avi</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('decade'):</b></td>
<td>%decade</td>
<td>00</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>%0decade</td>
<td>2000</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('orgFilename'):</b></td>
<td>%fn</td>
<td>$T('sort-File')</td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
<td>{$T('TEXT')}</td>
<td>$T('text')</td>
</tr>
</tbody>
<tbody>
<tr>
<th class="align-right"><b>$T('multiPartLabel')</b></th>
<th>$T('sort-pattern')</th>
<th>$T('sort-result')</th>
</tr>
</tbody>
<tbody>
<tr>
<td class="align-right"><b>$T('partNumber'):</b></td>
<td>%1</td>
<td>1</td>
</tr>
</tbody>
</table>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('dateSorting')</h3>
<p>
<b>$T('affectedCat')</b><br/>
<select name="date_cat" multiple="multiple" class="multiple_cats">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct in $date_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
<!--#end for#-->
</select>
</p>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair">
<h5 class="darkred nomargin">$T('ft-download'): <span class="path">$complete_dir</span></h5>
</div>
<div class="field-pair alt">
<label class="config wide" for="enable_date_sorting">$T('opt-dateSort')</label>
<input type="checkbox" name="enable_date_sorting" id="enable_date_sorting" value="1" <!--#if int($enable_date_sorting) > 0 then 'checked="checked"' else ""#--> />
</div>
<div class="field-pair">
<label class="config" for="datefoldername">$T('sortString')</label>
<input type="text" name="date_sort_string" id="datefoldername" value="$date_sort_string" size="50" />
<input type="button" value="$T('button-clear')" class="clearBtn" />
</div>
<div class="field-pair alt">
<label class="config">$T('presetSort')</label>
<div class="presets float-left">
<input type="button" onclick="dateSet('%t/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-ShowNameF')" />
<input type="button" onclick="dateSet('%y-%0m/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-YMF')" />
<input type="button" onclick="dateSet('%y-%0m-%0d/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-DailyF')" />
</div>
</div>
<div id="previewdate" class="example">
<div class="field-pair">
<label class="config" for="datesamplename">Test Data</label>
<input type="text" id="datesamplename" name="datesamplename" placeholder="$T('show-name') 2009-01-02" size="50" />
<input type="button" value="$T('button-clear')" class="clearBtn" />
</div>
<div class="field-pair">
<label class="config">$T('sortResult')</label>
<span class="desc path" id="previewdate-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<label class="config">$T('sort-legenda')</label>
<input type="button" value="$T('sort-legenda')" onclick="jQuery(this).hide(); jQuery('#Key3').show();" />
<table id="Key3" class="Key">
<thead>
<tr>
<th class="align-right">$T('sort-meaning')</th>
<th>$T('sort-pattern')</th>
<th>$T('sort-result')</th>
</tr>
</thead>
<tbody>
<tr>
<td class="align-right"><b>$T('show-name'):</b></td>
<td>%t</td>
<td>$T('show-sp-name')</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%.t</td>
<td>$T('show-dot-name')</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>%_t</td>
<td>$T('show-us-name')</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('year'):</b></td>
<td>%y</td>
<td>2009</td>
</tr>
<tr>
<td class="align-right"><b>$T('month'):</b></td>
<td>%m</td>
<td>1</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%0m</td>
<td>01</td>
</tr>
<tr>
<td class="align-right"><b>$T('day-of-month'):</b></td>
<td>%d</td>
<td>2</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%0d</td>
<td>02</td>
</tr>
<tr>
<td class="align-right"><b>$T('decade'):</b></td>
<td>%decade</td>
<td>00</td>
</tr>
<tr class="even">
<td>&nbsp;</td>
<td>%0decade</td>
<td>2000</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgFilename'):</b></td>
<td>%fn</td>
<td>$T('sort-File')</td>
</tr>
<tr class="even">
<td class="align-right"><b>$T('lowercase'):</b></td>
<td>{$T('TEXT')}</td>
<td>$T('text')</td>
</tr>
</tbody>
</table>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="padding alt">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</form>
</div><!-- /colmask -->
<script>
// http://stackoverflow.com/questions/2219924/idiomatic-jquery-delayed-event-only-after-a-short-pause-in-typing-e-g-timew
var typewatch = (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
}
})();
function tvSet(val) {
\$('#tvfoldername').val(val);
new_previewtv();
}
function movieSet(val, val2) {
\$('#moviefoldername').val(val);
\$('#movieextra').val(val2);
new_previewmovie();
}
function movieExtraFolder(value) {
\$('#movie_extra_folder').attr("checked", value);
}
function dateSet(val) {
\$('#datefoldername').val(val);
new_previewdate();
}
function new_previewtv() {
var \$tvsortstring = \$('#tvfoldername').val();
if(\$tvsortstring.length > 2) {
typewatch(function () {
\$('#previewtv').show();
\$('#previewtv-result').addClass("loading");
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode:'eval_sort', value: 'series', name: \$('#tvsamplename').val(), title: \$tvsortstring, apikey: '$session', output: 'json' },
success: function(data){
\$('#previewtv-result').removeClass("loading failure").html(data.result);
},
error: function(data){ \$('#previewtv-result').removeClass("loading").addClass("failure").html('need more information to process'); }
});
}, 500);
}
else
\$('#previewtv').hide();
}
function new_previewmovie() {
var \$moviesortstring = \$('#moviefoldername').val();
if(\$moviesortstring.length > 2) {
typewatch(function () {
\$('#previewmovie').show();
\$('#previewmovie-result').addClass("loading");
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode:'eval_sort', value: 'generic', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
success: function(data){
\$('#previewmovie-result').removeClass("loading failure").html(data.result);
},
error: function(data){ \$('#previewmovie-result').removeClass("loading").addClass("failure").html('need more information to process'); }
});
}, 500);
}
else
\$('#previewmovie').hide();
}
function new_previewdate() {
var \$datesortstring = \$('#datefoldername').val();
if(\$datesortstring.length > 2) {
typewatch(function () {
\$('#previewdate').show();
\$('#previewdate-result').addClass("loading");
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode:'eval_sort', value: 'date', name: \$('#datesamplename').val(), title: \$datesortstring, apikey: '$session', output: 'json' },
success: function(data){
\$('#previewdate-result').removeClass("loading failure").html(data.result);
},
error: function(data){ \$('#previewdate-result').removeClass("loading").addClass("failure").html('need more information to process'); }
});
}, 500);
}
else
\$('#previewdate').hide();
}
</script>
<script>
\$(document).ready(function(){
new_previewtv();
new_previewmovie();
new_previewdate();
\$('#tvfoldername, #tvsamplename').bind("keyup focus", new_previewtv);
\$('#moviefoldername, #movieextra, #moviesamplename').bind("keyup focus", new_previewmovie);
\$('#datefoldername, #datesamplename').bind("keyup focus", new_previewdate);
\$('.clearBtn').click(function(){
\$(this).prev().val('').focus();
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,59 @@
<!--#set global $pane="Special"#-->
<!--#set global $help_uri="configure+special-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveSpecial" method="post" name="fullform" id="fullform">
<input type="hidden" id="session" name="session" value="$session" />
<div class="padTable">
<h3 class="darkred nomargin">$T('explain-special')</h3>
</div>
<div class="section">
<div class="col2">
<h3>$T('sptag-boolean')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<!--#set $odd = False#-->
<!--#for $option in $switches#-->
<!--#set $odd = not $odd#-->
<div class="field-pair <!--#if $odd then "alt" else ""#-->">
<label class="config wide" for="$option[0]">$option[0] ( <span class="path"><!--#if $option[2] then $T('on') else $T('off')#--></span> )</label>
<input type="checkbox" name="$option[0]" id="$option[0]" value="1" <!--#if int($option[1]) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">&nbsp;</span>
</div>
<!--#end for#-->
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('sptag-entries')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<!--#set $odd = False#-->
<!--#for $option in $entries#-->
<!--#set $odd = not $odd#-->
<div class="field-pair <!--#if $odd then "alt" else ""#-->">
<label class="config narrow" for="$option[0]">$option[0] (&nbsp;<span class="path">$option[2]</span>&nbsp;)</label>
<input type="text" name="$option[0]" id="$option[0]" value="$option[1]" />
</div>
<!--#end for#-->
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="padding alt">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</form>
</div><!-- /colmask -->
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,302 @@
<!--#set global $pane="Switches"#-->
<!--#set global $help_uri="configure-switches-0-7"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveSwitches" method="post" name="fullform" id="fullform">
<input type="hidden" id="session" name="session" value="$session" />
<div class="section">
<div class="col2">
<h3>$T('swtag-general')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="check_new_rel">$T('opt-check_new_rel')</label>
<input type="checkbox" name="check_new_rel" id="check_new_rel" value="1" <!--#if int($check_new_rel) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-check_new_rel')</span>
</div>
<div class="field-pair">
<label class="config" for="auto_browser">$T('opt-auto_browser')</label>
<input type="checkbox" name="auto_browser" id="auto_browser" value="1" <!--#if int($auto_browser) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-auto_browser')</span>
</div>
<div class="field-pair alt <!--#if not $have_ampm then "disabled" else "" #-->">
<label class="config" for="ampm">$T('opt-ampm')</label>
<input type="checkbox" name="ampm" id="ampm" value="1" <!--#if int($ampm) > 0 then 'checked="checked"' else ""#--> <!--#if not $have_ampm then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-ampm')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('swtag-server')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="max_art_tries">$T('opt-max_art_tries')</label>
<input type="number" name="max_art_tries" id="max_art_tries" value="$max_art_tries" size="8" min="2" />
<span class="desc">$T('explain-max_art_tries')</span>
</div>
<div class="field-pair">
<label class="config" for="max_art_opt">$T('opt-max_art_opt')</label>
<input type="checkbox" name="max_art_opt" id="max_art_opt" value="1" <!--#if int($max_art_opt) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-max_art_opt')</span>
</div>
<div class="field-pair alt">
<label class="config" for="auto_disconnect">$T('opt-auto_disconnect')</label>
<input type="checkbox" name="auto_disconnect" id="auto_disconnect" value="1" <!--#if int($auto_disconnect) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-auto_disconnect')</span>
</div>
<div class="field-pair">
<label class="config" for="send_group">$T('opt-send_group')</label>
<input type="checkbox" name="send_group" id="send_group" value="1" <!--#if int($send_group) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-send_group')</span>
</div>
<div class="field-pair alt">
<label class="config" for="ssl_type">$T('opt-ssl_type')</label>
<select name="ssl_type" id="ssl_type">
<option value="v23" <!--#if $ssl_type == "v23" then 'selected="selected" class="selected"' else ""#--> >V23</option>
<option value="v2" <!--#if $ssl_type == "v2" then 'selected="selected" class="selected"' else ""#--> >V2</option>
<option value="v3" <!--#if $ssl_type == "v3" then 'selected="selected" class="selected"' else ""#--> >V3</option>
</select>
<span class="desc">$T('explain-ssl_type')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('swtag-queue')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="pre_check">$T('opt-pre_check')</label>
<input type="checkbox" name="pre_check" id="pre_check" value="1" <!--#if int($pre_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-pre_check')</span>
</div>
<div class="field-pair">
<label class="config" for="no_dupes">$T('opt-no_dupes')</label>
<select name="no_dupes" id="no_dupes">
<option value="0" <!--#if int($no_dupes) == 0 then 'selected="selected" class="selected"' else ""#--> >$T('nodupes-off')</option>
<option value="1" <!--#if int($no_dupes) == 1 then 'selected="selected" class="selected"' else ""#--> >$T('nodupes-ignore')</option>
<option value="2" <!--#if int($no_dupes) == 2 then 'selected="selected" class="selected"' else ""#--> >$T('nodupes-pause')</option>
</select>
<span class="desc">$T('explain-no_dupes')</span>
</div>
<div class="field-pair alt">
<label class="config" for="pause_on_post_processing">$T('opt-pause_on_post_processing')</label>
<input type="checkbox" name="pause_on_post_processing" id="pause_on_post_processing" value="1" <!--#if int($pause_on_post_processing) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-pause_on_post_processing')</span>
</div>
<div class="field-pair">
<label class="config" for="pause_on_pwrar">$T('opt-pause_on_pwrar')</label>
<input type="checkbox" name="pause_on_pwrar" id="pause_on_pwrar" value="1" <!--#if int($pause_on_pwrar) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-pause_on_pwrar')</span>
</div>
<div class="field-pair alt">
<label class="config" for="top_only">$T('opt-top_only')</label>
<input type="checkbox" name="top_only" id="top_only" value="1" <!--#if int($top_only) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-top_only')</span>
</div>
<div class="field-pair">
<label class="config" for="auto_sort">$T('opt-auto_sort')</label>
<input type="checkbox" name="auto_sort" id="auto_sort" value="1" <!--#if int($auto_sort) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-auto_sort')</span>
</div>
<div class="field-pair alt">
<label class="config" for="pre_script">$T('opt-pre_script')</label>
<select name="pre_script" id="pre_script">
<!--#for $sc in $script_list#-->
<!--#if $sc.lower() == $pre_script.lower()#-->
<option value="$sc" selected="selected" class="selected">$Tspec($sc)</option>
<!--#else#-->
<option value="$sc">$Tspec($sc)</option>
<!--#end if#-->
<!--#end for#-->
</select>
<span class="desc">$T('explain-pre_script')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('swtag-pp')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="ignore_samples">$T('opt-ignore_samples')</label>
<select name="ignore_samples" id="ignore_samples">
<option value="0" <!--#if int($ignore_samples) == 0 then 'selected="selected" class="selected"' else ""#--> >$T('igsam-off')</option>
<option value="1" <!--#if int($ignore_samples) == 1 then 'selected="selected" class="selected"' else ""#--> >$T('igsam-del')</option>
<option value="2" <!--#if int($ignore_samples) == 2 then 'selected="selected" class="selected"' else ""#--> >$T('igsam-not')</option>
</select>
<span class="desc">$T('explain-ignore_samples')</span>
</div>
<div class="field-pair">
<label class="config" for="quick_check">$T('opt-quick_check')</label>
<input type="checkbox" name="quick_check" id="quick_check" value="1" <!--#if int($quick_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-quick_check')</span>
</div>
<div class="field-pair alt">
<label class="config" for="enable_unrar">$T('opt-enable_unrar')</label>
<input type="checkbox" name="enable_unrar" id="enable_unrar" value="1" <!--#if int($enable_unrar) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_unrar')</span>
</div>
<div class="field-pair">
<label class="config" for="enable_unzip">$T('opt-enable_unzip')</label>
<input type="checkbox" name="enable_unzip" id="enable_unzip" value="1" <!--#if int($enable_unzip) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_unzip')</span>
</div>
<div class="field-pair alt">
<label class="config" for="enable_filejoin">$T('opt-enable_filejoin')</label>
<input type="checkbox" name="enable_filejoin" id="enable_filejoin" value="1" <!--#if int($enable_filejoin) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_filejoin')</span>
</div>
<div class="field-pair">
<label class="config" for="enable_tsjoin">$T('opt-enable_tsjoin')</label>
<input type="checkbox" name="enable_tsjoin" id="enable_tsjoin" value="1" <!--#if int($enable_tsjoin) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-ts_join')</span>
</div>
<div class="field-pair alt">
<label class="config" for="enable_par_cleanup">$T('opt-enable_par_cleanup')</label>
<input type="checkbox" name="enable_par_cleanup" id="enable_par_cleanup" value="1" <!--#if int($enable_par_cleanup) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_par_cleanup')</span>
</div>
<div class="field-pair">
<label class="config" for="fail_on_crc">$T('opt-fail_on_crc')</label>
<input type="checkbox" name="fail_on_crc" id="fail_on_crc" value="1" <!--#if int($fail_on_crc) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-fail_on_crc')</span>
</div>
<div class="field-pair alt">
<label class="config" for="safe_postproc">$T('opt-safe_postproc')</label>
<input type="checkbox" name="safe_postproc" id="safe_postproc" value="1" <!--#if int($safe_postproc) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-safe_postproc')</span>
</div>
<div class="field-pair">
<label class="config" for="sfv_check">$T('opt-sfv_check')</label>
<input type="checkbox" name="sfv_check" id="sfv_check" value="1" <!--#if int($sfv_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-sfv_check')</span>
</div>
<div class="field-pair alt">
<label class="config" for="unpack_check">$T('opt-unpack_check')</label>
<input type="checkbox" name="unpack_check" id="unpack_check" value="1" <!--#if int($unpack_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-unpack_check')</span>
</div>
<div class="field-pair <!--#if not $nt then "disabled" else "" #-->">
<label class="config" for="par2_multicore">$T('opt-par2_multicore')</label>
<input type="checkbox" name="par2_multicore" id="par2_multicore" value="1" <!--#if int($par2_multicore) > 0 then 'checked="checked"' else ""#--> <!--#if not $nt then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-par2_multicore')</span>
</div>
<div class="field-pair alt">
<label class="config" for="par_option">$T('opt-par_option')</label>
<input type="text" name="par_option" id="par_option" value="$par_option" size="20" />
<span class="desc">$T('explain-par_option')</span>
</div>
<div class="field-pair <!--#if not $have_nice then "disabled" else "" #-->">
<label class="config" for="nice">$T('opt-nice')</label>
<input type="text" name="nice" id="nice" value="$nice" size="20" <!--#if not $have_nice then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-nice')</span>
</div>
<div class="field-pair alt <!--#if not $have_ionice then "disabled" else "" #-->">
<label class="config" for="ionice">$T('opt-ionice')</label>
<input type="text" name="ionice" id="ionice" value="$ionice" size="20" <!--#if not $have_ionice then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-ionice')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('swtag-naming')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="folder_rename">$T('opt-folder_rename')</label>
<input type="checkbox" name="folder_rename" id="folder_rename" value="1" <!--#if int($folder_rename) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-folder_rename')</span>
</div>
<div class="field-pair">
<label class="config" for="replace_spaces">$T('opt-replace_spaces')</label>
<input type="checkbox" name="replace_spaces" id="replace_spaces" value="1" <!--#if int($replace_spaces) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-replace_spaces')</span>
</div>
<div class="field-pair alt">
<label class="config" for="replace_dots">$T('opt-replace_dots')</label>
<input type="checkbox" name="replace_dots" id="replace_dots" value="1" <!--#if int($replace_dots) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-replace_dots')</span>
</div>
<div class="field-pair">
<label class="config" for="replace_illegal">$T('opt-replace_illegal')</label>
<input type="checkbox" name="replace_illegal" id="replace_illegal" value="1" <!--#if int($replace_illegal) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-replace_illegal')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="col2">
<h3>$T('swtag-quota')</h3>
</div><!-- /col2 -->
<div class="col1">
<fieldset>
<div class="field-pair alt">
<label class="config" for="quota_size">$T('opt-quota_size')</label>
<input type="text" name="quota_size" id="quota_size" value="$quota_size" size="8" />
<span class="desc">$T('explain-quota_size')</span>
</div>
<div class="field-pair">
<label class="config" for="quota_period">$T('opt-quota_period')</label>
<select name="quota_period" id="quota_period">
<option value="d" <!--#if $quota_period == "d" then 'selected="selected" class="selected"' else ""#--> >$T('day').capitalize()</option>
<option value="w" <!--#if $quota_period == "w" then 'selected="selected" class="selected"' else ""#--> >$T('week').capitalize()</option>
<option value="m" <!--#if $quota_period == "m" then 'selected="selected" class="selected"' else ""#--> >$T('month').capitalize()</option>
<option value="x" <!--#if $quota_period == "x" then 'selected="selected" class="selected"' else ""#--> >$T('manual').capitalize()</option>
</select>
<span class="desc">$T('explain-quota_period')</span>
</div>
<div class="field-pair alt">
<label class="config" for="quota_day">$T('opt-quota_day')</label>
<input type="text" name="quota_day" id="quota_day" value="$quota_day" size="20" />
<span class="desc">$T('explain-quota_day')</span>
</div>
<div class="field-pair">
<label class="config" for="quota_resume">$T('opt-quota_resume')</label>
<input type="checkbox" name="quota_resume" id="quota_resume" value="1" <!--#if int($quota_resume) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-quota_resume')</span>
</div>
<div class="field-pair">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="padding alt">
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
</div>
</form>
</div><!-- /colmask -->
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -0,0 +1,2 @@
/* This file was intentionally left blank and is only needed for 'skin' detection routine */
/* https://github.com/thezoggy/sabnzbd-uni_Config */

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

File diff suppressed because one or more lines are too long

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 B

View File

File diff suppressed because one or more lines are too long

View File

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

View File

@@ -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'):&nbsp;<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#&sdot; <a href="$new_rel_url" id="new_release" target="_blank">$T('Plush-updateAvailable').replace(' ','&nbsp;')</a>#end if#
#if $warning#&sdot; <a id="warning_message">$warning.replace(' ','&nbsp;')</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#

View File

@@ -10,13 +10,13 @@
</table>
<div class="sabnzbd_logo main_sprite_container sprite_sabnzbdplus_logo"></div>
<p><strong>SABnzbd $T('version'):</strong> $version</p>
<p><small>Copyright (C) 2008-2011, The SABnzbd Team &lt;<a href="mailto:team@sabnzbd.org">team@sabnzbd.org</a>&gt;</small></p>
<p><small>Copyright (C) 2008-2012, The SABnzbd Team &lt;<a href="mailto:team@sabnzbd.org">team@sabnzbd.org</a>&gt;</small></p>
<p><small>$T('yourRights')</small></p>
</div>
<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/>

View File

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

View File

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

View File

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

View File

@@ -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">&nbsp;</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">&nbsp;</span>

View File

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

View File

@@ -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">&nbsp;</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">&nbsp;</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>&nbsp;</h3>
@@ -120,6 +168,8 @@
<a id="save"><span class="config_sprite_container sprite_config_save">&nbsp;</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">&nbsp;</span> $T('link-testEmail')</a>
<a id="test_notification" href="testnotification?session=$session">
<span class="config_sprite_container sprite_config_email_test">&nbsp;</span> $T('testNotify')</a>
</div>
<!--#if $lastmail#-->
&nbsp;&nbsp;&nbsp;&nbsp;$T('emailResult') = <b>$lastmail</b>

View File

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

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