Compare commits

...

87 Commits

Author SHA1 Message Date
ShyPike
7170325df5 Update text files for 0.7.2 Final 2012-07-17 21:46:17 +02:00
ShyPike
c44d98da66 When localhost resolves to ['127.0.0.1', '::1'] instead of ['::1', '127.0.0.1'], SABnzbd would try to register twice on '::1'. 2012-07-17 21:29:33 +02:00
ShyPike
018410afb0 Validate the values read from totals9.sab 2012-07-17 19:38:49 +02:00
ShyPike
fc47238a7a Temporary fix for missing NZB icon when associating NZB files on a system that had a 0.7.0 release installed. 2012-07-16 18:51:39 +02:00
ShyPike
9561b8a64e Update text files for 0.7.2 RC2 2012-07-14 17:01:07 +02:00
ShyPike
7b0e56b55f Fix little anomaly in Wizard-Four. 2012-07-14 15:16:30 +02:00
ShyPike
c6d5a79776 Improve web-host address selection on systems where the hostname does not resolve to an IP address. 2012-07-14 14:27:18 +02:00
ShyPike
faa4cacd3e Improve detection of bad articles.
For now, don't let precheck use "HEAD" until method is improved.
2012-07-14 13:12:22 +02:00
ShyPike
56e417eea1 Change nzbsrus support to use their API response codes. 2012-07-14 09:40:46 +02:00
ShyPike
5f02ec00f9 Don't show nonsense NZB age when still trying to get it from an indexer. 2012-07-13 21:29:37 +02:00
ShyPike
5ea35db922 Add limited API support for nzbsrus.com 2012-07-13 21:19:09 +02:00
ShyPike
5dcf26a56c Update text files for 0.7.2RC1 2012-07-12 21:45:13 +02:00
ShyPike
35b598d10e Improve detection (and ignoring) of invalid articles.
This also requires reading headers during pre-check instead of just asking for article presence.
2012-07-12 21:24:38 +02:00
ShyPike
5e7b27c4ef Prevent potential crash in NzbQueue.repair_job() 2012-07-12 18:28:17 +02:00
ShyPike
9ed408d35b Windows Installer: don't uninstall settings by default. 2012-07-12 18:19:19 +02:00
ShyPike
6c782fe255 Fix nzbrus.com fatal error (when <nzb is not within the first 100 characters of the file). 2012-07-10 23:01:11 +02:00
ShyPike
1689323dc3 Fix sorting of files in a job so that .rar comes before .r00 again. 2012-07-10 22:12:04 +02:00
ShyPike
a3c50a907a Fix wrapping problem of queue titles in Plush skin by inserting zero-width spaces in titles. 2012-07-10 19:59:59 +02:00
ShyPike
36a3792846 After setting quota for the first time, the initial "quota left" was set to the already consumed amount of the current period, instead of the actual still available amount (which is quota-consumed). 2012-07-08 11:45:09 +02:00
ShyPike
4cd0c0691a Windows installer: fix NZB association so that a Windows reboot is not required to register the NZB icon. 2012-07-08 11:33:57 +02:00
ShyPike
6ac98dcacd Handle incorrect regular expression in RSS filters.
Ignore during scanning and signal in user interface.
2012-07-08 10:45:57 +02:00
ShyPike
0a0d00930a Update text files for 0.7.1 Final. 2012-07-06 16:50:00 +02:00
ShyPike
28a0d041f9 Correction on fix 7258e56a20.
nzf.completed is a @property attribute and should not be set directly.
2012-07-06 16:40:36 +02:00
ShyPike
85bb91a7ea Disable VC90 check in Windows Installer as long as we're still on Python 2.5 2012-07-04 21:10:49 +02:00
ShyPike
6561e0abfa Make Windows path joining of base and category paths more robust to work around different behaviors in Python and Windows versions combinations. 2012-07-04 20:36:52 +02:00
ShyPike
6715e61a68 Try to check for "maintenance" mode of nzbsrus.com 2012-07-04 19:34:00 +02:00
ShyPike
a886b284b6 Prevent "not committed" flag in baseline variable for official builds. 2012-07-04 19:09:55 +02:00
ShyPike
a349c82b6f Update text files for 0.7.1RC5 2012-07-03 21:38:20 +02:00
ShyPike
1f4df0ebf4 Only send "bad fetch" emails when emails are enabled. 2012-07-03 21:28:59 +02:00
ShyPike
0221e7bf93 Add some support for nzbsrus.com's awkward non-VIP limiting. 2012-07-03 21:14:30 +02:00
ShyPike
f9cf14e7d8 Update text files for 0.7.1 Final. 2012-07-03 19:59:36 +02:00
ShyPike
7258e56a20 When retrying a job, existing files were not flagged properly as "completed", leading to an endless loop in par2 fetching. 2012-07-03 19:58:02 +02:00
ShyPike
90bd495d44 Update text files fr 0.7.1 Final. 2012-07-03 17:54:18 +02:00
shypike
6c216d6dfe Update translations 2012-07-03 17:49:10 +02:00
ShyPike
e1f3fae6c7 Windows installer: detect incompatible older version by looking for python27.dll. 2012-07-02 22:31:28 +02:00
ShyPike
29f126ca47 Make warning about Python3 easier to read. 2012-07-02 22:13:01 +02:00
shypike
8b4b742466 Remove remaining .py files from OSX DMG image, to prevent invalid signatures after first run. 2012-07-02 18:44:36 +02:00
ShyPike
57a9d362bc Update text files for 0.7.1RC4 2012-07-01 17:26:00 +02:00
ShyPike
b7d54c2bea Fix failure to grab NZBs from indexers that send compressed files. 2012-07-01 17:23:16 +02:00
ShyPike
59f9833076 Update text files for 0.7.1 RC3 2012-07-01 14:03:59 +02:00
ShyPike
8e360fe53e Improve retry handling of URL fetches.
Add detection of error messages from nzbsrus.com and handle retries accordingly.
2012-07-01 13:49:24 +02:00
ShyPike
afc5005382 Make sure that badly formatted or otherwise incorrect articles are retried on other servers (if fail_on_crc option is on).
Make default of fail_on_crc True.
2012-07-01 13:47:55 +02:00
ShyPike
3a531c6d2b API calls "addurl" and "addid" can use the same code so that either will take newzbin IDs or regular URLs. 2012-07-01 12:53:54 +02:00
ShyPike
f056ad6347 Solve problem of stalling par2 fetching.
The attributes of the vol-par files were analyzed to late,
leading to a race condition.
2012-07-01 10:01:56 +02:00
ShyPike
5c1342a663 Tell user that Python 3.0 won't work. 2012-07-01 09:12:25 +02:00
ShyPike
dfe8a47a2a Verification/repair would not be executed properly when one more RAR files missed their first article. 2012-06-26 23:26:38 +02:00
ShyPike
e293a439dd Don't set __verified__ flag file when more par2 files need to be fetched. 2012-06-26 22:24:01 +02:00
ShyPike
7e0027922a Prevent QuickCheck crash when expected par2 file wasn't downloaded (due to missing articles). 2012-06-26 19:12:56 +02:00
shypike
00b5302ba9 Update text files for 0.7.1 Final. 2012-06-25 22:40:39 +02:00
shypike
79488c4785 Add option to suppress listening on web host address ::1 2012-06-25 22:34:07 +02:00
ShyPike
c3d0438250 Update texts for 0.7.1 RC2 2012-06-23 12:31:14 +02:00
ShyPike
2909d4636b Fix parameter bug in Swedish translation. 2012-06-23 12:28:57 +02:00
shypike
a1ee8b6af4 Update translations 2012-06-23 12:20:05 +02:00
ShyPike
cfe3b58f7f On Windows, the Python runtime starts the wrong browser when using http://::1:8080/sabnzbd. Convert URL to http://[::1]:8080/sabnzbd. 2012-06-23 12:05:38 +02:00
ShyPike
ff6b87ef5b Improve the INI file handling.
Simplify and make the save more robust.
Use the INI.BAK file when the INI file is missing or corrupt.
2012-06-21 21:46:14 +02:00
ShyPike
8fbcfd0d5a Update text files for 0.7.1RC1 2012-06-20 20:54:53 +02:00
shypike
347ba999b4 Reduce amount of info requested when updating Windows Tray icon and OSX top menu.
The Windows Tray icon queried for free diskspace, while it is never shown.
The OSX top menu should query for no more queue entries than it will show (10).
The OSX top menu queue didn't show accented characters properly.
2012-06-20 20:48:55 +02:00
ShyPike
503bcf64c9 Prevent problems on systems that don't bother to resolve "localhost". 2012-06-19 22:31:47 +02:00
ShyPike
2a667470a1 Add retries when creating "final folder" to allow for slow activation of mounted volumes. 2012-06-19 19:05:33 +02:00
ShyPike
c61165b840 Plush: fix Speedlimit, Pause and Options pulldown menus for Mobile Safari. 2012-06-18 22:17:09 +02:00
ShyPike
3672189bc8 Remove another unwanted Windows DLL when building on Windows 7. 2012-06-16 13:41:44 +02:00
ShyPike
5b38c772fb When the "uname -n" name of a system doesn't resolve to an IP, only use 0.0.0.0 as hostname when the user hadn't set "localhost", "127.0.0.1" or "::1" as the hostname.
Otherwise any such system will still listen on the external IP despite the fact that user didn't want this.
2012-06-16 12:18:12 +02:00
ShyPike
f28bc4dd9c Windows: the installer did not set an icon for NZB files (association). 2012-06-16 10:45:04 +02:00
ShyPike
e16cc49a17 Config-skin: "server" field in Config->Servers should have html5 tag "text" instead of "url". 2012-06-16 10:44:48 +02:00
ShyPike
f686cc94fd Modify server test to please very critical Usenet server. 2012-06-16 10:44:32 +02:00
ShyPike
d88b5a3b3e Restore proper support for Python 2.5 on Windows by including curl tool again. 2012-06-10 15:35:56 +02:00
shypike
bccc5665f5 Prevent Growl crash at shutdown, due to accented characters in message. 2012-06-10 15:03:56 +02:00
ShyPike
69ac9d39ad Update text files for release 0.7.0Final. 2012-06-09 10:36:31 +02:00
ShyPike
b5b6999bc9 Default value of cache_limit should remain empty. 2012-06-09 10:25:09 +02:00
shypike
7ddb3d2752 Update translations 2012-06-08 18:49:31 +02:00
ShyPike
9febaf919c Update translations. 2012-06-06 17:34:12 +02:00
shypike
2225383485 Removed gntp and gnutext as required modules, because they are included in the distribution. 2012-06-06 17:36:32 +03:00
shypike
e3e500326c Update translations 2012-06-05 19:16:06 +02:00
ShyPike
b73570fe2a Update text files for 0.7.0 RC2 2012-06-02 21:24:08 +02:00
shypike
d1357875c9 Update translations 2012-06-02 21:23:33 +02:00
ShyPike
037c7661ea Suppress permission errors on paths containing ".AppleDouble" or ".DS_Store".
Common on NAS systems that support OSX with AFP shares.
2012-06-02 21:17:13 +02:00
ShyPike
5337ade3fb Set article cache to 200M when not already set. 2012-06-02 15:57:08 +02:00
ShyPike
504ce5458f Pre-check: lower default minimum completion rate to 100.2% 2012-06-01 19:43:07 +02:00
ShyPike
d8d3b60cbc Update text files for 0.7.0 RC1 2012-05-30 21:32:02 +02:00
ShyPike
0b0e7d5531 Pre-check: the required ratio for NZBs without par2 files should be 100% and not the "safe" ratio. 2012-05-30 21:28:24 +02:00
ShyPike
18cd9ab7ca Update text files for 0.7.0 RC1 2012-05-30 20:32:17 +02:00
shypike
1392b3b1eb Update translations 2012-05-30 20:29:56 +02:00
ShyPike
cd93abfab1 Fix for rare crash in par2 fetching. 2012-05-30 20:09:16 +02:00
ShyPike
9fede00949 Fix failing nomedia marker file (again). 2012-05-27 21:10:26 +02:00
ShyPike
6ddc3fec96 Windows SystemTray menu code sometimes times out when coming out of standby/hibernate. Catch exception and hope for the best... 2012-05-27 20:53:04 +02:00
ShyPike
f1030f9b6f Quota reset wasn't done when quota-reset-time was passed while SABnzbd wasn't running.
Due to not setting self.have_quota before reading the totals9.sab file.
2012-05-27 12:46:45 +02:00
shypike
6a8ff22f96 Fix error message. 2012-05-26 09:06:31 +02:00
46 changed files with 946 additions and 540 deletions

View File

@@ -1,5 +1,5 @@
*******************************************
*** This is SABnzbd 0.7.0 ***
*** This is SABnzbd 0.7.2 ***
*******************************************
SABnzbd is an open-source cross-platform binary newsreader.
It simplifies the process of downloading from Usenet dramatically,

View File

@@ -1,3 +1,91 @@
-------------------------------------------------------------------------------
0.7.2Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix for NZB-icon issue when 0.7.0 was previously installed
- Check validity of totals9.sab file
- Fix startup problem when localhost has unexpected order of IP addresses
-------------------------------------------------------------------------------
0.7.2RC2 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Improve support for nzbsrus.com
- Don't try to show NZB age when not known yet
- Prevent systems with unresolvable hostnames from always using 0.0.0.0
-------------------------------------------------------------------------------
0.7.2RC1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix fatal error in nzbsrus.com support
- Initial "quota left" was not set correctly when enabling quota
- Report incorrect RSS filter expressions (instead of aborting analysis)
- Improve detection of invalid articles (so that backup server will be tried)
- Windows installer: improve NZB association so that a reboot isn't needed
- Windows installer: don't remove settimngs by default when uninstalling
- Fix sorting of rar files in job so that .rar preceeds .r00
-------------------------------------------------------------------------------
0.7.1Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Disable VC90 check in Windows Installer as long as we're still on Python 2.5
- Windows: make sure \\server\share notation is never seen as a relative path
-------------------------------------------------------------------------------
0.7.1RC5 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix signing of OSX DMG
- Fix endless par2-fetch loop after retrying failed job
- Don't send "bad fetch" email when emailing is off
- Add some support for nzbrus.com's non-VIP limiting
-------------------------------------------------------------------------------
0.7.1RC4 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix failure to grab NZBs from indexers that send compressed files.
-------------------------------------------------------------------------------
0.7.1RC3 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fixed stalling par2 fetches (after first verification run)
- Fixed retry behaviour of NZB fetching from URL
and add handling of nzbsrus.com error codes
- Make sure that all malformed articles are retried on another server
- Add no_ipv6 option that suppresses listing on ::1
(to be used if your system cannot handle that)
- Prevent crash in QuickCheck when expected par2 file wasn't downloaded
- Verification/repair would not be executed properly when one more RAR files
missed their first article.
- API calls "addurl" and "addid" (newzbin) can be used interchangeably
(Fixes a problem in Qouch)
-------------------------------------------------------------------------------
0.7.1RC2 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Improved backup of sabnzbd.ini file
Will use backup when original is gone or become corrupt
- Windows: Using ::1 as single webhost address would start IE instead of default browser
-------------------------------------------------------------------------------
0.7.1RC1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Plush skin: fix problems with pull-down menus in Mobile Safari
- On some Linux and OSX systems using localhost would still make SABnzbd
give access to other computers
- Windows: the installer did not set an icon when associating NZB files with SABnzbd
- Fix problem that the Opera browser had with Config->Servers
- Retry a few times when accessing a mounted drive to create the
final destination folder
- Reduce load caused by WinTray and OSX topmenu
-------------------------------------------------------------------------------
0.7.0Final by The SABnzbd-Team
-------------------------------------------------------------------------------
- Updated translations
-------------------------------------------------------------------------------
0.7.0RC2 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Suppress permission errors on paths containing ".AppleDouble" or ".DS_Store"
(Required for NAS systems that support Apple AFP shares)
- OSX/Windows: Set article cache to 200M when not already set.
- Pre-check: lower default minimum completion rate to 100.2%
-------------------------------------------------------------------------------
0.7.0RC1 by The SABnzbd-Team
-------------------------------------------------------------------------------
- Fix for rare crash in par2 fetching
- Another /nomedia fix
- Quota reset wasn't done when quota-reset-time was passed while SABnzbd wasn't running.
- Pre-check: required ratio for NZB without par2 files should be 100%
and not the "safe" ratio
-------------------------------------------------------------------------------
0.7.0Beta8 by The SABnzbd-Team
-------------------------------------------------------------------------------

View File

@@ -1,4 +1,4 @@
SABnzbd 0.7.0
SABnzbd 0.7.2
-------------------------------------------------------------------------------
0) LICENSE
@@ -75,8 +75,6 @@ Optional modules
unzip >= 5.52 http://www.info-zip.org/
yenc module >= 0.3 http://sabnzbd.sourceforge.net/yenc-0.3.tar.gz
http://sabnzbd.sourceforge.net/yenc-0.3-w32fixed.zip (Win32-only)
gnu gettext http://www.gnu.org/software/gettext/
gntp https://github.com/kfdm/gntp/ (or use "pypm install gntp")
Optional modules Windows
pyopenssl >= 0.11 http://pypi.python.org/pypi/pyOpenSSL

View File

