Compare commits

...

273 Commits

Author SHA1 Message Date
Safihre
d69796d351 Set version to 2.3.0 and resolve merge conflict 2017-09-21 10:13:56 +02:00
Safihre
a2d5713477 Merge branch 'develop' 2017-09-21 10:10:45 +02:00
Safihre
ba7d906bea Update text files for 2.3.0 2017-09-20 23:16:26 +02:00
Safihre
68f78b0e71 Subprocess on Windows needs at least 1 second timeout globally 2017-09-20 11:50:41 +02:00
Safihre
d5cd0180d8 Update SABYenc to 3.3.1 2017-09-19 17:23:29 +02:00
Safihre
10265bdfb4 Always use save-routine in database.execute so we can catch locked DB
Linked #1034
2017-09-19 09:18:22 +02:00
Safihre
3d0d67bffc Update SABYenc to 3.3.0
Faster!
2017-09-19 08:31:31 +02:00
Safihre
11bd16a653 Accidentally removed HTML-cleaning from error display
Linked #1034
2017-09-19 06:44:29 +02:00
Safihre
248f2da8a6 Pause job in case of failing imports
Linked #1034
2017-09-19 06:19:06 +02:00
Safihre
7b7aaaf467 Widen Confg Servers month selector
Closes #1032
2017-09-16 10:15:20 +02:00
SABnzbd Automation
0030e4dd36 Automatic translation update 2017-09-15 13:51:26 +00:00
Safihre
c3013d67b4 Show NZB name from RSS-feed when fetching
Of course not the name of the RSS-feed itself.
2017-09-15 14:21:45 +02:00
Safihre
ddb7f2a40c Require SABYenc 3.1.1 due to PyPi mixup
Broken source-distribution resulted in heaving to create new release, PyPi does not allow to re-upload files.
2017-09-15 12:59:24 +02:00
Safihre
167a94736e Update text files for 2.3.0RC2 2017-09-15 09:41:12 +02:00
Safihre
8b3e30f0a1 Require SABYenc 3.1.0 and no longer list CRC values
Since SABYenc 3.1.0 doesn't calculate them anymore for speed improvements.
2017-09-15 09:36:24 +02:00
Safihre
c383fa88fb Update ISSUES to match the website and list Synology being special 2017-09-13 20:51:07 +02:00
Safihre
ee72c1e4d5 Correct the testing-releases feedback slider 2017-09-11 22:13:06 +02:00
Safihre
a80bd826d6 Use the NZO password to save in database
build_history_info is called on every interface update to pretend the post-processing job is a history-job. So a password file (if set) would be loaded every second. Thanks @sanderjo!
2017-09-11 20:43:27 +02:00
Safihre
63e6d45bb1 Make sure users are warned that their settings could be unsafe 2017-09-10 21:45:19 +02:00
SABnzbd Automation
61300db1fb Automatic translation update 2017-09-10 18:24:12 +00:00
Safihre
23d005fc36 Update texts and links for 2.3.0 release to come 2017-09-10 20:01:45 +02:00
Safihre
871b351656 Set could potentially be missing from extrapars
Some bad handeling of newsunpack possibly
2017-09-10 19:29:58 +02:00
Safihre
6b53b9934e Waiting for URL would result in 100% CPU usage due to constant looping 2017-09-10 12:45:30 +02:00
Safihre
e038e08a60 Revert "Permanent notice in Plush to upgrade to Glitter"
6fdeab6948
2017-09-09 23:51:23 +02:00
Safihre
8300cb7762 Correct command-line help 2017-09-09 17:31:00 +02:00
Safihre
ec8302717f Warnings API-call now returns a dict like it should 2017-09-09 16:27:55 +02:00
Safihre
6b872b44db MultiPar can report both "PAR File(s) Incomplete" and "Need more blocks" 2017-09-09 16:20:35 +02:00
Safihre
6e48ebccc7 Correctly display time if server and brower are not in same timezone
#989
2017-09-09 13:16:11 +02:00
Safihre
1cd24d1fd0 Locking when iterating over extrapars for queue-stats
But only when we request all the files.
Closes #1029
2017-09-09 10:45:39 +02:00
Safihre
fa6bb79f53 Fix Chrome 61 table border change 2017-09-08 14:51:43 +02:00
Safihre
22e9086e09 Add AppVeyor for Windows testing
#999
2017-09-08 12:07:28 +02:00
Safihre
408b84e02d Basic NZB adding via upload or from disk 2017-09-08 10:28:01 +02:00
Safihre
16ac4dce21 Use requests module for testing 2017-09-08 10:28:01 +02:00
Safihre
5ce1554a46 Hide/Show Details in Config > Servers 2017-09-08 10:27:46 +02:00
Safihre
2d84ed6813 Always have something in RSS jobs storage 2017-09-07 00:26:59 +02:00
Safihre
06dc5b181e Do not leave rss.jobs empty to prevent crash later on
See: https://forums.sabnzbd.org/viewtopic.php?f=11&t=22952
2017-09-06 20:54:21 +02:00
Safihre
37b759fece Only notify upon testing failures 2017-09-06 20:50:27 +02:00
Safihre
3f8430780d Add test requirements 2017-09-06 20:44:47 +02:00
Safihre
9e9bc5f3b0 Very basic testing
Does it start, does it serve pages, does it serve api-requests
2017-09-06 20:44:47 +02:00
Safihre
85204105c2 Check input when setting priority of job
There was no input validation, via the API you could set any value.
2017-09-06 20:25:08 +02:00
SABnzbd Automation
f13339d64d Automatic translation update 2017-09-05 19:53:42 +00:00
Safihre
fa5b44be99 Update text files for 2.3.0Alpha2 2017-09-05 16:36:12 +02:00
Safihre
08bc7c5b9d Use NZO_LOCK to limit possible dir conflicts when adding NZBs
Hopefully resolving problems with possible overlapping directory names and import errors.
2017-09-05 16:07:43 +02:00
Safihre
d9b5dd549a Revert "Only allow 1 NZB to be added at the same time"
Could result in deadlock for some reason.
This reverts commit e64df8ed60.
2017-09-05 16:05:48 +02:00
Safihre
8ec53a3bce Giving up on elegant solutions to prevent stalling, just use a check
This stupid nightmare still wasn't fixed.
The proper solution creates slowdown on many systems because it's not efficient enough. Instead just do a check every 90 seconds if there's stalled stuff.
2017-09-05 16:05:19 +02:00
Safihre
0aac9a5e5c Correct display of download percentage
No need to calculate in javascript, we get it from API
2017-09-05 16:03:58 +02:00
Safihre
11a880d040 MultiPar shows 'PAR File(s) Incomplete' on verification success
When there are Par2-files with very similar filenames in the folder.
2017-09-05 13:21:48 +02:00
Safihre
67b66beb13 Only count really extra files during Multipar 2017-09-04 22:43:59 +02:00
Safihre
1da633442b Correct byte counts when retrying 2017-09-04 22:43:01 +02:00
Safihre
13de40881e Correct display of Forced items 2017-09-04 21:44:00 +02:00
Safihre
1c6419ea65 Revert "Paused status for individual download trumps Force priority"
Oops, I was wrong. This reverts commit d06c11673f.
2017-09-04 20:51:05 +02:00
Safihre
a2adeffc1a Correctly count all bytes and drop 'missing' use 'mbmissing'
Reporting number of missing articles makes 0 sense, it's the MB that matters.
2017-09-04 20:39:15 +02:00
Safihre
71fa3c544a Also shjow scanning of extra files for par2cmdline/tbb 2017-09-04 14:54:41 +02:00
Safihre
b739fb7f07 Do not count overhead-bytes for NZO statistics 2017-09-04 14:18:55 +02:00
Safihre
860728beae Show counter when Multipar is scanning other files in the directory 2017-09-04 13:58:50 +02:00
Safihre
1bdbf1c6a8 Show different icon when priority is Force 2017-09-04 10:59:48 +02:00
Safihre
abbed4cd77 Show missing articles starting at 2% 2017-09-04 10:59:18 +02:00
Safihre
d06c11673f Paused status for individual download trumps Force priority 2017-09-04 10:57:02 +02:00
Safihre
67d67f5ff6 Correct typo in reject_duplicate_files
Closes #1021
2017-09-03 17:07:41 +02:00
Safihre
2386d65b84 Extrapars could be empty if not +Repair set for job 2017-09-03 16:54:07 +02:00
Safihre
29ec4d9a23 Set 2.2.1 version and update translations 2017-08-25 22:11:47 +02:00
Safihre
22517a7cd7 Merge branch '2.2.x' 2017-08-25 22:07:15 +02:00
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
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
82 changed files with 9129 additions and 8601 deletions

4
.gitignore vendored
View File

@@ -19,6 +19,10 @@ SABnzbd*.dmg
# WingIDE project files
*.wp[ru]
# Testing folders
.cache
.xprocess
# General junk
*.keep
*.bak

15
.travis.yml Normal file
View File

@@ -0,0 +1,15 @@
language: python
python:
- "2.7"
before_install:
- sudo add-apt-repository ppa:jcfp -y
- sudo apt-get update -q
- sudo apt-get install sabnzbdplus -y
install:
- pip install --upgrade -r tests/requirements.txt
script:
- pytest
notifications:
email:
on_success: never
on_failure: always

View File

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

View File

@@ -9,28 +9,18 @@
- When par2 or unrar hang up, never just stop SABnzbd.
Instead use your operating system's task manager to stop the par2 or unrar program.
Forcing SABnzbd to quit may damage your queues.
Windows-only:
If you keep having trouble with par2 multicore you can disable it
in Config->Switches.
This will force the use of the old and tried, but slower par2cmdline program.
- A bug in Windows 7 may cause severe memory leaks when you use SABnzbd in
combination with some virus scanners and firewalls.
Install this hotfix:
Description: http://support.microsoft.com/kb/979223/en-us
Download location: http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=979223&kbln=en-us
- Some Usenet servers have intermittent login (or other) problems.
For these the server blocking method is not very favourable.
There is an INI-only option that will limit blocks to 1 minute.
no_penalties = 1
See: https://sabnzbd.org/wiki/configuration/2.2/special
See: https://sabnzbd.org/wiki/configuration/2.3/special
- Some third-party utilties try to probe SABnzbd API in such a way that you will
often see warnings about unauthenticated access.
If you are sure these probes are harmless, you can suppress the warnings by
setting the option "api_warnings" to 0.
See: https://sabnzbd.org/wiki/configuration/2.2/special
See: https://sabnzbd.org/wiki/configuration/2.3/special
- On OSX you may encounter downloaded files with foreign characters.
The par2 repair may fail when the files were created on a Windows system.
@@ -41,7 +31,7 @@
You will see this only when downloaded files contain accented characters.
You need to fix it yourself by running the convmv utility (available for most Linux platforms).
Possible the file system override setting 'fsys_type' might be solve things:
See: https://sabnzbd.org/wiki/configuration/2.2/special
See: https://sabnzbd.org/wiki/configuration/2.3/special
- The "Watched Folder" sometimes fails to delete the NZB files it has
processed. This happens when other software still accesses these files.
@@ -51,6 +41,10 @@
- Memory usage can sometimes have high peaks. This makes using SABnzbd on very low
memory systems (e.g. a NAS device or a router) a challenge.
In particular on Synology (SynoCommunity) the device may report that SABnzbd is using
a lot of memory even when idle. In this case the memory is usually not actually used by
SABnzbd and will be available if required by other apps or the system. More information
can be found in the discussion here: https://github.com/SynoCommunity/spksrc/issues/2856
- SABnzbd is not compatible with some software firewall versions.
The Microsoft Windows Firewall works fine, but remember to tell this
@@ -72,13 +66,3 @@
Config->Special->wait_for_dfolder to 1.
SABnzbd will appear to hang until the drive is mounted.
- On some operating systems it looks like there is a problem with one of the standard Python libraries.
It is possible that you get errors about saving admin files and even unexplained crashes.
If so, you can enable the option for the alternative library.
It has the same functionality, but is slower.
We've had reports about this issue on non-mainstream Linux platforms.
- OpenElec
- Squeeze Linux
There is a "special" option that will allow you to select an alternative library.
use_pickle = 1
See: https://sabnzbd.org/wiki/configuration/2.2/special

