Compare commits

...

337 Commits

Author SHA1 Message Date
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
ShyPike
2d79e2ac92 Update to 0.6.7 2011-08-04 19:30:26 +02:00
ShyPike
7982ef2f11 Update text files for 0.6.7 RC2. 2011-08-03 20:55:33 +02:00
ShyPike
9280daad41 - Classic/smpl: add link "Purge failed NZBs & delete files" 2011-08-03 20:54:59 +02:00
ShyPike
e22709b5ff Actually delete files when user selects "Purge History" and picks "Purge Failed NZBs & Delete files".
Add "Purge failed & delete files" to the Classic and smpl skins.
2011-08-03 20:21:39 +02:00
ShyPike
ed37330fee Work-around for the Plush top menu issue in Safari 5.1. 2011-08-01 23:10:12 +02:00
ShyPike
f1fb3f904b Update French. 2011-08-01 21:18:59 +02:00
ShyPike
a3b6bb9ad9 Update text files for 0.6.7 2011-08-01 19:56:29 +02:00
ShyPike
54e6431d11 Update translations. 2011-08-01 19:55:54 +02:00
ShyPike
3e6f46483c Launch browser for a second instance when no -b parameter is given.
This means that browser launch is always active when using the standard shortcut.
Only an explicit -b0 will suppress the launch.
2011-07-31 10:53:41 +02:00
ShyPike
f7aadb1b61 Allow jobs still waiting for post-processing to be deleted too. 2011-07-30 15:52:48 +02:00
ShyPike
c7d5ea6ecd Delay starting most tasks until the webserver is ready.
This prevents slow starting of the web server due to heavy downloading.
2011-07-30 13:45:31 +02:00
ShyPike
1060f15463 Prevent persistent end-of-queue action to be triggered at program startup. 2011-07-30 13:44:23 +02:00
ShyPike
559d3064a9 Support both ActiveState (for OSX older than 10.5 and 10.6) and Apple Python (for 10.6 and 10.7). 2011-07-29 00:00:16 +02:00
ShyPike
084e638d30 Update text files for 0.6.6 Final. 2011-07-26 20:55:11 +02:00
ShyPike
428ab1ad96 Prevent UI of running SABnzbd instance coming up when second instance is started with "--browser 0". 2011-07-26 20:53:48 +02:00
ShyPike
b15673d0cd Prevent crash on exit when there are disk problems. 2011-07-26 19:59:49 +02:00
ShyPike
abf15149e9 Fix crash in assembler when fatal disk error (like "full") occurs. 2011-07-26 18:48:01 +02:00
ShyPike
1f9e328c2d Fix bad formatting in README.rtf 2011-07-24 13:37:13 +02:00
ShyPike
2c2c1c93a1 Update text files for 0.6.6 RC1 2011-07-24 12:43:19 +02:00
ShyPike
196c06a17e Don't re-queue NZB-only downloads when the PP is set to "Download only". 2011-07-24 11:38:26 +02:00
ShyPike
be78580ece When retrying a download, ignore the "do not download samples" setting.
That setting can misfire without much clues for the user and this will silently correct it.
2011-07-24 11:17:49 +02:00
ShyPike
748d525ccc File an error message if RSS email template not found. 2011-07-24 00:41:28 +02:00
ShyPike
2269407b1c Improved fix for nzbclub RSS link issues. 2011-07-23 10:36:09 +02:00
ShyPike
af7beab5e9 In RSS: don't remove spaces from NZB URLs, but replace with '%20'.
Needed for proper nzbclub.com support.
2011-07-22 21:51:36 +02:00
ShyPike
fb9abcc583 Start generating the OSX tar.gz distro file again. 2011-07-18 22:52:22 +02:00
ShyPike
29e829de73 Update text files for 0.6.6 Beta 2. 2011-07-18 22:17:40 +02:00
ShyPike
5225925a78 Limit the amount of URL fetch attempts when the NZB is incomplete. 2011-07-18 22:15:37 +02:00
ShyPike
15bd0f8a78 For RSS feeds, show 401/402/403 authentication errors clearly. 2011-07-18 21:39:24 +02:00
ShyPike
1557f3f8e8 OSX did not handle nzb.gz files properly when using "Open With". 2011-07-18 20:36:13 +02:00
ShyPike
b0a833f3a9 Log original command line before any tampering. 2011-07-18 19:56:27 +02:00
ShyPike
8b66deef0e Log command line parameters. 2011-07-18 19:25:32 +02:00
ShyPike
61608545c5 Improve diskfree/disktotal for Posix.
Some systems have such large disks that they return a negative number for free/total blocks.
Detect this and trim to the highest possible size that could be represented (usually 8T).
2011-07-17 22:46:13 +02:00
ShyPike
4f163ad979 Delay removing an NZF file until it's payload file is complete and written to disk.
This will make recovery from crashes more likely.
2011-07-17 21:38:16 +02:00
ShyPike
a01cd34b58 Fix handle leak.
Caused by bug in CherryPy's memory-based session support.
Replace by file-based.
As we don't really need session support, disable it and make it available through the --sessions option.
2011-07-16 00:03:14 +02:00
ShyPike
e6a5b0de57 Remove obsolete function from api.py 2011-07-15 20:34:16 +02:00
ShyPike
b3b1209293 Fix duplicate email problem.
For each recipient a seperate email was sent, but the "to" was always the full list instead of just the current recipient.
2011-07-11 20:01:12 +02:00
ShyPike
4cc21efe90 OSX binary: stop needless console logging. 2011-07-10 13:05:12 +02:00
ShyPike
6acd599d53 Fix package.py. 2011-07-10 12:23:36 +02:00
ShyPike
b73f74470b Fix error message about missing Cheetah. 2011-07-10 12:16:35 +02:00
ShyPike
6b3efe9398 OSX binary: remove odd -psn_0_12345 parameter that would be mistaken for "-p -s -n". 2011-07-09 09:55:39 +02:00
ShyPike
e5c9058201 Update text files for 0.6.6 Beta 1. 2011-07-08 22:04:41 +02:00
ShyPike
897d982e2f Handle special login failure situation (we sent empty username, server doesn't accept). 2011-07-07 22:34:24 +02:00
ShyPike
333b83f3c5 Fix error in German translation. 2011-07-06 19:52:45 +02:00
ShyPike
94938847fb Due to 64bit ApplePython, disable argv-emulation feature in py2app. 2011-07-06 19:35:47 +02:00
ShyPike
64f17675e2 Compensate for some Apple-Python bugs. 2011-07-06 19:23:15 +02:00
ShyPike
a97974d66c Replace colon in folder names by a dash. 2011-07-04 21:13:35 +02:00
ShyPike
349395f67a For Windows only show script files with executable extensions. 2011-07-03 12:41:05 +02:00
ShyPike
344c1ff42d Update POT file. 2011-06-30 19:55:16 +02:00
ShyPike
08435bc138 Show proper error message when only invalid par2 files are found for a set. 2011-06-30 19:54:38 +02:00
ShyPike
ce00490b40 Handle error 502 during nntp login properly. 2011-06-29 20:44:29 +02:00
ShyPike
cc702dde6d Improve handling when user has set username/password for a server, while the server doesn't need authentication.
For incorrect authentication, some servers return code '502 ... Access denied...' instead of the official '481' code.
Handle that as a bad login too.
2011-06-26 15:56:08 +02:00
ShyPike
913121bcc4 Update translations. 2011-06-26 12:43:33 +02:00
ShyPike
6448f4ff5e Add texts for pre-check. 2011-06-25 21:55:21 +02:00
ShyPike
1fbb56fc6f Update quotum texts. 2011-06-25 09:49:36 +02:00
ShyPike
6442391589 Output po/nsis/SABnsis.pot in Unix format too. 2011-06-25 09:49:06 +02:00
ShyPike
80ca43fe7d Extension-based cleanup_list should delete files in all sub-folders too. 2011-06-24 20:52:55 +02:00
ShyPike
3514973f2a Avoid logging an exception when postproc1.sab is missing. 2011-06-24 00:34:41 +02:00
ShyPike
def241c5c4 Early addition of quotum management texts to enable translation. 2011-06-23 19:49:50 +02:00
ShyPike
04e1605b27 Smpl: remove "active" job name below the speed graph. It's inaccurate and misleading. 2011-06-22 21:26:29 +02:00
ShyPike
a931e80f2e Fix error in German output of Launchpad. 2011-06-21 21:40:30 +02:00
ShyPike
f891a0ceac Update translations. 2011-06-21 21:39:02 +02:00
ShyPike
41697d022f Set top_only off by default. 2011-06-21 21:21:00 +02:00
ShyPike
f0b1b9d284 Update POT files. 2011-06-21 21:15:43 +02:00
ShyPike
b1455398c8 Use "repair priority" in the sorting functions too. Make the auto_sort option effective immediately instead of only at a (re-)start. 2011-06-21 21:09:30 +02:00
ShyPike
396e779517 Fetching extra par2 files no longer ignores paused state (it will use priority value 3).
Top-priority will still ignore paused state.
2011-06-21 20:27:29 +02:00
ShyPike
e9bc192bc7 Do end-of-queue action also when only paused download queue items remain after the post-processing queue becomes empty. 2011-06-20 21:23:50 +02:00
ShyPike
287490d549 Split misc.py into misc.py, panic.py and powersup.py. 2011-06-20 20:45:13 +02:00
ShyPike
dcd55b552a Add some more translatable texts in anticipation of Growl support. 2011-06-19 20:24:48 +02:00
ShyPike
4ac2b0d27c Update Growl texts again. 2011-06-15 20:07:21 +02:00
ShyPike
ea4d1e9474 Update Growl texts. 2011-06-15 19:37:07 +02:00
ShyPike
61c29e232d Add translation hints to Growl texts. 2011-06-14 23:47:12 +02:00
ShyPike
7b6ef157e9 Add translation hints to Growl texts. 2011-06-14 23:43:52 +02:00
ShyPike
14d6a033ae Add translatable texts for future merge of extended Growl support. 2011-06-14 23:20:42 +02:00
ShyPike
1db567b5ae Update text files for 0.6.5 2011-06-13 12:05:07 +02:00
ShyPike
ad6c9a56d8 Update translations. 2011-06-13 11:58:26 +02:00
ShyPike
15f6732a5b Generic sort: failed to recognize year surounded with underscores. 2011-06-11 14:13:26 +02:00
ShyPike
e517218240 Quick fix for failing end-of-queue script (side-effect of removing Q-> delay). 2011-06-11 13:21:20 +02:00
ShyPike
89fc5fc124 Update translations. 2011-06-09 21:45:15 +02:00
ShyPike
4025087f89 msgfmt.py : add detection of %s mismatches between original and translated texts.
Print warning and skip text.
2011-06-08 19:55:29 +02:00
ShyPike
31b620b8e5 Update text files for 0.6.4 2011-06-07 23:59:42 +02:00
ShyPike
55786df7bd Fix 'have_sll' crash in the Wizard. 2011-06-07 23:56:35 +02:00
166 changed files with 21948 additions and 15968 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/
# Romanian ro.po is generated from ro.px, due to mapping to latin-1
po/*/ro.po
# Build results
SABnzbd*.zip
SABnzbd*.exe
SABnzbd*.gz
SABnzbd*.dmg
# WingIDE project file
*.wpr
# General junk
*.keep
*.bak
*.log

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "interfaces/Config"]
path = interfaces/Config
url = https://github.com/thezoggy/sabnzbd-uni_Config.git

56
ABOUT.txt Normal file
View File

@@ -0,0 +1,56 @@
*******************************************
*** This is SABnzbd 0.7.0 ***
*******************************************
SABnzbd is an open-source cross-platform binary newsreader.
It simplifies the process of downloading from Usenet dramatically,
thanks to its friendly web-based user interface and advanced
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.
There is an extensive Wiki on the use of SABnzbd.
http://wiki.sabnzbd.org/
IMPORTANT INFORMATION about release 0.7.0:
http://wiki.sabnzbd.org/introducing-0-7-0
Please also read the file "ISSUES.txt"
*******************************************
*** Upgrading from 0.6.x ***
*******************************************
Stop SABnzbd.
Install new version
Start SABnzbd.
*******************************************
*** Upgrading from 0.5.x ***
*******************************************
Stop SABnzbd.
Uninstall current version, keeping the data.
Install new version
Start SABnzbd.
The organization of the download queue is different from 0.5.x.
0.6.x will finish downloading an existing queue, but you
cannot go back to an older version without losing your queue.
Also, your sabnzbd.ini file will be upgraded, making it
incompatible with release 0.5.x
*******************************************
*** Upgrading from 0.4.x ***
*******************************************
>>>>> PLEASE DOWNLOAD YOUR CURRENT QUEUE BEFORE UPGRADING <<<<<<
When upgrading from a 0.4.x release such as 0.4.12 your old settings will be kept.
You will however be given a fresh queue and history. If you have items in your queue
from the older version of SABnzbd, you can either re-import the nzb files if you kept
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.

View File

@@ -1,3 +1,156 @@
-------------------------------------------------------------------------------
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.
-------------------------------------------------------------------------------
0.6.14Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Prevent potential crash in RSS feed analysis
- Add --console to force console logging for OSX app (diagnostic tool)
- Don't reset watched folder path to default when it doesn't exist at startup
-------------------------------------------------------------------------------
0.6.13Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Disable "SABnzbd will now listen on all "localhost" addresses" feature
- When retrying an URL fetch from History, remove the History entry
- Make sure that paths coming from Sorting are normalized
-------------------------------------------------------------------------------
0.6.12Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix issue with new localhost handling on some IPv4-only Unixes
- Fix job folder creation by Movie Sort when the Sort expression specifies one
- Fix problem with retrieving ZIP files from some web sites
-------------------------------------------------------------------------------
0.6.11Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Better support for Yahoo pipes
- Accept NZB files containing incorrect dates
-------------------------------------------------------------------------------
0.6.11RC1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix some Growl issues (OSX)
- Improve detection of encrypted RAR files during download
- SABnzbd will now listen on all "localhost" addresses
- Remove unneeded extra temporary folder level in Generic Sort
- Show the promised 10 queue entries in the OSX menu instead of 9
- Fix logging of pre-queue script result
- "Get bookmarks now" for newzbin only worked when automatic readout was also enabled.
- When par2 fails do an SFV-based check when SFV files present and feature enabled.
(previously SFV was only used when no par2 files were available at all)
- Do extra checks on job administration on disk
(an attempt to diagnose jobs with missing admin files)
- Make newzbin "Get bookmarks now" button independent of automatic readout
-------------------------------------------------------------------------------
0.6.10Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Convert ambiguous Windows paths like D: and D:folder to D:\ and D:\folder
- Fix file name encoding problems when verifying using SFV files
- Add GNTP module to source distribution
- Prevent reading newzbin bookmarks when newzbin credentials are not set
-------------------------------------------------------------------------------
0.6.10RC1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Allow saving of category paths ending in a *
This is will prevent the creation of job folders in the final folder
- Fix incompatibility with unrar 4.01 regarding detection of encrypted files
- Create .bak (backup) file for sabnzbd.ini before modifying it
- OSX: Compatible with Growl 1.2.2 and 1.3
- OSX: Prevent changes to SABnzbd.app folder which confused the OSX Firewall
- OSX: Fix access rights of SABnzbs.app so that restricted users can run SABnzbd
- OSX: Combined SnowLeopard/Lion DMG and separate Leopard DMG
-------------------------------------------------------------------------------
0.6.9Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Change the OSX DMG window size (again) so that the optional "path bar"
doesn't obsure part of the background image.
-------------------------------------------------------------------------------
0.6.9RC2 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Generic Sorter failed to uppercase first letter of title when starting with "the/a/to" etc.
- Add "hidden" option allow_64bit_tools (lost when going from 0.5.6 to 0.6.0)
- Improve handling of non-creatable final and category folders
- Fix and I18N the "Downloaded in X days Y hours Z seconds" text in the history report.
- Change the OSX DMG window size so that the optional "path bar" doesn't obsure part of the background image.
-------------------------------------------------------------------------------
0.6.9RC1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Update Plush to solve minor browser incompatibilities
- On Windows the 64bit versions of par2 and unrar were never used
- Updated unrar to 4.01
- Using the "Download" button in newzbin.com RSS feeds produced malformed names.
- For OSX make a Lion and a Leopard/SnowLeopard version and show this in DMG background image
- When removing job folders in the "temporary download folder", remove everything.
This is needed because some operating systems add spurious files and folders.
- Servers with square brackets in the name could not be removed.
- Check email parameters also when only email_rss is set.
- Try out work-around for potential memory leak in pickle.
-------------------------------------------------------------------------------
0.6.8Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix several RSS issues, due to corruption of stored RSS data
-------------------------------------------------------------------------------
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
-------------------------------------------------------------------------------

View File

@@ -1,5 +1,5 @@
(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:

View File

@@ -1,10 +1,10 @@
SABnzbd 0.6.3
SABnzbd 0.7.0
-------------------------------------------------------------------------------
0) LICENSE
-------------------------------------------------------------------------------
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -39,9 +39,14 @@ Start the SABnzbd.exe program.
Within 5-10 seconds your web browser will start and show the user interface.
Use the "Help" button in the web-interface to be directed to the Help Wiki.
-------------------------------------------------------------------------------
3) INSTALL pre-built OSX binaries
-------------------------------------------------------------------------------
Download teh DMG file, mount and drag the SABnzbd icon to Programs.
Just like you do with so many apps.
-------------------------------------------------------------------------------
3) INSTALL with only sources
4) INSTALL with only sources
-------------------------------------------------------------------------------
You need to have Python installed and some modules.
@@ -49,13 +54,16 @@ You need to have Python installed and some modules.
Unix/Linux/OSX
Python-2.5, 2.6 or 2.7 http://www.python.org
OSX Leopard/SnowLeopard
Python 2.6 http://www.activestate.com
OSX Lion Apple Python 2.7 (included in OSX)
Windows
Python-2.5.latest http://www.activestate.com
Python-2.6.latest
Python-2.7.latest
Python-2.7.latest http://www.activestate.com
Essential modules
cheetah-2.0.1+ http://www.cheetahtemplate.org/
cheetah-2.0.1+ http://www.cheetahtemplate.org/ (or use "pypm install cheetah")
yenc module >= 0.3 http://sabnzbd.sourceforge.net/yenc-0.3.tar.gz
http://sabnzbd.sourceforge.net/yenc-0.3-w32fixed.zip (Win32-only)
par2cmdline >= 0.4 http://parchive.sourceforge.net/
@@ -65,22 +73,25 @@ Optional modules
unrar >= 3.90+ http://www.rarlab.com/rar_add.htm
unzip >= 5.52 http://www.info-zip.org/
gnu gettext http://www.gnu.org/software/gettext/
gntp https://github.com/kfdm/gntp/ (or use "pypm install gntp")
Optional modules Windows
pyopenssl >= 0.11 http://pypi.python.org/pypi/pyOpenSSL
(Binaries, including the OpenSSL libraries)
Optional modules Unix/Linux/OSX
pyopenssl >= 0.10 http://pypi.python.org/pypi/pyOpenSSL
pyopenssl >= 0.11 http://pypi.python.org/pypi/pyOpenSSL
openssl => v0.9.8g+ http://www.openssl.org/
Make sure the OpenSSL libraries match with PyOpenSSL
pynotify Should be part of GTK for Python support on Debian/Ubuntu
If not, you cannot use the NotifyOSD feature.
Embedded modules (only use the included version)
CherryPy-3.2 rev2138 with patches http://www.cherrypy.org
Unpack the ZIP-file containing the SABnzbd sources to any folder of your liking.
If fou want multiple languages, you need to compile the translations.
If you want multiple languages, you need to compile the translations.
Start this from a shell terminal (or command prompt):
python tools/make_mo.py
@@ -91,7 +102,7 @@ Use the "Help" button in the web-interface to be directed to the Help Wiki.
-------------------------------------------------------------------------------
4) TROUBLESHOOTING
5) TROUBLESHOOTING
-------------------------------------------------------------------------------
Your browser may start up with just an error page.
@@ -109,7 +120,7 @@ This will show a black window where logging information will be shown. This
may help you solve problems easier.
-------------------------------------------------------------------------------
5) MORE INFORMATION
6) MORE INFORMATION
-------------------------------------------------------------------------------
Visit the WIKI site:
@@ -117,9 +128,9 @@ Visit the WIKI site:
-------------------------------------------------------------------------------
6) CREDITS
7) CREDITS
-------------------------------------------------------------------------------
Serveral parts of SABnzbd were built by other people, illustrating the
Several parts of SABnzbd were built by other people, illustrating the
wonderful world of Free Open Source Software.
See the licences folder of the main program and of the skin folders.

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

@@ -21,36 +21,115 @@
!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-ro.tmpl"
Delete "${idir}\email\rss-de.tmpl"
Delete "${idir}\email\rss-en.tmpl"
Delete "${idir}\email\rss-nl.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"
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 "${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-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)
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
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
;------------------------------------------------------------------
; 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
@@ -82,7 +161,6 @@ InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
@@ -101,10 +179,9 @@ InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
;Languages
; Set supported languages
;------------------------------------------------------------------
; Set supported languages
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German"
@@ -115,9 +192,8 @@ InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
!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.
@@ -125,31 +201,80 @@ InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
!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:
;--------------------------------
;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) IDOK loop IDCANCEL exitinstall
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgCloseSab) /SD IDCANCEL IDOK loop IDCANCEL exitinstall
exitinstall:
Abort
Abort
endcheck:
;------------------------------------------------------------------
; Make sure old versions are gone
ReadRegStr $R0 HKLM \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "UninstallString"
StrCmp $R0 "" done
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgRemoveOld) IDOK uninst
Abort
uninst:
${RemovePrev} "$INSTDIR"
done:
FunctionEnd
;------------------------------------------------------------------
; SECTION main program
;
Section "SABnzbd" SecDummy
SetOutPath "$INSTDIR"
IfFileExists $INSTDIR\sabnzbd.exe 0 endWarnExist
IfFileExists $INSTDIR\locale\nl\LC_MESSAGES\SABnzbd.mo endWarnExist 0
IfFileExists $INSTDIR\python25.dll endWarnExist 0
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgOldQueue) IDOK endWarnExist IDCANCEL 0
Abort
endWarnExist:
@@ -239,73 +364,7 @@ Section "un.$(MsgDelProgram)" Uninstall
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"
${RemovePrev} "$INSTDIR"
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
@@ -327,19 +386,9 @@ Section "un.$(MsgDelProgram)" Uninstall
SectionEnd ; end of uninstall section
Section "un.$(MsgDelSettings)" DelSettings
DetailPrint "Uninstall settings $LOCALAPPDATA"
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"
RMDir /r "$LOCALAPPDATA\sabnzbd"
SectionEnd
; eof
@@ -348,121 +397,148 @@ SectionEnd
;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 MsgStartSab ${LANG_DANISH} "Start SABnzbd (hidden)$\"
"
LangString MsgStartSab ${LANG_GERMAN} "Start SABnzbd (hidden)$\"
"
LangString MsgStartSab ${LANG_FRENCH} "Start SABnzbd (hidden)$\"
"
LangString MsgStartSab ${LANG_NORWEGIAN} "Start SABnzbd (hidden)$\"
"
LangString MsgStartSab ${LANG_DUTCH} "Start SABnzbd (hidden)$\"
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 MsgStartSab ${LANG_ROMANIAN} "Start SABnzbd (hidden)$\"
"
LangString MsgStartSab ${LANG_SWEDISH} "Start SABnzbd (hidden)$\"
"
LangString MsgShowRelNote ${LANG_ENGLISH} "Show Release Notes"
LangString MsgShowRelNote ${LANG_DANISH} "Show Release Notes$\"
"
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 MsgShowRelNote ${LANG_GERMAN} "Show Release Notes$\"
"
LangString MsgShowRelNote ${LANG_FRENCH} "Show Release Notes$\"
"
LangString MsgShowRelNote ${LANG_NORWEGIAN} "Show Release Notes$\"
"
LangString MsgShowRelNote ${LANG_DUTCH} "Show Release Notes$\"
"
LangString MsgShowRelNote ${LANG_ROMANIAN} "Show Release Notes$\"
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 MsgShowRelNote ${LANG_SWEDISH} "Show Release Notes$\"
"
LangString MsgSupportUs ${LANG_ENGLISH} "Support the project, Donate!"
LangString MsgSupportUs ${LANG_DANISH} "Support the project, Donate!$\"
"
LangString MsgSupportUs ${LANG_GERMAN} "Support the project, Donate!$\"
"
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 MsgSupportUs ${LANG_FRENCH} "Support the project, Donate!$\"
"
LangString MsgSupportUs ${LANG_NORWEGIAN} "Support the project, Donate!$\"
"
LangString MsgSupportUs ${LANG_DUTCH} "Support the project, Donate!$\"
"
LangString MsgSupportUs ${LANG_ROMANIAN} "Support the project, Donate!$\"
"
LangString MsgSupportUs ${LANG_SWEDISH} "Support the project, Donate!$\"
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 MsgCloseSab ${LANG_ENGLISH} "Please close $\"SABnzbd.exe$\" first"
LangString MsgCloseSab ${LANG_DANISH} "Please close $\"SABnzbd.exe$\" first$\"
"
LangString MsgCloseSab ${LANG_GERMAN} "Please close $\"SABnzbd.exe$\" first$\"
"
LangString MsgCloseSab ${LANG_FRENCH} "Please close $\"SABnzbd.exe$\" first$\"
"
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 MsgCloseSab ${LANG_NORWEGIAN} "Please close $\"SABnzbd.exe$\" first$\"
"
LangString MsgCloseSab ${LANG_DUTCH} "Please close $\"SABnzbd.exe$\" first$\"
"
LangString MsgCloseSab ${LANG_ROMANIAN} "Please close $\"SABnzbd.exe$\" first$\"
"
LangString MsgCloseSab ${LANG_SWEDISH} "Please close $\"SABnzbd.exe$\" first$\"
"
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 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$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !$\"
"
LangString MsgOldQueue ${LANG_GERMAN} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !$\"
"
LangString MsgOldQueue ${LANG_FRENCH} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to 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 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 MsgOldQueue ${LANG_DUTCH} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !$\"
"
LangString MsgOldQueue ${LANG_ROMANIAN} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !$\"
"
LangString MsgOldQueue ${LANG_SWEDISH} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !$\"
"
LangString MsgUninstall ${LANG_ENGLISH} "This will uninstall SABnzbd from your system"
LangString MsgUninstall ${LANG_DANISH} "This will uninstall SABnzbd from your system$\"
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 MsgUninstall ${LANG_GERMAN} "This will uninstall SABnzbd from your system$\"
"
LangString MsgUninstall ${LANG_FRENCH} "This will uninstall SABnzbd from your system$\"
"
LangString MsgUninstall ${LANG_NORWEGIAN} "This will uninstall SABnzbd from your system$\"
"
LangString MsgUninstall ${LANG_DUTCH} "This will uninstall SABnzbd from your system$\"
"
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 MsgUninstall ${LANG_ROMANIAN} "This will uninstall SABnzbd from your system$\"
"
LangString MsgUninstall ${LANG_SWEDISH} "This will uninstall SABnzbd from your system$\"
"
LangString MsgRunAtStart ${LANG_ENGLISH} "Run at startup"
LangString MsgRunAtStart ${LANG_DANISH} "Run at startup$\"
"
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 MsgRunAtStart ${LANG_GERMAN} "Run at startup$\"
"
LangString MsgRunAtStart ${LANG_FRENCH} "Run at startup$\"
"
LangString MsgRunAtStart ${LANG_NORWEGIAN} "Run at startup$\"
"
LangString MsgRunAtStart ${LANG_DUTCH} "Run at startup$\"
"
LangString MsgRunAtStart ${LANG_ROMANIAN} "Run at startup$\"
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"
"
LangString MsgRunAtStart ${LANG_SWEDISH} "Run at startup$\"
"
LangString MsgIcon ${LANG_ENGLISH} "Desktop Icon"
LangString MsgIcon ${LANG_DANISH} "Desktop Icon$\"
"
LangString MsgIcon ${LANG_GERMAN} "Desktop Icon$\"
"
LangString MsgIcon ${LANG_FRENCH} "Desktop Icon$\"
"
LangString MsgIcon ${LANG_NORWEGIAN} "Desktop Icon$\"
"
LangString MsgIcon ${LANG_DUTCH} "Desktop Icon$\"
"
LangString MsgIcon ${LANG_ROMANIAN} "Desktop Icon$\"
"
LangString MsgIcon ${LANG_SWEDISH} "Desktop Icon$\"
"
LangString MsgAssoc ${LANG_ENGLISH} "NZB File association"
LangString MsgAssoc ${LANG_DANISH} "NZB File association$\"
"
LangString MsgAssoc ${LANG_GERMAN} "NZB File association$\"
"
LangString MsgAssoc ${LANG_FRENCH} "NZB File association$\"
"
LangString MsgAssoc ${LANG_NORWEGIAN} "NZB File association$\"
"
LangString MsgAssoc ${LANG_DUTCH} "NZB File association$\"
"
LangString MsgAssoc ${LANG_ROMANIAN} "NZB File association$\"
"
LangString MsgAssoc ${LANG_SWEDISH} "NZB File association$\"
"
LangString MsgDelProgram ${LANG_ENGLISH} "Delete Program"
LangString MsgDelProgram ${LANG_DANISH} "Delete Program$\"

View File

@@ -1,7 +1,7 @@
Metadata-Version: 1.0
Name: SABnzbd
Version: 0.6.3
Summary: SABnzbd-0.6.3
Version: 0.7.0Aplha1
Summary: SABnzbd-0.7.0Alpha1
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,13 +1,31 @@
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
{\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
\f0\b\fs48 \cf0 SABnzbd 0.6.3\
\f0\b\fs48 \cf0 SABnzbd 0.7.0Alpha1\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
\b0\fs26 \cf0 \
\b What's new
\b0 \
- Download quota management\
- Windows: simple system tray menu\
- Multi-platform Growl support\
- NotifyOSD support for Linux distros that have it\
- Option to set maximum number of retries for servers (prevents deadlock)\
- Pre-download check to estimate completeness (reliability is limited)\
- Prevent partial downloading of par2 files that are not needed yet\
- Config->Special for settings previously only available in the sabnzbd.ini file\
- For Usenet servers with multiple IP addresses, pick a random one per connection\
- Add pseudo-priority "Stop" that will send the job immediately to the post-processing queue\
- Allow jobs still waiting for post-processing to be deleted too\
\
\b About
\b0 \
SABnzbd is an open-source cross-platform binary newsreader.\
It simplifies the process of downloading from Usenet dramatically,\
thanks to its friendly web-based user interface and advanced\
@@ -15,6 +33,8 @@ built-in post-processing options that automatically verify, repair,\
extract and clean up posts downloaded from Usenet.\
SABnzbd also has a fully customizable user interface,\
and offers a complete API for third-party applications to hook into.\
\
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>\
\
There is an extensive Wiki on the use of SABnzbd.\
{\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/"}}{\fldrslt http://wiki.sabnzbd.org/}}\
@@ -27,9 +47,7 @@ There is an extensive Wiki on the use of SABnzbd.\
\b Known problems and solutions\
\b0 Read the file
\b
\b0 "ISSUES.txt"
\b0 Read the file"ISSUES.txt"
\b \
\b0 \

View File

@@ -1,63 +1,24 @@
*******************************************
*** This is SABnzbd 0.6.3 ***
*******************************************
SABnzbd is an open-source cross-platform binary newsreader.
It simplifies the process of downloading from Usenet dramatically,
thanks to its friendly web-based user interface and advanced
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.
************************ SABnzbd 0.7.0Alpha1 ************************
There is an extensive Wiki on the use of SABnzbd.
http://wiki.sabnzbd.org/
What's new:
IMPORTANT INFORMATION about release 0.6.0:
http://wiki.sabnzbd.org/introducing-0-6-0
- Download quota management
- Windows: simple system tray menu
- Multi-platform Growl support
- NotifyOSD support for Linux distros that have it
- Option to set maximum number of retries for servers (prevents deadlock)
- Pre-download check to estimate completeness (reliability is limited)
- Prevent partial downloading of par2 files that are not needed yet
- Config->Special for settings previously only available in the sabnzbd.ini file
- For Usenet servers with multiple IP addresses, pick a random one per connection
- Add pseudo-priority "Stop" that will send the job immediately to the post-processing queue
- Allow jobs still waiting for post-processing to be deleted too
About:
SABnzbd is an open-source cross-platform binary newsreader.
It simplifies the process of downloading from Usenet dramatically,
thanks to its friendly web-based user interface and advanced
built-in post-processing options that automatically verify, repair,
extract and clean up posts downloaded from Usenet.
Please also read the file "ISSUES.txt"
*******************************************
*** Upgrading from 0.6.x ***
*******************************************
Stop SABnzbd.
Install new version
Start SABnzbd.
*******************************************
*** Upgrading from 0.5.x ***
*******************************************
Stop SABnzbd.
Uninstall current version, keeping the data.
Install new version
Start SABnzbd.
The organization of the download queue is different from 0.5.x.
0.6.x will finish downloading an existing queue, but you
cannot go back to an older version without losing your queue.
Also, your sabnzbd.ini file will be upgraded, making it
incompatible with release 0.5.x
*******************************************
*** Upgrading from 0.4.x ***
*******************************************
>>>>> PLEASE DOWNLOAD YOUR CURRENT QUEUE BEFORE UPGRADING <<<<<<
When upgrading from a 0.4.x release such as 0.4.12 your old settings will be kept.
You will however be given a fresh queue and history. If you have items in your queue
from the older version of SABnzbd, you can either re-import the nzb files if you kept
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.
*******************************************
*** Changes since 0.5.6 ***
*******************************************
See: http://wiki.sabnzbd.org/introducing-0-6-0
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>

View File

@@ -37,7 +37,7 @@ except ValueError:
print "Sorry, requires Python module Cheetah 2.0rc7 or higher."
sys.exit(1)
except:
print "The following modules need to be installed: Cheetah, cherrypy(included, unpack the zip)"
print "The Python module Cheetah is required"
sys.exit(1)
import cherrypy
@@ -62,21 +62,23 @@ except:
else:
SQLITE_DLL = False
import sabnzbd.lang
import sabnzbd
import sabnzbd.lang
import sabnzbd.interface
from sabnzbd.constants import *
import sabnzbd.newsunpack
from sabnzbd.misc import get_user_shellfolders, launch_a_browser, real_path, \
check_latest_version, panic_tmpl, panic_port, panic_host, panic_fwall, panic_sqlite, panic, exit_sab, \
panic_xport, notify, split_host, get_ext, create_https_certificates, \
from sabnzbd.misc import get_user_shellfolders, real_path, \
check_latest_version, exit_sab, \
split_host, get_ext, create_https_certificates, \
windows_variant, ip_extract, set_serv_parms, get_serv_parms, globber
from sabnzbd.panic import panic_tmpl, panic_port, panic_host, panic_fwall, \
panic_sqlite, panic, launch_a_browser, panic_xport
import sabnzbd.scheduler as scheduler
import sabnzbd.config as config
import sabnzbd.cfg
import sabnzbd.downloader
from sabnzbd.encoding import unicoder
from sabnzbd.utils import osx
from sabnzbd.encoding import unicoder, latin1
import sabnzbd.growler as growler
from threading import Thread
@@ -229,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) [*]"
@@ -249,6 +251,7 @@ def print_help():
print " with full data reconstruction"
print " --https <port> Port to use for HTTPS server"
print " --log-all Log all article handling (for developers)"
print " --console Force console logging for OSX app"
print " --new Run a new instance of SABnzbd"
def print_version():
@@ -318,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 ''
@@ -328,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)
@@ -357,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
@@ -489,6 +499,31 @@ def print_modules():
logging.info("pyOpenSSL... NOT found - try apt-get install python-pyopenssl (SSL is optional)")
#------------------------------------------------------------------------------
def all_localhosts():
""" Return all unique values of localhost in order of preference """
ips = ['127.0.0.1']
try:
# Check whether IPv6 is available and enabled
info = socket.getaddrinfo('::1', None)
af, socktype, proto, canonname, sa = info[0]
s = socket.socket(af, socktype, proto)
s.close()
except socket.error:
return ips
try:
info = socket.getaddrinfo('localhost', None)
except:
# localhost does not resolve
return ips
ips = []
for item in info:
item = item[4][0]
if item not in ips:
ips.append(item)
return ips
#------------------------------------------------------------------------------
def get_webhost(cherryhost, cherryport, https_port):
""" Determine the webhost address and port,
@@ -602,7 +637,7 @@ def get_webhost(cherryhost, cherryport, https_port):
# if the https port was specified, assume they want HTTPS enabling also
sabnzbd.cfg.enable_https.set(True)
if cherryport == https_port:
if cherryport == https_port and sabnzbd.cfg.enable_https():
sabnzbd.cfg.enable_https.set(False)
# Should have a translated message, but that's not available yet
#logging.error(Ta('HTTP and HTTPS ports cannot be the same'))
@@ -611,6 +646,18 @@ def get_webhost(cherryhost, cherryport, https_port):
return cherryhost, cherryport, browserhost, https_port
def attach_server(host, port, cert=None, key=None):
""" Define and attach server, optionally HTTPS
"""
http_server = _cpwsgi_server.CPWSGIServer()
http_server.bind_addr = (host, port)
if cert and key:
http_server.ssl_certificate = cert
http_server.ssl_private_key = key
adapter = _cpserver.ServerAdapter(cherrypy.engine, http_server, http_server.bind_addr)
adapter.subscribe()
def is_sabnzbd_running(url):
""" Return True when there's already a SABnzbd instance running.
"""
@@ -639,9 +686,12 @@ def find_free_port(host, currentport):
return 0
def check_for_sabnzbd(url, upload_nzbs):
def check_for_sabnzbd(url, upload_nzbs, allow_browser=True):
""" Check for a running instance of sabnzbd(same version) on this port
allow_browser==True|None will launch the browser, False will not.
"""
if allow_browser is None:
allow_browser = True
if is_sabnzbd_running(url):
# Upload any specified nzb files to the running instance
if upload_nzbs:
@@ -650,8 +700,9 @@ def check_for_sabnzbd(url, upload_nzbs):
upload_file(url, f)
else:
# Launch the web browser and quit since sabnzbd is already running
# Trim away everything after the final slash in the URL
url = url[:url.rfind('/')+1]
launch_a_browser(url, force=True)
launch_a_browser(url, force=allow_browser)
exit_sab(0)
return True
return False
@@ -742,6 +793,12 @@ def commandline_handler(frozen=True):
serv_opts = [os.path.normpath(os.path.abspath(sys.argv[0]))]
upload_nzbs = []
# OSX binary: get rid of the weird -psn_0_123456 parameter
for arg in sys.argv:
if arg.startswith('-psn_'):
sys.argv.remove(arg)
break
# Ugly hack to remove the extra "SABnzbd*" parameter the Windows binary
# gets when it's restarted
if len(sys.argv) > 1 and \
@@ -761,7 +818,7 @@ def commandline_handler(frozen=True):
'weblogging=', 'server=', 'templates',
'template2', 'browser=', 'config-file=', 'force',
'version', 'https=', 'autorestarted', 'repair', 'repair-all',
'log-all', 'no-login', 'pid=', 'new',
'log-all', 'no-login', 'pid=', 'new', 'sessions', 'console',
# Below Win32 Service options
'password=', 'username=', 'startup=', 'perfmonini=', 'perfmondll=',
'interactive', 'wait=',
@@ -808,6 +865,7 @@ def get_f_option(opts):
#------------------------------------------------------------------------------
def main():
global LOG_FLAG
import sabnzbd # Due to ApplePython bug
autobrowser = None
autorestarted = False
@@ -833,6 +891,8 @@ def main():
re_argv = [sys.argv[0]]
pid_path = None
new_instance = False
force_sessions = False
osx_console = False
service, sab_opts, serv_opts, upload_nzbs = commandline_handler()
@@ -881,8 +941,8 @@ def main():
try:
logging_level = int(arg)
except:
logging_level = -1
if logging_level < 0 or logging_level > 2:
logging_level = -2
if logging_level < -1 or logging_level > 2:
print_help()
exit_sab(1)
elif opt in ('-v', '--version'):
@@ -913,6 +973,12 @@ def main():
re_argv.append(arg)
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)
@@ -930,11 +996,11 @@ def main():
consoleLogging = consoleLogging and not sabnzbd.DAEMON
# No console logging needed for OSX app
noConsoleLoggingOSX = (sabnzbd.DIR_PROG.find('.app/Contents/Resources') > 0)
noConsoleLoggingOSX = (not osx_console) and (sabnzbd.DIR_PROG.find('.app/Contents/Resources') > 0)
if noConsoleLoggingOSX:
consoleLogging = 1
LOGLEVELS = (logging.WARNING, logging.INFO, logging.DEBUG)
LOGLEVELS = (logging.FATAL, logging.WARNING, logging.INFO, logging.DEBUG)
# Setup primary logging to prevent default console logging
gui_log = guiHandler(MAX_WARNINGS)
@@ -951,6 +1017,8 @@ def main():
# Detect Windows variant
if sabnzbd.WIN32:
vista_plus, vista64 = windows_variant()
sabnzbd.WIN64 = vista64
if not SQLITE_DLL:
panic_sqlite(sabnzbd.MY_FULLNAME)
@@ -1020,7 +1088,7 @@ def main():
url = None
if sabnzbd.WIN32 and not new_instance:
url = get_connection_info()
if url and check_for_sabnzbd(url, upload_nzbs):
if url and check_for_sabnzbd(url, upload_nzbs, autobrowser):
exit_sab(0)
# If an instance of sabnzbd(same version) is already running on this port, launch the browser
@@ -1038,7 +1106,7 @@ def main():
else:
if not url:
url = 'https://%s:%s/sabnzbd/api?' % (browserhost, port)
if new_instance or not check_for_sabnzbd(url, upload_nzbs):
if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser):
newport = find_free_port(browserhost, port)
if newport > 0:
sabnzbd.cfg.https_port.set(newport)
@@ -1058,7 +1126,7 @@ def main():
else:
if not url:
url = 'http://%s:%s/sabnzbd/api?' % (browserhost, cherryport)
if new_instance or not check_for_sabnzbd(url, upload_nzbs):
if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser):
port = find_free_port(browserhost, cherryport)
if port > 0:
sabnzbd.cfg.cherryport.set(port)
@@ -1117,7 +1185,7 @@ def main():
rollover_log.addFilter(FilterCP3())
sabnzbd.LOGHANDLER = rollover_log
logger.addHandler(rollover_log)
logger.setLevel(LOGLEVELS[logging_level])
logger.setLevel(LOGLEVELS[logging_level+1])
except IOError:
print "Error:"
@@ -1145,7 +1213,7 @@ def main():
if consoleLogging:
console = logging.StreamHandler()
console.addFilter(FilterCP3())
console.setLevel(LOGLEVELS[logging_level])
console.setLevel(LOGLEVELS[logging_level+1])
console.setFormatter(logging.Formatter(format))
logger.addHandler(console)
if noConsoleLoggingOSX:
@@ -1164,7 +1232,6 @@ def main():
suffix = ' (=Vista+)'
if vista64:
suffix = ' (=Vista+ x64)'
sabnzbd.WIN64 = True
try:
logging.info('Platform=%s%s Class=%s', platform.platform(), suffix, os.name)
except:
@@ -1172,6 +1239,7 @@ def main():
else:
logging.info('Platform = %s', os.name)
logging.info('Python-version = %s', sys.version)
logging.info('Arguments = %s', sabnzbd.CMDLINE)
# OSX 10.5 I/O priority setting
if sabnzbd.DARWIN:
@@ -1206,12 +1274,14 @@ def main():
web_dir = Web_Template(sabnzbd.cfg.web_dir, DEF_STDINTF, fix_webname(web_dir))
web_dir2 = Web_Template(sabnzbd.cfg.web_dir2, '', fix_webname(web_dir2))
web_dirc = Web_Template(None, DEF_STDCONFIG, '')
wizard_dir = os.path.join(sabnzbd.DIR_INTERFACES, 'wizard')
#sabnzbd.lang.install_language(os.path.join(wizard_dir, DEF_INT_LANGUAGE), sabnzbd.cfg.language(), 'wizard')
sabnzbd.WEB_DIR = web_dir
sabnzbd.WEB_DIR2 = web_dir2
sabnzbd.WEB_DIRC = web_dirc
sabnzbd.WIZARD_DIR = wizard_dir
sabnzbd.WEB_COLOR = CheckColor(sabnzbd.cfg.web_color(), web_dir)
@@ -1225,21 +1295,12 @@ def main():
# Save the INI file
config.save_config(force=True)
logging.info('Starting %s-%s', sabnzbd.MY_NAME, sabnzbd.__version__)
try:
sabnzbd.start()
except:
logging.exception("Failed to start %s-%s", sabnzbd.MY_NAME, sabnzbd.__version__)
sabnzbd.halt()
if sabnzbd.WIN32 and sabnzbd.cfg.win_menu() and not sabnzbd.DAEMON:
import sabnzbd.sabtray
sabnzbd.WINTRAY = sabnzbd.sabtray.SABTrayThread()
print_modules()
# Upload any nzb/zip/rar/nzb.gz files from file association
if upload_nzbs:
from sabnzbd.utils.upload import add_local
for f in upload_nzbs:
add_local(f)
cherrylogtoscreen = False
sabnzbd.WEBLOGFILE = None
@@ -1268,23 +1329,51 @@ 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('')
sabnzbd.cfg.password.set('')
# Fix leakage in memory-based CherryPy session support by using file-based.
# However, we don't really need session support.
if force_sessions:
sessions = sabnzbd.misc.create_real_path('sessions', sabnzbd.cfg.admin_dir.get_path(), 'sessions')[1]
sabnzbd.misc.remove_all(sessions, 'session-*.lock', keep_folder=True)
else:
sessions = None
cherrypy.config.update({'server.environment': 'production',
'server.socket_host': cherryhost,
'server.socket_port': cherryport,
@@ -1294,14 +1383,21 @@ def main():
'engine.reexec_retry' : 100,
'tools.encode.on' : True,
'tools.gzip.on' : True,
'tools.sessions.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.misc.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},
@@ -1316,6 +1412,9 @@ def main():
'/sabnzbd/wizard/static': wizard_static,
'/wizard/static': wizard_static
}
if web_dirc:
appconfig['/sabnzbd/staticcfg'] = staticcfg
appconfig['/staticcfg'] = staticcfg
if web_dir2:
static2 = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(web_dir2, 'static')}
@@ -1326,8 +1425,11 @@ def main():
appconfig['/m/static'] = static2
appconfig['/sabnzbd/m/wizard/static'] = wizard_static
appconfig['/m/wizard/static'] = wizard_static
if web_dirc:
appconfig['/sabnzbd/m/staticcfg'] = staticcfg
appconfig['/m/staticcfg'] = staticcfg
login_page = sabnzbd.interface.MainPage(web_dir, '/', web_dir2, '/m/', first=2)
login_page = sabnzbd.interface.MainPage(web_dir, '/', web_dir2, '/m/', web_dirc, first=2)
cherrypy.tree.mount(login_page, '/', config=appconfig)
# Set authentication for CherryPy
@@ -1362,20 +1464,22 @@ 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:
launch_a_browser(browser_url)
notify("SAB_Launched", None)
osx.sendGrowlMsg('SABnzbd %s' % (sabnzbd.__version__),"http://%s:%s/sabnzbd" % (browserhost, cherryport),osx.NOTIFICATION['startup'])
if sabnzbd.FOUNDATION:
import sabnzbd.osxmenu
sabnzbd.osxmenu.notify("SAB_Launched", None)
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:
@@ -1399,6 +1503,20 @@ def main():
if pid_path:
sabnzbd.pid_file(pid_path, cherryport)
# Start all SABnzbd tasks
logging.info('Starting %s-%s', sabnzbd.MY_NAME, sabnzbd.__version__)
try:
sabnzbd.start()
except:
logging.exception("Failed to start %s-%s", sabnzbd.MY_NAME, sabnzbd.__version__)
sabnzbd.halt()
# Upload any nzb/zip/rar/nzb.gz files from file association
if upload_nzbs:
from sabnzbd.utils.upload import add_local
for f in upload_nzbs:
add_local(f)
# Have to keep this running, otherwise logging will terminate
timer = 0
while not sabnzbd.SABSTOP:
@@ -1418,7 +1536,7 @@ def main():
# Check for loglevel changes
if LOG_FLAG:
LOG_FLAG = False
level = LOGLEVELS[sabnzbd.cfg.log_level()]
level = LOGLEVELS[sabnzbd.cfg.log_level()+1]
logger.setLevel(level)
if consoleLogging:
console.setLevel(level)
@@ -1484,11 +1602,14 @@ def main():
config.save_config()
if sabnzbd.WINTRAY:
sabnzbd.WINTRAY.terminate = True
if sabnzbd.WIN_SERVICE and mail:
mail.send('stop')
if sabnzbd.WIN32:
del_connection_info()
notify("SAB_Shutdown", None)
if sabnzbd.FOUNDATION: sabnzbd.osxmenu.notify("SAB_Shutdown", None)
logging.info('Leaving SABnzbd')
sys.stderr.flush()
sys.stdout.flush()
@@ -1496,8 +1617,7 @@ def main():
if getattr(sys, 'frozen', None) == 'macosx_app':
AppHelper.stopEventLoop()
else:
if sabnzbd.DARWIN:
osx.sendGrowlMsg('SABnzbd',T('SABnzbd shutdown finished'),osx.NOTIFICATION['startup'])
growler.send_notification('SABnzbd',T('SABnzbd shutdown finished'), 'startup')
os._exit(0)
@@ -1620,6 +1740,15 @@ def HandleCommandLine(allow_service=True):
#
if __name__ == '__main__':
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")):
main()

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

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View File

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 281 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,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_opt_only" value="1" <!--#if $max_opt_only > 0 then "checked=1" else ""#--> /> <strong>$T('opt-max_opt_only')</strong></label><br>
$T('explain-max_opt_only')<br>
<br>
<label><input type="checkbox" name="auto_disconnect" value="1" <!--#if $auto_disconnect > 0 then "checked=1" else ""#--> /> <strong>$T('opt-auto_disconnect')</strong></label><br>
$T('explain-auto_disconnect')<br>
<br>
@@ -146,6 +156,32 @@
</select>
<br/>
</fieldset>
<fieldset class="EntryFieldSet">
<strong>$T('opt-quota_size'):</strong><br/>
$T('explain-quota_size')<br/>
<input type="text" name="quota_size" value="$quota_size"/>
<br>
<br>
<strong>$T('opt-quota_period'):</strong><br>
$T('explain-quota_period')<br>
<select name="ssl_type">
<option value="m" <!--#if $quota_period == 'm' then 'selected' else ''#--> >$T('month')</option>
<option value="w" <!--#if $quota_period == 'w' then 'selected' else ''#--> >$T('week')</option>
<option value="d" <!--#if $quota_period == 'd' then 'selected' else ''#--> >$T('day')</option>
<option value="x" <!--#if $quota_period == 'x' then 'selected' else ''#--> >$T('manual')</option>
</select>
<br/><br/>
<strong>$T('opt-quota_day'):</strong><br/>
$T('explain-quota_day')<br/>
<input type="text" name="quota_day" value="$quota_day"/>
<br>
<br>
<legend>$T('swtag-quota')</legend>
<label><input type="checkbox" name="quota_resume" value="1" <!--#if $quota_resume > 0 then "checked=1" else ""#--> /> <strong>$T('opt-quota_resume')</strong></label><br>
$T('explain-quota_resume')<br>
<br/>
</fieldset>
</div>
<p><input type="submit" value="$T('button-saveChanges')"></p>
</form>

View File

@@ -6,6 +6,7 @@
<span class="SubMenu">
<a href="./purge?session=$session" onclick="return confirm('$T('purgeHistConf').replace("'","`") ');">$T('purgeHist')</a> |
<a href="./purge_failed?session=$session" onclick="return confirm('$T('purgeHistFailedConf').replace("'","`") ');">$T('purgeHistFailed')</a> |
<a href="./purge_failed?session=$session&del_files=1" onclick="return confirm('$T('purgeFailed-Files').replace("'","`") ');">$T('purgeFailed-Files')</a> |
<!--#if $isverbose#-->
<a href="./tog_verbose?session=$session">$T('hideDetails')</a> |
<!--#else#-->

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

@@ -1,11 +1,14 @@
<!--#set global $have_refresh=5#-->
<!--#set global $topmenu="connections"#-->
<!--#set global $statpath=".."#-->
<!--#set global $helpsubject="GUI+Connections"#-->
<!--#set global $helpsubject="GUI+Status-0-7"#-->
<!--#include $webdir + "/inc_top.tmpl"#-->
<span class="SubMenu">
<!--#set $msg=$T('askTestEmail')#-->
<!--#if $have_quota#-->
<a href="./reset_quota?session=$session">$T('link-resetQuota')</a> |
<!--#end if#-->
<a href="./disconnect?session=$session">$T('link-forceDisc')</a> |
<a href="./showlog?session=$session">$T('link-showLog')</a>
$T('logging'):

1
interfaces/Config Submodule

Submodule interfaces/Config added at 7a74d43c4f

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

@@ -16,7 +16,7 @@
<div id="plush_options_modal">
<p><a href="connections/disconnect?session=$session" class="juiButton">$T('link-forceDisc')</a></p>
<p><a href="status/disconnect?session=$session" class="juiButton">$T('link-forceDisc')</a></p>
<p><a href="config/restart?session=$session" class="juiButton" id="sabnzbd_restart" rel="#echo $T('explain-Restart').replace("<br />","\n")#">$T('sch-restart')</a>
<a href="shutdown?session=$session" class="juiButton" id="sabnzbd_shutdown" rel="$T('shutdownOK?')">$T('sch-shutdown')</a></p>
<br/>

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>

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Scheduling"#-->
<!--#set global $help_uri="Configure+Scheduling+V2"#-->
<!--#set global $help_uri="Configure+Scheduling-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<%

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Servers"#-->
<!--#set global $help_uri="Configure+Servers+V2"#-->
<!--#set global $help_uri="Configure+Servers-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<div id="config-components">
@@ -118,6 +118,8 @@
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<br/><br/>
<input type="button" class="juiButton delServer" style="padding:4px;" value="$T('button-delServer')" rel="$T('Plush-confirm') "/>
<br/><br/>
<input type="button" class="juiButton clrServer" style="padding:4px;" value="$T('button-clrServer')" rel="$T('Plush-confirm') "/>
</p>
<!--#if 'amounts' in $servers[$server]#-->

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Sorting"#-->
<!--#set global $help_uri="Configure+Sorting"#-->
<!--#set global $help_uri="Configure+Sorting-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<script type="text/javascript">
@@ -244,16 +244,29 @@ function showDiv(id)
</tr></thead>
<tr>
<td align="right"><strong>$T('show-name'):</strong></td>
<td>%sn</td>
<td>%sN</td>
<td>$T('show-sp-name')</td>
</tr><tr>
<td></td>
<td>%s.n</td>
<td>%s.N</td>
<td>$T('show-dot-name')</td>
</tr><tr>
<td></td>
<td>%s_n</td>
<td>%s_N</td>
<td>$T('show-us-name')</td>
</tr><tr>
<tr>
<td></td>
<td>%sn</td>
<td>$T('show-sp-name') ($T('case-adjusted'))</td>
</tr><tr>
<td></td>
<td>%s.n</td>
<td>$T('show-dot-name') ($T('case-adjusted'))</td>
</tr><tr>
<td></td>
<td>%s_n</td>
<td>$T('show-us-name') ($T('case-adjusted'))</td>
</tr><tr>
<td align="right"><strong>$T('show-seasonNum'):</strong></td>
<td>%s</td>

View File

@@ -0,0 +1,66 @@
<!--#set global $pane="Specials"#-->
<!--#set global $help_uri="Configure+Special-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<form action="saveSpecial" method="post" name="fullform" id="fullform">
<input type="hidden" name="session" id="session" value="$session">
<div id="config-components">
<p><br>
&nbsp;&nbsp;$T('explain-special')
</p>
<div id="core-component-group1" class="component-group clearfix">
<div class="component-group-desc">
<h3>$T('sptag-boolean')</h3>
</div>
<fieldset class="component-group-list">
<!--#for $option in $switches#-->
<div class="field-pair">
<input type="checkbox" name="$option[0]" id="$option[0]" value="1" <!--#if $option[1] > 0 then "checked=1" else ""#--> />
<label class="clearfix" for="$option[0]">
<span class="component-title">$option[0] (<!--#if $option[2] then $T('on') else $T('off')#-->)</span>
</label>
</div>
<!--#end for#-->
</fieldset>
</div><!-- /component-group1 -->
<div id="core-component-group2" class="component-group clearfix">
<div class="component-group-desc">
<h3>$T('sptag-entries')</h3>
</div>
<fieldset class="component-group-list">
<!--#for $option in $entries#-->
<div class="field-pair">
<label class="nocheck clearfix" for="$option[0]">
<span class="component-title">$option[0] ($option[2])</span>
<input type="text" name="$option[0]" id="$option[0]" value="$option[1]"/>
</label>
</div>
<!--#end for#-->
</fieldset>
</div><!-- /component-group1 -->
<div class="component-group-last clearfix">
<div class="component-group-desc">
<h3>&nbsp;</h3>
</div>
<fieldset class="component-group-list">
<div class="left_links">
<a id="save"><span class="config_sprite_container sprite_config_save">&nbsp;</span> $T('button-saveChanges')</a>
</div>
</fieldset>
</div><!-- /component-group -->
</div><!-- /config-components -->
</form>
<!--#include $webdir + "/_inc_footer.tmpl"#-->

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Switches"#-->
<!--#set global $help_uri="Configure+Switches+V3"#-->
<!--#set global $help_uri="Configure+Switches-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<form action="saveSwitches" method="post" name="fullform" id="fullform">
@@ -35,7 +35,7 @@
</label>
</div>
<!--#end if#-->
</fieldset>
</fieldset>
</div><!-- /component-group1 -->
<div id="core-component-group2" class="component-group clearfix">
@@ -43,6 +43,23 @@
<h3>$T('swtag-server')</h3>
</div>
<fieldset class="component-group-list">
<div class="field-pair">
<label class="nocheck clearfix" for="max_art_tries">
<span class="component-title">$T('opt-max_art_tries')</span>
<input type="text" size="10" name="max_art_tries" id="max_art_tries" value="$max_art_tries" />
</label>
<label class="nocheck clearfix">
<span class="component-title">&nbsp;</span>
<span class="component-desc">$T('explain-max_art_tries')</span>
</label>
</div>
<div class="field-pair alt">
<input type="checkbox" name="max_opt_only" id="max_opt_only" value="1" <!--#if $max_opt_only > 0 then "checked=1" else ""#--> />
<label class="clearfix" for="max_opt_only">
<span class="component-title">$T('opt-max_opt_only')</span>
<span class="component-desc">$T('explain-max_opt_only')</span>
</label>
</div>
<div class="field-pair">
<input type="checkbox" name="auto_disconnect" id="auto_disconnect" value="1" <!--#if $auto_disconnect > 0 then "checked=1" else ""#--> />
<label class="clearfix" for="auto_disconnect">
@@ -79,6 +96,13 @@
<h3>$T('swtag-queue')</h3>
</div>
<fieldset class="component-group-list">
<div class="field-pair alt">
<input type="checkbox" name="pre_check" id="pre_check" value="1" <!--#if $pre_check > 0 then "checked=1" else ""#--> />
<label class="clearfix" for="pre_check">
<span class="component-title">$T('opt-pre_check')</span>
<span class="component-desc">$T('explain-pre_check')</span>
</label>
</div>
<div class="field-pair">
<label class="nocheck clearfix" for="no_dupes">
<span class="component-title">$T('opt-no_dupes')</span>
@@ -311,6 +335,56 @@
</label>
</div>
</fieldset>
</div><!-- /component-group6 -->
<div id="core-component-group6" class="component-group clearfix">
<div class="component-group-desc">
<h3>$T('swtag-quota')</h3>
</div>
<fieldset class="component-group-list">
<div class="field-pair">
<label class="nocheck clearfix" for="quota_size">
<span class="component-title">$T('opt-quota_size')</span>
<input type="text" name="quota_size" id="quota_size" value="$quota_size"/>
</label>
<label class="nocheck clearfix">
<span class="component-title">&nbsp;</span>
<span class="component-desc">$T('explain-quota_size')</span>
</label>
</div>
<div class="field-pair alt">
<label class="nocheck clearfix" for="quota_period">
<span class="component-title">$T('opt-quota_period')</span>
<select name="quota_period" id="quota_period">
<option value="m" <!--#if $quota_period == "m" then 'selected' else ''#--> >$T('month')</option>
<option value="w" <!--#if $quota_period == "w" then 'selected' else ''#--> >$T('week')</option>
<option value="d" <!--#if $quota_period == "d" then 'selected' else ''#--> >$T('day')</option>
<option value="x" <!--#if $quota_period == "x" then 'selected' else ''#--> >$T('manual')</option>
</select>
</label>
<label class="nocheck clearfix">
<span class="component-title">&nbsp;</span>
<span class="component-desc">$T('explain-quota_period')</span>
</label>
</div>
<div class="field-pair">
<label class="nocheck clearfix" for="quota_day">
<span class="component-title">$T('opt-quota_day')</span>
<input type="text" name="quota_day" id="quota_day" value="$quota_day"/>
</label>
<label class="nocheck clearfix">
<span class="component-title">&nbsp;</span>
<span class="component-desc">$T('explain-quota_day')</span>
</label>
</div>
<div class="field-pair alt">
<input type="checkbox" name="quota_resume" id="quota_resume" value="1" <!--#if $quota_resume > 0 then "checked=1" else ""#--> />
<label class="clearfix" for="quota_resume">
<span class="component-title">$T('opt-quota_resume')</span>
<span class="component-desc">$T('explain-quota_resume')</span>
</label>
</div>
</fieldset>
</div><!-- /component-group5 -->
<div class="component-group-last clearfix">

View File

@@ -61,18 +61,14 @@
</td>
<td>
<!--#if $line.report #-->
<a href="https://www.newzbin.com/browse/post/$line.report/" target="_blank">
<div class="icon_history_verbose main_sprite_container sprite_hv_report pointer" title='$T('Plush-openSourceURL')<br><br>https://www.newzbin.com/browse/post/$line.report'>&nbsp;</div>
<a href="https://$newzbin_url/browse/post/$line.report/" target="_blank">
<div class="icon_history_verbose main_sprite_container sprite_hv_report pointer" title='$T('Plush-openSourceURL')<br><br>https://$newzbin_url/browse/post/$line.report'>&nbsp;</div>
</a>
<!--#else if $varExists('newzbinDetails')#-->
<div class="icon_history_verbose main_sprite_container sprite_hv_report hvFaded">&nbsp;</div>
<!--#end if#-->
<!--#if $line.url_info #-->
<a href="$line.url_info" target="_blank">
<div class="icon_history_verbose main_sprite_container sprite_hv_star pointer" title="$T('Plush-openInfoURL')<br><br>$line.url_info">&nbsp;</div>
</a>
<!--#else if $varExists('newzbinDetails')#-->
<div class="icon_history_verbose main_sprite_container sprite_hv_star hvFaded">&nbsp;</div>
<!--#end if#-->
<!--#if $line.size or $line.category or $line.path or $line.storage#-->
<div class="icon_history_verbose main_sprite_container sprite_hv_stats" title='<!--#if $line.size#-->$T('size'): $line.size<!--#end if#--><!--#if $line.category#--><br>$T('category'): $line.category<!--#end if#-->'>&nbsp;</div>
@@ -90,7 +86,9 @@
<!--#end for#-->
<!--#end if#-->
<!--#else#-->
<div class="icon_history_verbose main_sprite_container sprite_hv_$stage.name.lower()" title='<!--#for $action in $stage.actions#--><!--#echo $action.replace("'","&rsquo;") #--><br><!--#end for#-->'>&nbsp;</div>
<!--#if $stage.name != "Source"#-->
<div class="icon_history_verbose main_sprite_container sprite_hv_$stage.name.lower()" title='<!--#for $action in $stage.actions#--><!--#echo $action.replace("'","&rsquo;") #--><br><!--#end for#-->'>&nbsp;</div>
<!--#end if#-->
<!--#end if#-->
<!--#end for#-->
<!--#if $line.retry#-->

View File

@@ -25,6 +25,7 @@
<li class="main_sprite_container sprite_q_queue">
<a class="sf-with-ul">$T('menu-queue')</a>
<ul>
<!--#if $have_quota#--><li><a id="reset_quota_now" class="pointer">$T('link-resetQuota')</a></li><!--#end if#-->
<!--#if $varExists('newzbinDetails')#--><li><a id="get_bookmarks_now" class="pointer">$T('link-getBookmarks')</a></li><!--#end if#-->
<!--#if $have_rss_defined#--><li><a id="get_rss_now" class="pointer">$T('button-rssNow')</a></li><!--#end if#-->
<!--#if $have_watched_dir#--><li><a id="get_watched_now" class="pointer">$T('sch-scan_folder')</a></li><!--#end if#-->

View File

@@ -1,6 +1,3 @@
<% import locale %>
<% locale.setlocale(locale.LC_ALL, "") %>
<script type="text/javascript">
if (typeof( jQuery ) == 'undefined')
window.location = "../"; // redirect to main on direct template hit
@@ -15,6 +12,9 @@
// set lower-right queue stats
var stats = '';
<!--#if $have_quota#-->
stats += '<strong>$left_quota&nbsp;&nbsp;&frasl;&nbsp;&nbsp;$quota</strong>&nbsp;$T('quota-left')&nbsp;&nbsp;';
<!--#end if#-->
<!--#if $noofslots > 0#-->
stats += '<strong>$mbleft&nbsp;&nbsp;&frasl;&nbsp;&nbsp;$mb&nbsp;$T('MB')</strong>&nbsp;$T('Plush-remaining')';
<!--#end if#-->
@@ -62,14 +62,14 @@
<td>
<div class="main_sprite_container sprite_progressbar_bg">
<div class="main_sprite_container sprite_progress_done" style="background-position: -<!--#if $slot.mb == "0.00" then "120" else int(120 - 120.0 / 100.0 * int(100 - float($slot.mbleft) / float($slot.mb) * 100))#-->px -401px">
<div class="totalDownload"><!--#echo locale.format('%d', int(float($slot.mb)), True)#-->&nbsp;<small>$T('MB')</small></div>
<div class="currentDownload"><!--#if $slot.mb!=$slot.mbleft#--><!--#echo locale.format('%d', int(float($slot.mb)-float($slot.mbleft)), True)#-->&nbsp;<small>$T('MB')&nbsp;$T('AofB')</small><!--#end if#--></div>
<div class="totalDownload">$slot.mb_fmt&nbsp;<small>$T('MB')</small></div>
<div class="currentDownload"><!--#if $slot.mb!=$slot.mbleft#-->$slot.mbdone_fmt&nbsp;<small>$T('MB')&nbsp;$T('AofB')</small><!--#end if#--></div>
</div>
</div>
</td>
<td class="eta nowrap">
<!--#if not $paused and $slot.status != "Paused"#-->
<!--#if not $paused and $slot.status not in ("Paused", "Checking")#-->
<span title="$slot.eta">$slot.timeleft&nbsp;$T('Plush-left')</span>
<!--#else#-->
$T('post-'+$slot.status)
@@ -89,6 +89,7 @@
<option value="1" <!--#if $slot.priority == "High" then "selected" else ""#-->>$T('pr-high')</option>
<option value="0" <!--#if $slot.priority == "Normal" then "selected" else ""#-->>$T('pr-normal')</option>
<option value="-1" <!--#if $slot.priority == "Low" then "selected" else ""#-->>$T('pr-low')</option>
<option value="-4" <!--#if $slot.priority == "Stop" then "selected" else ""#-->>$T('pr-stop')</option>
</optgroup></select>
<select class="change_opts"><optgroup label="$T('pp')">
<option value="0" <!--#if $slot.unpackopts == "0" then "selected " else ""#-->>$T('pp-none')</option>

View File

@@ -25,6 +25,7 @@ jQuery(document).ready(function($){
$("#help").colorbox({ inline:true, href:"#help_modal", title:$("#help").text(),
innerWidth:"375px", innerHeight:"350px", initialWidth:"375px", initialHeight:"350px", speed:0, opacity:0.7
});
$(".show_qrcode").colorbox({ photo:true, innerHeight:"300px", innerWidth:"300px", speed:0, opacity: 0.7, scrolling:false });
// jqueryui tabs/buttons
$('.juiButton').button();
@@ -79,27 +80,27 @@ jQuery(document).ready(function($){
// selections
$("#nzo_select_all").click(function(){
$("INPUT[type='checkbox']").attr('checked', true).trigger('change');
$("INPUT[type='checkbox']").prop('checked', true).trigger('change');
});
var last1, last2;
$("#nzo_select_range").click(function(){
if (last1 && last2 && last1 < last2)
$("INPUT[type='checkbox']").slice(last1,last2).attr('checked', true).trigger('change');
$("INPUT[type='checkbox']").slice(last1,last2).prop('checked', true).trigger('change');
else if (last1 && last2)
$("INPUT[type='checkbox']").slice(last2,last1).attr('checked', true).trigger('change');
$("INPUT[type='checkbox']").slice(last2,last1).prop('checked', true).trigger('change');
});
$("#nzo_select_invert").click(function(){
$("INPUT[type='checkbox']").each( function() {
$(this).attr('checked', !$(this).attr('checked')).trigger('change');
$(this).prop('checked', !$(this).prop('checked')).trigger('change');
});
});
$("#nzo_select_none").click(function(){
$("INPUT[type='checkbox']").attr('checked', false).trigger('change');
$("INPUT[type='checkbox']").prop('checked', false).trigger('change');
});
// click filenames to select
$('#config_content .nzoTable .nzf_row').click(function(event) {
$('#box-'+$(event.target).parent().attr('id')).attr('checked', !$('#box-'+$(event.target).parent().attr('id')).attr('checked')).trigger('change');
$('#box-'+$(event.target).parent().attr('id')).prop('checked', !$('#box-'+$(event.target).parent().attr('id')).prop('checked')).trigger('change');
// range event interaction -- see further above
if (last1) last2 = last1;
@@ -108,7 +109,7 @@ jQuery(document).ready(function($){
//
$('#config_content .nzoTable .nzf_row input').change(function(e){
if ($(e.target).attr('checked'))
if ($(e.target).prop('checked'))
$(e.target).parent().parent().addClass("nzo_highlight");
else
$(e.target).parent().parent().removeClass("nzo_highlight");
@@ -121,7 +122,7 @@ jQuery(document).ready(function($){
break;
case 'Connections':
case 'Status':
$('#logging_level').change(function(event){
window.location = './change_loglevel?loglevel='+$(event.target).val()+'&session='+apikey;
});
@@ -178,6 +179,11 @@ jQuery(document).ready(function($){
$(event.target).parents('form:first').attr('action','delServer').submit();
return false;
});
$('form .clrServer').click(function(event){ // clear server
if(confirm($(event.target).attr('rel')))
$(event.target).parents('form:first').attr('action','clrServer').submit();
return false;
});
break;
case 'Categories':

View File

File diff suppressed because one or more lines are too long

View File

@@ -116,6 +116,20 @@ jQuery(function($){
function(){ $(this).removeClass('sprite_q_queuesfHover'); }
);
// fix for touch devices -- toggle visibility
$('.sprite_q_menu_pausefor').bind('touchend', function(e) {
e.preventDefault();
if( $(this).hasClass('sprite_q_menu_pauseforsfHover') ) {
$(this).find("ul").toggle();
}
});
$('.sprite_q_queue').bind('touchend', function(e) {
e.preventDefault();
if( $(this).hasClass('sprite_q_queuesfHover') ) {
$(this).find("ul").toggle();
}
});
// modals
$("#help").colorbox({ inline:true, href:"#help_modal", title:$("#help").text(),
innerWidth:"375px", innerHeight:"350px", initialWidth:"375px", initialHeight:"350px", speed:0, opacity:0.7
@@ -161,20 +175,20 @@ jQuery(function($){
}).trigger('change');
// Confirm Queue Deletions toggle
$("#confirmDeleteQueue").attr('checked', $.plush.confirmDeleteQueue ).change( function() {
$.plush.confirmDeleteQueue = $("#confirmDeleteQueue").attr('checked');
$("#confirmDeleteQueue").prop('checked', $.plush.confirmDeleteQueue ).change( function() {
$.plush.confirmDeleteQueue = $("#confirmDeleteQueue").prop('checked');
$.cookie('plushConfirmDeleteQueue', $.plush.confirmDeleteQueue ? 1 : 0, { expires: 365, path: '/' });
});
// Confirm History Deletions toggle
$("#confirmDeleteHistory").attr('checked', $.plush.confirmDeleteHistory ).change( function() {
$.plush.confirmDeleteHistory = $("#confirmDeleteHistory").attr('checked');
$("#confirmDeleteHistory").prop('checked', $.plush.confirmDeleteHistory ).change( function() {
$.plush.confirmDeleteHistory = $("#confirmDeleteHistory").prop('checked');
$.cookie('plushConfirmDeleteHistory', $.plush.confirmDeleteHistory ? 1 : 0, { expires: 365, path: '/' });
});
// Block Refreshes on Hover toggle
$("#blockRefresh").attr('checked', $.plush.blockRefresh ).change( function() {
$.plush.blockRefresh = $("#blockRefresh").attr('checked');
$("#blockRefresh").prop('checked', $.plush.blockRefresh ).change( function() {
$.plush.blockRefresh = $("#blockRefresh").prop('checked');
$.cookie('plushBlockRefresh', $.plush.blockRefresh ? 1 : 0, { expires: 365, path: '/' });
});
@@ -271,6 +285,16 @@ jQuery(function($){
});
});
// Reset Quota
$('#reset_quota_now').click(function() {
$.ajax({
type: "POST",
url: "tapi",
data: {mode:'reset_quota', apikey: $.plush.apikey},
success: $.plush.RefreshQueue
});
});
// Get RSS
$('#get_rss_now').click(function() {
$.ajax({
@@ -690,22 +714,22 @@ $.plush.queueprevslots = $.plush.queuenoofslots; // for the next refresh
// selections
$("#multiops_select_all").click(function(){
$("INPUT[type='checkbox']","#queueTable").attr('checked', true).trigger('change');
$("INPUT[type='checkbox']","#queueTable").prop('checked', true).trigger('change');
});
var last1, last2;
$("#multiops_select_range").click(function(){
if (last1 && last2 && last1 < last2)
$("INPUT[type='checkbox']","#queueTable").slice(last1,last2).attr('checked', true).trigger('change');
$("INPUT[type='checkbox']","#queueTable").slice(last1,last2).prop('checked', true).trigger('change');
else if (last1 && last2)
$("INPUT[type='checkbox']","#queueTable").slice(last2,last1).attr('checked', true).trigger('change');
$("INPUT[type='checkbox']","#queueTable").slice(last2,last1).prop('checked', true).trigger('change');
});
$("#multiops_select_invert").click(function(){
$("INPUT[type='checkbox']","#queueTable").each( function() {
$(this).attr('checked', !$(this).attr('checked')).trigger('change');
$(this).prop('checked', !$(this).prop('checked')).trigger('change');
});
});
$("#multiops_select_none").click(function(){
$("INPUT[type='checkbox']","#queueTable").attr('checked', false).trigger('change');
$("INPUT[type='checkbox']","#queueTable").prop('checked', false).trigger('change');
});
$("#queue").delegate('.multiops','change',function(event) {
// range event interaction
@@ -713,7 +737,7 @@ $.plush.queueprevslots = $.plush.queuenoofslots; // for the next refresh
last1 = $(event.target).parent()[0].rowIndex ? $(event.target).parent()[0].rowIndex : $(event.target).parent().parent()[0].rowIndex;
// checkbox state persistence
if ($(this).attr('checked'))
if ($(this).prop('checked'))
$.plush.multiOpsChecks[$(this).parent().parent().attr('id')] = true;
else if ($.plush.multiOpsChecks[$(this).parent().parent().attr('id')])
delete $.plush.multiOpsChecks[$(this).parent().parent().attr('id')];
@@ -740,7 +764,7 @@ $("a","#multiops_inputs").click(function(e){
nzo_ids = nzo_ids.substr(1);
if (!nzo_ids) return;
$(this).attr('disabled',true);
$(this).prop('disabled',true);
if ($('#multi_status').val())
$.ajax({
@@ -777,7 +801,7 @@ $("a","#multiops_inputs").click(function(e){
data: {mode: 'change_script', value: nzo_ids, value2: $('#multi_script').val(), apikey: $.plush.apikey}
});
$(this).attr('disabled',false);
$(this).prop('disabled',false);
$.plush.RefreshQueue();
});
@@ -908,10 +932,10 @@ $("a","#multiops_inputs").click(function(e){
$('#delete_nzb_modal_title').text( $(this).parent().prev().prev().children('a:first').text() );
$('#delete_nzb_modal_job').val( $(this).parent().parent().attr('id') );
$('#delete_nzb_modal_mode').val( 'history' );
if ($(this).parent().parent().children('td:first').children().hasClass('sprite_hv_error'))
$('#delete_nzb_modal_remove_files').button('enable');
else
if ($(this).parent().parent().children('td:first').children().hasClass('sprite_hv_star'))
$('#delete_nzb_modal_remove_files').button('disable');
else
$('#delete_nzb_modal_remove_files').button('enable');
$.colorbox({ inline:true, href:"#delete_nzb_modal", title:$(this).text(),
innerWidth:"600px", innerHeight:"150px", initialWidth:"600px", initialHeight:"150px", speed:0, opacity:0.7
});
@@ -1073,7 +1097,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
$('<input type="checkbox" class="multiops" />').appendTo('#queue tr td.nzb_status_col');
if ($.plush.multiOpsChecks) // checkbox state persistence
for (var nzo_id in $.plush.multiOpsChecks)
$('#'+nzo_id+' .multiops').attr('checked',true);
$('#'+nzo_id+' .multiops').prop('checked',true);
$('#queue-pagination span').removeClass('loading'); // Remove spinner graphic from pagination

View File

@@ -287,7 +287,7 @@ body {
}
.navigation ul li a {
color:#fff;
color:#efefef;
font-weight:bold;
display: block;
padding: 0 8px 0 0;
@@ -297,9 +297,10 @@ body {
line-height: 25px;
background-color:#363636;
/* background : -webkit-gradient(linear, right top, right bottom, from(rgb(168,168,168)), to(rgb(69,69,69)));
background : -moz-linear-gradient(top, rgb(168,168,168), rgb(69,69,69)); */
background : -moz-linear-gradient(top, rgb(168,168,168), rgb(69,69,69));
-webkit-transition-property: background;
-webkit-transition-duration: 700ms;
*/
-moz-transition-property: background;
-moz-transition-duration: 700ms;
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 B

After

Width:  |  Height:  |  Size: 129 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

After

Width:  |  Height:  |  Size: 142 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -1,5 +1,5 @@
/*
* jQuery UI CSS Framework 1.8.9
* jQuery UI CSS Framework 1.8.15
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -42,7 +42,7 @@
/*
* jQuery UI CSS Framework 1.8.9
* jQuery UI CSS Framework 1.8.15
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -280,20 +280,44 @@
----------------------------------*/
/* Corner radius */
.ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; }
.ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
.ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
.ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
.ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
.ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
.ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
.ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
.ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; }
.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; }
.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; }
.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
/* Overlays */
.ui-widget-overlay { background: #eeeeee url(images/ui-bg_flat_0_eeeeee_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); }
.ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0pxdow=0px; -webkit-border-radius: 0pxdow=0px; border-radius: 0pxdow=0px; }/*
* jQuery UI Button 1.8.9
.ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0pxdow=0px; -khtml-border-radius: 0pxdow=0px; -webkit-border-radius: 0pxdow=0px; border-radius: 0pxdow=0px; }/*
* jQuery UI Resizable 1.8.15
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Resizable#theming
*/
.ui-resizable { position: relative;}
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
* jQuery UI Selectable 1.8.15
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Selectable#theming
*/
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
/*
* jQuery UI Button 1.8.15
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -331,7 +355,28 @@ input.ui-button { padding: .4em 1em; }
/* workarounds */
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
/*
* jQuery UI Tabs 1.8.9
* jQuery UI Dialog 1.8.15
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Dialog#theming
*/
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }
/*
* jQuery UI Tabs 1.8.15
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Connections"#-->
<!--#set global $help_uri="GUI+Connections"#-->
<!--#set global $pane="Status"#-->
<!--#set global $help_uri="GUI+Status-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<div class="tabs">

View File

@@ -1,4 +1,4 @@
<a href="${helpuri}configure-categories" id="help" target="_blank">$T('menu-help')</a>
<a href="${helpuri}configure-categories-0-7" id="help" target="_blank">$T('menu-help')</a>
<h3>$T('configCat')</h3>
<br/>
$T('explain-configCat')<br/>
@@ -61,7 +61,8 @@ $T('explain-relFolder') $defdir<br/>
<option value="2" <!--#if $slot.priority == 2 then "selected" else ""#-->>$T('pr-force')</option>
<option value="1" <!--#if $slot.priority == 1 then "selected" else ""#-->>$T('pr-high')</option>
<option value="0" <!--#if $slot.priority == 0 then "selected" else ""#-->>$T('pr-normal')</option>
<option value="-1" <!--#if $slot.priority == -1 then "selected" else ""#-->>$T('pr-low')</option>>
<option value="-1" <!--#if $slot.priority == -1 then "selected" else ""#-->>$T('pr-low')</option>
<option value="-2" <!--#if $slot.priority == -2 then "selected" else ""#-->>$T('pr-paused')</option>
</optgroup>
</select>
</td>

View File

@@ -1,7 +1,7 @@
<a href="${helpuri}Configure+Directories+V2" id="help" target="_blank">$T('menu-help')</a>
<a href="${helpuri}Configure+Folders-0-7" id="help" target="_blank">$T('menu-help')</a>
<h3>$T('folderConfig')</h3>
<!--action="config/directories/saveDirectories" method="post"-->
<!--action="config/folders/saveDirectories" method="post"-->
<form id="configFolders" class="cmxform" action="">
<div class="EntryBlock">
<fieldset class="EntryFieldSet">
@@ -85,7 +85,7 @@ $T('systemFolders')<br />
</div><br class="clear" />
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/directories/saveDirectories', this, 'configFolders')">
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/folders/saveDirectories', this, 'configFolders')">
</form>

View File

@@ -1,5 +1,5 @@
<a href="${helpuri}Configure+General+V2" id="help" target="_blank">$T('menu-help')</a><h3>$T('generalConfig')</h3>
<a href="${helpuri}Configure+General-0-7" id="help" target="_blank">$T('menu-help')</a><h3>$T('generalConfig')</h3>
<form class="cmxform" id="configGeneral" autocomplete="off">
<fieldset class="EntryFieldSet">

View File

@@ -1,4 +1,4 @@
<a href="${helpuri}Configure+Index+Sites" id="help" target="_blank">$T('menu-help')</a><h3>Newzbin</h3>
<a href="${helpuri}Configure+Indexers-0-7" id="help" target="_blank">$T('menu-help')</a><h3>Newzbin</h3>
<form id="configNewzbin" class="cmxform" autocomplete="off">
$T('explain-newzbin')<br/>
@@ -44,9 +44,9 @@ $T('explain-newzbin')<br/>
<a class="config" onClick="getBookmarks();">$T('link-getBookmarks')</a>
<!--#if $bookmarks_list#-->
<a class="config" onClick="lr('config/newzbin/hideBookmarks');">$T('link-HideBM')</a>
<a class="config" onClick="lr('config/indexers/hideBookmarks');">$T('link-HideBM')</a>
<!--#else#-->
<a class="config" onClick="lr('config/newzbin/showBookmarks');">$T('link-ShowBM')</a>
<a class="config" onClick="lr('config/indexers/showBookmarks');">$T('link-ShowBM')</a>
<!--#end if#-->
<!--#if $bookmarks_list#-->
@@ -54,7 +54,7 @@ $T('explain-newzbin')<br/>
<legend>$T('processedBM')</legend>
<hr />
<!--#for $msgid in $bookmarks_list#-->
<a href="https://www.newzbin.com/browse/post/$msgid/" target="_blank">$msgid</a>&nbsp;
<a href="https://$newzbin_url/browse/post/$msgid/" target="_blank">$msgid</a>&nbsp;
<!--#end for#-->
<br class="clear" />
</fieldset>
@@ -93,6 +93,6 @@ $T('explain-nzbmatrix')<br/>
</fieldset>
<p>
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/newzbin/saveNewzbin', this, 'configNewzbin')">
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/indexers/saveNewzbin', this, 'configNewzbin')">
</p>
</form>

View File

@@ -1,5 +1,5 @@
<a href="${helpuri}Configure+Email" id="help" target="_blank">$T('menu-help')</a><h3>$T('configEmail')</h3>
<a href="${helpuri}Configure+Notifications-0-7" id="help" target="_blank">$T('menu-help')</a><h3>$T('configEmail')</h3>
<form id="configEmail" class="cmxform" autocomplete="off">
<div class="EntryBlock">
<fieldset class="EntryFieldSet">
@@ -67,13 +67,44 @@
<br class="clear" />
</fieldset>
<!--#if $have_growl or $have_ntfosd#-->
<fieldset class="EntryFieldSet">
<legend>$T('growlSettings')</legend>
<hr />
<!--#if $have_ntfosd#-->
<label><span class="label">$T('opt-ntfosd_enable'):</span>
<input class="radio" type="checkbox" name="ntfosd_enable" value="1" <!--#if $ntfosd_enable != "0" then "checked=1" else ""#--> />
<span class="tips">$T('explain-ntfosd_enable')</span></label>
<br class="clear" />
<!--#end if#-->
<!--#if $have_growl#-->
<label><span class="label">$T('opt-growl_enable'):</span>
<input class="radio" type="checkbox" name="growl_enable" value="1" <!--#if $growl_enable != "0" then "checked=1" else ""#--> />
<span class="tips">$T('explain-growl_enable')</span></label>
<br class="clear" />
<label class="label">$T('opt-growl_server'):</label>
<input type="text" size="35" name="growl_server" value="$growl_server">
<span class="tips">$T('explain-growl_server')</span>
<br class="clear" />
<label class="label">$T('opt-growl_password'):</label>
<input type="password" size="35" name="growl_password" value="$growl_password">
<span class="tips">$T('explain-growl_password')</span>
<br class="clear" />
<!--#end if#-->
</fieldset>
<!--#end if#-->
</div>
<p>
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/email/saveEmail', this, 'configEmail')">
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/notify/saveEmail', this, 'configEmail')">
</p>
<br class="clear" />
<a class="config" onClick="testemail();">Test E-Mail</a>
<a class="config" onClick="testemail();">$T('link-testEmail')</a>
<a class="config" onClick="testnotification();">$T('testNotify')</a>
<!--#if $lastmail#-->
&nbsp;&nbsp;&nbsp;&nbsp;$T('emailResult') = <b>$lastmail</b>
<!--#end if#-->

View File

@@ -2,7 +2,7 @@
<script type="text/javascript">
MochiKit.DOM.addLoadEvent(location = "../../#config-rss");
</script>
<a href="${helpuri}Configure+RSS+V2" id="help" target="_blank">$T('menu-help')</a>
<a href="${helpuri}Configure+RSS-0-7" id="help" target="_blank">$T('menu-help')</a>

View File

@@ -1,4 +1,4 @@
<a href="${helpuri}Configure+Scheduling+V2" id="help" target="_blank">$T('menu-help')</a>
<a href="${helpuri}Configure+Scheduling-0-7" id="help" target="_blank">$T('menu-help')</a>
<h3>$T('configSchedule')</h3>
<div class="EntryBlock">
<form class="cmxform" id="schedule">

View File

@@ -1,5 +1,5 @@
<a href="${helpuri}Configure+Servers+V2" id="help" target="_blank">$T('menu-help')</a>
<a href="${helpuri}Configure+Servers-0-7" id="help" target="_blank">$T('menu-help')</a>
<h3>$T('configServer')</h3>
<div class="EntryBlock">
<!--#set $slist = $servers.keys()#-->

View File

@@ -1,5 +1,5 @@
<a href="${helpuri}Configure+Sorting" id="help" target="_blank">$T('menu-help')</a><h3>$T('configSort')</h3>
<a href="${helpuri}Configure+Sorting-0-7" id="help" target="_blank">$T('menu-help')</a><h3>$T('configSort')</h3>
<!--action="config/directories/saveDirectories" method="post"-->
<form id="configSorting" class="cmxform" action="">
<div class="EntryBlock">

View File

@@ -1,5 +1,5 @@
<a href="${helpuri}Configure+Switches+V3" id="help" target="_blank">$T('menu-help')</a>
<a href="${helpuri}Configure+Switches-0-7" id="help" target="_blank">$T('menu-help')</a>
<h3>$T('switchesConfig')</h3>
<div class="EntryBlock">
<form id="configSwitches" class="cmxform">
@@ -11,6 +11,11 @@
<span class="tips">$T('explain-quick_check')</span>
<br class="clear" />
<label><span class="label">$T('opt-pre_check'):</span>
<input class="radio" type="checkbox" name="pre_check" value="1" <!--#if $pre_check > 0 then 'checked="1"' else ""#--> /></label>
<span class="tips">$T('explain-pre_check')</span>
<br class="clear" />
<label><span class="label">$T('opt-enable_unrar'):</span>
<input class="radio" type="checkbox" name="enable_unrar" value="1" <!--#if $enable_unrar == 1 then 'checked="1"' else ""#--> />
<span class="tips">$T('explain-enable_unrar')</span></label>
@@ -123,6 +128,16 @@
<hr />
<label><span class="label">$T('opt-max_art_tries'):</span>
<input type="text" size="5" name="max_art_tries" value="$max_art_tries" />
<span class="tips">$T('explain-max_art_tries')</span></label>
<br class="clear" />
<label><span class="label">$T('opt-max_opt_only'):</span>
<input class="radio" type="checkbox" name="max_opt_only" value="1" <!--#if $max_opt_only > 0 then 'checked="1"' else ""#--> />
<span class="tips">$T('explain-max_opt_only')</span></label>
<br class="clear" />
<label><span class="label">$T('opt-auto_disconnect'):</span>
<input class="radio" type="checkbox" name="auto_disconnect" value="1" <!--#if $auto_disconnect > 0 then 'checked="1"' else ""#--> />
<span class="tips">$T('explain-auto_disconnect')</span></label>
@@ -193,6 +208,38 @@
</fieldset>
<fieldset class="EntryFieldSet">
<legend>$T('swtag-quota')</legend>
<hr />
<span class="label">$T('opt-quota_size'):</span>
<input type="text" name="quota_size" value="$quota_size"/>
<span class="tips">$T('explain-quota_size')</span></label>
<br class="clear" />
<span class="label">$T('opt-quota_period'):</span>
<select name="quota_period" id="quota_period" class="select">
<option value="m" <!--#if $quota_period == "m" then 'selected' else ''#--> >$T('month')</option>
<option value="w" <!--#if $quota_period == "w" then 'selected' else ''#--> >$T('week')</option>
<option value="d" <!--#if $quota_period == "d" then 'selected' else ''#--> >$T('day')</option>
<option value="x" <!--#if $quota_period == "x" then 'selected' else ''#--> >$T('manual')</option>
</select>
<span class="tips">$T('explain-quota_period')</span>
<br class="clear" />
<span class="label">$T('opt-quota_day'):</span>
<input type="text" name="quota_day" value="$quota_day"/>
<span class="tips">$T('explain-quota_day')</span></label>
<br class="clear" />
<label><span class="label">$T('opt-quota_resume'):</span>
<input class="radio" type="checkbox" name="quota_resume" value="1" <!--#if $quota_resume > 0 then 'checked="1"' else ""#--> />
<span class="tips">$T('explain-quota_resume')</span></label>
<br class="clear" />
</fieldset>
<p>
<input type="button" size="40" value="$T('button-saveChanges')" onclick="javascript:submitconfig('config/switches/saveSwitches', this, 'configSwitches')">

View File

@@ -8,6 +8,7 @@
<div class="centerLinks"><br />
<a onClick="if(confirm('$T('purgeHistConf')')){javascript:loadSearch('history/purge', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);}">$T('smpl-purgehist')</a> |
<a onClick="if(confirm('$T('smpl-purgefailhistOK?')')){javascript:loadSearch('history/purge_failed', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);}">$T('smpl-purgefailhist')</a> |
<a onClick="if(confirm('$T('smpl-purgefailhistOK?')')){javascript:loadSearch('history/purge_failed', 'historySearch', 'limit=$limit&start=0&del_files=1', -1,this.parentNode.parentNode.id);}">$T('purgeFailed-Files')</a> |
<a onClick="javascript:loadSearch('history/tog_verbose', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);"><!--#if $isverbose then $T('hideDetails') else $T('showDetails')#--></a> |
<a onClick="javascript:loadSearch('history/tog_failed_only', 'historySearch', 'limit=$limit&start=0', -1,this.parentNode.parentNode.id);"><!--#if $failed_only then $T('showAllHis') else $T('showFailedHis')#--></a>
</span>
@@ -35,7 +36,7 @@
<td>$line.name<!--#if $line.action_line#--> - <span class="action_message">$line.action_line</span><!--#else if $line.fail_message#--> - <span class="fail_message">$line.fail_message</span><!--#end if#--></td>
<td>
<!--#if $line.report#-->
<a href="https://www.newzbin.com/browse/post/$line.report"><img class="imglink" src="static/images/newzbin.png" /></a>
<a href="https://$newzbin_url/browse/post/$line.report"><img class="imglink" src="static/images/newzbin.png" /></a>
<!--#end if#-->
<!--#if $line.url_info#-->
<a href="$line.url_info"><img class="imglink" src="static/images/browser.png" /></a>
@@ -98,6 +99,9 @@ t = time.strftime(time_format("%H:%M:%S on %A %d %B %Y"), completed)
<!--#end if#-->
</table>
<div class="centerLinks">
<!--#if $have_quota#-->
$T('quota-left'):&nbsp;<strong>$left_quota&nbsp;&frasl;&nbsp;$quota</strong>&nbsp;|
<!--#end if#-->
$T('smpl-size'): <span class="bold">$total_size</span> | $T('thisMonth'): <span class="bold">$month_size</span> | $T('thisWeek'): <span class="bold">$week_size</span> | $T('today'): <span class="bold">$day_size</span>
</div>
<br />

View File

@@ -424,7 +424,7 @@ function loadtitle() {
case 'queue':
lr('queue/','limit=15',1);
break;
case 'connections':
case 'status':
lr(url,'',1)
default:
lr(url)
@@ -732,7 +732,7 @@ function lrb(url, extra, refresh)
function testemail()
{
d = doSimpleXMLHttpRequest('config/email/testmail?session='+session);
d = doSimpleXMLHttpRequest('config/notify/testmail?session='+session);
d.addCallback(function (d)
{
alert("$T('smpl-emailsent')");
@@ -740,9 +740,19 @@ function lrb(url, extra, refresh)
d.addErrback(handleServerError);
}
function testnotification()
{
d = doSimpleXMLHttpRequest('config/notify/testnotification?session='+session);
d.addCallback(function (d)
{
alert("$T('smpl-notesent')");
});
d.addErrback(handleServerError);
}
function unblock_server(host, port)
{
d = doSimpleXMLHttpRequest('connections/unblock_server?server='+host+':'+port+'&session='+session);
d = doSimpleXMLHttpRequest('status/unblock_server?server='+host+':'+port+'&session='+session);
}
function getBookmarks()
@@ -750,6 +760,11 @@ function lrb(url, extra, refresh)
d = doSimpleXMLHttpRequest('tapi?mode=newzbin&name=get_bookmarks&session='+session);
}
function resetQuota()
{
d = doSimpleXMLHttpRequest('tapi?mode=reset_quota&session='+session);
}
function changequeueoptions(page)
{
d = doSimpleXMLHttpRequest('queue/'+page);
@@ -1015,10 +1030,6 @@ function loadingJSON(){
document.getElementById("mbtotal").innerHTML = info["mb"].toFixed(2);
document.getElementById("ds1").innerHTML = info["diskspace1"].toFixed(2);
document.getElementById("ds2").innerHTML = info["diskspace2"].toFixed(2);
//var perc1 = 1 - (info["jobs"][0]["mbleft"].toFixed(2) / info["jobs"][0]["mb"].toFixed(2))
//alert(info["jobs"][0]);
if (info["jobs"]!="") document.getElementById("downloadinfo").innerHTML = "$T('smpl-downloading'): "+info["jobs"][0]["filename"];
else document.getElementById("downloadinfo").innerHTML = "";
document.getElementById("have_warnings").innerHTML = info["have_warnings"];
load = document.getElementById("loadavg")
if (load) load.innerHTML = info["loadavg"];
@@ -1100,48 +1111,56 @@ function loadingJSON(){
<br />
<div class="centerLinks header-margin light-grey"><a onclick="javascript:toggle('addNew','',{duration:0.2})">[$T('smpl-toggleadd')]</a></div>
</div>
<!--#if $uniconfig#-->
<!--#set prefix="."#-->
<!--#else#-->
<!--#set prefix="#"#-->
<!--#end if#-->
<div id="Content">
<div id="Left">
<ul id="menu">
<li><a class="current" href="./">$T('menu-home')</a></li>
<li><a href="#/queue/" onClick="lr('queue/', 'limit=15', 1, 0);">$T('menu-queue')</a></li>
<li><a href="#/history/" onClick="lr('history/','limit=15', 1, 0);">$T('menu-history')</a></li>
<li><a href="#/dv1/" onClick="lr('queue/','', 1, 1);lrb('history/','limit=15',1);">$T('smpl-dualView1')</a></li>
<li><a href="#/dv2/" onClick="lr('queue/','', 1, 2);lrb('history/','limit=15',1);">$T('smpl-dualView2')</a></li>
<li><a href="#/config/" onClick="toggle('hiddenNav','blind',{duration:0.2})">$T('menu-config')</a></li>
<li><a href="#/queue/" onclick="lr('queue/', 'limit=15', 1, 0);">$T('menu-queue')</a></li>
<li><a href="#/history/" onclick="lr('history/','limit=15', 1, 0);">$T('menu-history')</a></li>
<li><a href="#/dv1/" onclick="lr('queue/','', 1, 1);lrb('history/','limit=15',1);">$T('smpl-dualView1')</a></li>
<li><a href="#/dv2/" onclick="lr('queue/','', 1, 2);lrb('history/','limit=15',1);">$T('smpl-dualView2')</a></li>
<li><a href="$prefix/config/" class="bold">$T('menu-config')</a> <a onclick="toggle('hiddenNav','blind',{duration:0.2})"><img src="static/images/bullet_arrow_down.png" border=0 /></a></li>
<ul id="hiddenNav" class="secondul">
<li><a class="config" href="#/config/general/" onClick="lr('config/general/','', 0, 0);">$T('cmenu-general')</a></li>
<li><a class="config" href="#/config/directories/" onClick="lr('config/directories/','', 0, 0);">$T('cmenu-folders')</a> </li>
<li><a class="config" href="#/config/switches/" onClick="lr('config/switches/','', 0, 0);">$T('cmenu-switches')</a> </li>
<li><a class="config" href="#/config/server" onClick="lr('config/server/','', 0, 0);">$T('cmenu-servers')</a> </li>
<li><a class="config" href="#/config/scheduling/" onClick="lr('config/scheduling/','', 0, 0);">$T('cmenu-scheduling')</a> </li>
<li><a class="config" href="#/config/rss/" onClick="lr('config/rss/','', 0, 0);">$T('cmenu-rss')</a> </li>
<li><a class="config" href="#/config/email/" onClick="lr('config/email/','', 0, 0);">$T('cmenu-email')</a></li>
<li><a class="config" href="#/config/newzbin/" onClick="lr('config/newzbin/', '', 0, 0);">$T('cmenu-newzbin')</a></li>
<li><a class="config" href="#/config/categories/" onClick="lr('config/categories/', '', 0, 0);">$T('cmenu-cat')</a></li>
<li><a class="config" href="#/config/sorting/" onClick="lr('config/sorting/', '', 0, 0);">$T('cmenu-sorting')</a></li>
<li><a class="config" href="$prefix/config/general/" onclick="lr('config/general/','', 0, 0);">$T('cmenu-general')</a></li>
<li><a class="config" href="$prefix/config/folders/" onclick="lr('config/folders/','', 0, 0);">$T('cmenu-folders')</a> </li>
<li><a class="config" href="$prefix/config/switches/" onclick="lr('config/switches/','', 0, 0);">$T('cmenu-switches')</a> </li>
<li><a class="config" href="$prefix/config/server" onclick="lr('config/server/','', 0, 0);">$T('cmenu-servers')</a> </li>
<li><a class="config" href="$prefix/config/scheduling/" onclick="lr('config/scheduling/','', 0, 0);">$T('cmenu-scheduling')</a> </li>
<li><a class="config" href="$prefix/config/rss/" onclick="lr('config/rss/','', 0, 0);">$T('cmenu-rss')</a> </li>
<li><a class="config" href="$prefix/config/notify/" onclick="lr('config/notify/','', 0, 0);">$T('cmenu-notif')</a></li>
<li><a class="config" href="$prefix/config/indexers/" onclick="lr('config/indexers/', '', 0, 0);">$T('cmenu-newzbin')</a></li>
<li><a class="config" href="$prefix/config/categories/" onclick="lr('config/categories/', '', 0, 0);">$T('cmenu-cat')</a></li>
<li><a class="config" href="$prefix/config/sorting/" onclick="lr('config/sorting/', '', 0, 0);">$T('cmenu-sorting')</a></li>
</ul>
<li><a href="#/connections/" onClick="lr('connections/','', 1, 0);">$T('menu-cons')</a></li>
<li><a href="#/connections/" onClick="lr('connections/','', 1, 0);">$T('smpl-warnings')(<span id="have_warnings">$have_warnings</span>)</a></li>
<li><a href="#/status/" onclick="lr('status/','', 1, 0);">$T('menu-cons')</a></li>
<li><a href="#/status/" onclick="lr('status/','', 1, 0);">$T('smpl-warnings')(<span id="have_warnings">$have_warnings</span>)</a></li>
<br />
<li><a class="bold" id="status2" onClick="toggle_paused()">$statusstr2</a> <a onClick="toggle('hiddenTimedPause','blind',{duration:0.2})"><img src="static/images/bullet_arrow_down.png" border=0 /></a></li>
<li><a class="bold" id="status2" onclick="toggle_paused()">$statusstr2</a> <a onclick="toggle('hiddenTimedPause','blind',{duration:0.2})"><img src="static/images/bullet_arrow_down.png" border=0 /></a></li>
<ul id="hiddenTimedPause" class="secondul">
<li><a class="config" onClick="javascript:timedPause(5)">5 $T("minutes")</a></li>
<li><a class="config" onClick="javascript:timedPause(15)">15 $T("minutes")</a></li>
<li><a class="config" onClick="javascript:timedPause(30)">30 $T("minutes")</a></li>
<li><a class="config" onClick="javascript:timedPause(60)">1 $T("hours")</a></li>
<li><a class="config" onClick="javascript:timedPause(120)">2 $T("hours")</a></li>
<li><a class="config" onClick="javascript:timedPause(180)">3 $T("hours")</a></li>
<li><a class="config" onClick="javascript:timedPause(300)">5 $T("hours")</a></li>
<li><a class="config" onClick="javascript:timedPause()">$T("smpl-custom")</a></li>
<li><a class="config" onclick="javascript:timedPause(5)">5 $T("minutes")</a></li>
<li><a class="config" onclick="javascript:timedPause(15)">15 $T("minutes")</a></li>
<li><a class="config" onclick="javascript:timedPause(30)">30 $T("minutes")</a></li>
<li><a class="config" onclick="javascript:timedPause(60)">1 $T("hours")</a></li>
<li><a class="config" onclick="javascript:timedPause(120)">2 $T("hours")</a></li>
<li><a class="config" onclick="javascript:timedPause(180)">3 $T("hours")</a></li>
<li><a class="config" onclick="javascript:timedPause(300)">5 $T("hours")</a></li>
<li><a class="config" onclick="javascript:timedPause()">$T("smpl-custom")</a></li>
</ul>
<!--#if $varExists('newzbinDetails')#-->
<li><a onClick="getBookmarks()">$T('smpl-getbookmarks')</a></li>
<li><a onclick="getBookmarks()">$T('smpl-getbookmarks')</a></li>
<!--#end if#-->
<!--#if $have_quota#-->
<li><a onclick="resetQuota()">$T('link-resetQuota')</a></li>
<!--#end if#-->
<br />
<li><a style="text-decoration:underline;cursor:pointer;" onClick="if(confirm('$T('smpl-restartOK?')')){restart()}">$T('button-restart')</a></li>
<li><a style="text-decoration:underline;cursor:pointer;" onClick="if(confirm('$T('shutdownOK?')')){shutdown()}">$T('link-shutdown')</a></li>
<li><a style="text-decoration:underline;cursor:pointer;" onclick="if(confirm('$T('smpl-restartOK?')')){restart()}">$T('button-restart')</a></li>
<li><a style="text-decoration:underline;cursor:pointer;" onclick="if(confirm('$T('shutdownOK?')')){shutdown()}">$T('link-shutdown')</a></li>
<br/>
<li><a href="$helpuri" target="_blank">$T('menu-wiki')</a></li>
<li><a href="http://forums.sabnzbd.org" target="_blank">$T('menu-forums')</a></li>
@@ -1252,7 +1271,6 @@ function loadingJSON(){
</div>
<div id="Footer">
<div id="divchart"><canvas id="graph" height="100" width="700"></canvas></div>
<span id="downloadinfo"></span><br /><br />
<p id="versions">$T("smpl-refreshr"): <select id="refreshrate" onchange="javascript:applyrefresh(this.options[this.selectedIndex].value)">
<option value="2" >2 $T("seconds")</option>
<option value="3" >3 $T("seconds")</option>
@@ -1265,7 +1283,7 @@ function loadingJSON(){
<option value="300" >5 $T("minutes")</option>
<option value="0" >$T("none")</option>
</select>
<br />SABnzbd $T('version'): $version | smpl $T('version'): 1.3</a></p>
<br />SABnzbd $T('version'): $version | smpl skin</a></p>
<!--#if $warning#-->
<h2>$T('ft-warning')</h2>
<b>$warning</b><br />

View File

@@ -91,6 +91,7 @@ $T('smpl-timeleft'): <strong>$timeleft</strong> $T('eta'): <strong>$eta</strong>
<option value="1" <!--#if $slot.priority == "High" then "selected" else ""#-->>$T('pr-high')</option>
<option value="0" <!--#if $slot.priority == "Normal" then "selected" else ""#-->>$T('pr-normal')</option>
<option value="-1" <!--#if $slot.priority == "Low" then "selected" else ""#-->>$T('pr-low')</option>
<option value="-4" <!--#if $slot.priority == "Stop" then "selected" else ""#-->>$T('pr-stop')</option>
</optgroup>
</select>
<!--#end if#-->

View File

@@ -1,14 +1,14 @@
<script type="text/javascript">
window.onload = function() {
location = "../#/connections"
location = "../#/status"
};
</script>
<h3>$T('connections')</h3>
<a class="config" onClick="lr('connections/disconnect', '', '-1', this.parentNode.id);">$T('link-forceDisc')</a> |
<a class="config" onClick="lr('status/disconnect', '', '-1', this.parentNode.id);">$T('link-forceDisc')</a> |
<a class="config" onClick="testemail();">$T('link-testEmail')</a> |
<a class="config" href="connections/showlog?session=$session">$T('link-showLog')</a>
<a class="config" href="status/showlog?session=$session">$T('link-showLog')</a>
$T('logging'):
<select onChange="javascript:lr('connections/change_loglevel','loglevel='+this.options[this.selectedIndex].value)">
<select onChange="javascript:lr('status/change_loglevel','loglevel='+this.options[this.selectedIndex].value)">
<option value="0" <!--#if $loglevel == "0" then "selected" else ""#-->>$T('log-errWarn')</option>
<option value="1" <!--#if $loglevel == "1" then "selected" else ""#-->>$T('log-info')</option>
<option value="2" <!--#if $loglevel == "2" then "selected" else ""#-->>$T('log-debug')</option>
@@ -19,7 +19,7 @@ $T('logging'):
<li>
$server[0]: $server[2] <!--#if int($server[4])#--><img src="static/images/nuvola/kgpg.png" /><!--#end if#-->
<!--#if not $server[5]#-->
<a class="config" href="./connections/unblock_server?server=$server[0]&session=$session">
<a class="config" href="./status/unblock_server?server=$server[0]&session=$session">
($T('server-blocked'))</a>
&nbsp;&nbsp;$server[6]
<!--#end if#-->
@@ -38,7 +38,7 @@ $T('logging'):
$lastmail
<!--#end if#-->
<!--#if $warnings#-->
<h2>$T('lastWarnings') (<a class="config" onClick="lr('connections/clearwarnings','', '-1', this.parentNode.id);">$T('clearWarnings')</a>)</h2>
<h2>$T('lastWarnings') (<a class="config" onClick="lr('status/clearwarnings','', '-1', this.parentNode.id);">$T('clearWarnings')</a>)</h2>
<!--#for $warn in $warnings#-->
$warn<br/>
<!--#end for#-->
@@ -64,7 +64,7 @@ $T('explain-orphans')<br/>
<form action="delete" method="get">
<input type="hidden" value="$folder" name="name">
<input type="hidden" value="$session" name="session">
<input type="submit" onclick="this.form.action='connections/delete?session=$session'; this.form.submit(); return false;" value="$T('button-delCat')"/>
<input type="submit" onclick="this.form.action='status/delete?session=$session'; this.form.submit(); return false;" value="$T('button-delCat')"/>
</form>
</td>
@@ -72,7 +72,7 @@ $T('explain-orphans')<br/>
<form action="add" method="get">
<input type="hidden" value="$folder" name="name">
<input type="hidden" value="$session" name="session">
<input type="submit" onclick="this.form.action='connections/add?session=$session'; this.form.submit(); return false;" value="$T('button-add')"/>
<input type="submit" onclick="this.form.action='status/add?session=$session'; this.form.submit(); return false;" value="$T('button-add')"/>
</form>
</td>
@@ -86,6 +86,6 @@ $T('explain-orphans')<br/>
<!--#end if#-->
$T('explain-Repair')<br/>
<form action="saveGeneral" method="post">
<input type="submit" onclick="this.form.action='../config/repair?session=$session'; this.form.submit(); return false;" value="$T('button-repair')"/>
<input type="submit" onclick="this.form.action='config/repair?session=$session'; this.form.submit(); return false;" value="$T('button-repair')"/>
</form>

View File

@@ -13,7 +13,7 @@ $(document).ready(function() {
$("#serverTest").click(function(){
$('#serverResponse').html(txtChecking);
$.getJSON(
"/tapi?mode=config&name=test_server&output=json",
"../tapi?mode=config&name=test_server&output=json",
$("form").serialize(),
function(result) {
if (result.value.result){

View File

@@ -3,7 +3,7 @@
<form action="./four" method="post" autocomplete="off">
<p>$T('wizard-index-explain')</p>
<div id="serverDetails">
<h3><a href="http://newzbin.com" target="_blank">Newzbin.com</a> ($T('wizard-optional'))</h3>
<h3><a href="http://$newzbin_url" target="_blank">Newzbin2.es</a> ($T('wizard-optional'))</h3>
<label class="label">$T('srv-username'):</label><input type="text" size="20" value="$newzbin_user" name="newzbin_user">
<br class="clear" />
<label class="label">$T('srv-password'):</label><input type="password" size="20" value="$newzbin_pass" name="newzbin_pass">

View File

@@ -1,21 +1,16 @@
The module feedparser.py-4.1 is (c) Mark Pilgrim
The module feedparser.py-5.1 is (c) Mark Pilgrim and Kurt McKee
We use only the feedparser itself, all additional material
was removed.
We use only the feedparser itself, all additional material was removed.
Home of the feedparser module:
http://www.feedparser.org
https://code.google.com/p/feedparser
It is covered by the following license.
Universal Feed Parser (feedparser.py), its testing harness (feedparsertest.py),
and its unit tests (everything in the tests/ directory) are released under the
following license:
----- begin license block -----
Copyright (c) 2002-2005, Mark Pilgrim
Copyright (c) 2010-2011 Kurt McKee <contactme@kurtmckee.org>
Copyright (c) 2002-2008 Mark Pilgrim
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -37,6 +32,6 @@ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
POSSIBILITY OF SUCH DAMAGE."""
----- end license block -----

29
licenses/License-gntp.txt Normal file
View File

@@ -0,0 +1,29 @@
The module gntp is (C) Paul Traylor
Home of the module:
https://github.com/kfdm/gntp/
It is covered by the following license.
-------------------------------------------------------------------------
Copyright (c) 2011 Paul Traylor
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------

View File

@@ -0,0 +1,8 @@
On http://www.brunningonline.net/simon/blog/archives/001835.html,
the author licensed SysTrayIcon.py under a variant of the WTFPL:
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
> "Aleister Crowley" style license - "Do what thou wilt shall be the
> only law".
>
> Err, but don't sue me if it doesn't work. ;-)

BIN
osx/image/sabnzbd.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

34
osx/unrar/license.txt Normal file
View File

@@ -0,0 +1,34 @@
****** ***** ****** UnRAR - free utility for RAR archives
** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
****** ******* ****** License for use and distribution of
** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
** ** ** ** ** ** FREEWARE version
~~~~~~~~~~~~~~~~
The UnRAR utility is freeware. This means:
1. All copyrights to RAR and the utility UnRAR are exclusively
owned by the author - Alexander Roshal.
2. The UnRAR utility may be freely distributed. It is allowed
to distribute UnRAR inside of other software packages.
3. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED "AS IS".
NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT
YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS,
DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
OR MISUSING THIS SOFTWARE.
4. Neither RAR binary code, WinRAR binary code, UnRAR source or UnRAR
binary code may be used or reverse engineered to re-create the RAR
compression algorithm, which is proprietary, without written
permission of the author.
5. If you don't agree with terms of the license you must remove
UnRAR files from your storage devices and cease to use the
utility.
Thank you for your interest in RAR and UnRAR.
Alexander L. Roshal

View File

Binary file not shown.

View File

@@ -34,6 +34,9 @@ except ImportError:
try:
import py2app
from setuptools import setup
OSX_LION = [int(n) for n in platform.mac_ver()[0].split('.')] >= [10, 7, 0]
OSX_SL = not OSX_LION and [int(n) for n in platform.mac_ver()[0].split('.')] >= [10, 6, 0]
OSX_LEOPARD = not (OSX_LION or OSX_SL)
except ImportError:
py2app = None
@@ -48,7 +51,8 @@ def DeleteFiles(name):
''' Delete one file or set of files from wild-card spec '''
for f in glob.glob(name):
try:
os.remove(f)
if os.path.exists(f):
os.remove(f)
except:
print "Cannot remove file %s" % f
exit(1)
@@ -70,26 +74,38 @@ def CheckPath(name):
def PatchVersion(name):
""" Patch in the Bazaar baseline number, but only when this is
""" Patch in the Git commit hash, but only when this is
an unmodified checkout
"""
global my_version, my_baseline
commit = ''
try:
pipe = subprocess.Popen(BzrVersion, shell=True, stdout=subprocess.PIPE).stdout
pipe = subprocess.Popen(GitVersion, shell=True, stdout=subprocess.PIPE).stdout
for line in pipe.read().split('\n'):
if 'revno: ' in line:
bzr = line.split(' ')[1].strip()
if 'commit ' in line:
commit = line.split(' ')[1].strip()
break
pipe.close()
except:
pass
print 'Cannot run %s' % GitVersion
exit(1)
if not bzr:
print "WARNING: Cannot run %s" % BzrVersion
bzr = 'unknown'
state = ' (not committed)'
try:
pipe = subprocess.Popen(GitStatus, shell=True, stdout=subprocess.PIPE).stdout
for line in pipe.read().split('\n'):
if 'nothing to commit' in line:
state = ''
break
pipe.close()
except:
print 'Cannot run %s' % GitStatus
exit(1)
if not (bzr and bzr.isdigit()):
bzr = 'unknown'
if not commit:
print "WARNING: Cannot run %s" % GitVersion
commit = 'unknown'
try:
ver = open(VERSION_FILE, 'rb')
@@ -99,12 +115,12 @@ def PatchVersion(name):
print "WARNING: cannot patch " + VERSION_FILE
return
my_baseline = bzr
my_baseline = commit + state
my_version = name
regex = re.compile(r'__baseline__\s+=\s+"\w*"')
text = re.sub(r'__baseline__\s*=\s*"[^"]*"', '__baseline__ = "%s"' % bzr, text)
text = re.sub(r'__version__\s*=\s*"[^"]*"', '__version__ = "%s"' % name, text)
text = re.sub(r'__baseline__\s*=\s*"[^"]*"', '__baseline__ = "%s"' % my_baseline, text)
text = re.sub(r'__version__\s*=\s*"[^"]*"', '__version__ = "%s"' % my_version, text)
try:
ver = open(VERSION_FILE, 'wb')
@@ -120,14 +136,14 @@ def PairList(src):
A dir returns for its root and each of its subdirs
(path, <list-of-files>)
Always return paths with Unix slashes.
Skip all Bazaar elements, .bak .pyc .pyo and *.~*
Skip all Git elements, .bak .pyc .pyo and *.~*
"""
lst = []
for item in src:
if item.endswith('/'):
for root, dirs, files in os.walk(item.rstrip('/\\')):
path = root.replace('\\', '/')
if path.find('.bzr') < 0:
if path.find('.git') < 0:
flist = []
for file in files:
if not (file.endswith('.bak') or file.endswith('.pyc') or file.endswith('.pyo') or '~' in file):
@@ -239,18 +255,27 @@ def check_runtimes():
if path:
path = os.path.join(path, 'Bazaar')
if not os.path.exists(path):
path = None
if not path:
print 'Cannot find runtime libraries, have you installed Bazaar'
print 'in %s ?' % path
exit(1)
print 'Cannot find runtime libraries, have you installed Bazaar'
print 'in %s ?' % path
exit(1)
return path
def write_dll_message(path):
f = open(path, 'w')
f.write('''
**** IMPORTANT ****
If you get a Windows error message, claiming that DLL files are missing,
please install "Microsoft Visual C++ 2008 Redistributable Package (x86)".
Download from http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=29
Install this and *not* the SP1 package (or install both).
''')
f.close()
print sys.argv[0]
Bazaar = CheckPath('bzr')
Git = CheckPath('git')
ZipCmd = CheckPath('zip')
UnZipCmd = CheckPath('unzip')
if os.name == 'nt':
@@ -258,12 +283,13 @@ if os.name == 'nt':
else:
NSIS = '-'
BzrRevertApp = Bazaar + ' revert '
BzrUpdateApp = Bazaar + ' update '
BzrRevert = Bazaar + ' revert ' + VERSION_FILE
BzrVersion = Bazaar + ' version-info'
GitRevertApp = Git + ' checkout -- '
#GitUpdateApp = Git + ' update '
GitRevertVersion = GitRevertApp + ' ' + VERSION_FILE
GitVersion = Git + ' log -1'
GitStatus = Git + ' status'
if not (BzrVersion and BzrRevert and ZipCmd and UnZipCmd and NSIS):
if not (Git and ZipCmd and UnZipCmd and NSIS):
exit(1)
if len(sys.argv) < 2:
@@ -290,6 +316,7 @@ fileIns = prod + '-win32-setup.exe'
fileBin = prod + '-win32-bin.zip'
fileSrc = prod + '-src.tar.gz'
fileDmg = prod + '-osx.dmg'
fileDmgLp = prod + '-osx-leopard.dmg'
fileOSr = prod + '-osx-src.tar.gz'
fileImg = prod + '.sparseimage'
@@ -299,6 +326,7 @@ PatchVersion(release)
# List of data elements, directories end with a '/'
data_files = [
'ABOUT.txt',
'README.txt',
'INSTALL.txt',
'GPL2.txt',
@@ -306,7 +334,6 @@ data_files = [
'CHANGELOG.txt',
'COPYRIGHT.txt',
'ISSUES.txt',
'nzb.ico',
'Sample-PostProc.cmd',
'Sample-PostProc.sh',
'PKG-INFO',
@@ -318,9 +345,11 @@ data_files = [
'interfaces/Plush/',
'interfaces/Mobile/',
'interfaces/wizard/',
'interfaces/Config/',
'win/par2/',
'win/unzip/',
'win/unrar/'
'win/unrar/',
'icons/'
]
options = dict(
@@ -341,15 +370,37 @@ options = dict(
if target == 'app':
if not platform.system() == 'Darwin':
print "Sorry, only works on Apple OSX!"
os.system(BzrRevert)
os.system(GitRevertVersion)
exit(1)
# Check which Python flavour
apple_py = 'ActiveState' not in sys.copyright
#Create sparseimage from template
os.system("unzip sabnzbd-template.sparseimage.zip")
os.system("unzip osx/image/template.sparseimage.zip")
os.rename('sabnzbd-template.sparseimage', fileImg)
#mount sparseimage and modify volume label
os.system("hdiutil mount %s | grep /Volumes/SABnzbd >mount.log" % (fileImg))
# Select OSX version specific background image
# Take care to preserve the special attributes of the background image file
if OSX_LION:
# Lion and higher: generates SnowLeopard/Lion DMG
f = open('osx/image/sabnzbd.png', 'rb')
png = f.read()
f.close()
else:
# Snow Leopard and lower: generates Leopard DMG
fileDmg = fileDmgLp
f = open('osx/image/sabnzbd_leopard.png', 'rb')
png = f.read()
f.close()
f = open('/Volumes/SABnzbd/sabnzbd.png', 'wb')
f.write(png)
f.close()
# Rename the volume
fp = open('mount.log', 'r')
data = fp.read()
fp.close()
@@ -366,6 +417,11 @@ if target == 'app':
#build SABnzbd.py
sys.argv[1] = 'py2app'
# Due to ApplePython bug
if apple_py:
sys.argv.append('-p');
sys.argv.append('email');
APP = ['SABnzbd.py']
DATA_FILES = ['interfaces', 'locale', 'email', ('',glob.glob("osx/resources/*"))]
@@ -378,7 +434,7 @@ if target == 'app':
LSTypeIsPackage = 0,
NSPersistentStoreTypeKey = 'Binary',
)
OPTIONS = {'argv_emulation': True, 'iconfile': 'osx/resources/sabnzbdplus.icns','plist': {
OPTIONS = {'argv_emulation': not apple_py, 'iconfile': 'osx/resources/sabnzbdplus.icns','plist': {
'NSUIElement':1,
'CFBundleShortVersionString':release,
'NSHumanReadableCopyright':'The SABnzbd-Team',
@@ -399,19 +455,23 @@ if target == 'app':
os.system("cp -pR osx/par2/ dist/SABnzbd.app/Contents/Resources/osx/par2>/dev/null")
os.system("mkdir dist/SABnzbd.app/Contents/Resources/osx/unrar>/dev/null")
os.system("cp -pR osx/unrar/ dist/SABnzbd.app/Contents/Resources/osx/unrar>/dev/null")
os.system("find dist/SABnzbd.app -name .bzr | xargs rm -rf")
os.system("cp icons/sabnzbd.ico dist/SABnzbd.app/Contents/Resources >/dev/null")
os.system("find dist/SABnzbd.app -name .git | xargs rm -rf")
#copy builded app to mounted sparseimage
#copy app to mounted sparseimage
os.system("cp -r dist/SABnzbd.app /Volumes/%s/>/dev/null" % volume)
#Create src tar.gz
#os.system('tar -czf %s --exclude ".bzr" --exclude "sab*.zip" --exclude "SAB*.tar.gz" --exclude "*.cmd" --exclude "*.pyc" '
# '--exclude "*.sparseimage" --exclude "dist" --exclude "build" --exclude "*.nsi" --exclude "win"'
# './ >/dev/null' % (fileOSr) )
print 'Create src %s' % fileOSr
os.system('tar -czf %s --exclude ".git*" --exclude "sab*.zip" --exclude "SAB*.tar.gz" --exclude "*.cmd" --exclude "*.pyc" '
'--exclude "*.sparseimage" --exclude "dist" --exclude "build" --exclude "*.nsi" --exclude "win" --exclude "*.dmg" '
'./ >/dev/null' % (fileOSr) )
# Copy README.txt
os.system("cp README.rtf /Volumes/%s/" % volume)
# Remove site.py to prevent re-compilation (otherwise the OSX Firewall may complain)
os.remove('/Volumes/%s/SABnzbd.app/Contents/Resources/site.py' % volume)
#Unmount sparseimage
os.system("hdiutil eject /Volumes/%s/>/dev/null" % volume)
@@ -427,18 +487,17 @@ if target == 'app':
os.system("hdiutil internet-enable %s" % fileDmg)
os.system(BzrRevertApp + "NSIS_Installer.nsi")
os.system(BzrRevertApp + VERSION_FILEAPP)
os.system(BzrRevertApp + VERSION_FILE)
os.system(BzrUpdateApp)
os.system(GitRevertApp + "NSIS_Installer.nsi")
os.system(GitRevertApp + VERSION_FILEAPP)
os.system(GitRevertApp + VERSION_FILE)
elif target in ('binary', 'installer'):
if not py2exe:
print "Sorry, only works on Windows!"
os.system(BzrRevert)
os.system(GitRevertVersion)
exit(1)
run_times = check_runtimes()
#run_times = check_runtimes()
# Create MO files
os.system('tools\\make_mo.py all')
@@ -447,7 +506,7 @@ elif target in ('binary', 'installer'):
options['description'] = 'SABnzbd ' + str(my_version)
sys.argv[1] = 'py2exe'
program = [ {'script' : 'SABnzbd.py', 'icon_resources' : [(0, "sabnzbd.ico")] } ]
program = [ {'script' : 'SABnzbd.py', 'icon_resources' : [(0, "icons/sabnzbd.ico")] } ]
options['options'] = {"py2exe":
{
"bundle_files": 3,
@@ -513,14 +572,21 @@ elif target in ('binary', 'installer'):
rename_file('dist', Win32HelperName, Win32ServiceHelpName)
############################
# Remove unwanted system DLL files that Py2Exe copies when running on Win7
DeleteFiles(r'dist\lib\API-MS-Win-*.dll')
DeleteFiles(r'dist\lib\MSWSOCK.DLL')
DeleteFiles(r'dist\lib\POWRPROF.DLL')
############################
# Copy MS runtime files or Curl
if run_times:
# MS Runtimes for Python 2.6+
shutil.copy2(os.path.join(run_times, r'Microsoft.VC90.CRT.manifest'), r'dist')
shutil.copy2(os.path.join(run_times, r'msvcp90.dll'), r'dist')
shutil.copy2(os.path.join(run_times, r'msvcr90.dll'), r'dist')
shutil.copy2(os.path.join(run_times, r'lib\Microsoft.VC90.CRT.manifest'), r'dist\lib')
if sys.version > (2, 5):
#Won't work with OpenSSL DLLs :(
#shutil.copy2(os.path.join(run_times, r'Microsoft.VC90.CRT.manifest'), r'dist')
#shutil.copy2(os.path.join(run_times, r'msvcp90.dll'), r'dist')
#shutil.copy2(os.path.join(run_times, r'msvcr90.dll'), r'dist')
#shutil.copy2(os.path.join(run_times, r'lib\Microsoft.VC90.CRT.manifest'), r'dist\lib')
pass
else:
# Curl for Python 2.5
os.system(r'unzip -o win\curl\curl.zip -d dist\lib')
@@ -534,12 +600,13 @@ elif target in ('binary', 'installer'):
DeleteFiles(fileBin)
write_dll_message('dist/IMPORTANT_MESSAGE.txt')
os.rename('dist', prod)
os.system('zip -9 -r -X %s %s' % (fileBin, prod))
time.sleep(1.0)
os.rename(prod, 'dist')
os.system(BzrRevert)
os.system(GitRevertVersion)
############################
# Check for uncompressed sqlite3.dll
@@ -562,7 +629,7 @@ else:
os.mkdir(root)
# Set data files
data_files.extend(['po/', 'cherrypy/'])
data_files.extend(['po/', 'cherrypy/', 'gntp/'])
options['data_files'] = PairList(data_files)
options['data_files'].append(('tools', ['tools/make_mo.py', 'tools/msgfmt.py']))
@@ -606,5 +673,5 @@ else:
# Prepare the TAR.GZ pacakge
CreateTar('srcdist', fileSrc, prod)
os.system(BzrRevert)
os.system(GitRevertVersion)

View File

@@ -5,14 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.6.x\n"
"Project-Id-Version: SABnzbd-0.7.x\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: shypike@sabnzbd.org\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 7bit\n"
#: email/email.tmpl:1
msgid ""
"##\n"
@@ -87,3 +86,29 @@ msgid ""
"Bye\n"
msgstr ""
#: email/badfetch.tmpl:1
msgid ""
"##\n"
"## Bad URL Fetch Email template for SABnzbd\n"
"## This a Cheetah template\n"
"## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Newlines and whitespace are significant!\n"
"##\n"
"## These are the email headers\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd failed to fetch an NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## After this comes the body, the empty line is required!\n"
"\n"
"Hi,\n"
"\n"
"SABnzbd has failed to retrieve the NZB from $url.\n"
"The error message was: $msg\n"
"\n"
"Bye\n"
msgstr ""

View File

@@ -1,22 +1,21 @@
#
# SABnzbd Translation Template file
# Copyright (C) 2010 by the SABnzbd Team
# team@sabnzbd.org
# Danish translation for sabnzbd
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the sabnzbd package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.6.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-15 19:19+0000\n"
"PO-Revision-Date: 2011-01-15 19:31+0000\n"
"Last-Translator: shypike <Unknown>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-03-09 19:01+0000\n"
"PO-Revision-Date: 2012-03-14 04:51+0000\n"
"Last-Translator: Rene <Unknown>\n"
"Language-Team: Danish <da@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-01-16 05:17+0000\n"
"X-Generator: Launchpad (build 12177)\n"
"Language: da\n"
"X-Launchpad-Export-Date: 2012-03-15 05:11+0000\n"
"X-Generator: Launchpad (build 14933)\n"
#: email/email.tmpl:1
msgid ""
@@ -164,146 +163,50 @@ msgstr ""
"\n"
"Farvel\n"
#~ msgid ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has added $amount jobs to the queue\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "\n"
#~ "SABnzbd has added $amount job(s) to the queue.\n"
#~ "They are from RSS feed \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Bye\n"
#~ msgstr ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd har tilføjet $antal jobs til køen\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hej,\n"
#~ "\n"
#~ "SABnzbd har tilføjet $antal job(s) til køen.\n"
#~ "De er fra RSS feed \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Farvel\n"
#~ msgid ""
#~ "##\n"
#~ "## Default Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has <!--#if $status then \"completed\" else \"failed\" #--> "
#~ "job $name\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd has downloaded \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd has failed to download \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#end if#-->\n"
#~ "Finished at $end_time\n"
#~ "Downloaded $size\n"
#~ "\n"
#~ "Results of the job:\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Stage $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Output from user script \"$script\" (Exit code = $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "Enjoy!\n"
#~ "<!--#else#-->\n"
#~ "Sorry!\n"
#~ "<!--#end if#-->\n"
#~ msgstr ""
#~ "##\n"
#~ "## Default Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has <!--#if $status then \"completed\" else \"failed\" #--> "
#~ "job $name\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hej,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd har downloaded \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd har ikke downloaded \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#end if#-->\n"
#~ "Færdig kl. $end_time\n"
#~ "Downloaded $size\n"
#~ "\n"
#~ "Resultat af job:\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Stage $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Output from user script \"$script\" (Exit code = $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "Enjoy!\n"
#~ "<!--#else#-->\n"
#~ "Sorry!\n"
#~ "<!--#end if#-->\n"
#: email/badfetch.tmpl:1
msgid ""
"##\n"
"## Bad URL Fetch Email template for SABnzbd\n"
"## This a Cheetah template\n"
"## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Newlines and whitespace are significant!\n"
"##\n"
"## These are the email headers\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd failed to fetch an NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## After this comes the body, the empty line is required!\n"
"\n"
"Hi,\n"
"\n"
"SABnzbd has failed to retrieve the NZB from $url.\n"
"The error message was: $msg\n"
"\n"
"Bye\n"
msgstr ""
"##\n"
"## Bad URL Fetch Email template for SABnzbd\n"
"## This a Cheetah template\n"
"## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Newlines and whitespace are significant!\n"
"##\n"
"## These are the email headers\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd failed to fetch an NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## After this comes the body, the empty line is required!\n"
"\n"
"Hi,\n"
"\n"
"SABnzbd has failed to retrieve the NZB from $url.\n"
"The error message was: $msg\n"
"\n"
"Bye\n"

View File

@@ -1,22 +1,21 @@
#
# SABnzbd Translation Template file
# Copyright (C) 2010 by the SABnzbd Team
# team@sabnzbd.org
# German translation for sabnzbd
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the sabnzbd package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.6.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-15 19:19+0000\n"
"PO-Revision-Date: 2011-01-22 10:43+0000\n"
"Last-Translator: Severin Heiniger <severinheiniger@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-03-09 19:01+0000\n"
"PO-Revision-Date: 2011-06-26 10:50+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-01-23 05:11+0000\n"
"X-Generator: Launchpad (build 12177)\n"
"Language: de\n"
"X-Launchpad-Export-Date: 2012-03-11 05:02+0000\n"
"X-Generator: Launchpad (build 14914)\n"
#: email/email.tmpl:1
msgid ""
@@ -165,149 +164,28 @@ msgstr ""
" $job <!--#slurp#-->\n"
"<!--#end for#-->\n"
#~ msgid ""
#~ "##\n"
#~ "## Default Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has <!--#if $status then \"completed\" else \"failed\" #--> "
#~ "job $name\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd has downloaded \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd has failed to download \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#end if#-->\n"
#~ "Finished at $end_time\n"
#~ "Downloaded $size\n"
#~ "\n"
#~ "Results of the job:\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Stage $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Output from user script \"$script\" (Exit code = $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "Enjoy!\n"
#~ "<!--#else#-->\n"
#~ "Sorry!\n"
#~ "<!--#end if#-->\n"
#~ msgstr ""
#~ "#encoding UTF-8\n"
#~ "## Translation by Severin Heiniger\n"
#~ "##\n"
#~ "## Default Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd <!--#if $status then \"hat\" else \"konnte\" #--> Auftrag "
#~ "$name <!--#if $status then \"erfolgreich ausgeführt\" else \"nicht "
#~ "ausführen\" #-->\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd hat \"$name\" <!--#if $msgid==\"\" then \"\" else \"(Newzbin #\" + "
#~ "$msgid + \")\"#--> heruntergeladen\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd konnte \"$name\" <!--#if $msgid==\"\" then \"\" else \"(Newzbin #\" "
#~ "+ $msgid + \")\"#--> nicht herunterladen\n"
#~ "<!--#end if#-->\n"
#~ "Fertiggestellt: $end_time\n"
#~ "Heruntergeladen: $size\n"
#~ "\n"
#~ "Ergebnis des Auftrages:\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Stufe $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Ausgabe des Benutzerskripts \"$script\" (beendet mit Code $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "Viel Spass!\n"
#~ "<!--#else#-->\n"
#~ "Entschuldigung!\n"
#~ "<!--#end if#-->\n"
#~ msgid ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has added $amount jobs to the queue\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "\n"
#~ "SABnzbd has added $amount job(s) to the queue.\n"
#~ "They are from RSS feed \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Bye\n"
#~ msgstr ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has added $amount jobs to the queue\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "\n"
#~ "SABnzbd has added $amount job(s) to the queue.\n"
#~ "They are from RSS feed \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Bye\n"
#: email/badfetch.tmpl:1
msgid ""
"##\n"
"## Bad URL Fetch Email template for SABnzbd\n"
"## This a Cheetah template\n"
"## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Newlines and whitespace are significant!\n"
"##\n"
"## These are the email headers\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd failed to fetch an NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## After this comes the body, the empty line is required!\n"
"\n"
"Hi,\n"
"\n"
"SABnzbd has failed to retrieve the NZB from $url.\n"
"The error message was: $msg\n"
"\n"
"Bye\n"
msgstr ""

View File

@@ -1,22 +1,21 @@
#
# SABnzbd Translation Template file
# Copyright (C) 2010 by the SABnzbd Team
# team@sabnzbd.org
# French translation for sabnzbd
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the sabnzbd package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.6.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-15 19:19+0000\n"
"PO-Revision-Date: 2011-01-16 09:57+0000\n"
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-03-09 19:01+0000\n"
"PO-Revision-Date: 2012-03-18 07:02+0000\n"
"Last-Translator: Fox Ace <Unknown>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-01-17 05:03+0000\n"
"X-Generator: Launchpad (build 12177)\n"
"Language: fr\n"
"X-Launchpad-Export-Date: 2012-03-19 04:59+0000\n"
"X-Generator: Launchpad (build 14969)\n"
#: email/email.tmpl:1
msgid ""
@@ -150,14 +149,14 @@ msgstr ""
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd a ajouté $ à la file d'attente\n"
"Subject: SABnzbd a ajouté $amount fichier(s) à la file d'attente\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## Après cela vient le contenu, la ligne vide est nécessaire!\n"
"\n"
"Bonjour,\n"
"\n"
"SABnzbd a ajouté $ à la file d'attente.\n"
"SABnzbd a ajouté $amount fichier(s) à la file d'attente.\n"
"Ils proviennent du Flux RSS \"$feed\".\n"
"<!--#for $job in $jobs#-->\n"
" $job <!--#slurp#-->\n"
@@ -165,147 +164,50 @@ msgstr ""
"\n"
"Au Revoir\n"
#~ msgid ""
#~ "##\n"
#~ "## Default Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has <!--#if $status then \"completed\" else \"failed\" #--> "
#~ "job $name\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd has downloaded \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd has failed to download \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#end if#-->\n"
#~ "Finished at $end_time\n"
#~ "Downloaded $size\n"
#~ "\n"
#~ "Results of the job:\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Stage $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Output from user script \"$script\" (Exit code = $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "Enjoy!\n"
#~ "<!--#else#-->\n"
#~ "Sorry!\n"
#~ "<!--#end if#-->\n"
#~ msgstr ""
#~ "#encoding UTF-8\n"
#~ "##\n"
#~ "## Template Email pour SABnzbd\n"
#~ "## Ceci est un template Cheetah\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Les retours à la ligne et les espaces sont importants !\n"
#~ "##\n"
#~ "## Entêtes de l'email\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd <!--#if $status#-->Succès<!--#else#-->Echec<!--#end if#--> "
#~ "du téléchargement $name\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## Le contenu du message, la ligne vide est obligatoire !\n"
#~ "\n"
#~ "Bonjour,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd a téléchargé avec succès \"$name\" <!--#if $msgid==\"\" then \"\" "
#~ "else \"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd a téléchargé sans succès \"$name\" <!--#if $msgid==\"\" then \"\" "
#~ "else \"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#end if#-->\n"
#~ "Terminé à $end_time\n"
#~ "Téléchargé $size\n"
#~ "\n"
#~ "Résultat du téléchargement :\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Etape $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Sortie du script utilisateur \"$script\" (Code Retour = $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "A bientôt !\n"
#~ "<!--#else#-->\n"
#~ "Désolé !\n"
#~ "<!--#end if#-->\n"
#~ msgid ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has added $amount jobs to the queue\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "\n"
#~ "SABnzbd has added $amount job(s) to the queue.\n"
#~ "They are from RSS feed \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Bye\n"
#~ msgstr ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has added $amount jobs to the queue\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "\n"
#~ "SABnzbd has added $amount job(s) to the queue.\n"
#~ "They are from RSS feed \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Bye\n"
#: email/badfetch.tmpl:1
msgid ""
"##\n"
"## Bad URL Fetch Email template for SABnzbd\n"
"## This a Cheetah template\n"
"## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Newlines and whitespace are significant!\n"
"##\n"
"## These are the email headers\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd failed to fetch an NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## After this comes the body, the empty line is required!\n"
"\n"
"Hi,\n"
"\n"
"SABnzbd has failed to retrieve the NZB from $url.\n"
"The error message was: $msg\n"
"\n"
"Bye\n"
msgstr ""
"##\n"
"## Bad URL Fetch Email template for SABnzbd\n"
"## This a Cheetah template\n"
"## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Newlines and whitespace are significant!\n"
"##\n"
"## These are the email headers\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd failed to fetch an NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## After this comes the body, the empty line is required!\n"
"\n"
"Hi,\n"
"\n"
"SABnzbd has failed to retrieve the NZB from $url.\n"
"The error message was: $msg\n"
"\n"
"Bye\n"

View File

@@ -1,22 +1,21 @@
#
# SABnzbd Translation Template file
# Copyright (C) 2010 by the SABnzbd Team
# team@sabnzbd.org
# Norwegian Bokmal translation for sabnzbd
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the sabnzbd package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.6.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-15 19:19+0000\n"
"PO-Revision-Date: 2011-01-15 19:35+0000\n"
"Last-Translator: shypike <Unknown>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-03-09 19:01+0000\n"
"PO-Revision-Date: 2011-06-26 10:50+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-01-16 05:17+0000\n"
"X-Generator: Launchpad (build 12177)\n"
"Language: no\n"
"X-Launchpad-Export-Date: 2012-03-11 05:02+0000\n"
"X-Generator: Launchpad (build 14914)\n"
#: email/email.tmpl:1
msgid ""
@@ -166,148 +165,28 @@ msgstr ""
"\n"
"Hade\n"
#~ msgid ""
#~ "##\n"
#~ "## Default Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has <!--#if $status then \"completed\" else \"failed\" #--> "
#~ "job $name\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd has downloaded \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd has failed to download \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#end if#-->\n"
#~ "Finished at $end_time\n"
#~ "Downloaded $size\n"
#~ "\n"
#~ "Results of the job:\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Stage $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Output from user script \"$script\" (Exit code = $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "Enjoy!\n"
#~ "<!--#else#-->\n"
#~ "Sorry!\n"
#~ "<!--#end if#-->\n"
#~ msgstr ""
#~ "#encoding UTF-8\n"
#~ "## Translation by ProtX\n"
#~ "##\n"
#~ "## Default Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd har <!--#if $status then \"completed\" else \"failed\" #--> "
#~ "jobb $name\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hei,\n"
#~ "<!--#if $status #-->\n"
#~ "SABnzbd har lastet ned \"$name\" <!--#if $msgid==\"\" then \"\" else "
#~ "\"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#else#-->\n"
#~ "SABnzbd mislyktes med å laste ned \"$name\" <!--#if $msgid==\"\" then \"\" "
#~ "else \"(newzbin #\" + $msgid + \")\"#-->\n"
#~ "<!--#end if#-->\n"
#~ "Ferdig $end_time\n"
#~ "Nedlastet $size\n"
#~ "\n"
#~ "Resultat av jobben:\n"
#~ "<!--#for $stage in $stages #-->\n"
#~ "Steg $stage <!--#slurp#-->\n"
#~ "<!--#for $result in $stages[$stage]#-->\n"
#~ " $result <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#end for#-->\n"
#~ "<!--#if $script!=\"\" #-->\n"
#~ "Utskrift fra brukerskript \"$script\" (Exit code = $script_ret):\n"
#~ "$script_output\n"
#~ "<!--#end if#-->\n"
#~ "<!--#if $status #-->\n"
#~ "Gratulerer!\n"
#~ "<!--#else#-->\n"
#~ "Synd!\n"
#~ "<!--#end if#-->\n"
#~ msgid ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd has added $amount jobs to the queue\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## After this comes the body, the empty line is required!\n"
#~ "\n"
#~ "Hi,\n"
#~ "\n"
#~ "SABnzbd has added $amount job(s) to the queue.\n"
#~ "They are from RSS feed \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Bye\n"
#~ msgstr ""
#~ "##\n"
#~ "## RSS Email template for SABnzbd\n"
#~ "## This a Cheetah template\n"
#~ "## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
#~ "##\n"
#~ "## Newlines and whitespace are significant!\n"
#~ "##\n"
#~ "## These are the email headers\n"
#~ "to: $to\n"
#~ "from: $from\n"
#~ "date: $date\n"
#~ "subject: SABnzbd har lagt $amount jobber til køen\n"
#~ "X-priority: 5\n"
#~ "X-MS-priority: 5\n"
#~ "## Etter dette kommer meldingen, den tomme linjen er nødvendig!\n"
#~ "\n"
#~ "Hei,\n"
#~ "\n"
#~ "SABnzbd har lagt $amount jobb(er) til køen.\n"
#~ "Disse er fra RSS feeden \"$feed\".\n"
#~ "<!--#for $job in $jobs#-->\n"
#~ " $job <!--#slurp#-->\n"
#~ "<!--#end for#-->\n"
#~ "\n"
#~ "Hade\n"
#: email/badfetch.tmpl:1
msgid ""
"##\n"
"## Bad URL Fetch Email template for SABnzbd\n"
"## This a Cheetah template\n"
"## Documentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Newlines and whitespace are significant!\n"
"##\n"
"## These are the email headers\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd failed to fetch an NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## After this comes the body, the empty line is required!\n"
"\n"
"Hi,\n"
"\n"
"SABnzbd has failed to retrieve the NZB from $url.\n"
"The error message was: $msg\n"
"\n"
"Bye\n"
msgstr ""

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