@@ -21,6 +21,7 @@
!include "MUI2.nsh"
!include "registerExtension.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
!include "WinVer.nsh"
!include "WinSxSQuery.nsh"
@@ -84,6 +85,7 @@
RMDir /r "${idir}\interfaces\wizard"
RMDir /r "${idir}\interfaces\Config"
RMDir "${idir}\interfaces"
RMDir /r "${idir}\win\curl"
RMDir /r "${idir}\win\par2"
RMDir /r "${idir}\win\unrar"
RMDir /r "${idir}\win\unzip"
@@ -244,6 +246,7 @@ Function .onInit
;--------------------------------
;make sure that the requires MS Runtimes are installed
;
goto nodownload ; Not needed while still using Python25
runtime_loop:
push 'msvcr90.dll'
push 'Microsoft.VC90.CRT,version="9.0.21022.8",type="win32",processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b"'
@@ -296,7 +299,7 @@ SetOutPath "$INSTDIR"
;------------------------------------------------------------------
; Make sure old versions are gone
IfFileExists $INSTDIR\sabnzbd.exe 0 endWarnExist
IfFileExists $INSTDIR\python25.dll 0 endWarnExist
IfFileExists $INSTDIR\python27.dll 0 endWarnExist
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(MsgRemoveOld)$\n$\n$(MsgRemoveOld2)" IDOK uninst
Abort
uninst:
@@ -348,8 +351,8 @@ Section $(MsgIcon) desktop
SectionEnd ; end of desktop icon section
Section /o $(MsgAssoc) assoc
${registerExtension} "$INSTDIR\nzb.ico" "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
;${registerExtension} "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
${registerExtension} "$INSTDIR\icons\nzb.ico" "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
${RefreshShellIcons}
SectionEnd ; end of file association section
; begin uninstall settings/section
@@ -405,11 +408,11 @@ Section "un.$(MsgDelProgram)" Uninstall
DeleteRegKey HKEY_CURRENT_USER "Software\SABnzbd"
${unregisterExtension} ".nzb" "NZB File"
${RefreshShellIcons}
SectionEnd ; end of uninstall section
Section "un.$(MsgDelSettings)" DelSettings
Section /o "un.$(MsgDelSettings)" DelSettings
DetailPrint "Uninstall settings $LOCALAPPDATA"
Delete "$LOCALAPPDATA\sabnzbd\sabnzbd.ini"
RMDir /r "$LOCALAPPDATA\sabnzbd"

View File

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

View File

@@ -4,12 +4,48 @@
\paperw11900\paperh16840\vieww16360\viewh15680\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\f0\b\fs48 \cf0 SABnzbd 0.7.0Beta8\
\f0\b\fs48 \cf0 SABnzbd 0.7.2\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
\b0\fs26 \cf0 \
\b What's new
\b Fixes in 0.7.2
\b0 \
- Improve support for nzbsrus.com\
- Don't try to show NZB age when not known yet\
- Prevent systems with unresolvable hostnames from always using 0.0.0.0\
- Initial "quota left" was not set correctly when enabling quota\
- Report incorrect RSS filter expressions (instead of aborting analysis)\
- Improve detection of invalid articles (so that backup server will be tried)\
- Windows installer: don't remove settings by default when uninstalling\
- Fix sorting of rar files in job so that .rar preceeds .r00\
- Fix for NZB-icon issue when 0.7.0 was previously installed\
- Fix startup problem on Windows when IPv4 has precedence over IPv6\
\
\b Fixes in 0.7.1
\b0 \
- Fixed problem were fetching par2 files after first verification could stall in the queue\
- Fixed retry behaviour of NZB fetching from URL (with handling of nzbsrus.com error codes)\
- Verification/repair would not be executed properly when one more RAR files missed their first article.\
- Improved backup of sabnzbd.ini file, now uses backup when original is gone or corrupt\
- Several translations extended/improved\
- Plush skin: fix problems with pull-down menus in Mobile Safari\
- On some Linux and OSX systems using localhost would still make SABnzbd give access to other computers\
- Windows: the installer did not set an icon when associating NZB files with SABnzbd\
- Fix problem that the Opera browser had with Config->Servers\
- Retry a few times when accessing a mounted drive to create the final destination folder\
- Minor fixes in Window Tray icon and OSX top menu\
- Add no_ipv6 special for systems that keep having issues with [::1]\
- Fix crash in QuickCheck when expected par2 file wasn't downloaded\
- API calls "addurl" and "addid" (newzbin) can now be used interchangeably\
- Fix endless par2-fetch loop after retrying failed job\
- Don't send "bad fetch" email when emailing is off\
- Add some support for nzbrus.com's non-VIP limiting\
- Fix signing of OSX DMG\
\
\b What's new in 0.7.0
\b0 \
- Download quota management\
- Windows: simple system tray menu\
@@ -29,14 +65,12 @@
- Individual RSS filter toggle\
- Unified OSX DMG\
\
For problems fixed in the various Betas, see CHANGELOG.txt\
\
\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\
thanks to its 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,\
@@ -49,7 +83,7 @@ There is an extensive Wiki on the use of SABnzbd.\
\
\b IMPORTANT INFORMATION
\b0 about release 0.7.0:\
\b0 about release 0.7.1:\
{\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/introducing-0-7-0"}}{\fldrslt http://wiki.sabnzbd.org/introducing-0-7-0}}\
\

View File

@@ -1,6 +1,42 @@
************************ SABnzbd 0.7.0Beta8 ************************
Release Notes - SABnzbd 0.7.2
===============================
What's new:
## Fixes in 0.7.2
- Improve support for nzbsrus.com
- Don't try to show NZB age when not known yet
- Prevent systems with unresolvable hostnames from always using 0.0.0.0
- Initial "quota left" was not set correctly when enabling quota
- Report incorrect RSS filter expressions (instead of aborting analysis)
- Improve detection of invalid articles (so that backup server will be tried)
- Windows installer: don't remove settings by default when uninstalling
- Fix sorting of rar files in job so that .rar preceeds .r00
- Fix for NZB-icon issue when 0.7.0 was previously installed
- Fix startup problem on Windows when IPv4 has precedence over IPv6
## Fixes in 0.7.1
- Fixed problem were fetching par2 files after first verification could stall in the queue
- Fixed retry behaviour of NZB fetching from URL (with handling of nzbsrus.com error codes)
- Verification/repair would not be executed properly when one more RAR files
missed their first article.
- Improved backup of sabnzbd.ini file, now uses backup when original is gone or corrupt
- Several translations extended/improved
- Plush skin: fix problems with pull-down menus in Mobile Safari
- On some Linux and OSX systems using localhost would still make SABnzbd
give access to other computers
- Windows: the installer did not set an icon when associating NZB files with SABnzbd
- Fix problem that the Opera browser had with Config->Servers
- Retry a few times when accessing a mounted drive to create the
final destination folder
- Minor fixes in Window Tray icon and OSX top menu
- Add no_ipv6 special for systems that keep having issues with [::1]
- Fix crash in QuickCheck when expected par2 file wasn't downloaded
- API calls "addurl" and "addid" (newzbin) can now be used interchangeably
- Fix endless par2-fetch loop after retrying failed job
- Don't send "bad fetch" email when emailing is off
- Add some support for nzbrus.com's non-VIP limiting
- Fix signing of OSX DMG
## What's new in 0.7.0
- Download quota management
- Windows: simple system tray menu
@@ -20,13 +56,11 @@ What's new:
- Individual RSS filter toggle
- Unified OSX DMG
For problems fixed in the various Betas, see CHANGELOG.txt
About:
## 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
thanks to its web-based user interface and advanced
built-in post-processing options that automatically verify, repair,
extract and clean up posts downloaded from Usenet.

View File

@@ -16,8 +16,8 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import sys
if sys.version_info < (2,5):
print "Sorry, requires Python 2.5 or higher."
if sys.version_info < (2, 5):
print "Sorry, requires Python 2.5, 2.6 or 2.7."
sys.exit(1)
import logging
@@ -253,6 +253,7 @@ def print_help():
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"
print " --no_ipv6 Do listen on IPv6 address [::1]"
def print_version():
print """
@@ -524,30 +525,24 @@ def all_localhosts():
return ips
def ipv_localhost(v):
""" Return True if localhost resolves to some IPV4 ('4') or IPV6 ('6') address
def check_resolve(host):
""" Return True if 'host' resolves
"""
try:
info = socket.getaddrinfo('localhost', None)
info = socket.getaddrinfo(host, None)
except:
# localhost does not resolve
# Does not resolve
return False
for item in info:
item = item[4][0]
if v == '4' and ':' not in item:
return True
elif v == '6' and ':' in item:
return True
return False
return True
#------------------------------------------------------------------------------
def get_webhost(cherryhost, cherryport, https_port):
""" Determine the webhost address and port,
return (host, port, browserhost)
"""
if cherryhost == '0.0.0.0' and not ipv_localhost('4'):
if cherryhost == '0.0.0.0' and not check_resolve('127.0.0.1'):
cherryhost = ''
elif cherryhost == '::' and not ipv_localhost('6'):
elif cherryhost == '::' and not check_resolve('::1'):
cherryhost = ''
if cherryhost is None:
@@ -562,9 +557,18 @@ def get_webhost(cherryhost, cherryport, https_port):
try:
info = socket.getaddrinfo(socket.gethostname(), None)
except:
# Hostname does not resolve, use 0.0.0.0
cherryhost = '0.0.0.0'
info = socket.getaddrinfo(localhost, None)
# Hostname does not resolve
try:
# Valid user defined name?
info = socket.getaddrinfo(cherryhost, None)
except:
if cherryhost not in ('localhost', '127.0.0.1', '::1'):
cherryhost = '0.0.0.0'
try:
info = socket.getaddrinfo(localhost, None)
except:
info = socket.getaddrinfo('127.0.0.1', None)
localhost = '127.0.0.1'
for item in info:
ip = str(item[4][0])
if ip.startswith('169.254.'):
@@ -670,13 +674,14 @@ def get_webhost(cherryhost, cherryport, 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()
if not (sabnzbd.cfg.no_ipv6() and '::1' in host):
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):
@@ -773,7 +778,7 @@ def evaluate_inipath(path):
inipath = os.path.join(path, DEF_INI_FILE)
if os.path.isdir(path):
return inipath
elif os.path.isfile(path):
elif os.path.isfile(path) or os.path.isfile(path + '.bak'):
return path
else:
dirpart, name = os.path.split(path)
@@ -836,7 +841,7 @@ def commandline_handler(frozen=True):
try:
opts, args = getopt.getopt(info, "phdvncw:l:s:f:t:b:2:",
['pause', 'help', 'daemon', 'nobrowser', 'clean', 'logging=',
'weblogging=', 'server=', 'templates',
'weblogging=', 'server=', 'templates', 'no_ipv6',
'template2', 'browser=', 'config-file=', 'force',
'version', 'https=', 'autorestarted', 'repair', 'repair-all',
'log-all', 'no-login', 'pid=', 'new', 'sessions', 'console',
@@ -914,6 +919,7 @@ def main():
new_instance = False
force_sessions = False
osx_console = False
no_ipv6 = False
service, sab_opts, serv_opts, upload_nzbs = commandline_handler()
@@ -1000,6 +1006,8 @@ def main():
elif opt in ('--console',):
re_argv.append(opt)
osx_console = True
elif opt in ('--no_ipv6',):
no_ipv6 = True
sabnzbd.MY_FULLNAME = os.path.normpath(os.path.abspath(sabnzbd.MY_FULLNAME))
sabnzbd.MY_NAME = os.path.basename(sabnzbd.MY_FULLNAME)
@@ -1053,7 +1061,7 @@ def main():
GetProfileInfo(vista_plus)
# Find out where INI file is
inifile = os.path.abspath(sabnzbd.DIR_PROG + '/' + DEF_INI_FILE)
if not os.path.exists(inifile):
if not os.path.exists(inifile) and not os.path.exists(inifile + '.bak'):
inifile = os.path.abspath(sabnzbd.DIR_LCLDATA + '/' + DEF_INI_FILE)
if sabnzbd.DARWIN:
copy_old_files(sabnzbd.DIR_LCLDATA)
@@ -1065,7 +1073,7 @@ def main():
# All system data dirs are relative to the place we found the INI file
sabnzbd.DIR_LCLDATA = os.path.dirname(inifile)
if not os.path.exists(inifile) and not os.path.exists(sabnzbd.DIR_LCLDATA):
if not os.path.exists(inifile) and not os.path.exists(inifile + '.bak') and not os.path.exists(sabnzbd.DIR_LCLDATA):
try:
os.makedirs(sabnzbd.DIR_LCLDATA)
except IOError:
@@ -1082,6 +1090,9 @@ def main():
# Set root folders for HTTPS server file paths
sabnzbd.cfg.set_root_folders2()
if no_ipv6:
sabnzbd.cfg.no_ipv6.set(True)
# Determine web host address
cherryhost, cherryport, browserhost, https_port = get_webhost(cherryhost, cherryport, https_port)
enable_https = sabnzbd.cfg.enable_https()
@@ -1359,8 +1370,8 @@ def main():
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 multilocal and cherryhost == 'localhost':
cherryhost = hosts[0]
if enable_https:
if https_port:
@@ -1804,4 +1815,4 @@ if __name__ == '__main__':
main()
else:
main()
main()

View File

@@ -208,6 +208,7 @@
<input type="hidden" name="feed" value="$feed"/>
<input type="hidden" name="session" value="$session">
<input type="submit" value="$T('button-save')"/>
<!--#if not $rss[$feed].filter_states[$fnum]#-->&nbsp;&nbsp;$T('Incorrect filter')<!--#end if#-->
</td>
</form>
</tr>

View File

@@ -100,7 +100,7 @@
</fieldset>
</div><!-- /col1 -->
</form>
</div>
</div>
<!--#end if#-->
@@ -341,6 +341,7 @@
<td>
<input type="submit" class="Save" value="$T('button-save')" />
<input type="button" class="delFilter" value="$T('button-x')" />
<!--#if not $rss[$feed].filter_states[$fnum]#-->&nbsp;&nbsp;$T('Incorrect filter')<!--#end if#-->
</td>
</tr>
</tbody>
@@ -510,7 +511,7 @@
}).done(function( msg ) {
location.reload();
});
} else {
} else {
return false;
}
});

View File

@@ -23,7 +23,7 @@
</div>
<div class="field-pair">
<label class="config" for="host">$T('srv-host')</label>
<input type="url" name="host" id="host" size="40" />
<input type="text" name="host" id="host" size="40" />
</div>
<div class="field-pair alt">
<label class="config" for="port">$T('srv-port')</label>
@@ -106,7 +106,7 @@
</div>
<div class="field-pair">
<label class="config" for="host$cur">$T('srv-host')</label>
<input type="url" name="host" id="host$cur" value="$servers[$server]['host']" size="40" />
<input type="text" name="host" id="host$cur" value="$servers[$server]['host']" size="40" />
</div>
<div class="field-pair alt">
<label class="config" for="port$cur">$T('srv-port')</label>

View File

@@ -310,6 +310,7 @@ $T('explain-RSS')
<input type="hidden" name="feed" value="$feed"/>
<input type="hidden" name="session" value="$session">
<input type="submit" class="juiButton" value="$T('button-save')"/>
<!--#if not $rss[$feed].filter_states[$fnum]#-->&nbsp;&nbsp;$T('Incorrect filter')<!--#end if#-->
</td>
</form>
</tr>

View File

@@ -56,7 +56,7 @@
</td>
<td class="download-title">
<a href="nzb/$slot.nzo_id/" title="$T('status'): $T('post-'+$slot.status)<br/>$T('nzo-age'): $slot.avg_age<br/><!--#if $slot.missing#-->$T('missingArt'): $slot.missing<!--#end if#-->">$slot.filename</a>
<a href="nzb/$slot.nzo_id/" title="$T('status'): $T('post-'+$slot.status)<br/>$T('nzo-age'): $slot.avg_age<br/><!--#if $slot.missing#-->$T('missingArt'): $slot.missing<!--#end if#-->">$slot.filename.replace('.', '.&#8203;').replace('_', '_&#8203;')</a>
</td>
<td>

View File

