Compare commits

...

231 Commits

Author SHA1 Message Date
Safihre
8fdb259270 Update text files for 3.3.0RC2
draft release
2021-05-20 08:04:06 +02:00
Safihre
98b0b46dda Only use active servers in stop_idle_jobs 2021-05-17 23:04:22 +02:00
Safihre
861fb9e3d5 Always update the number of servers
init_server(None, newid) would not trigger a recount
2021-05-17 23:04:22 +02:00
Safihre
644bcee14e Remove max_art_opt
Moved to Specials in 2.2.x and never heard anyone complain about it. So time to get rid of it.
2021-05-17 23:04:22 +02:00
Safihre
933d9e92d1 Re-work the Server's reset article queue 2021-05-17 23:04:22 +02:00
jcfp
9fb03a25f6 allow missing extension for unwanted check (#1896) 2021-05-16 21:02:06 +02:00
Safihre
0b1f7827fc Add additional unrar output when checking passworded files 2021-05-14 22:09:11 +02:00
Safihre
49f21e2c9d macOS Python set to 3.9.5 2021-05-14 22:02:13 +02:00
Safihre
990c0e07cf platform.platform() is not available on all platforms
Closes #1893
2021-05-14 09:08:53 +02:00
Safihre
745459e69f Update text files for 3.3.0RC1
draft release
2021-05-13 15:14:35 +02:00
Safihre
115a6cf5d7 Windows: Update Multipar to 1.3.1.7 2021-05-10 10:44:59 +02:00
Safihre
39aafbbc61 Windows/macOS: Update UnRar to 6.0.1 2021-05-10 10:44:47 +02:00
puzzledsab
93ddc9ce99 Add article queue and change article tries system (#1870)
* Add article queue and change article tries system

* Don't reuse queued articles with get_articles

* Add article_queue to server slots

* Generalize get_articles

* Set fetch_limit to be at least 1

* A little tweaking

* More micro optimization

* Small tweaks

* Remove misplaced reset_article_queue()

* Call reset_article_queue() from plan_server

Co-authored-by: Safihre <safihre@sabnzbd.org>
2021-05-07 22:18:50 +02:00
Safihre
3d877eed13 Call BPSmeter.init_server_stats for all servers at end of day 2021-05-07 16:51:47 +02:00
Safihre
308d612c05 Re-init server statistics when clearing 2021-05-07 15:45:17 +02:00
Safihre
9b75f0428d Only call single BPSMeter.update at midnight 2021-05-07 15:41:40 +02:00
Safihre
e6858659fb Prevent ZeroDivisionError's in BPSMeter 2021-05-07 14:06:27 +02:00
Safihre
815058ffcd Fix and extend on BPSMeter optimalizations 2021-05-07 13:40:08 +02:00
puzzledsab
915b540576 BPSMeter optimalizations (#1889)
* Remove stats initalization

* Use update(), remove sum_cached_amount

* Refactor can_be_slowed ifs

* Revert "Refactor can_be_slowed ifs"

This reverts commit 4c9e3e6645.
2021-05-07 13:02:01 +02:00
Safihre
5b06d6925c Sort Downloader.servers by priorty 2021-05-07 09:07:14 +02:00
Safihre
ef875fa720 Remove unused Downloader.server_dict 2021-05-07 08:46:13 +02:00
Safihre
994a7d044f Config restart-check faster because shutdown is now much faster 2021-05-07 08:32:45 +02:00
Safihre
80cd7f39b4 Show server in download-rapport even if it was disabled later on 2021-05-07 07:15:37 +02:00
Safihre
93bf45cde6 Simplify build_status by removing server connection details for Plush 2021-05-06 22:44:19 +02:00
Safihre
b4adc064a0 Remove subject nzf.subject property as it is unused
Since 3.0.0 we always fill the nzf.filename
2021-05-06 22:33:20 +02:00
Safihre
7e81d0bcbb Update text files for 3.3.0Beta4
draft release
2021-05-06 10:36:47 +02:00
SABnzbd Automation
33b59f091e Update translatable texts 2021-05-06 08:26:04 +00:00
Safihre
ea3dc1f2f4 Add validation of translations 2021-05-06 10:00:10 +02:00
SABnzbd Automation
5d3e68a6a5 Update translatable texts 2021-05-06 07:31:48 +00:00
Safihre
64f2ec3ffe Setting RSS rate would result in crash
Closes #1890
2021-05-06 09:30:55 +02:00
Safihre
c80014ec7d Use __slots__ on Downloader thread object 2021-05-03 22:57:00 +02:00
Safihre
6515720d55 Use __slots__ on Server object (#1887) 2021-05-03 16:34:12 +02:00
puzzledsab
605c5cbfd8 Check busy threads less often if nothing is wrong (#1884)
* Check busy threads less often if nothing is wrong

* Simplify variable usage

* Use local constant for server check delaying
2021-05-03 15:51:16 +02:00
puzzledsab
77e97d1a89 Check header before entering parse_par2_packet (#1885)
* Check header before entering parse_par2_packet

* Stop using offset variable
2021-05-03 13:35:11 +02:00
Safihre
f17d959770 Remove unused code to support Windows Vista 2021-05-02 13:06:45 +02:00
Safihre
22f1d2f642 Stop scanning the par2 file once we have the information of all files 2021-05-02 10:16:17 +02:00
jcfp
7d3907fa0e also test with (partially) exploded ipv4-mapped addresses (#1880) 2021-05-01 19:45:53 +02:00
Safihre
9588fe8d94 Simplify startup logging 2021-05-01 18:38:24 +02:00
Sander
3b3ffdb8d1 Show cpu architecture (#1879)
* show CPU architecture in logging.info

* show CPU architecture in logging.info ... make black happy

* show CPU architecture in logging.info ... comment

* show CPU architecture in logging.info ... comment

* show CPU architecture in logging.info ... comment

* show CPU architecture in logging.info ... oneliner
2021-05-01 17:16:09 +02:00
Safihre
cdd7e6931a Post-processing would crash if there is no files to unpack 2021-05-01 16:50:15 +02:00
puzzledsab
4c3df012a6 Don't slice data and stop reading par2 files when duplicate filename is found (#1878)
* Don't slice data

* Stop reading par2 files when duplicate filename is found
2021-05-01 16:10:40 +02:00
Safihre
b0eaf93331 Extend unit test for par2file to check logging of par2 creator 2021-05-01 12:24:11 +02:00
Safihre
55c03279ca Optimize par2 file parsing 2021-05-01 12:06:00 +02:00
Safihre
c4f0753f5a Add basic unit tests for par2file 2021-05-01 12:03:31 +02:00
puzzledsab
a9bd25873e Store status_code as attribute (#1877)
* Store status_code as attribute

* Do reading of code in try
2021-05-01 07:26:44 +02:00
jcfp
5ab6de8123 cut closer to the middle to avoid random test failures (#1874) 2021-04-30 10:45:51 +02:00
jcfp
75deb9d678 add --disable-file-log to systemd service (#1873) 2021-04-30 09:26:55 +02:00
Safihre
b5ce0e0766 Allow setting inet_exposure from command line
Closes #1872
2021-04-30 09:23:30 +02:00
Safihre
43817aef20 Update text files for 3.3.0Beta3
draft release
2021-04-29 11:01:12 +02:00
jcfp
81a7a58299 support prefix and netmask for local_ranges (#1871)
* support prefix and netmask for local_ranges

* housekeeping
2021-04-29 08:35:46 +02:00
puzzledsab
4ae1c21b6f Minor optimizations (#1869) 2021-04-28 12:15:10 +02:00
Safihre
8ffa3e5d4c Add unit tests for sanitize_files 2021-04-27 22:51:43 +02:00
Safihre
ac6ebe1f99 Only reset the NZF try_list when adding par2 files
We can rely on the article try list, or at least we should be able to..
2021-04-27 17:56:13 +02:00
Safihre
a5c07e7873 Reset fetcher and fetcher_priority when resetting article try_list
Closes #1863
2021-04-27 16:48:34 +02:00
SABnzbd Automation
94c4f6008d Update translatable texts 2021-04-27 10:16:05 +00:00
Safihre
615c296023 sanitize_files_in_folder would ignore the newfiles
Would result in deobfuscate not working.
This needs unittests!
Closes #1868
2021-04-27 12:09:46 +02:00
SABnzbd Automation
d227611ee8 Update translatable texts 2021-04-26 21:34:41 +00:00
Safihre
acf00c723f Remove all xmlns from NZB-file data
https://forums.sabnzbd.org/viewtopic.php?f=2&t=25342
2021-04-26 23:33:47 +02:00
Safihre
adb3913daa Only remove the failed server in NzbQueue.reset_try_lists
Closes #1866
2021-04-26 11:48:48 +02:00
Safihre
faf1a44944 Black formatting update 2021-04-26 10:52:11 +02:00
Safihre
9f5cb9ffff Read All Feeds was broken
Closes #1865
2021-04-26 10:14:20 +02:00
SABnzbd Automation
068c653a2a Update translatable texts 2021-04-25 09:03:10 +00:00
Safihre
b1c922bb75 Post-proc queue was not filtered by nzo_ids 2021-04-25 11:02:04 +02:00
Safihre
4879fbc6d4 CRC/yenc errors would be counted twice as bad articles 2021-04-24 21:53:23 +02:00
Safihre
e7dc81eb38 Update text files for 3.3.0Beta2
draft release
2021-04-23 17:24:50 +02:00
Safihre
c2fa08598e Update text files for 3.3.0Beta1
draft release
2021-04-23 12:09:17 +02:00
Safihre
d23ca4a38e Add tests for dual-stack notation in check_access 2021-04-23 11:44:54 +02:00
Safihre
078b608582 Set Python for macOS release to 3.9.4 2021-04-23 11:17:29 +02:00
Safihre
a64457973f Apply NzbQueueLocker to end_job to prevent multiple post-processing
Closes #1862, #1862
2021-04-22 22:46:15 +02:00
SABnzbd Automation
00ef13fe9f Update translatable texts 2021-04-22 19:36:51 +00:00
Safihre
b4a7f2fdf6 Get rind of dual-stack notation when checking local_ranges 2021-04-22 21:36:13 +02:00
Safihre
a482bb7acc Add unittests for secured_expose 2021-04-22 21:36:13 +02:00
Safihre
ce46eeac49 Change permissions-level for Config-related API-calls 2021-04-22 21:36:13 +02:00
Safihre
110dbf6cca Correct invalid checking of API sub-call permissions
Some calls that should have been "full API" only were available with "basic API".
2021-04-22 21:36:13 +02:00
Safihre
c93de2dd6f Correct set_config fixture in unittests 2021-04-22 21:36:13 +02:00
Safihre
be88f5152f Default to block non-LAN traffic for empty Local network ranges 2021-04-22 21:36:13 +02:00
puzzledsab
efda5bab4d Make num_decoders configurable through special variables (#1860) 2021-04-19 14:02:28 +02:00
jcfp
d491eb1af0 fix use of dir (#1855) 2021-04-16 16:25:20 +02:00
jcfp
e249dbfc67 try sys.executable, but keep "python" as fallback (#1856) 2021-04-16 16:25:00 +02:00
Safihre
c994ae5798 Log all requests, not just API calls
Closes #1857
2021-04-16 13:30:56 +02:00
Safihre
cba61bd8fb Highlight even more the warning about exposed hosts 2021-04-15 10:04:33 +02:00
Sander
a72440ee6b make results from Status -> Performace copy-pasteable (#1849) 2021-04-11 14:58:05 +02:00
Safihre
cd3ed40ff3 Just always show the history statistic 2021-04-05 13:58:09 +02:00
Safihre
cf3ce5e31d Show history statistics even if history is empty
Closes #1843
2021-04-05 10:47:02 +02:00
Sander
bdcbc5e011 Internetspeed improve code style (#1848)
* interspeed: better styling

* interspeed: better styling

* interspeed: better styling

* interspeed: better styling ... logging style

* interspeed: tackle Windows' time granularity

* internetspeed: more feedback on naming
2021-04-04 21:01:02 +02:00
SABnzbd Automation
c2d3ce348f Update translatable texts 2021-04-04 13:49:24 +00:00
Safihre
970d580e4b Ignore duplicate files inside messy NZB's 2021-04-04 15:48:21 +02:00
Safihre
d2f9721576 Changed leftover str.encode to general utob function 2021-04-01 07:38:03 +02:00
Safihre
8a39e5827b Foldernames should always be stripped from dots and spaces at the end 2021-04-01 07:28:08 +02:00
Safihre
89c8b6a0a5 Do not notify warning/errors from same source twice
Closes #1842
2021-03-30 17:29:39 +02:00
Safihre
238f0a6108 Do not discard data for CrcError's
https://forums.sabnzbd.org/viewtopic.php?f=11&t=25278
2021-03-30 16:05:34 +02:00
puzzledsab
19950569cb Show server expiration date in server summary (#1841) 2021-03-29 20:26:20 +02:00
Safihre
a19553dddd Revert some improvements to the encrypted RAR-detection
Closes #1840
2021-03-29 14:05:39 +02:00
SABnzbd Automation
c383a5b120 Update translatable texts 2021-03-29 05:24:15 +00:00
Safihre
dab7243ccd Show Article availability number of articles in a nicer format 2021-03-29 07:23:37 +02:00
Sander
ccf15ab4a3 Diskspace macOS large drives (#1838)
* disk_free_macos_clib_statfs64() to report correct available disk space on MacOS

* disk_free_macos_clib_statfs64() ... correct call

* feedback processed into better code, and improved comments

* MACOSLIBC into __init__. And some comments about gnu libc

* import ctypes.util

* log ctypes.get_errno() in case of problems

* more cleanup and clarifications based on feedback

* mention python bug report in comment

* ... to trigger the CI again

* ... typo
2021-03-27 20:48:23 +01:00
Safihre
25a3ef2b3e Another try to fix the Snapcraft builds 2021-03-27 18:53:10 +01:00
Safihre
9bdaae8d9f Try to fix the Snapcraft builds 2021-03-27 11:03:56 +01:00
SABnzbd Automation
4115651998 Update translatable texts 2021-03-27 09:15:52 +00:00
Safihre
58349082df Prompt before renaming item that is being directly unpacked
Closes #1825
2021-03-27 10:14:10 +01:00
Safihre
aa75828296 Add title for long Config Server names 2021-03-21 16:56:21 +01:00
Safihre
10eaf6e278 Improvements to the encrypted RAR-detection 2021-03-20 18:28:06 +01:00
Safihre
04e22571e9 Make get_all_passwords return only unique passwords
If the filename and the NZB specified the same one it could occur 2 or 3 times.
2021-03-20 17:53:01 +01:00
Safihre
bc8b9e7c8b Update URL for Python 3 information 2021-03-18 09:09:43 +01:00
Sander
b6213654ef deobfuscate: no globber, but use given filelist (#1830) 2021-03-16 19:47:21 +01:00
Safihre
9ba17d5338 Remove old compatibility code from BPSMeter that causes crash on startup
Closes #1827
2021-03-15 12:58:02 +01:00
Sander
dde453744d deobfuscate: rename accompanying (smaller) files with same basename, and no renaming of collections with same extension (#1826)
* deobfuscate: rename accompanying (smaller) files with same basename

* deobfuscate: do not rename collections of same extension

* deobfuscate: collection ... much easier with one loop, thanks safihre.

* deobfuscate: globber_full, and cleanup

* deobfuscate: unittest test_deobfuscate_big_file_small_accompanying_files

* deobfuscate: unittest test_deobfuscate_collection_with_same_extension

* deobfuscate: unittest test_deobfuscate_collection_with_same_extension
2021-03-14 21:31:30 +01:00
Safihre
a86273f213 More space for the RSS table
Closes #1824
2021-03-14 12:05:17 +01:00
Safihre
2b312dfa6f Update documentation links to 3.3.x 2021-03-14 11:10:20 +01:00
Safihre
800c7182c1 Add simple unit test for test_validate_single_tag 2021-03-10 22:10:32 +01:00
Safihre
cbbd5faf24 Single indexer categories would be saved with "," between each letter 2021-03-10 20:01:57 +01:00
puzzledsab
bb9c8f04e2 Use binary mode to make write test more accurate on Windows (#1815) 2021-03-10 19:52:48 +01:00
puzzledsab
50469903dc Reduce the number of full BPSMeter.update calls by caching the amounts (#1801)
* Don't do a full calculation for every call to BPSMeter.update()

* Log current bps in MB/s

* Use to_units

* Add an bps update after disconnect or shutdown

* Switch to force_full_update being default

* Force update if bandwidth limit is set

* Fixed the real problem

Co-authored-by: Safihre <safihre@sabnzbd.org>
2021-03-10 19:51:57 +01:00
jcfp
b8f6cf11d6 fix config auto_sort setting, broken by #1666 (#1813)
* fix config auto_sort setting, broken by #1666

* oops I did it again
2021-03-07 18:37:02 +01:00
jcfp
f0d4f76e0f remove unused import of same_file (#1812) 2021-03-07 15:17:16 +01:00
SABnzbd Automation
05f0a12d16 Update translatable texts 2021-03-07 08:19:47 +00:00
Safihre
a1cad730ad Show name of item to be deleted from queue/history in confirm dialog 2021-03-07 09:18:57 +01:00
SABnzbd Automation
3e8c738496 Update translatable texts 2021-03-01 19:17:48 +00:00
Safihre
940dd3e3c0 Add traceback when failing to read the password file
Closes #1810
2021-03-01 20:16:54 +01:00
SABnzbd Automation
6de4e1a401 Update translatable texts 2021-02-28 10:43:23 +00:00
Sander
0a8747f600 pre-create subdir if needed (POSIX, par2) (#1802)
* pre-create subdir it needed

* pre-create subdir it needed: check if already exists

* use os.makedirs() to handle subdir1/subdir2/blabla

* protect against malicous "..", and better naming

* check for Windows \ and POSIX /

* check again within path, typo and formatting

* regex: square brackets

* cleanup: only "/" can occur in par2

* cleanup: better logging

* unit test: testing of filesystem.renamer()

* if subdir specified in par2: let filesystem.renamer() do all the work

* if create_local_directories=True, then renamer() must stay within specified directory. Plus unittest for that.

* if create_local_directories=True, then renamer() must stay within specified directory. Plus unittest for that.

* more comments in code

* use filesystem.create_all_dirs(), less logging, clearer "..", and other feedback from Safihre

* make remote black happy too

* Small changes in wording of comments and error

Co-authored-by: Safihre <safihre@sabnzbd.org>
2021-02-28 11:42:49 +01:00
thezoggy
68a5e7c8f7 3.2.x cleanup (#1808)
* Update uni_config bootstrap css to same version of js (3.3.7).
* small accessibility change, removed thin dot border on focus

* Ignore VS Code settings folder

* cherry picked 'Fix disabled select for Glitter Night'

* glitter night - fix search border color
2021-02-27 14:48:00 +01:00
Safihre
c3d4bf5428 Fix disabled select for Glitter Night
Closes #1807
2021-02-27 09:45:56 +01:00
Safihre
0cac0bc761 Run black with --diff to show what is wrong
Closes #1803
2021-02-26 16:46:39 +01:00
Safihre
05427b7b3b Always run rar_renamer if no rar-files are present 2021-02-26 16:42:13 +01:00
Safihre
9e73f9b5e0 Update macOS build Python to 3.9.2 2021-02-26 09:44:24 +01:00
SABnzbd Automation
5ec41bafbe Update translatable texts 2021-02-23 09:09:41 +00:00
jxyzn
cb67cc8c3d Sanitize names possibly derived from X-DNZB-EpisodeName (#1806) 2021-02-23 10:08:53 +01:00
Safihre
d35619805f Log all nzo_info when adding NZB's
Relates to #1806
2021-02-23 10:08:23 +01:00
SABnzbd Automation
cb26758d53 Update translatable texts 2021-02-18 19:58:44 +00:00
Sander
9783674890 handle gracefully if no malloc_trim() available (#1800) 2021-02-18 20:58:06 +01:00
SABnzbd Automation
270eeda3e2 Update translatable texts 2021-02-14 16:06:00 +00:00
jcfp
24d3d064bb add unwanted extensions whitelist mode (#1798)
* add unwanted extensions whitelist mode

* only call get_ext once

* remove unneeded .lower()
2021-02-14 17:05:26 +01:00
Sander
e8eec80696 Long hex name obfuscated (#1796)
* "0675e29e9abfd2.f7d069dab0b853283cc1b069a25f82.6547" is obfuscated

* "0675e29e9abfd2.f7d069dab0b853283cc1b069a25f82.6547" is obfuscated
2021-02-11 15:01:24 +01:00
jcfp
c366504868 add resolution pattern key to sorting (#1794) 2021-02-10 14:12:06 +01:00
SABnzbd Automation
c7b54856c5 Update translatable texts 2021-02-09 05:37:40 +00:00
puzzledsab
10c56e08d4 Remove some redundant ifs (#1791) 2021-02-09 06:36:59 +01:00
SABnzbd Automation
4af51b4a76 Update translatable texts 2021-02-08 12:24:13 +00:00
Safihre
65cc03da14 Small refactor of pre-queue code 2021-02-06 17:28:23 +01:00
SABnzbd Automation
e908cb0df5 Update translatable texts 2021-02-06 14:32:26 +00:00
puzzledsab
ae2cee3fda Right-to-Left support for Glitter and Config (#1776)
* Add rtl on main page

* Adjustments to rtl

* Forgot to add black check for this checkout

* Remove unnecessary style

* Remove more redundant attributes

* Some more reordering and alignment

* Align sorting and nzb drop downs

* Update NZB details and shutdown page

* Fix format

* Fix SABnzbd Config title tag

* Change file list header direction

* Set rtl variables in build_header instead and test dir="rtl" in config pages

* Revert some changes and handle styling using CSS

* Move more items to CSS

* Config RTL

* Move even more to CSS

* Small tweak

Co-authored-by: Safihre <safihre@sabnzbd.org>
2021-02-06 15:31:51 +01:00
SABnzbd Automation
0467ed7ffc Update translatable texts 2021-02-06 14:11:17 +00:00
puzzledsab
d5453b4aa4 Do full server check when there are busy_threads (#1786)
* Do full server check when there are busy_threads

* Reduce next_article_search delay to 0.5s
2021-02-06 15:10:44 +01:00
jcfp
7096a785db fix bonjour with localhost, retire LOCALHOSTS constant (#1782)
* fix bonjour with localhost, retire LOCALHOSTS constant

* rename probablyipv[46] functions to is_ipv[46]_addr

* refuse to send ssdp description_xml to outsiders
2021-02-05 18:48:14 +01:00
Safihre
c80db13c28 Rename Glitter Default to Light and make Auto the new Default 2021-02-05 14:20:14 +01:00
SABnzbd Automation
b971045cd2 Update translatable texts 2021-02-05 05:33:44 +00:00
Sam Edwards
61d4ccbf1b Support for auto night mode switching in Glitter (#1783) 2021-02-05 06:32:59 +01:00
SABnzbd Automation
c3b237466c Update translatable texts 2021-02-02 21:59:00 +00:00
jcfp
29c727319d Test adding nzbs (#1760)
* add tests for adding nzbs

* restore clean_cache_dir fixture, unbreak utils tests

* include tests for partial and malformed nzbs

* test handling of prio from nzb metadata category

* update params of test_adding_nzbs_malformed

* add metadata to sabnews nzb creator

* also test with size_limit

* test prio with dupe detection

* remove leftover todo entry

* move pause and cleanup to fixture; rename functions
2021-02-02 22:58:20 +01:00
Safihre
52c5dc589d Do not re-release from GA when the release tag is pushed 2021-02-01 17:04:39 +01:00
SABnzbd Automation
35cad9bf22 Update translatable texts 2021-02-01 15:19:54 +00:00
Safihre
b108876017 Set macOS Python installer target to "/" 2021-02-01 16:13:37 +01:00
Safihre
52bfff953a Set text files to 3.3.0-develop 2021-02-01 16:12:42 +01:00
Safihre
65278c4489 Update text files for 3.2.0RC1
draft release
2021-02-01 15:57:24 +01:00
Safihre
3a4a925ab0 Restore "--console" command line switch
Closes #1775
2021-02-01 13:57:41 +01:00
Safihre
6ef5d41c25 Python cache failed because build script reset work directory
So we store the download outside the work directory
2021-02-01 09:54:45 +01:00
Safihre
b9b9f46fbe Disable macOS Python download cache
I am not sure why this doesn't work..
2021-01-31 22:40:12 +01:00
Safihre
8d014e579d The installer-command removes the pkg file, breaking macOS GA cache 2021-01-31 22:31:59 +01:00
SABnzbd Automation
f2fc9f10f9 Update translatable texts 2021-01-31 20:01:25 +00:00
Safihre
f131155fd8 Update badges to GitHub Actions 2021-01-31 21:00:16 +01:00
Safihre
691e24a1d8 Build macOS 10.9+ compatible binary 2021-01-30 22:32:59 +01:00
jcfp
794a6f4454 fix another script validation issue (#1774)
* fix another script validation issue

* add test for changing script to str None

* cleanup change_script tests
2021-01-30 14:25:53 +01:00
Safihre
41bf8525cf Server disconnect was never triggered 2021-01-29 19:29:10 +01:00
SABnzbd Automation
6ebf486c09 Update translatable texts 2021-01-29 10:10:07 +00:00
Safihre
899ae94fcf Trigger malloc_trim when the queue is empty
See #1736
2021-01-29 11:09:14 +01:00
Safihre
d3cd5019d9 Small code change 2021-01-27 21:26:28 +01:00
SABnzbd Automation
1e4719558f Update translatable texts 2021-01-27 20:13:04 +00:00
Safihre
29ab83b9c0 Prospective par2 to add blocks from all sets in a job
Obfuscation is just too much nowadays.
2021-01-27 17:21:54 +01:00
puzzledsab
4b4d170ce1 Stop importing nzbs after shutdown request 2021-01-27 13:45:25 +01:00
SABnzbd Automation
8b0a12e0ba Update translatable texts 2021-01-27 11:29:35 +00:00
Safihre
430318ead7 Force installer to only run on Windows 8 and above
Closes #1770
2021-01-27 12:28:35 +01:00
Safihre
32f6ec63f2 Add NSIS-file to automated pot-file updates 2021-01-27 12:26:55 +01:00
Safihre
a3181c8f76 Check for Windows 8 or above in the installer 2021-01-27 12:23:24 +01:00
Safihre
412d169f58 Rename of the 32bit legacy release
"/" not supported by GA
2021-01-27 11:36:38 +01:00
Safihre
d1c2e6e0dd Build the 32bit Windows release on Python 3.8 to support Windows 7 2021-01-27 11:30:08 +01:00
Safihre
4f9ac56de0 Rename GITHUB_TOKEN to AUTOMATION_GITHUB_TOKEN 2021-01-27 11:26:14 +01:00
jcfp
9641dc82f9 fix cfg script validation on startup 2021-01-27 10:03:24 +01:00
Safihre
e68413b73c Filename parser should always output a filename with at least 1 char
Closes #1768
2021-01-26 22:52:07 +01:00
Safihre
a7386a25bd Update text files for 3.2.0Beta2
draft release
2021-01-26 20:45:50 +01:00
SABnzbd Automation
53f512e864 Update translatable texts 2021-01-26 19:17:46 +00:00
Safihre
283e643606 Always log the exact IP-address we are connecting to
Closes #1764
2021-01-26 20:16:51 +01:00
Safihre
fc1aa2db83 Mark test_download_unicode_made_on_windows as xfail on all platforms 2021-01-25 09:27:30 +01:00
SABnzbd Automation
0fc1e02519 Update translatable texts 2021-01-25 06:37:21 +00:00
jcfp
67581bf3f6 Validate input value for scripts (#1765)
* verify input values for scripts

* update and parametrise test_api_queue_change_job_script

* fortify cfg with script validation, fix test

* add typing to is_valid_script function :)

* move list_scripts function to filesystem

* also move windows-specific pathext stuff
2021-01-25 07:36:41 +01:00
Safihre
b7e4ca4d87 Correct server-tests after Downloader changes 2021-01-24 11:23:52 +01:00
Safihre
0594fc60c0 Rework shutdown and NewsWrapper handling in Downloader 2021-01-24 11:13:12 +01:00
Safihre
5a6c51219c Only parse interface settings when they are set 2021-01-24 10:39:32 +01:00
SABnzbd Automation
815542bf25 Update translatable texts 2021-01-24 08:57:26 +00:00
Safihre
0c5bd817a9 Small refactor of NNTP connection 2021-01-24 09:56:48 +01:00
Safihre
9b8a317351 Upgrade notice about totals10.sab
Closes #1744
2021-01-23 21:34:23 +01:00
SABnzbd Automation
7a9d8e021a Update translatable texts 2021-01-23 20:27:52 +00:00
puzzledsab
297ec1b8a1 Warn when a server has downloaded a certain amount of bytes or a given date is reached (#1762)
* First working version

* Remove pprint

* Black

* Use date type and move to 5 minute polling

* Give hints about intended usage in explain text

* Use scheduled tasks and some smaller changes

* Black

* Remove hidden fields from form

* Cleanup

* This is not the easiest part to get right

* Black hook take 3

* Rework the server check tasks

* Show quota left for server

* Move Server description

Co-authored-by: Safihre <safihre@sabnzbd.org>

Closes #1455
2021-01-23 21:27:17 +01:00
Safihre
f04f6684e0 Correct refactor of database.py
Sending invalid nzo_id's resulted in crashes.
https://forums.sabnzbd.org/viewtopic.php?f=11&t=25163
2021-01-23 16:18:26 +01:00
SABnzbd Automation
91870c6712 Update translatable texts 2021-01-22 13:57:11 +00:00
jcfp
9c48fcf5f8 correct msg for rar renamer (#1763) 2021-01-22 14:54:31 +01:00
Safihre
ee41cfc618 Correct Windows Service restart
Broke it in the previous commit.
2021-01-21 20:58:00 +01:00
Safihre
ae30f89a2d Use basic restart for Windows binaries
Python 3.9 changed the output of Py_GetArgcArgv on Windows, causing the restart of the binaries to fail.
2021-01-21 20:55:31 +01:00
Safihre
dfcce3a974 Sometimes Multipar says failed, but we can try again with extra blocks
https://forums.sabnzbd.org/viewtopic.php?f=2&t=25155
2021-01-21 20:35:31 +01:00
Safihre
59423df0cb Program shutdown could be too fast to complete the last response 2021-01-21 20:26:40 +01:00
Safihre
ee08c486bc Allow newer cheroot-versions 2021-01-21 20:15:01 +01:00
puzzledsab
a56c522068 Save all interface values if useGlobalOptions is true (#1761)
* Save all interface values if useGlobalOptions is true

* Try to fix the tests

* New test test

* Another test test

* Remove default value for interface_settings
2021-01-21 19:31:33 +01:00
Sander
6d40eba496 Filename limit in sanitize_filename() to avoid traceback (#1721)
* urlgrabber limit filename to avoid tracebacks

* urlgrabber limit filename to avoid tracebacks: black

* urlgrabber limit filename to avoid tracebacks: black

* filename_limit ... 2020-01-15

* filename_limit: into sanitize_filename()

* filename_limit: black and typo and logging

* filename_limit: debug show full filename

* filename_limit: unittests

* sanitize_filename(): take care of feedback: one ASCII method, handly silly extension lengths

* sanitize_filename(): tests/test_filesystem.py ... make black happy

* sanitize_filename(): typo in comment

* sanitize_filename(): test_filesystem.py ... black

* sanitize_filename(): more unittests, and DEF_FILE_MAX (yet without GUI option)

* sanitize_filename(): always use DEF_FILE_MAX

* sanitize_filename(): black

* sanitize_filename(): handle UTF8 correct (>1 byte). DEF_FILE_MAX = 255

* sanitize_filename: measure bytes (not chars), DEF_FILE_MAX = 255 - 6, no test-writing in unittests

* sanitize_filename: constants.py ... black

* sanitize_filename: comment about extension

* DEF_FILE_MAX = 255 - 10 again, to solve adding ".nzb.gz" elsewhere
2021-01-19 22:03:13 +01:00
Safihre
c772df9d65 Add sleep to gc_stats test to stabilize the overal tests 2021-01-19 09:03:03 +01:00
Sander Jonkers
2a73f26f2a is_probably_obfuscated(): count underscores as spacedots 2021-01-18 20:47:02 +01:00
Safihre
a750ade5a4 Server statistics reset on restart if start_paused is enabled
Closes #1753
Oops.
2021-01-18 13:44:55 +01:00
Safihre
06b37c02f1 Use with-statement for the DOWNLOADER_CV 2021-01-18 13:11:53 +01:00
Safihre
d129607d5c Fix exit_sab for macOS binary 2021-01-17 20:51:33 +01:00
Safihre
e6d812bbd8 Set default Bandwith percentage to 100
Oops, should have done a long time ago. Otherwise by default it will exceed 100%.
2021-01-17 20:49:19 +01:00
Safihre
9cc921098e Allow longer time for test after queue-repair 2021-01-17 13:11:50 +01:00
Safihre
38213c1a91 Use Condition based system for the DirScanner 2021-01-17 12:56:52 +01:00
Safihre
44d74924e6 Rework program shutdown and restart to always use the same path 2021-01-17 12:42:34 +01:00
Safihre
5eaf0c12d3 Use Condition based system for program shutdown
Prevent delays when shutting down because the main loop isn't ready.
2021-01-17 12:21:07 +01:00
Sander Jonkers
7c2b433f7b happyeyeballs.py: by default, do NOT prefer IPv6 anymore 2021-01-17 11:56:46 +01:00
Safihre
30e692cefe Handle shutdown of SSDP using Condition's so it doesn't block
Closes #1750
2021-01-17 07:26:57 +01:00
Safihre
396fb42b11 Additional refactoring of socket-handling in Downloader 2021-01-16 19:42:54 +01:00
Safihre
c8d882712e Remove write_fds
Sockets are connected in blocking mode, so there's no need to wait for them to be writeable. Only after the connect we switch to non-blocking mode.
2021-01-16 19:42:54 +01:00
Safihre
9667aad1cb Rework the handling of socket fileno's 2021-01-16 19:42:54 +01:00
Safihre
4471303aae Simplify delay if no articles were found for a server 2021-01-16 19:42:54 +01:00
Safihre
fe2ec8cc94 Downloader shutdown same as the other threads 2021-01-15 22:07:02 +01:00
SABnzbd Automation
25440c6fec Update translatable texts 2021-01-15 06:17:01 +00:00
puzzledsab
8c2d7243cc can_be_slowed with some modifications (#1748) 2021-01-15 07:16:13 +01:00
Safihre
49e67a0bef Change calls to parent class to super() 2021-01-12 09:11:46 +01:00
SABnzbd Automation
1dfa937bff Update translatable texts 2021-01-09 20:46:43 +00:00
Safihre
a3c6bbc1b5 Resolve typing problems 2021-01-09 21:46:01 +01:00
Safihre
241e8b6842 Refactor and typing of download functions 2021-01-09 10:05:55 +01:00
SABnzbd Automation
8660faaeb7 Update translatable texts 2021-01-06 13:05:04 +00:00
Safihre
687deab6bc Trigger garbage collection every 5 minutes
Relates to #1736
2021-01-06 14:04:22 +01:00
Safihre
17ec3cbf4b Always lowercase category name
Closes #1738
2021-01-04 09:12:23 +01:00
Safihre
f75609c98c Trigger garbage collection at the end of the queue
Relates to #1736
2021-01-04 09:12:23 +01:00
Safihre
5bd65cc06a Remove close-button on update message
Closes #1740
2021-01-04 07:37:17 +01:00
Safihre
e2177577be Additional release notes 2021-01-04 07:36:11 +01:00
188 changed files with 7297 additions and 4146 deletions

View File

@@ -19,3 +19,4 @@ jobs:
--line-length=120
--target-version=py36
--check
--diff

View File

@@ -6,6 +6,8 @@ jobs:
build_windows:
name: Build Windows binary
runs-on: windows-latest
env:
AUTOMATION_GITHUB_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.9 (64bit)
@@ -38,28 +40,27 @@ jobs:
with:
path: "*-win-setup.exe"
name: Windows installer
- name: Set up Python 3.9 (32bit)
- name: Set up Python 3.8 (32bit and legacy)
uses: actions/setup-python@v2
with:
python-version: 3.9
python-version: 3.8
architecture: x86
- name: Install Python dependencies (32bit)
- name: Install Python dependencies (32bit and legacy)
run: |
python --version
pip install --upgrade pip wheel
pip install --upgrade -r requirements.txt
pip install --upgrade -r builder/requirements.txt
- name: Build Windows standalone binary (32bit)
- name: Build Windows standalone binary (32bit and legacy)
run: python builder/package.py binary
- name: Upload Windows standalone binary (32bit)
- name: Upload Windows standalone binary (32bit and legacy)
uses: actions/upload-artifact@v2
with:
path: "*-win32-bin.zip"
name: Windows Windows standalone binary (32bit)
name: Windows Windows standalone binary (32bit and legacy)
- name: Prepare official release
if: env.AUTOMATION_GITHUB_TOKEN && !startsWith(github.ref, 'refs/tags/')
run: python builder/package.py release
env:
GITHUB_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
build_macos:
name: Build macOS binary
@@ -68,18 +69,31 @@ jobs:
SIGNING_AUTH: ${{ secrets.SIGNING_AUTH }}
NOTARIZATION_USER: ${{ secrets.NOTARIZATION_USER }}
NOTARIZATION_PASS: ${{ secrets.NOTARIZATION_PASS }}
AUTOMATION_GITHUB_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
# We need the official Python, because the GA ones only support newer macOS versions
# The deployment target is picked up by the Python build tools automatically
# If updated, make sure to also set LSMinimumSystemVersion in SABnzbd.spec
PYTHON_VERSION: 3.9.5
MACOSX_DEPLOYMENT_TARGET: 10.9
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.9
uses: actions/setup-python@v2
- name: Cache Python download
id: cache-python-download
uses: actions/cache@v2
with:
python-version: 3.9
path: ~/python.pkg
key: macOS-Python-${{ env.PYTHON_VERSION }}
- name: Get Python
if: steps.cache-python-download.outputs.cache-hit != 'true'
run: curl https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macosx10.9.pkg -o ~/python.pkg
- name: Install Python
run: sudo installer -pkg ~/python.pkg -target /
- name: Install Python dependencies
run: |
python --version
pip install --upgrade pip wheel
pip install --upgrade -r requirements.txt
pip install --upgrade -r builder/requirements.txt
python3 --version
pip3 install --upgrade pip wheel
pip3 install --upgrade -r requirements.txt
pip3 install --upgrade -r builder/requirements.txt
- name: Import macOS codesign certificates
uses: apple-actions/import-codesign-certs@v1
if: env.SIGNING_AUTH
@@ -88,15 +102,13 @@ jobs:
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: Build macOS binary
run: |
python builder/package.py app
python builder/make_dmg.py
python3 builder/package.py app
python3 builder/make_dmg.py
- name: Upload macOS binary
uses: actions/upload-artifact@v2
with:
path: "*-osx.dmg"
name: macOS binary (not notarized)
- name: Prepare official release
run: python builder/package.py release
env:
GITHUB_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
if: env.AUTOMATION_GITHUB_TOKEN && !startsWith(github.ref, 'refs/tags/')
run: python3 builder/package.py release

View File

@@ -24,6 +24,9 @@ jobs:
tx pull --all --force --parallel
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
- name: Compile translations to validate them
run: |
python3 tools/make_mo.py
- name: Push translatable and translated texts back to repo
uses: stefanzweifel/git-auto-commit-action@v4.5.1
with:

3
.gitignore vendored
View File

@@ -31,6 +31,9 @@ SABnzbd-*/
*.wp[ru]
.idea
# VScode
.vscode/
# Testing folders
.cache
.xprocess

View File

@@ -1,4 +1,4 @@
SABnzbd 3.2.0
SABnzbd 3.3.0
-------------------------------------------------------------------------------
0) LICENSE

View File

@@ -14,13 +14,13 @@
For these the server blocking method is not very favourable.
There is an INI-only option that will limit blocks to 1 minute.
no_penalties = 1
See: https://sabnzbd.org/wiki/configuration/3.2/special
See: https://sabnzbd.org/wiki/configuration/3.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/3.2/special
See: https://sabnzbd.org/wiki/configuration/3.3/special
- On macOS you may encounter downloaded files with foreign characters.
The par2 repair may fail when the files were created on a Windows system.

View File

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

View File

@@ -1,11 +1,11 @@
SABnzbd - The automated Usenet download tool
============================================
[![Travis CI](https://travis-ci.org/sabnzbd/sabnzbd.svg?branch=develop)](https://travis-ci.org/sabnzbd/sabnzbd)
[![AppVeryor](https://ci.appveyor.com/api/projects/status/github/sabnzbd/sabnzbd?svg=true&branch=develop)](https://ci.appveyor.com/project/Safihre/sabnzbd)
[![Snap Status](https://build.snapcraft.io/badge/sabnzbd/sabnzbd.svg)](https://snapcraft.io/sabnzbd)
![CI tests](https://github.com/sabnzbd/sabnzbd/workflows/CI%20Tests/badge.svg)
![Build binaries](https://github.com/sabnzbd/sabnzbd/workflows/Build%20binaries%20and%20source%20distribution/badge.svg)
[![License](https://img.shields.io/badge/license-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
SABnzbd is an Open Source Binary Newsreader written in Python.
It's totally free, easy to use, and works practically everywhere.

View File

@@ -1,44 +1,50 @@
Release Notes - SABnzbd 3.2.0 Beta 1
Release Notes - SABnzbd 3.3.0 Release Candidate 2
=========================================================
## Changes since 3.1.1
- Python 3.6 is now the minimum required version.
- macOS release is currently restricted to macOS 10.14 (Mojave) and above
due to changes in our build plaform. We are trying to resolve this.
- Post-processing can be aborted at any stage, including scripts.
- Improvements in the downloader to recude CPU-load.
- Custom date ranges for server graphs can be selected.
- Keep track of article fetching success-rate of each server.
- Added `Minimum Free Space for Completed Download Folder` option.
- Added option to `Auto resume` for both `Minimum Free Space` settings.
- Using SSDP, SABnzbd instances are now listed in `Network` on Windows.
- Improvements to parsing of job name and filenames listed in the NZB.
- RSS titles can be edited.
- Show commit hash when running from git sources.
- Removed Glitter fade-on-delete.
- Notify through Notifications if new version is available.
- Added `10 GB` test download.
- API-calls `queue` and `history` can now be filterd by `nzo_id`.
- Windows: `Temporary Download` job folders no longer have a maximum length.
- Windws/macOS: Update UnRar to 6.0.0 and MultiPar to 1.3.1.3.
## Changes and bugfixes since 3.3.0 Release Candidate 1
- Failure to start on some platforms.
- Stability improvement to encrypted RAR-detection.
- Allow missing extensions in `Unwanted extensions` detection.
- Removed Special setting `max_art_opt`.
- Prevent jobs getting stuck at 99% due to unreliable servers.
## Bugfixes since 3.1.1
- Memory could leak after jobs were removed from the queue.
- The active browser URL is used during the wizard.
- Repairing or Retrying jobs could result in a crash.
- API-call `reset_quota` returned nothing.
- Broken downloads could result in crash during RAR-renaming
- Improved obfuscation detection for `Deobfuscate final filenames`.
- Keep original priority of duplicate jobs.
- Increase Maximum number of connections per server to `1000`.
- Update encryption check to handle partially assembled files.
- Don't activate Windows notifications when running as service.
- Prevent repetition of unwanted extension warnings.
- Correct notification category for failed URL fetches.
- Improvements to the `Add NZB` modal window.
- Sort script drop-down list alphabetically.
- Direct Unpack stability fixes.
- macOS: tray text was misaligned on macOS 11 (Big Sur).
## Changes since 3.2.1
- The `External internet access` will automatically detect local network
and no longer requires local network ranges to be defined. Custom ranges
can still be defined through `local_ranges` in Special settings.
- Allow setting `inet_exposure` from the command line.
- Support prefix and netmask for Special setting `local_ranges`.
- The `Unwanted extensions` detection can be set to `Whitelist`-mode.
This will block or pause all jobs with non-matching extensions.
- Servers article statistics are shown in K, G, M-notation.
- Resolution added as a pattern key (`%r`) for Sorting.
- Optimized performance of par2 file parsing.
- CPU usage optimizations in the download process.
- Revised handling of categories, scripts, and priorities when adding NZB's.
- Download statistics are also shown when no History is shown.
- Confirm rename if Direct Unpack is active for the job.
- Obfuscated-RAR detection will always be performed.
- All requests will be logged, not just API calls.
- Windows/macOS: Update UnRar to 6.0.1.
- Windows: Update Multipar to 1.3.1.7 (adds faster verification).
## Bugfixes since 3.2.1
- Prevent failed post-processing if job name ends in multiple dots or spaces.
- Failing articles could result in jobs being stuck at 99%.
- Jobs could be stuck in the queue or duplicate if they had missing articles.
- CRC/yEnc errors would be counted twice as bad articles.
- Some NZB files would incorrectly be marked as empty.
- API-call `history` would not filter active post-processing by `nzo_ids`.
- Login page could be accessed even if `External internet access` was set
to `No access`. Any other calls would still be blocked.
- Ignore duplicate files inside messy NZB's.
- Windows: `Deobfuscate final filenames` could fail to deobfuscate.
- macOS: Disk space would be incorrect for very large disks.
## Upgrade notices
- The download statistics file `totals10.sab` is updated in 3.2.x
version. If you downgrade to 3.1.x or lower, detailed download
statistics will be lost.
## Known problems and solutions
- Read the file "ISSUES.txt"

View File

@@ -19,7 +19,7 @@ import sys
if sys.hexversion < 0x03060000:
print("Sorry, requires Python 3.6 or above")
print("You can read more at: https://sabnzbd.org/python3")
print("You can read more at: https://sabnzbd.org/wiki/installation/install-off-modules")
sys.exit(1)
import logging
@@ -34,6 +34,7 @@ import subprocess
import ssl
import time
import re
import gc
from typing import List, Dict, Any
try:
@@ -47,7 +48,7 @@ try:
except ImportError as e:
print("Not all required Python modules are available, please check requirements.txt")
print("Missing module:", e.name)
print("You can read more at: https://sabnzbd.org/python3")
print("You can read more at: https://sabnzbd.org/wiki/installation/install-off-modules")
print("If you still experience problems, remove all .pyc files in this folder and subfolders")
sys.exit(1)
@@ -61,13 +62,13 @@ from sabnzbd.misc import (
exit_sab,
split_host,
create_https_certificates,
windows_variant,
ip_extract,
set_serv_parms,
get_serv_parms,
get_from_url,
upload_file_to_sabnzbd,
probablyipv4,
is_localhost,
is_lan_addr,
)
from sabnzbd.filesystem import get_ext, real_path, long_path, globber_full, remove_file
from sabnzbd.panic import panic_tmpl, panic_port, panic_host, panic, launch_a_browser
@@ -77,6 +78,7 @@ import sabnzbd.downloader
import sabnzbd.notifier as notifier
import sabnzbd.zconfig
from sabnzbd.getipaddress import localipv4, publicipv4, ipv6
from sabnzbd.utils.getperformance import getpystone, getcpu
import sabnzbd.utils.ssdp as ssdp
try:
@@ -87,9 +89,13 @@ try:
import win32service
import win32ts
import pywintypes
import servicemanager
from win32com.shell import shell, shellcon
from sabnzbd.utils.apireg import get_connection_info, set_connection_info, del_connection_info
import sabnzbd.sabtray
win32api.SetConsoleCtrlHandler(sabnzbd.sig_handler, True)
from sabnzbd.utils.apireg import get_connection_info, set_connection_info, del_connection_info
except ImportError:
if sabnzbd.WIN32:
print("Sorry, requires Python module PyWin32.")
@@ -100,13 +106,13 @@ LOG_FLAG = False
def guard_loglevel():
""" Callback function for guarding loglevel """
"""Callback function for guarding loglevel"""
global LOG_FLAG
LOG_FLAG = True
def warning_helpful(*args, **kwargs):
""" Wrapper to ignore helpfull warnings if desired """
"""Wrapper to ignore helpfull warnings if desired"""
if sabnzbd.cfg.helpfull_warnings():
return logging.warning(*args, **kwargs)
return logging.info(*args, **kwargs)
@@ -121,29 +127,42 @@ class GUIHandler(logging.Handler):
"""
def __init__(self, size):
""" Initializes the handler """
"""Initializes the handler"""
logging.Handler.__init__(self)
self._size: int = size
self.store: List[Dict[str, Any]] = []
def emit(self, record: logging.LogRecord):
""" Emit a record by adding it to our private queue """
"""Emit a record by adding it to our private queue"""
# If % is part of the msg, this could fail
try:
parsed_msg = record.msg % record.args
except TypeError:
parsed_msg = record.msg + str(record.args)
if record.levelno == logging.WARNING:
sabnzbd.notifier.send_notification(T("Warning"), parsed_msg, "warning")
else:
sabnzbd.notifier.send_notification(T("Error"), parsed_msg, "error")
warning = {
"type": record.levelname,
"text": parsed_msg,
"time": int(time.time()),
"origin": "%s%d" % (record.filename, record.lineno),
}
# Append traceback, if available
warning = {"type": record.levelname, "text": parsed_msg, "time": int(time.time())}
if record.exc_info:
warning["text"] = "%s\n%s" % (warning["text"], traceback.format_exc())
# Do not notify the same notification within 1 minute from the same source
# This prevents endless looping if the notification service itself throws an error/warning
# We don't check based on message content, because if it includes a timestamp it's not unique
if not any(
stored_warning["origin"] == warning["origin"] and stored_warning["time"] + DEF_TIMEOUT > time.time()
for stored_warning in self.store
):
if record.levelno == logging.WARNING:
sabnzbd.notifier.send_notification(T("Warning"), parsed_msg, "warning")
else:
sabnzbd.notifier.send_notification(T("Error"), parsed_msg, "error")
# Loose the oldest record
if len(self.store) >= self._size:
self.store.pop(0)
@@ -156,7 +175,7 @@ class GUIHandler(logging.Handler):
return len(self.store)
def content(self):
""" Return an array with last records """
"""Return an array with last records"""
return self.store
@@ -167,34 +186,36 @@ def print_help():
print("Options marked [*] are stored in the config file")
print()
print("Options:")
print(" -f --config-file <ini> Location of config file")
print(" -s --server <srv:port> Listen on server:port [*]")
print(" -t --templates <templ> Template directory [*]")
print(" -f --config-file <ini> Location of config file")
print(" -s --server <srv:port> Listen on server:port [*]")
print(" -t --templates <templ> Template directory [*]")
print()
print(" -l --logging <-1..2> Set logging level (-1=off, 0= least, 2= most) [*]")
print(" -w --weblogging Enable cherrypy access logging")
print(" -l --logging <-1..2> Set logging level (-1=off, 0=least,2= most) [*]")
print(" -w --weblogging Enable cherrypy access logging")
print()
print(" -b --browser <0..1> Auto browser launch (0= off, 1= on) [*]")
print(" -b --browser <0..1> Auto browser launch (0= off, 1= on) [*]")
if sabnzbd.WIN32:
print(" -d --daemon Use when run as a service")
print(" -d --daemon Use when run as a service")
else:
print(" -d --daemon Fork daemon process")
print(" --pid <path> Create a PID file in the given folder (full path)")
print(" --pidfile <path> Create a PID file with the given name (full path)")
print(" -d --daemon Fork daemon process")
print(" --pid <path> Create a PID file in the given folder (full path)")
print(" --pidfile <path> Create a PID file with the given name (full path)")
print()
print(" -h --help Print this message")
print(" -v --version Print version information")
print(" -c --clean Remove queue, cache and logs")
print(" -p --pause Start in paused mode")
print(" --repair Add orphaned jobs from the incomplete folder to the queue")
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(" --disable-file-log Logging is only written to console")
print(" --new Run a new instance of SABnzbd")
print(" -h --help Print this message")
print(" -v --version Print version information")
print(" -c --clean Remove queue, cache and logs")
print(" -p --pause Start in paused mode")
print(" --repair Add orphaned jobs from the incomplete folder to the queue")
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(" --inet_exposure <0..5> Set external internet access [*]")
print(" --no-login Start with username and password reset")
print(" --log-all Log all article handling (for developers)")
print(" --disable-file-log Logging is only written to console")
print(" --console Force logging to console")
print(" --new Run a new instance of SABnzbd")
print()
print("NZB (or related) file:")
print(" NZB or compressed NZB file, with extension .nzb, .zip, .rar, .7z, .gz, or .bz2")
@@ -220,7 +241,7 @@ GNU GENERAL PUBLIC LICENSE Version 2 or (at your option) any later version.
def daemonize():
""" Daemonize the process, based on various StackOverflow answers """
"""Daemonize the process, based on various StackOverflow answers"""
try:
pid = os.fork()
if pid > 0:
@@ -262,7 +283,7 @@ def daemonize():
def abort_and_show_error(browserhost, cherryport, err=""):
""" Abort program because of CherryPy troubles """
"""Abort program because of CherryPy troubles"""
logging.error(T("Failed to start web-interface") + " : " + str(err))
if not sabnzbd.DAEMON:
if "49" in err:
@@ -274,7 +295,7 @@ def abort_and_show_error(browserhost, cherryport, err=""):
def identify_web_template(key, defweb, wdir):
""" Determine a correct web template set, return full template path """
"""Determine a correct web template set, return full template path"""
if wdir is None:
try:
wdir = fix_webname(key())
@@ -305,7 +326,7 @@ def identify_web_template(key, defweb, wdir):
def check_template_scheme(color, web_dir):
""" Check existence of color-scheme """
"""Check existence of color-scheme"""
if color and os.path.exists(os.path.join(web_dir, "static", "stylesheets", "colorschemes", color + ".css")):
return color
elif color and os.path.exists(os.path.join(web_dir, "static", "stylesheets", "colorschemes", color)):
@@ -331,8 +352,8 @@ def fix_webname(name):
return name
def get_user_profile_paths(vista_plus):
""" Get the default data locations on Windows"""
def get_user_profile_paths():
"""Get the default data locations on Windows"""
if sabnzbd.DAEMON:
# In daemon mode, do not try to access the user profile
# just assume that everything defaults to the program dir
@@ -347,22 +368,15 @@ def get_user_profile_paths(vista_plus):
return
elif sabnzbd.WIN32:
try:
from win32com.shell import shell, shellcon
path = shell.SHGetFolderPath(0, shellcon.CSIDL_LOCAL_APPDATA, None, 0)
sabnzbd.DIR_LCLDATA = os.path.join(path, DEF_WORKDIR)
sabnzbd.DIR_HOME = os.environ["USERPROFILE"]
except:
try:
if vista_plus:
root = os.environ["AppData"]
user = os.environ["USERPROFILE"]
sabnzbd.DIR_LCLDATA = "%s\\%s" % (root.replace("\\Roaming", "\\Local"), DEF_WORKDIR)
sabnzbd.DIR_HOME = user
else:
root = os.environ["USERPROFILE"]
sabnzbd.DIR_LCLDATA = "%s\\%s" % (root, DEF_WORKDIR)
sabnzbd.DIR_HOME = root
root = os.environ["AppData"]
user = os.environ["USERPROFILE"]
sabnzbd.DIR_LCLDATA = "%s\\%s" % (root.replace("\\Roaming", "\\Local"), DEF_WORKDIR)
sabnzbd.DIR_HOME = user
except:
pass
@@ -391,7 +405,7 @@ def get_user_profile_paths(vista_plus):
def print_modules():
""" Log all detected optional or external modules """
"""Log all detected optional or external modules"""
if sabnzbd.decoder.SABYENC_ENABLED:
# Yes, we have SABYenc, and it's the correct version, so it's enabled
logging.info("SABYenc module (v%s)... found!", sabnzbd.decoder.SABYENC_VERSION)
@@ -468,7 +482,7 @@ def print_modules():
def all_localhosts():
""" Return all unique values of localhost in order of preference """
"""Return all unique values of localhost in order of preference"""
ips = ["127.0.0.1"]
try:
# Check whether IPv6 is available and enabled
@@ -496,7 +510,7 @@ def all_localhosts():
def check_resolve(host):
""" Return True if 'host' resolves """
"""Return True if 'host' resolves"""
try:
socket.getaddrinfo(host, None)
except socket.error:
@@ -531,7 +545,7 @@ def get_webhost(cherryhost, cherryport, https_port):
# Valid user defined name?
info = socket.getaddrinfo(cherryhost, None)
except socket.error:
if cherryhost not in LOCALHOSTS:
if not is_localhost(cherryhost):
cherryhost = "0.0.0.0"
try:
info = socket.getaddrinfo(localhost, None)
@@ -584,7 +598,7 @@ def get_webhost(cherryhost, cherryport, https_port):
browserhost = localhost
else:
# If on Vista and/or APIPA, use numerical IP, to help FireFoxers
# If on APIPA, use numerical IP, to help FireFoxers
if ipv6 and ipv4:
cherryhost = hostip
browserhost = cherryhost
@@ -598,7 +612,7 @@ def get_webhost(cherryhost, cherryport, https_port):
except socket.error:
cherryhost = cherryhost.strip("[]")
if ipv6 and ipv4 and browserhost not in LOCALHOSTS:
if ipv6 and ipv4 and not is_localhost(browserhost):
sabnzbd.AMBI_LOCALHOST = True
logging.info("IPV6 has priority on this system, potential Firefox issue")
@@ -639,7 +653,7 @@ def get_webhost(cherryhost, cherryport, https_port):
def attach_server(host, port, cert=None, key=None, chain=None):
""" Define and attach server, optionally HTTPS """
"""Define and attach server, optionally HTTPS"""
if sabnzbd.cfg.ipv6_hosting() or "::1" not in host:
http_server = cherrypy._cpserver.Server()
http_server.bind_addr = (host, port)
@@ -652,7 +666,7 @@ def attach_server(host, port, cert=None, key=None, chain=None):
def is_sabnzbd_running(url):
""" Return True when there's already a SABnzbd instance running. """
"""Return True when there's already a SABnzbd instance running."""
try:
url = "%s&mode=version" % url
# Do this without certificate verification, few installations will have that
@@ -665,7 +679,7 @@ def is_sabnzbd_running(url):
def find_free_port(host, currentport):
""" Return a free port, 0 when nothing is free """
"""Return a free port, 0 when nothing is free"""
n = 0
while n < 10 and currentport <= 49151:
try:
@@ -762,10 +776,9 @@ def commandline_handler():
"server=",
"templates",
"ipv6_hosting=",
"template2",
"inet_exposure=",
"browser=",
"config-file=",
"force",
"disable-file-log",
"version",
"https=",
@@ -819,7 +832,7 @@ def commandline_handler():
def get_f_option(opts):
""" Return value of the -f option """
"""Return value of the -f option"""
for opt, arg in opts:
if opt == "-f":
return arg
@@ -844,10 +857,9 @@ def main():
cherrypylogging = None
clean_up = False
logging_level = None
console_logging = False
no_file_log = False
web_dir = None
vista_plus = False
win64 = False
repair = 0
no_login = False
sabnzbd.RESTART_ARGS = [sys.argv[0]]
@@ -855,6 +867,7 @@ def main():
pid_file = None
new_instance = False
ipv6_hosting = None
inet_exposure = None
_service, sab_opts, _serv_opts, upload_nzbs = commandline_handler()
@@ -899,6 +912,8 @@ def main():
if logging_level < -1 or logging_level > 2:
print_help()
exit_sab(1)
elif opt == "--console":
console_logging = True
elif opt in ("-v", "--version"):
print_version()
exit_sab(0)
@@ -932,6 +947,8 @@ def main():
new_instance = True
elif opt == "--ipv6_hosting":
ipv6_hosting = arg
elif opt == "--inet_exposure":
inet_exposure = arg
sabnzbd.MY_FULLNAME = os.path.normpath(os.path.abspath(sabnzbd.MY_FULLNAME))
sabnzbd.MY_NAME = os.path.basename(sabnzbd.MY_FULLNAME)
@@ -940,8 +957,8 @@ def main():
sabnzbd.DIR_LANGUAGE = real_path(sabnzbd.DIR_PROG, DEF_LANGUAGE)
org_dir = os.getcwd()
# Need console logging for SABnzbd.py and SABnzbd-console.exe
console_logging = (not hasattr(sys, "frozen")) or (sabnzbd.MY_NAME.lower().find("-console") > 0)
# Need console logging if requested, for SABnzbd.py and SABnzbd-console.exe
console_logging = console_logging or sabnzbd.MY_NAME.lower().find("-console") > 0 or not hasattr(sys, "frozen")
console_logging = console_logging and not sabnzbd.DAEMON
LOGLEVELS = (logging.FATAL, logging.WARNING, logging.INFO, logging.DEBUG)
@@ -958,17 +975,18 @@ def main():
logger.setLevel(logging.WARNING)
logger.addHandler(gui_log)
# Detect Windows variant
# Detect CPU architecture and Windows variant
# Use .machine as .processor is not always filled
cpu_architecture = platform.uname().machine
if sabnzbd.WIN32:
vista_plus, win64 = windows_variant()
sabnzbd.WIN64 = win64
sabnzbd.WIN64 = cpu_architecture == "AMD64"
if inifile:
# INI file given, simplest case
inifile = evaluate_inipath(inifile)
else:
# No ini file given, need profile data
get_user_profile_paths(vista_plus)
get_user_profile_paths()
# Find out where INI file is
inifile = os.path.abspath(os.path.join(sabnzbd.DIR_LCLDATA, DEF_INI_FILE))
@@ -1150,24 +1168,19 @@ def main():
).strip()
except:
pass
logging.info("Commit: %s", sabnzbd.__baseline__)
logging.info("Commit = %s", sabnzbd.__baseline__)
logging.info("Full executable path = %s", sabnzbd.MY_FULLNAME)
if sabnzbd.WIN32:
suffix = ""
if win64:
suffix = "(win64)"
try:
logging.info("Platform = %s %s", platform.platform(), suffix)
except:
logging.info("Platform = %s <unknown>", suffix)
else:
logging.info("Platform = %s", os.name)
logging.info("Python-version = %s", sys.version)
logging.info("Arguments = %s", sabnzbd.CMDLINE)
if sabnzbd.DOCKER:
logging.info("Running inside a docker container")
else:
logging.info("Not inside a docker container")
logging.info("Python-version = %s", sys.version)
logging.info("Dockerized = %s", sabnzbd.DOCKER)
logging.info("CPU architecture = %s", cpu_architecture)
try:
logging.info("Platform = %s - %s", os.name, platform.platform())
except:
# Can fail on special platforms (like Snapcraft or embedded)
pass
# Find encoding; relevant for external processing activities
logging.info("Preferred encoding = %s", sabnzbd.encoding.CODEPAGE)
@@ -1191,8 +1204,8 @@ def main():
try:
os.environ["SSL_CERT_FILE"] = certifi.where()
logging.info("Certifi version: %s", certifi.__version__)
logging.info("Loaded additional certificates from: %s", os.environ["SSL_CERT_FILE"])
logging.info("Certifi version = %s", certifi.__version__)
logging.info("Loaded additional certificates from %s", os.environ["SSL_CERT_FILE"])
except:
# Sometimes the certificate file is blocked
logging.warning(T("Could not load additional certificates from certifi package"))
@@ -1201,38 +1214,16 @@ def main():
# Extra startup info
if sabnzbd.cfg.log_level() > 1:
# List the number of certificates available (can take up to 1.5 seconds)
ctx = ssl.create_default_context()
logging.debug("Available certificates: %s", repr(ctx.cert_store_stats()))
logging.debug("Available certificates = %s", repr(ssl.create_default_context().cert_store_stats()))
mylocalipv4 = localipv4()
if mylocalipv4:
logging.debug("My local IPv4 address = %s", mylocalipv4)
else:
logging.debug("Could not determine my local IPv4 address")
mypublicipv4 = publicipv4()
if mypublicipv4:
logging.debug("My public IPv4 address = %s", mypublicipv4)
else:
logging.debug("Could not determine my public IPv4 address")
myipv6 = ipv6()
if myipv6:
logging.debug("My IPv6 address = %s", myipv6)
else:
logging.debug("Could not determine my IPv6 address")
# List networking
logging.debug("Local IPv4 address = %s", localipv4())
logging.debug("Public IPv4 address = %s", publicipv4())
logging.debug("IPv6 address = %s", ipv6())
# Measure and log system performance measured by pystone and - if possible - CPU model
from sabnzbd.utils.getperformance import getpystone, getcpu
pystoneperf = getpystone()
if pystoneperf:
logging.debug("CPU Pystone available performance = %s", pystoneperf)
else:
logging.debug("CPU Pystone available performance could not be calculated")
cpumodel = getcpu() # Linux only
if cpumodel:
logging.debug("CPU model = %s", cpumodel)
logging.debug("CPU Pystone available performance = %s", getpystone())
logging.debug("CPU model = %s", getcpu())
logging.info("Using INI file %s", inifile)
@@ -1253,8 +1244,6 @@ def main():
# Handle the several tray icons
if sabnzbd.cfg.win_menu() and not sabnzbd.DAEMON and not sabnzbd.WIN_SERVICE:
if sabnzbd.WIN32:
import sabnzbd.sabtray
sabnzbd.WINTRAY = sabnzbd.sabtray.SABTrayThread()
elif sabnzbd.LINUX_POWER and os.environ.get("DISPLAY"):
try:
@@ -1343,6 +1332,10 @@ def main():
sabnzbd.cfg.username.set("")
sabnzbd.cfg.password.set("")
# Overwrite inet_exposure from command-line for VPS-setups
if inet_exposure:
sabnzbd.cfg.inet_exposure.set(inet_exposure)
mime_gzip = (
"text/*",
"application/javascript",
@@ -1484,39 +1477,45 @@ def main():
check_latest_version()
autorestarted = False
# bonjour/zeroconf needs an ip. Lets try to find it.
external_host = localipv4() # IPv4 address of the LAN interface. This is the normal use case
if not external_host:
# None, so no network / default route, so let's set to ...
external_host = "127.0.0.1"
elif probablyipv4(cherryhost) and cherryhost not in LOCALHOSTS + ("0.0.0.0", "::"):
# a hard-configured cherryhost other than the usual, so let's take that (good or wrong)
external_host = cherryhost
logging.debug("bonjour/zeroconf/SSDP using host: %s", external_host)
sabnzbd.zconfig.set_bonjour(external_host, cherryport)
# Start SSDP if SABnzbd is running exposed
if cherryhost not in LOCALHOSTS:
# Set URL for browser for external hosts
if enable_https:
ssdp_url = "https://%s:%s%s" % (external_host, cherryport, sabnzbd.cfg.url_base())
# Start SSDP and Bonjour if SABnzbd isn't listening on localhost only
if sabnzbd.cfg.enable_broadcast() and not is_localhost(cherryhost):
# Try to find a LAN IP address for SSDP/Bonjour
if is_lan_addr(cherryhost):
# A specific listening address was configured, use that
external_host = cherryhost
else:
ssdp_url = "http://%s:%s%s" % (external_host, cherryport, sabnzbd.cfg.url_base())
ssdp.start_ssdp(
external_host,
"SABnzbd",
ssdp_url,
"SABnzbd %s" % sabnzbd.__version__,
"SABnzbd Team",
"https://sabnzbd.org/",
"SABnzbd %s" % sabnzbd.__version__,
ssdp_broadcast_interval=sabnzbd.cfg.ssdp_broadcast_interval(),
)
# Fall back to the IPv4 address of the LAN interface
external_host = localipv4()
logging.debug("Using %s as host address for Bonjour and SSDP", external_host)
if is_lan_addr(external_host):
sabnzbd.zconfig.set_bonjour(external_host, cherryport)
# Set URL for browser for external hosts
ssdp_url = "%s://%s:%s%s" % (
("https" if enable_https else "http"),
external_host,
cherryport,
sabnzbd.cfg.url_base(),
)
ssdp.start_ssdp(
external_host,
"SABnzbd",
ssdp_url,
"SABnzbd %s" % sabnzbd.__version__,
"SABnzbd Team",
"https://sabnzbd.org/",
"SABnzbd %s" % sabnzbd.__version__,
ssdp_broadcast_interval=sabnzbd.cfg.ssdp_broadcast_interval(),
)
# Have to keep this running, otherwise logging will terminate
timer = 0
while not sabnzbd.SABSTOP:
time.sleep(3)
# Wait to be awoken or every 3 seconds
with sabnzbd.SABSTOP_CONDITION:
sabnzbd.SABSTOP_CONDITION.wait(3)
timer += 1
# Check for loglevel changes
if LOG_FLAG:
@@ -1526,9 +1525,15 @@ def main():
if console_logging:
console.setLevel(level)
# 30 sec polling tasks
if timer > 9:
# 300 sec polling tasks
if not timer % 100:
if sabnzbd.LOG_ALL:
logging.debug("Triggering Python garbage collection")
gc.collect()
timer = 0
# 30 sec polling tasks
if not timer % 10:
# Keep OS awake (if needed)
sabnzbd.keep_awake()
# Restart scheduler (if needed)
@@ -1539,48 +1544,42 @@ def main():
if not sabnzbd.check_all_tasks():
autorestarted = True
sabnzbd.TRIGGER_RESTART = True
else:
timer += 1
# 3 sec polling tasks
# Check for auto-restart request
# Or special restart cases like Mac and WindowsService
if sabnzbd.TRIGGER_RESTART:
logging.info("Performing triggered restart")
# Shutdown
sabnzbd.shutdown_program()
# Add arguments and make sure we are in the right directory
if sabnzbd.Downloader.paused:
sabnzbd.RESTART_ARGS.append("-p")
if autorestarted:
sabnzbd.RESTART_ARGS.append("--autorestarted")
sys.argv = sabnzbd.RESTART_ARGS
os.chdir(org_dir)
# If macOS frozen restart of app instead of embedded python
if hasattr(sys, "frozen") and sabnzbd.DARWIN:
# [[NSProcessInfo processInfo] processIdentifier]]
# logging.info("%s" % (NSProcessInfo.processInfo().processIdentifier()))
my_pid = os.getpid()
my_name = sabnzbd.MY_FULLNAME.replace("/Contents/MacOS/SABnzbd", "")
my_args = " ".join(sys.argv[1:])
cmd = 'kill -9 %s && open "%s" --args %s' % (my_pid, my_name, my_args)
logging.info("Launching: %s", cmd)
os.system(cmd)
elif sabnzbd.WIN_SERVICE:
# Use external service handler to do the restart
# Wait 5 seconds to clean up
subprocess.Popen("timeout 5 & sc start SABnzbd", shell=True)
# Binaries require special restart
if hasattr(sys, "frozen"):
if sabnzbd.DARWIN:
# On macOS restart of app instead of embedded python
my_name = sabnzbd.MY_FULLNAME.replace("/Contents/MacOS/SABnzbd", "")
my_args = " ".join(sys.argv[1:])
cmd = 'kill -9 %s && open "%s" --args %s' % (os.getpid(), my_name, my_args)
logging.info("Launching: %s", cmd)
os.system(cmd)
elif sabnzbd.WIN_SERVICE:
# Use external service handler to do the restart
# Wait 5 seconds to clean up
subprocess.Popen("timeout 5 & sc start SABnzbd", shell=True)
elif sabnzbd.WIN32:
# Just a simple restart of the exe
os.execv(sys.executable, ['"%s"' % arg for arg in sys.argv])
else:
# CherryPy has special logic to include interpreter options such as "-OO"
cherrypy.engine._do_execv()
config.save_config()
if sabnzbd.WINTRAY:
sabnzbd.WINTRAY.terminate = True
if sabnzbd.WIN32:
del_connection_info()
# Send our final goodbyes!
notifier.send_notification("SABnzbd", T("SABnzbd shutdown finished"), "startup")
logging.info("Leaving SABnzbd")
@@ -1607,10 +1606,9 @@ def main():
if sabnzbd.WIN32:
import servicemanager
class SABnzbd(win32serviceutil.ServiceFramework):
""" Win32 Service Handler """
"""Win32 Service Handler"""
_svc_name_ = "SABnzbd"
_svc_display_name_ = "SABnzbd Binary Newsreader"
@@ -1674,7 +1672,7 @@ def handle_windows_service():
Returns True when any service commands were detected or
when we have started as a service.
"""
# Detect if running as Windows Service (only Vista and above!)
# Detect if running as Windows Service
# Adapted from https://stackoverflow.com/a/55248281/5235502
# Only works when run from the exe-files
if hasattr(sys, "frozen") and win32ts.ProcessIdToSessionId(win32api.GetCurrentProcessId()) == 0:
@@ -1725,7 +1723,6 @@ if __name__ == "__main__":
main()
elif sabnzbd.DARWIN and sabnzbd.FOUNDATION:
# macOS binary runner
from threading import Thread
from PyObjCTools import AppHelper
@@ -1734,7 +1731,7 @@ if __name__ == "__main__":
# Need to run the main application in separate thread because the eventLoop
# has to be in the main thread. The eventLoop is required for the menu.
# This code is made with trial-and-error, please improve!
# This code is made with trial-and-error, please feel free to improve!
class startApp(Thread):
def run(self):
main()

View File

@@ -71,14 +71,14 @@ def safe_remove(path):
def delete_files_glob(name):
""" Delete one file or set of files from wild-card spec """
"""Delete one file or set of files from wild-card spec"""
for f in glob.glob(name):
if os.path.exists(f):
os.remove(f)
def run_external_command(command):
""" Wrapper to ease the use of calling external programs """
"""Wrapper to ease the use of calling external programs"""
process = subprocess.Popen(command, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output, _ = process.communicate()
ret = process.wait()
@@ -90,7 +90,7 @@ def run_external_command(command):
def run_git_command(parms):
""" Run git command, raise error if it failed """
"""Run git command, raise error if it failed"""
return run_external_command(["git"] + parms)
@@ -408,7 +408,7 @@ if __name__ == "__main__":
# Release to github
if "release" in sys.argv:
# Check if tagged as release and check for token
gh_token = os.environ.get("GITHUB_TOKEN", "")
gh_token = os.environ.get("AUTOMATION_GITHUB_TOKEN", "")
if RELEASE_THIS and gh_token:
gh_obj = github.Github(gh_token)
gh_repo = gh_obj.get_repo("sabnzbd/sabnzbd")
@@ -543,7 +543,7 @@ if __name__ == "__main__":
)
else:
print("To push release to GitHub, add 'draft release' to the commit message.")
print("Or missing the GITHUB_TOKEN, cannot push to GitHub without it.")
print("Or missing the AUTOMATION_GITHUB_TOKEN, cannot push to GitHub without it.")
# Reset!
run_git_command(["reset", "--hard"])

View File

@@ -1,5 +1,5 @@
# Basic build requirements
pyinstaller
pyinstaller==4.2
setuptools
pkginfo
certifi

View File

@@ -237,6 +237,13 @@ Function .onInit
Abort
${EndIf}
; Python 3.9 no longer supports Windows 7
${If} ${AtMostWin8}
MessageBox MB_OK $(MsgNoWin7)
ExecShell "open" "https://sabnzbd.org/downloads"
Abort
${EndIf}
;------------------------------------------------------------------
; Change settings based on if SAB was already installed
ReadRegStr $PREV_INST_DIR HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
@@ -373,6 +380,8 @@ SectionEnd
LangString MsgOnly64bit ${LANG_ENGLISH} "The installer only supports 64-bit Windows, use the standalone version to run on 32-bit Windows."
LangString MsgNoWin7 ${LANG_ENGLISH} "The installer only supports Windows 8.1 and above, use the standalone legacy version to run on older Windows version."
LangString MsgUninstall ${LANG_ENGLISH} "This will uninstall SABnzbd from your system"
LangString MsgRunAtStart ${LANG_ENGLISH} "Run at startup"

View File

@@ -4,7 +4,7 @@
#set global $root = '../../'#
#end if#
<!DOCTYPE HTML>
<html lang="$active_lang">
<html lang="$active_lang" #if $rtl#dir="rtl"#end if#>
<head>
<title>
SABnzbd $T('menu-config')

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Config"#-->
<!--#set global $help_uri="configuration/3.2/configure"#-->
<!--#set global $help_uri="configuration/3.3/configure"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#from sabnzbd.encoding import CODEPAGE#-->

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Categories"#-->
<!--#set global $help_uri="configuration/3.2/categories"#-->
<!--#set global $help_uri="configuration/3.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/3.2/folders"#-->
<!--#set global $help_uri="configuration/3.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/3.2/general"#-->
<!--#set global $help_uri="configuration/3.3/general"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -131,12 +131,7 @@
<option value="5" <!--#if $inet_exposure == 5 then 'selected="selected"' else ""#-->>$T('inet-ui') - $T('inet-external_login')</option>
</optgroup>
</select>
<span class="desc">$T('explain-inet_exposure').replace('. ','.<br><span class="label label-warning">'+$T('warning').upper()+'</span> ')</span>
</div>
<div class="field-pair">
<label class="config" for="local_ranges">$T('opt-local_ranges')</label>
<input type="text" name="local_ranges" id="local_ranges" value="$local_ranges" />
<span class="desc">$T('explain-local_ranges')</span>
<span class="desc">$T('explain-inet_exposure')</span>
</div>
<div class="field-pair">
<label class="config" for="apikey_display">$T('opt-apikey')</label>
@@ -260,17 +255,18 @@
// 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')
var safeCheck = \$('#host, #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) {
if(\$('#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')'})
safeCheck.addClass('host-warning-highlight')
}
return
}

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Email"#-->
<!--#set global $help_uri="configuration/3.2/notifications"#-->
<!--#set global $help_uri="configuration/3.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/3.2/rss"#-->
<!--#set global $help_uri="configuration/3.3/rss"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#import html#-->
<div class="colmask">
@@ -10,7 +10,7 @@
<p>$T('explain-RSS')</p>
<form action="add_rss_feed" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<table class="catTable">
<table class="catTable addRssTable">
<tr>
<th>&nbsp;</th>
<th>$T('name')</th>
@@ -21,10 +21,10 @@
<td>
<input type="checkbox" name="enable" value="1" checked />
</td>
<td>
<input type="text" name="feed" class="smaller_input" value="$feed" />
<td class="new-feed-title">
<input type="text" name="feed" value="$feed" />
</td>
<td>
<td class="new-feed-url">
<input type="text" name="uri" placeholder="$T('addMultipleFeeds')" />
</td>
<td class="nowrap">
@@ -59,7 +59,7 @@
<td class="controls">
<button type="button" class="btn btn-default testFeed" rel="$feed_item_html"><span class="glyphicon glyphicon-sort"></span> $T('button-preFeed')</button>
<input type="hidden" name="uri" value="$rss[$feed_item]['uris']" />
<button type="button" class="btn btn-default editFeed" rel="$feed_item_html"><span class="glyphicon glyphicon-pencil"></span> $T('Edit')</button>
<button type="button" class="btn btn-default editFeed" rel="$feed_item_html"><span class="glyphicon glyphicon-pencil"></span> $T('rss-edit')</button>
<button type="button" class="btn btn-default delFeed" rel="$feed_item_html"><span class="glyphicon glyphicon-trash"></span></button>
</td>
</tr>
@@ -92,7 +92,7 @@
<label class="config narrow" for="rss_rate">$T('opt-rss_rate')</label>
<input type="number" name="rss_rate" id="rss_rate" value="$rss_rate" min="15" max="1440" />
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-ok"></span> $T('button-save')</button>
<span class="config narrow">&nbsp;&nbsp;$T('Next scan at:')&nbsp;$rss_next</span>
<span class="config narrow">&nbsp;&nbsp;$T('rss-nextscan'): $rss_next</span>
<span class="desc narrow">$T('explain-rss_rate')</span>
</div>
</fieldset>

View File

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

View File

@@ -1,11 +1,11 @@
<!--#set global $pane="Servers"#-->
<!--#set global $help_uri="configuration/3.2/servers"#-->
<!--#set global $help_uri="configuration/3.3/servers"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#import json#-->
<!--#import datetime#-->
<script type="text/javascript">
<script type="text/javascript" xmlns="http://www.w3.org/1999/html">
// Define variable needed for the server-statistics
var serverBandwithData = {}
var serverArticleTries = {}
@@ -40,6 +40,10 @@
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
<span class="desc">$T('srv-enable')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="displayname">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname" />
</div>
<div class="field-pair">
<label class="config" for="host">$T('srv-host')</label>
<input type="text" name="host" id="host" required />
@@ -104,8 +108,14 @@
<span class="desc">$T('explain-optional')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="displayname">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname" />
<label class="config" for="expire_date">$T('srv-expire_date')</label>
<input type="date" name="expire_date" id="expire_date" />
<span class="desc">$T('srv-explain-expire_date')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="quota">$T('swtag-quota')</label>
<input type="text" name="quota" id="quota" class="smaller_input" />
<span class="desc">$T('srv-explain-quota')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="notes">$T('srv-notes')</label>
@@ -134,7 +144,7 @@
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<h3>$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
<h3 title="$server['displayname']">$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
<!--#if int($server['enable']) != 0 #-->
<!--#if $last_prio != $server['priority'] and $cur_prio_color+1 < len($prio_colors) #-->
<!--#set $cur_prio_color = $cur_prio_color+1 #-->
@@ -155,6 +165,10 @@
<div class="col1" style="display:none;">
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
<fieldset>
<div class="field-pair advanced-settings">
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
</div>
<div class="field-pair">
<label class="config" for="host$cur">$T('srv-host')</label>
<input type="text" name="host" id="host$cur" value="$server['host']" required />
@@ -220,8 +234,14 @@
<span class="desc">$T('srv-explain-send_group')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
<label class="config" for="expire_date$cur">$T('srv-expire_date')</label>
<input type="date" name="expire_date" id="expire_date$cur" value="$server['expire_date']" />
<span class="desc">$T('srv-explain-expire_date')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="quota$cur">$T('swtag-quota')</label>
<input type="text" name="quota" id="quota$cur" value="$server['quota']" class="smaller_input" />
<span class="desc">$T('srv-explain-quota')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="notes$cur">$T('srv-notes')</label>
@@ -248,10 +268,17 @@
$T('thisMonth'): $(server['amounts'][1])B<br/>
$T('selectedDates'): <span id="server-bandwith-value-${cur}"></span>
</p>
<p title="$T('readwiki')">
<b>$T('srv-article-availability'):</b><br/>
$T('selectedDates'): <span id="server-article-value-${cur}"></span>
</p>
<!--#if $server['expire_date']#-->
<p><b>$T('srv-expire_date'):</b> $(server['expire_date'])</p>
<!--#end if#-->
<!--#if $server['quota']#-->
<p><b>$T('quota-left'):</b> $(server['quota_left'])B</p>
<!--#end if#-->
</div>
<div class="server-chart" data-serverid="${cur}">
<div id="server-chart-${cur}" class="ct-chart"></div>
@@ -361,7 +388,8 @@
// If values were missing
if(!isNaN(articleRatio)) {
\$('#server-article-value-' + server_id).text('$T("srv-articles-tried")'.replace('%f', articleRatio).replace('%d', totalArticlesTriedThisRange))
// Use filesize to convert to unit-display
\$('#server-article-value-' + server_id).text('$T("srv-articles-tried")'.replace('%f', articleRatio).replace('%d', filesize(totalArticlesTriedThisRange, {unix: true, round: 0, spacer: "", base: 1})))
} else {
\$('#server-article-value-' + server_id).text('$T("notAvailable")')
}

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Sorting"#-->
<!--#set global $help_uri="configuration/3.2/sorting"#-->
<!--#set global $help_uri="configuration/3.3/sorting"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -130,6 +130,11 @@
<td>%e_n</td>
<td>$T('ep-us-name')</td>
</tr>
<tr>
<td class="align-right"><b>$T('Resolution'):</b></td>
<td>%r</td>
<td>1080p</td>
</tr>
<tr>
<td class="align-right"><b>$T('fileExt'):</b></td>
<td>%ext</td>
@@ -245,6 +250,11 @@
<td>%y</td>
<td>2009</td>
</tr>
<tr>
<td class="align-right"><b>$T('Resolution'):</b></td>
<td>%r</td>
<td>1080p</td>
</tr>
<tr>
<td class="align-right"><b>$T('extension'):</b></td>
<td>%ext</td>
@@ -407,6 +417,11 @@
<td>%0decade</td>
<td>2000</td>
</tr>
<tr>
<td class="align-right"><b>$T('Resolution'):</b></td>
<td>%r</td>
<td>1080p</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgFilename'):</b></td>
<td>%fn</td>

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Special"#-->
<!--#set global $help_uri="configuration/3.2/special"#-->
<!--#set global $help_uri="configuration/3.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/3.2/switches"#-->
<!--#set global $help_uri="configuration/3.3/switches"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -120,6 +120,10 @@
</div>
<div class="field-pair">
<label class="config" for="unwanted_extensions">$T('opt-unwanted_extensions')</label>
<select name="unwanted_extensions_mode" id="unwanted_extensions_mode">
<option value="0" <!--#if int($unwanted_extensions_mode) == 0 then 'selected="selected"' else ""#--> >$T('unwanted_extensions_blacklist')</option>
<option value="1" <!--#if int($unwanted_extensions_mode) == 1 then 'selected="selected"' else ""#--> >$T('unwanted_extensions_whitelist')</option>
</select>
<input type="text" name="unwanted_extensions" id="unwanted_extensions" value="$unwanted_extensions"/>
<span class="desc">$T('explain-unwanted_extensions')</span>
</div>
@@ -136,8 +140,8 @@
<label class="config" for="auto_sort">$T('opt-auto_sort')</label>
<select name="auto_sort" id="auto_sort">
<option value="">$T('default')</option>
<option value="avg_age asc" <!--#if $auto_sort == "avg_age asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortAgeAsc')</option>
<option value="avg_age desc" <!--#if $auto_sort == "avg_age desc" then 'selected="selected"' else ""#--> >$T('Glitter-sortAgeDesc')</option>
<option value="avg_age desc" <!--#if $auto_sort == "avg_age desc" then 'selected="selected"' else ""#--> >$T('Glitter-sortAgeAsc')</option>
<option value="avg_age asc" <!--#if $auto_sort == "avg_age asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortAgeDesc')</option>
<option value="name asc" <!--#if $auto_sort == "name asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortNameAsc')</option>
<option value="name desc" <!--#if $auto_sort == "name desc" then 'selected="selected"' else ""#--> >$T('Glitter-sortNameDesc')</option>
<option value="size asc" <!--#if $auto_sort == "size asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortSizeAsc')</option>

View File

File diff suppressed because one or more lines are too long

View File

@@ -550,6 +550,16 @@ tr.separator {
padding-right: 13px;
}
/* -- */
.RSS .addRssTable,
.RSS .addRssTable input[type="text"] {
width: 100%;
}
.RSS .addRssTable .new-feed-title {
max-width: 250px;
}
.RSS .addRssTable .new-feed-url {
width: 70%;
}
h2.activeRSS {
margin-bottom: 10px;
}
@@ -559,12 +569,12 @@ h2.activeRSS {
text-decoration: underline !important;
}
.favicon {
background-position: center center!important;
background-size: 16px 16px;
background-position: center center !important;
background-size: 22px 22px;
opacity: 1;
top: -1px;
height: 16px;
width: 16px;
height: 22px;
width: 22px;
float: left;
margin: 0 6px 0 2px;
text-align: center;
@@ -584,6 +594,7 @@ h2.activeRSS {
}
#subscriptions {
border: 1px solid #E5E5E5;
width: 100%;
}
.data-row {
border-top: 1px solid #E5E5E5;
@@ -595,6 +606,7 @@ h2.activeRSS {
#subscriptions .chk {
padding: 8px 5px 5px;
vertical-align: middle;
width: 40px;
}
#subscriptions .title {
font-weight: bold;
@@ -602,10 +614,11 @@ h2.activeRSS {
width: auto;
}
#subscriptions .favicon {
margin-left: 8px;
margin-left: 7px;
margin-top: -2px;
}
.ie6 .subscription-title {
width: 20em;
#subscriptions .glyphicon {
margin-top: 3px;
}
.subscription-title,
.subscription-title:hover {
@@ -1090,6 +1103,10 @@ input[type="checkbox"] {
font-size: 1.2em;
}
.host-warning-highlight {
border-color: #F0AD4E !important;
}
.fileBrowser .glyphicon {
margin-right: 2px;
top: 1px;
@@ -1168,6 +1185,31 @@ input[type="checkbox"] {
100% { transform: rotate(359deg); }
}
/***
RTL Fixes
***/
html[dir="rtl"] .col1 input[type='checkbox'],
html[dir="rtl"] .col2 h3 a {
left: 5px;
}
html[dir="rtl"] .modal-header .close {
float: left;
}
html[dir="rtl"] .field-pair {
position: relative;
}
html[dir="rtl"] .Sorting .presets.float-left,
html[dir="rtl"] .checkbox-days {
float: none;
}
html[dir="rtl"] .Scheduling form[action="addSchedule"] input[type="checkbox"] {
right: 5px;
}
@media screen and (min-width: 1200px) {
.Categories input[name="dir"] {
max-width: 240px !important;

View File

@@ -264,13 +264,13 @@ function do_restart() {
$.ajax({ url: '../../config/restart?apikey=' + sabSession,
complete: function() {
// Keep counter of failures
var failureCounter = 0;
var loopCounter = 0;
// Now we try until we can connect
var refreshInterval = setInterval(function() {
// We skip the first one
if(failureCounter == 0) {
failureCounter = failureCounter+1;
setInterval(function() {
loopCounter = loopCounter+1;
// We skip the first one so we give it time to shutdown
if(loopCounter < 2) {
return
}
$.ajax({ url: urlTotal,
@@ -279,17 +279,16 @@ function do_restart() {
location.href = urlTotal;
},
error: function(status, text) {
failureCounter = failureCounter+1;
// Too many failuers and we give up
if(failureCounter >= 6) {
// Too many failures and we give up
if(loopCounter >= 10) {
// If the port has changed 'Access-Control-Allow-Origin' header will not allow
// us to check if the server is back up. So after 7 failures we redirect
// us to check if the server is back up. So after 10 failures (20 sec) we redirect
// anyway in the hopes it works anyway..
location.href = urlTotal;
}
}
})
}, 4000)
}, 2000)
// Exception if we go from HTTPS to HTTP
// (this is not allowed by browsers and all of the above will be ignored)

View File

@@ -224,4 +224,10 @@
<span data-bind="text: history.downloadedMonth"></span>B $T('Glitter-thisMonth')
<span data-bind="text: history.downloadedTotal"></span>B $T('Glitter-total')
</div>
</div>
<div class="info-container history-info" data-bind="visible: !hasHistory() && !displayTabbed()" style="display: none">
<span class="glyphicon glyphicon-save"></span>
<span data-bind="text: history.downloadedToday"></span>B $T('Glitter-today')
<span data-bind="text: history.downloadedMonth"></span>B $T('Glitter-thisMonth')
<span data-bind="text: history.downloadedTotal"></span>B $T('Glitter-total')
</div>

View File

@@ -26,13 +26,15 @@
<!-- /ko -->
<!-- ko foreach: allMessages -->
<tr>
<td class="table-messages-label">
<td class="table-messages-label" data-bind="attr: { 'colspan': 1 + !\$data.hasOwnProperty('clear') }">
<span class="label" data-bind="css: 'label-' + css, text: type"></span>
<span class="queue-message-text" data-bind="html: text"></span>
</td>
<!-- ko if: \$data.hasOwnProperty("clear") -->
<td class="table-messages-remove">
<!-- ko if: \$data.hasOwnProperty("clear") --><a href="#" data-bind="click: clear" class="hover-button"><span class="glyphicon glyphicon-remove"></span></a><!-- /ko -->
<a href="#" data-bind="click: clear" class="hover-button"><span class="glyphicon glyphicon-remove"></span></a>
</td>
<!-- /ko -->
</tr>
<!-- /ko -->
<!-- ko if: !hasMessages() && displayTabbed() -->

View File

@@ -86,34 +86,34 @@
<div class="tab-content">
<div class="tab-pane fade in active" id="options-status">
<div class="row">
<div class="col-sm-6">$T('dashboard-localIP4')</div>
<div class="col-sm-6">$T('dashboard-localIP4') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasStatusInfo, text: !statusInfo.localipv4() ? '$T('dashboard-connectionError')' : statusInfo.localipv4(), css: { 'options-bad-status' : !statusInfo.localipv4() }"></div>
<div class="col-sm-6 col-loading" data-bind="visible: !hasStatusInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row">
<div class="col-sm-6">$T('dashboard-publicIP4')</div>
<div class="col-sm-6">$T('dashboard-publicIP4') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasStatusInfo, text: !statusInfo.publicipv4() ? '$T('dashboard-connectionError')' : statusInfo.publicipv4(), css: { 'options-bad-status ' : !statusInfo.publicipv4() }"></div>
<div class="col-sm-6 col-loading" data-bind="visible: !hasStatusInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row">
<div class="col-sm-6">$T('dashboard-IP6')</div>
<div class="col-sm-6">$T('dashboard-IP6') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasStatusInfo, text: statusInfo.ipv6"></div>
<div class="col-sm-6 col-loading" data-bind="visible: !hasStatusInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row">
<div class="col-sm-6">$T('dashboard-NameserverDNS')</div>
<div class="col-sm-6">$T('dashboard-NameserverDNS') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasStatusInfo, text: !statusInfo.dnslookup() ? '$T('dashboard-connectionError')' : statusInfo.dnslookup(), css: { 'options-bad-status' : (statusInfo.dnslookup() != 'OK') }"></div>
<div class="col-sm-6 col-loading" data-bind="visible: !hasStatusInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<hr/>
<div class="row">
<div class="col-sm-6">$T('cache')</div>
<div class="col-sm-6">$T('cache') &nbsp; </div>
<div class="col-sm-6">
<span data-bind="text: cacheSize"></span> (<span data-bind="text: cacheArticles"></span> $T('Glitter-articles'))
</div>
</div>
<div class="row">
<div class="col-sm-6">$T('dashboard-systemPerformance')</div>
<div class="col-sm-6">$T('dashboard-systemPerformance') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasPerformanceInfo">
<span data-bind="text: statusInfo.pystone"></span>
<a href="#" data-bind="click: testDiskSpeed" data-tooltip="true" data-placement="right" title="$T('dashboard-repeatTest')"><span class="glyphicon glyphicon-repeat"></span></a>
@@ -122,7 +122,7 @@
<div class="col-sm-6 col-loading" data-bind="visible: !hasPerformanceInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row">
<div class="col-sm-6">$T('dashboard-downloadDirSpeed')</div>
<div class="col-sm-6">$T('dashboard-downloadDirSpeed') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasPerformanceInfo">
<span data-bind="text: statusInfo.downloaddirspeed()"></span> MB/s
<a href="#" class="diskspeed-button" data-bind="click: testDiskSpeed" data-tooltip="true" data-placement="right" title="$T('dashboard-repeatTest')"><span class="glyphicon glyphicon-repeat"></span></a>
@@ -131,7 +131,7 @@
<div class="col-sm-6 col-loading" data-bind="visible: !hasPerformanceInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row">
<div class="col-sm-6">$T('dashboard-completeDirSpeed')</div>
<div class="col-sm-6">$T('dashboard-completeDirSpeed') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasPerformanceInfo">
<span data-bind="text: statusInfo.completedirspeed()"></span> MB/s
<a href="#" class="diskspeed-button" data-bind="click: testDiskSpeed" data-tooltip="true" data-placement="right" title="$T('dashboard-repeatTest')"><span class="glyphicon glyphicon-repeat"></span></a>
@@ -140,7 +140,7 @@
<div class="col-sm-6 col-loading" data-bind="visible: !hasPerformanceInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row">
<div class="col-sm-6">$T('dashboard-internetBandwidth')</div>
<div class="col-sm-6">$T('dashboard-internetBandwidth') &nbsp; </div>
<div class="col-sm-6" data-bind="visible: hasPerformanceInfo">
<span data-bind="text: statusInfo.internetbandwidth()"></span> MB/s
<a href="#" class="diskspeed-button" data-bind="click: testDiskSpeed" data-tooltip="true" data-placement="right" title="$T('dashboard-repeatTest')"><span class="glyphicon glyphicon-repeat"></span></a>
@@ -149,7 +149,7 @@
<div class="col-sm-6 col-loading" data-bind="visible: !hasPerformanceInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row test-download">
<div class="col-sm-6">$T('dashboard-testDownload')</div>
<div class="col-sm-6">$T('dashboard-testDownload') &nbsp; </div>
<div class="col-sm-6">
<a href="#" class="btn btn-default" data-bind="click: testDownload" data-size="100MB" data-tooltip="true" data-placement="top" title="$T('dashboard-testDownload-explain')"><span class="glyphicon glyphicon-download-alt"></span> 100 MB</a>
<a href="#" class="btn btn-default" data-bind="click: testDownload" data-size="1000MB" data-tooltip="true" data-placement="top" title="$T('dashboard-testDownload-explain')"><span class="glyphicon glyphicon-download-alt"></span> 1 GB</a>

View File

@@ -109,7 +109,7 @@
<form data-bind="submit: editingNameSubmit">
<input type="text" data-bind="value: nameForEdit, visible: editingName(), hasfocus: editingName" />
</form>
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack">
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack() && !editingName()">
<span class="glyphicon glyphicon-compressed"></span> <span data-bind="text: direct_unpack"></span>
</div>
<div class="name-options" data-bind="visible: !editingName(), css: { disabled: isGrabbing() }">

View File

@@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--#set $active_lang=$active_lang.replace('_', '-').lower()#-->
<html lang="$active_lang" id="sabnzbd" data-bind="filedrop: { overlaySelector: '.main-filedrop', onFileDrop: addNZBFromFile }">
<html lang="$active_lang" <!--#if $rtl#-->dir="rtl"<!--#end if#--> id="sabnzbd" data-bind="filedrop: { overlaySelector: '.main-filedrop', onFileDrop: addNZBFromFile }">
<head>
<!--
Glitter V2
@@ -36,7 +36,7 @@
<link rel="stylesheet" type="text/css" href="./static/bootstrap/css/bootstrap.min.css?v=$version" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.css?v=$version" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.mobile.css?v=$version" media="all and (max-width: 768px)" />
<!--#if $color_scheme not in ('Default', '') #-->
<!--#if $color_scheme not in ('Light', '') #-->
<link rel="stylesheet" type="text/css" href="./static/stylesheets/colorschemes/${color_scheme}.css?v=$version"/>
<!--#end if#-->
@@ -52,15 +52,17 @@
var glitterTranslate = new Object();
glitterTranslate.paused = "$T('post-Paused')";
glitterTranslate.left = "$T('Glitter-left')";
glitterTranslate.clearWarn = "$T('Glitter-confirmClearWarnings')";
glitterTranslate.clearWarn = "$T('confirm')";
glitterTranslate.pausePromptFail = "$T('Glitter-pausePromptFail')"
glitterTranslate.pauseFor = "$T('pauseFor')"
glitterTranslate.minutes = "$T('mins')"
glitterTranslate.shutdown = "$T('shutdownOK?')";
glitterTranslate.restart = "$T('explain-Restart') $T('explain-needNewLogin')".replace(/\<br(\s*\/|)\>/g, '\n');
glitterTranslate.repair = "$T('explain-Repair')".replace(/<br \/>/g, "\n").replace(/&quot;/g,'"');
glitterTranslate.removeDown = "$T('Glitter-confirmClearDownloads')";
glitterTranslate.removeDow1 = "$T('Glitter-confirmClear1Download')";
glitterTranslate.deleteMsg = "$T('nzo-delete')";
glitterTranslate.removeDown = "$T('confirm')";
glitterTranslate.removeDow1 = "$T('confirm')";
glitterTranslate.renameAbort = "$T('Glitter-confirmAbortDirectUnpack')\n$T('confirm')";
glitterTranslate.retryAll = "$T('link-retryAll')?";
glitterTranslate.fetch = "$T('Glitter-fetch')";
glitterTranslate.encrypted = "$T('Glitter-encrypted')";

View File

@@ -421,7 +421,7 @@ function HistoryModel(parent, data) {
// Delete button
self.deleteSlot = function(item, event) {
// Confirm?
if(!self.parent.parent.confirmDeleteHistory() || confirm(glitterTranslate.removeDow1)) {
if(!self.parent.parent.confirmDeleteHistory() || confirm(glitterTranslate.deleteMsg + ":\n" + item.historyStatus.name() + "\n\n" + glitterTranslate.removeDow1)) {
// Are we still processing and it can be stopped?
if(item.processingDownload() == 2) {
callAPI({

View File

@@ -629,6 +629,37 @@ function ViewModel() {
}
})
// Save the rest in config if global-settings
var saveInterfaceSettings = function(newValue) {
if(self.useGlobalOptions()) {
var interfaceSettings = {
"dateFormat": self.dateFormat,
"extraQueueColumns": self.extraQueueColumns,
"extraHistoryColumns": self.extraHistoryColumns,
"displayCompact": self.displayCompact,
"displayFullWidth": self.displayFullWidth,
"displayTabbed": self.displayTabbed,
"confirmDeleteQueue": self.confirmDeleteQueue,
"confirmDeleteHistory": self.confirmDeleteHistory
};
callAPI({
mode: "set_config",
section: "misc",
keyword: "interface_settings",
value: ko.toJSON(interfaceSettings)
})
}
}
self.dateFormat.subscribe(saveInterfaceSettings);
self.extraQueueColumns.subscribe(saveInterfaceSettings);
self.extraHistoryColumns.subscribe(saveInterfaceSettings);
self.displayCompact.subscribe(saveInterfaceSettings);
self.displayFullWidth.subscribe(saveInterfaceSettings);
self.displayTabbed.subscribe(saveInterfaceSettings);
self.confirmDeleteQueue.subscribe(saveInterfaceSettings);
self.confirmDeleteHistory.subscribe(saveInterfaceSettings);
/***
Add NZB's
***/
@@ -1073,6 +1104,19 @@ function ViewModel() {
// Set queue limit
self.queue.paginationLimit(response.config.misc.queue_limit.toString())
// Import the rest of the settings
if(response.config.misc.interface_settings) {
var interfaceSettings = JSON.parse(response.config.misc.interface_settings);
self.dateFormat(interfaceSettings['dateFormat']);
self.extraQueueColumns(interfaceSettings['extraQueueColumns']);
self.extraHistoryColumns(interfaceSettings['extraHistoryColumns']);
self.displayCompact(interfaceSettings['displayCompact']);
self.displayFullWidth(interfaceSettings['displayFullWidth']);
self.displayTabbed(interfaceSettings['displayTabbed']);
self.confirmDeleteQueue(interfaceSettings['confirmDeleteQueue']);
self.confirmDeleteHistory(interfaceSettings['confirmDeleteHistory']);
}
}
// Set bandwidth limit

View File

@@ -652,6 +652,9 @@ function QueueModel(parent, data) {
// Anything change or empty?
if(!newName || self.name() == newName) return;
// Rename would abort Direct Unpack, so ask if user is sure
if(self.direct_unpack() && !confirm(glitterTranslate.renameAbort)) return;
// Send rename
callAPI({
mode: 'queue',
@@ -724,7 +727,7 @@ function QueueModel(parent, data) {
// Remove 1 download from queue
self.removeDownload = function(item, event) {
// Confirm and remove
if(!self.parent.parent.confirmDeleteQueue() || confirm(glitterTranslate.removeDow1)) {
if(!self.parent.parent.confirmDeleteQueue() || confirm(glitterTranslate.deleteMsg + ":\n" + item.name() + "\n\n" + glitterTranslate.removeDow1)) {
var itemToDelete = this;
// Show notification

View File

@@ -0,0 +1 @@
@import url('Night.css') screen and (prefers-color-scheme: dark);

View File

@@ -55,6 +55,10 @@ legend,
opacity: 0.7;
}
.form-control[disabled] {
opacity: 0.65;
}
.progress {
background-color: #DADADA;
}
@@ -126,6 +130,10 @@ select.form-control,
.main-content .btn-default,
.modal-body .btn-default,
.modal-footer .btn-default,
.btn-default.disabled:hover,
.btn-default.disabled:active,
.btn-default.disabled:focus,
.form-control[disabled],
#modal-options .options-function-box .input-group-addon {
background-color: #555555;
color: #EBEBEB;
@@ -157,6 +165,8 @@ tbody>tr:last-child td,
input,
input.form-control,
.input-group-addon,
.search-box input:focus,
.search-box input:valid,
select.form-control,
#modal-options .table-server-connections th,
.main-content .btn-default,

View File

@@ -1979,6 +1979,45 @@ input[name="nzbURL"] {
}
}
/***
RTL Fixes
***/
html[dir="rtl"] .navbar-nav {
padding-right: 0;
}
html[dir="rtl"] .queue h2,
html[dir="rtl"] .history h2 {
float: right;
}
html[dir="rtl"] .dropdown-menu {
text-align: right;
direction: rtl;
}
html[dir="rtl"] .speedlimit-dropdown,
html[dir="rtl"] .progress-indicator,
html[dir="rtl"] #modal-item-filelist,
html[dir="rtl"] #modal-item-files .modal-title,
html[dir="rtl"] .info-container-box,
html[dir="rtl"] .queue-table,
html[dir="rtl"] .history-table {
direction: ltr;
}
html[dir="rtl"] .search-box a {
right: initial;
left: 8px;
}
html[dir="rtl"] .navbar-logo,
html[dir="rtl"] .info-container,
html[dir="rtl"] .modal-header .close,
html[dir="rtl"] #modal-options .modal-header a {
float: left;
}
/***
Bootstrap overwrites

View File

@@ -91,40 +91,7 @@
<div id="tabs-connections">
<a href="refresh_conn?apikey=$apikey" class="juiButton">$T('Plush-button-refresh')</a>
<a href="disconnect?apikey=$apikey" class="juiButton">$T('link-forceDisc')</a>
<hr>
<!--#if $servers#-->
<!--#set $count=0#-->
<!--#for $server in $servers#-->
<!--#set $count=$count+1#-->
<p>$T('swtag-server'): <strong>$server[0]</strong></p>
<p>$T('Priority') = $server[7]&nbsp;&nbsp;<!--#if int($server[8]) != 0#-->$T('optional').capitalize()<!--#else#-->$T('enabled').capitalize()<!--#end if#--></p>
<p># $T('connections'): $server[2]</p>
<!--#if not $server[5]#-->
<a href="./unblock_server?server=$server[0]&apikey=$apikey" class="juiButton">$T('server-blocked')</a>
&nbsp;&nbsp;$server[6]
<!--#end if#-->
<!--#if $server[3]#-->
<table class="rssTable">
<tr>
<th>$T('article-id')</th>
<th>$T('filename')</th>
<th>$T('file-set')</th>
</tr>
<!--#set $odd = False#-->
<!--#for $thrd in $server[3]#-->
<!--#set $odd = not $odd#-->
<tr class="<!--#if $odd then "odd" else "even"#-->">
<td>$thrd[1]</td><td>$thrd[2]</td><td>$thrd[3]</td></tr>
<!--#end for#-->
</table>
<!--#end if#-->
<br/><hr/><br/>
<!--#end for#-->
<!--#else#-->
<p>$T('none')</p>
<!--#end if#-->
</div>
<div id="tabs-dashboard">

View File

@@ -18,7 +18,7 @@ After=network-online.target
[Service]
Environment="PYTHONIOENCODING=utf-8"
ExecStart=/opt/sabnzbd/SABnzbd.py --logging 1 --browser 0
ExecStart=/opt/sabnzbd/SABnzbd.py --disable-file-log --logging 1 --browser 0
User=%I
Type=simple
Restart=on-failure

View File

Binary file not shown.

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"

View File

@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
"MIME-Version: 1.0\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Danish (https://www.transifex.com/sabnzbd/teams/111101/da/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/sabnzbd/teams/111101/es/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Finnish (https://www.transifex.com/sabnzbd/teams/111101/fi/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: ION, 2020\n"
"Language-Team: Hebrew (https://www.transifex.com/sabnzbd/teams/111101/he/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Norwegian Bokmål (https://www.transifex.com/sabnzbd/teams/111101/nb/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Polish (https://www.transifex.com/sabnzbd/teams/111101/pl/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Romanian (https://www.transifex.com/sabnzbd/teams/111101/ro/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/sabnzbd/teams/111101/ru/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Serbian (https://www.transifex.com/sabnzbd/teams/111101/sr/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/sabnzbd/teams/111101/sv/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Chinese (China) (https://www.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
@@ -297,6 +297,10 @@ msgstr ""
msgid "Server address required"
msgstr ""
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -461,6 +465,16 @@ msgstr ""
msgid "Shutting down"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr ""
@@ -553,6 +567,15 @@ msgstr ""
msgid "Failed moving %s to %s"
msgstr ""
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -582,6 +605,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr ""
@@ -1100,10 +1124,6 @@ msgstr ""
msgid "%s -> Unknown encoding"
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr ""
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1509,6 +1529,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -2966,20 +2990,12 @@ msgstr ""
msgid "API Key QR Code"
msgstr ""
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr ""
#: sabnzbd/skintext.py
msgid "All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr ""
#: sabnzbd/skintext.py
msgid "You can set access rights for systems outside your local network. Requires List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3244,7 +3260,7 @@ msgid "Action when unwanted extension detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
@@ -3252,7 +3268,15 @@ msgid "Unwanted extensions"
msgstr ""
#: sabnzbd/skintext.py
msgid "List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgstr ""
#: sabnzbd/skintext.py
@@ -3600,6 +3624,18 @@ msgstr ""
msgid "Timeout"
msgstr ""
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid "Quota for this account, counted from the time it is set. In bytes, optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -3741,6 +3777,16 @@ msgstr ""
msgid "Force Download"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4509,6 +4555,10 @@ msgstr ""
msgid "View Script Log"
msgstr ""
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid "LocalStorage (cookies) are disabled in your browser, interface settings will be lost after you close the browser!"
msgstr ""

View File

@@ -4,13 +4,13 @@
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2020
# Pavel C <quoing_transifex@mess.cz>, 2020
# Pavel C <quoing_transifex@mess.cz>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Pavel C <quoing_transifex@mess.cz>, 2020\n"
"Last-Translator: Pavel C <quoing_transifex@mess.cz>, 2021\n"
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -63,15 +63,15 @@ msgstr "Nalezen UNRAR verze %s, doporučujeme verzi %s nebo vyšší. <br />"
#. Error message
#: SABnzbd.py
msgid "unrar binary... NOT found"
msgstr "Program unrar... nenalezeno!"
msgstr "Program unrar... nenalezen!"
#: SABnzbd.py
msgid "7za binary... NOT found!"
msgstr "Program 7za... nenalezeno!"
msgstr "Program 7za... nenalezen!"
#: SABnzbd.py
msgid "unzip binary... NOT found!"
msgstr "Program unizip... nenalezeno!"
msgstr "Program unizip... nenalezen!"
#. Error message
#: SABnzbd.py
@@ -318,6 +318,10 @@ msgstr "%s není validní emailová adresa"
msgid "Server address required"
msgstr "Adresa serveru je vyžadována"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -483,12 +487,22 @@ msgstr ""
#. Error message
#: sabnzbd/downloader.py
msgid "Suspect error in downloader"
msgstr ""
msgstr "Nejspíše chyba downloaderu"
#: sabnzbd/downloader.py, sabnzbd/skintext.py
msgid "Shutting down"
msgstr "Vypínání"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Připojení k poštovnímu serveru se nezdařilo"
@@ -565,7 +579,7 @@ msgstr "Nelze vytvořit adresář %s"
#: sabnzbd/filesystem.py
msgid "%s directory: %s error accessing"
msgstr ""
msgstr "Adresář %s: chyba přístupu k %s"
#. Error message
#: sabnzbd/filesystem.py
@@ -582,9 +596,18 @@ msgstr "Chyba vytváření (%s)"
msgid "Failed moving %s to %s"
msgstr "Chyba přesunu %s do %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
msgstr "Odmítnuté spojení s hostem \"%s\" z:"
#: sabnzbd/interface.py
msgid "User logged in to the web interface"
@@ -623,6 +646,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Přihlášené selhalo, zkontrolujte jméno a heslo."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Nezdařený pokus o přihlášení od %s"
@@ -648,6 +672,7 @@ msgstr ""
#: sabnzbd/interface.py
msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address."
msgstr ""
"Upozornění: LOCALHOST je nejednoznačný, použijte numerickou IP adresu."
#: sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
@@ -656,7 +681,7 @@ msgstr "Adresa serveru \"%s:%s\" není správná."
#. Config->RSS, tab header
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "Feed"
msgstr ""
msgstr "Kanál"
#: sabnzbd/interface.py
msgid "Daily"
@@ -696,7 +721,7 @@ msgstr "vypnuto"
#: sabnzbd/interface.py
msgid "Undefined server!"
msgstr ""
msgstr "Nedefinovaný server!"
#: sabnzbd/interface.py
msgid ""
@@ -729,7 +754,7 @@ msgstr "m"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Update Available!"
msgstr ""
msgstr "Dostupná aktualizace!"
#. Error message
#: sabnzbd/misc.py
@@ -828,7 +853,7 @@ msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking"
msgstr ""
msgstr "Rozbaluji"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, unable to find %s"
@@ -837,44 +862,45 @@ msgstr ""
#. Warning message
#: sabnzbd/newsunpack.py
msgid "ERROR: unable to find \"%s\""
msgstr ""
msgstr "CHYBA: nepodařilo se najít \"%s\""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, CRC error"
msgstr ""
msgstr "Rozbalování selhalo, CRC chyba"
#. Warning message
#: sabnzbd/newsunpack.py
msgid "ERROR: CRC failed in \"%s\""
msgstr ""
msgstr "CHYBA: CRC selhalo pro \"%s\""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, file too large for filesystem (FAT?)"
msgstr ""
"Rozbalování selhalo, soubor je příliš velký pro souborový systém (FAT?)"
#. Error message
#: sabnzbd/newsunpack.py
msgid "ERROR: File too large for filesystem (%s)"
msgstr ""
msgstr "CHYBA: Soubor je příliš velký pro souborový systém (%s)"
#. Error message
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, write error or disk is full?"
msgstr ""
msgstr "Rozbalování selhalo, chyba zápisu nebo plný disk?"
#. Error message
#: sabnzbd/newsunpack.py
msgid "ERROR: write error (%s)"
msgstr ""
msgstr "CHYBA: chyba zápisu (%s)"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr ""
msgstr "Rozbalování selhalo, cesta k souboru je příliš dlouhá."
#. Error message
#: sabnzbd/newsunpack.py
msgid "ERROR: path too long (%s)"
msgstr ""
msgstr "CHYBA: cesta k souboru je příliš dlouhá (%s)"
#: sabnzbd/newsunpack.py
msgid "ERROR: %s"
@@ -903,7 +929,7 @@ msgstr ""
#: sabnzbd/newsunpack.py
msgid "Trying 7zip with password \"%s\""
msgstr ""
msgstr "Zkouším 7zip s heslem \"%s\""
#: sabnzbd/newsunpack.py
msgid "7ZIP set \"%s\" is incomplete, cannot unpack"
@@ -911,11 +937,11 @@ msgstr ""
#: sabnzbd/newsunpack.py
msgid "Could not unpack %s"
msgstr ""
msgstr "Nelze robalit %s"
#: sabnzbd/newsunpack.py
msgid "Quick Checking"
msgstr ""
msgstr "Rychlá kontrola"
#. PP phase "repair"
#: sabnzbd/newsunpack.py, sabnzbd/skintext.py
@@ -982,7 +1008,7 @@ msgstr "Opravuji"
#: sabnzbd/newsunpack.py
msgid "[%s] Repaired in %s"
msgstr ""
msgstr "[%s] opraveno v %s"
#: sabnzbd/newsunpack.py
msgid "Verifying repair"
@@ -1024,11 +1050,11 @@ msgstr ""
#: sabnzbd/newswrapper.py
msgid "Certificate not valid. This is most probably a server issue."
msgstr ""
msgstr "Certifikát není validní. Pravděpodobně chyba serveru."
#: sabnzbd/newswrapper.py
msgid "Server %s uses an untrusted certificate [%s]"
msgstr ""
msgstr "Server %s používá nedůvěryhodný certifikát [%s]"
#. Main menu item
#: sabnzbd/newswrapper.py, sabnzbd/skintext.py
@@ -1162,10 +1188,6 @@ msgstr "NZB přidáno do fronty"
msgid "%s -> Unknown encoding"
msgstr "%s -> Neznámé kódování"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr ""
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1188,7 +1210,7 @@ msgstr "Ignoruji duplikátní NZB \"%s\""
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Failing duplicate NZB \"%s\""
msgstr ""
msgstr "Nezdařilo se duplikovat NZB \"%s\""
#. Warning message
#: sabnzbd/nzbstuff.py
@@ -1203,7 +1225,7 @@ msgstr "Pozastavuji duplikátní NZB \"%s\""
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Unwanted Extension in file %s (%s)"
msgstr ""
msgstr "Nechtěná přípona v souboru %s (%s)"
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
@@ -1216,11 +1238,11 @@ msgstr "Chyba při importu %s"
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
msgid "DUPLICATE"
msgstr ""
msgstr "DUPLIKÁT"
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
msgid "ENCRYPTED"
msgstr ""
msgstr "ŠIFROVANÉ"
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
msgid "TOO LARGE"
@@ -1244,16 +1266,16 @@ msgstr "ČEKÁNÍ %s s"
#: sabnzbd/nzbstuff.py
msgid "PROPAGATING %s min"
msgstr ""
msgstr "PROPAGUJI %s min"
#: sabnzbd/nzbstuff.py
msgid "Downloaded in %s at an average of %sB/s"
msgstr ""
msgstr "Staženo do %s s průměrnou rychlostí %s B/s"
#. Job details page, file age column header
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
msgid "Age"
msgstr ""
msgstr "Stáří"
#: sabnzbd/nzbstuff.py
msgid "%s articles were malformed"
@@ -1309,7 +1331,7 @@ msgstr "minuta"
#. #: Config->Scheduler
#: sabnzbd/osxmenu.py, sabnzbd/skintext.py
msgid "Scan watched folder"
msgstr ""
msgstr "Zkontrolovat sledovanou složku"
#: sabnzbd/osxmenu.py, sabnzbd/sabtray.py, sabnzbd/sabtraylinux.py
msgid "Read all RSS feeds"
@@ -1347,7 +1369,7 @@ msgstr ""
#: sabnzbd/osxmenu.py
msgid "Empty"
msgstr ""
msgstr "Prázdný"
#: sabnzbd/osxmenu.py
msgid "History Last 10 Items"
@@ -1359,7 +1381,7 @@ msgstr ""
#: sabnzbd/osxmenu.py
msgid "Stopping..."
msgstr ""
msgstr "Zastavuji..."
#: sabnzbd/panic.py
msgid "Problem with"
@@ -1578,6 +1600,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3076,23 +3102,12 @@ msgstr "Generovat nový klíč"
msgid "API Key QR Code"
msgstr ""
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3388,16 +3403,25 @@ msgid "Action when unwanted extension detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr ""
#: sabnzbd/skintext.py
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
#: sabnzbd/skintext.py
@@ -3764,6 +3788,21 @@ msgstr ""
msgid "Timeout"
msgstr ""
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -3911,6 +3950,16 @@ msgstr ""
msgid "Force Download"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4689,6 +4738,10 @@ msgstr ""
msgid "View Script Log"
msgstr ""
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Danish (https://www.transifex.com/sabnzbd/teams/111101/da/)\n"
@@ -321,6 +321,10 @@ msgstr "%s er ikke en godkendt e-mail adresse"
msgid "Server address required"
msgstr "Kræver serveradresse"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -490,6 +494,16 @@ msgstr "Suspect fejl i downloader"
msgid "Shutting down"
msgstr "Påbegynder lukning af SABnzbd"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Det lykkedes ikke at tilslutte mailserver"
@@ -593,6 +607,15 @@ msgstr "Oprettelse af (%s) mislykkedes"
msgid "Failed moving %s to %s"
msgstr "Det lykkedes ikke at flytte %s til %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -634,6 +657,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Godkendelse mislykkedes, kontrollere brugernavn/adgangskode."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Mislykkede login forsøg fra %s"
@@ -1173,10 +1197,6 @@ msgstr "NZB tilføjet i køen"
msgid "%s -> Unknown encoding"
msgstr "%s -> Ukendt kodning"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => mangler fra alle servere, afviser"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1617,6 +1637,10 @@ msgstr "RAR filer kontrolleres med succes"
msgid "RAR files failed to verify"
msgstr "RAR filer kunne ikke bekræfte"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3135,28 +3159,13 @@ msgstr "Generere Ny Nøgle"
msgid "API Key QR Code"
msgstr "API nøgle QR kode"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Liste over lokale netværk intervaller"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Alle lokale netværksadresser starter med disse præfikser (ofte "
"\"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Eksterne internetadgang"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
"Du kan angive adgangsrettigheder for systemer uden for dit lokale netværk. "
"Kræver liste over lokale netværks intervaller, skal defineres."
#: sabnzbd/skintext.py
msgid "No access"
@@ -3477,18 +3486,26 @@ msgid "Action when unwanted extension detected"
msgstr "Aktion når uønsket extension er fundet"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Aktion når uønsket extension er fundet i RAR fil"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Uønsket extension"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Vis alle uønskede extensions. For eksempel: <b>exe</b> or <b>exe, com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3869,6 +3886,21 @@ msgstr "Adgangskode"
msgid "Timeout"
msgstr "Tidsudløb"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4021,6 +4053,16 @@ msgstr "Læs Feed"
msgid "Force Download"
msgstr "Gennemtving download"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4809,6 +4851,10 @@ msgstr "Skjul/vis komplette filer"
msgid "View Script Log"
msgstr "Vis scriptlog"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -3,17 +3,17 @@
# team@sabnzbd.org
#
# Translators:
# N S <reloxx@interia.pl>, 2020
# Safihre <safihre@sabnzbd.org>, 2020
# C E <githubce@eiselt.ch>, 2020
# Nikolai Bohl <n.kay01@gmail.com>, 2020
# hotio, 2020
# reloxx13 <reloxx@interia.pl>, 2021
# Ben Hecht <benjamin.hecht@me.com>, 2021
# Safihre <safihre@sabnzbd.org>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: hotio, 2020\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2021\n"
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -333,6 +333,10 @@ msgstr "%s ist keine gültige E-Mail-Adresse"
msgid "Server address required"
msgstr "Server-Adresse wird benötigt"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr "%s ist kein gültiges Script"
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -510,6 +514,16 @@ msgstr "Vermute Fehler im Downloader"
msgid "Shutting down"
msgstr "Wird beendet …"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr "Server %s läuft in %s tag(en) ab"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr "Server %s hat die angegebene Quote verbraucht"
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Verbindung zum Mail-Server konnte nicht hergestellt werden"
@@ -615,6 +629,15 @@ msgstr "Erstellen von %s fehlgeschlagen"
msgid "Failed moving %s to %s"
msgstr "Verschieben von %s nach %s fehlgeschlagen"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr "Versuch das Verzeichnis %s zu erstellen wurde blockiert"
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr "Abgelehnte Verbindung von:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Verbindung vom Host \"%s\" abgelehnt von:"
@@ -657,6 +680,7 @@ msgid "Authentication failed, check username/password."
msgstr ""
"Authentifizierung fehlgeschlagen. Überprüfen Sie Benutzername und Passwort."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Fehlerhafter Login Versuch von %s"
@@ -776,7 +800,7 @@ msgstr "Neue Version verfügbar!"
#. Error message
#: sabnzbd/misc.py
msgid "Failed to upload file: %s"
msgstr "Hochladen der Datei %s fehlgeschlagen"
msgstr "Hochladen fehlgeschlagen: %s"
#. Error message
#: sabnzbd/misc.py
@@ -796,7 +820,7 @@ msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Failed to read the password file %s"
msgstr "Konnte die Passwortdatei %s nicht lesen"
msgstr "Die Passwortdatei %s konnte nicht gelesen werden"
#. Error message
#: sabnzbd/misc.py
@@ -1211,10 +1235,6 @@ msgstr "NZB zur Warteschlange hinzugefügt"
msgid "%s -> Unknown encoding"
msgstr "%s -> Unbekannte Kodierung"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s wurde auf keinem Server gefunden und daher übersprungen"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1670,6 +1690,10 @@ msgstr "RAR-Datei erfolgreich überprüft"
msgid "RAR files failed to verify"
msgstr "RAR-Datei konnten nicht überprüft werden"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -2163,7 +2187,7 @@ msgstr "Dieser Monat"
#: sabnzbd/skintext.py
msgid "Selected date range"
msgstr ""
msgstr "Ausgewählter Datumsbereich"
#: sabnzbd/skintext.py
msgid "Today"
@@ -3033,6 +3057,9 @@ msgid ""
"Modern web browsers and other clients will not accept self-signed "
"certificates and will give a warning and/or won't connect at all."
msgstr ""
"Moderne Webbrowser und andere Clients akzeptieren keine selbstsignierten "
"Zertifikate und geben eine Warnung aus und/oder stellen gar keine Verbindung"
" her."
#: sabnzbd/skintext.py
msgid "HTTPS Port"
@@ -3212,28 +3239,14 @@ msgstr "Neuen Schlüssel generieren"
msgid "API Key QR Code"
msgstr "API-Key OR-Code"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Liste der lokalen Netzwerkadressenbereiche"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Alle lokalen Netzwerkadressen starten mit diesen Präfixen (oft "
"\"192.168.1.1\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Externer Internetzugriff"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
"Du kannst Zugriffsrechte für Systeme ausserhalb deines Netzwerkes setzen. "
"Benötigt die Definition einer Liste von lokalen Netzwerkbereichen."
"Du kannst Zugriffsrechte für Systeme ausserhalb deines Netzwerkes setzen."
#: sabnzbd/skintext.py
msgid "No access"
@@ -3319,11 +3332,13 @@ msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
msgstr "Minimaler freier Speicherplatz im Download Ordner"
#: sabnzbd/skintext.py
msgid "Will not work if a category folder is on a different disk."
msgstr ""
"Funktioniert nicht, wenn sich der Kategorie Ordner auf einer anderen "
"Festplatte befindet."
#. Auto-resume download on the reset day
#: sabnzbd/skintext.py
@@ -3336,6 +3351,9 @@ msgid ""
" again.<br />Applies to both the Temporary and Complete Download Folder.<br "
"/>Checked every few minutes."
msgstr ""
"Das Herunterladen wird automatisch fortgesetzt, wenn der minimale freie Speicherplatz wieder verfügbar ist. <br />\n"
"Gilt sowohl für den temporären als auch für den Download Ordner.<br />\n"
"Wird alle paar Minuten überprüft."
#: sabnzbd/skintext.py
msgid "Permissions for completed downloads"
@@ -3567,19 +3585,26 @@ msgid "Action when unwanted extension detected"
msgstr "Aktion bei ungewollter Dateienendung"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Aktion bei ungewollter Dateiendung innerhalb RAR-Archiven"
msgid "Action when an unwanted extension is detected"
msgstr "Aktion bei ungewollter Dateienendung"
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Ungewollte Dateiendungen"
#: sabnzbd/skintext.py
msgid "Blacklist"
msgstr "Blacklist"
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr "Whitelist"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Liste aller ungewollter Dateiendungen. Zum Beispiel: <b>exe</b> or <b>exe, "
"com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3981,6 +4006,21 @@ msgstr "Passwort"
msgid "Timeout"
msgstr "Zeitüberschreitung"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4076,11 +4116,11 @@ msgstr "Persönliche Notizen"
#: sabnzbd/skintext.py
msgid "Article availability"
msgstr ""
msgstr "Verfügbarkeit der Artikel"
#: sabnzbd/skintext.py
msgid "%f% available of %d requested articles"
msgstr ""
msgstr "%f vorhanden von %d angefragten Artikeln"
#. Config->Scheduling
#: sabnzbd/skintext.py
@@ -4134,6 +4174,16 @@ msgstr "Feed lesen"
msgid "Force Download"
msgstr "Download erzwingen"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr "Bearbeiten"
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr "Nächster scan um"
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4840,11 +4890,11 @@ msgstr "Datumsformat"
#: sabnzbd/skintext.py
msgid "Extra queue columns"
msgstr ""
msgstr "Weitere Warteschlangen Spalten"
#: sabnzbd/skintext.py
msgid "Extra history columns"
msgstr ""
msgstr "Weitere Verlauf Spalten"
#: sabnzbd/skintext.py
msgid "page"
@@ -4926,6 +4976,10 @@ msgstr "Vollendete Dateien anzeigen/verstecken"
msgid "View Script Log"
msgstr "Skript-Protokoll anzeigen"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"
@@ -4944,7 +4998,7 @@ msgstr "Kompaktes Layout"
#: sabnzbd/skintext.py
msgid "Always use full screen width"
msgstr ""
msgstr "Benutze die volle Fensterbreite"
#: sabnzbd/skintext.py
msgid "Tabbed layout <br/>(separate queue and history)"

View File

@@ -9,7 +9,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: 1024mb <angelb2203@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/sabnzbd/teams/111101/es/)\n"
@@ -335,6 +335,10 @@ msgstr "%s no es una dirección de correo electrónico válida."
msgid "Server address required"
msgstr "Se necesita la dirección del servidor"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -510,6 +514,16 @@ msgstr "Error sospechoso en downloader"
msgid "Shutting down"
msgstr "Apagando"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "No se pudo conectar al servidor de correo"
@@ -614,6 +628,15 @@ msgstr "Error al crear (%s)"
msgid "Failed moving %s to %s"
msgstr "Error al mover %s a %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Se deniega la conexión con el nombre de equipo \"%s\" desde:"
@@ -655,6 +678,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Autenticación fallida, compruebe el usuario o la contraseña."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Intento fallido de inicio de sesión desde %s"
@@ -1216,10 +1240,6 @@ msgstr "NZB añadido a la cola"
msgid "%s -> Unknown encoding"
msgstr "%s -> Codificación desconocida"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => faltando de todos servidores, desechando"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1671,6 +1691,10 @@ msgstr "Los archivos RAR se han verificado con éxito"
msgid "RAR files failed to verify"
msgstr "No se han podido verificar los archivos RAR"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3217,28 +3241,13 @@ msgstr "Generar nueva clave"
msgid "API Key QR Code"
msgstr "Código QR de la clave API"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Lista de rangos de red local"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Todas las direcciones de red locales comienzan con estos prefijos (a menudo "
"\" 192.168.1 . \" )"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Acceso a internet externa"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
"Puede configurar los derechos de acceso para los sistemas fuera de su red "
"local. Es necesario definir los rangos de la lista de red local."
#: sabnzbd/skintext.py
msgid "No access"
@@ -3565,19 +3574,26 @@ msgid "Action when unwanted extension detected"
msgstr "Acción al detectar extensiones no deseadas"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Acción cuando se detecta una extensión no deseada en archivos RAR"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "extensiones no deseadas"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Enumerar todas las extensiones no deseadas . Por ejemplo : < b> exe < / b > "
"o < b> exe, com < / b >"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3977,6 +3993,21 @@ msgstr "Contraseña"
msgid "Timeout"
msgstr "Expiración del plazo (Timeout)"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4133,6 +4164,16 @@ msgstr "Leer Fuente"
msgid "Force Download"
msgstr "Forzar Descarga"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4927,6 +4968,10 @@ msgstr "Ocultar/Mostrar ficheros completados"
msgid "View Script Log"
msgstr "Ver bitacora de Scripts"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Finnish (https://www.transifex.com/sabnzbd/teams/111101/fi/)\n"
@@ -318,6 +318,10 @@ msgstr "%s ei ole kelvollinen sähköpostiosoite"
msgid "Server address required"
msgstr "Palvelimen osoite vaaditaan"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -486,6 +490,16 @@ msgstr "Mahdollinen virhe lataajassa"
msgid "Shutting down"
msgstr "Sammutetaan"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Postipalvelimeen yhdistäminen epäonnistui"
@@ -589,6 +603,15 @@ msgstr "Kohteen (%s) luominen epäonnistui"
msgid "Failed moving %s to %s"
msgstr "Kohteen %s siirtäminen kohteeseen %s epäonnistui"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -630,6 +653,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Varmennus epäonnistui, tarkista käyttäjänimi/salasana."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr ""
@@ -1166,10 +1190,6 @@ msgstr "NZB lisätty jonoon"
msgid "%s -> Unknown encoding"
msgstr "%s -> Tuntematon koodaus"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => puuttuu kaikilta palvelimilta, hylätään"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1610,6 +1630,10 @@ msgstr "RAR arkistot varmennettiin onnistuneesti"
msgid "RAR files failed to verify"
msgstr "RAR arkistoja ei voitu varmentaa"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3134,25 +3158,12 @@ msgstr "Luo uusi avain"
msgid "API Key QR Code"
msgstr "API avaimen QR-koodi"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Lista paikallisista verkko-osoitealueista"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Kaikki paikalliset verkko-osoitteet alkavat näillä etuliitteillä (yleensä "
"\"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Ulkoinen ohjelman käyttö"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3474,19 +3485,26 @@ msgid "Action when unwanted extension detected"
msgstr "Toiminto kun havaitaan ei toivottu tiedostopääte"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Toiminto kun ei toivottu tiedostopääte havaitaan RAR arkistossa"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Ei toivotut tiedostopäätteet"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Lista ei toivotuista tiedostopäätteistä. Esimerkiksi: <b>exe</b> tai <b>exe,"
" com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3869,6 +3887,21 @@ msgstr "Salasana"
msgid "Timeout"
msgstr "Aikakatkaisu"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4020,6 +4053,16 @@ msgstr "Lue syöte"
msgid "Force Download"
msgstr "Pakota lataus"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4810,6 +4853,10 @@ msgstr "Piilota/näytä valmistuneet tiedostot"
msgid "View Script Log"
msgstr "Näytä skriptien loki"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -4,13 +4,13 @@
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2020
# Fred L <88com88@gmail.com>, 2020
# Fred L <88com88@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2020\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2021\n"
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -336,6 +336,10 @@ msgstr "%s n'est pas une adresse email valide"
msgid "Server address required"
msgstr "Adresse du serveur requise"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr "%s n'est pas un script valide"
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -511,6 +515,16 @@ msgstr "Erreur suspecte dans le téléchargeur"
msgid "Shutting down"
msgstr "Arrêt en cours..."
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr "Le serveur %s expirera dans %s jour(s)"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr "Le serveur %s a utilisé le quota spécifié"
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Échec de connexion au serveur de messagerie"
@@ -616,6 +630,15 @@ msgstr "Échec lors de la création de (%s)"
msgid "Failed moving %s to %s"
msgstr "Échec lors du déplacement de %s vers %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr "Tentative bloquée de création du répertoire %s"
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr "Connexion refusée de:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Connexion refusée avec le nom d'hôte \"%s\" à partir de :"
@@ -657,6 +680,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Echec d'authentification, vérifiez les identifiant/mot de passe."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Echec de la tentative de connexion de %s"
@@ -1213,10 +1237,6 @@ msgstr "NZB ajouté à la file d'attente"
msgid "%s -> Unknown encoding"
msgstr "%s -> Encodage inconnu"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => absent de tous les serveurs, rejeté"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1669,6 +1689,10 @@ msgstr "Fichiers RAR vérifiés avec succès"
msgid "RAR files failed to verify"
msgstr "Echec lors de la vérification des fichiers RAR"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr "Essai avec le renommeur RAR"
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3216,28 +3240,15 @@ msgstr "Générer une nouvelle clé"
msgid "API Key QR Code"
msgstr "Clé API code QR"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Liste des plages de réseau local"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Toutes les adresses de réseau local commencent par ces préfixes (souvent "
"\"192.168.1.\" )"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Accès Internet externe"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
"Vous pouvez définir les droits d'accès pour les systèmes en dehors de votre "
"réseau local. Requiert la liste des plages de réseaux locaux à définir."
"Vous pouvez définir des droits d'accès pour les systèmes en dehors de votre "
"réseau local."
#: sabnzbd/skintext.py
msgid "No access"
@@ -3576,19 +3587,28 @@ msgid "Action when unwanted extension detected"
msgstr "Action si une extension indésirable est détecté"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Action si une extension indésirable est détecté dans les fichiers RAR"
msgid "Action when an unwanted extension is detected"
msgstr "Action lorsqu'une extension indésirable est détectée"
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Extensions indésirables"
#: sabnzbd/skintext.py
msgid "Blacklist"
msgstr "Liste noire"
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr "Liste blanche"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Afficher toutes les extensions indésirables. Par exemple : <b>exe</b> or "
"<b>exe, com</b>"
"Sélectionnez un mode et listez toutes les extensions (non) souhaitées. Par "
"exemple: <b>exe</b> ou <b>exe, com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3990,6 +4010,24 @@ msgstr "Mot de passe"
msgid "Timeout"
msgstr "Délai d'expiration"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr "Date d'expiration du compte"
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr "Avertir 5 jours avant la date d'expiration du compte."
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
"Quota pour ce compte calculé à partir du moment où il est défini. En octets,"
" éventuellement suivi de K,M,G.<br />Avertir quand il atteint 0, vérifié "
"toutes les quelques minutes."
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4146,6 +4184,16 @@ msgstr "Lire le flux RSS"
msgid "Force Download"
msgstr "Forcer le téléchargement"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr "Modifier"
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr "Prochain scan à"
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4942,6 +4990,10 @@ msgstr "Afficher/masquer les fichiers terminés"
msgid "View Script Log"
msgstr "Afficher le journal des scripts"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr "Renommer la tâche annulera la Décompression Directe."
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Norwegian Bokmål (https://www.transifex.com/sabnzbd/teams/111101/nb/)\n"
@@ -315,6 +315,10 @@ msgstr "%s er ikke en godkjent e-post-adresse"
msgid "Server address required"
msgstr "Krever server-adresse"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -482,6 +486,16 @@ msgstr "Mistenker feil i nedlaster"
msgid "Shutting down"
msgstr "Starter avslutning av SABnzbd.."
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Kunne ikke koble til mailserver"
@@ -585,6 +599,15 @@ msgstr "Opprettelse av (%s) mislyktes"
msgid "Failed moving %s to %s"
msgstr "Kunne ikke flytte %s til %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -626,6 +649,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Godkjenning mislyktes, kontroller brukernavn og passord."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Mislykket påloggingsforsøk fra %s"
@@ -1163,10 +1187,6 @@ msgstr "NZB er lagt til i køen"
msgid "%s -> Unknown encoding"
msgstr "%s -> Ukjent koding"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => mangler på alle servere, fjerner"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1607,6 +1627,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3122,24 +3146,12 @@ msgstr "Generer Ny Nøkkel"
msgid "API Key QR Code"
msgstr "API-nøkkel QR-kode"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Liste over lokale nettverksområder"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Alle lokale nettverksadresser starter med disse prefix (ofte \"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Ekstern internettilgang"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3456,19 +3468,26 @@ msgid "Action when unwanted extension detected"
msgstr "Handling når uønsket filtype oppdaget"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Handling når uønsket filtype blir oppdaget i RAR filer."
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Uønsket filtyper"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Skriv alle uønskende filtyper. For eksempel: <b>exe</b> eller <b>exe, "
"com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3845,6 +3864,21 @@ msgstr "Passord"
msgid "Timeout"
msgstr "Tidsavbrudd"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -3996,6 +4030,16 @@ msgstr "Les kilde"
msgid "Force Download"
msgstr "Tving nedlasting"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4781,6 +4825,10 @@ msgstr "Skjul/vis fullførte filer"
msgid "View Script Log"
msgstr "Se skriptlogg"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -3,13 +3,13 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2020
# Safihre <safihre@sabnzbd.org>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2021\n"
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -327,6 +327,10 @@ msgstr "%s is geen geldig e-mailadres"
msgid "Server address required"
msgstr "Serveradres verplicht"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr "%s is geen geldig script."
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -502,6 +506,16 @@ msgstr "Vedachte fout in downloader"
msgid "Shutting down"
msgstr "Afsluiten"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr "Server %s verloopt over %s dag(en)."
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr "Het beschikbare quotum voor server %s is verbruikt. "
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Verbinding met e-mailserver mislukt"
@@ -605,6 +619,15 @@ msgstr "Aanmaken (%s) mislukt"
msgid "Failed moving %s to %s"
msgstr "Verplaatsen van %s naar %s mislukt"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr "Poging om map %s aan te maken geblokkeerd"
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr "Verbinding geweigerd van: "
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Verbinding met hostnaam \"%s\" geweigerd van:"
@@ -646,6 +669,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Inloggen mislukt, controleer gebruikersnaam en wachtwoord."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Mislukte login progin bij %s"
@@ -1195,10 +1219,6 @@ msgstr "Download aan wachtrij toegevoegd"
msgid "%s -> Unknown encoding"
msgstr "%s -> Onbekende codering"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => ontbreekt op alle servers, overslaan"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1644,6 +1664,10 @@ msgstr "RAR bestanden zijn succesvol geverifieerd"
msgid "RAR files failed to verify"
msgstr "RAR bestanden zijn niet verifieerbaar"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr "RAR-hernoeming wordt geprobeerd"
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3186,28 +3210,14 @@ msgstr "Maak een nieuwe sleutel"
msgid "API Key QR Code"
msgstr "QR-code van de API-sleutel"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Lijst van lokale netwerk bereiken"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Alle lokale netwerk adressen die beginnen met deze reeks (vaak "
"\"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Externe toegang"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
"Je kunt toegangsrechten instellen voor systemen buiten je lokale netwerk. "
"Hiervoor geef je een lijst van netwerk-bereiken in."
#: sabnzbd/skintext.py
msgid "No access"
@@ -3285,11 +3295,11 @@ msgstr "(kan aangepast worden door de categorieën)."
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
msgstr "Minimale vrije ruimte voor verwerkte downloads map"
#: sabnzbd/skintext.py
msgid "Will not work if a category folder is on a different disk."
msgstr ""
msgstr "Werkt niet als een categorie-pad naar een andere schijf verwijst."
#. Auto-resume download on the reset day
#: sabnzbd/skintext.py
@@ -3302,6 +3312,9 @@ msgid ""
" again.<br />Applies to both the Temporary and Complete Download Folder.<br "
"/>Checked every few minutes."
msgstr ""
"Het downloaden zal automatisch hervat worden als de minimale vrije ruimte "
"weer beschikbaar is.<br />Is van toepassing op zowel de tijdelijke als "
"verwerkte download map.<br />Wordt elke paar minuten gecontroleerd."
#: sabnzbd/skintext.py
msgid "Permissions for completed downloads"
@@ -3530,20 +3543,28 @@ msgid "Action when unwanted extension detected"
msgstr "Actie bij ontdekken van ongewenste extensie"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr ""
"Actie wanneer een ongewenste extensie wordt gevonden in een RAR-bestand"
msgid "Action when an unwanted extension is detected"
msgstr "Actie bij ontdekken van een ongewenste extensie"
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Ongewenste extensies"
#: sabnzbd/skintext.py
msgid "Blacklist"
msgstr "Blacklist"
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr "Whitelist"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Lijst van alle ongewenste extensies. Voorbeeld: <b>exe</b> or <b>exe, "
"com</b>"
"Kies een stand en voer een lijst van alle (on)gewenste extensies in. "
"Voorbeeld: <b>exe</b> or <b>exe, com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3939,6 +3960,25 @@ msgstr "Wachtwoord"
msgid "Timeout"
msgstr "Tijdslimiet"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr "Verloopdatum"
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr "Ontvang 5 dagen voor de verloopdatum een waarschuwing."
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
"Quotum voor dit account, wordt geteld vanaf het moment dat het voor het "
"eerst ingesteld wordt. In bytes, in K,M,G notatie.<br />Er wordt een "
"waarschuwing gegeven als het quotum bereikt is, dit wordt elke paar minuten "
"gecontroleerd."
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4095,6 +4135,16 @@ msgstr "Uitlezen"
msgid "Force Download"
msgstr "Forceer download"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr "Wijzigen"
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr "Wordt uitgevoerd om"
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4887,6 +4937,10 @@ msgstr "Toon/verberg voltooide bestanden"
msgid "View Script Log"
msgstr "Toon Script resultaat"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr "Als je de naam wijzigt zal het Direct Uitpakken gestopt worden."
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Polish (https://www.transifex.com/sabnzbd/teams/111101/pl/)\n"
@@ -310,6 +310,10 @@ msgstr "%s nie jest prawidłowym adresem email"
msgid "Server address required"
msgstr "Wymagane jest podanie adresu serwera"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -479,6 +483,16 @@ msgstr "Nieobsługiwany błąd w module pobierania"
msgid "Shutting down"
msgstr "Wyłączanie"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Błąd połączenia z serwerem pocztowym"
@@ -584,6 +598,15 @@ msgstr "Nie udało się utworzyć (%s)"
msgid "Failed moving %s to %s"
msgstr "Nie udało się przenieść %s do %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -625,6 +648,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Błąd połączenia, sprawdź nazwę użytkownika i hasło."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr ""
@@ -1164,10 +1188,6 @@ msgstr "NZB dodany do kolejki"
msgid "%s -> Unknown encoding"
msgstr "%s -> Nieznane kodowanie"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => nie znaleziono na żadnym serwerze, porzucam"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1612,6 +1632,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3125,25 +3149,12 @@ msgstr "Utwórz nowy klucz"
msgid "API Key QR Code"
msgstr "Kod QR klucza API"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Lista zakresów sieci lokalnych"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Wszystkie lokalne adresy sieciowe zaczynają się od tych prefiksów (często "
"\"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Dostęp z zewnątrz"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3462,20 +3473,26 @@ msgid "Action when unwanted extension detected"
msgstr "Działanie dla niepożądanych rozszerzeń"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgid "Action when an unwanted extension is detected"
msgstr ""
"Działanie, które zostanie podjęte po wykryciu w pliku RAR niepożądanego "
"rozszerzenia"
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Niepożądane rozszerzenia"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Lista niepożądanych rozszerzeń. Przykład: <b>exe</b> lub <b>exe, com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3855,6 +3872,21 @@ msgstr "Hasło"
msgid "Timeout"
msgstr "Limit czasu odpowiedzi"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4006,6 +4038,16 @@ msgstr "Pobierz kanał"
msgid "Force Download"
msgstr "Wymuś pobranie"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4791,6 +4833,10 @@ msgstr "Pokaż/ukryj ukończone pliki"
msgid "View Script Log"
msgstr "Zobacz log skryptu"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
@@ -314,6 +314,10 @@ msgstr "%s não é um endereço de e-mail válido"
msgid "Server address required"
msgstr "Endereço do servidor necessário"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -485,6 +489,16 @@ msgstr "Erro suspeito no downloader"
msgid "Shutting down"
msgstr "Encerrando"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Falha ao conectar ao servidor de e-mail"
@@ -588,6 +602,15 @@ msgstr "Falha ao criar (%s)"
msgid "Failed moving %s to %s"
msgstr "Falha ao mover %s para %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -629,6 +652,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Falha de autenticação, verifique usuário / senha."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr ""
@@ -1165,10 +1189,6 @@ msgstr "NZB adicionado à fila"
msgid "%s -> Unknown encoding"
msgstr "%s -> Codificação desconhecida"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => faltando em todos os servidores. Descartando"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1614,6 +1634,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3130,25 +3154,12 @@ msgstr "Gerar Nova Chave"
msgid "API Key QR Code"
msgstr "API Key QR Code"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Lista de intervalos de rede local"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Todas os endereços da rede local começam com esse prefixo (geralmente "
"\"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Acesso externo da Internet"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3466,19 +3477,26 @@ msgid "Action when unwanted extension detected"
msgstr "Ação quando extensão indesejada for detectada"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Ação quando uma extensão indesejada é detectada em arquivos RAR"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Extensões indesejadas"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Lista todas as extensões indesejadas. Por exemplo: <b>exe</b> ou <b>exe, "
"com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3858,6 +3876,21 @@ msgstr "Senha"
msgid "Timeout"
msgstr "Tempo limite"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4009,6 +4042,16 @@ msgstr "Ler Feed"
msgid "Force Download"
msgstr "Forçar Download"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4794,6 +4837,10 @@ msgstr "Esconder/Exibir arquivos completos"
msgid "View Script Log"
msgstr "Exibir Log do Script"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Eduard Baniceru <war4peace@gmail.com>, 2021\n"
"Language-Team: Romanian (https://www.transifex.com/sabnzbd/teams/111101/ro/)\n"
@@ -326,6 +326,10 @@ msgstr "%s nu este o adresă email validă"
msgid "Server address required"
msgstr "Adresă server necesară"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -499,6 +503,16 @@ msgstr "Eroare suspectă în sistemul de descprcare"
msgid "Shutting down"
msgstr "Închidere"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Conectare server mail nereuşită"
@@ -602,6 +616,15 @@ msgstr "Facere nereuşită (%s)"
msgid "Failed moving %s to %s"
msgstr "Mutare %s în %s nereuşită"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Conectare refuzată cu gazda „%s” de la:"
@@ -643,6 +666,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Autentificare nereuşită, verifică nume utilizator/parolă."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "Încercare de conectare nereușită de la %s"
@@ -1191,10 +1215,6 @@ msgstr "NZB adăugat în coadă"
msgid "%s -> Unknown encoding"
msgstr "%s -> Codificare Necunoscută"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => lipsă de pe toate serverele, ignorare"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1643,6 +1663,10 @@ msgstr "Fișierele RAR verificate cu succes"
msgid "RAR files failed to verify"
msgstr "Verificarea fișierelor RAR a eșuat"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3157,23 +3181,12 @@ msgstr "Generează o Cheie Nouă"
msgid "API Key QR Code"
msgstr "Cheie API sau Cod QR"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Listă de rețele locale"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr "Toate rețelele locale încep cu acest prefixe (de regulă \"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Acces extern la internet"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3490,19 +3503,26 @@ msgid "Action when unwanted extension detected"
msgstr "Acțiune când se detectează o extensie nedorită"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Acțiune când se detectează extensie nedorită într-un fișier RAR"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Extensii nedorite"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Listă cu toate extensiile nedorite. De exemplu: <b>exe</b> or <b>exe, "
"com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3883,6 +3903,21 @@ msgstr "Parolă"
msgid "Timeout"
msgstr "Timp Expirare"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -4035,6 +4070,16 @@ msgstr "Citeşte Flux"
msgid "Force Download"
msgstr "Descărcare Forţată"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4818,6 +4863,10 @@ msgstr "Ascunde/arată fișierele finalizate"
msgid "View Script Log"
msgstr "Vezi Jurnal Script"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/sabnzbd/teams/111101/ru/)\n"
@@ -314,6 +314,10 @@ msgstr "%s не является допустимым адресом элект
msgid "Server address required"
msgstr "Требуется адрес сервера"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -481,6 +485,16 @@ msgstr ""
msgid "Shutting down"
msgstr "Завершение работы"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Не удалось подключиться к почтовому серверу"
@@ -584,6 +598,15 @@ msgstr "Не удалось создать (%s)"
msgid "Failed moving %s to %s"
msgstr "Не удалось переместить %s в %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -625,6 +648,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Ошибка проверки подлинности. Проверьте имя и пароль."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr ""
@@ -1165,10 +1189,6 @@ msgstr "NZB-файл добавлен в очередь"
msgid "%s -> Unknown encoding"
msgstr "%s -> неизвестная кодировка"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => отсутствует на всех серверах, отброшен"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1611,6 +1631,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3123,23 +3147,12 @@ msgstr "Создать новый ключ"
msgid "API Key QR Code"
msgstr "QR-код ключа API"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3458,16 +3471,25 @@ msgid "Action when unwanted extension detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr ""
#: sabnzbd/skintext.py
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
#: sabnzbd/skintext.py
@@ -3843,6 +3865,21 @@ msgstr "Пароль"
msgid "Timeout"
msgstr "Время ожидания"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -3994,6 +4031,16 @@ msgstr "Прочитать ленту"
msgid "Force Download"
msgstr "Загрузить принудительно"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4784,6 +4831,10 @@ msgstr ""
msgid "View Script Log"
msgstr "Просмотреть журнал сценария"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Serbian (https://www.transifex.com/sabnzbd/teams/111101/sr/)\n"
@@ -312,6 +312,10 @@ msgstr "%s nije ispravna email adresa"
msgid "Server address required"
msgstr "Потребна је адреса сервера"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -480,6 +484,16 @@ msgstr "Sumnja u grešku u programu za download"
msgid "Shutting down"
msgstr "Гашење"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Неуспешно привезивање на сервер е-поште"
@@ -583,6 +597,15 @@ msgstr "Neuspešno kreiranje (%s)"
msgid "Failed moving %s to %s"
msgstr "Neuspešno premeštanje %s u %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -622,6 +645,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Аутентификација погрешна, проверити име/лозинку."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr ""
@@ -1159,10 +1183,6 @@ msgstr "NZB додат у ред"
msgid "%s -> Unknown encoding"
msgstr "%s -> Непознато енкодирање"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => фали на свим серверима, одбацивање"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1603,6 +1623,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3110,25 +3134,12 @@ msgstr "Генериши нов кључ"
msgid "API Key QR Code"
msgstr "QR Код АПИ кључа"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Lista lokalnih mrežnih raspona"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Sve lokalne mrežne adrese počinju sa sledećim prefiksima (najčešće "
"\"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Екстерни приступ интернету"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3446,18 +3457,26 @@ msgid "Action when unwanted extension detected"
msgstr "Radnja kada je otkrivena neželjena ekstenzija"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Radnja kada je otkrivena neželjena ekstenzija u RAR datotekama"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Neželjene ekstenzije"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Lista svih neželjenih ekstenzija. Na primer: <b>exe</b> or <b>exe, com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3832,6 +3851,21 @@ msgstr "Лозинка"
msgid "Timeout"
msgstr "Време истекло"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -3982,6 +4016,16 @@ msgstr "Читај фид"
msgid "Force Download"
msgstr "Натерај преузимање"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4766,6 +4810,10 @@ msgstr "Sakrij/prikaži sve završene datoteke"
msgid "View Script Log"
msgstr "Види извештај скрипта"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/sabnzbd/teams/111101/sv/)\n"
@@ -312,6 +312,10 @@ msgstr "%s är inte en godkänd e-mail adress"
msgid "Server address required"
msgstr "Kräver serveradress"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -480,6 +484,16 @@ msgstr "Misstänker fel i nedladdare"
msgid "Shutting down"
msgstr "Påbörjar nedstängning av SABnzbd.."
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "Det gick inte att ansluta till mailserver"
@@ -583,6 +597,15 @@ msgstr "Skapande av (%s) misslyckades"
msgid "Failed moving %s to %s"
msgstr "Det gick inte att flyta %s till %s"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -624,6 +647,7 @@ msgstr ""
msgid "Authentication failed, check username/password."
msgstr "Autentisering misslyckades, kontrollera användarnamn och lösenord."
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr ""
@@ -1163,10 +1187,6 @@ msgstr "NZB tillagd i kön"
msgid "%s -> Unknown encoding"
msgstr "%s -> Okänd kodning"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => saknas från alla servrar, kastar"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1609,6 +1629,10 @@ msgstr ""
msgid "RAR files failed to verify"
msgstr ""
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3121,25 +3145,12 @@ msgstr "Generera Ny Nyckel"
msgid "API Key QR Code"
msgstr "API- eller QR-kod"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "Lista av lokala nätverksomfång"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr ""
"Alla lokala nätverksadresser startar med dessa prefixer (ofta "
"\"192.168.1.\")"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "Extern internetåtkomst"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
@@ -3455,18 +3466,26 @@ msgid "Action when unwanted extension detected"
msgstr "Händelse när oönskad filändelse hittad"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "Händelse när en oönskad filändelse är hittad i RAR-filer."
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "Oönskade filändelser"
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
"Lista alla oönskade filändelser. Till Exempel: <b>exe</b> or <b>exe, com</b>"
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3844,6 +3863,21 @@ msgstr "Lösenord"
msgid "Timeout"
msgstr "Tidsgräns"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -3995,6 +4029,16 @@ msgstr "Läs flöde"
msgid "Force Download"
msgstr "Tvinga nedladdning"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4778,6 +4822,10 @@ msgstr "Visa/göm färdiga filer"
msgid "View Script Log"
msgstr "Visa skriptlogg"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.2.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Chinese (China) (https://www.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
@@ -310,6 +310,10 @@ msgstr "%s 不是有效的电子邮箱地址"
msgid "Server address required"
msgstr "服务器地址必填"
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -477,6 +481,16 @@ msgstr "下载器疑似错误"
msgid "Shutting down"
msgstr "正在关闭"
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s is expiring in %s day(s)"
msgstr ""
#. Warning message
#: sabnzbd/downloader.py
msgid "Server %s has used the specified quota"
msgstr ""
#: sabnzbd/emailer.py
msgid "Failed to connect to mail server"
msgstr "无法连接到邮件服务器"
@@ -580,6 +594,15 @@ msgstr "创建失败 (%s)"
msgid "Failed moving %s to %s"
msgstr "将 %s 移动到 %s 失败"
#. Error message
#: sabnzbd/filesystem.py
msgid "Blocked attempt to create directory %s"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
@@ -615,6 +638,7 @@ msgstr "缺身份认证信息,请在第三方程序中输入“配置”->“
msgid "Authentication failed, check username/password."
msgstr "身份认证失败,请检查用户名/密码。"
#. Warning message
#: sabnzbd/interface.py
msgid "Unsuccessful login attempt from %s"
msgstr "%s 中有失败的登陆请求"
@@ -1149,10 +1173,6 @@ msgstr "NZB 已添加到队列"
msgid "%s -> Unknown encoding"
msgstr "%s -> 未知编码"
#: sabnzbd/nzbstuff.py
msgid "%s => missing from all servers, discarding"
msgstr "%s => 所有服务器均缺失,正在舍弃"
#. Warning message
#: sabnzbd/nzbstuff.py
msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)"
@@ -1593,6 +1613,10 @@ msgstr "RAR 文件验证成功"
msgid "RAR files failed to verify"
msgstr "RAR 文件验证失败"
#: sabnzbd/postproc.py
msgid "Trying RAR renamer"
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "No matching earlier rar file for %s"
@@ -3089,24 +3113,13 @@ msgstr "生成新的 Key"
msgid "API Key QR Code"
msgstr "API Key QR 码"
#: sabnzbd/skintext.py
msgid "List of local network ranges"
msgstr "本地网段列表"
#: sabnzbd/skintext.py
msgid ""
"All local network addresses start with these prefixes (often \"192.168.1.\")"
msgstr "本地网络地址以这些前缀开头 (通常为“192.168.1.”)"
#: sabnzbd/skintext.py
msgid "External internet access"
msgstr "外部互联网访问"
#: sabnzbd/skintext.py
msgid ""
"You can set access rights for systems outside your local network. Requires "
"List of local network ranges to be defined."
msgstr "您可以设定非本地网络的访问权限。要求定义本地网络列表。"
msgid "You can set access rights for systems outside your local network."
msgstr ""
#: sabnzbd/skintext.py
msgid "No access"
@@ -3402,17 +3415,26 @@ msgid "Action when unwanted extension detected"
msgstr "侦测到不需要的扩展名时的操作"
#: sabnzbd/skintext.py
msgid "Action when an unwanted extension is detected in RAR files"
msgstr "RAR 文件中侦测到不需要的扩展名时的操作"
msgid "Action when an unwanted extension is detected"
msgstr ""
#: sabnzbd/skintext.py
msgid "Unwanted extensions"
msgstr "不需要的扩展名"
#: sabnzbd/skintext.py
msgid "Blacklist"
msgstr ""
#: sabnzbd/skintext.py
msgid "Whitelist"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"List all unwanted extensions. For example: <b>exe</b> or <b>exe, com</b>"
msgstr "所有不需要扩展名的列表。例如: <b>exe</b> 或 <b>exe, com</b>"
"Select a mode and list all (un)wanted extensions. For example: <b>exe</b> or"
" <b>exe, com</b>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable SFV-based checks"
@@ -3778,6 +3800,21 @@ msgstr "密码"
msgid "Timeout"
msgstr "超时"
#: sabnzbd/skintext.py
msgid "Account expiration date"
msgstr ""
#: sabnzbd/skintext.py
msgid "Warn 5 days in advance of account expiration date."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Quota for this account, counted from the time it is set. In bytes, "
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
" minutes."
msgstr ""
#. Server's retention time in days
#: sabnzbd/skintext.py
msgid "Retention time"
@@ -3927,6 +3964,16 @@ msgstr "读取 Feed"
msgid "Force Download"
msgstr "强制下载"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
msgstr ""
#. Config->RSS when will be the next RSS scan
#: sabnzbd/skintext.py
msgid "Next scan at"
msgstr ""
#. Config->RSS table column header
#: sabnzbd/skintext.py
msgid "Filter"
@@ -4709,6 +4756,10 @@ msgstr "隐藏/显示已完成文件"
msgid "View Script Log"
msgstr "查看脚本日志"
#: sabnzbd/skintext.py
msgid "Renaming the job will abort Direct Unpack."
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"LocalStorage (cookies) are disabled in your browser, interface settings will"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
@@ -13,55 +13,59 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "The installer only supports 64-bit Windows, use the standalone version to run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "The installer only supports Windows 8.1 and above, use the standalone legacy version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr ""

View File

@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
"MIME-Version: 1.0\n"
@@ -13,61 +13,67 @@ msgstr ""
"Language: cs\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr ""

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Danish (https://www.transifex.com/sabnzbd/teams/111101/da/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Vis udgivelsesbemærkninger"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Støt projektet, donér!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Luk venligst \"SABnzbd.exe\" først"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Dette vil afinstallere SABnzbd fra dit system"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Kør ved opstart"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Skrivebordsikon"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB-filtilknytning"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Slet program"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Slet indstillinger"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -75,6 +81,6 @@ msgstr ""
"fjerne den tidligere version eller `Annuller` for at annullere "
"opgraderingen."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Dine indstillinger og data vil blive bevaret."

View File

@@ -4,12 +4,13 @@
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2020
# Ben Hecht <benjamin.hecht@me.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Last-Translator: Ben Hecht <benjamin.hecht@me.com>, 2021\n"
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,19 +18,19 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Versionshinweise anzeigen"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Bitte unterstützen Sie das Projekt durch eine Spende!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Schliessen Sie bitte zuerst \"SABnzbd.exe\"."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
@@ -38,7 +39,7 @@ msgstr ""
"Aufgrund von Änderungen am SABnzbd Windows Service ab Version 3.0.0 ist es nötig,\\nden Windows Service neu zu installieren.\\n\\n\r\n"
"Drücke `OK` um den existierenden Service zu löschen oder `Abbrechen` um dieses Upgrade abzubrechen."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
@@ -46,31 +47,39 @@ msgstr ""
"Der Installer unterstützt nur Windows 64-bit. Benutze die Standalone Version"
" für Windows 32-bit."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
"Der Installer unterstützt nur Windows 8.1 und höher. Benutze die Standalone "
"Version für ältere Windows Versionen."
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Dies entfernt SABnzbd von Ihrem System"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Beim Systemstart ausführen"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Desktop-Symbol"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "Mit NZB-Dateien verknüpfen"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Programm löschen"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Einstellungen löschen"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -79,6 +88,6 @@ msgstr ""
"Sie 'OK', um die vorherige Version zu entfernen oder 'Abbrechen' um die "
"Aktualisierung abzubrechen."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Ihre Einstellungen und Daten bleiben erhalten."

View File

@@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Ester Molla Aragones <moarages@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/sabnzbd/teams/111101/es/)\n"
@@ -18,19 +18,19 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Mostrar notas de la versión"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "¡Apoye el proyecto, haga una donación!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Por favor cierre primero \"SABnzbd.exe\""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
@@ -41,7 +41,7 @@ msgstr ""
"en \"OK\" para eliminar los servicios existentes o \"Cancelar\" para "
"cancelar la actualización."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
@@ -49,31 +49,37 @@ msgstr ""
"El instalador solo admite Windows 64-bit, utilice la versión independiente "
"para ejecutar Windows 32-bit."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Esto desinstalará SABnzbd de su sistema"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Ejecutar al inicio"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Icono del escritorio"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "Asociación de archivos NZB"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Eliminar programa"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Eliminar Ajustes"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -81,6 +87,6 @@ msgstr ""
"No es posible sobrescribir una instalación existente. \\n\\nPresione `OK' "
"para quitar la versión anterior o 'Cancelar' para cancelar la actualización."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Tus ajustes y datos se mantendrán intactos."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Finnish (https://www.transifex.com/sabnzbd/teams/111101/fi/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Näytä julkaisutiedot"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Tue projektia, lahjoita!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Ole hyvä ja sulje \"SABnzbd.exe\" ensin"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Tämä poistaa SABnzbd:n tietokoneestasi"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Suorita käynnistyksen yhteydessä"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Työpöydän kuvake"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB tiedostosidos"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Poista sovellus"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Poista asetukset"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -74,6 +80,6 @@ msgstr ""
"Et voi asentaa tätä vanhan asennuksen päälle. \\n\\nPaina `OK` poistaaksesi "
"edellisen version tai paina `Peruuta` peruuttaaksesi tämän päivityksen."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Asetuksiasi ja tietojasi ei poisteta."

View File

@@ -4,12 +4,13 @@
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2020
# Fred L <88com88@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2021\n"
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,19 +18,19 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Afficher les notes de version"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Soutenez le projet, faites un don !"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Merci de fermer \"SABnzbd.exe\" avant l'installation"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
@@ -39,7 +40,7 @@ msgstr ""
" réinstaller le service SABnzbd. \\n\\nCliquez sur 'OK' pour supprimer les "
"services existants ou sur 'Annuler' pour annuler cette mise à niveau."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
@@ -47,31 +48,40 @@ msgstr ""
"Le programme d'installation ne prend en charge que Windows 64 bits, utilisez"
" la version standalone pour l'exécuter sur Windows 32 bits."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
"Le programme d'installation ne prend en charge que Windows 8.1 et supérieur,"
" utilisez la version autonome legacy pour les versions antérieures de "
"Windows."
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Ceci désinstallera SABnzbd de votre système"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Lancer au démarrage"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Icône sur le Bureau"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "Association des fichiers NZB"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Supprimer le programme"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Supprimer les paramètres"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -80,6 +90,6 @@ msgstr ""
"pour supprimer la version précédente ou `Annuler` pour annuler cette mise à "
"niveau."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Vos paramètres et données seront conservés."

View File

@@ -4,12 +4,13 @@
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2020
# ION, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Last-Translator: ION, 2021\n"
"Language-Team: Hebrew (https://www.transifex.com/sabnzbd/teams/111101/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,29 +18,29 @@ msgstr ""
"Language: he\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "הראה הערות שחרור"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "תמוך במיזם, תרום!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "אנא סגור את \"SABnzbd.exe\" תחילה"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
"שירות SABnzbd Windows השתנה בגרסה SABnzbd 3.0.0. \\nתצטרך להתקין מחדש את "
"השירות SABnzbd. \\n\\nלחץ `אשר` כדי להסיר את השירותים הקיימים או `בטל` כדי "
"לבטל שדרוג זה."
"שירות Windows של SABnzbd השתנה ב־SABnzbd 3.0.0. \\nתצטרך להתקין מחדש את "
"השירות של SABnzbd. \\n\\nלחץ על `אישור` כדי להסיר את השירותים הקיימים או על "
"`ביטול` כדי לבטל שדרוג זה."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
@@ -47,38 +48,46 @@ msgstr ""
"המתקין תומך רק במערכת Windows מסוג 64־סיביות, השתמש בגרסה העצמאית כדי להריץ "
"על Windows מסוג 32־סיביות."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
"המתקין תומך רק במערכת Windows 8.1 ומעלה, השתמש בגרסה העצמאית המיושנת כדי "
"להריץ על גרסת Windows ישנה יותר."
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "זה יסיר את SABnzbd ממערכתך"
msgstr "זה יסיר את SABnzbd מהמערכת שלך"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "הפעלה בהזנק"
msgstr "הרץ בהזנק"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "צלמית שולחן עבודה"
msgstr "צור קיצור דרך בשולחן העבודה"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB שיוך קבצי"
msgstr "NZB שייך קבצי"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "מחק תוכנית"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "מחק הגדרות"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
msgstr ""
"אינך יכול לדרוס התקנה קיימת.\\n\\nלחץ על `אישור` כדי להסיר את הגרסה הקודמת "
"אינך יכול לדרוס התקנה קיימת. \\n\\nלחץ על `אישור` כדי להסיר את הגרסה הקודמת "
"או על `ביטול` כדי לבטל שדרוג זה."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "ההגדרות והנתונים שלך יישמרו."
msgstr "ההגדרות והנתונים שלך ישתמרו."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Norwegian Bokmål (https://www.transifex.com/sabnzbd/teams/111101/nb/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: nb\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Vis versjonsmerknader"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Støtt prosjektet, donèr!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Vennligst lukk \"SABnzbd.exe\" først"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Dette vil avinstallere SABnzbd fra ditt system"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Kjør ved oppstart"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Skrivebordsikon"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB-filassosiering"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Fjern program"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Slett innstillinger"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -75,6 +81,6 @@ msgstr ""
" fjerne tidligere installasjon, eller 'Avbryt' for å avbryte denne "
"oppgraderingen."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Dine innstillinger og data vil bli tatt vare på."

View File

@@ -3,13 +3,13 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2020
# Safihre <safihre@sabnzbd.org>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2021\n"
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,19 +17,19 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Toon opmerkingen bij deze uitgave"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Steun het project, doneer!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Sluit \"SABnzbd.exe\" eerst af"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
@@ -38,7 +38,7 @@ msgstr ""
"De SABnzbd Windows Service is aangepast in SABnzbd 3.0.0. Hierdoor zal je de service opnieuw moeten installeren.\\n\\n\n"
"Klik `Ok` om de bestaande services te verwijderen of `Annuleren` om te stoppen."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
@@ -46,31 +46,40 @@ msgstr ""
"Alleen 64-bit wordt ondersteund in de installer, download de standalone "
"versie om SABnzbd uit te voeren op 32-bit Windows."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
"Alleen Windows 8.1 en nieuwer worden ondersteund door de installer, download"
" de standalone legacy versie om SABnzbd uit te voeren op oudere versies van "
"Windows."
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Dit verwijdert SABnzbd van je systeem"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Starten met Windows"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Bureaubladpictogram"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB-bestanden openen met SABnzbd"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Programma verwijderen"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Verwijder alle instellingen"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -78,6 +87,6 @@ msgstr ""
"U kunt geen bestaande installatie overschrijven.\\n\\nKlik op `OK` om de "
"vorige versie te verwijderen of op `Annuleren` om te stoppen."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Je instellingen en bestanden blijven behouden."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Polish (https://www.transifex.com/sabnzbd/teams/111101/pl/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: pl\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Pokaż informacje o wydaniu"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Wspomóż projekt!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Najpierw zamknij SABnzbd.exe"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "To odinstaluje SABnzbd z systemu"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Uruchom wraz z systemem"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Ikona pulpitu"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "powiązanie pliku NZB"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Usuń program"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Skasuj obecne ustawienia"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -74,6 +80,6 @@ msgstr ""
"Nie można nadpisać istniejącej instalacji. \\n\\n Naciśnij `OK`, aby usunąć "
"poprzednia wersję lub `Anuluj` aby anulować aktualizację."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Twoje ustawienia i dane zostaną zachowane."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Mostrar Notas de Lançamento"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Apoie o projeto. Faça uma doação!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Por favor, feche \"SABnzbd.exe\" primeiro"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Isso irá desinstalar SABnzbd de seu sistema"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Executar na inicialização"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Ícone na Área de Trabalho"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "Associação com Arquivos NZB"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Excluir o Programa"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Apagar Configurações"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -74,6 +80,6 @@ msgstr ""
"Você não pode substituir uma instalação existente. \\n\\nClique `OK` para "
"remover a versão anterior ou `Cancelar` para cancelar esta atualização."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Suas configurações e os dados serão preservados."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Romanian (https://www.transifex.com/sabnzbd/teams/111101/ro/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: ro\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Arată Notele de Publicare"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Susţine proiectul, Donează!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Închideţi mai întâi \"SABnzbd.exe\""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Acest lucru va dezinstala SABnzbd din sistem"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Executare la pornire"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Icoană Desktop"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "Asociere cu Fişierele NZB"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Şterge Program"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Ştergeţi Setări"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -74,6 +80,6 @@ msgstr ""
"Nu puteți suprascrie instalarea existentă. \\n\\nClick `OK` pentru a elimina"
" versiunea anterioară sau `Anulare` pentru a anula actualizarea."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Setările şi informaţiile vor fi salvate."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/sabnzbd/teams/111101/ru/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Показать заметки о выпуске"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Поддержите проект. Сделайте пожертвование!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Завершите сначала работу процесса SABnzbd.exe"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Приложение SABnzbd будет удалено из вашей системы"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Запускать вместе с системой"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Значок на рабочем столе"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "Ассоциировать с файлами NZB"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Удалить программу"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Удалить параметры"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -75,6 +81,6 @@ msgstr ""
"удалить предыдущую версию, нажмите кнопку «ОК». Чтобы отменить обновление, "
"нажмите кнопку «Отмена»."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Ваши параметры и данные будут сохранены."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Serbian (https://www.transifex.com/sabnzbd/teams/111101/sr/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: sr\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Прикажи белешке о издању"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Подржите пројекат, дајте добровољан прилог!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Прво затворите „SABnzbd.exe“"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Ово ће уклонити САБнзбд са вашег система"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Покрени са системом"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Иконица радне површи"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "Придруживање НЗБ датотеке"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Обриши програм"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Обриши подешавања"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -74,6 +80,6 @@ msgstr ""
"Не можете да препишете постојећу инсталацију. \\n\\nПритисните „У реду“ да "
"уклоните претходно издање или „Откажи“ да поништите ову надоградњу."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Ваша подешавања и подаци биће сачувани."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/sabnzbd/teams/111101/sv/)\n"
@@ -17,56 +17,62 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "Visa releasenoteringar"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "Donera och stöd detta projekt!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "Var vänlig stäng \"SABnzbd.exe\" först"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "Detta kommer att avinstallera SABnzbd från systemet"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "Kör vid uppstart"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "Skrivbordsikon"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB Filassosication"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "Radera programmet"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "Radera inställningar"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
@@ -75,6 +81,6 @@ msgstr ""
"avinstallera tidigare version eller 'Avbryt' för att avbryta denna "
"uppgradering."
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "Dina inställningar och ditt data kommer att bevaras."

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.0.0-develop\n"
"Project-Id-Version: SABnzbd-3.3.0-develop\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
"Language-Team: Chinese (China) (https://www.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
@@ -17,61 +17,67 @@ msgstr ""
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Show Release Notes"
msgstr "显示版本说明"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Support the project, Donate!"
msgstr "支持该项目,捐助!"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Please close \"SABnzbd.exe\" first"
msgstr "请先关闭 \"SABnzbd.exe\""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The SABnzbd Windows Service changed in SABnzbd 3.0.0. \\nYou will need to "
"reinstall the SABnzbd service. \\n\\nClick `OK` to remove the existing "
"services or `Cancel` to cancel this upgrade."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports 64-bit Windows, use the standalone version to "
"run on 32-bit Windows."
msgstr ""
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"The installer only supports Windows 8.1 and above, use the standalone legacy"
" version to run on older Windows version."
msgstr ""
#: builder/win/NSIS_Installer.nsi
msgid "This will uninstall SABnzbd from your system"
msgstr "这将从您的系统中卸载 SABnzbd"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Run at startup"
msgstr "启动时运行"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Desktop Icon"
msgstr "桌面图标"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB 文件关联"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Program"
msgstr "删除程序"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Delete Settings"
msgstr "删除设置"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid ""
"You cannot overwrite an existing installation. \\n\\nClick `OK` to remove "
"the previous version or `Cancel` to cancel this upgrade."
msgstr "不可以覆盖安装。\\n\\n点击“确定”可移除旧版或点击“取消”取消升级。"
#: NSIS_Installer.nsi
#: builder/win/NSIS_Installer.nsi
msgid "Your settings and data will be preserved."
msgstr "您的设置及数据将会保留。"

View File

@@ -3,7 +3,7 @@ cheetah3>=3.0.0
cryptography
feedparser>=6.0.0
configobj
cheroot<8.4.3
cheroot
cherrypy
portend
chardet

View File

@@ -20,28 +20,29 @@ import logging
import datetime
import tempfile
import pickle
import ctypes
import ctypes.util
import gzip
import time
import socket
import cherrypy
import platform
import sys
import ssl
from threading import Lock, Thread
from threading import Lock, Thread, Condition
from typing import Any, AnyStr
##############################################################################
# Determine platform flags
##############################################################################
WIN32 = DARWIN = FOUNDATION = WIN64 = DOCKER = False
KERNEL32 = None
KERNEL32 = LIBC = MACOSLIBC = None
if os.name == "nt":
WIN32 = True
from sabnzbd.utils.apireg import del_connection_info
try:
import ctypes
KERNEL32 = ctypes.windll.LoadLibrary("Kernel32.dll")
except:
pass
@@ -56,12 +57,21 @@ elif os.name == "posix":
except:
pass
import platform
# See if we have the GNU glibc malloc_trim() memory release function
try:
LIBC = ctypes.CDLL("libc.so.6")
LIBC.malloc_trim(0) # try the malloc_trim() call, which is a GNU extension
except:
# No malloc_trim(), probably because no glibc
LIBC = None
pass
# Parse macOS version numbers
if platform.system().lower() == "darwin":
DARWIN = True
# 12 = Sierra, 11 = ElCaptain, 10 = Yosemite, 9 = Mavericks, 8 = MountainLion
DARWIN_VERSION = int(platform.mac_ver()[0].split(".")[1])
MACOSLIBC = ctypes.CDLL(ctypes.util.find_library("c"), use_errno=True) # the MacOS C library
try:
import Foundation
import sabnzbd.utils.sleepless as sleepless
@@ -70,6 +80,7 @@ elif os.name == "posix":
except:
pass
# Imported to be referenced from other files directly
from sabnzbd.version import __version__, __baseline__
@@ -175,13 +186,15 @@ WEBUI_READY = False
EXTERNAL_IPV6 = False
LAST_HISTORY_UPDATE = 1
# Condition used to handle the main loop in SABnzbd.py
SABSTOP_CONDITION = Condition(Lock())
# Performance measure for dashboard
PYSTONE_SCORE = 0
DOWNLOAD_DIR_SPEED = 0
COMPLETE_DIR_SPEED = 0
INTERNET_BANDWIDTH = 0
# Rendering of original command line arguments in Config
CMDLINE = " ".join(['"%s"' % arg for arg in sys.argv])
@@ -198,19 +211,7 @@ def sig_handler(signum=None, frame=None):
return True
if signum is not None:
logging.warning(T("Signal %s caught, saving and exiting..."), signum)
try:
save_state()
sabnzbd.zconfig.remove_server()
finally:
if sabnzbd.WIN32:
del_connection_info()
if sabnzbd.WINTRAY:
sabnzbd.WINTRAY.terminate = True
time.sleep(0.5)
else:
pid_file()
sabnzbd.SABSTOP = True
os._exit(0)
sabnzbd.shutdown_program()
##############################################################################
@@ -311,7 +312,7 @@ def initialize(pause_downloader=False, clean_up=False, repair=0):
sabnzbd.ArticleCache = sabnzbd.articlecache.ArticleCache()
sabnzbd.BPSMeter = sabnzbd.bpsmeter.BPSMeter()
sabnzbd.NzbQueue = sabnzbd.nzbqueue.NzbQueue()
sabnzbd.Downloader = sabnzbd.downloader.Downloader(pause_downloader or sabnzbd.BPSMeter.read())
sabnzbd.Downloader = sabnzbd.downloader.Downloader(sabnzbd.BPSMeter.read() or pause_downloader)
sabnzbd.Decoder = sabnzbd.decoder.Decoder()
sabnzbd.Assembler = sabnzbd.assembler.Assembler()
sabnzbd.PostProcessor = sabnzbd.postproc.PostProcessor()
@@ -371,7 +372,11 @@ def halt():
# Stop the windows tray icon
if sabnzbd.WINTRAY:
sabnzbd.WINTRAY.terminate = True
sabnzbd.WINTRAY.stop()
# Remove registry information
if sabnzbd.WIN32:
del_connection_info()
sabnzbd.zconfig.remove_server()
sabnzbd.utils.ssdp.stop_ssdp()
@@ -402,9 +407,12 @@ def halt():
except:
pass
# Stop Required Objects
logging.debug("Stopping downloader")
sabnzbd.downloader.stop()
sabnzbd.Downloader.stop()
try:
sabnzbd.Downloader.join()
except:
pass
# Decoder handles join gracefully
logging.debug("Stopping decoders")
@@ -443,53 +451,53 @@ def halt():
sabnzbd.__INITIALIZED__ = False
def notify_shutdown_loop():
"""Trigger the main loop to wake up"""
with sabnzbd.SABSTOP_CONDITION:
sabnzbd.SABSTOP_CONDITION.notify()
def shutdown_program():
"""Stop program after halting and saving"""
if not sabnzbd.SABSTOP:
logging.info("[%s] Performing SABnzbd shutdown", misc.caller_name())
sabnzbd.halt()
cherrypy.engine.exit()
sabnzbd.SABSTOP = True
notify_shutdown_loop()
def trigger_restart(timeout=None):
""" Trigger a restart by setting a flag an shutting down CP """
"""Trigger a restart by setting a flag an shutting down CP"""
# Sometimes we need to wait a bit to send good-bye to the browser
if timeout:
time.sleep(timeout)
if sabnzbd.WIN32:
# Remove connection info for faster restart
del_connection_info()
# Leave the harder restarts to the polling in SABnzbd.py
if hasattr(sys, "frozen"):
sabnzbd.TRIGGER_RESTART = True
else:
# Add extra arguments
if sabnzbd.Downloader.paused:
sabnzbd.RESTART_ARGS.append("-p")
sys.argv = sabnzbd.RESTART_ARGS
# Stop all services
sabnzbd.halt()
cherrypy.engine.exit()
# Do the restart right now
cherrypy.engine._do_execv()
# Set the flag and wake up the main loop
sabnzbd.TRIGGER_RESTART = True
notify_shutdown_loop()
##############################################################################
# Misc Wrappers
##############################################################################
def new_limit():
""" Callback for article cache changes """
"""Callback for article cache changes"""
sabnzbd.ArticleCache.new_limit(cfg.cache_limit.get_int())
def guard_restart():
""" Callback for config options requiring a restart """
"""Callback for config options requiring a restart"""
sabnzbd.RESTART_REQ = True
def guard_top_only():
""" Callback for change of top_only option """
"""Callback for change of top_only option"""
sabnzbd.NzbQueue.set_top_only(cfg.top_only())
def guard_pause_on_pp():
""" Callback for change of pause-download-on-pp """
"""Callback for change of pause-download-on-pp"""
if cfg.pause_on_post_processing():
pass # Not safe to idle downloader, because we don't know
# if post-processing is active now
@@ -498,17 +506,17 @@ def guard_pause_on_pp():
def guard_quota_size():
""" Callback for change of quota_size """
"""Callback for change of quota_size"""
sabnzbd.BPSMeter.change_quota()
def guard_quota_dp():
""" Callback for change of quota_day or quota_period """
"""Callback for change of quota_day or quota_period"""
sabnzbd.Scheduler.restart()
def guard_language():
""" Callback for change of the interface language """
"""Callback for change of the interface language"""
sabnzbd.lang.set_language(cfg.language())
sabnzbd.api.clear_trans_cache()
@@ -526,12 +534,12 @@ def set_https_verification(value):
def guard_https_ver():
""" Callback for change of https verification """
"""Callback for change of https verification"""
set_https_verification(cfg.enable_https_verification())
def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None, password=None):
""" Add NZB based on a URL, attributes optional """
"""Add NZB based on a URL, attributes optional"""
if "http" not in url:
return
if not pp or pp == "-1":
@@ -560,7 +568,8 @@ def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None, pa
def save_state():
""" Save all internal bookkeeping to disk """
"""Save all internal bookkeeping to disk"""
config.save_config()
sabnzbd.ArticleCache.flush_articles()
sabnzbd.NzbQueue.save()
sabnzbd.BPSMeter.save()
@@ -571,14 +580,14 @@ def save_state():
def pause_all():
""" Pause all activities than cause disk access """
"""Pause all activities than cause disk access"""
sabnzbd.PAUSED_ALL = True
sabnzbd.Downloader.pause()
logging.debug("PAUSED_ALL active")
def unpause_all():
""" Resume all activities """
"""Resume all activities"""
sabnzbd.PAUSED_ALL = False
sabnzbd.Downloader.resume()
logging.debug("PAUSED_ALL inactive")
@@ -590,20 +599,20 @@ def unpause_all():
def backup_exists(filename: str) -> bool:
""" Return True if backup exists and no_dupes is set """
"""Return True if backup exists and no_dupes is set"""
path = cfg.nzb_backup_dir.get_path()
return path and os.path.exists(os.path.join(path, filename + ".gz"))
def backup_nzb(filename: str, data: AnyStr):
""" Backup NZB file """
"""Backup NZB file"""
path = cfg.nzb_backup_dir.get_path()
if path:
save_compressed(path, filename, data)
def save_compressed(folder: str, filename: str, data: AnyStr):
""" Save compressed NZB file in folder """
"""Save compressed NZB file in folder"""
if filename.endswith(".nzb"):
filename += ".gz"
else:
@@ -646,7 +655,7 @@ def add_nzbfile(
"""
if pp == "-1":
pp = None
if script and script.lower() == "default":
if script and (script.lower() == "default" or not filesystem.is_valid_script(script)):
script = None
if cat and cat.lower() == "default":
cat = None
@@ -719,7 +728,7 @@ def add_nzbfile(
def enable_server(server):
""" Enable server (scheduler only) """
"""Enable server (scheduler only)"""
try:
config.get_config("servers", server).enable.set(1)
except:
@@ -730,7 +739,7 @@ def enable_server(server):
def disable_server(server):
""" Disable server (scheduler only) """
"""Disable server (scheduler only)"""
try:
config.get_config("servers", server).enable.set(0)
except:
@@ -741,7 +750,7 @@ def disable_server(server):
def system_shutdown():
""" Shutdown system after halting download and saving bookkeeping """
"""Shutdown system after halting download and saving bookkeeping"""
logging.info("Performing system shutdown")
Thread(target=halt).start()
@@ -757,7 +766,7 @@ def system_shutdown():
def system_hibernate():
""" Hibernate system """
"""Hibernate system"""
logging.info("Performing system hybernation")
if sabnzbd.WIN32:
powersup.win_hibernate()
@@ -768,7 +777,7 @@ def system_hibernate():
def system_standby():
""" Standby system """
"""Standby system"""
logging.info("Performing system standby")
if sabnzbd.WIN32:
powersup.win_standby()
@@ -778,17 +787,8 @@ def system_standby():
powersup.linux_standby()
def shutdown_program():
""" Stop program after halting and saving """
if not sabnzbd.SABSTOP:
logging.info("[%s] Performing SABnzbd shutdown", misc.caller_name())
sabnzbd.halt()
cherrypy.engine.exit()
sabnzbd.SABSTOP = True
def restart_program():
""" Restart program (used by scheduler) """
"""Restart program (used by scheduler)"""
logging.info("Scheduled restart request")
# Just set the stop flag, because stopping CherryPy from
# the scheduler is not reliable
@@ -802,7 +802,7 @@ def change_queue_complete_action(action, new=True):
"""
_action = None
_argument = None
if action.startswith("script_"):
if action.startswith("script_") and filesystem.is_valid_script(action.replace("script_", "", 1)):
# all scripts are labeled script_xxx
_action = run_script
_argument = action.replace("script_", "", 1)
@@ -831,7 +831,7 @@ def change_queue_complete_action(action, new=True):
def run_script(script):
""" Run a user script (queue complete only) """
"""Run a user script (queue complete only)"""
script_path = filesystem.make_script_path(script)
if script_path:
try:
@@ -842,7 +842,7 @@ def run_script(script):
def keep_awake():
""" If we still have work to do, keep Windows/macOS system awake """
"""If we still have work to do, keep Windows/macOS system awake"""
if KERNEL32 or FOUNDATION:
if sabnzbd.cfg.keep_awake():
ES_CONTINUOUS = 0x80000000
@@ -890,7 +890,7 @@ def get_new_id(prefix, folder, check_list=None):
def save_data(data, _id, path, do_pickle=True, silent=False):
""" Save data to a diskfile """
"""Save data to a diskfile"""
if not silent:
logging.debug("[%s] Saving data for %s in %s", misc.caller_name(), _id, path)
path = os.path.join(path, _id)
@@ -917,7 +917,7 @@ def save_data(data, _id, path, do_pickle=True, silent=False):
def load_data(data_id, path, remove=True, do_pickle=True, silent=False):
""" Read data from disk file """
"""Read data from disk file"""
path = os.path.join(path, data_id)
if not os.path.exists(path):
@@ -949,7 +949,7 @@ def load_data(data_id, path, remove=True, do_pickle=True, silent=False):
def remove_data(_id: str, path: str):
""" Remove admin file """
"""Remove admin file"""
path = os.path.join(path, _id)
try:
if os.path.exists(path):
@@ -959,19 +959,19 @@ def remove_data(_id: str, path: str):
def save_admin(data: Any, data_id: str):
""" Save data in admin folder in specified format """
"""Save data in admin folder in specified format"""
logging.debug("[%s] Saving data for %s", misc.caller_name(), data_id)
save_data(data, data_id, cfg.admin_dir.get_path())
def load_admin(data_id: str, remove=False, silent=False) -> Any:
""" Read data in admin folder in specified format """
"""Read data in admin folder in specified format"""
logging.debug("[%s] Loading data for %s", misc.caller_name(), data_id)
return load_data(data_id, cfg.admin_dir.get_path(), remove=remove, silent=silent)
def request_repair():
""" Request a full repair on next restart """
"""Request a full repair on next restart"""
path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST)
try:
with open(path, "w") as f:
@@ -981,7 +981,7 @@ def request_repair():
def check_repair_request():
""" Return True if repair request found, remove afterwards """
"""Return True if repair request found, remove afterwards"""
path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST)
if os.path.exists(path):
try:
@@ -1044,7 +1044,7 @@ def check_all_tasks():
def pid_file(pid_path=None, pid_file=None, port=0):
""" Create or remove pid file """
"""Create or remove pid file"""
if not sabnzbd.WIN32:
if pid_path and pid_path.startswith("/"):
sabnzbd.DIR_PID = os.path.join(pid_path, "sabnzbd-%d.pid" % port)
@@ -1077,14 +1077,14 @@ def check_incomplete_vs_complete():
def wait_for_download_folder():
""" Wait for download folder to become available """
"""Wait for download folder to become available"""
while not cfg.download_dir.test_path():
logging.debug('Waiting for "incomplete" folder')
time.sleep(2.0)
def test_ipv6():
""" Check if external IPv6 addresses are reachable """
"""Check if external IPv6 addresses are reachable"""
if not cfg.selftest_host():
# User disabled the test, assume active IPv6
return True
@@ -1112,7 +1112,7 @@ def test_ipv6():
def test_cert_checking():
""" Test quality of certificate validation """
"""Test quality of certificate validation"""
# User disabled the test, assume proper SSL certificates
if not cfg.selftest_host():
return True
@@ -1139,7 +1139,7 @@ def test_cert_checking():
def history_updated():
""" To make sure we always have a fresh history """
"""To make sure we always have a fresh history"""
sabnzbd.LAST_HISTORY_UPDATE += 1
# Never go over the limit
if sabnzbd.LAST_HISTORY_UPDATE + 1 >= sys.maxsize:

View File

File diff suppressed because it is too large Load Diff

View File

@@ -55,7 +55,7 @@ class ArticleCache:
return ANFO(len(self.__article_table), abs(self.__cache_size), self.__cache_limit_org)
def new_limit(self, limit: int):
""" Called when cache limit changes """
"""Called when cache limit changes"""
self.__cache_limit_org = limit
if limit < 0:
self.__cache_limit = self.__cache_upper_limit
@@ -70,20 +70,20 @@ class ArticleCache:
@synchronized(ARTICLE_COUNTER_LOCK)
def reserve_space(self, data_size: int):
""" Reserve space in the cache """
"""Reserve space in the cache"""
self.__cache_size += data_size
@synchronized(ARTICLE_COUNTER_LOCK)
def free_reserved_space(self, data_size: int):
""" Remove previously reserved space """
"""Remove previously reserved space"""
self.__cache_size -= data_size
def space_left(self) -> bool:
""" Is there space left in the set limit? """
"""Is there space left in the set limit?"""
return self.__cache_size < self.__cache_limit
def save_article(self, article: Article, data: bytes):
""" Save article in cache, either memory or disk """
"""Save article in cache, either memory or disk"""
nzo = article.nzf.nzo
if nzo.is_gone():
# Do not discard this article because the
@@ -115,7 +115,7 @@ class ArticleCache:
self.__flush_article_to_disk(article, data)
def load_article(self, article: Article):
""" Load the data of the article """
"""Load the data of the article"""
data = None
nzo = article.nzf.nzo
@@ -145,7 +145,7 @@ class ArticleCache:
logging.debug("Failed to flush item from cache, probably already deleted or written to disk")
def purge_articles(self, articles: List[Article]):
""" Remove all saved articles, from memory and disk """
"""Remove all saved articles, from memory and disk"""
logging.debug("Purging %s articles from the cache/disk", len(articles))
for article in articles:
if article in self.__article_table:

View File

@@ -30,7 +30,14 @@ from typing import Tuple, Optional, List
import sabnzbd
from sabnzbd.misc import get_all_passwords, match_str
from sabnzbd.filesystem import set_permissions, clip_path, has_win_device, diskspace, get_filename, get_ext
from sabnzbd.filesystem import (
set_permissions,
clip_path,
has_win_device,
diskspace,
get_filename,
has_unwanted_extension,
)
from sabnzbd.constants import Status, GIGI, MAX_ASSEMBLER_QUEUE
import sabnzbd.cfg as cfg
from sabnzbd.nzbstuff import NzbObject, NzbFile
@@ -41,7 +48,7 @@ import sabnzbd.utils.rarfile as rarfile
class Assembler(Thread):
def __init__(self):
Thread.__init__(self)
super().__init__()
self.queue: queue.Queue[Tuple[Optional[NzbObject], Optional[NzbFile], Optional[bool]]] = queue.Queue()
def stop(self):
@@ -259,7 +266,7 @@ SAFE_EXTS = (".mkv", ".mp4", ".avi", ".wmv", ".mpg", ".webm")
def is_cloaked(nzo: NzbObject, path: str, names: List[str]) -> bool:
""" Return True if this is likely to be a cloaked encrypted post """
"""Return True if this is likely to be a cloaked encrypted post"""
fname = os.path.splitext(get_filename(path.lower()))[0]
for name in names:
name = get_filename(name.lower())
@@ -288,7 +295,7 @@ def is_cloaked(nzo: NzbObject, path: str, names: List[str]) -> bool:
def check_encrypted_and_unwanted_files(nzo: NzbObject, filepath: str) -> Tuple[bool, Optional[str]]:
""" Combines check for unwanted and encrypted files to save on CPU and IO """
"""Combines check for unwanted and encrypted files to save on CPU and IO"""
encrypted = False
unwanted = None
@@ -334,29 +341,30 @@ def check_encrypted_and_unwanted_files(nzo: NzbObject, filepath: str) -> Tuple[b
zf.setpassword(password)
except rarfile.Error:
# On weird passwords the setpassword() will fail
# but the actual rartest() will work
# but the actual testrar() will work
pass
try:
zf.testrar()
password_hit = password
break
except rarfile.RarWrongPassword:
# This one really didn't work
pass
except rarfile.RarCRCError as e:
# CRC errors can be thrown for wrong password or
# missing the next volume (with correct password)
if "cannot find volume" in str(e).lower():
if match_str(str(e), ("cannot find volume", "unexpected end of archive")):
# We assume this one worked!
password_hit = password
break
# This one didn't work
pass
except Exception as e:
# Did we start from the right volume? Skip the checks for now.
if match_str(
str(e).lower(),
("need to start extraction from a previous volume", "non-fatal error"),
):
return encrypted, unwanted
# This one failed
pass
except:
# All the other errors we skip, they might be fixable in post-proc.
# For example starting from the wrong volume, or damaged files
# This will cause the check to be performed again for the next rar, might
# be disk-intensive! Could be removed later and just accept the password.
return encrypted, unwanted
# Did any work?
if password_hit:
@@ -376,7 +384,7 @@ def check_encrypted_and_unwanted_files(nzo: NzbObject, filepath: str) -> Tuple[b
if cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions():
for somefile in zf.namelist():
logging.debug("File contains: %s", somefile)
if get_ext(somefile).replace(".", "").lower() in cfg.unwanted_extensions():
if has_unwanted_extension(somefile):
logging.debug("Unwanted file %s", somefile)
unwanted = somefile
zf.close()

View File

@@ -26,6 +26,7 @@ from typing import List, Dict, Optional
import sabnzbd
from sabnzbd.constants import BYTES_FILE_NAME, KIBI
from sabnzbd.misc import to_units
import sabnzbd.cfg as cfg
DAY = float(24 * 60 * 60)
@@ -38,14 +39,14 @@ RE_HHMM = re.compile(r"(\d+):(\d+)\s*$")
def tomorrow(t: float) -> float:
""" Return timestamp for tomorrow (midnight) """
"""Return timestamp for tomorrow (midnight)"""
now = time.localtime(t)
ntime = (now[0], now[1], now[2], 0, 0, 0, now[6], now[7], now[8])
return time.mktime(ntime) + DAY
def this_week(t: float) -> float:
""" Return timestamp for start of this week (monday) """
"""Return timestamp for start of this week (monday)"""
while 1:
tm = time.localtime(t)
if tm.tm_wday == 0:
@@ -56,19 +57,19 @@ def this_week(t: float) -> float:
def next_week(t: float) -> float:
""" Return timestamp for start of next week (monday) """
"""Return timestamp for start of next week (monday)"""
return this_week(t) + WEEK
def this_month(t: float) -> float:
""" Return timestamp for start of next month """
"""Return timestamp for start of next month"""
now = time.localtime(t)
ntime = (now[0], now[1], 1, 0, 0, 0, 0, 0, now[8])
return time.mktime(ntime)
def last_month_day(tm: time.struct_time) -> int:
""" Return last day of this month """
"""Return last day of this month"""
year, month = tm[:2]
day = DAYS[month]
# This simple formula for leap years is good enough
@@ -78,7 +79,7 @@ def last_month_day(tm: time.struct_time) -> int:
def next_month(t: float) -> float:
""" Return timestamp for start of next month """
"""Return timestamp for start of next month"""
now = time.localtime(t)
month = now.tm_mon + 1
year = now.tm_year
@@ -90,6 +91,38 @@ def next_month(t: float) -> float:
class BPSMeter:
__slots__ = (
"start_time",
"log_time",
"speed_log_time",
"last_update",
"bps",
"bps_list",
"server_bps",
"cached_amount",
"sum_cached_amount",
"day_total",
"week_total",
"month_total",
"grand_total",
"timeline_total",
"article_stats_tried",
"article_stats_failed",
"day_label",
"end_of_day",
"end_of_week",
"end_of_month",
"q_day",
"q_period",
"quota",
"left",
"have_quota",
"q_time",
"q_hour",
"q_minute",
"quota_enabled",
)
def __init__(self):
t = time.time()
self.start_time = t
@@ -100,6 +133,8 @@ class BPSMeter:
self.bps_list: List[int] = []
self.server_bps: Dict[str, float] = {}
self.cached_amount: Dict[str, int] = {}
self.sum_cached_amount: int = 0
self.day_total: Dict[str, int] = {}
self.week_total: Dict[str, int] = {}
self.month_total: Dict[str, int] = {}
@@ -125,7 +160,7 @@ class BPSMeter:
self.quota_enabled: bool = True # Scheduled quota enable/disable
def save(self):
""" Save admin to disk """
"""Save admin to disk"""
sabnzbd.save_admin(
(
self.last_update,
@@ -147,7 +182,7 @@ class BPSMeter:
)
def defaults(self):
""" Get the latest data from the database and assign to a fake server """
"""Get the latest data from the database and assign to a fake server"""
logging.debug("Setting default BPS meter values")
with sabnzbd.database.HistoryDB() as history_db:
grand, month, week = history_db.get_history_size()
@@ -164,7 +199,7 @@ class BPSMeter:
self.quota = self.left = cfg.quota_size.get_float()
def read(self):
""" Read admin from disk, return True when pause is needed """
"""Read admin from disk, return True when pause is needed"""
res = False
quota = self.left = cfg.quota_size.get_float() # Quota for this period
self.have_quota = bool(cfg.quota_size())
@@ -195,83 +230,101 @@ class BPSMeter:
res = self.reset_quota()
except:
self.defaults()
# Force update of counters and validate data
try:
for server in self.grand_total.keys():
self.update(server)
except TypeError:
self.defaults()
self.update()
return res
def update(self, server: Optional[str] = None, amount: int = 0):
""" Update counters for "server" with "amount" bytes """
t = time.time()
if t > self.end_of_day:
# current day passed. get new end of day
self.day_label = time.strftime("%Y-%m-%d")
self.day_total = {}
self.end_of_day = tomorrow(t) - 1.0
def init_server_stats(self, server: str = None):
"""Initialize counters for "server" """
if server not in self.cached_amount:
self.cached_amount[server] = 0
self.server_bps[server] = 0.0
if server not in self.day_total:
self.day_total[server] = 0
if server not in self.week_total:
self.week_total[server] = 0
if server not in self.month_total:
self.month_total[server] = 0
if server not in self.month_total:
self.month_total[server] = 0
if server not in self.grand_total:
self.grand_total[server] = 0
if server not in self.timeline_total:
self.timeline_total[server] = {}
if self.day_label not in self.timeline_total[server]:
self.timeline_total[server][self.day_label] = 0
if server not in self.server_bps:
self.server_bps[server] = 0.0
if server not in self.article_stats_tried:
self.article_stats_tried[server] = {}
self.article_stats_failed[server] = {}
if self.day_label not in self.article_stats_tried[server]:
self.article_stats_tried[server][self.day_label] = 0
self.article_stats_failed[server][self.day_label] = 0
def update(self, server: Optional[str] = None, amount: int = 0):
"""Update counters for "server" with "amount" bytes"""
# Add amount to temporary storage
if server:
self.cached_amount[server] += amount
self.sum_cached_amount += amount
return
t = time.time()
if t > self.end_of_day:
# Current day passed, get new end of day
self.day_label = time.strftime("%Y-%m-%d")
self.end_of_day = tomorrow(t) - 1.0
self.day_total = {}
# Check end of week and end of month
if t > self.end_of_week:
self.week_total = {}
self.end_of_week = next_week(t) - 1.0
if t > self.end_of_month:
self.month_total = {}
self.end_of_month = next_month(t) - 1.0
if server:
if server not in self.day_total:
self.day_total[server] = 0
self.day_total[server] += amount
# Need to reset all counters
for server in sabnzbd.Downloader.servers[:]:
self.init_server_stats(server.id)
if server not in self.week_total:
self.week_total[server] = 0
self.week_total[server] += amount
# Add amounts that have been stored temporarily to statistics
for srv in self.cached_amount:
if self.cached_amount[srv]:
self.day_total[srv] += self.cached_amount[srv]
self.week_total[srv] += self.cached_amount[srv]
self.month_total[srv] += self.cached_amount[srv]
self.grand_total[srv] += self.cached_amount[srv]
self.timeline_total[srv][self.day_label] += self.cached_amount[srv]
if server not in self.month_total:
self.month_total[server] = 0
self.month_total[server] += amount
# Update server bps
try:
self.server_bps[srv] = (
self.server_bps[srv] * (self.last_update - self.start_time) + self.cached_amount[srv]
) / (t - self.start_time)
except ZeroDivisionError:
self.server_bps[srv] = 0.0
if server not in self.grand_total:
self.grand_total[server] = 0
self.grand_total[server] += amount
# Reset for next time
self.cached_amount[srv] = 0
if server not in self.timeline_total:
self.timeline_total[server] = {}
if self.day_label not in self.timeline_total[server]:
self.timeline_total[server][self.day_label] = 0
self.timeline_total[server][self.day_label] += amount
# Quota check
if self.have_quota and self.quota_enabled:
self.left -= amount
if self.left <= 0.0:
if not sabnzbd.Downloader.paused:
sabnzbd.Downloader.pause()
logging.warning(T("Quota spent, pausing downloading"))
# Quota check
if self.have_quota and self.quota_enabled:
self.left -= self.sum_cached_amount
if self.left <= 0.0:
if not sabnzbd.Downloader.paused:
sabnzbd.Downloader.pause()
logging.warning(T("Quota spent, pausing downloading"))
# Speedometer
try:
self.bps = (self.bps * (self.last_update - self.start_time) + amount) / (t - self.start_time)
except:
self.bps = (self.bps * (self.last_update - self.start_time) + self.sum_cached_amount) / (
t - self.start_time
)
except ZeroDivisionError:
self.bps = 0.0
self.server_bps = {}
if server and server not in self.server_bps:
self.server_bps[server] = 0.0
for server_to_update in self.server_bps:
try:
# Only add data to the current server, update the rest to get correct average speed
self.server_bps[server_to_update] = (
self.server_bps[server_to_update] * (self.last_update - self.start_time)
+ amount * (server_to_update == server)
) / (t - self.start_time)
except:
self.server_bps[server_to_update] = 0.0
self.sum_cached_amount = 0
self.last_update = t
check_time = t - 5.0
@@ -283,7 +336,7 @@ class BPSMeter:
self.reset()
elif self.log_time < check_time:
logging.debug("bps: %s", self.bps)
logging.debug("Speed: %sB/s", to_units(self.bps))
self.log_time = t
if self.speed_log_time < (t - 1.0):
@@ -293,20 +346,10 @@ class BPSMeter:
def register_server_article_tried(self, server: str):
"""Keep track how many articles were tried for each server"""
if server not in self.article_stats_tried:
self.article_stats_tried[server] = {}
self.article_stats_failed[server] = {}
if self.day_label not in self.article_stats_tried[server]:
self.article_stats_tried[server][self.day_label] = 0
self.article_stats_failed[server][self.day_label] = 0
# Update the counters
self.article_stats_tried[server][self.day_label] += 1
def register_server_article_failed(self, server: str):
"""Keep track how many articles failed for each server"""
# This function is always called after the one above,
# so we can skip the check if the keys in the dict exist
self.article_stats_failed[server][self.day_label] += 1
def reset(self):
@@ -314,8 +357,11 @@ class BPSMeter:
self.start_time = t
self.log_time = t
self.last_update = t
# Reset general BPS and the for all servers
self.bps = 0.0
self.server_bps = {}
for server in self.server_bps:
self.server_bps[server] = 0.0
def add_empty_time(self):
# Extra zeros, but never more than the maximum!
@@ -328,7 +374,7 @@ class BPSMeter:
self.bps_list = self.bps_list[len(self.bps_list) - BPS_LIST_MAX :]
def get_sums(self):
""" return tuple of grand, month, week, day totals """
"""return tuple of grand, month, week, day totals"""
return (
sum([v for v in self.grand_total.values()]),
sum([v for v in self.month_total.values()]),
@@ -337,7 +383,7 @@ class BPSMeter:
)
def amounts(self, server: str):
""" Return grand, month, week, day and article totals for specified server """
"""Return grand, month, week, day and article totals for specified server"""
return (
self.grand_total.get(server, 0),
self.month_total.get(server, 0),
@@ -349,7 +395,7 @@ class BPSMeter:
)
def clear_server(self, server: str):
""" Clean counters for specified server """
"""Clean counters for specified server"""
if server in self.day_total:
del self.day_total[server]
if server in self.week_total:
@@ -364,6 +410,7 @@ class BPSMeter:
del self.article_stats_tried[server]
if server in self.article_stats_failed:
del self.article_stats_failed[server]
self.init_server_stats(server)
self.save()
def get_bps_list(self):
@@ -372,6 +419,32 @@ class BPSMeter:
# We record every second, but display at the user's refresh-rate
return self.bps_list[::refresh_rate]
def get_stable_speed(self, timespan=10):
"""See if there is a stable speed the last <timespan> seconds
None: indicates it can't determine yet
False: the speed was not stable during <timespan>
"""
if len(self.bps_list) < timespan:
return None
# Calculate the variance in the speed
avg = sum(self.bps_list[-timespan:]) / timespan
vari = 0
for bps in self.bps_list[-timespan:]:
vari += abs(bps - avg)
vari = vari / timespan
try:
# See if the variance is less than 5%
if (vari / (self.bps / KIBI)) < 0.05:
return avg
else:
return False
except:
# Probably one of the values was 0
pass
return None
def reset_quota(self, force: bool = False):
"""Check if it's time to reset the quota, optionally resuming
Return True, when still paused or should be paused
@@ -388,7 +461,7 @@ class BPSMeter:
return True
def next_reset(self, t: Optional[float] = None):
""" Determine next reset time """
"""Determine next reset time"""
t = t or time.time()
tm = time.localtime(t)
if self.q_period == "d":
@@ -419,7 +492,7 @@ class BPSMeter:
logging.debug("Will reset quota at %s", tm)
def change_quota(self, allow_resume: bool = True):
""" Update quota, potentially pausing downloader """
"""Update quota, potentially pausing downloader"""
if not self.have_quota and self.quota < 0.5:
# Never set, use last period's size
per = cfg.quota_period()
@@ -449,7 +522,7 @@ class BPSMeter:
self.resume()
def get_quota(self):
""" If quota active, return check-function, hour, minute """
"""If quota active, return check-function, hour, minute"""
if self.have_quota:
self.q_period = cfg.quota_period()[0].lower()
self.q_day = 1
@@ -478,24 +551,19 @@ class BPSMeter:
return None, 0, 0
def set_status(self, status: bool, action: bool = True):
""" Disable/enable quota management """
"""Disable/enable quota management"""
self.quota_enabled = status
if action and not status:
self.resume()
@staticmethod
def resume():
""" Resume downloading """
"""Resume downloading"""
if cfg.quota_resume() and sabnzbd.Downloader.paused:
sabnzbd.Downloader.resume()
def midnight(self):
""" Midnight action: dummy update for all servers """
for server in self.day_total.keys():
self.update(server)
def quota_handler():
""" To be called from scheduler """
"""To be called from scheduler"""
logging.debug("Checking quota")
sabnzbd.BPSMeter.reset_quota()

Some files were not shown because too many files have changed in this diff Show More