View File

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

View File

@@ -1,6 +1,13 @@
Release Notes - SABnzbd 2.3.0 Alpha 1
Release Notes - SABnzbd 2.3.0
=========================================================
## SABYenc updated
- Improved download performance 10-15% on CPU limited devices
by optimizations and by removing redundant article verification.
Linux/NAS: Update of SABYenc to version 3.3.1 is required.
Update your package or see https://sabnzbd.org/sabyenc
Windows/macOS: Update is included in the installers.
## Changes since 2.2.1
- Option to limit Servers to specific Categories removed
- Improved par2 handling and obfuscated files detection
@@ -9,11 +16,16 @@ Release Notes - SABnzbd 2.3.0 Alpha 1
- Article-state (which servers are tried) is preserved after restart
- Auto disconnect (if enabled) only after verification of last item
- Slight performance improvement when fetching RSS-feeds
- RSS-feed title is shown for URLs being grabbed
- Job title from RSS-feed is shown for URLs being grabbed
- URL grabbing can now be individually paused
- Scheduler can pause/unpause jobs in specific category
- Series Duplicate Checker can allow PROPER/REAL/REPACK versions
- Refresh-icon in Glitter when refresh rate is above 2 seconds
- Different icon for downloads with Force priority
- Show progress during verification of extra files
- All dates and times are now time zone independent
- API: 'missing' field removed from 'queue', use 'mbmissing'
- API: 'warnings' method now returns array for better handling
- macOS: Bundled new OpenSSL version with support for TLSv1.2
- macOS: No longer linked to system certificate store
- macOS and Windows: Installers include Mozilla CA certificates
@@ -22,11 +34,17 @@ Release Notes - SABnzbd 2.3.0 Alpha 1
- Reduce CPU usage with multiple servers
- Fix yet another potential stalling issue
- Remove Timeout tracebacks
- Handle locked history database better
- Only warn if number of actual passwords is larger than 30
- Unexpected behavior when diskspace becomes critically low
- MacOS: Direct Unpack could hang in case of special charters in names
- API: Correct listing of downloaded and queued files in get_files
- Retried jobs would show incorrect download progress
- Password file was loaded from disk excessively
- API: Correct listing of downloaded and queued files in 'get_files'
- API: Number of bytes missing and downloaded could be slightly off
- API: Jobs with Force priority should always have status 'Downloading'
- MacOS: Direct Unpack could hang in case of special characters in names
- Windows: Unpack could fail if started instantly after previous one
- Windows: Download with many par2 sets could get listed as failed
## Upgrading from 2.1.x and older
- Finish queue

View File

@@ -32,6 +32,7 @@ except:
import logging
import logging.handlers
import traceback
import os
import getopt
import signal
@@ -150,7 +151,11 @@ class guiHandler(logging.Handler):
# Loose the oldest record
self.store.pop(0)
try:
self.store.append(self.format(record))
# Append traceback, if available
warning = {'type': record.levelname, 'text': record.msg % record.args, 'time': int(time.time())}
if record.exc_info:
warning['text'] = '%s\n%s' % (warning['text'], traceback.format_exc())
self.store.append(warning)
except UnicodeDecodeError:
# Catch elusive Unicode conversion problems
pass
@@ -161,12 +166,6 @@ class guiHandler(logging.Handler):
def count(self):
return len(self.store)
def last(self):
if self.store:
return self.store[len(self.store) - 1]
else:
return ""
def content(self):
""" Return an array with last records """
return self.store
@@ -202,11 +201,11 @@ def print_help():
print " --repair-all Try to reconstruct the queue from the incomplete folder"
print " with full data reconstruction"
print " --https <port> Port to use for HTTPS server"
print " --ipv6_hosting <0|1> Listen on IPv6 address [::1] [*]"
print " --no-login Start with username and password reset"
print " --log-all Log all article handling (for developers)"
print " --console Force console logging for OSX app"
print " --new Run a new instance of SABnzbd"
print " --ipv6_hosting <0|1> Listen on IPv6 address [::1]"
def print_version():

6
appveyor.yml Normal file
View File

@@ -0,0 +1,6 @@
install:
- pip install --upgrade -r tests/requirements.txt
- pip install pypiwin32
build_script:
- pytest

View File

@@ -1,16 +0,0 @@
import six
import mock
from cherrypy import wsgiserver
class TestWSGIGateway_u0:
@mock.patch('cherrypy.wsgiserver.WSGIGateway_10.get_environ',
lambda self: {'foo': 'bar'})
def test_decodes_items(self):
req = mock.MagicMock(path=b'/', qs=b'')
gw = wsgiserver.WSGIGateway_u0(req=req)
env = gw.get_environ()
assert env['foo'] == 'bar'
assert isinstance(env['foo'], six.text_type)

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="General"#-->
<!--#set global $help_uri="configuration/2.2/general"#-->
<!--#set global $help_uri="configuration/2.3/general"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -253,6 +253,32 @@
})
hideOrShowTranslate()
// Highlight in case user is not safe
// So when exposed to internet and no password, no external limit or no username/password
var safeCheck = \$('#host, #local_ranges, #inet_exposure, #${pid}_wu, #${pid}_wp')
function checkSafety() {
if(\$('#host').val() != 'localhost' && \$('#host').val() != '127.0.0.1') {
// No limitation on local-network
if(!\$('#local_ranges').val() || \$('#inet_exposure').val() > 3) {
// And no username and password?
if(!\$('#${pid}_wu').val() || !\$('#${pid}_wp').val()) {
// Add warning icon if not there already
if(!\$('.host-warning').length) {
safeCheck.after('<span class="glyphicon glyphicon-alert host-warning"></span>')
\$('.host-warning').tooltip({'title': '$T('checkSafety')'})
}
return
}
}
}
// Remove warnings
\$('.host-warning').remove()
safeCheck.removeClass('host-warning-highlight')
}
checkSafety()
safeCheck.on('change', checkSafety)
// Click functions
\$('#apikey, #nzbkey').click(function () { \$(this).select() });
\$('#generate_new_apikey').click(function () {
@@ -330,7 +356,6 @@
}
}
// Update the value
\$('#bandwidth_max_value, #bandwidth_max_dropdown').on('change', function() {
if(\$('#bandwidth_max_value').val()) {

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Email"#-->
<!--#set global $help_uri="configuration/2.2/notifications"#-->
<!--#set global $help_uri="configuration/2.3/notifications"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#def show_notify_checkboxes($section_label)#-->

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Servers"#-->
<!--#set global $help_uri="configuration/2.2/servers"#-->
<!--#set global $help_uri="configuration/2.3/servers"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -7,7 +7,7 @@
<input type="hidden" name="session" value="$session" />
<div id="addServer">
<div class="padding alt">
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
</div>
</div>
<div class="section" id="addServerContent" style="display: none;">
@@ -407,10 +407,10 @@
}
\$(this).parent().next().toggle();
\$(this).parent().next().next().toggle();
if (\$(this).attr("value") == "$T('showDetails')") {
\$(this).attr("value", "$T('hideDetails')");
if (\$(this).text().indexOf("$T('showDetails')") > 0) {
\$(this).html(\$(this).html().replace("$T('showDetails')", "$T('hideDetails')"));
} else {
\$(this).attr("value", "$T('showDetails')");
\$(this).html(\$(this).html().replace("$T('hideDetails')", "$T('showDetails')"));
}
});

View File

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

View File

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

View File

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

View File

@@ -1028,8 +1028,8 @@ input[type="checkbox"] {
display: block;
top: -7px;
left: 50%;
width: 120px;
margin-left: -40px;
width: 150px;
margin-left: -50px;
min-width: initial;
opacity: 0.8;
}
@@ -1082,6 +1082,12 @@ input[type="checkbox"] {
color: #666;
}
.host-warning {
color: #404040;
margin-left: 7px;
top: 3px;
}
.fileBrowser .glyphicon {
margin-right: 2px;
top: 1px;

View File

@@ -18,7 +18,7 @@
<tr>
<td class="table-messages-label">
<span class="label" data-bind="css: 'label-' + css, text: type"></span>
<strong data-bind="text: date, attr: { 'data-timestamp': timestamp }"></strong>
<strong data-bind="text: displayDateTime(timestamp, \$parent.dateFormat(), 'X'), attr: { 'data-timestamp': timestamp }"></strong>
<span class="queue-message-text" data-bind="html: text"></span>
</td>
</tr>

View File

@@ -59,15 +59,9 @@
<div id="feedback-slider-inner">
<p><strong>If anything is not working as expected, or could be improved, let us know!</strong></p>
<p><strong>If you encounter an error, please include the log file (click on <span class="glyphicon glyphicon-wrench"></span> ) when contacting us.</strong></p>
<h4>General</h4>
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/" target="_blank">SABnzbd Forum</a><br />
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/viewforum.php?f=11" target="_blank">SABnzbd Forum</a><br />
<span class="glyphicon glyphicon-plane"></span> <a href="https://github.com/sabnzbd/sabnzbd/" target="_blank">SABnzbd on Github</a><br />
<span class="glyphicon glyphicon-globe"></span> <a href="https://translations.launchpad.net/sabnzbd" target="_blank">Translations of SABnzbd</a><br />
<span class="glyphicon glyphicon-envelope"></span> <a href="mailto:bugs@sabnzbd.org?body=Version:%20$version%20Skin:%20Glitter">Email bugs@sabnzbd.org</a>
<h4>Interface (Glitter)</h4>
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/viewtopic.php?f=5&amp;t=18880" target="_blank">Glitter at SABnzbd Forum</a><br />
<span class="glyphicon glyphicon-envelope"></span> <a href="mailto:safihre@sabnzbd.org?body=Version:%20$version">Email safihre@sabnzbd.org</a>
</div>
</div>

View File

@@ -88,7 +88,7 @@
<tr class="queue-item">
<td>
<a href="#" data-bind="click: pauseToggle, attr: { 'title': pausedStatus() ? '$T('link-resume')' : '$T('link-pause')' }">
<span class="hover-button glyphicon" data-bind="css: { 'glyphicon-play': pausedStatus(), 'glyphicon-pause': !pausedStatus() }"></span>
<span class="hover-button glyphicon" data-bind="css: queueIcon"></span>
</a>
</td>
<td class="name">
@@ -121,8 +121,8 @@
</td>
<td class="progress-indicator">
<div class="progress">
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentageRounded() + '; background-color: ' + progressColor() + ';' }">
<strong data-bind="text: percentageRounded"></strong>
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentage() + '%; background-color: ' + progressColor() + ';' }">
<strong data-bind="text: percentage() + '%'"></strong>
<i data-bind="text: missingText"></i>
</div>
<span data-bind="text: progressText"></span>

View File

@@ -46,7 +46,7 @@
var sabSpeedHistory = [$bytespersec_list];
var newRelease = "$new_release";
var newReleaseUrl = "$new_rel_url";
var glitterIsBeta = ("$version".search(/Alpa|Beta|x/)) > 0;
var glitterIsBeta = ("$version".search(/[develop|Alpha|Beta|RC]/)) > 0;
var glitterPreLoadQueue = $preload_queue;
var glitterPreLoadHistory = $preload_history;
@@ -63,6 +63,7 @@
glitterTranslate.removeDown = "$T('Glitter-confirmClearDownloads')";
glitterTranslate.removeDow1 = "$T('Glitter-confirmClear1Download')";
glitterTranslate.retryAll = "$T('link-retryAll')?";
glitterTranslate.fetch = "$T('Glitter-fetch')";
glitterTranslate.encrypted = "$T('Glitter-encrypted')";
glitterTranslate.duplicate = "$T('Glitter-duplicate')";
glitterTranslate.tooLarge = "$T('Glitter-tooLarge')";

View File