@@ -118,15 +118,19 @@ jQuery(function($){
// 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();
if (! $.browser.safari) {
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();
if (! $.browser.safari) {
e.preventDefault();
if( $(this).hasClass('sprite_q_queuesfHover') ) {
$(this).find("ul").toggle();
}
}
});

View File

@@ -213,6 +213,7 @@ MochiKit.DOM.addLoadEvent(location = "../../#config-rss");
<input type="hidden" name="index" value="$fnum"/>
<input type="hidden" name="feed" value="$feed"/>
<input type="submit" value="$T('button-save')" onclick="javascript:submitconfig('config/rss/upd_rss_filter', this,'$feed+$fnum','1' )"/>
<!--#if not $rss[$feed].filter_states[$fnum]#-->&nbsp;&nbsp;$T('Incorrect filter')<!--#end if#-->
</td>
</tr>

View File

@@ -8,9 +8,8 @@
<br/>
<div id="tips" class="hidden">
$T('wizard-tip1') <span class="bold">$T('wizard-tip2')</span><br/>
<!--#if len($urls) > 1#--><!--#set $s = 's'#--><!--#else#--><!--#set $s = ''#--><!--#end if#-->
<!--#set $tip3 = $T('wizard-tip3') % $s#-->
$tip3:<br/><br/>
<!--#set $tip3 = $T('wizard-tip3') % ''#-->
$tip3<br/><br/>
<div class="quoteBlock">
<!--#set $i = 0#-->
<!--#for $url in $urls#-->

View File

@@ -95,7 +95,7 @@ def PatchVersion(name):
try:
pipe = subprocess.Popen(GitStatus, shell=True, stdout=subprocess.PIPE).stdout
for line in pipe.read().split('\n'):
if 'nothing to commit' in line:
if 'nothing to commit' in line or 'nothing added to commit' in line:
state = ''
break
pipe.close()
@@ -432,6 +432,13 @@ if target == 'app':
os.system("cp README.rtf dist/SABnzbd.app/Contents/Resources/Credits.rtf >/dev/null")
os.system("find dist/SABnzbd.app -name .git | xargs rm -rf")
# Remove source files to prevent re-compilation, which would invalidate signing
py_ver = '%s.%s' % (sys.version_info[0], sys.version_info[1])
os.system("find dist/SABnzbd.app/Contents/Resources/lib/python%s/Cheetah -name '*.py' | xargs rm" % py_ver)
os.system("find dist/SABnzbd.app/Contents/Resources/lib/python%s/xml -name '*.py' | xargs rm" % py_ver)
os.remove('dist/SABnzbd.app/Contents/Resources/site.py')
os.system("sleep 5")
if OSX_LION:
# Sign the App if possible
authority = os.environ.get('SIGNING_AUTH')
@@ -447,16 +454,12 @@ if target == 'app':
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" '
'--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/OS X 10.6 and Above/SABnzbd.app/Contents/Resources/site.py' % volume)
os.remove('/Volumes/%s/OS X 10.5 and Below/SABnzbd.app/Contents/Resources/site.py' % volume)
#Unmount sparseimage
os.system("hdiutil eject /Volumes/%s/>/dev/null" % volume)
@@ -563,6 +566,7 @@ elif target in ('binary', 'installer'):
DeleteFiles(r'dist\lib\API-MS-Win-*.dll')
DeleteFiles(r'dist\lib\MSWSOCK.DLL')
DeleteFiles(r'dist\lib\POWRPROF.DLL')
DeleteFiles(r'dist\lib\KERNELBASE.dll')
############################
# Remove .git residue
@@ -570,10 +574,13 @@ elif target in ('binary', 'installer'):
############################
# Copy Curl if needed
if not (sys.version_info > (2, 5)):
if sys.version_info < (2, 6):
# Curl for Python 2.5
os.system(r'unzip -o win\curl\curl.zip -d dist\lib')
############################
# Fix icon issue with NZB association
os.system(r'copy dist\icons\nzb.ico dist')
############################
if target == 'installer':

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-07 20:21+0000\n"
"PO-Revision-Date: 2012-05-04 14:12+0000\n"
"Last-Translator: shypike <Unknown>\n"
"PO-Revision-Date: 2012-06-04 16:01+0000\n"
"Last-Translator: Thomas Lucke (Lucky) <Unknown>\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: 2012-05-08 05:37+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-06-05 05:13+0000\n"
"X-Generator: Launchpad (build 15353)\n"
#: SABnzbd.py:301 [Error message]
msgid "Failed to start web-interface"
@@ -91,7 +91,7 @@ msgstr "Ungültige Server-Adresse."
#: sabnzbd/utils/servertests.py:101
msgid "Server quit during login sequence."
msgstr ""
msgstr "Sever beendet beim Anmeldeverlauf."
#: sabnzbd/utils/servertests.py:123
msgid "Server requires username and password."
@@ -230,15 +230,15 @@ msgstr "Server-Adresse wird benötigt"
#: sabnzbd/config.py:207
msgid "Cannot create %s folder %s"
msgstr ""
msgstr "Kann kein %s Ordner %s erstellen"
#: sabnzbd/config.py:738 [Error message]
msgid "Cannot write to INI file %s"
msgstr ""
msgstr "Kann INI-Datei %s nicht schreiben"
#: sabnzbd/config.py:770 [Error message]
msgid "Cannot create backup file for %s"
msgstr ""
msgstr "Kann keine Sicherungsdatei erstellen für %s"
#: sabnzbd/config.py:894 [Error message]
msgid "Incorrectly encoded password %s"
@@ -664,7 +664,7 @@ msgstr "Zusammenfügen"
#: sabnzbd/newsunpack.py:359
msgid "Incomplete sequence of joinable files"
msgstr ""
msgstr "Unvollständiger Ablauf beim zusammenführen von Dateien"
#: sabnzbd/newsunpack.py:360 # sabnzbd/newsunpack.py:368
msgid "File join of %s failed"
@@ -704,7 +704,7 @@ msgstr "Löschen von %s fehlgeschlagen!"
#: sabnzbd/newsunpack.py:486
msgid "Trying unrar with password \"%s\""
msgstr ""
msgstr "Versuche entpacken mit Passwort \"%s\""
#: sabnzbd/newsunpack.py:494 [Error message] # sabnzbd/newsunpack.py:615
#: sabnzbd/newsunpack.py:616
@@ -1059,7 +1059,7 @@ msgstr "Neu starten"
#: sabnzbd/osxmenu.py:277 # sabnzbd/sabtray.py:59
msgid "Restart without login"
msgstr ""
msgstr "Neustart ohne Anmeldung"
#: sabnzbd/osxmenu.py:290
msgid "Quit"
@@ -1303,6 +1303,7 @@ msgstr ""
#: sabnzbd/postproc.py:260
msgid "Download might fail, only %s of required %s available"
msgstr ""
"Download wahrscheinlich fehlgeschlagen, nur %s von benötigten %s verfügbar"
#: sabnzbd/postproc.py:262
msgid "Download failed - Out of your server's retention?"
@@ -1330,7 +1331,7 @@ msgstr "Fehler beim Umbenennen von \"%s\" nach \"%s\""
#: sabnzbd/postproc.py:407
msgid "Failed to move files"
msgstr ""
msgstr "Dateien verschieben fehlgeschlagen"
#: sabnzbd/postproc.py:415
msgid "Running script"
@@ -1386,7 +1387,7 @@ msgstr "Nachbearbeitung"
#: sabnzbd/postproc.py:571
msgid "Trying SFV verification"
msgstr ""
msgstr "Versuche SFV-Überprüfung"
#: sabnzbd/postproc.py:574
msgid "Some files failed to verify against \"%s\""
@@ -1394,7 +1395,7 @@ msgstr "Überprüfung einiger Dateien mittels %s fehlgeschlagen"
#: sabnzbd/postproc.py:577
msgid "Verified successfully using SFV files"
msgstr ""
msgstr "Überprüfung mit SFV-Datei(en) erfolgreich"
#: sabnzbd/postproc.py:580
msgid "[%s] No par2 sets"
@@ -1438,7 +1439,7 @@ msgstr "RSS-Feed %s war leer"
#: sabnzbd/rss.py:361 # sabnzbd/rss.py:363
msgid "Incompatible feed"
msgstr ""
msgstr "Inkompatibeler RSS-Feed"
#: sabnzbd/rss.py:649 [Warning message]
msgid "Empty RSS entry found (%s)"
@@ -1450,7 +1451,7 @@ msgstr "Interface anzeigen"
#: sabnzbd/sabtray.py:58
msgid "Open complete folder"
msgstr ""
msgstr "Öffne Zielverzeichnis"
#: sabnzbd/sabtray.py:62 # sabnzbd/sabtray.py:131 # sabnzbd/skintext.py:57 [#: Config->Scheduler]
#: sabnzbd/skintext.py:150 # sabnzbd/skintext.py:493
@@ -1679,7 +1680,7 @@ msgstr "Parameter"
#: sabnzbd/skintext.py:99
msgid "Python Version"
msgstr ""
msgstr "Python Version"
#: sabnzbd/skintext.py:100 [Home page of the SABnzbd project]
msgid "Home page"
@@ -1787,7 +1788,7 @@ msgstr "Sortierung"
#: sabnzbd/skintext.py:134 [Main menu item]
msgid "Special"
msgstr ""
msgstr "Spezial"
#: sabnzbd/skintext.py:137
msgid "Download Dir"
@@ -2437,7 +2438,7 @@ msgstr "QR-Code"
#: sabnzbd/skintext.py:324 [Explanation for QR code of APIKEY]
msgid "API Key QR Code"
msgstr ""
msgstr "API-Key OR-Code"
#: sabnzbd/skintext.py:327
msgid "Folder configuration"
@@ -3062,7 +3063,7 @@ msgstr "Server überprüfen"
#: sabnzbd/skintext.py:477 [Button: Clear server's byte counters]
msgid "Clear Counters"
msgstr ""
msgstr "Zähler zurücksetzen"
#: sabnzbd/skintext.py:478
msgid "Testing server details..."
@@ -3291,6 +3292,9 @@ msgid ""
"If you have an account at <strong>www.newzbin2.es</strong>, you can enter "
"your account info here.<br />This will unlock extra functionality."
msgstr ""
"Wenn Sie ein Konto bei <strong>www.newzbin2.es</strong> haben, können Sie "
"hier Ihre Zugangsdaten eingeben.<br />Dies wird Zusatzfunktionen "
"freischalten."
#: sabnzbd/skintext.py:557
msgid "Account info"
@@ -3634,11 +3638,11 @@ msgstr "Tägliche Ordner"
#: sabnzbd/skintext.py:646 [Note for title expression in Sorting that does case adjustment]
msgid "case-adjusted"
msgstr ""
msgstr "Groß- / Kleinschreibung berücksichtigen"
#: sabnzbd/skintext.py:647
msgid "Processed Result"
msgstr ""
msgstr "Ergebnis"
#: sabnzbd/skintext.py:650
msgid ""
@@ -3647,6 +3651,10 @@ msgid ""
"Wiki first, as some have serious side-effects.<br>The default values are "
"between parentheses."
msgstr ""
"Selten genutzte Funktionen. Bedeutung und Erklärungen finden Sie per klick "
"auf den Hilfe-Button um auf die Wiki-Seite zu gelangen.<br>Änder nichts ohne "
"vorher das Wiki gelesen zu haben, da sonst schwerwiegende Nebeneffekte "
"auftreten können.<br>Die Ursprungswerte stehen zwischen den runden Klammern."
#: sabnzbd/skintext.py:654
msgid "Values"
@@ -3710,7 +3718,7 @@ msgstr "Neu laden"
#: sabnzbd/skintext.py:678 # sabnzbd/skintext.py:724
msgid "Options"
msgstr "Einstellungen"
msgstr "Optionen"
#: sabnzbd/skintext.py:679
msgid "Page"
@@ -3718,7 +3726,7 @@ msgstr "Seite"
#: sabnzbd/skintext.py:680 # sabnzbd/skintext.py:718 # sabnzbd/skintext.py:790
msgid "Prev"
msgstr "Züruck"
msgstr "Zurück"
#: sabnzbd/skintext.py:681 # sabnzbd/skintext.py:719 # sabnzbd/skintext.py:791
#: sabnzbd/skintext.py:823 [Button to go to next Wizard page]
@@ -4327,7 +4335,7 @@ msgstr "Sie benötigen einen NZBMatrix VIP-Konto, um die API zu nutzen"
#: sabnzbd/urlgrabber.py:288
msgid "Invalid nzbmatrix credentials"
msgstr ""
msgstr "Fehlerhafte nzbmatrix Anmeldedaten"
#: sabnzbd/urlgrabber.py:306
msgid "Problem accessing nzbmatrix server (%s)"

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-07 20:21+0000\n"
"PO-Revision-Date: 2012-05-24 17:54+0000\n"
"Last-Translator: Fox Ace <Unknown>\n"
"PO-Revision-Date: 2012-06-04 06:35+0000\n"
"Last-Translator: BigKids <bigkids@live.com>\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: 2012-05-25 05:12+0000\n"
"X-Generator: Launchpad (build 15288)\n"
"X-Launchpad-Export-Date: 2012-06-05 05:13+0000\n"
"X-Generator: Launchpad (build 15353)\n"
#: SABnzbd.py:301 [Error message]
msgid "Failed to start web-interface"
@@ -356,7 +356,7 @@ msgstr "Arrêt en cours..."
#: sabnzbd/emailer.py:78 # sabnzbd/emailer.py:80
msgid "Failed to connect to mail server"
msgstr "Échec de la connexion au serveur de mail"
msgstr "Échec lors de la connexion au serveur de courriel"
#: sabnzbd/emailer.py:92
msgid "Failed to initiate TLS connection"
@@ -432,7 +432,7 @@ msgstr "Post-traitement démarré"
#: sabnzbd/growler.py:58 [Message class for Growl server]
msgid "Job finished"
msgstr "Travail terminé"
msgstr "Tâche terminé"
#: sabnzbd/growler.py:59 [Message class for Growl server]
msgid "Other Messages"

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-07 20:21+0000\n"
"PO-Revision-Date: 2012-05-17 16:46+0000\n"
"PO-Revision-Date: 2012-06-06 09:39+0000\n"
"Last-Translator: shypike <Unknown>\n"
"Language-Team: Dutch <nl@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: 2012-05-18 05:04+0000\n"
"X-Generator: Launchpad (build 15259)\n"
"X-Launchpad-Export-Date: 2012-06-07 05:04+0000\n"
"X-Generator: Launchpad (build 15353)\n"
#: SABnzbd.py:301 [Error message]
msgid "Failed to start web-interface"
@@ -209,7 +209,7 @@ msgstr "Schrijf fout bij opslaan van bestand %s"
#: sabnzbd/assembler.py:110 [Warning message]
msgid "WARNING: Paused job \"%s\" because of encrypted RAR file"
msgstr "WARNING: Paused job \"%s\" because of encrypted RAR file"
msgstr "WAARSCHUWING: Item \"%s\" gepauzeerd vanwege versleuteld RAR bestand"
#: sabnzbd/assembler.py:142
msgid "%s missing"
@@ -233,7 +233,7 @@ msgstr "Kan %s map %s niet aanmaken"
#: sabnzbd/config.py:738 [Error message]
msgid "Cannot write to INI file %s"
msgstr "Schijven naar het INI bestand %s lukt niet"
msgstr "Schrijven naar het INI bestand %s lukt niet"
#: sabnzbd/config.py:770 [Error message]
msgid "Cannot create backup file for %s"
@@ -653,7 +653,7 @@ msgstr "Samenvoegen"
#: sabnzbd/newsunpack.py:359
msgid "Incomplete sequence of joinable files"
msgstr "onvolledige reeks van samenvoegbare bestanden"
msgstr "Onvolledige reeks van samenvoegbare bestanden"
#: sabnzbd/newsunpack.py:360 # sabnzbd/newsunpack.py:368
msgid "File join of %s failed"
@@ -1362,7 +1362,7 @@ msgstr "Probeer SFV verificatie"
#: sabnzbd/postproc.py:574
msgid "Some files failed to verify against \"%s\""
msgstr "Some files failed to verify against \"%s\""
msgstr "Sommige bestanden konden niet geverifieerd worden met \"%s\""
#: sabnzbd/postproc.py:577
msgid "Verified successfully using SFV files"

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-07 20:21+0000\n"
"PO-Revision-Date: 2012-05-14 15:48+0000\n"
"Last-Translator: shypike <Unknown>\n"
"PO-Revision-Date: 2012-05-31 09:53+0000\n"
"Last-Translator: Tomasz 'Zen' Napierala <tomasz@napierala.org>\n"
"Language-Team: Polish <pl@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: 2012-05-15 05:18+0000\n"
"X-Generator: Launchpad (build 15238)\n"
"X-Launchpad-Export-Date: 2012-06-01 05:45+0000\n"
"X-Generator: Launchpad (build 15342)\n"
#: SABnzbd.py:301 [Error message]
msgid "Failed to start web-interface"
@@ -27,25 +27,25 @@ msgstr "Nie ma szablonu: %s, użyto standardowego szablonu"
#: SABnzbd.py:464 [Error message]
msgid "_yenc module... NOT found!"
msgstr "modół _yenc ... NIE znaleziony!"
msgstr "moduł _yens... NIE znaleziono!"
#: SABnzbd.py:471 [Error message]
msgid "par2 binary... NOT found!"
msgstr "program par2 ... NIE znaleziony!"
msgstr "program par2 ... NIE znaleziono!"
#: SABnzbd.py:479 [Warning message]
msgid "unrar binary... NOT found"
msgstr "program unrar ... NIE znaleziony!"
msgstr "program unrar ... NIE znaleziono!"
#: SABnzbd.py:484 [Warning message]
msgid "unzip binary... NOT found!"
msgstr "program unzip ... NIE znaleziony!"
msgstr "program unzip ... NIE znaleziono!"
#: SABnzbd.py:634 [Warning message]
msgid ""
"Please be aware the 0.0.0.0 hostname will need an IPv6 address for external "
"access"
msgstr "0.0.0.0 potrzebuje adresu IPv6 do dostępu z zewnątrz"
msgstr "Nazwa hosta 0.0.0.0 wymaga adresu IPv6 do dostępu z zewnątrz"
#: SABnzbd.py:1350 [Warning message]
msgid "Disabled HTTPS because of missing CERT and KEY files"
@@ -57,7 +57,7 @@ msgstr "SABnabd został wyłączony"
#: sabnzbd/utils/servertests.py:35
msgid "The hostname is not set."
msgstr "Nazwa hosta nie jest ustawiona"
msgstr "Nazwa hosta nie została ustawiona."
#: sabnzbd/utils/servertests.py:41
msgid "There are no connections set. Please set at least one connection."
@@ -76,7 +76,7 @@ msgstr "Niewłaściwe dane serwera"
#: sabnzbd/utils/servertests.py:90
msgid "Timed out: Try enabling SSL or connecting on a different port."
msgstr ""
"Upłynął limit czasu odpowiedzi: Spróbuj włączyć SSL, lub połącz się z innym "
"Upłynął limit czasu odpowiedzi: Spróbuj włączyć SSL lub połącz się z innym "
"portem."
#: sabnzbd/utils/servertests.py:92
@@ -89,7 +89,7 @@ msgstr "Nieprawidłowy adres serwera."
#: sabnzbd/utils/servertests.py:101
msgid "Server quit during login sequence."
msgstr "Seerwer przerwał komunikację w trakcie logowania"
msgstr "Serwer przerwał komunikację w trakcie logowania"
#: sabnzbd/utils/servertests.py:123
msgid "Server requires username and password."
@@ -111,11 +111,11 @@ msgstr ""
#: sabnzbd/utils/servertests.py:135
msgid "Could not determine connection result (%s)"
msgstr "Nie mo określić rezultatu połączenia (%s)"
msgstr "Nie można określić rezultatu połączenia (%s)"
#: sabnzbd/__init__.py:160 [Warning message]
msgid "Signal %s caught, saving and exiting..."
msgstr "Sygnał %s został złapany, zapisuję i wychodzę..."
msgstr "Odebrano sygnał %s. Zapisywanie i i zamykanie programu..."
#: sabnzbd/__init__.py:463
msgid "fetching msgid %s from www.newzbin2.es"
@@ -143,7 +143,7 @@ msgstr "Próba ustawienia statusu nieistniejącego serwera %s"
#: sabnzbd/__init__.py:766 [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Zbyt mało miejsca, włączam PAUZĘ"
msgstr "Zbyt mało miejsca, wymuszanie WSTRZYMANIA"
#: sabnzbd/__init__.py:792 [Error message]
msgid "Failure in tempfile.mkstemp"

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-07 20:21+0000\n"
"PO-Revision-Date: 2012-05-12 02:05+0000\n"
"Last-Translator: lrrosa <Unknown>\n"
"PO-Revision-Date: 2012-06-17 22:15+0000\n"
"Last-Translator: diegosps <diegosps@gmail.com>\n"
"Language-Team: Brazilian Portuguese <pt_BR@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: 2012-05-13 04:57+0000\n"
"X-Generator: Launchpad (build 15225)\n"
"X-Launchpad-Export-Date: 2012-06-18 05:39+0000\n"
"X-Generator: Launchpad (build 15419)\n"
#: SABnzbd.py:301 [Error message]
msgid "Failed to start web-interface"
@@ -551,7 +551,7 @@ msgstr "domingo"
#: sabnzbd/interface.py:1920 ["Off" value for speedlimit in scheduler] # sabnzbd/skintext.py:97
msgid "off"
msgstr "desativado"
msgstr "desligado"
#: sabnzbd/interface.py:2274
msgid "&nbsp;Resolving address"
@@ -653,7 +653,7 @@ msgstr "Unindo"
#: sabnzbd/newsunpack.py:359
msgid "Incomplete sequence of joinable files"
msgstr "Sequência incompleta de arquivos acopláveis."
msgstr "Sequência de arquivos multiparte incompleta"
#: sabnzbd/newsunpack.py:360 # sabnzbd/newsunpack.py:368
msgid "File join of %s failed"
@@ -751,7 +751,7 @@ msgstr "A descompactação falhou. Este(s) arquivo(s) estão faltando:"
#: sabnzbd/newsunpack.py:668
msgid "Unpacked %s files/folders in %s"
msgstr "Descompactando %s arquivos/pastas em %s"
msgstr "Descompactados %s arquivos/pastas em %s"
#: sabnzbd/newsunpack.py:702
msgid "%s files in %s"
@@ -1369,7 +1369,7 @@ msgstr "Alguns arquivos falharam na verificação de \"%s\""
#: sabnzbd/postproc.py:577
msgid "Verified successfully using SFV files"
msgstr "Verificado com sucesso usando arquivos SFV"
msgstr "Verificado com sucesso. Usando arquivos SFV."
#: sabnzbd/postproc.py:580
msgid "[%s] No par2 sets"
@@ -1434,7 +1434,7 @@ msgstr "Encerrar"
#: sabnzbd/sabtray.py:84 # sabnzbd/skintext.py:766
msgid "Remaining"
msgstr "Restando"
msgstr "Restante"
#: sabnzbd/scheduler.py:81 [Warning message]
msgid "Bad schedule %s at %s:%s"
@@ -1466,7 +1466,7 @@ msgstr "Script"
#: sabnzbd/skintext.py:31 [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py:101 [Where to find the SABnzbd sourcecode]
msgid "Source"
msgstr "Origem"
msgstr "Código fonte"
#: sabnzbd/skintext.py:32 [PP Failure message]
msgid "Failure"
@@ -1646,7 +1646,7 @@ msgstr "Total"
#: sabnzbd/skintext.py:96
msgid "on"
msgstr "em"
msgstr "ligado"
#: sabnzbd/skintext.py:98 [Config: startup parameters of SABnzbd]
msgid "Parameters"
@@ -1822,7 +1822,7 @@ msgstr "Categoria"
#: sabnzbd/skintext.py:158 # sabnzbd/skintext.py:192 [Queue page table column header]
msgid "Processing"
msgstr "Processando"
msgstr "Processamento"
#: sabnzbd/skintext.py:160
msgid "Priority"
@@ -1890,7 +1890,7 @@ msgstr "Ordenar pelo nome"
#: sabnzbd/skintext.py:181 [Queue page button]
msgid "Sort by age"
msgstr "Ordenar por data"
msgstr "Ordenar por idade"
#: sabnzbd/skintext.py:182 [Queue page button]
msgid "Sort by size"
@@ -1950,7 +1950,7 @@ msgstr "Estimado"
#: sabnzbd/skintext.py:197 [Queue page table column header, "age of the NZB"]
msgid "AGE"
msgstr "DATA"
msgstr "IDADE"
#: sabnzbd/skintext.py:198 [Queue page table, "Delete" button]
msgid "Del"
@@ -2214,7 +2214,7 @@ msgstr "Host do SABnzbd"
#: sabnzbd/skintext.py:279
msgid "Host SABnzbd should listen on."
msgstr "Host onde o SABnzbd será ativado."
msgstr "Computador onde o SABnzbd ficará ativo."
#: sabnzbd/skintext.py:280
msgid "SABnzbd Port"
@@ -2274,7 +2274,7 @@ msgstr "não instalado"
#: sabnzbd/skintext.py:294
msgid "Enable accessing the interface from a HTTPS address."
msgstr "Ativar acesso à interface de um endereço HTTPS."
msgstr "Ativar acesso à interface por um endereço HTTPS."
#: sabnzbd/skintext.py:295
msgid "HTTPS Port"
@@ -2282,7 +2282,7 @@ msgstr "Porta HTTPS"
#: sabnzbd/skintext.py:296
msgid "If empty, the standard port will only listen to HTTPS."
msgstr "Se estiver vazio, a porta padrão só vai funcionar com HTTPS."
msgstr "Se estiver vazio, a porta padrão só irá funcionar com HTTPS."
#: sabnzbd/skintext.py:297
msgid "HTTPS Certificate"
@@ -2355,8 +2355,8 @@ msgid ""
"List of file extensions that should be deleted after download.<br />For "
"example: <b>.nfo</b> or <b>.nfo, .sfv</b>"
msgstr ""
"List of file extensions that should be deleted after download.<br />For "
"example: <b>.nfo</b> or <b>.nfo, .sfv</b>"
"Lista de extensões dos arquivos que devem ser excluídos após o download.<br "
"/>Por exemplo: <b>.nfo</b> ou então <b>.nfo, .sfv</b>"
#: sabnzbd/skintext.py:312
msgid "Save Changes"
@@ -2420,8 +2420,8 @@ msgid ""
"<em>NOTE:</em> Folders will be created automatically when Saving. You may "
"use absolute paths to save outside of the default folders."
msgstr ""
"<em>NOTA:</em>Pastas serão criadas automaticamente ao salvar. Você pode usar "
"caminhos absolutos para salvar fora das pastas padrão."
"<em>NOTA: </em>Pastas serão criadas automaticamente ao salvar. Você pode "
"usar caminhos absolutos para salvar fora das pastas padrão."
#: sabnzbd/skintext.py:329
msgid "User Folders"
@@ -2568,7 +2568,7 @@ msgstr "Local onde os arquivos .nzb serão armazenados."
#: sabnzbd/skintext.py:357
msgid "Default Base Folder"
msgstr "Pasta Principal Padrão"
msgstr "Pasta Inicial Padrão"
#: sabnzbd/skintext.py:360
msgid "Switches configuration"
@@ -2654,7 +2654,7 @@ msgstr "Pós-processar apenas os trabalhos verificados"
#: sabnzbd/skintext.py:379
msgid "Only perform post-processing on jobs that passed all PAR2 checks."
msgstr ""
"Realizar pós-processamento apenas em trabalhos que passaram todos as "
"Realizar pós-processamento apenas em trabalhos que passaram todas as "
"verificações PAR2."
#: sabnzbd/skintext.py:380
@@ -2735,7 +2735,7 @@ msgstr "Usado quando nenhum script de usuário é definido pela categoria."
#: sabnzbd/skintext.py:397
msgid "Pre-queue user script"
msgstr "Pré-fila do script de usuário"
msgstr "Script de usuário de pré-fila"
#: sabnzbd/skintext.py:398
msgid "Used before an NZB enters the queue."
@@ -2793,11 +2793,11 @@ msgstr "Enviar comando do grupo antes de solicitar artigos."
#: sabnzbd/skintext.py:414
msgid "Sort by Age"
msgstr "Ordernar por Data"
msgstr "Ordernar por Idade"
#: sabnzbd/skintext.py:415
msgid "Automatically sort items by (average) age."
msgstr "Classificar automaticamente os itens por média de data."
msgstr "Classificar automaticamente os itens por (média de) idade."
#: sabnzbd/skintext.py:416
msgid "Check for New Release"
@@ -2825,14 +2825,14 @@ msgstr "Substituir pontos por espaços no nome da pasta."
#: sabnzbd/skintext.py:422
msgid "Replace Illegal Characters in Folder Names"
msgstr "Substituir caracteres inválidos no nome das pastas"
msgstr "Substituir caracteres inválidos em nomes de pastas"
#: sabnzbd/skintext.py:423
msgid ""
"Replace illegal characters in folder names by equivalents (otherwise remove)."
msgstr ""
"Substituir caracteres inválidos por equivalentes no nome das pastas. Se não "
"for possível, remove-los-ei."
"Substituir caracteres inválidos em nomes de pastas por equivalentes (caso "
"contrário, removê-los)."
#: sabnzbd/skintext.py:424
msgid "Launch Browser on Startup"
@@ -2844,14 +2844,13 @@ msgstr "Abrir o navegador padrão ao iniciar o SABnzbd."
#: sabnzbd/skintext.py:426
msgid "Pause Downloading During Post-Processing"
msgstr "Pausar o download durante o pós processamento."
msgstr "Pausar o download durante o pós-processamento."
#: sabnzbd/skintext.py:427
msgid ""
"Pauses downloading at the start of post processing and resumes when finished."
msgstr ""
"Pausar o download no início de um pós processamento e resumir quando "
"finalizado."
"Pausar o download no início do pós-processamento e retomar quando concluído."
#: sabnzbd/skintext.py:428
msgid "Ignore Samples"
@@ -2875,7 +2874,7 @@ msgstr "Tipo SSL"
#: sabnzbd/skintext.py:434
msgid "Use V23 unless your provider requires otherwise!"
msgstr "Utilizar V23 a não ser que o seu provedor exija o contrário!"
msgstr "Utilize V23 a não ser que o seu provedor exija outro!"
#: sabnzbd/skintext.py:435
msgid "Use 12 hour clock (AM/PM)"
@@ -2891,7 +2890,7 @@ msgstr "Servidor"
#: sabnzbd/skintext.py:440
msgid "Post processing"
msgstr "Pós processamento"
msgstr "Pós-processamento"
#: sabnzbd/skintext.py:441
msgid "Naming"
@@ -2914,8 +2913,8 @@ msgid ""
"On which day of the month or week (1=Monday) does your ISP reset the quota? "
"(Optionally with hh:mm)"
msgstr ""
"Em que dia do mês ou semana (1=Segunda) seu ISP reseta sua quota? (Utilizar "
"opcionalmente hh:mm)"
"Em que dia do mês ou da semana (1 = segunda-feira) seu provedor de Internet "
"redefine sua quota? (Opcionalmente com hh: mm)"
#: sabnzbd/skintext.py:447 [Auto-resume download on the reset day]
msgid "Auto resume"
@@ -3156,7 +3155,8 @@ msgstr "Notificações de Disco Cheio"
#: sabnzbd/skintext.py:530
msgid "Send email when disk is full and SABnzbd is paused."
msgstr "Enviar email quando o disco estiver cheio e SABnzbd estiver pausado."
msgstr ""
"Enviar e-mail quando o disco estiver cheio e SABnzbd estiver pausado."
#: sabnzbd/skintext.py:531
msgid "Send RSS notifications"
@@ -3363,7 +3363,7 @@ msgstr ""
#: sabnzbd/skintext.py:584
msgid "Relative folders are based on"
msgstr "Baseado em pastas relativas"
msgstr "Caminho base das pastas relativas"
#: sabnzbd/skintext.py:585
msgid "Folder/Path"
@@ -3391,7 +3391,7 @@ msgstr "Ativa a ordenação e renomeação de episódios."
#: sabnzbd/skintext.py:594
msgid "Pattern Key"
msgstr "Chave de padrão"
msgstr "Modelo do padrão"
#: sabnzbd/skintext.py:595
msgid "Clear"
@@ -3411,7 +3411,7 @@ msgstr "Ordenação genérica"
#: sabnzbd/skintext.py:599
msgid "Enable Movie Sorting"
msgstr "Ativar a ordenação dos Filmes"
msgstr "Ativar a ordenação de filmes"
#: sabnzbd/skintext.py:600
msgid "Enable generic sorting and renaming of files."
@@ -3655,7 +3655,7 @@ msgstr "Assunto"
#: sabnzbd/skintext.py:669 [Job details page, file age column header] # sabnzbd/skintext.py:817
msgid "Age"
msgstr "Data"
msgstr "Idade"
#: sabnzbd/skintext.py:670 [Job details page, section header]
msgid "Selection"
@@ -3748,11 +3748,11 @@ msgstr "Pausar por 24 horas"
#: sabnzbd/skintext.py:698
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Ordenar por Data <small>Mais antigo&rarr;Mais novo</small>"
msgstr "Ordenar por Idade <small>Mais antigo&rarr;Mais novo</small>"
#: sabnzbd/skintext.py:699
msgid "Sort by Age <small>Newest&rarr;Oldest</small>"
msgstr "Ordenar por Data <small>Mais novo&rarr;Mais antigo</small>"
msgstr "Ordenar por Idade <small>Mais novo&rarr;Mais antigo</small>"
#: sabnzbd/skintext.py:700
msgid "Sort by Name <small>A&rarr;Z</small>"
@@ -3800,7 +3800,7 @@ msgstr "Armazenamento"
#: sabnzbd/skintext.py:717
msgid "View Script Log"
msgstr "Exibir Log de Script"
msgstr "Exibir Log do Script"
#: sabnzbd/skintext.py:721
msgid "You must enable JavaScript for Plush to function!"
@@ -3840,11 +3840,11 @@ msgstr "Ao Concluir"
#: sabnzbd/skintext.py:739
msgid "Sort by Age <small>(Oldest&rarr;Newest)</small>"
msgstr "Ordenar por Data <small>(Mais antigo&rarr;Mais novo)</small>"
msgstr "Ordenar por Idade <small>(Mais antigo&rarr;Mais novo)</small>"
#: sabnzbd/skintext.py:740
msgid "Sort by Age <small>(Newest&rarr;Oldest)</small>"
msgstr "Ordenar por Data <small>(Mais novo&rarr;Mais antigo)</small>"
msgstr "Ordenar por Idade <small>(Mais novo&rarr;Mais antigo)</small>"
#: sabnzbd/skintext.py:741
msgid "Sort by Name <small>(A&rarr;Z)</small>"
@@ -3904,7 +3904,7 @@ msgstr "Taxa de Atualização"
#: sabnzbd/skintext.py:756
msgid "Container Width"
msgstr "Largura do Contâiner"
msgstr "Largura do Contêiner"
#: sabnzbd/skintext.py:757
msgid "Confirm Queue Deletions"
@@ -4052,7 +4052,7 @@ msgstr "Obter Favoritos"
#: sabnzbd/skintext.py:809
msgid "Are you sure you want to restart SABnzbd?"
msgstr "Tem certeza que deseja reiniciar SABnzbd?"
msgstr "Tem certeza que deseja reiniciar o SABnzbd?"
#: sabnzbd/skintext.py:810
msgid "Refresh rate"
@@ -4097,11 +4097,11 @@ msgstr "Acesso"
#: sabnzbd/skintext.py:825
msgid "I want SABnzbd to be viewable by any pc on my network."
msgstr ""
"Quero que SABnzbd seja acessado de qualquer computador em minha rede."
"Quero que o SABnzbd seja acessado de qualquer computador em minha rede."
#: sabnzbd/skintext.py:826
msgid "I want SABnzbd to be viewable from my pc only."
msgstr "Quero que SABnzbd seja acessado somente pelo meu computador."
msgstr "Quero que o SABnzbd seja acessado somente pelo meu computador."
#: sabnzbd/skintext.py:827
msgid "Password protect access to SABnzbd (recommended)"
@@ -4199,23 +4199,23 @@ msgstr "SABnzbd agora será executado em segundo plano."
#: sabnzbd/skintext.py:850 [Wizard tip]
msgid "Closing any browser windows/tabs will NOT close SABnzbd."
msgstr "Fechar qualquer janela/aba do navegador NÃO vai fechar SABnzbd."
msgstr "Fechar qualquer janela/aba do navegador NÃO vai fechar o SABnzbd."
#: sabnzbd/skintext.py:851 [Wizard tip]
msgid ""
"After SABnzbd has finished restarting you will be able to access it at the "
"following location: %s"
msgstr ""
"Após SABnzbd ter reiniciado você será capaz de acessá-lo no seguinte local: "
"%s"
"Após o SABnzbd ter reiniciado você será capaz de acessá-lo no seguinte "
"local: %s"
#: sabnzbd/skintext.py:852 [Wizard tip]
msgid ""
"It is recommended you right click and bookmark this location and use this "
"bookmark to access SABnzbd when it is running in the background."
msgstr ""
"Recomenda-se que você adicione este local como favorito para acessar SABnzbd "
"quando ele estiver sendo executado em segundo plano."
"Recomenda-se que você adicione este local como favorito para acessar o "
"SABnzbd quando ele estiver sendo executado em segundo plano."
#: sabnzbd/skintext.py:853 [Will be appended with a wiki-link, adjust word order accordingly]
msgid "Further help can be found on our"
@@ -4223,7 +4223,7 @@ msgstr "Mais ajuda pode ser encontrada em nosso"
#: sabnzbd/skintext.py:854 [Wizard step]
msgid "Go to SABnzbd"
msgstr "Ir para SABnzbd"
msgstr "Ir para o SABnzbd"
#: sabnzbd/skintext.py:855 [Wizard step] # sabnzbd/wizard.py:86
msgid "Step One"

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-07 20:21+0000\n"
"PO-Revision-Date: 2012-05-15 20:07+0000\n"
"Last-Translator: Andreas Lindberg <andypandyswe@gmail.com>\n"
"PO-Revision-Date: 2012-06-23 10:27+0000\n"
"Last-Translator: shypike <Unknown>\n"
"Language-Team: Swedish <sv@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: 2012-05-16 05:28+0000\n"
"X-Generator: Launchpad (build 15247)\n"
"X-Launchpad-Export-Date: 2012-06-24 05:47+0000\n"
"X-Generator: Launchpad (build 15461)\n"
#: SABnzbd.py:301 [Error message]
msgid "Failed to start web-interface"
@@ -1110,6 +1110,8 @@ msgstr ""
msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr ""
"Om du får detta felmeddelande igen, var vänlig försök med en annan "
"siffra.<br>"
#: sabnzbd/panic.py:82
msgid ""
@@ -1121,6 +1123,15 @@ msgid ""
" <br>\n"
" Please restart SABnzbd with a different port number."
msgstr ""
"\n"
" SABnzbd behöver en tillgänglig tcp/ip port för dess interna web "
"server.<br>\n"
" Port %s på %s testades, men kontot som används för SABnzbd har inte "
"tillåtelse att använda den.<br>\n"
" På OSX och Linux-system måste normala användare använda portnummer 1023 "
"eller högre.<br>\n"
" <br>\n"
" Var vänlig starta om SABnzbd med ett annat portnummer."
#: sabnzbd/panic.py:96
msgid ""
@@ -1131,6 +1142,12 @@ msgid ""
" <br>\n"
" Please restart SABnzbd with a proper host address."
msgstr ""
"\n"
" SABnzbd behöver en giltig värdadress för dess interna webbserver.<br>\n"
" Du har specifierat en ogiltig adress.<br>\n"
" Säkra värdadresser är <b>localhost</b> och <b>0.0.0.0</b><br>\n"
" <br>\n"
" Var vänlig starta om SABnzbd med en giltig värdadress."
#: sabnzbd/panic.py:110
msgid ""
@@ -1142,6 +1159,14 @@ msgid ""
" This will erase the current queue and history!<br>\n"
" SABnzbd read the file \"%s\"."
msgstr ""
"\n"
" SABnzbd har upptäckt sparad data från en annan version av SABnzbd<br>\n"
" men kan inte återanvända datan från det andra programmet.<br><br>\n"
" Färdigställ dina nedladdningar med det andra programmet först.<br><br>\n"
" Därefter kan du starta det här programmet med alternativet \"--"
"clean\".<br>\n"
" Detta kommando kommer att ta bort din nuvarande kö och historik!<br>\n"
" SABnzbd read the file \"%s\"."
#: sabnzbd/panic.py:125
msgid ""
@@ -1150,10 +1175,14 @@ msgid ""
" Please install the program again.<br>\n"
" <br>\n"
msgstr ""
"\n"
" SABnzbd kan inte hitta webbgränssnittets filer i %s.<br>\n"
" Var vänlig installera om programmet.<br>\n"
" <br>\n"
#: sabnzbd/panic.py:132
msgid "SABnzbd detected a fatal error:"
msgstr ""
msgstr "SABnzbd upptäckte ett allvarligt fel:"
#: sabnzbd/panic.py:135
msgid ""
@@ -1165,10 +1194,17 @@ msgid ""
"program.<br><br>\n"
" Click OK to proceed to SABnzbd"
msgstr ""
"\n"
" SABnzbd upptäckte Kö and Historik från en äldre (0.4.x) "
"version.<br><br>\n"
" Både kö och historik kommer att ignoreras och kan försvinna!<br><br>\n"
" Du kan välja att stoppa SABnzbd och färdigställa nedladdningskön med den "
"äldre versionen.<br><br>\n"
" Klicka OK för att gå vidare till SABnzbd"
#: sabnzbd/panic.py:140
msgid "OK"
msgstr ""
msgstr "OK"
#: sabnzbd/panic.py:143
msgid ""
@@ -1179,22 +1215,29 @@ msgid ""
"to your virus-scanner vendor.<br>\n"
" <br>\n"
msgstr ""
"\n"
" SABnzbd upptäckte att filen sqlite3.dll saknas.<br><br>\n"
" Det händer att bristfälligt designade virusprogram tar bort denna "
"fil.<br>\n"
" Var vänlig kontrollera ditt virusprogram, försök installera om SABnzbd "
"och klaga till din återförsäljare.<br>\n"
" <br>\n"
#: sabnzbd/panic.py:154
msgid "Press Startkey+R and type the line (example):"
msgstr ""
msgstr "Tryck på Startknappen+R och skriv raden (exempel):"
#: sabnzbd/panic.py:157
msgid "Open a Terminal window and type the line (example):"
msgstr ""
msgstr "Öppna ett Terminal-fönster och skriv raden (exempel):"
#: sabnzbd/panic.py:177
msgid "It is likely that you are using ZoneAlarm on Vista.<br>"
msgstr ""
msgstr "Det är troligt att du använder ZoneAlarm på Vista.<br>"
#: sabnzbd/panic.py:188
msgid "Program did not start!"
msgstr ""
msgstr "Programmet startade inte!"
#: sabnzbd/panic.py:213 [Error message]
msgid "You have no permisson to use port %s"
@@ -1202,7 +1245,7 @@ msgstr "Du har ingen behörighet för att använda port %s"
#: sabnzbd/panic.py:229
msgid "Fatal error"
msgstr ""
msgstr "Allvarligt fel"
#: sabnzbd/panic.py:249 [Warning message]
msgid "Cannot launch the browser, probably not found"
@@ -1210,11 +1253,11 @@ msgstr "Kan inte starta webbläsaren, hittades troligtvis inte"
#: sabnzbd/panic.py:255
msgid "Access denied"
msgstr ""
msgstr "Åtkomst nekades"
#: sabnzbd/panic.py:256
msgid "Error %s: You need to provide a valid username and password."
msgstr ""
msgstr "Error %s: Du måste ange ett giltigt användarnamn och lösenord."
#: sabnzbd/postproc.py:97 [Warning message]
msgid ""
@@ -1230,6 +1273,7 @@ msgstr "Det gick inte att ta bort nzo från efterbehandlings kön (id)"
#: sabnzbd/postproc.py:260
msgid "Download might fail, only %s of required %s available"
msgstr ""
"Nerladdningen kan misslyckas, bara %s av krävda %s finns tillgängligt"
#: sabnzbd/postproc.py:262
msgid "Download failed - Out of your server's retention?"
@@ -1237,7 +1281,7 @@ msgstr "Hämtning misslyclades - Out of your server's retention?"
#: sabnzbd/postproc.py:316
msgid "Cannot create final folder %s"
msgstr ""
msgstr "Kan inte skapa slutgiltig mapp %s"
#: sabnzbd/postproc.py:338
msgid "No post-processing because of failed verification"
@@ -1257,7 +1301,7 @@ msgstr "Det gick inte att döpa om \"%s\" till \"%s\""
#: sabnzbd/postproc.py:407
msgid "Failed to move files"
msgstr ""
msgstr "Misslyckades med att flytta filer"
#: sabnzbd/postproc.py:415
msgid "Running script"
@@ -1281,11 +1325,11 @@ msgstr "Visa skriptutmatning"
#: sabnzbd/postproc.py:464
msgid "Download Completed"
msgstr ""
msgstr "Hämtningen slutfördes"
#: sabnzbd/postproc.py:467 # sabnzbd/postproc.py:476
msgid "Download Failed"
msgstr ""
msgstr "Hämtning misslyckades"
#: sabnzbd/postproc.py:471 [Error message]
msgid "Post Processing Failed for %s (%s)"
@@ -1293,11 +1337,11 @@ msgstr "Efterbehandling misslyckades för %s (%s)"
#: sabnzbd/postproc.py:474
msgid "see logfile"
msgstr ""
msgstr "se loggfil"
#: sabnzbd/postproc.py:475
msgid "PostProcessing was aborted (%s)"
msgstr ""
msgstr "Efterbehandling avbröts (%s)"
#: sabnzbd/postproc.py:509 [Error message]
msgid "Cleanup of %s failed."
@@ -1309,11 +1353,11 @@ msgstr "Det gick inte att ta bort arbetsmapp (%s)"
#: sabnzbd/postproc.py:531
msgid "Post-processing"
msgstr ""
msgstr "Efterbehandling"
#: sabnzbd/postproc.py:571
msgid "Trying SFV verification"
msgstr ""
msgstr "Försöker verifiera SFV"
#: sabnzbd/postproc.py:574
msgid "Some files failed to verify against \"%s\""
@@ -1321,7 +1365,7 @@ msgstr "Some files failed to verify against \"%s\""
#: sabnzbd/postproc.py:577
msgid "Verified successfully using SFV files"
msgstr ""
msgstr "Verifieringen lyckades med SFV-filer"
#: sabnzbd/postproc.py:580
msgid "[%s] No par2 sets"
@@ -1333,7 +1377,7 @@ msgstr "Borttagning av %s misslyckades"
#: sabnzbd/powersup.py:39 [Error message]
msgid "Failed to hibernate system"
msgstr ""
msgstr "Kunde inte sätta systemet i vänteläge"
#: sabnzbd/powersup.py:50 [Error message] # sabnzbd/powersup.py:93 [Error message]
msgid "Failed to standby system"
@@ -1341,7 +1385,7 @@ msgstr "Det gick inte att sätta systemet i viloläge"
#: sabnzbd/powersup.py:81 [Error message]
msgid "Error while shutting down system"
msgstr ""
msgstr "Fel uppstod då systemet skulle stängas"
#: sabnzbd/rss.py:128 [Error message]
msgid "Could not compile regex: %s"
@@ -1357,15 +1401,15 @@ msgstr "Det gick inte att hämta RSS flödet från %s: %s"
#: sabnzbd/rss.py:334
msgid "Do not have valid authentication for feed %s"
msgstr ""
msgstr "Har inte giltig autentisering för flöde %s"
#: sabnzbd/rss.py:344
msgid "RSS Feed %s was empty"
msgstr ""
msgstr "RSS-flödet %s var tomt"
#: sabnzbd/rss.py:361 # sabnzbd/rss.py:363
msgid "Incompatible feed"
msgstr ""
msgstr "Inkompatibel feed"
#: sabnzbd/rss.py:649 [Warning message]
msgid "Empty RSS entry found (%s)"
@@ -1373,11 +1417,11 @@ msgstr "Tom RSS post hittades (%s)"
#: sabnzbd/sabtray.py:57
msgid "Show interface"
msgstr ""
msgstr "Visa gränssnitt"
#: sabnzbd/sabtray.py:58
msgid "Open complete folder"
msgstr ""
msgstr "Öppna färdig mapp"
#: sabnzbd/sabtray.py:62 # sabnzbd/sabtray.py:131 # sabnzbd/skintext.py:57 [#: Config->Scheduler]
#: sabnzbd/skintext.py:150 # sabnzbd/skintext.py:493
@@ -1418,11 +1462,11 @@ msgstr "Skript"
#: sabnzbd/skintext.py:31 [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py:101 [Where to find the SABnzbd sourcecode]
msgid "Source"
msgstr ""
msgstr "Källa"
#: sabnzbd/skintext.py:32 [PP Failure message]
msgid "Failure"
msgstr ""
msgstr "Misslyckades"
#: sabnzbd/skintext.py:34 [PP status] # sabnzbd/skintext.py:226 [History: job status]
msgid "Completed"
@@ -1434,7 +1478,7 @@ msgstr "Misslyckades"
#: sabnzbd/skintext.py:36 [Queue and PP status]
msgid "Waiting"
msgstr ""
msgstr "Väntar"
#: sabnzbd/skintext.py:38 [PP status]
msgid "Repairing..."
@@ -1470,11 +1514,11 @@ msgstr "Laddar ner"
#: sabnzbd/skintext.py:46 [Pseudo-PP status, in reality used for Grabbing status]
msgid "Get NZB"
msgstr ""
msgstr "Lägg till NZB"
#: sabnzbd/skintext.py:47 [PP status]
msgid "Checking"
msgstr ""
msgstr "Kontrollerar"
#: sabnzbd/skintext.py:49 [#: Config->Scheduler] # sabnzbd/skintext.py:485
msgid "Frequency"
@@ -1518,19 +1562,19 @@ msgstr "Återuppta efterbehandla"
#: sabnzbd/skintext.py:64 [#: Config->Scheduler]
msgid "Read RSS feeds"
msgstr ""
msgstr "Läs RSS-flöden"
#: sabnzbd/skintext.py:69 [Speed indicator kilobytes/sec]
msgid "KB/s"
msgstr ""
msgstr "KB/s"
#: sabnzbd/skintext.py:70 [Megabytes]
msgid "MB"
msgstr ""
msgstr "MB"
#: sabnzbd/skintext.py:71 [Gigabytes]
msgid "GB"
msgstr ""
msgstr "GB"
#: sabnzbd/skintext.py:72 [One hour]
msgid "hour"
@@ -1558,15 +1602,15 @@ msgstr "sekunder"
#: sabnzbd/skintext.py:78
msgid "day"
msgstr ""
msgstr "dag"
#: sabnzbd/skintext.py:79
msgid "days"
msgstr ""
msgstr "dagar"
#: sabnzbd/skintext.py:80
msgid "week"
msgstr ""
msgstr "vecka"
#: sabnzbd/skintext.py:81
msgid "Month"
@@ -1598,23 +1642,23 @@ msgstr "Totalt"
#: sabnzbd/skintext.py:96
msgid "on"
msgstr ""
msgstr "den"
#: sabnzbd/skintext.py:98 [Config: startup parameters of SABnzbd]
msgid "Parameters"
msgstr ""
msgstr "Parametrar"
#: sabnzbd/skintext.py:99
msgid "Python Version"
msgstr ""
msgstr "Python-version"
#: sabnzbd/skintext.py:100 [Home page of the SABnzbd project]
msgid "Home page"
msgstr ""
msgstr "Webbplats"
#: sabnzbd/skintext.py:102 [Used in "IRC or IRC-Webaccess"]
msgid "or"
msgstr ""
msgstr "eller"
#: sabnzbd/skintext.py:105 [SABnzbd's theme line]
msgid "The automatic usenet download tool"
@@ -1630,7 +1674,7 @@ msgstr "Köad"
#: sabnzbd/skintext.py:109 [Generic "Delete" button, short form] # sabnzbd/skintext.py:513 [Config->RSS button "Delete filter"] # sabnzbd/skintext.py:587
msgid "X"
msgstr ""
msgstr "X"
#: sabnzbd/skintext.py:110 [Used in confirmation popups] # sabnzbd/skintext.py:712
msgid "Are you sure?"
@@ -1638,7 +1682,7 @@ msgstr "Är du säker?"
#: sabnzbd/skintext.py:111 [Used in confirmation popups]
msgid "Delete all downloaded files?"
msgstr ""
msgstr "Ta bort alla nedladdade filer?"
#: sabnzbd/skintext.py:114 [Main menu item]
msgid "Home"
@@ -1650,7 +1694,7 @@ msgstr "Konfiguration"
#: sabnzbd/skintext.py:118 [Main menu item] # sabnzbd/skintext.py:228 [History table header]
msgid "Status"
msgstr ""
msgstr "Status"
#: sabnzbd/skintext.py:119 [Main menu item] # sabnzbd/skintext.py:833 [Wizard help link]
msgid "Help"
@@ -1658,15 +1702,15 @@ msgstr "Hjälp"
#: sabnzbd/skintext.py:120 [Main menu item]
msgid "Wiki"
msgstr ""
msgstr "Wiki"
#: sabnzbd/skintext.py:121 [Main menu item]
msgid "Forum"
msgstr ""
msgstr "Forum"
#: sabnzbd/skintext.py:122 [Main menu item]
msgid "IRC"
msgstr ""
msgstr "IRC"
#: sabnzbd/skintext.py:123 [Main menu item] # sabnzbd/skintext.py:437
msgid "General"
@@ -1690,11 +1734,11 @@ msgstr "Schemaläggare"
#: sabnzbd/skintext.py:128 [Main menu item]
msgid "RSS"
msgstr ""
msgstr "RSS"
#: sabnzbd/skintext.py:129 [Main menu item] # sabnzbd/skintext.py:523 [Main Config page] # sabnzbd/skintext.py:544 [Section header]
msgid "Notifications"
msgstr ""
msgstr "Meddelanden"
#: sabnzbd/skintext.py:130 [Main menu item]
msgid "Email"
@@ -1714,7 +1758,7 @@ msgstr "Sortering"
#: sabnzbd/skintext.py:134 [Main menu item]
msgid "Special"
msgstr ""
msgstr "Speciell"
#: sabnzbd/skintext.py:137
msgid "Download Dir"
@@ -1738,7 +1782,7 @@ msgstr "Sparat %s artiklar (%s)"
#: sabnzbd/skintext.py:143
msgid "Sysload"
msgstr ""
msgstr "Systembelastning"
#: sabnzbd/skintext.py:144
msgid "WARNINGS"
@@ -1794,11 +1838,11 @@ msgstr "+Ta bort"
#: sabnzbd/skintext.py:165
msgid "&nbsp;"
msgstr ""
msgstr "&nbsp;"
#: sabnzbd/skintext.py:166
msgid "R"
msgstr ""
msgstr "R"
#: sabnzbd/skintext.py:167
msgid "U"
@@ -1814,7 +1858,7 @@ msgstr "Tvinga"
#: sabnzbd/skintext.py:171
msgid "Normal"
msgstr ""
msgstr "Normal"
#: sabnzbd/skintext.py:172
msgid "High"
@@ -1826,7 +1870,7 @@ msgstr "Låg"
#: sabnzbd/skintext.py:175
msgid "Stop"
msgstr ""
msgstr "Stopp"
#: sabnzbd/skintext.py:176
msgid "Enter URL"
@@ -1898,7 +1942,7 @@ msgstr "Återstår/Totalt"
#: sabnzbd/skintext.py:196 [Queue page table column header, "estimated time of arrival"]
msgid "ETA"
msgstr ""
msgstr "Tid kvar"
#: sabnzbd/skintext.py:197 [Queue page table column header, "age of the NZB"]
msgid "AGE"
@@ -1910,15 +1954,15 @@ msgstr "Ta bort"
#: sabnzbd/skintext.py:201 [Queue page button]
msgid "Retry"
msgstr ""
msgstr "Försök igen"
#: sabnzbd/skintext.py:202 [Queue end-of-queue selection box] # sabnzbd/skintext.py:774
msgid "Actions"
msgstr ""
msgstr "Åtgärder"
#: sabnzbd/skintext.py:203 [Queue page table, script selection menu]
msgid "Scripts"
msgstr ""
msgstr "Skript"
#: sabnzbd/skintext.py:205 [Confirmation popup]
msgid "Delete all items from the queue?"
@@ -1926,51 +1970,51 @@ msgstr "Ta bort alla saker från kön?"
#: sabnzbd/skintext.py:206 [Queue page button]
msgid "Purge NZBs"
msgstr ""
msgstr "Rensa NZB:er"
#: sabnzbd/skintext.py:207 [Queue page button]
msgid "Purge NZBs & Delete Files"
msgstr ""
msgstr "Rensa NZB:er och ta bort filer"
#: sabnzbd/skintext.py:208 [Queue page button]
msgid "Remove NZB"
msgstr ""
msgstr "Ta bort NZB"
#: sabnzbd/skintext.py:209 [Queue page button]
msgid "Remove NZB & Delete Files"
msgstr ""
msgstr "Ta bort NZB och filer"
#: sabnzbd/skintext.py:210 [Queue page, as in "4G *of* 10G"]
msgid "of"
msgstr ""
msgstr "av"
#: sabnzbd/skintext.py:211 [Caption for missing articles in Queue]
msgid "Missing articles"
msgstr ""
msgstr "Saknade artiklar"
#: sabnzbd/skintext.py:212 [Remaining quota (displayed in Queue)]
msgid "Quota left"
msgstr ""
msgstr "Kvot kvar"
#: sabnzbd/skintext.py:213 [Manual reset of quota]
msgid "manual"
msgstr ""
msgstr "handbok"
#: sabnzbd/skintext.py:214
msgid "Reset Quota now"
msgstr ""
msgstr "Återställ Kvot nu"
#: sabnzbd/skintext.py:218 [History page button]
msgid "Purge Failed History"
msgstr ""
msgstr "Rensa Misslyckad Historik"
#: sabnzbd/skintext.py:219 [Confirmation popup]
msgid "Delete all completed items from History?"
msgstr ""
msgstr "Ta bort alla slutförda objekt från Historik?"
#: sabnzbd/skintext.py:220 [Confirmation popup]
msgid "Delete all failed items from History?"
msgstr ""
msgstr "Ta bort alla misslyckade objekt från Historik?"
#: sabnzbd/skintext.py:221 [Button/link hiding History job details]
msgid "Hide details"
@@ -1986,11 +2030,11 @@ msgstr "Historikstorlek"
#: sabnzbd/skintext.py:224 [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!]
msgid "Show Failed"
msgstr ""
msgstr "Visa Misslyckade"
#: sabnzbd/skintext.py:225 [Button or link showing all History jobs]
msgid "Show All"
msgstr ""
msgstr "Visa alla"
#: sabnzbd/skintext.py:227 [History table header] # sabnzbd/skintext.py:443 [Size of the download quota] # sabnzbd/skintext.py:784
msgid "Size"
@@ -1998,19 +2042,19 @@ msgstr "Storlek"
#: sabnzbd/skintext.py:229 [Button to delete all failed jobs in History]
msgid "Purge Failed NZBs"
msgstr ""
msgstr "Rensa Misslyckade NZB:er."
#: sabnzbd/skintext.py:230 [Button to delete all failed jobs in History, including files]
msgid "Purge Failed NZBs & Delete Files"
msgstr ""
msgstr "Rensa Misslyckade NZB:er och ta bort filer"
#: sabnzbd/skintext.py:231 [Button to delete all completed jobs in History]
msgid "Purge Completed NZBs"
msgstr ""
msgstr "Rensa färdiga NZB:er"
#: sabnzbd/skintext.py:232 [Button to add NZB to failed job in History]
msgid "Optional Supplemental NZB"
msgstr ""
msgstr "Valfri Kompletterande NZB"
#: sabnzbd/skintext.py:233 [Path as displayed in History details] # sabnzbd/skintext.py:715 # sabnzbd/skintext.py:785
msgid "Path"
@@ -2046,11 +2090,11 @@ msgstr "Fel/Varning"
#: sabnzbd/skintext.py:244 [Status page logging selection value]
msgid "+ Info"
msgstr ""
msgstr "+ Info"
#: sabnzbd/skintext.py:245 [Status page logging selection value]
msgid "+ Debug"
msgstr ""
msgstr "+ Debug"
#: sabnzbd/skintext.py:246 [Status page tab header] # sabnzbd/skintext.py:468 [Server: amount of connections]
msgid "Connections"
@@ -2078,15 +2122,15 @@ msgstr "Ta bort blockering"
#: sabnzbd/skintext.py:252 [Status page, article identifier]
msgid "Article identifier"
msgstr ""
msgstr "Artikel-ID"
#: sabnzbd/skintext.py:253 [Status page, par-set that article belongs to]
msgid "File set"
msgstr ""
msgstr "Filuppsättning"
#: sabnzbd/skintext.py:254 [Status page, table column header, when error occured]
msgid "When"
msgstr ""
msgstr "När"
#: sabnzbd/skintext.py:255 [Status page, table column header, type of message] # sabnzbd/skintext.py:506 [Config->RSS table column header]
msgid "Type"
@@ -2094,11 +2138,11 @@ msgstr "Typ"
#: sabnzbd/skintext.py:256 [Status page, table column header, actual message]
msgid "Warning"
msgstr ""
msgstr "Varning"
#: sabnzbd/skintext.py:258 [Status page, indicator that server is enabled]
msgid "Enabled"
msgstr ""
msgstr "Aktiverad"
#: sabnzbd/skintext.py:262
msgid "Config File"
@@ -2106,7 +2150,7 @@ msgstr "Konfig fil"
#: sabnzbd/skintext.py:263 [Main config page, how much cache is in use]
msgid "Used cache"
msgstr ""
msgstr "Använt cache"
#: sabnzbd/skintext.py:264
msgid ""
@@ -2114,6 +2158,9 @@ msgid ""
"stability problem.<br />Downloading will be paused before the restart and "
"resume afterwards."
msgstr ""
"Detta kommer att starta om SABnzbd.<br />Använd det när du tror att "
"programmet har stabilitetsproblem.<br />Nerladdningar kommer att pusas innan "
"omstarten och återupptas efteråt."
#: sabnzbd/skintext.py:266
msgid ""
@@ -2133,7 +2180,7 @@ msgstr ""
#: sabnzbd/skintext.py:270
msgid "Version"
msgstr ""
msgstr "Version"
#: sabnzbd/skintext.py:271
msgid "Uptime"
@@ -2141,7 +2188,7 @@ msgstr "Upptid"
#: sabnzbd/skintext.py:272 [Indicates that server is Backup server in Status page]
msgid "Backup"
msgstr ""
msgstr "Säkerhetskopiera"
#: sabnzbd/skintext.py:275
msgid "General configuration"
@@ -2165,7 +2212,7 @@ msgstr "Adress som SABnzbd ska lyssna på."
#: sabnzbd/skintext.py:280
msgid "SABnzbd Port"
msgstr ""
msgstr "SABnzbd-port"
#: sabnzbd/skintext.py:281
msgid "Port SABnzbd should listen on."
@@ -2225,11 +2272,11 @@ msgstr "Aktivera åtkomst till webbkontrollen med HTTPS adress."
#: sabnzbd/skintext.py:295
msgid "HTTPS Port"
msgstr ""
msgstr "HTTPS-port"
#: sabnzbd/skintext.py:296
msgid "If empty, the standard port will only listen to HTTPS."
msgstr ""
msgstr "Om tom kommer standardporten endast lyssna till HTTPS."
#: sabnzbd/skintext.py:297
msgid "HTTPS Certificate"
@@ -2268,6 +2315,8 @@ msgid ""
"Checking interval (in minutes, at least 15). Not active when you use the "
"Scheduler!"
msgstr ""
"Kontrollintervall (i minuter, minst 15). Ej aktiv om du använder "
"Schemaläggaren!"
#: sabnzbd/skintext.py:306
msgid "Download Speed Limit"
@@ -2320,15 +2369,17 @@ msgstr "API-nyckel"
#: sabnzbd/skintext.py:316
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
msgstr "Denna nyckel ger tredjepartsprogram full tillgång till SABnzbd."
#: sabnzbd/skintext.py:317
msgid "NZB Key"
msgstr ""
msgstr "NZB-nyckel"
#: sabnzbd/skintext.py:318
msgid "This key will allow 3rd party programs to add NZBs to SABnzbd."
msgstr ""
"Denna nyckel ger tredjepartsprogram möjlighet att lägga till NZB:er i "
"SABnzbd."
#: sabnzbd/skintext.py:319
msgid "Generate New Key"
@@ -2348,11 +2399,11 @@ msgstr "ANVÄND PÅ EGEN RISK!"
#: sabnzbd/skintext.py:323 [Button to show QR code of APIKEY]
msgid "QR Code"
msgstr ""
msgstr "QR-kod"
#: sabnzbd/skintext.py:324 [Explanation for QR code of APIKEY]
msgid "API Key QR Code"
msgstr ""
msgstr "API- eller QR-kod"
#: sabnzbd/skintext.py:327
msgid "Folder configuration"
@@ -2460,11 +2511,12 @@ msgstr "Mapp som innehåller användar-definierade e-mail mallar."
#: sabnzbd/skintext.py:347
msgid "Password file"
msgstr ""
msgstr "Lösenordsfil"
#: sabnzbd/skintext.py:348
msgid "File containing all passwords to be tried on encrypted RAR files."
msgstr ""
"Fil som innehåller alla lösenord som ska prövas på krypterade RAR-filer."
#: sabnzbd/skintext.py:349
msgid "System Folders"
@@ -2472,7 +2524,7 @@ msgstr "Systemmappar"
#: sabnzbd/skintext.py:350
msgid "Administrative Folder"
msgstr ""
msgstr "Administrativ mapp"
#: sabnzbd/skintext.py:351
msgid ""

