mirror of
https://github.com/sabnzbd/sabnzbd.git
synced 2026-01-10 08:30:45 -05:00
Compare commits
273 Commits
2.3.0Alpha
...
2.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d69796d351 | ||
|
|
a2d5713477 | ||
|
|
ba7d906bea | ||
|
|
68f78b0e71 | ||
|
|
d5cd0180d8 | ||
|
|
10265bdfb4 | ||
|
|
3d0d67bffc | ||
|
|
11bd16a653 | ||
|
|
248f2da8a6 | ||
|
|
7b7aaaf467 | ||
|
|
0030e4dd36 | ||
|
|
c3013d67b4 | ||
|
|
ddb7f2a40c | ||
|
|
167a94736e | ||
|
|
8b3e30f0a1 | ||
|
|
c383fa88fb | ||
|
|
ee72c1e4d5 | ||
|
|
a80bd826d6 | ||
|
|
63e6d45bb1 | ||
|
|
61300db1fb | ||
|
|
23d005fc36 | ||
|
|
871b351656 | ||
|
|
6b53b9934e | ||
|
|
e038e08a60 | ||
|
|
8300cb7762 | ||
|
|
ec8302717f | ||
|
|
6b872b44db | ||
|
|
6e48ebccc7 | ||
|
|
1cd24d1fd0 | ||
|
|
fa6bb79f53 | ||
|
|
22e9086e09 | ||
|
|
408b84e02d | ||
|
|
16ac4dce21 | ||
|
|
5ce1554a46 | ||
|
|
2d84ed6813 | ||
|
|
06dc5b181e | ||
|
|
37b759fece | ||
|
|
3f8430780d | ||
|
|
9e9bc5f3b0 | ||
|
|
85204105c2 | ||
|
|
f13339d64d | ||
|
|
fa5b44be99 | ||
|
|
08bc7c5b9d | ||
|
|
d9b5dd549a | ||
|
|
8ec53a3bce | ||
|
|
0aac9a5e5c | ||
|
|
11a880d040 | ||
|
|
67b66beb13 | ||
|
|
1da633442b | ||
|
|
13de40881e | ||
|
|
1c6419ea65 | ||
|
|
a2adeffc1a | ||
|
|
71fa3c544a | ||
|
|
b739fb7f07 | ||
|
|
860728beae | ||
|
|
1bdbf1c6a8 | ||
|
|
abbed4cd77 | ||
|
|
d06c11673f | ||
|
|
67d67f5ff6 | ||
|
|
2386d65b84 | ||
|
|
29ec4d9a23 | ||
|
|
22517a7cd7 | ||
|
|
bcc4dd75cf | ||
|
|
97711ca82e | ||
|
|
e782237f27 | ||
|
|
52bb156c08 | ||
|
|
4361d82ddd | ||
|
|
017cf8f285 | ||
|
|
03cdf6ed5d | ||
|
|
cf347a8e90 | ||
|
|
f06afe43e1 | ||
|
|
fb301eb5c8 | ||
|
|
1562c3560b | ||
|
|
9813bc237f | ||
|
|
b39fe059c6 | ||
|
|
a56c770a8b | ||
|
|
e3bf0edad8 | ||
|
|
e35d9e4db3 | ||
|
|
c617d4321a | ||
|
|
0fd3a2881f | ||
|
|
0c1f7633de | ||
|
|
b7d5d49c84 | ||
|
|
9911b93ece | ||
|
|
eeaad00968 | ||
|
|
e1bb8459e3 | ||
|
|
65c3ac0cc0 | ||
|
|
413c02a80f | ||
|
|
80f118f304 | ||
|
|
5c0a10e16b | ||
|
|
d9b32261e7 | ||
|
|
8d8ce52193 | ||
|
|
1cc2e25cda | ||
|
|
4605c3fd30 | ||
|
|
ed7dc3f827 | ||
|
|
e69eeebdd8 | ||
|
|
5da5f1adc1 | ||
|
|
f47e92dec0 | ||
|
|
a894ca5171 | ||
|
|
5abe1140ae | ||
|
|
d34e14370c | ||
|
|
c4f4a3131c | ||
|
|
dcbd9b57f3 | ||
|
|
aad3b54a17 | ||
|
|
cde142a371 | ||
|
|
8bfc98ffc6 | ||
|
|
e46f21d566 | ||
|
|
0e45fdcdfd | ||
|
|
eec7af16d7 | ||
|
|
6532425902 | ||
|
|
44b896522c | ||
|
|
1b16ee44cb | ||
|
|
d5f608c28c | ||
|
|
555d8418e7 | ||
|
|
8c22e35da4 | ||
|
|
95a7924b31 | ||
|
|
5830bebd95 | ||
|
|
d32cf57c75 | ||
|
|
6d9242ebc5 | ||
|
|
cbc4f6a964 | ||
|
|
2a3b2b9556 | ||
|
|
53a219f12b | ||
|
|
48519dcfa0 | ||
|
|
92542c58fe | ||
|
|
7eafe730f9 | ||
|
|
494e72a996 | ||
|
|
84cc86f1d3 | ||
|
|
64479e2e5d | ||
|
|
13b523d9bd | ||
|
|
181881a21b | ||
|
|
86d11095ac | ||
|
|
927ba3cd9d | ||
|
|
6296fc1762 | ||
|
|
60fbe44724 | ||
|
|
29e45da431 | ||
|
|
d82e69eef4 | ||
|
|
8c7d557252 | ||
|
|
a56d6e5517 | ||
|
|
7548d9e975 | ||
|
|
b7e2bd9684 | ||
|
|
f0a243e3d3 | ||
|
|
6e108c9ef2 | ||
|
|
89edcc1924 | ||
|
|
8a6aca47a1 | ||
|
|
d03e5780b8 | ||
|
|
209d8f9b40 | ||
|
|
c257b1be3d | ||
|
|
2c48c8de2e | ||
|
|
a767ef6aed | ||
|
|
ad61d1dd03 | ||
|
|
33c3d187a0 | ||
|
|
4eb486d4e2 | ||
|
|
bfb6c167a4 | ||
|
|
44abf3bdf6 | ||
|
|
c950572592 | ||
|
|
3999cb13fd | ||
|
|
af65075f0c | ||
|
|
de2a2b465b | ||
|
|
cd7a77f02d | ||
|
|
f4a5394b63 | ||
|
|
3fb6a8dedb | ||
|
|
50c8f84eba | ||
|
|
2c7ecdee92 | ||
|
|
72390a793a | ||
|
|
04ad4e5d3e | ||
|
|
5ef9c6a433 | ||
|
|
e6baffc839 | ||
|
|
e361eb25a5 | ||
|
|
9b420e91c9 | ||
|
|
3a4bf971b2 | ||
|
|
1128691c5d | ||
|
|
15043aef3f | ||
|
|
2a3b4afa03 | ||
|
|
00a98efa81 | ||
|
|
f013dd7f0d | ||
|
|
7b91b1c769 | ||
|
|
5583cce322 | ||
|
|
b995c5f992 | ||
|
|
214ac4a53d | ||
|
|
fc7e87f0df | ||
|
|
c0f2f59fc1 | ||
|
|
b90a847a6f | ||
|
|
a58bb385f5 | ||
|
|
9754baeb1c | ||
|
|
ffcd154966 | ||
|
|
97cfe9488c | ||
|
|
374b6f616a | ||
|
|
e2f51595b6 | ||
|
|
04091a16aa | ||
|
|
9d9d2fd9a2 | ||
|
|
5746115331 | ||
|
|
42f1a4926c | ||
|
|
7d87fd461b | ||
|
|
1ba9976979 | ||
|
|
659c199043 | ||
|
|
81a3f53226 | ||
|
|
1cbff28f67 | ||
|
|
8e15acbf30 | ||
|
|
e07be60db6 | ||
|
|
539c9662ff | ||
|
|
b396014f8d | ||
|
|
1db32415b6 | ||
|
|
b24629db6b | ||
|
|
9b5cdcf8fb | ||
|
|
4831415d14 | ||
|
|
a4c51f0b20 | ||
|
|
ec3ba1fb93 | ||
|
|
61966f7036 | ||
|
|
4f69e81841 | ||
|
|
d0d90581df | ||
|
|
8ea5c27633 | ||
|
|
517500fdf3 | ||
|
|
c4c1c9b6ab | ||
|
|
2388889ede | ||
|
|
55cfe878d7 | ||
|
|
a2daaee468 | ||
|
|
2c360e395e | ||
|
|
399cfee594 | ||
|
|
be646ae6ab | ||
|
|
b470253d9f | ||
|
|
b83c493492 | ||
|
|
991277bb01 | ||
|
|
5626013b81 | ||
|
|
2810d37758 | ||
|
|
c2f08f01e0 | ||
|
|
17ff087e06 | ||
|
|
77de565b7c | ||
|
|
54d238aa4d | ||
|
|
379d09f8cc | ||
|
|
00de72b127 | ||
|
|
f9c84fa7dd | ||
|
|
c8e46691bb | ||
|
|
df1bb636e5 | ||
|
|
ff886fad0d | ||
|
|
6dbee7a413 | ||
|
|
3f8fcd7172 | ||
|
|
d94f7388e6 | ||
|
|
ad8b49fea8 | ||
|
|
ce00270c12 | ||
|
|
8c501f8f58 | ||
|
|
ce313ebc65 | ||
|
|
887ad881a2 | ||
|
|
ce40827552 | ||
|
|
2777d89482 | ||
|
|
727b300a0e | ||
|
|
652b021a8e | ||
|
|
fdf33acfbb | ||
|
|
b001bc9b6f | ||
|
|
8802cb1d8c | ||
|
|
e19a2fbae7 | ||
|
|
53e38f98f9 | ||
|
|
e783e227f6 | ||
|
|
f3dfbe4181 | ||
|
|
bcd8ca8bc4 | ||
|
|
816d6a63cd | ||
|
|
88d3f25700 | ||
|
|
80f69b11db | ||
|
|
81a11f20c8 | ||
|
|
9e2a839953 | ||
|
|
3cefcde270 | ||
|
|
87a1eacfe7 | ||
|
|
7cbc1a8419 | ||
|
|
7b5570eb0b | ||
|
|
1a43a4dcf0 | ||
|
|
2c2a6592c7 | ||
|
|
f31de6ee4e | ||
|
|
8fcd1f6b6c | ||
|
|
d7f3a473d7 | ||
|
|
ab2eb0c94e | ||
|
|
e51f4fc45a | ||
|
|
65278120e2 | ||
|
|
2eed355e9c | ||
|
|
018955f4d5 | ||
|
|
12fd63c1cf |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -19,6 +19,10 @@ SABnzbd*.dmg
|
||||
# WingIDE project files
|
||||
*.wp[ru]
|
||||
|
||||
# Testing folders
|
||||
.cache
|
||||
.xprocess
|
||||
|
||||
# General junk
|
||||
*.keep
|
||||
*.bak
|
||||
|
||||
15
.travis.yml
Normal file
15
.travis.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
language: python
|
||||
python:
|
||||
- "2.7"
|
||||
before_install:
|
||||
- sudo add-apt-repository ppa:jcfp -y
|
||||
- sudo apt-get update -q
|
||||
- sudo apt-get install sabnzbdplus -y
|
||||
install:
|
||||
- pip install --upgrade -r tests/requirements.txt
|
||||
script:
|
||||
- pytest
|
||||
notifications:
|
||||
email:
|
||||
on_success: never
|
||||
on_failure: always
|
||||
@@ -1,5 +1,5 @@
|
||||
*******************************************
|
||||
*** This is SABnzbd 2.2.0 ***
|
||||
*** This is SABnzbd 2.3.0 ***
|
||||
*******************************************
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
It simplifies the process of downloading from Usenet dramatically,
|
||||
|
||||
30
ISSUES.txt
30
ISSUES.txt
@@ -9,28 +9,18 @@
|
||||
- When par2 or unrar hang up, never just stop SABnzbd.
|
||||
Instead use your operating system's task manager to stop the par2 or unrar program.
|
||||
Forcing SABnzbd to quit may damage your queues.
|
||||
Windows-only:
|
||||
If you keep having trouble with par2 multicore you can disable it
|
||||
in Config->Switches.
|
||||
This will force the use of the old and tried, but slower par2cmdline program.
|
||||
|
||||
- A bug in Windows 7 may cause severe memory leaks when you use SABnzbd in
|
||||
combination with some virus scanners and firewalls.
|
||||
Install this hotfix:
|
||||
Description: http://support.microsoft.com/kb/979223/en-us
|
||||
Download location: http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=979223&kbln=en-us
|
||||
|
||||
- Some Usenet servers have intermittent login (or other) problems.
|
||||
For these the server blocking method is not very favourable.
|
||||
There is an INI-only option that will limit blocks to 1 minute.
|
||||
no_penalties = 1
|
||||
See: https://sabnzbd.org/wiki/configuration/2.2/special
|
||||
See: https://sabnzbd.org/wiki/configuration/2.3/special
|
||||
|
||||
- Some third-party utilties try to probe SABnzbd API in such a way that you will
|
||||
often see warnings about unauthenticated access.
|
||||
If you are sure these probes are harmless, you can suppress the warnings by
|
||||
setting the option "api_warnings" to 0.
|
||||
See: https://sabnzbd.org/wiki/configuration/2.2/special
|
||||
See: https://sabnzbd.org/wiki/configuration/2.3/special
|
||||
|
||||
- On OSX you may encounter downloaded files with foreign characters.
|
||||
The par2 repair may fail when the files were created on a Windows system.
|
||||
@@ -41,7 +31,7 @@
|
||||
You will see this only when downloaded files contain accented characters.
|
||||
You need to fix it yourself by running the convmv utility (available for most Linux platforms).
|
||||
Possible the file system override setting 'fsys_type' might be solve things:
|
||||
See: https://sabnzbd.org/wiki/configuration/2.2/special
|
||||
See: https://sabnzbd.org/wiki/configuration/2.3/special
|
||||
|
||||
- The "Watched Folder" sometimes fails to delete the NZB files it has
|
||||
processed. This happens when other software still accesses these files.
|
||||
@@ -51,6 +41,10 @@
|
||||
|
||||
- Memory usage can sometimes have high peaks. This makes using SABnzbd on very low
|
||||
memory systems (e.g. a NAS device or a router) a challenge.
|
||||
In particular on Synology (SynoCommunity) the device may report that SABnzbd is using
|
||||
a lot of memory even when idle. In this case the memory is usually not actually used by
|
||||
SABnzbd and will be available if required by other apps or the system. More information
|
||||
can be found in the discussion here: https://github.com/SynoCommunity/spksrc/issues/2856
|
||||
|
||||
- SABnzbd is not compatible with some software firewall versions.
|
||||
The Microsoft Windows Firewall works fine, but remember to tell this
|
||||
@@ -72,13 +66,3 @@
|
||||
Config->Special->wait_for_dfolder to 1.
|
||||
SABnzbd will appear to hang until the drive is mounted.
|
||||
|
||||
- On some operating systems it looks like there is a problem with one of the standard Python libraries.
|
||||
It is possible that you get errors about saving admin files and even unexplained crashes.
|
||||
If so, you can enable the option for the alternative library.
|
||||
It has the same functionality, but is slower.
|
||||
We've had reports about this issue on non-mainstream Linux platforms.
|
||||
- OpenElec
|
||||
- Squeeze Linux
|
||||
There is a "special" option that will allow you to select an alternative library.
|
||||
use_pickle = 1
|
||||
See: https://sabnzbd.org/wiki/configuration/2.2/special
|
||||
|
||||
4
PKG-INFO
4
PKG-INFO
@@ -1,7 +1,7 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: SABnzbd
|
||||
Version: 2.3.0Alpha1
|
||||
Summary: SABnzbd-2.3.0Alpha1
|
||||
Version: 2.3.0
|
||||
Summary: SABnzbd-2.3.0
|
||||
Home-page: https://sabnzbd.org
|
||||
Author: The SABnzbd Team
|
||||
Author-email: team@sabnzbd.org
|
||||
|
||||
26
README.mkd
26
README.mkd
@@ -1,6 +1,13 @@
|
||||
Release Notes - SABnzbd 2.3.0 Alpha 1
|
||||
Release Notes - SABnzbd 2.3.0
|
||||
=========================================================
|
||||
|
||||
## SABYenc updated
|
||||
- Improved download performance 10-15% on CPU limited devices
|
||||
by optimizations and by removing redundant article verification.
|
||||
Linux/NAS: Update of SABYenc to version 3.3.1 is required.
|
||||
Update your package or see https://sabnzbd.org/sabyenc
|
||||
Windows/macOS: Update is included in the installers.
|
||||
|
||||
## Changes since 2.2.1
|
||||
- Option to limit Servers to specific Categories removed
|
||||
- Improved par2 handling and obfuscated files detection
|
||||
@@ -9,11 +16,16 @@ Release Notes - SABnzbd 2.3.0 Alpha 1
|
||||
- Article-state (which servers are tried) is preserved after restart
|
||||
- Auto disconnect (if enabled) only after verification of last item
|
||||
- Slight performance improvement when fetching RSS-feeds
|
||||
- RSS-feed title is shown for URLs being grabbed
|
||||
- Job title from RSS-feed is shown for URLs being grabbed
|
||||
- URL grabbing can now be individually paused
|
||||
- Scheduler can pause/unpause jobs in specific category
|
||||
- Series Duplicate Checker can allow PROPER/REAL/REPACK versions
|
||||
- Refresh-icon in Glitter when refresh rate is above 2 seconds
|
||||
- Different icon for downloads with Force priority
|
||||
- Show progress during verification of extra files
|
||||
- All dates and times are now time zone independent
|
||||
- API: 'missing' field removed from 'queue', use 'mbmissing'
|
||||
- API: 'warnings' method now returns array for better handling
|
||||
- macOS: Bundled new OpenSSL version with support for TLSv1.2
|
||||
- macOS: No longer linked to system certificate store
|
||||
- macOS and Windows: Installers include Mozilla CA certificates
|
||||
@@ -22,11 +34,17 @@ Release Notes - SABnzbd 2.3.0 Alpha 1
|
||||
- Reduce CPU usage with multiple servers
|
||||
- Fix yet another potential stalling issue
|
||||
- Remove Timeout tracebacks
|
||||
- Handle locked history database better
|
||||
- Only warn if number of actual passwords is larger than 30
|
||||
- Unexpected behavior when diskspace becomes critically low
|
||||
- MacOS: Direct Unpack could hang in case of special charters in names
|
||||
- API: Correct listing of downloaded and queued files in get_files
|
||||
- Retried jobs would show incorrect download progress
|
||||
- Password file was loaded from disk excessively
|
||||
- API: Correct listing of downloaded and queued files in 'get_files'
|
||||
- API: Number of bytes missing and downloaded could be slightly off
|
||||
- API: Jobs with Force priority should always have status 'Downloading'
|
||||
- MacOS: Direct Unpack could hang in case of special characters in names
|
||||
- Windows: Unpack could fail if started instantly after previous one
|
||||
- Windows: Download with many par2 sets could get listed as failed
|
||||
|
||||
## Upgrading from 2.1.x and older
|
||||
- Finish queue
|
||||
|
||||
15
SABnzbd.py
15
SABnzbd.py
@@ -32,6 +32,7 @@ except:
|
||||
|
||||
import logging
|
||||
import logging.handlers
|
||||
import traceback
|
||||
import os
|
||||
import getopt
|
||||
import signal
|
||||
@@ -150,7 +151,11 @@ class guiHandler(logging.Handler):
|
||||
# Loose the oldest record
|
||||
self.store.pop(0)
|
||||
try:
|
||||
self.store.append(self.format(record))
|
||||
# Append traceback, if available
|
||||
warning = {'type': record.levelname, 'text': record.msg % record.args, 'time': int(time.time())}
|
||||
if record.exc_info:
|
||||
warning['text'] = '%s\n%s' % (warning['text'], traceback.format_exc())
|
||||
self.store.append(warning)
|
||||
except UnicodeDecodeError:
|
||||
# Catch elusive Unicode conversion problems
|
||||
pass
|
||||
@@ -161,12 +166,6 @@ class guiHandler(logging.Handler):
|
||||
def count(self):
|
||||
return len(self.store)
|
||||
|
||||
def last(self):
|
||||
if self.store:
|
||||
return self.store[len(self.store) - 1]
|
||||
else:
|
||||
return ""
|
||||
|
||||
def content(self):
|
||||
""" Return an array with last records """
|
||||
return self.store
|
||||
@@ -202,11 +201,11 @@ def print_help():
|
||||
print " --repair-all Try to reconstruct the queue from the incomplete folder"
|
||||
print " with full data reconstruction"
|
||||
print " --https <port> Port to use for HTTPS server"
|
||||
print " --ipv6_hosting <0|1> Listen on IPv6 address [::1] [*]"
|
||||
print " --no-login Start with username and password reset"
|
||||
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 " --ipv6_hosting <0|1> Listen on IPv6 address [::1]"
|
||||
|
||||
|
||||
def print_version():
|
||||
|
||||
6
appveyor.yml
Normal file
6
appveyor.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
install:
|
||||
- pip install --upgrade -r tests/requirements.txt
|
||||
- pip install pypiwin32
|
||||
|
||||
build_script:
|
||||
- pytest
|
||||
@@ -1,16 +0,0 @@
|
||||
import six
|
||||
|
||||
import mock
|
||||
|
||||
from cherrypy import wsgiserver
|
||||
|
||||
|
||||
class TestWSGIGateway_u0:
|
||||
@mock.patch('cherrypy.wsgiserver.WSGIGateway_10.get_environ',
|
||||
lambda self: {'foo': 'bar'})
|
||||
def test_decodes_items(self):
|
||||
req = mock.MagicMock(path=b'/', qs=b'')
|
||||
gw = wsgiserver.WSGIGateway_u0(req=req)
|
||||
env = gw.get_environ()
|
||||
assert env['foo'] == 'bar'
|
||||
assert isinstance(env['foo'], six.text_type)
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Config"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/configure"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/configure"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<!--#from locale import getpreferredencoding#-->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Categories"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/categories"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/categories"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
<div class="colmask">
|
||||
<div class="section">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Folders"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/folders"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/folders"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="General"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/general"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/general"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
@@ -253,6 +253,32 @@
|
||||
})
|
||||
hideOrShowTranslate()
|
||||
|
||||
// Highlight in case user is not safe
|
||||
// So when exposed to internet and no password, no external limit or no username/password
|
||||
var safeCheck = \$('#host, #local_ranges, #inet_exposure, #${pid}_wu, #${pid}_wp')
|
||||
function checkSafety() {
|
||||
if(\$('#host').val() != 'localhost' && \$('#host').val() != '127.0.0.1') {
|
||||
// No limitation on local-network
|
||||
if(!\$('#local_ranges').val() || \$('#inet_exposure').val() > 3) {
|
||||
// And no username and password?
|
||||
if(!\$('#${pid}_wu').val() || !\$('#${pid}_wp').val()) {
|
||||
// Add warning icon if not there already
|
||||
if(!\$('.host-warning').length) {
|
||||
safeCheck.after('<span class="glyphicon glyphicon-alert host-warning"></span>')
|
||||
\$('.host-warning').tooltip({'title': '$T('checkSafety')'})
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
// Remove warnings
|
||||
\$('.host-warning').remove()
|
||||
safeCheck.removeClass('host-warning-highlight')
|
||||
}
|
||||
checkSafety()
|
||||
safeCheck.on('change', checkSafety)
|
||||
|
||||
// Click functions
|
||||
\$('#apikey, #nzbkey').click(function () { \$(this).select() });
|
||||
|
||||
\$('#generate_new_apikey').click(function () {
|
||||
@@ -330,7 +356,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Update the value
|
||||
\$('#bandwidth_max_value, #bandwidth_max_dropdown').on('change', function() {
|
||||
if(\$('#bandwidth_max_value').val()) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Email"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/notifications"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/notifications"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<!--#def show_notify_checkboxes($section_label)#-->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="RSS"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/rss"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/rss"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
<div class="colmask">
|
||||
<!--#if not $active_feed#-->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Scheduling"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/scheduling"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/scheduling"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<%
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Servers"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/servers"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/servers"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
@@ -7,7 +7,7 @@
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<div id="addServer">
|
||||
<div class="padding alt">
|
||||
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="addServerContent" style="display: none;">
|
||||
@@ -407,10 +407,10 @@
|
||||
}
|
||||
\$(this).parent().next().toggle();
|
||||
\$(this).parent().next().next().toggle();
|
||||
if (\$(this).attr("value") == "$T('showDetails')") {
|
||||
\$(this).attr("value", "$T('hideDetails')");
|
||||
if (\$(this).text().indexOf("$T('showDetails')") > 0) {
|
||||
\$(this).html(\$(this).html().replace("$T('showDetails')", "$T('hideDetails')"));
|
||||
} else {
|
||||
\$(this).attr("value", "$T('showDetails')");
|
||||
\$(this).html(\$(this).html().replace("$T('hideDetails')", "$T('showDetails')"));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Sorting"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/sorting"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/sorting"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Special"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/special"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/special"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Switches"#-->
|
||||
<!--#set global $help_uri="configuration/2.2/switches"#-->
|
||||
<!--#set global $help_uri="configuration/2.3/switches"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
|
||||
@@ -1028,8 +1028,8 @@ input[type="checkbox"] {
|
||||
display: block;
|
||||
top: -7px;
|
||||
left: 50%;
|
||||
width: 120px;
|
||||
margin-left: -40px;
|
||||
width: 150px;
|
||||
margin-left: -50px;
|
||||
min-width: initial;
|
||||
opacity: 0.8;
|
||||
}
|
||||
@@ -1082,6 +1082,12 @@ input[type="checkbox"] {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.host-warning {
|
||||
color: #404040;
|
||||
margin-left: 7px;
|
||||
top: 3px;
|
||||
}
|
||||
|
||||
.fileBrowser .glyphicon {
|
||||
margin-right: 2px;
|
||||
top: 1px;
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<tr>
|
||||
<td class="table-messages-label">
|
||||
<span class="label" data-bind="css: 'label-' + css, text: type"></span>
|
||||
<strong data-bind="text: date, attr: { 'data-timestamp': timestamp }"></strong>
|
||||
<strong data-bind="text: displayDateTime(timestamp, \$parent.dateFormat(), 'X'), attr: { 'data-timestamp': timestamp }"></strong>
|
||||
<span class="queue-message-text" data-bind="html: text"></span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -59,15 +59,9 @@
|
||||
<div id="feedback-slider-inner">
|
||||
<p><strong>If anything is not working as expected, or could be improved, let us know!</strong></p>
|
||||
<p><strong>If you encounter an error, please include the log file (click on <span class="glyphicon glyphicon-wrench"></span> ) when contacting us.</strong></p>
|
||||
<h4>General</h4>
|
||||
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/" target="_blank">SABnzbd Forum</a><br />
|
||||
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/viewforum.php?f=11" target="_blank">SABnzbd Forum</a><br />
|
||||
<span class="glyphicon glyphicon-plane"></span> <a href="https://github.com/sabnzbd/sabnzbd/" target="_blank">SABnzbd on Github</a><br />
|
||||
<span class="glyphicon glyphicon-globe"></span> <a href="https://translations.launchpad.net/sabnzbd" target="_blank">Translations of SABnzbd</a><br />
|
||||
<span class="glyphicon glyphicon-envelope"></span> <a href="mailto:bugs@sabnzbd.org?body=Version:%20$version%20Skin:%20Glitter">Email bugs@sabnzbd.org</a>
|
||||
|
||||
<h4>Interface (Glitter)</h4>
|
||||
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/viewtopic.php?f=5&t=18880" target="_blank">Glitter at SABnzbd Forum</a><br />
|
||||
<span class="glyphicon glyphicon-envelope"></span> <a href="mailto:safihre@sabnzbd.org?body=Version:%20$version">Email safihre@sabnzbd.org</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
<tr class="queue-item">
|
||||
<td>
|
||||
<a href="#" data-bind="click: pauseToggle, attr: { 'title': pausedStatus() ? '$T('link-resume')' : '$T('link-pause')' }">
|
||||
<span class="hover-button glyphicon" data-bind="css: { 'glyphicon-play': pausedStatus(), 'glyphicon-pause': !pausedStatus() }"></span>
|
||||
<span class="hover-button glyphicon" data-bind="css: queueIcon"></span>
|
||||
</a>
|
||||
</td>
|
||||
<td class="name">
|
||||
@@ -121,8 +121,8 @@
|
||||
</td>
|
||||
<td class="progress-indicator">
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentageRounded() + '; background-color: ' + progressColor() + ';' }">
|
||||
<strong data-bind="text: percentageRounded"></strong>
|
||||
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentage() + '%; background-color: ' + progressColor() + ';' }">
|
||||
<strong data-bind="text: percentage() + '%'"></strong>
|
||||
<i data-bind="text: missingText"></i>
|
||||
</div>
|
||||
<span data-bind="text: progressText"></span>
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
var sabSpeedHistory = [$bytespersec_list];
|
||||
var newRelease = "$new_release";
|
||||
var newReleaseUrl = "$new_rel_url";
|
||||
var glitterIsBeta = ("$version".search(/Alpa|Beta|x/)) > 0;
|
||||
var glitterIsBeta = ("$version".search(/[develop|Alpha|Beta|RC]/)) > 0;
|
||||
var glitterPreLoadQueue = $preload_queue;
|
||||
var glitterPreLoadHistory = $preload_history;
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
glitterTranslate.removeDown = "$T('Glitter-confirmClearDownloads')";
|
||||
glitterTranslate.removeDow1 = "$T('Glitter-confirmClear1Download')";
|
||||
glitterTranslate.retryAll = "$T('link-retryAll')?";
|
||||
glitterTranslate.fetch = "$T('Glitter-fetch')";
|
||||
glitterTranslate.encrypted = "$T('Glitter-encrypted')";
|
||||
glitterTranslate.duplicate = "$T('Glitter-duplicate')";
|
||||
glitterTranslate.tooLarge = "$T('Glitter-tooLarge')";
|
||||
|
||||
@@ -128,7 +128,7 @@ function displayDateTime(inDate, outFormat, inFormat) {
|
||||
if(inDate == '') {
|
||||
var theMoment = moment()
|
||||
} else {
|
||||
var theMoment = moment(inDate, inFormat)
|
||||
var theMoment = moment.utc(inDate, inFormat)
|
||||
}
|
||||
// Special format or regular format?
|
||||
if(outFormat == 'fromNow') {
|
||||
|
||||
@@ -536,6 +536,7 @@ function ViewModel() {
|
||||
callAPI({
|
||||
mode: 'warnings'
|
||||
}).then(function(response) {
|
||||
|
||||
// Reset it all
|
||||
self.allWarnings.removeAll();
|
||||
if(response) {
|
||||
@@ -544,20 +545,16 @@ function ViewModel() {
|
||||
|
||||
// Go over all warnings and add
|
||||
$.each(response.warnings, function(index, warning) {
|
||||
// Split warning into parts
|
||||
var warningSplit = convertHTMLtoText(warning).split(/\n/);
|
||||
|
||||
// Reformat CSS label and date
|
||||
// Replaces spaces by non-breakable spaces and newlines with br's
|
||||
var warningData = {
|
||||
index: index,
|
||||
type: glitterTranslate.status[warningSplit[1]].slice(0, -1),
|
||||
text: warningSplit.slice(2).join('<br/>').replace(/ /g, '\u00A0'), // Recombine if multiple lines
|
||||
date: displayDateTime(warningSplit[0], self.dateFormat(), 'YYYY-MM-DD HH:mm'),
|
||||
timestamp: moment(warningSplit[0], 'YYYY-MM-DD HH:mm').unix(),
|
||||
css: (warningSplit[1] == "ERROR" ? "danger" : warningSplit[1] == "WARNING" ? "warning" : "info"),
|
||||
type: glitterTranslate.status[warning.type].slice(0, -1),
|
||||
text: convertHTMLtoText(warning.text).replace(/ /g, '\u00A0').replace(/(?:\r\n|\r|\n)/g, '<br />'),
|
||||
timestamp: warning.time,
|
||||
css: (warning.type == "ERROR" ? "danger" : warning.type == "WARNING" ? "warning" : "info"),
|
||||
clear: self.clearWarnings
|
||||
};
|
||||
|
||||
self.allWarnings.push(warningData)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -480,9 +480,10 @@ function QueueModel(parent, data) {
|
||||
self.status = ko.observable(data.status);
|
||||
self.isGrabbing = ko.observable(data.status == 'Grabbing' || data.avg_age == '-')
|
||||
self.totalMB = ko.observable(parseFloat(data.mb));
|
||||
self.remainingMB = ko.observable(parseFloat(data.mbleft));
|
||||
self.remainingMB = ko.observable(parseFloat(data.mbleft))
|
||||
self.missingMB = ko.observable(parseFloat(data.mbmissing))
|
||||
self.percentage = ko.observable(parseInt(data.percentage))
|
||||
self.avg_age = ko.observable(data.avg_age)
|
||||
self.missing = ko.observable(parseFloat(data.mbmissing))
|
||||
self.direct_unpack = ko.observable(data.direct_unpack)
|
||||
self.category = ko.observable(data.cat);
|
||||
self.priority = ko.observable(parent.priorityName[data.priority]);
|
||||
@@ -502,8 +503,8 @@ function QueueModel(parent, data) {
|
||||
if(self.status() == 'Checking') {
|
||||
return '#58A9FA'
|
||||
}
|
||||
// Check for missing data, the value is arbitrary! (3%)
|
||||
if(self.missing()/self.totalMB() > 0.03) {
|
||||
// Check for missing data, the value is arbitrary! (2%)
|
||||
if(self.missingMB()/self.totalMB() > 0.02) {
|
||||
return '#F8A34E'
|
||||
}
|
||||
// Set to grey, only when not Force download
|
||||
@@ -514,22 +515,16 @@ function QueueModel(parent, data) {
|
||||
return '';
|
||||
});
|
||||
|
||||
// MB's and percentages
|
||||
self.downloadedMB = ko.computed(function() {
|
||||
return(self.totalMB() - self.remainingMB()).toFixed(0);
|
||||
});
|
||||
self.percentageRounded = ko.pureComputed(function() {
|
||||
return fixPercentages(((self.downloadedMB() / self.totalMB()) * 100).toFixed(2))
|
||||
})
|
||||
// MB's
|
||||
self.progressText = ko.pureComputed(function() {
|
||||
return self.downloadedMB() + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
|
||||
return (self.totalMB() - self.remainingMB()).toFixed(0) + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
|
||||
})
|
||||
|
||||
// Texts
|
||||
self.missingText= ko.pureComputed(function() {
|
||||
// Check for missing data, the value is arbitrary! (3%)
|
||||
if(self.missing()/self.totalMB() > 0.03) {
|
||||
return self.missing().toFixed(0) + ' MB ' + glitterTranslate.misingArt
|
||||
// Check for missing data, the value is arbitrary! (1%)
|
||||
if(self.missingMB()/self.totalMB() > 0.01) {
|
||||
return self.missingMB().toFixed(0) + ' MB ' + glitterTranslate.misingArt
|
||||
}
|
||||
return;
|
||||
})
|
||||
@@ -538,6 +533,10 @@ function QueueModel(parent, data) {
|
||||
if(self.status() == 'Checking') {
|
||||
return glitterTranslate.checking
|
||||
}
|
||||
// Grabbing
|
||||
if(self.status() == 'Grabbing') {
|
||||
return glitterTranslate.fetch
|
||||
}
|
||||
// Pausing status
|
||||
if((self.parent.parent.downloadsPaused() && self.priority() != 2) || self.pausedStatus()) {
|
||||
return glitterTranslate.paused;
|
||||
@@ -546,6 +545,18 @@ function QueueModel(parent, data) {
|
||||
return rewriteTime(self.timeLeft());
|
||||
});
|
||||
|
||||
// Icon to better show force-priority
|
||||
self.queueIcon = ko.computed(function() {
|
||||
// Force comes first
|
||||
if(self.priority() == 2) {
|
||||
return 'glyphicon-forward'
|
||||
}
|
||||
if(self.pausedStatus()) {
|
||||
return 'glyphicon-play'
|
||||
}
|
||||
return 'glyphicon-pause'
|
||||
})
|
||||
|
||||
// Extra queue column
|
||||
self.extraText = ko.pureComputed(function() {
|
||||
// Picked anything?
|
||||
@@ -581,8 +592,9 @@ function QueueModel(parent, data) {
|
||||
self.isGrabbing(data.status == 'Grabbing' || data.avg_age == '-')
|
||||
self.totalMB(parseFloat(data.mb));
|
||||
self.remainingMB(parseFloat(data.mbleft));
|
||||
self.missingMB(parseFloat(data.mbmissing))
|
||||
self.percentage(parseInt(data.percentage))
|
||||
self.avg_age(data.avg_age)
|
||||
self.missing(parseFloat(data.mbmissing))
|
||||
self.direct_unpack(data.direct_unpack)
|
||||
self.category(data.cat);
|
||||
self.priority(parent.priorityName[data.priority]);
|
||||
|
||||
@@ -360,7 +360,7 @@ li.dropdown {
|
||||
|
||||
#feedback-slider:hover {
|
||||
left: 0px;
|
||||
height: 340px;
|
||||
height: 200px;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@@ -404,7 +404,6 @@ thead {
|
||||
|
||||
tr th {
|
||||
border-bottom: none !important;
|
||||
visibility: hidden;
|
||||
padding: 0px !important;
|
||||
height: 0px;
|
||||
}
|
||||
@@ -527,6 +526,7 @@ tbody>tr>td:last-child {
|
||||
}
|
||||
|
||||
.hover-button.glyphicon-play,
|
||||
.hover-button.glyphicon-forward,
|
||||
.hover-button.glyphicon-stop {
|
||||
opacity: 1;
|
||||
color: #474747;
|
||||
|
||||
@@ -99,9 +99,8 @@
|
||||
#if $loadavg#$T('ft-sysload'): <span id="loadavg">$loadavg</span>#end if#
|
||||
</div>
|
||||
<div id="nav_text_left">
|
||||
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
|
||||
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
|
||||
#if $pane=="Main"#
|
||||
⋅ <a href="${path}config/general#web_dir">#echo $T('useGlitter').split('.')[0]#.</a>
|
||||
#if $new_release#⋅ <a href="$new_rel_url" id="new_release" target="_blank">$T('Plush-updateAvailable').replace(' ',' ')</a>#end if#
|
||||
#end if#
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
$.plush.queuenoofslots = $noofslots;
|
||||
$.plush.SetQueueSpeedLimit('$speedlimit', '$speedlimit_abs');
|
||||
$.plush.SetQueueFinishAction('$finishaction');
|
||||
$.plush.SetWarnings($have_warnings,"<!--#echo $last_warning.replace("\n"," ").replace('"',"'").replace('\\','\\\\') #-->");
|
||||
$.plush.SetWarnings($have_warnings,"");
|
||||
$.plush.SetQueuePauseInfo(<!--#if $paused#-->true<!--#else#-->false<!--#end if#-->,'$pause_int');
|
||||
$.plush.SetQueueETAStats("<!--#if float($kbpersec) > 1023 #-->$speed<!--#else#--><!--#echo "%.0f" % float($kbpersec)#--> K<!--#end if#-->",<!--#echo "%.0f" % float($kbpersec)#-->,'$timeleft','$T('eta'): $eta');
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
</td>
|
||||
|
||||
<td class="download-title" <!--#if $rating_enable#-->style="width:35%"<!--#end if#-->>
|
||||
<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('_', '_​')<!--#if $slot.password#--> / $slot.password<!--#end if#--></a>
|
||||
<a href="nzb/$slot.nzo_id/" title="$T('status'): $T('post-'+$slot.status)<br/>$T('nzo-age'): $slot.avg_age<br/><!--#if $slot.mbmissing!="0.00"#-->$T('missingArt'): $slot.mbmissing $T('MB')<!--#end if#-->">$slot.filename.replace('.', '.​').replace('_', '_​')<!--#if $slot.password#--> / $slot.password<!--#end if#--></a>
|
||||
</td>
|
||||
|
||||
<!--#if $rating_enable#-->
|
||||
|
||||
@@ -146,7 +146,7 @@ jQuery(function($){
|
||||
$("#plush_options").colorbox({ inline:true, href:"#plush_options_modal", title:$("#plush_options").text(),
|
||||
innerWidth:"375px", innerHeight:"350px", initialWidth:"375px", initialHeight:"350px", speed:0, opacity:0.7
|
||||
});
|
||||
|
||||
|
||||
// Save the type of speedlimit display
|
||||
$('#maxSpeed-label').change(function() {
|
||||
$.plush.speedLimitType = $(this).val();
|
||||
@@ -159,19 +159,19 @@ jQuery(function($){
|
||||
$('#maxSpeed-label').val($.plush.speedLimitType)
|
||||
|
||||
// Max Speed main menu input -- don't change value on refresh when focused
|
||||
$("#maxSpeed-option").focus(function(){
|
||||
$.plush.focusedOnSpeedChanger = true;
|
||||
}).blur(function(){
|
||||
$.plush.focusedOnSpeedChanger = false;
|
||||
$("#maxSpeed-option").focus(function(){
|
||||
$.plush.focusedOnSpeedChanger = true;
|
||||
}).blur(function(){
|
||||
$.plush.focusedOnSpeedChanger = false;
|
||||
}).keyup(function (e) {
|
||||
// Catch the enter
|
||||
if (e.keyCode == 13) {
|
||||
$("#maxSpeed-enable").click()
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
// Submit the new speedlimit
|
||||
$("#maxSpeed-enable, #maxSpeed-disable").click( function(e) {
|
||||
$("#maxSpeed-enable, #maxSpeed-disable").click( function(e) {
|
||||
// Remove
|
||||
if ($(e.target).attr('id')=="maxSpeed-disable") {
|
||||
$('#maxSpeed-option').val('');
|
||||
@@ -496,7 +496,7 @@ jQuery(function($){
|
||||
};
|
||||
|
||||
// static-element tooltips
|
||||
$('body').delegate('#pausefor_title, #last_warning, #time-left, #multi_delete, #explain-blockRefresh, #pause_resume, #hist_purge, #queueTable td.download-title a, #queueTable td.eta span, #queueTable td.options .icon_nzb_remove, #historyTable td.options .icon_nzb_remove, #historyTable td div.icon_history_verbose', 'mouseover mouseout mousemove', function(event) {
|
||||
$('body').delegate('#pausefor_title, #time-left, #multi_delete, #explain-blockRefresh, #pause_resume, #hist_purge, #queueTable td.download-title a, #queueTable td.eta span, #queueTable td.options .icon_nzb_remove, #historyTable td.options .icon_nzb_remove, #historyTable td div.icon_history_verbose', 'mouseover mouseout mousemove', function(event) {
|
||||
var link = this,
|
||||
$link = $(this);
|
||||
|
||||
@@ -1095,7 +1095,7 @@ $("a","#multiops_inputs").click(function(e){
|
||||
title:function(){return $(this).text().replace("&", "&").replace("<", "<").replace(">", ">");},
|
||||
innerWidth:"80%", innerHeight:"300px", initialWidth:"80%", initialHeight:"300px", speed:0, opacity:0.7 });
|
||||
|
||||
// modal for reporting issues
|
||||
// modal for reporting issues
|
||||
$("#historyTable .modal-report").colorbox({ inline:true,
|
||||
href: function(){return "#report-"+$(this).parent().parent().parent().attr('id');},
|
||||
title:function(){return $(this).text();},
|
||||
@@ -1252,7 +1252,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
|
||||
$('#queue-pagination span').removeClass('loading'); // Remove spinner graphic from pagination
|
||||
$('#manual_refresh_wrapper').removeClass('refreshing'); // Refresh state notification
|
||||
},
|
||||
error: function(xhr){
|
||||
error: function(xhr){
|
||||
// Only reason for a 404 error could be a login failure -> redirect
|
||||
if(xhr.status == 404) {
|
||||
document.location=document.location;
|
||||
@@ -1320,7 +1320,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
|
||||
$('#history .avg_rate').rateit({readonly: true, resetable: false, step: 0.5});
|
||||
$('#history .avg_rate').each(function() { $(this).rateit('value', $(this).attr('value') / 2); });
|
||||
$('#history .user_combo option').filter(function() {
|
||||
return $(this).attr('value') == $(this).parent().parent().find('input.user_combo').attr('value');
|
||||
return $(this).attr('value') == $(this).parent().parent().find('input.user_combo').attr('value');
|
||||
}).attr('selected', true);
|
||||
$('#history-pagination span').removeClass('loading'); // Remove spinner graphic from pagination
|
||||
}
|
||||
@@ -1342,11 +1342,11 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
|
||||
// For switching using the select
|
||||
if(!speedLimit) speedLimit = $.plush.speedLimit;
|
||||
if(speedLimitAbs == undefined) speedLimitAbs = $.plush.speedLimitAbs;
|
||||
|
||||
// Save
|
||||
|
||||
// Save
|
||||
$.plush.speedLimit = speedLimit;
|
||||
$.plush.speedLimitAbs = speedLimitAbs;
|
||||
|
||||
|
||||
// How do we format?
|
||||
switch($.plush.speedLimitType) {
|
||||
case '%':
|
||||
@@ -1360,11 +1360,11 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
|
||||
speedlimitDisplay = speedLimitAbs/1024/1024;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// In case nothing and we make the displaying of the float more pretty
|
||||
speedlimitDisplay = (isNaN(speedlimitDisplay) || speedlimitDisplay == '0') ? '' : speedlimitDisplay;
|
||||
speedlimitDisplay = Math.round(speedlimitDisplay*10)/10;
|
||||
|
||||
|
||||
// Update
|
||||
if ($("#maxSpeed-option").val() != speedlimitDisplay && !$.plush.focusedOnSpeedChanger)
|
||||
$("#maxSpeed-option").val(speedlimitDisplay);
|
||||
|
||||
@@ -109,6 +109,11 @@ body {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#new_release {
|
||||
color: green;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#livetip {
|
||||
position: absolute;
|
||||
background-color: #cfc;
|
||||
@@ -338,7 +343,6 @@ body {
|
||||
clear:left;
|
||||
padding: 0 20px 0 25px;
|
||||
font-size:90%;
|
||||
font-weight: bold;
|
||||
}
|
||||
#nav_text_left a, #nav_text_right a {
|
||||
color:#000;
|
||||
@@ -1079,7 +1083,7 @@ tr:hover .history_added { color: black; }
|
||||
color: red;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
|
||||
.rating_icon_vision {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!--#set global $pane="Status"#-->
|
||||
<!--#set global $help_uri="GUI+Status-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<!--#import datetime#-->
|
||||
<div class="tabs">
|
||||
<ul>
|
||||
<li><a href="#tabs-warnings">$T('lastWarnings')</a></li>
|
||||
@@ -33,7 +33,11 @@
|
||||
<!--#for $warn in $warnings#-->
|
||||
<!--#set $odd = not $odd#-->
|
||||
<tr class="<!--#if $odd then "odd" else "even"#-->">
|
||||
<td>$warn.replace("\n","</td><td>", 2)</td></tr>
|
||||
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
|
||||
<td>$when</td>
|
||||
<td>$warn.type</td>
|
||||
<td>$warn.text</td>
|
||||
</tr>
|
||||
<!--#end for#-->
|
||||
</table>
|
||||
<!--#else#-->
|
||||
|
||||
16146
interfaces/smpl/templates/static/MochiKit/MochiKit.js
vendored
16146
interfaces/smpl/templates/static/MochiKit/MochiKit.js
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,2 +1,2 @@
|
||||
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
|
||||
dojo.hostenv.moduleLoaded("MochiKit.*");
|
||||
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
|
||||
dojo.hostenv.moduleLoaded("MochiKit.*");
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<!--#import datetime#-->
|
||||
<script type="text/javascript">
|
||||
window.onload = function() {
|
||||
location = "../#/status"
|
||||
@@ -36,7 +37,10 @@ $T('logging'):
|
||||
<!--#if $warnings#-->
|
||||
<h2>$T('lastWarnings') (<a class="config" onClick="lr('status/clearwarnings','', '-1', this.parentNode.id);">$T('clearWarnings')</a>)</h2>
|
||||
<!--#for $warn in $warnings#-->
|
||||
$warn<br/>
|
||||
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
|
||||
$when<br>
|
||||
$warn.type<br>
|
||||
$warn.text<br>
|
||||
<!--#end for#-->
|
||||
<!--#end if#-->
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
The original author of SABnzbd based his work on Pynewsleecher by Freddy@madcowdesease.org.
|
||||
|
||||
Few parts of Pynewsleecher have survived the generations of SABnzbd in a
|
||||
recognizable form.
|
||||
Still, we wish to thank Freddy for his inspiration.
|
||||
|
||||
The home of the Pynewsleecher project:
|
||||
http://www.madcowdisease.org/mcd/pynewsleecher
|
||||
|
||||
The software does not carry any license information.
|
||||
|
||||
The original author of SABnzbd based his work on Pynewsleecher by Freddy@madcowdesease.org.
|
||||
|
||||
Few parts of Pynewsleecher have survived the generations of SABnzbd in a
|
||||
recognizable form.
|
||||
Still, we wish to thank Freddy for his inspiration.
|
||||
|
||||
The home of the Pynewsleecher project:
|
||||
http://www.madcowdisease.org/mcd/pynewsleecher
|
||||
|
||||
The software does not carry any license information.
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
On http://www.brunningonline.net/simon/blog/archives/001835.html,
|
||||
the author licensed SysTrayIcon.py under a variant of the WTFPL:
|
||||
|
||||
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
|
||||
> "Aleister Crowley" style license - "Do what thou wilt shall be the
|
||||
> only law".
|
||||
>
|
||||
> Err, but don't sue me if it doesn't work. ;-)
|
||||
On http://www.brunningonline.net/simon/blog/archives/001835.html,
|
||||
the author licensed SysTrayIcon.py under a variant of the WTFPL:
|
||||
|
||||
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
|
||||
> "Aleister Crowley" style license - "Do what thou wilt shall be the
|
||||
> only law".
|
||||
>
|
||||
> Err, but don't sue me if it doesn't work. ;-)
|
||||
|
||||
@@ -12,7 +12,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ASCII\n"
|
||||
"Content-Transfer-Encoding: 7bit\n"
|
||||
"POT-Creation-Date: 2017-09-02 15:39+W. Europe Daylight Time\n"
|
||||
"POT-Creation-Date: 2017-09-10 21:44+W. Europe Daylight Time\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
|
||||
@@ -212,15 +212,6 @@ msgstr ""
|
||||
msgid " Resolving address"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
@@ -456,6 +447,10 @@ msgstr ""
|
||||
msgid "Error removing %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/dirscanner.py [Error message]
|
||||
msgid "Error while adding %s, removing"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
|
||||
msgid "Cannot read Watched Folder %s"
|
||||
msgstr ""
|
||||
@@ -621,7 +616,7 @@ msgstr ""
|
||||
msgid "Authentication missing, please enter username/password from Config->General into your 3rd party program:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid "Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin."
|
||||
msgstr ""
|
||||
|
||||
@@ -689,6 +684,10 @@ msgstr ""
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -982,6 +981,10 @@ msgstr ""
|
||||
msgid "Verifying"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2597,6 +2600,10 @@ msgstr ""
|
||||
msgid "Optional authentication password."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "If the SABnzbd Host or Port is exposed to the internet, your current settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4097,6 +4104,10 @@ msgstr ""
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr ""
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Danish <da@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -226,15 +226,6 @@ msgstr "Afprøv notifikation"
|
||||
msgid " Resolving address"
|
||||
msgstr " Server løsning"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEJL:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
@@ -673,7 +664,7 @@ msgstr ""
|
||||
"Brugeroplysninger mangler, indtast brugernavn / password fra Konfiguration-> "
|
||||
"Generelt i dit tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -752,6 +743,10 @@ msgstr "Fejl parameter"
|
||||
msgid "Back"
|
||||
msgstr "Tilbage"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEJL:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1051,6 +1046,10 @@ msgstr "Disk fuld"
|
||||
msgid "Verifying"
|
||||
msgstr "Bekræfter"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2739,6 +2738,12 @@ msgstr "SABnzbd password"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Valgfrit password."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr "Sikkerhed"
|
||||
@@ -4385,6 +4390,10 @@ msgstr "Mistet forbindelsen til SABnzbd.."
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr "I tilfælde af SABnzbd genstart vil denne skærm forsvinde automatisk!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Opdateringsfrekvens"
|
||||
|
||||
@@ -7,15 +7,19 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-08-24 15:39+0000\n"
|
||||
"Last-Translator: jcfp <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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
msgstr "MultiPar Programmdatei nicht gefunden!"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
@@ -237,15 +241,6 @@ msgstr "Benachrichtigungen testen"
|
||||
msgid " Resolving address"
|
||||
msgstr " Adresse wird aufgelöst …"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEHLER:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "WARNUNG:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Nichts"
|
||||
@@ -698,7 +693,7 @@ msgstr ""
|
||||
"Authentifizierung fehlt. Bitte Benutzernamen und Passwort aus Einstellungen-"
|
||||
">Allgemein in die externe Anwendung eingeben:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -776,6 +771,10 @@ msgstr "Fehlerhafter Parameter"
|
||||
msgid "Back"
|
||||
msgstr "Zurück"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEHLER:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1086,6 +1085,10 @@ msgstr "Festplatte voll"
|
||||
msgid "Verifying"
|
||||
msgstr "Überprüfen"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2800,6 +2803,12 @@ msgstr "SABnzbd-Passwort"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Optionale Anmeldung mit Passwort"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr "Sicherheit"
|
||||
@@ -4493,6 +4502,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"Wenn SABnzbd neustartet, wird diese Anzeige automatisch verschwinden!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "WARNUNG:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Aktualisierungsrate"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\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: 2017-09-03 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -226,15 +226,6 @@ msgstr "Notificación de prueba"
|
||||
msgid " Resolving address"
|
||||
msgstr " Resolviendo sitio"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ERROR:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Ninguno"
|
||||
@@ -675,7 +666,7 @@ msgstr ""
|
||||
"Faltaron datos de cuenta, favor ingresar usuario/contraseña desde Config-"
|
||||
">General en tu aplicacion externa:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -754,6 +745,10 @@ msgstr "Parámetro incorrecto"
|
||||
msgid "Back"
|
||||
msgstr "Atrás"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ERROR:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1059,6 +1054,10 @@ msgstr "Disco lleno"
|
||||
msgid "Verifying"
|
||||
msgstr "Verificando"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2753,6 +2752,12 @@ msgstr "Contraseña de SABnzbd"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Contraseña opcional"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4409,6 +4414,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"Esta ventana desaparecerá automáticamente una vez SABnzbd se haya reiniciado."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Frecuencia de actualización"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Finnish <fi@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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -229,15 +229,6 @@ msgstr "Testaa ilmoitusta"
|
||||
msgid " Resolving address"
|
||||
msgstr " Selvitetään osoitetta"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "VIRHE:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "VAROITUS:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Ei mitään"
|
||||
@@ -672,7 +663,7 @@ msgstr ""
|
||||
"Authentikointi puuttuu, ole hyvä ja syötä käyttäjänimi/salasana Asetukset-"
|
||||
">Yleiset kolmannen osapuolen ohjelmaasi:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -750,6 +741,10 @@ msgstr "Virheellinen parametri"
|
||||
msgid "Back"
|
||||
msgstr "Takaisin"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "VIRHE:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1049,6 +1044,10 @@ msgstr "Levy täynnä"
|
||||
msgid "Verifying"
|
||||
msgstr "Varmennetaan"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2741,6 +2740,12 @@ msgstr "SABnzbd salasana"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Vaihtoehtoinen salasana todennukseen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4400,6 +4405,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"Mikäli SABnzbd käynnistetään uudelleen, tämä ruutu häviää automaattisesti!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "VAROITUS:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Päivitysväli"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"PO-Revision-Date: 2017-08-21 19:45+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-12 18:26+0000\n"
|
||||
"Last-Translator: Fred <88com88@gmail.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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-13 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -38,7 +38,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc"
|
||||
msgstr ""
|
||||
"Module SABYenc... NON trouvé! v%s attendue - https://sabnzbd.org/sabyenc"
|
||||
"Module SABYenc... NON trouvé ! v%s attendue - https://sabnzbd.org/sabyenc"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "_yenc module... NOT found!"
|
||||
@@ -238,15 +238,6 @@ msgstr "Test de Notification"
|
||||
msgid " Resolving address"
|
||||
msgstr " Résolution de l'adresse"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ERREUR:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "AVERTISSEMENT :"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Aucun"
|
||||
@@ -701,7 +692,7 @@ msgstr ""
|
||||
"Authentification manquante, entrez vos identifiant/mot de passe de la "
|
||||
"configuration générale dans votre application tierce :"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -780,6 +771,10 @@ msgstr "Paramètre incorrect"
|
||||
msgid "Back"
|
||||
msgstr "Retour"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ERREUR:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1091,6 +1086,10 @@ msgstr "Disque plein"
|
||||
msgid "Verifying"
|
||||
msgstr "Vérification en cours"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr "Vérification des fichiers supplémentaires"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2808,6 +2807,14 @@ msgstr "Mot de passe SABnzbd"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Mot de passe pour l'authentification (facultatif)."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
"Vos paramètres actuels permettent un accès externe complet à l'interface "
|
||||
"SABnzbd si l'hôte ou le port SABnzbd est ouvert vers l'internet."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr "Sécurité"
|
||||
@@ -4506,6 +4513,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"En cas de redémarrage de SABnzbd cet écran disparaîtra automatiquement!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "AVERTISSEMENT :"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Taux de rafraîchissement"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"PO-Revision-Date: 2017-09-01 23:03+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-11 21:29+0000\n"
|
||||
"Last-Translator: ION IL <Unknown>\n"
|
||||
"Language-Team: Hebrew <he@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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-12 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -222,15 +222,6 @@ msgstr "בחן התראה"
|
||||
msgid " Resolving address"
|
||||
msgstr " פותר כתובת"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "שגיאה:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "אזהרה:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "ללא"
|
||||
@@ -665,7 +656,7 @@ msgstr ""
|
||||
":אימות חסר, אנא הכנס שם משתמש/סיסמה מתוך תצורה->כללי לתוך תכנית הצד השלישי "
|
||||
"שלך"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -742,6 +733,10 @@ msgstr "משתנה לא נכון"
|
||||
msgid "Back"
|
||||
msgstr "הקודם"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "שגיאה:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1042,6 +1037,10 @@ msgstr "דיסק מלא"
|
||||
msgid "Verifying"
|
||||
msgstr "מוודא"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr "בודק קבצי תוספת"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2727,6 +2726,14 @@ msgstr "SABnzbd סיסמת"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "סיסמת אימות רשותית"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
".SABnzbd חשופים לאינטרנט, ההגדרות הנוכחיות שלך מאפשרות גישה חיצונית מלאה אל "
|
||||
"ממשק SABnzbd אם המארח או הפתחה של"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr "אבטחה"
|
||||
@@ -4357,6 +4364,10 @@ msgstr "..SABnzbd אבד חיבור אל"
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr "!המסך יעלם באופן אוטומטי SABnzbd במקרה של הפעלה מחדש של"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "אזהרה:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "קצב רענון"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"PO-Revision-Date: 2017-05-23 11:46+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-03 14:07+0000\n"
|
||||
"Last-Translator: Steffen Bærø <steffen.baro@gmail.com>\n"
|
||||
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -47,11 +47,11 @@ msgstr "par2-binærfil... IKKE funnet!"
|
||||
|
||||
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
|
||||
msgid "Verification and repair will not be possible."
|
||||
msgstr ""
|
||||
msgstr "Verifikasjon og reparasjon vil ikke være mulig."
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
msgstr ""
|
||||
msgstr "MultiPar-binærfil... IKKE funnet!"
|
||||
|
||||
#: SABnzbd.py [Warning message]
|
||||
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
|
||||
@@ -60,7 +60,7 @@ msgstr ""
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Downloads will not unpacked."
|
||||
msgstr ""
|
||||
msgstr "Nedlastinger vil ikke blir pakket ut."
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "unrar binary... NOT found"
|
||||
@@ -228,15 +228,6 @@ msgstr "Test varslingen"
|
||||
msgid " Resolving address"
|
||||
msgstr " Løs adresse"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEIL:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
@@ -668,7 +659,7 @@ msgstr ""
|
||||
"Autentisering mangler, angi brukernavn/passord fra Konfigurasjon->Generelt i "
|
||||
"ditt tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -746,6 +737,10 @@ msgstr "Feil parameter"
|
||||
msgid "Back"
|
||||
msgstr "Tilbake"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEIL:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1045,6 +1040,10 @@ msgstr "Harddisken er full"
|
||||
msgid "Verifying"
|
||||
msgstr "Verifiserer"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2727,6 +2726,12 @@ msgstr "SABnzbd Passord"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Kan velge autentiserings passord."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4355,6 +4360,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"Hvis SABnzbd skulle starte på nytt vil denne skjermen forsvinne automatisk!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Oppdateringsfrekvens"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"PO-Revision-Date: 2017-09-01 09:37+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-11 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-12 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -233,15 +233,6 @@ msgstr "Test melding"
|
||||
msgid " Resolving address"
|
||||
msgstr " Adres opzoeken"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FOUT:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "WAARSCHUWING:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Geen"
|
||||
@@ -690,7 +681,7 @@ msgstr ""
|
||||
"Autenticatie ontbreekt; vul gebruikersnaam en wachtwoord van 'Configuratie' "
|
||||
"=> 'Algemeen' in bij het externe programma:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -769,6 +760,10 @@ msgstr "Incorrecte parameter"
|
||||
msgid "Back"
|
||||
msgstr "Terug"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FOUT:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1037,7 +1032,7 @@ msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Fetching %s blocks..."
|
||||
msgstr "Ophalen van %s blokken..."
|
||||
msgstr "%s herstelblokken downloaden..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Fetching"
|
||||
@@ -1054,7 +1049,7 @@ msgstr "Repareren"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "[%s] Repaired in %s"
|
||||
msgstr "[%s] Reparatie in %s"
|
||||
msgstr "[%s] Gerepareerd in %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py
|
||||
@@ -1072,6 +1067,10 @@ msgstr "Schijf is vol"
|
||||
msgid "Verifying"
|
||||
msgstr "Verifiëren"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr "Controleren van extra bestanden"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -1815,7 +1814,7 @@ msgstr "Script uitvoeren..."
|
||||
|
||||
#: sabnzbd/skintext.py [PP status]
|
||||
msgid "Fetching extra blocks..."
|
||||
msgstr "Extra blokken ophalen..."
|
||||
msgstr "Extra herstelblokken downloaden..."
|
||||
|
||||
#: sabnzbd/skintext.py [PP status]
|
||||
msgid "Quick Check..."
|
||||
@@ -2772,6 +2771,15 @@ msgstr "Wachtwoord"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Wachtwoord voor web login."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
"Als de Host of Poort open is gesteld naar het internet zorgen de huidige "
|
||||
"instellingen ervoor dat de webinterface volledig beschikbaar is voor "
|
||||
"externen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr "Beveiliging"
|
||||
@@ -4449,6 +4457,10 @@ msgstr "Verbinding met SABnzbd verbroken"
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr "Wanneer SABnzbd opnieuw is gestart, gaat dit venster vanzelf weg!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "WAARSCHUWING:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Ververssnelheid"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2015-12-28 10:22+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -226,15 +226,6 @@ msgstr "Powiadomienie testowe"
|
||||
msgid " Resolving address"
|
||||
msgstr " Rozwiązywanie adresu"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "BŁĄD:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "UWAGA:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Brak"
|
||||
@@ -670,7 +661,7 @@ msgstr ""
|
||||
"Brak danych uwierzytelniających, wprowadź nazwę użytkownika/hasło z sekcji "
|
||||
"Konfiguracja->Ogólne do zewnętrznego programu:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -749,6 +740,10 @@ msgstr "Błędny parametr"
|
||||
msgid "Back"
|
||||
msgstr "Powrót"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "BŁĄD:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1050,6 +1045,10 @@ msgstr "Dysk pełny"
|
||||
msgid "Verifying"
|
||||
msgstr "Weryfikowanie"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2733,6 +2732,12 @@ msgstr "Hasło SABnzbd"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Opcjonalne hasło"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4373,6 +4378,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"W razie ponownego uruchomienia SABnzbd ten ekran zniknie automatycznie!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "UWAGA:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Częstotliwość odświeżania"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2016-01-01 22:58+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: 2017-09-03 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -226,15 +226,6 @@ msgstr "Notificação de teste"
|
||||
msgid " Resolving address"
|
||||
msgstr " Resolvendo endereço"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ERRO:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Nenhum"
|
||||
@@ -671,7 +662,7 @@ msgstr ""
|
||||
"Autenticação faltando. Por favor insira usuário/senha de Configuração->Geral "
|
||||
"em seu programa de terceiros:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -749,6 +740,10 @@ msgstr "Parâmetro incorreto"
|
||||
msgid "Back"
|
||||
msgstr "Voltar"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ERRO:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1047,6 +1042,10 @@ msgstr "Disco cheio"
|
||||
msgid "Verifying"
|
||||
msgstr "Verificando"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2733,6 +2732,12 @@ msgstr "Senha do SABnzbd"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Senha de autenticação opcional."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4371,6 +4376,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"No caso de reinício do SABnzbd, esta janela irá desaparecer automaticamente!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Taxa de atualização"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2016-07-29 16:20+0000\n"
|
||||
"Last-Translator: nicusor <Unknown>\n"
|
||||
"Language-Team: Romanian <ro@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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -229,15 +229,6 @@ msgstr "Notificări Test"
|
||||
msgid " Resolving address"
|
||||
msgstr " Reolvare adresă"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "EROARE:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ATENŢIE:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Niciunul"
|
||||
@@ -673,7 +664,7 @@ msgstr ""
|
||||
"Autentificare lipsă, vă rugăm să introduceţi numele de utilizator/parola de "
|
||||
"la Configurare->General în programul dumneavoastră terţ:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -752,6 +743,10 @@ msgstr "Parametru Incorect"
|
||||
msgid "Back"
|
||||
msgstr "Înapoi"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "EROARE:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1051,6 +1046,10 @@ msgstr "Disc plin"
|
||||
msgid "Verifying"
|
||||
msgstr "Se verifică"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2740,6 +2739,12 @@ msgstr "Parolă SABnzbd"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Parolă autentificare opţională"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4374,6 +4379,10 @@ msgstr "Am pierdut conexiunea cu SABnzbd.."
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr "În cazul repornirii SABnzbd acest ecran va dispărea în mod automat!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ATENŢIE:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Rată actualizare"
|
||||
|
||||
@@ -2,15 +2,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-0.7.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
|
||||
"Last-Translator: Pavel Maryanov <Unknown>\n"
|
||||
"Language-Team: Russian <gmu@mx.ru>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
@@ -221,15 +221,6 @@ msgstr "Тестовое уведомление"
|
||||
msgid " Resolving address"
|
||||
msgstr " Разрешение адреса"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ОШИБКА"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ПРЕДУПРЕЖДЕНИЕ"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Ничего"
|
||||
@@ -663,7 +654,7 @@ msgstr ""
|
||||
"Отсутствуют учётные данные. Введите в сторонней программе имя пользователя и "
|
||||
"пароль из раздела «Настройка -> Общие»:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -739,6 +730,10 @@ msgstr "Неправильный параметр"
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ОШИБКА"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1039,6 +1034,10 @@ msgstr ""
|
||||
msgid "Verifying"
|
||||
msgstr "Проверка"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2723,6 +2722,12 @@ msgstr "Пароль SABnzbd"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Необязательный пароль для входа."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4352,6 +4357,10 @@ msgstr ""
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ПРЕДУПРЕЖДЕНИЕ"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Частота обновления"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: ОZZII <ozzii.translate@gmail.com>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2015-12-28 10:25+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Serbian <sr@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: 2017-09-03 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -223,15 +223,6 @@ msgstr "Probno obaveštenje"
|
||||
msgid " Resolving address"
|
||||
msgstr " Решавање адресе"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ГРЕШКА:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ПАЖЊА:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Ниједно"
|
||||
@@ -663,7 +654,7 @@ msgstr ""
|
||||
"Недостаје аутентификација, унети у спољни програм име/лозинку из Подешавања-"
|
||||
">Опште:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -741,6 +732,10 @@ msgstr "Погрешан параметар"
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "ГРЕШКА:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1040,6 +1035,10 @@ msgstr "Диск је пун"
|
||||
msgid "Verifying"
|
||||
msgstr "Проверавање"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2715,6 +2714,12 @@ msgstr "Лозинка SABnzbd-а"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Лозинка за аутентификацију (опционо)"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4339,6 +4344,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr ""
|
||||
"U slučaju ponovnog pokretanja SABnzbd-a ovaj prozor će nestati automatski!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "ПАЖЊА:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Брзина освежавања"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2016-02-20 20:34+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: 2017-09-03 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -224,15 +224,6 @@ msgstr "Testa notifikation"
|
||||
msgid " Resolving address"
|
||||
msgstr " Lösa adress"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEL:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "VARNING:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
@@ -666,7 +657,7 @@ msgstr ""
|
||||
"Autentisering saknas, ange användarnamn / lösenord från Konfiguration-> "
|
||||
"Allmänt i ditt tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -745,6 +736,10 @@ msgstr "Fel parameter"
|
||||
msgid "Back"
|
||||
msgstr "Bakåt"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "FEL:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1045,6 +1040,10 @@ msgstr "Disken är full"
|
||||
msgid "Verifying"
|
||||
msgstr "Verifierar"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2728,6 +2727,12 @@ msgstr "SABnzbd Lösenord"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "Väljbart autentiserings lösenord."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
@@ -4353,6 +4358,10 @@ msgstr "Förlorade förbindelse till SABnzbd.."
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr "Om SABnzbd startar om kommer denna skärm att försvinna automatiskt!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "VARNING:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Uppdateringsfrekvens"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:06+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Chinese (Simplified) <zh_CN@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: 2017-09-03 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 18446)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -220,15 +220,6 @@ msgstr "测试通知"
|
||||
msgid " Resolving address"
|
||||
msgstr " 正在解析地址"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "错误:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "警告:"
|
||||
|
||||
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
|
||||
msgid "None"
|
||||
msgstr "无"
|
||||
@@ -653,7 +644,7 @@ msgid ""
|
||||
"into your 3rd party program:"
|
||||
msgstr "缺身份认证信息,请在第三方程序中输入“配置”->“常规”中的用户名/密码:"
|
||||
|
||||
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
|
||||
#: sabnzbd/interface.py [Warning message]
|
||||
msgid ""
|
||||
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
|
||||
"mobile devices. Go to Config -> General to change your skin."
|
||||
@@ -728,6 +719,10 @@ msgstr "参数不正确"
|
||||
msgid "Back"
|
||||
msgstr "返回"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/skintext.py
|
||||
msgid "ERROR:"
|
||||
msgstr "错误:"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
@@ -1025,6 +1020,10 @@ msgstr "磁盘空间已满"
|
||||
msgid "Verifying"
|
||||
msgstr "正在验证"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
msgid "Checking"
|
||||
@@ -2695,6 +2694,12 @@ msgstr "SABnzbd 密码"
|
||||
msgid "Optional authentication password."
|
||||
msgstr "可选身份验证密码。"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
msgstr "安全"
|
||||
@@ -4279,6 +4284,10 @@ msgstr "失去与 SABnzbd 的连接.."
|
||||
msgid "In case of SABnzbd restart this screen will disappear automatically!"
|
||||
msgstr "SABnzbd 重启后本画面将自动消失!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "WARNING:"
|
||||
msgstr "警告:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "刷新频率"
|
||||
|
||||
@@ -537,7 +537,7 @@ def guard_https_ver():
|
||||
set_https_verification(cfg.enable_https_verification())
|
||||
|
||||
|
||||
def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None, feed_name=None):
|
||||
def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None):
|
||||
""" Add NZB based on a URL, attributes optional """
|
||||
if 'http' not in url:
|
||||
return
|
||||
@@ -551,8 +551,8 @@ def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None, fe
|
||||
|
||||
# Add feed name if it came from RSS
|
||||
msg = T('Trying to fetch NZB from %s') % url
|
||||
if feed_name:
|
||||
msg = '%s - %s' % (feed_name, msg)
|
||||
if nzbname:
|
||||
msg = '%s - %s' % (nzbname, msg)
|
||||
|
||||
# Generate the placeholder
|
||||
future_nzo = NzbQueue.do.generate_future(msg, pp, script, cat, url=url, priority=priority, nzbname=nzbname)
|
||||
|
||||
@@ -1277,11 +1277,7 @@ def build_status(skip_dashboard=False, output=None):
|
||||
info['servers'].append((server.displayname, '', connected, serverconnections, server.ssl,
|
||||
server.active, server.errormsg, server.priority, server.optional))
|
||||
|
||||
wlist = []
|
||||
for w in sabnzbd.GUIHANDLER.content():
|
||||
w = w.replace('WARNING', T('WARNING:')).replace('ERROR', T('ERROR:'))
|
||||
wlist.insert(0, unicoder(w))
|
||||
info['warnings'] = wlist
|
||||
info['warnings'] = sabnzbd.GUIHANDLER.content()
|
||||
|
||||
return info
|
||||
|
||||
@@ -1342,7 +1338,6 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
|
||||
slot['size'] = format_bytes(bytes)
|
||||
slot['sizeleft'] = format_bytes(bytesleft)
|
||||
slot['percentage'] = "%s" % (int(((mb - mbleft) / mb) * 100)) if mb != mbleft else '0'
|
||||
slot['missing'] = pnfo.missing
|
||||
slot['mbmissing'] = "%.2f" % (pnfo.bytes_missing / MEBI)
|
||||
slot['direct_unpack'] = pnfo.direct_unpack
|
||||
if not output:
|
||||
@@ -1634,8 +1629,6 @@ def build_header(webdir='', output=None):
|
||||
|
||||
header['restart_req'] = sabnzbd.RESTART_REQ
|
||||
header['pid'] = os.getpid()
|
||||
|
||||
header['last_warning'] = sabnzbd.GUIHANDLER.last().replace('WARNING', ('WARNING:')).replace('ERROR', T('ERROR:'))
|
||||
header['active_lang'] = cfg.language()
|
||||
|
||||
header['my_lcldata'] = sabnzbd.DIR_LCLDATA
|
||||
|
||||
@@ -292,6 +292,9 @@ def check_encrypted_and_unwanted_files(nzo, filepath):
|
||||
|
||||
# Did any work?
|
||||
if password_hit:
|
||||
# We always trust the user's input
|
||||
if not nzo.password:
|
||||
nzo.password = password_hit
|
||||
# Don't check other files
|
||||
logging.info('Password "%s" matches for job "%s"', password_hit, nzo.final_name)
|
||||
nzo.encrypted = -1
|
||||
|
||||
@@ -253,7 +253,7 @@ keep_awake = OptionBool('misc', 'keep_awake', True)
|
||||
win_menu = OptionBool('misc', 'win_menu', True)
|
||||
allow_incomplete_nzb = OptionBool('misc', 'allow_incomplete_nzb', False)
|
||||
enable_bonjour = OptionBool('misc', 'enable_bonjour', True)
|
||||
reject_duplicate_files = OptionBool('misc', 'recject_duplicate_files', False)
|
||||
reject_duplicate_files = OptionBool('misc', 'reject_duplicate_files', False)
|
||||
max_art_opt = OptionBool('misc', 'max_art_opt', False)
|
||||
use_pickle = OptionBool('misc', 'use_pickle', False)
|
||||
ipv6_hosting = OptionBool('misc', 'ipv6_hosting', False)
|
||||
|
||||
@@ -27,7 +27,7 @@ REC_RAR_VERSION = 500
|
||||
|
||||
PNFO = namedtuple('PNFO', 'repair unpack delete script nzo_id filename password unpackstrht '
|
||||
'msgid category url bytes_left bytes avg_stamp avg_date finished_files '
|
||||
'active_files queued_files status priority missing bytes_missing direct_unpack')
|
||||
'active_files queued_files status priority bytes_missing direct_unpack')
|
||||
|
||||
QNFO = namedtuple('QNFO', 'bytes bytes_left bytes_left_previous_page list q_size_list q_fullsize')
|
||||
|
||||
@@ -51,7 +51,7 @@ RENAMES_FILE = '__renames__'
|
||||
ATTRIB_FILE = 'SABnzbd_attrib'
|
||||
REPAIR_REQUEST = 'repair-all.sab'
|
||||
|
||||
SABYENC_VERSION_REQUIRED = '3.0.2'
|
||||
SABYENC_VERSION_REQUIRED = '3.3.1'
|
||||
|
||||
DB_HISTORY_VERSION = 1
|
||||
DB_HISTORY_NAME = 'history%s.db' % DB_HISTORY_VERSION
|
||||
|
||||
@@ -126,7 +126,7 @@ class HistoryDB(object):
|
||||
else:
|
||||
self.c.execute(command)
|
||||
if save:
|
||||
self.save()
|
||||
self.con.commit()
|
||||
return True
|
||||
except:
|
||||
error = str(sys.exc_value)
|
||||
@@ -196,14 +196,6 @@ class HistoryDB(object):
|
||||
""")
|
||||
self.execute('PRAGMA user_version = 2;')
|
||||
|
||||
def save(self):
|
||||
""" Save database to disk """
|
||||
try:
|
||||
self.con.commit()
|
||||
except:
|
||||
logging.error(T('SQL Commit Failed, see log'))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
def close(self):
|
||||
""" Close database connection """
|
||||
try:
|
||||
@@ -243,11 +235,9 @@ class HistoryDB(object):
|
||||
jobs = [jobs]
|
||||
|
||||
for job in jobs:
|
||||
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,))
|
||||
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,), save=True)
|
||||
logging.info('Removing job %s from history', job)
|
||||
|
||||
self.save()
|
||||
|
||||
def auto_history_purge(self):
|
||||
""" Remove history items based on the configured history-retention """
|
||||
if sabnzbd.cfg.history_retention() == "0":
|
||||
@@ -275,11 +265,10 @@ class HistoryDB(object):
|
||||
""" Add a new job entry to the database """
|
||||
t = build_history_info(nzo, storage, path, postproc_time, script_output, script_line)
|
||||
|
||||
if self.execute("""INSERT INTO history (completed, name, nzb_name, category, pp, script, report,
|
||||
url, status, nzo_id, storage, path, script_log, script_line, download_time, postproc_time, stage_log,
|
||||
downloaded, completeness, fail_message, url_info, bytes, series, md5sum, password)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", t):
|
||||
self.save()
|
||||
self.execute("""INSERT INTO history (completed, name, nzb_name, category, pp, script, report,
|
||||
url, status, nzo_id, storage, path, script_log, script_line, download_time, postproc_time, stage_log,
|
||||
downloaded, completeness, fail_message, url_info, bytes, series, md5sum, password)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", t, save=True)
|
||||
logging.info('Added job %s to history', nzo.final_name)
|
||||
|
||||
def fetch_history(self, start=None, limit=None, search=None, failed_only=0, categories=None):
|
||||
@@ -504,15 +493,9 @@ def build_history_info(nzo, storage='', downpath='', postproc_time=0, script_out
|
||||
if seriesname and season and episode:
|
||||
series = u'%s/%s/%s' % (seriesname.lower(), season, episode)
|
||||
|
||||
# See whatever the first password was, for the Retry
|
||||
password = ''
|
||||
passwords = get_all_passwords(nzo)
|
||||
if passwords:
|
||||
password = passwords[0]
|
||||
|
||||
return (completed, name, nzb_name, category, pp, script, report, url, status, nzo_id, storage, path,
|
||||
script_log, script_line, download_time, postproc_time, stage_log, downloaded, completeness,
|
||||
fail_message, url_info, bytes, series, nzo.md5sum, password)
|
||||
fail_message, url_info, bytes, series, nzo.md5sum, nzo.password)
|
||||
|
||||
|
||||
def unpack_history_info(item):
|
||||
|
||||
@@ -144,7 +144,7 @@ class Decoder(Thread):
|
||||
register = False
|
||||
|
||||
except CrcError, e:
|
||||
logme = T('CRC Error in %s (%s -> %s)') % (art_id, e.needcrc, e.gotcrc)
|
||||
logme = T('CRC Error in %s') % art_id
|
||||
logging.info(logme)
|
||||
|
||||
data = e.data
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
##############################################################################
|
||||
from threading import RLock, Condition
|
||||
|
||||
DIR_LOCK = RLock()
|
||||
DOWNLOADER_CV = Condition(RLock())
|
||||
|
||||
def synchronized(lock):
|
||||
|
||||
@@ -30,7 +30,6 @@ import threading
|
||||
import sabnzbd
|
||||
from sabnzbd.constants import SCAN_FILE_NAME, VALID_ARCHIVES
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
from sabnzbd.decorators import synchronized, DIR_LOCK
|
||||
from sabnzbd.encoding import platform_encode
|
||||
from sabnzbd.newsunpack import is_sevenfile, SevenZip
|
||||
import sabnzbd.nzbstuff as nzbstuff
|
||||
@@ -341,7 +340,6 @@ class DirScanner(threading.Thread):
|
||||
|
||||
def scan(self):
|
||||
""" Do one scan of the watched folder """
|
||||
@synchronized(DIR_LOCK)
|
||||
def run_dir(folder, catdir):
|
||||
try:
|
||||
files = os.listdir(folder)
|
||||
|
||||
@@ -325,7 +325,7 @@ class MainPage(object):
|
||||
if not check_login():
|
||||
raise NeedLogin()
|
||||
|
||||
if not cfg.notified_new_skin() and cfg.web_dir() not in ('Glitter', 'Plush'):
|
||||
if not cfg.notified_new_skin() and cfg.web_dir() != 'Glitter':
|
||||
logging.warning(T('Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin.'))
|
||||
if not cfg.notified_new_skin():
|
||||
cfg.notified_new_skin.set(1)
|
||||
@@ -2076,7 +2076,7 @@ class ConfigRss(object):
|
||||
prio = att.get('prio')
|
||||
|
||||
if url:
|
||||
sabnzbd.add_url(url, pp, script, cat, prio, nzbname, feed_name=feed)
|
||||
sabnzbd.add_url(url, pp, script, cat, prio, nzbname)
|
||||
# Need to pass the title instead
|
||||
sabnzbd.rss.flag_downloaded(feed, url)
|
||||
raise rssRaiser(self.__root, kwargs)
|
||||
|
||||
@@ -29,13 +29,14 @@ import threading
|
||||
import subprocess
|
||||
import socket
|
||||
import time
|
||||
import calendar
|
||||
import datetime
|
||||
import fnmatch
|
||||
import stat
|
||||
from urlparse import urlparse
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.decorators import synchronized, DIR_LOCK
|
||||
from sabnzbd.decorators import synchronized
|
||||
from sabnzbd.constants import DEFAULT_PRIORITY, FUTURE_Q_FOLDER, JOB_ADMIN, \
|
||||
GIGI, MEBI, DEF_CACHE_LIMIT
|
||||
import sabnzbd.config as config
|
||||
@@ -864,6 +865,7 @@ def get_cache_limit():
|
||||
##############################################################################
|
||||
# Locked directory operations to avoid problems with simultaneous add/remove
|
||||
##############################################################################
|
||||
DIR_LOCK = threading.RLock()
|
||||
|
||||
@synchronized(DIR_LOCK)
|
||||
def get_unique_path(dirpath, n=0, create_dir=True):
|
||||
|
||||
@@ -1451,10 +1451,12 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
# Target files
|
||||
m = TARGET_RE.match(line)
|
||||
if m:
|
||||
nzo.status = Status.VERIFYING
|
||||
verifynum += 1
|
||||
if verifytotal == 0 or verifynum < verifytotal:
|
||||
verifynum += 1
|
||||
nzo.set_action_line(T('Verifying'), '%02d/%02d' % (verifynum, verifytotal))
|
||||
nzo.status = Status.VERIFYING
|
||||
else:
|
||||
nzo.set_action_line(T('Checking extra files'), '%02d' % verifynum)
|
||||
|
||||
# Remove redundant extra files that are just duplicates of original ones
|
||||
if 'duplicate data blocks' in line:
|
||||
@@ -1696,9 +1698,9 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
# It prints the filename couple of times, so we save it to check
|
||||
# 'datafiles' will not contain all data-files in par-set, only the
|
||||
# ones that got scanned, but it's ouput is never used!
|
||||
nzo.status = Status.VERIFYING
|
||||
if line.split()[1] in ('Damaged', 'Found'):
|
||||
verifynum += 1
|
||||
nzo.status = Status.VERIFYING
|
||||
datafiles.append(TRANS(m.group(1)))
|
||||
|
||||
# Set old_name in case it was misnamed and found (not when we are joining)
|
||||
@@ -1725,6 +1727,13 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
# Need to reset it to avoid collision
|
||||
old_name = None
|
||||
|
||||
else:
|
||||
# It's scanning extra files that don't belong to the set
|
||||
# For damaged files it reports the filename twice, so only then start
|
||||
verifynum += 1
|
||||
if verifynum / 2 > verifytotal:
|
||||
nzo.set_action_line(T('Checking extra files'), '%02d' % verifynum)
|
||||
|
||||
if joinables:
|
||||
# Find out if a joinable file has been used for joining
|
||||
uline = unicoder(line)
|
||||
@@ -1754,9 +1763,15 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
nzo.status = Status.FAILED
|
||||
|
||||
# MultiPar can say 'PAR File(s) Incomplete' also when it needs more blocks
|
||||
# But the Need-more-blocks message is always last, so force failure
|
||||
finished = 0
|
||||
|
||||
# Result of verification
|
||||
elif line.startswith('All Files Complete'):
|
||||
elif line.startswith('All Files Complete') or line.endswith('PAR File(s) Incomplete'):
|
||||
# Completed without damage!
|
||||
# 'PAR File(s) Incomplete' is reported for success
|
||||
# but when there are very similar filenames in the folder
|
||||
msg = T('[%s] Verified in %s, all files correct') % (unicoder(setname), format_time_string(time.time() - start))
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
logging.info('Verified in %s, all files correct',
|
||||
|
||||
@@ -27,7 +27,7 @@ import datetime
|
||||
import sabnzbd
|
||||
from sabnzbd.nzbstuff import NzbObject
|
||||
from sabnzbd.misc import exit_sab, cat_to_opts, \
|
||||
get_admin_path, remove_all, globber_full
|
||||
get_admin_path, remove_all, globber_full, int_conv
|
||||
from sabnzbd.panic import panic_queue
|
||||
import sabnzbd.database as database
|
||||
from sabnzbd.decorators import notify_downloader
|
||||
@@ -620,7 +620,7 @@ class NzbQueue(object):
|
||||
def __set_priority(self, nzo_id, priority):
|
||||
""" Sets the priority on the nzo and places it in the queue at the appropriate position """
|
||||
try:
|
||||
priority = int(priority)
|
||||
priority = int_conv(priority)
|
||||
nzo = self.__nzo_table[nzo_id]
|
||||
nzo_id_pos1 = -1
|
||||
pos = -1
|
||||
@@ -640,7 +640,7 @@ class NzbQueue(object):
|
||||
if priority == self.__nzo_list[nzo_id_pos1].priority:
|
||||
return nzo_id_pos1
|
||||
|
||||
nzo.priority = priority
|
||||
nzo.set_priority(priority)
|
||||
if sabnzbd.scheduler.analyse(False, priority) and \
|
||||
nzo.status in (Status.CHECKING, Status.DOWNLOADING, Status.QUEUED):
|
||||
nzo.status = Status.PAUSED
|
||||
@@ -817,8 +817,8 @@ class NzbQueue(object):
|
||||
n = 0
|
||||
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.status not in (Status.PAUSED, Status.CHECKING):
|
||||
b_left = nzo.remaining()
|
||||
if nzo.status not in (Status.PAUSED, Status.CHECKING) or nzo.priority == TOP_PRIORITY:
|
||||
b_left = nzo.remaining
|
||||
bytes_total += nzo.bytes
|
||||
bytes_left += b_left
|
||||
q_size += 1
|
||||
@@ -840,7 +840,7 @@ class NzbQueue(object):
|
||||
bytes_left = 0
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.status != 'Paused':
|
||||
bytes_left += nzo.remaining()
|
||||
bytes_left += nzo.remaining
|
||||
return bytes_left
|
||||
|
||||
def is_empty(self):
|
||||
@@ -864,6 +864,17 @@ class NzbQueue(object):
|
||||
if not nzo.futuretype and not nzo.files and nzo.status not in (Status.PAUSED, Status.GRABBING):
|
||||
empty.append(nzo)
|
||||
|
||||
# Stall prevention by checking if all servers are in the trylist
|
||||
# This is a CPU-cheaper alternative to prevent stalling
|
||||
if len(nzo.try_list) == sabnzbd.downloader.Downloader.do.server_nr:
|
||||
# Maybe the NZF's need a reset too?
|
||||
for nzf in nzo.files:
|
||||
if len(nzf.try_list) == sabnzbd.downloader.Downloader.do.server_nr:
|
||||
# We do not want to reset all article trylists, they are good
|
||||
nzf.reset_try_list()
|
||||
# Reset main trylist, minimal performance impact
|
||||
nzo.reset_try_list()
|
||||
|
||||
for nzo in empty:
|
||||
self.end_job(nzo)
|
||||
|
||||
|
||||
@@ -40,15 +40,15 @@ except ImportError:
|
||||
# SABnzbd modules
|
||||
import sabnzbd
|
||||
from sabnzbd.constants import GIGI, ATTRIB_FILE, JOB_ADMIN, \
|
||||
DEFAULT_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY, \
|
||||
PAUSED_PRIORITY, TOP_PRIORITY, DUP_PRIORITY, REPAIR_PRIORITY, \
|
||||
REPAIR_PRIORITY, TOP_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, \
|
||||
LOW_PRIORITY, DEFAULT_PRIORITY, PAUSED_PRIORITY, DUP_PRIORITY, STOP_PRIORITY, \
|
||||
RENAMES_FILE, MAX_BAD_ARTICLES, Status, PNFO
|
||||
from sabnzbd.misc import to_units, cat_to_opts, cat_convert, sanitize_foldername, \
|
||||
get_unique_path, get_admin_path, remove_all, sanitize_filename, globber_full, \
|
||||
int_conv, set_permissions, format_time_string, long_path, trim_win_path, \
|
||||
fix_unix_encoding, calc_age, is_obfuscated_filename, get_ext, get_filename, \
|
||||
get_unique_filename, renamer
|
||||
from sabnzbd.decorators import synchronized, DIR_LOCK
|
||||
from sabnzbd.decorators import synchronized
|
||||
import sabnzbd.config as config
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.encoding import unicoder, platform_encode
|
||||
@@ -300,17 +300,7 @@ class NzbFile(TryList):
|
||||
self.articles.remove(article)
|
||||
if found:
|
||||
self.bytes_left -= article.bytes
|
||||
# To keep counter correct for pre-check
|
||||
if self.nzo.precheck:
|
||||
self.nzo.bytes_downloaded += article.bytes
|
||||
|
||||
# The parent trylist is filled to the top, maybe too soon
|
||||
# This is a CPU-cheaper alternative to prevent stalling
|
||||
if len(self.nzo.try_list) == sabnzbd.downloader.Downloader.do.server_nr:
|
||||
self.reset_try_list()
|
||||
self.nzo.reset_try_list()
|
||||
|
||||
self.nzo.bytes_tried += article.bytes
|
||||
return (not self.articles)
|
||||
|
||||
def set_par2(self, setname, vol, blocks):
|
||||
@@ -566,9 +556,9 @@ class NzbParser(xml.sax.handler.ContentHandler):
|
||||
##############################################################################
|
||||
NzbObjectSaver = (
|
||||
'filename', 'work_name', 'final_name', 'created', 'bytes', 'bytes_downloaded', 'bytes_tried',
|
||||
'repair', 'unpack', 'delete', 'script', 'cat', 'url', 'groups', 'avg_date', 'md5of16k',
|
||||
'partable', 'extrapars', 'md5packs', 'files', 'files_table', 'finished_files', 'status',
|
||||
'avg_bps_freq', 'avg_bps_total', 'priority', 'saved_articles', 'nzo_id',
|
||||
'bytes_missing', 'repair', 'unpack', 'delete', 'script', 'cat', 'url', 'groups', 'avg_date',
|
||||
'md5of16k', 'partable', 'extrapars', 'md5packs', 'files', 'files_table', 'finished_files',
|
||||
'status', 'avg_bps_freq', 'avg_bps_total', 'priority', 'saved_articles', 'nzo_id',
|
||||
'futuretype', 'deleted', 'parsed', 'action_line', 'unpack_info', 'fail_msg', 'nzo_info',
|
||||
'custom_name', 'password', 'next_save', 'save_timeout', 'encrypted', 'bad_articles',
|
||||
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta',
|
||||
@@ -581,7 +571,7 @@ NZO_LOCK = threading.RLock()
|
||||
|
||||
class NzbObject(TryList):
|
||||
|
||||
@synchronized(DIR_LOCK)
|
||||
@synchronized(NZO_LOCK)
|
||||
def __init__(self, filename, pp, script, nzb=None,
|
||||
futuretype=False, cat=None, url=None,
|
||||
priority=NORMAL_PRIORITY, nzbname=None, status="Queued", nzo_info=None,
|
||||
@@ -626,7 +616,9 @@ class NzbObject(TryList):
|
||||
self.bytes = 0 # Original bytesize
|
||||
self.bytes_downloaded = 0 # Downloaded byte
|
||||
self.bytes_tried = 0 # Which bytes did we try
|
||||
self.bytes_missing = 0 # Bytes missing
|
||||
self.bad_articles = 0 # How many bad (non-recoverable) articles
|
||||
self.set_priority(priority) # Parse priority
|
||||
self.repair = r # True if we want to repair this set
|
||||
self.unpack = u # True if we want to unpack this set
|
||||
self.delete = d # True if we want to delete this set
|
||||
@@ -656,11 +648,6 @@ class NzbObject(TryList):
|
||||
self.status = status
|
||||
self.avg_bps_freq = 0
|
||||
self.avg_bps_total = 0
|
||||
try:
|
||||
priority = int(priority)
|
||||
except:
|
||||
priority = DEFAULT_PRIORITY
|
||||
self.priority = priority
|
||||
|
||||
self.saved_articles = []
|
||||
|
||||
@@ -815,7 +802,8 @@ class NzbObject(TryList):
|
||||
self.password = unicoder(password, True)
|
||||
|
||||
# Determine category and find pp/script values
|
||||
self.cat, pp_tmp, self.script, self.priority = cat_to_opts(cat, pp, script, priority)
|
||||
self.cat, pp_tmp, self.script, priority = cat_to_opts(cat, pp, script, priority)
|
||||
self.set_priority(priority)
|
||||
self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp_tmp)
|
||||
|
||||
# Run user pre-queue script if needed
|
||||
@@ -828,10 +816,6 @@ class NzbObject(TryList):
|
||||
pp = int(pp)
|
||||
except:
|
||||
pp = None
|
||||
try:
|
||||
priority = int(priority)
|
||||
except:
|
||||
priority = None
|
||||
if accept < 1:
|
||||
self.purge_data()
|
||||
raise TypeError
|
||||
@@ -843,7 +827,8 @@ class NzbObject(TryList):
|
||||
self.fail_msg = T('Pre-queue script marked job as failed')
|
||||
|
||||
# Re-evaluate results from pre-queue script
|
||||
self.cat, pp, self.script, self.priority = cat_to_opts(cat, pp, script, priority)
|
||||
self.cat, pp, self.script, priority = cat_to_opts(cat, pp, script, int_conv(priority))
|
||||
self.set_priority(priority)
|
||||
self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp)
|
||||
else:
|
||||
accept = 1
|
||||
@@ -953,7 +938,6 @@ class NzbObject(TryList):
|
||||
self.servercount[serverid] += bytes
|
||||
else:
|
||||
self.servercount[serverid] = bytes
|
||||
self.bytes_downloaded += bytes
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def remove_nzf(self, nzf):
|
||||
@@ -990,10 +974,13 @@ class NzbObject(TryList):
|
||||
# Don't postpone header-only-files, to extract all possible md5of16k
|
||||
if setname and block and matcher(lparset, setname.lower()):
|
||||
xnzf.set_par2(parset, vol, block)
|
||||
# Don't postpone if all par2 are desired and should be kept
|
||||
if not(cfg.enable_all_par() and not cfg.enable_par_cleanup()):
|
||||
# Don't postpone if all par2 are desired and should be kept or not repairing
|
||||
if self.repair and not(cfg.enable_all_par() and not cfg.enable_par_cleanup()):
|
||||
self.extrapars[parset].append(xnzf)
|
||||
self.files.remove(xnzf)
|
||||
# Already count these bytes as done
|
||||
self.bytes_tried += xnzf.bytes_left
|
||||
|
||||
# Sort the sets
|
||||
for setname in self.extrapars:
|
||||
self.extrapars[parset].sort(key=lambda x: x.blocks)
|
||||
@@ -1017,8 +1004,7 @@ class NzbObject(TryList):
|
||||
logging.debug('Got md5pack for set %s', nzf.setname)
|
||||
self.md5packs[setname] = pack
|
||||
# See if we need to postpone some pars
|
||||
if self.repair:
|
||||
self.postpone_pars(nzf, setname)
|
||||
self.postpone_pars(nzf, setname)
|
||||
else:
|
||||
# Need to add this to the set, first need setname
|
||||
for setname in self.md5packs:
|
||||
@@ -1028,6 +1014,10 @@ class NzbObject(TryList):
|
||||
# Change the properties
|
||||
nzf.set_par2(setname, vol, block)
|
||||
logging.debug('Got additional md5pack for set %s', nzf.setname)
|
||||
|
||||
# Make sure it exists, could be removed by newsunpack
|
||||
if setname not in self.extrapars:
|
||||
self.extrapars[setname] = []
|
||||
self.extrapars[setname].append(nzf)
|
||||
|
||||
elif self.repair:
|
||||
@@ -1129,6 +1119,14 @@ class NzbObject(TryList):
|
||||
if self.bad_articles > MAX_BAD_ARTICLES:
|
||||
self.abort_direct_unpacker()
|
||||
|
||||
# Increase missing bytes counter
|
||||
self.bytes_missing += article.bytes
|
||||
else:
|
||||
# Increase counter of actually finished bytes
|
||||
self.bytes_downloaded += article.bytes
|
||||
# All the bytes that were tried
|
||||
self.bytes_tried += article.bytes
|
||||
|
||||
post_done = False
|
||||
if not self.files:
|
||||
post_done = True
|
||||
@@ -1162,43 +1160,54 @@ class NzbObject(TryList):
|
||||
# Looking for the longest name first, minimizes the chance on a mismatch
|
||||
files.sort(lambda x, y: len(y) - len(x))
|
||||
|
||||
nzfs = self.files[:]
|
||||
# The NZFs should be tried shortest first, to improve the chance on a proper match
|
||||
nzfs = self.files[:]
|
||||
nzfs.sort(lambda x, y: len(x.subject) - len(y.subject))
|
||||
|
||||
# Flag files from NZB that already exist as finished
|
||||
for filename in files[:]:
|
||||
for nzf in nzfs:
|
||||
subject = sanitize_filename(name_extractor(nzf.subject))
|
||||
filepath = os.path.join(wdir, filename)
|
||||
if (nzf.filename == filename) or (subject == filename) or (filename in subject):
|
||||
nzf.filename = filename
|
||||
nzf.bytes_left = 0
|
||||
if sabnzbd.par2file.is_parfile(filepath):
|
||||
self.handle_par2(nzf, os.path.join(wdir, filename))
|
||||
self.remove_nzf(nzf)
|
||||
nzfs.remove(nzf)
|
||||
files.remove(filename)
|
||||
|
||||
# Set bytes correctly
|
||||
self.bytes_tried += nzf.bytes
|
||||
self.bytes_downloaded += nzf.bytes
|
||||
|
||||
# Process par2 files
|
||||
filepath = os.path.join(wdir, filename)
|
||||
if sabnzbd.par2file.is_parfile(filepath):
|
||||
self.handle_par2(nzf, filepath)
|
||||
break
|
||||
|
||||
# Create an NZF for each remaining existing file
|
||||
try:
|
||||
# Create an NZF for each remaining existing file
|
||||
for filename in files:
|
||||
tup = os.stat(os.path.join(wdir, filename))
|
||||
tm = datetime.datetime.fromtimestamp(tup.st_mtime)
|
||||
nzf = NzbFile(tm, '"%s"' % filename, [], tup.st_size, self)
|
||||
self.files.append(nzf)
|
||||
self.files_table[nzf.nzf_id] = nzf
|
||||
self.bytes += nzf.bytes
|
||||
nzf.filename = filename
|
||||
nzf.bytes_left = 0
|
||||
# Create NZB's using basic information
|
||||
filepath = os.path.join(wdir, filename)
|
||||
if sabnzbd.par2file.is_parfile(filepath):
|
||||
self.handle_par2(nzf, filepath)
|
||||
self.remove_nzf(nzf)
|
||||
logging.info('File %s added to job', filename)
|
||||
if os.path.exists(filepath):
|
||||
tup = os.stat(filepath)
|
||||
tm = datetime.datetime.fromtimestamp(tup.st_mtime)
|
||||
nzf = NzbFile(tm, filename, [], tup.st_size, self)
|
||||
self.files.append(nzf)
|
||||
self.files_table[nzf.nzf_id] = nzf
|
||||
nzf.filename = filename
|
||||
self.remove_nzf(nzf)
|
||||
|
||||
# Set bytes correctly
|
||||
self.bytes += nzf.bytes
|
||||
self.bytes_tried += nzf.bytes
|
||||
self.bytes_downloaded += nzf.bytes
|
||||
|
||||
# Process par2 files
|
||||
if sabnzbd.par2file.is_parfile(filepath):
|
||||
self.handle_par2(nzf, filepath)
|
||||
logging.info('Existing file %s added to job', filename)
|
||||
except:
|
||||
logging.debug('Bad NZB handling')
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -1216,7 +1225,13 @@ class NzbObject(TryList):
|
||||
# Abort unpacking if not desired anymore
|
||||
if not self.unpack:
|
||||
self.abort_direct_unpacker()
|
||||
self.save_to_disk()
|
||||
|
||||
def set_priority(self, value):
|
||||
""" Check if this is a valid priority """
|
||||
value = int_conv(value)
|
||||
if value in (REPAIR_PRIORITY, TOP_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, \
|
||||
LOW_PRIORITY, DEFAULT_PRIORITY, PAUSED_PRIORITY, DUP_PRIORITY, STOP_PRIORITY):
|
||||
self.priority = value
|
||||
|
||||
@property
|
||||
def final_name_labeled(self):
|
||||
@@ -1288,10 +1303,12 @@ class NzbObject(TryList):
|
||||
def add_parfile(self, parfile):
|
||||
""" Add parfile to the files to be downloaded
|
||||
Resets trylist just to be sure
|
||||
Adjust download-size accordingly
|
||||
"""
|
||||
if not parfile.completed and parfile not in self.files and parfile not in self.finished_files:
|
||||
parfile.reset_all_try_lists()
|
||||
self.files.append(parfile)
|
||||
self.bytes_tried -= parfile.bytes_left
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def remove_parset(self, setname):
|
||||
@@ -1444,6 +1461,7 @@ class NzbObject(TryList):
|
||||
if not nzf.import_finished and not self.is_gone():
|
||||
logging.error(T('Error importing %s'), nzf)
|
||||
nzf_remove_list.append(nzf)
|
||||
nzf.nzo.pause()
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
@@ -1613,6 +1631,11 @@ class NzbObject(TryList):
|
||||
else:
|
||||
return None
|
||||
|
||||
@property
|
||||
def remaining(self):
|
||||
""" Return remaining bytes """
|
||||
return self.bytes - self.bytes_tried
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def purge_data(self, keep_basic=False, del_files=False):
|
||||
""" Remove all admin info, 'keep_basic' preserves attribs and nzb """
|
||||
@@ -1643,36 +1666,22 @@ class NzbObject(TryList):
|
||||
except:
|
||||
pass
|
||||
|
||||
def remaining(self):
|
||||
""" Return remaining bytes """
|
||||
bytes_par2 = 0
|
||||
for _set in self.extrapars:
|
||||
for nzf in self.extrapars[_set]:
|
||||
bytes_par2 += nzf.bytes_left
|
||||
# Subtract PAR2 sets and already downloaded bytes
|
||||
bytes_left = self.bytes - self.bytes_tried - bytes_par2
|
||||
return bytes_left
|
||||
|
||||
def gather_info(self, full=False):
|
||||
queued_files = []
|
||||
if full:
|
||||
for _set in self.extrapars:
|
||||
for nzf in self.extrapars[_set]:
|
||||
# Don't show files twice
|
||||
if not nzf.completed and nzf not in self.files:
|
||||
queued_files.append(nzf)
|
||||
# extrapars can change during iteration
|
||||
with NZO_LOCK:
|
||||
for _set in self.extrapars:
|
||||
for nzf in self.extrapars[_set]:
|
||||
# Don't show files twice
|
||||
if not nzf.completed and nzf not in self.files:
|
||||
queued_files.append(nzf)
|
||||
|
||||
return PNFO(self.repair, self.unpack, self.delete, self.script,
|
||||
self.nzo_id, self.final_name_labeled, self.password, {},
|
||||
'', self.cat, self.url,
|
||||
self.remaining(), self.bytes, self.avg_stamp, self.avg_date,
|
||||
self.finished_files if full else [],
|
||||
self.files if full else [],
|
||||
queued_files,
|
||||
self.status, self.priority,
|
||||
self.nzo_info.get('missing_articles', 0),
|
||||
self.bytes_tried - self.bytes_downloaded,
|
||||
self.direct_unpacker.get_formatted_stats() if self.direct_unpacker else 0)
|
||||
return PNFO(self.repair, self.unpack, self.delete, self.script, self.nzo_id,
|
||||
self.final_name_labeled, self.password, {}, '', self.cat, self.url, self.remaining,
|
||||
self.bytes, self.avg_stamp, self.avg_date, self.finished_files if full else [],
|
||||
self.files if full else [], queued_files, self.status, self.priority,
|
||||
self.bytes_missing, self.direct_unpacker.get_formatted_stats() if self.direct_unpacker else 0)
|
||||
|
||||
def get_nzf_by_id(self, nzf_id):
|
||||
if nzf_id in self.files_table:
|
||||
@@ -1808,6 +1817,8 @@ class NzbObject(TryList):
|
||||
self.renames = {}
|
||||
if self.bad_articles is None:
|
||||
self.bad_articles = 0
|
||||
if self.bytes_missing is None:
|
||||
self.bytes_missing = 0
|
||||
if self.bytes_tried is None:
|
||||
# Fill with old info
|
||||
self.bytes_tried = 0
|
||||
|
||||
@@ -180,6 +180,10 @@ class RSSQueue(object):
|
||||
logging.warning(T('Cannot read %s'), RSS_FILE_NAME)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
# Storage needs to be dict
|
||||
if not self.jobs:
|
||||
self.jobs = {}
|
||||
|
||||
# jobs is a NAME-indexed dictionary
|
||||
# Each element is link-indexed dictionary
|
||||
# Each element is another dictionary:
|
||||
@@ -618,7 +622,7 @@ def _HandleLink(jobs, feed, link, title, size, age, season, episode, flag, orgca
|
||||
jobs[link]['status'] = 'D'
|
||||
jobs[link]['time_downloaded'] = time.localtime()
|
||||
logging.info("Adding %s (%s) to queue", link, title)
|
||||
sabnzbd.add_url(link, pp=pp, script=script, cat=cat, priority=priority, nzbname=nzbname, feed_name=feed)
|
||||
sabnzbd.add_url(link, pp=pp, script=script, cat=cat, priority=priority, nzbname=nzbname)
|
||||
else:
|
||||
if star:
|
||||
jobs[link]['status'] = flag + '*'
|
||||
|
||||
@@ -189,7 +189,6 @@ SKIN_TEXT = {
|
||||
'ft-newRelease@1' : TT('New release %s available at'), # Used in Footer
|
||||
|
||||
# Main page
|
||||
'useGlitter': TT('Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin.'),
|
||||
'shutdownOK?' : TT('Are you sure you want to shutdown SABnzbd?'),
|
||||
'link-shutdown' : TT('Shutdown'), #: Shutdown SABnzbd
|
||||
'link-pause' : TT('Pause'), #: Pause downloading
|
||||
@@ -343,6 +342,7 @@ SKIN_TEXT = {
|
||||
'explain-web_username' : TT('Optional authentication username.'),
|
||||
'opt-web_password' : TT('SABnzbd Password'),
|
||||
'explain-web_password' : TT('Optional authentication password.'),
|
||||
'checkSafety' : TT('If the SABnzbd Host or Port is exposed to the internet, your current settings allow full external access to the SABnzbd interface.'),
|
||||
'security' : TT('Security'),
|
||||
'opt-enable_https' : TT('Enable HTTPS'),
|
||||
'opt-notInstalled' : TT('not installed'),
|
||||
@@ -804,6 +804,7 @@ SKIN_TEXT = {
|
||||
'Glitter-filtered' : TT('FILTERED'),
|
||||
'Glitter-waitSec' : TT('WAIT %s sec'),
|
||||
'Glitter-error' : TT('ERROR:'),
|
||||
'Glitter-fetch' : TT('Fetch'),
|
||||
'Glitter-interfaceOptions' : TT('Web Interface'),
|
||||
'Glitter-interfaceRefresh' : TT('Refresh rate'),
|
||||
'Glitter-useGlobalOptions' : TT('Use global interface settings'),
|
||||
|
||||
@@ -83,6 +83,7 @@ class URLGrabber(Thread):
|
||||
# Re-queue when too early and still active
|
||||
if future_nzo.wait and future_nzo.wait > time.time():
|
||||
self.add(url, future_nzo)
|
||||
time.sleep(1.0)
|
||||
continue
|
||||
# Paused
|
||||
if future_nzo.status == Status.PAUSED:
|
||||
@@ -171,7 +172,6 @@ class URLGrabber(Thread):
|
||||
elif item == 'x-dnzb-password':
|
||||
nzo_info['password'] = value
|
||||
elif item == 'retry-after':
|
||||
# For NZBFinder
|
||||
wait = misc.int_conv(value)
|
||||
|
||||
# Rating fields
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
## issue: https://bugs.python.org/issue19264
|
||||
import os
|
||||
import time
|
||||
import ctypes
|
||||
import subprocess
|
||||
import _subprocess
|
||||
@@ -15,6 +16,13 @@ from ctypes.wintypes import BYTE, WORD, LPWSTR, BOOL, DWORD, LPVOID, \
|
||||
HANDLE
|
||||
|
||||
|
||||
##
|
||||
## Special counter because this function cannot
|
||||
## be called within 1 second from each other!
|
||||
##
|
||||
_NEXT_PROCESS_START = 0.0
|
||||
|
||||
|
||||
##
|
||||
## Types
|
||||
##
|
||||
@@ -86,6 +94,16 @@ def CreateProcess(executable, args, _p_attr, _t_attr,
|
||||
Python implementation of CreateProcess using CreateProcessW for Win32
|
||||
|
||||
"""
|
||||
# Do we need to delay?
|
||||
global _NEXT_PROCESS_START
|
||||
diff_start = _NEXT_PROCESS_START - time.time()
|
||||
if(diff_start > 0.0):
|
||||
# Wait ourselves and make sure others also wait
|
||||
_NEXT_PROCESS_START += 1.0
|
||||
time.sleep(diff_start)
|
||||
else:
|
||||
_NEXT_PROCESS_START = time.time() + 1.0
|
||||
|
||||
si = STARTUPINFOW(
|
||||
dwFlags=startup_info.dwFlags,
|
||||
wShowWindow=startup_info.wShowWindow,
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
|
||||
# You MUST use double quotes (so " and not ')
|
||||
|
||||
__version__ = "2.3.0-develop"
|
||||
__baseline__ = "unknown"
|
||||
__version__ = "2.3.0"
|
||||
__baseline__ = "ba7d906beaff948ba7870903f3dbaa1dd31e2e80"
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
@echo off
|
||||
rem Example of a post processing script for SABnzbd
|
||||
|
||||
echo.
|
||||
echo Running in directory "%~d0%~p0"
|
||||
echo.
|
||||
echo The first parameter (result-dir) = %1
|
||||
echo The second parameter (nzb-name) = %2
|
||||
echo The third parameter (nice name) = %3
|
||||
echo The fourth parameter (newzbin #) = %4
|
||||
echo The fifth parameter (category) = %5
|
||||
echo The sixth parameter (group) = %6
|
||||
echo The seventh parameter (status) = %7
|
||||
echo The eight parameter (failure_url)= %8
|
||||
echo.
|
||||
@echo off
|
||||
rem Example of a post processing script for SABnzbd
|
||||
|
||||
echo.
|
||||
echo Running in directory "%~d0%~p0"
|
||||
echo.
|
||||
echo The first parameter (result-dir) = %1
|
||||
echo The second parameter (nzb-name) = %2
|
||||
echo The third parameter (nice name) = %3
|
||||
echo The fourth parameter (newzbin #) = %4
|
||||
echo The fifth parameter (category) = %5
|
||||
echo The sixth parameter (group) = %6
|
||||
echo The seventh parameter (status) = %7
|
||||
echo The eight parameter (failure_url)= %8
|
||||
echo.
|
||||
|
||||
71
tests/conftest.py
Normal file
71
tests/conftest.py
Normal file
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/python -OO
|
||||
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
"""
|
||||
tests.conftest - Wrappers to start SABnzbd for testing
|
||||
"""
|
||||
|
||||
import os
|
||||
import itertools
|
||||
import urllib2
|
||||
import pytest
|
||||
import shutil
|
||||
import time
|
||||
import testhelper
|
||||
|
||||
from xprocess import ProcessStarter
|
||||
|
||||
@pytest.fixture(scope='session')
|
||||
def sabnzbd_connect(request, xprocess):
|
||||
# Get cache directory
|
||||
base_path = os.path.dirname(os.path.abspath(__file__))
|
||||
cache_dir = os.path.join(base_path, 'cache')
|
||||
|
||||
# Copy basic config file
|
||||
try:
|
||||
os.mkdir(cache_dir)
|
||||
shutil.copyfile(os.path.join(base_path, 'sabnzbd.basic.ini'), os.path.join(cache_dir, 'sabnzbd.ini'))
|
||||
except:
|
||||
pass
|
||||
|
||||
class Starter(ProcessStarter):
|
||||
# Wait for SABnzbd to start
|
||||
pattern = "ENGINE Bus STARTED"
|
||||
|
||||
# Start without browser and with basic logging
|
||||
args = 'python ../../SABnzbd.py -l1 -s %s:%s -b0 -f %s' % (testhelper.SAB_HOST, testhelper.SAB_PORT, cache_dir)
|
||||
args = args.split()
|
||||
|
||||
# We have to wait a bit longer than default
|
||||
def filter_lines(self, lines):
|
||||
return itertools.islice(lines, 500)
|
||||
|
||||
# Shut it down at the end
|
||||
def shutdown_sabnzbd():
|
||||
# Gracefull shutdown request
|
||||
testhelper.get_url_result('shutdown')
|
||||
# Takes a second to shutdown
|
||||
for x in range(5):
|
||||
try:
|
||||
shutil.rmtree(cache_dir)
|
||||
break
|
||||
except:
|
||||
time.sleep(1)
|
||||
request.addfinalizer(shutdown_sabnzbd)
|
||||
|
||||
return xprocess.ensure("sabnzbd", Starter)
|
||||
|
||||
20
tests/data/reftestnzb.nzb
Normal file
20
tests/data/reftestnzb.nzb
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1" ?>
|
||||
<!DOCTYPE nzb PUBLIC "-//newzBin//DTD NZB 1.0//EN" "http://www.newzbin.com/DTD/nzb/nzb-1.0.dtd">
|
||||
<nzb xmlns="http://www.newzbin.com/DTD/2003/nzb">
|
||||
<file poster="nzbtester5@gmail.com" date="1495557432" subject="RefTestNZB: rar5 8288192_RAR5_FILE.rar ff2f7ca6 - "8288192_RAR5_FILE.rar" yEnc (1/11)">
|
||||
<groups><group>alt.binaries.boneless</group></groups>
|
||||
<segments>
|
||||
<segment bytes="350593" number="1">YyZUA.55279$4Z1.8096@fx31.am4</segment>
|
||||
<segment bytes="350823" number="2">ZyZUA.55280$4Z1.25561@fx31.am4</segment>
|
||||
<segment bytes="350639" number="3">ZyZUA.55281$4Z1.11063@fx31.am4</segment>
|
||||
<segment bytes="350732" number="4">_yZUA.55282$4Z1.16876@fx31.am4</segment>
|
||||
<segment bytes="350700" number="5">_yZUA.55283$4Z1.13779@fx31.am4</segment>
|
||||
<segment bytes="350608" number="6">%yZUA.55284$4Z1.46223@fx31.am4</segment>
|
||||
<segment bytes="350828" number="7">0zZUA.55285$4Z1.6649@fx31.am4</segment>
|
||||
<segment bytes="119105" number="11">2zZUA.55289$4Z1.25108@fx31.am4</segment>
|
||||
<segment bytes="350796" number="8">0zZUA.55286$4Z1.37644@fx31.am4</segment>
|
||||
<segment bytes="350756" number="9">1zZUA.55287$4Z1.2275@fx31.am4</segment>
|
||||
<segment bytes="350656" number="10">2zZUA.55288$4Z1.18213@fx31.am4</segment>
|
||||
</segments>
|
||||
</file>
|
||||
</nzb>
|
||||
8
tests/requirements.txt
Normal file
8
tests/requirements.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
# SAB-Specific
|
||||
cheetah
|
||||
cryptography
|
||||
sabyenc
|
||||
|
||||
# Testing
|
||||
pytest-xprocess
|
||||
requests
|
||||
11
tests/sabnzbd.basic.ini
Normal file
11
tests/sabnzbd.basic.ini
Normal file
@@ -0,0 +1,11 @@
|
||||
__version__ = 19
|
||||
__encoding__ = utf-8
|
||||
[misc]
|
||||
api_key = apikey
|
||||
|
||||
[servers]
|
||||
[[sabnzbd.test]]
|
||||
enable = 1
|
||||
host = sabnzd.test
|
||||
username = sabnzbd
|
||||
password = sabnzbd
|
||||
61
tests/test_api_pages.py
Normal file
61
tests/test_api_pages.py
Normal file
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/python -OO
|
||||
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
"""
|
||||
tests.test_api_pages - The most basic testing if things work
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import testhelper
|
||||
|
||||
|
||||
def test_basic_api(sabnzbd_connect):
|
||||
# Basic API test
|
||||
assert 'queue' in testhelper.get_api_result('queue')
|
||||
assert 'history' in testhelper.get_api_result('history')
|
||||
assert 'status' in testhelper.get_api_result('fullstatus')
|
||||
assert 'config' in testhelper.get_api_result('get_config')
|
||||
|
||||
|
||||
def test_main_pages(sabnzbd_connect):
|
||||
# See if the basic pages work
|
||||
assert 'Traceback' not in testhelper.get_url_result()
|
||||
assert 'Traceback' not in testhelper.get_url_result('history')
|
||||
assert 'Traceback' not in testhelper.get_url_result('queue')
|
||||
assert 'Traceback' not in testhelper.get_url_result('status')
|
||||
|
||||
|
||||
def test_wizard_pages(sabnzbd_connect):
|
||||
# Test if wizard pages work
|
||||
assert 'Traceback' not in testhelper.get_url_result('wizard')
|
||||
assert 'Traceback' not in testhelper.get_url_result('wizard/one')
|
||||
assert 'Traceback' not in testhelper.get_url_result('wizard/two')
|
||||
|
||||
|
||||
def test_config_pages(sabnzbd_connect):
|
||||
# Test if config pages work
|
||||
assert 'Traceback' not in testhelper.get_url_result('config')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/general')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/server')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/categories')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/switches')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/sorting')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/notify')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/scheduling')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/rss')
|
||||
assert 'Traceback' not in testhelper.get_url_result('config/special')
|
||||
|
||||
58
tests/test_nzb.py
Normal file
58
tests/test_nzb.py
Normal file
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/python -OO
|
||||
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
"""
|
||||
tests.test_nzb - Basic NZB adding support
|
||||
"""
|
||||
|
||||
import os
|
||||
import pytest
|
||||
import testhelper
|
||||
|
||||
|
||||
# Where are we now?
|
||||
base_path = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
def nzo_in_queue(nzo_response):
|
||||
""" Helper function for checking if file is in queue and then remove it """
|
||||
queue_res = testhelper.get_api_result('queue')
|
||||
nzo_id = nzo_response['nzo_ids'][0]
|
||||
|
||||
# Was it added?
|
||||
assert nzo_response['status'] == True
|
||||
assert queue_res['queue']['slots'][0]['nzo_id'] == nzo_response['nzo_ids'][0]
|
||||
|
||||
# Let's remove it
|
||||
remove_response = testhelper.get_api_result('queue', {'name': 'delete', 'value': nzo_id})
|
||||
assert nzo_response['status'] == True
|
||||
|
||||
# Really gone?
|
||||
queue_res = testhelper.get_api_result('queue')
|
||||
assert not queue_res['queue']['slots']
|
||||
|
||||
|
||||
def test_addfile(sabnzbd_connect):
|
||||
# See if basic upload works
|
||||
nzo_response = testhelper.upload_nzb(os.path.join(base_path, 'data', 'reftestnzb.nzb'))
|
||||
nzo_in_queue(nzo_response)
|
||||
|
||||
|
||||
def test_addlocalfile(sabnzbd_connect):
|
||||
# See if basic adding from disk-file works
|
||||
nzo_response = testhelper.get_api_result('addlocalfile', {'name': os.path.join(base_path, 'data', 'reftestnzb.nzb')})
|
||||
nzo_in_queue(nzo_response)
|
||||
48
tests/testhelper.py
Normal file
48
tests/testhelper.py
Normal file
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/python -OO
|
||||
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
"""
|
||||
tests.testhelper - Basic helper functions
|
||||
"""
|
||||
|
||||
import urllib2
|
||||
import json
|
||||
import requests
|
||||
|
||||
SAB_HOST = 'localhost'
|
||||
SAB_PORT = 8081
|
||||
|
||||
|
||||
def get_url_result(url=''):
|
||||
""" Do basic request to web page """
|
||||
arguments = {'session': 'apikey'}
|
||||
return requests.get('http://%s:%s/%s/' % (SAB_HOST, SAB_PORT, url), params=arguments).text
|
||||
|
||||
|
||||
def get_api_result(mode, extra_arguments={}):
|
||||
""" Build JSON request to SABnzbd """
|
||||
arguments = {'apikey': 'apikey', 'output': 'json', 'mode': mode}
|
||||
arguments.update(extra_arguments)
|
||||
r = requests.get('http://%s:%s/api' % (SAB_HOST, SAB_PORT), params=arguments)
|
||||
return r.json()
|
||||
|
||||
|
||||
def upload_nzb(file):
|
||||
""" Upload file and return nzo_id reponse """
|
||||
files = {'name': open(file, 'rb')}
|
||||
arguments ={'apikey':'apikey', 'mode':'addfile', 'output': 'json'}
|
||||
return requests.post('http://%s:%s/api' % (SAB_HOST, SAB_PORT), files=files, data=arguments).json()
|
||||
Reference in New Issue
Block a user