@@ -128,7 +128,7 @@ function displayDateTime(inDate, outFormat, inFormat) {
if(inDate == '') {
var theMoment = moment()
} else {
var theMoment = moment(inDate, inFormat)
var theMoment = moment.utc(inDate, inFormat)
}
// Special format or regular format?
if(outFormat == 'fromNow') {

View File

@@ -536,6 +536,7 @@ function ViewModel() {
callAPI({
mode: 'warnings'
}).then(function(response) {
// Reset it all
self.allWarnings.removeAll();
if(response) {
@@ -544,20 +545,16 @@ function ViewModel() {
// Go over all warnings and add
$.each(response.warnings, function(index, warning) {
// Split warning into parts
var warningSplit = convertHTMLtoText(warning).split(/\n/);
// Reformat CSS label and date
// Replaces spaces by non-breakable spaces and newlines with br's
var warningData = {
index: index,
type: glitterTranslate.status[warningSplit[1]].slice(0, -1),
text: warningSplit.slice(2).join('<br/>').replace(/ /g, '\u00A0'), // Recombine if multiple lines
date: displayDateTime(warningSplit[0], self.dateFormat(), 'YYYY-MM-DD HH:mm'),
timestamp: moment(warningSplit[0], 'YYYY-MM-DD HH:mm').unix(),
css: (warningSplit[1] == "ERROR" ? "danger" : warningSplit[1] == "WARNING" ? "warning" : "info"),
type: glitterTranslate.status[warning.type].slice(0, -1),
text: convertHTMLtoText(warning.text).replace(/ /g, '\u00A0').replace(/(?:\r\n|\r|\n)/g, '<br />'),
timestamp: warning.time,
css: (warning.type == "ERROR" ? "danger" : warning.type == "WARNING" ? "warning" : "info"),
clear: self.clearWarnings
};
self.allWarnings.push(warningData)
})
}

View File

@@ -480,9 +480,10 @@ function QueueModel(parent, data) {
self.status = ko.observable(data.status);
self.isGrabbing = ko.observable(data.status == 'Grabbing' || data.avg_age == '-')
self.totalMB = ko.observable(parseFloat(data.mb));
self.remainingMB = ko.observable(parseFloat(data.mbleft));
self.remainingMB = ko.observable(parseFloat(data.mbleft))
self.missingMB = ko.observable(parseFloat(data.mbmissing))
self.percentage = ko.observable(parseInt(data.percentage))
self.avg_age = ko.observable(data.avg_age)
self.missing = ko.observable(parseFloat(data.mbmissing))
self.direct_unpack = ko.observable(data.direct_unpack)
self.category = ko.observable(data.cat);
self.priority = ko.observable(parent.priorityName[data.priority]);
@@ -502,8 +503,8 @@ function QueueModel(parent, data) {
if(self.status() == 'Checking') {
return '#58A9FA'
}
// Check for missing data, the value is arbitrary! (3%)
if(self.missing()/self.totalMB() > 0.03) {
// Check for missing data, the value is arbitrary! (2%)
if(self.missingMB()/self.totalMB() > 0.02) {
return '#F8A34E'
}
// Set to grey, only when not Force download
@@ -514,22 +515,16 @@ function QueueModel(parent, data) {
return '';
});
// MB's and percentages
self.downloadedMB = ko.computed(function() {
return(self.totalMB() - self.remainingMB()).toFixed(0);
});
self.percentageRounded = ko.pureComputed(function() {
return fixPercentages(((self.downloadedMB() / self.totalMB()) * 100).toFixed(2))
})
// MB's
self.progressText = ko.pureComputed(function() {
return self.downloadedMB() + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
return (self.totalMB() - self.remainingMB()).toFixed(0) + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
})
// Texts
self.missingText= ko.pureComputed(function() {
// Check for missing data, the value is arbitrary! (3%)
if(self.missing()/self.totalMB() > 0.03) {
return self.missing().toFixed(0) + ' MB ' + glitterTranslate.misingArt
// Check for missing data, the value is arbitrary! (1%)
if(self.missingMB()/self.totalMB() > 0.01) {
return self.missingMB().toFixed(0) + ' MB ' + glitterTranslate.misingArt
}
return;
})
@@ -538,6 +533,10 @@ function QueueModel(parent, data) {
if(self.status() == 'Checking') {
return glitterTranslate.checking
}
// Grabbing
if(self.status() == 'Grabbing') {
return glitterTranslate.fetch
}
// Pausing status
if((self.parent.parent.downloadsPaused() && self.priority() != 2) || self.pausedStatus()) {
return glitterTranslate.paused;
@@ -546,6 +545,18 @@ function QueueModel(parent, data) {
return rewriteTime(self.timeLeft());
});
// Icon to better show force-priority
self.queueIcon = ko.computed(function() {
// Force comes first
if(self.priority() == 2) {
return 'glyphicon-forward'
}
if(self.pausedStatus()) {
return 'glyphicon-play'
}
return 'glyphicon-pause'
})
// Extra queue column
self.extraText = ko.pureComputed(function() {
// Picked anything?
@@ -581,8 +592,9 @@ function QueueModel(parent, data) {
self.isGrabbing(data.status == 'Grabbing' || data.avg_age == '-')
self.totalMB(parseFloat(data.mb));
self.remainingMB(parseFloat(data.mbleft));
self.missingMB(parseFloat(data.mbmissing))
self.percentage(parseInt(data.percentage))
self.avg_age(data.avg_age)
self.missing(parseFloat(data.mbmissing))
self.direct_unpack(data.direct_unpack)
self.category(data.cat);
self.priority(parent.priorityName[data.priority]);

View File

@@ -360,7 +360,7 @@ li.dropdown {
#feedback-slider:hover {
left: 0px;
height: 340px;
height: 200px;
opacity: 1;
}
@@ -404,7 +404,6 @@ thead {
tr th {
border-bottom: none !important;
visibility: hidden;
padding: 0px !important;
height: 0px;
}
@@ -527,6 +526,7 @@ tbody>tr>td:last-child {
}
.hover-button.glyphicon-play,
.hover-button.glyphicon-forward,
.hover-button.glyphicon-stop {
opacity: 1;
color: #474747;

View File

@@ -99,9 +99,8 @@
#if $loadavg#$T('ft-sysload'):&nbsp;<span id="loadavg">$loadavg</span>#end if#
</div>
<div id="nav_text_left">
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
#if $pane=="Main"#
&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

@@ -6,7 +6,7 @@
$.plush.queuenoofslots = $noofslots;
$.plush.SetQueueSpeedLimit('$speedlimit', '$speedlimit_abs');
$.plush.SetQueueFinishAction('$finishaction');
$.plush.SetWarnings($have_warnings,"<!--#echo $last_warning.replace("\n"," ").replace('"',"'").replace('\\','\\\\') #-->");
$.plush.SetWarnings($have_warnings,"");
$.plush.SetQueuePauseInfo(<!--#if $paused#-->true<!--#else#-->false<!--#end if#-->,'$pause_int');
$.plush.SetQueueETAStats("<!--#if float($kbpersec) > 1023 #-->$speed<!--#else#--><!--#echo "%.0f" % float($kbpersec)#--> K<!--#end if#-->",<!--#echo "%.0f" % float($kbpersec)#-->,'$timeleft','$T('eta'): $eta');
@@ -56,7 +56,7 @@
</td>
<td class="download-title" <!--#if $rating_enable#-->style="width:35%"<!--#end if#-->>
<a href="nzb/$slot.nzo_id/" title="$T('status'): $T('post-'+$slot.status)<br/>$T('nzo-age'): $slot.avg_age<br/><!--#if $slot.missing#-->$T('missingArt'): $slot.missing<!--#end if#-->">$slot.filename.replace('.', '.&#8203;').replace('_', '_&#8203;')<!--#if $slot.password#--> / $slot.password<!--#end if#--></a>
<a href="nzb/$slot.nzo_id/" title="$T('status'): $T('post-'+$slot.status)<br/>$T('nzo-age'): $slot.avg_age<br/><!--#if $slot.mbmissing!="0.00"#-->$T('missingArt'): $slot.mbmissing $T('MB')<!--#end if#-->">$slot.filename.replace('.', '.&#8203;').replace('_', '_&#8203;')<!--#if $slot.password#--> / $slot.password<!--#end if#--></a>
</td>
<!--#if $rating_enable#-->

View File

@@ -146,7 +146,7 @@ jQuery(function($){
$("#plush_options").colorbox({ inline:true, href:"#plush_options_modal", title:$("#plush_options").text(),
innerWidth:"375px", innerHeight:"350px", initialWidth:"375px", initialHeight:"350px", speed:0, opacity:0.7
});
// Save the type of speedlimit display
$('#maxSpeed-label').change(function() {
$.plush.speedLimitType = $(this).val();
@@ -159,19 +159,19 @@ jQuery(function($){
$('#maxSpeed-label').val($.plush.speedLimitType)
// Max Speed main menu input -- don't change value on refresh when focused
$("#maxSpeed-option").focus(function(){
$.plush.focusedOnSpeedChanger = true;
}).blur(function(){
$.plush.focusedOnSpeedChanger = false;
$("#maxSpeed-option").focus(function(){
$.plush.focusedOnSpeedChanger = true;
}).blur(function(){
$.plush.focusedOnSpeedChanger = false;
}).keyup(function (e) {
// Catch the enter
if (e.keyCode == 13) {
$("#maxSpeed-enable").click()
}
})
// Submit the new speedlimit
$("#maxSpeed-enable, #maxSpeed-disable").click( function(e) {
$("#maxSpeed-enable, #maxSpeed-disable").click( function(e) {
// Remove
if ($(e.target).attr('id')=="maxSpeed-disable") {
$('#maxSpeed-option').val('');
@@ -496,7 +496,7 @@ jQuery(function($){
};
// static-element tooltips
$('body').delegate('#pausefor_title, #last_warning, #time-left, #multi_delete, #explain-blockRefresh, #pause_resume, #hist_purge, #queueTable td.download-title a, #queueTable td.eta span, #queueTable td.options .icon_nzb_remove, #historyTable td.options .icon_nzb_remove, #historyTable td div.icon_history_verbose', 'mouseover mouseout mousemove', function(event) {
$('body').delegate('#pausefor_title, #time-left, #multi_delete, #explain-blockRefresh, #pause_resume, #hist_purge, #queueTable td.download-title a, #queueTable td.eta span, #queueTable td.options .icon_nzb_remove, #historyTable td.options .icon_nzb_remove, #historyTable td div.icon_history_verbose', 'mouseover mouseout mousemove', function(event) {
var link = this,
$link = $(this);
@@ -1095,7 +1095,7 @@ $("a","#multiops_inputs").click(function(e){
title:function(){return $(this).text().replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");},
innerWidth:"80%", innerHeight:"300px", initialWidth:"80%", initialHeight:"300px", speed:0, opacity:0.7 });
// modal for reporting issues
// modal for reporting issues
$("#historyTable .modal-report").colorbox({ inline:true,
href: function(){return "#report-"+$(this).parent().parent().parent().attr('id');},
title:function(){return $(this).text();},
@@ -1252,7 +1252,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
$('#queue-pagination span').removeClass('loading'); // Remove spinner graphic from pagination
$('#manual_refresh_wrapper').removeClass('refreshing'); // Refresh state notification
},
error: function(xhr){
error: function(xhr){
// Only reason for a 404 error could be a login failure -> redirect
if(xhr.status == 404) {
document.location=document.location;
@@ -1320,7 +1320,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
$('#history .avg_rate').rateit({readonly: true, resetable: false, step: 0.5});
$('#history .avg_rate').each(function() { $(this).rateit('value', $(this).attr('value') / 2); });
$('#history .user_combo option').filter(function() {
return $(this).attr('value') == $(this).parent().parent().find('input.user_combo').attr('value');
return $(this).attr('value') == $(this).parent().parent().find('input.user_combo').attr('value');
}).attr('selected', true);
$('#history-pagination span').removeClass('loading'); // Remove spinner graphic from pagination
}
@@ -1342,11 +1342,11 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
// For switching using the select
if(!speedLimit) speedLimit = $.plush.speedLimit;
if(speedLimitAbs == undefined) speedLimitAbs = $.plush.speedLimitAbs;
// Save
// Save
$.plush.speedLimit = speedLimit;
$.plush.speedLimitAbs = speedLimitAbs;
// How do we format?
switch($.plush.speedLimitType) {
case '%':
@@ -1360,11 +1360,11 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
speedlimitDisplay = speedLimitAbs/1024/1024;
break;
}
// In case nothing and we make the displaying of the float more pretty
speedlimitDisplay = (isNaN(speedlimitDisplay) || speedlimitDisplay == '0') ? '' : speedlimitDisplay;
speedlimitDisplay = Math.round(speedlimitDisplay*10)/10;
// Update
if ($("#maxSpeed-option").val() != speedlimitDisplay && !$.plush.focusedOnSpeedChanger)
$("#maxSpeed-option").val(speedlimitDisplay);

View File

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

View File

@@ -1,7 +1,7 @@
<!--#set global $pane="Status"#-->
<!--#set global $help_uri="GUI+Status-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<!--#import datetime#-->
<div class="tabs">
<ul>
<li><a href="#tabs-warnings">$T('lastWarnings')</a></li>
@@ -33,7 +33,11 @@
<!--#for $warn in $warnings#-->
<!--#set $odd = not $odd#-->
<tr class="<!--#if $odd then "odd" else "even"#-->">
<td>$warn.replace("\n","</td><td>", 2)</td></tr>
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
<td>$when</td>
<td>$warn.type</td>
<td>$warn.text</td>
</tr>
<!--#end for#-->
</table>
<!--#else#-->

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

@@ -1,3 +1,4 @@
<!--#import datetime#-->
<script type="text/javascript">
window.onload = function() {
location = "../#/status"
@@ -36,7 +37,10 @@ $T('logging'):
<!--#if $warnings#-->
<h2>$T('lastWarnings') (<a class="config" onClick="lr('status/clearwarnings','', '-1', this.parentNode.id);">$T('clearWarnings')</a>)</h2>
<!--#for $warn in $warnings#-->
$warn<br/>
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
$when<br>
$warn.type<br>
$warn.text<br>
<!--#end for#-->
<!--#end if#-->

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

@@ -12,7 +12,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 7bit\n"
"POT-Creation-Date: 2017-09-02 15:39+W. Europe Daylight Time\n"
"POT-Creation-Date: 2017-09-10 21:44+W. Europe Daylight Time\n"
"Generated-By: pygettext.py 1.5\n"
@@ -212,15 +212,6 @@ msgstr ""
msgid "&nbsp;Resolving address"
msgstr ""
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr ""
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr ""
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr ""
@@ -456,6 +447,10 @@ msgstr ""
msgid "Error removing %s"
msgstr ""
#: sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr ""
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr ""
@@ -621,7 +616,7 @@ msgstr ""
msgid "Authentication missing, please enter username/password from Config->General into your 3rd party program:"
msgstr ""
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid "Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin."
msgstr ""
@@ -689,6 +684,10 @@ msgstr ""
msgid "Back"
msgstr ""
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -982,6 +981,10 @@ msgstr ""
msgid "Verifying"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2597,6 +2600,10 @@ msgstr ""
msgid "Optional authentication password."
msgstr ""
#: sabnzbd/skintext.py
msgid "If the SABnzbd Host or Port is exposed to the internet, your current settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4097,6 +4104,10 @@ msgstr ""
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr ""

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Danish <da@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -226,15 +226,6 @@ msgstr "Afprøv notifikation"
msgid "&nbsp;Resolving address"
msgstr "&nbsp; Server løsning"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEJL:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ingen"
@@ -673,7 +664,7 @@ msgstr ""
"Brugeroplysninger mangler, indtast brugernavn / password fra Konfiguration-> "
"Generelt i dit tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -752,6 +743,10 @@ msgstr "Fejl parameter"
msgid "Back"
msgstr "Tilbage"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEJL:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1051,6 +1046,10 @@ msgstr "Disk fuld"
msgid "Verifying"
msgstr "Bekræfter"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2739,6 +2738,12 @@ msgstr "SABnzbd password"
msgid "Optional authentication password."
msgstr "Valgfrit password."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr "Sikkerhed"
@@ -4385,6 +4390,10 @@ msgstr "Mistet forbindelsen til SABnzbd.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "I tilfælde af SABnzbd genstart vil denne skærm forsvinde automatisk!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Opdateringsfrekvens"

View File

@@ -7,15 +7,19 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-08-24 15:39+0000\n"
"Last-Translator: jcfp <Unknown>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr "MultiPar Programmdatei nicht gefunden!"
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
@@ -237,15 +241,6 @@ msgstr "Benachrichtigungen testen"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Adresse wird aufgelöst …"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEHLER:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "WARNUNG:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Nichts"
@@ -698,7 +693,7 @@ msgstr ""
"Authentifizierung fehlt. Bitte Benutzernamen und Passwort aus Einstellungen-"
">Allgemein in die externe Anwendung eingeben:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -776,6 +771,10 @@ msgstr "Fehlerhafter Parameter"
msgid "Back"
msgstr "Zurück"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEHLER:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1086,6 +1085,10 @@ msgstr "Festplatte voll"
msgid "Verifying"
msgstr "Überprüfen"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2800,6 +2803,12 @@ msgstr "SABnzbd-Passwort"
msgid "Optional authentication password."
msgstr "Optionale Anmeldung mit Passwort"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr "Sicherheit"
@@ -4493,6 +4502,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Wenn SABnzbd neustartet, wird diese Anzeige automatisch verschwinden!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "WARNUNG:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Aktualisierungsrate"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:50+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -226,15 +226,6 @@ msgstr "Notificación de prueba"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Resolviendo sitio"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERROR:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ninguno"
@@ -675,7 +666,7 @@ msgstr ""
"Faltaron datos de cuenta, favor ingresar usuario/contraseña desde Config-"
">General en tu aplicacion externa:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -754,6 +745,10 @@ msgstr "Parámetro incorrecto"
msgid "Back"
msgstr "Atrás"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERROR:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1059,6 +1054,10 @@ msgstr "Disco lleno"
msgid "Verifying"
msgstr "Verificando"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2753,6 +2752,12 @@ msgstr "Contraseña de SABnzbd"
msgid "Optional authentication password."
msgstr "Contraseña opcional"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4409,6 +4414,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Esta ventana desaparecerá automáticamente una vez SABnzbd se haya reiniciado."
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Frecuencia de actualización"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Finnish <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -229,15 +229,6 @@ msgstr "Testaa ilmoitusta"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Selvitetään osoitetta"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "VIRHE:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VAROITUS:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ei mitään"
@@ -672,7 +663,7 @@ msgstr ""
"Authentikointi puuttuu, ole hyvä ja syötä käyttäjänimi/salasana Asetukset-"
">Yleiset kolmannen osapuolen ohjelmaasi:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -750,6 +741,10 @@ msgstr "Virheellinen parametri"
msgid "Back"
msgstr "Takaisin"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "VIRHE:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1049,6 +1044,10 @@ msgstr "Levy täynnä"
msgid "Verifying"
msgstr "Varmennetaan"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2741,6 +2740,12 @@ msgstr "SABnzbd salasana"
msgid "Optional authentication password."
msgstr "Vaihtoehtoinen salasana todennukseen."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4400,6 +4405,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Mikäli SABnzbd käynnistetään uudelleen, tämä ruutu häviää automaattisesti!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VAROITUS:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Päivitysväli"

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-09-02 13:51+0000\n"
"PO-Revision-Date: 2017-08-21 19:45+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-09-12 18:26+0000\n"
"Last-Translator: Fred <88com88@gmail.com>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-13 05:28+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -38,7 +38,7 @@ msgstr ""
msgid ""
"SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc"
msgstr ""
"Module SABYenc... NON trouvé! v%s attendue - https://sabnzbd.org/sabyenc"
"Module SABYenc... NON trouvé ! v%s attendue - https://sabnzbd.org/sabyenc"
#: SABnzbd.py [Error message]
msgid "_yenc module... NOT found!"
@@ -238,15 +238,6 @@ msgstr "Test de Notification"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Résolution de l'adresse"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERREUR:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVERTISSEMENT :"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Aucun"
@@ -701,7 +692,7 @@ msgstr ""
"Authentification manquante, entrez vos identifiant/mot de passe de la "
"configuration générale dans votre application tierce :"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -780,6 +771,10 @@ msgstr "Paramètre incorrect"
msgid "Back"
msgstr "Retour"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERREUR:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1091,6 +1086,10 @@ msgstr "Disque plein"
msgid "Verifying"
msgstr "Vérification en cours"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr "Vérification des fichiers supplémentaires"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2808,6 +2807,14 @@ msgstr "Mot de passe SABnzbd"
msgid "Optional authentication password."
msgstr "Mot de passe pour l'authentification (facultatif)."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
"Vos paramètres actuels permettent un accès externe complet à l'interface "
"SABnzbd si l'hôte ou le port SABnzbd est ouvert vers l'internet."
#: sabnzbd/skintext.py
msgid "Security"
msgstr "Sécurité"
@@ -4506,6 +4513,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"En cas de redémarrage de SABnzbd cet écran disparaîtra automatiquement!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVERTISSEMENT :"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Taux de rafraîchissement"

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-09-02 13:51+0000\n"
"PO-Revision-Date: 2017-09-01 23:03+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-09-11 21:29+0000\n"
"Last-Translator: ION IL <Unknown>\n"
"Language-Team: Hebrew <he@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-12 05:29+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -222,15 +222,6 @@ msgstr "בחן התראה"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;פותר כתובת"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "שגיאה:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "אזהרה:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "ללא"
@@ -665,7 +656,7 @@ msgstr ""
":אימות חסר, אנא הכנס שם משתמש/סיסמה מתוך תצורה->כללי לתוך תכנית הצד השלישי "
"שלך"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -742,6 +733,10 @@ msgstr "משתנה לא נכון"
msgid "Back"
msgstr "הקודם"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "שגיאה:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1042,6 +1037,10 @@ msgstr "דיסק מלא"
msgid "Verifying"
msgstr "מוודא"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr "בודק קבצי תוספת"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2727,6 +2726,14 @@ msgstr "SABnzbd סיסמת"
msgid "Optional authentication password."
msgstr "סיסמת אימות רשותית"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
".SABnzbd חשופים לאינטרנט, ההגדרות הנוכחיות שלך מאפשרות גישה חיצונית מלאה אל "
"ממשק SABnzbd אם המארח או הפתחה של"
#: sabnzbd/skintext.py
msgid "Security"
msgstr "אבטחה"
@@ -4357,6 +4364,10 @@ msgstr "..SABnzbd אבד חיבור אל"
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "!המסך יעלם באופן אוטומטי SABnzbd במקרה של הפעלה מחדש של"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "אזהרה:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "קצב רענון"

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-09-02 13:51+0000\n"
"PO-Revision-Date: 2017-05-23 11:46+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-09-03 14:07+0000\n"
"Last-Translator: Steffen Bærø <steffen.baro@gmail.com>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -47,11 +47,11 @@ msgstr "par2-binærfil... IKKE funnet!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
msgstr "Verifikasjon og reparasjon vil ikke være mulig."
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
msgstr "MultiPar-binærfil... IKKE funnet!"
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
@@ -60,7 +60,7 @@ msgstr ""
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
msgstr "Nedlastinger vil ikke blir pakket ut."
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
@@ -228,15 +228,6 @@ msgstr "Test varslingen"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Løs adresse"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEIL:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ingen"
@@ -668,7 +659,7 @@ msgstr ""
"Autentisering mangler, angi brukernavn/passord fra Konfigurasjon->Generelt i "
"ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -746,6 +737,10 @@ msgstr "Feil parameter"
msgid "Back"
msgstr "Tilbake"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEIL:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1045,6 +1040,10 @@ msgstr "Harddisken er full"
msgid "Verifying"
msgstr "Verifiserer"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2727,6 +2726,12 @@ msgstr "SABnzbd Passord"
msgid "Optional authentication password."
msgstr "Kan velge autentiserings passord."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4355,6 +4360,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Hvis SABnzbd skulle starte på nytt vil denne skjermen forsvinne automatisk!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Oppdateringsfrekvens"

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-09-02 13:51+0000\n"
"PO-Revision-Date: 2017-09-01 09:37+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-09-11 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Dutch <nl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-12 05:29+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -233,15 +233,6 @@ msgstr "Test melding"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Adres opzoeken"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FOUT:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "WAARSCHUWING:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Geen"
@@ -690,7 +681,7 @@ msgstr ""
"Autenticatie ontbreekt; vul gebruikersnaam en wachtwoord van 'Configuratie' "
"=> 'Algemeen' in bij het externe programma:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -769,6 +760,10 @@ msgstr "Incorrecte parameter"
msgid "Back"
msgstr "Terug"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FOUT:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1037,7 +1032,7 @@ msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
msgstr "Ophalen van %s blokken..."
msgstr "%s herstelblokken downloaden..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching"
@@ -1054,7 +1049,7 @@ msgstr "Repareren"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "[%s] Repaired in %s"
msgstr "[%s] Reparatie in %s"
msgstr "[%s] Gerepareerd in %s"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py
@@ -1072,6 +1067,10 @@ msgstr "Schijf is vol"
msgid "Verifying"
msgstr "Verifiëren"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr "Controleren van extra bestanden"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1815,7 +1814,7 @@ msgstr "Script uitvoeren..."
#: sabnzbd/skintext.py [PP status]
msgid "Fetching extra blocks..."
msgstr "Extra blokken ophalen..."
msgstr "Extra herstelblokken downloaden..."
#: sabnzbd/skintext.py [PP status]
msgid "Quick Check..."
@@ -2772,6 +2771,15 @@ msgstr "Wachtwoord"
msgid "Optional authentication password."
msgstr "Wachtwoord voor web login."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
"Als de Host of Poort open is gesteld naar het internet zorgen de huidige "
"instellingen ervoor dat de webinterface volledig beschikbaar is voor "
"externen."
#: sabnzbd/skintext.py
msgid "Security"
msgstr "Beveiliging"
@@ -4449,6 +4457,10 @@ msgstr "Verbinding met SABnzbd verbroken"
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "Wanneer SABnzbd opnieuw is gestart, gaat dit venster vanzelf weg!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "WAARSCHUWING:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Ververssnelheid"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2015-12-28 10:22+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -226,15 +226,6 @@ msgstr "Powiadomienie testowe"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Rozwiązywanie adresu"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "BŁĄD:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "UWAGA:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Brak"
@@ -670,7 +661,7 @@ msgstr ""
"Brak danych uwierzytelniających, wprowadź nazwę użytkownika/hasło z sekcji "
"Konfiguracja->Ogólne do zewnętrznego programu:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -749,6 +740,10 @@ msgstr "Błędny parametr"
msgid "Back"
msgstr "Powrót"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "BŁĄD:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1050,6 +1045,10 @@ msgstr "Dysk pełny"
msgid "Verifying"
msgstr "Weryfikowanie"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2733,6 +2732,12 @@ msgstr "Hasło SABnzbd"
msgid "Optional authentication password."
msgstr "Opcjonalne hasło"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4373,6 +4378,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"W razie ponownego uruchomienia SABnzbd ten ekran zniknie automatycznie!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "UWAGA:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Częstotliwość odświeżania"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2016-01-01 22:58+0000\n"
"Last-Translator: lrrosa <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:50+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -226,15 +226,6 @@ msgstr "Notificação de teste"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Resolvendo endereço"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRO:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Nenhum"
@@ -671,7 +662,7 @@ msgstr ""
"Autenticação faltando. Por favor insira usuário/senha de Configuração->Geral "
"em seu programa de terceiros:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -749,6 +740,10 @@ msgstr "Parâmetro incorreto"
msgid "Back"
msgstr "Voltar"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRO:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1047,6 +1042,10 @@ msgstr "Disco cheio"
msgid "Verifying"
msgstr "Verificando"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2733,6 +2732,12 @@ msgstr "Senha do SABnzbd"
msgid "Optional authentication password."
msgstr "Senha de autenticação opcional."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4371,6 +4376,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"No caso de reinício do SABnzbd, esta janela irá desaparecer automaticamente!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Taxa de atualização"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2016-07-29 16:20+0000\n"
"Last-Translator: nicusor <Unknown>\n"
"Language-Team: Romanian <ro@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -229,15 +229,6 @@ msgstr "Notificări Test"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Reolvare adresă"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "EROARE:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ATENŢIE:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Niciunul"
@@ -673,7 +664,7 @@ msgstr ""
"Autentificare lipsă, vă rugăm să introduceţi numele de utilizator/parola de "
"la Configurare->General în programul dumneavoastră terţ:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -752,6 +743,10 @@ msgstr "Parametru Incorect"
msgid "Back"
msgstr "Înapoi"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "EROARE:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1051,6 +1046,10 @@ msgstr "Disc plin"
msgid "Verifying"
msgstr "Se verifică"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2740,6 +2739,12 @@ msgstr "Parolă SABnzbd"
msgid "Optional authentication password."
msgstr "Parolă autentificare opţională"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4374,6 +4379,10 @@ msgstr "Am pierdut conexiunea cu SABnzbd.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "În cazul repornirii SABnzbd acest ecran va dispărea în mod automat!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ATENŢIE:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Rată actualizare"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Pavel Maryanov <Unknown>\n"
"Language-Team: Russian <gmu@mx.ru>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
"Generated-By: pygettext.py 1.5\n"
#: SABnzbd.py [Error message]
@@ -221,15 +221,6 @@ msgstr "Тестовое уведомление"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Разрешение адреса"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ОШИБКА"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПРЕДУПРЕЖДЕНИЕ"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ничего"
@@ -663,7 +654,7 @@ msgstr ""
"Отсутствуют учётные данные. Введите в сторонней программе имя пользователя и "
"пароль из раздела «Настройка -> Общие»:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -739,6 +730,10 @@ msgstr "Неправильный параметр"
msgid "Back"
msgstr "Назад"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ОШИБКА"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1039,6 +1034,10 @@ msgstr ""
msgid "Verifying"
msgstr "Проверка"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2723,6 +2722,12 @@ msgstr "Пароль SABnzbd"
msgid "Optional authentication password."
msgstr "Необязательный пароль для входа."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4352,6 +4357,10 @@ msgstr ""
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПРЕДУПРЕЖДЕНИЕ"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Частота обновления"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2015-12-28 10:25+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:49+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -223,15 +223,6 @@ msgstr "Probno obaveštenje"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Решавање адресе"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ГРЕШКА:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПАЖЊА:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ниједно"
@@ -663,7 +654,7 @@ msgstr ""
"Недостаје аутентификација, унети у спољни програм име/лозинку из Подешавања-"
">Опште:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -741,6 +732,10 @@ msgstr "Погрешан параметар"
msgid "Back"
msgstr "Назад"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ГРЕШКА:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1040,6 +1035,10 @@ msgstr "Диск је пун"
msgid "Verifying"
msgstr "Проверавање"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2715,6 +2714,12 @@ msgstr "Лозинка SABnzbd-а"
msgid "Optional authentication password."
msgstr "Лозинка за аутентификацију (опционо)"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4339,6 +4344,10 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"U slučaju ponovnog pokretanja SABnzbd-a ovaj prozor će nestati automatski!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПАЖЊА:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Брзина освежавања"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2016-02-20 20:34+0000\n"
"Last-Translator: shypike <Unknown>\n"
"Language-Team: Swedish <sv@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:50+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -224,15 +224,6 @@ msgstr "Testa notifikation"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Lösa adress"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEL:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VARNING:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ingen"
@@ -666,7 +657,7 @@ msgstr ""
"Autentisering saknas, ange användarnamn / lösenord från Konfiguration-> "
"Allmänt i ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -745,6 +736,10 @@ msgstr "Fel parameter"
msgid "Back"
msgstr "Bakåt"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEL:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1045,6 +1040,10 @@ msgstr "Disken är full"
msgid "Verifying"
msgstr "Verifierar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2728,6 +2727,12 @@ msgstr "SABnzbd Lösenord"
msgid "Optional authentication password."
msgstr "Väljbart autentiserings lösenord."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -4353,6 +4358,10 @@ msgstr "Förlorade förbindelse till SABnzbd.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "Om SABnzbd startar om kommer denna skärm att försvinna automatiskt!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VARNING:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Uppdateringsfrekvens"

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-09-02 13:51+0000\n"
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:06+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-09-03 05:50+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
"X-Generator: Launchpad (build 18449)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -220,15 +220,6 @@ msgstr "测试通知"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;正在解析地址"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "错误:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "警告:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "无"
@@ -653,7 +644,7 @@ msgid ""
"into your 3rd party program:"
msgstr "缺身份认证信息,请在第三方程序中输入“配置”->“常规”中的用户名/密码:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -728,6 +719,10 @@ msgstr "参数不正确"
msgid "Back"
msgstr "返回"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "错误:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -1025,6 +1020,10 @@ msgstr "磁盘空间已满"
msgid "Verifying"
msgstr "正在验证"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -2695,6 +2694,12 @@ msgstr "SABnzbd 密码"
msgid "Optional authentication password."
msgstr "可选身份验证密码。"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr "安全"
@@ -4279,6 +4284,10 @@ msgstr "失去与 SABnzbd 的连接.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "SABnzbd 重启后本画面将自动消失!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "警告:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "刷新频率"

View File

@@ -537,7 +537,7 @@ def guard_https_ver():
set_https_verification(cfg.enable_https_verification())
def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None, feed_name=None):
def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None):
""" Add NZB based on a URL, attributes optional """
if 'http' not in url:
return
@@ -551,8 +551,8 @@ def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None, fe
# Add feed name if it came from RSS
msg = T('Trying to fetch NZB from %s') % url
if feed_name:
msg = '%s - %s' % (feed_name, msg)
if nzbname:
msg = '%s - %s' % (nzbname, msg)
# Generate the placeholder
future_nzo = NzbQueue.do.generate_future(msg, pp, script, cat, url=url, priority=priority, nzbname=nzbname)

View File

@@ -1277,11 +1277,7 @@ def build_status(skip_dashboard=False, output=None):
info['servers'].append((server.displayname, '', connected, serverconnections, server.ssl,
server.active, server.errormsg, server.priority, server.optional))
wlist = []
for w in sabnzbd.GUIHANDLER.content():
w = w.replace('WARNING', T('WARNING:')).replace('ERROR', T('ERROR:'))
wlist.insert(0, unicoder(w))
info['warnings'] = wlist
info['warnings'] = sabnzbd.GUIHANDLER.content()
return info
@@ -1342,7 +1338,6 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
slot['size'] = format_bytes(bytes)
slot['sizeleft'] = format_bytes(bytesleft)
slot['percentage'] = "%s" % (int(((mb - mbleft) / mb) * 100)) if mb != mbleft else '0'
slot['missing'] = pnfo.missing
slot['mbmissing'] = "%.2f" % (pnfo.bytes_missing / MEBI)
slot['direct_unpack'] = pnfo.direct_unpack
if not output:
@@ -1634,8 +1629,6 @@ def build_header(webdir='', output=None):
header['restart_req'] = sabnzbd.RESTART_REQ
header['pid'] = os.getpid()
header['last_warning'] = sabnzbd.GUIHANDLER.last().replace('WARNING', ('WARNING:')).replace('ERROR', T('ERROR:'))
header['active_lang'] = cfg.language()
header['my_lcldata'] = sabnzbd.DIR_LCLDATA

View File

@@ -292,6 +292,9 @@ def check_encrypted_and_unwanted_files(nzo, filepath):
# Did any work?
if password_hit:
# We always trust the user's input
if not nzo.password:
nzo.password = password_hit
# Don't check other files
logging.info('Password "%s" matches for job "%s"', password_hit, nzo.final_name)
nzo.encrypted = -1

View File

@@ -253,7 +253,7 @@ keep_awake = OptionBool('misc', 'keep_awake', True)
win_menu = OptionBool('misc', 'win_menu', True)
allow_incomplete_nzb = OptionBool('misc', 'allow_incomplete_nzb', False)
enable_bonjour = OptionBool('misc', 'enable_bonjour', True)
reject_duplicate_files = OptionBool('misc', 'recject_duplicate_files', False)
reject_duplicate_files = OptionBool('misc', 'reject_duplicate_files', False)
max_art_opt = OptionBool('misc', 'max_art_opt', False)
use_pickle = OptionBool('misc', 'use_pickle', False)
ipv6_hosting = OptionBool('misc', 'ipv6_hosting', False)

View File

@@ -27,7 +27,7 @@ REC_RAR_VERSION = 500
PNFO = namedtuple('PNFO', 'repair unpack delete script nzo_id filename password unpackstrht '
'msgid category url bytes_left bytes avg_stamp avg_date finished_files '
'active_files queued_files status priority missing bytes_missing direct_unpack')
'active_files queued_files status priority bytes_missing direct_unpack')
QNFO = namedtuple('QNFO', 'bytes bytes_left bytes_left_previous_page list q_size_list q_fullsize')
@@ -51,7 +51,7 @@ RENAMES_FILE = '__renames__'
ATTRIB_FILE = 'SABnzbd_attrib'
REPAIR_REQUEST = 'repair-all.sab'
SABYENC_VERSION_REQUIRED = '3.0.2'
SABYENC_VERSION_REQUIRED = '3.3.1'
DB_HISTORY_VERSION = 1
DB_HISTORY_NAME = 'history%s.db' % DB_HISTORY_VERSION

View File

@@ -126,7 +126,7 @@ class HistoryDB(object):
else:
self.c.execute(command)
if save:
self.save()
self.con.commit()
return True
except:
error = str(sys.exc_value)
@@ -196,14 +196,6 @@ class HistoryDB(object):
""")
self.execute('PRAGMA user_version = 2;')
def save(self):
""" Save database to disk """
try:
self.con.commit()
except:
logging.error(T('SQL Commit Failed, see log'))
logging.info("Traceback: ", exc_info=True)
def close(self):
""" Close database connection """
try:
@@ -243,11 +235,9 @@ class HistoryDB(object):
jobs = [jobs]
for job in jobs:
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,))
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,), save=True)
logging.info('Removing job %s from history', job)
self.save()
def auto_history_purge(self):
""" Remove history items based on the configured history-retention """
if sabnzbd.cfg.history_retention() == "0":
@@ -275,11 +265,10 @@ class HistoryDB(object):
""" Add a new job entry to the database """
t = build_history_info(nzo, storage, path, postproc_time, script_output, script_line)
if self.execute("""INSERT INTO history (completed, name, nzb_name, category, pp, script, report,
url, status, nzo_id, storage, path, script_log, script_line, download_time, postproc_time, stage_log,
downloaded, completeness, fail_message, url_info, bytes, series, md5sum, password)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", t):
self.save()
self.execute("""INSERT INTO history (completed, name, nzb_name, category, pp, script, report,
url, status, nzo_id, storage, path, script_log, script_line, download_time, postproc_time, stage_log,
downloaded, completeness, fail_message, url_info, bytes, series, md5sum, password)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", t, save=True)
logging.info('Added job %s to history', nzo.final_name)
def fetch_history(self, start=None, limit=None, search=None, failed_only=0, categories=None):
@@ -504,15 +493,9 @@ def build_history_info(nzo, storage='', downpath='', postproc_time=0, script_out
if seriesname and season and episode:
series = u'%s/%s/%s' % (seriesname.lower(), season, episode)
# See whatever the first password was, for the Retry
password = ''
passwords = get_all_passwords(nzo)
if passwords:
password = passwords[0]
return (completed, name, nzb_name, category, pp, script, report, url, status, nzo_id, storage, path,
script_log, script_line, download_time, postproc_time, stage_log, downloaded, completeness,
fail_message, url_info, bytes, series, nzo.md5sum, password)
fail_message, url_info, bytes, series, nzo.md5sum, nzo.password)
def unpack_history_info(item):

View File

@@ -144,7 +144,7 @@ class Decoder(Thread):
register = False
except CrcError, e:
logme = T('CRC Error in %s (%s -> %s)') % (art_id, e.needcrc, e.gotcrc)
logme = T('CRC Error in %s') % art_id
logging.info(logme)
data = e.data

View File

@@ -20,7 +20,6 @@
##############################################################################
from threading import RLock, Condition
DIR_LOCK = RLock()
DOWNLOADER_CV = Condition(RLock())
def synchronized(lock):

View File

@@ -30,7 +30,6 @@ import threading
import sabnzbd
from sabnzbd.constants import SCAN_FILE_NAME, VALID_ARCHIVES
import sabnzbd.utils.rarfile as rarfile
from sabnzbd.decorators import synchronized, DIR_LOCK
from sabnzbd.encoding import platform_encode
from sabnzbd.newsunpack import is_sevenfile, SevenZip
import sabnzbd.nzbstuff as nzbstuff
@@ -341,7 +340,6 @@ class DirScanner(threading.Thread):
def scan(self):
""" Do one scan of the watched folder """
@synchronized(DIR_LOCK)
def run_dir(folder, catdir):
try:
files = os.listdir(folder)

View File

@@ -325,7 +325,7 @@ class MainPage(object):
if not check_login():
raise NeedLogin()
if not cfg.notified_new_skin() and cfg.web_dir() not in ('Glitter', 'Plush'):
if not cfg.notified_new_skin() and cfg.web_dir() != 'Glitter':
logging.warning(T('Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin.'))
if not cfg.notified_new_skin():
cfg.notified_new_skin.set(1)
@@ -2076,7 +2076,7 @@ class ConfigRss(object):
prio = att.get('prio')
if url:
sabnzbd.add_url(url, pp, script, cat, prio, nzbname, feed_name=feed)
sabnzbd.add_url(url, pp, script, cat, prio, nzbname)
# Need to pass the title instead
sabnzbd.rss.flag_downloaded(feed, url)
raise rssRaiser(self.__root, kwargs)

View File

@@ -29,13 +29,14 @@ import threading
import subprocess
import socket
import time
import calendar
import datetime
import fnmatch
import stat
from urlparse import urlparse
import sabnzbd
from sabnzbd.decorators import synchronized, DIR_LOCK
from sabnzbd.decorators import synchronized
from sabnzbd.constants import DEFAULT_PRIORITY, FUTURE_Q_FOLDER, JOB_ADMIN, \
GIGI, MEBI, DEF_CACHE_LIMIT
import sabnzbd.config as config
@@ -864,6 +865,7 @@ def get_cache_limit():
##############################################################################
# Locked directory operations to avoid problems with simultaneous add/remove
##############################################################################
DIR_LOCK = threading.RLock()
@synchronized(DIR_LOCK)
def get_unique_path(dirpath, n=0, create_dir=True):

View File

@@ -1451,10 +1451,12 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
# Target files
m = TARGET_RE.match(line)
if m:
nzo.status = Status.VERIFYING
verifynum += 1
if verifytotal == 0 or verifynum < verifytotal:
verifynum += 1
nzo.set_action_line(T('Verifying'), '%02d/%02d' % (verifynum, verifytotal))
nzo.status = Status.VERIFYING
else:
nzo.set_action_line(T('Checking extra files'), '%02d' % verifynum)
# Remove redundant extra files that are just duplicates of original ones
if 'duplicate data blocks' in line:
@@ -1696,9 +1698,9 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
# It prints the filename couple of times, so we save it to check
# 'datafiles' will not contain all data-files in par-set, only the
# ones that got scanned, but it's ouput is never used!
nzo.status = Status.VERIFYING
if line.split()[1] in ('Damaged', 'Found'):
verifynum += 1
nzo.status = Status.VERIFYING
datafiles.append(TRANS(m.group(1)))
# Set old_name in case it was misnamed and found (not when we are joining)
@@ -1725,6 +1727,13 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
# Need to reset it to avoid collision
old_name = None
else:
# It's scanning extra files that don't belong to the set
# For damaged files it reports the filename twice, so only then start
verifynum += 1
if verifynum / 2 > verifytotal:
nzo.set_action_line(T('Checking extra files'), '%02d' % verifynum)
if joinables:
# Find out if a joinable file has been used for joining
uline = unicoder(line)
@@ -1754,9 +1763,15 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
nzo.set_unpack_info('Repair', msg)
nzo.status = Status.FAILED
# MultiPar can say 'PAR File(s) Incomplete' also when it needs more blocks
# But the Need-more-blocks message is always last, so force failure
finished = 0
# Result of verification
elif line.startswith('All Files Complete'):
elif line.startswith('All Files Complete') or line.endswith('PAR File(s) Incomplete'):
# Completed without damage!
# 'PAR File(s) Incomplete' is reported for success
# but when there are very similar filenames in the folder
msg = T('[%s] Verified in %s, all files correct') % (unicoder(setname), format_time_string(time.time() - start))
nzo.set_unpack_info('Repair', msg)
logging.info('Verified in %s, all files correct',

View File

@@ -27,7 +27,7 @@ import datetime
import sabnzbd
from sabnzbd.nzbstuff import NzbObject
from sabnzbd.misc import exit_sab, cat_to_opts, \
get_admin_path, remove_all, globber_full
get_admin_path, remove_all, globber_full, int_conv
from sabnzbd.panic import panic_queue
import sabnzbd.database as database
from sabnzbd.decorators import notify_downloader
@@ -620,7 +620,7 @@ class NzbQueue(object):
def __set_priority(self, nzo_id, priority):
""" Sets the priority on the nzo and places it in the queue at the appropriate position """
try:
priority = int(priority)
priority = int_conv(priority)
nzo = self.__nzo_table[nzo_id]
nzo_id_pos1 = -1
pos = -1
@@ -640,7 +640,7 @@ class NzbQueue(object):
if priority == self.__nzo_list[nzo_id_pos1].priority:
return nzo_id_pos1
nzo.priority = priority
nzo.set_priority(priority)
if sabnzbd.scheduler.analyse(False, priority) and \
nzo.status in (Status.CHECKING, Status.DOWNLOADING, Status.QUEUED):
nzo.status = Status.PAUSED
@@ -817,8 +817,8 @@ class NzbQueue(object):
n = 0
for nzo in self.__nzo_list:
if nzo.status not in (Status.PAUSED, Status.CHECKING):
b_left = nzo.remaining()
if nzo.status not in (Status.PAUSED, Status.CHECKING) or nzo.priority == TOP_PRIORITY:
b_left = nzo.remaining
bytes_total += nzo.bytes
bytes_left += b_left
q_size += 1
@@ -840,7 +840,7 @@ class NzbQueue(object):
bytes_left = 0
for nzo in self.__nzo_list:
if nzo.status != 'Paused':
bytes_left += nzo.remaining()
bytes_left += nzo.remaining
return bytes_left
def is_empty(self):
@@ -864,6 +864,17 @@ class NzbQueue(object):
if not nzo.futuretype and not nzo.files and nzo.status not in (Status.PAUSED, Status.GRABBING):
empty.append(nzo)
# Stall prevention by checking if all servers are in the trylist
# This is a CPU-cheaper alternative to prevent stalling
if len(nzo.try_list) == sabnzbd.downloader.Downloader.do.server_nr:
# Maybe the NZF's need a reset too?
for nzf in nzo.files:
if len(nzf.try_list) == sabnzbd.downloader.Downloader.do.server_nr:
# We do not want to reset all article trylists, they are good
nzf.reset_try_list()
# Reset main trylist, minimal performance impact
nzo.reset_try_list()
for nzo in empty:
self.end_job(nzo)

View File

@@ -40,15 +40,15 @@ except ImportError:
# SABnzbd modules
import sabnzbd
from sabnzbd.constants import GIGI, ATTRIB_FILE, JOB_ADMIN, \
DEFAULT_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY, \
PAUSED_PRIORITY, TOP_PRIORITY, DUP_PRIORITY, REPAIR_PRIORITY, \
REPAIR_PRIORITY, TOP_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, \
LOW_PRIORITY, DEFAULT_PRIORITY, PAUSED_PRIORITY, DUP_PRIORITY, STOP_PRIORITY, \
RENAMES_FILE, MAX_BAD_ARTICLES, Status, PNFO
from sabnzbd.misc import to_units, cat_to_opts, cat_convert, sanitize_foldername, \
get_unique_path, get_admin_path, remove_all, sanitize_filename, globber_full, \
int_conv, set_permissions, format_time_string, long_path, trim_win_path, \
fix_unix_encoding, calc_age, is_obfuscated_filename, get_ext, get_filename, \
get_unique_filename, renamer
from sabnzbd.decorators import synchronized, DIR_LOCK
from sabnzbd.decorators import synchronized
import sabnzbd.config as config
import sabnzbd.cfg as cfg
from sabnzbd.encoding import unicoder, platform_encode
@@ -300,17 +300,7 @@ class NzbFile(TryList):
self.articles.remove(article)
if found:
self.bytes_left -= article.bytes
# To keep counter correct for pre-check
if self.nzo.precheck:
self.nzo.bytes_downloaded += article.bytes
# The parent trylist is filled to the top, maybe too soon
# This is a CPU-cheaper alternative to prevent stalling
if len(self.nzo.try_list) == sabnzbd.downloader.Downloader.do.server_nr:
self.reset_try_list()
self.nzo.reset_try_list()
self.nzo.bytes_tried += article.bytes
return (not self.articles)
def set_par2(self, setname, vol, blocks):
@@ -566,9 +556,9 @@ class NzbParser(xml.sax.handler.ContentHandler):
##############################################################################
NzbObjectSaver = (
'filename', 'work_name', 'final_name', 'created', 'bytes', 'bytes_downloaded', 'bytes_tried',
'repair', 'unpack', 'delete', 'script', 'cat', 'url', 'groups', 'avg_date', 'md5of16k',
'partable', 'extrapars', 'md5packs', 'files', 'files_table', 'finished_files', 'status',
'avg_bps_freq', 'avg_bps_total', 'priority', 'saved_articles', 'nzo_id',
'bytes_missing', 'repair', 'unpack', 'delete', 'script', 'cat', 'url', 'groups', 'avg_date',
'md5of16k', 'partable', 'extrapars', 'md5packs', 'files', 'files_table', 'finished_files',
'status', 'avg_bps_freq', 'avg_bps_total', 'priority', 'saved_articles', 'nzo_id',
'futuretype', 'deleted', 'parsed', 'action_line', 'unpack_info', 'fail_msg', 'nzo_info',
'custom_name', 'password', 'next_save', 'save_timeout', 'encrypted', 'bad_articles',
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta',
@@ -581,7 +571,7 @@ NZO_LOCK = threading.RLock()
class NzbObject(TryList):
@synchronized(DIR_LOCK)
@synchronized(NZO_LOCK)
def __init__(self, filename, pp, script, nzb=None,
futuretype=False, cat=None, url=None,
priority=NORMAL_PRIORITY, nzbname=None, status="Queued", nzo_info=None,
@@ -626,7 +616,9 @@ class NzbObject(TryList):
self.bytes = 0 # Original bytesize
self.bytes_downloaded = 0 # Downloaded byte
self.bytes_tried = 0 # Which bytes did we try
self.bytes_missing = 0 # Bytes missing
self.bad_articles = 0 # How many bad (non-recoverable) articles
self.set_priority(priority) # Parse priority
self.repair = r # True if we want to repair this set
self.unpack = u # True if we want to unpack this set
self.delete = d # True if we want to delete this set
@@ -656,11 +648,6 @@ class NzbObject(TryList):
self.status = status
self.avg_bps_freq = 0
self.avg_bps_total = 0
try:
priority = int(priority)
except:
priority = DEFAULT_PRIORITY
self.priority = priority
self.saved_articles = []
@@ -815,7 +802,8 @@ class NzbObject(TryList):
self.password = unicoder(password, True)
# Determine category and find pp/script values
self.cat, pp_tmp, self.script, self.priority = cat_to_opts(cat, pp, script, priority)
self.cat, pp_tmp, self.script, priority = cat_to_opts(cat, pp, script, priority)
self.set_priority(priority)
self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp_tmp)
# Run user pre-queue script if needed
@@ -828,10 +816,6 @@ class NzbObject(TryList):
pp = int(pp)
except:
pp = None
try:
priority = int(priority)
except:
priority = None
if accept < 1:
self.purge_data()
raise TypeError
@@ -843,7 +827,8 @@ class NzbObject(TryList):
self.fail_msg = T('Pre-queue script marked job as failed')
# Re-evaluate results from pre-queue script
self.cat, pp, self.script, self.priority = cat_to_opts(cat, pp, script, priority)
self.cat, pp, self.script, priority = cat_to_opts(cat, pp, script, int_conv(priority))
self.set_priority(priority)
self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp)
else:
accept = 1
@@ -953,7 +938,6 @@ class NzbObject(TryList):
self.servercount[serverid] += bytes
else:
self.servercount[serverid] = bytes
self.bytes_downloaded += bytes
@synchronized(NZO_LOCK)
def remove_nzf(self, nzf):
@@ -990,10 +974,13 @@ class NzbObject(TryList):
# Don't postpone header-only-files, to extract all possible md5of16k
if setname and block and matcher(lparset, setname.lower()):
xnzf.set_par2(parset, vol, block)
# Don't postpone if all par2 are desired and should be kept
if not(cfg.enable_all_par() and not cfg.enable_par_cleanup()):
# Don't postpone if all par2 are desired and should be kept or not repairing
if self.repair and not(cfg.enable_all_par() and not cfg.enable_par_cleanup()):
self.extrapars[parset].append(xnzf)
self.files.remove(xnzf)
# Already count these bytes as done
self.bytes_tried += xnzf.bytes_left
# Sort the sets
for setname in self.extrapars:
self.extrapars[parset].sort(key=lambda x: x.blocks)
@@ -1017,8 +1004,7 @@ class NzbObject(TryList):
logging.debug('Got md5pack for set %s', nzf.setname)
self.md5packs[setname] = pack
# See if we need to postpone some pars
if self.repair:
self.postpone_pars(nzf, setname)
self.postpone_pars(nzf, setname)
else:
# Need to add this to the set, first need setname
for setname in self.md5packs:
@@ -1028,6 +1014,10 @@ class NzbObject(TryList):
# Change the properties
nzf.set_par2(setname, vol, block)
logging.debug('Got additional md5pack for set %s', nzf.setname)
# Make sure it exists, could be removed by newsunpack
if setname not in self.extrapars:
self.extrapars[setname] = []
self.extrapars[setname].append(nzf)
elif self.repair:
@@ -1129,6 +1119,14 @@ class NzbObject(TryList):
if self.bad_articles > MAX_BAD_ARTICLES:
self.abort_direct_unpacker()
# Increase missing bytes counter
self.bytes_missing += article.bytes
else:
# Increase counter of actually finished bytes
self.bytes_downloaded += article.bytes
# All the bytes that were tried
self.bytes_tried += article.bytes
post_done = False
if not self.files:
post_done = True
@@ -1162,43 +1160,54 @@ class NzbObject(TryList):
# Looking for the longest name first, minimizes the chance on a mismatch
files.sort(lambda x, y: len(y) - len(x))
nzfs = self.files[:]
# The NZFs should be tried shortest first, to improve the chance on a proper match
nzfs = self.files[:]
nzfs.sort(lambda x, y: len(x.subject) - len(y.subject))
# Flag files from NZB that already exist as finished
for filename in files[:]:
for nzf in nzfs:
subject = sanitize_filename(name_extractor(nzf.subject))
filepath = os.path.join(wdir, filename)
if (nzf.filename == filename) or (subject == filename) or (filename in subject):
nzf.filename = filename
nzf.bytes_left = 0
if sabnzbd.par2file.is_parfile(filepath):
self.handle_par2(nzf, os.path.join(wdir, filename))
self.remove_nzf(nzf)
nzfs.remove(nzf)
files.remove(filename)
# Set bytes correctly
self.bytes_tried += nzf.bytes
self.bytes_downloaded += nzf.bytes
# Process par2 files
filepath = os.path.join(wdir, filename)
if sabnzbd.par2file.is_parfile(filepath):
self.handle_par2(nzf, filepath)
break
# Create an NZF for each remaining existing file
try:
# Create an NZF for each remaining existing file
for filename in files:
tup = os.stat(os.path.join(wdir, filename))
tm = datetime.datetime.fromtimestamp(tup.st_mtime)
nzf = NzbFile(tm, '"%s"' % filename, [], tup.st_size, self)
self.files.append(nzf)
self.files_table[nzf.nzf_id] = nzf
self.bytes += nzf.bytes
nzf.filename = filename
nzf.bytes_left = 0
# Create NZB's using basic information
filepath = os.path.join(wdir, filename)
if sabnzbd.par2file.is_parfile(filepath):
self.handle_par2(nzf, filepath)
self.remove_nzf(nzf)
logging.info('File %s added to job', filename)
if os.path.exists(filepath):
tup = os.stat(filepath)
tm = datetime.datetime.fromtimestamp(tup.st_mtime)
nzf = NzbFile(tm, filename, [], tup.st_size, self)
self.files.append(nzf)
self.files_table[nzf.nzf_id] = nzf
nzf.filename = filename
self.remove_nzf(nzf)
# Set bytes correctly
self.bytes += nzf.bytes
self.bytes_tried += nzf.bytes
self.bytes_downloaded += nzf.bytes
# Process par2 files
if sabnzbd.par2file.is_parfile(filepath):
self.handle_par2(nzf, filepath)
logging.info('Existing file %s added to job', filename)
except:
logging.debug('Bad NZB handling')
logging.info("Traceback: ", exc_info=True)
@@ -1216,7 +1225,13 @@ class NzbObject(TryList):
# Abort unpacking if not desired anymore
if not self.unpack:
self.abort_direct_unpacker()
self.save_to_disk()
def set_priority(self, value):
""" Check if this is a valid priority """
value = int_conv(value)
if value in (REPAIR_PRIORITY, TOP_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, \
LOW_PRIORITY, DEFAULT_PRIORITY, PAUSED_PRIORITY, DUP_PRIORITY, STOP_PRIORITY):
self.priority = value
@property
def final_name_labeled(self):
@@ -1288,10 +1303,12 @@ class NzbObject(TryList):
def add_parfile(self, parfile):
""" Add parfile to the files to be downloaded
Resets trylist just to be sure
Adjust download-size accordingly
"""
if not parfile.completed and parfile not in self.files and parfile not in self.finished_files:
parfile.reset_all_try_lists()
self.files.append(parfile)
self.bytes_tried -= parfile.bytes_left
@synchronized(NZO_LOCK)
def remove_parset(self, setname):
@@ -1444,6 +1461,7 @@ class NzbObject(TryList):
if not nzf.import_finished and not self.is_gone():
logging.error(T('Error importing %s'), nzf)
nzf_remove_list.append(nzf)
nzf.nzo.pause()
continue
else:
continue
@@ -1613,6 +1631,11 @@ class NzbObject(TryList):
else:
return None
@property
def remaining(self):
""" Return remaining bytes """
return self.bytes - self.bytes_tried
@synchronized(NZO_LOCK)
def purge_data(self, keep_basic=False, del_files=False):
""" Remove all admin info, 'keep_basic' preserves attribs and nzb """
@@ -1643,36 +1666,22 @@ class NzbObject(TryList):
except:
pass
def remaining(self):
""" Return remaining bytes """
bytes_par2 = 0
for _set in self.extrapars:
for nzf in self.extrapars[_set]:
bytes_par2 += nzf.bytes_left
# Subtract PAR2 sets and already downloaded bytes
bytes_left = self.bytes - self.bytes_tried - bytes_par2
return bytes_left
def gather_info(self, full=False):
queued_files = []
if full:
for _set in self.extrapars:
for nzf in self.extrapars[_set]:
# Don't show files twice
if not nzf.completed and nzf not in self.files:
queued_files.append(nzf)
# extrapars can change during iteration
with NZO_LOCK:
for _set in self.extrapars:
for nzf in self.extrapars[_set]:
# Don't show files twice
if not nzf.completed and nzf not in self.files:
queued_files.append(nzf)
return PNFO(self.repair, self.unpack, self.delete, self.script,
self.nzo_id, self.final_name_labeled, self.password, {},
'', self.cat, self.url,
self.remaining(), self.bytes, self.avg_stamp, self.avg_date,
self.finished_files if full else [],
self.files if full else [],
queued_files,
self.status, self.priority,
self.nzo_info.get('missing_articles', 0),
self.bytes_tried - self.bytes_downloaded,
self.direct_unpacker.get_formatted_stats() if self.direct_unpacker else 0)
return PNFO(self.repair, self.unpack, self.delete, self.script, self.nzo_id,
self.final_name_labeled, self.password, {}, '', self.cat, self.url, self.remaining,
self.bytes, self.avg_stamp, self.avg_date, self.finished_files if full else [],
self.files if full else [], queued_files, self.status, self.priority,
self.bytes_missing, self.direct_unpacker.get_formatted_stats() if self.direct_unpacker else 0)
def get_nzf_by_id(self, nzf_id):
if nzf_id in self.files_table:
@@ -1808,6 +1817,8 @@ class NzbObject(TryList):
self.renames = {}
if self.bad_articles is None:
self.bad_articles = 0
if self.bytes_missing is None:
self.bytes_missing = 0
if self.bytes_tried is None:
# Fill with old info
self.bytes_tried = 0

View File

@@ -180,6 +180,10 @@ class RSSQueue(object):
logging.warning(T('Cannot read %s'), RSS_FILE_NAME)
logging.info("Traceback: ", exc_info=True)
# Storage needs to be dict
if not self.jobs:
self.jobs = {}
# jobs is a NAME-indexed dictionary
# Each element is link-indexed dictionary
# Each element is another dictionary:
@@ -618,7 +622,7 @@ def _HandleLink(jobs, feed, link, title, size, age, season, episode, flag, orgca
jobs[link]['status'] = 'D'
jobs[link]['time_downloaded'] = time.localtime()
logging.info("Adding %s (%s) to queue", link, title)
sabnzbd.add_url(link, pp=pp, script=script, cat=cat, priority=priority, nzbname=nzbname, feed_name=feed)
sabnzbd.add_url(link, pp=pp, script=script, cat=cat, priority=priority, nzbname=nzbname)
else:
if star:
jobs[link]['status'] = flag + '*'

View File

@@ -189,7 +189,6 @@ SKIN_TEXT = {
'ft-newRelease@1' : TT('New release %s available at'), # Used in Footer
# Main page
'useGlitter': TT('Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin.'),
'shutdownOK?' : TT('Are you sure you want to shutdown SABnzbd?'),
'link-shutdown' : TT('Shutdown'), #: Shutdown SABnzbd
'link-pause' : TT('Pause'), #: Pause downloading
@@ -343,6 +342,7 @@ SKIN_TEXT = {
'explain-web_username' : TT('Optional authentication username.'),
'opt-web_password' : TT('SABnzbd Password'),
'explain-web_password' : TT('Optional authentication password.'),
'checkSafety' : TT('If the SABnzbd Host or Port is exposed to the internet, your current settings allow full external access to the SABnzbd interface.'),
'security' : TT('Security'),
'opt-enable_https' : TT('Enable HTTPS'),
'opt-notInstalled' : TT('not installed'),
@@ -804,6 +804,7 @@ SKIN_TEXT = {
'Glitter-filtered' : TT('FILTERED'),
'Glitter-waitSec' : TT('WAIT %s sec'),
'Glitter-error' : TT('ERROR:'),
'Glitter-fetch' : TT('Fetch'),
'Glitter-interfaceOptions' : TT('Web Interface'),
'Glitter-interfaceRefresh' : TT('Refresh rate'),
'Glitter-useGlobalOptions' : TT('Use global interface settings'),

View File

@@ -83,6 +83,7 @@ class URLGrabber(Thread):
# Re-queue when too early and still active
if future_nzo.wait and future_nzo.wait > time.time():
self.add(url, future_nzo)
time.sleep(1.0)
continue
# Paused
if future_nzo.status == Status.PAUSED:
@@ -171,7 +172,6 @@ class URLGrabber(Thread):
elif item == 'x-dnzb-password':
nzo_info['password'] = value
elif item == 'retry-after':
# For NZBFinder
wait = misc.int_conv(value)
# Rating fields

View File

@@ -6,6 +6,7 @@
## issue: https://bugs.python.org/issue19264
import os
import time
import ctypes
import subprocess
import _subprocess
@@ -15,6 +16,13 @@ from ctypes.wintypes import BYTE, WORD, LPWSTR, BOOL, DWORD, LPVOID, \
HANDLE
##
## Special counter because this function cannot
## be called within 1 second from each other!
##
_NEXT_PROCESS_START = 0.0
##
## Types
##
@@ -86,6 +94,16 @@ def CreateProcess(executable, args, _p_attr, _t_attr,
Python implementation of CreateProcess using CreateProcessW for Win32
"""
# Do we need to delay?
global _NEXT_PROCESS_START
diff_start = _NEXT_PROCESS_START - time.time()
if(diff_start > 0.0):
# Wait ourselves and make sure others also wait
_NEXT_PROCESS_START += 1.0
time.sleep(diff_start)
else:
_NEXT_PROCESS_START = time.time() + 1.0
si = STARTUPINFOW(
dwFlags=startup_info.dwFlags,
wShowWindow=startup_info.wShowWindow,

View File

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

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.

71
tests/conftest.py Normal file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/python -OO
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
tests.conftest - Wrappers to start SABnzbd for testing
"""
import os
import itertools
import urllib2
import pytest
import shutil
import time
import testhelper
from xprocess import ProcessStarter
@pytest.fixture(scope='session')
def sabnzbd_connect(request, xprocess):
# Get cache directory
base_path = os.path.dirname(os.path.abspath(__file__))
cache_dir = os.path.join(base_path, 'cache')
# Copy basic config file
try:
os.mkdir(cache_dir)
shutil.copyfile(os.path.join(base_path, 'sabnzbd.basic.ini'), os.path.join(cache_dir, 'sabnzbd.ini'))
except:
pass
class Starter(ProcessStarter):
# Wait for SABnzbd to start
pattern = "ENGINE Bus STARTED"
# Start without browser and with basic logging
args = 'python ../../SABnzbd.py -l1 -s %s:%s -b0 -f %s' % (testhelper.SAB_HOST, testhelper.SAB_PORT, cache_dir)
args = args.split()
# We have to wait a bit longer than default
def filter_lines(self, lines):
return itertools.islice(lines, 500)
# Shut it down at the end
def shutdown_sabnzbd():
# Gracefull shutdown request
testhelper.get_url_result('shutdown')
# Takes a second to shutdown
for x in range(5):
try:
shutil.rmtree(cache_dir)
break
except:
time.sleep(1)
request.addfinalizer(shutdown_sabnzbd)
return xprocess.ensure("sabnzbd", Starter)

20
tests/data/reftestnzb.nzb Normal file
View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE nzb PUBLIC "-//newzBin//DTD NZB 1.0//EN" "http://www.newzbin.com/DTD/nzb/nzb-1.0.dtd">
<nzb xmlns="http://www.newzbin.com/DTD/2003/nzb">
<file poster="nzbtester5@gmail.com" date="1495557432" subject="RefTestNZB: rar5 8288192_RAR5_FILE.rar ff2f7ca6 - &quot;8288192_RAR5_FILE.rar&quot; yEnc (1/11)">
<groups><group>alt.binaries.boneless</group></groups>
<segments>
<segment bytes="350593" number="1">YyZUA.55279$4Z1.8096@fx31.am4</segment>
<segment bytes="350823" number="2">ZyZUA.55280$4Z1.25561@fx31.am4</segment>
<segment bytes="350639" number="3">ZyZUA.55281$4Z1.11063@fx31.am4</segment>
<segment bytes="350732" number="4">_yZUA.55282$4Z1.16876@fx31.am4</segment>
<segment bytes="350700" number="5">_yZUA.55283$4Z1.13779@fx31.am4</segment>
<segment bytes="350608" number="6">%yZUA.55284$4Z1.46223@fx31.am4</segment>
<segment bytes="350828" number="7">0zZUA.55285$4Z1.6649@fx31.am4</segment>
<segment bytes="119105" number="11">2zZUA.55289$4Z1.25108@fx31.am4</segment>
<segment bytes="350796" number="8">0zZUA.55286$4Z1.37644@fx31.am4</segment>
<segment bytes="350756" number="9">1zZUA.55287$4Z1.2275@fx31.am4</segment>
<segment bytes="350656" number="10">2zZUA.55288$4Z1.18213@fx31.am4</segment>
</segments>
</file>
</nzb>

8
tests/requirements.txt Normal file
View File

@@ -0,0 +1,8 @@
# SAB-Specific
cheetah
cryptography
sabyenc
# Testing
pytest-xprocess
requests

11
tests/sabnzbd.basic.ini Normal file
View File

@@ -0,0 +1,11 @@
__version__ = 19
__encoding__ = utf-8
[misc]
api_key = apikey
[servers]
[[sabnzbd.test]]
enable = 1
host = sabnzd.test
username = sabnzbd
password = sabnzbd

61
tests/test_api_pages.py Normal file
View File

@@ -0,0 +1,61 @@
#!/usr/bin/python -OO
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
tests.test_api_pages - The most basic testing if things work
"""
import pytest
import testhelper
def test_basic_api(sabnzbd_connect):
# Basic API test
assert 'queue' in testhelper.get_api_result('queue')
assert 'history' in testhelper.get_api_result('history')
assert 'status' in testhelper.get_api_result('fullstatus')
assert 'config' in testhelper.get_api_result('get_config')
def test_main_pages(sabnzbd_connect):
# See if the basic pages work
assert 'Traceback' not in testhelper.get_url_result()
assert 'Traceback' not in testhelper.get_url_result('history')
assert 'Traceback' not in testhelper.get_url_result('queue')
assert 'Traceback' not in testhelper.get_url_result('status')
def test_wizard_pages(sabnzbd_connect):
# Test if wizard pages work
assert 'Traceback' not in testhelper.get_url_result('wizard')
assert 'Traceback' not in testhelper.get_url_result('wizard/one')
assert 'Traceback' not in testhelper.get_url_result('wizard/two')
def test_config_pages(sabnzbd_connect):
# Test if config pages work
assert 'Traceback' not in testhelper.get_url_result('config')
assert 'Traceback' not in testhelper.get_url_result('config/general')
assert 'Traceback' not in testhelper.get_url_result('config/server')
assert 'Traceback' not in testhelper.get_url_result('config/categories')
assert 'Traceback' not in testhelper.get_url_result('config/switches')
assert 'Traceback' not in testhelper.get_url_result('config/sorting')
assert 'Traceback' not in testhelper.get_url_result('config/notify')
assert 'Traceback' not in testhelper.get_url_result('config/scheduling')
assert 'Traceback' not in testhelper.get_url_result('config/rss')
assert 'Traceback' not in testhelper.get_url_result('config/special')

58
tests/test_nzb.py Normal file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/python -OO
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
tests.test_nzb - Basic NZB adding support
"""
import os
import pytest
import testhelper
# Where are we now?
base_path = os.path.dirname(os.path.abspath(__file__))
def nzo_in_queue(nzo_response):
""" Helper function for checking if file is in queue and then remove it """
queue_res = testhelper.get_api_result('queue')
nzo_id = nzo_response['nzo_ids'][0]
# Was it added?
assert nzo_response['status'] == True
assert queue_res['queue']['slots'][0]['nzo_id'] == nzo_response['nzo_ids'][0]
# Let's remove it
remove_response = testhelper.get_api_result('queue', {'name': 'delete', 'value': nzo_id})
assert nzo_response['status'] == True
# Really gone?
queue_res = testhelper.get_api_result('queue')
assert not queue_res['queue']['slots']
def test_addfile(sabnzbd_connect):
# See if basic upload works
nzo_response = testhelper.upload_nzb(os.path.join(base_path, 'data', 'reftestnzb.nzb'))
nzo_in_queue(nzo_response)
def test_addlocalfile(sabnzbd_connect):
# See if basic adding from disk-file works
nzo_response = testhelper.get_api_result('addlocalfile', {'name': os.path.join(base_path, 'data', 'reftestnzb.nzb')})
nzo_in_queue(nzo_response)

48
tests/testhelper.py Normal file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/python -OO
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
tests.testhelper - Basic helper functions
"""
import urllib2
import json
import requests
SAB_HOST = 'localhost'
SAB_PORT = 8081
def get_url_result(url=''):
""" Do basic request to web page """
arguments = {'session': 'apikey'}
return requests.get('http://%s:%s/%s/' % (SAB_HOST, SAB_PORT, url), params=arguments).text
def get_api_result(mode, extra_arguments={}):
""" Build JSON request to SABnzbd """
arguments = {'apikey': 'apikey', 'output': 'json', 'mode': mode}
arguments.update(extra_arguments)
r = requests.get('http://%s:%s/api' % (SAB_HOST, SAB_PORT), params=arguments)
return r.json()
def upload_nzb(file):
""" Upload file and return nzo_id reponse """
files = {'name': open(file, 'rb')}
arguments ={'apikey':'apikey', 'mode':'addfile', 'output': 'json'}
return requests.post('http://%s:%s/api' % (SAB_HOST, SAB_PORT), files=files, data=arguments).json()