View File

@@ -8,18 +8,18 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-01 18:51+0000\n"
"PO-Revision-Date: 2012-05-07 01:37+0000\n"
"Last-Translator: Robert Sanchez <rsanch1@gmail.com>\n"
"PO-Revision-Date: 2012-06-07 03:07+0000\n"
"Last-Translator: Carlos Hernandez <imaginingdreamer@yahoo.com>\n"
"Language-Team: Spanish <es@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: 2012-05-08 05:38+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-06-08 05:13+0000\n"
"X-Generator: Launchpad (build 15376)\n"
#: NSIS_Installer.nsi:417
msgid "Go to the SABnzbd Wiki"
msgstr "Vaya al wiki de SABnzbd"
msgstr "Ir al wiki de SABnzbd"
#: NSIS_Installer.nsi:419
msgid "Show Release Notes"
@@ -27,11 +27,11 @@ msgstr "Mostrar notas de la versión"
#: NSIS_Installer.nsi:421
msgid "Support the project, Donate!"
msgstr "Apoya el proyecto, haz una donación!"
msgstr "¡Apoye el proyecto, haga una donación!"
#: NSIS_Installer.nsi:423
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Por favor de cierrar primero \"SABnzbd.exe\""
msgstr "Por favor cierre primero \"SABnzbd.exe\""
#: NSIS_Installer.nsi:425
msgid ""

