mirror of
https://github.com/sabnzbd/sabnzbd.git
synced 2026-01-05 14:09:22 -05:00
Compare commits
405 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c87fd45c3 | ||
|
|
d0a258ce28 | ||
|
|
1cac5799eb | ||
|
|
a56e4f3650 | ||
|
|
9970d2ee6f | ||
|
|
f2695e9305 | ||
|
|
d333f1b56b | ||
|
|
00f5b29caa | ||
|
|
16aa43c120 | ||
|
|
b2179d5b3e | ||
|
|
8e2e9fd5c9 | ||
|
|
2e3181779a | ||
|
|
8a270e49be | ||
|
|
32e26c804b | ||
|
|
5cf87be51e | ||
|
|
781c45bf3b | ||
|
|
df5a85f851 | ||
|
|
8373994be6 | ||
|
|
437ff427f8 | ||
|
|
ea5e4dfee1 | ||
|
|
2e45f4028c | ||
|
|
d7cdce9278 | ||
|
|
38c329ade2 | ||
|
|
933d0c073c | ||
|
|
1f49bba343 | ||
|
|
0ac712dce1 | ||
|
|
f1ae9060c3 | ||
|
|
263231bb62 | ||
|
|
a7b964c153 | ||
|
|
78035eed12 | ||
|
|
0e7ac8ec5e | ||
|
|
00f262c90e | ||
|
|
68df476603 | ||
|
|
5da03f506d | ||
|
|
0c9540e41e | ||
|
|
c6226c6adb | ||
|
|
b8aab5c0f8 | ||
|
|
e29e7a65b5 | ||
|
|
eb46ed80b6 | ||
|
|
50b2d558eb | ||
|
|
3b4b3dcca2 | ||
|
|
e0f8410918 | ||
|
|
581942ca11 | ||
|
|
005fd399d0 | ||
|
|
6ff00bc992 | ||
|
|
ca66eb04ad | ||
|
|
91a2532c95 | ||
|
|
cb49f7bb53 | ||
|
|
0049f14d7f | ||
|
|
e414874910 | ||
|
|
5931beaa5c | ||
|
|
b3d80b7c65 | ||
|
|
9aa90083b2 | ||
|
|
0b939a9519 | ||
|
|
501867137a | ||
|
|
75d4b5deca | ||
|
|
442591f20c | ||
|
|
74b7f383db | ||
|
|
b966707247 | ||
|
|
eada7286d1 | ||
|
|
b9c312961b | ||
|
|
8389b4fedb | ||
|
|
7720cd60ec | ||
|
|
d1d437074a | ||
|
|
30d3d62e09 | ||
|
|
fd1975617b | ||
|
|
1d037dcb62 | ||
|
|
bd5fb3e88f | ||
|
|
5ca66bfeef | ||
|
|
c9fbadd097 | ||
|
|
f4568ad7dd | ||
|
|
74a395f584 | ||
|
|
dd703ace7f | ||
|
|
ddc8396260 | ||
|
|
e6724e347c | ||
|
|
7fa0508ae8 | ||
|
|
06c6f7d38e | ||
|
|
59ef400fec | ||
|
|
0acdf15755 | ||
|
|
40128f59dd | ||
|
|
286914f253 | ||
|
|
f9bd58bb74 | ||
|
|
30cfb9c6fc | ||
|
|
5ca4811689 | ||
|
|
043e5966ff | ||
|
|
f1695ec875 | ||
|
|
a3db910a4d | ||
|
|
80a29c50c9 | ||
|
|
d693e20e1a | ||
|
|
1a36f548df | ||
|
|
a6f6d88ab9 | ||
|
|
aa7fb17b4e | ||
|
|
a99d333272 | ||
|
|
801aadecfc | ||
|
|
124e2b253c | ||
|
|
39cceed580 | ||
|
|
bfcf56ec45 | ||
|
|
01603b24f5 | ||
|
|
d93d2591b7 | ||
|
|
c17fcec499 | ||
|
|
6804ac20da | ||
|
|
4ed7ac3dea | ||
|
|
eae8056366 | ||
|
|
df4680b6d0 | ||
|
|
b8f5861044 | ||
|
|
8e01ceca7a | ||
|
|
0e1cdec78f | ||
|
|
13e5e93953 | ||
|
|
02d08f38eb | ||
|
|
770951bfe6 | ||
|
|
022898bf63 | ||
|
|
4fd2d8505b | ||
|
|
cc72bb743a | ||
|
|
d7869fc3a1 | ||
|
|
4fbf870028 | ||
|
|
306558b52f | ||
|
|
db19875f5d | ||
|
|
f8061dc9c8 | ||
|
|
c73591eb20 | ||
|
|
ec132374a6 | ||
|
|
262964c6c2 | ||
|
|
cdaad3ed90 | ||
|
|
84f54f5c57 | ||
|
|
00436dfb2c | ||
|
|
c3ce87bd10 | ||
|
|
c3a48a61b6 | ||
|
|
0c03476d76 | ||
|
|
6148cd5445 | ||
|
|
7f72e2042c | ||
|
|
638b29819c | ||
|
|
b950820099 | ||
|
|
96adf76ef1 | ||
|
|
556a4db186 | ||
|
|
b9fbd19064 | ||
|
|
167e7f2870 | ||
|
|
4dba5b8caa | ||
|
|
831b64daa8 | ||
|
|
38fd5cde29 | ||
|
|
e39456cca1 | ||
|
|
8e9425855b | ||
|
|
89add6edac | ||
|
|
16b85429ae | ||
|
|
2482c8e70a | ||
|
|
ad2bb6c3a7 | ||
|
|
2c7e725e39 | ||
|
|
123f05f164 | ||
|
|
4ade2e0c60 | ||
|
|
c908a396df | ||
|
|
15f2370bca | ||
|
|
a5e208eb11 | ||
|
|
d59b3b3679 | ||
|
|
476542463a | ||
|
|
52267a9565 | ||
|
|
972e708810 | ||
|
|
a636f7f18e | ||
|
|
9d5b3e9621 | ||
|
|
9e2d8e5e55 | ||
|
|
d9899cc5cd | ||
|
|
650e83e1b8 | ||
|
|
4296e1628b | ||
|
|
5dddc7ab61 | ||
|
|
529ba69584 | ||
|
|
9f35568a24 | ||
|
|
fe40d49c26 | ||
|
|
6c0b32004a | ||
|
|
bda4e102d6 | ||
|
|
5e03204dbc | ||
|
|
b5deda4195 | ||
|
|
5076892d83 | ||
|
|
6c3a3e1694 | ||
|
|
edbbcec272 | ||
|
|
aced381763 | ||
|
|
cdd3f9cc8a | ||
|
|
a2074f06d5 | ||
|
|
39aa3a9c51 | ||
|
|
c6cf3cc45d | ||
|
|
0378f6f8b1 | ||
|
|
d6b48803a6 | ||
|
|
6da23930bf | ||
|
|
d4e1464cc0 | ||
|
|
e8dc3ebd51 | ||
|
|
4009d855c3 | ||
|
|
d69796d351 | ||
|
|
a2d5713477 | ||
|
|
ba7d906bea | ||
|
|
68f78b0e71 | ||
|
|
d5cd0180d8 | ||
|
|
10265bdfb4 | ||
|
|
3d0d67bffc | ||
|
|
11bd16a653 | ||
|
|
248f2da8a6 | ||
|
|
7b7aaaf467 | ||
|
|
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 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -31,3 +31,6 @@ SABnzbd*.dmg
|
||||
# Some people use Emacs as an editor
|
||||
\#*
|
||||
.\#*
|
||||
|
||||
.DS_Store
|
||||
/venv
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
*******************************************
|
||||
*** This is SABnzbd 2.3.0 ***
|
||||
*** This is SABnzbd 2.4.0 ***
|
||||
*******************************************
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
It simplifies the process of downloading from Usenet dramatically,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
SABnzbd 2.3.0
|
||||
SABnzbd 2.3.1
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
0) LICENSE
|
||||
@@ -60,6 +60,7 @@ All platforms
|
||||
|
||||
Windows
|
||||
PyWin32 use "pip install pypiwin32"
|
||||
subprocessww use "pip install subprocessww"
|
||||
|
||||
Essential modules
|
||||
cheetah-2.0.1+ use "pip install cheetah"
|
||||
@@ -71,7 +72,7 @@ Essential modules
|
||||
Optional modules
|
||||
unzip >= 6.00 http://www.info-zip.org/
|
||||
7zip >= 9.20 http://www.7zip.org/
|
||||
sabyenc == 3.0.2 use "pip install sabyenc"
|
||||
sabyenc == 3.3.1 use "pip install sabyenc"
|
||||
More information: https://sabnzbd.org/sabyenc
|
||||
cryptography >= 1.0 use "pip install cryptography"
|
||||
Enables certificate generation and detection of encrypted RAR-files
|
||||
@@ -92,12 +93,11 @@ Start this from a shell terminal (or command prompt):
|
||||
python tools/make_mo.py
|
||||
|
||||
Start this from a shell terminal (or command prompt):
|
||||
python SABnzbd.py
|
||||
python -OO SABnzbd.py
|
||||
|
||||
Within a few seconds your web browser will start and show the user interface.
|
||||
Use the "Help" button in the web-interface to be directed to the Help Wiki.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
5) TROUBLESHOOTING
|
||||
-------------------------------------------------------------------------------
|
||||
@@ -123,7 +123,6 @@ may help you solve problems easier.
|
||||
Visit our wiki:
|
||||
https://sabnzbd.org/wiki/
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
7) CREDITS
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
4
PKG-INFO
4
PKG-INFO
@@ -1,7 +1,7 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: SABnzbd
|
||||
Version: 2.3.0RC2
|
||||
Summary: SABnzbd-2.3.0RC2
|
||||
Version: 2.3.2
|
||||
Summary: SABnzbd-2.3.2
|
||||
Home-page: https://sabnzbd.org
|
||||
Author: The SABnzbd Team
|
||||
Author-email: team@sabnzbd.org
|
||||
|
||||
@@ -13,7 +13,6 @@ SABnzbd has a good deal of dependencies you'll need before you can get running.
|
||||
|
||||
- `python` (only 2.7.x and higher, but not 3.x.x)
|
||||
- `python-cheetah`
|
||||
- `python-support`
|
||||
- `par2` (Multi-threaded par2 installation guide can be found [here](https://sabnzbd.org/wiki/installation/multicore-par2))
|
||||
- `unrar` (Make sure you get the "official" non-free version of unrar)
|
||||
- `sabyenc` (installation guide can be found [here](https://sabnzbd.org/sabyenc))
|
||||
|
||||
75
README.mkd
75
README.mkd
@@ -1,55 +1,46 @@
|
||||
Release Notes - SABnzbd 2.3.0 RC 2
|
||||
Release Notes - SABnzbd 2.3.2
|
||||
=========================================================
|
||||
|
||||
## Changes since 2.3.0 RC 1
|
||||
- Improved download performance 10-15% on CPU limited devices
|
||||
by removing redundant article verification.
|
||||
- Linux: Update of SABYenc to version 3.1.1 is required.
|
||||
- Password file was loaded from disk excessively
|
||||
## Changes since 2.3.1
|
||||
- SABYenc updated to 3.3.2 to fix rare crash during downloading
|
||||
- Minor updates of SABYenc (such as 3.3.2) are no longer mandatory
|
||||
- Article Cache is automatically set to 25% of system memory, if no
|
||||
custom value was set. Maximum set by auto-detect is 1GB
|
||||
- Simplify Config pages by hiding Advanced Settings
|
||||
- Added option '%dn' to Date Sorting to rename files as job name
|
||||
- Added 'Job Name as Folder Name' as Sorting Preset for de-obfuscation
|
||||
- Server usage graphs are now linked to make comparing servers easier
|
||||
- URLs that fail to fetch due to server errors will only be retried 10x
|
||||
- Delay between URL retries increases when not specified by server
|
||||
- First article of each file is downloaded first to identify filenames
|
||||
- Jobs finished by Direct Unpack will be post-processed first
|
||||
- If available, 7zip will be used instead of unzip
|
||||
- Job password entered by user is always shown in History
|
||||
- Password is also extracted from filename in case of custom job name
|
||||
- Add per-day download-statistics to 'server_stats' API-call
|
||||
- Added Hebrew date-time texts
|
||||
|
||||
## Changes since 2.2.1
|
||||
- Option to limit Servers to specific Categories removed
|
||||
- Improved par2 handling and obfuscated files detection
|
||||
- Duplicate filenames in NZB's no longer rejected by default
|
||||
- Set custom URL instead of /sabnzbd/ (in Config > Specials)
|
||||
- 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
|
||||
- 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
|
||||
## Bugfixes since 2.3.1
|
||||
- Dropped connections could result in stalled downloads
|
||||
- Pre-queue scripts would fail to run
|
||||
- Pre-queue script output was not always parsed correctly
|
||||
- Notifications were always sent for 'Default' category
|
||||
- 'History Retention' also checked on start of program
|
||||
- macOS: Restore full compatibility with macOS 10.11
|
||||
- Windows: Unpacking could fail due to paths not being quoted
|
||||
- Windows: All input parameters to scripts are now quoted
|
||||
- Windows: Complete folder in root of drive could crash post-processing
|
||||
- Windows: Automatically correct 'Extra Par2 Parameters' for MultiPar
|
||||
- Windows: Prevent potential pause/unpause loop after tray icon click
|
||||
|
||||
## Bugfixes since 2.2.1
|
||||
- Reduce CPU usage with multiple servers
|
||||
- Fix yet another potential stalling issue
|
||||
- Remove Timeout tracebacks
|
||||
- Only warn if number of actual passwords is larger than 30
|
||||
- Unexpected behavior when diskspace becomes critically low
|
||||
- Retried jobs would show incorrect download progress
|
||||
- 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: Download with many par2 sets could get listed as failed
|
||||
|
||||
## Upgrading from 2.1.x and older
|
||||
## Upgrading from 2.2.x and older
|
||||
- Finish queue
|
||||
- Stop SABnzbd
|
||||
- Install new version
|
||||
- Start SABnzbd
|
||||
|
||||
## Upgrade notices
|
||||
- When upgrading from 2.1.0 or older the queue will be converted. Job order,
|
||||
- When upgrading from 2.2.0 or older the queue will be converted. Job order,
|
||||
settings and data will be preserved, but all jobs will be unpaused and
|
||||
URL's that did not finish fetching before the upgrade will be lost.
|
||||
- The organization of the download queue is different from 0.7.x releases.
|
||||
|
||||
@@ -87,7 +87,7 @@ import sabnzbd.interface
|
||||
from sabnzbd.constants import *
|
||||
import sabnzbd.newsunpack
|
||||
from sabnzbd.misc import real_path, \
|
||||
check_latest_version, exit_sab, \
|
||||
check_latest_version, exit_sab, get_from_url, \
|
||||
split_host, get_ext, create_https_certificates, \
|
||||
windows_variant, ip_extract, set_serv_parms, get_serv_parms, globber_full
|
||||
from sabnzbd.panic import panic_tmpl, panic_port, panic_host, \
|
||||
@@ -401,7 +401,7 @@ def print_modules():
|
||||
""" Log all detected optional or external modules """
|
||||
if sabnzbd.decoder.SABYENC_ENABLED:
|
||||
# Yes, we have SABYenc, and it's the correct version, so it's enabled
|
||||
logging.info("SABYenc module (v%s)... found!", sabnzbd.constants.SABYENC_VERSION_REQUIRED)
|
||||
logging.info("SABYenc module (v%s)... found!", sabnzbd.decoder.SABYENC_VERSION)
|
||||
else:
|
||||
# Something wrong with SABYenc, so let's determine and print what:
|
||||
if sabnzbd.decoder.SABYENC_VERSION:
|
||||
@@ -657,7 +657,7 @@ def is_sabnzbd_running(url):
|
||||
url = '%s&mode=version' % (url)
|
||||
# Do this without certificate verification, few installations will have that
|
||||
prev = sabnzbd.set_https_verification(False)
|
||||
ver = sabnzbd.newsunpack.get_from_url(url)
|
||||
ver = get_from_url(url)
|
||||
sabnzbd.set_https_verification(prev)
|
||||
return (ver and (re.search(r'\d+\.\d+\.', ver) or ver.strip() == sabnzbd.__version__))
|
||||
except:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
install:
|
||||
- pip install --upgrade -r tests/requirements.txt
|
||||
- pip install pypiwin32
|
||||
- pip install pypiwin32 subprocessww
|
||||
|
||||
build_script:
|
||||
- pytest
|
||||
|
||||
@@ -596,7 +596,7 @@ class MemcachedSession(Session):
|
||||
# Wrap all .get and .set operations in a single lock.
|
||||
mc_lock = threading.RLock()
|
||||
|
||||
# This is a seperate set of locks per session id.
|
||||
# This is a separate set of locks per session id.
|
||||
locks = {}
|
||||
|
||||
servers = ['127.0.0.1:11211']
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<!--#end if#-->
|
||||
<!--#if not $have_unzip #-->
|
||||
<!--#if not $have_unzip and not $have_7zip #-->
|
||||
<tr>
|
||||
<th scope="row">$T('opt-enable_unzip'):</th>
|
||||
<td>
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<div class="padding alt section">
|
||||
<label for="advanced-settings-button" class="form-control advanced-button ">
|
||||
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
|
||||
</label>
|
||||
</div>
|
||||
<form action="saveDirectories" method="post" name="fullform" class="fullform" autocomplete="off">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<input type="hidden" id="ajax" name="ajax" value="1" />
|
||||
@@ -21,7 +26,7 @@
|
||||
<input type="text" name="download_dir" id="download_dir" value="$download_dir" data-initialdir="$my_home" />
|
||||
<span class="desc">$T('explain-download_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="download_free">$T('opt-download_free')</label>
|
||||
<input type="text" name="download_free" id="download_free" value="$download_free" class="smaller_input" />
|
||||
<span class="desc">$T('explain-download_free')</span>
|
||||
@@ -32,7 +37,7 @@
|
||||
<span class="desc">$T('explain-complete_dir')</span>
|
||||
</div>
|
||||
<!--#if not $nt#-->
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="permissions">$T('opt-permissions')</label>
|
||||
<input type="text" name="permissions" id="permissions" value="$permissions" class="smaller_input" />
|
||||
<span class="desc">$T('explain-permissions')</span>
|
||||
@@ -43,7 +48,7 @@
|
||||
<input type="text" name="dirscan_dir" id="dirscan_dir" value="$dirscan_dir" data-initialdir="$my_home" />
|
||||
<span class="desc">$T('explain-dirscan_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="dirscan_speed">$T('opt-dirscan_speed')</label>
|
||||
<input type="number" name="dirscan_speed" id="dirscan_speed" value="$dirscan_speed" min="0" max="3600" />
|
||||
<span class="desc">$T('explain-dirscan_speed')</span>
|
||||
@@ -53,12 +58,12 @@
|
||||
<input type="text" name="script_dir" id="script_dir" value="$script_dir" data-initialdir="$my_home" />
|
||||
<span class="desc">$T('explain-script_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="email_dir">$T('opt-email_dir')</label>
|
||||
<input type="text" name="email_dir" id="email_dir" value="$email_dir" data-initialdir="$my_home" />
|
||||
<span class="desc">$T('explain-email_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="password_file">$T('opt-password_file')</label>
|
||||
<input type="text" name="password_file" id="password_file" value="$password_file" />
|
||||
<span class="desc">$T('explain-password_file')</span>
|
||||
@@ -72,7 +77,7 @@
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="section advanced-settings">
|
||||
<div class="col2">
|
||||
<h3>$T('systemFolders') <a href="$helpuri$help_uri#toc1" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
<p>$T('explain-folderConfig')</p>
|
||||
|
||||
@@ -3,7 +3,12 @@
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
|
||||
<div class="padding alt section">
|
||||
<label for="advanced-settings-button" class="form-control advanced-button ">
|
||||
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
|
||||
</label>
|
||||
</div>
|
||||
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<input type="hidden" id="ajax" name="ajax" value=1 />
|
||||
<div class="section">
|
||||
@@ -28,7 +33,7 @@
|
||||
<input type="checkbox" name="enable_https" id="enable_https" value="1" <!--#if int($enable_https) > 0 then 'checked="checked" data-original="1"' else ""#-->/>
|
||||
<span class="desc">$T('explain-enable_https')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="web_dir">$T('opt-web_dir')</label>
|
||||
<select name="web_dir" id="web_dir">
|
||||
<!--#for $webline in $web_list#-->
|
||||
@@ -89,7 +94,6 @@
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default sabnzbd_restart"><span class="glyphicon glyphicon-refresh"></span> $T('button-restart') SABnzbd</button>
|
||||
<button class="btn btn-default advancedButton enable_https_options"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
@@ -173,7 +177,7 @@
|
||||
</select>
|
||||
<span class="desc">$T('explain-check_new_rel')</span>
|
||||
</div>
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#-->">
|
||||
<div class="field-pair advanced-settings <!--#if int($have_ssl_context) == 0 then "disabled" else ""#-->">
|
||||
<label class="config" for="enable_https_verification">$T('opt-enable_https_verification')</label>
|
||||
<input type="checkbox" name="enable_https_verification" id="enable_https_verification" value="1" <!--#if int($enable_https_verification) > 0 then 'checked="checked"' else ""#--> <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#--> />
|
||||
<span class="desc">$T('explain-enable_https_verification')</span>
|
||||
@@ -200,12 +204,12 @@
|
||||
</select>
|
||||
<input type="hidden" name="bandwidth_max" id="bandwidth_max" value="$bandwidth_max" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="bandwidth_perc">$T('opt-bandwidth_perc')</label>
|
||||
<input type="number" name="bandwidth_perc" id="bandwidth_perc" value="$bandwidth_perc" step="10" min="0" max="100"/>
|
||||
<span class="desc">$T('explain-bandwidth_perc')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="cache_limit">$T('opt-cache_limitstr')</label>
|
||||
<input type="text" name="cache_limit" id="cache_limit" value="$cache_limit" class="smaller_input" />
|
||||
<span class="desc">$T('explain-cache_limitstr').replace("64M", "256M").replace("128M", "512M")</span>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<!--#end def#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveEmail" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
|
||||
<form action="saveEmail" method="post" name="fullform" class="fullform" autocomplete="off">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<input type="hidden" id="ajax" name="ajax" value="1" />
|
||||
<div class="section" id="email">
|
||||
@@ -91,7 +91,7 @@
|
||||
<input type="text" name="email_pwd" id="email_pwd" value="$email_pwd" />
|
||||
<span class="desc">$T('explain-email_pwd')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_email" rel="$T('askTestEmail')"><span class="glyphicon glyphicon-envelope"></span> $T('link-testEmail')</button>
|
||||
</div>
|
||||
@@ -115,7 +115,7 @@
|
||||
<div class="col1" <!--#if int($ncenter_enable) > 0 then '' else 'style="display:none"'#-->>
|
||||
<fieldset>
|
||||
$show_notify_checkboxes('ncenter')
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_notif"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -141,7 +141,7 @@
|
||||
<div class="col1" <!--#if int($acenter_enable) > 0 then '' else 'style="display:none"'#-->>
|
||||
<fieldset>
|
||||
$show_notify_checkboxes('acenter')
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_windows"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -167,7 +167,7 @@
|
||||
<div class="col1" <!--#if int($ntfosd_enable) > 0 then '' else 'style="display:none"'#-->>
|
||||
<fieldset>
|
||||
$show_notify_checkboxes('ntfosd')
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_osd"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -207,7 +207,7 @@
|
||||
<span class="desc">$T('Optional') - $T('explain-nscript_parameters')</span>
|
||||
</div>
|
||||
$show_notify_checkboxes('nscript')
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_nscript"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -241,7 +241,7 @@
|
||||
<span class="desc">$T('explain-growl_password')</span>
|
||||
</div>
|
||||
$show_notify_checkboxes('growl')
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_growl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -286,7 +286,7 @@
|
||||
</select>
|
||||
</div>
|
||||
<!--#end for#-->
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_prowl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -326,6 +326,16 @@
|
||||
<input type="text" name="pushover_device" id="pushover_device" value="$pushover_device" />
|
||||
<span class="desc">$T('explain-pushover_device')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="pushover_emergency_retry">$T('opt-pushover_emergency_retry')</label>
|
||||
<input type="text" name="pushover_emergency_retry" id="pushover_emergency_retry" value="$pushover_emergency_retry" />
|
||||
<span class="desc">$T('explain-pushover_emergency_retry')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="pushover_emergency_expire">$T('opt-pushover_emergency_expire')</label>
|
||||
<input type="text" name="pushover_emergency_expire" id="pushover_emergency_expire" value="$pushover_emergency_expire" />
|
||||
<span class="desc">$T('explain-pushover_emergency_expire')</span>
|
||||
</div>
|
||||
<!--#set $section_label = 'pushover'#-->
|
||||
<!--#for $type in $notify_keys#-->
|
||||
<div class="field-pair">
|
||||
@@ -342,7 +352,7 @@
|
||||
</select>
|
||||
</div>
|
||||
<!--#end for#-->
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_pushover"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -379,7 +389,7 @@
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
$show_notify_checkboxes('pushbullet')
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default" type="button" id="test_pushbullet"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
|
||||
</div>
|
||||
@@ -407,6 +417,7 @@
|
||||
\$(this).parents('.col2').find('.col2-cats').hide()
|
||||
}
|
||||
\$('form').submit()
|
||||
addRowColor()
|
||||
})
|
||||
\$('#email_endjob').change(function() {
|
||||
if(\$(this).val() > 0) {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<div class="padTable">
|
||||
<a class="main-helplink" href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a>
|
||||
<p>$T('explain-RSS')</p>
|
||||
<form action="add_rss_feed" method="post" autocomplete="off" novalidate>
|
||||
<form action="add_rss_feed" method="post" autocomplete="off">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<table class="catTable">
|
||||
<tr>
|
||||
@@ -37,7 +37,7 @@
|
||||
<!--#if $rss#-->
|
||||
<div class="section">
|
||||
<div class="padTable">
|
||||
<form action="save_rss_feed" method="post" autocomplete="off" novalidate>
|
||||
<form action="save_rss_feed" method="post" autocomplete="off">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<table id="subscriptions">
|
||||
<tbody>
|
||||
@@ -73,7 +73,7 @@
|
||||
</form>
|
||||
<!--#if $feeds#-->
|
||||
<br/>
|
||||
<form action="rss_now" method="post" autocomplete="off" novalidate>
|
||||
<form action="rss_now" method="post" autocomplete="off">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<button type="submit" class="btn btn-default readAll"><span class="glyphicon glyphicon-sort"></span> $T('button-rssNow')</button>
|
||||
</form>
|
||||
@@ -154,7 +154,7 @@
|
||||
<option value=">"> $T('rss-atleast')</option>
|
||||
<option value="<"> $T('rss-atmost')</option>
|
||||
<option value="F"> $T('rss-from')</option>
|
||||
<option value="F"> $T('rss-from-show')</option>
|
||||
<option value="F"> $T('rss-from-show') ($T('rss-accept'))</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@@ -226,8 +226,8 @@
|
||||
<option value="C"> $T('rss-mustcat')</option>
|
||||
<option value=">"> $T('rss-atleast')</option>
|
||||
<option value="<"> $T('rss-atmost')</option>
|
||||
<option value="S"> $T('rss-from-show')</option>
|
||||
<option value="F"> $T('rss-from')</option>
|
||||
<option value="S"> $T('rss-from-show') ($T('rss-accept'))</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@@ -287,7 +287,7 @@
|
||||
<input type="hidden" name="feed" value="$feed" />
|
||||
<table class="catTable">
|
||||
<tbody>
|
||||
<tr class="<!--#if $odd then " alt " else " "#--> <!--#if $filter[3]!="A" then 'disabled_options_rule' else ""#-->">
|
||||
<tr class="<!--#if $odd then " alt " else " "#--> <!--#if $filter[3]!="A" and $filter[3]!="S" then 'disabled_options_rule' else ""#-->">
|
||||
<td>
|
||||
<input type="checkbox" name="enabled" value="1" <!--#if $filter[6]=='1' then 'checked="checked"' else ""#--> />
|
||||
</td>
|
||||
@@ -302,8 +302,8 @@
|
||||
<option value="C" <!--#if $filter[3]=="C" then 'selected="selected"' else ""#-->> $T('rss-mustcat')</option>
|
||||
<option value=">" <!--#if $filter[3]==">" then 'selected="selected"' else ""#-->> $T('rss-atleast')</option>
|
||||
<option value="<" <!--#if $filter[3]=="<" then 'selected="selected"' else ""#-->> $T('rss-atmost')</option>
|
||||
<option value="S" <!--#if $filter[3]=="S" then 'selected="selected"' else ""#-->> $T('rss-from-show')</option>
|
||||
<option value="F" <!--#if $filter[3]=="F" then 'selected="selected"' else ""#-->> $T('rss-from')</option>
|
||||
<option value="S" <!--#if $filter[3]=="S" then 'selected="selected"' else ""#-->> $T('rss-from-show') ($T('rss-accept'))</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@@ -568,7 +568,7 @@ function urlencode(str) {
|
||||
|
||||
// Only the Accept filter needs all the options
|
||||
\$('form[action="upd_rss_filter"]').find('select[name="filter_type"]').change(function() {
|
||||
\$(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', \$(this).val() != "A")
|
||||
\$(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', \$(this).val() != "A" && \$(this).val() != "S")
|
||||
})
|
||||
// Trigger on-load for all
|
||||
\$('.disabled_options_rule').find('td select:not([name="filter_type"])').attr('disabled', true)
|
||||
|
||||
@@ -2,107 +2,298 @@
|
||||
<!--#set global $help_uri="configuration/2.3/servers"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<!--
|
||||
We need to find how many months we have recorded so far, so we
|
||||
loop over all the dates to find the lowest value and then use
|
||||
this to calculate the date-selector and maximum value per month.
|
||||
-->
|
||||
<!--#import json#-->
|
||||
<!--#import datetime#-->
|
||||
<!--#import sabnzbd.misc#-->
|
||||
|
||||
<!--#set month_names = [$T('January'), $T('February'), $T('March'), $T('April'), $T('May'), $T('June'), $T('July'), $T('August'), $T('September'), $T('October'), $T('November'), $T('December')] #-->
|
||||
<!--#set min_date = datetime.date.today()#-->
|
||||
<!--#set max_data_all = {}#-->
|
||||
|
||||
<!--#for $server in $servers #-->
|
||||
<!--#if 'amounts' in $server#-->
|
||||
<!--#set max_data_server = {}#-->
|
||||
<!--#for date in $server['amounts'][4]#-->
|
||||
<!--#set split_date = $date.split('-')#-->
|
||||
<!--#set min_date = min(min_date, datetime.date(int(split_date[0]), int(split_date[1]), 1))#-->
|
||||
|
||||
<!--#set month_date = $date[:7]#-->
|
||||
<!--#if $month_date not in $max_data_server#-->
|
||||
<!--#set max_data_server[$month_date] = 0#-->
|
||||
<!--#end if#-->
|
||||
<!--#set max_data_server[$month_date] = max(max_data_server[$month_date], $server['amounts'][4][$date])#-->
|
||||
<!--#end for#-->
|
||||
|
||||
<!--#for month_date in max_data_server#-->
|
||||
<!--#if $month_date not in $max_data_all#-->
|
||||
<!--#set max_data_all[$month_date] = 0#-->
|
||||
<!--#end if#-->
|
||||
<!--#set max_data_all[$month_date] = max(max_data_all[$month_date], max_data_server[$month_date])#-->
|
||||
<!--#end for#-->
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
|
||||
<!--#set months_recorded = list(sabnzbd.misc.monthrange(min_date, datetime.date.today()))#-->
|
||||
<!--#$months_recorded.reverse()#-->
|
||||
|
||||
<script type="text/javascript">
|
||||
// Define variable needed for the server-plots
|
||||
var serverData = {}
|
||||
</script>
|
||||
|
||||
<div class="colmask">
|
||||
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();" novalidate>
|
||||
<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>
|
||||
<div class="padding alt section">
|
||||
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
<label for="advanced-settings-button" class="form-control advanced-button ">
|
||||
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
|
||||
</label>
|
||||
|
||||
<!--#if $months_recorded#-->
|
||||
<div class="advanced-buttonSeperator"></div>
|
||||
<div class="chart-selector-container" title="$T('srv-bandwidth')">
|
||||
<span class="glyphicon glyphicon-signal"></span>
|
||||
<select name="chart-selector" id="chart-selector">
|
||||
<!--#for $cur_date in months_recorded#-->
|
||||
<!--#set month_date = '%d-%02d' % ($cur_date.year, $cur_date.month)#-->
|
||||
<!--#if $month_date not in $max_data_all#-->
|
||||
<!--#set max_data_all[$month_date] = 0#-->
|
||||
<!--#end if#-->
|
||||
<option value="$month_date" data-max="$max_data_all[$month_date]">$month_names[$cur_date.month-1] $cur_date.year</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
<div class="section" id="addServerContent" style="display: none;">
|
||||
<div class="col2">
|
||||
<h3>$T('addServer') <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
</div><!-- /col2 -->
|
||||
</div>
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="enable">$T('srv-enable')</label>
|
||||
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
|
||||
<span class="desc">$T('srv-enable')</span>
|
||||
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="enable">$T('srv-enable')</label>
|
||||
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
|
||||
<span class="desc">$T('srv-enable')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port" size="8" value="119" min="0" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl" value="1" />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_00">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_00" id="${pid}_00" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_01">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_01" id="${pid}_01" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections" min="1" max="100" value="8" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority" min="0" max="99" /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout" min="20" max="240" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" selected>$T('ssl_verify-strict')</option>
|
||||
<option value="1">$T('ssl_verify-normal')</option>
|
||||
<option value="0">$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group" value="1" />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional" value="1" />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname" />
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes" rows="3" cols="50"></textarea>
|
||||
</div>
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--#set $prio_colors = ["#59cc33", "#3366cc","#7f33cc", "#cc33a6", "#cc3333"] #-->
|
||||
<!--#set $cur_prio_color = -1 #-->
|
||||
<!--#set $last_prio = -1 #-->
|
||||
<!--#for $cur, $server in enumerate($servers) #-->
|
||||
<form action="saveServer" method="post" class="fullform" autocomplete="off">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="server" value="$server['name']" />
|
||||
|
||||
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<h3>$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
<!--#if int($server['enable']) != 0 #-->
|
||||
<!--#if $last_prio != $server['priority'] and $cur_prio_color+1 < len($prio_colors) #-->
|
||||
<!--#set $cur_prio_color = $cur_prio_color+1 #-->
|
||||
<!--#set $last_prio = $server['priority'] #-->
|
||||
<!--#end if#-->
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$server['priority']</span>
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$T('srv-priority'):</span>
|
||||
<!--#end if#-->
|
||||
<table>
|
||||
<tr>
|
||||
<td><input type="checkbox" class="toggleServerCheckbox" id="enable_$cur" name="$server['name']" value="1" <!--#if int($server['enable']) != 0 then 'checked="checked"' else ""#--> /></td>
|
||||
<td><label for="enable_$cur">$T('enabled')</label></td>
|
||||
</tr>
|
||||
</table>
|
||||
<button type="button" class="btn btn-default showserver"><span class="glyphicon glyphicon-pencil"></span> $T('showDetails')</button>
|
||||
<button type="button" class="btn btn-default clrServer"><span class="glyphicon glyphicon-remove"></span> $T('button-clrServer')</button>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host" />
|
||||
<div class="col1" style="display:none;">
|
||||
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host$cur">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host$cur" value="$server['host']" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port$cur">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port$cur" value="$server['port']" size="8" min="0" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($server['ssl']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}0">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_${cur}0" id="${pid}_${cur}0" value="$server['username']" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}1">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_${cur}1" id="${pid}_${cur}1" value="$server['password']" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections$cur">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections$cur" value="$server['connections']" min="1" max="100" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority$cur">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority$cur" value="$server['priority']" min="0" max="99" required /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention$cur">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention$cur" value="$server['retention']" min="0" required /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout$cur" value="$server['timeout']" min="20" max="240" required /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify$cur">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify$cur" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" <!--#if $server['ssl_verify'] == 2 then 'selected="selected"' else ""#--> >$T('ssl_verify-strict')</option>
|
||||
<option value="1" <!--#if $server['ssl_verify'] == 1 then 'selected="selected"' else ""#--> >$T('ssl_verify-normal')</option>
|
||||
<option value="0" <!--#if $server['ssl_verify'] == 0 then 'selected="selected"' else ""#--> >$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional$cur">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($server['optional']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group$cur">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group$cur" value="1" <!--#if int($server['send_group']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes$cur">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes$cur" rows="3" cols="50">$server['notes']</textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
<button class="btn btn-default delServer"><span class="glyphicon glyphicon-trash"></span> $T('button-delServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port" size="8" value="119" />
|
||||
<div class="col1" style="display:block;">
|
||||
<!--#if 'amounts' in $server#-->
|
||||
<div class="server-amounts-text">
|
||||
<b>$T('srv-bandwidth'):</b><br/>
|
||||
$T('total'): $(server['amounts'][0])B<br/>
|
||||
$T('today'): $(server['amounts'][3])B<br/>
|
||||
$T('thisWeek'): $(server['amounts'][2])B<br/>
|
||||
$T('thisMonth'): $(server['amounts'][1])B<br/>
|
||||
<span id="server-data-label-${cur}"></span>: <span id="server-data-value-${cur}"></span>
|
||||
</div>
|
||||
<div class="server-chart" data-serverid="${cur}"s>
|
||||
<div id="server-chart-${cur}" class="ct-chart"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
// Server data
|
||||
serverData[${cur}] = <!--#echo json.dumps($server['amounts'][4])#-->
|
||||
</script>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl" value="1" />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_00">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_00" id="${pid}_00" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_01">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_01" id="${pid}_01" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections" min="0" max="100" value="8" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority" min="0" max="100" /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout" min="30" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" selected>$T('ssl_verify-strict')</option>
|
||||
<option value="1">$T('ssl_verify-normal')</option>
|
||||
<option value="0">$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group" value="1" />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional" value="1" />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname" />
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes" rows="3" cols="50"></textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
</form>
|
||||
</div>
|
||||
</form>
|
||||
<!--#end for#-->
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="${root}staticcfg/js/chartist.min.js"></script>
|
||||
<script type="text/javascript" src="${root}staticcfg/js/filesize.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
// Define variables needed for the server-plots
|
||||
var serverData = {}
|
||||
// Standardize chart options
|
||||
var chartOptions = {
|
||||
fullWidth: true,
|
||||
showArea: true,
|
||||
@@ -125,246 +316,76 @@
|
||||
right: 20
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!--
|
||||
We need to find how many months we have recorded so far, so we
|
||||
loop over all the dates to find the lowest value and then use
|
||||
this to calculate the date-selector
|
||||
-->
|
||||
|
||||
<!--#import json#-->
|
||||
<!--#import datetime#-->
|
||||
<!--#import sabnzbd.misc#-->
|
||||
|
||||
<!--#def show_date_selector($server, $id)#-->
|
||||
<!--#set month_names = [$T('January'), $T('February'), $T('March'), $T('April'), $T('May'), $T('June'), $T('July'), $T('August'), $T('September'), $T('October'), $T('November'), $T('December')] #-->
|
||||
<!--#set min_date = datetime.date.today()#-->
|
||||
<!--#for date in $server['amounts'][4]#-->
|
||||
<!--#set split_date = $date.split('-')#-->
|
||||
<!--#set min_date = min(min_date, datetime.date(int(split_date[0]), int(split_date[1]), 1))#-->
|
||||
<!--#end for#-->
|
||||
<!--#set months_recorded = list(sabnzbd.misc.monthrange(min_date, datetime.date.today()))#-->
|
||||
<!--#$months_recorded.reverse()#-->
|
||||
<select class="chart-selector" name="chart-selector-${id}" id="chart-selector-${id}" data-id="${id}">
|
||||
<!--#for $cur_date in months_recorded#-->
|
||||
<option value="<!--#echo '%d-%02d' % ($cur_date.year, $cur_date.month)#-->">$month_names[$cur_date.month-1] $cur_date.year</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<!--#end def#-->
|
||||
|
||||
<!--#set $prio_colors = ["#59cc33", "#3366cc","#7f33cc", "#cc33a6", "#cc3333"] #-->
|
||||
<!--#set $cur_prio_color = -1 #-->
|
||||
<!--#set $last_prio = -1 #-->
|
||||
<!--#for $cur, $server in enumerate($servers) #-->
|
||||
<form action="saveServer" method="post" class="fullform" autocomplete="off" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="server" value="$server['name']" />
|
||||
|
||||
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<h3>$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
|
||||
<!--#if int($server['enable']) != 0 #-->
|
||||
<!--#if $last_prio != $server['priority'] and $cur_prio_color+1 < len($prio_colors) #-->
|
||||
<!--#set $cur_prio_color = $cur_prio_color+1 #-->
|
||||
<!--#set $last_prio = $server['priority'] #-->
|
||||
<!--#end if#-->
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$server['priority']</span>
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$T('srv-priority'):</span>
|
||||
<!--#end if#-->
|
||||
<table><tr>
|
||||
<td><input type="checkbox" class="toggleServerCheckbox" id="enable_$cur" name="$server['name']" value="1" <!--#if int($server['enable']) != 0 then 'checked="checked"' else ""#--> /></td>
|
||||
<td><label for="enable_$cur">$T('enabled')</label></td>
|
||||
</tr></table>
|
||||
|
||||
<button type="button" class="btn btn-default showserver"><span class="glyphicon glyphicon-pencil"></span> $T('showDetails')</button>
|
||||
<button type="button" class="btn btn-default clrServer"><span class="glyphicon glyphicon-remove"></span> $T('button-clrServer')</button>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1" style="display:none;">
|
||||
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host$cur">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host$cur" value="$server['host']" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port$cur">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port$cur" value="$server['port']" size="8" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($server['ssl']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}0">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_${cur}0" id="${pid}_${cur}0" value="$server['username']" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}1">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_${cur}1" id="${pid}_${cur}1" value="$server['password']" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections$cur">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections$cur" value="$server['connections']" min="0" max="100" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority$cur">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority$cur" value="$server['priority']" min="0" max="100" /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention$cur">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention$cur" value="$server['retention']" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout$cur" value="$server['timeout']" min="30" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify$cur">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify$cur" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" <!--#if $server['ssl_verify'] == 2 then 'selected="selected"' else ""#--> >$T('ssl_verify-strict')</option>
|
||||
<option value="1" <!--#if $server['ssl_verify'] == 1 then 'selected="selected"' else ""#--> >$T('ssl_verify-normal')</option>
|
||||
<option value="0" <!--#if $server['ssl_verify'] == 0 then 'selected="selected"' else ""#--> >$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional$cur">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($server['optional']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group$cur">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group$cur" value="1" <!--#if int($server['send_group']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes$cur">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes$cur" rows="3" cols="50">$server['notes']</textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
<button class="btn btn-default delServer"><span class="glyphicon glyphicon-trash"></span> $T('button-delServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="col1" style="display:block;">
|
||||
<!--#if 'amounts' in $server#-->
|
||||
<div class="server-amounts-text">
|
||||
<b>$T('srv-bandwidth'):</b><br/>
|
||||
$T('total'): $(server['amounts'][0])B<br/>
|
||||
$T('today'): $(server['amounts'][3])B<br/>
|
||||
$T('thisWeek'): $(server['amounts'][2])B<br/>
|
||||
$T('thisMonth'): $(server['amounts'][1])B
|
||||
</div>
|
||||
<div class="server-chart">
|
||||
$show_date_selector($server, $cur)
|
||||
<div id="server-chart-${cur}" class="ct-chart"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
// Server data
|
||||
serverData[${cur}] = <!--#echo json.dumps($server['amounts'][4])#-->
|
||||
\$(document).ready(function() {
|
||||
showChart(${cur}, \$('#chart-selector-${cur}').val())
|
||||
})
|
||||
</script>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<!--#end for#-->
|
||||
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script type="text/javascript">
|
||||
function showChart(server_id, month) {
|
||||
function showCharts() {
|
||||
// This month
|
||||
var theMonth = \$('#chart-selector').val()
|
||||
var thisDay = new Date()
|
||||
|
||||
// What month are we doing?
|
||||
var inputDate = new Date(month+'-01')
|
||||
var inputDate = new Date(theMonth+'-01')
|
||||
var baseDate = new Date(inputDate.getUTCFullYear(), inputDate.getUTCMonth(), 1)
|
||||
var maxDaysInMonth = new Date(baseDate.getFullYear(), baseDate.getMonth()+1, 0).getDate()
|
||||
|
||||
// Fill the data array
|
||||
var data = {
|
||||
labels: [],
|
||||
series: [[]]
|
||||
};
|
||||
var largestVal = 0
|
||||
for(var i = 1; i < maxDaysInMonth+1; i++) {
|
||||
// Add X-label
|
||||
if(i % 3 == 1) {
|
||||
data['labels'].push(i)
|
||||
} else {
|
||||
data['labels'].push(NaN)
|
||||
// Set the new maximum
|
||||
chartOptions.axisY.high = \$('#chart-selector :selected').data('max');
|
||||
chartOptions.axisY.low = 0
|
||||
|
||||
// For each chart
|
||||
\$('.server-chart').each(function(i, elemn) {
|
||||
var server_id = \$(elemn).data('serverid')
|
||||
|
||||
// Fill the data array
|
||||
var data = {
|
||||
labels: [],
|
||||
series: [[]]
|
||||
};
|
||||
var totalThisMonth = 0
|
||||
for(var i = 1; i < maxDaysInMonth+1; i++) {
|
||||
// Add X-label
|
||||
if(i % 3 == 1) {
|
||||
data['labels'].push(i)
|
||||
} else {
|
||||
data['labels'].push(NaN)
|
||||
}
|
||||
|
||||
// Get formatted date
|
||||
baseDate.setDate(i)
|
||||
var dateCheck = toFormattedDate(baseDate)
|
||||
|
||||
// Add data if we have it
|
||||
if(dateCheck in serverData[server_id]) {
|
||||
data['series'][0].push(serverData[server_id][dateCheck])
|
||||
totalThisMonth += serverData[server_id][dateCheck]
|
||||
} else if(thisDay.getYear() == baseDate.getYear() && thisDay.getMonth() == baseDate.getMonth() && thisDay.getDate() < i) {
|
||||
data['series'][0].push(NaN)
|
||||
} else {
|
||||
data['series'][0].push(0)
|
||||
}
|
||||
}
|
||||
|
||||
// Get formatted date
|
||||
baseDate.setDate(i)
|
||||
var dateCheck = toFormattedDate(baseDate)
|
||||
// Update the text value
|
||||
\$('#server-data-label-' + server_id).text(\$('#chart-selector :selected').text())
|
||||
\$('#server-data-value-' + server_id).text(filesize(totalThisMonth, {round: 1}))
|
||||
|
||||
// Add data if we have it
|
||||
if(dateCheck in serverData[server_id]) {
|
||||
data['series'][0].push(serverData[server_id][dateCheck])
|
||||
largestVal = Math.max(largestVal, serverData[server_id][dateCheck])
|
||||
} else if(thisDay.getYear() == baseDate.getYear() && thisDay.getMonth() == baseDate.getMonth() && thisDay.getDate() < i) {
|
||||
data['series'][0].push(NaN)
|
||||
} else {
|
||||
data['series'][0].push(0)
|
||||
}
|
||||
}
|
||||
|
||||
// Check if we should shrink the Y-axis values
|
||||
var devideBy = 1024
|
||||
var axisLabel = 'KB'
|
||||
if(largestVal > 1024*1024) {
|
||||
devideBy = 1024*1024
|
||||
axisLabel = 'MB'
|
||||
}
|
||||
if(largestVal > 1024*1024*1024) {
|
||||
devideBy = 1024*1024*1024
|
||||
axisLabel = 'GB'
|
||||
}
|
||||
if(largestVal > 1024*1024*1024*1024) {
|
||||
devideBy = 1024*1024*1024*1024
|
||||
axisLabel = 'TB'
|
||||
}
|
||||
|
||||
// Shrink the value
|
||||
data['series'][0] = data['series'][0].map(function(num) {
|
||||
return num / devideBy;
|
||||
// Show the chart
|
||||
chart = new Chartist.Line('#server-chart-'+server_id, data, chartOptions);
|
||||
chart.on('created', function(context) {
|
||||
// Make sure to add this as the first child so it's at the bottom
|
||||
context.svg.elem('rect', {
|
||||
x: context.chartRect.x1,
|
||||
y: context.chartRect.y2-1,
|
||||
width: context.chartRect.width(),
|
||||
height: context.chartRect.height()+2,
|
||||
fill: 'none',
|
||||
stroke: '#B9B9B9',
|
||||
'stroke-width': '1px'
|
||||
}, '', context.svg, true)
|
||||
\$('#server-chart-'+server_id+' .ct-label.ct-vertical').each(function(index, elmn) {
|
||||
elmn.innerHTML = filesize(elmn.innerHTML, {round: 1}).replace(' ','')
|
||||
})
|
||||
});
|
||||
})
|
||||
|
||||
// Show the chart
|
||||
chart = new Chartist.Line('#server-chart-'+server_id, data, chartOptions);
|
||||
chart.on('created', function(context) {
|
||||
// Make sure to add this as the first child so it's at the bottom
|
||||
context.svg.elem('rect', {
|
||||
x: context.chartRect.x1,
|
||||
y: context.chartRect.y2-1,
|
||||
width: context.chartRect.width(),
|
||||
height: context.chartRect.height()+2,
|
||||
fill: 'none',
|
||||
stroke: '#B9B9B9',
|
||||
'stroke-width': '1px'
|
||||
}, '', context.svg, true)
|
||||
\$('#server-chart-'+server_id+' .ct-label.ct-vertical').each(function(index, elmn) {
|
||||
elmn.innerHTML += axisLabel
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// Need to mitigate timezone effects!
|
||||
@@ -389,14 +410,17 @@
|
||||
/**
|
||||
Update charts when changed
|
||||
**/
|
||||
\$('.chart-selector').on('change', function(elemn) {
|
||||
showChart(\$(elemn.target).data('id'), \$(elemn.target).val())
|
||||
\$('#chart-selector').on('change', function(elemn) {
|
||||
showCharts()
|
||||
|
||||
// Lets us leave (needs to be called after the change event)
|
||||
setTimeout(function() {
|
||||
formWasSubmitted = true;
|
||||
formHasChanged = false;
|
||||
}, 100)
|
||||
})
|
||||
// And on page-load
|
||||
showCharts()
|
||||
|
||||
/**
|
||||
Click events
|
||||
@@ -412,11 +436,14 @@
|
||||
} else {
|
||||
\$(this).html(\$(this).html().replace("$T('hideDetails')", "$T('showDetails')"));
|
||||
}
|
||||
// Add coloring
|
||||
addRowColor()
|
||||
});
|
||||
|
||||
\$('#addServerButton').click(function(){
|
||||
\$('#addServer').hide();
|
||||
\$('#addServerContent').show();
|
||||
// Add coloring
|
||||
addRowColor()
|
||||
});
|
||||
|
||||
\$('[name="ssl"]').click(function() {
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
<br/>
|
||||
<input type="button" class="btn btn-default" onclick="tvSet('%sn/%sx%0e - %en/%sn - %sx%0e - %en.%ext')" value="$T('button-Ep1x05')" />
|
||||
<input type="button" class="btn btn-default" onclick="tvSet('%sn/S%0sE%0e - %en/%sn - S%0sE%0e - %en.%ext')" value="$T('button-EpS01E05')" />
|
||||
<br>
|
||||
<input type="button" class="btn btn-default" onclick="tvSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
|
||||
</div>
|
||||
</div>
|
||||
<div id="previewtv" class="example">
|
||||
@@ -51,7 +53,7 @@
|
||||
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewtv-result"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<label class="config">$T('sort-legenda')</label>
|
||||
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key1').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
|
||||
<table id="Key1" class="Key">
|
||||
@@ -139,9 +141,9 @@
|
||||
<td>$T("sort-File")</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('orgDirname'):</b></td>
|
||||
<td class="align-right"><b>$T('orgJobname'):</b></td>
|
||||
<td>%dn</td>
|
||||
<td>$T("sort-Folder")</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('lowercase'):</b></td>
|
||||
@@ -199,6 +201,7 @@
|
||||
<input type="button" class="btn btn-default" onclick="movieSet('%title (%y)/%title (%y).%ext',' CD%1');movieExtraFolder(false)" value="$T('button-inFolders')" />
|
||||
<input type="button" class="btn btn-default" onclick="movieSet('%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('button-noFolders')" />
|
||||
<input type="button" class="btn btn-default" onclick="movieSet('%0decade/%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('decade')" />
|
||||
<input type="button" class="btn btn-default" onclick="movieSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
|
||||
</div>
|
||||
</div>
|
||||
<div id="previewmovie" class="example">
|
||||
@@ -210,7 +213,7 @@
|
||||
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewmovie-result"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<label class="config">$T('sort-legenda')</label>
|
||||
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key2').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
|
||||
<table id="Key2" class="Key">
|
||||
@@ -263,9 +266,9 @@
|
||||
<td>$T('sort-File')</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('orgDirname'):</b></td>
|
||||
<td class="align-right"><b>$T('orgJobname'):</b></td>
|
||||
<td>%dn</td>
|
||||
<td>$T("sort-Folder")</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('lowercase'):</b></td>
|
||||
@@ -328,7 +331,9 @@
|
||||
<div class="presets float-left">
|
||||
<input type="button" class="btn btn-default" onclick="dateSet('%t/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-ShowNameF')" />
|
||||
<input type="button" class="btn btn-default" onclick="dateSet('%y-%0m/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-YMF')" />
|
||||
<br>
|
||||
<input type="button" class="btn btn-default" onclick="dateSet('%y-%0m-%0d/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-DailyF')" />
|
||||
<input type="button" class="btn btn-default" onclick="dateSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
|
||||
</div>
|
||||
</div>
|
||||
<div id="previewdate" class="example">
|
||||
@@ -340,7 +345,7 @@
|
||||
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewdate-result"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<label class="config">$T('sort-legenda')</label>
|
||||
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key3').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
|
||||
<table id="Key3" class="Key">
|
||||
@@ -407,6 +412,11 @@
|
||||
<td>%fn</td>
|
||||
<td>$T('sort-File')</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('orgJobname'):</b></td>
|
||||
<td>%dn</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('lowercase'):</b></td>
|
||||
<td>{$T('TEXT')}</td>
|
||||
@@ -487,7 +497,7 @@
|
||||
\$.ajax({
|
||||
type: "GET",
|
||||
url: "../../tapi",
|
||||
data: {mode:'eval_sort', value: 'generic', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
|
||||
data: {mode:'eval_sort', value: 'movie', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
|
||||
success: function(data){
|
||||
\$('#previewmovie-result').removeClass("loading failure").html(data.result);
|
||||
},
|
||||
|
||||
@@ -3,9 +3,14 @@
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<div class="padding alt section">
|
||||
<label for="advanced-settings-button" class="form-control advanced-button ">
|
||||
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
|
||||
</label>
|
||||
</div>
|
||||
<form action="saveSwitches" method="post" name="fullform" class="fullform" autocomplete="off">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="section">
|
||||
<div class="section advanced-settings">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-server') <a href="$helpuri$help_uri#toc1" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
</div><!-- /col2 -->
|
||||
@@ -67,12 +72,12 @@
|
||||
<input type="number" name="propagation_delay" id="propagation_delay" value="$propagation_delay" /> <i>$T('minutes')</i>
|
||||
<span class="desc">$T('explain-propagation_delay')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="top_only">$T('opt-top_only')</label>
|
||||
<input type="checkbox" name="top_only" id="top_only" value="1" <!--#if int($top_only) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-top_only')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="pre_check">$T('opt-pre_check')</label>
|
||||
<input type="checkbox" name="pre_check" id="pre_check" value="1" <!--#if int($pre_check) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-pre_check')</span>
|
||||
@@ -104,7 +109,7 @@
|
||||
</select>
|
||||
<span class="desc">$T('explain-no_series_dupes')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="series_propercheck">$T('opt-series_propercheck')</label>
|
||||
<input type="checkbox" name="series_propercheck" id="series_propercheck" value="1" <!--#if int($series_propercheck) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-series_propercheck')</span>
|
||||
@@ -118,6 +123,11 @@
|
||||
</select>
|
||||
<span class="desc">$T('explain-pause_on_pwrar')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="unwanted_extensions">$T('opt-unwanted_extensions')</label>
|
||||
<input type="text" name="unwanted_extensions" id="unwanted_extensions" value="$unwanted_extensions"/>
|
||||
<span class="desc">$T('explain-unwanted_extensions')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="action_on_unwanted_extensions">$T('opt-action_on_unwanted_extensions')</label>
|
||||
<select name="action_on_unwanted_extensions" id="action_on_unwanted_extensions">
|
||||
@@ -127,12 +137,7 @@
|
||||
</select>
|
||||
<span class="desc">$T('explain-action_on_unwanted_extensions')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="unwanted_extensions">$T('opt-unwanted_extensions')</label>
|
||||
<input type="text" name="unwanted_extensions" id="unwanted_extensions" value="$unwanted_extensions"/>
|
||||
<span class="desc">$T('explain-unwanted_extensions')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="auto_sort">$T('opt-auto_sort')</label>
|
||||
<input type="checkbox" name="auto_sort" id="auto_sort" value="1" <!--#if int($auto_sort) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-auto_sort')</span>
|
||||
@@ -160,53 +165,53 @@
|
||||
<input type="checkbox" name="pause_on_post_processing" id="pause_on_post_processing" value="1" <!--#if int($pause_on_post_processing) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-pause_on_post_processing')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="enable_all_par">$T('opt-enable_all_par')</label>
|
||||
<input type="checkbox" name="enable_all_par" id="enable_all_par" value="1" <!--#if int($enable_all_par) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_all_par').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="par_option">$T('opt-par_option')</label>
|
||||
<input type="text" name="par_option" id="par_option" value="$par_option" />
|
||||
<span class="desc">$T('explain-par_option')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="sfv_check">$T('opt-sfv_check')</label>
|
||||
<input type="checkbox" name="sfv_check" id="sfv_check" value="1" <!--#if int($sfv_check) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-sfv_check')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="safe_postproc">$T('opt-safe_postproc')</label>
|
||||
<input type="checkbox" name="safe_postproc" id="safe_postproc" value="1" <!--#if int($safe_postproc) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-safe_postproc')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="enable_recursive">$T('opt-enable_recursive')</label>
|
||||
<input type="checkbox" name="enable_recursive" id="enable_recursive" value="1" <!--#if int($enable_recursive) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_recursive')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="flat_unpack">$T('opt-flat_unpack')</label>
|
||||
<input type="checkbox" name="flat_unpack" id="flat_unpack" value="1" <!--#if int($flat_unpack) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-flat_unpack')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="script_can_fail">$T('opt-script_can_fail')</label>
|
||||
<input type="checkbox" name="script_can_fail" id="script_can_fail" value="1" <!--#if int($script_can_fail) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-script_can_fail')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="new_nzb_on_failure">$T('opt-new_nzb_on_failure')</label>
|
||||
<input type="checkbox" name="new_nzb_on_failure" id="new_nzb_on_failure" value="1" <!--#if int($new_nzb_on_failure) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-new_nzb_on_failure')</span>
|
||||
</div>
|
||||
<!--#if not $nt#-->
|
||||
<div class="field-pair <!--#if not $have_nice then "disabled" else "" #-->">
|
||||
<div class="field-pair advanced-settings <!--#if not $have_nice then "disabled" else "" #-->">
|
||||
<label class="config" for="nice">$T('opt-nice')</label>
|
||||
<input type="text" name="nice" id="nice" value="$nice" <!--#if not $have_nice then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-nice')</span>
|
||||
</div>
|
||||
<div class="field-pair <!--#if not $have_ionice then "disabled" else "" #-->">
|
||||
<div class="field-pair advanced-settings <!--#if not $have_ionice then "disabled" else "" #-->">
|
||||
<label class="config" for="ionice">$T('opt-ionice')</label>
|
||||
<input type="text" name="ionice" id="ionice" value="$ionice" <!--#if not $have_ionice then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-ionice')</span>
|
||||
@@ -217,7 +222,7 @@
|
||||
<input type="checkbox" name="ignore_samples" id="ignore_samples" value="1" <!--#if int($ignore_samples) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-ignore_samples') $T('igsam-del').</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="enable_meta">$T('opt-enable_meta')</label>
|
||||
<input type="checkbox" name="enable_meta" id="enable_meta" value="1" <!--#if int($enable_meta) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_meta').replace('. ', '.<br/>')</span>
|
||||
@@ -246,7 +251,7 @@
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="section advanced-settings">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-naming') <a href="$helpuri$help_uri#toc4" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
</div><!-- /col2 -->
|
||||
|
||||
@@ -23,16 +23,32 @@ body {
|
||||
overflow: visible;
|
||||
border: 1px solid #dfdede;
|
||||
background-color: #FFF;
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
width: 100%
|
||||
}
|
||||
.section, .Servers form, #addFeed, #addFeedContent {
|
||||
.advanced-button {
|
||||
float: right;
|
||||
width: auto;
|
||||
margin: 0 4px 0px 0px;
|
||||
font-size: 13px;
|
||||
color: inherit;
|
||||
height: auto;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
#advanced-settings-button {
|
||||
float: left;
|
||||
margin: 2px 7px 0px 0px;
|
||||
}
|
||||
.advanced-buttonSeperator {
|
||||
width: 1px;
|
||||
height: 34px;
|
||||
background-color: #dfdede;
|
||||
float: right;
|
||||
margin: 0px 10px;
|
||||
}
|
||||
.section, #addFeed, #addFeedContent {
|
||||
border-bottom: 1px solid #dfdede;
|
||||
overflow: auto;
|
||||
}
|
||||
.section:last-child, .Servers form:last-child {
|
||||
border: 0;
|
||||
}
|
||||
.col2 {
|
||||
z-index: 10;
|
||||
float: left;
|
||||
@@ -150,13 +166,13 @@ input[type="checkbox"]+.desc {
|
||||
overflow: hidden;
|
||||
min-width: 555px;
|
||||
}
|
||||
.field-pair:nth-child(odd),
|
||||
.Key tr:nth-child(odd),
|
||||
.tab-pane tr:nth-child(odd),
|
||||
.even {
|
||||
background-color: #F8F8F8;
|
||||
}
|
||||
.field-pair:last-child {
|
||||
.field-pair:last-child,
|
||||
.no-field-pair-bg {
|
||||
background-color: transparent;
|
||||
}
|
||||
.alt,
|
||||
@@ -298,7 +314,7 @@ tr.separator {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.Categories form.sorting-row:nth-child(even) tr {
|
||||
.Categories form.sorting-row:nth-child(2n-1) tr {
|
||||
background-color: #F8F8F8;
|
||||
}
|
||||
|
||||
@@ -1023,19 +1039,14 @@ input[type="checkbox"] {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.Servers .chart-selector {
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: -7px;
|
||||
left: 50%;
|
||||
width: 120px;
|
||||
margin-left: -40px;
|
||||
min-width: initial;
|
||||
opacity: 0.8;
|
||||
.Servers .chart-selector-container {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.Servers .chart-selector:hover {
|
||||
opacity: 1;
|
||||
.Servers .chart-selector-container .glyphicon {
|
||||
font-size: 1.3em;
|
||||
padding-right: 4px;
|
||||
top: 5px;
|
||||
}
|
||||
|
||||
.Servers .ct-grid.ct-vertical:first-of-type {
|
||||
@@ -1083,9 +1094,10 @@ input[type="checkbox"] {
|
||||
}
|
||||
|
||||
.host-warning {
|
||||
color: #404040;
|
||||
margin-left: 7px;
|
||||
top: 3px;
|
||||
color: #F0AD4E;
|
||||
margin-left: 13px;
|
||||
top: 5px;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.fileBrowser .glyphicon {
|
||||
@@ -1225,7 +1237,9 @@ input[type="checkbox"] {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.Servers .server-chart {
|
||||
.Servers .server-chart,
|
||||
.Servers .chart-selector-container,
|
||||
.Servers .advanced-buttonSeperator {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="608.000000pt" height="608.000000pt" viewBox="0 0 608.000000 608.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
<g transform="translate(0.000000,608.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M1295 5818 c-46 -17 -81 -45 -107 -86 l-23 -37 -5 -1160 -5 -1160
|
||||
-386 -5 -386 -5 -40 -28 c-80 -56 -113 -173 -70 -257 9 -19 91 -113 182 -209
|
||||
91 -96 165 -177 165 -180 -1 -3 -18 -18 -39 -32 -21 -15 -48 -46 -60 -71 -21
|
||||
-43 -21 -54 -21 -514 0 -441 1 -472 19 -507 18 -36 18 -38 0 -74 -17 -33 -19
|
||||
-61 -19 -236 0 -222 6 -245 74 -305 60 -53 76 -54 851 -50 706 3 710 3 751 25
|
||||
26 13 45 18 51 12 5 -5 32 -17 60 -27 46 -15 77 -44 336 -317 157 -165 300
|
||||
-309 319 -320 24 -14 51 -20 98 -20 47 0 74 6 98 20 19 11 162 155 319 320
|
||||
200 211 295 304 321 315 20 8 46 20 56 26 15 9 26 7 55 -10 36 -21 39 -21 781
|
||||
-21 l745 0 45 25 c24 14 58 45 75 68 l30 44 3 746 2 746 -25 51 c-14 29 -40
|
||||
63 -60 77 l-35 25 170 179 c94 98 178 195 188 214 41 84 9 202 -71 257 l-40
|
||||
28 -386 5 -386 5 -5 1162 -5 1161 -30 43 c-16 23 -48 52 -70 63 l-40 21 -1725
|
||||
2 c-1202 1 -1734 -2 -1755 -9z m3215 -1488 l0 -1080 -284 0 -284 0 -53 -28
|
||||
c-39 -20 -62 -41 -84 -77 l-30 -48 -3 -199 -4 -198 -736 0 c-703 0 -739 -1
|
||||
-779 -19 -41 -19 -42 -19 -79 0 -36 18 -64 19 -510 19 l-472 0 -122 128 -122
|
||||
127 239 5 c258 5 269 8 325 67 61 64 58 -6 58 1243 l0 1140 1470 0 1470 0 0
|
||||
-1080z m32 -1562 l3 -273 408 -3 407 -2 0 -690 0 -690 -690 0 -690 0 0 965 0
|
||||
965 280 0 280 0 2 -272z m558 155 c-19 -21 -75 -80 -125 -130 l-90 -93 -67 0
|
||||
-68 0 0 130 0 130 192 0 192 0 -34 -37z m-3010 -573 l0 -140 -410 0 -410 0 0
|
||||
-130 0 -130 408 -2 407 -3 0 -415 0 -415 -692 -3 -693 -2 0 145 0 145 410 0
|
||||
410 0 0 130 0 130 -410 0 -410 0 0 415 0 415 695 0 695 0 0 -140z m1630 -550
|
||||
l0 -690 -690 0 -690 0 0 420 0 420 410 0 410 0 0 130 0 130 -410 0 -410 0 0
|
||||
140 0 140 690 0 690 0 0 -690z m-611 -967 c-35 -38 -66 -68 -69 -68 -3 0 -34
|
||||
30 -69 68 l-63 67 132 0 132 0 -63 -67z"/>
|
||||
<path d="M4547 2203 c-4 -3 -7 -186 -7 -405 l0 -398 130 0 130 0 0 405 0 405
|
||||
-123 0 c-68 0 -127 -3 -130 -7z"/>
|
||||
<path d="M2902 1533 l3 -128 128 -3 127 -3 0 131 0 130 -130 0 -131 0 3 -127z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
6
interfaces/Config/templates/staticcfg/js/filesize.min.js
vendored
Normal file
6
interfaces/Config/templates/staticcfg/js/filesize.min.js
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
/*
|
||||
2017 Jason Mulligan <jason.mulligan@avoidwork.com>
|
||||
@version 3.5.11
|
||||
*/
|
||||
"use strict";!function(i){function e(i){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],d=0,r=void 0,a=void 0,s=void 0,f=void 0,u=void 0,l=void 0,v=void 0,B=void 0,c=void 0,p=void 0,y=void 0,m=void 0,x=void 0,g=void 0;if(isNaN(i))throw new Error("Invalid arguments");return s=!0===e.bits,y=!0===e.unix,a=e.base||2,p=void 0!==e.round?e.round:y?1:2,m=void 0!==e.spacer?e.spacer:y?"":" ",g=e.symbols||e.suffixes||{},x=2===a?e.standard||"jedec":"jedec",c=e.output||"string",u=!0===e.fullform,l=e.fullforms instanceof Array?e.fullforms:[],r=void 0!==e.exponent?e.exponent:-1,B=Number(i),v=B<0,f=a>2?1e3:1024,v&&(B=-B),(-1===r||isNaN(r))&&(r=Math.floor(Math.log(B)/Math.log(f)))<0&&(r=0),r>8&&(r=8),0===B?(n[0]=0,n[1]=y?"":t[x][s?"bits":"bytes"][r]):(d=B/(2===a?Math.pow(2,10*r):Math.pow(1e3,r)),s&&(d*=8)>=f&&r<8&&(d/=f,r++),n[0]=Number(d.toFixed(r>0?p:0)),n[1]=10===a&&1===r?s?"kb":"kB":t[x][s?"bits":"bytes"][r],y&&(n[1]="jedec"===x?n[1].charAt(0):r>0?n[1].replace(/B$/,""):n[1],o.test(n[1])&&(n[0]=Math.floor(n[0]),n[1]=""))),v&&(n[0]=-n[0]),n[1]=g[n[1]]||n[1],"array"===c?n:"exponent"===c?r:"object"===c?{value:n[0],suffix:n[1],symbol:n[1]}:(u&&(n[1]=l[r]?l[r]:b[x][r]+(s?"bit":"byte")+(1===n[0]?"":"s")),n.join(m))}var o=/^(b|B)$/,t={iec:{bits:["b","Kib","Mib","Gib","Tib","Pib","Eib","Zib","Yib"],bytes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},jedec:{bits:["b","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"],bytes:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]}},b={iec:["","kibi","mebi","gibi","tebi","pebi","exbi","zebi","yobi"],jedec:["","kilo","mega","giga","tera","peta","exa","zetta","yotta"]};e.partial=function(i){return function(o){return e(o,i)}},"undefined"!=typeof exports?module.exports=e:"function"==typeof define&&define.amd?define(function(){return e}):i.filesize=e}("undefined"!=typeof window?window:global);
|
||||
//# sourceMappingURL=filesize.min.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -170,6 +170,10 @@
|
||||
<div class="col-sm-2">$T('category')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.category() == '*' ? glitterTranslate.defaultText : historyStatus.category"></div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: historyStatus.password">
|
||||
<div class="col-sm-2">$T('srv-password')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.password"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2">$T('msg-path')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.storage() == '' ? historyStatus.path : historyStatus.storage"></div>
|
||||
|
||||
@@ -150,7 +150,9 @@
|
||||
</div>
|
||||
<div class="row options-function-box">
|
||||
<div class="col-sm-6">
|
||||
<a href="./status/showlog?session=$session" target="_blank" class="btn btn-default"><span class="glyphicon glyphicon-file"></span> $T('link-showLog')</a>
|
||||
<a href="./status/showlog?session=$session" target="_blank" class="btn btn-default" data-tooltip="true" data-placement="top" title="$T('Glitter-logText')">
|
||||
<span class="glyphicon glyphicon-file"></span> $T('link-showLog')
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="input-group" data-tooltip="true" data-placement="top" title="$T('logging')">
|
||||
@@ -173,7 +175,6 @@
|
||||
</div>
|
||||
<div data-bind="foreach: statusInfo.servers">
|
||||
<div class="options-server-box">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-6">$T('swtag-server')</div>
|
||||
<div class="col-sm-6">
|
||||
@@ -650,7 +651,6 @@
|
||||
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purgeremove-failed"><span class="glyphicon glyphicon-floppy-remove"></span> $T('purgeFailed-Files')</button><hr />
|
||||
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purge-completed"><span class="glyphicon glyphicon-floppy-saved"></span> $T('purgeCompl')</button><hr />
|
||||
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purge-page"><span class="glyphicon glyphicon-check"></span> $T('purgePage') <span class="label label-default" data-bind="text: history.historyItems().length"></span></button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -92,21 +92,21 @@
|
||||
</a>
|
||||
</td>
|
||||
<td class="name">
|
||||
<div class="row-wrap-text" data-bind="visible: !editingName()">
|
||||
<span data-bind="text: name, attr: { 'title': name() }"></span>
|
||||
<div class="row-wrap-text" data-bind="visible: !editingName(), css: { 'direct-unpack-text': direct_unpack }">
|
||||
<span data-bind="text: name, attr: { 'title': name_title }"></span>
|
||||
<!-- ko if: password() -->
|
||||
<small class="queue-item-password">
|
||||
<span class="glyphicon glyphicon-lock"></span>
|
||||
<span data-bind="text: password"></span>
|
||||
</small>
|
||||
<!-- /ko -->
|
||||
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack" title="$T('opt-direct_unpack')">
|
||||
<span class="glyphicon glyphicon-compressed"></span> <span data-bind="text: direct_unpack"></span>
|
||||
</div>
|
||||
</div>
|
||||
<form data-bind="submit: editingNameSubmit">
|
||||
<input type="text" data-bind="value: nameForEdit, visible: editingName(), hasfocus: editingName" />
|
||||
</form>
|
||||
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack">
|
||||
<span class="glyphicon glyphicon-compressed"></span> <span data-bind="text: direct_unpack"></span>
|
||||
</div>
|
||||
<div class="name-options" data-bind="visible: !editingName(), css: { disabled: isGrabbing() }">
|
||||
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToTop" title="$T('Glitter-top')"><span class="glyphicon glyphicon-chevron-up"></span></a>
|
||||
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToBottom" title="$T('Glitter-bottom')"><span class="glyphicon glyphicon-chevron-down"></span></a>
|
||||
@@ -133,8 +133,8 @@
|
||||
<label data-bind="visible: parent.isMultiEditing()">
|
||||
<input type="checkbox" name="multiedit" title="$T('Glitter-multiSelect')" data-bind="click: parent.addMultiEdit, attr: { 'id': 'multiedit_' + id } " />
|
||||
</label>
|
||||
<!-- ko if: !isGrabbing() -->
|
||||
<div class="dropdown" data-bind="visible: !isGrabbing() && !parent.isMultiEditing()">
|
||||
<!-- ko if: !isGrabbing() -->
|
||||
<div class="dropdown" data-bind="visible: !parent.isMultiEditing()">
|
||||
<a href="#" data-toggle="dropdown" data-bind="click: toggleDropdown">
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
@@ -144,7 +144,7 @@
|
||||
<span class="glyphicon glyphicon-tag"></span>
|
||||
<select name="Category" class="form-control" data-bind="options: parent.categoriesList, optionsValue: 'catValue', optionsText: 'catText', value: category, event: { change: changeCat }"></select>
|
||||
</li>
|
||||
<!-- ko if: (status() != 'Fetching') -->
|
||||
<!-- ko if: !isFetchingBlocks -->
|
||||
<li title="$T('priority')" data-tooltip="true" data-placement="left">
|
||||
<span class="glyphicon glyphicon-sort-by-attributes-alt"></span>
|
||||
<select name="Priority" class="form-control" data-bind="options: parent.priorityOptions, optionsValue: 'value', optionsText: 'name', value: priority, event: { change: changePriority }"></select>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="./staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="./staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="./staticcfg/ico/android-192x192.png" />
|
||||
<link rel="mask-icon" href="./staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
|
||||
<link rel="shortcut icon" type="image/ico" href="./staticcfg/ico/favicon.ico?v=$version" data-bind="attr: { 'href': SABIcon }" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./static/bootstrap/css/bootstrap.min.css?v=$version" />
|
||||
@@ -86,6 +87,7 @@
|
||||
glitterTranslate.moreText = "$T('Glitter-more')";
|
||||
|
||||
glitterTranslate.status = [];
|
||||
glitterTranslate.status['DirectUnpack'] = "$T('opt-direct_unpack')";
|
||||
glitterTranslate.status['Completed'] = "$T('post-Completed')";
|
||||
glitterTranslate.status['Failed'] = "$T('post-Failed')";
|
||||
glitterTranslate.status['Queued'] = "$T('post-Queued')";
|
||||
|
||||
@@ -134,7 +134,7 @@ function displayDateTime(inDate, outFormat, inFormat) {
|
||||
if(outFormat == 'fromNow') {
|
||||
return theMoment.fromNow()
|
||||
} else {
|
||||
return theMoment.format(outFormat)
|
||||
return theMoment.local().format(outFormat)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -550,7 +550,7 @@ function ViewModel() {
|
||||
var warningData = {
|
||||
index: index,
|
||||
type: glitterTranslate.status[warning.type].slice(0, -1),
|
||||
text: warning.text.replace(/ /g, '\u00A0').replace(/(?:\r\n|\r|\n)/g, '<br />'),
|
||||
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
|
||||
@@ -785,15 +785,28 @@ function ViewModel() {
|
||||
}
|
||||
|
||||
// Update the servers
|
||||
if(self.statusInfo.servers().length == 0) {
|
||||
if(self.statusInfo.servers().length != data.status.servers.length) {
|
||||
// Only now we can subscribe to the log-level-changes! (only at start)
|
||||
if(self.statusInfo.servers().length == 0) {
|
||||
self.statusInfo.loglevel.subscribe(function(newValue) {
|
||||
// Update log-level
|
||||
callSpecialAPI('./status/change_loglevel/', {
|
||||
loglevel: newValue
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
// Empty them, in case of update
|
||||
self.statusInfo.servers([])
|
||||
|
||||
// Initial add
|
||||
$.each(data.status.servers, function() {
|
||||
self.statusInfo.servers.push({
|
||||
'servername': this.servername,
|
||||
'serveroptional': this.serveroptional,
|
||||
'serverpriority': this.serverpriority,
|
||||
'servertotalconn': this.servertotalconn,
|
||||
'serverssl': this.serverssl,
|
||||
'servername': ko.observable(this.servername),
|
||||
'serveroptional': ko.observable(this.serveroptional),
|
||||
'serverpriority': ko.observable(this.serverpriority),
|
||||
'servertotalconn': ko.observable(this.servertotalconn),
|
||||
'serverssl': ko.observable(this.serverssl),
|
||||
'serversslinfo': ko.observable(this.serversslinfo),
|
||||
'serveractiveconn': ko.observable(this.serveractiveconn),
|
||||
'servererror': ko.observable(this.servererror),
|
||||
@@ -801,23 +814,20 @@ function ViewModel() {
|
||||
'serverconnections': ko.observableArray(this.serverconnections)
|
||||
})
|
||||
})
|
||||
|
||||
// Only now we can subscribe to the log-level-changes!
|
||||
self.statusInfo.loglevel.subscribe(function(newValue) {
|
||||
// Update log-level
|
||||
callSpecialAPI('./status/change_loglevel/', {
|
||||
loglevel: newValue
|
||||
});
|
||||
})
|
||||
} else {
|
||||
// Update
|
||||
$.each(data.status.servers, function(index) {
|
||||
var activeServer = self.statusInfo.servers()[index];
|
||||
activeServer.serveractiveconn(this.serveractiveconn)
|
||||
activeServer.servererror(this.servererror)
|
||||
activeServer.serveractive(this.serveractive)
|
||||
activeServer.servername(this.servername),
|
||||
activeServer.serveroptional(this.serveroptional),
|
||||
activeServer.serverpriority(this.serverpriority),
|
||||
activeServer.servertotalconn(this.servertotalconn),
|
||||
activeServer.serverssl(this.serverssl),
|
||||
activeServer.serversslinfo(this.serversslinfo),
|
||||
activeServer.serveractiveconn(this.serveractiveconn),
|
||||
activeServer.servererror(this.servererror),
|
||||
activeServer.serveractive(this.serveractive),
|
||||
activeServer.serverconnections(this.serverconnections)
|
||||
activeServer.serversslinfo(this.serversslinfo)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -479,6 +479,7 @@ function QueueModel(parent, data) {
|
||||
self.index = ko.observable(data.index);
|
||||
self.status = ko.observable(data.status);
|
||||
self.isGrabbing = ko.observable(data.status == 'Grabbing' || data.avg_age == '-')
|
||||
self.isFetchingBlocks = data.status == 'Fetching' || data.priority == 'Repair' // No need to update
|
||||
self.totalMB = ko.observable(parseFloat(data.mb));
|
||||
self.remainingMB = ko.observable(parseFloat(data.mbleft))
|
||||
self.missingMB = ko.observable(parseFloat(data.mbmissing))
|
||||
@@ -521,7 +522,14 @@ function QueueModel(parent, data) {
|
||||
})
|
||||
|
||||
// Texts
|
||||
self.missingText= ko.pureComputed(function() {
|
||||
self.name_title = ko.pureComputed(function() {
|
||||
// When hovering over the job
|
||||
if(self.direct_unpack()) {
|
||||
return self.name() + ' - ' + glitterTranslate.status['DirectUnpack'] + ': ' + self.direct_unpack()
|
||||
}
|
||||
return self.name()
|
||||
})
|
||||
self.missingText = ko.pureComputed(function() {
|
||||
// Check for missing data, the value is arbitrary! (1%)
|
||||
if(self.missingMB()/self.totalMB() > 0.01) {
|
||||
return self.missingMB().toFixed(0) + ' MB ' + glitterTranslate.misingArt
|
||||
@@ -692,7 +700,7 @@ function QueueModel(parent, data) {
|
||||
}
|
||||
self.changePriority = function(item, event) {
|
||||
// Not if we are fetching extra blocks for repair!
|
||||
if(item.status() == 'Fetching') return
|
||||
if(item.isFetchingBlocks) return
|
||||
callAPI({
|
||||
mode: 'queue',
|
||||
name: 'priority',
|
||||
|
||||
8
interfaces/Glitter/templates/static/javascripts/moment.min.js
vendored
Normal file → Executable file
8
interfaces/Glitter/templates/static/javascripts/moment.min.js
vendored
Normal file → Executable file
File diff suppressed because one or more lines are too long
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/da.js
Normal file → Executable file
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/da.js
Normal file → Executable file
@@ -19,7 +19,7 @@ var da = moment.defineLocale('da', {
|
||||
longDateFormat : {
|
||||
LT : 'HH:mm',
|
||||
LTS : 'HH:mm:ss',
|
||||
L : 'DD/MM/YYYY',
|
||||
L : 'DD.MM.YYYY',
|
||||
LL : 'D. MMMM YYYY',
|
||||
LLL : 'D. MMMM YYYY HH:mm',
|
||||
LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'
|
||||
|
||||
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/de.js
Normal file → Executable file
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/de.js
Normal file → Executable file
@@ -28,7 +28,7 @@ function processRelativeTime(number, withoutSuffix, key, isFuture) {
|
||||
|
||||
var de = moment.defineLocale('de', {
|
||||
months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
|
||||
monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
|
||||
monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
|
||||
monthsParseExact : true,
|
||||
weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
|
||||
weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
|
||||
|
||||
11
interfaces/Glitter/templates/static/javascripts/momentjs_locale/es.js
Normal file → Executable file
11
interfaces/Glitter/templates/static/javascripts/momentjs_locale/es.js
Normal file → Executable file
@@ -13,6 +13,9 @@
|
||||
var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
|
||||
var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
|
||||
|
||||
var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];
|
||||
var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;
|
||||
|
||||
var es = moment.defineLocale('es', {
|
||||
months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
|
||||
monthsShort : function (m, format) {
|
||||
@@ -24,7 +27,13 @@ var es = moment.defineLocale('es', {
|
||||
return monthsShortDot[m.month()];
|
||||
}
|
||||
},
|
||||
monthsParseExact : true,
|
||||
monthsRegex : monthsRegex,
|
||||
monthsShortRegex : monthsRegex,
|
||||
monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
|
||||
monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
|
||||
monthsParse : monthsParse,
|
||||
longMonthsParse : monthsParse,
|
||||
shortMonthsParse : monthsParse,
|
||||
weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
|
||||
weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
|
||||
weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
|
||||
|
||||
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/fi.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/fi.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/fr.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/fr.js
Normal file → Executable file
99
interfaces/Glitter/templates/static/javascripts/momentjs_locale/he.js
Executable file
99
interfaces/Glitter/templates/static/javascripts/momentjs_locale/he.js
Executable file
@@ -0,0 +1,99 @@
|
||||
//! moment.js locale configuration
|
||||
//! locale : Hebrew [he]
|
||||
//! author : Tomer Cohen : https://github.com/tomer
|
||||
//! author : Moshe Simantov : https://github.com/DevelopmentIL
|
||||
//! author : Tal Ater : https://github.com/TalAter
|
||||
|
||||
;(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined'
|
||||
&& typeof require === 'function' ? factory(require('../moment')) :
|
||||
typeof define === 'function' && define.amd ? define(['../moment'], factory) :
|
||||
factory(global.moment)
|
||||
}(this, (function (moment) { 'use strict';
|
||||
|
||||
|
||||
var he = moment.defineLocale('he', {
|
||||
months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
|
||||
monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
|
||||
weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
|
||||
weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
|
||||
weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
|
||||
longDateFormat : {
|
||||
LT : 'HH:mm',
|
||||
LTS : 'HH:mm:ss',
|
||||
L : 'DD/MM/YYYY',
|
||||
LL : 'D [ב]MMMM YYYY',
|
||||
LLL : 'D [ב]MMMM YYYY HH:mm',
|
||||
LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
|
||||
l : 'D/M/YYYY',
|
||||
ll : 'D MMM YYYY',
|
||||
lll : 'D MMM YYYY HH:mm',
|
||||
llll : 'ddd, D MMM YYYY HH:mm'
|
||||
},
|
||||
calendar : {
|
||||
sameDay : '[היום ב־]LT',
|
||||
nextDay : '[מחר ב־]LT',
|
||||
nextWeek : 'dddd [בשעה] LT',
|
||||
lastDay : '[אתמול ב־]LT',
|
||||
lastWeek : '[ביום] dddd [האחרון בשעה] LT',
|
||||
sameElse : 'L'
|
||||
},
|
||||
relativeTime : {
|
||||
future : 'בעוד %s',
|
||||
past : 'לפני %s',
|
||||
s : 'מספר שניות',
|
||||
m : 'דקה',
|
||||
mm : '%d דקות',
|
||||
h : 'שעה',
|
||||
hh : function (number) {
|
||||
if (number === 2) {
|
||||
return 'שעתיים';
|
||||
}
|
||||
return number + ' שעות';
|
||||
},
|
||||
d : 'יום',
|
||||
dd : function (number) {
|
||||
if (number === 2) {
|
||||
return 'יומיים';
|
||||
}
|
||||
return number + ' ימים';
|
||||
},
|
||||
M : 'חודש',
|
||||
MM : function (number) {
|
||||
if (number === 2) {
|
||||
return 'חודשיים';
|
||||
}
|
||||
return number + ' חודשים';
|
||||
},
|
||||
y : 'שנה',
|
||||
yy : function (number) {
|
||||
if (number === 2) {
|
||||
return 'שנתיים';
|
||||
} else if (number % 10 === 0 && number !== 10) {
|
||||
return number + ' שנה';
|
||||
}
|
||||
return number + ' שנים';
|
||||
}
|
||||
},
|
||||
meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
|
||||
isPM : function (input) {
|
||||
return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
|
||||
},
|
||||
meridiem : function (hour, minute, isLower) {
|
||||
if (hour < 5) {
|
||||
return 'לפנות בוקר';
|
||||
} else if (hour < 10) {
|
||||
return 'בבוקר';
|
||||
} else if (hour < 12) {
|
||||
return isLower ? 'לפנה"צ' : 'לפני הצהריים';
|
||||
} else if (hour < 18) {
|
||||
return isLower ? 'אחה"צ' : 'אחרי הצהריים';
|
||||
} else {
|
||||
return 'בערב';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return he;
|
||||
|
||||
})));
|
||||
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/nb.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/nb.js
Normal file → Executable file
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/nl.js
Normal file → Executable file
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/nl.js
Normal file → Executable file
@@ -40,7 +40,7 @@ var nl = moment.defineLocale('nl', {
|
||||
|
||||
weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
|
||||
weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
|
||||
weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
|
||||
weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'),
|
||||
weekdaysParseExact : true,
|
||||
longDateFormat : {
|
||||
LT : 'HH:mm',
|
||||
|
||||
19
interfaces/Glitter/templates/static/javascripts/momentjs_locale/pl.js
Normal file → Executable file
19
interfaces/Glitter/templates/static/javascripts/momentjs_locale/pl.js
Normal file → Executable file
@@ -63,7 +63,24 @@ var pl = moment.defineLocale('pl', {
|
||||
calendar : {
|
||||
sameDay: '[Dziś o] LT',
|
||||
nextDay: '[Jutro o] LT',
|
||||
nextWeek: '[W] dddd [o] LT',
|
||||
nextWeek: function () {
|
||||
switch (this.day()) {
|
||||
case 0:
|
||||
return '[W niedzielę o] LT';
|
||||
|
||||
case 2:
|
||||
return '[We wtorek o] LT';
|
||||
|
||||
case 3:
|
||||
return '[W środę o] LT';
|
||||
|
||||
case 6:
|
||||
return '[W sobotę o] LT';
|
||||
|
||||
default:
|
||||
return '[W] dddd [o] LT';
|
||||
}
|
||||
},
|
||||
lastDay: '[Wczoraj o] LT',
|
||||
lastWeek: function () {
|
||||
switch (this.day()) {
|
||||
|
||||
5
interfaces/Glitter/templates/static/javascripts/momentjs_locale/pt-br.js
Normal file → Executable file
5
interfaces/Glitter/templates/static/javascripts/momentjs_locale/pt-br.js
Normal file → Executable file
@@ -11,8 +11,8 @@
|
||||
|
||||
|
||||
var ptBr = moment.defineLocale('pt-br', {
|
||||
months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
|
||||
monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
|
||||
months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
|
||||
monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
|
||||
weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
|
||||
weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
|
||||
weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
|
||||
@@ -41,6 +41,7 @@ var ptBr = moment.defineLocale('pt-br', {
|
||||
future : 'em %s',
|
||||
past : '%s atrás',
|
||||
s : 'poucos segundos',
|
||||
ss : '%d segundos',
|
||||
m : 'um minuto',
|
||||
mm : '%d minutos',
|
||||
h : 'uma hora',
|
||||
|
||||
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/ro.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/ro.js
Normal file → Executable file
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/ru.js
Normal file → Executable file
2
interfaces/Glitter/templates/static/javascripts/momentjs_locale/ru.js
Normal file → Executable file
@@ -174,7 +174,7 @@ var ru = moment.defineLocale('ru', {
|
||||
},
|
||||
week : {
|
||||
dow : 1, // Monday is the first day of the week.
|
||||
doy : 7 // The week that contains Jan 1st is the first week of the year.
|
||||
doy : 4 // The week that contains Jan 4th is the first week of the year.
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/sr.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/sr.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/sv.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/sv.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/zh-cn.js
Normal file → Executable file
0
interfaces/Glitter/templates/static/javascripts/momentjs_locale/zh-cn.js
Normal file → Executable file
@@ -184,6 +184,7 @@ td.name .name-icons span,
|
||||
.navbar-nav .open .dropdown-menu>li>a,
|
||||
.dropdown-header,
|
||||
#modal-help small,
|
||||
.hover-button.glyphicon-forward,
|
||||
pre {
|
||||
color: #EBEBEB !important;
|
||||
opacity: 1 !important;
|
||||
|
||||
@@ -633,9 +633,17 @@ td.name .row-wrap-text {
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.queue-table td.name .direct-unpack-text {
|
||||
max-width: calc(100% - 75px);
|
||||
}
|
||||
|
||||
.queue-table td.name:hover .row-wrap-text {
|
||||
max-width: calc(100% - 125px);
|
||||
/* Change for each size! */
|
||||
/* Change for each size! */
|
||||
}
|
||||
|
||||
.queue-table td.name:hover .direct-unpack {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.queue-table td.name:hover .name-options {
|
||||
@@ -764,8 +772,8 @@ tr.queue-item>td:first-child>a {
|
||||
line-height: 24px;
|
||||
overflow: visible;
|
||||
margin-bottom: 0;
|
||||
box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.3);
|
||||
-webkit-box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.3);
|
||||
box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.2);
|
||||
-webkit-box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.progress>span,
|
||||
@@ -1859,7 +1867,6 @@ input[name="nzbURL"] {
|
||||
td.name .name-icons {
|
||||
margin-left: 0px;
|
||||
margin-right: -5px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
td.name .row-wrap-text {
|
||||
@@ -1887,7 +1894,6 @@ input[name="nzbURL"] {
|
||||
.history-queue-swicher .nav-tabs>li>a {
|
||||
border-bottom: inherit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
@@ -1899,7 +1905,6 @@ input[name="nzbURL"] {
|
||||
min-width: 715px;
|
||||
}
|
||||
|
||||
|
||||
.queue .sortable-placeholder td {
|
||||
padding: 9px 0px 8px !important;
|
||||
}
|
||||
|
||||
@@ -141,8 +141,12 @@ tr.queue-item>td:first-child>a {
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.queue-table td.name .direct-unpack {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.queue-table td.name .name-options {
|
||||
display: block;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.queue-table td.name .name-options small {
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="${path}staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="${path}staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="${path}staticcfg/ico/android-192x192.png" />
|
||||
<link rel="mask-icon" href="${path}staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
|
||||
|
||||
<script type="text/javascript" src="${path}static/javascripts/lib.js?$version"></script>
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 729 B After Width: | Height: | Size: 726 B |
@@ -20,6 +20,7 @@
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="./staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="./staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="./staticcfg/ico/android-192x192.png" />
|
||||
<link rel="mask-icon" href="./staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
|
||||
|
||||
<script type="text/javascript" src="static/MochiKit/MochiKit.js"></script>
|
||||
<script type="text/javascript" src="static/PlotKit/PlotKit.js"></script>
|
||||
@@ -78,7 +79,6 @@
|
||||
input = input.replace(/%0e/g,'05');
|
||||
input = input.replace(/%e/g,'5');
|
||||
input = input.replace(/%fn/g,'$T("sort-File")');
|
||||
input = input.replace(/%dn/g,'$T("sort-Folder")');
|
||||
|
||||
document.getElementById('previewtv').innerHTML = getOutput(input);
|
||||
}
|
||||
|
||||
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.*");
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
<input type="radio" name="lang" id="$l" value="$l" <!--#if $lang == $l then 'checked="checked"' else ''#--> />
|
||||
</label>
|
||||
<!--#end for#-->
|
||||
<!--#if not $languages#-->
|
||||
<hr>
|
||||
No language files detected. Please run <code>python tools/make_mo.py</code> once and restart SABnzbd, or contact your package provider.
|
||||
<!--#end if#-->
|
||||
<div class="spacer"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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. ;-)
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-2.3.0-develop\n"
|
||||
"Project-Id-Version: SABnzbd-2.4.0-develop\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: shypike@sabnzbd.org\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ASCII\n"
|
||||
"Content-Transfer-Encoding: 7bit\n"
|
||||
"POT-Creation-Date: 2017-09-10 21:44+W. Europe Daylight Time\n"
|
||||
"POT-Creation-Date: 2017-12-06 10:56+W. Europe Standard Time\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
|
||||
@@ -372,10 +372,6 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr ""
|
||||
@@ -392,10 +388,6 @@ msgstr ""
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr ""
|
||||
@@ -542,6 +534,12 @@ msgstr ""
|
||||
msgid "Email succeeded"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr ""
|
||||
@@ -676,6 +674,10 @@ msgstr ""
|
||||
msgid "Incorrect parameter"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid "Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
@@ -704,7 +706,7 @@ msgstr ""
|
||||
msgid "m"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr ""
|
||||
|
||||
@@ -732,6 +734,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -907,6 +913,7 @@ msgstr ""
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -932,10 +939,6 @@ msgstr ""
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
msgstr ""
|
||||
@@ -1042,11 +1045,6 @@ msgstr ""
|
||||
msgid "Not available"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr ""
|
||||
@@ -1055,7 +1053,7 @@ msgstr ""
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr ""
|
||||
|
||||
@@ -1392,7 +1390,7 @@ msgstr ""
|
||||
msgid "Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr ""
|
||||
|
||||
@@ -1412,6 +1410,10 @@ msgstr ""
|
||||
msgid "Completed Download Folder %s is on FAT file system, limiting maximum file size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid "Module subprocessww missing. Expect problems with Unicoded file and directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1440,10 +1442,6 @@ msgstr ""
|
||||
msgid "Failed to move files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr ""
|
||||
@@ -1464,7 +1462,7 @@ msgstr ""
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr ""
|
||||
|
||||
@@ -3248,7 +3246,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr ""
|
||||
|
||||
@@ -3704,6 +3702,22 @@ msgstr ""
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr ""
|
||||
@@ -3844,6 +3858,10 @@ msgstr ""
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr ""
|
||||
@@ -3913,7 +3931,7 @@ msgid "Original Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3932,10 +3950,6 @@ msgstr ""
|
||||
msgid "file"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr ""
|
||||
@@ -4104,6 +4118,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr ""
|
||||
@@ -4268,6 +4286,10 @@ msgstr ""
|
||||
msgid "Refresh"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "All usernames, passwords and API-keys are automatically removed from the log and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr ""
|
||||
@@ -4412,10 +4434,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr ""
|
||||
@@ -4620,16 +4638,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr ""
|
||||
|
||||
|
||||
137
po/main/da.po
137
po/main/da.po
@@ -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-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
|
||||
"PO-Revision-Date: 2017-10-27 21:53+0000\n"
|
||||
"Last-Translator: Søren <Unknown>\n"
|
||||
"Language-Team: Danish <da@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -29,11 +29,14 @@ msgstr "Kan ikke finde webskabeloner: %s, forsøger med standardskabelon"
|
||||
msgid ""
|
||||
"SABYenc disabled: no correct version found! (Found v%s, expecting v%s)"
|
||||
msgstr ""
|
||||
"SABYenc deaktiveret: Der blev ikke fundet nogen korrekt version (Fandt v%s, "
|
||||
"forventede v%s)"
|
||||
|
||||
#: SABnzbd.py [Warning message]
|
||||
msgid ""
|
||||
"SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc"
|
||||
msgstr ""
|
||||
"SABYenc modul... IKKE fundet! Forventede v%s - https://sabnzbd.org/sabyenc"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "_yenc module... NOT found!"
|
||||
@@ -45,11 +48,11 @@ msgstr "par2 binær... IKKE fundet!"
|
||||
|
||||
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
|
||||
msgid "Verification and repair will not be possible."
|
||||
msgstr ""
|
||||
msgstr "Verificering og reperation er ikke muligt."
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
msgstr ""
|
||||
msgstr "MultiPar binær... IKKE fundet!"
|
||||
|
||||
#: SABnzbd.py [Warning message]
|
||||
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
|
||||
@@ -57,7 +60,7 @@ msgstr "Din Unrar version er %s, vi anbefaler version %s eller højere.<br />"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Downloads will not unpacked."
|
||||
msgstr ""
|
||||
msgstr "Downloads vil ikke blive udpakket."
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "unrar binary... NOT found"
|
||||
@@ -398,10 +401,6 @@ msgstr "Beskadigede historik database, skabte tom udskiftning"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL Kommando mislykkedes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL Commit mislykkedes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Det lykkedes ikke at lukke databasen, se logg"
|
||||
@@ -418,10 +417,6 @@ msgstr "Afkodning af %s mislykkedes"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Dekoder fejl: Ikke mere hukommelse"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC Fejl i %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Forkert udformet yEnc artikel i %s"
|
||||
@@ -572,6 +567,12 @@ msgstr "Det lykkedes ikke at lukke e-mail tilslutning"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail afsendelse mislykkedes"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sende, mangler nødvendige data"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Kan ikke finde e-mail skabeloner i %s"
|
||||
@@ -739,6 +740,11 @@ msgstr "Udefineret server"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Fejl parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Tilbage"
|
||||
@@ -767,7 +773,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Kan ikke oprette mappe %s"
|
||||
|
||||
@@ -797,6 +803,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Det lykkedes ikke at ændre rettigheder på %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Køre script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -972,6 +982,7 @@ msgstr "Starter reparation"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par verificering mislykkedes på %s, mens QuickCheck lykkedes"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1000,10 +1011,6 @@ msgstr "[%s] Bekræftelse i %s, alle filer er ok"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Bekræftelse i %s, kræver reparation"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1113,11 +1120,6 @@ msgstr "Andre beskeder"
|
||||
msgid "Not available"
|
||||
msgstr "Ikke tilgængelig"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sende, mangler nødvendige data"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Kunne ikke sende Prowl besked"
|
||||
@@ -1126,7 +1128,7 @@ msgstr "Kunne ikke sende Prowl besked"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Dårlig respons fra pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Det lykkedes ikke at sende pushover besked"
|
||||
|
||||
@@ -1497,7 +1499,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Alvorlig fejl"
|
||||
|
||||
@@ -1519,6 +1521,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Overførslen kan mislykkes, kun %s af det krævede %s tilgængelig"
|
||||
@@ -1547,10 +1555,6 @@ msgstr "Det lykkedes ikke at omdøbe \"%s\" til \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Kunne ikke flytte filer"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Køre script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Kør bruger script %s"
|
||||
@@ -1571,7 +1575,7 @@ msgstr "Mere"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Efterbehandling mislykkedes for %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "se logfil"
|
||||
|
||||
@@ -3498,7 +3502,7 @@ msgstr "SSL-chifre"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "Øge ydeevnen ved at tvinge en lavere SSL-kryptering styrke."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maksimalt antal forsøg"
|
||||
|
||||
@@ -3975,6 +3979,22 @@ msgstr "Enhed(er)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Enhed(er) som meddelelse skal sendes til"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4126,6 +4146,10 @@ msgstr "1x05 Episodemappe"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Episodemappe"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
@@ -4195,8 +4219,8 @@ msgid "Original Filename"
|
||||
msgstr "Originalfilnavn"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Orginal Mappenavn"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4214,10 +4238,6 @@ msgstr "tekst"
|
||||
msgid "file"
|
||||
msgstr "fil"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "mappe"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Sorteringsstreng"
|
||||
@@ -4394,6 +4414,10 @@ msgstr "I tilfælde af SABnzbd genstart vil denne skærm forsvinde automatisk!"
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Opdateringsfrekvens"
|
||||
@@ -4562,6 +4586,12 @@ msgstr "Pause i..."
|
||||
msgid "Refresh"
|
||||
msgstr "Opdatere"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortere efter alder <small>Ældst→Nyeste</small>"
|
||||
@@ -4710,10 +4740,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Bloker genopfriskninger ved at hænge over"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Upload"
|
||||
@@ -4934,16 +4960,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Har du ingen usenet leverandør? Vi anbefaler at prøve %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Det lykkedes ikke at hente TV info (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Det lykkedes ikke at omdøbe: %s til %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Kunne ikke omdøbe lignende fil: %s til %s"
|
||||
|
||||
@@ -4978,6 +5004,12 @@ msgstr "URL hentning mislykkedes; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Mappen \"%s\" findes ikke"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL Commit mislykkedes, se logg"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC Fejl i %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Fejl: Ingen sekundær bruger grænseflade defineret."
|
||||
|
||||
@@ -5033,6 +5065,9 @@ msgstr "URL hentning mislykkedes; %s"
|
||||
#~ msgid "Unpacking failed, an expected file was not unpacked"
|
||||
#~ msgstr "Udpakning mislykkedes, en ventet fil er ikke udpakket"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Mislykkedes med importering af OpenSSL modul. Tilslutter uden SSL"
|
||||
|
||||
@@ -5379,6 +5414,12 @@ msgstr "URL hentning mislykkedes; %s"
|
||||
#~ msgid "Show times in AM/PM notation (does not affect scheduler)."
|
||||
#~ msgstr "Vis tider i AM / PM notation (påvirker ikke skemalægger)."
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "mappe"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Orginal Mappenavn"
|
||||
|
||||
#~ msgid "Groups / Indexer tags"
|
||||
#~ msgstr "Gruppe / Index tags"
|
||||
|
||||
|
||||
138
po/main/de.po
138
po/main/de.po
@@ -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-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-08-24 15:39+0000\n"
|
||||
"Last-Translator: jcfp <Unknown>\n"
|
||||
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
|
||||
"PO-Revision-Date: 2017-10-10 19:03+0000\n"
|
||||
"Last-Translator: Robin Munkittrick <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-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
@@ -416,10 +416,6 @@ msgstr "Verlaufsdatenbank geschädigt, eine leere neue wurde erstellt"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL-Befehl fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL-Commit fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr ""
|
||||
@@ -437,10 +433,6 @@ msgstr "Fehler beim Dekodieren von %s."
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Decoder Fehler: Nicht genügend Speicher"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC-Fehler in %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Ungültiger yEnc-Artikel in %s"
|
||||
@@ -594,6 +586,12 @@ msgstr "Schliessen der Mail-Verbindung fehlgeschlagen"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-Mail erfolgreich versendet"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Absenden nicht möglich, benötigte Daten fehlen"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "In %s konnten keine E-Mail-Vorlagen gefunden werden"
|
||||
@@ -763,6 +761,11 @@ msgstr "Undefinierter Server!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Fehlerhafter Parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Zurück"
|
||||
@@ -791,7 +794,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Verzeichnis %s konnte nicht angelegt werden"
|
||||
|
||||
@@ -824,6 +827,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Rechte von %s konnten nicht geändert werden"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ausführen des Skripts"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -1003,6 +1010,7 @@ msgstr ""
|
||||
"Par-Verifikation für \"%s\" fehlgeschlagen, obwohl der QuickCheck "
|
||||
"erfolgreich war"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1031,10 +1039,6 @@ msgstr "[%s] Überprüft in %s. Alle Dateien fehlerfrei."
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Überprüft in %s. Reparatur wird benötigt."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hauptpaket nicht gefunden …"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1083,7 +1087,7 @@ msgstr "Überprüfen"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr ""
|
||||
msgstr "Überprüfe zusätzliche Dateien"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
@@ -1092,7 +1096,7 @@ msgstr "Wird überprüft"
|
||||
|
||||
#: sabnzbd/newsunpack.py [Error message]
|
||||
msgid "Python script \"%s\" does not have execute (+x) permission set"
|
||||
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführenrechte (+x)"
|
||||
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführungsrechte (+x)"
|
||||
|
||||
#: sabnzbd/newswrapper.py
|
||||
msgid "This server does not allow SSL on this port"
|
||||
@@ -1151,11 +1155,6 @@ msgstr "Andere Nachrichten"
|
||||
msgid "Not available"
|
||||
msgstr "Nicht verfügbar"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Absenden nicht möglich, benötigte Daten fehlen"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Konnte Prowl-Nachricht nicht versenden"
|
||||
@@ -1164,7 +1163,7 @@ msgstr "Konnte Prowl-Nachricht nicht versenden"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Konnte Pushover-Nachricht nicht versenden"
|
||||
|
||||
@@ -1549,7 +1548,7 @@ msgstr ""
|
||||
"Konnte nicht an Port %s auf %s starten. Eine andere Software nutzt diesen "
|
||||
"Port oder SABnzbd läuft bereits."
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Schwerwiegender Fehler"
|
||||
|
||||
@@ -1576,6 +1575,14 @@ msgstr ""
|
||||
"Download-Ordner %s für abgeschlossene Downloads auf FAT Dateisystem, ist "
|
||||
"auf maximale Dateigröße von 4GB begrenzt."
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
"Modul subprocessww fehlt. Fehler mit Unikodierter Datei und Verzeichnisnamen "
|
||||
"in den Downloads sind zu erwarten."
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1605,10 +1612,6 @@ msgstr "Fehler beim Umbenennen von \"%s\" nach \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Dateien verschieben fehlgeschlagen"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ausführen des Skripts"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Ausführen des Benutzer-Skripts %s"
|
||||
@@ -1629,7 +1632,7 @@ msgstr "Mehr"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Nachbearbeitung von %s fehlgeschlagen (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "Beachten Sie die Protokolldatei"
|
||||
|
||||
@@ -2804,6 +2807,8 @@ msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
"Wenn der SABnzbd Host oder Port im Netz freigegeben ist, lassen die "
|
||||
"gegenwärtigen Einstellung vollen zugriff auf die SABnzbd Oberfläche zu."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
@@ -3595,7 +3600,7 @@ msgstr ""
|
||||
"Die Performanz verbessern, indem eine schwächere SSL-Verschlüsselung "
|
||||
"erzwungen wird."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maximale Wiederholungen"
|
||||
|
||||
@@ -3876,7 +3881,7 @@ msgstr "Höchstens"
|
||||
|
||||
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"]
|
||||
msgid "From SxxEyy"
|
||||
msgstr "Von SxxExx"
|
||||
msgstr "Von SxxEyy"
|
||||
|
||||
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"]
|
||||
msgid "From Show SxxEyy"
|
||||
@@ -4080,6 +4085,22 @@ msgstr "Gerät(e)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Geräte, welche die Nachrichten empfangen sollen"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "Wie oft die selbe benachrichtigung (in Sekunden) geschickt wird."
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4233,6 +4254,10 @@ msgstr "1x05 Episoden-Ordner"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Episoden-Ordner"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
@@ -4302,8 +4327,8 @@ msgid "Original Filename"
|
||||
msgstr "Ursprünglicher Dateiname"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Ursprünglicher Ordnername"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4321,10 +4346,6 @@ msgstr "text"
|
||||
msgid "file"
|
||||
msgstr "Datei"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "Ordner"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Sortieranweisung"
|
||||
@@ -4502,6 +4523,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "WARNUNG:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Abrufen"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Aktualisierungsrate"
|
||||
@@ -4670,6 +4695,12 @@ msgstr "Anhalten für …"
|
||||
msgid "Refresh"
|
||||
msgstr "Neu laden"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortieren nach Alter <small>Älteste→Neuste</small>"
|
||||
@@ -4818,10 +4849,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Aktualisierung durch Mauszeiger verhindern"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Abrufen"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Hochladen"
|
||||
@@ -5045,16 +5072,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Wenn Sie noch keinen Usenet-Provider haben, empfehlen wir Ihnen %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Fehler beim Abrufen der TV-Informationen: %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Umbenennen von %s nach %s fehlgeschlagen."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Umbenennen der gleichen Datei von %s nach %s fehlgeschlagen."
|
||||
|
||||
@@ -5092,6 +5119,12 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Ordner \"%s\" existiert nicht"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL-Commit fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC-Fehler in %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Fehler: Keine sekundäre Oberfläche angegeben."
|
||||
|
||||
@@ -5532,6 +5565,12 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
|
||||
#~ msgid "Show times in AM/PM notation (does not affect scheduler)."
|
||||
#~ msgstr "Zeiten in der AM/PM-Notation anzeigen (betrifft die Regeln nicht)."
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "Ordner"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Ursprünglicher Ordnername"
|
||||
|
||||
#~ msgid "Groups / Indexer tags"
|
||||
#~ msgstr "Gruppen/Indexer-Tags"
|
||||
|
||||
@@ -5617,6 +5656,9 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
|
||||
#~ "Benachrichtigung für Nachrichtengruppen aktivieren (keine, eine oder "
|
||||
#~ "mehrere)"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hauptpaket nicht gefunden …"
|
||||
|
||||
#~ msgid "Initiating restart...<br />"
|
||||
#~ msgstr "Neustart wird durchgeführt …<br />"
|
||||
|
||||
|
||||
@@ -69,9 +69,6 @@ msgstr "Replace spaces in folder name"
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Replace dots in folder name"
|
||||
|
||||
msgid "Original Foldername"
|
||||
msgstr "Original folder name"
|
||||
|
||||
msgid "How long or untill when do you want to pause? (in English!)"
|
||||
msgstr "How long or until when do you want to pause? (in English!)"
|
||||
|
||||
@@ -117,3 +114,9 @@ msgstr "unrar binary... NOT found!"
|
||||
msgid "Downloads will not unpacked."
|
||||
msgstr "Downloads will not be unpacked."
|
||||
|
||||
msgid "Seperate multiple URLs by a comma"
|
||||
msgstr "Separate multiple URLs with a comma"
|
||||
|
||||
msgid "Advanced"
|
||||
msgstr "Advanced Settings"
|
||||
|
||||
|
||||
124
po/main/es.po
124
po/main/es.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -399,10 +399,6 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Comando SQL ha fallado, vea el registro"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Compromiso SQL ha fallado, vea el registro"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "No se pudo cerrar el base de datos, vea el registro"
|
||||
@@ -419,10 +415,6 @@ msgstr "Descodificación %s fallo"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Error CRC en %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Articulo yEnc corrupto en %s"
|
||||
@@ -574,6 +566,12 @@ msgstr "No se pudo cerrar la conexión de correo"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Email exitoso"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "No se ha podido enviar, faltan datos"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "No se pudo encontrar plantillas de email en %s"
|
||||
@@ -741,6 +739,11 @@ msgstr "¡Servidor no definido!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Parámetro incorrecto"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Atrás"
|
||||
@@ -769,7 +772,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "No se pudo crear el directorio %s"
|
||||
|
||||
@@ -799,6 +802,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "No se puede cambiar los permisos de %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ejecutando script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -978,6 +985,7 @@ msgstr ""
|
||||
"La verificación PAR ha fallado en %s, ¡aunque el QuickCheck ha sido "
|
||||
"satisfactorio!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1006,10 +1014,6 @@ msgstr "[%s] Verificado en %s, todos los archivos correctos"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verificado en %s, se necesita reparar"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Paquete principal no encontrado..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1121,11 +1125,6 @@ msgstr "Otros mensajes"
|
||||
msgid "Not available"
|
||||
msgstr "No disponible"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "No se ha podido enviar, faltan datos"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "No se pudo enviar el mensaje de Prowl"
|
||||
@@ -1134,7 +1133,7 @@ msgstr "No se pudo enviar el mensaje de Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Mala respuesta de Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "No se pudo enviar el mensaje de Pushover"
|
||||
|
||||
@@ -1513,7 +1512,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Error grave"
|
||||
|
||||
@@ -1536,6 +1535,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "La descarga fallo, solo %s de los %s requeridos estan disponibles"
|
||||
@@ -1564,10 +1569,6 @@ msgstr "Error al renombrar \"%s\" a \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Error al mover ficheros"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ejecutando script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Ejecutando script de usuario %s"
|
||||
@@ -1588,7 +1589,7 @@ msgstr "Más"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Error al post-procesar %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "ver fichero de log"
|
||||
|
||||
@@ -3520,7 +3521,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Reintentos máximos"
|
||||
|
||||
@@ -4002,6 +4003,22 @@ msgstr "Dispositivo(s)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Dispositivo(s) a los que enviar el mensaje"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4149,6 +4166,10 @@ msgstr "1x05 Episodio Directorio"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Episodio Directorio"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Título"
|
||||
@@ -4218,8 +4239,8 @@ msgid "Original Filename"
|
||||
msgstr "Nombre fichero original"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Nombre directorio original"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4237,10 +4258,6 @@ msgstr "texto"
|
||||
msgid "file"
|
||||
msgstr "archivo"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "carpeta"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Ordenar cadena"
|
||||
@@ -4418,6 +4435,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obtener"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Frecuencia de actualización"
|
||||
@@ -4587,6 +4608,12 @@ msgstr "Pausar durante..."
|
||||
msgid "Refresh"
|
||||
msgstr "Actualizar"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Ordenar por Fecha <small>Más viejo→Más nuevo</small>"
|
||||
@@ -4735,10 +4762,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Bloquear actualizaciones al pasar por encima"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obtener"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Subir"
|
||||
@@ -4960,16 +4983,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "¿No tienes proveedor de Usenet? Nosotros recomendamos probar %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Error al recuperar info de la serie (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Error al renombrar: %s a %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Error al renombrar ficheros similares: %s a %s"
|
||||
|
||||
@@ -5017,9 +5040,15 @@ msgstr "Error al recuperar la URL; %s"
|
||||
#~ msgid "Try again"
|
||||
#~ msgstr "Inténtelo de nuevo"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Compromiso SQL ha fallado, vea el registro"
|
||||
|
||||
#~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file"
|
||||
#~ msgstr "NOTICIA: Transferencia \"%s\" pausado por archivo cifrado"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Error CRC en %s (%s -> %s)"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "Programa Unrar no encontrado, descomprimir de archivos RAR no posible<br />"
|
||||
@@ -5066,6 +5095,9 @@ msgstr "Error al recuperar la URL; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Falta el siguiente archivo: %s => ¿Error al descomprimir?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Paquete principal no encontrado..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "Ficheros par2 inválidos, no se puede verificar o reparar"
|
||||
|
||||
@@ -5259,6 +5291,9 @@ msgstr "Error al recuperar la URL; %s"
|
||||
#~ msgid "Email Options"
|
||||
#~ msgstr "Opciones de e-mail"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "carpeta"
|
||||
|
||||
#~ msgid "Are you sure you want to delete"
|
||||
#~ msgstr "¿Está seguro de querer borrar?"
|
||||
|
||||
@@ -5434,6 +5469,9 @@ msgstr "Error al recuperar la URL; %s"
|
||||
#~ msgid "Enable if downloads are not put in their own folders."
|
||||
#~ msgstr "Habilitar si las descargas no quedan en sus propios directorios."
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Nombre directorio original"
|
||||
|
||||
#~ msgid "Enable sorting and renaming of date named files."
|
||||
#~ msgstr "Habilitar ordenación y renombrado de nombres de ficheros con fechas."
|
||||
|
||||
|
||||
124
po/main/fi.po
124
po/main/fi.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -398,10 +398,6 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL komento epäonnistui, katso loki"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL muutos epäonnistui, katso loki"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Tietokannan sulkeminen epäonnistui, katso loki"
|
||||
@@ -418,10 +414,6 @@ msgstr "Kohteen %s dekoodaus epäonnistui"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC virhe tiedostossa %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Huonosti muotoiltu yEnc artikkeli %s"
|
||||
@@ -571,6 +563,12 @@ msgstr "Sähköpostiyhteyden sulkeminen epäonnistui"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Sähköpostitus onnistui"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Ei voida lähettää, vaaditut tiedot ovat puutteelliset"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Sähköpostipohjia ei löydy hakemistosta %s"
|
||||
@@ -737,6 +735,11 @@ msgstr "Määrittämätön palvelin!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Virheellinen parametri"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Takaisin"
|
||||
@@ -765,7 +768,7 @@ msgstr "t"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Ei voi luoda kansiota %s"
|
||||
|
||||
@@ -795,6 +798,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Käyttöoikeuksien muuttaminen epäonnistui kohteelle %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ajetaan skripti"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -971,6 +978,7 @@ msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr ""
|
||||
"Par varmennus epäonnistui kohteessa %s, mutta Pikatarkistus onnistui!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -998,10 +1006,6 @@ msgstr "[%s] Varmennettiin ajassa %s, kaikki tiedostot kelvollisia"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Varmennetiin ajassa %s, vaatii korjauksen"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Pääpakettia ei löydy..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1111,11 +1115,6 @@ msgstr "Muut viestit"
|
||||
msgid "Not available"
|
||||
msgstr "Ei saatavilla"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Ei voida lähettää, vaaditut tiedot ovat puutteelliset"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Prowl viestin lähetys epäonnistui"
|
||||
@@ -1124,7 +1123,7 @@ msgstr "Prowl viestin lähetys epäonnistui"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Virheellinen vastaus Pushoverilta (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Pushover viestin lähetys epäonnistui"
|
||||
|
||||
@@ -1501,7 +1500,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Vakava virhe"
|
||||
|
||||
@@ -1523,6 +1522,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Lataaminen saattaa epäonnistua, vain %s osaa %s osasta saatavilla"
|
||||
@@ -1551,10 +1556,6 @@ msgstr "Virhe uudelleennimettäessä \"%s\" nimelle \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Tiedostojen siirto epäonnistui"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ajetaan skripti"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Ajetaan käyttäjän skripti %s"
|
||||
@@ -1575,7 +1576,7 @@ msgstr "Lisää"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Jälkikäsittely epäonnistui kohteelle %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "katso lokitiedosto"
|
||||
|
||||
@@ -3509,7 +3510,7 @@ msgstr "SSL-salaus"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "Lisää suorituskykyä pakottamalla alhaisempi SSL-suojaustaso."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Enimmäismäärä uudelleenyrityksille"
|
||||
|
||||
@@ -3987,6 +3988,22 @@ msgstr "Laitteet"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Laitteet joihin viesti lähetetään"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4139,6 +4156,10 @@ msgstr "1x05 Jakso kansio"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Jakso kansio"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Nimi"
|
||||
@@ -4208,8 +4229,8 @@ msgid "Original Filename"
|
||||
msgstr "Alkuperäinen tiedostonimi"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Alkuperäinen kansionimi"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4227,10 +4248,6 @@ msgstr "teksti"
|
||||
msgid "file"
|
||||
msgstr "tiedosto"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "kansio"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Lajittelumerkkijono"
|
||||
@@ -4409,6 +4426,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "VAROITUS:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Nouda"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Päivitysväli"
|
||||
@@ -4578,6 +4599,12 @@ msgstr "Keskeytä ajaksi..."
|
||||
msgid "Refresh"
|
||||
msgstr "Päivitä"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Järjestä iän mukaan <small>Vanhin→Uusin</small>"
|
||||
@@ -4725,10 +4752,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Estä päivitykset kun hiiri on päällä"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Nouda"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Lähetä"
|
||||
@@ -4950,16 +4973,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Eikö sinulla ole usenet tarjoajaa? Suosittelemme kokeilemaan %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Virhe noudettaessa TV tietoja (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Virhe uudelleennimettäessä: %s %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Samankaltaisen tiedoston uudelleennimeäminen epäonnistui: %s %s"
|
||||
|
||||
@@ -4991,6 +5014,9 @@ msgstr "NZB tiedostoa ei voida käyttää"
|
||||
msgid "URL Fetching failed; %s"
|
||||
msgstr "Osoitteen nouto epäonnistui; %s"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC virhe tiedostossa %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Kansiota \"%s\" ei ole olemassa"
|
||||
|
||||
@@ -5104,6 +5130,12 @@ msgstr "Osoitteen nouto epäonnistui; %s"
|
||||
#~ msgid "Remain/Total"
|
||||
#~ msgstr "Jäljellä/Yhteensä"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL muutos epäonnistui, katso loki"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Pääpakettia ei löydy..."
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "UNRAR ohjelmaa ei löydy, RAR-tiedostojen purkaminen ei ole mahdollista<br />"
|
||||
@@ -5369,6 +5401,12 @@ msgstr "Osoitteen nouto epäonnistui; %s"
|
||||
#~ msgstr ""
|
||||
#~ "Kansio jossa ovat käyttäjän skriptit joita käytetään jälkikäsittelyssä."
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Alkuperäinen kansionimi"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "kansio"
|
||||
|
||||
#~ msgid "Hour:Min"
|
||||
#~ msgstr "Tunti:Min"
|
||||
|
||||
|
||||
133
po/main/fr.po
133
po/main/fr.po
@@ -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-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-12 18:26+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
|
||||
"PO-Revision-Date: 2017-12-06 19:46+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-13 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -419,10 +419,6 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Echec de la commande SQL, voir le journal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Echec du commit SQL, voir le journal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Impossible de fermer la base de données, voir le journal"
|
||||
@@ -439,10 +435,6 @@ msgstr "Échec du décodage de %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Échec du décodeur : mémoire insuffisante"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Erreur CRC dans %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Article yEnc mal construit dans %s"
|
||||
@@ -598,6 +590,12 @@ msgstr "Échec de la fermeture de la connexion à la messagerie"
|
||||
msgid "Email succeeded"
|
||||
msgstr "L'envoi de l'e-mail a réussi"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Impossible d'envoyer, données requises manquantes"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Impossible de trouver les modèles d'email dans %s"
|
||||
@@ -767,6 +765,13 @@ msgstr "Serveur non défini !"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Paramètre incorrect"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
"Le dossier de catégorie ne peut pas être un sous-dossier du dossier de "
|
||||
"téléchargement temporaire."
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Retour"
|
||||
@@ -795,7 +800,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Impossible de créer le dossier %s"
|
||||
|
||||
@@ -828,6 +833,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Impossible de changer les permissions pour %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Exécution du script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -1010,6 +1019,7 @@ msgstr ""
|
||||
"Echec de la vérification Par sur %s, mais QuickCheck (vérification rapide) "
|
||||
"réussi !"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1039,10 +1049,6 @@ msgstr "[%s] Vérifié dans %s, tous les fichiers sont corrects"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Vérifié dans %s, réparation nécessaire"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Paquet principal introuvable..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1158,11 +1164,6 @@ msgstr "Autres messages"
|
||||
msgid "Not available"
|
||||
msgstr "Non disponible"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Impossible d'envoyer, données requises manquantes"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Echec d'envoi du message Prowl"
|
||||
@@ -1171,7 +1172,7 @@ msgstr "Echec d'envoi du message Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Mauvaise réponse de Pushover (%s) : %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Échec de l'envoi du message Pushover"
|
||||
|
||||
@@ -1554,7 +1555,7 @@ msgstr ""
|
||||
"Impossible de lier le port %s sur %s. Un autre logiciel utilise le port ou "
|
||||
"SABnzbd est déjà en cours d'exécution."
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Erreur fatale"
|
||||
|
||||
@@ -1579,6 +1580,14 @@ msgstr ""
|
||||
"Le système de fichiers du dossier de téléchargements terminés %s est au "
|
||||
"format FAT, limitant la taille maximale d'un fichier à 4 Go"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
"Le module subprocessww est manquant. Attendez-vous à des problèmes avec les "
|
||||
"noms de fichiers et de répertoires Unicode dans les téléchargements."
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1609,10 +1618,6 @@ msgstr "Erreur lors du renommage de \"%s\" en \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Impossible de déplacer les fichiers"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Exécution du script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Exécution du script utilisateur %s"
|
||||
@@ -1633,7 +1638,7 @@ msgstr "Plus"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Échec du post-traitement pour %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "voir le journal"
|
||||
|
||||
@@ -3604,7 +3609,7 @@ msgstr "Chiffrements SSL"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "Augmenter les performances en forçant un cryptage SSL plus faible."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Nombre de tentatives maximum"
|
||||
|
||||
@@ -4093,6 +4098,23 @@ msgstr "Appareil(s)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Appareil(s) auxquels doivent être envoyés les messages"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr "Nouvelle tentative d'urgence"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "À quelle fréquence la même notification sera envoyée (en secondes)"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr "Expiration d'urgence"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
"Tenter à nouveau votre notification pendant combien de temps (en secondes)"
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4248,6 +4270,10 @@ msgstr "1x05 Dossier Épisode"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Dossier Épisode"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr "Nom de la tâche en tant que nom de fichier"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Titre"
|
||||
@@ -4317,8 +4343,8 @@ msgid "Original Filename"
|
||||
msgstr "Nom de fichier originel"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Nom du dossier originel"
|
||||
msgid "Original Job Name"
|
||||
msgstr "Nom d'origine de la tâche"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4336,10 +4362,6 @@ msgstr "texte"
|
||||
msgid "file"
|
||||
msgstr "fichier"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "dossier"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Chaîne de caractères de tri"
|
||||
@@ -4517,6 +4539,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "AVERTISSEMENT :"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Charger"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Taux de rafraîchissement"
|
||||
@@ -4687,6 +4713,14 @@ msgstr "Mettre en pause pour…"
|
||||
msgid "Refresh"
|
||||
msgstr "Rafraîchir"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
"Tous les noms d'utilisateur, mots de passe et clés API sont automatiquement "
|
||||
"supprimés du journal et de la copie de vos réglages."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Trier par Age <small>Moins récent→Plus récent</small>"
|
||||
@@ -4835,10 +4869,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Bloquer rafraîchissements au survol"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Charger"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Envoyer"
|
||||
@@ -5063,16 +5093,16 @@ msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr ""
|
||||
"Vous n'avez pas de fournisseur usenet? Nous vous recommendons d'essayer %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Erreur lors de l'obtention des information TV (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Échec du renommage : %s en %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Impossible de renommer le fichier similaire : %s en %s"
|
||||
|
||||
@@ -5104,6 +5134,9 @@ msgstr "Fichier NZB inutilisable"
|
||||
msgid "URL Fetching failed; %s"
|
||||
msgstr "Échec de récupération de l'URL ; %s"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Erreur CRC dans %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Erreur : Pas d'interface secondaire définie."
|
||||
|
||||
@@ -5404,6 +5437,9 @@ msgstr "Échec de récupération de l'URL ; %s"
|
||||
#~ msgid "Enable sorting and renaming of date named files."
|
||||
#~ msgstr "Active le tri et le renommage des fichiers par date."
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "dossier"
|
||||
|
||||
#~ msgid "Set Pause Interval"
|
||||
#~ msgstr "Intervalle de pause"
|
||||
|
||||
@@ -5462,6 +5498,9 @@ msgstr "Échec de récupération de l'URL ; %s"
|
||||
#~ msgid "Show files"
|
||||
#~ msgstr "Afficher les fichiers"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Echec du commit SQL, voir le journal"
|
||||
|
||||
#~ msgid "Downloaded so far"
|
||||
#~ msgstr "Téléchargé jusqu'à présent"
|
||||
|
||||
@@ -5577,6 +5616,9 @@ msgstr "Échec de récupération de l'URL ; %s"
|
||||
#~ msgid "pyopenssl module missing, please install for https access"
|
||||
#~ msgstr "module pyopenssl manquant, veuillez l'installer pour l'accès HTTPS"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Paquet principal introuvable..."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " SABnzbd needs a free tcp/ip port for its internal web server.<br>\n"
|
||||
@@ -5663,6 +5705,9 @@ msgstr "Échec de récupération de l'URL ; %s"
|
||||
#~ msgid "Groups / Indexer tags"
|
||||
#~ msgstr "balises Groupes / Indexeur"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Nom du dossier originel"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "After SABnzbd has finished restarting you will be able to access it at the "
|
||||
#~ "following location: %s"
|
||||
|
||||
163
po/main/he.po
163
po/main/he.po
@@ -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-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-11 21:29+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
|
||||
"PO-Revision-Date: 2017-12-06 19:50+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-12 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -392,10 +392,6 @@ msgstr "מסד-נתונים היסטוריה פגום, נוצר תחליף רי
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "נכשלה, ראה יומן SQL פקודת"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "נכשל, ראה יומן SQL חיוב"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "נכשל בסגירת מסד-נתונים, ראה יומן"
|
||||
@@ -412,10 +408,6 @@ msgstr "נכשל %s פענוח"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "כישלון מפענח: אין זיכרון"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "%s (%s -> %s)-ב CRC שגיאת"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "%s-נוצר באופן גרוע ב yEnc מאמר"
|
||||
@@ -444,7 +436,7 @@ msgstr "הושלם"
|
||||
|
||||
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
|
||||
msgid "Unpacked %s files/folders in %s"
|
||||
msgstr "%s-פורקו %s קבצים/תיקיות ב"
|
||||
msgstr "פורקו %s קבצים/תיקיות תוך %s"
|
||||
|
||||
#: sabnzbd/directunpacker.py [Warning message]
|
||||
msgid "Direct Unpack was automatically enabled."
|
||||
@@ -455,7 +447,7 @@ msgid ""
|
||||
"Jobs will start unpacking during the downloading to reduce post-processing "
|
||||
"time. Only works for jobs that do not need repair."
|
||||
msgstr ""
|
||||
".עבודות יתחילו להיפרק במהלך ההורדה כדי להפחית זמן לאחר-עיבוד. עובד רק עבור "
|
||||
".עבודות יתחילו להיפרק במהלך ההורדה כדי להפחית זמן בתר-עיבוד. עובד רק עבור "
|
||||
"עבודות שאינן צריכות תיקון"
|
||||
|
||||
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
|
||||
@@ -566,6 +558,12 @@ msgstr "נכשל בסגירת חיבור דוא\"ל"
|
||||
msgid "Email succeeded"
|
||||
msgstr "דוא\"ל הצליח"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "לא ניתן לשלוח, נתונים דרושים חסרים"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "%s-לא ניתן למצוא תבניות דוא\"ל"
|
||||
@@ -729,6 +727,11 @@ msgstr "!שרת בלתי מוגדר"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "משתנה לא נכון"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ".תיקיית מדור אינה יכולה להיות תת-תיקייה של תיקיית ההורדות הזמניות"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "הקודם"
|
||||
@@ -757,7 +760,7 @@ msgstr "ש"
|
||||
msgid "m"
|
||||
msgstr "ד"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "%s לא יכול ליצור את הספרייה"
|
||||
|
||||
@@ -789,11 +792,15 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "%s לא יכול לשנות הרשאות של"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "מריץ תסריט"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "PostProcessing was aborted (%s)"
|
||||
msgstr "(%s) לאחר-עיבוד בוטל"
|
||||
msgstr "(%s) בתר-עיבוד בוטל"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py [Notification Script settings]
|
||||
@@ -964,6 +971,7 @@ msgstr "מתחיל תיקון"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "!בעוד שבדיקה זריזה הצליחה ,%s-נכשל ב Par וידוא"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -990,10 +998,6 @@ msgstr "כל הקבצים נכונים ,%s-[%s] וודאו ב"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "תיקון דרוש ,%s-[%s] וודאו ב"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "...חפיסה ראשית לא נמצאה"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1084,7 +1088,7 @@ msgstr "התווסף NZB"
|
||||
|
||||
#: sabnzbd/notifier.py
|
||||
msgid "Post-processing started"
|
||||
msgstr "לאחר-עיבוד התחיל"
|
||||
msgstr "בתר-עיבוד התחיל"
|
||||
|
||||
#: sabnzbd/notifier.py [Notification]
|
||||
msgid "Job finished"
|
||||
@@ -1106,11 +1110,6 @@ msgstr "הודעות אחרות"
|
||||
msgid "Not available"
|
||||
msgstr "לא זמין"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "לא ניתן לשלוח, נתונים דרושים חסרים"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Prowl נכשל בשליחת הודעת"
|
||||
@@ -1119,7 +1118,7 @@ msgstr "Prowl נכשל בשליחת הודעת"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Pushover (%s): %s-תגובה רעה מ"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "pushover נכשל בשליחת הודעת"
|
||||
|
||||
@@ -1491,7 +1490,7 @@ msgstr ""
|
||||
".כבר רץ SABnzbd איזשהי תוכנה אחרת משתמשת בפתחה או %s לא היה ניתן לקשר את "
|
||||
"פתחה %s על"
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "שגיאה חמורה"
|
||||
|
||||
@@ -1515,6 +1514,13 @@ msgstr ""
|
||||
"המגבילה גודל מרבי של קובץ אל 4 ג\"ב ,FAT היא במערכת קבצים %s תיקיית ההורדות "
|
||||
"השלמות"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
".של קבצים וספריות בהורדות Unicode חסר. צפה לבעיות עם שמות subprocessww פירקן"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "הורדה עשויה להיכשל, רק %s מתוך %s דרושים זמינים"
|
||||
@@ -1525,7 +1531,7 @@ msgstr "הורדה נכשלה - לא בשרת(ים) שלך"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "No post-processing because of failed verification"
|
||||
msgstr "אין לאחר-עיבוד בגלל וידוא כושל"
|
||||
msgstr "אין בתר-עיבוד בגלל וידוא כושל"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Moving"
|
||||
@@ -1543,10 +1549,6 @@ msgstr "\"%s\" אל \"%s\" שגיאה בשינוי שם"
|
||||
msgid "Failed to move files"
|
||||
msgstr "נכשל בהעברת קבצים"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "מריץ תסריט"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "%s מריץ תסריט משתמש"
|
||||
@@ -1565,9 +1567,9 @@ msgstr "עוד"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message]
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "%s (%s) לאחר-עיבוד נכשל עבור"
|
||||
msgstr "%s (%s) בתר-עיבוד נכשל עבור"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "ראה קובץ יומן"
|
||||
|
||||
@@ -1593,7 +1595,7 @@ msgstr "%s לא יכול ליצור תיקייה סופית"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Post-processing"
|
||||
msgstr "לאחר-עיבוד"
|
||||
msgstr "בתר-עיבוד"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "[%s] No par2 sets"
|
||||
@@ -1829,11 +1831,11 @@ msgstr "השהה הכל"
|
||||
|
||||
#: sabnzbd/skintext.py [#: Config->Scheduler]
|
||||
msgid "Pause post-processing"
|
||||
msgstr "השהה לאחר-עיבוד"
|
||||
msgstr "השהה בתר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py [#: Config->Scheduler]
|
||||
msgid "Resume post-processing"
|
||||
msgstr "המשך לאחר-עיבוד"
|
||||
msgstr "המשך בתר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py [#: Config->Scheduler]
|
||||
msgid "Read RSS feeds"
|
||||
@@ -2967,7 +2969,7 @@ msgid ""
|
||||
"<em>NOTE:</em> Folders will be created automatically when Saving. You may "
|
||||
"use absolute paths to save outside of the default folders."
|
||||
msgstr ""
|
||||
"<em>הערה:</em> .תיקיות יווצרו באופן אוטומטי בעת שמירה. אתה יכול להשתמש "
|
||||
"<em>הערה:</em> תיקיות יווצרו באופן אוטומטי בעת שמירה. אתה יכול להשתמש "
|
||||
"בנתיבים מוחלטים כדי לשמור מחוץ לתיקיות ברירת המחדל"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3153,11 +3155,11 @@ msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Post-Process Only Verified Jobs"
|
||||
msgstr "בצע לאחר-עיבוד רק על עבודות שוודאו"
|
||||
msgstr "בצע בתר-עיבוד רק על עבודות שוודאו"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Only perform post-processing on jobs that passed all PAR2 checks."
|
||||
msgstr ".PAR2-בצע לאחר-עיבוד רק בעבודות שעברו את כל בדיקות ה"
|
||||
msgstr ".PAR2-בצע בתר-עיבוד רק בעבודות שעברו את כל בדיקות ה"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Action when encrypted RAR is downloaded"
|
||||
@@ -3284,8 +3286,8 @@ msgid ""
|
||||
"Use temporary names during post processing. Disable when your system doesn't "
|
||||
"handle that properly."
|
||||
msgstr ""
|
||||
".השתמש בשמות זמניים במהלך לאחר-עיבוד. השבת כאשר המערכת שלך אינה מתמודדת עם "
|
||||
"זה כראוי"
|
||||
".השתמש בשמות זמניים במהלך בתר-עיבוד. השבת כאשר המערכת שלך אינה מתמודדת עם זה "
|
||||
"כראוי"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Pre-queue user script"
|
||||
@@ -3377,12 +3379,12 @@ msgstr ".SABnzbd הפעל את דפדפן ברירת המחדל בעת התחל
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Pause Downloading During Post-Processing"
|
||||
msgstr "השהה הורדה במהלך לאחר-עיבוד"
|
||||
msgstr "השהה הורדה במהלך בתר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Pauses downloading at the start of post processing and resumes when finished."
|
||||
msgstr ".משהה הורדה בתחילת לאחר-עיבוד וממשיך בסיום"
|
||||
msgstr ".משהה הורדה בתחילת בתר-עיבוד וממשיך בסיום"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Ignore Samples"
|
||||
@@ -3411,7 +3413,7 @@ msgstr "שרת"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Post processing"
|
||||
msgstr "לאחר-עיבוד"
|
||||
msgstr "בתר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Naming"
|
||||
@@ -3473,7 +3475,7 @@ msgstr "SSL צפני"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ".חלש יותר SSL הגבר ביצועים ע\"י אילוץ חוזק הצפנת"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "ניסיונות חוזרים מרביים"
|
||||
|
||||
@@ -3951,6 +3953,22 @@ msgstr "התקן(ים)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "התקנים אליהם הודעה תישלח"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr "ניסיון חוזר חרום"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "באיזו תדירות (בשניות) אותה ההתראה תישלח"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr "תפוגת חרום"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr "כמה שניות ההתראה שלך תמשיך להיות מנוסה שוב"
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4101,6 +4119,10 @@ msgstr "1x05 תיקיית פרק"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 תיקיית פרק"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr "שם עבודה בתור שם קובץ"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "כותר"
|
||||
@@ -4170,8 +4192,8 @@ msgid "Original Filename"
|
||||
msgstr "שם מקורי של קובץ"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "שם קובץ מקורי"
|
||||
msgid "Original Job Name"
|
||||
msgstr "שם עבודה מקורי"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4189,10 +4211,6 @@ msgstr "text"
|
||||
msgid "file"
|
||||
msgstr "קובץ"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "תיקייה"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "מיין מחרוזת"
|
||||
@@ -4368,6 +4386,10 @@ msgstr "!המסך יעלם באופן אוטומטי SABnzbd במקרה של ה
|
||||
msgid "WARNING:"
|
||||
msgstr "אזהרה:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "משוך"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "קצב רענון"
|
||||
@@ -4536,6 +4558,14 @@ msgstr "...השהה למשך"
|
||||
msgid "Refresh"
|
||||
msgstr "רענן"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
".מוסרים באופן אוטומטי מהיומן ומהעותק הכלול של ההגדרות שלך API-כל שמות "
|
||||
"המשתמש, הסיסמאות ומפתחות ה"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "מיין לפי גיל <small>החדש ביותר→הישן ביותר</small>"
|
||||
@@ -4682,10 +4712,6 @@ msgstr "זה ימנע רענון תוכן כשסמן העכבר שלך מרחף
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "חסום רענונים בריחוף"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "משוך"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "העלה"
|
||||
@@ -4904,16 +4930,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr ".%s אנו ממליצים לנסות את ?usenet אין לך ספק"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "(%s) שגיאה בהשגת מידע טלוויזיה"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "%s אל %s:נכשל בשינוי שם"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "%s אל %s :נכשל בשינוי שם של קובץ דומה"
|
||||
|
||||
@@ -4957,6 +4983,9 @@ msgstr "%s ;משיכת כתובת נכשלה"
|
||||
#~ msgid "Skip"
|
||||
#~ msgstr "דלג"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "תיקייה"
|
||||
|
||||
#~ msgid "OK"
|
||||
#~ msgstr "אישור"
|
||||
|
||||
@@ -4985,11 +5014,23 @@ msgstr "%s ;משיכת כתובת נכשלה"
|
||||
#~ "Replace illegal characters in folder names by equivalents (otherwise remove)."
|
||||
#~ msgstr ".(החלף תווים בלתי חוקיים בשמות תיקיות בשווי ערך (אחרת יימחקו"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "שם קובץ מקורי"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "אינה קיימת \"%s\" התיקייה"
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "בלתי תקפים, לא יכול לוודא או לתקן par2 קבצי"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "%s (%s -> %s)-ב CRC שגיאת"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "...חפיסה ראשית לא נמצאה"
|
||||
|
||||
#~ msgid "It is likely that you are using ZoneAlarm on Vista.<br>"
|
||||
#~ msgstr ".Vista על ZoneAlarm-סביר להניח שאתה משתמש ב<br>"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "נכשל, ראה יומן SQL חיוב"
|
||||
|
||||
124
po/main/nb.po
124
po/main/nb.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -394,10 +394,6 @@ msgstr "Skadet historikkdatabase, opprettet ny database"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL-kommando mislyktes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL Innsetting mislyktes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Kunne ikke stenge databasen, se logg"
|
||||
@@ -414,10 +410,6 @@ msgstr "Dekoding av %s mislyktes"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC-feil i %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Feilaktigt utformet yEnc artikkel i %s"
|
||||
@@ -567,6 +559,12 @@ msgstr "Kunne ikke stenge e-post-tilkobling"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-post sendning lykkes"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sendes, mangler nødvendig data"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Kan ikke finne e-post-maler i %s"
|
||||
@@ -733,6 +731,11 @@ msgstr "Udefinert server!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Feil parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Tilbake"
|
||||
@@ -761,7 +764,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Kan ikke opprette mappe %s"
|
||||
|
||||
@@ -791,6 +794,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Kunne ikke endre rettigheter på %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kjører skript"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -966,6 +973,7 @@ msgstr "Starter reparasjon"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par verifisering feilet på %s, mens hurtigsjekk var vellykket!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -993,10 +1001,6 @@ msgstr "[%s] Verifiseing tok %s, alle filer er ok"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verifisering tok %s, krever reparasjon"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1107,11 +1111,6 @@ msgstr "Andre meldinger"
|
||||
msgid "Not available"
|
||||
msgstr "Ikke tilgjengelig"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sendes, mangler nødvendig data"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Klarte ikke å sende Prowl melding"
|
||||
@@ -1120,7 +1119,7 @@ msgstr "Klarte ikke å sende Prowl melding"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Ukorrekt svar fra Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Klarte ikke å sende pushover-melding"
|
||||
|
||||
@@ -1493,7 +1492,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Kritisk feil"
|
||||
|
||||
@@ -1515,6 +1514,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Nedlasting kan feile, kun %s av kravet på %s tilgjengelig"
|
||||
@@ -1543,10 +1548,6 @@ msgstr "Kunne ikke endre navn fra \"%s\" til \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Klarte ikke å flytte filer"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kjører skript"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Kjør brukerskript %s"
|
||||
@@ -1567,7 +1568,7 @@ msgstr "Mer"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Etterbehandling mislyktes for %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "se loggfil"
|
||||
|
||||
@@ -3473,7 +3474,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maksimum antall forsøk"
|
||||
|
||||
@@ -3947,6 +3948,22 @@ msgstr "Enhet(er)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Enhet(er) som meldingen skal sendes til"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4095,6 +4112,10 @@ msgstr "1x05 Episodemappe"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Episodemappe"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Tittel"
|
||||
@@ -4164,8 +4185,8 @@ msgid "Original Filename"
|
||||
msgstr "Originalfilnavn"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Originalt mappenavn"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4183,10 +4204,6 @@ msgstr "tekst"
|
||||
msgid "file"
|
||||
msgstr "fil"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "mappe"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Sorteringsstreng"
|
||||
@@ -4364,6 +4381,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Oppdateringsfrekvens"
|
||||
@@ -4530,6 +4551,12 @@ msgstr "Pause i..."
|
||||
msgid "Refresh"
|
||||
msgstr "Oppdatere"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sorter etter alder <small>Eldst→Ny</small>"
|
||||
@@ -4676,10 +4703,6 @@ msgstr "Dette vil hindre oppfrisking av innhold når muspekeren er over køen"
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Blokker oppfrisking når musen svever over"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Last Opp"
|
||||
@@ -4902,16 +4925,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Har du ikke noen usenet leverandør? Vi anbefaler å prøve %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Kunne ikke hente TV info (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Kunne ikke endre navn fra: %s til %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Kunne ikke endre navn på lik fil: %s til %s"
|
||||
|
||||
@@ -4946,6 +4969,9 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Mappen \"%s\" finnes ikke"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL Innsetting mislyktes, se logg"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr "Kunne ikke finne noen UNRAR program, utpakking er ikke mulig<br />"
|
||||
|
||||
@@ -4991,6 +5017,9 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgid "Unpacking failed, an expected file was not unpacked"
|
||||
#~ msgstr "Utpakking mislyktes, en forventet fil er ikke utpakket"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Mislyktes med importering av OpenSSL modul. Kobler til uten SSL"
|
||||
|
||||
@@ -5322,6 +5351,9 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file"
|
||||
#~ msgstr "ADVARSEL: Jobb \"%s\" satt på pause pga. kryptert RAR-fil"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC-feil i %s (%s -> %s)"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Your UNRAR version is not recommended, get it from "
|
||||
#~ "http://www.rarlab.com/rar_add.htm<br />"
|
||||
@@ -5417,6 +5449,9 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgid "Open Source URL"
|
||||
#~ msgstr "Åpen kildekode URL"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Originalt mappenavn"
|
||||
|
||||
#~ msgid "Groups / Indexer tags"
|
||||
#~ msgstr "Grupper / Indeks etiketter"
|
||||
|
||||
@@ -5482,3 +5517,6 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgstr ""
|
||||
#~ "Send automatisk beregnet valideringsresultater for nedlastinger til "
|
||||
#~ "indekserer."
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "mappe"
|
||||
|
||||
132
po/main/nl.po
132
po/main/nl.po
@@ -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-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-11 07:07+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
|
||||
"PO-Revision-Date: 2017-12-08 10:47+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-12 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-09 05:32+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -412,10 +412,6 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL-commando mislukt, zie logbestand"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL-opslagopdracht mislukt, zie logbestand"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Het lukt niet om de database te sluiten, zie log"
|
||||
@@ -432,10 +428,6 @@ msgstr "Decoderen van %s mislukt"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Decoder fout: onvoldoende geheugen"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC-fout in %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Slecht opgemaakt yEnc-artikel in %s"
|
||||
@@ -589,6 +581,12 @@ msgstr "Beëindigen e-mailverbinding mislukt"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail verzonden"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Versturen kan niet, vereiste gegevens ontbreken"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Geen e-mailsjablonen te vinden in %s"
|
||||
@@ -756,6 +754,13 @@ msgstr "Onbekende server."
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Incorrecte parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
"Een Categorie specifieke map mag niet een map in de Tijdelijke download map "
|
||||
"zijn."
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Terug"
|
||||
@@ -784,7 +789,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Niet mogelijk directory %s aan te maken"
|
||||
|
||||
@@ -817,6 +822,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Toegangsrechten van %s niet aan te passen"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Script uitvoeren"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -992,6 +1001,7 @@ msgstr "Reparatie starten"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par-verificatie van %s misgelukt, maar QuickCheck wel gelukt."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1019,10 +1029,6 @@ msgstr "[%s] %s geverifieerd, alle bestanden zijn goed"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Geverifieerd in %s, reparatie is nodig"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hoofdpakket niet gevonden..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1137,11 +1143,6 @@ msgstr "Andere berichten"
|
||||
msgid "Not available"
|
||||
msgstr "Niet beschikbaar"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Versturen kan niet, vereiste gegevens ontbreken"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Verzenden van Prowl-bericht mislukt"
|
||||
@@ -1150,7 +1151,7 @@ msgstr "Verzenden van Prowl-bericht mislukt"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Slecht antwoord van Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Pushover-bericht sturen mislukt"
|
||||
|
||||
@@ -1525,7 +1526,7 @@ msgstr ""
|
||||
"Kan niet binden aan poort %s van %s. Andere software gebruikt deze poort of "
|
||||
"SABnzbd is al actief."
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Fatale fout"
|
||||
|
||||
@@ -1549,6 +1550,14 @@ msgstr ""
|
||||
"De map voor voltooide downloads %s staat op een FAT systeem, de maximale "
|
||||
"file omvang is dan maar 4G"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
"De module subprocessww ontbreekt. Je kunt problemen krijgen met Unicode "
|
||||
"namen van bestanden en mappen."
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1578,10 +1587,6 @@ msgstr "Fout bij hernoemen van \"%s\" tot \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Verplaatsen van bestanden mislukt"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Script uitvoeren"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Gebruiker script %s loopt"
|
||||
@@ -1602,7 +1607,7 @@ msgstr "Meer"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Nabewerking van %s mislukt (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "zie logbestand"
|
||||
|
||||
@@ -3550,7 +3555,7 @@ msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
"Verhoog de prestaties door een eenvoudigere SSL versleuteling toe te passen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maximum aantal pogingen"
|
||||
|
||||
@@ -4040,6 +4045,22 @@ msgstr "Apparaten"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Apparaat of apparaten die het bericht moeten ontvangen"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr "Noodgeval herhaling"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "Hoevaak moet de notification herhaald worden (in seconden)"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr "Einde van noodgeval"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr "Hoeveel seconden moet de notificatie herhaald worden"
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4193,6 +4214,10 @@ msgstr "1x05 Aflevering-map"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Aflevering-map"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr "Downloadnaam als Bestandsnaam"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
@@ -4262,8 +4287,8 @@ msgid "Original Filename"
|
||||
msgstr "Originele bestandsnaam"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Oorspronkelijke mapnaam"
|
||||
msgid "Original Job Name"
|
||||
msgstr "Originele Downloadnaam"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4281,10 +4306,6 @@ msgstr "tekst"
|
||||
msgid "file"
|
||||
msgstr "bestand"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "map"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Sorteertekst"
|
||||
@@ -4461,6 +4482,10 @@ msgstr "Wanneer SABnzbd opnieuw is gestart, gaat dit venster vanzelf weg!"
|
||||
msgid "WARNING:"
|
||||
msgstr "WAARSCHUWING:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Ophalen"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Ververssnelheid"
|
||||
@@ -4629,6 +4654,14 @@ msgstr "Pauzeer..."
|
||||
msgid "Refresh"
|
||||
msgstr "Ververs"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
"Alle gebruikersnamen, wachtwoorden en API-sleutels worden automatisch "
|
||||
"verwijderd uit het logbestand en de bijgevoegde kopie van je instellingen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sorteer op Leeftijd <small>Oud→Nieuw</small>"
|
||||
@@ -4776,10 +4809,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Geen verversing bij popups"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Ophalen"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Ophalen"
|
||||
@@ -5000,16 +5029,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Heb je nog geen Usenet provider? Wij bevelen %s aan."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Fout bij ophalen TV info (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Hernoemen van %s tot %s mislukt"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Hernoemen van gelijkaardig bestand %s naar %s mislukt"
|
||||
|
||||
@@ -5087,6 +5116,9 @@ msgstr "URL ophalen mislukt; %s"
|
||||
#~ msgid "pyopenssl module missing, please install for https access"
|
||||
#~ msgstr "Module \"pyopenssl\" ontbreekt, geen HTTPS mogelijk"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hoofdpakket niet gevonden..."
|
||||
|
||||
#~ msgid "Failed to remove nzo from postproc queue (id)"
|
||||
#~ msgstr "Verwijderen van nzo van nabewerkingswachtrij mislukt"
|
||||
|
||||
@@ -5409,6 +5441,12 @@ msgstr "URL ophalen mislukt; %s"
|
||||
#~ msgid "OK"
|
||||
#~ msgstr "OK"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "map"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Oorspronkelijke mapnaam"
|
||||
|
||||
#~ msgid "Groups / Indexer tags"
|
||||
#~ msgstr "Groepen / Indexer markeringen"
|
||||
|
||||
@@ -5571,6 +5609,12 @@ msgstr "URL ophalen mislukt; %s"
|
||||
#~ msgstr ""
|
||||
#~ "WAARSCHUWING: Taak '%s' is afgebroken vanwege een versleuteld RAR-bestand"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC-fout in %s (%s -> %s)"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL-opslagopdracht mislukt, zie logbestand"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "Geen UNRAR-programma gevonden, uitpakken van RAR-bestanden niet mogelijk<br "
|
||||
|
||||
124
po/main/pl.po
124
po/main/pl.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -394,10 +394,6 @@ msgstr "Uszkodzona baza danych historii, utworzono w jej miejscu nową, pustą"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Błąd polecenia SQL, sprawdź logi"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Błąd wykonania polecenia SQL, sprawdź logi"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Błąd zamykania bazy danych, sprawdź logi"
|
||||
@@ -414,10 +410,6 @@ msgstr "Błąd dekodowania %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Błąd CRC w %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Źle zbudowany artykuł yEnc w %s"
|
||||
@@ -569,6 +561,12 @@ msgstr "Nie udało się zamknąć połączenia z serwerem pocztowym"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Wiadomość wysłana"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nie można wysłać wiadomości, brak wymaganych danych"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Brak szablonów wiadomości email w %s"
|
||||
@@ -736,6 +734,11 @@ msgstr "Niezdefiniowany serwer!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Błędny parametr"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Powrót"
|
||||
@@ -764,7 +767,7 @@ msgstr "g"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Nie można utworzyć katalogu %s"
|
||||
|
||||
@@ -794,6 +797,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Nie można zmienić uprawnień %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Uruchamianie skryptu"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -969,6 +976,7 @@ msgstr "Rozpoczynanie naprawy"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Weryfikacja %s nieudana, choć szybkie sprawdzenie powiodło się!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -997,10 +1005,6 @@ msgstr "[%s] Zweryfikowano w %s, wszystkie pliki prawidłowe"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Zweryfikowano w %s, wymagana naprawa"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Główny pakiet nieznaleziony..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1112,11 +1116,6 @@ msgstr "Inne komunikaty"
|
||||
msgid "Not available"
|
||||
msgstr "Niedostępne"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nie można wysłać wiadomości, brak wymaganych danych"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Błąd wysyłania wiadomości Prowl"
|
||||
@@ -1125,7 +1124,7 @@ msgstr "Błąd wysyłania wiadomości Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Zła odpowiedź od Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Nie udało się wysłać wiadomości Pushover"
|
||||
|
||||
@@ -1499,7 +1498,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Błąd krytyczny"
|
||||
|
||||
@@ -1522,6 +1521,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Pobieranie może się nie udać, dostępne jedynie %s z wymaganych %s"
|
||||
@@ -1551,10 +1556,6 @@ msgstr "Błąd zmiany nazwy \"%s\" na \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Nie udało się przenieść plików"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Uruchamianie skryptu"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Uruchamianie skryptu użytkownika %s"
|
||||
@@ -1575,7 +1576,7 @@ msgstr "Więcej"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Przetwarzanie końcowe nie powiodło się dla %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "sprawdź logi"
|
||||
|
||||
@@ -3490,7 +3491,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maksymalna ilość prób"
|
||||
|
||||
@@ -3965,6 +3966,22 @@ msgstr "Urządzenie(-a)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Urządzenie(-a), do którego(-ych) mają być wysyłane powiadomienia"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4113,6 +4130,10 @@ msgstr "Katalog odcinka 1x05"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "Katalog odcinka S01E05"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Tytuł"
|
||||
@@ -4182,8 +4203,8 @@ msgid "Original Filename"
|
||||
msgstr "Oryginalna nazwa pliku"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Oryginalna nazwa katalogu"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4201,10 +4222,6 @@ msgstr "tekst"
|
||||
msgid "file"
|
||||
msgstr "plik"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "katalog"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Wzorzec sortowania"
|
||||
@@ -4382,6 +4399,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "UWAGA:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Pobierz"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Częstotliwość odświeżania"
|
||||
@@ -4548,6 +4569,12 @@ msgstr "Wstrzymaj na..."
|
||||
msgid "Refresh"
|
||||
msgstr "Odśwież"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortuj według wieku <small>Najstarsze→Najnowsze</small>"
|
||||
@@ -4694,10 +4721,6 @@ msgstr "Blokuje odświeżanie zawartości po najechaniu kursorem na kolejkę"
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Zablokuj odświeżanie podczas wskazywania"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Pobierz"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Wczytaj"
|
||||
@@ -4918,16 +4941,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Nie masz dostawcy Usenet? Polecamy spróbować %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Błąd pobierania informacji TV (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Nie udało się zmienić nazwy %s na %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Nie udało się zmienić nazwy podobnego pliku %s na %s"
|
||||
|
||||
@@ -4959,6 +4982,9 @@ msgstr "Bezużyteczny plik NZB"
|
||||
msgid "URL Fetching failed; %s"
|
||||
msgstr "Pobieranie URL nie powiodło się; %s"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Błąd CRC w %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Folder \"%s\" nie istnieje"
|
||||
|
||||
@@ -4975,6 +5001,9 @@ msgstr "Pobieranie URL nie powiodło się; %s"
|
||||
#~ msgid "Downloaded so far"
|
||||
#~ msgstr "Dotychczas pobrano"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Błąd wykonania polecenia SQL, sprawdź logi"
|
||||
|
||||
#~ msgid "Not matched"
|
||||
#~ msgstr "Nie dopasowano"
|
||||
|
||||
@@ -5174,6 +5203,12 @@ msgstr "Pobieranie URL nie powiodło się; %s"
|
||||
#~ msgid "Generic Sorting"
|
||||
#~ msgstr "Sortowanie standardowe"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "katalog"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Oryginalna nazwa katalogu"
|
||||
|
||||
#~ msgid "Are you sure you want to delete"
|
||||
#~ msgstr "Czy na pewno usunąć?"
|
||||
|
||||
@@ -5254,6 +5289,9 @@ msgstr "Pobieranie URL nie powiodło się; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Brak oczekiwanego pliku: %s => błąd rozpakowywania archiwum RAR?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Główny pakiet nieznaleziony..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Błąd importu modułu OpenSSL. Łączenie bez SSL"
|
||||
|
||||
|
||||
124
po/main/pt_BR.po
124
po/main/pt_BR.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -396,10 +396,6 @@ msgstr "Dados de histórico danificados, criado um substituto vazio"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "O comando SQL falhou. Consulte o log"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "O commit do SQL falhou. Consulte o log"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Falha ao fechar o banco de dados. Consulte o log"
|
||||
@@ -416,10 +412,6 @@ msgstr "Falha ao decodificar %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Erro de CRC em %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Artigo yEnc mal formado em %s"
|
||||
@@ -570,6 +562,12 @@ msgstr "Falha ao fechar a conexão de e-mail"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail enviado com sucesso"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Não foi possível enviar, faltam dados obrigatórios"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Não é possível encontrar modelos de e-mail em %s"
|
||||
@@ -736,6 +734,11 @@ msgstr "Servidor não definido!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Parâmetro incorreto"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Voltar"
|
||||
@@ -764,7 +767,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Não é possível criar a pasta %s"
|
||||
|
||||
@@ -794,6 +797,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Não é possível alterar permissões de %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Executando script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -969,6 +976,7 @@ msgstr "Iniciando reparação"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Validação de par falhou em %s, enquanto QuickCheck foi completo!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -996,10 +1004,6 @@ msgstr "[%s] Verificado em %s. Todos os arquivos corretos"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verificado em %s. É necessário reparar"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Pacote principal não encontrado..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1109,11 +1113,6 @@ msgstr "Outras Mensagens"
|
||||
msgid "Not available"
|
||||
msgstr "Não disponível"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Não foi possível enviar, faltam dados obrigatórios"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Falha ao enviar mensagem Prowl"
|
||||
@@ -1122,7 +1121,7 @@ msgstr "Falha ao enviar mensagem Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Resposta incorreta do Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Falha ao enviar mensagem pushover"
|
||||
|
||||
@@ -1498,7 +1497,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Erro fatal"
|
||||
|
||||
@@ -1520,6 +1519,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1549,10 +1554,6 @@ msgstr "Erro ao renomear \"%s\" para \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Falha ao mover arquivos"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Executando script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Executando script de usuário %s"
|
||||
@@ -1573,7 +1574,7 @@ msgstr "Mais"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "O pós-processamento falhou para %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "veja o arquivo de log"
|
||||
|
||||
@@ -3487,7 +3488,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Máximo de tentativas"
|
||||
|
||||
@@ -3963,6 +3964,22 @@ msgstr "Dispositivo(s)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Dispositivo(s) para qual a mensagem deve ser enviada"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4111,6 +4128,10 @@ msgstr "1x05 Pasta Do Episódio"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Pasta Do Episódio"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Título"
|
||||
@@ -4180,8 +4201,8 @@ msgid "Original Filename"
|
||||
msgstr "Nome do arquivo original"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Nome da pasta original"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4199,10 +4220,6 @@ msgstr "texto"
|
||||
msgid "file"
|
||||
msgstr "arquivo"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "pasta"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "String de ordenação"
|
||||
@@ -4380,6 +4397,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obter"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Taxa de atualização"
|
||||
@@ -4546,6 +4567,12 @@ msgstr "Pausar por..."
|
||||
msgid "Refresh"
|
||||
msgstr "Atualizar"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Ordenar por Idade <small>Mais antigo→Mais novo</small>"
|
||||
@@ -4694,10 +4721,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Impedir Atualizações no Foco"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obter"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Enviar"
|
||||
@@ -4919,16 +4942,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Não tem um provedor usenet? Recomendamos testar %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Erro ao obter informações de TV (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Falha ao renomear: %s para %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Falha ao renomear arquivo similar: %s para %s"
|
||||
|
||||
@@ -4964,9 +4987,15 @@ msgstr "A busca da URL falhou; %s"
|
||||
#~ msgstr ""
|
||||
#~ "ATENÇÃO: Tarefa \"%s\" em pausa por causa de arquivo RAR criptografado"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Erro de CRC em %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "A pasta \"%s\" não existe"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "O commit do SQL falhou. Consulte o log"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Your UNRAR version is not recommended, get it from "
|
||||
#~ "http://www.rarlab.com/rar_add.htm<br />"
|
||||
@@ -5019,6 +5048,9 @@ msgstr "A busca da URL falhou; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Faltando arquivo esperado: %s => erro no unrar?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Pacote principal não encontrado..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "Arquivos PAR2 inválidos. Não é possível verificar ou reparar"
|
||||
|
||||
@@ -5342,6 +5374,12 @@ msgstr "A busca da URL falhou; %s"
|
||||
#~ msgid "Generic Sorting"
|
||||
#~ msgstr "Ordenação genérica"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Nome da pasta original"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "pasta"
|
||||
|
||||
#~ msgid "Enable sorting and renaming of episodes."
|
||||
#~ msgstr "Ativa a ordenação e renomeação de episódios."
|
||||
|
||||
|
||||
124
po/main/ro.po
124
po/main/ro.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -398,10 +398,6 @@ msgstr "Bază de date Istoric coruptă, creat un nou fişier gol"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Comandă SQL Nereuşită, vedeţi jurnal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Modificare SQL Nereuşită, vedeţi jurnal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Închidere bază de date nereuşită, vedeţi jurnal"
|
||||
@@ -418,10 +414,6 @@ msgstr "Decodarea %s nereuşită"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Eroare CRC în %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Articoul yEnc invalid în %s"
|
||||
@@ -572,6 +564,12 @@ msgstr "Închidere conexiune mail nereuşită"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Email reuşit"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nu pot trimite, informații necesare lipsă"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Nu pot gasi şabloane email în %s"
|
||||
@@ -739,6 +737,11 @@ msgstr "Server nedefinit!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Parametru Incorect"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Înapoi"
|
||||
@@ -767,7 +770,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Nu pot crea dosarul %s"
|
||||
|
||||
@@ -797,6 +800,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Nu pot schimba permisiunile lui %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Rulare script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -972,6 +979,7 @@ msgstr "Pornire Reparare"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Verificarea Par eșuată pentru %s, dar VerificareaRapidă reușită!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1000,10 +1008,6 @@ msgstr "[%s] Verificat în %s, toate fişierele sunt corecte"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verificat în %s, reparare necesară"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Pachet principal negăsit..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1113,11 +1117,6 @@ msgstr "Alte Mesaje"
|
||||
msgid "Not available"
|
||||
msgstr "Indisponibil"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nu pot trimite, informații necesare lipsă"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Nu am putu trimite mesajul Prowl"
|
||||
@@ -1126,7 +1125,7 @@ msgstr "Nu am putu trimite mesajul Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Răspuns greșit de la Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Nu am putut trimite mesajul de pushover"
|
||||
|
||||
@@ -1505,7 +1504,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Eroare fatală"
|
||||
|
||||
@@ -1527,6 +1526,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Descărcarea ar putea eşua, doar %s din %s disponibil"
|
||||
@@ -1555,10 +1560,6 @@ msgstr "Eroare redenumire \"%s\" în \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Nu am putu muta fişier"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Rulare script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Rulare script utilizator %s"
|
||||
@@ -1579,7 +1580,7 @@ msgstr "Mai mult"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Post Procesare Nereuşită pentru %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "vezi fişier jurnal"
|
||||
|
||||
@@ -3489,7 +3490,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Număr Maxim reîncercări"
|
||||
|
||||
@@ -3968,6 +3969,22 @@ msgstr "Dispozitiv(e)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Dispozitiv(e) la care să se trimită mesajul"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4115,6 +4132,10 @@ msgstr "1x05 Dosar Episod"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Dosar Episod"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Titlu"
|
||||
@@ -4184,8 +4205,8 @@ msgid "Original Filename"
|
||||
msgstr "Nume de Fişier Original"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Nume de Dosar Original"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4203,10 +4224,6 @@ msgstr "text"
|
||||
msgid "file"
|
||||
msgstr "fișier"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "dosar"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Şir Caractere Sortare"
|
||||
@@ -4383,6 +4400,10 @@ msgstr "În cazul repornirii SABnzbd acest ecran va dispărea în mod automat!"
|
||||
msgid "WARNING:"
|
||||
msgstr "ATENŢIE:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Descarcă"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Rată actualizare"
|
||||
@@ -4551,6 +4572,12 @@ msgstr "Pauză timp de..."
|
||||
msgid "Refresh"
|
||||
msgstr "Reîmprospătează"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortează după Vârstă <small>Cel mai Vechi→Cel mai Nou</small>"
|
||||
@@ -4699,10 +4726,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Blochează Reîmprospătarea Hover"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Descarcă"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Încarcă"
|
||||
@@ -4924,16 +4947,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Nu aveţi un furnizor usenet? Vă recomandăm să încercaţi %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Eroare obţinere info TV (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Redenumire:%s în %s nereuşită"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Redenumire fişiere similare : %s în %s nereuşită"
|
||||
|
||||
@@ -4969,9 +4992,15 @@ msgstr "Descărcare URL nereuşită; %s"
|
||||
#~ msgstr ""
|
||||
#~ "ATENŢIE: Sarcina \"%s\" întreruptă din cauza fişierelor RAR encriptate"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Eroare CRC în %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Dosarul \"%s\" nu există"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Modificare SQL Nereuşită, vedeţi jurnal"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "Nici un program UNRAR găsit, dezarhivarea fişierelor RAR imposibilă<br />"
|
||||
@@ -5053,6 +5082,9 @@ msgstr "Descărcare URL nereuşită; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Fişiere aşteptate lipsă: %s => eroare unrar?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Pachet principal negăsit..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Eroare importare modul OpenSSL . Se conectează folosind NON-SSL"
|
||||
|
||||
@@ -5319,6 +5351,12 @@ msgstr "Descărcare URL nereuşită; %s"
|
||||
#~ msgid "Enable if downloads are not put in their own folders."
|
||||
#~ msgstr "Activează dacă descărcările nu sunt puse în dosarele lor."
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Nume de Dosar Original"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "dosar"
|
||||
|
||||
#~ msgid "Enable sorting and renaming of date named files."
|
||||
#~ msgstr "Activează sortarea şi redenumirea fişierelor denumite după dată."
|
||||
|
||||
|
||||
124
po/main/ru.po
124
po/main/ru.po
@@ -2,15 +2,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-0.7.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
@@ -387,10 +387,6 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Ошибка команды SQL (см. журнал)"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Ошибка фиксации SQL (см. журнал)"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Не удалось закрыть базу данных (см. журнал)"
|
||||
@@ -407,10 +403,6 @@ msgstr "Ошибка декодирования %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Ошибка CRC в %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Неверно сформированная статья yEnc в %s"
|
||||
@@ -559,6 +551,12 @@ msgstr "Не удалось разорвать соединение с почт
|
||||
msgid "Email succeeded"
|
||||
msgstr "Электронное письмо успешно отправлено"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Не удаётся найти шаблонны электронных писем в %s"
|
||||
@@ -726,6 +724,11 @@ msgstr ""
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Неправильный параметр"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
@@ -754,7 +757,7 @@ msgstr "ч"
|
||||
msgid "m"
|
||||
msgstr "м"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Не удаётся создать каталог %s"
|
||||
|
||||
@@ -784,6 +787,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Не удаётся изменить права доступа %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Запуск сценария"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -959,6 +966,7 @@ msgstr "запуск исправления"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -987,10 +995,6 @@ msgstr "[%s] Проверено за %s. Ошибок нет"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Проверено за %s. Требуется исправление"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Главный пакет не найден..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1101,11 +1105,6 @@ msgstr "Другие сообщения"
|
||||
msgid "Not available"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr ""
|
||||
@@ -1114,7 +1113,7 @@ msgstr ""
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr ""
|
||||
|
||||
@@ -1491,7 +1490,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Критическая ошибка"
|
||||
|
||||
@@ -1513,6 +1512,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1541,10 +1546,6 @@ msgstr "Ошибка переименования «%s» и «%s»"
|
||||
msgid "Failed to move files"
|
||||
msgstr "Не удалось переместить файлы"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Запуск сценария"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Запуск пользовательского сценария %s"
|
||||
@@ -1565,7 +1566,7 @@ msgstr "Подробнее"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Ошибка пост-обработки для %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "см. журнал"
|
||||
|
||||
@@ -3466,7 +3467,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Число попыток"
|
||||
|
||||
@@ -3946,6 +3947,22 @@ msgstr ""
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr ""
|
||||
@@ -4093,6 +4110,10 @@ msgstr "1x05 Эпизод Папка"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Эпизод Папка"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Название"
|
||||
@@ -4162,8 +4183,8 @@ msgid "Original Filename"
|
||||
msgstr "Исходное название файла"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Исходное название папки"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4181,10 +4202,6 @@ msgstr "текст"
|
||||
msgid "file"
|
||||
msgstr "файл"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "папка"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Строка сортировки"
|
||||
@@ -4361,6 +4378,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "ПРЕДУПРЕЖДЕНИЕ"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Загрузить"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Частота обновления"
|
||||
@@ -4527,6 +4548,12 @@ msgstr "Приостановить на..."
|
||||
msgid "Refresh"
|
||||
msgstr "Обновить"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Сортировать по возрасту <small>от старых к новым</small>"
|
||||
@@ -4675,10 +4702,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Блокировать обновление при наведении мыши"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Загрузить"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Отправить"
|
||||
@@ -4903,16 +4926,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "У вас ещё нет поставщика услуг Usenet? Рекомендуем попробовать %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Не удалось получить сведения о ТВ (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Не удалось переименовать: %s в %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Не удалось переименовать похожий файл: %s в %s"
|
||||
|
||||
@@ -4950,6 +4973,12 @@ msgstr "Не удалось загрузить URL: %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Папка «%s» не существует"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Ошибка фиксации SQL (см. журнал)"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Ошибка CRC в %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Ошибка: дополнительный интерфейс не определён."
|
||||
|
||||
@@ -5007,6 +5036,9 @@ msgstr "Не удалось загрузить URL: %s"
|
||||
#~ msgid "Unpacking failed, these file(s) are missing:"
|
||||
#~ msgstr "Ошибка распаковки: отсутствуют следующие файлы:"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Главный пакет не найден..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "Недопустимые PAR2-файлы. Нельзя выполнить проверку или исправление"
|
||||
|
||||
@@ -5352,6 +5384,12 @@ msgstr "Не удалось загрузить URL: %s"
|
||||
#~ msgid "Enable if downloads are not put in their own folders."
|
||||
#~ msgstr "Включите, если загрузки не размещаются в собственных папках."
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Исходное название папки"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "папка"
|
||||
|
||||
#~ msgid "Enable sorting and renaming of date named files."
|
||||
#~ msgstr "Позволяет сортировать и переименовывать файлы с датой в названии."
|
||||
|
||||
|
||||
124
po/main/sr.po
124
po/main/sr.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -391,10 +391,6 @@ msgstr "Baza dnevnika je oštećena, kreirana prazna zamena"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Neuspešna SQL komanda, videti izveštaj"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Погрешно SQL извршавање, видети извештај"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Неуспешно затварање базе, видети извештај"
|
||||
@@ -411,10 +407,6 @@ msgstr "Dešifrovanje %s neuspešno"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC грешка у %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Лоше формиран yEnc артикал у %s"
|
||||
@@ -564,6 +556,12 @@ msgstr "Неуспешно затварање везе е-поште"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Упешно слање е-поште"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nemoguće poslati, nedostaju obavezni podaci"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Немогуће наћи модел е-поруке у %s"
|
||||
@@ -728,6 +726,11 @@ msgstr "Server nije definisan!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Погрешан параметар"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
@@ -756,7 +759,7 @@ msgstr "с"
|
||||
msgid "m"
|
||||
msgstr "м"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Немогуће креирати фасциклу %s"
|
||||
|
||||
@@ -786,6 +789,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Не може да се промене дозволе од %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Покретање скрипта"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -961,6 +968,7 @@ msgstr "Покретање пооправљања"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par provera neuspešna na %s, dok je QuickCheck uspešan!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -989,10 +997,6 @@ msgstr "[%s] Проверено за %s, све датотеке су добре
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Проверено за %s, потребна је поправка"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Главни пакет није нађен..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1102,11 +1106,6 @@ msgstr "Остале поруке"
|
||||
msgid "Not available"
|
||||
msgstr "Недоступно"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nemoguće poslati, nedostaju obavezni podaci"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Неуспешно слање Prowl поруке"
|
||||
@@ -1115,7 +1114,7 @@ msgstr "Неуспешно слање Prowl поруке"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Neodgovarajući odgovor od strane Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Neuspešno slanje Pushover poruke"
|
||||
|
||||
@@ -1485,7 +1484,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Фатална грешка"
|
||||
|
||||
@@ -1507,6 +1506,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Преузимање је можда погрешно. има %s од потребних %s"
|
||||
@@ -1535,10 +1540,6 @@ msgstr "Грешка преименовања \"%s\" у \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Неуспешно премештање датотека"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Покретање скрипта"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Покретање скрипта %s"
|
||||
@@ -1559,7 +1560,7 @@ msgstr "Више"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Грешка пост-процесирања за %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "видети извештај"
|
||||
|
||||
@@ -3458,7 +3459,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Макс покушаја"
|
||||
|
||||
@@ -3932,6 +3933,22 @@ msgstr "Uređaj(i)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Uređaj(i) na koje bi poruke trebale biti poslate"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4079,6 +4096,10 @@ msgstr "1x05 Фасцикла епизоде"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Фасцикла епизоде"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Наслов"
|
||||
@@ -4148,8 +4169,8 @@ msgid "Original Filename"
|
||||
msgstr "Оригинално име датотеке"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Оригинално име фасцикле"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4167,10 +4188,6 @@ msgstr "текст"
|
||||
msgid "file"
|
||||
msgstr "датотека"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "фасцикла"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Уреди низ"
|
||||
@@ -4348,6 +4365,10 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "ПАЖЊА:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Преузми"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Брзина освежавања"
|
||||
@@ -4514,6 +4535,12 @@ msgstr "Паузирај за..."
|
||||
msgid "Refresh"
|
||||
msgstr "Освежи"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Среди по старост <small>Старије→Новије</small>"
|
||||
@@ -4660,10 +4687,6 @@ msgstr "При прелазу миша преко рада, зауставља
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Блокирати обнове на прелаз миша"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Преузми"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Слање"
|
||||
@@ -4884,16 +4907,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Немате 'usenet' провајдер? Препоручујемо Вам %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Грешка преузимању ТВ инфо (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Неуспешно преименовање : %s у %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Неуспешно преименовање сличне датотеке: %s у %s"
|
||||
|
||||
@@ -4997,6 +5020,12 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
|
||||
#~ msgid "Enable sorting and renaming of date named files."
|
||||
#~ msgstr "Упали сређивање и преименовање датотеке са датумом"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "фасцикла"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Оригинално име фасцикле"
|
||||
|
||||
#~ msgid "Enable generic sorting and renaming of files."
|
||||
#~ msgstr "Упали генерално сортирање/преименовање датотеке."
|
||||
|
||||
@@ -5198,6 +5227,12 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "фасцикла \"%s\" не постоји"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Погрешно SQL извршавање, видети извештај"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC грешка у %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Not matched"
|
||||
#~ msgstr "Не одговара"
|
||||
|
||||
@@ -5247,6 +5282,9 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
|
||||
#~ msgid "Unpacking failed, these file(s) are missing:"
|
||||
#~ msgstr "Неуспешан издвој, ове датотеке недостају:"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Главни пакет није нађен..."
|
||||
|
||||
#~ msgid "KB/s"
|
||||
#~ msgstr "КБ/с"
|
||||
|
||||
|
||||
124
po/main/sv.po
124
po/main/sv.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -392,10 +392,6 @@ msgstr "Skadad hitsotrikdatabas, skapade en tom ersättare"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL Kommando misslyckades, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL Commit misslyckades, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Det gick inte att stänga databasen, se logg"
|
||||
@@ -412,10 +408,6 @@ msgstr "Avkodning av %s misslyckades"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC Fel i %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Felaktigt utformad yEnc artikel i %s"
|
||||
@@ -564,6 +556,12 @@ msgstr "Det gick inte att stänga e-mail anslutning"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail sändning lyckades"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kunde inte skicka, saknar nödvändig data"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Kan ej finna e-mail mallar i %s"
|
||||
@@ -732,6 +730,11 @@ msgstr "Odefinerad server!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Fel parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Bakåt"
|
||||
@@ -760,7 +763,7 @@ msgstr "h"
|
||||
msgid "m"
|
||||
msgstr "m"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "Kan ej skapa mapp %s"
|
||||
|
||||
@@ -790,6 +793,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Det gick inte att ändra rättigheter på %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kör skript"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -965,6 +972,7 @@ msgstr "Startar reparation"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par verifiering misslyckades på %s, medans QuickCheck lyckades!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -993,10 +1001,6 @@ msgstr "[%s] Verifierad i %s, alla filer är ok"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verifiering i %s, kräver reparation"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Huvudarkiv saknas..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1107,11 +1111,6 @@ msgstr "Andra meddelanden"
|
||||
msgid "Not available"
|
||||
msgstr "Ej tillgänglig"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kunde inte skicka, saknar nödvändig data"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Misslyckades att skicka Prowlmeddelande"
|
||||
@@ -1120,7 +1119,7 @@ msgstr "Misslyckades att skicka Prowlmeddelande"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Dålig respons från Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Misslyckades att skicka pushovermeddelande"
|
||||
|
||||
@@ -1495,7 +1494,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Allvarligt fel"
|
||||
|
||||
@@ -1517,6 +1516,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1546,10 +1551,6 @@ msgstr "Det gick inte att döpa om \"%s\" till \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Misslyckades med att flytta filer"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kör skript"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Kör användarskript %s"
|
||||
@@ -1570,7 +1571,7 @@ msgstr "Mer"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Efterbehandling misslyckades för %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "se loggfil"
|
||||
|
||||
@@ -3473,7 +3474,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Max antal omförsök"
|
||||
|
||||
@@ -3947,6 +3948,22 @@ msgstr "Enhet(er)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Enhet(er) där medellandet skall skickas"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4094,6 +4111,10 @@ msgstr "1x05 Episodmapp"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 Episodmapp"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
@@ -4163,8 +4184,8 @@ msgid "Original Filename"
|
||||
msgstr "Originalfilnamn"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "Ursprungliga mappnamnet"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4182,10 +4203,6 @@ msgstr "text"
|
||||
msgid "file"
|
||||
msgstr "fil"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "mapp"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "Sorteringssträng"
|
||||
@@ -4362,6 +4379,10 @@ msgstr "Om SABnzbd startar om kommer denna skärm att försvinna automatiskt!"
|
||||
msgid "WARNING:"
|
||||
msgstr "VARNING:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hämta"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Uppdateringsfrekvens"
|
||||
@@ -4528,6 +4549,12 @@ msgstr "Pausa i..."
|
||||
msgid "Refresh"
|
||||
msgstr "Uppdatera"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortera efter ålder <small>Äldst→Nyast</small>"
|
||||
@@ -4676,10 +4703,6 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Block uppdaterar vid svävande"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hämta"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Ladda upp"
|
||||
@@ -4903,16 +4926,16 @@ msgstr ""
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "Har du inte någon usenet leverantör? Vi rekommenderar att prova %s."
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "Det gick inte att hämta TV info (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "Det gick inte att döpa om: %s till %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "Det gick inte att döpa om liknande fil: %s till %s"
|
||||
|
||||
@@ -4947,6 +4970,12 @@ msgstr "URL hämtning misslyckades; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Mappen \"%s\" finns inte"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL Commit misslyckades, se logg"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC Fel i %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Fel: Inget andrainterface definierat."
|
||||
|
||||
@@ -5002,6 +5031,9 @@ msgstr "URL hämtning misslyckades; %s"
|
||||
#~ msgid "Unpacking failed, an expected file was not unpacked"
|
||||
#~ msgstr "Uppackning misslyckades, en väntad fil är inte uppackad"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Huvudarkiv saknas..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Misslyckades med importering av OpenSSL modul. Ansluter utan SSL"
|
||||
|
||||
@@ -5436,6 +5468,12 @@ msgstr "URL hämtning misslyckades; %s"
|
||||
#~ msgid "Groups / Indexer tags"
|
||||
#~ msgstr "Grupper/Indexering-tagg"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "mapp"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "Ursprungliga mappnamnet"
|
||||
|
||||
#~ msgid "E.g. 119 or 563 for SSL"
|
||||
#~ msgstr "T.ex. 119 eller 563 för SSL"
|
||||
|
||||
|
||||
124
po/main/zh_CN.po
124
po/main/zh_CN.po
@@ -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-10 20:30+0000\n"
|
||||
"POT-Creation-Date: 2017-12-06 10: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-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 18511)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -386,10 +386,6 @@ msgstr "“历史记录”数据库已损坏,已创建空数据库代替"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL 命令执行失败,参见日志"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL 保存失败,参见日志"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "无法关闭数据库,参见日志"
|
||||
@@ -406,10 +402,6 @@ msgstr "%s 解码失败"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "解码器失败:内存不足"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC 错误:%s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "yEnc 文章格式错误:%s"
|
||||
@@ -558,6 +550,12 @@ msgstr "无法关闭邮件连接"
|
||||
msgid "Email succeeded"
|
||||
msgstr "成功发送电子邮件"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "无法发送,缺少必要的数据"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "无法找到 email 模板:%s"
|
||||
@@ -715,6 +713,11 @@ msgstr "未定义服务器!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "参数不正确"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "返回"
|
||||
@@ -743,7 +746,7 @@ msgstr "小时"
|
||||
msgid "m"
|
||||
msgstr "分钟"
|
||||
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
msgid "Cannot create directory %s"
|
||||
msgstr "无法创建目录 %s"
|
||||
|
||||
@@ -773,6 +776,10 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "无法更改 %s 的权限"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "正在执行脚本"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -948,6 +955,7 @@ msgstr "正在开始修复"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par 验证失败:%s,但快速检查成功!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -974,10 +982,6 @@ msgstr "[%s] 验证耗时 %s,所有文件均完好无损"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] 验证耗时 %s,需要修复"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "主数据包未找到..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1087,11 +1091,6 @@ msgstr "其他信息"
|
||||
msgid "Not available"
|
||||
msgstr "不可用"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "无法发送,缺少必要的数据"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "无法发送 Prowl 消息"
|
||||
@@ -1100,7 +1099,7 @@ msgstr "无法发送 Prowl 消息"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Pushover 响应异常 (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "无法发送 pushover 信息"
|
||||
|
||||
@@ -1469,7 +1468,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr "绑定端口 %s 在 %s 上失败。其它的程序正在使用此端口或者说 SABnzbd 正在运行。"
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "致命错误"
|
||||
|
||||
@@ -1491,6 +1490,12 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr "已完成文件夹 %s 位于 FAT 文件系统上,这样会有最大文件为 4GB 的限制。"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "下载可能会失败,只有 %s 块 (需要 %s) 可用"
|
||||
@@ -1519,10 +1524,6 @@ msgstr "将 \"%s\" 重命名为 \"%s\" 出错"
|
||||
msgid "Failed to move files"
|
||||
msgstr "移动文件失败"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "正在执行脚本"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "正在执行用户脚本 %s"
|
||||
@@ -1543,7 +1544,7 @@ msgstr "更多"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "后期处理失败:%s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "查看日志文件"
|
||||
|
||||
@@ -3403,7 +3404,7 @@ msgstr "SSL 加密算法"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "降低 SSL 的加密难度以便获得更高的性能。"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "最多重试次数"
|
||||
|
||||
@@ -3874,6 +3875,22 @@ msgstr "设备"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "信息发送的目标设备"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4022,6 +4039,10 @@ msgstr "1x05 剧集文件夹"
|
||||
msgid "S01E05 Episode Folder"
|
||||
msgstr "S01E05 剧集文件夹"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Job Name as Filename"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Title"
|
||||
msgstr "标题"
|
||||
@@ -4091,8 +4112,8 @@ msgid "Original Filename"
|
||||
msgstr "原始文件名"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Original Foldername"
|
||||
msgstr "原始文件夹名"
|
||||
msgid "Original Job Name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Lower Case"
|
||||
@@ -4110,10 +4131,6 @@ msgstr "text"
|
||||
msgid "file"
|
||||
msgstr "文件"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "folder"
|
||||
msgstr "文件夹"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort String"
|
||||
msgstr "排序字串"
|
||||
@@ -4288,6 +4305,10 @@ msgstr "SABnzbd 重启后本画面将自动消失!"
|
||||
msgid "WARNING:"
|
||||
msgstr "警告:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "装取"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "刷新频率"
|
||||
@@ -4454,6 +4475,12 @@ msgstr "暂停..."
|
||||
msgid "Refresh"
|
||||
msgstr "刷新"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "按发布时间排序 <small>最早→最新</small>"
|
||||
@@ -4600,10 +4627,6 @@ msgstr "这将在您的鼠标指针处于队列上方时阻止内容刷新。"
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "指向时停止刷新"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "装取"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "上传"
|
||||
@@ -4818,16 +4841,16 @@ msgstr "要从 usenet 下载您需要有一家提供商的访问权限。您的
|
||||
msgid "Don't have a usenet provider? We recommend trying %s."
|
||||
msgstr "还没有 usenet 提供商r? 我们推荐试试 %s。"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Error getting TV info (%s)"
|
||||
msgstr "获取 TV 信息出错 (%s)"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename: %s to %s"
|
||||
msgstr "重命名失败: %s 为 %s"
|
||||
|
||||
#: sabnzbd/tvsort.py [Error message]
|
||||
#: sabnzbd/sorting.py [Error message]
|
||||
msgid "Failed to rename similar file: %s to %s"
|
||||
msgstr "重命名相似文件失败: %s 为 %s"
|
||||
|
||||
@@ -4865,6 +4888,12 @@ msgstr "URL 装取失败; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "文件夹 \"%s\" 不存在"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL 保存失败,参见日志"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC 错误:%s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "错误: 未定义第二界面。"
|
||||
|
||||
@@ -4918,6 +4947,9 @@ msgstr "URL 装取失败; %s"
|
||||
#~ msgid "Unpacking failed, these file(s) are missing:"
|
||||
#~ msgstr "解压失败,缺这些文件:"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "主数据包未找到..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "par2 文件无效,无法验证或修复"
|
||||
|
||||
@@ -5247,6 +5279,12 @@ msgstr "URL 装取失败; %s"
|
||||
#~ msgid "Enable if downloads are not put in their own folders."
|
||||
#~ msgstr "启用可将下载内容存放在各自的文件夹。"
|
||||
|
||||
#~ msgid "Original Foldername"
|
||||
#~ msgstr "原始文件夹名"
|
||||
|
||||
#~ msgid "folder"
|
||||
#~ msgstr "文件夹"
|
||||
|
||||
#~ msgid "Enable sorting and renaming of date named files."
|
||||
#~ msgstr "启用按日期命名的文件的排序与重命名。"
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ import sabnzbd.lang as lang
|
||||
import sabnzbd.par2file as par2file
|
||||
import sabnzbd.api
|
||||
import sabnzbd.directunpacker as directunpacker
|
||||
from sabnzbd.decorators import synchronized, notify_downloader
|
||||
from sabnzbd.decorators import synchronized
|
||||
from sabnzbd.constants import NORMAL_PRIORITY, VALID_ARCHIVES, \
|
||||
REPAIR_REQUEST, QUEUE_FILE_NAME, QUEUE_VERSION, QUEUE_FILE_TMPL
|
||||
import sabnzbd.getipaddress as getipaddress
|
||||
@@ -278,7 +278,7 @@ def initialize(pause_downloader=False, clean_up=False, evalSched=False, repair=0
|
||||
sabnzbd.encoding.change_fsys(cfg.fsys_type())
|
||||
|
||||
# Set cache limit
|
||||
if not cfg.cache_limit() or (cfg.cache_limit() == '200M' and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
|
||||
if not cfg.cache_limit() or (cfg.cache_limit() in ('200M', '450M') and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
|
||||
cfg.cache_limit.set(misc.get_cache_limit())
|
||||
ArticleCache.do.new_limit(cfg.cache_limit.get_int())
|
||||
|
||||
@@ -874,7 +874,7 @@ def get_new_id(prefix, folder, check_list=None):
|
||||
def save_data(data, _id, path, do_pickle=True, silent=False):
|
||||
""" Save data to a diskfile """
|
||||
if not silent:
|
||||
logging.debug("Saving data for %s in %s", _id, path)
|
||||
logging.debug('[%s] Saving data for %s in %s', misc.caller_name(), _id, path)
|
||||
path = os.path.join(path, _id)
|
||||
|
||||
# We try 3 times, to avoid any dict or access problems
|
||||
@@ -906,11 +906,11 @@ def load_data(_id, path, remove=True, do_pickle=True, silent=False):
|
||||
path = os.path.join(path, _id)
|
||||
|
||||
if not os.path.exists(path):
|
||||
logging.info("%s missing", path)
|
||||
logging.info("[%s] %s missing", misc.caller_name(), path)
|
||||
return None
|
||||
|
||||
if not silent:
|
||||
logging.debug("Loading data for %s from %s", _id, path)
|
||||
logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
|
||||
|
||||
try:
|
||||
with open(path, 'rb') as data_file:
|
||||
@@ -923,7 +923,7 @@ def load_data(_id, path, remove=True, do_pickle=True, silent=False):
|
||||
data = data_file.read()
|
||||
|
||||
if remove:
|
||||
os.remove(path)
|
||||
misc.remove_file(path)
|
||||
except:
|
||||
logging.error(T('Loading %s failed'), path)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -937,8 +937,7 @@ def remove_data(_id, path):
|
||||
path = os.path.join(path, _id)
|
||||
try:
|
||||
if os.path.exists(path):
|
||||
os.remove(path)
|
||||
logging.info("%s removed", path)
|
||||
misc.remove_file(path)
|
||||
except:
|
||||
logging.debug("Failed to remove %s", path)
|
||||
|
||||
@@ -946,7 +945,7 @@ def remove_data(_id, path):
|
||||
def save_admin(data, _id):
|
||||
""" Save data in admin folder in specified format """
|
||||
path = os.path.join(cfg.admin_dir.get_path(), _id)
|
||||
logging.info("Saving data for %s in %s", _id, path)
|
||||
logging.debug("[%s] Saving data for %s in %s", misc.caller_name(), _id, path)
|
||||
|
||||
# We try 3 times, to avoid any dict or access problems
|
||||
for t in xrange(3):
|
||||
@@ -969,10 +968,10 @@ def save_admin(data, _id):
|
||||
def load_admin(_id, remove=False, silent=False):
|
||||
""" Read data in admin folder in specified format """
|
||||
path = os.path.join(cfg.admin_dir.get_path(), _id)
|
||||
logging.info("Loading data for %s from %s", _id, path)
|
||||
logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
|
||||
|
||||
if not os.path.exists(path):
|
||||
logging.info("%s missing", path)
|
||||
logging.info("[%s] %s missing", misc.caller_name(), path)
|
||||
return None
|
||||
|
||||
try:
|
||||
@@ -982,7 +981,7 @@ def load_admin(_id, remove=False, silent=False):
|
||||
else:
|
||||
data = cPickle.load(data_file)
|
||||
if remove:
|
||||
os.remove(path)
|
||||
misc.remove_file(path)
|
||||
except:
|
||||
if not silent:
|
||||
excepterror = str(sys.exc_info()[0])
|
||||
@@ -1036,7 +1035,7 @@ def check_repair_request():
|
||||
path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST)
|
||||
if os.path.exists(path):
|
||||
try:
|
||||
os.remove(path)
|
||||
misc.remove_file(path)
|
||||
except:
|
||||
pass
|
||||
return True
|
||||
@@ -1107,7 +1106,7 @@ def pid_file(pid_path=None, pid_file=None, port=0):
|
||||
f.write('%d\n' % os.getpid())
|
||||
f.close()
|
||||
else:
|
||||
os.remove(DIR_PID)
|
||||
misc.remove_file(DIR_PID)
|
||||
except:
|
||||
logging.warning('Cannot access PID file %s', DIR_PID)
|
||||
|
||||
|
||||
@@ -681,12 +681,11 @@ def _api_rescan(name, output, kwargs):
|
||||
|
||||
def _api_eval_sort(name, output, kwargs):
|
||||
""" API: evaluate sorting expression """
|
||||
import sabnzbd.tvsort
|
||||
name = kwargs.get('name', '')
|
||||
value = kwargs.get('value', '')
|
||||
title = kwargs.get('title')
|
||||
multipart = kwargs.get('movieextra', '')
|
||||
path = sabnzbd.tvsort.eval_sort(value, title, name, multipart)
|
||||
path = sabnzbd.sorting.eval_sort(value, title, name, multipart)
|
||||
if path is None:
|
||||
return report(output, _MSG_NOT_IMPLEMENTED)
|
||||
else:
|
||||
@@ -903,8 +902,8 @@ def _api_server_stats(name, output, kwargs):
|
||||
|
||||
stats['servers'] = {}
|
||||
for svr in config.get_servers():
|
||||
t, m, w, d, _ = BPSMeter.do.amounts(svr)
|
||||
stats['servers'][svr] = {'total': t or 0, 'month': m or 0, 'week': w or 0, 'day': d or 0}
|
||||
t, m, w, d, daily = BPSMeter.do.amounts(svr)
|
||||
stats['servers'][svr] = {'total': t or 0, 'month': m or 0, 'week': w or 0, 'day': d or 0, 'daily': daily or {} }
|
||||
|
||||
return report(output, keyword='', data=stats)
|
||||
|
||||
@@ -1358,7 +1357,7 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
|
||||
slot['status'] = "%s" % (status)
|
||||
|
||||
if (Downloader.do.paused or Downloader.do.postproc or is_propagating or \
|
||||
status not in (Status.DOWNLOADING, Status.QUEUED)) and priority != TOP_PRIORITY:
|
||||
status not in (Status.DOWNLOADING, Status.FETCHING, Status.QUEUED)) and priority != TOP_PRIORITY:
|
||||
slot['timeleft'] = '0:00:00'
|
||||
slot['eta'] = 'unknown'
|
||||
else:
|
||||
@@ -1687,7 +1686,7 @@ def build_queue_header(search=None, start=0, limit=0, output=None):
|
||||
bytes = qnfo.bytes
|
||||
|
||||
header['kbpersec'] = "%.2f" % (bytespersec / KIBI)
|
||||
header['speed'] = to_units(bytespersec, spaces=1, dec_limit=1)
|
||||
header['speed'] = to_units(bytespersec, spaces=1)
|
||||
header['mbleft'] = "%.2f" % (bytesleft / MEBI)
|
||||
header['mb'] = "%.2f" % (bytes / MEBI)
|
||||
header['sizeleft'] = format_bytes(bytesleft)
|
||||
|
||||
@@ -22,6 +22,7 @@ sabnzbd.articlecache - Article cache handling
|
||||
import sys
|
||||
import logging
|
||||
import threading
|
||||
import struct
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.decorators import synchronized
|
||||
@@ -40,6 +41,13 @@ class ArticleCache(object):
|
||||
self.__cache_size = 0
|
||||
self.__article_list = [] # List of buffered articles
|
||||
self.__article_table = {} # Dict of buffered articles
|
||||
|
||||
# On 32 bit we only allow the user to set 1GB
|
||||
# For 64 bit we allow up to 4GB, in case somebody wants that
|
||||
self.__cache_upper_limit = GIGI
|
||||
if sabnzbd.DARWIN or sabnzbd.WIN64 or (struct.calcsize("P") * 8) == 64:
|
||||
self.__cache_upper_limit = 4*GIGI
|
||||
|
||||
ArticleCache.do = self
|
||||
|
||||
@synchronized(ARTICLE_LOCK)
|
||||
@@ -51,9 +59,9 @@ class ArticleCache(object):
|
||||
""" Called when cache limit changes """
|
||||
self.__cache_limit_org = limit
|
||||
if limit < 0:
|
||||
self.__cache_limit = GIGI
|
||||
self.__cache_limit = self.__cache_upper_limit
|
||||
else:
|
||||
self.__cache_limit = min(limit, GIGI)
|
||||
self.__cache_limit = min(limit, self.__cache_upper_limit)
|
||||
|
||||
@synchronized(ARTICLE_LOCK)
|
||||
def reserve_space(self, data):
|
||||
@@ -74,23 +82,24 @@ class ArticleCache(object):
|
||||
|
||||
@synchronized(ARTICLE_LOCK)
|
||||
def save_article(self, article, data):
|
||||
nzf = article.nzf
|
||||
nzo = nzf.nzo
|
||||
|
||||
if nzo.is_gone():
|
||||
if article.nzf.nzo.is_gone():
|
||||
# Do not discard this article because the
|
||||
# file might still be processed at this moment!!
|
||||
return
|
||||
|
||||
saved_articles = article.nzf.nzo.saved_articles
|
||||
# Register article
|
||||
if article not in article.nzf.nzo.saved_articles:
|
||||
article.nzf.nzo.saved_articles.append(article)
|
||||
|
||||
if article not in saved_articles:
|
||||
saved_articles.append(article)
|
||||
if article.lowest_partnum and not article.nzf.import_finished:
|
||||
# Write the first-fetched articles to disk
|
||||
# Otherwise the cache could overflow
|
||||
self.__flush_article(article, data)
|
||||
return
|
||||
|
||||
if self.__cache_limit:
|
||||
if self.__cache_limit < 0:
|
||||
self.__add_to_cache(article, data)
|
||||
|
||||
else:
|
||||
data_size = len(data)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ from sabnzbd.postproc import PostProcessor
|
||||
import sabnzbd.downloader
|
||||
import sabnzbd.par2file as par2file
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
from sabnzbd.encoding import unicoder, is_utf8
|
||||
from sabnzbd.encoding import unicoder
|
||||
from sabnzbd.rating import Rating
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ class Assembler(Thread):
|
||||
if not sabnzbd.downloader.Downloader.do.paused:
|
||||
logging.warning(T('Too little diskspace forcing PAUSE'))
|
||||
# Pause downloader, but don't save, since the disk is almost full!
|
||||
sabnzbd.downloader.Downloader.do.pause(save=False)
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
sabnzbd.emailer.diskfull()
|
||||
# Abort all direct unpackers, just to be sure
|
||||
sabnzbd.directunpacker.abort_all()
|
||||
@@ -97,15 +97,17 @@ class Assembler(Thread):
|
||||
try:
|
||||
filepath = self.assemble(nzf, filepath)
|
||||
except IOError, (errno, strerror):
|
||||
# If job was deleted, ignore error
|
||||
if not nzo.is_gone():
|
||||
# If job was deleted or in active post-processing, ignore error
|
||||
if not nzo.deleted and not nzo.is_gone() and not nzo.pp_active:
|
||||
# 28 == disk full => pause downloader
|
||||
if errno == 28:
|
||||
logging.error(T('Disk full! Forcing Pause'))
|
||||
else:
|
||||
logging.error(T('Disk error on creating file %s'), clip_path(filepath))
|
||||
# Log traceback
|
||||
logging.info('Traceback: ', exc_info=True)
|
||||
# Pause without saving
|
||||
sabnzbd.downloader.Downloader.do.pause(save=False)
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
continue
|
||||
except:
|
||||
logging.error(T('Fatal error in Assembler'), exc_info=True)
|
||||
@@ -318,7 +320,8 @@ def check_encrypted_and_unwanted_files(nzo, filepath):
|
||||
zf.close()
|
||||
del zf
|
||||
except:
|
||||
logging.info('Error during inspection of RAR-file %s', filepath, exc_info=True)
|
||||
logging.info('Error during inspection of RAR-file %s', filepath)
|
||||
logging.debug('Traceback: ', exc_info=True)
|
||||
|
||||
return encrypted, unwanted
|
||||
|
||||
@@ -368,5 +371,5 @@ def remove_warning_label(msg):
|
||||
""" Standardize errors by removing obsolete
|
||||
"WARNING:" part in all languages """
|
||||
if ':' in msg:
|
||||
return msg.split(':')[1]
|
||||
return msg.split(':')[1].strip()
|
||||
return msg
|
||||
|
||||
@@ -261,6 +261,7 @@ fixed_ports = OptionBool('misc', 'fixed_ports', False)
|
||||
api_warnings = OptionBool('misc', 'api_warnings', True, protect=True)
|
||||
disable_key = OptionBool('misc', 'disable_api_key', False, protect=True)
|
||||
no_penalties = OptionBool('misc', 'no_penalties', False)
|
||||
debug_log_decoding = OptionBool('misc', 'debug_log_decoding', False)
|
||||
|
||||
# Text values
|
||||
rss_odd_titles = OptionList('misc', 'rss_odd_titles', ['nzbindex.nl/', 'nzbindex.com/', 'nzbclub.com/'])
|
||||
@@ -374,6 +375,8 @@ prowl_prio_other = OptionNumber('prowl', 'prowl_prio_other', -3)
|
||||
pushover_token = OptionStr('pushover', 'pushover_token')
|
||||
pushover_userkey = OptionStr('pushover', 'pushover_userkey')
|
||||
pushover_device = OptionStr('pushover', 'pushover_device')
|
||||
pushover_emergency_expire = OptionNumber('pushover', 'pushover_emergency_expire', 3600)
|
||||
pushover_emergency_retry = OptionNumber('pushover', 'pushover_emergency_retry', 60)
|
||||
pushover_enable = OptionBool('pushover', 'pushover_enable')
|
||||
pushover_cats = OptionList('pushover', 'pushover_cats', ['*'])
|
||||
pushover_prio_startup = OptionNumber('pushover', 'pushover_prio_startup', -3)
|
||||
|
||||
@@ -385,7 +385,7 @@ class ConfigServer(object):
|
||||
self.displayname = OptionStr(name, 'displayname', '', add=False)
|
||||
self.host = OptionStr(name, 'host', '', add=False)
|
||||
self.port = OptionNumber(name, 'port', 119, 0, 2 ** 16 - 1, add=False)
|
||||
self.timeout = OptionNumber(name, 'timeout', 120, 30, 240, add=False)
|
||||
self.timeout = OptionNumber(name, 'timeout', 60, 20, 240, add=False)
|
||||
self.username = OptionStr(name, 'username', '', add=False)
|
||||
self.password = OptionPassword(name, 'password', '', add=False)
|
||||
self.connections = OptionNumber(name, 'connections', 1, 0, 100, add=False)
|
||||
@@ -395,7 +395,7 @@ class ConfigServer(object):
|
||||
self.optional = OptionBool(name, 'optional', False, add=False)
|
||||
self.retention = OptionNumber(name, 'retention', add=False)
|
||||
self.send_group = OptionBool(name, 'send_group', False, add=False)
|
||||
self.priority = OptionNumber(name, 'priority', 0, 0, 100, add=False)
|
||||
self.priority = OptionNumber(name, 'priority', 0, 0, 99, add=False)
|
||||
# 'fillserver' field only here in order to set a proper priority when converting
|
||||
self.fillserver = OptionBool(name, 'fillserver', False, add=False)
|
||||
self.notes = OptionStr(name, 'notes', '', add=False)
|
||||
@@ -859,7 +859,7 @@ def save_config(force=False):
|
||||
logging.error(T('Cannot write to INI file %s'), filename)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
try:
|
||||
os.remove(filename)
|
||||
sabnzbd.misc.remove_file(filename)
|
||||
except:
|
||||
pass
|
||||
# Restore INI file from backup
|
||||
|
||||
@@ -51,7 +51,7 @@ RENAMES_FILE = '__renames__'
|
||||
ATTRIB_FILE = 'SABnzbd_attrib'
|
||||
REPAIR_REQUEST = 'repair-all.sab'
|
||||
|
||||
SABYENC_VERSION_REQUIRED = '3.1.1'
|
||||
SABYENC_VERSION_REQUIRED = '3.3.2'
|
||||
|
||||
DB_HISTORY_VERSION = 1
|
||||
DB_HISTORY_NAME = 'history%s.db' % DB_HISTORY_VERSION
|
||||
@@ -74,9 +74,11 @@ DEF_WORKDIR = 'sabnzbd'
|
||||
DEF_LOG_FILE = 'sabnzbd.log'
|
||||
DEF_LOG_ERRFILE = 'sabnzbd.error.log'
|
||||
DEF_LOG_CHERRY = 'cherrypy.log'
|
||||
DEF_CACHE_LIMIT = '450M'
|
||||
DEF_ARTICLE_CACHE_DEFAULT = '500M'
|
||||
DEF_ARTICLE_CACHE_MAX = '1G'
|
||||
DEF_TIMEOUT = 60
|
||||
DEF_SCANRATE = 5
|
||||
MAX_URL_RETRIES = 10
|
||||
MAX_DECODE_QUEUE = 10
|
||||
LIMIT_DECODE_QUEUE = 100
|
||||
MAX_WARNINGS = 20
|
||||
|
||||
@@ -40,7 +40,7 @@ from sabnzbd.constants import DB_HISTORY_NAME, STAGES
|
||||
from sabnzbd.encoding import unicoder
|
||||
from sabnzbd.bpsmeter import this_week, this_month
|
||||
from sabnzbd.decorators import synchronized
|
||||
from sabnzbd.misc import get_all_passwords, int_conv
|
||||
from sabnzbd.misc import get_all_passwords, int_conv, remove_file, caller_name
|
||||
|
||||
DB_LOCK = threading.RLock()
|
||||
|
||||
@@ -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)
|
||||
@@ -143,7 +143,7 @@ class HistoryDB(object):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
self.close()
|
||||
try:
|
||||
os.remove(HistoryDB.db_path)
|
||||
remove_file(HistoryDB.db_path)
|
||||
except:
|
||||
pass
|
||||
self.connect()
|
||||
@@ -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,10 +235,8 @@ class HistoryDB(object):
|
||||
jobs = [jobs]
|
||||
|
||||
for job in jobs:
|
||||
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,))
|
||||
logging.info('Removing job %s from history', job)
|
||||
|
||||
self.save()
|
||||
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,), save=True)
|
||||
logging.info('[%s] Removing job %s from history', caller_name(), job)
|
||||
|
||||
def auto_history_purge(self):
|
||||
""" Remove history items based on the configured history-retention """
|
||||
@@ -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):
|
||||
|
||||
@@ -31,6 +31,7 @@ from sabnzbd.constants import Status, MAX_DECODE_QUEUE, LIMIT_DECODE_QUEUE, SABY
|
||||
import sabnzbd.articlecache
|
||||
import sabnzbd.downloader
|
||||
import sabnzbd.nzbqueue
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.encoding import yenc_name_fixer
|
||||
from sabnzbd.misc import match_str
|
||||
|
||||
@@ -47,8 +48,8 @@ try:
|
||||
import sabyenc
|
||||
SABYENC_ENABLED = True
|
||||
SABYENC_VERSION = sabyenc.__version__
|
||||
# Verify version
|
||||
if SABYENC_VERSION != SABYENC_VERSION_REQUIRED:
|
||||
# Verify version to at least match minor version
|
||||
if SABYENC_VERSION[:3] != SABYENC_VERSION_REQUIRED[:3]:
|
||||
raise ImportError
|
||||
except ImportError:
|
||||
SABYENC_ENABLED = False
|
||||
@@ -79,6 +80,7 @@ class Decoder(Thread):
|
||||
|
||||
self.queue = queue
|
||||
self.servers = servers
|
||||
self.__log_decoding = cfg.debug_log_decoding()
|
||||
|
||||
def stop(self):
|
||||
# Put multiple to stop all decoders
|
||||
@@ -115,7 +117,9 @@ class Decoder(Thread):
|
||||
if nzo.precheck:
|
||||
raise BadYenc
|
||||
register = True
|
||||
logging.debug("Decoding %s", art_id)
|
||||
|
||||
if self.__log_decoding:
|
||||
logging.debug("Decoding %s", art_id)
|
||||
|
||||
data = self.decode(article, lines, raw_data)
|
||||
nzf.article_count += 1
|
||||
@@ -127,8 +131,7 @@ class Decoder(Thread):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
article.fetcher = None
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(nzf, nzo)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
|
||||
register = False
|
||||
|
||||
except MemoryError, e:
|
||||
@@ -139,12 +142,11 @@ class Decoder(Thread):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
article.fetcher = None
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(nzf, nzo)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
|
||||
register = False
|
||||
|
||||
except CrcError, e:
|
||||
logme = T('CRC Error in %s') % art_id
|
||||
logme = 'CRC Error in %s' % art_id
|
||||
logging.info(logme)
|
||||
|
||||
data = e.data
|
||||
@@ -312,10 +314,10 @@ class Decoder(Thread):
|
||||
for server in self.servers:
|
||||
if server.active and not article.server_in_try_list(server):
|
||||
if server.priority >= article.fetcher.priority:
|
||||
article.fetcher = None
|
||||
|
||||
article.tries = 0
|
||||
# Allow all servers for this nzo and nzf again (but not for this article)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article.nzf, article.nzf.nzo)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article, article_reset=False)
|
||||
return True
|
||||
|
||||
msg = T('%s => missing from all servers, discarding') % article
|
||||
@@ -333,7 +335,7 @@ class Decoder(Thread):
|
||||
return
|
||||
|
||||
# Set the md5-of-16k if this is the first article
|
||||
if article.partnum == nzf.lowest_partnum:
|
||||
if article.lowest_partnum:
|
||||
nzf.md5of16k = hashlib.md5(decoded_data[:16384]).digest()
|
||||
|
||||
# Try the rename
|
||||
|
||||
@@ -20,21 +20,27 @@
|
||||
##############################################################################
|
||||
from threading import RLock, Condition
|
||||
|
||||
DOWNLOADER_CV = Condition(RLock())
|
||||
|
||||
# All operations that modify the queue need to happen in a lock
|
||||
# Also used when importing NZBs to prevent IO-race conditions
|
||||
# Names of wrapper-functions should be the same in misc.caller_name
|
||||
# The NzbQueueLocker both locks and notifies the Downloader
|
||||
NZBQUEUE_LOCK = RLock()
|
||||
DOWNLOADER_CV = Condition(NZBQUEUE_LOCK)
|
||||
|
||||
def synchronized(lock):
|
||||
def wrap(f):
|
||||
def newFunction(*args, **kw):
|
||||
def call_func(*args, **kw):
|
||||
lock.acquire()
|
||||
try:
|
||||
return f(*args, **kw)
|
||||
finally:
|
||||
lock.release()
|
||||
return newFunction
|
||||
return call_func
|
||||
return wrap
|
||||
|
||||
|
||||
def notify_downloader(func):
|
||||
def NzbQueueLocker(func):
|
||||
global DOWNLOADER_CV
|
||||
def call_func(*params, **kparams):
|
||||
DOWNLOADER_CV.acquire()
|
||||
|
||||
@@ -28,19 +28,23 @@ import logging
|
||||
|
||||
import sabnzbd
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.misc import int_conv, clip_path, remove_all, globber, format_time_string, has_win_device
|
||||
from sabnzbd.misc import int_conv, clip_path, long_path, remove_all, globber, \
|
||||
format_time_string, has_win_device, real_path, remove_file
|
||||
from sabnzbd.encoding import TRANS, unicoder
|
||||
from sabnzbd.newsunpack import build_command, EXTRACTFROM_RE, rar_volumelist
|
||||
from sabnzbd.newsunpack import build_command, EXTRACTFROM_RE, EXTRACTED_RE, rar_volumelist
|
||||
from sabnzbd.postproc import prepare_extraction_path
|
||||
from sabnzbd.utils.rarfile import RarFile
|
||||
from sabnzbd.utils.diskspeed import diskspeedmeasure
|
||||
|
||||
if sabnzbd.WIN32:
|
||||
# Load the POpen from the fixed unicode-subprocess
|
||||
from sabnzbd.utils.subprocess_fix import Popen
|
||||
else:
|
||||
# Load the regular POpen
|
||||
from subprocess import Popen
|
||||
try:
|
||||
# Use patched version of subprocess module for Unicode on Windows
|
||||
import subprocessww
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
# Load the regular POpen (which is now patched on Windows)
|
||||
from subprocess import Popen
|
||||
|
||||
MAX_ACTIVE_UNPACKERS = 10
|
||||
ACTIVE_UNPACKERS = []
|
||||
@@ -150,6 +154,7 @@ class DirectUnpacker(threading.Thread):
|
||||
last_volume_linebuf = ''
|
||||
unrar_log = []
|
||||
rarfiles = []
|
||||
extracted = []
|
||||
start_time = time.time()
|
||||
|
||||
# Need to read char-by-char because there's no newline after new-disk message
|
||||
@@ -172,10 +177,21 @@ class DirectUnpacker(threading.Thread):
|
||||
logging.info('Error in DirectUnpack of %s', self.cur_setname)
|
||||
self.abort()
|
||||
|
||||
if linebuf.startswith('Extracting from') and linebuf.endswith('\n'):
|
||||
filename = TRANS((re.search(EXTRACTFROM_RE, linebuf.strip()).group(1)))
|
||||
if filename not in rarfiles:
|
||||
rarfiles.append(filename)
|
||||
if linebuf.endswith('\n'):
|
||||
# List files we used
|
||||
if linebuf.startswith('Extracting from'):
|
||||
filename = TRANS((re.search(EXTRACTFROM_RE, linebuf.strip()).group(1)))
|
||||
if filename not in rarfiles:
|
||||
rarfiles.append(filename)
|
||||
|
||||
# List files we extracted
|
||||
m = re.search(EXTRACTED_RE, linebuf)
|
||||
if m:
|
||||
# In case of flat-unpack, UnRar still prints the whole path (?!)
|
||||
unpacked_file = TRANS(m.group(2))
|
||||
if cfg.flat_unpack():
|
||||
unpacked_file = os.path.basename(unpacked_file)
|
||||
extracted.append(real_path(self.unpack_dir_info[0], unpacked_file))
|
||||
|
||||
# Did we reach the end?
|
||||
if linebuf.endswith('All OK'):
|
||||
@@ -185,16 +201,23 @@ class DirectUnpacker(threading.Thread):
|
||||
|
||||
# Add to success
|
||||
rarfile_path = os.path.join(self.nzo.downpath, self.rarfile_nzf.filename)
|
||||
self.success_sets[self.cur_setname] = rar_volumelist(rarfile_path, self.nzo.password, rarfiles)
|
||||
self.success_sets[self.cur_setname] = (rar_volumelist(rarfile_path, self.nzo.password, rarfiles), extracted)
|
||||
logging.info('DirectUnpack completed for %s', self.cur_setname)
|
||||
self.nzo.set_action_line(T('Direct Unpack'), T('Completed'))
|
||||
|
||||
# List success in history-info
|
||||
msg = T('Unpacked %s files/folders in %s') % (len(extracted), format_time_string(self.unpack_time))
|
||||
msg = '%s - %s' % (T('Direct Unpack'), msg)
|
||||
self.nzo.set_unpack_info('Unpack', '[%s] %s' % (unicoder(self.cur_setname), msg))
|
||||
|
||||
# Write current log and clear
|
||||
unrar_log.append(linebuf.strip())
|
||||
linebuf = ''
|
||||
last_volume_linebuf = ''
|
||||
logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log))
|
||||
unrar_log = []
|
||||
rarfiles = []
|
||||
extracted = []
|
||||
|
||||
# Are there more files left?
|
||||
while self.nzo.files and not self.next_sets:
|
||||
@@ -224,10 +247,15 @@ class DirectUnpacker(threading.Thread):
|
||||
|
||||
# Possible that the instance was deleted while locked
|
||||
if not self.killed:
|
||||
# Give unrar some time to do it's thing
|
||||
self.active_instance.stdin.write('\n')
|
||||
start_time = time.time()
|
||||
time.sleep(0.1)
|
||||
# If unrar stopped or is killed somehow, writing will cause a crash
|
||||
try:
|
||||
# Give unrar some time to do it's thing
|
||||
self.active_instance.stdin.write('C\n')
|
||||
start_time = time.time()
|
||||
time.sleep(0.1)
|
||||
except IOError:
|
||||
self.abort()
|
||||
break
|
||||
|
||||
# Did we unpack a new volume? Sometimes UnRar hangs on 1 volume
|
||||
if not last_volume_linebuf or last_volume_linebuf != linebuf:
|
||||
@@ -237,9 +265,12 @@ class DirectUnpacker(threading.Thread):
|
||||
logging.info('DirectUnpacked volume %s for %s', self.cur_volume, self.cur_setname)
|
||||
|
||||
# If lines did not change and we don't have the next volume, this download is missing files!
|
||||
if last_volume_linebuf == linebuf and not self.have_next_volume():
|
||||
logging.info('DirectUnpack failed due to missing files %s', self.cur_setname)
|
||||
self.abort()
|
||||
if last_volume_linebuf == linebuf:
|
||||
if not self.have_next_volume():
|
||||
logging.info('DirectUnpack failed due to missing files %s', self.cur_setname)
|
||||
self.abort()
|
||||
else:
|
||||
logging.debug('Duplicate output line detected: "%s"', last_volume_linebuf)
|
||||
|
||||
last_volume_linebuf = linebuf
|
||||
|
||||
@@ -252,14 +283,6 @@ class DirectUnpacker(threading.Thread):
|
||||
unrar_log.append(linebuf.strip())
|
||||
logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log))
|
||||
|
||||
# Save information if success
|
||||
if self.success_sets:
|
||||
# The number is wrong if one_folder, just leave empty
|
||||
nr_files = '' if self.unpack_dir_info[3] else len(globber(self.unpack_dir_info[0]))
|
||||
msg = T('Unpacked %s files/folders in %s') % (nr_files, format_time_string(self.unpack_time))
|
||||
msg = '%s - %s' % (T('Direct Unpack'), msg)
|
||||
self.nzo.set_unpack_info('Unpack', '[%s] %s' % (unicoder(self.cur_setname), msg))
|
||||
|
||||
# Make more space
|
||||
self.reset_active()
|
||||
if self in ACTIVE_UNPACKERS:
|
||||
@@ -290,7 +313,14 @@ class DirectUnpacker(threading.Thread):
|
||||
""" Start the unrar instance using the user's options """
|
||||
# Generate extraction path and save for post-proc
|
||||
if not self.unpack_dir_info:
|
||||
self.unpack_dir_info = prepare_extraction_path(self.nzo)
|
||||
try:
|
||||
self.unpack_dir_info = prepare_extraction_path(self.nzo)
|
||||
except:
|
||||
# Prevent fatal crash if directory creation fails
|
||||
self.abort()
|
||||
return
|
||||
|
||||
# Get the information
|
||||
extraction_path, _, _, one_folder, _ = self.unpack_dir_info
|
||||
|
||||
# Set options
|
||||
@@ -310,13 +340,11 @@ class DirectUnpacker(threading.Thread):
|
||||
# Generate command
|
||||
rarfile_path = os.path.join(self.nzo.downpath, self.rarfile_nzf.filename)
|
||||
if sabnzbd.WIN32:
|
||||
if not has_win_device(rarfile_path):
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), clip_path(extraction_path)]
|
||||
else:
|
||||
# Need long-path notation in case of forbidden-names
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % extraction_path]
|
||||
# For Unrar to support long-path, we need to cricumvent Python's list2cmdline
|
||||
# See: https://github.com/sabnzbd/sabnzbd/issues/1043
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % long_path(extraction_path)]
|
||||
|
||||
else:
|
||||
# Don't use "-ai" (not needed for non-Windows)
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', password_command,
|
||||
@@ -327,9 +355,9 @@ class DirectUnpacker(threading.Thread):
|
||||
|
||||
# Let's start from the first one!
|
||||
self.cur_volume = 1
|
||||
stup, need_shell, command, creationflags = build_command(command)
|
||||
stup, need_shell, command, creationflags = build_command(command, flatten_command=True)
|
||||
logging.debug('Running unrar for DirectUnpack %s', command)
|
||||
self.active_instance = Popen(command, shell=need_shell, stdin=subprocess.PIPE,
|
||||
self.active_instance = Popen(command, shell=False, stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||
startupinfo=stup, creationflags=creationflags)
|
||||
# Add to runners
|
||||
@@ -372,8 +400,7 @@ class DirectUnpacker(threading.Thread):
|
||||
for rm_file in rar_contents:
|
||||
# Flat-unpack, so remove foldername from RarFile output
|
||||
f = os.path.join(extraction_path, os.path.basename(rm_file))
|
||||
logging.debug('Removing file %s', f)
|
||||
os.remove(f)
|
||||
remove_file(f)
|
||||
except:
|
||||
# The user will have to remove it themselves
|
||||
logging.info('Failed to clean Direct Unpack after aborting %s', rarfile_nzf.filename, exc_info=True)
|
||||
|
||||
@@ -31,6 +31,7 @@ import sabnzbd
|
||||
from sabnzbd.constants import SCAN_FILE_NAME, VALID_ARCHIVES
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
from sabnzbd.encoding import platform_encode
|
||||
from sabnzbd.decorators import NzbQueueLocker
|
||||
from sabnzbd.newsunpack import is_sevenfile, SevenZip
|
||||
import sabnzbd.nzbstuff as nzbstuff
|
||||
import sabnzbd.misc as misc
|
||||
@@ -96,6 +97,7 @@ def is_archive(path):
|
||||
return 1, None, ''
|
||||
|
||||
|
||||
@NzbQueueLocker
|
||||
def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False,
|
||||
priority=None, url='', nzbname=None, password=None, nzo_id=None):
|
||||
""" Analyse ZIP file and create job(s).
|
||||
@@ -160,7 +162,7 @@ def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=No
|
||||
zf.close()
|
||||
try:
|
||||
if not keep:
|
||||
os.remove(path)
|
||||
misc.remove_file(path)
|
||||
except:
|
||||
logging.error(T('Error removing %s'), misc.clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -172,6 +174,7 @@ def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=No
|
||||
return status, nzo_ids
|
||||
|
||||
|
||||
@NzbQueueLocker
|
||||
def ProcessSingleFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False,
|
||||
priority=None, nzbname=None, reuse=False, nzo_info=None, dup_check=True, url='',
|
||||
password=None, nzo_id=None):
|
||||
@@ -246,7 +249,7 @@ def ProcessSingleFile(filename, path, pp=None, script=None, cat=None, catdir=Non
|
||||
nzo.update_rating()
|
||||
try:
|
||||
if not keep:
|
||||
os.remove(path)
|
||||
misc.remove_file(path)
|
||||
except:
|
||||
logging.error(T('Error removing %s'), misc.clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
@@ -30,7 +30,7 @@ import sys
|
||||
import Queue
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.decorators import synchronized, notify_downloader, DOWNLOADER_CV
|
||||
from sabnzbd.decorators import synchronized, NzbQueueLocker, DOWNLOADER_CV
|
||||
from sabnzbd.constants import MAX_DECODE_QUEUE, LIMIT_DECODE_QUEUE
|
||||
from sabnzbd.decoder import Decoder
|
||||
from sabnzbd.newswrapper import NewsWrapper, request_server_info
|
||||
@@ -256,12 +256,12 @@ class Downloader(Thread):
|
||||
|
||||
return
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def set_paused_state(self, state):
|
||||
""" Set downloader to specified paused state """
|
||||
self.paused = state
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def resume(self):
|
||||
# Do not notify when SABnzbd is still starting
|
||||
if self.paused and sabnzbd.WEB_DIR:
|
||||
@@ -269,8 +269,8 @@ class Downloader(Thread):
|
||||
notifier.send_notification("SABnzbd", T('Resuming'), 'download')
|
||||
self.paused = False
|
||||
|
||||
@notify_downloader
|
||||
def pause(self, save=True):
|
||||
@NzbQueueLocker
|
||||
def pause(self):
|
||||
""" Pause the downloader, optionally saving admin """
|
||||
if not self.paused:
|
||||
self.paused = True
|
||||
@@ -280,14 +280,12 @@ class Downloader(Thread):
|
||||
BPSMeter.do.reset()
|
||||
if cfg.autodisconnect():
|
||||
self.disconnect()
|
||||
if save:
|
||||
ArticleCache.do.flush_articles()
|
||||
|
||||
def delay(self):
|
||||
logging.debug("Delaying")
|
||||
self.delayed = True
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def undelay(self):
|
||||
logging.debug("Undelaying")
|
||||
self.delayed = False
|
||||
@@ -296,7 +294,7 @@ class Downloader(Thread):
|
||||
logging.info("Waiting for post-processing to finish")
|
||||
self.postproc = True
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def resume_from_postproc(self):
|
||||
logging.info("Post-processing finished, resuming download")
|
||||
self.postproc = False
|
||||
@@ -540,7 +538,7 @@ class Downloader(Thread):
|
||||
# Check 10 seconds after enabling slowdown
|
||||
if self.can_be_slowed_timer and time.time() > self.can_be_slowed_timer + 10:
|
||||
# Now let's check if it was stable in the last 10 seconds
|
||||
self.can_be_slowed = (BPSMeter.do.get_stable_speed(timespan=10) > 0)
|
||||
self.can_be_slowed = BPSMeter.do.get_stable_speed(timespan=10)
|
||||
self.can_be_slowed_timer = 0
|
||||
logging.debug('Downloader-slowdown: %r', self.can_be_slowed)
|
||||
|
||||
@@ -794,11 +792,8 @@ class Downloader(Thread):
|
||||
# Too many tries on this server, consider article missing
|
||||
self.decode(article, None, None)
|
||||
else:
|
||||
# Remove this server from try_list
|
||||
article.fetcher = None
|
||||
|
||||
# Allow all servers to iterate over each nzo/nzf again
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article.nzf, article.nzf.nzo)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
|
||||
|
||||
if destroy:
|
||||
nw.terminate(quit=quit)
|
||||
@@ -863,7 +858,7 @@ class Downloader(Thread):
|
||||
del self._timers[server_id]
|
||||
self.init_server(server_id, server_id)
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
@synchronized(TIMER_LOCK)
|
||||
def unblock(self, server_id):
|
||||
# Remove timer
|
||||
@@ -882,7 +877,7 @@ class Downloader(Thread):
|
||||
for server_id in self._timers.keys():
|
||||
self.unblock(server_id)
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
@synchronized(TIMER_LOCK)
|
||||
def check_timers(self):
|
||||
""" Make sure every server without a non-expired timer is active """
|
||||
@@ -905,7 +900,7 @@ class Downloader(Thread):
|
||||
def update_server(self, oldserver, newserver):
|
||||
self.init_server(oldserver, newserver)
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def wakeup(self):
|
||||
""" Just rattle the semaphore """
|
||||
pass
|
||||
|
||||
@@ -149,6 +149,8 @@ def send(message, email_to, test=None):
|
||||
else:
|
||||
logging.info("Notification e-mail successfully sent")
|
||||
return T('Email succeeded')
|
||||
else:
|
||||
return T('Cannot send, missing required data')
|
||||
|
||||
|
||||
def get_email_date():
|
||||
@@ -218,7 +220,7 @@ def send_with_template(prefix, parm, test=None):
|
||||
def endjob(filename, cat, status, path, bytes, fail_msg, stages, script, script_output, script_ret, test=None):
|
||||
""" Send end-of-job email """
|
||||
# Is it allowed?
|
||||
if not check_cat('email', cat):
|
||||
if not check_cat('misc', cat, keyword='email') and not test:
|
||||
return None
|
||||
|
||||
# Translate the stage names
|
||||
|
||||
@@ -20,6 +20,7 @@ sabnzbd.encoding - Unicoded filename support
|
||||
"""
|
||||
|
||||
import locale
|
||||
import string
|
||||
from xml.sax.saxutils import escape
|
||||
from Cheetah.Filters import Filter
|
||||
|
||||
@@ -70,19 +71,6 @@ def yenc_name_fixer(p):
|
||||
return p.decode('cp1252', errors='replace').replace('?', '!')
|
||||
|
||||
|
||||
def is_utf8(p):
|
||||
""" Return True when p is UTF-8 or plain ASCII """
|
||||
utf8 = True
|
||||
try:
|
||||
p.decode('ascii')
|
||||
except:
|
||||
try:
|
||||
p.decode('utf-8')
|
||||
except:
|
||||
utf8 = False
|
||||
return utf8
|
||||
|
||||
|
||||
def special_fixer(p):
|
||||
""" Return string appropriate for the platform.
|
||||
Also takes care of the situation where a non-Windows/UTF-8 system
|
||||
@@ -123,7 +111,6 @@ def unicoder(p, force=False):
|
||||
|
||||
def xml_name(p, keep_escape=False, encoding=None):
|
||||
""" Prepare name for use in HTML/XML contect """
|
||||
|
||||
if isinstance(p, unicode):
|
||||
pass
|
||||
elif isinstance(p, str):
|
||||
@@ -184,10 +171,10 @@ class EmailFilter(Filter):
|
||||
################################################################################
|
||||
#
|
||||
# Map CodePage-850 characters to Python's pseudo-Unicode 8bit ASCII
|
||||
#
|
||||
# Use to transform 8-bit console output to plain Python strings
|
||||
# For example for unrar and par2 output
|
||||
#
|
||||
import string
|
||||
|
||||
TAB_850 = \
|
||||
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F" \
|
||||
"\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F" \
|
||||
@@ -200,7 +187,7 @@ TAB_850 = \
|
||||
|
||||
TAB_LATIN = \
|
||||
"\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5" \
|
||||
"\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xF8\xA3\xD8\xD7\x66" \
|
||||
"\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xF8\xA3\xD8\xD7\x83" \
|
||||
"\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\xAE\xAC\xDB\xBC\xA1\xAB\xBB" \
|
||||
"\x7E\x7E\x7E\x7E\x7E\xC1\xC2\xC0\xA9\x7E\x7E\x7E\x7E\xA2\xA5\x7E" \
|
||||
"\x7E\x7E\x7E\x7E\x7E\x7E\xE3\xc3\x7E\x7E\x7E\x7E\x7E\x7E\x7E\xA4" \
|
||||
@@ -208,32 +195,21 @@ TAB_LATIN = \
|
||||
"\xD3\xDF\xD4\xD2\xF5\xD5\xB5\xFE\xDE\xDA\xDB\xD9\xFD\xDD\xAF\xB4" \
|
||||
"\xAD\xB1\x5F\xBE\xB6\xA7\xF7\xB8\xB0\xA8\xB7\xB9\xB3\xB2\x7E\xA0"
|
||||
|
||||
gTABLE_850_LATIN = string.maketrans(TAB_850, TAB_LATIN)
|
||||
gTABLE_LATIN_850 = string.maketrans(TAB_LATIN, TAB_850)
|
||||
|
||||
|
||||
def TRANS(p):
|
||||
""" For Windows: Translate CP850 to Python's Latin-1 and return in Unicode
|
||||
Others: return original string
|
||||
"""
|
||||
global gTABLE_850_LATIN
|
||||
if sabnzbd.WIN32:
|
||||
return p.translate(gTABLE_850_LATIN).decode('cp1252', 'replace')
|
||||
if p:
|
||||
return p.translate(string.maketrans(TAB_850, TAB_LATIN)).decode('cp1252', 'replace')
|
||||
else:
|
||||
# translate() fails on empty or None strings
|
||||
return ''
|
||||
else:
|
||||
return unicoder(p)
|
||||
|
||||
|
||||
def UNTRANS(p):
|
||||
""" For Windows: Translate Python's Latin-1 to CP850
|
||||
Others: return original string
|
||||
"""
|
||||
global gTABLE_LATIN_850
|
||||
if sabnzbd.WIN32:
|
||||
return p.encode('cp1252', 'replace').translate(gTABLE_LATIN_850)
|
||||
else:
|
||||
return p
|
||||
|
||||
|
||||
def fixup_ff4(p):
|
||||
""" Fix incompatibility between CherryPy and Firefox-4 on OSX,
|
||||
where a filename contains &#xx; encodings
|
||||
@@ -305,7 +281,7 @@ def deunicode(p):
|
||||
except:
|
||||
return p
|
||||
else:
|
||||
return p
|
||||
return str(p)
|
||||
|
||||
|
||||
auto_fsys()
|
||||
|
||||
@@ -39,7 +39,7 @@ import sabnzbd.scheduler as scheduler
|
||||
|
||||
from Cheetah.Template import Template
|
||||
from sabnzbd.misc import real_path, to_units, from_units, \
|
||||
time_format, long_path, calc_age, \
|
||||
time_format, long_path, calc_age, same_file, \
|
||||
cat_to_opts, int_conv, globber, globber_full, remove_all, get_base_url
|
||||
from sabnzbd.newswrapper import GetServerParms
|
||||
from sabnzbd.rating import Rating
|
||||
@@ -1373,7 +1373,7 @@ class ConfigSwitches(object):
|
||||
SPECIAL_BOOL_LIST = \
|
||||
('start_paused', 'no_penalties', 'ignore_wrong_unrar', 'overwrite_files', 'enable_par_cleanup',
|
||||
'queue_complete_pers', 'api_warnings', 'ampm', 'enable_unrar', 'enable_unzip', 'enable_7zip',
|
||||
'enable_filejoin', 'enable_tsjoin', 'ignore_unrar_dates',
|
||||
'enable_filejoin', 'enable_tsjoin', 'ignore_unrar_dates', 'debug_log_decoding',
|
||||
'multipar', 'osx_menu', 'osx_speed', 'win_menu', 'use_pickle', 'allow_incomplete_nzb',
|
||||
'rss_filenames', 'ipv6_hosting', 'keep_awake', 'empty_postproc', 'html_login', 'wait_for_dfolder',
|
||||
'max_art_opt', 'warn_empty_nzb', 'enable_bonjour', 'reject_duplicate_files', 'warn_dupl_jobs',
|
||||
@@ -2349,12 +2349,17 @@ class ConfigCats(object):
|
||||
else:
|
||||
newname = re.sub('"', '', kwargs.get('newname', ''))
|
||||
if newname:
|
||||
if name:
|
||||
config.delete('categories', name)
|
||||
name = newname.lower()
|
||||
if kwargs.get('dir'):
|
||||
kwargs['dir'] = platform_encode(kwargs['dir'])
|
||||
config.ConfigCat(name, kwargs)
|
||||
|
||||
# Check if this cat-dir is not sub-folder of incomplete
|
||||
if same_file(cfg.download_dir.get_path(), real_path(cfg.complete_dir.get_path(), kwargs['dir'])):
|
||||
return T('Category folder cannot be a subfolder of the Temporary Download Folder.')
|
||||
|
||||
# Delete current one and replace with new one
|
||||
if name:
|
||||
config.delete('categories', name)
|
||||
config.ConfigCat(newname.lower(), kwargs)
|
||||
|
||||
config.save_config()
|
||||
raise Raiser(self.__root)
|
||||
@@ -2734,7 +2739,7 @@ LIST_PROWL = ('prowl_enable', 'prowl_cats', 'prowl_apikey',
|
||||
LIST_PUSHOVER = ('pushover_enable', 'pushover_cats', 'pushover_token', 'pushover_userkey', 'pushover_device',
|
||||
'pushover_prio_startup', 'pushover_prio_download', 'pushover_prio_pp', 'pushover_prio_complete', 'pushover_prio_failed',
|
||||
'pushover_prio_disk_full', 'pushover_prio_warning', 'pushover_prio_error', 'pushover_prio_queue_done', 'pushover_prio_other',
|
||||
'pushover_prio_new_login')
|
||||
'pushover_prio_new_login', 'pushover_emergency_retry', 'pushover_emergency_expire')
|
||||
LIST_PUSHBULLET = ('pushbullet_enable', 'pushbullet_cats', 'pushbullet_apikey', 'pushbullet_device',
|
||||
'pushbullet_prio_startup', 'pushbullet_prio_download', 'pushbullet_prio_pp', 'pushbullet_prio_complete', 'pushbullet_prio_failed',
|
||||
'pushbullet_prio_disk_full', 'pushbullet_prio_warning', 'pushbullet_prio_error', 'pushbullet_prio_queue_done', 'pushbullet_prio_other',
|
||||
|
||||
145
sabnzbd/misc.py
145
sabnzbd/misc.py
@@ -24,21 +24,23 @@ import sys
|
||||
import logging
|
||||
import urllib
|
||||
import re
|
||||
import ctypes
|
||||
import shutil
|
||||
import threading
|
||||
import subprocess
|
||||
import socket
|
||||
import time
|
||||
import calendar
|
||||
import datetime
|
||||
import fnmatch
|
||||
import stat
|
||||
import inspect
|
||||
import urllib2
|
||||
from urlparse import urlparse
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.decorators import synchronized
|
||||
from sabnzbd.constants import DEFAULT_PRIORITY, FUTURE_Q_FOLDER, JOB_ADMIN, \
|
||||
GIGI, MEBI, DEF_CACHE_LIMIT
|
||||
GIGI, MEBI, DEF_ARTICLE_CACHE_DEFAULT, DEF_ARTICLE_CACHE_MAX
|
||||
import sabnzbd.config as config
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.encoding import unicoder, special_fixer, gUTF
|
||||
@@ -167,7 +169,7 @@ def cat_to_opts(cat, pp=None, script=None, priority=None):
|
||||
if safe_lower(script) in ('', 'default'):
|
||||
script = def_cat.script()
|
||||
|
||||
if priority is None or priority == DEFAULT_PRIORITY:
|
||||
if priority is None or priority == '' or priority == DEFAULT_PRIORITY:
|
||||
priority = my_cat.priority()
|
||||
if priority == DEFAULT_PRIORITY:
|
||||
priority = def_cat.priority()
|
||||
@@ -737,12 +739,12 @@ def from_units(val):
|
||||
return 0.0
|
||||
|
||||
|
||||
def to_units(val, spaces=0, dec_limit=2, postfix=''):
|
||||
def to_units(val, spaces=0, postfix=''):
|
||||
""" Convert number to K/M/G/T/P notation
|
||||
Add "spaces" if not ending in letter
|
||||
dig_limit==1 show single decimal for M and higher
|
||||
dig_limit==2 show single decimal for G and higher
|
||||
Show single decimal for M and higher
|
||||
"""
|
||||
dec_limit = 1
|
||||
decimals = 0
|
||||
if val < 0:
|
||||
sign = '-'
|
||||
@@ -770,6 +772,31 @@ def to_units(val, spaces=0, dec_limit=2, postfix=''):
|
||||
return fmt % (sign, val, unit, postfix)
|
||||
|
||||
|
||||
def caller_name(skip=2):
|
||||
"""Get a name of a caller in the format module.method
|
||||
Originally used: https://gist.github.com/techtonik/2151727
|
||||
Adapted for speed by using sys calls directly
|
||||
"""
|
||||
# Only do the tracing on Debug (function is always called)
|
||||
if cfg.log_level() != 2:
|
||||
return 'N/A'
|
||||
|
||||
parentframe = sys._getframe(skip)
|
||||
function_name = parentframe.f_code.co_name
|
||||
|
||||
# Modulename not available in the binaries, we can use the filename instead
|
||||
if getattr(sys, 'frozen', None):
|
||||
module_name = inspect.getfile(parentframe)
|
||||
else:
|
||||
module_name = inspect.getmodule(parentframe).__name__
|
||||
|
||||
# For decorated functions we have to go deeper
|
||||
if function_name in ('call_func', 'wrap') and skip == 2:
|
||||
return caller_name(4)
|
||||
|
||||
return ".".join([module_name, function_name])
|
||||
|
||||
|
||||
def same_file(a, b):
|
||||
""" Return 0 if A and B have nothing in common
|
||||
return 1 if A and B are actually the same path
|
||||
@@ -820,6 +847,14 @@ def split_host(srv):
|
||||
return (host, port)
|
||||
|
||||
|
||||
def get_from_url(url):
|
||||
""" Retrieve URL and return content """
|
||||
try:
|
||||
return urllib2.urlopen(url).read()
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def check_mount(path):
|
||||
""" Return False if volume isn't mounted on Linux or OSX
|
||||
Retry 6 times with an interval of 1 sec.
|
||||
@@ -841,27 +876,74 @@ def check_mount(path):
|
||||
|
||||
|
||||
def get_cache_limit():
|
||||
""" Depending on OS, calculate cache limit """
|
||||
# OSX/Windows use Default value
|
||||
if sabnzbd.WIN32 or sabnzbd.DARWIN:
|
||||
return DEF_CACHE_LIMIT
|
||||
|
||||
""" Depending on OS, calculate cache limits.
|
||||
In ArticleCache it will make sure we stay
|
||||
within system limits for 32/64 bit
|
||||
"""
|
||||
# Calculate, if possible
|
||||
try:
|
||||
if sabnzbd.WIN32:
|
||||
# Windows
|
||||
mem_bytes = get_windows_memory()
|
||||
elif sabnzbd.DARWIN:
|
||||
# macOS
|
||||
mem_bytes = get_darwin_memory()
|
||||
else:
|
||||
# Linux
|
||||
mem_bytes = (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))
|
||||
|
||||
# Use 1/4th of available memory
|
||||
mem_bytes = (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))/4
|
||||
# Not more than the maximum we think is reasonable
|
||||
if mem_bytes > from_units(DEF_CACHE_LIMIT):
|
||||
return DEF_CACHE_LIMIT
|
||||
elif mem_bytes > from_units('32M'):
|
||||
# We make sure it's at least a valid value
|
||||
mem_bytes = mem_bytes/4
|
||||
|
||||
# We don't want to set a value that's too high
|
||||
if mem_bytes > from_units(DEF_ARTICLE_CACHE_MAX):
|
||||
return DEF_ARTICLE_CACHE_MAX
|
||||
|
||||
# We make sure it's at least a valid value
|
||||
if mem_bytes > from_units('32M'):
|
||||
return to_units(mem_bytes)
|
||||
except:
|
||||
pass
|
||||
# If failed, leave empty so user needs to decide
|
||||
|
||||
# Always at least minimum on Windows/macOS
|
||||
if sabnzbd.WIN32 and sabnzbd.DARWIN:
|
||||
return DEF_ARTICLE_CACHE_DEFAULT
|
||||
|
||||
# If failed, leave empty for Linux so user needs to decide
|
||||
return ''
|
||||
|
||||
|
||||
def get_windows_memory():
|
||||
""" Use ctypes to extract available memory """
|
||||
class MEMORYSTATUSEX(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("dwLength", ctypes.c_ulong),
|
||||
("dwMemoryLoad", ctypes.c_ulong),
|
||||
("ullTotalPhys", ctypes.c_ulonglong),
|
||||
("ullAvailPhys", ctypes.c_ulonglong),
|
||||
("ullTotalPageFile", ctypes.c_ulonglong),
|
||||
("ullAvailPageFile", ctypes.c_ulonglong),
|
||||
("ullTotalVirtual", ctypes.c_ulonglong),
|
||||
("ullAvailVirtual", ctypes.c_ulonglong),
|
||||
("sullAvailExtendedVirtual", ctypes.c_ulonglong),
|
||||
]
|
||||
|
||||
def __init__(self):
|
||||
# have to initialize this to the size of MEMORYSTATUSEX
|
||||
self.dwLength = ctypes.sizeof(self)
|
||||
super(MEMORYSTATUSEX, self).__init__()
|
||||
|
||||
stat = MEMORYSTATUSEX()
|
||||
ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))
|
||||
return stat.ullTotalPhys
|
||||
|
||||
|
||||
def get_darwin_memory():
|
||||
""" Use system-call to extract total memory on macOS """
|
||||
system_output = sabnzbd.newsunpack.run_simple(['sysctl', 'hw.memsize'])
|
||||
return float(system_output.split()[1])
|
||||
|
||||
|
||||
##############################################################################
|
||||
# Locked directory operations to avoid problems with simultaneous add/remove
|
||||
##############################################################################
|
||||
@@ -923,7 +1005,7 @@ def move_to_path(path, new_path):
|
||||
new_path = os.path.abspath(new_path)
|
||||
if overwrite and os.path.exists(new_path):
|
||||
try:
|
||||
os.remove(new_path)
|
||||
remove_file(new_path)
|
||||
except:
|
||||
overwrite = False
|
||||
if not overwrite:
|
||||
@@ -941,7 +1023,7 @@ def move_to_path(path, new_path):
|
||||
if not os.path.exists(os.path.dirname(new_path)):
|
||||
create_dirs(os.path.dirname(new_path))
|
||||
shutil.copyfile(path, new_path)
|
||||
os.remove(path)
|
||||
remove_file(path)
|
||||
except:
|
||||
# Check if the old-file actually exists (possible delete-delays)
|
||||
if not os.path.exists(path):
|
||||
@@ -1056,12 +1138,11 @@ def renamer(old, new):
|
||||
@synchronized(DIR_LOCK)
|
||||
def remove_dir(path):
|
||||
""" Remove directory with retries for Win32 """
|
||||
logging.debug('Removing dir %s', path)
|
||||
if sabnzbd.WIN32:
|
||||
retries = 15
|
||||
while retries > 0:
|
||||
try:
|
||||
os.rmdir(path)
|
||||
remove_dir(path)
|
||||
return
|
||||
except WindowsError, err:
|
||||
if err[0] == 32:
|
||||
@@ -1072,7 +1153,7 @@ def remove_dir(path):
|
||||
time.sleep(3)
|
||||
raise WindowsError(err)
|
||||
else:
|
||||
os.rmdir(path)
|
||||
remove_dir(path)
|
||||
|
||||
|
||||
@synchronized(DIR_LOCK)
|
||||
@@ -1086,20 +1167,30 @@ def remove_all(path, pattern='*', keep_folder=False, recursive=False):
|
||||
for f in files:
|
||||
if os.path.isfile(f):
|
||||
try:
|
||||
logging.debug('Removing file %s', f)
|
||||
os.remove(f)
|
||||
remove_file(f)
|
||||
except:
|
||||
logging.info('Cannot remove file %s', f)
|
||||
elif recursive:
|
||||
remove_all(f, pattern, False, True)
|
||||
if not keep_folder:
|
||||
try:
|
||||
logging.debug('Removing dir %s', path)
|
||||
os.rmdir(path)
|
||||
remove_dir(path)
|
||||
except:
|
||||
logging.info('Cannot remove folder %s', path)
|
||||
|
||||
|
||||
def remove_file(path):
|
||||
""" Wrapper function so any file removal is logged """
|
||||
logging.debug('[%s] Deleting file %s', caller_name(), path)
|
||||
os.remove(path)
|
||||
|
||||
|
||||
def remove_dir(dir):
|
||||
""" Wrapper function so any dir removal is logged """
|
||||
logging.debug('[%s] Deleting dir %s', caller_name(), dir)
|
||||
os.rmdir(dir)
|
||||
|
||||
|
||||
def trim_win_path(path):
|
||||
""" Make sure Windows path stays below 70 by trimming last part """
|
||||
if sabnzbd.WIN32 and len(path) > 69:
|
||||
|
||||
@@ -29,12 +29,12 @@ import binascii
|
||||
import shutil
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.encoding import TRANS, UNTRANS, unicoder, platform_encode, deunicode
|
||||
from sabnzbd.encoding import TRANS, unicoder, platform_encode, deunicode
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
from sabnzbd.misc import format_time_string, find_on_path, make_script_path, int_conv, \
|
||||
real_path, globber, globber_full, get_all_passwords, renamer, clip_path, \
|
||||
has_win_device, calc_age, long_path
|
||||
from sabnzbd.tvsort import SeriesSorter
|
||||
has_win_device, calc_age, long_path, remove_file
|
||||
from sabnzbd.sorting import SeriesSorter
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.constants import Status
|
||||
|
||||
@@ -43,10 +43,11 @@ if sabnzbd.WIN32:
|
||||
import win32api
|
||||
from win32con import SW_HIDE
|
||||
from win32process import STARTF_USESHOWWINDOW, IDLE_PRIORITY_CLASS
|
||||
|
||||
# Use patched version of subprocess module for Unicode on Windows
|
||||
import subprocessww
|
||||
except ImportError:
|
||||
pass
|
||||
# Load the POpen from the fixed unicode-subprocess
|
||||
from sabnzbd.utils.subprocess_fix import Popen
|
||||
else:
|
||||
# Define dummy WindowsError for non-Windows
|
||||
class WindowsError(Exception):
|
||||
@@ -55,8 +56,9 @@ else:
|
||||
|
||||
def __str__(self):
|
||||
return repr(self.parameter)
|
||||
# Load the regular POpen
|
||||
from subprocess import Popen
|
||||
|
||||
# Load the regular POpen (which is now patched on Windows)
|
||||
from subprocess import Popen
|
||||
|
||||
# Regex globals
|
||||
RAR_RE = re.compile(r'\.(?P<ext>part\d*\.rar|rar|r\d\d|s\d\d|t\d\d|u\d\d|v\d\d|\d\d\d)$', re.I)
|
||||
@@ -65,6 +67,7 @@ RAR_RE_V3 = re.compile(r'\.(?P<ext>part\d*)$', re.I)
|
||||
LOADING_RE = re.compile(r'^Loading "(.+)"')
|
||||
TARGET_RE = re.compile(r'^(?:File|Target): "(.+)" -')
|
||||
EXTRACTFROM_RE = re.compile(r'^Extracting\sfrom\s(.+)')
|
||||
EXTRACTED_RE = re.compile(r'^(Extracting|Creating|...)\s+(.*?)\s+OK\s*$')
|
||||
SPLITFILE_RE = re.compile(r'\.(\d\d\d$)', re.I)
|
||||
ZIP_RE = re.compile(r'\.(zip$)', re.I)
|
||||
SEVENZIP_RE = re.compile(r'\.7z$', re.I)
|
||||
@@ -107,7 +110,6 @@ def find_programs(curdir):
|
||||
sabnzbd.newsunpack.MULTIPAR_COMMAND = check(curdir, 'win/par2/multipar/par2j.exe')
|
||||
sabnzbd.newsunpack.RAR_COMMAND = check(curdir, 'win/unrar/UnRAR.exe')
|
||||
sabnzbd.newsunpack.PAR2_COMMAND = check(curdir, 'win/par2/par2.exe')
|
||||
sabnzbd.newsunpack.ZIP_COMMAND = check(curdir, 'win/unzip/unzip.exe')
|
||||
sabnzbd.newsunpack.SEVEN_COMMAND = check(curdir, 'win/7zip/7za.exe')
|
||||
else:
|
||||
if not sabnzbd.newsunpack.PAR2_COMMAND:
|
||||
@@ -139,12 +141,12 @@ ENV_NZO_FIELDS = ['bytes', 'bytes_downloaded', 'bytes_tried', 'cat', 'duplicate'
|
||||
|
||||
def external_processing(extern_proc, nzo, complete_dir, nicename, status):
|
||||
""" Run a user postproc script, return console output and exit value """
|
||||
command = [str(extern_proc), str(complete_dir), str(nzo.filename),
|
||||
str(nicename), '', str(nzo.cat), str(nzo.group), str(status)]
|
||||
|
||||
failure_url = nzo.nzo_info.get('failure', '')
|
||||
if failure_url:
|
||||
command.append(str(failure_url))
|
||||
command = [str(extern_proc), str(complete_dir), str(nzo.filename), str(nicename), '',
|
||||
str(nzo.cat), str(nzo.group), str(status), str(failure_url)]
|
||||
|
||||
# Add path to original NZB
|
||||
nzb_paths = globber_full(nzo.workpath, '*.gz')
|
||||
|
||||
# Fields not in the NZO directly
|
||||
extra_env_fields = {'failure_url': failure_url,
|
||||
@@ -153,6 +155,13 @@ def external_processing(extern_proc, nzo, complete_dir, nicename, status):
|
||||
'download_time': nzo.nzo_info.get('download_time', ''),
|
||||
'avg_bps': int(nzo.avg_bps_total / nzo.avg_bps_freq) if nzo.avg_bps_freq else 0,
|
||||
'age': calc_age(nzo.avg_date),
|
||||
'orig_nzb_gz': clip_path(nzb_paths[0]) if nzb_paths else '',
|
||||
'program_dir': sabnzbd.DIR_PROG,
|
||||
'par2_command': sabnzbd.newsunpack.PAR2_COMMAND,
|
||||
'multipar_command': sabnzbd.newsunpack.MULTIPAR_COMMAND,
|
||||
'rar_command': sabnzbd.newsunpack.RAR_COMMAND,
|
||||
'zip_command': sabnzbd.newsunpack.ZIP_COMMAND,
|
||||
'7zip_command': sabnzbd.newsunpack.SEVEN_COMMAND,
|
||||
'version': sabnzbd.__version__}
|
||||
|
||||
try:
|
||||
@@ -178,6 +187,9 @@ def external_processing(extern_proc, nzo, complete_dir, nicename, status):
|
||||
line = line.strip()
|
||||
lines.append(line)
|
||||
|
||||
# Show current line in history
|
||||
nzo.set_action_line(T('Running script'), unicoder(line))
|
||||
|
||||
# Check if we should still continue
|
||||
if not nzo.pp_active:
|
||||
p.kill()
|
||||
@@ -255,16 +267,6 @@ def unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, joinables, zi
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_unzip():
|
||||
new_zips = [zip for zip in xzips if zip not in zips]
|
||||
if new_zips:
|
||||
logging.info('Unzip starting on %s', workdir)
|
||||
if unzip(nzo, workdir, workdir_complete, dele, one_folder, new_zips):
|
||||
error = 1
|
||||
logging.info('Unzip finished on %s', workdir)
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_7zip():
|
||||
new_sevens = [seven for seven in xsevens if seven not in sevens]
|
||||
if new_sevens:
|
||||
@@ -275,6 +277,20 @@ def unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, joinables, zi
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_unzip():
|
||||
new_zips = [zip for zip in xzips if zip not in zips]
|
||||
if new_zips:
|
||||
logging.info('Unzip starting on %s', workdir)
|
||||
if SEVEN_COMMAND:
|
||||
if unseven(nzo, workdir, workdir_complete, dele, one_folder, new_zips):
|
||||
error = True
|
||||
else:
|
||||
if unzip(nzo, workdir, workdir_complete, dele, one_folder, new_zips):
|
||||
error = True
|
||||
logging.info('Unzip finished on %s', workdir)
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_tsjoin():
|
||||
new_ts = [_ts for _ts in xts if _ts not in ts]
|
||||
if new_ts:
|
||||
@@ -330,16 +346,14 @@ def clean_up_joinables(names):
|
||||
""" Remove joinable files and their .1 backups """
|
||||
for name in names:
|
||||
if os.path.exists(name):
|
||||
logging.debug("Deleting %s", name)
|
||||
try:
|
||||
os.remove(name)
|
||||
remove_file(name)
|
||||
except:
|
||||
pass
|
||||
name1 = name + ".1"
|
||||
if os.path.exists(name1):
|
||||
logging.debug("Deleting %s", name1)
|
||||
try:
|
||||
os.remove(name1)
|
||||
remove_file(name1)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -415,8 +429,7 @@ def file_join(nzo, workdir, workdir_complete, delete, joinables):
|
||||
shutil.copyfileobj(f, joined_file, bufsize)
|
||||
f.close()
|
||||
if delete:
|
||||
logging.debug("Deleting %s", joinable)
|
||||
os.remove(joinable)
|
||||
remove_file(joinable)
|
||||
n += 1
|
||||
|
||||
# Remove any remaining .1 files
|
||||
@@ -480,20 +493,30 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
|
||||
|
||||
# Is the direct-unpacker still running? We wait for it
|
||||
if nzo.direct_unpacker:
|
||||
wait_count = 0
|
||||
last_stats = nzo.direct_unpacker.get_formatted_stats()
|
||||
while nzo.direct_unpacker.is_alive():
|
||||
logging.debug('DirectUnpacker still alive for %s', nzo)
|
||||
logging.debug('DirectUnpacker still alive for %s: %s', nzo.work_name, last_stats)
|
||||
|
||||
# Bump the file-lock in case it's stuck
|
||||
with nzo.direct_unpacker.next_file_lock:
|
||||
nzo.direct_unpacker.next_file_lock.notify()
|
||||
time.sleep(2)
|
||||
|
||||
# Did something change? Might be stuck
|
||||
if last_stats == nzo.direct_unpacker.get_formatted_stats():
|
||||
wait_count += 1
|
||||
if wait_count > 60:
|
||||
# We abort after 2 minutes of no changes
|
||||
nzo.direct_unpacker.abort()
|
||||
last_stats = nzo.direct_unpacker.get_formatted_stats()
|
||||
|
||||
# Did we already direct-unpack it? Not when recursive-unpacking
|
||||
if nzo.direct_unpacker and rar_set in nzo.direct_unpacker.success_sets:
|
||||
logging.info("Set %s completed by DirectUnpack", rar_set)
|
||||
fail = False
|
||||
success = True
|
||||
rars = nzo.direct_unpacker.success_sets.pop(rar_set)
|
||||
newfiles = globber(extraction_path)
|
||||
rars, newfiles = nzo.direct_unpacker.success_sets.pop(rar_set)
|
||||
else:
|
||||
logging.info("Extracting rarfile %s (belonging to %s) to %s",
|
||||
rarpath, rar_set, extraction_path)
|
||||
@@ -541,9 +564,8 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
|
||||
# Delete the old files if we have to
|
||||
if success and delete and newfiles:
|
||||
for rar in rars:
|
||||
logging.info("Deleting %s", rar)
|
||||
try:
|
||||
os.remove(rar)
|
||||
remove_file(rar)
|
||||
except OSError:
|
||||
if os.path.exists(rar):
|
||||
logging.warning(T('Deleting %s failed!'), rar)
|
||||
@@ -553,7 +575,7 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
|
||||
if os.path.exists(brokenrar):
|
||||
logging.info("Deleting %s", brokenrar)
|
||||
try:
|
||||
os.remove(brokenrar)
|
||||
remove_file(brokenrar)
|
||||
except OSError:
|
||||
if os.path.exists(brokenrar):
|
||||
logging.warning(T('Deleting %s failed!'), brokenrar)
|
||||
@@ -613,18 +635,10 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
|
||||
rename = '-or' # Auto renaming
|
||||
|
||||
if sabnzbd.WIN32:
|
||||
# Use all flags
|
||||
if not has_win_device(rarfile_path):
|
||||
command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), clip_path(extraction_path)]
|
||||
else:
|
||||
# Need long-path notation in case of forbidden-names
|
||||
command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % extraction_path]
|
||||
|
||||
# The subprocess_fix requires time to clear the buffers to work,
|
||||
# otherwise the inputs get send incorrectly and unrar breaks
|
||||
time.sleep(0.5)
|
||||
# For Unrar to support long-path, we need to cricumvent Python's list2cmdline
|
||||
# See: https://github.com/sabnzbd/sabnzbd/issues/1043
|
||||
command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % long_path(extraction_path)]
|
||||
|
||||
elif RAR_PROBLEM:
|
||||
# Use only oldest options (specifically no "-or")
|
||||
@@ -638,7 +652,7 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
|
||||
if cfg.ignore_unrar_dates():
|
||||
command.insert(3, '-tsm-')
|
||||
|
||||
stup, need_shell, command, creationflags = build_command(command)
|
||||
stup, need_shell, command, creationflags = build_command(command, flatten_command=True)
|
||||
|
||||
# Get list of all the volumes part of this set
|
||||
logging.debug("Analyzing rar file ... %s found", rarfile.is_rarfile(rarfile_path))
|
||||
@@ -791,9 +805,13 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
|
||||
fail = 3
|
||||
|
||||
else:
|
||||
m = re.search(r'^(Extracting|Creating|...)\s+(.*?)\s+OK\s*$', line)
|
||||
m = re.search(EXTRACTED_RE, line)
|
||||
if m:
|
||||
extracted.append(real_path(extraction_path, TRANS(m.group(2))))
|
||||
# In case of flat-unpack, UnRar still prints the whole path (?!)
|
||||
unpacked_file = TRANS(m.group(2))
|
||||
if cfg.flat_unpack():
|
||||
unpacked_file = os.path.basename(unpacked_file)
|
||||
extracted.append(real_path(extraction_path, unpacked_file))
|
||||
|
||||
if fail:
|
||||
if proc:
|
||||
@@ -853,9 +871,8 @@ def unzip(nzo, workdir, workdir_complete, delete, one_folder, zips):
|
||||
i = 0
|
||||
|
||||
for _zip in zips:
|
||||
logging.info("Deleting %s", _zip)
|
||||
try:
|
||||
os.remove(_zip)
|
||||
remove_file(_zip)
|
||||
i += 1
|
||||
except OSError:
|
||||
logging.warning(T('Deleting %s failed!'), _zip)
|
||||
@@ -863,9 +880,8 @@ def unzip(nzo, workdir, workdir_complete, delete, one_folder, zips):
|
||||
brokenzip = '%s.1' % _zip
|
||||
|
||||
if os.path.exists(brokenzip):
|
||||
logging.info("Deleting %s", brokenzip)
|
||||
try:
|
||||
os.remove(brokenzip)
|
||||
remove_file(brokenzip)
|
||||
i += 1
|
||||
except OSError:
|
||||
logging.warning(T('Deleting %s failed!'), brokenzip)
|
||||
@@ -1000,7 +1016,7 @@ def seven_extract_core(sevenset, extensions, extraction_path, one_folder, delete
|
||||
parm = '-tsplit'
|
||||
else:
|
||||
name = sevenset
|
||||
parm = '-t7z'
|
||||
parm = '-tzip' if sevenset.lower().endswith('.zip') else '-t7z'
|
||||
|
||||
if not os.path.exists(name):
|
||||
return 1, T('7ZIP set "%s" is incomplete, cannot unpack') % unicoder(sevenset)
|
||||
@@ -1024,12 +1040,12 @@ def seven_extract_core(sevenset, extensions, extraction_path, one_folder, delete
|
||||
for ext in extensions:
|
||||
path = '%s.%s' % (sevenset, ext)
|
||||
try:
|
||||
os.remove(path)
|
||||
remove_file(path)
|
||||
except:
|
||||
logging.warning(T('Deleting %s failed!'), path)
|
||||
else:
|
||||
try:
|
||||
os.remove(sevenset)
|
||||
remove_file(sevenset)
|
||||
except:
|
||||
logging.warning(T('Deleting %s failed!'), sevenset)
|
||||
|
||||
@@ -1077,6 +1093,7 @@ def par2_repair(parfile_nzf, nzo, workdir, setname, single):
|
||||
# Download all par2 files that haven't been downloaded yet
|
||||
readd = False
|
||||
for extrapar in nzo.extrapars[setname][:]:
|
||||
# Make sure we only get new par2 files
|
||||
if extrapar not in nzo.finished_files and extrapar not in nzo.files:
|
||||
nzo.add_parfile(extrapar)
|
||||
readd = True
|
||||
@@ -1146,9 +1163,8 @@ def par2_repair(parfile_nzf, nzo, workdir, setname, single):
|
||||
if filepath in joinables:
|
||||
joinables.remove(filepath)
|
||||
if os.path.exists(filepath):
|
||||
logging.info("Deleting %s", filepath)
|
||||
try:
|
||||
os.remove(filepath)
|
||||
remove_file(filepath)
|
||||
except OSError:
|
||||
logging.warning(T('Deleting %s failed!'), filepath)
|
||||
except:
|
||||
@@ -1296,8 +1312,10 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
verifynum = 0
|
||||
|
||||
elif line.startswith('Main packet not found') or 'The recovery file does not exist' in line:
|
||||
# Initialparfile probably didn't decode properly,
|
||||
logging.info(T('Main packet not found...'))
|
||||
# Initialparfile probably didn't decode properly or bad user parameters
|
||||
# We will try to get another par2 file, but 99% of time it's user parameters
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
logging.info(msg)
|
||||
logging.info("Extra pars = %s", nzo.extrapars[setname])
|
||||
|
||||
# Look for the smallest par2file
|
||||
@@ -1315,7 +1333,6 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
nzo.add_parfile(nzf)
|
||||
readd = True
|
||||
else:
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
@@ -1331,7 +1348,6 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
if added_blocks:
|
||||
msg = T('Fetching %s blocks...') % str(added_blocks)
|
||||
nzo.set_action_line(T('Fetching'), msg)
|
||||
nzo.status = Status.FETCHING
|
||||
readd = True
|
||||
else:
|
||||
# Failed
|
||||
@@ -1440,6 +1456,15 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
nzo.status = Status.FAILED
|
||||
|
||||
elif line.startswith('Repair Failed.'):
|
||||
# Unknown repair problem
|
||||
msg = T('Repairing failed, %s') % line
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
nzo.status = Status.FAILED
|
||||
finished = 0
|
||||
|
||||
elif not verified:
|
||||
if line.startswith('Verifying source files'):
|
||||
nzo.set_action_line(T('Verifying'), '01/%02d' % verifytotal)
|
||||
@@ -1474,6 +1499,10 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
except WindowsError, err:
|
||||
raise WindowsError(err)
|
||||
|
||||
# Also log what is shown to user in history
|
||||
if nzo.fail_msg:
|
||||
logging.info(nzo.fail_msg)
|
||||
|
||||
logging.debug('PAR2 output was\n%s', '\n'.join(lines))
|
||||
|
||||
# If successful, add renamed files to the collection
|
||||
@@ -1503,9 +1532,16 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
# But not really required due to prospective-par2
|
||||
command = [str(MULTIPAR_COMMAND), 'r', '-vs2', '-vd%s' % parfolder, parfile]
|
||||
|
||||
# Check if there are maybe par2cmdline/par2tbb commands supplied
|
||||
if '-t' in cfg.par_option() or '-p' in cfg.par_option():
|
||||
logging.info('Removing old par2cmdline/par2tbb options for MultiPar')
|
||||
cfg.par_option.set('')
|
||||
|
||||
# Only add user-options if supplied
|
||||
options = cfg.par_option().strip()
|
||||
if options:
|
||||
# We wrongly instructed users to use /x parameter style instead of -x
|
||||
options = options.replace('/', '-', 1)
|
||||
command.insert(2, options)
|
||||
|
||||
# Append the wildcard for this set
|
||||
@@ -1589,8 +1625,10 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
logging.error(msg)
|
||||
|
||||
elif line.startswith('valid file is not found'):
|
||||
# Initialparfile probably didn't decode properly,
|
||||
logging.info(T('Main packet not found...'))
|
||||
# Initialparfile probably didn't decode properly, or bad user parameters
|
||||
# We will try to get another par2 file, but 99% of time it's user parameters
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
logging.info(msg)
|
||||
logging.info("Extra pars = %s", nzo.extrapars[setname])
|
||||
|
||||
# Look for the smallest par2file
|
||||
@@ -1608,7 +1646,6 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
nzo.add_parfile(nzf)
|
||||
readd = True
|
||||
else:
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
@@ -1753,7 +1790,6 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
if added_blocks:
|
||||
msg = T('Fetching %s blocks...') % str(added_blocks)
|
||||
nzo.set_action_line(T('Fetching'), msg)
|
||||
nzo.status = Status.FETCHING
|
||||
readd = True
|
||||
else:
|
||||
# Failed
|
||||
@@ -1822,9 +1858,21 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
verifynum += 1
|
||||
nzo.set_action_line(T('Verifying repair'), '%02d/%02d' % (verifynum, verifytotal))
|
||||
|
||||
elif line.startswith('Failed to repair'):
|
||||
# Unknown repair problem
|
||||
msg = T('Repairing failed, %s') % line
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
nzo.status = Status.FAILED
|
||||
finished = 0
|
||||
|
||||
p.wait()
|
||||
|
||||
# Also log what is shown to user in history
|
||||
if nzo.fail_msg:
|
||||
logging.info(nzo.fail_msg)
|
||||
|
||||
logging.debug('MultiPar output was\n%s', '\n'.join(lines))
|
||||
|
||||
# Add renamed files to the collection
|
||||
@@ -1854,6 +1902,7 @@ def create_env(nzo=None, extra_env_fields=None):
|
||||
|
||||
# Are we adding things?
|
||||
if nzo:
|
||||
# Add basic info
|
||||
for field in ENV_NZO_FIELDS:
|
||||
try:
|
||||
field_value = getattr(nzo, field)
|
||||
@@ -1863,14 +1912,18 @@ def create_env(nzo=None, extra_env_fields=None):
|
||||
elif isinstance(field_value, bool):
|
||||
env['SAB_' + field.upper()] = str(field_value*1)
|
||||
else:
|
||||
env['SAB_' + field.upper()] = str(deunicode(field_value))
|
||||
env['SAB_' + field.upper()] = field_value
|
||||
except:
|
||||
# Catch key/unicode errors
|
||||
pass
|
||||
|
||||
# Add extra fields
|
||||
for field in extra_env_fields:
|
||||
try:
|
||||
env['SAB_' + field.upper()] = str(deunicode(extra_env_fields[field]))
|
||||
if extra_env_fields[field] is not None:
|
||||
env['SAB_' + field.upper()] = extra_env_fields[field]
|
||||
else:
|
||||
env['SAB_' + field.upper()] = ''
|
||||
except:
|
||||
# Catch key/unicode errors
|
||||
pass
|
||||
@@ -1883,6 +1936,9 @@ def create_env(nzo=None, extra_env_fields=None):
|
||||
elif not nzo:
|
||||
# No modification
|
||||
return None
|
||||
|
||||
# Have to make sure no Unicode slipped in somehow
|
||||
env = { deunicode(k): deunicode(v) for k, v in env.iteritems() }
|
||||
return env
|
||||
|
||||
|
||||
@@ -1900,8 +1956,10 @@ def userxbit(filename):
|
||||
return xbitset
|
||||
|
||||
|
||||
def build_command(command):
|
||||
""" Prepare list from running an external program """
|
||||
def build_command(command, flatten_command=False):
|
||||
""" Prepare list from running an external program
|
||||
On Windows we need to run our own list2cmdline for Unrar
|
||||
"""
|
||||
if not sabnzbd.WIN32:
|
||||
if command[0].endswith('.py'):
|
||||
with open(command[0], 'r') as script_file:
|
||||
@@ -1945,7 +2003,7 @@ def build_command(command):
|
||||
if need_shell and ' ' in command[0]:
|
||||
command[0] = win32api.GetShortPathName(command[0])
|
||||
|
||||
if need_shell:
|
||||
if need_shell or flatten_command:
|
||||
command = list2cmdline(command)
|
||||
|
||||
return stup, need_shell, command, creationflags
|
||||
@@ -1956,16 +2014,20 @@ def rar_volumelist(rarfile_path, password, known_volumes):
|
||||
and merge them with existing list, removing duplicates
|
||||
"""
|
||||
# UnRar is required to read some RAR files
|
||||
rarfile.UNRAR_TOOL = RAR_COMMAND
|
||||
zf = rarfile.RarFile(rarfile_path)
|
||||
# RarFile can fail in special cases
|
||||
try:
|
||||
rarfile.UNRAR_TOOL = RAR_COMMAND
|
||||
zf = rarfile.RarFile(rarfile_path)
|
||||
|
||||
# setpassword can fail due to bugs in RarFile
|
||||
if password:
|
||||
try:
|
||||
zf.setpassword(password)
|
||||
except:
|
||||
pass
|
||||
zf_volumes = zf.volumelist()
|
||||
# setpassword can fail due to bugs in RarFile
|
||||
if password:
|
||||
try:
|
||||
zf.setpassword(password)
|
||||
except:
|
||||
pass
|
||||
zf_volumes = zf.volumelist()
|
||||
except:
|
||||
zf_volumes = []
|
||||
|
||||
# Remove duplicates
|
||||
known_volumes_base = [os.path.basename(vol) for vol in known_volumes]
|
||||
@@ -2226,14 +2288,14 @@ def pre_queue(name, pp, cat, script, priority, size, groups):
|
||||
def fix(p):
|
||||
if not p or str(p).lower() == 'none':
|
||||
return ''
|
||||
else:
|
||||
return UNTRANS(str(p))
|
||||
return unicoder(p)
|
||||
|
||||
values = [1, name, pp, cat, script, priority, None]
|
||||
script_path = make_script_path(cfg.pre_script())
|
||||
if script_path:
|
||||
command = [script_path, name, fix(pp), fix(cat), fix(script), fix(priority), str(size), ' '.join(groups)]
|
||||
command = [script_path, name, pp, cat, script, priority, str(size), ' '.join(groups)]
|
||||
command.extend(analyse_show(name))
|
||||
command = [fix(arg) for arg in command]
|
||||
|
||||
try:
|
||||
stup, need_shell, command, creationflags = build_command(command)
|
||||
@@ -2254,7 +2316,7 @@ def pre_queue(name, pp, cat, script, priority, size, groups):
|
||||
for line in output.split('\n'):
|
||||
line = line.strip('\r\n \'"')
|
||||
if n < len(values) and line:
|
||||
values[n] = TRANS(line)
|
||||
values[n] = deunicode(line)
|
||||
n += 1
|
||||
accept = int_conv(values[0])
|
||||
if accept < 1:
|
||||
@@ -2273,24 +2335,11 @@ def list2cmdline(lst):
|
||||
for arg in lst:
|
||||
if not arg:
|
||||
nlst.append('""')
|
||||
elif (' ' in arg) or ('\t' in arg) or ('&' in arg) or ('|' in arg) or (';' in arg) or (',' in arg):
|
||||
nlst.append('"%s"' % arg)
|
||||
else:
|
||||
nlst.append(arg)
|
||||
nlst.append('"%s"' % arg)
|
||||
return ' '.join(nlst)
|
||||
|
||||
|
||||
def get_from_url(url):
|
||||
""" Retrieve URL and return content
|
||||
`timeout` sets non-standard timeout
|
||||
"""
|
||||
import urllib2
|
||||
try:
|
||||
return urllib2.urlopen(url).read()
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def is_sevenfile(path):
|
||||
""" Return True if path has proper extension and 7Zip is installed """
|
||||
return SEVEN_COMMAND and os.path.splitext(path)[1].lower() == '.7z'
|
||||
|
||||
@@ -27,7 +27,6 @@ import socket
|
||||
import urllib2
|
||||
import httplib
|
||||
import urllib
|
||||
import time
|
||||
import subprocess
|
||||
import json
|
||||
from threading import Thread
|
||||
@@ -134,13 +133,17 @@ def get_prio(gtype, section):
|
||||
return -1000
|
||||
|
||||
|
||||
def check_cat(section, job_cat):
|
||||
""" Check if `job_cat` is enabled in `section`. * = All """
|
||||
def check_cat(section, job_cat, keyword=None):
|
||||
""" Check if `job_cat` is enabled in `section`.
|
||||
* = All, if no other categories selected.
|
||||
"""
|
||||
if not job_cat:
|
||||
return True
|
||||
try:
|
||||
section_cats = sabnzbd.config.get_config(section, '%s_cats' % section)()
|
||||
return ('*' in section_cats or job_cat in section_cats)
|
||||
if not keyword:
|
||||
keyword = section
|
||||
section_cats = sabnzbd.config.get_config(section, '%s_cats' % keyword)()
|
||||
return (['*'] == section_cats or job_cat in section_cats)
|
||||
except TypeError:
|
||||
logging.debug('Incorrect Notify option %s:%s_cats', section, section)
|
||||
return True
|
||||
@@ -164,31 +167,26 @@ def send_notification(title, msg, gtype, job_cat=None):
|
||||
return send_local_growl(title, msg, gtype)
|
||||
else:
|
||||
Thread(target=send_growl, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Prowl
|
||||
if sabnzbd.cfg.prowl_enable() and check_cat('prowl', job_cat):
|
||||
if sabnzbd.cfg.prowl_apikey():
|
||||
Thread(target=send_prowl, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Pushover
|
||||
if sabnzbd.cfg.pushover_enable() and check_cat('pushover', job_cat):
|
||||
if sabnzbd.cfg.pushover_token():
|
||||
Thread(target=send_pushover, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Pushbullet
|
||||
if sabnzbd.cfg.pushbullet_enable() and check_cat('pushbullet', job_cat):
|
||||
if sabnzbd.cfg.pushbullet_apikey() and check_classes(gtype, 'pushbullet'):
|
||||
Thread(target=send_pushbullet, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Notification script.
|
||||
if sabnzbd.cfg.nscript_enable() and check_cat('nscript', job_cat):
|
||||
if sabnzbd.cfg.nscript_script():
|
||||
Thread(target=send_nscript, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# NTFOSD
|
||||
if have_ntfosd() and sabnzbd.cfg.ntfosd_enable():
|
||||
@@ -443,6 +441,8 @@ def send_pushover(title, msg, gtype, force=False, test=None):
|
||||
apikey = sabnzbd.cfg.pushover_token()
|
||||
userkey = sabnzbd.cfg.pushover_userkey()
|
||||
device = sabnzbd.cfg.pushover_device()
|
||||
emergency_retry = sabnzbd.cfg.pushover_emergency_retry()
|
||||
emergency_expire = sabnzbd.cfg.pushover_emergency_expire()
|
||||
if not apikey or not userkey:
|
||||
return T('Cannot send, missing required data')
|
||||
|
||||
@@ -452,27 +452,42 @@ def send_pushover(title, msg, gtype, force=False, test=None):
|
||||
if force:
|
||||
prio = 1
|
||||
|
||||
if prio > -3:
|
||||
try:
|
||||
conn = httplib.HTTPSConnection("api.pushover.net:443")
|
||||
conn.request("POST", "/1/messages.json", urllib.urlencode({
|
||||
"token": apikey,
|
||||
"user": userkey,
|
||||
"device": device,
|
||||
"title": title,
|
||||
"message": msg,
|
||||
"priority": prio
|
||||
}), {"Content-type": "application/x-www-form-urlencoded"})
|
||||
res = conn.getresponse()
|
||||
if res.status != 200:
|
||||
logging.error(T('Bad response from Pushover (%s): %s'), res.status, res.read())
|
||||
if prio == 2:
|
||||
body = { "token": apikey,
|
||||
"user": userkey,
|
||||
"device": device,
|
||||
"title": title,
|
||||
"message": msg,
|
||||
"priority": prio,
|
||||
"retry": emergency_retry,
|
||||
"expire": emergency_expire
|
||||
}
|
||||
return do_send_pushover(body)
|
||||
if prio > -3 and prio < 2:
|
||||
body = { "token": apikey,
|
||||
"user": userkey,
|
||||
"device": device,
|
||||
"title": title,
|
||||
"message": msg,
|
||||
"priority": prio,
|
||||
}
|
||||
return do_send_pushover(body)
|
||||
|
||||
except:
|
||||
logging.warning(T('Failed to send pushover message'))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
def do_send_pushover(body):
|
||||
try:
|
||||
conn = httplib.HTTPSConnection("api.pushover.net:443")
|
||||
conn.request("POST", "/1/messages.json", urllib.urlencode(body),
|
||||
{"Content-type": "application/x-www-form-urlencoded"})
|
||||
res = conn.getresponse()
|
||||
if res.status != 200:
|
||||
logging.error(T('Bad response from Pushover (%s): %s'), res.status, res.read())
|
||||
return T('Failed to send pushover message')
|
||||
return ''
|
||||
|
||||
else:
|
||||
return ''
|
||||
except:
|
||||
logging.warning(T('Failed to send pushover message'))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
return T('Failed to send pushover message')
|
||||
|
||||
def send_pushbullet(title, msg, gtype, force=False, test=None):
|
||||
""" Send message to Pushbullet """
|
||||
|
||||
@@ -26,11 +26,11 @@ 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, int_conv
|
||||
from sabnzbd.misc import exit_sab, cat_to_opts, remove_file, \
|
||||
get_admin_path, remove_all, globber_full, int_conv, caller_name
|
||||
from sabnzbd.panic import panic_queue
|
||||
import sabnzbd.database as database
|
||||
from sabnzbd.decorators import notify_downloader
|
||||
from sabnzbd.decorators import NzbQueueLocker
|
||||
from sabnzbd.constants import QUEUE_FILE_NAME, QUEUE_VERSION, FUTURE_Q_FOLDER, \
|
||||
JOB_ADMIN, LOW_PRIORITY, NORMAL_PRIORITY, HIGH_PRIORITY, TOP_PRIORITY, \
|
||||
REPAIR_PRIORITY, STOP_PRIORITY, VERIFIED_FILE, \
|
||||
@@ -43,6 +43,7 @@ from sabnzbd.assembler import Assembler, file_has_articles
|
||||
import sabnzbd.notifier as notifier
|
||||
from sabnzbd.encoding import platform_encode
|
||||
from sabnzbd.bpsmeter import BPSMeter
|
||||
from sabnzbd.dirscanner import ProcessSingleFile
|
||||
|
||||
|
||||
class NzbQueue(object):
|
||||
@@ -99,7 +100,7 @@ class NzbQueue(object):
|
||||
self.add(nzo, save=True)
|
||||
else:
|
||||
try:
|
||||
os.remove(item)
|
||||
remove_file(item)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -139,7 +140,7 @@ class NzbQueue(object):
|
||||
|
||||
# Remove any future-jobs, we can't save those
|
||||
for item in globber_full(os.path.join(cfg.admin_dir.get_path(), FUTURE_Q_FOLDER)):
|
||||
os.remove(item)
|
||||
remove_file(item)
|
||||
|
||||
# Done converting
|
||||
cfg.converted_nzo_pickles.set(True)
|
||||
@@ -147,6 +148,7 @@ class NzbQueue(object):
|
||||
nzo_ids = []
|
||||
return nzo_ids
|
||||
|
||||
@NzbQueueLocker
|
||||
def scan_jobs(self, all=False, action=True):
|
||||
""" Scan "incomplete" for missing folders,
|
||||
'all' is True: Include active folders
|
||||
@@ -230,7 +232,6 @@ class NzbQueue(object):
|
||||
|
||||
return nzo_id
|
||||
|
||||
@notify_downloader
|
||||
def send_back(self, nzo):
|
||||
""" Send back job to queue after successful pre-check """
|
||||
try:
|
||||
@@ -238,13 +239,14 @@ class NzbQueue(object):
|
||||
except:
|
||||
logging.debug('Failed to find NZB file after pre-check (%s)', nzo.nzo_id)
|
||||
return
|
||||
from sabnzbd.dirscanner import ProcessSingleFile
|
||||
|
||||
res, nzo_ids = ProcessSingleFile(nzo.work_name + '.nzb', nzb_path, keep=True, reuse=True)
|
||||
if res == 0 and nzo_ids:
|
||||
nzo = self.replace_in_q(nzo, nzo_ids[0])
|
||||
# Reset reuse flag to make pause/abort on encryption possible
|
||||
nzo.reuse = False
|
||||
|
||||
@NzbQueueLocker
|
||||
def replace_in_q(self, nzo, nzo_id):
|
||||
""" Replace nzo by new in at the same spot in the queue, destroy nzo """
|
||||
# Must be a separate function from "send_back()", due to the required queue-lock
|
||||
@@ -269,6 +271,7 @@ class NzbQueue(object):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
return nzo
|
||||
|
||||
@NzbQueueLocker
|
||||
def save(self, save_nzo=None):
|
||||
""" Save queue, all nzo's or just the specified one """
|
||||
logging.info("Saving queue")
|
||||
@@ -339,7 +342,8 @@ class NzbQueue(object):
|
||||
nzo.set_final_name_pw(name, password)
|
||||
else:
|
||||
# Reset url fetch wait time
|
||||
nzo.wait = None
|
||||
nzo.url_wait = None
|
||||
nzo.url_tries = 0
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
@@ -350,7 +354,7 @@ class NzbQueue(object):
|
||||
else:
|
||||
return None
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def add(self, nzo, save=True, quiet=False):
|
||||
if not nzo.nzo_id:
|
||||
nzo.nzo_id = sabnzbd.get_new_id('nzo', nzo.workpath, self.__nzo_table)
|
||||
@@ -406,6 +410,7 @@ class NzbQueue(object):
|
||||
self.sort_by_avg_age()
|
||||
return nzo.nzo_id
|
||||
|
||||
@NzbQueueLocker
|
||||
def remove(self, nzo_id, add_to_history=True, save=True, cleanup=True, keep_basic=False, del_files=False):
|
||||
if nzo_id in self.__nzo_table:
|
||||
nzo = self.__nzo_table.pop(nzo_id)
|
||||
@@ -427,7 +432,7 @@ class NzbQueue(object):
|
||||
self.cleanup_nzo(nzo, keep_basic, del_files)
|
||||
|
||||
sabnzbd.remove_data(nzo_id, nzo.workpath)
|
||||
logging.info('Removed job %s', nzo.final_name)
|
||||
logging.info('[%s] Removed job %s', caller_name(), nzo.final_name)
|
||||
if save:
|
||||
self.save(nzo)
|
||||
else:
|
||||
@@ -449,6 +454,7 @@ class NzbQueue(object):
|
||||
|
||||
return removed
|
||||
|
||||
@NzbQueueLocker
|
||||
def remove_all(self, search=None):
|
||||
if search:
|
||||
search = search.lower()
|
||||
@@ -511,7 +517,7 @@ class NzbQueue(object):
|
||||
handled.append(nzo_id)
|
||||
return handled
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def resume_nzo(self, nzo_id):
|
||||
handled = []
|
||||
if nzo_id in self.__nzo_table:
|
||||
@@ -522,6 +528,7 @@ class NzbQueue(object):
|
||||
handled.append(nzo_id)
|
||||
return handled
|
||||
|
||||
@NzbQueueLocker
|
||||
def switch(self, item_id_1, item_id_2):
|
||||
try:
|
||||
# Allow an index as second parameter, easier for some skins
|
||||
@@ -570,32 +577,39 @@ class NzbQueue(object):
|
||||
# If moving failed/no movement took place
|
||||
return (-1, nzo1.priority)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_up_bulk(self, nzo_id, nzf_ids, size):
|
||||
if nzo_id in self.__nzo_table:
|
||||
for unused in range(size):
|
||||
self.__nzo_table[nzo_id].move_up_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_top_bulk(self, nzo_id, nzf_ids):
|
||||
if nzo_id in self.__nzo_table:
|
||||
self.__nzo_table[nzo_id].move_top_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_down_bulk(self, nzo_id, nzf_ids, size):
|
||||
if nzo_id in self.__nzo_table:
|
||||
for unused in range(size):
|
||||
self.__nzo_table[nzo_id].move_down_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_bottom_bulk(self, nzo_id, nzf_ids):
|
||||
if nzo_id in self.__nzo_table:
|
||||
self.__nzo_table[nzo_id].move_bottom_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def sort_by_avg_age(self, reverse=False):
|
||||
logging.info("Sorting by average date... (reversed:%s)", reverse)
|
||||
self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_date_cmp, reverse)
|
||||
|
||||
@NzbQueueLocker
|
||||
def sort_by_name(self, reverse=False):
|
||||
logging.info("Sorting by name... (reversed:%s)", reverse)
|
||||
self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_name_cmp, reverse)
|
||||
|
||||
@NzbQueueLocker
|
||||
def sort_by_size(self, reverse=False):
|
||||
logging.info("Sorting by size... (reversed:%s)", reverse)
|
||||
self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_size_cmp, reverse)
|
||||
@@ -617,6 +631,7 @@ class NzbQueue(object):
|
||||
else:
|
||||
logging.debug("Sort: %s not recognized", field)
|
||||
|
||||
@NzbQueueLocker
|
||||
def __set_priority(self, nzo_id, priority):
|
||||
""" Sets the priority on the nzo and places it in the queue at the appropriate position """
|
||||
try:
|
||||
@@ -689,7 +704,7 @@ class NzbQueue(object):
|
||||
except:
|
||||
return -1
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def set_priority(self, nzo_ids, priority):
|
||||
try:
|
||||
n = -1
|
||||
@@ -699,11 +714,13 @@ class NzbQueue(object):
|
||||
except:
|
||||
return -1
|
||||
|
||||
def reset_try_lists(self, nzf=None, nzo=None):
|
||||
if nzf:
|
||||
nzf.reset_try_list()
|
||||
if nzo:
|
||||
nzo.reset_try_list()
|
||||
def reset_try_lists(self, article, article_reset=True):
|
||||
""" Let article get new fetcher and reset trylists """
|
||||
article.fetcher = None
|
||||
if article_reset:
|
||||
article.reset_try_list()
|
||||
article.nzf.reset_try_list()
|
||||
article.nzf.nzo.reset_try_list()
|
||||
|
||||
def reset_all_try_lists(self):
|
||||
for nzo in self.__nzo_list:
|
||||
@@ -719,6 +736,9 @@ class NzbQueue(object):
|
||||
return False
|
||||
|
||||
def get_article(self, server, servers):
|
||||
""" Get next article for jobs in the queue
|
||||
Not locked for performance, since it only reads the queue
|
||||
"""
|
||||
for nzo in self.__nzo_list:
|
||||
# Not when queue paused and not a forced item
|
||||
if nzo.status not in (Status.PAUSED, Status.GRABBING) or nzo.priority == TOP_PRIORITY:
|
||||
@@ -733,6 +753,9 @@ class NzbQueue(object):
|
||||
return
|
||||
|
||||
def register_article(self, article, found=True):
|
||||
""" Register the articles we tried
|
||||
Not locked for performance, since it only modifies individual NZOs
|
||||
"""
|
||||
nzf = article.nzf
|
||||
nzo = nzf.nzo
|
||||
|
||||
@@ -773,7 +796,7 @@ class NzbQueue(object):
|
||||
|
||||
def end_job(self, nzo):
|
||||
""" Send NZO to the post-processing queue """
|
||||
logging.info('Ending job %s', nzo.final_name)
|
||||
logging.info('[%s] Ending job %s', caller_name(), nzo.final_name)
|
||||
|
||||
# Notify assembler to call postprocessor
|
||||
if not nzo.deleted:
|
||||
@@ -793,7 +816,9 @@ class NzbQueue(object):
|
||||
Assembler.do.process((nzo, None))
|
||||
|
||||
def actives(self, grabs=True):
|
||||
""" Return amount of non-paused jobs, optionally with 'grabbing' items """
|
||||
""" Return amount of non-paused jobs, optionally with 'grabbing' items
|
||||
Not locked for performance, only reads the queue
|
||||
"""
|
||||
n = 0
|
||||
for nzo in self.__nzo_list:
|
||||
# Ignore any items that are paused
|
||||
@@ -806,6 +831,7 @@ class NzbQueue(object):
|
||||
def queue_info(self, search=None, start=0, limit=0):
|
||||
""" Return list of queued jobs,
|
||||
optionally filtered by 'search' and limited by start and limit.
|
||||
Not locked for performance, only reads the queue
|
||||
"""
|
||||
if search:
|
||||
search = search.lower()
|
||||
@@ -836,7 +862,9 @@ class NzbQueue(object):
|
||||
return QNFO(bytes_total, bytes_left, bytes_left_previous_page, pnfo_list, q_size, n)
|
||||
|
||||
def remaining(self):
|
||||
""" Return bytes left in the queue by non-paused items """
|
||||
""" Return bytes left in the queue by non-paused items
|
||||
Not locked for performance, only reads the queue
|
||||
"""
|
||||
bytes_left = 0
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.status != 'Paused':
|
||||
@@ -862,6 +890,7 @@ class NzbQueue(object):
|
||||
empty = []
|
||||
for nzo in self.__nzo_list:
|
||||
if not nzo.futuretype and not nzo.files and nzo.status not in (Status.PAUSED, Status.GRABBING):
|
||||
logging.info('Found idle job %s', nzo.final_name)
|
||||
empty.append(nzo)
|
||||
|
||||
# Stall prevention by checking if all servers are in the trylist
|
||||
@@ -871,8 +900,11 @@ class NzbQueue(object):
|
||||
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
|
||||
logging.info('Resetting bad trylist for file %s in job %s', nzf.filename, nzo.final_name)
|
||||
nzf.reset_try_list()
|
||||
|
||||
# Reset main trylist, minimal performance impact
|
||||
logging.info('Resetting bad trylist for job %s', nzo.final_name)
|
||||
nzo.reset_try_list()
|
||||
|
||||
for nzo in empty:
|
||||
@@ -883,7 +915,7 @@ class NzbQueue(object):
|
||||
if nzo.priority == priority:
|
||||
nzo.pause()
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def resume_on_prio(self, priority):
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.priority == priority:
|
||||
@@ -895,7 +927,7 @@ class NzbQueue(object):
|
||||
if nzo.cat == cat:
|
||||
nzo.pause()
|
||||
|
||||
@notify_downloader
|
||||
@NzbQueueLocker
|
||||
def resume_on_cat(self, cat):
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.cat == cat:
|
||||
|
||||
@@ -47,7 +47,7 @@ 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
|
||||
get_unique_filename, renamer, remove_file, remove_dir, caller_name
|
||||
from sabnzbd.decorators import synchronized
|
||||
import sabnzbd.config as config
|
||||
import sabnzbd.cfg as cfg
|
||||
@@ -112,7 +112,7 @@ class TryList(object):
|
||||
# Article
|
||||
##############################################################################
|
||||
ArticleSaver = (
|
||||
'article', 'art_id', 'bytes', 'partnum', 'nzf'
|
||||
'article', 'art_id', 'bytes', 'partnum', 'lowest_partnum', 'nzf'
|
||||
)
|
||||
|
||||
|
||||
@@ -128,6 +128,7 @@ class Article(TryList):
|
||||
self.art_id = None
|
||||
self.bytes = bytes
|
||||
self.partnum = partnum
|
||||
self.lowest_partnum = False
|
||||
self.tries = 0 # Try count
|
||||
self.nzf = nzf
|
||||
|
||||
@@ -269,7 +270,23 @@ class NzbFile(TryList):
|
||||
self.valid = bool(article_db)
|
||||
|
||||
if self.valid and self.nzf_id:
|
||||
sabnzbd.save_data(article_db, self.nzf_id, nzo.workpath)
|
||||
# Save first article seperate, but not for all but first par2 file
|
||||
# Non-par2 files and the first par2 will have no volume and block number
|
||||
# When DirectUnpack is disabled, do not do any of this to also preserve disk IO
|
||||
setname, vol, block = sabnzbd.par2file.analyse_par2(self.filename)
|
||||
if cfg.direct_unpack() and not vol and not block:
|
||||
first_num = min(article_db.keys())
|
||||
first_article = self.add_article(article_db.pop(first_num), first_num)
|
||||
first_article.lowest_partnum = True
|
||||
self.nzo.first_articles.append(first_article)
|
||||
|
||||
# Any articles left?
|
||||
if article_db:
|
||||
# Save the rest
|
||||
sabnzbd.save_data(article_db, self.nzf_id, nzo.workpath)
|
||||
else:
|
||||
# All imported
|
||||
self.import_finished = True
|
||||
|
||||
def finish_import(self):
|
||||
""" Load the article objects from disk """
|
||||
@@ -277,22 +294,21 @@ class NzbFile(TryList):
|
||||
article_db = sabnzbd.load_data(self.nzf_id, self.nzo.workpath, remove=False)
|
||||
if article_db:
|
||||
for partnum in article_db:
|
||||
art_id = article_db[partnum][0]
|
||||
bytes = article_db[partnum][1]
|
||||
self.add_article(article_db[partnum], partnum)
|
||||
|
||||
article = Article(art_id, bytes, partnum, self)
|
||||
|
||||
self.articles.append(article)
|
||||
self.decodetable[partnum] = article
|
||||
# Make sure we have labeled the lowest part number
|
||||
# Also when DirectUnpack is disabled we need to know
|
||||
self.decodetable[min(self.decodetable)].lowest_partnum = True
|
||||
|
||||
# Mark safe to continue
|
||||
self.import_finished = True
|
||||
elif not self.nzo.is_gone():
|
||||
# TEMPORARY ERRORS
|
||||
if not os.path.exists(os.path.join(self.nzf_id, self.nzo.workpath)):
|
||||
logging.warning('Article DB file not found %s', self)
|
||||
else:
|
||||
# It was there, but empty
|
||||
logging.warning('Article DB empty %s', self)
|
||||
|
||||
def add_article(self, article_info, partnum):
|
||||
""" Add article to object database and return article object """
|
||||
article = Article(article_info[0], article_info[1], partnum, self)
|
||||
self.articles.append(article)
|
||||
self.decodetable[partnum] = article
|
||||
return article
|
||||
|
||||
def remove_article(self, article, found):
|
||||
""" Handle completed article, possibly end of file """
|
||||
@@ -329,15 +345,11 @@ class NzbFile(TryList):
|
||||
""" Is this file completed? """
|
||||
return self.import_finished and not bool(self.articles)
|
||||
|
||||
@property
|
||||
def lowest_partnum(self):
|
||||
""" Get lowest article number of this file """
|
||||
return min(self.decodetable)
|
||||
|
||||
def remove_admin(self):
|
||||
""" Remove article database from disk (sabnzbd_nzf_<id>)"""
|
||||
try:
|
||||
os.remove(os.path.join(self.nzo.workpath, self.nzf_id))
|
||||
logging.debug('Removing article database for %s', self.nzf_id)
|
||||
remove_file(os.path.join(self.nzo.workpath, self.nzf_id))
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -511,7 +523,7 @@ class NzbParser(xml.sax.handler.ContentHandler):
|
||||
self.nzf_list.remove(nzo_matches[0])
|
||||
|
||||
if nzf.valid and nzf.nzf_id:
|
||||
logging.info('File %s added to queue', self.filename)
|
||||
logging.info('File %s - %s added to queue', nzf.filename, nzf.nzf_id)
|
||||
self.nzo.files.append(nzf)
|
||||
self.nzo.files_table[nzf.nzf_id] = nzf
|
||||
self.nzo.bytes += nzf.bytes
|
||||
@@ -561,7 +573,7 @@ NzbObjectSaver = (
|
||||
'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',
|
||||
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta', 'first_articles',
|
||||
'md5sum', 'servercount', 'unwanted_ext', 'renames', 'rating_filtered'
|
||||
)
|
||||
|
||||
@@ -571,7 +583,6 @@ NZO_LOCK = threading.RLock()
|
||||
|
||||
class NzbObject(TryList):
|
||||
|
||||
@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,
|
||||
@@ -606,8 +617,13 @@ class NzbObject(TryList):
|
||||
# In case only /password was entered for nzbname
|
||||
work_name = filename
|
||||
|
||||
self.work_name = work_name
|
||||
self.final_name = work_name
|
||||
# Check for password also in filename
|
||||
if not password:
|
||||
dummy, password = scan_password(os.path.splitext(filename)[0])
|
||||
|
||||
# Remove trailing .nzb and .par(2)
|
||||
self.work_name = create_work_name(work_name)
|
||||
self.final_name = create_work_name(work_name)
|
||||
|
||||
self.meta = {}
|
||||
self.servercount = {} # Dict to keep bytes per server
|
||||
@@ -618,7 +634,7 @@ class NzbObject(TryList):
|
||||
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.set_priority(priority) # Parse priority of input
|
||||
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
|
||||
@@ -649,6 +665,7 @@ class NzbObject(TryList):
|
||||
self.avg_bps_freq = 0
|
||||
self.avg_bps_total = 0
|
||||
|
||||
self.first_articles = []
|
||||
self.saved_articles = []
|
||||
|
||||
self.nzo_id = None
|
||||
@@ -688,13 +705,11 @@ class NzbObject(TryList):
|
||||
self.next_save = None
|
||||
self.save_timeout = None
|
||||
self.encrypted = 0
|
||||
self.wait = None
|
||||
self.url_wait = None
|
||||
self.url_tries = 0
|
||||
self.pp_active = False # Signals active post-processing (not saved)
|
||||
self.md5sum = None
|
||||
|
||||
# Remove trailing .nzb and .par(2)
|
||||
self.work_name = create_work_name(self.work_name)
|
||||
|
||||
if nzb is None:
|
||||
# This is a slot for a future NZB, ready now
|
||||
return
|
||||
@@ -807,27 +822,40 @@ class NzbObject(TryList):
|
||||
self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp_tmp)
|
||||
|
||||
# Run user pre-queue script if needed
|
||||
if not reuse:
|
||||
accept, name, pp, cat, script, priority, group = \
|
||||
if not reuse and cfg.pre_script():
|
||||
accept, name, pp, cat_pp, script_pp, priority, group = \
|
||||
sabnzbd.newsunpack.pre_queue(self.final_name_pw_clean, pp, cat, script,
|
||||
priority, self.bytes, self.groups)
|
||||
# Accept or reject
|
||||
accept = int_conv(accept)
|
||||
if accept < 1:
|
||||
self.purge_data()
|
||||
raise TypeError
|
||||
if accept == 2:
|
||||
self.fail_msg = T('Pre-queue script marked job as failed')
|
||||
|
||||
# Process all options, only over-write if set by script
|
||||
# Beware that cannot do "if priority/pp", because those can
|
||||
# also have a valid value of 0, which shouldn't be ignored
|
||||
if name:
|
||||
self.set_final_name_pw(name)
|
||||
try:
|
||||
pp = int(pp)
|
||||
except:
|
||||
pp = None
|
||||
if accept < 1:
|
||||
self.purge_data()
|
||||
raise TypeError
|
||||
if name:
|
||||
self.set_final_name_pw(name)
|
||||
if cat_pp:
|
||||
cat = cat_pp
|
||||
try:
|
||||
priority = int(priority)
|
||||
except:
|
||||
priority = DEFAULT_PRIORITY
|
||||
if script_pp:
|
||||
script = script_pp
|
||||
if group:
|
||||
self.groups = [str(group)]
|
||||
if accept == 2:
|
||||
self.fail_msg = T('Pre-queue script marked job as failed')
|
||||
|
||||
# Re-evaluate results from pre-queue script
|
||||
self.cat, pp, self.script, priority = cat_to_opts(cat, pp, script, int_conv(priority))
|
||||
self.cat, pp, 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)
|
||||
else:
|
||||
@@ -875,37 +903,8 @@ class NzbObject(TryList):
|
||||
if reuse:
|
||||
self.check_existing_files(wdir)
|
||||
|
||||
if cfg.auto_sort():
|
||||
self.files.sort(cmp=nzf_cmp_date)
|
||||
else:
|
||||
self.files.sort(cmp=nzf_cmp_name)
|
||||
|
||||
# In the hunt for Unwanted Extensions:
|
||||
# The file with the unwanted extension often is in the first or the last rar file
|
||||
# So put the last rar immediately after the first rar file so that it gets detected early
|
||||
if cfg.unwanted_extensions() and not cfg.auto_sort():
|
||||
# ... only useful if there are unwanted extensions defined and there is no sorting on date
|
||||
logging.debug('Unwanted Extension: putting last rar after first rar')
|
||||
nzfposcounter = firstrarpos = lastrarpos = 0
|
||||
for nzf in self.files:
|
||||
nzfposcounter += 1
|
||||
if '.rar' in str(nzf):
|
||||
# a NZF found with '.rar' in the name
|
||||
if firstrarpos == 0:
|
||||
# this is the first .rar found, so remember this position
|
||||
firstrarpos = nzfposcounter
|
||||
lastrarpos = nzfposcounter
|
||||
lastrarnzf = nzf # The NZF itself
|
||||
|
||||
if firstrarpos != lastrarpos:
|
||||
# at least two different .rar's found
|
||||
logging.debug('Unwanted Extension: First rar at %s, Last rar at %s', firstrarpos, lastrarpos)
|
||||
logging.debug('Unwanted Extension: Last rar is %s', str(lastrarnzf))
|
||||
try:
|
||||
self.files.remove(lastrarnzf) # first remove. NB: remove() does searches for lastrarnzf
|
||||
self.files.insert(firstrarpos, lastrarnzf) # ... and only then add after position firstrarpos
|
||||
except:
|
||||
logging.debug('The lastrar swap did not go well')
|
||||
# Perform sorting
|
||||
self.sort_nzfs()
|
||||
|
||||
# Copy meta fields to nzo_info, if not already set
|
||||
for kw in self.meta:
|
||||
@@ -949,6 +948,42 @@ class NzbObject(TryList):
|
||||
nzf.deleted = True
|
||||
return not bool(self.files)
|
||||
|
||||
def sort_nzfs(self):
|
||||
""" Sort the files in the NZO, respecting
|
||||
date sorting and unwanted extensions
|
||||
"""
|
||||
if cfg.auto_sort():
|
||||
self.files.sort(cmp=nzf_cmp_date)
|
||||
else:
|
||||
self.files.sort(cmp=nzf_cmp_name)
|
||||
|
||||
# In the hunt for Unwanted Extensions:
|
||||
# The file with the unwanted extension often is in the first or the last rar file
|
||||
# So put the last rar immediately after the first rar file so that it gets detected early
|
||||
if cfg.unwanted_extensions() and not cfg.auto_sort():
|
||||
# ... only useful if there are unwanted extensions defined and there is no sorting on date
|
||||
logging.debug('Unwanted Extension: putting last rar after first rar')
|
||||
nzfposcounter = firstrarpos = lastrarpos = 0
|
||||
for nzf in self.files:
|
||||
nzfposcounter += 1
|
||||
if '.rar' in str(nzf):
|
||||
# a NZF found with '.rar' in the name
|
||||
if firstrarpos == 0:
|
||||
# this is the first .rar found, so remember this position
|
||||
firstrarpos = nzfposcounter
|
||||
lastrarpos = nzfposcounter
|
||||
lastrarnzf = nzf # The NZF itself
|
||||
|
||||
if firstrarpos != lastrarpos:
|
||||
# at least two different .rar's found
|
||||
logging.debug('Unwanted Extension: First rar at %s, Last rar at %s', firstrarpos, lastrarpos)
|
||||
logging.debug('Unwanted Extension: Last rar is %s', str(lastrarnzf))
|
||||
try:
|
||||
self.files.remove(lastrarnzf) # first remove. NB: remove() does searches for lastrarnzf
|
||||
self.files.insert(firstrarpos, lastrarnzf) # ... and only then add after position firstrarpos
|
||||
except:
|
||||
logging.debug('The lastrar swap did not go well')
|
||||
|
||||
def reset_all_try_lists(self):
|
||||
for nzf in self.files:
|
||||
nzf.reset_all_try_lists()
|
||||
@@ -985,6 +1020,9 @@ class NzbObject(TryList):
|
||||
for setname in self.extrapars:
|
||||
self.extrapars[parset].sort(key=lambda x: x.blocks)
|
||||
|
||||
# Also re-parse all filenames in case par2 came after first articles
|
||||
self.verify_all_filenames_and_resort()
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def handle_par2(self, nzf, filepath):
|
||||
""" Check if file is a par2 and build up par2 collection """
|
||||
@@ -1097,8 +1135,23 @@ class NzbObject(TryList):
|
||||
@synchronized(NZO_LOCK)
|
||||
def remove_article(self, article, found):
|
||||
nzf = article.nzf
|
||||
|
||||
# First or regular article?
|
||||
if article.lowest_partnum and self.first_articles and article in self.first_articles:
|
||||
self.first_articles.remove(article)
|
||||
|
||||
# All first articles done?
|
||||
if not self.first_articles and self.md5of16k:
|
||||
self.verify_all_filenames_and_resort()
|
||||
|
||||
# Remove from file-tracking
|
||||
file_done = nzf.remove_article(article, found)
|
||||
|
||||
# Only on fully loaded files we can say if it's really done
|
||||
if not nzf.import_finished:
|
||||
file_done = False
|
||||
|
||||
# File completed, remove and do checks
|
||||
if file_done:
|
||||
self.remove_nzf(nzf)
|
||||
if not self.reuse and cfg.fail_hopeless_jobs() and not self.check_quality(99)[0]:
|
||||
@@ -1228,10 +1281,20 @@ class NzbObject(TryList):
|
||||
|
||||
def set_priority(self, value):
|
||||
""" Check if this is a valid priority """
|
||||
# When unknown (0 is a known one), set to DEFAULT
|
||||
if value == '' or value is None:
|
||||
self.priority = DEFAULT_PRIORITY
|
||||
return
|
||||
|
||||
# Convert input
|
||||
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
|
||||
return
|
||||
|
||||
# Invalid value, set to normal priority
|
||||
self.priority = NORMAL_PRIORITY
|
||||
|
||||
@property
|
||||
def final_name_labeled(self):
|
||||
@@ -1248,8 +1311,8 @@ class NzbObject(TryList):
|
||||
prefix += T('UNWANTED') + ' / ' # : Queue indicator for unwanted extensions
|
||||
if self.rating_filtered and self.status == 'Paused':
|
||||
prefix += T('FILTERED') + ' / ' # : Queue indicator for filtered
|
||||
if isinstance(self.wait, float):
|
||||
dif = int(self.wait - time.time() + 0.5)
|
||||
if isinstance(self.url_wait, float):
|
||||
dif = int(self.url_wait - time.time() + 0.5)
|
||||
if dif > 0:
|
||||
prefix += T('WAIT %s sec') % dif + ' / ' # : Queue indicator for waiting URL fetch
|
||||
if (self.avg_stamp + float(cfg.propagation_delay() * 60)) > time.time() and self.priority != TOP_PRIORITY:
|
||||
@@ -1406,7 +1469,7 @@ class NzbObject(TryList):
|
||||
# format the total time the download took, in days, hours, and minutes, or seconds.
|
||||
complete_time = format_time_string(seconds, timecompleted.days)
|
||||
|
||||
msg1 = T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024, dec_limit=1))
|
||||
msg1 = T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024))
|
||||
msg1 += u'<br/>' + T('Age') + ': ' + calc_age(self.avg_date, True)
|
||||
|
||||
bad = self.nzo_info.get('bad_articles', 0)
|
||||
@@ -1446,34 +1509,44 @@ class NzbObject(TryList):
|
||||
article = None
|
||||
nzf_remove_list = []
|
||||
|
||||
for nzf in self.files:
|
||||
if nzf.deleted:
|
||||
logging.debug('Skipping existing file %s', nzf.filename or nzf.subject)
|
||||
else:
|
||||
# Don't try to get an article if server is in try_list of nzf
|
||||
if not nzf.server_in_try_list(server):
|
||||
if not nzf.import_finished:
|
||||
# Only load NZF when it's a primary server
|
||||
# or when it's a backup server without active primaries
|
||||
if sabnzbd.highest_server(server):
|
||||
nzf.finish_import()
|
||||
# Still not finished? Something went wrong...
|
||||
if not nzf.import_finished and not self.is_gone():
|
||||
logging.error(T('Error importing %s'), nzf)
|
||||
nzf_remove_list.append(nzf)
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
# Did we go through all first-articles?
|
||||
if self.first_articles:
|
||||
for article_test in self.first_articles:
|
||||
article = article_test.get_article(server, servers)
|
||||
if article:
|
||||
break
|
||||
|
||||
article = nzf.get_article(server, servers)
|
||||
if article:
|
||||
break
|
||||
# Move on to next ones
|
||||
if not article:
|
||||
for nzf in self.files:
|
||||
if nzf.deleted:
|
||||
logging.debug('Skipping existing file %s', nzf.filename or nzf.subject)
|
||||
else:
|
||||
# Don't try to get an article if server is in try_list of nzf
|
||||
if not nzf.server_in_try_list(server):
|
||||
if not nzf.import_finished:
|
||||
# Only load NZF when it's a primary server
|
||||
# or when it's a backup server without active primaries
|
||||
if sabnzbd.highest_server(server):
|
||||
nzf.finish_import()
|
||||
# Still not finished? Something went wrong...
|
||||
if not nzf.import_finished and not self.is_gone():
|
||||
logging.error(T('Error importing %s'), nzf)
|
||||
nzf_remove_list.append(nzf)
|
||||
nzf.nzo.status = Status.PAUSED
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
|
||||
article = nzf.get_article(server, servers)
|
||||
if article:
|
||||
break
|
||||
|
||||
# Remove all files for which admin could not be read
|
||||
for nzf in nzf_remove_list:
|
||||
nzf.deleted = True
|
||||
nzf.completed = True
|
||||
self.files.remove(nzf)
|
||||
|
||||
# If cleanup emptied the active files list, end this job
|
||||
if nzf_remove_list and not self.files:
|
||||
sabnzbd.NzbQueue.do.end_job(self)
|
||||
@@ -1578,6 +1651,14 @@ class NzbObject(TryList):
|
||||
self.renamed_file(yenc_filename, nzf.filename)
|
||||
nzf.filename = yenc_filename
|
||||
|
||||
def verify_all_filenames_and_resort(self):
|
||||
""" Verify all filenames based on par2 info and then re-sort files """
|
||||
logging.info('Checking all filenames for %s', self.final_name)
|
||||
for nzf_verify in self.files:
|
||||
self.verify_nzf_filename(nzf_verify)
|
||||
logging.info('Re-sorting %s after getting filename information', self.final_name)
|
||||
self.sort_nzfs()
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def renamed_file(self, name_set, old_name=None):
|
||||
""" Save renames at various stages (Download/PP)
|
||||
@@ -1638,6 +1719,8 @@ class NzbObject(TryList):
|
||||
@synchronized(NZO_LOCK)
|
||||
def purge_data(self, keep_basic=False, del_files=False):
|
||||
""" Remove all admin info, 'keep_basic' preserves attribs and nzb """
|
||||
logging.info('[%s] Purging data for job %s (keep_basic=%s, del_files=%s)', caller_name(), self.final_name, keep_basic, del_files)
|
||||
|
||||
wpath = self.workpath
|
||||
for nzf in self.files:
|
||||
sabnzbd.remove_data(nzf.nzf_id, wpath)
|
||||
@@ -1654,15 +1737,16 @@ class NzbObject(TryList):
|
||||
remove_all(wpath, 'SABnzbd_nz?_*', keep_folder=True)
|
||||
remove_all(wpath, 'SABnzbd_article_*', keep_folder=True)
|
||||
# We save the renames file
|
||||
sabnzbd.save_data(self.renames, RENAMES_FILE, self.workpath)
|
||||
sabnzbd.save_data(self.renames, RENAMES_FILE, self.workpath, silent=True)
|
||||
else:
|
||||
remove_all(wpath, recursive=True)
|
||||
if del_files:
|
||||
remove_all(self.downpath, recursive=True)
|
||||
else:
|
||||
try:
|
||||
os.rmdir(self.downpath)
|
||||
remove_dir(self.downpath)
|
||||
except:
|
||||
logging.debug('Folder not removed: %s', self.downpath)
|
||||
pass
|
||||
|
||||
def gather_info(self, full=False):
|
||||
@@ -1803,7 +1887,8 @@ class NzbObject(TryList):
|
||||
# Set non-transferable values
|
||||
self.pp_active = False
|
||||
self.avg_stamp = time.mktime(self.avg_date.timetuple())
|
||||
self.wait = None
|
||||
self.url_wait = None
|
||||
self.url_tries = 0
|
||||
self.to_be_removed = False
|
||||
self.direct_unpacker = None
|
||||
if self.meta is None:
|
||||
|
||||
@@ -461,7 +461,7 @@ class SABnzbdDelegate(NSObject):
|
||||
self.setMenuTitle_("")
|
||||
elif bytes_left > 0:
|
||||
self.state = ""
|
||||
speed = to_units(bpsnow, dec_limit=1)
|
||||
speed = to_units(bpsnow)
|
||||
# "10.1 MB/s" doesn't fit, remove space char
|
||||
if 'M' in speed and len(speed) > 5:
|
||||
speed = speed.replace(' ', '')
|
||||
|
||||
@@ -22,6 +22,7 @@ sabnzbd.panic - Send panic message to the browser
|
||||
import os
|
||||
import logging
|
||||
import tempfile
|
||||
import ctypes
|
||||
try:
|
||||
import webbrowser
|
||||
except ImportError:
|
||||
@@ -29,6 +30,7 @@ except ImportError:
|
||||
|
||||
import sabnzbd
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.encoding import unicoder
|
||||
|
||||
PANIC_PORT = 1
|
||||
PANIC_TEMPL = 2
|
||||
@@ -164,7 +166,7 @@ def panic_message(panic, a=None, b=None):
|
||||
|
||||
|
||||
def panic_port(host, port):
|
||||
print "\n%s:\n %s" % (T('Fatal error'), T('Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running.') % (port, host))
|
||||
show_error_dialog("\n%s:\n %s" % (T('Fatal error'), T('Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running.') % (port, host)))
|
||||
launch_a_browser(panic_message(PANIC_PORT, host, port))
|
||||
|
||||
|
||||
@@ -185,7 +187,7 @@ def panic_sqlite(name):
|
||||
|
||||
|
||||
def panic(reason, remedy=""):
|
||||
print "\n%s:\n %s\n%s" % (T('Fatal error'), reason, remedy)
|
||||
show_error_dialog("\n%s:\n %s\n%s" % (T('Fatal error'), reason, remedy))
|
||||
launch_a_browser(panic_message(PANIC_OTHER, reason, remedy))
|
||||
|
||||
|
||||
@@ -217,6 +219,15 @@ def launch_a_browser(url, force=False):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
|
||||
def show_error_dialog(msg):
|
||||
""" Show a pop-up when program cannot start
|
||||
Windows-only, otherwise only print to console
|
||||
"""
|
||||
if sabnzbd.WIN32:
|
||||
ctypes.windll.user32.MessageBoxW(0, unicoder(msg), T('Fatal error'), 0)
|
||||
print msg
|
||||
|
||||
|
||||
def error_page_401(status, message, traceback, version):
|
||||
""" Custom handler for 401 error """
|
||||
title = T('Access denied')
|
||||
|
||||
@@ -24,7 +24,6 @@ import Queue
|
||||
import logging
|
||||
import sabnzbd
|
||||
import xml.sax.saxutils
|
||||
import xml.etree.ElementTree
|
||||
import time
|
||||
import re
|
||||
|
||||
@@ -35,8 +34,8 @@ from sabnzbd.misc import real_path, get_unique_path, create_dirs, move_to_path,
|
||||
make_script_path, long_path, clip_path, \
|
||||
on_cleanup_list, renamer, remove_dir, remove_all, globber, globber_full, \
|
||||
set_permissions, cleanup_empty_directories, fix_unix_encoding, \
|
||||
sanitize_and_trim_path, sanitize_files_in_folder
|
||||
from sabnzbd.tvsort import Sorter
|
||||
sanitize_and_trim_path, sanitize_files_in_folder, remove_file
|
||||
from sabnzbd.sorting import Sorter
|
||||
from sabnzbd.constants import REPAIR_PRIORITY, TOP_PRIORITY, POSTPROC_QUEUE_FILE_NAME, \
|
||||
POSTPROC_QUEUE_VERSION, sample_match, JOB_ADMIN, Status, VERIFIED_FILE
|
||||
from sabnzbd.encoding import TRANS, unicoder
|
||||
@@ -52,6 +51,8 @@ import sabnzbd.notifier as notifier
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
import sabnzbd.utils.checkdir
|
||||
|
||||
MAX_FAST_JOB_COUNT = 3
|
||||
|
||||
# Match samples
|
||||
RE_SAMPLE = re.compile(sample_match, re.I)
|
||||
|
||||
@@ -68,15 +69,26 @@ class PostProcessor(Thread):
|
||||
|
||||
if self.history_queue is None:
|
||||
self.history_queue = []
|
||||
self.queue = Queue.Queue()
|
||||
|
||||
# Fast-queue for jobs already finished by DirectUnpack
|
||||
self.fast_queue = Queue.Queue()
|
||||
|
||||
# Regular queue for jobs that might need more attention
|
||||
self.slow_queue = Queue.Queue()
|
||||
|
||||
# Load all old jobs
|
||||
for nzo in self.history_queue:
|
||||
self.process(nzo)
|
||||
|
||||
# Counter to not only process fast-jobs
|
||||
self.__fast_job_count = 0
|
||||
|
||||
# State variables
|
||||
self.__stop = False
|
||||
self.__busy = False
|
||||
self.paused = False
|
||||
PostProcessor.do = self
|
||||
|
||||
self.__busy = False # True while a job is being processed
|
||||
|
||||
def save(self):
|
||||
""" Save postproc queue """
|
||||
logging.info("Saving postproc queue")
|
||||
@@ -116,7 +128,12 @@ class PostProcessor(Thread):
|
||||
""" Push on finished job in the queue """
|
||||
if nzo not in self.history_queue:
|
||||
self.history_queue.append(nzo)
|
||||
self.queue.put(nzo)
|
||||
|
||||
# Fast-track if it has DirectUnpacked jobs or if it's still going
|
||||
if nzo.direct_unpacker and (nzo.direct_unpacker.success_sets or not nzo.direct_unpacker.killed):
|
||||
self.fast_queue.put(nzo)
|
||||
else:
|
||||
self.slow_queue.put(nzo)
|
||||
self.save()
|
||||
sabnzbd.history_updated()
|
||||
|
||||
@@ -132,7 +149,8 @@ class PostProcessor(Thread):
|
||||
def stop(self):
|
||||
""" Stop thread after finishing running job """
|
||||
self.__stop = True
|
||||
self.queue.put(None)
|
||||
self.slow_queue.put(None)
|
||||
self.fast_queue.put(None)
|
||||
|
||||
def cancel_pp(self, nzo_id):
|
||||
""" Change the status, so that the PP is canceled """
|
||||
@@ -146,7 +164,7 @@ class PostProcessor(Thread):
|
||||
|
||||
def empty(self):
|
||||
""" Return True if pp queue is empty """
|
||||
return self.queue.empty() and not self.__busy
|
||||
return self.slow_queue.empty() and self.fast_queue.empty() and not self.__busy
|
||||
|
||||
def get_queue(self):
|
||||
""" Return list of NZOs that still need to be processed """
|
||||
@@ -168,6 +186,18 @@ class PostProcessor(Thread):
|
||||
else:
|
||||
logging.info("Completed Download Folder %s is not on FAT", complete_dir)
|
||||
|
||||
# Check on Windows if we have unicode-subprocess
|
||||
if sabnzbd.WIN32:
|
||||
try:
|
||||
import subprocessww
|
||||
except ImportError:
|
||||
logging.warning(T('Module subprocessww missing. Expect problems with Unicoded file and directory names in downloads.'))
|
||||
|
||||
# Do a pruge of the history-items if it was set, just to be sure
|
||||
history_db = database.HistoryDB()
|
||||
history_db.auto_history_purge()
|
||||
history_db.close()
|
||||
|
||||
# Start looping
|
||||
check_eoq = False
|
||||
while not self.__stop:
|
||||
@@ -177,15 +207,28 @@ class PostProcessor(Thread):
|
||||
time.sleep(5)
|
||||
continue
|
||||
|
||||
# Something in the fast queue?
|
||||
try:
|
||||
nzo = self.queue.get(timeout=1)
|
||||
# Every few fast-jobs we should check allow a
|
||||
# slow job so that they don't wait forever
|
||||
if self.__fast_job_count >= MAX_FAST_JOB_COUNT and self.slow_queue.qsize():
|
||||
raise Queue.Empty
|
||||
|
||||
nzo = self.fast_queue.get(timeout=2)
|
||||
self.__fast_job_count += 1
|
||||
except Queue.Empty:
|
||||
if check_eoq:
|
||||
check_eoq = False
|
||||
handle_empty_queue()
|
||||
# Try the slow queue
|
||||
try:
|
||||
nzo = self.slow_queue.get(timeout=2)
|
||||
# Reset fast-counter
|
||||
self.__fast_job_count = 0
|
||||
except Queue.Empty:
|
||||
# Check for empty queue
|
||||
if check_eoq:
|
||||
check_eoq = False
|
||||
handle_empty_queue()
|
||||
# No fast or slow jobs, better luck next loop!
|
||||
continue
|
||||
else:
|
||||
nzo = self.queue.get()
|
||||
|
||||
# Stop job
|
||||
if not nzo:
|
||||
@@ -213,6 +256,9 @@ class PostProcessor(Thread):
|
||||
history_db.close()
|
||||
nzo.purge_data(keep_basic=False, del_files=True)
|
||||
|
||||
# Processing done
|
||||
nzo.pp_active = False
|
||||
|
||||
self.remove(nzo)
|
||||
check_eoq = True
|
||||
|
||||
@@ -238,7 +284,6 @@ def process_job(nzo):
|
||||
postproc_time = 0
|
||||
script_log = ''
|
||||
script_line = ''
|
||||
crash_msg = ''
|
||||
|
||||
# Get the job flags
|
||||
nzo.save_attribs()
|
||||
@@ -495,15 +540,15 @@ def process_job(nzo):
|
||||
Rating.do.update_auto_flag(nzo.nzo_id, Rating.FLAG_EXPIRED, host)
|
||||
|
||||
except:
|
||||
logging.error(T('Post Processing Failed for %s (%s)'), filename, crash_msg)
|
||||
if not crash_msg:
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
crash_msg = T('see logfile')
|
||||
nzo.fail_msg = T('PostProcessing was aborted (%s)') % unicoder(crash_msg)
|
||||
logging.error(T('Post Processing Failed for %s (%s)'), filename, T('see logfile'))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
nzo.fail_msg = T('PostProcessing was aborted (%s)') % T('see logfile')
|
||||
notifier.send_notification(T('Download Failed'), filename, 'failed', nzo.cat)
|
||||
nzo.status = Status.FAILED
|
||||
par_error = True
|
||||
all_ok = False
|
||||
|
||||
if cfg.email_endjob():
|
||||
emailer.endjob(nzo.final_name, nzo.cat, all_ok, clip_path(workdir_complete), nzo.bytes_downloaded,
|
||||
nzo.fail_msg, nzo.unpack_info, '', '', 0)
|
||||
@@ -563,7 +608,7 @@ def process_job(nzo):
|
||||
def prepare_extraction_path(nzo):
|
||||
""" Based on the information that we have, generate
|
||||
the extraction path and create the directory.
|
||||
Seperated so it can be called from DirectUnpacker
|
||||
Separated so it can be called from DirectUnpacker
|
||||
"""
|
||||
one_folder = False
|
||||
marker_file = None
|
||||
@@ -668,6 +713,7 @@ def parring(nzo, workdir):
|
||||
logging.info('Re-added %s to queue', filename)
|
||||
if nzo.priority != TOP_PRIORITY:
|
||||
nzo.priority = REPAIR_PRIORITY
|
||||
nzo.status = Status.FETCHING
|
||||
sabnzbd.nzbqueue.NzbQueue.do.add(nzo)
|
||||
sabnzbd.downloader.Downloader.do.resume_from_postproc()
|
||||
|
||||
@@ -796,7 +842,7 @@ def cleanup_list(wdir, skip_nzb):
|
||||
if on_cleanup_list(filename, skip_nzb):
|
||||
try:
|
||||
logging.info("Removing unwanted file %s", path)
|
||||
os.remove(path)
|
||||
remove_file(path)
|
||||
except:
|
||||
logging.error(T('Removing %s failed'), clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -843,10 +889,14 @@ def nzb_redirect(wdir, nzbname, pp, script, cat, priority):
|
||||
def one_file_or_folder(folder):
|
||||
""" If the dir only contains one file or folder, join that file/folder onto the path """
|
||||
if os.path.exists(folder) and os.path.isdir(folder):
|
||||
cont = os.listdir(folder)
|
||||
if len(cont) == 1:
|
||||
folder = os.path.join(folder, cont[0])
|
||||
folder = one_file_or_folder(folder)
|
||||
try:
|
||||
cont = os.listdir(folder)
|
||||
if len(cont) == 1:
|
||||
folder = os.path.join(folder, cont[0])
|
||||
folder = one_file_or_folder(folder)
|
||||
except WindowsError:
|
||||
# Can occur on paths it doesn't like, for example "C:"
|
||||
pass
|
||||
return folder
|
||||
|
||||
|
||||
@@ -876,7 +926,7 @@ def remove_samples(path):
|
||||
path = os.path.join(root, file_)
|
||||
try:
|
||||
logging.info("Removing unwanted sample file %s", path)
|
||||
os.remove(path)
|
||||
remove_file(path)
|
||||
except:
|
||||
logging.error(T('Removing %s failed'), clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -929,7 +979,7 @@ def del_marker(path):
|
||||
if path and os.path.exists(path):
|
||||
logging.debug('Removing marker file %s', path)
|
||||
try:
|
||||
os.remove(path)
|
||||
remove_file(path)
|
||||
except:
|
||||
logging.info('Cannot remove marker file %s', path)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
@@ -384,8 +384,6 @@ class RSSQueue(object):
|
||||
n = 0
|
||||
if ('F' in reTypes or 'S' in reTypes) and (not season or not episode):
|
||||
season, episode = sabnzbd.newsunpack.analyse_show(title)[1:3]
|
||||
season = int_conv(season)
|
||||
episode = int_conv(episode)
|
||||
|
||||
# Match against all filters until an positive or negative match
|
||||
logging.debug('Size %s', size)
|
||||
@@ -717,8 +715,11 @@ def ep_match(season, episode, expr, title=None):
|
||||
"""
|
||||
m = _RE_SP.search(expr)
|
||||
if m:
|
||||
# Make sure they are all integers for comparison
|
||||
req_season = int(m.group(1))
|
||||
req_episode = int(m.group(2))
|
||||
season = int_conv(season)
|
||||
episode = int_conv(episode)
|
||||
if season > req_season or (season == req_season and episode >= req_episode):
|
||||
if title:
|
||||
show = expr[:m.start()].replace('.', ' ').replace('_', ' ').strip()
|
||||
|
||||
@@ -94,8 +94,8 @@ class SABTrayThread(SysTrayIconThread):
|
||||
self.counter += 1
|
||||
if self.counter > 10:
|
||||
self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue()
|
||||
mb_left = to_units(bytes_left, dec_limit=1)
|
||||
speed = to_units(bpsnow, dec_limit=1)
|
||||
mb_left = to_units(bytes_left)
|
||||
speed = to_units(bpsnow)
|
||||
|
||||
if self.sabpaused:
|
||||
self.hover_text = self.txt_paused
|
||||
@@ -110,6 +110,14 @@ class SABTrayThread(SysTrayIconThread):
|
||||
self.refresh_icon()
|
||||
self.counter = 0
|
||||
|
||||
# left-click handler
|
||||
def click(self, *args):
|
||||
# Make sure to stop the timer
|
||||
self.stop_click_timer()
|
||||
# Pause/resume and force update of icon/text
|
||||
self.pauseresume(None)
|
||||
self.counter = 11
|
||||
|
||||
# menu handler
|
||||
def opencomplete(self, icon):
|
||||
try:
|
||||
|
||||
@@ -78,8 +78,8 @@ class StatusIcon(Thread):
|
||||
# run this every updatefreq ms
|
||||
def run(self):
|
||||
self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue()
|
||||
mb_left = to_units(bytes_left, dec_limit=1)
|
||||
speed = to_units(bpsnow, dec_limit=1)
|
||||
mb_left = to_units(bytes_left)
|
||||
speed = to_units(bpsnow)
|
||||
|
||||
if self.sabpaused:
|
||||
self.tooltip = T('Paused')
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user