Compare commits

...

316 Commits

Author SHA1 Message Date
Safihre
bcc4dd75cf Update text files for 2.2.1 2017-08-25 21:58:48 +02:00
Safihre
97711ca82e Revert "Remove locks from ArticleCache"
This reverts commit 5e7558ce4a.
2017-08-25 21:57:16 +02:00
Safihre
e782237f27 More logging when adding NZB's 2017-08-25 21:49:24 +02:00
Safihre
52bb156c08 Ignore unpack errors in duplicate rarsets
Multipar and par2tbb will detect and log them so we can remove them, but par2cmdline will not.
2017-08-25 16:58:38 +02:00
Safihre
4361d82ddd Duplicate files in NZB could result in broken unpack after repair
Because par2 would detect them, but not use them. So ".1" files would later be used for unpack, even though it's not a real set.
2017-08-25 16:57:47 +02:00
Safihre
017cf8f285 Do not fail a job if recursive unpack fails
The user can handle it, we did our part.
2017-08-25 09:15:14 +02:00
Safihre
03cdf6ed5d Sync translatable texts from develop
To avoid conflicts on Launchpad
2017-08-24 23:40:37 +02:00
Safihre
cf347a8e90 Original files would be deleted after a MultiPar rename 2017-08-24 23:36:36 +02:00
Safihre
f06afe43e1 Use fileobj to prevent having to chdir, which can crash on macOS
If something is "wrong" with the current directory, for example when SABnzbd is started after downloading in a sandbox by macOS security, this function can error and break the adding of NZB's.
Have to use a fileobj, otherwise GZip will put the whole path inside there.
2017-08-24 16:36:13 +02:00
Safihre
fb301eb5c8 Update text files for 2.2.1RC2 2017-08-23 22:49:59 +02:00
Safihre
1562c3560b Handle '482 Download limt exceeded'
Closes #1009
2017-08-23 22:48:15 +02:00
Safihre
9813bc237f Only auto-disconnect after first run of verification 2017-08-23 21:42:56 +02:00
Safihre
b39fe059c6 Pause between unpacks on Windows, otherwise subprocess_fix overloads
Strange but true, but on jobs with many small files to unpack, it would just fail.
2017-08-23 21:42:17 +02:00
Safihre
a56c770a8b The real anti-stalling fix
Woohoo!
For each NZF (file) make sure all articles have tried a server before marking it as tried. Before if articles were still in transit they could be marked as tried on NZF level before the server could get to them,
2017-08-23 16:02:01 +02:00
Safihre
e3bf0edad8 TryList reset at NZO level also nessecary
Timing issue between when a new server is selected and when a job is added to the NZO-level try-list. Locks were tried, but failed.
2017-08-23 09:11:01 +02:00
Safihre
e35d9e4db3 Correct handeling of TryList when server has timeout 2017-08-23 08:32:47 +02:00
Safihre
c617d4321a Correctly remove + from INFO label in all languages 2017-08-22 16:13:24 +02:00
Safihre
0fd3a2881f Correct redirect after ports change 2017-08-22 10:19:42 +02:00
Safihre
0c1f7633de Only discard really non-unique hashes from md5of16k 2017-08-22 09:43:33 +02:00
Safihre
b7d5d49c84 Show hover-title that the compress icon is Direct Unpack 2017-08-22 09:43:26 +02:00
Safihre
9911b93ece Add error when NZO creation fails 2017-08-22 09:43:11 +02:00
Safihre
eeaad00968 Also hide email-accounts in logging 2017-08-22 09:43:06 +02:00
Safihre
e1bb8459e3 Take the risk of allowing up to 5 bad articles in jobs without Par2 2017-08-22 09:42:47 +02:00
Safihre
65c3ac0cc0 Warn in case the password file has too many passwords 2017-08-22 09:42:16 +02:00
Safihre
413c02a80f Do not run get_new_id forever in case of problems
#984
2017-08-22 09:41:40 +02:00
Safihre
80f118f304 UnRar is required to read some RAR files 2017-08-21 08:23:10 +02:00
Safihre
5c0a10e16b Update text files for 2.2.1RC1 2017-08-19 11:06:40 +02:00
Safihre
d9b32261e7 Reset all NZO TryList when doing Prospective Add
I thought in c14b3ed82a that this was enough, but clearly it is not.
2017-08-19 11:03:22 +02:00
Safihre
8d8ce52193 Stall prevention by checking TryList 2017-08-19 11:03:15 +02:00
Safihre
1cc2e25cda Update to 2.2.0 2017-08-17 10:47:04 +02:00
SABnzbd Automation
0dc2c6687d Automatic translation update 2017-08-17 08:43:38 +00:00
Safihre
b061e582b6 Update text files for 2.2.0 2017-08-16 22:56:10 +02:00
Safihre
690731fd79 Update wizard Ad URL 2017-08-16 13:34:01 +02:00
Safihre
068b7ed7f5 Disk-speed test for Direct Unpack would cause restart 2017-08-15 21:53:24 +02:00
Safihre
aae2fdcd32 Update Unrar to 5.5.0 for Windows and macOS
Right on time.
Closes #935
2017-08-14 20:37:11 +02:00
Safihre
d3628a1eb7 CherryPy 8.1.2 - Catch the [Errno 0] Error
Untill a fix is found.
2017-08-13 16:58:20 +02:00
Safihre
9cc8176d87 Server-tests were broken due to deprecation warning
Linked #996
2017-08-12 14:52:34 +02:00
Safihre
27f83f21be Update text files for 2.2.0RC3 2017-08-12 11:39:28 +02:00
Safihre
5e31a31a21 Make Server charts timezone-proof
Closes #997
2017-08-12 21:23:18 +12:00
Safihre
a077012478 Windows fix for subprocess would break when options were not specified 2017-08-12 09:42:47 +02:00
Safihre
fed0e0f765 Use win32api for power-options on Windows 2017-08-12 09:39:25 +02:00
Safihre
fbdbf7ab22 Improve par2 handeling by always parsing md5of16k and checking new sets
- We postpone only par2-files with actual blocks, in case of duplicate named par2 files that are of different sets we want all base-par2 files.
- The md5of16k is now calculated for every par2 file we get so we can rename everything.
- We also check during assembly if maybe a md5of16k is now available, in case the par2 file came in later.
- If a par2 file comes in, we double check if maybe this pack was not known yet. The setname might not be unique. This way we make sure that everything gets verified at the end.

Still need obfuscation improvements, but that's for later.
Linked #998
2017-08-12 00:33:32 +02:00
SABnzbd Automation
f013d38d00 Automatic translation update 2017-08-10 11:45:54 +00:00
Safihre
93b9c8a6da Correctly escape the values in EN.po 2017-08-10 13:33:11 +02:00
SABnzbd Automation
e3a779bbc6 Automatic translation update 2017-08-09 21:44:13 +00:00
Safihre
adfce8c8b6 Update text files for 2.2.0RC2 2017-08-09 23:03:44 +02:00
Safihre
a49d68c0db Double check that we have pynotify version we can work with
Closes #992
2017-08-09 22:56:07 +02:00
Safihre
e4156e76d1 Disable auto-zoom on mobile for adaptive pages 2017-08-09 22:50:53 +02:00
Safihre
35b66eea0e Add more space to Config header just in case 2017-08-09 18:45:01 +03:00
Safihre
4d0cf8d45f Correct naming and small style fix 2017-08-09 18:36:20 +03:00
Safihre
ad9fef5f41 Prevent SQL injection via category-argument with ' in them 2017-08-09 17:43:17 +03:00
Safihre
6235174995 CherryPy 8.1.2 - Correct f6c163b: macOS "Protocol wrong type for socket"
https://github.com/cherrypy/cheroot/pull/31
https://github.com/cherrypy/cheroot/pull/44
2017-08-09 09:55:04 +03:00
Safihre
4b9ca989c4 Correctly log the rar-files used by DirectUnpack
Not just assume we used them all.
2017-08-08 13:39:03 +03:00
Safihre
4d54aecceb Check the workdir after extraction if we got everything
Sometimes there might be a file left that we did not extract. For example there are NZBs that have the main download in abc.part01.rar etc but also a abc.rar file with the NFO or other things. 
SABnzbd would detect this as 1 set and not unpack both.
2017-08-08 13:37:09 +03:00
Safihre
11eeb6f2e9 Glitter filelist would not show 100% for very small files
Plus some cleanup of move-to-top/bottom code
2017-08-08 12:19:07 +03:00
Safihre
00364b1317 Only update RSS URI if it was modified
See #993
2017-08-08 12:04:54 +03:00
shypike
6666663f78 Fix typo in text about "allow duplicate files" 2017-08-08 09:17:25 +02:00
Safihre
3d6dfec47a Disk-space check in Assembler and check if space to write current file 2017-08-06 19:01:59 +03:00
Safihre
0f3d44aa4b safe_fnmatch should only do the matching
Oops, globber and globber_full are not the same!
2017-08-06 12:57:23 +03:00
SABnzbd Automation
d2d2471950 Automatic translation update 2017-08-06 09:42:54 +00:00
Safihre
b71343e8ab Safe fnmatch everywhere, just to be sure
Linked #990
2017-08-06 11:46:00 +03:00
Safihre
489f3f4ba0 Catch special chars like "[]!*" to break fnmatch and thus repair
Closes #990
2017-08-06 11:25:27 +03:00
Safihre
3765e8c350 Add warning when many duplicate files were discarded
Linked #531, Closes #986
2017-08-02 12:50:26 +02:00
Safihre
28d4f527b8 Fix the server-graphs
They did not display anything if it was the first of the month. Plus some style-fixes.
2017-08-01 13:31:18 +02:00
Safihre
1d8af8f97d Correct counts if one_folder is enabled 2017-08-01 11:28:34 +02:00
Safihre
829ef4bee8 Only one_folder is a reason not to delete the folder in DircetUnpack 2017-08-01 11:06:40 +02:00
Safihre
7e40c12e47 Get rarfiles to delete from both RarFile and parsing Unrar output
RarFile will fail to list all volumes when the job is encrypted, it will only list the first volume. But parsing the output of Unrar will fail on special-char filenames (probably limited to Windows). So now only jobs that are encrypted *and* have many special-chars will not have all rars deleted correctly,
2017-07-31 23:45:56 +02:00
Safihre
37d8d659f5 Show deprication warning for Server Categories 2017-07-31 22:26:21 +02:00
Safihre
0a29291be2 Abort all direct unpackers when disk-full 2017-07-31 22:26:04 +02:00
Safihre
7f3a5f309b Don't postpone if all par2 are desired and should be kept
Prevents downloading of all par2 in case people just wanted to keep some par2, but not all. If people really want all and no-cleanup, they should enable 'All par2'
2017-07-31 16:51:48 +02:00
Safihre
60ec5f9191 Less aggresive cache-busting 2017-07-31 10:38:45 +02:00
Safihre
d03e801e74 Only show import warnings when not gone
Can be removed if #952 is resolved
2017-07-30 20:29:28 +02:00
Safihre
56bf484e77 Also show Verifying Repair status for par2cmdline 2017-07-30 16:51:28 +02:00
Safihre
66674469d5 Return of the DIR_LOCK
Yeah, turns out we probably do need that. In case automation adds a new job while the old one is still getting deleted. Hopefully solving #952
2017-07-30 15:57:34 +02:00
Safihre
09a86683e5 Retry icon was too red in Glitter Night 2017-07-30 15:56:49 +02:00
Safihre
fc9a13879e CSS Tweaks to Night theme 2017-07-30 11:32:35 +02:00
Safihre
73f0885566 Schedule to deprecate Categories setting for Servers in next release
This option only gives headaches because users do not use it correctly or edge cases where downloads stall. 
If users report that they really want to keep this option, we can of course consider it.
2017-07-29 13:29:10 +02:00
Safihre
090b22f193 Revert "CherryPy 8.1.2 - Catch error of Python 2 in combination with new OpenSSL"
Not catching the right error because it's of the general Error class, not SSLError.
2017-07-28 18:46:46 +02:00
Safihre
f9c092ae8f Move Notification Script up on the Config page and add Wiki-link
So they can see other services
2017-07-28 09:52:25 +02:00
Safihre
4246bc2aea Move enable_meta to more logical spot 2017-07-27 16:00:40 +02:00
Safihre
c4fa047393 Automatic redirect to login page in Glitter 2017-07-27 14:56:34 +02:00
SABnzbd Automation
22e4d24a71 Automatic translation update 2017-07-27 12:29:06 +00:00
Safihre
96fccff63b Update text files for 2.2.0RC1 2017-07-27 13:50:41 +02:00
Safihre
6b46a15b49 Include indexer-hostname in the API-key missing warning 2017-07-27 11:50:12 +02:00
Safihre
98cc0dad55 API-key was always required for Indexer-feedback
Remove oznzb specific links for realy now.
Indexers should provide their rating-url in the headers/meta-data. Keeping the Specials setting for backwards compatibility for current OZnzb users.
2017-07-27 11:48:00 +02:00
Safihre
6fdeab6948 Permanent notice in Plush to upgrade to Glitter 2017-07-27 10:35:26 +02:00
Safihre
553dd04cea Restore 'Use tags from indexer' switch
https://forums.sabnzbd.org/viewtopic.php?f=11&t=22864
2017-07-27 09:52:59 +02:00
Safihre
0baa316a72 Revert "Remove enable_meta"
This reverts commit ff3c46fe1f.
2017-07-27 08:35:06 +02:00
Safihre
3ac209f9a9 CherryPy 8.1.2 - Catch error of Python 2 in combination with new OpenSSL
Closes #853
2017-07-26 16:34:45 +02:00
Safihre
ec55f64a8a Correctly remove files when flat_unpack or no-job-folders set
Results could be pretty bad otherwise: https://forums.sabnzbd.org/viewtopic.php?f=11&p=112774
2017-07-26 09:30:39 +02:00
Safihre
932e1e577b Do not double check 'part' in RAR filename
Already caught by the regex, otherwise filenames that have "part" somwhere in the name will not be used for direct-unpack.
2017-07-26 08:59:26 +02:00
Hellowlol
56d5b1d9f8 Make bonjour easier to setup. 2017-07-25 15:52:30 +02:00
Hellowlol
28bdebb147 Let zeroconf know if we are using https. 2017-07-25 15:52:30 +02:00
Safihre
827fc7b64e Direct Unpack would block forever if file was missing 2017-07-25 11:58:29 +02:00
Safihre
f5dde93644 Change History Retention label to fit
Closes #978
2017-07-24 19:21:43 +02:00
Safihre
60c574828e Sort Servers in Download Report
Closes #979
2017-07-24 19:14:31 +02:00
Safihre
14ca8342f9 Update wiki URL to 2.2 2017-07-24 13:36:16 +02:00
Travis
5d5b1bf053 Automatic translation update 2017-07-24 08:16:18 +00:00
Safihre
ea4cdba3eb Update text files for 2.2.0Beta2 2017-07-24 10:08:21 +02:00
Safihre
d6ecebc75a Use existing texts for Tag duplicate 2017-07-24 10:07:15 +02:00
Jonathon Saine
b0af6a1761 User requested a way to track dupes but not have sab block/discard/pause the items (as he doesnt want to have to manually unpause). Figured we could add a 'Tag' switch for the Dupe detection. Works same way as Pause (shows duplicate tag in queue/adds warning/internally tags it) but does not pause the item.
Once the file is done downloading and makes it to the queue, you have no idea it was a duplicate.
You would have to use the 'Warning' and search for that.. and then assume the newer one was the dupe... we really should expose in the History that an item was a duplicate. Right now the 'search' box only looks at the name.. and I dont think we should be messing with the name to add duplicate there. I'd rather us just add a tag/flag whatever to notate this.. and can filter/sort on it. We also should do the same to the Queue as well.. since changing the name of the item to be `DUPLICATE / XXXXX` is a little jarring.

Now if we just exposed the dupe flag in the history, then the whole 'tag' option really isnt needed as it was just a means to an end.
2017-07-24 10:00:15 +02:00
Safihre
6e350f30fc Add midnight auto history-purge and modify texts 2017-07-24 09:47:05 +02:00
Safihre
169137c631 Implement History Retention setting
Closes #678
2017-07-24 09:47:05 +02:00
Safihre
6393dc0dca Remove history_limit from Specials 2017-07-24 09:47:05 +02:00
Safihre
1a27b4824b Style improvements to Queue and Server Graphs
Closes #977
2017-07-24 09:36:48 +02:00
Safihre
2b59a383cf Change label in History-status to 'Direct Unpack' 2017-07-24 09:05:02 +02:00
Safihre
efbaaade22 Correct server graph timezone effects and only show months that we have 2017-07-23 23:14:10 +02:00
Safihre
cf7e7b1f62 Only show usage data for days that have passed 2017-07-23 23:14:10 +02:00
Safihre
2c1746a92d Show Montly usage graphs per server in Config 2017-07-23 23:14:10 +02:00
Travis
a2e57fd3d8 Automatic translation update 2017-07-22 17:27:02 +00:00
Safihre
932f8d9176 Wizard access was not limited by login and external access rules
Bad bad 
Closes #972
2017-07-22 18:54:33 +02:00
Safihre
5ffd82da89 Show vote up/down instead of Video/Audio score 2017-07-22 00:19:40 +02:00
Safihre
8b3de191d9 Add Retry All Failed button to Glitter 2017-07-22 00:11:13 +02:00
Travis
83d8a23e2c Automatic translation update 2017-07-20 22:13:49 +00:00
Safihre
58b107a4b5 Allow up to 5 missing/CRC'ed errors before cancelling Direct Unpack
Sometimes a CRC error is not so bad it turns out
2017-07-20 23:55:36 +02:00
Safihre
a40609b39d Direct Unpack was started before whole file was written to disk
In case part 2 came in before part 1.
2017-07-20 23:55:36 +02:00
Sander Jo
0faa5d3dff Print applied permissions in octal 2017-07-20 21:04:00 +02:00
Travis
374239777e Automatic translation update 2017-07-19 07:55:50 +00:00
Safihre
9a7701d7e6 Update text files for 2.2.0Beta1 2017-07-19 09:33:00 +02:00
Safihre
01ff04f338 Allow Aborting of Direct Unpack during PP and add Completed label 2017-07-19 09:27:24 +02:00
Safihre
eac39767dd Renames on Retry only when defined
Otherwise if it's None, later this will happen:
original_filename = self.renames.get(nzf.filename, '')
AttributeError: 'NoneType' object has no attribute 'get'
2017-07-19 09:23:58 +02:00
Safihre
0d0adf99fa Proper counting of bad articles for DirectUnpack & Prospective Par2 2017-07-18 22:07:56 +02:00
Safihre
16905ce34f Show filename for Unzip instead of Path and show start of Verification 2017-07-18 21:16:05 +02:00
Safihre
5287fa8a0c Stability improvements for Direct Unpack
Now shows the time spent in unpacking and many other bugs squased.
2017-07-18 21:15:30 +02:00
Safihre
b72ab4fb8e Allow concurrent unpacking 2017-07-18 15:14:28 +02:00
Safihre
81054c675c Mimimum speed for Direct Unpack lowered to 40MB/s
It is tested during downloading, so if 40MB/s is still possible then we should be good to go.
2017-07-18 13:51:13 +02:00
Safihre
7362be8748 Group cfg settings by Config section
It was a big mess. 
Now they still could be sorted within each section.. next time.
2017-07-17 20:42:54 +02:00
Travis
b4ba2b3463 Automatic translation update 2017-07-17 18:33:42 +00:00
Safihre
8bed6938c1 Change text in DirectUnpack Enabled message
See also #966
2017-07-17 20:11:50 +02:00
Safihre
ecf16f6201 Show DirectUnpack progress the same as Unpack progress: xx/xx 2017-07-17 17:07:44 +02:00
Safihre
bf240357df Regressions in preparation of extraction path
Thanks @Cpuroast
2017-07-17 16:45:58 +02:00
Safihre
ddcf447957 Add missing save_config after modifying settings
Closes #966
2017-07-17 10:10:20 +02:00
Safihre
d9642611e2 Correct error in missing notify options
#966
2017-07-16 20:28:15 +02:00
Safihre
0018c6f263 Move regex to top and increase save-timeout 2017-07-16 19:26:35 +02:00
Safihre
6398bfa12f Use speed from download-log instead of re-calculating
Closes #829
2017-07-16 19:22:52 +02:00
Safihre
4605c3fd30 Set version to 2.1.0 and make identical to develop 2017-06-09 11:35:46 +02:00
Safihre
ed7dc3f827 Merge branch 'develop' 2017-06-09 11:30:43 +02:00
Safihre
e69eeebdd8 Merge branch 'develop' - Update to 2.0.1 2017-05-24 12:14:56 +02:00
Safihre
5da5f1adc1 Set version to 2.0.0 2017-04-09 12:25:05 +02:00
Safihre
f47e92dec0 Merge branch 'develop' 2017-04-09 11:59:13 +02:00
Safihre
a894ca5171 Set version to 1.2.3 2017-03-18 13:05:04 +01:00
Safihre
5abe1140ae Merge branch '1.2.x' 2017-03-18 13:03:36 +01:00
Safihre
d34e14370c Chain certificates not loaded in all situations of extra servers 2017-03-18 11:43:46 +01:00
Safihre
c4f4a3131c Update 1.2.3 text files for extra bugfix 2017-03-18 11:40:57 +01:00
Safihre
dcbd9b57f3 CherryPy would fallback to (non-existing) pyopenssl for extra servers
Causing failed starts
2017-03-18 11:39:40 +01:00
Safihre
aad3b54a17 Update Text Files for 1.2.3
These patches were already tested within 2.0.0Alpha/Beta, so considerd safe.
2017-03-18 11:04:57 +01:00
Safihre
cde142a371 Windows paths can't end in a dot 2017-03-18 11:02:14 +01:00
Safihre
8bfc98ffc6 Glitter server unblock button wasn't working
Closes #864
2017-03-18 11:01:51 +01:00
Jonathon Saine
e46f21d566 Fix -w option as it no longer needs arguments. 2017-03-18 11:00:46 +01:00
Safihre
0e45fdcdfd Fix BPS manager breaking the downloader due to Quota 2017-03-18 10:28:31 +01:00
Safihre
eec7af16d7 Improve log obfuscation
It needs to match any charachters not just alpha-numeric
2017-03-18 10:28:03 +01:00
Safihre
6532425902 Kill the UnRar after a Windows failure
On Windows Server it seems unrar otherwise won't stop: https://forums.sabnzbd.org/viewtopic.php?f=3&t=22492
2017-03-18 10:27:57 +01:00
Safihre
44b896522c Unzip needs clipped paths
(7zip doesn't)
2017-03-18 10:26:32 +01:00
Safihre
1b16ee44cb Set version to 1.2.2 2017-02-28 11:17:24 +01:00
Safihre
d5f608c28c Merged branch 1.2.x into master 2017-02-28 11:16:59 +01:00
Safihre
555d8418e7 Update text files for 1.2.2 2017-02-25 22:12:34 +01:00
Safihre
8c22e35da4 Script paths were not clipped correctly 2017-02-25 22:07:25 +01:00
Safihre
95a7924b31 Set version to 1.2.1 and fix small discrepancies 2017-02-24 11:22:55 +01:00
Safihre
5830bebd95 Merge branch '1.2.x' 2017-02-24 11:16:18 +01:00
shypike
d32cf57c75 Update translations 2017-02-24 10:03:07 +01:00
Safihre
6d9242ebc5 Update text files for 1.2.1 Final 2017-02-23 11:53:56 +01:00
Safihre
cbc4f6a964 When retry of unpack due to Windows bug, send the actual password
We converted the password to "-p<password>" and when we had to retry it due to a Windows long-path fail, it would become "-p-p<password" and would incorrectly report that the password was wrong.
2017-02-21 20:09:07 +01:00
Safihre
2a3b2b9556 Forced diskspace check seperate from cached one
Closes #826. Otherwise the complete/incomplete get out of sync.
2017-02-20 15:43:55 +01:00
Safihre
53a219f12b Tooltip for Download/Incomplete in Status Windows
Closes #827
2017-02-20 09:03:45 +01:00
Safihre
48519dcfa0 Correct mistake in Diskspace calculation for Unix 2017-02-19 16:12:15 +01:00
Safihre
92542c58fe Diskspace for Complete folder was not calculated 2017-02-19 16:12:07 +01:00
Safihre
7eafe730f9 Modify RarFile to properly handle testrar on Windows
Because unrar doesn't support \\?\ notation for the path to the rarfile we used to clip the path. However, the Python functions that RarFile uses then fail on unicode or jobs with '?' in the filename. Now this is handled correctly, at the very last moment before testing the RAR.
2017-02-19 01:47:29 +01:00
Safihre
494e72a996 Update to 1.2.0 and set version 2017-01-13 17:00:51 +01:00
Safihre
84cc86f1d3 Update to 1.1.1 and set version (#731) 2016-11-11 13:58:07 +01:00
shypike
64479e2e5d Correct the merge of release 1.1.0 to the "master" branch. 2016-09-14 08:26:02 +02:00
shypike
13b523d9bd Merge pull request #681 from Safihre/master
Master to 1.1.0
2016-09-13 16:25:05 +02:00
Safihre
181881a21b Merge branch 'develop' 2016-09-11 22:16:42 +02:00
shypike
86d11095ac Merge pull request #592 from sabnzbd/1.0.x
Update master to 1.0.3
2016-06-10 19:01:03 +02:00
shypike
927ba3cd9d Update text files for 1.0.3 2016-06-04 13:34:11 +02:00
Safihre
6296fc1762 #568 Add code 482 to check for too-many-connections 2016-06-03 23:24:07 +02:00
shypike
60fbe44724 Support X-DNZB-PASSWORD header. 2016-06-03 22:18:56 +02:00
shypike
29e45da431 Fix NZB association for Windows.
Make sure that the second SABnzbd instance sends an UTF-8 encoded URL to the first instance.
Otherwise CherryPy will reject the API call.
2016-06-03 22:07:44 +02:00
shypike
d82e69eef4 Handle checksum error reports from unrar. 2016-06-02 23:19:57 +02:00
shypike
8c7d557252 Prevent job from hanging when adding back par2 files.
Sometimes already completed par2 files are being re-added to the queue as extra par2 files.
Because these files are already complete, there will be no attempt to download them
and as a result they will never leave the queue.
2016-06-02 22:11:59 +02:00
shypike
a56d6e5517 Merge pull request #577 from sabnzbd/1.0.x
1.0.x to master
2016-05-23 18:11:23 +02:00
shypike
7548d9e975 Correct base version number for 1.0.x releases. 2016-05-10 14:43:14 +02:00
shypike
b7e2bd9684 Update text files for 1.0.2 2016-05-03 19:39:45 +02:00
shypike
f0a243e3d3 Fix API status issues.
Remove the "ToPP" status, it serves no purpose.
Only truly deleted jobs should get the "Deleted" status,
not jobs moving from Download to PP queue.
2016-05-01 14:42:07 +02:00
shypike
6e108c9ef2 Prevent Completed and Failed jobs from getting status Deleted. 2016-04-30 11:47:03 +02:00
shypike
89edcc1924 Log the preferred character encoding 2016-04-30 11:18:32 +02:00
shypike
8a6aca47a1 Prevent stalling at 100% when QuickCheck is Off and "Download-all-pars" is On.
The repair function sent all extra par2 files back to the queue
even though they were already downloaded.
2016-04-28 22:42:51 +02:00
shypike
d03e5780b8 Fix API compatibility of queue statuses.
The new statuses TO_PP and DELETED should not be returned by the API.
Tools may not be able to handle them and they are only useful for internal purposes.
2016-04-27 12:03:37 +02:00
shypike
209d8f9b40 NNTP error 502 should not aways be interpreted as bad login.
It can also mean "too many connections".
2016-04-27 11:52:56 +02:00
shypike
c257b1be3d Update text files for 1.0.1 2016-04-26 19:57:22 +02:00
Safihre
2c48c8de2e Force MIME types for CSS and JS files
Caused problems on Windows if external programs overwriten it in registery.
See: http://forums.sabnzbd.org/viewtopic.php?f=2&t=20490
And: https://www.reddit.com/r/usenet/comments/4fkmcx/my_sab_interface_is_text_only/
2016-04-26 19:48:47 +02:00
shypike
a767ef6aed Fix API compatibility of queue.
The new statuses TO_PP and DELETED should not be returned by the API.
Tools may not be able to handle them and they are only useful for internal purposes.
2016-04-26 19:47:38 +02:00
shypike
ad61d1dd03 The pre-queue script can now return an accept value of 2, meaning immediate failure.
Supports front-ends which need the signal that an NZB has been
rejected by the pre-queue script.
2016-04-22 21:54:45 +02:00
shypike
33c3d187a0 Add start script for portable Windows installations 2016-04-22 16:44:37 +02:00
shypike
4eb486d4e2 Update text files for 1.0.0RC1 2016-04-16 15:31:48 +02:00
shypike
bfb6c167a4 Another attempt to set the default cache to 450M. 2016-04-16 15:27:35 +02:00
shypike
44abf3bdf6 Update text files for 1.0.1RC1 2016-04-15 23:12:22 +02:00
shypike
c950572592 Set default cache to 450M 2016-04-15 23:11:53 +02:00
shypike
3999cb13fd Update text files for 1.0.1RC1 2016-04-15 21:06:55 +02:00
shypike
af65075f0c Update text files for 1.0.0RC1 2016-04-15 21:05:53 +02:00
shypike
de2a2b465b Update text files for 1.0.1RC1 2016-04-13 22:41:13 +02:00
shypike
cd7a77f02d Revert "Set default cache size to 750MB on Windows and OSX."
This reverts commit 9b420e91c9.
2016-04-13 22:30:05 +02:00
shypike
f4a5394b63 Prevent creating orphan items in "incomplete" when deleting downloading jobs.
Due to previous issues where articles could be lost,
the nzf.deleted and no.deleted flags were not obeyed.
This could lead to creation of orphans when lost articles would be flushed.

Better solution: drop articles only when job is in a final state.
Also prevent NZO files from being saved when job is in "deleted" state.
2016-04-13 18:32:23 +02:00
jdfalk
3fb6a8dedb Update sabnzbd@.service
1. Added requirement for network to be up before sab starts.
2. Explicitly set service type to simple.
3. Enabled sabnzbd restart on service failure via systemd.
2016-04-13 18:22:11 +02:00
Safihre
50c8f84eba #448-#126 Forced item with missing articles caused overflow in paused queue
Closes #448
Closes #126
2016-04-13 18:21:41 +02:00
Safihre
2c7ecdee92 #464 Grabbing items don't always have status=grabbing
But now they do!
2016-04-07 21:45:28 +02:00
Safihre
72390a793a Add Optional label to Retry password 2016-04-07 21:45:17 +02:00
Safihre
04ad4e5d3e Update cache text to more 2016 values 2016-04-07 21:45:05 +02:00
Safihre
5ef9c6a433 #530 do not ignore files in QuickCheck
Par2 wouldn't ignore them either
2016-04-07 21:44:51 +02:00
shypike
e6baffc839 Prevent API crashes when 'mode' or 'name' have double entries. 2016-04-07 21:35:07 +02:00
shypike
e361eb25a5 Fix potential race condition in BPSmeter. 2016-04-01 21:18:19 +02:00
shypike
9b420e91c9 Set default cache size to 750MB on Windows and OSX.
To make handling of posts with large files more efficient.
2016-04-01 21:09:15 +02:00
Safihre
3a4bf971b2 #529 Fix unicode strip in OptionStr 2016-04-01 20:47:11 +02:00
Safihre
1128691c5d #527 Fix "Download all par2 files" behavior 2016-03-29 21:03:48 +02:00
Safihre
15043aef3f DB Strings should be encapsulated in ' not " 2016-03-29 21:03:30 +02:00
savef
2a3b4afa03 Treat ambiguous numeric values as number of minutes for custom pause time.
Currently if you just type "100" into the custom pause field it'll think you want 143015 minutes, that's useless. A lot of people are probably used to the old Plush behaviour of entering the number of minutes you want to pause for, it's also a much saner default. So in the case that the user just enters some numbers and nothing else, this assumes they want to pause for that many minutes.
2016-03-24 21:01:04 +01:00
shypike
00a98efa81 Fix race-condition when deleting an actively downloading job.
Closes #237
2016-03-24 20:57:27 +01:00
shypike
f013dd7f0d Accept MIME records that have only LF line endings.
Some tool developers just ignore the rule requiring CRLF.
2016-03-23 23:29:12 +01:00
shypike
7b91b1c769 Fix race condition when API and postprocessor both want to delete a history item. 2016-03-23 23:03:28 +01:00
shypike
5583cce322 When urlgrabber receives a 404, stop trying. 2016-03-23 23:00:38 +01:00
shypike
b995c5f992 Fix PushOver support.
Adjust priority levels to the current PushOver API.
Re-enable device field now that the PushOver API supports readable device labels.
2016-03-22 21:25:05 +01:00
shypike
214ac4a53d Prevent incompatibility due to missing 'script_log' field.
Fixes commit c0f2f59fc1
2016-03-20 15:24:07 +01:00
shypike
fc7e87f0df Merge branch '1.0.x' 2016-03-19 11:49:11 +01:00
Safihre
c0f2f59fc1 Fix breaking Glitter bug with large script_log 2016-03-18 14:11:54 +01:00
shypike
b90a847a6f Fix omission in README.mkd 2016-03-15 21:42:16 +01:00
shypike
a58bb385f5 Update text files for 1.0.0 2016-03-15 20:12:50 +01:00
shypike
9754baeb1c Fix handling of changed "ignore_samples" option.
Closes #510
2016-03-15 20:08:35 +01:00
shypike
ffcd154966 Update text files for 1.0.0 Final. 2016-03-14 19:12:59 +01:00
shypike
97cfe9488c Update text files for 1.0.0RC5 2016-03-11 19:24:27 +01:00
shypike
374b6f616a Fix crash in CherryPy when it reports problems with some IPv6 addresses.
A bug in Python's traceback logging causes a crash when an IPv6 address with an embedded % is reported.
2016-03-11 19:22:49 +01:00
Sander Jonkers
e2f51595b6 Because of dual IPv4/IPv6 clients, finding the public ipv4 needs special attention 2016-03-10 22:52:22 +01:00
shypike
04091a16aa Fix display of SABnzbd's icon by OSX Notification Center.
El Capitan doesn't accept the -sender parameter, so just omit it.
2016-03-08 16:40:44 +01:00
shypike
9d9d2fd9a2 Revert "Fix Plush dashboard"
This reverts commit 42f1a4926c.
2016-03-08 16:00:24 +01:00
shypike
5746115331 Suppress errors/warnings about bad "Rating" files when the feature is disabled. 2016-03-08 15:53:52 +01:00
Safihre
42f1a4926c Fix Plush dashboard 2016-03-05 11:23:19 +01:00
Safihre
7d87fd461b Fix Glitter display in <1MB/s range 2016-03-05 11:22:57 +01:00
shypike
1ba9976979 Update text files for 1.0.0RC4 2016-03-05 08:52:09 +01:00
shypike
659c199043 Fix --ipv6_hosting option.
Repairs commit 1cbff28
2016-03-05 08:50:13 +01:00
shypike
81a3f53226 Update text files for 1.0.0RC3 2016-03-04 20:39:01 +01:00
shypike
1cbff28f67 Disable listening on IPv6 addresses by the internal web server.
Setting Config->Special->ipv6_hosting to 1 will enable IPv6 listening.
Command line option --ipv6_hosting allows forcing the choice, should SABnzbd not start.
Closes #492
2016-03-04 19:26:50 +01:00
shypike
8e15acbf30 Update translations 2016-03-04 18:55:20 +01:00
Safihre
e07be60db6 #489 wrongly encoded & in the preload 2016-03-01 22:20:51 +01:00
Safihre
539c9662ff 'Default' not translated in Server-category 2016-03-01 22:20:35 +01:00
shypike
b396014f8d Fix IP test at startup.
Correction of problem introduced by commit afff88b "Use self-test.sabnzbd.org for connection tests".
2016-02-24 22:30:02 +01:00
shypike
1db32415b6 Update translations 2016-02-24 21:37:22 +01:00
shypike
b24629db6b Update text files for 1.0.0RC2 2016-02-24 21:11:43 +01:00
Safihre
9b5cdcf8fb Add trailing "/" to href's 2016-02-24 21:05:12 +01:00
shypike
4831415d14 Use self-test.sabnzbd.org for connection tests 2016-02-24 20:34:04 +01:00
Chris Thorn
a4c51f0b20 Parse bandwidth limit as a float instead of an integer so that non-integer values can be used as bandwidth limit 2016-02-24 20:09:02 +01:00
shypike
ec3ba1fb93 Changing server priorities during a download could lead to unexpected results and lockups.
Target priority of articles must be kept at the TryList level so that they
are reset when the try_list is reset.
Closes #378
2016-02-24 20:08:51 +01:00
Safihre
61966f7036 Plush dashboard local IPv4 wouldn't show if external failed
Typo!
For 1.0.0
2016-02-24 20:08:38 +01:00
Safihre
4f69e81841 Add link to information about SSL/yEnc 2016-02-24 20:07:48 +01:00
Safihre
d0d90581df Tweak first Config page 2016-02-24 20:07:35 +01:00
Safihre
8ea5c27633 Improve display of message on blocked server 2016-02-24 20:07:16 +01:00
shypike
517500fdf3 Add link to issue list on support site. 2016-02-19 22:42:30 +01:00
shypike
c4c1c9b6ab Prevent UI errors due to history_db handle not being available. 2016-02-19 22:22:42 +01:00
Safihre
2388889ede Filegrabber did not sanatize filename 2016-02-19 22:21:28 +01:00
Safihre
55cfe878d7 Catch failing Windows Notification
I assumed Windows notifications could not fail, but clearly they can:
http://forums.sabnzbd.org/viewtopic.php?f=11&t=20211&p=104438
When no tray-icon is available, it will fail and in the case of
completed NZB message it will restart the whole of SABnzbd.
2016-02-17 21:25:42 +01:00
Safihre
a2daaee468 Add Pystone score to Glitter status 2016-02-17 21:06:43 +01:00
Safihre
2c360e395e Limit to max 250 items per page (realistic limit) 2016-02-17 21:05:55 +01:00
Jonathon Saine
399cfee594 Add pyOpenSSL info to startup/utility/config base. Add OpenSSL & yEnc to config base as well. 2016-02-17 21:04:13 +01:00
shypike
be646ae6ab Set default for https verification to off. 2016-02-17 20:50:24 +01:00
shypike
b470253d9f Disable https verification when uploading NZB to running instance of SABnzbd. 2016-02-13 16:12:04 +01:00
shypike
b83c493492 Update translations 2016-02-11 01:06:52 +01:00
Safihre
991277bb01 Glitter broke on empty preload strings
See
http://forums.sabnzbd.org/viewtopic.php?f=11&t=20192&p=104368#p104368
In case of UnicodeError
2016-02-10 22:59:11 +01:00
Safihre
5626013b81 Don't allow name change or filesview on grabbing 2016-02-10 22:58:56 +01:00
Safihre
2810d37758 Make disabled servers look more disabled 2016-02-10 22:58:40 +01:00
Safihre
c2f08f01e0 #408 Show red when Add-NZB left empty 2016-02-10 22:57:30 +01:00
Safihre
17ff087e06 Do not confirm clearing warnings 2016-02-05 23:36:47 +01:00
Safihre
77de565b7c Link in message about Orphans was broken 2016-02-05 23:36:36 +01:00
Safihre
54d238aa4d Message labels were not translated
INFO and WARNING
2016-02-05 23:36:23 +01:00
Safihre
379d09f8cc Improve message about no localStorage
It happens more than I expected, so better make a proper message.
2016-02-05 23:35:23 +01:00
shypike
00de72b127 Update text files for 1.0.xRC1 2016-02-03 21:18:42 +01:00
shypike
f9c84fa7dd Fix trouble with disk speed meter (especially on Windows) Part 2.
Improve the benchmark by reducing Python overhead by writing larger blocks.
2016-02-03 21:08:47 +01:00
shypike
c8e46691bb Solve file name encoding issues for OSX.
- Names returned by unrar-commandline need to be Unicoded.
- For yEnc embedded names, only test for UTF-8 and CP1252, but not the local codepage.
- Suppress some bogus warnings
- Log the output of the unrar tool
2016-02-03 20:59:12 +01:00
shypike
df1bb636e5 Fix links in text files to pooit to 1.0.0 entries in the Wiki. 2016-02-03 20:51:19 +01:00
shypike
ff886fad0d Fix all links in the templates to point to 1.0.0 (or 1-0) entries in the Wiki. 2016-02-03 20:50:13 +01:00
shypike
6dbee7a413 Fix trouble with disk speed meter (especially on Windows) Part 2.
Move fix outside of the measurement loop.
Don't remove the test-file within the loop, but only after it's finished,
otherwise we'll still get a "Permission denied".
2016-01-30 10:52:28 +01:00
shypike
3f8fcd7172 Fix trouble with disk speed meter (especially on Windows).
Better handling when folder is not available or writable.
Windows requires some access outside of the Python code to avoid "permission denied".
2016-01-29 23:54:32 +01:00
shypike
d94f7388e6 Add a link on the main Config page, to the "issues" page on the Wiki 2016-01-29 19:55:04 +01:00
Safihre
ad8b49fea8 #408 Firefox-fix: word-wrap instead of word-break 2016-01-29 19:21:59 +01:00
Safihre
ce00270c12 #447 only show arguments-field for speedlimit 2016-01-29 19:21:41 +01:00
Safihre
8c501f8f58 #447 Servers in scheduler more clear 2016-01-29 19:21:30 +01:00
Safihre
ce313ebc65 #445 Reduce statusinfo timeout on startup 2016-01-29 19:21:18 +01:00
Safihre
887ad881a2 #444 HTTPS instead of HTTP for RSS favicon 2016-01-29 19:21:07 +01:00
Safihre
ce40827552 Fix breaking RSS page
Fixes http://forums.sabnzbd.org/viewtopic.php?f=11&t=20114
2016-01-29 19:20:52 +01:00
shypike
2777d89482 Fix typos that prevented notifications about disk full being sent. 2016-01-28 23:19:36 +01:00
shypike
727b300a0e Update translations 2016-01-24 16:34:40 +01:00
shypike
652b021a8e Update text files for 0.8.0Beta6 2016-01-24 16:26:26 +01:00
shypike
fdf33acfbb Allow "None" as selection for secondary skin. 2016-01-24 16:15:02 +01:00
shypike
b001bc9b6f Prevent multiple resume notifications.
Only report "Resume" when coming from Paused mode.
2016-01-24 15:18:24 +01:00
shypike
8802cb1d8c Notifications template contained two instances of "ncenter_enable", leading to problems.
The result was a list instead of a single value.
2016-01-24 15:18:07 +01:00
shypike
e19a2fbae7 Improve handling of an old queue when upgrading to 0.8.0+
Warn only for a non-empty queue.
For Windows, when using a relative "download_dir" based on the user profile,
prepend the path with "Documents".
No action when the -f parameter was used.
This way it will be easier to restore existing jobs.
2016-01-24 15:17:47 +01:00
Safihre
53e38f98f9 Firefox needs more time to process the Server AJAX 2016-01-24 15:16:52 +01:00
Safihre
e783e227f6 #438 Try to stop Firefox from checking checkboxes 2016-01-24 15:16:39 +01:00
shypike
f3dfbe4181 Fix problem where a stray RAR file would cause a failed unpack run.
When a job of which the RAR files are renamed by par2,
needs repair of one more more files, the original damaged files will stay behind.
This will cause SABnzbd to try a doomed attempt at unpacking.
SABnzbd should keep track of such files and delete them after repair.
2016-01-24 15:15:57 +01:00
shypike
bcd8ca8bc4 Fix potential crash when reverting par2 renames.
Can happen when files have been modified outside of SABnzbd's control.
2016-01-24 15:12:06 +01:00
shypike
816d6a63cd For SSL protocol choice, default to auto-negotiation.
The "V23" method is interpreted by OpenSSL as "negotiate the highest available protocol"
and should therefor be a safe choice (best chance of working and best security).
If a user wants to, it is possible to fix the protocol, to prevent interference in the negotiation.
We cannot just assume that we can use our highest fixed protocol, because some Usenet servers
are being slow with implementing TLS1.2
2016-01-24 15:11:30 +01:00
shypike
88d3f25700 Perform IPv6 test on port 443 instead of 80.
Works better with some proxies.
Closes issue #274
2016-01-19 18:13:42 +01:00
shypike
80f69b11db When trying to connect to another SABnzbd instance over HTTPS, don't verify certificates.
Very few SABnzbd installations will have valid certificates.
2016-01-19 18:03:33 +01:00
Safihre
81a11f20c8 Re-order Switches page 2016-01-19 17:30:01 +01:00
Safihre
9e2a839953 Config fixes 2016-01-19 17:30:01 +01:00
Safihre
3cefcde270 #408 Refresh on Config Special save to update the * 2016-01-19 17:30:01 +01:00
Safihre
87a1eacfe7 #408 Also close history-details on history-row click
Before it would only open
2016-01-19 17:30:01 +01:00
Safihre
7cbc1a8419 #408 Browser navbar to black on mobile 2016-01-19 17:30:01 +01:00
Safihre
7b5570eb0b #408 Extra space next to Folder icon 2016-01-19 17:30:00 +01:00
Safihre
1a43a4dcf0 #432 Change filename to name in Add NZB 2016-01-19 17:30:00 +01:00
Safihre
2c2a6592c7 End of queue script was forgotten in Glitter 2016-01-19 17:30:00 +01:00
shypike
f31de6ee4e The compiled OSX build wasn't restarted with original command line arguments.
Rare use case where the App was originally started with parameters.
Essential for correct preservation of the -f parameter.
2016-01-19 17:29:11 +01:00
shypike
8fcd1f6b6c Merge branch 'develop' into R0.8.0 2016-01-16 12:25:38 +01:00
shypike
d7f3a473d7 Merge branch 'develop' into R0.8.0 2016-01-13 21:51:51 +01:00
shypike
ab2eb0c94e Update text files for 0.8.0Beta5 2016-01-13 20:17:32 +01:00
shypike
e51f4fc45a Merge pull request #181 from discordianfish/add-dockerfile
Add Dockerfile
2014-10-08 21:38:15 +02:00
Johannes 'fish' Ziemke
65278120e2 Add Dockerfile
Usage:

        docker build -t sabnzbd .
        docker run -p 127.0.0.1:8080:8080 sabnzbd
2014-09-24 13:46:43 +02:00
shypike
2eed355e9c Revert "newsunpack.py: also handle output of unrar5 with password protected files"
This reverts commit 12fd63c1cf.
2013-11-11 20:24:11 +01:00
shypike
018955f4d5 Merge pull request #122 from sanderjo/patch-4
newsunpack.py: also handle output of unrar5 with password protected file...
2013-11-11 11:19:20 -08:00
sanderjo
12fd63c1cf newsunpack.py: also handle output of unrar5 with password protected files
as discussed http://forums.sabnzbd.org/viewtopic.php?f=3&t=16166&p=89054#p89054
2013-11-07 17:02:24 +01:00
90 changed files with 12634 additions and 9895 deletions

View File

@@ -24,13 +24,13 @@
For these the server blocking method is not very favourable.
There is an INI-only option that will limit blocks to 1 minute.
no_penalties = 1
See: https://sabnzbd.org/wiki/configuration/2.1/special
See: https://sabnzbd.org/wiki/configuration/2.2/special
- Some third-party utilties try to probe SABnzbd API in such a way that you will
often see warnings about unauthenticated access.
If you are sure these probes are harmless, you can suppress the warnings by
setting the option "api_warnings" to 0.
See: https://sabnzbd.org/wiki/configuration/2.1/special
See: https://sabnzbd.org/wiki/configuration/2.2/special
- On OSX you may encounter downloaded files with foreign characters.
The par2 repair may fail when the files were created on a Windows system.
@@ -41,7 +41,7 @@
You will see this only when downloaded files contain accented characters.
You need to fix it yourself by running the convmv utility (available for most Linux platforms).
Possible the file system override setting 'fsys_type' might be solve things:
See: https://sabnzbd.org/wiki/configuration/2.1/special
See: https://sabnzbd.org/wiki/configuration/2.2/special
- The "Watched Folder" sometimes fails to delete the NZB files it has
processed. This happens when other software still accesses these files.
@@ -81,4 +81,4 @@
- Squeeze Linux
There is a "special" option that will allow you to select an alternative library.
use_pickle = 1
See: https://sabnzbd.org/wiki/configuration/2.1/special
See: https://sabnzbd.org/wiki/configuration/2.2/special

View File

@@ -1,7 +1,7 @@
Metadata-Version: 1.0
Name: SABnzbd
Version: 2.2.0Alpha3
Summary: SABnzbd-2.2.0Alpha3
Version: 2.2.1
Summary: SABnzbd-2.2.1
Home-page: https://sabnzbd.org
Author: The SABnzbd Team
Author-email: team@sabnzbd.org

View File

@@ -1,39 +1,69 @@
Release Notes - SABnzbd 2.2.0 Alpha 3
Release Notes - SABnzbd 2.2.1
=========================================================
## Changes since 2.2.0
- Allow up to 5 bad articles for jobs with no or little par2
- Only auto-disconnect after first run of verification
- Warning is shown when password-file is too large
- Failure of recursive unpacking no longer fails whole job
- Failure of unpacking of duplicate RAR no longer fails whole job
## Bugfixes since 2.2.0
- Some users were experiencing downloads or pre-check being stuck at 99%
- Fixed RarFile error during unpacking
- Remove email addresses settings from log export
- Block server longer on 'Download limit exceeded' errors
- Windows: If repair renamed a job the correct renamed file was deleted
- Windows: Unpacking of downloads with many archives could fail
- macOS: Adding jobs could fail without any error
Release Notes - SABnzbd 2.2.0
=========================================================
NOTE: Due to changes in this release, the queue will be converted when 2.2.0
is started for the first time. Job order, settings and data will be
preserved, but all jobs will be unpaused and URL's that did not finish
preserved, but all jobs will be unpaused and URLs that did not finish
fetching before the upgrade will be lost!
## Changes since 2.1.0
- Direct Unpack: Jobs will start unpacking during the download, reduces
post-processing time but requires capable hard drive. Only works for jobs that
do not need repair. Will be enabled if your incomplete folder-speed > 60MB/s
do not need repair. Will be enabled if your incomplete folder-speed > 40MB/s
- Reduced memory usage, especially with larger queues
- Removed 5 second delay between fetching URLs
- Graphical overview of server-usage on Servers page
- Notifications can now be limited to certain Categories
- Each item in the Queue and Filelist now has Move to Top/Bottom buttons
- Smoother animations in Firefox (disabled previously due to FF high-CPU usage)
- Removed 5 second delay between fetching URLs
- Each item in the Queue and File list now has Move to Top/Bottom buttons
- Add option to only tag a duplicate job without pausing or removing it
- New option "History Retention" to automatically purge jobs from History
- Jobs outside server retention are processed faster
- Show missing articles in MB instead of number of articles
- Obfuscated filenames are renamed during downloading, if possible
- If enable_par_cleanup is disabled all par2 files be downloaded
- Disk-space is now checked before writing files
- Add "Retry All Failed" button to Glitter
- Smoother animations in Firefox (disabled previously due to FF high-CPU usage)
- Show missing articles in MB instead of number of articles
- Better indication of verification process before and after repair
- Remove video and audio rating icons from Queue
- Show vote buttons instead of video and audio rating buttons in History
- If enabled, replace dots in filenames also when there are spaces already
- Handling of par2 files made more robust
- All par2 files are only downloaded when enabled, not on enable_par_cleanup
- Update GNTP bindings to 1.0.3
- max_art_opt and replace_illegal moved from Switches to Specials
- Removed Specials enable_meta, par2_multicore and allow_streaming
- Removed Specials par2_multicore and allow_streaming
- Windows: Full unicode support when calling repair and unpack
- Windows: Move enable_multipar to Specials
- Windows: Better indication of verification process before and after repair
- Windows: MultiPar verification of a job is skipped after blocks are fetched
- Windows & macOS: removed par2cmdline in favor of par2tbb/Multipar
- Windows & macOS: removed par2cmdline in favor of par2tbb/MultiPar
- Windows & macOS: Updated WinRAR to 5.5.0
## Bugfixes since 2.1.0
- Shutdown/suspend did not work on some Linux systems
- Standby/Hibernate was not working on Windows
- Deleting a job could result in write errors
- Display warning if custom par2 parameters are wrong
- RSS URLs with commas were broken
- Display warning if "Extra par2 parameters" turn out to be wrong
- RSS URLs with commas in the URL were broken
- Fixed some "Saving failed" errors
- Fixed crashing URLGrabber
- Jobs with renamed files are now correctly handled when using Retry
@@ -42,29 +72,42 @@ fetching before the upgrade will be lost!
- Fix race-condition in Post-processing
- History would not always show latest changes
- Convert HTML in error messages
- In some cases not all RAR-sets were unpacked
- Fixed unicode error during Sorting
- Faulty pynotify could stop shutdown
- Categories with ' in them could result in SQL errors
- Special characters like []!* in filenames could break repair
- Wizard was always accessible, even with username and password set
- Correct value in "Speed" Extra History Column
- Not all texts were shown in the selected Language
- Various CSS fixes in Glitter and the Config
- Catch "error 0" when using HTTPS on some Linux platforms
- Warning is shown when many files with duplicate filenames are discarded
- Improve zeroconf/bonjour by sending HTTPS setting and auto-discover of IP
- Windows: Fix error in MultiPar-code when first par2-file was damaged
- macOS: Catch 'Protocol wrong type for socket' errors
- macOS: Catch "Protocol wrong type for socket" errors
## Translations
- Added Hebrew translation by ION IL, many other languages updated.
## Upgrading from 0.7.x and older
## Depreciation notices
- Option to limit Servers to specific Categories is now scheduled
to be removed in the next release.
## Upgrading from 2.1.x and older
- Finish queue
- Stop SABnzbd
- Install new version
- Start SABnzbd
## Upgrade notices (from pre-2.x.x)
- Windows: When starting the Post-Processing script, the path to the job folder
is no longer in short-path notation but includes the full path. To support
long paths (>255), you might need to alter them to long-path notation (\\?\).
- Schedule items are converted when upgrading to 2.x.x and will break when
reverted back to pre-2.x.x releases.
## Upgrade notices
- Due to changes in this release, the queue will be converted when 2.2.x
is started for the first time. Job order, settings and data will be
preserved, but all jobs will be unpaused and URLs that did not finish
fetching before the upgrade will be lost!
- The organization of the download queue is different from 0.7.x releases.
So 2.x.x will not see the existing queue, but you can go to Status->Queue Repair
and "Repair" the old queue.
This version will not see the old queue, but you restore the jobs by going
to Status page and use Queue Repair.
## Known problems and solutions
- Read the file "ISSUES.txt"

View File

@@ -1374,7 +1374,14 @@ def main():
# Wait for server to become ready
cherrypy.engine.wait(cherrypy.process.wspbus.states.STARTED)
sabnzbd.zconfig.set_bonjour(cherryhost, cherryport)
# Bonjour needs a ip. Lets try to find it.
try:
z_host = socket.gethostbyname(socket.gethostname())
except socket.gaierror:
z_host = cherryhost
sabnzbd.zconfig.set_bonjour(z_host, cherryport)
mail = None
if sabnzbd.WIN32:

View File

@@ -200,8 +200,8 @@ socket_errors_nonblocking = plat_specific_errors(
'EAGAIN', 'EWOULDBLOCK', 'WSAEWOULDBLOCK')
if sys.platform == 'darwin':
socket_errors_to_ignore.append(plat_specific_errors('EPROTOTYPE'))
socket_errors_nonblocking.append(plat_specific_errors('EPROTOTYPE'))
socket_errors_to_ignore.extend(plat_specific_errors('EPROTOTYPE'))
socket_errors_nonblocking.extend(plat_specific_errors('EPROTOTYPE'))
comma_separated_headers = [
ntob(h) for h in

View File

@@ -98,6 +98,12 @@ class BuiltinSSLAdapter(wsgiserver.SSLAdapter):
# The connection can safely be dropped.
return None, {}
raise
except:
# Temporary fix for https://github.com/cherrypy/cherrypy/issues/1618
e = sys.exc_info()[1]
if e.args == (0, 'Error'):
return None, {}
raise
return s, self.get_environ(s)
# TODO: fill this out more with mod ssl env

View File

@@ -22,7 +22,7 @@
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1" />
<meta name="apple-mobile-web-app-title" content="SABnzbd" />
<link rel="apple-touch-icon" sizes="76x76" href="${root}staticcfg/ico/apple-touch-icon-76x76-precomposed.png" />
@@ -32,7 +32,9 @@
<link rel="apple-touch-icon" sizes="192x192" href="${root}staticcfg/ico/android-192x192.png" />
<link rel="stylesheet" type="text/css" href="${root}staticcfg/bootstrap/css/bootstrap.min.css?v=$version" />
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/style.css?p=$pid" />
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/chartist.min.css" />
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/style.css?v=$version" />
<link rel="shortcut icon" href="${root}staticcfg/ico/favicon.ico?v=$version" />
<script type="text/javascript">

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Config"#-->
<!--#set global $help_uri="configuration/2.1/configure"#-->
<!--#set global $help_uri="configuration/2.2/configure"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#from locale import getpreferredencoding#-->

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Categories"#-->
<!--#set global $help_uri="configuration/2.1/categories"#-->
<!--#set global $help_uri="configuration/2.2/categories"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="section">

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Folders"#-->
<!--#set global $help_uri="configuration/2.1/folders"#-->
<!--#set global $help_uri="configuration/2.2/folders"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="General"#-->
<!--#set global $help_uri="configuration/2.1/general"#-->
<!--#set global $help_uri="configuration/2.2/general"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Email"#-->
<!--#set global $help_uri="configuration/2.1/notifications"#-->
<!--#set global $help_uri="configuration/2.2/notifications"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#def show_notify_checkboxes($section_label)#-->
@@ -178,6 +178,45 @@
</div>
</div>
<!--#end if#-->
<div class="section" id="nscript">
<div class="col2">
<h3>$T('section-NScript')</h3>
<table>
<tr>
<td><input type="checkbox" name="nscript_enable" id="nscript_enable" value="1" <!--#if int($nscript_enable) > 0 then 'checked="checked"' else ""#--> /></td>
<td><label for="nscript_enable"> $T('opt-nscript_enable')</label></td>
</tr>
</table>
<em>$T('explain-nscript_enable')</em><br><a href="$helpuri$help_uri#nscript" target="_blank">$T('readwiki')</a>
$show_cat_box('nscript')
</div>
<div class="col1" <!--#if int($nscript_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
<div class="field-pair">
<label class="config" for="nscript_script">$T('opt-nscript_script')</label>
<select name="nscript_script">
<!--#for $sc in $scripts#-->
<option value="$sc" <!--#if $nscript_script == $sc then 'selected="selected"' else ""#-->>$Tspec($sc)</option>
<!--#end for#-->
</select>
<span class="desc">$T('explain-nscript_script')</span>
</div>
<div class="field-pair">
<label class="config" for="nscript_parameters">$T('opt-nscript_parameters')</label>
<input type="text" name="nscript_parameters" id="nscript_parameters" value="$nscript_parameters" />
<span class="desc">$T('Optional') - $T('explain-nscript_parameters')</span>
</div>
$show_notify_checkboxes('nscript')
<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" type="button" id="test_nscript"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
<div class="field-pair result-box">
<div class="alert"></div>
</div>
</fieldset>
</div>
</div>
<div class="section" id="growl">
<div class="col2">
<h3>$T('growlSettings') <a href="$helpuri$help_uri#toc3" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
@@ -350,45 +389,6 @@
</fieldset>
</div>
</div>
<div class="section" id="nscript">
<div class="col2">
<h3>$T('section-NScript')</h3>
<table>
<tr>
<td><input type="checkbox" name="nscript_enable" id="nscript_enable" value="1" <!--#if int($nscript_enable) > 0 then 'checked="checked"' else ""#--> /></td>
<td><label for="nscript_enable"> $T('opt-nscript_enable')</label></td>
</tr>
</table>
<em>$T('explain-nscript_enable')</em>
$show_cat_box('nscript')
</div>
<div class="col1" <!--#if int($nscript_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
<div class="field-pair">
<label class="config" for="nscript_script">$T('opt-nscript_script')</label>
<select name="nscript_script">
<!--#for $sc in $scripts#-->
<option value="$sc" <!--#if $nscript_script == $sc then 'selected="selected"' else ""#-->>$Tspec($sc)</option>
<!--#end for#-->
</select>
<span class="desc">$T('explain-nscript_script')</span>
</div>
<div class="field-pair">
<label class="config" for="nscript_parameters">$T('opt-nscript_parameters')</label>
<input type="text" name="nscript_parameters" id="nscript_parameters" value="$nscript_parameters" />
<span class="desc">$T('Optional') - $T('explain-nscript_parameters')</span>
</div>
$show_notify_checkboxes('nscript')
<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" type="button" id="test_nscript"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
<div class="field-pair result-box">
<div class="alert"></div>
</div>
</fieldset>
</div>
</div>
</form>
</div><!-- /colmask -->

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="RSS"#-->
<!--#set global $help_uri="configuration/2.1/rss"#-->
<!--#set global $help_uri="configuration/2.2/rss"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<!--#if not $active_feed#-->

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Scheduling"#-->
<!--#set global $help_uri="configuration/2.1/scheduling"#-->
<!--#set global $help_uri="configuration/2.2/scheduling"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<%

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Servers"#-->
<!--#set global $help_uri="configuration/2.1/servers"#-->
<!--#set global $help_uri="configuration/2.2/servers"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -110,6 +110,59 @@
</div><!-- /section -->
</form>
<script type="text/javascript" src="${root}staticcfg/js/chartist.min.js"></script>
<script type="text/javascript">
// Define variables needed for the server-plots
var serverData = {}
var chartOptions = {
fullWidth: true,
showArea: true,
axisX: {
labelOffset: {
x: -5
},
showGrid: false
},
axisY: {
labelOffset: {
y: 7
},
scaleMinSpace: 30
},
chartPadding: {
top: 9,
bottom: 0,
left: 30,
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 #-->
@@ -208,7 +261,7 @@
</option>
<!--#end for#-->
</select>
<span class="desc">$T('srv-explain-categories')</span>
<span class="desc">$T('srv-explain-categories')<br><span class="label label-warning">$T('warning').upper()</span> <strong>This option is scheduled to be removed in the next release of SABnzbd.</strong></span>
<div class="alert alert-info alert-no-category">
<span class="glyphicon glyphicon-info-sign"></span>
$T('srv-explain-no-categories')
@@ -232,166 +285,279 @@
<div class="alert"></div>
</div>
</fieldset>
</div><!-- /col1 -->
<div class="col2" style="display:block;">
<!--#if 'amounts' in $server#-->
<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
<!--#end if#-->
</div>
</div><!-- /section -->
<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">
\$(document).ready(function(){
// Exception when change of priority, reload
\$('input[name="priority"], input[name="displayname"]').on('change', function() {
\$('.fullform').submit(function() {
// Skip the fancy stuff, just submit
this.submit()
})
})
function showChart(server_id, month) {
// This month
var thisDay = new Date()
/**
Message on no Default category selected
**/
function checkServerCats() {
// Now we check all of them
var hasDefault = false;
// Only check the active servers, not the add-server one
\$('.section:not(#addServerContent) select[name="categories"]').each(function() {
// See if this server is enabled
if(!\$(this).parents('.section').find('.col2').hasClass('server-disabled') ) {
// Is there Default?
if(\$(this).val() && \$(this).val().indexOf('Default') > -1) {
// Hide
\$('.alert-no-category').hide()
hasDefault = true
// All good!
return true
}
// What month are we doing?
var inputDate = new Date(month+'-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)
}
// 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])
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;
})
// We found nothing.. Let's show a warning
if(!hasDefault) \$('.alert-no-category').show()
// 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
})
});
}
\$('select[name="categories"]').on('change', checkServerCats)
checkServerCats()
// Need to mitigate timezone effects!
function toFormattedDate(date) {
var local = new Date(date);
local.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return local.toJSON().slice(0, 10);
}
/**
Click events
When finished loading
**/
\$('.showserver').click(function () {
if(\$(this).parent().hasClass('server-disabled')) {
\$(this).parent().parent().toggleClass('server-disabled')
}
\$(this).parent().next().toggle();
\$(this).parent().next().next().toggle();
if (\$(this).attr("value") == "$T('showDetails')") {
\$(this).attr("value", "$T('hideDetails')");
} else {
\$(this).attr("value", "$T('showDetails')");
}
});
\$(document).ready(function(){
// Exception when change of priority, reload
\$('input[name="priority"], input[name="displayname"]').on('change', function() {
\$('.fullform').submit(function() {
// Skip the fancy stuff, just submit
this.submit()
})
})
\$('#addServerButton').click(function(){
\$('#addServer').hide();
\$('#addServerContent').show();
});
/**
Update charts when changed
**/
\$('.chart-selector').on('change', function(elemn) {
showChart(\$(elemn.target).data('id'), \$(elemn.target).val())
// Lets us leave (needs to be called after the change event)
setTimeout(function() {
formWasSubmitted = true;
formHasChanged = false;
}, 100)
})
\$('[name="ssl"]').click(function() {
// Use CSS transitions to do some highlighting
var portBox = \$(this).parent().parent().find('[name="port"]')
if(this.checked) {
// Enabled SSL change port when not already a custom port
if(portBox.val() == '119') {
portBox.val('563')
portBox.addClass('port-highlight')
/**
Message on no Default category selected
**/
function checkServerCats() {
// Now we check all of them
var hasDefault = false;
// Only check the active servers, not the add-server one
\$('.section:not(#addServerContent) select[name="categories"]').each(function() {
// See if this server is enabled
if(!\$(this).parents('.section').find('.col2').hasClass('server-disabled') ) {
// Is there Default?
if(\$(this).val() && \$(this).val().indexOf('Default') > -1) {
// Hide
\$('.alert-no-category').hide()
hasDefault = true
// All good!
return true
}
}
})
// We found nothing.. Let's show a warning
if(!hasDefault) \$('.alert-no-category').show()
}
\$('select[name="categories"]').on('change', checkServerCats)
checkServerCats()
/**
Click events
**/
\$('.showserver').click(function () {
if(\$(this).parent().hasClass('server-disabled')) {
\$(this).parent().parent().toggleClass('server-disabled')
}
} else {
// Remove SSL port
if(portBox.val() == '563') {
portBox.val('119')
portBox.addClass('port-highlight')
}
}
setTimeout(function() { portBox.removeClass('port-highlight') }, 2000)
})
\$('.testServer').click(function(event){
removeObfuscation()
var theButton = \$(this)
var resultBox = theButton.parents('.col1').find('.result-box .alert');
theButton.attr("disabled", "disabled")
theButton.find('span').toggleClass('glyphicon-sort glyphicon-refresh spin-glyphicon')
\$.ajax({
type: "POST",
url: "../../tapi",
data: "mode=config&output=json&name=test_server&" + \$(this).parents('form:first').serialize()
}).then(function(data) {
// Let's replace the link
msg = data.value.message.replace('https://sabnzbd.org/certificate-errors', '<a href="https://sabnzbd.org/certificate-errors" class="alert-link" target="_blank">https://sabnzbd.org/certificate-errors</a>')
msg = msg.replace('-', '<br>')
// Fill the box and enable the button
resultBox.removeClass('alert-success alert-danger').show()
resultBox.html(msg)
theButton.removeAttr("disabled")
theButton.find('span').toggleClass('glyphicon-sort glyphicon-refresh spin-glyphicon')
// Succes or not?
if(data.value.result) {
resultBox.addClass('alert-success')
resultBox.prepend('<span class="glyphicon glyphicon-ok-sign"></span> ')
\$(this).parent().next().toggle();
\$(this).parent().next().next().toggle();
if (\$(this).attr("value") == "$T('showDetails')") {
\$(this).attr("value", "$T('hideDetails')");
} else {
resultBox.addClass('alert-danger')
resultBox.prepend('<span class="glyphicon glyphicon-exclamation-sign"></span> ')
\$(this).attr("value", "$T('showDetails')");
}
});
});
\$('.delServer').click(function(){
if( confirm("$T('Plush-confirm')") ) {
\$(this).parents('form:first').attr('action','delServer').submit();
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
setTimeout(function() { location.reload(); }, 500)
}
return false;
});
\$('#addServerButton').click(function(){
\$('#addServer').hide();
\$('#addServerContent').show();
});
\$('.clrServer').click(function(){
if( confirm("$T('Plush-confirm')") ) {
\$(this).parents('form:first').attr('action','clrServer').submit();
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
setTimeout(function() { location.reload(); }, 500)
}
return false;
});
\$('[name="ssl"]').click(function() {
// Use CSS transitions to do some highlighting
var portBox = \$(this).parent().parent().find('[name="port"]')
if(this.checked) {
// Enabled SSL change port when not already a custom port
if(portBox.val() == '119') {
portBox.val('563')
portBox.addClass('port-highlight')
}
} else {
// Remove SSL port
if(portBox.val() == '563') {
portBox.val('119')
portBox.addClass('port-highlight')
}
}
setTimeout(function() { portBox.removeClass('port-highlight') }, 2000)
})
\$('.toggleServerCheckbox').click(function(){
var whichServer = \$(this).attr("name");
\$.ajax({
type: "POST",
url: "toggleServer",
data: {server: whichServer, session: "$session" }
}).done(function() {
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
setTimeout(function() { location.reload(); }, 100)
\$('.testServer').click(function(event){
removeObfuscation()
var theButton = \$(this)
var resultBox = theButton.parents('.col1').find('.result-box .alert');
theButton.attr("disabled", "disabled")
theButton.find('span').toggleClass('glyphicon-sort glyphicon-refresh spin-glyphicon')
\$.ajax({
type: "POST",
url: "../../tapi",
data: "mode=config&output=json&name=test_server&" + \$(this).parents('form:first').serialize()
}).then(function(data) {
// Let's replace the link
msg = data.value.message.replace('https://sabnzbd.org/certificate-errors', '<a href="https://sabnzbd.org/certificate-errors" class="alert-link" target="_blank">https://sabnzbd.org/certificate-errors</a>')
msg = msg.replace('-', '<br>')
// Fill the box and enable the button
resultBox.removeClass('alert-success alert-danger').show()
resultBox.html(msg)
theButton.removeAttr("disabled")
theButton.find('span').toggleClass('glyphicon-sort glyphicon-refresh spin-glyphicon')
// Succes or not?
if(data.value.result) {
resultBox.addClass('alert-success')
resultBox.prepend('<span class="glyphicon glyphicon-ok-sign"></span> ')
} else {
resultBox.addClass('alert-danger')
resultBox.prepend('<span class="glyphicon glyphicon-exclamation-sign"></span> ')
}
});
});
\$('.delServer').click(function(){
if( confirm("$T('Plush-confirm')") ) {
\$(this).parents('form:first').attr('action','delServer').submit();
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
setTimeout(function() { location.reload(); }, 500)
}
return false;
});
\$('.clrServer').click(function(){
if( confirm("$T('Plush-confirm')") ) {
\$(this).parents('form:first').attr('action','clrServer').submit();
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
setTimeout(function() { location.reload(); }, 500)
}
return false;
});
\$('.toggleServerCheckbox').click(function(){
var whichServer = \$(this).attr("name");
\$.ajax({
type: "POST",
url: "toggleServer",
data: {server: whichServer, session: "$session" }
}).done(function() {
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
setTimeout(function() { location.reload(); }, 100)
});
});
});
});
</script>
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Sorting"#-->
<!--#set global $help_uri="configuration/2.1/sorting"#-->
<!--#set global $help_uri="configuration/2.2/sorting"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Special"#-->
<!--#set global $help_uri="configuration/2.1/special"#-->
<!--#set global $help_uri="configuration/2.2/special"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Switches"#-->
<!--#set global $help_uri="configuration/2.1/switches"#-->
<!--#set global $help_uri="configuration/2.2/switches"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -86,6 +86,7 @@
<label class="config" for="no_dupes">$T('opt-no_dupes')</label>
<select name="no_dupes" id="no_dupes">
<option value="0" <!--#if int($no_dupes) == 0 then 'selected="selected"' else ""#--> >$T('nodupes-off')</option>
<option value="4" <!--#if int($no_dupes) == 4 then 'selected="selected"' else ""#--> >$T('nodupes-tag')</option>
<option value="2" <!--#if int($no_dupes) == 2 then 'selected="selected"' else ""#--> >$T('nodupes-pause')</option>
<option value="3" <!--#if int($no_dupes) == 3 then 'selected="selected"' else ""#--> >$T('nodupes-fail')</option>
<option value="1" <!--#if int($no_dupes) == 1 then 'selected="selected"' else ""#--> >$T('nodupes-ignore')</option>
@@ -96,6 +97,7 @@
<label class="config" for="no_series_dupes">$T('opt-no_series_dupes')</label>
<select name="no_series_dupes" id="no_series_dupes">
<option value="0" <!--#if int($no_series_dupes) == 0 then 'selected="selected"' else ""#--> >$T('nodupes-off')</option>
<option value="4" <!--#if int($no_series_dupes) == 4 then 'selected="selected"' else ""#--> >$T('nodupes-tag')</option>
<option value="2" <!--#if int($no_series_dupes) == 2 then 'selected="selected"' else ""#--> >$T('nodupes-pause')</option>
<option value="3" <!--#if int($no_series_dupes) == 3 then 'selected="selected"' else ""#--> >$T('nodupes-fail')</option>
<option value="1" <!--#if int($no_series_dupes) == 1 then 'selected="selected"' else ""#--> >$T('nodupes-ignore')</option>
@@ -133,7 +135,7 @@
<div class="field-pair">
<label class="config" for="direct_unpack">$T('opt-direct_unpack')</label>
<input type="checkbox" name="direct_unpack" id="direct_unpack" value="1" <!--#if int($direct_unpack) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-direct_unpack')</span>
<span class="desc">$T('explain-direct_unpack').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
@@ -210,11 +212,28 @@
<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">
<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>
</div>
<div class="field-pair">
<label class="config" for="cleanup_list">$T('opt-cleanup_list')</label>
<input type="text" name="cleanup_list" id="cleanup_list" value="$cleanup_list"/>
<span class="desc">$T('explain-cleanup_list')</span>
</div>
<div class="field-pair">
<label class="config" for="history_retention_select">$T('opt-history_retention')</label>
<input type="hidden" name="history_retention" id="history_retention" value="$history_retention">
<select name="history_retention_select" id="history_retention_select">
<option value="0">$T('history_retention-all')</option>
<option value="n">$T('history_retention-number')</option>
<option value="d">$T('history_retention-days')</option>
<option value="-1">$T('history_retention-none')</option>
</select>
<input type="number" id="history_retention_number" name="history_retention_number" min="1">
<span class="desc">$T('explain-history_retention').replace('. ', '.<br/>')</span>
</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 restoreDefaults"><span class="glyphicon glyphicon-asterisk"></span> $T('button-restoreDefaults')</button>
@@ -231,7 +250,7 @@
<div class="field-pair">
<label class="config" for="folder_rename">$T('opt-folder_rename')</label>
<input type="checkbox" name="folder_rename" id="folder_rename" value="1" <!--#if int($folder_rename) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-folder_rename')</span>
<span class="desc">$T('explain-folder_rename').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair">
<label class="config" for="replace_spaces">$T('opt-replace_spaces')</label>
@@ -437,6 +456,53 @@
}
});
\$('#history_retention_select, #history_retention_number').on('change', updateHistoryRetention)
function updateHistoryRetention() {
var retention_setting = \$('#history_retention')
var retention_select = \$('#history_retention_select').val()
var retention_number = \$('#history_retention_number')
// Keep all or keep none
if(retention_select == "0" || retention_select == "-1") {
retention_number.hide()
retention_number.val('')
retention_number.attr('placeholder', '')
retention_setting.val(retention_select)
} else {
retention_number.show()
// Days or number?
if(retention_select.indexOf("d") !== -1) {
retention_number.attr('placeholder', '$T('days').capitalize()')
if(retention_number.val()) {
retention_setting.val(retention_number.val() + 'd')
} else if(parseInt(retention_setting.val()) > 0) {
retention_number.val(parseInt(retention_setting.val()))
}
} else {
retention_number.attr('placeholder', '$T('history_retention-limit')')
if(retention_number.val()) {
retention_setting.val(retention_number.val())
} else if(parseInt(retention_setting.val()) > 0) {
retention_number.val(parseInt(retention_setting.val()))
}
}
}
}
// Set the history-retention settig
var retention_setting_value = \$('#history_retention').val()
if(parseInt(retention_setting_value) > 0) {
// Days or number?
if(retention_setting_value.indexOf("d") !== -1) {
\$('#history_retention_select').val("d")
} else {
\$('#history_retention_select').val("n")
}
\$('#history_retention_number').val(parseInt(retention_setting_value))
} else {
// Keep all or keep none
\$('#history_retention_select').val(retention_setting_value)
\$('#history_retention_number').hide()
}
\$('.restoreDefaults').click(function(e) {
// Get section name
var sectionName = \$(this).parents('.section').find('.col2 h3').text().trim()

View File

@@ -1,9 +1,9 @@
<html lang="$active_lang">
<head>
<title>SABnzbd</title>
<title>SABnzbd - $T('login')</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1" />
<meta name="apple-mobile-web-app-title" content="SABnzbd" />
<link rel="apple-touch-icon" sizes="76x76" href="../staticcfg/ico/apple-touch-icon-76x76-precomposed.png" />

View File

File diff suppressed because one or more lines are too long

View File

@@ -619,7 +619,6 @@ h2.activeRSS {
padding: 0 0 .5em;
}
.feed-row div {
padding-right: 10px;
overflow:hidden;
white-space: nowrap;
text-overflow: ellipsis;
@@ -994,6 +993,55 @@ input[type="checkbox"] {
opacity: 0.7;
}
.Servers .server-amounts-text {
width: 20%;
float: left;
}
.Servers .server-chart {
float: right;
width: calc(100% - 250px - 25%);
text-align: center;
position: relative;
}
.Servers .ct-series-a .ct-line {
stroke: #666666;
}
.Servers .ct-series-a .ct-point {
stroke: #666666;
stroke-width: 4px;
}
.Servers .ct-series-a .ct-area {
fill: #666666
}
.Servers .ct-label {
font-size: 1em;
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:hover {
opacity: 1;
}
.Servers .ct-grid.ct-vertical:first-of-type {
display: none;
}
.advanced-settings {
display: none;
}
@@ -1119,7 +1167,7 @@ input[type="checkbox"] {
.navbar-nav {
/* For extra wide languages like Polish */
margin-right: -50px;
margin-right: -150px;
}
}
@@ -1171,6 +1219,15 @@ input[type="checkbox"] {
.Servers .col2 button:first-of-type {
margin-bottom: 0;
}
.Servers .server-chart {
display: none;
}
.Servers .server-amounts-text {
padding: 0px 15px 10px;
width: inherit;
}
}
@media screen and (max-width: 768px) {

View File

File diff suppressed because one or more lines are too long

View File

@@ -232,7 +232,7 @@ function do_restart() {
var portsUnchanged = ($('#port').val() == $('#port').data('original')) && ($('#https_port').val() == $('#https_port').data('original'))
// Are we on settings page or did nothing change?
if(!$('body').hasClass('General') || (!switchedHTTPS && !portsUnchanged)) {
if(!$('body').hasClass('General') || (!switchedHTTPS && portsUnchanged)) {
// Same as before
var urlTotal = window.location.origin + urlPath
} else {

View File

@@ -48,8 +48,8 @@
<!-- ko if: historyStatus.has_rating -->
<div class="dropdown history-ratings">
<a href="#" class="name-icons hover-button" data-toggle="dropdown" onclick="keepOpen(this)">
<span class="glyphicon glyphicon-facetime-video"></span> <span data-bind="text: historyStatus.rating_avg_video"></span>
<span class="glyphicon glyphicon-volume-up"></span> <span data-bind="text: historyStatus.rating_avg_audio"></span>
<span class="glyphicon glyphicon-thumbs-up"></span> <span data-bind="text: historyStatus.rating_avg_vote_up"></span>
<span class="glyphicon glyphicon-thumbs-down"></span> <span data-bind="text: historyStatus.rating_avg_vote_down"></span>
</a>
<ul class="dropdown-menu history-ratings-menu">
<li>
@@ -206,6 +206,7 @@
</ul>
<div class="multioperations-selector" id="history-options">
<a href="#" class="hover-button" title="$T('link-retryAll')" data-tooltip="true" data-placement="left" data-bind="click: history.retryAllFailed"><span class="glyphicon glyphicon-repeat"></span></a>
<a href="#" class="hover-button" title="$T('showAllHis') / $T('showFailedHis')" data-tooltip="true" data-placement="left" data-bind="click: history.toggleShowFailed, css: { 'history-options-show-failed': history.showFailed }"><span class="glyphicon glyphicon-exclamation-sign"></span></a>
<a href="#modal-purge-history" class="hover-button" title="$T('purgeHist')" data-toggle="modal" data-tooltip="true" data-placement="left"><span class="glyphicon glyphicon-trash"></span></a>
</div>

View File

@@ -95,18 +95,18 @@
<span data-bind="text: password"></span>
</small>
<!-- /ko -->
<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">5</span>
<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-options" data-bind="visible: !editingName()">
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToTop" title="$T('Glitter-MoveToTop')"><span class="glyphicon glyphicon-chevron-up"></span></a>
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToBottom" title="$T('Glitter-MoveToBottom')"><span class="glyphicon glyphicon-chevron-down"></span></a>
<a href="#" data-bind="click: editName, css: { disabled: isGrabbing() }" class="hover-button"><span class="glyphicon glyphicon-pencil"></span></a>
<a href="#" data-bind="click: showFiles, css: { disabled: isGrabbing() }" class="hover-button" title="$T('nzoDetails') - $T('srv-password')"><span class="glyphicon glyphicon-folder-open"></span></a>
<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>
<a href="#" data-bind="click: editName" class="hover-button" title="$T('Glitter-rename')"><span class="glyphicon glyphicon-pencil"></span></a>
<a href="#" data-bind="click: showFiles" class="hover-button" title="$T('nzoDetails') - $T('srv-password')"><span class="glyphicon glyphicon-folder-open"></span></a>
<small data-bind="text: avg_age"></small>
</div>
</td>

View File

@@ -16,7 +16,7 @@
<title data-bind="text: title">SABnzbd</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="application-name" content="SABnzbd">
<meta name="apple-mobile-web-app-capable" content="yes" />
@@ -30,13 +30,13 @@
<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="shortcut icon" type="image/ico" href="./staticcfg/ico/favicon.ico?v=1.0.0" data-bind="attr: { 'href': SABIcon }" />
<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?p=$pid" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.css?p=$pid" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.mobile.css?p=$pid" media="all and (max-width: 768px)" />
<link rel="stylesheet" type="text/css" href="./static/bootstrap/css/bootstrap.min.css?v=$version" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.css?v=$version" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.mobile.css?v=$version" media="all and (max-width: 768px)" />
<!--#if $color_scheme not in ('Default', '') #-->
<link rel="stylesheet" type="text/css" href="./static/stylesheets/colorschemes/${color_scheme}.css?p=$pid"/>
<link rel="stylesheet" type="text/css" href="./static/stylesheets/colorschemes/${color_scheme}.css?v=$version"/>
<!--#end if#-->
<!-- Make translations available in scripts -->
@@ -62,6 +62,7 @@
glitterTranslate.repair = "$T('explain-Repair')".replace(/<br \/>/g, "\n").replace(/&quot;/g,'"');
glitterTranslate.removeDown = "$T('Glitter-confirmClearDownloads')";
glitterTranslate.removeDow1 = "$T('Glitter-confirmClear1Download')";
glitterTranslate.retryAll = "$T('link-retryAll')?";
glitterTranslate.encrypted = "$T('Glitter-encrypted')";
glitterTranslate.duplicate = "$T('Glitter-duplicate')";
glitterTranslate.tooLarge = "$T('Glitter-tooLarge')";
@@ -102,7 +103,7 @@
glitterTranslate.status['Script'] = "$T('stage-script')";
glitterTranslate.status['Source'] = "$T('stage-source')";
glitterTranslate.status['Servers'] = "$T('stage-servers')";
glitterTranslate.status['INFO'] = "$T('log-info')".replace('+ ', '').toUpperCase();
glitterTranslate.status['INFO'] = "$T('log-info')".replace('+', '').toUpperCase();
glitterTranslate.status['WARNING'] = "$T('Glitter-warning')";
glitterTranslate.status['ERROR'] = "$T('Glitter-error')";

View File

@@ -37,19 +37,10 @@ function Fileslisting(parent) {
// Move to top and bottom buttons
self.moveButton = function (item,event) {
var ITEMKEY = "ko_sortItem",
INDEXKEY = "ko_sourceIndex",
LISTKEY = "ko_sortList",
PARENTKEY = "ko_parentList",
DRAGKEY = "ko_dragItem",
unwrap = ko.utils.unwrapObservable,
dataGet = ko.utils.domData.get,
dataSet = ko.utils.domData.set;
var targetRow,sourceRow,tbody;
var targetRow, sourceRow, tbody;
sourceRow = $(event.currentTarget).parents("tr").filter(":first");
tbody = sourceRow.parents("tbody").filter(":first");
//debugger;
dataSet(sourceRow[0], INDEXKEY, ko.utils.arrayIndexOf(sourceRow.parent().children(), sourceRow[0]));
ko.utils.domData.set(sourceRow[0], "ko_sourceIndex", ko.utils.arrayIndexOf(sourceRow.parent().children(), sourceRow[0]));
sourceRow = sourceRow.detach();
if ($(event.currentTarget).is(".buttonMoveToTop")) {
// we are moving to the top
@@ -67,7 +58,7 @@ function Fileslisting(parent) {
}
tbody.sortable('option', 'update').call(tbody[0],null, { item: sourceRow });
};
// Trigger update
self.triggerUpdate = function() {
// Call API
@@ -230,9 +221,9 @@ function FileslistingModel(parent, data) {
self.nzf_id = ko.observable(data.nzf_id);
self.file_age = ko.observable(data.age);
self.mb = ko.observable(data.mb);
self.percentage = ko.observable(fixPercentages((100 - (data.mbleft / data.mb * 100)).toFixed(0)));
self.canselect = ko.observable(data.status != "finished" && data.status != "queued");
self.isdone = ko.observable(data.status == "finished");
self.percentage = ko.observable(self.isdone() ? fixPercentages(100) : fixPercentages((100 - (data.mbleft / data.mb * 100)).toFixed(0)));
// Update internally
self.updateFromData = function(data) {
@@ -240,9 +231,10 @@ function FileslistingModel(parent, data) {
self.nzf_id(data.nzf_id)
self.file_age(data.age)
self.mb(data.mb)
self.percentage(fixPercentages((100 - (data.mbleft / data.mb * 100)).toFixed(0)));
self.canselect(data.status != "finished" && data.status != "queued")
self.isdone(data.status == "finished")
// Data is given in MB, would always show 0% for small files even if completed
self.percentage(self.isdone() ? fixPercentages(100) : fixPercentages((100 - (data.mbleft / data.mb * 100)).toFixed(0)))
}
}

View File

@@ -169,7 +169,6 @@ function HistoryListModel(parent) {
// Toggle showing failed
self.toggleShowFailed = function(data, event) {
// Set the loader so it doesn't flicker and then switch
self.isLoading(true)
self.showFailed(!self.showFailed())
@@ -177,7 +176,20 @@ function HistoryListModel(parent) {
$('#history-options a').tooltip('hide')
// Force refresh
self.parent.refresh(true)
}
// Retry all failed
self.retryAllFailed = function(data, event) {
// Ask to be sure
if(confirm(glitterTranslate.retryAll)) {
// Send the command
callAPI({
mode: 'retry_all'
}).then(function() {
// Force refresh
self.parent.refresh(true)
})
}
}
// Empty history options
@@ -328,16 +340,14 @@ function HistoryModel(parent, data) {
case 'speed':
// Anything to calculate?
if(self.historyStatus.bytes() > 0 && self.historyStatus.download_time() > 0) {
var theSpeed = self.historyStatus.bytes()/self.historyStatus.download_time();
theSpeed = theSpeed/1024;
// MB/s or KB/s
if(theSpeed > 1024) {
theSpeed = theSpeed/1024;
return theSpeed.toFixed(1) + ' MB/s'
} else {
return Math.round(theSpeed) + ' KB/s'
}
try {
// Extract the Download section
var downloadLog = ko.utils.arrayFirst(self.historyStatus.stage_log(), function(item) {
return item.name() == 'Download'
});
// Extract the speed
return downloadLog.actions()[0].match(/(\S*\s\S+)(?=<br\/>)/)[0]
} catch(err) { }
}
return;
case 'category':

View File

@@ -331,6 +331,13 @@ function ViewModel() {
// Split title & speed
var dataSplit = data.split('|||');
// Maybe the result is actually the login page?
if(dataSplit[0].substring(0, 11) === '<html lang=') {
// Redirect
document.location = document.location
return
}
// Set title
self.title(dataSplit[0]);

View File

@@ -76,7 +76,7 @@ legend,
background-color: #666;
}
.navbar-collapse.in .dropdown-menu {
.navbar-collapse.in .dropdown-menu, {
border: none;
}
@@ -111,6 +111,7 @@ legend,
color: #EBEBEB;
}
table,
.table-striped>tbody>tr:nth-child(even)>td,
.table>tbody>tr:nth-child(even)>td,
.table th,
@@ -158,7 +159,9 @@ select.form-control,
.retry-button, .retry-button-inactive,
.history-options-show-failed,
.queue-error-info,
.options-bad-status {
.options-bad-status,
.history-failed-download:hover .retry-button .glyphicon:before,
.retry-button:hover .glyphicon:before {
color: #F95151 !important;
}
@@ -205,6 +208,10 @@ hr {
border-bottom: none !important;
}
#modal-item-files .item-files-table {
border-bottom: 1px solid black;
}
.history-queue-swicher .nav-tabs>li>a,
.history-queue-swicher .nav-tabs>li.active>a {
border-bottom: none;
@@ -222,6 +229,11 @@ hr {
box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 1);
}
.modal-content {
border-color: #727272;
border-top: none;
}
/* Placeholders - Will not work if grouped! */
::-webkit-input-placeholder {
color: #EBEBEB !important;

View File

@@ -533,9 +533,16 @@ tbody>tr>td:last-child {
}
.hover-button.disabled,
.hover-button.disabled:hover {
.hover-button.disabled:hover,
.name-options.disabled .hover-button,
.name-options.disabled .hover-button:hover {
cursor: not-allowed !important;
opacity: 0.1 !important;
pointer-events: none;
}
.name-options.disabled {
cursor: not-allowed !important;
}
.info-container {
@@ -656,12 +663,16 @@ td.name .name-icons {
text-decoration: none !important;
}
.queue-table td.name:hover .name-icons {
display: none;
}
td.name .name-icons .glyphicon {
margin-left: 2px;
top: 2px;
font-weight: bold;
}
.glyphicon-chevron-down,
.glyphicon-chevron-up {
top: 2px;
font-weight: bold;
}
tbody.no-downloads tr td {

View File

@@ -101,6 +101,7 @@
<div id="nav_text_left">
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
#if $pane=="Main"#
&sdot; <a href="${path}config/general#web_dir">#echo $T('useGlitter').split('.')[0]#.</a>
#if $new_release#&sdot; <a href="$new_rel_url" id="new_release" target="_blank">$T('Plush-updateAvailable').replace(' ','&nbsp;')</a>#end if#
#end if#
</div>

View File

@@ -109,11 +109,6 @@ body {
font-weight: bold;
}
#new_release {
color: green;
font-weight: bold;
}
#livetip {
position: absolute;
background-color: #cfc;
@@ -343,6 +338,7 @@ body {
clear:left;
padding: 0 20px 0 25px;
font-size:90%;
font-weight: bold;
}
#nav_text_left a, #nav_text_right a {
color:#000;
@@ -1083,7 +1079,7 @@ tr:hover .history_added { color: black; }
color: red;
margin-left: 10px;
}
.rating_icon_vision {
width: 16px;
height: 16px;

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +1,2 @@
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
dojo.hostenv.moduleLoaded("MochiKit.*");
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
dojo.hostenv.moduleLoaded("MochiKit.*");

View File

@@ -87,7 +87,7 @@
</div>
<div class="col-md-5">
<div class="clearfix"></div>
<iframe style="float: right; width: 315px; height: 315px;" frameborder="0" src="https://resources.sabnzbd.org/wizard/ad/$language"></iframe>
<iframe style="float: right; width: 325px; height: 325px;" frameborder="0" src="https://sabnzbd.org/wizard#$language"></iframe>
</div>
</div>
<input type="hidden" name="session" value="$session" />

View File

@@ -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.

View File

@@ -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. ;-)

View File

Binary file not shown.

View File

@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-22 20:42+0000\n"
"PO-Revision-Date: 2017-06-13 09:56+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2017-08-01 16:45+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-06-23 05:55+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-02 06:03+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: email/email.tmpl:1
msgid ""
@@ -64,6 +64,48 @@ msgid ""
"Sorry!\n"
"<!--#end if#-->\n"
msgstr ""
"##\n"
"## SABnzbd תבנית דוא\"ל ברירת מחדל עבור\n"
"## זאת תבנית ברדלס\n"
"## http://sabnzbd.wikidot.com/email-templates :תיעוד\n"
"##\n"
"## !שורות חדשות ורווחים לבנים הם משמעותיים\n"
"##\n"
"## אלו כותרות הדוא\"ל\n"
"$to :אל\n"
"$from :מאת\n"
"תאריך: $date\n"
"<!--#if $status then \"completed\" else \"failed\" #--> $name יש עבודה אשר "
"SABnzbd-נושא: ל\n"
"## !אחרי זה בא הגוף, השורה הריקה דרושה\n"
"\n"
",היי\n"
"<!--#if $status #-->\n"
"SABnzbd הוריד את \"$name\" <!--#if $msgid==\"\" then \"\" else \"(newzbin "
"#\" + $msgid + \")\"#-->\n"
"<!--#else#-->\n"
"SABnzbd נכשל להוריד את \"$name\" <!--#if $msgid==\"\" then \"\" else "
"\"(newzbin #\" + $msgid + \")\"#-->\n"
"<!--#end if#-->\n"
"הסתיים ב-$end_time\n"
"הורדו $size\n"
"\n"
":תוצאות העבודה\n"
"<!--#for $stage ב $stages #-->\n"
"שלב $stage <!--#slurp#-->\n"
"<!--#for $result ב $stages[$stage]#-->\n"
" $result <!--#slurp#-->\n"
"<!--#end for#-->\n"
"<!--#end for#-->\n"
"<!--#if $script!=\"\" #-->\n"
":(קוד יציאה = $script_ret) \"$script\" פלט מתסריט משתמש\n"
"$script_output\n"
"<!--#end if#-->\n"
"<!--#if $status #-->\n"
"!תהנה\n"
"<!--#else#-->\n"
"!סליחה\n"
"<!--#end if#-->\n"
#: email/rss.tmpl:1
msgid ""
@@ -93,6 +135,29 @@ msgid ""
"\n"
"Bye\n"
msgstr ""
"##\n"
"## SABnzbd עבור RSS תבנית דוא\"ל\n"
"## זאת תבנית ברדלס\n"
"## http://sabnzbd.wikidot.com/email-templates :תיעוד\n"
"##\n"
"## !שורות חדשות ורווחים לבנים הם משמעותיים\n"
"##\n"
"## אלו כותרות הדוא\"ל\n"
"$to :אל\n"
"$from :מאת\n"
"תאריך: $date\n"
"הוסיף $amount עבודות לתור SABnzbd :נושא\n"
"## !אחרי זה בא הגוף, השורה הריקה דרושה\n"
"\n"
",היי\n"
"\n"
".הוסיף $amount עבודות לתור SABnzbd\n"
".\"$feed\" בשם RSS הם מהזנת\n"
"<!--#for $job in $jobs#-->\n"
" $job <!--#slurp#-->\n"
"<!--#end for#-->\n"
"\n"
"ביי\n"
#: email/badfetch.tmpl:1
msgid ""
@@ -119,3 +184,23 @@ msgid ""
"\n"
"Bye\n"
msgstr ""
"##\n"
"## SABnzbd רעה עבור URL תבנית דוא\"ל של משיכת\n"
"## זאת תבנית ברדלס\n"
"## http://sabnzbd.wikidot.com/email-templates :תיעוד\n"
"##\n"
"## !שורות חדשות ורווחים לבנים הם משמעותיים\n"
"##\n"
"## אלו כותרות הדוא\"ל\n"
"$to :אל\n"
"$from :מאת\n"
"תאריך: $date\n"
"NZB נכשל במשיכת SABnzbd :נושא\n"
"## !אחרי זה בא הגוף, השורה הריקה דרושה\n"
"\n"
",היי\n"
"\n"
".$url מתוך NZB-נכשל לאחזר את ה SABnzbd\n"
"הודעת השגיאה הייתה: $msg\n"
"\n"
"ביי\n"

View File

@@ -5,14 +5,14 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-2.2.0-develop\n"
"Project-Id-Version: SABnzbd-2.3.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-07-15 13:06+W. Europe Daylight Time\n"
"POT-Creation-Date: 2017-08-25 09:18+W. Europe Daylight Time\n"
"Generated-By: pygettext.py 1.5\n"
@@ -40,10 +40,22 @@ msgstr ""
msgid "par2 binary... NOT found!"
msgstr ""
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr ""
@@ -93,7 +105,7 @@ msgid "Error"
msgstr ""
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr ""
@@ -178,10 +190,6 @@ msgstr ""
msgid "Trying to set status of non-existing server %s"
msgstr ""
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr ""
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr ""
@@ -229,6 +237,10 @@ msgstr ""
msgid "Failed to compile regex for search term: %s"
msgstr ""
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr ""
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr ""
@@ -409,10 +421,14 @@ msgstr ""
msgid "%s => missing from all servers, discarding"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Unpacking"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
@@ -420,21 +436,25 @@ msgid "Unpacked %s files/folders in %s"
msgstr ""
#: sabnzbd/directunpacker.py [Warning message]
msgid "Enabled Direct Unpack:"
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
msgid "Jobs will start unpacking during the download, reduces post-processing time but requires capable hard drive. Only works for jobs that do not need repair."
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 [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr ""
#: sabnzbd/dirscanner.py [Warning message]
#: sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr ""
#: sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr ""
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr ""
@@ -600,7 +620,7 @@ msgstr ""
msgid "Authentication missing, please enter username/password from Config->General into your 3rd party program:"
msgstr ""
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid "Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin."
msgstr ""
@@ -660,7 +680,7 @@ msgstr ""
msgid "Undefined server!"
msgstr ""
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr ""
@@ -708,6 +728,10 @@ msgstr ""
msgid "Error creating SSL key and certificate"
msgstr ""
#: sabnzbd/misc.py [Warning message]
msgid "Your password file contains more than 30 passwords, testing all these passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr ""
@@ -779,6 +803,11 @@ msgstr ""
msgid "Unpacking failed, archive requires a password"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Unpacking"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"]
msgid "Unpack"
msgstr ""
@@ -912,7 +941,7 @@ msgid "Main packet not found..."
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgid "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
@@ -937,6 +966,11 @@ msgstr ""
msgid "[%s] Repaired in %s"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -944,19 +978,15 @@ msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1014,7 +1044,7 @@ msgid "Not available"
msgstr ""
#: sabnzbd/notifier.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 ""
@@ -1106,7 +1136,7 @@ msgstr ""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1114,6 +1144,10 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py [Warning message]
msgid "%d files with duplicate filenames were discared for \"%s\". Enable \"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr ""
@@ -1213,7 +1247,7 @@ msgid "Limit Speed"
msgstr ""
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr ""
@@ -1455,7 +1489,7 @@ msgstr ""
msgid "Download Completed"
msgstr ""
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr ""
@@ -1519,6 +1553,18 @@ msgstr ""
msgid "Indexer id (%s) not found for ratings file"
msgstr ""
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr ""
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr ""
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid "This key provides identity to indexer. Check your profile on the indexer's website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr ""
@@ -1605,10 +1651,6 @@ msgstr ""
msgid "Failure"
msgstr ""
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr ""
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr ""
@@ -1737,6 +1779,14 @@ msgstr ""
msgid "Disable quota management"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr ""
@@ -1817,6 +1867,54 @@ msgstr ""
msgid "Year"
msgstr ""
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr ""
@@ -2595,6 +2693,34 @@ msgstr ""
msgid "List of file extensions that should be deleted after download.<br />For example: <b>nfo</b> or <b>nfo, sfv</b>"
msgstr ""
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid "Automatically delete completed jobs from History. Beware that Duplicate Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr ""
@@ -2619,10 +2745,6 @@ msgstr ""
msgid "Help us translate SABnzbd in your language! <br/>Add untranslated texts or improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr ""
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
@@ -2871,14 +2993,26 @@ msgstr ""
msgid "Detect identical episodes in series (based on \"name/season/episode\" of items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid "Bypass series duplicate detection if PROPER, REAL or REPACK is detected in the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr ""
@@ -2923,6 +3057,14 @@ msgstr ""
msgid "Some servers provide an alternative NZB when a download fails."
msgstr ""
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid "When sorting, use tags from indexer for title, season, episode, etc. Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr ""
@@ -2967,10 +3109,6 @@ msgstr ""
msgid "Automatically sort items by (average) age."
msgstr ""
#: sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/skintext.py
msgid "Posts will be paused untill they are at least this age. Setting job priority to Force will skip the delay."
msgstr ""
@@ -3132,11 +3270,7 @@ msgid "Enable Indexer Integration"
msgstr ""
#: sabnzbd/skintext.py
msgid "Indexers can supply rating information when a job is added and SABnzbd can report to the indexer if a job couldn't be completed. Depending on your indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid "This key provides identity to indexer. Check your profile on the indexer's website."
msgid "Indexers can supply rating information when a job is added and SABnzbd can report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3475,10 +3609,6 @@ msgstr ""
msgid "Send notifications to Growl"
msgstr ""
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr ""
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr ""
@@ -4011,6 +4141,10 @@ msgstr ""
msgid "articles"
msgstr ""
#: sabnzbd/skintext.py
msgid "Rename"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr ""
@@ -4475,6 +4609,14 @@ msgid ""
"It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your option) any later version.\n"
msgstr ""
#: sabnzbd/skintext.py
msgid "In order to download from usenet you will require access to a provider. Your ISP may provide you with access, however a premium provider is recommended."
msgstr ""
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ""
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr ""
@@ -4492,7 +4634,7 @@ msgstr ""
msgid "Server name does not resolve"
msgstr ""
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr ""

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Danish <da@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -104,7 +104,7 @@ msgid "Error"
msgstr "Fejl"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd lukning udført."
@@ -427,13 +427,37 @@ msgstr "Forkert udformet yEnc artikel i %s"
msgid "Unknown Error while decoding %s"
msgstr "Ukendt fejl under afkodning af %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUENCODE detekteret, kun yEnc kodning understøttes [%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => mangler fra alle servere, afviser"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUENCODE detekteret, kun yEnc kodning understøttes [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Færdig"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Udpakket %s filer/mapper i %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -632,7 +656,7 @@ msgstr ""
"Brugeroplysninger mangler, indtast brugernavn / password fra Konfiguration-> "
"Generelt i dit tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -806,8 +830,6 @@ msgstr "[%s] Fejl \"%s\" under udpakning af RAR fil(er)"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Fejl \"%s\" når du køre rar_unpack på %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -890,10 +912,6 @@ msgstr "Ubrugelig RAR fil"
msgid "Corrupt RAR file"
msgstr "Ødelagt RAR fil"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Udpakket %s filer/mapper i %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s filer i %s"
@@ -994,6 +1012,11 @@ msgstr "Reparerer"
msgid "[%s] Repaired in %s"
msgstr "[%s] Repareret i %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -1001,19 +1024,15 @@ msgstr "Disk fuld"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Bekræfter"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Kontrollerer"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Python script '%s' har ikke udfør (+x) tilladelsessæt"
@@ -1073,7 +1092,7 @@ msgid "Not available"
msgstr "Ikke tilgængelig"
#: sabnzbd/notifier.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"
@@ -1165,7 +1184,7 @@ msgstr "Ignorerer identiske NZB \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr "Fejler dublet NZB \"%s\""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr "Dublet NZB"
@@ -1173,6 +1192,12 @@ msgstr "Dublet NZB"
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pause duplikeret NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Afbrudt, kan ikke afsluttes"
@@ -1272,7 +1297,7 @@ msgid "Limit Speed"
msgstr "Hastighedsbegrænsning"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Pause"
@@ -1486,10 +1511,6 @@ msgstr "Overførslen kan mislykkes, kun %s af det krævede %s tilgængelig"
msgid "Download failed - Not on your server(s)"
msgstr "Download mislykkedes - ikke på din server (e)"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Kan ikke oprette endelig mappe %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Ingen efterbehandling på grund af mislykket godkendelse"
@@ -1554,6 +1575,10 @@ msgstr "Det lykkedes ikke at fjerne arbejdsmappen (%s)"
msgid "Download Completed"
msgstr "Overførsel fuldført"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Kan ikke oprette endelig mappe %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Efterbehandling"
@@ -1614,6 +1639,22 @@ msgstr "Fejl ved lukning af system"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Indexer id (%s) ikke fundet for ratings fil"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Serveradresse"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-nøgle"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Denne nøgle indeholder identitet indekseringen. Tjek din profil på "
"indekseringens hjemmeside."
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Forkert RSS-feed beskrivelse \"%s\""
@@ -1700,10 +1741,6 @@ msgstr "Server"
msgid "Failure"
msgstr "Mislykkedes"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Færdig"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Mislykkedes"
@@ -1912,6 +1949,54 @@ msgstr "Måned"
msgid "Year"
msgstr "År"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Månedsdag"
@@ -2735,6 +2820,36 @@ msgstr ""
"Listen over filtypenavne, der skal slettes efter download. < br / > For "
"eksempel: <b>nfo</b> eller <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Gem ændringer"
@@ -2763,10 +2878,6 @@ msgstr ""
"Hjælp os med at oversætte SABnzbd på dit sprog! <br/> Tilføj uoversatte "
"tekster eller forbedrede eksisterende oversættelser her:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-nøgle"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "Denne nøgle vil give 3. parts programmer fuld adgang til SABnzbd."
@@ -3073,14 +3184,18 @@ msgstr ""
"Fundet identiske episoder i serie (baseret på \"navn /sæson /episode\" af "
"elementer i din historik)"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Kassér"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr "Mislykkes job (flyt til historik)"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Afbryd"
@@ -3131,6 +3246,16 @@ msgstr "Ved fejl, prøv alternativ NZB"
msgid "Some servers provide an alternative NZB when a download fails."
msgstr "Nogle servere levere en alternativ NZB når et download mislykkes."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Aktiver mappe omdøbning"
@@ -3359,20 +3484,8 @@ msgstr "Aktiver indekseringen Integration"
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
"report to the indexer if a job couldn't be completed."
msgstr ""
"Indeksatorer kan levere klassifikationsoplysninger, når et job er tilføjet "
"og SABnzbd kan rapportere indekseringen, hvis et job ikke kunne fuldføres. "
"Afhængigt af din indekseringen, kan API tasteindstillingen stå tomt."
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Denne nøgle indeholder identitet indekseringen. Tjek din profil på "
"indekseringens hjemmeside."
#: sabnzbd/skintext.py
msgid "Enable Filtering"
@@ -3726,10 +3839,6 @@ msgstr "Aktiver Growl"
msgid "Send notifications to Growl"
msgstr "Send meddelelser til Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Serveradresse"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Bruges kun ved Growl fjern server (vært: port)"
@@ -4137,7 +4246,7 @@ msgstr "Ændre NZB detaljer"
msgid "Delete"
msgstr "Slet"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Øverst"
@@ -4149,7 +4258,7 @@ msgstr "Op"
msgid "Down"
msgstr "Ned"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Bunden"
@@ -4281,6 +4390,10 @@ msgstr "Indlæser..."
msgid "articles"
msgstr "artikler"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Omdøbe"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Kø reparation"
@@ -4782,7 +4895,7 @@ msgstr "Kunne ikke omdøbe lignende fil: %s til %s"
msgid "Server name does not resolve"
msgstr "Servernavnet løser ikke"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Uautoriseret adgang"
@@ -5162,9 +5275,6 @@ msgstr "URL hentning mislykkedes; %s"
#~ msgid "Pause Interval"
#~ msgstr "Pause interval"
#~ msgid "Rename"
#~ msgstr "Omdøbe"
#~ msgid "Upload: .nzb .rar .zip .gz"
#~ msgstr "Upload: .nzb .rar .zip .gz"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"PO-Revision-Date: 2017-06-22 07:06+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-09 21:46+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-10 06:03+0000\n"
"X-Generator: Launchpad (build 18446)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -111,7 +111,7 @@ msgid "Error"
msgstr "Fehler"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd wurde beendet"
@@ -201,7 +201,7 @@ msgstr "Temporäre Datei für %s konnte nicht angelegt werden"
#: sabnzbd/__init__.py [Warning message] # sabnzbd/__init__.py [Warning message]
msgid "Trying to set status of non-existing server %s"
msgstr "Versuche Status für nicht bestehenden Server %s zu setzen"
msgstr "Status für nicht vorhandenen Server wird versucht %s einzustellen"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
@@ -446,13 +446,40 @@ msgstr "Ungültiger yEnc-Artikel in %s"
msgid "Unknown Error while decoding %s"
msgstr "Unbekannter Fehler %s beim Dekodieren"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode gefunden, nur yEnc Codierung wir unterstützt [%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s wurde auf keinem Server gefunden und daher übersprungen"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode gefunden, nur yEnc Codierung wir unterstützt [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Direkt entpacken"
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Fertiggestellt"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s Datei(en)/Ordner entpackt in %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr "Direkt entpacken wurde automatisch aktiviert"
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Jobs will start unpacking during the downloading to reduce post-processing "
"time. Only works for jobs that do not need repair."
msgstr ""
"Aufträge werden bereits während des Download-Vorgangs entpackt, um die "
"Nachbearbeitungszeit zu verkürzen. Nur für Aufträge, die nicht repariert "
"werden müssen."
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -654,7 +681,7 @@ msgstr ""
"Authentifizierung fehlt. Bitte Benutzernamen und Passwort aus Einstellungen-"
">Allgemein in die externe Anwendung eingeben:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -827,8 +854,6 @@ msgstr "[%s] Fehler \"%s\" beim Entpacken der RAR-Dateien"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Fehler \"%s\" beim Ausführen von rar_unpack auf %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -913,10 +938,6 @@ msgstr "RAR-Datei beschädigt"
msgid "Corrupt RAR file"
msgstr "Defekte RAR Datei"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s Datei(en)/Ordner entpackt in %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s Dateien in %s"
@@ -1021,6 +1042,11 @@ msgstr "Reparieren"
msgid "[%s] Repaired in %s"
msgstr "[%s] Repariert in %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr "Überprüfe Reparatur"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -1028,19 +1054,15 @@ msgstr "Festplatte voll"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Überprüfen"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Wird überprüft"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: 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)"
@@ -1054,10 +1076,13 @@ msgid ""
"Certificate hostname mismatch: the server hostname is not listed in the "
"certificate. This is a server issue."
msgstr ""
"Zertifikat ungültig: Der Server-Host ist nicht im angegeben Zertifikat "
"enthalten. Dies ist ein Serverproblem."
#: sabnzbd/newswrapper.py
msgid "Certificate not valid. This is most probably a server issue."
msgstr ""
"Zertifikat ist nicht gültig. Dies ist wahrscheinlich ein Serverproblem."
#: sabnzbd/newswrapper.py
msgid "Server %s uses an untrusted certificate [%s]"
@@ -1100,7 +1125,7 @@ msgid "Not available"
msgstr "Nicht verfügbar"
#: sabnzbd/notifier.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"
@@ -1197,7 +1222,7 @@ msgstr "Doppelte NZB \"%s\" wird ignoriert"
msgid "Failing duplicate NZB \"%s\""
msgstr "kopieren der NZB \"%s\" fehlgeschlagen"
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr "Doppelte NZB"
@@ -1205,6 +1230,14 @@ msgstr "Doppelte NZB"
msgid "Pausing duplicate NZB \"%s\""
msgstr "Doppelt vorhandene NZB \"%s\" angehalten"
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
"%d Dateien mit doppelten Dateinamen wurden für \"%s\" verworfen. Aktiviere "
"\"allow_duplicate_files\" um doppelte Dateinamen zu erlauben."
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Abgebrochen, kann nicht fertiggestellt werden"
@@ -1305,7 +1338,7 @@ msgid "Limit Speed"
msgstr "Geschwindigkeit begrenzen"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Anhalten"
@@ -1494,6 +1527,8 @@ msgid ""
"Unable to bind to port %s on %s. Some other software uses the port or "
"SABnzbd is already running."
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
msgid "Fatal error"
@@ -1531,10 +1566,6 @@ msgstr ""
msgid "Download failed - Not on your server(s)"
msgstr "Download fehlgeschlagen - Nicht auf deinem/n Server/n vorhanden"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Konnte Download-Ordner %s nicht anlegen"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Keine Nachbearbeitung wegen fehlgeschlagener Überprüfung"
@@ -1599,6 +1630,10 @@ msgstr "Fehler beim Entfernen des Arbeitsverzeichnisses %s."
msgid "Download Completed"
msgstr "Download fertig"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Konnte Download-Ordner %s nicht anlegen"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Nachbearbeitung"
@@ -1659,6 +1694,22 @@ msgstr "Fehler beim Herunterfahren des Systems"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Indexer ID (%s) für Bewertung nicht gefunden"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Server-Adresse"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-Schlüssel"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Der Schlüssel liefert die Identität des Indexers. Prüfe dein Profil auf der "
"indexer Webseite."
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Ungültige RSS-Feed-Beschreibung \"%s\""
@@ -1745,10 +1796,6 @@ msgstr "Server"
msgid "Failure"
msgstr "Fehler"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Fertiggestellt"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Fehlgeschlagen"
@@ -1957,6 +2004,54 @@ msgstr "Monat"
msgid "Year"
msgstr "Jahr"
#: sabnzbd/skintext.py
msgid "January"
msgstr "Januar"
#: sabnzbd/skintext.py
msgid "February"
msgstr "Februar"
#: sabnzbd/skintext.py
msgid "March"
msgstr "März"
#: sabnzbd/skintext.py
msgid "April"
msgstr "April"
#: sabnzbd/skintext.py
msgid "May"
msgstr "Mai"
#: sabnzbd/skintext.py
msgid "June"
msgstr "Juni"
#: sabnzbd/skintext.py
msgid "July"
msgstr "Juli"
#: sabnzbd/skintext.py
msgid "August"
msgstr "August"
#: sabnzbd/skintext.py
msgid "September"
msgstr "September"
#: sabnzbd/skintext.py
msgid "October"
msgstr "Oktober"
#: sabnzbd/skintext.py
msgid "November"
msgstr "November"
#: sabnzbd/skintext.py
msgid "December"
msgstr "Dezember"
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Tag im Monat"
@@ -2585,7 +2680,7 @@ msgstr "7zip aktivieren"
#: sabnzbd/skintext.py
msgid "Multicore Par2"
msgstr ""
msgstr "Multicore Par2"
#: sabnzbd/skintext.py
msgid ""
@@ -2787,6 +2882,38 @@ msgstr ""
"Liste der Dateiendungen, die nach dem Download gelöscht werden sollen.<br "
"/>Zum Beispiel:<b>nfo</b> or <b>nfo,sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr "Verlaufsgröße"
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
"Fertige Aufträge automatisch aus dem Verlauf entfernen. Duplikatserkennung "
"und manche externe Skripte benötigen Informationen aus dem Verlauf."
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr "Alle Aufträge behalten"
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr "Fertige Aufträge nicht behalten"
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr "Aufträge"
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Änderungen speichern"
@@ -2815,10 +2942,6 @@ msgstr ""
"Hilf uns beim Übersetzen von SABnzbd in deiner Sprache! <br/>Neue "
"Übersetzungen hinzufügen oder bestehende verbessern kannst du hier:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-Schlüssel"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
@@ -3135,14 +3258,18 @@ msgstr ""
"Identische Episoden in den Serien entdeckt (basierend auf "
"\"name/season/episode\") der Einträge in der Historie"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Verwerfen"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr "Aufgabe abgebrochen (verschoben in die Historie)"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Abbrechen"
@@ -3196,6 +3323,16 @@ msgstr ""
"Manche Server stellen ein alternatives NZB zur Verfügung, falls ein Download "
"fehlschlägt."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Ordner-Umbenennung aktivieren"
@@ -3438,18 +3575,9 @@ msgstr "Indexer Integration eingeschaltet"
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Der Schlüssel liefert die Identität des Indexers. Prüfe dein Profil auf der "
"indexer Webseite."
#: sabnzbd/skintext.py
msgid "Enable Filtering"
msgstr "Filter aktivieren"
@@ -3584,7 +3712,7 @@ msgstr "Optional"
#: sabnzbd/skintext.py [Explain server optional tickbox]
msgid "For unreliable servers, will be ignored longer in case of failures"
msgstr ""
msgstr "Für unzuverlässige Server, wird bei Fehlern länger ignoriert"
#: sabnzbd/skintext.py [Enable server tickbox]
msgid "Enable"
@@ -3806,10 +3934,6 @@ msgstr "Growl aktivieren"
msgid "Send notifications to Growl"
msgstr "Benachrichtigungen an Growl senden"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Server-Adresse"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Nur für entfernten Growl-Server verwenden (Rechnername:Port)"
@@ -4213,7 +4337,7 @@ msgstr "NZB-Details bearbeiten"
msgid "Delete"
msgstr "Löschen"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Ganz nach oben"
@@ -4225,7 +4349,7 @@ msgstr "Nach oben"
msgid "Down"
msgstr "Nach unten"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Ganz nach unten"
@@ -4358,6 +4482,10 @@ msgstr "Wird geladen..."
msgid "articles"
msgstr "Artikel"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Umbenennen"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Reparatur der Warteschlange"
@@ -4861,7 +4989,7 @@ msgstr "Umbenennen der gleichen Datei von %s nach %s fehlgeschlagen."
msgid "Server name does not resolve"
msgstr "Konnte Servernamen nicht auflösen"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Unerlaubter Zugriff"
@@ -5214,9 +5342,6 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ msgid "Pause for 24 hours"
#~ msgstr "24 Stunden anhalten"
#~ msgid "Rename"
#~ msgstr "Umbenennen"
#~ msgid "Left"
#~ msgstr "Verbleibend"

View File

@@ -105,3 +105,11 @@ msgstr "Posts will be paused until they are at least this age. Setting job prior
msgid "Support the project, Donate!"
msgstr "Support the project, donate!"
msgid "%d files with duplicate filenames were discared for \"%s\". Enable \"allow_duplicate_files\" to allow duplicate filenames."
msgstr "%d files with duplicate filenames were discarded for \"%s\". Enable \"allow_duplicate_files\" to allow duplicate filenames."
msgid "User script can flag job as failed"
msgstr "Post-processing script can flag job as failed"
msgid "When the user script returns a non-zero exit code, the job will be flagged as failed."
msgstr "When the post-processing script returns a non-zero exit code, the job will be flagged as failed."

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -105,7 +105,7 @@ msgid "Error"
msgstr "Se ha producido un error"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "Cierre de SABnzbd terminado"
@@ -428,13 +428,37 @@ msgstr "Articulo yEnc corrupto en %s"
msgid "Unknown Error while decoding %s"
msgstr "Error inespecifico mientras descodificando %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode detectada, la única codificación válida es Enc [%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => faltando de todos servidores, desechando"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode detectada, la única codificación válida es Enc [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Completado"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Descompresos %s archivos/directorios en %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -634,7 +658,7 @@ msgstr ""
"Faltaron datos de cuenta, favor ingresar usuario/contraseña desde Config-"
">General en tu aplicacion externa:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -809,8 +833,6 @@ msgstr "[%s] Error \"%s\" al descomprimir ficheros RAR"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Error \"%s\" al ejecutar rar_unpack sobre %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -894,10 +916,6 @@ msgstr "Archivo RAR inutilizable"
msgid "Corrupt RAR file"
msgstr "Fichero RAR corrupto"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Descompresos %s archivos/directorios en %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s archivos en %s"
@@ -1002,6 +1020,11 @@ msgstr "Reparando"
msgid "[%s] Repaired in %s"
msgstr "[%s] Reparado en %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -1009,19 +1032,15 @@ msgstr "Disco lleno"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Verificando"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Verificando"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1081,7 +1100,7 @@ msgid "Not available"
msgstr "No disponible"
#: sabnzbd/notifier.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"
@@ -1176,7 +1195,7 @@ msgstr "Ignorando NZB Duplicado \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1184,6 +1203,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pausando NZB duplicados \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Abortado, No puede ser completado"
@@ -1283,7 +1308,7 @@ msgid "Limit Speed"
msgstr "Limitar Velocidad"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Pausar"
@@ -1503,10 +1528,6 @@ msgstr "La descarga fallo, solo %s de los %s requeridos estan disponibles"
msgid "Download failed - Not on your server(s)"
msgstr "Descarga fallida - No está en tu(s) servidor(es)"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Imposible crear directorio final %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "No se ha podido post-procesar debido a un fallo en la verificación"
@@ -1571,6 +1592,10 @@ msgstr "Error al eliminar el directorio de trabajo (%s)"
msgid "Download Completed"
msgstr "Descarga Completada"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Imposible crear directorio final %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Post-Procesado"
@@ -1633,6 +1658,20 @@ msgstr ""
"Identificación del indexador (%s) no encontrado para archivo de "
"calificaciones"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Dirección del Servidor"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Clave API"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "iaDescripción de canal RSS incorrecta \"%s\""
@@ -1721,10 +1760,6 @@ msgstr "Servidores"
msgid "Failure"
msgstr "Fallo"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Completado"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Fallido"
@@ -1933,6 +1968,54 @@ msgstr "Mes"
msgid "Year"
msgstr "Año"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Día del mes"
@@ -2752,6 +2835,36 @@ msgstr ""
"Lista de extensiones de archivo que se deben eliminar después de la descarga "
"<br /> Por ejemplo : . <b>nfo</ b> o <b>nfo, sfv < /b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Guardar cambios"
@@ -2780,10 +2893,6 @@ msgstr ""
"¡Ayúdanos a traducir SABnzbd en tu idioma!<br/>Traduce textos que aun no "
"tienen ninguna traducción o mejora los que ya lo están traducidos aquí:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Clave API"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
@@ -3089,14 +3198,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Descartar"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Abortar"
@@ -3149,6 +3262,16 @@ msgid "Some servers provide an alternative NZB when a download fails."
msgstr ""
"Algunos servidores ofrecen una NZB alternativa cuando falla una descarga ."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Habilitar renombrado de directorios"
@@ -3384,14 +3507,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3750,10 +3866,6 @@ msgstr "Habilitar Growl"
msgid "Send notifications to Growl"
msgstr "Enviar notificaciones a Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Dirección del Servidor"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Usar sólo para un servidor Growl remoto (servidor:puerto)"
@@ -4157,7 +4269,7 @@ msgstr "Editar Detalles de NZB"
msgid "Delete"
msgstr "Eliminar"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Superior"
@@ -4169,7 +4281,7 @@ msgstr "Encima"
msgid "Down"
msgstr "Abajo"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Último"
@@ -4302,6 +4414,10 @@ msgstr "Cargando"
msgid "articles"
msgstr "artículos"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Renombrar"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Reparar cola"
@@ -4804,7 +4920,7 @@ msgstr "Error al renombrar ficheros similares: %s a %s"
msgid "Server name does not resolve"
msgstr "No se puede resolver el nombre de servidor"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Acceso no autorizado"
@@ -5098,9 +5214,6 @@ msgstr "Error al recuperar la URL; %s"
#~ msgid "Storage"
#~ msgstr "Almacenamiento"
#~ msgid "Rename"
#~ msgstr "Renombrar"
#~ msgid "Access"
#~ msgstr "Acceso"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -107,7 +107,7 @@ msgid "Error"
msgstr "Virhe"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd sammutus valmis"
@@ -427,13 +427,37 @@ msgstr "Huonosti muotoiltu yEnc artikkeli %s"
msgid "Unknown Error while decoding %s"
msgstr "Tuntematon virhe dekoodattaessa %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode-koodaus havaittiin, vain yEnc-koodausta tuetaan [%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => puuttuu kaikilta palvelimilta, hylätään"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode-koodaus havaittiin, vain yEnc-koodausta tuetaan [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Valmistunut"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Purettiin %s tiedostoa/kansiota kohteeseen %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -631,7 +655,7 @@ msgstr ""
"Authentikointi puuttuu, ole hyvä ja syötä käyttäjänimi/salasana Asetukset-"
">Yleiset kolmannen osapuolen ohjelmaasi:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -804,8 +828,6 @@ msgstr "[%s] Virhe \"%s\" purettaessa RAR tiedostoja"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Virhe \"%s\" ajettaessa rar_unpack kohteelle %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -888,10 +910,6 @@ msgstr "Käyttökelvoton RAR arkisto"
msgid "Corrupt RAR file"
msgstr "Korruptoitunut RAR arkisto"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Purettiin %s tiedostoa/kansiota kohteeseen %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s tiedostoa kohteessa %s"
@@ -992,6 +1010,11 @@ msgstr "Korjataan"
msgid "[%s] Repaired in %s"
msgstr "[%s] Korjattiin ajassa %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -999,19 +1022,15 @@ msgstr "Levy täynnä"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Varmennetaan"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Tarkistetaan"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1071,7 +1090,7 @@ msgid "Not available"
msgstr "Ei saatavilla"
#: sabnzbd/notifier.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"
@@ -1165,7 +1184,7 @@ msgstr "Ohitetaan kaksoiskappale NZB \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1173,6 +1192,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Keskeytetään kaksoiskappale NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Peruutettu, ei voi valmistua"
@@ -1272,7 +1297,7 @@ msgid "Limit Speed"
msgstr "Nopeusrajoitus"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Keskeytä"
@@ -1490,10 +1515,6 @@ msgstr "Lataaminen saattaa epäonnistua, vain %s osaa %s osasta saatavilla"
msgid "Download failed - Not on your server(s)"
msgstr "Lataus epäonnistui - Ei ole palvelimilla"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Ei voitu luoda lopullista kansiota %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Jälkikäsittelyä ei suoritettu, koska varmennus epäonnistui"
@@ -1558,6 +1579,10 @@ msgstr "Virhe poistettaessa työkansiota (%s)"
msgid "Download Completed"
msgstr "Lataus valmistui"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Ei voitu luoda lopullista kansiota %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Jälkikäsittely"
@@ -1618,6 +1643,20 @@ msgstr "Virhe sammutettaessa järjestelmää"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Indeksoijan id:tä (%s) ei löydetty arviointitiedostolle"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Palvelimen osoite"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API avain"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Virheellinen RSS syötteen kuvaus \"%s\""
@@ -1704,10 +1743,6 @@ msgstr "Palvelimet"
msgid "Failure"
msgstr "Epäonnistui"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Valmistunut"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Epäonnistunut"
@@ -1916,6 +1951,54 @@ msgstr "Kuukausi"
msgid "Year"
msgstr "Vuosi"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Kuukauden päivä"
@@ -2742,6 +2825,36 @@ msgstr ""
"Lista tiedostopäätteistä jotka poistetaan latauksen valmistuttua.<br "
"/>Esimerkiksi: <b>nfo</b> tai <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Tallenna muutokset"
@@ -2770,10 +2883,6 @@ msgstr ""
"Auta meitä kääntämään SABnzbd sinun kielellesi!<br/>Käännä tai muokkaa "
"olemassaolevia käännöksiä täällä:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API avain"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
@@ -3082,14 +3191,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Hylkää"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Peruuta"
@@ -3142,6 +3255,16 @@ msgid "Some servers provide an alternative NZB when a download fails."
msgstr ""
"Jotkin palvelimet tarjoavat vaihtoehtoisen NZB:n kun lataus epäonnistuu."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Kansion uudelleennimeäminen käytössä"
@@ -3372,14 +3495,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3735,10 +3851,6 @@ msgstr "Growl käytössä"
msgid "Send notifications to Growl"
msgstr "Lähetä ilmoitukset Growliin"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Palvelimen osoite"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Käytä vain Growl etäpalvelimelle (isäntä:portti)"
@@ -4148,7 +4260,7 @@ msgstr "NZB tietojen muokkaus"
msgid "Delete"
msgstr "Poista"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Ylin"
@@ -4160,7 +4272,7 @@ msgstr "Ylös"
msgid "Down"
msgstr "Alas"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Alin"
@@ -4293,6 +4405,10 @@ msgstr "Ladataan"
msgid "articles"
msgstr "artikkeleita"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Uudelleennimeä"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Jonon korjaus"
@@ -4795,7 +4911,7 @@ msgstr "Samankaltaisen tiedoston uudelleennimeäminen epäonnistui: %s %s"
msgid "Server name does not resolve"
msgstr "Palvelimen osoitetta ei voitu selvittää"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Luvaton käyttö"
@@ -5209,9 +5325,6 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgid "Left"
#~ msgstr "Jäljellä"
#~ msgid "Rename"
#~ msgstr "Uudelleennimeä"
#~ msgid "Pause for 12 hours"
#~ msgstr "Keskeytä 12:ksi tunniksi"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"PO-Revision-Date: 2017-06-27 19:41+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-07 18:53+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-06-28 05:45+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-08 05:33+0000\n"
"X-Generator: Launchpad (build 18446)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -111,7 +111,7 @@ msgid "Error"
msgstr "Erreur"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "Arrêt de SABnzbd terminé"
@@ -448,13 +448,40 @@ msgstr "Article yEnc mal construit dans %s"
msgid "Unknown Error while decoding %s"
msgstr "Erreur inconnue lors du décodage de %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode détecté, seul l'encodage yEnc est compatible [%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => absent de tous les serveurs, rejeté"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode détecté, seul l'encodage yEnc est compatible [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Décompression Directe"
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Terminé"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s fichier(s)/dossier(s) extrait(s) en %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr "La Décompression Directe a été activée automatiquement."
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Jobs will start unpacking during the downloading to reduce post-processing "
"time. Only works for jobs that do not need repair."
msgstr ""
"Les tâches seront décompréssées pendant le téléchargement pour réduire le "
"temps de post-traitement. Fonctionne uniquement pour les tâches qui ne "
"nécessitent aucune réparation."
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -657,7 +684,7 @@ msgstr ""
"Authentification manquante, entrez vos identifiant/mot de passe de la "
"configuration générale dans votre application tierce :"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -831,8 +858,6 @@ msgstr "[%s] Erreur \"%s\" lors de l'extraction des fichiers RAR"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Erreur \"%s\" lors de l'exécution de rar_unpack sur %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -919,10 +944,6 @@ msgstr "Fichier RAR inutilisable"
msgid "Corrupt RAR file"
msgstr "Fichier RAR corrompu"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s fichier(s)/dossier(s) extrait(s) en %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s fichiers dans %s"
@@ -1027,6 +1048,11 @@ msgstr "Réparation en cours"
msgid "[%s] Repaired in %s"
msgstr "[%s] Réparé(s) dans %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr "Vérification de la réparation"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -1034,19 +1060,15 @@ msgstr "Disque plein"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Vérification en cours"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Vérification"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr "Vérification de la réparation"
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1111,7 +1133,7 @@ msgid "Not available"
msgstr "Non disponible"
#: sabnzbd/notifier.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"
@@ -1205,7 +1227,7 @@ msgstr "Doublon NZB ignoré \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr "Échec de duplication du NZB \"%s\""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr "Dupliquer NZB"
@@ -1213,6 +1235,14 @@ msgstr "Dupliquer NZB"
msgid "Pausing duplicate NZB \"%s\""
msgstr "Mise en pause du doublon NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
"%d fichiers avec des noms en double ont été rejetés pour \"%s\". Cochez "
"\"allow_duplicate_files\" pour autoriser les noms de fichiers en double."
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Interrompu, ne peut être achevé"
@@ -1312,7 +1342,7 @@ msgid "Limit Speed"
msgstr "Limiter la vitesse"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Mettre en pause"
@@ -1541,10 +1571,6 @@ msgstr ""
msgid "Download failed - Not on your server(s)"
msgstr "Le téléchargement a échoué - absent de vos serveur(s)"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Impossible de créer le dossier final %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Pas de post-traitement car la vérification a echoué"
@@ -1609,6 +1635,10 @@ msgstr "Erreur lors de la suppression du dossier de travail (%s)"
msgid "Download Completed"
msgstr "Téléchargement terminé"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Impossible de créer le dossier final %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Post-traitement"
@@ -1669,6 +1699,22 @@ msgstr "Erreur lors de l'arrêt du système"
msgid "Indexer id (%s) not found for ratings file"
msgstr "id de l'Indexer (%s) non trouvé pour le fichier des classements"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Adresse du serveur"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Clé API"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Cette clé fournit l'identité à l'indexeur. Vérifiez votre profil sur le site "
"web de l'indexeur."
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Description du flux RSS incorrecte \"%s\""
@@ -1757,10 +1803,6 @@ msgstr "Serveurs"
msgid "Failure"
msgstr "Échec"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Terminé"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Échoué"
@@ -1969,6 +2011,54 @@ msgstr "Mois"
msgid "Year"
msgstr "Année"
#: sabnzbd/skintext.py
msgid "January"
msgstr "Janvier"
#: sabnzbd/skintext.py
msgid "February"
msgstr "Février"
#: sabnzbd/skintext.py
msgid "March"
msgstr "Mars"
#: sabnzbd/skintext.py
msgid "April"
msgstr "Avril"
#: sabnzbd/skintext.py
msgid "May"
msgstr "Mai"
#: sabnzbd/skintext.py
msgid "June"
msgstr "Juin"
#: sabnzbd/skintext.py
msgid "July"
msgstr "Juillet"
#: sabnzbd/skintext.py
msgid "August"
msgstr "Août"
#: sabnzbd/skintext.py
msgid "September"
msgstr "Septembre"
#: sabnzbd/skintext.py
msgid "October"
msgstr "Octobre"
#: sabnzbd/skintext.py
msgid "November"
msgstr "Novembre"
#: sabnzbd/skintext.py
msgid "December"
msgstr "Décembre"
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Jour du mois"
@@ -2800,6 +2890,39 @@ msgstr ""
"Liste des extensions de fichiers qui doivent être supprimés après le "
"téléchargement.<br /><Par exemple: <b>nfo</b> ou <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr "Conservation de l'historique"
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
"Supprimer automatiquement les tâches terminées de l'historique. Attention, "
"la Détection des Doublons et certains outils externes s'appuient sur les "
"informations de l'historique."
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr "Conserver toutes les tâches"
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr "Nombre maximum de tâches complétées historisées"
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr "Durée maximale d'historisation des tâches complétées"
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr "Ne conserver aucune tâche terminée"
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr "Tâches"
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Enregistrer les modifications"
@@ -2828,10 +2951,6 @@ msgstr ""
"Aidez-nous à traduire SABnzbd dans votre langue ! <br/>Améliorez les "
"traductions existantes ou ajoutez celles qui manquent ici :"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Clé API"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
@@ -3149,14 +3268,18 @@ msgstr ""
"Détecter les épisodes de série identiques (en fonction du modèle "
"\"nom/saison/épisode\" des éléments de votre historique)"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Rejeter"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr "Faire échouer la tâche (déplacer vers l'historique)"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr "Taguer la tâche"
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Annuler"
@@ -3211,6 +3334,19 @@ msgstr ""
"Certains serveurs proposent un NZB alternatif lorsqu'un téléchargement "
"échoue."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr "Utiliser les tags de l'indexeur"
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
"Lors du tri, utiliser les tags de l'indexeur pour le titre, la saison, "
"l'episode, etc. Sinon, toutes les dénominations seront dérivées du fichier "
"NZB."
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Activer le renommage du dossier"
@@ -3449,21 +3585,11 @@ msgstr "Activer l'intégration de l'indexeur"
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
"report to the indexer if a job couldn't be completed."
msgstr ""
"Les indexeurs peuvent fournir des informations de notation lorsqu'une tâche "
"est ajoutée, et SABnzbd peut signaler à l'indexeur si une tâche n'a pu être "
"terminée. Le paramètre de clé API peut être laissé vide en fonction de votre "
"indexeur."
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Cette clé fournit l'identité à l'indexeur. Vérifiez votre profil sur le site "
"web de l'indexeur."
"est ajoutée, et SABnzbd peut signaler à l'indexeur si une tâche n'a pas pu "
"être terminée."
#: sabnzbd/skintext.py
msgid "Enable Filtering"
@@ -3825,10 +3951,6 @@ msgstr "Activer Growl"
msgid "Send notifications to Growl"
msgstr "Envoie les notifications à Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Adresse du serveur"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Utiliser seulement pour le serveur Growl à distance (hôte:port)"
@@ -4240,7 +4362,7 @@ msgstr "Éditer les détails du NZB"
msgid "Delete"
msgstr "Supprimer"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Tout en haut"
@@ -4252,7 +4374,7 @@ msgstr "Monter"
msgid "Down"
msgstr "Descendre"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Tout en bas"
@@ -4385,6 +4507,10 @@ msgstr "Chargement"
msgid "articles"
msgstr "articles"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Renommer"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Réparer la file d'attente"
@@ -4890,7 +5016,7 @@ msgstr "Impossible de renommer le fichier similaire : %s en %s"
msgid "Server name does not resolve"
msgstr "Resolution du nom de serveur impossible"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Accès non autorisé"
@@ -5073,9 +5199,6 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "Pause for 24 hours"
#~ msgstr "Pause pour 24 heures"
#~ msgid "Rename"
#~ msgstr "Renommer"
#~ msgid "Open Source URL"
#~ msgstr "Ouvrir URL Source"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"PO-Revision-Date: 2017-06-28 21:20+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-15 20:47+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-06-29 05:29+0000\n"
"X-Generator: Launchpad (build 18418)\n"
"X-Launchpad-Export-Date: 2017-08-16 05:16+0000\n"
"X-Generator: Launchpad (build 18446)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -102,7 +102,7 @@ msgid "Error"
msgstr "שגיאה"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "הסתיים SABnzbd כיבוי"
@@ -421,13 +421,39 @@ msgstr "%s-נוצר באופן גרוע ב yEnc מאמר"
msgid "Unknown Error while decoding %s"
msgstr "%s שגיאה בלתי ידועה בעת פענוח"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "[%s] נתמכת yEnc התגלה, רק הצפנת UUencode"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "חסר מכל השרתים, משליך <= %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "[%s] נתמכת yEnc התגלה, רק הצפנת UUencode"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "פריקה ישירה"
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "הושלם"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s-פורקו %s קבצים/תיקיות ב"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ".פריקה ישירה אופשרה באופן אוטומטי"
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -622,7 +648,7 @@ msgstr ""
":אימות חסר, אנא הכנס שם משתמש/סיסמה מתוך תצורה->כללי לתוך תכנית הצד השלישי "
"שלך"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -794,8 +820,6 @@ msgstr "RAR [%s] שגיאה \"%s\" בזמן פריקת קבצי"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "%s על rar_unpack שגיאת \"%s\" בזמן הרצת"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -878,10 +902,6 @@ msgstr "בלתי שמיש RAR קובץ"
msgid "Corrupt RAR file"
msgstr "פגום RAR קובץ"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s-פורקו %s קבצים/תיקיות ב"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s קבצים ב %s"
@@ -980,6 +1000,11 @@ msgstr "מתקן"
msgid "[%s] Repaired in %s"
msgstr "%s-תוקן ב [%s]"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr "מוודא תיקון"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -987,19 +1012,15 @@ msgstr "דיסק מלא"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "מוודא"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "בודק"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr "מוודא תיקון"
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "(+x) אין ערכת הרשאות ביצוע \"%s\" לתסריט פייתון"
@@ -1061,7 +1082,7 @@ msgid "Not available"
msgstr "לא זמין"
#: sabnzbd/notifier.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 "לא ניתן לשלוח, נתונים דרושים חסרים"
@@ -1153,7 +1174,7 @@ msgstr "\"%s\" כפול NZB-מתעלם מ"
msgid "Failing duplicate NZB \"%s\""
msgstr "\"%s\" NZB נכשל בשכפול"
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr "NZB שכפל"
@@ -1161,6 +1182,14 @@ msgstr "NZB שכפל"
msgid "Pausing duplicate NZB \"%s\""
msgstr "\"%s\" NZB משהה שכפול"
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
".כדי להתיר שמות כפולים של קבצים \"allow_duplicate_files\" אפשר את .\"%s\" "
"הושלכו %d קבצים עם שמות כפולים עבור"
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "בוטל, לא יכול להיות שלם"
@@ -1260,7 +1289,7 @@ msgid "Limit Speed"
msgstr "הגבל מהירות"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "השהה"
@@ -1477,10 +1506,6 @@ msgstr "הורדה עשויה להיכשל, רק %s מתוך %s דרושים ז
msgid "Download failed - Not on your server(s)"
msgstr "הורדה נכשלה - לא בשרת(ים) שלך"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "%s לא יכול ליצור תיקייה סופית"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "אין לאחר-עיבוד בגלל וידוא כושל"
@@ -1545,6 +1570,10 @@ msgstr "(%s) שגיאה בהסרת תיקיית עבודה"
msgid "Download Completed"
msgstr "הורדה הושלמה"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "%s לא יכול ליצור תיקייה סופית"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "לאחר-עיבוד"
@@ -1587,7 +1616,7 @@ msgstr "נכשלו בוידוא RAR קבצי"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py [Error message]
msgid "Removing %s failed"
msgstr "הסרת %s נכשלה"
msgstr "נכשלה %s הסרת"
#: sabnzbd/powersup.py [Error message]
msgid "Failed to hibernate system"
@@ -1605,6 +1634,20 @@ msgstr "שגיאה בזמן כיבוי מערכת"
msgid "Indexer id (%s) not found for ratings file"
msgstr "לא נמצאה עבור קובץ מידרגים (%s) זהות מדדן"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "כתובת שרת"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API מפתח"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ".מפתח זה מספק זהות למדדן. בדוק את המתאר שלך באתר של המדדן"
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "\"%s\" לא נכון RSS תיאור הזנת"
@@ -1691,10 +1734,6 @@ msgstr "שרתים"
msgid "Failure"
msgstr "כישלון"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "הושלם"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "נכשל"
@@ -1785,7 +1824,7 @@ msgstr "RSS קרא הזנות"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Remove failed jobs"
msgstr "הסר עבודות כושלות"
msgstr "הסר עבודות נכשלות"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Remove completed jobs"
@@ -1903,6 +1942,54 @@ msgstr "חודש"
msgid "Year"
msgstr "שנה"
#: sabnzbd/skintext.py
msgid "January"
msgstr "ינואר"
#: sabnzbd/skintext.py
msgid "February"
msgstr "פברואר"
#: sabnzbd/skintext.py
msgid "March"
msgstr "מרץ"
#: sabnzbd/skintext.py
msgid "April"
msgstr "אפריל"
#: sabnzbd/skintext.py
msgid "May"
msgstr "מאי"
#: sabnzbd/skintext.py
msgid "June"
msgstr "יוני"
#: sabnzbd/skintext.py
msgid "July"
msgstr "יולי"
#: sabnzbd/skintext.py
msgid "August"
msgstr "אוגוסט"
#: sabnzbd/skintext.py
msgid "September"
msgstr "ספטמבר"
#: sabnzbd/skintext.py
msgid "October"
msgstr "אוקטובר"
#: sabnzbd/skintext.py
msgid "November"
msgstr "נובמבר"
#: sabnzbd/skintext.py
msgid "December"
msgstr "דצמבר"
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "יום בחודש"
@@ -2242,15 +2329,15 @@ msgstr "ומחק קבצים NZB טהר"
#: sabnzbd/skintext.py [Retry all failed jobs dialog box]
msgid "Retry all failed jobs"
msgstr "נסה שוב את כל העבודות שנכשלו"
msgstr "נסה שוב את כל העבודות הנכשלות"
#: sabnzbd/skintext.py [Queue page button]
msgid "Remove NZB"
msgstr "הסר NZB"
msgstr "NZB הסר"
#: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py
msgid "Remove NZB & Delete Files"
msgstr "הסר NZB ומחק קבצים"
msgstr "ומחק קבצים NZB הסר"
#: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"]
msgid "of"
@@ -2298,11 +2385,11 @@ msgstr "גודל"
#: sabnzbd/skintext.py [Button to delete all failed jobs in History]
msgid "Purge Failed NZBs"
msgstr "שנכשלו NZB טהר"
msgstr "נכשלים NZB טהר"
#: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files]
msgid "Purge Failed NZBs & Delete Files"
msgstr "שנכשלו ומחק קבצים NZB טהר"
msgstr "נכשלים ומחק קבצים NZB טהר"
#: sabnzbd/skintext.py [Button to delete all completed jobs in History]
msgid "Purge Completed NZBs"
@@ -2717,6 +2804,38 @@ msgstr ""
".רשימת סיומות של קבצים שצריכים להימחק לאחר הורדה<br /><b>nfo, sfv</b> או "
"<b>nfo</b> :לדוגמה"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr "שימור היסטוריה"
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
".מחק באופן אוטומטי עבודות שלמות מההיסטוריה. שים לב ששימור כפול ומספר כלים "
"חיצוניים מסתמכים על מידע היסטוריה"
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr "שמור את כל העבודות"
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr "שמור מספר מרבי של עבודות שלמות"
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr "שמור מספר ימים מרבי של עבודות שלמות"
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr "אל תשמור עבודות שלמות כלשהן"
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr "עבודות"
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "שמור שינויים"
@@ -2745,10 +2864,6 @@ msgstr ""
"!לעברית SABnzbd עזור לנו לתרגם את<br/>הוסף מלל לא מתורגם או שפר תרגומים "
"קיימים כאן:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API מפתח"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ".SABnzbd מפתח זה יתן לתכניות צד שלישי גישה מלאה אל"
@@ -3043,14 +3158,18 @@ msgid ""
msgstr ""
"(גלה פרקים זהים בסדרות (על סמך \"שם/עונה/פרק\" של פריטים בהיסטוריה שלך"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "השלך"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr "הכשל עבודה (העבר להיסטוריה)"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr "הצמד תג לעבודה"
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "בטל"
@@ -3100,6 +3219,18 @@ msgstr "חלופי NZB בכישלון, נסה"
msgid "Some servers provide an alternative NZB when a download fails."
msgstr ".חלופי כאשר הורדת נכשלת NZB מספר שרתים מספקים"
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr "השתמש בתגים ממדדן"
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
".NZB-בעת מיון, השתמש בתגים ממדדן עבור כותרת, עונה, פרק וכדומה. אחרת כל מתן "
"השמות נגזר משם ה"
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "אפשר שינוי שם תיקייה"
@@ -3323,18 +3454,10 @@ msgstr "אפשר מיזוג מדדן"
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
"report to the indexer if a job couldn't be completed."
msgstr ""
".יכול לדווח למדדן במקרה שעבודה לא יכלה להיות מושלמת SABnzbd-מדדנים יכולים "
"לספק מידע מידרג כאשר עבודה מתווספת ו\r\n"
".שלך יכולה להישאר ריקה API-תלוי במדדן שלך, קביעת מפתח ה"
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ".מפתח זה מספק זהות למדדן. בדוק את המתאר שלך באתר של המדדן"
"יכול לדווח למדדן במקרה שעבודה לא יכלה להישלם SABnzbd-מדדנים יכולים לספק מידע "
"מידרג כאשר עבודה מתווספת ו"
#: sabnzbd/skintext.py
msgid "Enable Filtering"
@@ -3688,10 +3811,6 @@ msgstr "Growl אפשר"
msgid "Send notifications to Growl"
msgstr "Growl שלח התראות אל"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "כתובת שרת"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "מרוחק (מארח:פתחה) Growl השתמש רק עבור שרת"
@@ -4091,13 +4210,13 @@ msgstr "ערכים"
#: sabnzbd/skintext.py [Job details page]
msgid "Edit NZB Details"
msgstr "ערוך פרטי NZB"
msgstr "NZB ערוך פרטי"
#: sabnzbd/skintext.py [Job details page, delete button]
msgid "Delete"
msgstr "מחק"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "ראש"
@@ -4109,7 +4228,7 @@ msgstr "למעלה"
msgid "Down"
msgstr "למטה"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "תחתית"
@@ -4241,6 +4360,10 @@ msgstr "טוען"
msgid "articles"
msgstr "מאמרים"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "שנה שם"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "תיקון תור"
@@ -4471,7 +4594,7 @@ msgstr "?לטהר את התור"
#: sabnzbd/skintext.py
msgid "Retry all failed jobs in History?"
msgstr "לנסות שוב את כל העבודות שנכשלו בהיסטוריה?"
msgstr "לנסות שוב את כל העבודות הנכשלות בהיסטוריה?"
#: sabnzbd/skintext.py
msgid "Purge"
@@ -4549,7 +4672,7 @@ msgstr "מחק שלמים"
#: sabnzbd/skintext.py
msgid "Delete the all failed items from the history?"
msgstr "למחוק את כל הפריטים שנכשלו מההיסטוריה?"
msgstr "למחוק את כל הפריטים הנכשלים מההיסטוריה?"
#: sabnzbd/skintext.py
msgid "Delete Failed"
@@ -4557,7 +4680,7 @@ msgstr "מחק נכשלים"
#: sabnzbd/skintext.py
msgid "Retry all failed jobs?"
msgstr "לנסות שוב את העבודות שנכשלו?"
msgstr "לנסות שוב את העבודות הנכשלות?"
#: sabnzbd/skintext.py
msgid "Links"
@@ -4738,7 +4861,7 @@ msgstr "%s אל %s :נכשל בשינוי שם של קובץ דומה"
msgid "Server name does not resolve"
msgstr "שם השרת אינו פותר"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "גישה בלתי מורשת"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-05-23 11:46+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -106,7 +106,7 @@ msgid "Error"
msgstr "Feil"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd er nå avsluttet"
@@ -423,13 +423,37 @@ msgstr "Feilaktigt utformet yEnc artikkel i %s"
msgid "Unknown Error while decoding %s"
msgstr "Ukjent feil oppstod under dekoding av %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode oppdaget, bare yEnc koding er støttet[%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => mangler på alle servere, fjerner"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode oppdaget, bare yEnc koding er støttet[%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Ferdig"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Utpakket %s filer/mapper på %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -627,7 +651,7 @@ msgstr ""
"Autentisering mangler, angi brukernavn/passord fra Konfigurasjon->Generelt i "
"ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -800,8 +824,6 @@ msgstr "[%s] Feil \"%s\" under utpakking av RAR fil(er)"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Feil \"%s\" under kjøring av rar_unpack på %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -884,10 +906,6 @@ msgstr "Ubrukelig RAR-fil"
msgid "Corrupt RAR file"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Utpakket %s filer/mapper på %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s filer på %s"
@@ -988,6 +1006,11 @@ msgstr "Reparerer"
msgid "[%s] Repaired in %s"
msgstr "[%s] Reparert på %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -995,19 +1018,15 @@ msgstr "Harddisken er full"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Verifiserer"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Undersøker"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1067,7 +1086,7 @@ msgid "Not available"
msgstr "Ikke tilgjengelig"
#: sabnzbd/notifier.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"
@@ -1159,7 +1178,7 @@ msgstr "Ignorerer duplikatfil \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1167,6 +1186,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Stanser duplikatfil \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Avbrutt, kan ikke fullføres"
@@ -1266,7 +1291,7 @@ msgid "Limit Speed"
msgstr "Hastighetsbegrensning"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Stans midlertidig"
@@ -1482,10 +1507,6 @@ msgstr "Nedlasting kan feile, kun %s av kravet på %s tilgjengelig"
msgid "Download failed - Not on your server(s)"
msgstr "Nedlastning feilet - Finnes ikke på din(e) server(e)"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Kan ikke opprette mappe %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Ingen etterbehandling, på grunn av misslykket verifisering"
@@ -1550,6 +1571,10 @@ msgstr "Kunne ikke fjerne arbeidsmappe (%s)"
msgid "Download Completed"
msgstr "Nedlasting ferdig"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Kan ikke opprette mappe %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Etterbehandling"
@@ -1610,6 +1635,20 @@ msgstr "Feil under avslutting av systemet"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Fant ikke indekser id (%s) for rangeringsfil."
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Tjeneradresse"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-nøkkel"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Feilaktig RSS-kilde beskrivelse \"%s\""
@@ -1696,10 +1735,6 @@ msgstr "Servere"
msgid "Failure"
msgstr "Feil"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Ferdig"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Mislyktes"
@@ -1908,6 +1943,54 @@ msgstr "Måned"
msgid "Year"
msgstr "År"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Dag i måneden"
@@ -2724,6 +2807,36 @@ msgstr ""
"Liste over filtyper som skal slettes etter nedlasting.<br />For eksempel: "
"<b>nfo</b> eller <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Lagre endringer"
@@ -2750,10 +2863,6 @@ msgid ""
"improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-nøkkel"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "Denne nøkkelen vil gi tredjepartsprogrammer full tilgang til SABnzbd"
@@ -3052,14 +3161,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Forkast"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Avbryt"
@@ -3111,6 +3224,16 @@ msgstr "Når den feiler, prøv alternativ NZB-fil"
msgid "Some servers provide an alternative NZB when a download fails."
msgstr "Noen servere vil gi en alternativ NZB når en nedlasting mislykkes."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Aktiver omdøping av mappe"
@@ -3336,14 +3459,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3695,10 +3811,6 @@ msgstr "Aktiver Growl"
msgid "Send notifications to Growl"
msgstr "Send varsler til Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Tjeneradresse"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Brukes kun for fjerntliggende Growl tjener (vert:port)"
@@ -4103,7 +4215,7 @@ msgstr "Endre NZB detaljer"
msgid "Delete"
msgstr "Fjern"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Topp"
@@ -4115,7 +4227,7 @@ msgstr "Opp"
msgid "Down"
msgstr "Ned"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Bunn"
@@ -4248,6 +4360,10 @@ msgstr "Laster"
msgid "articles"
msgstr "artikler"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Endre navn"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Reparer Kø"
@@ -4746,7 +4862,7 @@ msgstr "Kunne ikke endre navn på lik fil: %s til %s"
msgid "Server name does not resolve"
msgstr "Kunne ikke finne servernavn"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Uautorisert tilgang"
@@ -5289,9 +5405,6 @@ msgstr "URL henting mislyktes; %s"
#~ msgid "Storage"
#~ msgstr "Lagring"
#~ msgid "Rename"
#~ msgstr "Endre navn"
#~ msgid "OZnzb"
#~ msgstr "OZnzb"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"PO-Revision-Date: 2017-07-10 06:45+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-09 21:46+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-07-11 06:05+0000\n"
"X-Generator: Launchpad (build 18419)\n"
"X-Launchpad-Export-Date: 2017-08-10 06:03+0000\n"
"X-Generator: Launchpad (build 18446)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -109,7 +109,7 @@ msgid "Error"
msgstr "Fout"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd is afgesloten"
@@ -441,13 +441,40 @@ msgstr "Slecht opgemaakt yEnc-artikel in %s"
msgid "Unknown Error while decoding %s"
msgstr "Onbekende fout tijdens het decoderen van %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode gevonden, SABnzbd verwerkt alleen yEnc-codering [%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => ontbreekt op alle servers, overslaan"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "UUencode gevonden, SABnzbd verwerkt alleen yEnc-codering [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Direct Uitpakken"
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Voltooid"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s bestanden/mappen uitgepakt in %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr "Direct Uitpakken is automatisch ingeschakeld."
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Jobs will start unpacking during the downloading to reduce post-processing "
"time. Only works for jobs that do not need repair."
msgstr ""
"Het uitpakken van opdrachten wordt al gestart tijdens het downloaden. Dit "
"verkort de tijd die nodig is voor het nabewerken. Dit werkt alleen als de "
"opdracht niet beschadigd is."
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -646,7 +673,7 @@ msgstr ""
"Autenticatie ontbreekt; vul gebruikersnaam en wachtwoord van 'Configuratie' "
"=> 'Algemeen' in bij het externe programma:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -820,8 +847,6 @@ msgstr "[%s] Fout \"%s\" bij het uitpakken van RAR-bestanden"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Fout \"%s\" bij uitvoeren van 'rar_unpack' op %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -904,10 +929,6 @@ msgstr "Onbruikbaar RAR-bestand"
msgid "Corrupt RAR file"
msgstr "Beschadigd RAR-bestand"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s bestanden/mappen uitgepakt in %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s bestanden in %s"
@@ -1007,6 +1028,11 @@ msgstr "Repareren"
msgid "[%s] Repaired in %s"
msgstr "[%s] Reparatie in %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr "Reparatie controleren"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -1014,19 +1040,15 @@ msgstr "Schijf is vol"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Verifiëren"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Controleren"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr "Reparatie controleren"
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Python-script '%s' heeft geen uitvoerpermissie (+x)"
@@ -1089,7 +1111,7 @@ msgid "Not available"
msgstr "Niet beschikbaar"
#: sabnzbd/notifier.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"
@@ -1181,7 +1203,7 @@ msgstr "Dubbele NZB \"%s\" overgeslagen"
msgid "Failing duplicate NZB \"%s\""
msgstr "Opdracht '%s' geweigerd omdat het een dubbele is"
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr "Dubbele NZB"
@@ -1189,6 +1211,15 @@ msgstr "Dubbele NZB"
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pauzeer dubbele NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
"Er zijn %d bestanden met dezelfde bestandsnaam niet toegevoegd aan opdracht "
"\"%s\". Zet \"allow_duplicate_files\" aan om dubbele bestandsnamen toe te "
"staan."
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Afgebroken, kan niet voltooid worden"
@@ -1288,7 +1319,7 @@ msgid "Limit Speed"
msgstr "Beperk snelheid"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Pauze"
@@ -1509,10 +1540,6 @@ msgstr ""
msgid "Download failed - Not on your server(s)"
msgstr "Download mislukt - Niet meer op je server(s)"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Kan bestemmingsmap %s niet maken"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Geen nabewerking vanwege mislukte verificatie"
@@ -1577,6 +1604,10 @@ msgstr "Fout bij verwijderen van werkmap %s"
msgid "Download Completed"
msgstr "Download voltooid"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Kan bestemmingsmap %s niet maken"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Nabewerking"
@@ -1637,6 +1668,22 @@ msgstr "Fout bij het afsluiten van het systeem"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Indexer id (%s) niet gevonden in het bestand met beoordelingen"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Server adres"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-sleutel"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Deze sleutel is voor je identificatie door de indexer. Kijk in je profiel op "
"de website van de indexer."
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Foutieve RSS-feed definitie \"%s\""
@@ -1723,10 +1770,6 @@ msgstr "Servers"
msgid "Failure"
msgstr "Mislukt"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Voltooid"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Mislukt"
@@ -1821,7 +1864,7 @@ msgstr "Verwijder mislukte opdrachten"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Remove completed jobs"
msgstr "Verwijder afgehandelde taken"
msgstr "Verwijder voltooide opdrachten"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause low prioirty jobs"
@@ -1935,6 +1978,54 @@ msgstr "maand"
msgid "Year"
msgstr "jaar"
#: sabnzbd/skintext.py
msgid "January"
msgstr "Januari"
#: sabnzbd/skintext.py
msgid "February"
msgstr "Februari"
#: sabnzbd/skintext.py
msgid "March"
msgstr "Maart"
#: sabnzbd/skintext.py
msgid "April"
msgstr "April"
#: sabnzbd/skintext.py
msgid "May"
msgstr "Mei"
#: sabnzbd/skintext.py
msgid "June"
msgstr "Juni"
#: sabnzbd/skintext.py
msgid "July"
msgstr "Juli"
#: sabnzbd/skintext.py
msgid "August"
msgstr "Augustus"
#: sabnzbd/skintext.py
msgid "September"
msgstr "September"
#: sabnzbd/skintext.py
msgid "October"
msgstr "Oktober"
#: sabnzbd/skintext.py
msgid "November"
msgstr "November"
#: sabnzbd/skintext.py
msgid "December"
msgstr "December"
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Dag van de maand"
@@ -2763,6 +2854,39 @@ msgstr ""
"Lijst van extensies die na downloaden verwijderd moeten worden.<br "
"/>Voorbeeld: <b>nfo</b> of <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr "Geschiedenis Bewaren"
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
"Automatisch verwijderen van voltooide downloads. Let er op dat Dubbele "
"Opdracht Detectie en andere externe tools Geschiedenis informatie nodig "
"hebben."
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr "Behoud alle downloads"
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr "Maximum aantal voltooide downloads"
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr "Behoud voltooide downloads maximaal aantal dagen"
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr "Behoud geen enkele download"
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr "Downloads"
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Opslaan"
@@ -2791,10 +2915,6 @@ msgstr ""
"Help ons om SABnzbd in jouw taal te vertalen! <br/>Met nieuwe vertalingen of "
"verbeteringen kun je hier terecht:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-sleutel"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
@@ -3098,14 +3218,18 @@ msgstr ""
"Detecteer identieke afleveringen in series (gebaseerd op "
"\"naam/seizoen/aflevering\" in opdrachten in je Geschiedenis)."
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Verwerpen"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr "Keur opdracht af"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr "Label download"
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Afbreken"
@@ -3158,6 +3282,19 @@ msgid "Some servers provide an alternative NZB when a download fails."
msgstr ""
"Sommige indexers hebben een alternatieve NZB wanneer een download mislukt"
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr "Gebruik indexer informatie"
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
"Maak tijdens het sorteren gebruik van informatie van de indexer zoals titel, "
"seizoen, aflevering, enz. Anders wordt alle informatie uit de naam van de "
"download gehaald."
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Gebruik tijdelijke mapnamen"
@@ -3180,7 +3317,7 @@ msgstr "Wordt uitgevoerd vóór een NZB de wachtrij in gaat"
#: sabnzbd/skintext.py
msgid "Extra PAR2 Parameters"
msgstr "Extra PAR2 parameters:"
msgstr "Extra PAR2 parameters"
#: sabnzbd/skintext.py
msgid "Nice Parameters"
@@ -3391,20 +3528,11 @@ msgstr "Sta integratie met index websites toe"
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
"report to the indexer if a job couldn't be completed."
msgstr ""
"Indexers kunnen waarderingsinformatie leveren wanneer een NZB wordt "
"opgehaald. SABnzbd kan mislukte downloads aanmelden bij de indexer. Sommige "
"indexers hebben een API sleutel nodig."
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
"Deze sleutel is voor je identificatie door de indexer. Kijk in je profiel op "
"de website van de indexer."
"Indexers kunnen beoordelingen meesturen wanneer een opdracht wordt "
"toegevoegd en SABnzbd kan de indexer informeren wanneer een download niet "
"slaagt."
#: sabnzbd/skintext.py
msgid "Enable Filtering"
@@ -3766,10 +3894,6 @@ msgstr "Growl meldingen activeren"
msgid "Send notifications to Growl"
msgstr "Zend meldingen naar Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Server adres"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr ""
@@ -4180,7 +4304,7 @@ msgstr "Bewerk NZB Details"
msgid "Delete"
msgstr "Verwijder"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Boven"
@@ -4192,7 +4316,7 @@ msgstr "Hoger"
msgid "Down"
msgstr "Lager"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Onder"
@@ -4324,6 +4448,10 @@ msgstr "Laden"
msgid "articles"
msgstr "artikelen"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Naam"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Wachtrij reparatie"
@@ -4824,7 +4952,7 @@ msgstr "Hernoemen van gelijkaardig bestand %s naar %s mislukt"
msgid "Server name does not resolve"
msgstr "Servernaam niet te vinden"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Geen toegangsrechten"
@@ -5099,9 +5227,6 @@ msgstr "URL ophalen mislukt; %s"
#~ msgid "Pause for 24 hours"
#~ msgstr "Pauzeer 24 uur"
#~ msgid "Rename"
#~ msgstr "Naam"
#~ msgid "Left"
#~ msgstr "Over"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -100,7 +100,7 @@ msgid "Error"
msgstr "Błąd"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd został wyłączony"
@@ -423,12 +423,36 @@ msgstr "Źle zbudowany artykuł yEnc w %s"
msgid "Unknown Error while decoding %s"
msgstr "Nieznany błąd podczas dekodowania %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr ""
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => nie znaleziono na żadnym serwerze, porzucam"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Ukończone"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Rozpakowano %s plików/katalogów w %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
@@ -629,7 +653,7 @@ msgstr ""
"Brak danych uwierzytelniających, wprowadź nazwę użytkownika/hasło z sekcji "
"Konfiguracja->Ogólne do zewnętrznego programu:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -803,8 +827,6 @@ msgstr "[%s] Błąd \"%s\" podczas rozpakowywania plików RAR"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Błąd \"%s\" podczas uruchamiania rar_unpack na %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -887,10 +909,6 @@ msgstr "Bezużyteczny plik RAR"
msgid "Corrupt RAR file"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Rozpakowano %s plików/katalogów w %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s plików w %s"
@@ -993,6 +1011,11 @@ msgstr "Naprawianie"
msgid "[%s] Repaired in %s"
msgstr "[%s] Naprawiono w %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -1000,19 +1023,15 @@ msgstr "Dysk pełny"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Weryfikowanie"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Sprawdzanie"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1072,7 +1091,7 @@ msgid "Not available"
msgstr "Niedostępne"
#: sabnzbd/notifier.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"
@@ -1166,7 +1185,7 @@ msgstr "Ignoruję zduplikowany NZB \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1174,6 +1193,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Wstrzymuję zduplikowany NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Przerwano, nie można ukończyć"
@@ -1273,7 +1298,7 @@ msgid "Limit Speed"
msgstr "Ogranicz prędkość"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Wstrzymaj"
@@ -1489,10 +1514,6 @@ msgstr "Pobieranie może się nie udać, dostępne jedynie %s z wymaganych %s"
msgid "Download failed - Not on your server(s)"
msgstr "Pobieranie nieudane - Dane niedostępne na skonfigurowanych serwerach"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Nie można utworzyć ostatecznego katalogu %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr ""
@@ -1558,6 +1579,10 @@ msgstr "Błąd usuwania katalogu roboczego (%s)"
msgid "Download Completed"
msgstr "Zakończono pobieranie"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Nie można utworzyć ostatecznego katalogu %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Przetwarzanie końcowe"
@@ -1618,6 +1643,20 @@ msgstr "Wyłączenie systemu nie powiodło się"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Identyfikator indeksera (%s) nie został znaleziony w pliku ocen"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Adres serwera"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Klucz API"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Nieprawidłowy opis kanału RSS \"%s\""
@@ -1704,10 +1743,6 @@ msgstr "Serwery"
msgid "Failure"
msgstr "Niepowodzenie"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Ukończone"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Nieudane"
@@ -1916,6 +1951,54 @@ msgstr "Miesiąc"
msgid "Year"
msgstr "Rok"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Dzień miesiąca"
@@ -2733,6 +2816,36 @@ msgstr ""
"Lista rozszerzeń plików, które mają zostać usunięte po pobraniu.<br />Na "
"przykład: <b>nfo</b> lub <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Zapisz zmiany"
@@ -2759,10 +2872,6 @@ msgid ""
"improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Klucz API"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "Ten klucz umożliwi innym programom dostęp do SABnzbd"
@@ -3064,14 +3173,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Odrzuć"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Przerwij"
@@ -3126,6 +3239,16 @@ msgstr ""
"Niektóre serwery udostępniają alternatywne NZB, kiedy pobieranie kończy się "
"niepowodzeniem"
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Włącz zmianę nazw katalogów"
@@ -3354,14 +3477,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3713,10 +3829,6 @@ msgstr "Włącz Growl"
msgid "Send notifications to Growl"
msgstr "Wysyłaj powiadomienia Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Adres serwera"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Tylko dla zdalnych serwerów Growl (host:port)"
@@ -4121,7 +4233,7 @@ msgstr "Edytuj szczegóły NZB"
msgid "Delete"
msgstr "Usuń"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Na górę"
@@ -4133,7 +4245,7 @@ msgstr "Wyżej"
msgid "Down"
msgstr "Niżej"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Na dół"
@@ -4266,6 +4378,10 @@ msgstr "Ładowanie"
msgid "articles"
msgstr "artykułów"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Zmień nazwę"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Naprawa kolejki"
@@ -4763,7 +4879,7 @@ msgstr "Nie udało się zmienić nazwy podobnego pliku %s na %s"
msgid "Server name does not resolve"
msgstr "Nie udało się rozwiązać nazwy serwera"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Dostęp zabroniony"
@@ -5020,9 +5136,6 @@ msgstr "Pobieranie URL nie powiodło się; %s"
#~ msgid "Storage"
#~ msgstr "Miejsce"
#~ msgid "Rename"
#~ msgstr "Zmień nazwę"
#~ msgid "Plush Options"
#~ msgstr "Opcje Plush"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:02+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -104,7 +104,7 @@ msgid "Error"
msgstr "Erro"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "Encerramento do SABnzbd concluído"
@@ -425,12 +425,36 @@ msgstr "Artigo yEnc mal formado em %s"
msgid "Unknown Error while decoding %s"
msgstr "Erro desconhecido ao decodificar %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr ""
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => faltando em todos os servidores. Descartando"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Concluído"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Descompactados %s arquivos/pastas em %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
@@ -630,7 +654,7 @@ msgstr ""
"Autenticação faltando. Por favor insira usuário/senha de Configuração->Geral "
"em seu programa de terceiros:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -803,8 +827,6 @@ msgstr "[%s] Erro \"%s\" ao descompactar os arquivos RAR"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Erro \"%s\" ao executar rar_unpack em %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -887,10 +909,6 @@ msgstr "Arquivo RAR inutilizável"
msgid "Corrupt RAR file"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Descompactados %s arquivos/pastas em %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s arquivos em %s"
@@ -990,6 +1008,11 @@ msgstr "Reparando"
msgid "[%s] Repaired in %s"
msgstr "[%s] Reparado em %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -997,19 +1020,15 @@ msgstr "Disco cheio"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Verificando"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Verificando"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1069,7 +1088,7 @@ msgid "Not available"
msgstr "Não disponível"
#: sabnzbd/notifier.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"
@@ -1163,7 +1182,7 @@ msgstr "Ignorando NZB duplicado \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1171,6 +1190,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pausando NZB duplicado \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Cancelado, não é possível concluir"
@@ -1270,7 +1295,7 @@ msgid "Limit Speed"
msgstr "Limitar Velocidade"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Pausar"
@@ -1488,10 +1513,6 @@ msgstr ""
msgid "Download failed - Not on your server(s)"
msgstr "O download falhou - Não está em seu(s) servidor(s)"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Não é possível criar a pasta final %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Sem pós-processamento por causa de falha na verificação"
@@ -1556,6 +1577,10 @@ msgstr "Erro ao remover a pasta de trabalho (%s)"
msgid "Download Completed"
msgstr "Download concluído"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Não é possível criar a pasta final %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Pós-processamento"
@@ -1616,6 +1641,20 @@ msgstr "Erro ao desligar o sistema"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Indexador id (%s) não foi encontrador para avaliar arquivos"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Endereço do servidor"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Chave API"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Descrição de feed RSS incorreta \"%s\""
@@ -1703,10 +1742,6 @@ msgstr "Servidores"
msgid "Failure"
msgstr "Falha"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Concluído"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Falhou"
@@ -1915,6 +1950,54 @@ msgstr "Mês"
msgid "Year"
msgstr "Ano"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Dia do mês"
@@ -2732,6 +2815,36 @@ msgstr ""
"Lista de extensões de arquivo que devem ser excluídos após o download.<br "
"/>Por exemplo: <b>nfo</b> ou <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Salvar Alterações"
@@ -2758,10 +2871,6 @@ msgid ""
"improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Chave API"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "Esta chave dará a programas de terceiros pleno acesso ao SABnzbd."
@@ -3064,14 +3173,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Descartar"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Cancelar"
@@ -3124,6 +3237,16 @@ msgid "Some servers provide an alternative NZB when a download fails."
msgstr ""
"Alguns servidores fornecem um NZB alternativo quando um download falha."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Habilitar renomeação de pasta"
@@ -3351,14 +3474,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3711,10 +3827,6 @@ msgstr "Habilitar Growl"
msgid "Send notifications to Growl"
msgstr "Enviar notificações ao Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Endereço do servidor"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Utilize apenas para servidor remoto Growl (host: porta)"
@@ -4119,7 +4231,7 @@ msgstr "Editar Detalhes do NZB"
msgid "Delete"
msgstr "Eliminar"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Topo"
@@ -4131,7 +4243,7 @@ msgstr "Para cima"
msgid "Down"
msgstr "Para baixo"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Base"
@@ -4264,6 +4376,10 @@ msgstr "Carregando"
msgid "articles"
msgstr "artigos"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Renomear"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Reparação da fila"
@@ -4763,7 +4879,7 @@ msgstr "Falha ao renomear arquivo similar: %s para %s"
msgid "Server name does not resolve"
msgstr "Nome de servidor não encontrado"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Acesso não autorizado"
@@ -5202,9 +5318,6 @@ msgstr "A busca da URL falhou; %s"
#~ msgid "Left"
#~ msgstr "Restantes"
#~ msgid "Rename"
#~ msgstr "Renomear"
#~ msgid "Open Source URL"
#~ msgstr "Abrir URL de Origem"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -104,7 +104,7 @@ msgid "Error"
msgstr "Eroare"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "Închidere SABnzbd terminată"
@@ -427,12 +427,36 @@ msgstr "Articoul yEnc invalid în %s"
msgid "Unknown Error while decoding %s"
msgstr "Eroare Necunoscută în timpul decodării %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr ""
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => lipsă de pe toate serverele, ignorare"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Finalizat"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Dezarhivat %s fişierele/dosarele în %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
@@ -632,7 +656,7 @@ msgstr ""
"Autentificare lipsă, vă rugăm să introduceţi numele de utilizator/parola de "
"la Configurare->General în programul dumneavoastră terţ:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -806,8 +830,6 @@ msgstr "[%s] Eroare \"%s\" în timpul dezarhivării fişierelor RAR"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Eroare \"%s\" în timpul rar_unpack a %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -890,10 +912,6 @@ msgstr "Fișier RAR ce poate fi folosit"
msgid "Corrupt RAR file"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Dezarhivat %s fişierele/dosarele în %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s fişiere în %s"
@@ -994,6 +1012,11 @@ msgstr "Se repară"
msgid "[%s] Repaired in %s"
msgstr "[%s] Reparat în %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -1001,19 +1024,15 @@ msgstr "Disc plin"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Se verifică"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Se verifică"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1073,7 +1092,7 @@ msgid "Not available"
msgstr "Indisponibil"
#: sabnzbd/notifier.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ă"
@@ -1168,7 +1187,7 @@ msgstr "Ignorăm duplicat NZB \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1176,6 +1195,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Întrerupem duplicat NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Anulat nu poate fi finalizat"
@@ -1275,7 +1300,7 @@ msgid "Limit Speed"
msgstr "Limitare de Viteză"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Pauză"
@@ -1494,10 +1519,6 @@ msgstr "Descărcarea ar putea eşua, doar %s din %s disponibil"
msgid "Download failed - Not on your server(s)"
msgstr "Descărcare euată, - Nu este pe serverul(ele) dumneavoastră"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Nu pot crea dosar final %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Nici o post-procesare din cauza verificării nereuşite"
@@ -1562,6 +1583,10 @@ msgstr "Eroare ştergere dosar curent (%s)"
msgid "Download Completed"
msgstr "Descărcare terminată"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Nu pot crea dosar final %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Post-procesare"
@@ -1622,6 +1647,20 @@ msgstr "Eroare la oprirea sistemului"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Id-ul indexului (%s) nu a fost găsit pentru fișierul de rating"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Adresă server"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Cheie API"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Descriere flux RSS incorectă \"%s\""
@@ -1708,10 +1747,6 @@ msgstr "Servere"
msgid "Failure"
msgstr "Nereuşit"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Finalizat"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Nereuşit"
@@ -1920,6 +1955,54 @@ msgstr "Lună"
msgid "Year"
msgstr "An"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Zi din lună"
@@ -2737,6 +2820,36 @@ msgstr ""
"Listă de extensii fișiere ce trebuie să fie șterse după descărcare.<br />De "
"exemplu: <b>nfo</b> or <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Salvează Modificările"
@@ -2763,10 +2876,6 @@ msgid ""
"improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Cheie API"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "Această cheie va oferi programelor terţe acces deplin la SABnzbd."
@@ -3065,14 +3174,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Ignoră"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Renunță"
@@ -3123,6 +3236,16 @@ msgstr "La eroare, încearcă NZB alternativ"
msgid "Some servers provide an alternative NZB when a download fails."
msgstr "Unele server oferă o alternativă dacă un NZB eșuează."
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Activează redenumire dosar"
@@ -3353,14 +3476,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3716,10 +3832,6 @@ msgstr "Activează Growl"
msgid "Send notifications to Growl"
msgstr "Trimite notificări Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Adresă server"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Foloseşte doar pentru server Growl de la distanţă (gazdă:port)"
@@ -4123,7 +4235,7 @@ msgstr "Editează Detalii NZB"
msgid "Delete"
msgstr "Şterge"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Vârf"
@@ -4135,7 +4247,7 @@ msgstr "Sus"
msgid "Down"
msgstr "Jos"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Coadă"
@@ -4267,6 +4379,10 @@ msgstr "Se încarcă"
msgid "articles"
msgstr "articole"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Redenumește"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Coadă reparare"
@@ -4769,7 +4885,7 @@ msgstr "Redenumire fişiere similare : %s în %s nereuşită"
msgid "Server name does not resolve"
msgstr "Numele de server nu se rezolvă la DNS"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Acces neautorizat"
@@ -5183,9 +5299,6 @@ msgstr "Descărcare URL nereuşită; %s"
#~ msgid "Storage"
#~ msgstr "Stocare"
#~ msgid "Rename"
#~ msgstr "Redenumește"
#~ msgid "Plush Options"
#~ msgstr "Opţiuni Plush"

View File

@@ -2,15 +2,15 @@ msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.7.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"Generated-By: pygettext.py 1.5\n"
#: SABnzbd.py [Error message]
@@ -100,7 +100,7 @@ msgid "Error"
msgstr ""
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "Завершение работы SABnzbd закончено"
@@ -416,12 +416,36 @@ msgstr "Неверно сформированная статья yEnc в %s"
msgid "Unknown Error while decoding %s"
msgstr "Неизвестная ошибка декодирования %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr ""
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => отсутствует на всех серверах, отброшен"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Завершено"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Распаковка %s файлов или папок в %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
@@ -622,7 +646,7 @@ msgstr ""
"Отсутствуют учётные данные. Введите в сторонней программе имя пользователя и "
"пароль из раздела «Настройка -> Общие»:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -793,8 +817,6 @@ msgstr "[%s] Ошибка распаковки RAR-файлов: %s"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Ошибка «%s» выполнения rar_unpack для %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -877,10 +899,6 @@ msgstr ""
msgid "Corrupt RAR file"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Распаковка %s файлов или папок в %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s файлов в %s"
@@ -982,6 +1000,11 @@ msgstr "Исправление"
msgid "[%s] Repaired in %s"
msgstr "[%s] Исправлено за %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -989,19 +1012,15 @@ msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Проверка"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Проверка"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1061,7 +1080,7 @@ msgid "Not available"
msgstr ""
#: sabnzbd/notifier.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 ""
@@ -1153,7 +1172,7 @@ msgstr "Пропущен повторяющийся NZB-файл «%s»"
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1161,6 +1180,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Приостановлен повторяющийся NZB-файл «%s»"
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr ""
@@ -1260,7 +1285,7 @@ msgid "Limit Speed"
msgstr "Ограничение скорости"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Приостановить"
@@ -1480,10 +1505,6 @@ msgstr ""
msgid "Download failed - Not on your server(s)"
msgstr ""
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Не удаётся создать конечную папку %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Отмена пост-обработка из-за ошибки проверки"
@@ -1548,6 +1569,10 @@ msgstr "Не удалось удалить рабочий каталог (%s)"
msgid "Download Completed"
msgstr "Загрузка завершена"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Не удаётся создать конечную папку %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Пост-обработка"
@@ -1608,6 +1633,20 @@ msgstr "Не удалось завершить работу системы"
msgid "Indexer id (%s) not found for ratings file"
msgstr ""
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Адрес сервера"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Ключ API"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Неправильное описание RSS-ленты «%s»"
@@ -1694,10 +1733,6 @@ msgstr "Серверы"
msgid "Failure"
msgstr "Сбой"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Завершено"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Ошибка"
@@ -1906,6 +1941,54 @@ msgstr "Месяц"
msgid "Year"
msgstr "Год"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "День месяца"
@@ -2719,6 +2802,36 @@ msgid ""
"example: <b>nfo</b> or <b>nfo, sfv</b>"
msgstr ""
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Сохранить изменения"
@@ -2745,10 +2858,6 @@ msgid ""
"improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "Ключ API"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr ""
@@ -3047,14 +3156,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Отменить"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr ""
@@ -3102,6 +3215,16 @@ msgstr ""
msgid "Some servers provide an alternative NZB when a download fails."
msgstr ""
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Переименовывать папки"
@@ -3328,14 +3451,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3694,10 +3810,6 @@ msgstr "Использовать Growl"
msgid "Send notifications to Growl"
msgstr "Отправлять уведомления в Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Адрес сервера"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Используется только для удалённого сервера Growl (адрес:порт)"
@@ -4101,7 +4213,7 @@ msgstr "Изменить данные NZB"
msgid "Delete"
msgstr "Удалить"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "В начало"
@@ -4113,7 +4225,7 @@ msgstr "Вверх"
msgid "Down"
msgstr "Вниз"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "В конец"
@@ -4245,6 +4357,10 @@ msgstr ""
msgid "articles"
msgstr ""
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Переименовать"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Исправление очереди"
@@ -4746,7 +4862,7 @@ msgstr "Не удалось переименовать похожий файл:
msgid "Server name does not resolve"
msgstr ""
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr ""
@@ -5202,9 +5318,6 @@ msgstr "Не удалось загрузить URL: %s"
#~ msgid "Pause for 24 hours"
#~ msgstr "Приостановить на 24 часа"
#~ msgid "Rename"
#~ msgstr "Переименовать"
#~ msgid "Left"
#~ msgstr "осталось"

View File

@@ -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-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -102,7 +102,7 @@ msgid "Error"
msgstr "Грeшкa"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "Гашење SABnzbd је завршено"
@@ -420,12 +420,36 @@ msgstr "Лоше формиран yEnc артикал у %s"
msgid "Unknown Error while decoding %s"
msgstr "Nepoznata greška pri dešifrovanju %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr ""
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => фали на свим серверима, одбацивање"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Завршено"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Издвојено %s датотека/фасцикла у %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
@@ -622,7 +646,7 @@ msgstr ""
"Недостаје аутентификација, унети у спољни програм име/лозинку из Подешавања-"
">Опште:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -795,8 +819,6 @@ msgstr "[%s] Greška \"%s\" pri raspakivanju RAR datoteka"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Грешка \"%s\" док сам радио 'rar_unpack' на %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -879,10 +901,6 @@ msgstr "Neupotrebljiva RAR datoteka"
msgid "Corrupt RAR file"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Издвојено %s датотека/фасцикла у %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s датотека у %s"
@@ -983,6 +1001,11 @@ msgstr "Поправљање"
msgid "[%s] Repaired in %s"
msgstr "[%s] Поправљено за %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -990,19 +1013,15 @@ msgstr "Диск је пун"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Проверавање"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Провера"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1062,7 +1081,7 @@ msgid "Not available"
msgstr "Недоступно"
#: sabnzbd/notifier.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"
@@ -1154,7 +1173,7 @@ msgstr "Игнорисање дуплог NZB-а \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1162,6 +1181,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Паузирам због дуплог NZB-а \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Поништено, не може да се заврши"
@@ -1261,7 +1286,7 @@ msgid "Limit Speed"
msgstr "Ограничење брзине"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Пауза"
@@ -1474,10 +1499,6 @@ msgstr "Преузимање је можда погрешно. има %s од п
msgid "Download failed - Not on your server(s)"
msgstr "Неуспешно преузимање - није на вашем серверу"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Немогуће креирање фасцикле %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Нема пост-процесирање пошто провера није успела"
@@ -1542,6 +1563,10 @@ msgstr "Грешка у брисању радне фасцикле (%s)"
msgid "Download Completed"
msgstr "Преузимање завршено"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Немогуће креирање фасцикле %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Пост-процесирање"
@@ -1602,6 +1627,20 @@ msgstr "Greška pri gašenju sistema"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Indekser id (%s) nije pronađen za datoteku ocenjivanja"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Адреса сервера"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API кључ"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Погрешан опис RSS фида \"%s\""
@@ -1688,10 +1727,6 @@ msgstr "Сервери"
msgid "Failure"
msgstr "Грешка"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Завршено"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Неуспешно"
@@ -1900,6 +1935,54 @@ msgstr "Месец"
msgid "Year"
msgstr "Година"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Дан у месецу"
@@ -2711,6 +2794,36 @@ msgstr ""
"Листа ектензије за брисање после преузимања.<br />На пример: <b>nfo</b> или "
"<b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Сачувај промене"
@@ -2737,10 +2850,6 @@ msgid ""
"improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API кључ"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "Овај кључ допушта пун приступ SABnzbd-а другим програмима."
@@ -3040,14 +3149,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Одбаци"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Прекини"
@@ -3098,6 +3211,16 @@ msgstr "U slučaju neuspeha, pokušaj sa alternativnim NZB-om"
msgid "Some servers provide an alternative NZB when a download fails."
msgstr "Neki serveri nude alternativni NZB pri neuspešnom preuzimanju"
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Упали преименовање фасцикле"
@@ -3322,14 +3445,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3680,10 +3796,6 @@ msgstr "Упали „Growl“"
msgid "Send notifications to Growl"
msgstr "Пошаљи обавештења у „Growl“"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Адреса сервера"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Користи само удаљен „Growl“ сервер (хост:порт)"
@@ -4087,7 +4199,7 @@ msgstr "Уреди детаље NZB-а"
msgid "Delete"
msgstr "Обриши"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Врх"
@@ -4099,7 +4211,7 @@ msgstr "Горе"
msgid "Down"
msgstr "Доле"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Дно"
@@ -4232,6 +4344,10 @@ msgstr "Учитавам"
msgid "articles"
msgstr "artikli"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "Преименуј"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Поправљење реда"
@@ -4729,7 +4845,7 @@ msgstr "Неуспешно преименовање сличне датотек
msgid "Server name does not resolve"
msgstr "Ime servera se ne može odrediti"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Neautorizovan pristup"
@@ -4804,9 +4920,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "Plush Options"
#~ msgstr "Опције Plush"
#~ msgid "Rename"
#~ msgstr "Преименуј"
#~ msgid "Pause for 12 hours"
#~ msgstr "Паузирај 12 сати"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:01+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -102,7 +102,7 @@ msgid "Error"
msgstr "Fel"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd nedstängning utförd."
@@ -421,12 +421,36 @@ msgstr "Felaktigt utformad yEnc artikel i %s"
msgid "Unknown Error while decoding %s"
msgstr "Okänt fel under avkodning av %s"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr ""
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => saknas från alla servrar, kastar"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Färdig"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Uppackad %s filer/mappar i %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
@@ -625,7 +649,7 @@ msgstr ""
"Autentisering saknas, ange användarnamn / lösenord från Konfiguration-> "
"Allmänt i ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -799,8 +823,6 @@ msgstr "[%s] Fel \"%s\" under uppackning av RAR fil(er)"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "Fel \"%s\" när du kör rar_unpack på %s"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -883,10 +905,6 @@ msgstr "Oanvändbar RAR-fil"
msgid "Corrupt RAR file"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "Uppackad %s filer/mappar i %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s filer i %s"
@@ -988,6 +1006,11 @@ msgstr "Reparerar"
msgid "[%s] Repaired in %s"
msgstr "[%s] Reparerad i %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -995,19 +1018,15 @@ msgstr "Disken är full"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "Verifierar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "Kontrollerar"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
@@ -1067,7 +1086,7 @@ msgid "Not available"
msgstr "Ej tillgänglig"
#: sabnzbd/notifier.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"
@@ -1159,7 +1178,7 @@ msgstr "Ignorerar dubblett för NZB \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr ""
@@ -1167,6 +1186,12 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pausar dubblett för NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Avbrutet, kan inte slutföras"
@@ -1266,7 +1291,7 @@ msgid "Limit Speed"
msgstr "Hastighetsbegränsning"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "Pausa"
@@ -1485,10 +1510,6 @@ msgstr ""
msgid "Download failed - Not on your server(s)"
msgstr "Nerladdning misslyckades - Inte på din server eller servrar"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "Kan inte skapa slutgiltig mapp %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "Ingen efterbehandling på grund av misslyckad verifiering"
@@ -1553,6 +1574,10 @@ msgstr "Det gick inte att ta bort arbetsmapp (%s)"
msgid "Download Completed"
msgstr "Hämtningen slutfördes"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "Kan inte skapa slutgiltig mapp %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "Efterbehandling"
@@ -1613,6 +1638,20 @@ msgstr "Fel uppstod då systemet skulle stängas"
msgid "Indexer id (%s) not found for ratings file"
msgstr "Index id (%s) inte hittad för betygsfil"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Serveradress"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-nyckel"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr ""
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "Felaktigt RSS-flödesbeskrivning \"%s\""
@@ -1699,10 +1738,6 @@ msgstr "Servrar"
msgid "Failure"
msgstr "Misslyckades"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "Färdig"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "Misslyckades"
@@ -1911,6 +1946,54 @@ msgstr "Månad"
msgid "Year"
msgstr "År"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "Månadsdag"
@@ -2725,6 +2808,36 @@ msgstr ""
"Lista av filändelser som skall bli borttagna efter nerladdning.<br/> Till "
"exempel: <b>nfo</b> or <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "Spara ändringar"
@@ -2751,10 +2864,6 @@ msgid ""
"improved existing translations here:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API-nyckel"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "Denna nyckel ger tredjepartsprogram full tillgång till SABnzbd."
@@ -3052,14 +3161,18 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Kasta"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "Avbryt"
@@ -3111,6 +3224,16 @@ msgid "Some servers provide an alternative NZB when a download fails."
msgstr ""
"Vissa servrar kan förse en alternativ NZB när en nerladdning misslyckas"
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "Döp om mappar"
@@ -3336,14 +3459,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
"report to the indexer if a job couldn't be completed."
msgstr ""
#: sabnzbd/skintext.py
@@ -3695,10 +3811,6 @@ msgstr "Aktivera Growl"
msgid "Send notifications to Growl"
msgstr "Skicka notis till Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "Serveradress"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "Använd endast för extern Growl.server (host:port)"
@@ -4102,7 +4214,7 @@ msgstr "Ändra NZB detaljer"
msgid "Delete"
msgstr "Ta bort"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "Topp"
@@ -4114,7 +4226,7 @@ msgstr "Upp"
msgid "Down"
msgstr "Ner"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "Botten"
@@ -4246,6 +4358,10 @@ msgstr "Laddar"
msgid "articles"
msgstr "artiklar"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "Köreparation"
@@ -4747,7 +4863,7 @@ msgstr "Det gick inte att döpa om liknande fil: %s till %s"
msgid "Server name does not resolve"
msgstr "Servernamn kunde inte läsas"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "Otillåten åtkomst"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-06-26 23:00+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-06-27 06:02+0000\n"
"X-Generator: Launchpad (build 18416)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -100,7 +100,7 @@ msgid "Error"
msgstr "错误"
#: SABnzbd.py # sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/osxmenu.py
#: sabnzbd/osxmenu.py # sabnzbd/wizard.py
msgid "SABnzbd shutdown finished"
msgstr "SABnzbd 关闭完成"
@@ -415,13 +415,37 @@ msgstr "yEnc 文章格式错误:%s"
msgid "Unknown Error while decoding %s"
msgstr "解码 %s 时发生未知错误"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "检测到 UUencode但是仅有 yEnc 编码受支持 [%s]"
#: sabnzbd/decoder.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => 所有服务器均缺失,正在舍弃"
#: sabnzbd/decoder.py
msgid "UUencode detected, only yEnc encoding is supported [%s]"
msgstr "检测到 UUencode但是仅有 yEnc 编码受支持 [%s]"
#: sabnzbd/directunpacker.py # sabnzbd/directunpacker.py
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
#: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status]
#: sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "完成"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "已解压 %s 个文件/文件夹,耗时 %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py
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 [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
@@ -612,7 +636,7 @@ msgid ""
"into your 3rd party program:"
msgstr "缺身份认证信息,请在第三方程序中输入“配置”->“常规”中的用户名/密码:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -782,8 +806,6 @@ msgstr "[%s] \"%s\" 解压 RAR 文件时出错"
msgid "Error \"%s\" while running rar_unpack on %s"
msgstr "出现错误 \"%s\",正对 %s 执行 rar_unpack 操作"
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
#: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py [Warning message]
@@ -866,10 +888,6 @@ msgstr "无法使用的 RAR 文件"
msgid "Corrupt RAR file"
msgstr "损坏的 RAR 文件"
#: sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "已解压 %s 个文件/文件夹,耗时 %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "%s files in %s"
msgstr "%s 个文件,耗时 %s"
@@ -968,6 +986,11 @@ msgstr "正在修复"
msgid "[%s] Repaired in %s"
msgstr "[%s] 已修复,耗时 %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/notifier.py [Notification]
msgid "Disk full"
@@ -975,19 +998,15 @@ msgstr "磁盘空间已满"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Verifying"
msgstr "正在验证"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/skintext.py [PP status]
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
msgstr "正在检查"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
msgstr ""
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Python 脚本 \"%s\" 不具有执行 (+x) 权限"
@@ -1047,7 +1066,7 @@ msgid "Not available"
msgstr "不可用"
#: sabnzbd/notifier.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 "无法发送,缺少必要的数据"
@@ -1139,7 +1158,7 @@ msgstr "正在忽略重复 NZB \"%s\""
msgid "Failing duplicate NZB \"%s\""
msgstr "失败于重复的 NZB 文件 \"%s\""
#: sabnzbd/nzbstuff.py
#: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message]
msgid "Duplicate NZB"
msgstr "重复的 NZB 文件"
@@ -1147,6 +1166,12 @@ msgstr "重复的 NZB 文件"
msgid "Pausing duplicate NZB \"%s\""
msgstr "正在暂停重复 NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "已中止,无法完成"
@@ -1246,7 +1271,7 @@ msgid "Limit Speed"
msgstr "限速"
#: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [#: Config->Scheduler] # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates]
#: sabnzbd/skintext.py [Config->Scheduling]
msgid "Pause"
msgstr "暂停"
@@ -1458,10 +1483,6 @@ msgstr "下载可能会失败,只有 %s 块 (需要 %s) 可用"
msgid "Download failed - Not on your server(s)"
msgstr "下载失败 - 不在该服务器上"
#: sabnzbd/postproc.py
msgid "Cannot create final folder %s"
msgstr "无法创建最终文件夹 %s"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "由于验证失败,未进行后期处理"
@@ -1526,6 +1547,10 @@ msgstr "移除工作目录出错 (%s)"
msgid "Download Completed"
msgstr "下载完成"
#: sabnzbd/postproc.py [Error message]
msgid "Cannot create final folder %s"
msgstr "无法创建最终文件夹 %s"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "后期处理"
@@ -1586,6 +1611,20 @@ msgstr "关闭系统时出错"
msgid "Indexer id (%s) not found for ratings file"
msgstr "评分文件的索引器 id (%s) 未找到"
#: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "服务器地址"
#: sabnzbd/rating.py # sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API Key"
#: sabnzbd/rating.py # sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr "这个密钥用来向服务器表明身份。查看您在索引网站上的个人档案。"
#: sabnzbd/rss.py [Error message] # sabnzbd/rss.py
msgid "Incorrect RSS feed description \"%s\""
msgstr "RSS feed 描述不正确 \"%s\""
@@ -1672,10 +1711,6 @@ msgstr "服务器"
msgid "Failure"
msgstr "失败"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status]
msgid "Completed"
msgstr "完成"
#: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py
msgid "Failed"
msgstr "失败"
@@ -1884,6 +1919,54 @@ msgstr "月"
msgid "Year"
msgstr "年"
#: sabnzbd/skintext.py
msgid "January"
msgstr ""
#: sabnzbd/skintext.py
msgid "February"
msgstr ""
#: sabnzbd/skintext.py
msgid "March"
msgstr ""
#: sabnzbd/skintext.py
msgid "April"
msgstr ""
#: sabnzbd/skintext.py
msgid "May"
msgstr ""
#: sabnzbd/skintext.py
msgid "June"
msgstr ""
#: sabnzbd/skintext.py
msgid "July"
msgstr ""
#: sabnzbd/skintext.py
msgid "August"
msgstr ""
#: sabnzbd/skintext.py
msgid "September"
msgstr ""
#: sabnzbd/skintext.py
msgid "October"
msgstr ""
#: sabnzbd/skintext.py
msgid "November"
msgstr ""
#: sabnzbd/skintext.py
msgid "December"
msgstr ""
#: sabnzbd/skintext.py
msgid "Day of month"
msgstr "每月特定一天"
@@ -2687,6 +2770,36 @@ msgid ""
"example: <b>nfo</b> or <b>nfo, sfv</b>"
msgstr "下载后应删除的文件扩展名列表。<br />例如: <b>nfo</b> 或 <b>nfo, sfv</b>"
#: sabnzbd/skintext.py
msgid "History Retention"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Automatically delete completed jobs from History. Beware that Duplicate "
"Detection and some external tools rely on History information."
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep all jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Jobs"
msgstr ""
#: sabnzbd/skintext.py
msgid "Save Changes"
msgstr "保存更改"
@@ -2713,10 +2826,6 @@ msgid ""
"improved existing translations here:"
msgstr "帮助我们来本地化 SABnzbd <br/>您可以在这里来添加未被翻译的文字或者改进现有的翻译:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "API Key"
msgstr "API Key"
#: sabnzbd/skintext.py
msgid "This key will give 3rd party programs full access to SABnzbd."
msgstr "该 key 将授予第三方程序 SABnzbd 的完整权限。"
@@ -2993,14 +3102,18 @@ msgid ""
"items in your History)"
msgstr "在剧目中检测相同的剧集 (基于您的历史项目,参照 \"name/season/episode\" 的规则)"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "舍弃"
#: sabnzbd/skintext.py [Three way switch for duplicates]
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Fail job (move to History)"
msgstr "失败的任务 (移动到历史)"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
msgstr "中止"
@@ -3048,6 +3161,16 @@ msgstr "失败时,尝试备用 NZB"
msgid "Some servers provide an alternative NZB when a download fails."
msgstr "部分服务器在下载失败时可提供备用 NZB 文件。"
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable folder rename"
msgstr "启用文件夹重命名"
@@ -3265,16 +3388,8 @@ msgstr "启用索引集成"
#: sabnzbd/skintext.py
msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed. Depending on your "
"indexer, the API key setting can be left blank."
"report to the indexer if a job couldn't be completed."
msgstr ""
"当任务添加时索引服务可提供评分信息。当任务无法完成时SABnzbd 也可发送报告给索引服务。有些时候 API 密钥设定可以留空,取决于索引服务的要求。"
#: sabnzbd/skintext.py
msgid ""
"This key provides identity to indexer. Check your profile on the indexer's "
"website."
msgstr "这个密钥用来向服务器表明身份。查看您在索引网站上的个人档案。"
#: sabnzbd/skintext.py
msgid "Enable Filtering"
@@ -3623,10 +3738,6 @@ msgstr "启用 Growl"
msgid "Send notifications to Growl"
msgstr "将通知发送到 Growl"
#: sabnzbd/skintext.py [Address of Growl server]
msgid "Server address"
msgstr "服务器地址"
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr "仅当使用远程 Growl 服务器时需要 (主机:端口)"
@@ -4029,7 +4140,7 @@ msgstr "编辑 NZB 详情"
msgid "Delete"
msgstr "删除"
#: sabnzbd/skintext.py [Job details page, move file to top]
#: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py
msgid "Top"
msgstr "置顶"
@@ -4041,7 +4152,7 @@ msgstr "上移"
msgid "Down"
msgstr "下移"
#: sabnzbd/skintext.py [Job details page, move file to bottom]
#: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py
msgid "Bottom"
msgstr "置底"
@@ -4173,6 +4284,10 @@ msgstr "正在加载"
msgid "articles"
msgstr "篇文章"
#: sabnzbd/skintext.py
msgid "Rename"
msgstr "重命名"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Queue repair"
msgstr "队列修复"
@@ -4666,7 +4781,7 @@ msgstr "重命名相似文件失败: %s 为 %s"
msgid "Server name does not resolve"
msgstr "服务器名无法解析"
#: sabnzbd/urlgrabber.py # sabnzbd/urlgrabber.py
#: sabnzbd/urlgrabber.py
msgid "Unauthorized access"
msgstr "未授权访问"
@@ -5102,9 +5217,6 @@ msgstr "URL 装取失败; %s"
#~ msgid "Pause for 24 hours"
#~ msgstr "暂停 24 小时"
#~ msgid "Rename"
#~ msgstr "重命名"
#~ msgid "Left"
#~ msgstr "剩余"

View File

@@ -108,7 +108,7 @@ import sabnzbd.lang as lang
import sabnzbd.api
import sabnzbd.directunpacker as directunpacker
from sabnzbd.decorators import synchronized, notify_downloader
from sabnzbd.constants import NORMAL_PRIORITY, VALID_ARCHIVES, GIGI, \
from sabnzbd.constants import NORMAL_PRIORITY, VALID_ARCHIVES, \
REPAIR_REQUEST, QUEUE_FILE_NAME, QUEUE_VERSION, QUEUE_FILE_TMPL
import sabnzbd.getipaddress as getipaddress
@@ -308,6 +308,7 @@ def initialize(pause_downloader=False, clean_up=False, evalSched=False, repair=0
if cfg.sched_converted() != 2:
cfg.schedules.set(['%s %s' % (1, schedule) for schedule in cfg.schedules()])
cfg.sched_converted.set(2)
config.save_config()
if check_repair_request():
repair = 2
@@ -597,27 +598,22 @@ def backup_nzb(filename, data):
def save_compressed(folder, filename, data):
""" Save compressed NZB file in folder """
# Need to go to the save folder to
# prevent the pathname being embedded in the GZ file
here = os.getcwd()
os.chdir(folder)
if filename.endswith('.nzb'):
filename += '.gz'
else:
filename += '.nzb.gz'
logging.info("Backing up %s", os.path.join(folder, filename))
try:
f = gzip.GzipFile(filename, 'wb')
f.write(data)
f.flush()
f.close()
# Have to get around the path being put inside the tgz
with open(os.path.join(folder, filename), 'wb') as tgz_file:
f = gzip.GzipFile(filename, fileobj=tgz_file)
f.write(data)
f.flush()
f.close()
except:
logging.error(T('Saving %s failed'), os.path.join(folder, filename))
logging.info("Traceback: ", exc_info=True)
os.chdir(here)
##############################################################################
# Unsynchronized methods
@@ -842,16 +838,6 @@ def keep_awake():
sleepless.allow_sleep()
def CheckFreeSpace():
""" Check if enough disk space is free, if not pause downloader and send email """
if cfg.download_free() and not sabnzbd.downloader.Downloader.do.paused:
if misc.diskspace(force=True)['download_dir'][1] < cfg.download_free.get_float() / GIGI:
logging.warning(T('Too little diskspace forcing PAUSE'))
# Pause downloader, but don't save, since the disk is almost full!
Downloader.do.pause(save=False)
emailer.diskfull()
################################################################################
# Data IO #
################################################################################
@@ -872,6 +858,7 @@ def get_new_id(prefix, folder, check_list=None):
except:
logging.error(T('Failure in tempfile.mkstemp'))
logging.info("Traceback: ", exc_info=True)
break
# Cannot create unique id, crash the process
raise IOError

View File

@@ -906,7 +906,7 @@ def _api_server_stats(name, output, kwargs):
stats['servers'] = {}
for svr in config.get_servers():
t, m, w, d = BPSMeter.do.amounts(svr)
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}
return report(output, keyword='', data=stats)

View File

@@ -30,13 +30,8 @@ from sabnzbd.constants import GIGI, ANFO
ARTICLE_LOCK = threading.Lock()
class ArticleCache(object):
""" Operations on lists/dicts are atomic enough that we
do not have to put locks. Only the cache-size needs
a lock since the integer needs to stay synced.
With less locking, the decoder and assembler do not
have to wait on each other.
"""
do = None
def __init__(self):
@@ -47,9 +42,11 @@ class ArticleCache(object):
self.__article_table = {} # Dict of buffered articles
ArticleCache.do = self
@synchronized(ARTICLE_LOCK)
def cache_info(self):
return ANFO(len(self.__article_list), abs(self.__cache_size), self.__cache_limit_org)
@synchronized(ARTICLE_LOCK)
def new_limit(self, limit):
""" Called when cache limit changes """
self.__cache_limit_org = limit
@@ -59,28 +56,23 @@ class ArticleCache(object):
self.__cache_limit = min(limit, GIGI)
@synchronized(ARTICLE_LOCK)
def increase_cache_size(self, value):
self.__cache_size += value
@synchronized(ARTICLE_LOCK)
def decrease_cache_size(self, value):
self.__cache_size -= value
def reserve_space(self, data):
""" Is there space left in the set limit? """
data_size = sys.getsizeof(data) * 64
self.increase_cache_size(data_size)
self.__cache_size += data_size
if self.__cache_size + data_size > self.__cache_limit:
return False
else:
return True
@synchronized(ARTICLE_LOCK)
def free_reserve_space(self, data):
""" Remove previously reserved space """
data_size = sys.getsizeof(data) * 64
self.decrease_cache_size(data_size)
self.__cache_size -= data_size
return self.__cache_size + data_size < self.__cache_limit
@synchronized(ARTICLE_LOCK)
def save_article(self, article, data):
nzf = article.nzf
nzo = nzf.nzo
@@ -98,6 +90,7 @@ class ArticleCache(object):
if self.__cache_limit:
if self.__cache_limit < 0:
self.__add_to_cache(article, data)
else:
data_size = len(data)
@@ -106,7 +99,7 @@ class ArticleCache(object):
# Flush oldest article in cache
old_article = self.__article_list.pop(0)
old_data = self.__article_table.pop(old_article)
self.decrease_cache_size(len(old_data))
self.__cache_size -= len(old_data)
# No need to flush if this is a refreshment article
if old_article != article:
self.__flush_article(old_article, old_data)
@@ -120,6 +113,7 @@ class ArticleCache(object):
else:
self.__flush_article(article, data)
@synchronized(ARTICLE_LOCK)
def load_article(self, article):
data = None
nzo = article.nzf.nzo
@@ -127,7 +121,7 @@ class ArticleCache(object):
if article in self.__article_list:
data = self.__article_table.pop(article)
self.__article_list.remove(article)
self.decrease_cache_size(len(data))
self.__cache_size -= len(data)
elif article.art_id:
data = sabnzbd.load_data(article.art_id, nzo.workpath, remove=True,
do_pickle=False, silent=True)
@@ -137,19 +131,21 @@ class ArticleCache(object):
return data
@synchronized(ARTICLE_LOCK)
def flush_articles(self):
self.__cache_size = 0
while self.__article_list:
article = self.__article_list.pop(0)
data = self.__article_table.pop(article)
self.__flush_article(article, data)
self.__cache_size = 0
@synchronized(ARTICLE_LOCK)
def purge_articles(self, articles):
for article in articles:
if article in self.__article_list:
self.__article_list.remove(article)
data = self.__article_table.pop(article)
self.decrease_cache_size(len(data))
self.__cache_size -= len(data)
if article.art_id:
sabnzbd.remove_data(article.art_id, article.nzf.nzo.workpath)
@@ -172,12 +168,11 @@ class ArticleCache(object):
def __add_to_cache(self, article, data):
if article in self.__article_table:
self.decrease_cache_size(len(self.__article_table[article]))
self.__cache_size -= len(self.__article_table[article])
else:
self.__article_list.append(article)
self.__article_table[article] = data
self.increase_cache_size(len(data))
self.__cache_size += len(data)
# Create the instance

View File

@@ -30,8 +30,8 @@ import hashlib
import sabnzbd
from sabnzbd.misc import get_filepath, sanitize_filename, get_unique_filename, renamer, \
set_permissions, long_path, clip_path, has_win_device, get_all_passwords
from sabnzbd.constants import Status
set_permissions, long_path, clip_path, has_win_device, get_all_passwords, diskspace
from sabnzbd.constants import Status, GIGI
import sabnzbd.cfg as cfg
from sabnzbd.articlecache import ArticleCache
from sabnzbd.postproc import PostProcessor
@@ -69,17 +69,31 @@ class Assembler(Thread):
nzo, nzf = job
if nzf:
sabnzbd.CheckFreeSpace()
# Check if enough disk space is free, if not pause downloader and send email
if diskspace(force=True)['download_dir'][1] < (cfg.download_free.get_float() + nzf.bytes) / GIGI:
# Only warn and email once
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.emailer.diskfull()
# Abort all direct unpackers, just to be sure
sabnzbd.directunpacker.abort_all()
filename = sanitize_filename(nzf.filename)
nzf.filename = filename
dupe = nzo.check_for_dupe(nzf)
filepath = get_filepath(long_path(cfg.download_dir.get_path()), nzo, filename)
# Place job back in queue and wait 30 seconds to hope it gets resolved
self.process(job)
sleep(30)
continue
# Prepare filename
nzo.verify_nzf_filename(nzf)
nzf.filename = sanitize_filename(nzf.filename)
filepath = get_filepath(long_path(cfg.download_dir.get_path()), nzo, nzf.filename)
if filepath:
logging.info('Decoding %s %s', filepath, nzf.type)
try:
filepath = self.assemble(nzf, filepath, dupe)
filepath = self.assemble(nzf, filepath)
except IOError, (errno, strerror):
# If job was deleted, ignore error
if not nzo.is_gone():
@@ -95,19 +109,23 @@ class Assembler(Thread):
logging.error(T('Fatal error in Assembler'), exc_info=True)
break
# Clean-up admin data
nzf.remove_admin()
setname = nzf.setname
if nzf.is_par2 and (nzo.md5packs.get(setname) is None):
pack = self.parse_par2_file(filepath, nzo.md5of16k)
if pack:
nzo.md5packs[setname] = pack
logging.debug('Got md5pack for set %s', setname)
# Valid md5pack, so use this par2-file as main par2 file for the set
if setname in nzo.partable:
# First copy the set of extrapars, we need them later
nzf.extrapars = nzo.partable[setname].extrapars
nzo.partable[setname] = nzf
# Parse par2 files
if nzf.is_par2:
# Always parse par2 files to get new md5of16k info
pack = self.parse_par2_file(nzf, filepath)
if pack and (nzo.md5packs.get(nzf.setname) is None):
nzo.md5packs[nzf.setname] = pack
logging.debug('Got md5pack for set %s', nzf.setname)
# Valid md5pack, so use this par2-file as main par2 file for the set
if nzf.setname in nzo.partable:
# First copy the set of extrapars, we need them later
nzf.extrapars = nzo.partable[nzf.setname].extrapars
nzo.partable[nzf.setname] = nzf
# Encryption and unwanted extension detection
rar_encrypted, unwanted_file = check_encrypted_and_unwanted_files(nzo, filepath)
if rar_encrypted:
if cfg.pause_on_pwrar() == 1:
@@ -146,15 +164,8 @@ class Assembler(Thread):
sabnzbd.nzbqueue.NzbQueue.do.remove(nzo.nzo_id, add_to_history=False, cleanup=False)
PostProcessor.do.process(nzo)
def assemble(self, nzf, path, dupe):
def assemble(self, nzf, path):
""" Assemble a NZF from its table of articles """
if os.path.exists(path):
unique_path = get_unique_filename(path)
if dupe:
path = unique_path
else:
renamer(path, unique_path)
md5 = hashlib.md5()
fout = open(path, 'ab')
decodetable = nzf.decodetable
@@ -185,7 +196,7 @@ class Assembler(Thread):
return path
def parse_par2_file(self, fname, table16k):
def parse_par2_file(self, nzf, fname):
""" Get the hash table and the first-16k hash table from a PAR2 file
Return as dictionary, indexed on names or hashes for the first-16 table
For a full description of the par2 specification, visit:
@@ -205,10 +216,11 @@ class Assembler(Thread):
name, hash, hash16k = parse_par2_file_packet(f, header)
if name:
table[name] = hash
if hash16k not in table16k:
table16k[hash16k] = name
else:
# Not unique, remove to avoid false-renames
if hash16k not in nzf.nzo.md5of16k:
nzf.nzo.md5of16k[hash16k] = name
elif nzf.nzo.md5of16k[hash16k] != name:
# Not unique and not already linked to this file
# Remove to avoid false-renames
duplicates16k.append(hash16k)
header = f.read(8)
@@ -225,10 +237,18 @@ class Assembler(Thread):
# Have to remove duplicates at the end to make sure
# no trace is left in case of multi-duplicates
for hash16k in duplicates16k:
if hash16k in table16k:
old_name = table16k.pop(hash16k)
if hash16k in nzf.nzo.md5of16k:
old_name = nzf.nzo.md5of16k.pop(hash16k)
logging.debug('Par2-16k signature of %s not unique, discarding', old_name)
# If the filename was changed (duplicate filename) check if we already have the set
base_fname = os.path.split(fname)[1]
if table and base_fname != nzf.filename and table not in nzf.nzo.md5packs.values():
# Re-parse this par2 file to create new set
nzf.filename = base_fname
nzf.is_par2 = False
nzf.nzo.handle_par2(nzf, True)
return table

View File

@@ -118,6 +118,9 @@ class BPSMeter(object):
self.month_total = {}
self.grand_total = {}
self.timeline_total = {}
self.day_label = time.strftime("%Y-%m-%d")
self.end_of_day = tomorrow(t) # Time that current day will end
self.end_of_week = next_week(t) # Time that current day will end
self.end_of_month = next_month(t) # Time that current month will end
@@ -136,7 +139,7 @@ class BPSMeter(object):
data = (self.last_update, self.grand_total,
self.day_total, self.week_total, self.month_total,
self.end_of_day, self.end_of_week, self.end_of_month,
self.quota, self.left, self.q_time
self.quota, self.left, self.q_time, self.timeline_total
)
sabnzbd.save_admin(data, BYTES_FILE_NAME)
@@ -171,12 +174,15 @@ class BPSMeter(object):
self.last_update, self.grand_total, \
self.day_total, self.week_total, self.month_total, \
self.end_of_day, self.end_of_week, self.end_of_month = data[:8]
if len(data) == 11:
self.quota, self.left, self.q_time = data[8:]
if len(data) >= 11:
self.quota, self.left, self.q_time = data[8:11]
logging.debug('Read quota q=%s l=%s reset=%s',
self.quota, self.left, self.q_time)
if abs(quota - self.quota) > 0.5:
self.change_quota()
# Get timeline stats
if len(data) == 12:
self.timeline_total = data[11]
else:
self.quota = self.left = cfg.quota_size.get_float()
res = self.reset_quota()
@@ -199,6 +205,7 @@ class BPSMeter(object):
t = time.time()
if t > self.end_of_day:
# current day passed. get new end of day
self.day_label = time.strftime("%Y-%m-%d")
self.day_total = {}
self.end_of_day = tomorrow(t) - 1.0
@@ -227,6 +234,12 @@ class BPSMeter(object):
self.grand_total[server] = 0L
self.grand_total[server] += amount
if server not in self.timeline_total:
self.timeline_total[server] = {}
if self.day_label not in self.timeline_total[server]:
self.timeline_total[server][self.day_label]= 0L
self.timeline_total[server][self.day_label] += amount
# Quota check
if self.have_quota and self.quota_enabled:
self.left -= amount
@@ -290,7 +303,8 @@ class BPSMeter(object):
return self.grand_total.get(server, 0L), \
self.month_total.get(server, 0L), \
self.week_total.get(server, 0L), \
self.day_total.get(server, 0L)
self.day_total.get(server, 0L), \
self.timeline_total.get(server, {})
def clear_server(self, server):
""" Clean counters for specified server """
@@ -302,6 +316,8 @@ class BPSMeter(object):
del self.month_total[server]
if server in self.grand_total:
del self.grand_total[server]
if server in self.timeline_total:
del self.timeline_total[server]
self.save()
def get_bps(self):

View File

@@ -59,56 +59,121 @@ if sabnzbd.WIN32:
else:
DEF_FOLDER_MAX = 256
##############################################################################
# Configuration instances
##############################################################################
sfv_check = OptionBool('misc', 'sfv_check', True)
quick_check_ext_ignore = OptionList('misc', 'quick_check_ext_ignore', ['nfo', 'sfv', 'srr'])
email_server = OptionStr('misc', 'email_server', validation=validate_server)
email_to = OptionList('misc', 'email_to', validation=validate_email)
email_from = OptionStr('misc', 'email_from', validation=validate_email)
email_account = OptionStr('misc', 'email_account')
email_pwd = OptionPassword('misc', 'email_pwd')
email_endjob = OptionNumber('misc', 'email_endjob', 0, 0, 2)
email_full = OptionBool('misc', 'email_full', False)
email_dir = OptionDir('misc', 'email_dir', create=True)
email_rss = OptionBool('misc', 'email_rss', False)
email_cats = OptionList('misc', 'email_cats', ['*'])
##############################################################################
# Special settings
##############################################################################
pre_script = OptionStr('misc', 'pre_script', 'None')
queue_complete = OptionStr('misc', 'queue_complete')
queue_complete_pers = OptionBool('misc', 'queue_complete_pers', False)
bandwidth_perc = OptionNumber('misc', 'bandwidth_perc', 0, 0, 100)
refresh_rate = OptionNumber('misc', 'refresh_rate', 0)
log_level = OptionNumber('logging', 'log_level', 1, -1, 2)
log_size = OptionStr('logging', 'max_log_size', '5242880')
log_backups = OptionNumber('logging', 'log_backups', 5, 1, 1024)
queue_limit = OptionNumber('misc', 'queue_limit', 20, 0)
configlock = OptionBool('misc', 'config_lock', 0)
##############################################################################
# One time trackers
##############################################################################
converted_nzo_pickles = OptionBool('misc', 'converted_nzo_pickles', False)
warned_old_queue = OptionNumber('misc', 'warned_old_queue', QUEUE_VERSION)
sched_converted = OptionBool('misc', 'sched_converted', False)
notified_new_skin = OptionNumber('misc', 'notified_new_skin', 0)
direct_unpack_tested = OptionBool('misc', 'direct_unpack_tested', False)
##############################################################################
# Config - General
##############################################################################
version_check = OptionNumber('misc', 'check_new_rel', 1)
autobrowser = OptionBool('misc', 'auto_browser', True)
replace_illegal = OptionBool('misc', 'replace_illegal', True)
pre_script = OptionStr('misc', 'pre_script', 'None')
script_can_fail = OptionBool('misc', 'script_can_fail', False)
start_paused = OptionBool('misc', 'start_paused', False)
language = OptionStr('misc', 'language', 'en')
enable_https_verification = OptionBool('misc', 'enable_https_verification', True)
selftest_host = OptionStr('misc', 'selftest_host', 'self-test.sabnzbd.org')
cherryhost = OptionStr('misc', 'host', DEF_HOST)
cherryport = OptionStr('misc', 'port', DEF_PORT)
https_port = OptionStr('misc', 'https_port')
username = OptionStr('misc', 'username')
password = OptionPassword('misc', 'password')
bandwidth_max = OptionStr('misc', 'bandwidth_max')
cache_limit = OptionStr('misc', 'cache_limit')
web_dir = OptionStr('misc', 'web_dir', DEF_STDINTF)
web_color = OptionStr('misc', 'web_color', '')
https_cert = OptionDir('misc', 'https_cert', 'server.cert', create=False)
https_key = OptionDir('misc', 'https_key', 'server.key', create=False)
https_chain = OptionDir('misc', 'https_chain', create=False)
enable_https = OptionBool('misc', 'enable_https', False)
inet_exposure = OptionNumber('misc', 'inet_exposure', 0, protect=True) # 0=local-only, 1=nzb, 2=api, 3=full_api, 4=webui, 5=webui with login for external
local_ranges = OptionList('misc', 'local_ranges', protect=True)
api_key = OptionStr('misc', 'api_key', create_api_key())
nzb_key = OptionStr('misc', 'nzb_key', create_api_key())
##############################################################################
# Config - Folders
##############################################################################
umask = OptionStr('misc', 'permissions', '', validation=validate_octal)
download_dir = OptionDir('misc', 'download_dir', DEF_DOWNLOAD_DIR, create=False, validation=validate_safedir)
download_free = OptionStr('misc', 'download_free')
complete_dir = OptionDir('misc', 'complete_dir', DEF_COMPLETE_DIR, create=False, apply_umask=True, validation=validate_notempty)
script_dir = OptionDir('misc', 'script_dir', create=True, writable=False)
nzb_backup_dir = OptionDir('misc', 'nzb_backup_dir', DEF_NZBBACK_DIR)
admin_dir = OptionDir('misc', 'admin_dir', DEF_ADMIN_DIR, validation=validate_safedir)
dirscan_dir = OptionDir('misc', 'dirscan_dir', create=False)
dirscan_speed = OptionNumber('misc', 'dirscan_speed', DEF_SCANRATE, 0, 3600)
password_file = OptionDir('misc', 'password_file', '', create=False)
log_dir = OptionDir('misc', 'log_dir', 'logs', validation=validate_notempty)
##############################################################################
# Config - Switches
##############################################################################
max_art_tries = OptionNumber('misc', 'max_art_tries', 3, 2)
load_balancing = OptionNumber('misc', 'load_balancing', 2)
top_only = OptionBool('misc', 'top_only', False)
sfv_check = OptionBool('misc', 'sfv_check', True)
quick_check_ext_ignore = OptionList('misc', 'quick_check_ext_ignore', ['nfo', 'sfv', 'srr'])
script_can_fail = OptionBool('misc', 'script_can_fail', False)
ssl_ciphers = OptionStr('misc', 'ssl_ciphers', '')
enable_unrar = OptionBool('misc', 'enable_unrar', True)
enable_unzip = OptionBool('misc', 'enable_unzip', True)
enable_7zip = OptionBool('misc', 'enable_7zip', True)
enable_recursive = OptionBool('misc', 'enable_recursive', True)
enable_filejoin = OptionBool('misc', 'enable_filejoin', True)
enable_tsjoin = OptionBool('misc', 'enable_tsjoin', True)
enable_par_cleanup = OptionBool('misc', 'enable_par_cleanup', True)
enable_all_par = OptionBool('misc', 'enable_all_par', False)
ignore_unrar_dates = OptionBool('misc', 'ignore_unrar_dates', False)
overwrite_files = OptionBool('misc', 'overwrite_files', False)
flat_unpack = OptionBool('misc', 'flat_unpack', False)
par_option = OptionStr('misc', 'par_option', '', validation=no_nonsense)
pre_check = OptionBool('misc', 'pre_check', False)
nice = OptionStr('misc', 'nice', '', validation=no_nonsense)
ionice = OptionStr('misc', 'ionice', '', validation=no_nonsense)
ignore_wrong_unrar = OptionBool('misc', 'ignore_wrong_unrar', False)
multipar = OptionBool('misc', 'multipar', sabnzbd.WIN32)
pre_check = OptionBool('misc', 'pre_check', False)
fail_hopeless_jobs = OptionBool('misc', 'fail_hopeless_jobs', True)
req_completion_rate = OptionNumber('misc', 'req_completion_rate', 100.2, 100, 200)
autodisconnect = OptionBool('misc', 'auto_disconnect', True)
no_dupes = OptionNumber('misc', 'no_dupes', 0)
no_series_dupes = OptionNumber('misc', 'no_series_dupes', 0)
pause_on_pwrar = OptionNumber('misc', 'pause_on_pwrar', 1)
ignore_samples = OptionBool('misc', 'ignore_samples', False)
auto_sort = OptionBool('misc', 'auto_sort', False)
direct_unpack = OptionBool('misc', 'direct_unpack', False)
direct_unpack_threads = OptionNumber('misc', 'direct_unpack_threads', 3, 1)
propagation_delay = OptionNumber('misc', 'propagation_delay', 0)
folder_rename = OptionBool('misc', 'folder_rename', True)
replace_spaces = OptionBool('misc', 'replace_spaces', False)
replace_dots = OptionBool('misc', 'replace_dots', False)
safe_postproc = OptionBool('misc', 'safe_postproc', True)
pause_on_post_processing = OptionBool('misc', 'pause_on_post_processing', False)
sanitize_safe = OptionBool('misc', 'sanitize_safe', False)
cleanup_list = OptionList('misc', 'cleanup_list')
unwanted_extensions = OptionList('misc', 'unwanted_extensions')
action_on_unwanted_extensions = OptionNumber('misc', 'action_on_unwanted_extensions', 0)
new_nzb_on_failure = OptionBool('misc', 'new_nzb_on_failure', False)
history_retention = OptionStr('misc', 'history_retention', '0')
enable_meta = OptionBool('misc', 'enable_meta', True)
quota_size = OptionStr('misc', 'quota_size')
quota_day = OptionStr('misc', 'quota_day')
quota_resume = OptionBool('misc', 'quota_resume', False)
quota_period = OptionStr('misc', 'quota_period', 'm')
rating_enable = OptionBool('misc', 'rating_enable', False)
rating_host = OptionStr('misc', 'rating_host', 'api.oznzb.com')
rating_host = OptionStr('misc', 'rating_host')
rating_api_key = OptionStr('misc', 'rating_api_key')
rating_filter_enable = OptionBool('misc', 'rating_filter_enable', False)
rating_filter_abort_audio = OptionNumber('misc', 'rating_filter_abort_audio', 0)
@@ -128,41 +193,14 @@ rating_filter_pause_spam_confirm = OptionBool('misc', 'rating_filter_pause_spam_
rating_filter_pause_downvoted = OptionBool('misc', 'rating_filter_pause_downvoted', False)
rating_filter_pause_keywords = OptionStr('misc', 'rating_filter_pause_keywords')
top_only = OptionBool('misc', 'top_only', False)
autodisconnect = OptionBool('misc', 'auto_disconnect', True)
queue_complete = OptionStr('misc', 'queue_complete')
queue_complete_pers = OptionBool('misc', 'queue_complete_pers', False)
replace_spaces = OptionBool('misc', 'replace_spaces', False)
replace_dots = OptionBool('misc', 'replace_dots', False)
no_dupes = OptionNumber('misc', 'no_dupes', 0)
no_series_dupes = OptionNumber('misc', 'no_series_dupes', 0)
backup_for_duplicates = OptionBool('misc', 'backup_for_duplicates', True)
ignore_samples = OptionBool('misc', 'ignore_samples', False)
auto_sort = OptionBool('misc', 'auto_sort', False)
direct_unpack = OptionBool('misc', 'direct_unpack', False)
direct_unpack_tested = OptionBool('misc', 'direct_unpack_tested', False)
propagation_delay = OptionNumber('misc', 'propagation_delay', 0)
folder_rename = OptionBool('misc', 'folder_rename', True)
folder_max_length = OptionNumber('misc', 'folder_max_length', DEF_FOLDER_MAX, 20, 65000)
pause_on_pwrar = OptionNumber('misc', 'pause_on_pwrar', 1)
safe_postproc = OptionBool('misc', 'safe_postproc', True)
empty_postproc = OptionBool('misc', 'empty_postproc', False)
pause_on_post_processing = OptionBool('misc', 'pause_on_post_processing', False)
ampm = OptionBool('misc', 'ampm', False)
rss_filenames = OptionBool('misc', 'rss_filenames', False)
rss_odd_titles = OptionList('misc', 'rss_odd_titles', ['nzbindex.nl/', 'nzbindex.com/', 'nzbclub.com/'])
schedules = OptionList('misc', 'schedlines')
sched_converted = OptionBool('misc', 'sched_converted', False)
##############################################################################
# Config - Sorting
##############################################################################
enable_tv_sorting = OptionBool('misc', 'enable_tv_sorting', False)
tv_sort_string = OptionStr('misc', 'tv_sort_string')
tv_sort_countries = OptionNumber('misc', 'tv_sort_countries', 1)
tv_categories = OptionList('misc', 'tv_categories', '')
movie_rename_limit = OptionStr('misc', 'movie_rename_limit', '100M')
enable_movie_sorting = OptionBool('misc', 'enable_movie_sorting', False)
movie_sort_string = OptionStr('misc', 'movie_sort_string')
@@ -174,74 +212,84 @@ enable_date_sorting = OptionBool('misc', 'enable_date_sorting', False)
date_sort_string = OptionStr('misc', 'date_sort_string')
date_categories = OptionList('misc', 'date_categories', ['tv'])
configlock = OptionBool('misc', 'config_lock', 0)
umask = OptionStr('misc', 'permissions', '', validation=validate_octal)
download_dir = OptionDir('misc', 'download_dir', DEF_DOWNLOAD_DIR, create=False, validation=validate_safedir)
download_free = OptionStr('misc', 'download_free')
complete_dir = OptionDir('misc', 'complete_dir', DEF_COMPLETE_DIR, create=False,
apply_umask=True, validation=validate_notempty)
script_dir = OptionDir('misc', 'script_dir', create=True, writable=False)
nzb_backup_dir = OptionDir('misc', 'nzb_backup_dir', DEF_NZBBACK_DIR)
admin_dir = OptionDir('misc', 'admin_dir', DEF_ADMIN_DIR, validation=validate_safedir)
dirscan_dir = OptionDir('misc', 'dirscan_dir', create=False)
dirscan_speed = OptionNumber('misc', 'dirscan_speed', DEF_SCANRATE, 0, 3600)
size_limit = OptionStr('misc', 'size_limit', '0')
password_file = OptionDir('misc', 'password_file', '', create=False)
fsys_type = OptionNumber('misc', 'fsys_type', 0, 0, 2)
##############################################################################
# Config - Scheduling and RSS
##############################################################################
schedules = OptionList('misc', 'schedlines')
rss_rate = OptionNumber('misc', 'rss_rate', 60, 15, 24 * 60)
##############################################################################
# Config - Specials
##############################################################################
# Bool switches
ampm = OptionBool('misc', 'ampm', False)
replace_illegal = OptionBool('misc', 'replace_illegal', True)
start_paused = OptionBool('misc', 'start_paused', False)
enable_all_par = OptionBool('misc', 'enable_all_par', False)
enable_par_cleanup = OptionBool('misc', 'enable_par_cleanup', True)
enable_unrar = OptionBool('misc', 'enable_unrar', True)
enable_unzip = OptionBool('misc', 'enable_unzip', True)
enable_7zip = OptionBool('misc', 'enable_7zip', True)
enable_filejoin = OptionBool('misc', 'enable_filejoin', True)
enable_tsjoin = OptionBool('misc', 'enable_tsjoin', True)
overwrite_files = OptionBool('misc', 'overwrite_files', False)
ignore_unrar_dates = OptionBool('misc', 'ignore_unrar_dates', False)
ignore_wrong_unrar = OptionBool('misc', 'ignore_wrong_unrar', False)
multipar = OptionBool('misc', 'multipar', sabnzbd.WIN32)
backup_for_duplicates = OptionBool('misc', 'backup_for_duplicates', True)
empty_postproc = OptionBool('misc', 'empty_postproc', False)
wait_for_dfolder = OptionBool('misc', 'wait_for_dfolder', False)
warn_empty_nzb = OptionBool('misc', 'warn_empty_nzb', True)
sanitize_safe = OptionBool('misc', 'sanitize_safe', False)
rss_filenames = OptionBool('misc', 'rss_filenames', False)
api_logging = OptionBool('misc', 'api_logging', True)
cherryhost = OptionStr('misc', 'host', DEF_HOST)
cherryport = OptionStr('misc', 'port', DEF_PORT)
https_port = OptionStr('misc', 'https_port')
username = OptionStr('misc', 'username')
password = OptionPassword('misc', 'password')
html_login = OptionBool('misc', 'html_login', True)
bandwidth_perc = OptionNumber('misc', 'bandwidth_perc', 0, 0, 100)
bandwidth_max = OptionStr('misc', 'bandwidth_max')
refresh_rate = OptionNumber('misc', 'refresh_rate', 0)
rss_rate = OptionNumber('misc', 'rss_rate', 60, 15, 24 * 60)
cache_limit = OptionStr('misc', 'cache_limit')
web_dir = OptionStr('misc', 'web_dir', DEF_STDINTF)
web_color = OptionStr('misc', 'web_color', '')
cleanup_list = OptionList('misc', 'cleanup_list')
warned_old_queue = OptionNumber('misc', 'warned_old_queue', QUEUE_VERSION)
notified_new_skin = OptionNumber('misc', 'notified_new_skin', 0)
converted_nzo_pickles = OptionBool('misc', 'converted_nzo_pickles', False)
unwanted_extensions = OptionList('misc', 'unwanted_extensions')
action_on_unwanted_extensions = OptionNumber('misc', 'action_on_unwanted_extensions', 0)
log_dir = OptionDir('misc', 'log_dir', 'logs', validation=validate_notempty)
log_level = OptionNumber('logging', 'log_level', 1, -1, 2)
log_size = OptionStr('logging', 'max_log_size', '5242880')
log_backups = OptionNumber('logging', 'log_backups', 5, 1, 1024)
https_cert = OptionDir('misc', 'https_cert', 'server.cert', create=False)
https_key = OptionDir('misc', 'https_key', 'server.key', create=False)
https_chain = OptionDir('misc', 'https_chain', create=False)
enable_https = OptionBool('misc', 'enable_https', False)
language = OptionStr('misc', 'language', 'en')
no_penalties = OptionBool('misc', 'no_penalties', False)
load_balancing = OptionNumber('misc', 'load_balancing', 2)
ipv6_servers = OptionNumber('misc', 'ipv6_servers', 1, 0, 2)
api_key = OptionStr('misc', 'api_key', create_api_key())
nzb_key = OptionStr('misc', 'nzb_key', create_api_key())
disable_key = OptionBool('misc', 'disable_api_key', False, protect=True)
api_warnings = OptionBool('misc', 'api_warnings', True, protect=True)
local_ranges = OptionList('misc', 'local_ranges', protect=True)
inet_exposure = OptionNumber('misc', 'inet_exposure', 0, protect=True) # 0=local-only, 1=nzb, 2=api, 3=full_api, 4=webui, 5=webui with login for external
max_art_tries = OptionNumber('misc', 'max_art_tries', 3, 2)
osx_menu = OptionBool('misc', 'osx_menu', True)
osx_speed = OptionBool('misc', 'osx_speed', True)
warn_dupl_jobs = OptionBool('misc', 'warn_dupl_jobs', True)
keep_awake = OptionBool('misc', 'keep_awake', True)
win_menu = OptionBool('misc', 'win_menu', True)
allow_incomplete_nzb = OptionBool('misc', 'allow_incomplete_nzb', False)
enable_bonjour = OptionBool('misc', 'enable_bonjour', True)
allow_duplicate_files = OptionBool('misc', 'allow_duplicate_files', False)
max_art_opt = OptionBool('misc', 'max_art_opt', False)
use_pickle = OptionBool('misc', 'use_pickle', False)
ipv6_hosting = OptionBool('misc', 'ipv6_hosting', False)
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)
# Text values
rss_odd_titles = OptionList('misc', 'rss_odd_titles', ['nzbindex.nl/', 'nzbindex.com/', 'nzbclub.com/'])
folder_max_length = OptionNumber('misc', 'folder_max_length', DEF_FOLDER_MAX, 20, 65000)
req_completion_rate = OptionNumber('misc', 'req_completion_rate', 100.2, 100, 200)
selftest_host = OptionStr('misc', 'selftest_host', 'self-test.sabnzbd.org')
movie_rename_limit = OptionStr('misc', 'movie_rename_limit', '100M')
size_limit = OptionStr('misc', 'size_limit', '0')
fsys_type = OptionNumber('misc', 'fsys_type', 0, 0, 2)
show_sysload = OptionNumber('misc', 'show_sysload', 2, 0, 2)
history_limit = OptionNumber('misc', 'history_limit', 10, 0)
wait_ext_drive = OptionNumber('misc', 'wait_ext_drive', 5, 1, 60)
marker_file = OptionStr('misc', 'nomedia_marker', '')
ipv6_servers = OptionNumber('misc', 'ipv6_servers', 1, 0, 2)
##############################################################################
# Config - Notifications
##############################################################################
# [email]
email_server = OptionStr('misc', 'email_server', validation=validate_server)
email_to = OptionList('misc', 'email_to', validation=validate_email)
email_from = OptionStr('misc', 'email_from', validation=validate_email)
email_account = OptionStr('misc', 'email_account')
email_pwd = OptionPassword('misc', 'email_pwd')
email_endjob = OptionNumber('misc', 'email_endjob', 0, 0, 2)
email_full = OptionBool('misc', 'email_full', False)
email_dir = OptionDir('misc', 'email_dir', create=True)
email_rss = OptionBool('misc', 'email_rss', False)
email_cats = OptionList('misc', 'email_cats', ['*'])
# [ncenter]
ncenter_enable = OptionBool('ncenter', 'ncenter_enable', sabnzbd.DARWIN)
@@ -373,26 +421,6 @@ nscript_prio_error = OptionBool('nscript', 'nscript_prio_error', False)
nscript_prio_queue_done = OptionBool('nscript', 'nscript_prio_queue_done', True)
nscript_prio_other = OptionBool('nscript', 'nscript_prio_other', False)
quota_size = OptionStr('misc', 'quota_size')
quota_day = OptionStr('misc', 'quota_day')
quota_resume = OptionBool('misc', 'quota_resume', False)
quota_period = OptionStr('misc', 'quota_period', 'm')
osx_menu = OptionBool('misc', 'osx_menu', True)
osx_speed = OptionBool('misc', 'osx_speed', True)
keep_awake = OptionBool('misc', 'keep_awake', True)
win_menu = OptionBool('misc', 'win_menu', True)
allow_incomplete_nzb = OptionBool('misc', 'allow_incomplete_nzb', False)
marker_file = OptionStr('misc', 'nomedia_marker', '')
wait_ext_drive = OptionNumber('misc', 'wait_ext_drive', 5, 1, 60)
queue_limit = OptionNumber('misc', 'queue_limit', 20, 0)
history_limit = OptionNumber('misc', 'history_limit', 10, 0)
show_sysload = OptionNumber('misc', 'show_sysload', 2, 0, 2)
enable_bonjour = OptionBool('misc', 'enable_bonjour', True)
allow_duplicate_files = OptionBool('misc', 'allow_duplicate_files', False)
warn_dupl_jobs = OptionBool('misc', 'warn_dupl_jobs', True)
new_nzb_on_failure = OptionBool('misc', 'new_nzb_on_failure', False)
##############################################################################
# Set root folders for Folder config-items

View File

@@ -852,6 +852,7 @@ def save_config(force=False):
# Write new config file
try:
logging.info('Writing settings to INI file %s', filename)
CFG.write()
shutil.copymode(bakname, filename)
modified = False
@@ -981,17 +982,21 @@ def get_rss():
# We have to remove non-seperator commas by detecting if they are valid URL's
for feed_key in database['rss']:
feed = database['rss'][feed_key]
# Only modify if we have to, to prevent repeated config-saving
have_new_uri = False
# Create a new corrected list
new_feed_uris = []
for feed_uri in feed.uri():
if new_feed_uris and not urlparse(feed_uri).scheme and urlparse(new_feed_uris[-1]).scheme:
# Current one has no scheme but previous one does, append to previous
new_feed_uris[-1] += '%2C' + feed_uri
have_new_uri = True
continue
# Add full working URL
new_feed_uris.append(feed_uri)
# Set new list
feed.uri.set(new_feed_uris)
if have_new_uri:
feed.uri.set(new_feed_uris)
return database['rss']
except KeyError:

View File

@@ -81,6 +81,7 @@ MAX_DECODE_QUEUE = 10
LIMIT_DECODE_QUEUE = 100
MAX_WARNINGS = 20
MAX_WIN_DFOLDER = 60
MAX_BAD_ARTICLES = 5
REPAIR_PRIORITY = 3
TOP_PRIORITY = 2

View File

@@ -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
from sabnzbd.misc import get_all_passwords, int_conv
DB_LOCK = threading.RLock()
@@ -154,7 +154,8 @@ class HistoryDB(object):
return 'duplicate column name' not in error
else:
logging.error(T('SQL Command Failed, see log'))
logging.debug("SQL: %s", command)
logging.info("SQL: %s", command)
logging.info("Arguments: %s", repr(args))
logging.info("Traceback: ", exc_info=True)
try:
self.con.rollback()
@@ -249,6 +250,30 @@ class HistoryDB(object):
self.save()
def auto_history_purge(self):
""" Remove history items based on the configured history-retention """
if sabnzbd.cfg.history_retention() == "0":
return
if sabnzbd.cfg.history_retention() == "-1":
# Delete all non-failed ones
self.remove_completed()
if "d" in sabnzbd.cfg.history_retention():
# How many days to keep?
days_to_keep = int_conv(sabnzbd.cfg.history_retention().strip()[:-1])
seconds_to_keep = int(time.time()) - days_to_keep*3600*24
if days_to_keep > 0:
logging.info('Removing completed jobs older than %s days from history', days_to_keep)
return self.execute("""DELETE FROM history WHERE status = 'Completed' AND completed < ?""", (seconds_to_keep,), save=True)
else:
# How many to keep?
to_keep = int_conv(sabnzbd.cfg.history_retention())
if to_keep > 0:
logging.info('Removing all but last %s completed jobs from history', to_keep)
return self.execute("""DELETE FROM history WHERE id NOT IN ( SELECT id FROM history WHERE status = 'Completed' ORDER BY completed DESC LIMIT ? )""", (to_keep,), save=True)
def add_history_db(self, nzo, storage, path, postproc_time, script_output, script_line):
""" Add a new job entry to the database """
t = build_history_info(nzo, storage, path, postproc_time, script_output, script_line)
@@ -262,19 +287,20 @@ class HistoryDB(object):
def fetch_history(self, start=None, limit=None, search=None, failed_only=0, categories=None):
""" Return records for specified jobs """
search = convert_search(search)
command_args = [convert_search(search)]
post = ''
if categories:
categories = ['*' if c == 'Default' else c for c in categories]
post = " AND (CATEGORY = '"
post += "' OR CATEGORY = '".join(categories)
post += "' )"
post = " AND (CATEGORY = ?"
post += " OR CATEGORY = ? " * (len(categories)-1)
post += ")"
command_args.extend(categories)
if failed_only:
post += ' AND STATUS = "Failed"'
cmd = 'SELECT COUNT(*) FROM history WHERE name LIKE ?'
res = self.execute(cmd + post, (search,))
res = self.execute(cmd + post, tuple(command_args))
total_items = -1
if res:
try:
@@ -287,9 +313,9 @@ class HistoryDB(object):
if not limit:
limit = total_items
t = (search, start, limit)
command_args.extend([start, limit])
cmd = 'SELECT * FROM history WHERE name LIKE ?'
fetch_ok = self.execute(cmd + post + ' ORDER BY completed desc LIMIT ?, ?', t)
fetch_ok = self.execute(cmd + post + ' ORDER BY completed desc LIMIT ?, ?', tuple(command_args))
if fetch_ok:
items = self.c.fetchall()
@@ -540,6 +566,13 @@ def unpack_history_info(item):
return item
def midnight_history_purge():
logging.info('Scheduled history purge')
history_db = HistoryDB()
history_db.auto_history_purge()
history_db.close()
def decode_factory(text):
""" Recursively looks through the supplied argument
and converts and text to Unicode

View File

@@ -31,8 +31,8 @@ from sabnzbd.constants import Status, MAX_DECODE_QUEUE, LIMIT_DECODE_QUEUE, SABY
import sabnzbd.articlecache
import sabnzbd.downloader
import sabnzbd.nzbqueue
from sabnzbd.encoding import yenc_name_fixer, platform_encode
from sabnzbd.misc import match_str, is_obfuscated_filename
from sabnzbd.encoding import yenc_name_fixer
from sabnzbd.misc import match_str
# Check for basic-yEnc
try:
@@ -196,9 +196,9 @@ class Decoder(Thread):
if logme:
if killed:
nzo.inc_log('killed_art_log', art_id)
nzo.increase_bad_articles_counter('killed_articles')
else:
nzo.inc_log('bad_art_log', art_id)
nzo.increase_bad_articles_counter('bad_articles')
else:
new_server_found = self.search_new_server(article)
@@ -320,7 +320,7 @@ class Decoder(Thread):
msg = T('%s => missing from all servers, discarding') % article
logging.info(msg)
article.nzf.nzo.inc_log('missing_art_log', msg)
article.nzf.nzo.increase_bad_articles_counter('missing_articles')
return False
def verify_filename(self, article, decoded_data, yenc_filename):
@@ -336,26 +336,8 @@ class Decoder(Thread):
if article.partnum == nzf.lowest_partnum:
nzf.md5of16k = hashlib.md5(decoded_data[:16384]).digest()
# If we have the md5, use it to rename
if nzf.md5of16k:
# Don't check again, even if no match
nzf.filename_checked = True
# Find the match and rename
if nzf.md5of16k in nzf.nzo.md5of16k:
new_filename = platform_encode(nzf.nzo.md5of16k[nzf.md5of16k])
# Was it even new?
if new_filename != nzf.filename:
logging.info('Detected filename based on par2: %s -> %s', nzf.filename, new_filename)
nzf.nzo.renamed_file(new_filename, nzf.filename)
nzf.filename = new_filename
return
# Fallback to yenc/nzb name (also when there is no partnum=1)
# We also keep the NZB name in case it ends with ".par2" (usually correct)
if yenc_filename != nzf.filename and not is_obfuscated_filename(yenc_filename) and not nzf.filename.endswith('.par2'):
logging.info('Detected filename from yenc: %s -> %s', nzf.filename, yenc_filename)
nzf.nzo.renamed_file(yenc_filename, nzf.filename)
nzf.filename = yenc_filename
# Try the rename
nzf.nzo.verify_nzf_filename(nzf, yenc_filename)
def yCheck(data):

View File

@@ -21,6 +21,7 @@ sabnzbd.directunpacker
import os
import re
import time
import threading
import subprocess
import logging
@@ -28,9 +29,10 @@ 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.encoding import unicoder
from sabnzbd.newsunpack import build_command
from sabnzbd.encoding import TRANS, unicoder
from sabnzbd.newsunpack import build_command, EXTRACTFROM_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:
@@ -42,7 +44,6 @@ else:
MAX_ACTIVE_UNPACKERS = 10
ACTIVE_UNPACKERS = []
CONCURRENT_LOCK = threading.RLock()
RAR_NR = re.compile(r'(.*?)(\.part(\d*).rar|\.r(\d*))$', re.IGNORECASE)
@@ -58,11 +59,13 @@ class DirectUnpacker(threading.Thread):
self.next_file_lock = threading.Condition(threading.RLock())
self.unpack_dir_info = None
self.rarfile_nzf = None
self.cur_setname = None
self.cur_volume = 0
self.total_volumes = {}
self.unpack_time = 0.0
self.success_sets = []
self.success_sets = {}
self.next_sets = []
nzo.direct_unpacker = self
@@ -73,22 +76,14 @@ class DirectUnpacker(threading.Thread):
def save(self):
pass
def release_concurrent_lock(self):
""" Let other unpackers go """
try:
CONCURRENT_LOCK.release()
except:
pass
def reset_active(self):
self.active_instance = None
self.cur_setname = None
self.cur_volume = 0
# Release lock to be sure
self.release_concurrent_lock()
self.rarfile_nzf = None
def check_requirements(self):
if self.killed or not self.nzo.unpack or cfg.direct_unpack() < 1 or sabnzbd.newsunpack.RAR_PROBLEM:
if not cfg.direct_unpack() or self.killed or not self.nzo.unpack or self.nzo.bad_articles or sabnzbd.newsunpack.RAR_PROBLEM:
return False
return True
@@ -103,7 +98,7 @@ class DirectUnpacker(threading.Thread):
found_counter += 1
if nzf.setname not in self.total_volumes:
self.total_volumes[nzf.setname] = 0
self.total_volumes[nzf.setname] += 1
self.total_volumes[nzf.setname] = max(self.total_volumes[nzf.setname], nzf.vol)
else:
none_counter += 1
@@ -134,12 +129,12 @@ class DirectUnpacker(threading.Thread):
# Is this the first one of the first set?
if not self.active_instance and not self.is_alive() and self.have_next_volume():
# Too many runners already?
if len(ACTIVE_UNPACKERS) >= MAX_ACTIVE_UNPACKERS:
if len(ACTIVE_UNPACKERS) >= cfg.direct_unpack_threads():
logging.info('Too many DirectUnpackers currently to start %s', self.cur_setname)
return
# Start the unrar command and the loop
self.create_unrar_instance(nzf)
self.create_unrar_instance()
self.start()
elif not any(test_nzf.setname == nzf.setname for test_nzf in self.next_sets):
# Need to store this for the future, only once per set!
@@ -152,7 +147,10 @@ class DirectUnpacker(threading.Thread):
def run(self):
# Input and output
linebuf = ''
last_volume_linebuf = ''
unrar_log = []
rarfiles = []
start_time = time.time()
# Need to read char-by-char because there's no newline after new-disk message
while 1:
@@ -174,55 +172,78 @@ 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)
# Did we reach the end?
if linebuf.endswith('All OK'):
# Add to success
self.success_sets.append(self.cur_setname)
logging.info('DirectUnpack completed for %s', self.cur_setname)
# Stop timer and finish
self.unpack_time += time.time() - start_time
ACTIVE_UNPACKERS.remove(self)
# Make sure to release the lock
self.release_concurrent_lock()
# 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)
logging.info('DirectUnpack completed for %s', self.cur_setname)
self.nzo.set_action_line(T('Direct Unpack'), T('Completed'))
# Write current log and clear
unrar_log.append(linebuf.strip())
linebuf = ''
logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log))
unrar_log = []
rarfiles = []
# Are there more files left?
if self.nzo.files:
while self.nzo.files and not self.next_sets:
with self.next_file_lock:
self.next_file_lock.wait()
# Is there another set to do?
if self.next_sets:
# Write current log
unrar_log.append(linebuf.strip())
linebuf = ''
logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log))
unrar_log = []
# Start new instance
nzf = self.next_sets.pop(0)
self.reset_active()
self.cur_setname = nzf.setname
# Wait for the 1st volume to appear
self.wait_for_next_volume()
self.create_unrar_instance(nzf)
self.create_unrar_instance()
start_time = time.time()
else:
self.killed = True
break
if linebuf.endswith('[C]ontinue, [Q]uit '):
# Next one can go now
self.release_concurrent_lock()
# Stop timer
self.unpack_time += time.time() - start_time
# Wait for the next one..
self.wait_for_next_volume()
# Send "Enter" to proceed, only 1 at a time via lock
CONCURRENT_LOCK.acquire()
# Possible that the instance was deleted while locked
if not self.killed:
# Next volume
self.cur_volume += 1
# Give unrar some time to do it's thing
self.active_instance.stdin.write('\n')
self.nzo.set_action_line(T('Unpacking'), self.get_formatted_stats())
logging.info('DirectUnpacked volume %s for %s', self.cur_volume, self.cur_setname)
start_time = time.time()
time.sleep(0.1)
# Did we unpack a new volume? Sometimes UnRar hangs on 1 volume
if not last_volume_linebuf or last_volume_linebuf != linebuf:
# Next volume
self.cur_volume += 1
self.nzo.set_action_line(T('Direct Unpack'), self.get_formatted_stats())
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()
last_volume_linebuf = linebuf
# Show the log
if linebuf.endswith('\n'):
unrar_log.append(linebuf.strip())
linebuf = ''
@@ -233,32 +254,39 @@ class DirectUnpacker(threading.Thread):
# Save information if success
if self.success_sets:
msg = T('Unpacked %s files/folders in %s') % (len(globber(self.unpack_dir_info[0])), format_time_string(0))
# 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()
ACTIVE_UNPACKERS.remove(self)
if self in ACTIVE_UNPACKERS:
ACTIVE_UNPACKERS.remove(self)
# Make sure to release the lock
self.release_concurrent_lock()
# Set the thread to killed so it never gets restarted by accident
self.killed = True
def have_next_volume(self):
""" Check if next volume of set is available, start
from the end of the list where latest completed files are """
from the end of the list where latest completed files are
Make sure that files are 100% written to disk by checking md5sum
"""
for nzf_search in reversed(self.nzo.finished_files):
if nzf_search.setname == self.cur_setname and nzf_search.vol == self.cur_volume+1:
return True
if nzf_search.setname == self.cur_setname and nzf_search.vol == (self.cur_volume+1) and nzf_search.md5sum:
return nzf_search
return False
def wait_for_next_volume(self):
""" Wait for the correct volume to appear
But stop if it was killed or the NZB is done """
But stop if it was killed or the NZB is done
"""
while not self.have_next_volume() and not self.killed and self.nzo.files:
with self.next_file_lock:
self.next_file_lock.wait()
def create_unrar_instance(self, rarfile_nzf):
def create_unrar_instance(self):
""" Start the unrar instance using the user's options """
# Generate extraction path and save for post-proc
if not self.unpack_dir_info:
@@ -276,8 +304,11 @@ class DirectUnpacker(threading.Thread):
else:
action = 'x'
# The first NZF
self.rarfile_nzf = self.have_next_volume()
# Generate command
rarfile_path = os.path.join(self.nzo.downpath, rarfile_nzf.filename)
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,
@@ -294,10 +325,10 @@ class DirectUnpacker(threading.Thread):
if cfg.ignore_unrar_dates():
command.insert(3, '-tsm-')
# Let's start from the first one!
self.cur_volume = 1
stup, need_shell, command, creationflags = build_command(command)
logging.debug('Running unrar for DirectUnpack %s', command)
# Aquire lock and go
self.active_instance = Popen(command, shell=need_shell, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
startupinfo=stup, creationflags=creationflags)
@@ -313,6 +344,9 @@ class DirectUnpacker(threading.Thread):
logging.info('Aborting DirectUnpack for %s', self.cur_setname)
self.killed = True
# Save reference to the first rarfile
rarfile_nzf = self.rarfile_nzf
# Abort Unrar
if self.active_instance:
self.active_instance.kill()
@@ -325,12 +359,28 @@ class DirectUnpacker(threading.Thread):
# No new sets
self.next_sets = []
self.success_sets = []
self.success_sets = {}
# Remove files
if self.unpack_dir_info:
extraction_path, _, _, _, _ = self.unpack_dir_info
remove_all(extraction_path, recursive=True)
extraction_path, _, _, one_folder, _ = self.unpack_dir_info
# In case of flat-unpack we need to remove the files manually
if one_folder:
# RarFile can fail for mysterious reasons
try:
rar_contents = RarFile(os.path.join(self.nzo.downpath, rarfile_nzf.filename), all_names=True).filelist()
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)
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)
pass
else:
# We can just remove the whole path
remove_all(extraction_path, recursive=True)
# Remove dir-info
self.unpack_dir_info = None
@@ -341,14 +391,15 @@ class DirectUnpacker(threading.Thread):
""" Get percentage or number of rar's done """
if self.cur_setname and self.cur_setname in self.total_volumes:
# This won't work on obfuscated posts
if self.total_volumes[self.cur_setname] > self.cur_volume and self.cur_volume:
return '%.0f%%' % (100*float(self.cur_volume)/self.total_volumes[self.cur_setname])
if self.total_volumes[self.cur_setname] >= self.cur_volume and self.cur_volume:
return '%02d/%02d' % (self.cur_volume, self.total_volumes[self.cur_setname])
return self.cur_volume
def analyze_rar_filename(filename):
""" Extract volume number and setname from rar-filenames
Both ".part01.rar" and ".r01" """
Both ".part01.rar" and ".r01"
"""
m = RAR_NR.search(filename)
if m:
if m.group(4):
@@ -357,7 +408,7 @@ def analyze_rar_filename(filename):
return m.group(1), int_conv(m.group(3))
else:
# Detect if first of "rxx" set
if filename.endswith('.rar') and '.part' not in filename:
if filename.endswith('.rar'):
return os.path.splitext(filename)[0], 1
return None, None
@@ -371,9 +422,12 @@ def abort_all():
def test_disk_performance():
""" Test the incomplete-dir performance and enable
Direct Unpack if good enough (> 60MB/s)
Direct Unpack if good enough (> 40MB/s)
"""
if diskspeedmeasure(sabnzbd.cfg.download_dir.get_path()) > 60:
if diskspeedmeasure(sabnzbd.cfg.download_dir.get_path()) > 40:
cfg.direct_unpack.set(True)
logging.warning(T('Enabled Direct Unpack:') + ' ' + T('Jobs will start unpacking during the download, reduces post-processing time but requires capable hard drive. Only works for jobs that do not need repair.'))
logging.warning(T('Direct Unpack was automatically enabled.') + ' ' + T('Jobs will start unpacking during the downloading to reduce post-processing time. Only works for jobs that do not need repair.'))
else:
logging.info('Direct Unpack was not enabled, incomplete folder disk speed below 40MB/s')
cfg.direct_unpack_tested.set(True)
sabnzbd.config.save_config()

View File

@@ -73,6 +73,7 @@ def is_archive(path):
zf = zipfile.ZipFile(path)
return 0, zf, '.zip'
except:
logging.info(T('Cannot read %s'), path, exc_info=True)
return -1, None, ''
elif rarfile.is_rarfile(path):
try:
@@ -81,14 +82,17 @@ def is_archive(path):
zf = rarfile.RarFile(path)
return 0, zf, '.rar'
except:
logging.info(T('Cannot read %s'), path, exc_info=True)
return -1, None, ''
elif is_sevenfile(path):
try:
zf = SevenZip(path)
return 0, zf, '.7z'
except:
logging.info(T('Cannot read %s'), path, exc_info=True)
return -1, None, ''
else:
logging.info('Archive %s is not a real archive!', os.path.basename(path))
return 1, None, ''
@@ -127,17 +131,24 @@ def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=No
try:
data = zf.read(name)
except:
logging.error(T('Cannot read %s'), name, exc_info=True)
zf.close()
return -1, []
name = os.path.basename(name)
if data:
nzo = None
try:
nzo = nzbstuff.NzbObject(name, pp, script, data, cat=cat, url=url,
priority=priority, nzbname=nzbname)
if not nzo.password:
nzo.password = password
except (TypeError, ValueError) as e:
# Duplicate or empty, ignore
pass
except:
nzo = None
# Something else is wrong, show error
logging.error(T('Error while adding %s, removing'), name, exc_info=True)
if nzo:
if nzo_id:
# Re-use existing nzo_id, when a "future" job gets it payload
@@ -222,6 +233,8 @@ def ProcessSingleFile(filename, path, pp=None, script=None, cat=None, catdir=Non
# Looks like an incomplete file, retry
return -2, nzo_ids
else:
# Something else is wrong, show error
logging.error(T('Error while adding %s, removing'), name, exc_info=True)
return -1, nzo_ids
if nzo:

View File

@@ -83,6 +83,10 @@ class Server(object):
self.categories = categories
# Temporary deprication warning
if categories and (len(categories) > 1 or 'Default' not in categories):
logging.warning('[%s] Server specific categories option is scheduled to be removed in the next release of SABnzbd', self.host)
self.busy_threads = []
self.idle_threads = []
self.active = True
@@ -651,7 +655,7 @@ class Downloader(Thread):
logging.error(T('Failed login for server %s'), server.id)
penalty = _PENALTY_PERM
block = True
elif ecode == '502':
elif ecode in ('502', '482'):
# Cannot connect (other reasons), block this server
if server.active:
errormsg = T('Cannot connect to server %s [%s]') % ('', display_msg)
@@ -791,11 +795,8 @@ class Downloader(Thread):
# Remove this server from try_list
article.fetcher = None
nzf = article.nzf
nzo = nzf.nzo
# Allow all servers to iterate over each nzo/nzf again ##
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(nzf, nzo)
# Allow all servers to iterate over each nzo/nzf again
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article.nzf, article.nzf.nzo)
if destroy:
nw.terminate(quit=quit)
@@ -938,7 +939,8 @@ def clues_too_many(text):
""" Check for any "too many connections" clues in the response code """
text = text.lower()
for clue in ('exceed', 'connections', 'too many', 'threads', 'limit'):
if clue in text:
# Not 'download limit exceeded' error
if (clue in text) and ('download' not in text):
return True
return False
@@ -955,7 +957,7 @@ def clues_too_many_ip(text):
def clues_pay(text):
""" Check for messages about payments """
text = text.lower()
for clue in ('credits', 'paym', 'expired'):
for clue in ('credits', 'paym', 'expired', 'exceeded'):
if clue in text:
return True
return False

View File

@@ -327,7 +327,7 @@ class MainPage(object):
if not check_login():
raise NeedLogin()
if not cfg.notified_new_skin() and cfg.web_dir() != 'Glitter':
if not cfg.notified_new_skin() and cfg.web_dir() not in ('Glitter', 'Plush'):
logging.warning(T('Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin.'))
if not cfg.notified_new_skin():
cfg.notified_new_skin.set(1)
@@ -1300,12 +1300,12 @@ class ConfigFolders(object):
##############################################################################
SWITCH_LIST = \
('par_option', 'top_only', 'ssl_ciphers', 'direct_unpack',
('par_option', 'top_only', 'ssl_ciphers', 'direct_unpack', 'enable_meta',
'auto_sort', 'propagation_delay', 'auto_disconnect', 'flat_unpack',
'safe_postproc', 'no_dupes', 'replace_spaces', 'replace_dots',
'ignore_samples', 'pause_on_post_processing', 'nice', 'ionice',
'pre_script', 'pause_on_pwrar', 'sfv_check', 'folder_rename', 'load_balancing',
'quota_size', 'quota_day', 'quota_resume', 'quota_period',
'quota_size', 'quota_day', 'quota_resume', 'quota_period', 'history_retention',
'pre_check', 'max_art_tries', 'fail_hopeless_jobs', 'enable_all_par',
'enable_recursive', 'no_series_dupes', 'script_can_fail', 'new_nzb_on_failure',
'unwanted_extensions', 'action_on_unwanted_extensions', 'sanitize_safe',
@@ -1384,8 +1384,8 @@ SPECIAL_BOOL_LIST = \
)
SPECIAL_VALUE_LIST = \
('size_limit', 'folder_max_length', 'fsys_type', 'movie_rename_limit', 'nomedia_marker',
'req_completion_rate', 'wait_ext_drive', 'history_limit', 'show_sysload',
'ipv6_servers', 'selftest_host', 'rating_host'
'req_completion_rate', 'wait_ext_drive', 'show_sysload',
'direct_unpack_threads', 'ipv6_servers', 'selftest_host', 'rating_host'
)
SPECIAL_LIST_LIST = ('rss_odd_titles', 'quick_check_ext_ignore')
@@ -1612,9 +1612,9 @@ class ConfigServer(object):
server_names = sorted(servers.keys(), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower()))
for svr in server_names:
new.append(servers[svr].get_dict(safe=True))
t, m, w, d = BPSMeter.do.amounts(svr)
t, m, w, d, timeline = BPSMeter.do.amounts(svr)
if t:
new[-1]['amounts'] = to_units(t), to_units(m), to_units(w), to_units(d)
new[-1]['amounts'] = to_units(t), to_units(m), to_units(w), to_units(d), timeline
conf['servers'] = new
conf['cats'] = list_cats(default=True)
conf['have_ssl_context'] = sabnzbd.HAVE_SSL_CONTEXT
@@ -2414,7 +2414,7 @@ LOG_API_RE = re.compile(r"(apikey|api)(=|:)[\w]+", re.I)
LOG_API_JSON_RE = re.compile(r"u'(apikey|api)': u'[\w]+'", re.I)
LOG_USER_RE = re.compile(r"(user|username)\s?=\s?[\S]+", re.I)
LOG_PASS_RE = re.compile(r"(password)\s?=\s?[\S]+", re.I)
LOG_INI_HIDE_RE = re.compile(r"(email_pwd|rating_api_key|pushover_token|pushover_userkey|pushbullet_apikey|prowl_apikey|growl_password|growl_server|IPv[4|6] address)\s?=\s?[\S]+", re.I)
LOG_INI_HIDE_RE = re.compile(r"(email_pwd|email_account|email_to|rating_api_key|pushover_token|pushover_userkey|pushbullet_apikey|prowl_apikey|growl_password|growl_server|IPv[4|6] address)\s?=\s?[\S]+", re.I)
LOG_HASH_RE = re.compile(r"([a-fA-F\d]{25})", re.I)
class Status(object):

View File

@@ -42,9 +42,11 @@ import sabnzbd.config as config
import sabnzbd.cfg as cfg
from sabnzbd.encoding import unicoder, special_fixer, gUTF
RE_VERSION = re.compile(r'(\d+)\.(\d+)\.(\d+)([a-zA-Z]*)(\d*)')
RE_UNITS = re.compile(r'(\d+\.*\d*)\s*([KMGTP]{0,1})', re.I)
TAB_UNITS = ('', 'K', 'M', 'G', 'T', 'P')
RE_UNITS = re.compile(r'(\d+\.*\d*)\s*([KMGTP]{0,1})', re.I)
RE_VERSION = re.compile(r'(\d+)\.(\d+)\.(\d+)([a-zA-Z]*)(\d*)')
RE_IP4 = re.compile(r'inet\s+(addr:\s*){0,1}(\d+\.\d+\.\d+\.\d+)')
RE_IP6 = re.compile(r'inet6\s+(addr:\s*){0,1}([0-9a-f:]+)', re.I)
# Check if strings are defined for AM and PM
HAVE_AMPM = bool(time.strftime('%p', time.localtime()))
@@ -92,6 +94,15 @@ def calc_age(date, trans=False):
return age
def monthrange(start, finish):
""" Calculate months between 2 dates, used in the Config template """
months = (finish.year - start.year) * 12 + finish.month + 1
for i in xrange(start.month, months):
year = (i - 1) / 12 + start.year
month = (i - 1) % 12 + 1
yield datetime.date(year, month, 1)
def safe_lower(txt):
""" Return lowercased string. Return '' for None """
if txt:
@@ -100,13 +111,22 @@ def safe_lower(txt):
return ''
def safe_fnmatch(f, pattern):
""" fnmatch will fail if the pattern contains any of it's
key characters, like [, ] or !.
"""
try:
return fnmatch.fnmatch(f, pattern)
except re.error:
return False
def globber(path, pattern=u'*'):
""" Return matching base file/folder names in folder `path` """
# Cannot use glob.glob() because it doesn't support Windows long name notation
if os.path.exists(path):
return [f for f in os.listdir(path) if fnmatch.fnmatch(f, pattern)]
else:
return []
return [f for f in os.listdir(path) if safe_fnmatch(f, pattern)]
return []
def globber_full(path, pattern=u'*'):
@@ -114,13 +134,12 @@ def globber_full(path, pattern=u'*'):
# Cannot use glob.glob() because it doesn't support Windows long name notation
if os.path.exists(path):
try:
return [os.path.join(path, f) for f in os.listdir(path) if fnmatch.fnmatch(f, pattern)]
return [os.path.join(path, f) for f in os.listdir(path) if safe_fnmatch(f, pattern)]
except UnicodeDecodeError:
# This happens on Linux when names are incorrectly encoded, retry using a non-Unicode path
path = path.encode('utf-8')
return [os.path.join(path, f) for f in os.listdir(path) if fnmatch.fnmatch(f, pattern)]
else:
return []
return [os.path.join(path, f) for f in os.listdir(path) if safe_fnmatch(f, pattern)]
return []
def cat_to_opts(cat, pp=None, script=None, priority=None):
@@ -843,9 +862,11 @@ def get_cache_limit():
##############################################################################
# Directory operations
# Locked directory operations to avoid problems with simultaneous add/remove
##############################################################################
DIR_LOCK = threading.RLock()
@synchronized(DIR_LOCK)
def get_unique_path(dirpath, n=0, create_dir=True):
""" Determine a unique folder or filename """
@@ -865,6 +886,7 @@ def get_unique_path(dirpath, n=0, create_dir=True):
return get_unique_path(dirpath, n=n + 1, create_dir=create_dir)
@synchronized(DIR_LOCK)
def get_unique_filename(path):
""" Check if path is unique. If not, add number like: "/path/name.NUM.ext". """
num = 1
@@ -877,6 +899,7 @@ def get_unique_filename(path):
return path
@synchronized(DIR_LOCK)
def create_dirs(dirpath):
""" Create directory tree, obeying permissions """
if not os.path.exists(dirpath):
@@ -887,6 +910,7 @@ def create_dirs(dirpath):
return dirpath
@synchronized(DIR_LOCK)
def move_to_path(path, new_path):
""" Move a file to a new path, optionally give unique filename
Return (ok, new_path)
@@ -927,6 +951,7 @@ def move_to_path(path, new_path):
return ok, new_path
@synchronized(DIR_LOCK)
def cleanup_empty_directories(path):
""" Remove all empty folders inside (and including) 'path' """
path = os.path.normpath(path)
@@ -947,6 +972,7 @@ def cleanup_empty_directories(path):
pass
@synchronized(DIR_LOCK)
def get_filepath(path, nzo, filename):
""" Create unique filepath """
# This procedure is only used by the Assembler thread
@@ -983,6 +1009,94 @@ def get_filepath(path, nzo, filename):
return fullPath
@synchronized(DIR_LOCK)
def renamer(old, new):
""" Rename file/folder with retries for Win32 """
# Sanitize last part of new name
path, name = os.path.split(new)
# Use the more stringent folder rename to end up with a nicer name,
# but do not trim size
new = os.path.join(path, sanitize_foldername(name, False))
logging.debug('Renaming "%s" to "%s"', old, new)
if sabnzbd.WIN32:
retries = 15
while retries > 0:
# First we try 3 times with os.rename
if retries > 12:
try:
os.rename(old, new)
return
except:
retries -= 1
time.sleep(3)
continue
# Now we try the back-up method
logging.debug('Could not rename, trying move for %s to %s', old, new)
try:
shutil.move(old, new)
return
except WindowsError, err:
logging.debug('Error renaming "%s" to "%s" <%s>', old, new, err)
if err[0] == 32:
logging.debug('Retry rename %s to %s', old, new)
retries -= 1
else:
raise WindowsError(err)
time.sleep(3)
raise WindowsError(err)
else:
shutil.move(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)
return
except WindowsError, err:
if err[0] == 32:
logging.debug('Retry delete %s', path)
retries -= 1
else:
raise WindowsError(err)
time.sleep(3)
raise WindowsError(err)
else:
os.rmdir(path)
@synchronized(DIR_LOCK)
def remove_all(path, pattern='*', keep_folder=False, recursive=False):
""" Remove folder and all its content (optionally recursive) """
if os.path.exists(path):
files = globber_full(path, pattern)
if pattern == '*' and not sabnzbd.WIN32:
files.extend(globber_full(path, '.*'))
for f in files:
if os.path.isfile(f):
try:
logging.debug('Removing file %s', f)
os.remove(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)
except:
logging.info('Cannot remove folder %s', path)
def trim_win_path(path):
""" Make sure Windows path stays below 70 by trimming last part """
if sabnzbd.WIN32 and len(path) > 69:
@@ -1245,6 +1359,7 @@ def get_all_passwords(nzo):
pw = nzo.nzo_info.get('password')
if pw:
meta_passwords.append(pw)
if meta_passwords:
if nzo.password == meta_passwords[0]:
# this nzo.password came from meta, so don't use it twice
@@ -1252,19 +1367,23 @@ def get_all_passwords(nzo):
else:
passwords.extend(meta_passwords)
logging.info('Read %s passwords from meta data in NZB: %s', len(meta_passwords), meta_passwords)
pw_file = cfg.password_file.get_path()
if pw_file:
try:
pwf = open(pw_file, 'r')
lines = pwf.read().split('\n')
with open(pw_file, 'r') as pwf:
lines = pwf.read().split('\n')
# Remove empty lines and space-only passwords and remove surrounding spaces
pws = [pw.strip('\r\n ') for pw in lines if pw.strip('\r\n ')]
logging.debug('Read these passwords from file: %s', pws)
passwords.extend(pws)
pwf.close()
logging.info('Read %s passwords from file %s', len(pws), pw_file)
except IOError:
logging.info('Failed to read the passwords file %s', pw_file)
except:
logging.warning('Failed to read the passwords file %s', pw_file)
# Check size
if len(passwords) > 30:
logging.warning(T('Your password file contains more than 30 passwords, testing all these passwords takes a lot of time. Try to only list useful passwords.'))
if nzo.password:
# If an explicit password was set, add a retry without password, just in case.
@@ -1294,8 +1413,6 @@ def find_on_path(targets):
return None
_RE_IP4 = re.compile(r'inet\s+(addr:\s*){0,1}(\d+\.\d+\.\d+\.\d+)')
_RE_IP6 = re.compile(r'inet6\s+(addr:\s*){0,1}([0-9a-f:]+)', re.I)
def ip_extract():
""" Return list of IP addresses of this system """
ips = []
@@ -1322,99 +1439,14 @@ def ip_extract():
output = p.stdout.read()
p.wait()
for line in output.split('\n'):
m = _RE_IP4.search(line)
m = RE_IP4.search(line)
if not (m and m.group(2)):
m = _RE_IP6.search(line)
m = RE_IP6.search(line)
if m and m.group(2):
ips.append(m.group(2))
return ips
def renamer(old, new):
""" Rename file/folder with retries for Win32 """
# Sanitize last part of new name
path, name = os.path.split(new)
# Use the more stringent folder rename to end up with a nicer name,
# but do not trim size
new = os.path.join(path, sanitize_foldername(name, False))
logging.debug('Renaming "%s" to "%s"', old, new)
if sabnzbd.WIN32:
retries = 15
while retries > 0:
# First we try 3 times with os.rename
if retries > 12:
try:
os.rename(old, new)
return
except:
retries -= 1
time.sleep(3)
continue
# Now we try the back-up method
logging.debug('Could not rename, trying move for %s to %s', old, new)
try:
shutil.move(old, new)
return
except WindowsError, err:
logging.debug('Error renaming "%s" to "%s" <%s>', old, new, err)
if err[0] == 32:
logging.debug('Retry rename %s to %s', old, new)
retries -= 1
else:
raise WindowsError(err)
time.sleep(3)
raise WindowsError(err)
else:
shutil.move(old, new)
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)
return
except WindowsError, err:
if err[0] == 32:
logging.debug('Retry delete %s', path)
retries -= 1
else:
raise WindowsError(err)
time.sleep(3)
raise WindowsError(err)
else:
os.rmdir(path)
def remove_all(path, pattern='*', keep_folder=False, recursive=False):
""" Remove folder and all its content (optionally recursive) """
if os.path.exists(path):
files = globber_full(path, pattern)
if pattern == '*' and not sabnzbd.WIN32:
files.extend(globber_full(path, '.*'))
for f in files:
if os.path.isfile(f):
try:
logging.debug('Removing file %s', f)
os.remove(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)
except:
logging.info('Cannot remove folder %s', path)
def is_writable(path):
""" Return True is file is writable (also when non-existent) """
if os.path.isfile(path):
@@ -1461,7 +1493,7 @@ def starts_with_path(path, prefix):
def set_chmod(path, permissions, report):
""" Set 'permissions' on 'path', report any errors when 'report' is True """
try:
logging.debug('Applying %s to %s', permissions, path)
logging.debug('Applying permissions %s (octal) to %s', oct(permissions), path)
os.chmod(path, permissions)
except:
lpath = path.lower()

View File

@@ -33,7 +33,7 @@ from sabnzbd.encoding import TRANS, UNTRANS, unicoder, platform_encode, deunicod
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
has_win_device, calc_age, long_path
from sabnzbd.tvsort import SeriesSorter
import sabnzbd.cfg as cfg
from sabnzbd.constants import Status
@@ -226,9 +226,10 @@ def unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, joinables, zi
# First time, ignore anything in workdir_complete
xjoinables, xzips, xrars, xsevens, xts = build_filelists(workdir)
else:
xjoinables, xzips, xrars, xsevens, xts = build_filelists(workdir, workdir_complete)
xjoinables, xzips, xrars, xsevens, xts = build_filelists(workdir, workdir_complete, check_both=dele)
rerun = False
force_rerun = False
newfiles = []
error = 0
new_joins = new_rars = new_zips = new_ts = None
@@ -290,7 +291,14 @@ def unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, joinables, zi
if nzo.reuse and depth == 1 and any(build_filelists(workdir, workdir_complete)):
rerun = True
if rerun and (cfg.enable_recursive() or new_ts or new_joins):
# Double-check that we didn't miss any files in workdir
# But only if dele=True, otherwise of course there will be files left
if rerun and dele and depth == 1 and any(build_filelists(workdir)):
force_rerun = True
# Clear lists to force re-scan of files
xjoinables, xzips, xrars, xsevens, xts = ([], [], [], [], [])
if rerun and (cfg.enable_recursive() or new_ts or new_joins or force_rerun):
z, y = unpack_magic(nzo, workdir, workdir_complete, dele, one_folder,
xjoinables, xzips, xrars, xsevens, xts, depth)
if z:
@@ -475,20 +483,18 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
if nzo.direct_unpacker:
while nzo.direct_unpacker.is_alive():
logging.debug('DirectUnpacker still alive for %s', nzo)
time.sleep(2)
# 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 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 = 0
success = 1
rars = rar_sets[rar_set]
fail = False
success = True
rars = nzo.direct_unpacker.success_sets.pop(rar_set)
newfiles = globber(extraction_path)
nzo.direct_unpacker.success_sets.remove(rar_set)
else:
logging.info("Extracting rarfile %s (belonging to %s) to %s",
rarpath, rar_set, extraction_path)
@@ -497,7 +503,7 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
one_folder, nzo, rar_set, extraction_path)
# Was it aborted?
if not nzo.pp_active:
fail = 1
fail = True
break
success = not fail
except:
@@ -516,6 +522,23 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
logging.debug('rar_unpack(): Newfiles: %s', newfiles)
extracted_files.extend(newfiles)
# Do not fail if this was a recursive unpack
if fail and rarpath.startswith(workdir_complete):
# Do not delete the files, leave it to user!
logging.info('Ignoring failure to do recursive unpack of %s', rarpath)
fail = 0
success = True
newfiles = []
# Do not fail if this was maybe just some duplicate fileset
# Multipar and par2tbb will detect and log them, par2cmdline will not
if fail and rar_set.endswith(('.1', '.2')):
# Just in case, we leave the raw files
logging.info('Ignoring failure of unpack for possible duplicate file %s', rarpath)
fail = 0
success = True
newfiles = []
# Delete the old files if we have to
if success and delete and newfiles:
for rar in rars:
@@ -600,6 +623,10 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
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)
elif RAR_PROBLEM:
# Use only oldest options (specifically no "-or")
command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, password_command,
@@ -616,8 +643,6 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
# Get list of all the volumes part of this set
logging.debug("Analyzing rar file ... %s found", rarfile.is_rarfile(rarfile_path))
rarfiles = rarfile.RarFile(rarfile_path).volumelist()
logging.debug("Running unrar %s", command)
p = Popen(command, shell=need_shell, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
@@ -632,6 +657,7 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
# Loop over the output from rar!
curr = 0
extracted = []
rarfiles = []
fail = 0
inrecovery = False
lines = []
@@ -654,6 +680,9 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
lines.append(line)
if line.startswith('Extracting from'):
filename = TRANS((re.search(EXTRACTFROM_RE, line).group(1)))
if filename not in rarfiles:
rarfiles.append(filename)
curr += 1
nzo.set_action_line(T('Unpacking'), '%02d/%02d' % (curr, numrars))
@@ -778,6 +807,9 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
proc.close()
p.wait()
# Which files did we use to extract this?
rarfiles = rar_volumelist(rarfile_path, password, rarfiles)
logging.debug('UNRAR output %s', '\n'.join(lines))
nzo.fail_msg = ''
msg = T('Unpacked %s files/folders in %s') % (str(len(extracted)), format_time_string(time.time() - start))
@@ -802,7 +834,7 @@ def unzip(nzo, workdir, workdir_complete, delete, one_folder, zips):
for _zip in zips:
logging.info("Starting extract on zipfile: %s ", _zip)
nzo.set_action_line(T('Unpacking'), '%s' % unicoder(_zip))
nzo.set_action_line(T('Unpacking'), '%s' % unicoder(os.path.basename(_zip)))
if workdir_complete and _zip.startswith(workdir):
extraction_path = workdir_complete
@@ -1218,6 +1250,8 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
verifytotal = 0
verified = 0
in_verify_repaired = False
# Loop over the output, whee
while 1:
char = proc.read(1)
@@ -1279,6 +1313,9 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
format_time_string(time.time() - start))
start = time.time()
verified = 1
# Reset to use them again for verification of repair
verifytotal = 0
verifynum = 0
elif line.startswith('Loading "'):
# Found an extra par2 file. Only the next line will tell whether it's usable
@@ -1370,9 +1407,7 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
else:
block_table.pop(block_size)
logging.info('Added %s blocks to %s',
added_blocks, nzo.final_name)
logging.info('Added %s blocks to %s', added_blocks, nzo.final_name)
if not force:
msg = T('Fetching %s blocks...') % str(added_blocks)
@@ -1402,6 +1437,20 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
logging.info('Repaired in %s', format_time_string(time.time() - start))
finished = 1
elif verified and line.endswith(('are missing.', 'exist but are damaged.')):
# Files that will later be verified after repair
chunks = line.split()
verifytotal += int(chunks[0])
elif line.startswith('Verifying repaired files'):
in_verify_repaired = True
nzo.set_action_line(T('Verifying repair'), '%02d/%02d' % (verifynum, verifytotal))
elif in_verify_repaired and line.startswith('Target'):
verifynum += 1
if verifynum <= verifytotal:
nzo.set_action_line(T('Verifying repair'), '%02d/%02d' % (verifynum, verifytotal))
elif line.startswith('File:') and line.find('data blocks from') > 0:
m = _RE_BLOCK_FOUND.search(line)
if m:
@@ -1493,7 +1542,12 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
verifynum += 1
nzo.set_action_line(T('Verifying'), '%02d/%02d' % (verifynum, verifytotal))
nzo.status = Status.VERIFYING
datafiles.append(TRANS(m.group(1)))
# Remove redundant extra files that are just duplicates of original ones
if 'duplicate data blocks' in line:
used_for_repair.append(TRANS(m.group(1)))
else:
datafiles.append(TRANS(m.group(1)))
continue
# Verify done
@@ -1742,6 +1796,7 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
elif line.startswith('Finding available slice'):
# The actual scanning of the files
in_verify = True
nzo.set_action_line(T('Verifying'), T('Checking'))
elif in_verify:
m = _RE_FILENAME.search(line)
if m:
@@ -1914,7 +1969,7 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
if renames:
# If succes, we also remove the possibly previously renamed ones
if finished:
reconstructed.extend(nzo.renames)
reconstructed.extend(renames.values())
# Adding to the collection
nzo.renamed_file(renames)
@@ -1979,6 +2034,7 @@ def userxbit(filename):
xbitset = (rwxbits & userxbit) > 0
return xbitset
def build_command(command):
""" Prepare list from running an external program """
if not sabnzbd.WIN32:
@@ -2030,6 +2086,31 @@ def build_command(command):
return stup, need_shell, command, creationflags
def rar_volumelist(rarfile_path, password, known_volumes):
""" Extract volumes that are part of this rarset
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)
# setpassword can fail due to bugs in RarFile
if password:
try:
zf.setpassword(password)
except:
pass
zf_volumes = zf.volumelist()
# Remove duplicates
known_volumes_base = [os.path.basename(vol) for vol in known_volumes]
for zf_volume in zf_volumes:
if os.path.basename(zf_volume) not in known_volumes_base:
# Long-path notation just to be sure
known_volumes.append(long_path(zf_volume))
return known_volumes
# Sort the various RAR filename formats properly :\
def rar_sort(a, b):
""" Define sort method for rar file names """
@@ -2046,8 +2127,9 @@ def rar_sort(a, b):
return cmp(a, b)
def build_filelists(workdir, workdir_complete=None, check_rar=True):
def build_filelists(workdir, workdir_complete=None, check_both=False, check_rar=True):
""" Build filelists, if workdir_complete has files, ignore workdir.
Optionally scan both directories.
Optionally test content to establish RAR-ness
"""
sevens, joinables, zips, rars, ts, filelist = ([], [], [], [], [], [])
@@ -2063,7 +2145,7 @@ def build_filelists(workdir, workdir_complete=None, check_rar=True):
# Just skip failing names
pass
if workdir and not filelist:
if workdir and (not filelist or check_both):
for root, dirs, files in os.walk(workdir):
for _file in files:
if '.AppleDouble' not in root and '.DS_Store' not in root:

View File

@@ -42,12 +42,14 @@ from sabnzbd.newsunpack import external_script
from gntp.core import GNTPRegister
from gntp.notifier import GrowlNotifier
import gntp.errors
try:
import Growl
# Detect classic Growl (older than 1.3)
_HAVE_CLASSIC_GROWL = os.path.isfile('/Library/PreferencePanes/Growl.prefPane/Contents/MacOS/Growl')
except ImportError:
_HAVE_CLASSIC_GROWL = False
try:
import warnings
# Make any warnings exceptions, so that pynotify is ignored
@@ -56,6 +58,10 @@ try:
warnings.simplefilter("error")
import pynotify
_HAVE_NTFOSD = True
# Check for working version, not all pynotify are the same
if not hasattr(pynotify, 'init'):
_HAVE_NTFOSD = False
except:
_HAVE_NTFOSD = False
@@ -136,8 +142,8 @@ def check_cat(section, job_cat):
section_cats = sabnzbd.config.get_config(section, '%s_cats' % section)()
return ('*' in section_cats or job_cat in section_cats)
except TypeError:
logging.debug('Incorrect Notify option %s:%s_prio_%s', section, section, gtype)
return False
logging.debug('Incorrect Notify option %s:%s_cats', section, section)
return True
def send_notification(title, msg, gtype, job_cat=None):

View File

@@ -111,6 +111,7 @@ class NzbQueue(object):
if sabnzbd.OLD_QUEUE and cfg.warned_old_queue() < QUEUE_VERSION:
logging.warning(T('Old queue detected, use Status->Repair to convert the queue'))
cfg.warned_old_queue.set(QUEUE_VERSION)
sabnzbd.config.save_config()
else:
# Try to process
try:
@@ -142,6 +143,7 @@ class NzbQueue(object):
# Done converting
cfg.converted_nzo_pickles.set(True)
sabnzbd.config.save_config()
nzo_ids = []
return nzo_ids
@@ -766,10 +768,6 @@ class NzbQueue(object):
def end_job(self, nzo):
""" Send NZO to the post-processing queue """
logging.info('Ending job %s', nzo.final_name)
if self.actives(grabs=False) < 2 and cfg.autodisconnect():
# This was the last job, close server connections
if sabnzbd.downloader.Downloader.do:
sabnzbd.downloader.Downloader.do.disconnect()
# Notify assembler to call postprocessor
if not nzo.deleted:
@@ -859,6 +857,7 @@ class NzbQueue(object):
for nzo in self.__nzo_list:
if not nzo.futuretype and not nzo.files and nzo.status not in (Status.PAUSED, Status.GRABBING):
empty.append(nzo)
for nzo in empty:
self.end_job(nzo)

View File

@@ -41,11 +41,11 @@ import sabnzbd
from sabnzbd.constants import GIGI, ATTRIB_FILE, JOB_ADMIN, \
DEFAULT_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY, \
PAUSED_PRIORITY, TOP_PRIORITY, DUP_PRIORITY, REPAIR_PRIORITY, \
RENAMES_FILE, Status, PNFO
RENAMES_FILE, MAX_BAD_ARTICLES, Status, PNFO
from sabnzbd.misc import to_units, cat_to_opts, cat_convert, sanitize_foldername, \
get_unique_path, get_admin_path, remove_all, sanitize_filename, globber_full, \
int_conv, set_permissions, format_time_string, long_path, trim_win_path, \
fix_unix_encoding, calc_age
fix_unix_encoding, calc_age, is_obfuscated_filename
from sabnzbd.decorators import synchronized
import sabnzbd.config as config
import sabnzbd.cfg as cfg
@@ -60,6 +60,8 @@ SUBJECT_FN_MATCHER = re.compile(r'"([^"]*)"')
PROBABLY_PAR2_RE = re.compile(r'(.*)\.vol(\d*)[\+\-](\d*)\.par2', re.I)
REJECT_PAR2_RE = re.compile(r'\.par2\.\d+', re.I) # Reject duplicate par2 files
RE_NORMAL_NAME = re.compile(r'\.\w{2,5}$') # Test reasonably sized extension at the end
RE_QUICK_PAR2_CHECK = re.compile(r'\.par2\W*', re.I)
RE_RAR = re.compile(r'(\.rar|\.r\d\d|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d)$', re.I)
##############################################################################
@@ -277,7 +279,7 @@ class NzbFile(TryList):
self.decodetable[partnum] = article
self.import_finished = True
else:
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)
@@ -305,13 +307,27 @@ class NzbFile(TryList):
self.blocks = int(blocks)
def get_article(self, server, servers):
""" Get next article to be downloaded """
""" Get next article to be downloaded from this server
Returns None when there are still articles to try
Returns False when all articles are tried
"""
# Make sure all articles have tried this server before
# adding to the NZF-TryList, otherwise there will be stalls!
tried_all_articles = True
for article in self.articles:
article = article.get_article(server, servers)
if article:
return article
article_return = article.get_article(server, servers)
if article_return:
return article_return
elif tried_all_articles and not article.server_in_try_list(server):
tried_all_articles = False
self.add_to_try_list(server)
# We are sure they are all tried
if tried_all_articles:
self.add_to_try_list(server)
return False
# Still articles left to try
return None
def reset_all_try_lists(self):
""" Clear all lists of visited servers """
@@ -457,7 +473,7 @@ class NzbParser(xml.sax.handler.ContentHandler):
if segm != self.article_db[partnum][0]:
msg = 'Duplicate part %s, but different ID-s (%s // %s)' % (partnum, self.article_db[partnum][0], segm)
logging.info(msg)
self.nzo.inc_log('dup_art_log', msg)
self.nzo.increase_bad_articles_counter('duplicate_articles')
else:
logging.info("Skipping duplicate article (%s)", segm)
else:
@@ -490,6 +506,11 @@ class NzbParser(xml.sax.handler.ContentHandler):
nzo_matches = filter(lambda x: (x.filename == nzf.filename), self.nzo.files)
if nzo_matches:
logging.info('File %s occured twice in NZB, discarding smaller file', nzf.filename)
# Keep some logging how many were duplicates
if 'duplicate_files' not in self.nzo.nzo_info:
self.nzo.nzo_info['duplicate_files'] = 0
self.nzo.nzo_info['duplicate_files'] += 1
# Which is smaller? Current or old one
if nzo_matches[0].bytes >= nzf.bytes:
# Skip this new one
@@ -551,9 +572,9 @@ NzbObjectSaver = (
'filename', 'work_name', 'final_name', 'created', 'bytes', 'bytes_downloaded', 'bytes_tried',
'repair', 'unpack', 'delete', 'script', 'cat', 'url', 'groups', 'avg_date', 'md5of16k',
'partable', 'extrapars', 'md5packs', 'files', 'files_table', 'finished_files', 'status',
'avg_bps_freq', 'avg_bps_total', 'priority', 'dupe_table', 'saved_articles', 'nzo_id',
'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',
'custom_name', 'password', 'next_save', 'save_timeout', 'encrypted', 'bad_articles',
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta',
'md5sum', 'servercount', 'unwanted_ext', 'renames', 'rating_filtered'
)
@@ -608,6 +629,7 @@ class NzbObject(TryList):
self.bytes = 0 # Original bytesize
self.bytes_downloaded = 0 # Downloaded byte
self.bytes_tried = 0 # Which bytes did we try
self.bad_articles = 0 # How many bad (non-recoverable) articles
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
@@ -643,8 +665,6 @@ class NzbObject(TryList):
priority = DEFAULT_PRIORITY
self.priority = priority
self.dupe_table = {}
self.saved_articles = []
self.nzo_id = None
@@ -848,17 +868,23 @@ class NzbObject(TryList):
if duplicate and ((not series and cfg.no_dupes() == 3) or (series and cfg.no_series_dupes() == 3)):
if cfg.warn_dupl_jobs():
logging.warning(T('Failing duplicate NZB "%s"'), filename)
# Move to history, utlizing the same code as accept&fail from pre-queue script
# Move to history, utilizing the same code as accept&fail from pre-queue script
self.fail_msg = T('Duplicate NZB')
accept = 2
duplicate = False
if duplicate or self.priority == DUP_PRIORITY:
if cfg.warn_dupl_jobs():
logging.warning(T('Pausing duplicate NZB "%s"'), filename)
self.duplicate = True
self.pause()
self.priority = NORMAL_PRIORITY
if cfg.no_dupes() == 4 or cfg.no_series_dupes() == 4:
if cfg.warn_dupl_jobs():
logging.warning('%s: "%s"', T('Duplicate NZB'), filename)
self.duplicate = True
self.priority = NORMAL_PRIORITY
else:
if cfg.warn_dupl_jobs():
logging.warning(T('Pausing duplicate NZB "%s"'), filename)
self.duplicate = True
self.pause()
self.priority = NORMAL_PRIORITY
if self.priority == PAUSED_PRIORITY:
self.pause()
@@ -872,6 +898,10 @@ class NzbObject(TryList):
else:
self.files.sort(cmp=nzf_cmp_name)
# Warn if there were many duplicate files
if 'duplicate_files' in self.nzo_info and self.nzo_info['duplicate_files'] >= 10:
logging.warning(T('%d files with duplicate filenames were discared for "%s". Enable "allow_duplicate_files" to allow duplicate filenames.'), self.nzo_info['duplicate_files'], self.final_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
@@ -908,8 +938,8 @@ class NzbObject(TryList):
if not self.password and self.meta.get('password'):
self.password = self.meta.get('password', [None])[0]
# Set nzo save-delay to minimum 30 seconds
self.save_timeout = max(30, min(6.0 * float(self.bytes) / GIGI, 300.0))
# Set nzo save-delay to minimum 120 seconds
self.save_timeout = max(120, min(6.0 * float(self.bytes) / GIGI, 300.0))
# In case pre-queue script or duplicate check want to move
# to history we first need an nzo_id by entering the NzbQueue
@@ -921,21 +951,6 @@ class NzbObject(TryList):
# Raise error, so it's not added
raise TypeError
def check_for_dupe(self, nzf):
filename = nzf.filename
dupe = False
if filename in self.dupe_table:
old_nzf = self.dupe_table[filename]
if nzf.article_count <= old_nzf.article_count:
dupe = True
if not dupe:
self.dupe_table[filename] = nzf
return dupe
@synchronized(NZO_LOCK)
def update_download_stats(self, bps, serverid, bytes):
if bps:
@@ -976,8 +991,9 @@ class NzbObject(TryList):
head, vol, block = analyse_par2(name)
if head and matcher(lparset, head.lower()):
xnzf.set_par2(parset, vol, block)
# Don't postpone if all par2 should be kept
if cfg.enable_par_cleanup():
# Don't postpone if all par2 are desired and should be kept
# Also don't postpone header-only-files, to extract all possible md5of16k
if not(cfg.enable_all_par() and not cfg.enable_par_cleanup()) and block:
self.extrapars[parset].append(xnzf)
self.files.remove(xnzf)
@@ -1054,9 +1070,12 @@ class NzbObject(TryList):
if not found:
# Add extra parfiles when there was a damaged article and not pre-checking
if self.extrapars and not self.precheck:
self.abort_direct_unpacker()
self.prospective_add(nzf)
# Sometimes a few CRC errors are still fine, so we continue
if self.bad_articles > MAX_BAD_ARTICLES:
self.abort_direct_unpacker()
post_done = False
if not self.files:
post_done = True
@@ -1085,7 +1104,7 @@ class NzbObject(TryList):
if name in files:
files.remove(name)
files.append(renames[name])
self.renames = renames
self.renames = renames
# Looking for the longest name first, minimizes the chance on a mismatch
files.sort(lambda x, y: len(y) - len(x))
@@ -1230,19 +1249,10 @@ class NzbObject(TryList):
if self.partable and _set in self.partable and self.partable[_set] and parfile in self.partable[_set].extrapars:
self.partable[_set].extrapars.remove(parfile)
__re_quick_par2_check = re.compile(r'\.par2\W*', re.I)
@synchronized(NZO_LOCK)
def prospective_add(self, nzf):
""" Add par2 files to compensate for missing articles
"""
# How many do we need?
bad = len(self.nzo_info.get('bad_art_log', []))
miss = len(self.nzo_info.get('missing_art_log', []))
killed = len(self.nzo_info.get('killed_art_log', []))
dups = len(self.nzo_info.get('dup_art_log', []))
total_need = bad + miss + killed + dups
# How many do we already have?
blocks_already = 0
for nzf_check in self.files:
@@ -1254,16 +1264,16 @@ class NzbObject(TryList):
original_filename = self.renames.get(nzf.filename, '')
# Need more?
if not nzf.is_par2 and blocks_already < total_need:
if not nzf.is_par2 and blocks_already < self.bad_articles:
# We have to find the right par-set
for parset in self.extrapars.keys():
if (parset in nzf.filename or parset in original_filename) and self.extrapars[parset]:
extrapars_sorted = sorted(self.extrapars[parset], key=lambda x: x.blocks, reverse=True)
# Loop until we have enough
while blocks_already < total_need and extrapars_sorted:
while blocks_already < self.bad_articles and extrapars_sorted:
new_nzf = extrapars_sorted.pop()
# Reset NZF TryList, in case something was on it before it became extrapar
new_nzf.reset_try_list()
new_nzf.reset_all_try_lists()
self.add_parfile(new_nzf)
self.extrapars[parset] = extrapars_sorted
blocks_already = blocks_already + int_conv(new_nzf.blocks)
@@ -1286,6 +1296,12 @@ class NzbObject(TryList):
""" Determine amount of articles present on servers
and return (gross available, nett) bytes
"""
# Few missing articles in RAR-only job might still work
if self.bad_articles <= MAX_BAD_ARTICLES:
logging.debug('Download Quality: bad-articles=%s', self.bad_articles)
return True, 200
# Do the full check
need = 0L
pars = 0L
short = 0L
@@ -1294,7 +1310,7 @@ class NzbObject(TryList):
nzf = self.files_table[nzf_id]
if nzf.deleted:
short += nzf.bytes_left
if self.__re_quick_par2_check.search(nzf.subject):
if RE_QUICK_PAR2_CHECK.search(nzf.subject):
pars += nzf.bytes
anypars = True
else:
@@ -1326,35 +1342,38 @@ class NzbObject(TryList):
msg1 = T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024, dec_limit=1))
msg1 += u'<br/>' + T('Age') + ': ' + calc_age(self.avg_date, True)
bad = self.nzo_info.get('bad_art_log', [])
miss = self.nzo_info.get('missing_art_log', [])
killed = self.nzo_info.get('killed_art_log', [])
dups = self.nzo_info.get('dup_art_log', [])
bad = self.nzo_info.get('bad_articles', 0)
miss = self.nzo_info.get('missing_articles', 0)
killed = self.nzo_info.get('killed_articles', 0)
dups = self.nzo_info.get('duplicate_articles', 0)
msg2 = msg3 = msg4 = msg5 = ''
if bad:
msg2 = (u'<br/>' + T('%s articles were malformed')) % len(bad)
msg2 = (u'<br/>' + T('%s articles were malformed')) % bad
if miss:
msg3 = (u'<br/>' + T('%s articles were missing')) % len(miss)
msg3 = (u'<br/>' + T('%s articles were missing')) % miss
if dups:
msg4 = (u'<br/>' + T('%s articles had non-matching duplicates')) % len(dups)
msg4 = (u'<br/>' + T('%s articles had non-matching duplicates')) % dups
if killed:
msg5 = (u'<br/>' + T('%s articles were removed')) % len(killed)
msg5 = (u'<br/>' + T('%s articles were removed')) % killed
msg = u''.join((msg1, msg2, msg3, msg4, msg5, ))
self.set_unpack_info('Download', msg, unique=True)
if self.url:
self.set_unpack_info('Source', self.url, unique=True)
servers = config.get_servers()
if len(self.servercount) > 0:
msgs = ['%s=%sB' % (servers[server].displayname(), to_units(self.servercount[server])) for server in self.servercount if server in servers]
# Sort the servers first
servers = config.get_servers()
server_names = sorted(servers.keys(), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower()))
msgs = ['%s=%sB' % (servers[server_name].displayname(), to_units(self.servercount[server_name])) for server_name in server_names if server_name in self.servercount]
self.set_unpack_info('Servers', ', '.join(msgs), unique=True)
@synchronized(NZO_LOCK)
def inc_log(self, log, txt):
""" Append string txt to nzo_info element "log" """
try:
self.nzo_info[log].append(txt)
except:
self.nzo_info[log] = [txt]
def increase_bad_articles_counter(self, type):
""" Record information about bad articles """
if type not in self.nzo_info:
self.nzo_info[type] = 0
self.nzo_info[type] += 1
self.bad_articles += 1
def server_allowed(self, server):
if not server.categories:
@@ -1369,6 +1388,7 @@ class NzbObject(TryList):
def get_article(self, server, servers):
article = None
nzf_remove_list = []
tried_all_articles = True
for nzf in self.files:
if nzf.deleted:
@@ -1392,16 +1412,21 @@ class NzbObject(TryList):
article = nzf.get_article(server, servers)
if article:
break
if article == None:
# None is returned by NZF when server is not tried for all articles
tried_all_articles = False
# Remove all files for which admin could not be read
for nzf in nzf_remove_list:
nzf.deleted = 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)
if not article:
# Only add to trylist when server has been tried for all articles of all NZF's
if not article and tried_all_articles:
# No articles for this server, block for next time
self.add_to_try_list(server)
return article
@@ -1474,6 +1499,33 @@ class NzbObject(TryList):
self.files[pos + 1] = nzf
self.files[pos] = tmp_nzf
def verify_nzf_filename(self, nzf, yenc_filename=None):
""" Get filename from par2-info or from yenc """
# Already done?
if nzf.filename_checked:
return
# If we have the md5, use it to rename
if nzf.md5of16k and self.md5of16k:
# Don't check again, even if no match
nzf.filename_checked = True
# Find the match and rename
if nzf.md5of16k in self.md5of16k:
new_filename = platform_encode(self.md5of16k[nzf.md5of16k])
# Was it even new?
if new_filename != nzf.filename:
logging.info('Detected filename based on par2: %s -> %s', nzf.filename, new_filename)
self.renamed_file(new_filename, nzf.filename)
nzf.filename = new_filename
return
# Fallback to yenc/nzb name (also when there is no partnum=1)
# We also keep the NZB name in case it ends with ".par2" (usually correct)
if yenc_filename and yenc_filename != nzf.filename and not is_obfuscated_filename(yenc_filename) and not nzf.filename.endswith('.par2'):
logging.info('Detected filename from yenc: %s -> %s', nzf.filename, yenc_filename)
self.renamed_file(yenc_filename, nzf.filename)
nzf.filename = yenc_filename
@synchronized(NZO_LOCK)
def renamed_file(self, name_set, old_name=None):
""" Save renames at various stages (Download/PP)
@@ -1582,7 +1634,7 @@ class NzbObject(TryList):
self.files if full else [],
queued_files,
self.status, self.priority,
len(self.nzo_info.get('missing_art_log', [])),
self.nzo_info.get('missing_articles', 0),
self.bytes_tried - self.bytes_downloaded,
self.direct_unpacker.get_formatted_stats() if self.direct_unpacker else 0)
@@ -1710,6 +1762,8 @@ class NzbObject(TryList):
self.md5of16k = {}
if self.renames is None:
self.renames = {}
if self.bad_articles is None:
self.bad_articles = 0
if self.bytes_tried is None:
# Fill with old info
self.bytes_tried = 0
@@ -1767,8 +1821,6 @@ def nzf_cmp_name(nzf1, nzf2, name=True):
if name:
# Prioritize .rar files above any other type of file (other than vol-par)
# Useful for nzb streaming
RE_RAR = re.compile(r'(\.rar|\.r\d\d|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d)$', re.I)
m1 = RE_RAR.search(name1)
m2 = RE_RAR.search(name2)
if m1 and not (is_par2 or m2):

View File

@@ -59,25 +59,18 @@ class PostProcessor(Thread):
""" PostProcessor thread, designed as Singleton """
do = None # Link to instance of the thread
def __init__(self, queue=None, history_queue=None):
""" Initialize, optionally passing existing queue """
def __init__(self):
""" Initialize PostProcessor thread """
Thread.__init__(self)
# This history queue is simply used to log what active items to display in the web_ui
if history_queue:
self.history_queue = history_queue
else:
self.load()
self.load()
if self.history_queue is None:
self.history_queue = []
if queue:
self.queue = queue
else:
self.queue = Queue.Queue()
for nzo in self.history_queue:
self.process(nzo)
self.queue = Queue.Queue()
for nzo in self.history_queue:
self.process(nzo)
self.__stop = False
self.paused = False
PostProcessor.do = self
@@ -144,8 +137,10 @@ class PostProcessor(Thread):
def cancel_pp(self, nzo_id):
""" Change the status, so that the PP is canceled """
for nzo in self.history_queue:
if nzo.nzo_id == nzo_id and nzo.pp_active:
nzo.pp_active = False
if nzo.nzo_id == nzo_id:
nzo.abort_direct_unpacker()
if nzo.pp_active:
nzo.pp_active = False
return True
return None
@@ -313,6 +308,11 @@ def process_job(nzo):
# Try to get more par files
return False
# If we don't need extra par2, we can disconnect
if sabnzbd.nzbqueue.NzbQueue.do.actives(grabs=False) == 0 and cfg.autodisconnect():
# This was the last job, close server connections
sabnzbd.downloader.Downloader.do.disconnect()
# Sanitize the resulting files
if sabnzbd.WIN32:
sanitize_files_in_folder(workdir)
@@ -552,6 +552,8 @@ def process_job(nzo):
# Add the nzo to the database. Only the path, script and time taken is passed
# Other information is obtained from the nzo
history_db.add_history_db(nzo, clip_path(workdir_complete), nzo.downpath, postproc_time, script_log, script_line)
# Purge items
history_db.auto_history_purge()
# The connection is only used once, so close it here
history_db.close()
sabnzbd.history_updated()
@@ -564,6 +566,7 @@ def prepare_extraction_path(nzo):
Seperated so it can be called from DirectUnpacker
"""
one_folder = False
marker_file = None
# Determine class directory
catdir = config.get_categories(nzo.cat).dir()
if catdir.endswith('*'):
@@ -573,7 +576,10 @@ def prepare_extraction_path(nzo):
complete_dir = long_path(complete_dir)
# TV/Movie/Date Renaming code part 1 - detect and construct paths
file_sorter = Sorter(nzo, nzo.cat)
if cfg.enable_meta():
file_sorter = Sorter(nzo, nzo.cat)
else:
file_sorter = Sorter(None, nzo.cat)
complete_dir = file_sorter.detect(nzo.final_name, complete_dir)
if file_sorter.sort_file:
one_folder = False
@@ -587,7 +593,7 @@ def prepare_extraction_path(nzo):
marker_file = set_marker(workdir_complete)
if not workdir_complete or not os.path.exists(workdir_complete):
crash_msg = T('Cannot create final folder %s') % unicoder(os.path.join(complete_dir, nzo.final_name))
logging.error(T('Cannot create final folder %s') % unicoder(os.path.join(complete_dir, nzo.final_name)))
raise IOError
if cfg.folder_rename() and not one_folder:

View File

@@ -28,12 +28,28 @@ import time
##############################################################################
# Power management for Windows
##############################################################################
try:
import win32security
import win32api
import ntsecuritycon
except ImportError:
pass
def win_power_privileges():
""" To do any power-options, the process needs higher privileges """
flags = ntsecuritycon.TOKEN_ADJUST_PRIVILEGES | ntsecuritycon.TOKEN_QUERY
htoken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), flags)
id_ = win32security.LookupPrivilegeValue(None, ntsecuritycon.SE_SHUTDOWN_NAME)
newPrivileges = [(id_, ntsecuritycon.SE_PRIVILEGE_ENABLED)]
win32security.AdjustTokenPrivileges(htoken, 0, newPrivileges)
def win_hibernate():
""" Hibernate Windows system, returns after wakeup """
try:
subprocess.Popen("rundll32 powrprof.dll,SetSuspendState Hibernate")
time.sleep(10)
win_power_privileges()
win32api.SetSystemPowerState(False, True)
except:
logging.error(T('Failed to hibernate system'))
logging.info("Traceback: ", exc_info=True)
@@ -42,8 +58,8 @@ def win_hibernate():
def win_standby():
""" Standby Windows system, returns after wakeup """
try:
subprocess.Popen("rundll32 powrprof.dll,SetSuspendState Standby")
time.sleep(10)
win_power_privileges()
win32api.SetSystemPowerState(True, True)
except:
logging.error(T('Failed to standby system'))
logging.info("Traceback: ", exc_info=True)
@@ -52,15 +68,7 @@ def win_standby():
def win_shutdown():
""" Shutdown Windows system, never returns """
try:
import win32security
import win32api
import ntsecuritycon
flags = ntsecuritycon.TOKEN_ADJUST_PRIVILEGES | ntsecuritycon.TOKEN_QUERY
htoken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), flags)
id_ = win32security.LookupPrivilegeValue(None, ntsecuritycon.SE_SHUTDOWN_NAME)
newPrivileges = [(id_, ntsecuritycon.SE_PRIVILEGE_ENABLED)]
win32security.AdjustTokenPrivileges(htoken, 0, newPrivileges)
win_power_privileges()
win32api.InitiateSystemShutdown("", "", 30, 1, 0)
finally:
os._exit(0)

View File

@@ -271,8 +271,6 @@ class Rating(Thread):
api_key = cfg.rating_api_key()
rating_host = cfg.rating_host()
rating_url = _RATING_URL
if not api_key:
return True
requests = []
_headers = {'User-agent': 'SABnzbd+/%s' % sabnzbd.version.__version__, 'Content-type': 'application/x-www-form-urlencoded'}
@@ -283,8 +281,15 @@ class Rating(Thread):
# Is it an URL or just a HOST?
if host_parsed.path and host_parsed.path != '/':
rating_url = host_parsed.path + '?' + host_parsed.query if host_parsed.query else host_parsed.path
if not rating_host:
_warn('%s: %s' % (T('Cannot send, missing required data'), T('Server address')))
return True
if not api_key:
_warn('%s [%s]: %s - %s' % (T('Cannot send, missing required data'), rating_host, T('API Key'), T('This key provides identity to indexer. Check your profile on the indexer\'s website.')))
return True
if rating.changed & Rating.CHANGED_USER_VIDEO:
requests.append({'m': 'r', 'r': 'videoQuality', 'rn': rating.user_video})
if rating.changed & Rating.CHANGED_USER_AUDIO:

View File

@@ -193,6 +193,11 @@ def init():
__SCHED.add_daytime_task(action, 'quota_reset', range(1, 8), None, (hour, minute),
kronos.method.sequential, [], None)
if sabnzbd.misc.int_conv(cfg.history_retention()) > 0:
logging.info('Setting schedule for midnight auto history-purge')
__SCHED.add_daytime_task(sabnzbd.database.midnight_history_purge, 'midnight_history_purge', range(1, 8), None, (0, 0),
kronos.method.sequential, [], None)
logging.info('Setting schedule for midnight BPS reset')
__SCHED.add_daytime_task(sabnzbd.bpsmeter.midnight_action, 'midnight_bps', range(1, 8), None, (0, 0),
kronos.method.sequential, [], None)

View File

@@ -102,6 +102,18 @@ SKIN_TEXT = {
'week' : TT('week'),
'month' : TT('Month'),
'year' : TT('Year'),
'January': TT('January'),
'February': TT('February'),
'March': TT('March'),
'April': TT('April'),
'May': TT('May'),
'June': TT('June'),
'July': TT('July'),
'August': TT('August'),
'September': TT('September'),
'October': TT('October'),
'November': TT('November'),
'December': TT('December'),
'monday' : TT('Monday'),
'tuesday' : TT('Tuesday'),
'wednesday' : TT('Wednesday'),
@@ -175,6 +187,7 @@ SKIN_TEXT = {
'ft-newRelease@1' : TT('New release %s available at'), # Used in Footer
# Main page
'useGlitter': TT('Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin.'),
'shutdownOK?' : TT('Are you sure you want to shutdown SABnzbd?'),
'link-shutdown' : TT('Shutdown'), #: Shutdown SABnzbd
'link-pause' : TT('Pause'), #: Pause downloading
@@ -351,6 +364,13 @@ SKIN_TEXT = {
'explain-cache_limitstr' : TT('Cache articles in memory to reduce disk access.<br /><i>In bytes, optionally follow with K,M,G. For example: "64M" or "128M"</i>'),
'opt-cleanup_list' : TT('Cleanup List'),
'explain-cleanup_list' : TT('List of file extensions that should be deleted after download.<br />For example: <b>nfo</b> or <b>nfo, sfv</b>'),
'opt-history_retention' : TT('History Retention'),
'explain-history_retention' : TT('Automatically delete completed jobs from History. Beware that Duplicate Detection and some external tools rely on History information.'),
'history_retention-all' : TT('Keep all jobs'),
'history_retention-number' : TT('Keep maximum number of completed jobs'),
'history_retention-days' : TT('Keep completed jobs maximum number of days'),
'history_retention-none' : TT('Do not keep any completed jobs'),
'history_retention-limit': TT('Jobs'),
'button-saveChanges' : TT('Save Changes'),
'button-restoreDefaults' : TT('Restore Defaults'),
'explain-restoreDefaults' : TT('Reset'),
@@ -425,9 +445,10 @@ SKIN_TEXT = {
'opt-no_series_dupes' : TT('Detect duplicate episodes in series'),
'explain-no_series_dupes' : TT('Detect identical episodes in series (based on "name/season/episode" of items in your History)'),
'nodupes-off' : TT('Off'), #: Three way switch for duplicates
'nodupes-ignore' : TT('Discard'), #: Three way switch for duplicates
'nodupes-pause' : TT('Pause'), #: Three way switch for duplicates
'nodupes-fail' : TT('Fail job (move to History)'), #: Three way switch for duplicates
'nodupes-ignore' : TT('Discard'), #: Four way switch for duplicates
'nodupes-pause' : TT('Pause'), #: Four way switch for duplicates
'nodupes-fail' : TT('Fail job (move to History)'), #: Four way switch for duplicates
'nodupes-tag' : TT('Tag job'), #: Four way switch for duplicates
'abort' : TT('Abort'), #: Three way switch for encrypted posts
'opt-action_on_unwanted_extensions' : TT('Action when unwanted extension detected'),
'explain-action_on_unwanted_extensions' : TT('Action when an unwanted extension is detected in RAR files'),
@@ -439,6 +460,8 @@ SKIN_TEXT = {
'explain-script_can_fail' : TT('When the user script returns a non-zero exit code, the job will be flagged as failed.'),
'opt-new_nzb_on_failure' : TT('On failure, try alternative NZB'),
'explain-new_nzb_on_failure' : TT('Some servers provide an alternative NZB when a download fails.'),
'opt-enable_meta' : TT('Use tags from indexer'),
'explain-enable_meta' : TT('When sorting, use tags from indexer for title, season, episode, etc. Otherwise all naming is derived from the NZB name.'),
'opt-folder_rename' : TT('Enable folder rename'),
'explain-folder_rename' : TT('Use temporary names during post processing. Disable when your system doesn\'t handle that properly.'),
'opt-pre_script' : TT('Pre-queue user script'),
@@ -454,7 +477,7 @@ SKIN_TEXT = {
'opt-auto_sort' : TT('Sort by Age'),
'explain-auto_sort' : TT('Automatically sort items by (average) age.'),
'opt-direct_unpack' : TT('Direct Unpack'),
'explain-direct_unpack' : TT('Jobs will start unpacking during the download, reduces post-processing time but requires capable hard drive. Only works for jobs that do not need repair.'),
'explain-direct_unpack' : TT('Jobs will start unpacking during the downloading to reduce post-processing time. Only works for jobs that do not need repair.'),
'opt-propagation_delay' : TT('Propagation delay'),
'explain-propagation_delay' : TT('Posts will be paused untill they are at least this age. Setting job priority to Force will skip the delay.'),
'opt-check_new_rel' : TT('Check for New Release'),
@@ -498,7 +521,7 @@ SKIN_TEXT = {
'opt-fail_hopeless_jobs' : TT('Abort jobs that cannot be completed'),
'explain-fail_hopeless_jobs' : TT('When during download it becomes clear that too much data is missing, abort the job'),
'opt-rating_enable' : TT('Enable Indexer Integration'),
'explain-rating_enable' : TT('Indexers can supply rating information when a job is added and SABnzbd can report to the indexer if a job couldn\'t be completed. Depending on your indexer, the API key setting can be left blank.'),
'explain-rating_enable' : TT('Indexers can supply rating information when a job is added and SABnzbd can report to the indexer if a job couldn\'t be completed.'),
'opt-rating_api_key' : TT('API Key'),
'explain-rating_api_key' : TT('This key provides identity to indexer. Check your profile on the indexer\'s website.'),
'opt-rating_filter_enable' : TT('Enable Filtering'),
@@ -788,6 +811,7 @@ SKIN_TEXT = {
'Glitter-page' : TT('page'),
'Glitter-loading' : TT('Loading'),
'Glitter-articles' : TT('articles'),
'Glitter-rename' : TT('Rename'),
'Glitter-repairQueue' : TT('Queue repair'),
'Glitter-showActiveConnections' : TT('Show active connections'),
'Glitter-unblockServer' : TT('Unblock'),
@@ -969,5 +993,6 @@ SKIN_TEXT = {
SABnzbd comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under certain conditions.
It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your option) any later version.
''')
'''),
'wizard-ad': TT('In order to download from Usenet you will require access to a provider. Your ISP may provide you with access, however a premium provider is recommended. Don\'t have a Usenet provider? We recommend trying %s.''')
}

View File

@@ -311,9 +311,6 @@ def _analyse(fn, url):
logging.debug('Received nothing from indexer, retry after 60 sec')
return None, fn.msg, True, 60, data
if '.oznzb.com' in url and 'login?' in fn.url:
return None, T('Unauthorized access'), False, 0, data
return fn, fn.msg, False, 0, data

View File

@@ -692,7 +692,7 @@ class RarFile(object):
return [f.filename for f in self.infolist()]
def filelist(self):
'''Return list of file and foldernames in archive.'''
'''Return list of filenames in archive.'''
return [f.filename for f in self.infolist() if not f.isdir()]
def infolist(self):

View File

@@ -86,17 +86,20 @@ def CreateProcess(executable, args, _p_attr, _t_attr,
Python implementation of CreateProcess using CreateProcessW for Win32
"""
si = STARTUPINFOW(
dwFlags=startup_info.dwFlags,
wShowWindow=startup_info.wShowWindow,
cb=sizeof(STARTUPINFOW),
## XXXvlab: not sure of the casting here to ints.
hStdInput=int(startup_info.hStdInput),
hStdOutput=int(startup_info.hStdOutput),
hStdError=int(startup_info.hStdError),
)
# Only cast to ints when it's given
if startup_info.hStdInput:
si.hStdInput = int(startup_info.hStdInput)
if startup_info.hStdOutput:
si.hStdOutput = int(startup_info.hStdOutput)
if startup_info.hStdError:
si.hStdError = int(startup_info.hStdError)
wenv = None
if env is not None:
## LPCWSTR seems to be c_wchar_p, so let's say CWSTR is c_wchar

View File

@@ -4,5 +4,5 @@
# You MUST use double quotes (so " and not ')
__version__ = "2.2.0-develop"
__baseline__ = "unknown"
__version__ = "2.2.0"
__baseline__ = "b061e582b63491f5a7dca02277b1ccd490bbd388"

View File

@@ -47,6 +47,11 @@ class Wizard(object):
@cherrypy.expose
def index(self, **kwargs):
""" Show the language selection page """
if cfg.configlock() or not sabnzbd.interface.check_access():
return sabnzbd.interface.Protected()
if not sabnzbd.interface.check_login():
raise sabnzbd.interface.NeedLogin()
info = self.info.copy()
lng = None
if sabnzbd.WIN32:
@@ -72,15 +77,25 @@ class Wizard(object):
@cherrypy.expose
def exit(self, **kwargs):
""" Stop SABnzbd """
yield "Initiating shutdown..."
if cfg.configlock() or not sabnzbd.interface.check_access():
return sabnzbd.interface.Protected()
if not sabnzbd.interface.check_login():
raise sabnzbd.interface.NeedLogin()
logging.info('Shutdown requested by wizard')
sabnzbd.halt()
yield "<br>SABnzbd-%s shutdown finished" % sabnzbd.__version__
cherrypy.engine.exit()
sabnzbd.SABSTOP = True
return T('SABnzbd shutdown finished')
@cherrypy.expose
def one(self, **kwargs):
""" Accept language and show server page """
if cfg.configlock() or not sabnzbd.interface.check_access():
return sabnzbd.interface.Protected()
if not sabnzbd.interface.check_login():
raise sabnzbd.interface.NeedLogin()
language = kwargs.get('lang') if kwargs.get('lang') else cfg.language()
cfg.language.set(language)
set_language(language)
@@ -125,6 +140,11 @@ class Wizard(object):
@cherrypy.expose
def two(self, **kwargs):
""" Accept server and show the final page for restart """
if cfg.configlock() or not sabnzbd.interface.check_access():
return sabnzbd.interface.Protected()
if not sabnzbd.interface.check_login():
raise sabnzbd.interface.NeedLogin()
# Save server details
if kwargs:
kwargs['enable'] = 1

View File

@@ -95,7 +95,8 @@ def set_bonjour(host=None, port=None):
domain=domain,
host=zhost,
port=int(port),
txtRecord=pybonjour.TXTRecord({'path': '/sabnzbd/'}),
txtRecord=pybonjour.TXTRecord({'path': '/sabnzbd/',
'https': cfg.enable_https()}),
callBack=_zeroconf_callback)
except sabnzbd.utils.pybonjour.BonjourError:
_BONJOUR_OBJECT = None

View File

@@ -1,15 +1,15 @@
@echo off
rem Example of a post processing script for SABnzbd
echo.
echo Running in directory "%~d0%~p0"
echo.
echo The first parameter (result-dir) = %1
echo The second parameter (nzb-name) = %2
echo The third parameter (nice name) = %3
echo The fourth parameter (newzbin #) = %4
echo The fifth parameter (category) = %5
echo The sixth parameter (group) = %6
echo The seventh parameter (status) = %7
echo The eight parameter (failure_url)= %8
echo.
@echo off
rem Example of a post processing script for SABnzbd
echo.
echo Running in directory "%~d0%~p0"
echo.
echo The first parameter (result-dir) = %1
echo The second parameter (nzb-name) = %2
echo The third parameter (nice name) = %3
echo The fourth parameter (newzbin #) = %4
echo The fifth parameter (category) = %5
echo The sixth parameter (group) = %6
echo The seventh parameter (status) = %7
echo The eight parameter (failure_url)= %8
echo.

View File

Binary file not shown.

View File

Binary file not shown.