View File

@@ -8,18 +8,18 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-05-01 18:51+0000\n"
"PO-Revision-Date: 2012-05-04 14:13+0000\n"
"Last-Translator: shypike <Unknown>\n"
"PO-Revision-Date: 2012-06-17 03:09+0000\n"
"Last-Translator: lrrosa <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@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: 2012-05-05 05:41+0000\n"
"X-Generator: Launchpad (build 15195)\n"
"X-Launchpad-Export-Date: 2012-06-18 05:39+0000\n"
"X-Generator: Launchpad (build 15419)\n"
#: NSIS_Installer.nsi:417
msgid "Go to the SABnzbd Wiki"
msgstr "Vá para a Wiki SABnzbd"
msgstr "Vá para a Wiki do SABnzbd"
#: NSIS_Installer.nsi:419
msgid "Show Release Notes"
@@ -38,9 +38,8 @@ msgid ""
" >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the "
"release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !"
msgstr ""
" >>>> ATENÇÃO <<<<\\\\r\\\\n\\\\r\\\\nPor favor, verifique "
"primeiro as notas de lançamento ou vá até "
"http://wiki.sabnzbd.org/introducing-0-7-0 !"
" >>>> ATENÇÃO <<<<\\r\\n\\r\\nPor favor, verifique primeiro "
"as notas de lançamento ou vá até http://wiki.sabnzbd.org/introducing-0-7-0 !"
#: NSIS_Installer.nsi:427
msgid "This will uninstall SABnzbd from your system"

