mirror of
https://github.com/sabnzbd/sabnzbd.git
synced 2026-01-06 06:28:45 -05:00
Compare commits
87 Commits
0.7.0Beta8
...
0.7.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7170325df5 | ||
|
|
c44d98da66 | ||
|
|
018410afb0 | ||
|
|
fc47238a7a | ||
|
|
9561b8a64e | ||
|
|
7b0e56b55f | ||
|
|
c6d5a79776 | ||
|
|
faa4cacd3e | ||
|
|
56e417eea1 | ||
|
|
5f02ec00f9 | ||
|
|
5ea35db922 | ||
|
|
5dcf26a56c | ||
|
|
35b598d10e | ||
|
|
5e7b27c4ef | ||
|
|
9ed408d35b | ||
|
|
6c782fe255 | ||
|
|
1689323dc3 | ||
|
|
a3c50a907a | ||
|
|
36a3792846 | ||
|
|
4cd0c0691a | ||
|
|
6ac98dcacd | ||
|
|
0a0d00930a | ||
|
|
28a0d041f9 | ||
|
|
85bb91a7ea | ||
|
|
6561e0abfa | ||
|
|
6715e61a68 | ||
|
|
a886b284b6 | ||
|
|
a349c82b6f | ||
|
|
1f4df0ebf4 | ||
|
|
0221e7bf93 | ||
|
|
f9cf14e7d8 | ||
|
|
7258e56a20 | ||
|
|
90bd495d44 | ||
|
|
6c216d6dfe | ||
|
|
e1f3fae6c7 | ||
|
|
29f126ca47 | ||
|
|
8b4b742466 | ||
|
|
57a9d362bc | ||
|
|
b7d54c2bea | ||
|
|
59f9833076 | ||
|
|
8e360fe53e | ||
|
|
afc5005382 | ||
|
|
3a531c6d2b | ||
|
|
f056ad6347 | ||
|
|
5c1342a663 | ||
|
|
dfe8a47a2a | ||
|
|
e293a439dd | ||
|
|
7e0027922a | ||
|
|
00b5302ba9 | ||
|
|
79488c4785 | ||
|
|
c3d0438250 | ||
|
|
2909d4636b | ||
|
|
a1ee8b6af4 | ||
|
|
cfe3b58f7f | ||
|
|
ff6b87ef5b | ||
|
|
8fbcfd0d5a | ||
|
|
347ba999b4 | ||
|
|
503bcf64c9 | ||
|
|
2a667470a1 | ||
|
|
c61165b840 | ||
|
|
3672189bc8 | ||
|
|
5b38c772fb | ||
|
|
f28bc4dd9c | ||
|
|
e16cc49a17 | ||
|
|
f686cc94fd | ||
|
|
d88b5a3b3e | ||
|
|
bccc5665f5 | ||
|
|
69ac9d39ad | ||
|
|
b5b6999bc9 | ||
|
|
7ddb3d2752 | ||
|
|
9febaf919c | ||
|
|
2225383485 | ||
|
|
e3e500326c | ||
|
|
b73570fe2a | ||
|
|
d1357875c9 | ||
|
|
037c7661ea | ||
|
|
5337ade3fb | ||
|
|
504ce5458f | ||
|
|
d8d3b60cbc | ||
|
|
0b0e7d5531 | ||
|
|
18cd9ab7ca | ||
|
|
1392b3b1eb | ||
|
|
cd93abfab1 | ||
|
|
9fede00949 | ||
|
|
6ddc3fec96 | ||
|
|
f1030f9b6f | ||
|
|
6a8ff22f96 |
@@ -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,
|
||||
|
||||
@@ -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
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
4
PKG-INFO
4
PKG-INFO
@@ -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
|
||||
|
||||
46
README.rtf
46
README.rtf
@@ -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}}\
|
||||
\
|
||||
|
||||
|
||||
46
README.txt
46
README.txt
@@ -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.
|
||||
|
||||
|
||||
75
SABnzbd.py
75
SABnzbd.py
@@ -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()
|
||||
@@ -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]#--> $T('Incorrect filter')<!--#end if#-->
|
||||
</td>
|
||||
</form>
|
||||
</tr>
|
||||
|
||||
@@ -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]#--> $T('Incorrect filter')<!--#end if#-->
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -510,7 +511,7 @@
|
||||
}).done(function( msg ) {
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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]#--> $T('Incorrect filter')<!--#end if#-->
|
||||
</td>
|
||||
</form>
|
||||
</tr>
|
||||
|
||||
@@ -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('.', '.​').replace('_', '_​')</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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]#--> $T('Incorrect filter')<!--#end if#-->
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
@@ -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#-->
|
||||
|
||||
21
package.py
21
package.py
@@ -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':
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 mogę 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"
|
||||
|
||||
112
po/main/pt_BR.po
112
po/main/pt_BR.po
@@ -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 " 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→Newest</small>"
|
||||
msgstr "Ordenar por Data <small>Mais antigo→Mais novo</small>"
|
||||
msgstr "Ordenar por Idade <small>Mais antigo→Mais novo</small>"
|
||||
|
||||
#: sabnzbd/skintext.py:699
|
||||
msgid "Sort by Age <small>Newest→Oldest</small>"
|
||||
msgstr "Ordenar por Data <small>Mais novo→Mais antigo</small>"
|
||||
msgstr "Ordenar por Idade <small>Mais novo→Mais antigo</small>"
|
||||
|
||||
#: sabnzbd/skintext.py:700
|
||||
msgid "Sort by Name <small>A→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→Newest)</small>"
|
||||
msgstr "Ordenar por Data <small>(Mais antigo→Mais novo)</small>"
|
||||
msgstr "Ordenar por Idade <small>(Mais antigo→Mais novo)</small>"
|
||||
|
||||
#: sabnzbd/skintext.py:740
|
||||
msgid "Sort by Age <small>(Newest→Oldest)</small>"
|
||||
msgstr "Ordenar por Data <small>(Mais novo→Mais antigo)</small>"
|
||||
msgstr "Ordenar por Idade <small>(Mais novo→Mais antigo)</small>"
|
||||
|
||||
#: sabnzbd/skintext.py:741
|
||||
msgid "Sort by Name <small>(A→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"
|
||||
|
||||
254
po/main/sv.po
254
po/main/sv.po
@@ -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 " "
|
||||
msgstr ""
|
||||
msgstr " "
|
||||
|
||||
#: 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 ""
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = "..."
|
||||
|
||||
@@ -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:')
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user