View File

@@ -250,6 +250,8 @@ def initialize(pause_downloader = False, clean_up = False, evalSched=False, repa
sabnzbd.encoding.change_fsys(cfg.fsys_type())
### Set cache limit
if (sabnzbd.WIN32 or sabnzbd.DARWIN) and not cfg.cache_limit():
cfg.cache_limit.set('200M')
ArticleCache.do.new_limit(cfg.cache_limit.get_int())
check_incomplete_vs_complete()

View File

@@ -461,33 +461,6 @@ def _api_get_files(name, output, kwargs):
else:
return report(output, _MSG_NO_VALUE)
def _api_addurl(names, output, kwargs):
""" API: accepts name, output, pp, script, cat, priority, nzbname """
pp = kwargs.get('pp')
script = kwargs.get('script')
cat = kwargs.get('cat')
priority = kwargs.get('priority')
nzbnames = kwargs.get('nzbname')
if not isinstance(names, list):
names = [names]
if not isinstance(nzbnames, list):
nzbnames = [nzbnames]
for n in xrange(len(names)):
name = names[n]
if n < len(nzbnames):
nzbname = nzbnames[n]
else:
nzbname = ''
if name:
name = name.strip()
sabnzbd.add_url(name, pp, script, cat, priority, nzbname)
if len(names) > 0:
return report(output)
else:
return report(output, _MSG_NO_VALUE)
_RE_NEWZBIN_URL = re.compile(r'/browse/post/(\d+)')
def _api_addid(names, output, kwargs):
@@ -796,7 +769,7 @@ _api_table = {
'fullstatus' : _api_fullstatus,
'history' : _api_history,
'get_files' : _api_get_files,
'addurl' : _api_addurl,
'addurl' : _api_addid,
'addid' : _api_addid,
'pause' : _api_pause,
'resume' : _api_resume,
@@ -1165,7 +1138,11 @@ def build_queue(web_dir=None, root=None, verbose=False, prim=True, webdir='', ve
datestart = datetime.datetime.now()
slot['eta'] = 'unknown'
slot['avg_age'] = calc_age(average_date, bool(trans))
if status == Status.GRABBING:
slot['avg_age'] = '---'
else:
slot['avg_age'] = calc_age(average_date, bool(trans))
slot['verbosity'] = ""
if web_dir:
finished = []
@@ -1252,6 +1229,16 @@ def build_queue(web_dir=None, root=None, verbose=False, prim=True, webdir='', ve
return info, pnfo_list, bytespersec, verbose_list, dictn
#------------------------------------------------------------------------------
def fast_queue():
""" Return paused, bytes_left, bpsnow, time_left """
bytes_left = NzbQueue.do.remaining()
paused = Downloader.do.paused
bpsnow = BPSMeter.do.get_bps()
time_left = calc_timeleft(bytes_left, bpsnow)
return paused, bytes_left, bpsnow, time_left
#------------------------------------------------------------------------------
def qstatus_data():
"""Build up the queue status as a nested object and output as a JSON object
@@ -1287,8 +1274,8 @@ def qstatus_data():
"state" : state,
"paused" : Downloader.do.paused,
"pause_int" : scheduler.pause_int(),
"kbpersec" : BPSMeter.do.get_bps() / KIBI,
"speed" : to_units(BPSMeter.do.get_bps(), dec_limit=1),
"kbpersec" : bpsnow / KIBI,
"speed" : to_units(bpsnow, dec_limit=1),
"mbleft" : qnfo[QNFO_BYTES_LEFT_FIELD] / MEBI,
"mb" : qnfo[QNFO_BYTES_FIELD] / MEBI,
"noofslots" : len(pnfo_list),

View File

@@ -60,18 +60,18 @@ class Assembler(Thread):
def stop(self):
self.process(None)
def process(self, nzf):
self.queue.put(nzf)
def process(self, job):
self.queue.put(job)
def run(self):
import sabnzbd.nzbqueue
while 1:
nzo_nzf_tuple = self.queue.get()
if not nzo_nzf_tuple:
job = self.queue.get()
if not job:
logging.info("Shutting down")
break
nzo, nzf = nzo_nzf_tuple
nzo, nzf = job
if nzf:
sabnzbd.CheckFreeSpace()
@@ -174,7 +174,7 @@ def _assemble(nzf, path, dupe):
fout.flush()
fout.close()
set_permissions(path)
set_permissions(path)
if md5:
nzf.md5sum = md5.digest()
del md5
@@ -209,7 +209,7 @@ def GetMD5Hashes(fname):
try:
f = open(fname, 'rb')
except:
return table
return table, new_encoding
try:
header = f.read(8)

View File

@@ -136,9 +136,23 @@ class BPSMeter(object):
sabnzbd.save_admin(data, BYTES_FILE_NAME)
def defaults(self):
""" Get the latest data from the database and assign to a fake server
"""
logging.debug('Setting default BPS meter values')
grand, month, week = sabnzbd.proxy_get_history_size()
if grand: self.grand_total['x'] = grand
if month: self.month_total['x'] = month
if week: self.week_total['x'] = week
self.quota = self.left = cfg.quota_size.get_float()
def read(self):
""" Read admin from disk """
""" Read admin from disk, return True when pause is needed
"""
res = False
quota = self.left = cfg.quota_size.get_float() # Quota for this period
self.have_quota = bool(cfg.quota_size())
data = sabnzbd.load_admin(BYTES_FILE_NAME)
try:
self.last_update, self.grand_total, \
@@ -154,17 +168,14 @@ class BPSMeter(object):
self.quota = self.left = cfg.quota_size.get_float()
res = self.reset_quota()
except:
# Get the latest data from the database and assign to a fake server
logging.debug('Setting default BPS meter values')
grand, month, week = sabnzbd.proxy_get_history_size()
if grand: self.grand_total['x'] = grand
if month: self.month_total['x'] = month
if week: self.week_total['x'] = week
self.quota = self.left = cfg.quota_size.get_float()
res = False
self.have_quota = bool(cfg.quota_size())
# Force update of counters
self.update()
self.defaults()
# Force update of counters and validate data
try:
for server in self.grand_total:
self.update(server)
except TypeError:
self.defaults()
self.update()
return res
@@ -330,7 +341,12 @@ class BPSMeter(object):
self.have_quota = bool(cfg.quota_size())
if self.have_quota:
quota = cfg.quota_size.get_float()
self.left = quota - (self.quota - self.left)
if self.quota:
# Quota change, recalculate amount left
self.left = quota - (self.quota - self.left)
else:
# If previously no quota, self.left holds this period's usage
self.left = quota - self.left
self.quota = quota
else:
self.quota = self.left = 0L

View File

@@ -65,7 +65,7 @@ else:
# Configuration instances
#
quick_check = OptionBool('misc', 'quick_check', True)
fail_on_crc = OptionBool('misc', 'fail_on_crc', False)
fail_on_crc = OptionBool('misc', 'fail_on_crc', True)
send_group = OptionBool('misc', 'send_group', False)
sfv_check = OptionBool('misc', 'sfv_check', True)
@@ -101,7 +101,7 @@ par2_multicore = OptionBool('misc', 'par2_multicore', True)
allow_64bit_tools = OptionBool('misc', 'allow_64bit_tools', True)
allow_streaming = OptionBool('misc', 'allow_streaming', False)
pre_check = OptionBool('misc', 'pre_check', False)
req_completion_rate = OptionNumber('misc', 'req_completion_rate', 100.5, 100, 200)
req_completion_rate = OptionNumber('misc', 'req_completion_rate', 100.2, 100, 200)
newzbin_username = OptionStr('newzbin', 'username')
newzbin_password = OptionPassword('newzbin', 'password')
@@ -221,6 +221,7 @@ api_warnings = OptionBool('misc', 'api_warnings', True)
max_art_tries = OptionNumber('misc', 'max_art_tries', 3, 2)
max_art_opt = OptionBool('misc', 'max_art_opt', False)
use_pickle = OptionBool('misc', 'use_pickle', False)
no_ipv6 = OptionBool('misc', 'no_ipv6', False)
growl_server = OptionStr('growl', 'growl_server')
growl_password = OptionPassword('growl', 'growl_password')
@@ -238,6 +239,7 @@ win_menu = OptionBool('misc', 'win_menu', True)
uniconfig = OptionBool('misc', 'uniconfig', True)
allow_incomplete_nzb = OptionBool('misc', 'allow_incomplete_nzb', False)
marker_file = OptionStr('misc', 'nomedia_marker', '')
wait_ext_drive = OptionNumber('misc', 'wait_ext_drive', 5, 1, 60)
#------------------------------------------------------------------------------
# Set root folders for Folder config-items

View File

@@ -22,6 +22,7 @@ sabnzbd.config - Configuration Support
import os
import logging
import threading
import shutil
import sabnzbd.misc
from sabnzbd.constants import CONFIG_VERSION, NORMAL_PRIORITY, DEFAULT_PRIORITY
from sabnzbd.utils import listquote
@@ -633,11 +634,26 @@ def delete(section, keyword):
@synchronized(SAVE_CONFIG_LOCK)
def read_config(path):
""" Read the complete INI file and check its version number
if OK, pass values to config-database
"""
return _read_config(path)
def _read_config(path, try_backup=False):
""" Read the complete INI file and check its version number
if OK, pass values to config-database
"""
global CFG, database, modified
if try_backup or not os.path.exists(path):
# Not found, try backup
try:
shutil.copyfile(path + '.bak', path)
try_backup = True
except IOError:
pass
if not os.path.exists(path):
# No file found, create default INI file
try:
@@ -659,7 +675,10 @@ def read_config(path):
except (KeyError, ValueError):
CFG['__version__'] = CONFIG_VERSION
except configobj.ConfigObjError, strerror:
return False, '"%s" is not a valid configuration file<br>Error message: %s' % (path, strerror)
if try_backup:
return False, '"%s" is not a valid configuration file<br>Error message: %s' % (path, strerror)
else:
return _read_config(path, True)
CFG['__version__'] = CONFIG_VERSION
@@ -731,46 +750,32 @@ def save_config(force=False):
else:
CFG[sec][kw] = value
res = False
filename = CFG.filename
bakname = filename + '.bak'
# Check if file is writable
if not sabnzbd.misc.is_writable(filename):
logging.error(Ta('Cannot write to INI file %s'), filename)
return res
# copy current file to backup
try:
# Check if file is writable
if not sabnzbd.misc.is_writable(filename):
logging.error(Ta('Cannot write to INI file %s'), filename)
modified = False
return False
shutil.copyfile(filename, bakname)
except:
# Something wrong with the backup,
logging.warning(Ta('Cannot create backup file for %s'), bakname)
logging.info("Traceback: ", exc_info = True)
# Read current content
f = open(filename)
data = f.read()
f.close()
tmpname = filename + '.tmp'
bakname = filename + '.bak'
# Write new file
f = open(tmpname, 'w')
f.write(data)
f.close()
# Update temp file content
CFG.filename = tmpname
# Write new config file
try:
CFG.write()
# Rename to backup
if os.path.isfile(bakname):
os.remove(bakname)
os.rename(filename, bakname)
# Rename temp file, overwriting old one
os.rename(tmpname, filename)
modified = False
res = True
except:
logging.error(Ta('Cannot create backup file for %s'), filename)
logging.error(Ta('Cannot write to INI file %s'), filename)
logging.info("Traceback: ", exc_info = True)
res = False
CFG.filename = filename
return res

View File

@@ -37,6 +37,7 @@ from sabnzbd.articlecache import ArticleCache
import sabnzbd.downloader
import sabnzbd.cfg as cfg
from sabnzbd.encoding import name_fixer
from sabnzbd.misc import match_str
#-------------------------------------------------------------------------------
@@ -85,18 +86,19 @@ class Decoder(Thread):
data = None
register = True # Finish article
found = True # Article found (only relevant for precheck)
found = False # Proper article found
if lines:
logme = None
try:
if nzo.precheck and '223' in lines[0]:
raise IndexError
if nzo.precheck:
raise BadYenc
register = True
logging.debug("Decoding %s", article)
data = decode(article, lines)
nzf.article_count += 1
found = True
except IOError, e:
logme = Ta('Decoding %s failed') % article
logging.info(logme)
@@ -120,25 +122,45 @@ class Decoder(Thread):
register = False
logme = None
except BadYenc, e:
logme = Ta('Badly formed yEnc article in %s') % article
logging.info(logme)
except BadYenc:
# Handles precheck and badly formed articles
killed = False
found = False
if nzo.precheck and lines and lines[0].startswith('223 '):
# STAT was used, so we only get a status code
found = True
else:
# Examine headers (for precheck) or body (for download)
# And look for DMCA clues (while skipping "X-" headers)
for line in lines:
if not line.startswith('X-') and match_str(line.lower(), ('dmca', 'removed', 'cancel')):
logging.info('Article removed from server (%s)', article)
killed = True
break
if nzo.precheck:
if found or not killed:
# Pre-check, proper article found, just register
logging.debug('Server has article %s', article)
register = True
elif not killed and not found:
logme = Ta('Badly formed yEnc article in %s') % article
logging.info(logme)
if cfg.fail_on_crc():
if not found:
new_server_found = self.__search_new_server(article)
if new_server_found:
register = False
logme = None
except IndexError:
# Pre-check, article found, just register
register = True
except:
logme = Ta('Unknown Error while decoding %s') % article
logging.info(logme)
logging.info("Traceback: ", exc_info = True)
pass
new_server_found = self.__search_new_server(article)
if new_server_found:
register = False
logme = None
if logme:
article.nzf.nzo.inc_log('bad_art_log', logme)
@@ -211,19 +233,22 @@ def decode(article, data):
#Deal with non-yencoded posts
if not ybegin:
found = False
for i in xrange(10):
if data[i].startswith('begin '):
nzf.filename = name_fixer(data[i].split(None, 2)[2])
nzf.type = 'uu'
found = True
break
if found:
for n in xrange(i+1):
data.pop(0)
if data[-1] == 'end':
data.pop()
if data[-1] == '`':
try:
for i in xrange(10):
if data[i].startswith('begin '):
nzf.filename = name_fixer(data[i].split(None, 2)[2])
nzf.type = 'uu'
found = True
break
if found:
for n in xrange(i+1):
data.pop(0)
if data[-1] == 'end':
data.pop()
if data[-1] == '`':
data.pop()
except IndexError:
raise BadYenc()
decoded_data = '\r\n'.join(data)

View File

@@ -191,7 +191,8 @@ def send_growl(title , msg, gtype):
if _GROWL:
assert isinstance(_GROWL, GrowlNotifier)
_GROWL_REG = True
if not isinstance(msg, str): msg = str(msg)
if not isinstance(msg, str) and not isinstance(msg, unicode):
msg = str(msg)
logging.debug('Send to Growl: %s %s %s', gtype, latin1(title), latin1(msg))
try:
ret = _GROWL.notify(

View File

@@ -1188,11 +1188,11 @@ SPECIAL_BOOL_LIST = \
'queue_complete_pers', 'api_warnings', 'allow_64bit_tools', 'par2_multicore',
'never_repair', 'allow_streaming', 'ignore_unrar_dates', 'rss_filenames',
'osx_menu', 'osx_speed', 'win_menu', 'uniconfig', 'use_pickle', 'allow_incomplete_nzb',
'random_server_ip'
'random_server_ip', 'no_ipv6'
)
SPECIAL_VALUE_LIST = \
( 'size_limit', 'folder_max_length', 'fsys_type', 'movie_rename_limit', 'nomedia_marker',
'req_completion_rate'
'req_completion_rate', 'wait_ext_drive'
)
class ConfigSpecial(object):
@@ -1616,6 +1616,7 @@ class ConfigRss(object):
rss[feed] = feeds[feed].get_dict()
filters = feeds[feed].filters()
rss[feed]['filters'] = filters
rss[feed]['filter_states'] = [bool(sabnzbd.rss.convert_filter(f[4])) for f in filters]
rss[feed]['filtercount'] = len(filters)
rss[feed]['pick_cat'] = pick_cat

View File

@@ -317,6 +317,8 @@ def real_path(loc, path):
When 'path' is absolute, return normalized path
A path starting with ~ will be located in the user's Home folder
"""
# The Windows part is a bit convoluted because
# os.path.join() doesn't behave the same for all Python versions
if path:
path = path.strip()
else:
@@ -325,9 +327,15 @@ def real_path(loc, path):
if not sabnzbd.WIN32 and path.startswith('~/'):
path = path.replace('~', sabnzbd.DIR_HOME, 1)
if sabnzbd.WIN32:
if path[0].isalpha() and len(path) > 1 and path[1] == ':':
if len(path) == 2 or path[2] not in '\\/':
path = path.replace('/', '\\')
if len(path) > 1 and path[0].isalpha() and path[1] == ':':
if len(path) == 2 or path[2] != '\\':
path = path.replace(':', ':\\', 1)
elif path.startswith('\\\\'):
pass
elif path.startswith('\\'):
if len(loc) > 1 and loc[0].isalpha() and loc[1] == ':':
path = loc[:2] + path
else:
path = os.path.join(loc, path)
elif path[0] != '/':
@@ -713,15 +721,22 @@ def hostname():
#------------------------------------------------------------------------------
def check_mount(path):
""" Return False if volume isn't mounted on Linux or OSX
Retry 6 times with an interval of 1 sec.
"""
if sabnzbd.DARWIN:
m = re.search(r'^(/Volumes/[^/]+)/', path, re.I)
elif not sabnzbd.WIN32:
m = re.search(r'^(/(?:mnt|media)/[^/]+)/', path)
elif sabnzbd.WIN32:
m = re.search(r'^([a-z]:\\)', path, re.I)
else:
m = None
return (not m) or os.path.exists(m.group(1))
m = re.search(r'^(/(?:mnt|media)/[^/]+)/', path)
if m:
for n in xrange(cfg.wait_ext_drive() or 1):
if os.path.exists(m.group(1)):
return True
logging.debug('Waiting for %s to come online', m.group(1))
time.sleep(1)
return not m
#------------------------------------------------------------------------------
# Locked directory operations
@@ -791,7 +806,7 @@ def move_to_path(path, new_path, unique=True):
shutil.copyfile(path, new_path)
os.remove(path)
except:
if cfg.marker_file()and cfg.marker_file() not in path:
if not (cfg.marker_file() and cfg.marker_file() in path):
logging.error(Ta('Failed moving %s to %s'), path, new_path)
logging.info("Traceback: ", exc_info = True)
new_path = None
@@ -932,8 +947,9 @@ def bad_fetch(nzo, url, msg='', retry=False, content=False):
if isinstance(url, int) or url.isdigit():
url = 'Newzbin #%s' % url
growler.send_notification(T('URL Fetching failed; %s') % '', '%s\n%s' % (msg, url), 'other')
#import sabnzbd.emailer
sabnzbd.emailer.badfetch_mail(msg, url)
if cfg.email_endjob() > 0:
#import sabnzbd.emailer
sabnzbd.emailer.badfetch_mail(msg, url)
from sabnzbd.nzbqueue import NzbQueue
assert isinstance(NzbQueue.do, NzbQueue)
@@ -1281,7 +1297,8 @@ def set_chmod(path, permissions, report):
try:
os.chmod(path, permissions)
except:
if report:
lpath = path.lower()
if report and '.appledouble' not in lpath and '.ds_store' not in lpath:
logging.error(Ta('Cannot change permissions of %s'), path)
logging.info("Traceback: ", exc_info = True)

View File

@@ -1254,7 +1254,10 @@ def build_filelists(workdir, workdir_complete, check_rar=True):
zips = [f for f in filelist if ZIP_RE.search(f)]
rars = [f for f in filelist if RAR_RE.search(f) and is_rarfile(f)]
if check_rar:
rars = [f for f in filelist if RAR_RE.search(f) and is_rarfile(f)]
else:
rars = [f for f in filelist if RAR_RE.search(f)]
ts = [f for f in filelist if TS_RE.search(f) and f not in joinables]

View File

@@ -150,10 +150,12 @@ class NzbQueue(TryList):
""" Reconstruct admin for a single job folder, optionally with new NZB """
name = os.path.basename(folder)
path = os.path.join(folder, JOB_ADMIN)
if new_nzb is None or not new_nzb.filename:
if verified_flag_file(folder):
filename = ''
else:
if hasattr(new_nzb, 'filename'):
filename = new_nzb.filename
else:
filename = ''
if not filename:
if not verified_flag_file(folder):
filename = globber(path, '*.gz')
if len(filename) > 0:
logging.debug('Repair job %s by reparsing stored NZB', latin1(name))
@@ -164,7 +166,7 @@ class NzbQueue(TryList):
self.add(nzo)
else:
remove_all(path, '*.gz')
logging.debug('Repair job %s with new NZB (%s)', latin1(name), latin1(new_nzb.filename))
logging.debug('Repair job %s with new NZB (%s)', latin1(name), latin1(filename))
sabnzbd.add_nzbfile(new_nzb, pp=None, script=None, cat=None, priority=None, nzbname=name, reuse=True)
@@ -673,7 +675,7 @@ class NzbQueue(TryList):
nzf = article.nzf
nzo = nzf.nzo
if nzo.deleted or nzf.deleted:
if nzf.deleted:
logging.debug("Discarding article %s, no longer in queue", article.article)
return
@@ -715,7 +717,9 @@ class NzbQueue(TryList):
sabnzbd.downloader.Downloader.do.disconnect()
# Notify assembler to call postprocessor
Assembler.do.process((nzo, None))
if not nzo.deleted:
nzo.deleted = True
Assembler.do.process((nzo, None))
@synchronized(NZBQUEUE_LOCK)
@@ -733,19 +737,34 @@ class NzbQueue(TryList):
@synchronized(NZBQUEUE_LOCK)
def queue_info(self, for_cli = False):
def queue_info(self, for_cli=False, max_jobs=0):
bytes_left = 0
bytes = 0
pnfo_list = []
n = 0
for nzo in self.__nzo_list:
pnfo = nzo.gather_info(for_cli = for_cli)
if nzo.status != 'Paused':
bytes += pnfo[PNFO_BYTES_FIELD]
bytes_left += pnfo[PNFO_BYTES_LEFT_FIELD]
pnfo_list.append(pnfo)
n += 1
if max_jobs and n >= max_jobs:
break
return (bytes, bytes_left, pnfo_list)
@synchronized(NZBQUEUE_LOCK)
def remaining(self):
""" Return bytes left in the queue by non-paused items
"""
bytes_left = 0
for nzo in self.__nzo_list:
if nzo.status != 'Paused':
bytes_left += nzo.remaining()
return bytes_left
@synchronized(NZBQUEUE_LOCK)
def is_empty(self):
empty = True

View File

@@ -272,7 +272,7 @@ class NzbFile(TryList):
@property
def completed(self):
""" Is this file completed? """
return not bool(self.articles)
return self.import_finished and not bool(self.articles)
@property
def lowest_partnum(self):
@@ -810,6 +810,7 @@ class NzbObject(TryList):
if nzf in self.files:
self.files.remove(nzf)
self.finished_files.append(nzf)
nzf.import_finished = True
nzf.deleted = True
return not bool(self.files)
@@ -818,38 +819,35 @@ class NzbObject(TryList):
nzf.reset_all_try_lists()
self.reset_try_list()
def postpone_pars(self, nzf, head):
""" Move all vol-par files matching 'head' to the extrapars table """
self.partable[head] = nzf
self.extrapars[head] = []
nzf.extrapars = self.extrapars[head]
def postpone_pars(self, nzf, parset):
""" Move all vol-par files matching 'parset' to the extrapars table """
self.partable[parset] = nzf
self.extrapars[parset] = []
nzf.extrapars = self.extrapars[parset]
lparset = parset.lower()
for xnzf in self.files[:]:
name = xnzf.filename
name = xnzf.filename or platform_encode(xnzf.subject)
# Move only when not current NZF and filename was extractable from subject
if name and nzf is not xnzf:
name = name.lower()
if head.lower() in name and '.vol' in name and name.endswith('.par2'):
self.extrapars[head].append(xnzf)
head, vol, block = analyse_par2(name)
# When only subject is known, it's enough that that 'parset' is in subject
if head and lparset in head.lower():
xnzf.set_par2(parset, vol, block)
self.extrapars[parset].append(xnzf)
self.files.remove(xnzf)
def handle_par2(self, nzf, file_done):
## Special treatment for first part of par2 file
""" Check if file is a par2 and build up par2 collection
"""
fn = nzf.filename
if fn:
# We have a real filename now
fn = fn.strip()
lfn = fn.lower()
if (not nzf.is_par2) and fn and lfn.endswith('.par2'):
par2match = PROBABLY_PAR2_RE.search(fn)
if par2match:
head = par2match.group(1)
vol = par2match.group(2)
block = par2match.group(3)
elif lfn.endswith('.par2'):
head = os.path.splitext(fn)[0]
vol = block = 0
par2match = True
if not nzf.is_par2:
head, vol, block = analyse_par2(fn)
## Is a par2file and repair mode activated
if par2match and (self.repair or cfg.allow_streaming()):
if head and (self.repair or cfg.allow_streaming()):
nzf.set_par2(head, vol, block)
## Already got a parfile for this set?
if head in self.partable:
@@ -867,10 +865,12 @@ class NzbObject(TryList):
## This file either has more blocks,
## or initialparfile is already decoded
else:
if not file_done:
nzf.reset_try_list()
if file_done:
if nzf in self.files: self.files.remove(nzf)
self.extrapars[head].append(nzf)
if nzf not in self.extrapars[head]: self.extrapars[head].append(nzf)
else:
nzf.reset_try_list()
## No par2file in this set yet, set this as
## initialparfile
else:
@@ -894,7 +894,8 @@ class NzbObject(TryList):
if reset:
self.reset_try_list()
self.handle_par2(nzf, file_done)
if file_done:
self.handle_par2(nzf, file_done)
post_done = False
if not self.files:
@@ -1008,7 +1009,8 @@ class NzbObject(TryList):
def add_parfile(self, parfile):
self.files.append(parfile)
parfile.extrapars.remove(parfile)
if parfile.extrapars and parfile in parfile.extrapars:
parfile.extrapars.remove(parfile)
def remove_parset(self, setname):
self.partable.pop(setname)
@@ -1021,17 +1023,22 @@ class NzbObject(TryList):
need = 0L
pars = 0L
short = 0L
anypars = False
for nzf_id in self.files_table:
nzf = self.files_table[nzf_id]
assert isinstance(nzf, NzbFile)
short += nzf.bytes_left
if self.__re_quick_par2_check.search(nzf.subject):
pars += nzf.bytes
anypars = True
else:
need += nzf.bytes
have = need + pars - short
ratio = float(have) / float(max(1, need))
enough = ratio * 100.0 >= float(cfg.req_completion_rate())
if anypars:
enough = ratio * 100.0 >= float(cfg.req_completion_rate())
else:
enough = have >= need
logging.debug('Download Quality: enough=%s, have=%s, need=%s, ratio=%s', enough, have, need, ratio)
return enough, ratio
@@ -1220,6 +1227,13 @@ class NzbObject(TryList):
except:
pass
def remaining(self):
""" Return remaining bytes """
bytes_left = 0
for nzf in self.files:
bytes_left += nzf.bytes_left
return bytes_left
def gather_info(self, for_cli = False):
bytes_left_all = 0
@@ -1377,7 +1391,7 @@ def nzf_cmp_date(nzf1, nzf2):
return nzf_cmp_name(nzf1, nzf2, name=False)
RE_RAR = re.compile(r'(\.rar|\.r\d\d)|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d', re.I)
RE_RAR = re.compile(r'(\.rar|\.r\d\d|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d)$', re.I)
def nzf_cmp_name(nzf1, nzf2, name=True):
# The comparison will sort .par2 files to the top of the queue followed by .rar files,
@@ -1524,3 +1538,22 @@ def set_attrib_file(path, attribs):
f.write('%s\n' % item)
f.close()
def analyse_par2(name):
""" Check if file is a par2-file and determine vol/block
return head, vol, block
head is empty when not a par2 file
"""
if name:
m = PROBABLY_PAR2_RE.search(name)
if m:
head = m.group(1)
vol = m.group(2)
block = m.group(3)
elif name.lower().find('.par2') > 0:
head = os.path.splitext(name)[0]
vol = block = 0
else:
head = None
vol = block = 0
return head, vol, block

View File

@@ -32,7 +32,6 @@ import sys
import time
import logging
import logging.handlers
import sabnzbd
import sabnzbd.cfg
@@ -42,6 +41,7 @@ from sabnzbd.misc import get_filename, get_ext, diskfree, to_units
from sabnzbd.panic import launch_a_browser
import sabnzbd.growler as growler
from sabnzbd.api import fast_queue
from sabnzbd.nzbqueue import NzbQueue
import sabnzbd.config as config
import sabnzbd.scheduler as scheduler
@@ -50,6 +50,7 @@ import sabnzbd.dirscanner as dirscanner
from sabnzbd.bpsmeter import BPSMeter
from sabnzbd.newzbin import Bookmarks
from sabnzbd.database import get_history_handle
from sabnzbd.encoding import unicoder
status_icons = {'idle':'../Resources/sab_idle.png','pause':'../Resources/sab_pause.png','clicked':'../Resources/sab_clicked.png'}
start_time = NSDate.date()
@@ -328,7 +329,7 @@ class SABnzbdDelegate(NSObject):
def queueUpdate(self):
try:
qnfo = NzbQueue.do.queue_info()
qnfo = NzbQueue.do.queue_info(max_jobs=10)
pnfo_list = qnfo[QNFO_PNFO_LIST_FIELD]
bytesleftprogess = 0
@@ -347,7 +348,7 @@ class SABnzbdDelegate(NSObject):
for pnfo in pnfo_list:
if job_nb > 10:
break
filename = pnfo[PNFO_FILENAME_FIELD]
filename = unicoder(pnfo[PNFO_FILENAME_FIELD])
msgid = pnfo[PNFO_MSGID_FIELD]
bytesleft = pnfo[PNFO_BYTES_LEFT_FIELD] / MEBI
bytesleftprogess += pnfo[PNFO_BYTES_LEFT_FIELD]
@@ -438,24 +439,23 @@ class SABnzbdDelegate(NSObject):
def stateUpdate(self):
try:
qnfo = NzbQueue.do.queue_info()
bpsnow = BPSMeter.do.get_bps()
if sabnzbd.downloader.Downloader.do.paused:
paused, bytes_left, bpsnow, time_left = fast_queue()
if paused:
self.state = T('Paused')
if sabnzbd.scheduler.pause_int() != "0":
self.setMenuTitle("\n\n%s\n" % (sabnzbd.scheduler.pause_int()))
else:
self.setMenuTitle("")
elif qnfo[QNFO_BYTES_LEFT_FIELD] / MEBI > 0:
elif bytes_left > 0:
self.state = ""
speed = to_units(bpsnow, dec_limit=1) + 'B/s'
speed = to_units(bpsnow, dec_limit=1)
# "10.1 MB/s" doesn't fit, remove space char
if 'M' in speed and len(speed) > 8:
if 'M' in speed and len(speed) > 5:
speed = speed.replace(' ', '')
timeleft = (bpsnow>10 and self.calc_timeleft(qnfo[QNFO_BYTES_LEFT_FIELD],bpsnow)) or "--"
time_left = (bpsnow>10 and time_left) or "------"
statusbarText = "\n\n%s\n%s\n" % (timeleft, speed)
statusbarText = "\n\n%s\n%sB/s\n" % (time_left, speed)
if sabnzbd.SABSTOP:
statusbarText = "..."

View File

@@ -236,6 +236,10 @@ def launch_a_browser(url, force=False):
if not force and not cfg.autobrowser() or sabnzbd.DAEMON:
return
if '::1' in url and not '[::1]' in url:
# Get around ideosyncrasy in Python runtime
url = url.replace('::1', '[::1]')
if cfg.enable_https() and not cfg.https_port.get_int():
# Must use https, because http is not available
url = url.replace('http:', 'https:')

View File

@@ -366,8 +366,8 @@ def process_job(nzo):
## Set permissions right
set_permissions(tmp_workdir_complete)
if all_ok:
del_marker(marker_file)
if all_ok and marker_file:
del_marker(os.path.join(tmp_workdir_complete, marker_file))
remove_from_list(marker_file, newfiles)
if all_ok:
@@ -561,8 +561,7 @@ def parring(nzo, workdir):
need_re_add, res = par2_repair(parfile_nzf, nzo, workdir, set_)
if need_re_add:
re_add = True
else:
par_error = par_error or not res
par_error = par_error or not res
if re_add:
logging.info('Readded %s to queue', filename)
@@ -748,10 +747,10 @@ def collapse_folder(oldpath, newpath):
#------------------------------------------------------------------------------
def set_marker(folder):
""" Set marker file and return path """
path = cfg.marker_file()
if path:
path = os.path.join(folder, path)
""" Set marker file and return name """
name = cfg.marker_file()
if name:
path = os.path.join(folder, name)
logging.debug('Create marker file %s', path)
try:
fp = open(path, 'w')
@@ -759,8 +758,8 @@ def set_marker(folder):
except:
logging.info('Cannot create marker file %s', path)
logging.info("Traceback: ", exc_info = True)
path = None
return path
name = None
return name
def del_marker(path):
@@ -776,7 +775,6 @@ def del_marker(path):
def remove_from_list(name, lst):
if name:
name = os.path.split(name)[1]
for n in xrange(len(lst)):
if lst[n].endswith(name):
logging.debug('Popping %s', lst[n])

View File

@@ -125,7 +125,7 @@ def convert_filter(text):
try:
return re.compile(txt, re.I)
except:
logging.error(Ta('Could not compile regex: %s'), text)
logging.debug('Could not compile regex: %s', text)
return None
_EXPIRE_SEC = 3*24*3600 # 3 days
@@ -407,7 +407,10 @@ class RSSQueue(object):
result = False
break
else:
found = re.search(regexes[n], title)
if regexes[n]:
found = re.search(regexes[n], title)
else:
found = False
if reTypes[n] == 'M' and not found:
logging.debug("Filter rejected on rule %d", n)
result = False

View File

@@ -29,6 +29,8 @@ import sabnzbd.api as api
import sabnzbd.scheduler as scheduler
from sabnzbd.downloader import Downloader
import sabnzbd.cfg as cfg
from sabnzbd.constants import MEBI
from sabnzbd.misc import to_units
import os
import cherrypy
@@ -71,23 +73,19 @@ class SABTrayThread(SysTrayIconThread):
""" Update menu info, once every 10 calls """
self.counter += 1
if self.counter > 10:
status = api.qstatus_data()
state = status.get('state', "SABnzbd")
self.sabpaused = status.get('paused', False)
self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue()
mb_left = to_units(bytes_left, dec_limit=1)
speed = to_units(bpsnow, dec_limit=1)
if state == 'IDLE':
self.hover_text = T('Idle')
self.icon = self.sabicons['default']
elif state == 'PAUSED':
if self.sabpaused:
self.hover_text = T('Paused')
self.icon = self.sabicons['pause']
elif state == 'DOWNLOADING':
self.hover_text = "%sB/s %s: %s MB (%s)" % (status.get('speed', "---"), T('Remaining'), str(int(status.get('mbleft', "0"))), status.get('timeleft', "---"))
elif bytes_left > 0:
self.hover_text = "%sB/s %s: %sB (%s)" % (speed, T('Remaining'), mb_left, time_left)
self.icon = self.sabicons['green']
else:
self.hover_text = '??'
self.icon = self.sabicons['pause']
self.hover_text = T('Idle')
self.icon = self.sabicons['default']
self.refresh_icon()
self.counter = 0

View File

@@ -49,7 +49,6 @@ class URLGrabber(Thread):
def __init__(self):
Thread.__init__(self)
now = time.time()
self.queue = Queue.Queue()
for tup in NzbQueue.do.get_urls():
url, nzo = tup
@@ -115,7 +114,10 @@ class URLGrabber(Thread):
logging.info('Removing nzbmatrix bookmark %s', matrix_id)
else:
logging.info('Grabbing URL %s', url)
opener = urllib.FancyURLopener({})
if '.nzbsrus.' in url:
opener = urllib.URLopener({})
else:
opener = urllib.FancyURLopener({})
opener.prompt_user_passwd = None
opener.addheaders = []
opener.addheader('User-Agent', 'SABnzbd+/%s' % sabnzbd.version.__version__)
@@ -165,19 +167,20 @@ class URLGrabber(Thread):
misc.bad_fetch(future_nzo, clean_matrix_url(url), msg, retry=True)
continue
category = _MATRIX_MAP.get(category, category)
if del_bookmark:
# No retries of nzbmatrix bookmark removals
continue
else:
msg = ''
retry = True
if del_bookmark:
# No retries of nzbmatrix bookmark removals
continue
# Check if the filepath is specified, if not, check if a retry is allowed.
if not fn:
logging.info('Retry URL %s', url)
self.add(url, future_nzo, 5)
continue
fn, msg, retry, wait = _analyse_others(fn, url)
if not fn:
if retry:
logging.info('Retry URL %s', url)
self.add(url, future_nzo, wait)
else:
misc.bad_fetch(future_nzo, url, msg, retry=True)
continue
if not filename:
filename = os.path.basename(url) + '.nzb'
@@ -313,6 +316,50 @@ def _analyse_matrix(fn, matrix_id):
return fn, msg, False, 0
RUS_FATAL = ('DENIED_MISSING_CREDENTIALS', 'DENIED_NO_ACCOUNT',
'DENIED_INVALID_CREDENTIALS', 'INCORRECT_URL',
'NZB_DELETED', 'POST_NUKED', 'FILE_UNAVAILABLE'
)
RUS_15M = ('SQL_ERROR', 'SERVICE_OFFLINE')
RUS_60M = ('MAX_DOWNLOAD_REACHED_UPGRADE_TO_VIP', 'MAX_DOWNLOAD_REACHED')
def _analyse_others(fn, url):
""" Analyse respons of indexer
returns fn|None, error-message|None, retry, wait-seconds
"""
msg = ''
wait = 0
if not fn:
logging.debug('No response from indexer, retry after 60 sec')
return None, msg, True, 60
try:
f = open(fn, 'r')
data = f.read(100)
f.close()
except:
logging.debug('Problem with tempfile %s from indexer, retry after 60 sec', fn)
return None, msg, True, 60
# Check for an error response
if not data:
logging.debug('Received nothing from indexer, retry after 60 sec')
return None, msg, True, 60
if '.nzbsrus.' in url:
# Partial support for nzbsrus.com's API
if misc.match_str(data, RUS_FATAL):
logging.debug('nzbsrus says: %s, abort', data)
return None, data, False, 0
if misc.match_str(data, RUS_15M):
logging.debug('nzbsrus says: %s, wait 15m', data)
return None, data, True, 900
if misc.match_str(data, RUS_60M):
logging.debug('nzbsrus says: %s, wait 60m', data)
return None, data, True, 3600
return fn, msg, False, 0
#------------------------------------------------------------------------------
_MATRIX_MAP = {
'28' : 'anime.all',

View File

@@ -105,7 +105,7 @@ def test_nntp_server(host, port, server=None, username=None, password=None, ssl=
if not username or not password:
nw.nntp.sock.sendall('ARTICLE test\r\n')
nw.nntp.sock.sendall('ARTICLE test@home\r\n')
try:
nw.lines = []
nw.recv_chunk(block=True)

View File

@@ -22,10 +22,10 @@ class SysTrayIconThread(Thread):
'''TODO'''
QUIT = 'QUIT'
SPECIAL_ACTIONS = [QUIT]
FIRST_ID = 1023
terminate = False
def __init__(self,
icon,
hover_text,
@@ -38,21 +38,21 @@ class SysTrayIconThread(Thread):
self.icons = {}
self.hover_text = hover_text
self.on_quit = on_quit
# menu_options = menu_options + (('Quit', None, self.QUIT),)
self._next_action_id = self.FIRST_ID
self.menu_actions_by_id = set()
self.menu_options = self._add_ids_to_menu_options(list(menu_options))
self.menu_actions_by_id = dict(self.menu_actions_by_id)
del self._next_action_id
self.default_menu_index = (default_menu_index or 0)
self.window_class_name = window_class_name or "SysTrayIconPy"
self.start()
def initialize(self):
message_map = {win32gui.RegisterWindowMessage("TaskbarCreated"): self.restart,
win32con.WM_DESTROY: self.destroy,
@@ -83,7 +83,7 @@ class SysTrayIconThread(Thread):
win32gui.UpdateWindow(self.hwnd)
self.notify_id = None
self.refresh_icon()
def run(self):
self.initialize()
while not self.terminate:
@@ -91,11 +91,11 @@ class SysTrayIconThread(Thread):
self.doUpdates()
sleep(0.100)
win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, (self.hwnd, 0))
# override this
def doUpdates(self):
pass
def _add_ids_to_menu_options(self, menu_options):
result = []
for menu_option in menu_options:
@@ -112,11 +112,11 @@ class SysTrayIconThread(Thread):
print 'Unknown item', option_text, option_icon, option_action
self._next_action_id += 1
return result
def get_icon(self, path):
hicon = self.icons.get(path);
if hicon != None: return hicon
# Try and find a custom icon
hinst = win32gui.GetModuleHandle(None)
if os.path.isfile(path):
@@ -130,10 +130,10 @@ class SysTrayIconThread(Thread):
else:
print "Can't find icon file - using default."
hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
self.icons[path] = hicon
return hicon
def refresh_icon(self):
hicon = self.get_icon(self.icon)
if self.notify_id: message = win32gui.NIM_MODIFY
@@ -144,7 +144,11 @@ class SysTrayIconThread(Thread):
win32con.WM_USER+20,
hicon,
self.hover_text)
win32gui.Shell_NotifyIcon(message, self.notify_id)
try:
win32gui.Shell_NotifyIcon(message, self.notify_id)
except:
# Timeouts can occur after system comes out of standby/hibernate
pass
def restart(self, hwnd, msg, wparam, lparam):
self.refresh_icon()
@@ -163,12 +167,12 @@ class SysTrayIconThread(Thread):
elif lparam==win32con.WM_LBUTTONUP:
pass
return True
def show_menu(self):
menu = win32gui.CreatePopupMenu()
self.create_menu(menu, self.menu_options)
#win32gui.SetMenuDefaultItem(menu, 1000, 0)
pos = win32gui.GetCursorPos()
# See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/menus_0hdi.asp
win32gui.SetForegroundWindow(self.hwnd)
@@ -180,13 +184,13 @@ class SysTrayIconThread(Thread):
self.hwnd,
None)
win32gui.PostMessage(self.hwnd, win32con.WM_NULL, 0, 0)
def create_menu(self, menu, menu_options):
for option_text, option_icon, option_action, option_id in menu_options[::-1]:
if option_icon:
option_icon = self.prep_menu_icon(option_icon)
if option_id in self.menu_actions_by_id:
if option_id in self.menu_actions_by_id:
item, extras = win32gui_struct.PackMENUITEMINFO(text=option_text,
hbmpItem=option_icon,
wID=option_id)
@@ -219,20 +223,20 @@ class SysTrayIconThread(Thread):
win32gui.DrawIconEx(hdcBitmap, 0, 0, hicon, ico_x, ico_y, 0, 0, win32con.DI_NORMAL)
win32gui.SelectObject(hdcBitmap, hbmOld)
win32gui.DeleteDC(hdcBitmap)
return hbm
def command(self, hwnd, msg, wparam, lparam):
id = win32gui.LOWORD(wparam)
self.execute_menu_option(id)
def execute_menu_option(self, id):
menu_action = self.menu_actions_by_id[id]
menu_action = self.menu_actions_by_id[id]
if menu_action == self.QUIT:
win32gui.DestroyWindow(self.hwnd)
else:
menu_action(self)
def non_string_iterable(obj):
try:
iter(obj)