Compare commits

...

361 Commits

Author SHA1 Message Date
Safihre
5e42e25617 Set version to 4.0.0 2023-04-28 14:56:51 +02:00
Safihre
c27c9564cf Merge branch '4.0.x' 2023-04-28 14:53:02 +02:00
Safihre
c4b0da335d Update text files for 4.0.0 2023-04-28 14:47:36 +02:00
Safihre
b73699be8d Allow 20 min for CI tests 2023-04-25 17:12:31 +02:00
SABnzbd Automation
bc87b6e955 Update translatable texts
[skip ci]
2023-04-25 14:48:40 +00:00
Safihre
f15155ddc9 Add Keyboard shortcut hint in the Status window
Closes sabnzbd/sabnzbd.github.io/issues/235
2023-04-25 16:47:24 +02:00
renovate[bot]
37b556012e Update all dependencies 2023-04-24 05:38:50 +00:00
SABnzbd Automation
79ba3dd874 Update translatable texts
[skip ci]
2023-04-23 19:40:19 +00:00
Safihre
28795c3158 Re-ordering Sorters was not possible after refactor
Closes #2536
2023-04-23 21:38:57 +02:00
SABnzbd Automation
935d248b53 Update translatable texts
[skip ci]
2023-04-19 14:52:21 +00:00
Safihre
b2103afe30 Update text files for 4.0.0RC1 2023-04-19 16:51:05 +02:00
Safihre
fcbc4e420e Add locking to __reset_nw
Relates to #2533
2023-04-19 13:21:15 +02:00
Safihre
19fcda877f Show Sorting edit details when clicking on display data 2023-04-19 12:35:34 +02:00
SABnzbd Automation
48cd93ef93 Update translatable texts
[skip ci]
2023-04-19 10:19:27 +00:00
Safihre
80fd39826b Add Quick Start suggestions when user has no Sorters defined 2023-04-19 12:17:50 +02:00
Safihre
50c7d1531b Store yEnc-detected begin and size
We will use this later, see #2526
2023-04-17 22:02:09 +02:00
SABnzbd Automation
657c6f2b7d Update translatable texts
[skip ci]
2023-04-17 05:12:52 +00:00
renovate[bot]
e7484fac09 Update all dependencies 2023-04-17 05:11:37 +00:00
Safihre
613ec9c48c Try to fix armhf Snap build 2023-04-14 12:43:41 +02:00
SABnzbd Automation
322050efd8 Update translatable texts
[skip ci]
2023-04-14 09:34:13 +00:00
Safihre
5242368343 Add possibility to mark Option's as non-public
Closes #2489
2023-04-14 11:18:15 +02:00
Safihre
564151e520 Resolve HTML code issues 2023-04-13 13:39:36 +02:00
Safihre
b40220cb73 Only convert old-style sorters if they were enabled 2023-04-13 13:14:18 +02:00
Safihre
2ebac74049 Correct HTML for Sorting page 2023-04-13 12:57:27 +02:00
SABnzbd Automation
8ede63a960 Update translatable texts
[skip ci]
2023-04-12 21:06:53 +00:00
Safihre
38a0cc39e6 Improve preset display for Sorters 2023-04-12 22:28:37 +02:00
SABnzbd Automation
b482b61770 Update translatable texts
[skip ci]
2023-04-12 15:19:07 +00:00
Safihre
36a6f6e151 First refactor of new Sorting page
@jcfp FYI :)
2023-04-12 17:17:51 +02:00
Safihre
0c45883649 Remove Windows firewall rules on uninstall and prevent duplicating them
Closes #2528
2023-04-12 16:12:22 +02:00
renovate[bot]
c243144009 Update all dependencies 2023-04-10 07:24:25 +00:00
Safihre
4e2df006e7 Use correct pip call to update pip itself on Windows 2023-04-08 22:15:55 +02:00
SABnzbd Automation
02964d3bef Update translatable texts
[skip ci]
2023-04-08 20:09:29 +00:00
Safihre
c0e50aac48 Update text files for 4.0.0Beta2 2023-04-08 22:08:18 +02:00
Safihre
6c0804ba4f Correctly handle broken par2 files
Closes #2517
2023-04-07 22:39:32 +02:00
Safihre
708b13dd71 Prevent orphaned Article objects resulting in ghost files
Relates to #2521, #2517
2023-04-06 21:41:40 +02:00
Safihre
eb64e054b5 Refactor par2file 2023-04-06 21:11:34 +02:00
SABnzbd Automation
c42f7f930c Update translatable texts
[skip ci]
2023-04-04 17:36:21 +00:00
Sander
44c1d7306d Bigger files (50 and 100MB) for internet speed testing (#2524)
Co-authored-by: sander <san.d.erjonkers+github@gmail.com>
2023-04-04 19:35:06 +02:00
SABnzbd Automation
2413c22a51 Update translatable texts
[skip ci]
2023-04-03 07:37:32 +00:00
Safihre
31fefb4f86 Actually remove the RAR inspection traceback logging 2023-04-03 09:36:25 +02:00
renovate[bot]
745fd81aa1 Update all dependencies 2023-04-03 05:39:09 +00:00
Safihre
f7bf1567c1 Add sleep between Transifex push and pull 2023-04-02 21:30:49 +02:00
Safihre
02021a09b1 Don't show traceback on RAR-inspection failure
Closes #2482
2023-04-02 21:30:49 +02:00
SABnzbd Automation
6411d32228 Update translatable texts
[skip ci]
2023-04-02 19:22:43 +00:00
Safihre
56287e8094 Small refactor of Server-methods 2023-04-02 14:16:02 +02:00
thezoggy
62f70fd628 Set min-width to make macos chrome behave like others (#2518) 2023-03-29 09:16:00 +02:00
Thomas
dcca2c5821 Check for errors when creating the download path (#2516)
Fixes https://github.com/sabnzbd/sabnzbd/issues/2515.
2023-03-28 17:54:39 +02:00
dependabot[bot]
d22f2296c2 Bump actions/stale from 7 to 8 (#2514)
Bumps [actions/stale](https://github.com/actions/stale) from 7 to 8.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-27 13:56:25 +02:00
SABnzbd Automation
2e0ea5d085 Update translatable texts
[skip ci]
2023-03-27 05:49:28 +00:00
renovate[bot]
cb4526e8e2 Update all dependencies 2023-03-27 05:48:30 +00:00
puzzledsab
fc3132cd77 Set maximum soft sleep time to 0.15 seconds (#2510) 2023-03-22 21:34:51 +01:00
Michael Nightingale
e474db33ec Check speedlimit after each recv (#2509) 2023-03-20 21:55:10 +01:00
jcfp
6274d2b250 avoid traceback after postproc script (#2508) 2023-03-20 19:28:51 +01:00
puzzledsab
d4bfdaa29e Tweak assembler queue variables for smoother download (#2505) 2023-03-20 08:47:51 +01:00
renovate[bot]
3b7f5f5ce0 Update all dependencies 2023-03-20 05:05:53 +00:00
Safihre
496e2f1840 Bring BPSMeter and Assembler check back in main loop 2023-03-19 22:23:50 +01:00
Safihre
98f3c055d7 Ignore resource fork files created by macOS
Closes #2380
2023-03-19 21:41:31 +01:00
Safihre
7df36ce8b4 switchinterval should be a positive number
Closes #2504
2023-03-17 21:32:23 +01:00
SABnzbd Automation
5deaca45c2 Update translatable texts
[skip ci]
2023-03-16 21:41:31 +00:00
Safihre
e790757855 Update text files for 4.0.0Beta1 2023-03-16 22:40:22 +01:00
jcfp
46b2c6494f only save series_info in the history db for job type "tv" (#2496)
* only save series_info for job type "tv"

* make analyse_show return a dictionary
2023-03-16 22:23:45 +01:00
Sander
c4216a4075 Deobfuscate filenames ON by default (#2493)
* Deobfuscate ON by default

* Correct data test set: filename that is not obfuscated. Except test_par2file

* Correct data test set: filename that is not obfuscated. Except test_par2file

* Commented out test in test_par2file.py

* Commented out test in test_par2file.py

* assert for unicode_rar 我喜欢编程 now working too

---------

Co-authored-by: sander <san.d.erjonkers+github@gmail.com>
2023-03-15 22:31:09 +01:00
SABnzbd Automation
375412aa42 Update translatable texts
[skip ci]
2023-03-15 17:04:36 +00:00
thezoggy
895ac56eb3 change regex for hash from md5 to more generic to catch more hashes (ex: apikey in rss feed), and hide email_from as well (#2499) 2023-03-15 18:03:22 +01:00
SABnzbd Automation
c593388ec6 Update translatable texts
[skip ci]
2023-03-14 07:05:56 +00:00
jakepez
1c6960fe44 Corrected msgids - msgid "Pause * prioirty jobs" spelling error (#2501)
* Corrected msgid spelling error

* Reverted change to en.po as requested
2023-03-14 08:04:53 +01:00
Safihre
e7ac2ffd6c Broaden renovate trigger window 2023-03-13 12:49:27 +01:00
SABnzbd Automation
df35e54fba Update translatable texts
[skip ci]
2023-03-10 20:37:03 +00:00
puzzledsab
15f757ae04 Make cleanup_list use scandir and keep main nzb directory even if it's empty (#2497)
* Make cleanup_list use scandir and keep main nzb directory even if it's empty

* Use entry.path
2023-03-10 21:35:45 +01:00
Safihre
b7dc15099c Change quote style of Stale action condition 2023-03-10 08:38:37 +01:00
jcfp
dc33c67f48 fix extra info fields for pre-q scripts (#2494) 2023-03-09 17:34:38 +01:00
SABnzbd Automation
89fb517fd1 Update translatable texts
[skip ci]
2023-03-09 13:06:13 +00:00
jcfp
51eb94dbe9 Sorter fixes (#2492)
* fix typos (closes #2488)

* fix logic errors in prepare_extraction_path (closes #2490, closes #2491)
2023-03-09 14:05:01 +01:00
Safihre
03747f618f Do not run Stale action on forks 2023-03-08 09:55:12 +01:00
SABnzbd Automation
8154322448 Update translatable texts
[skip ci]
2023-03-08 08:54:04 +00:00
Safihre
7531ae2749 Replace Stale-bot by Stale-action 2023-03-08 09:52:23 +01:00
SABnzbd Automation
32515172d3 Update translatable texts
[skip ci]
2023-03-06 21:24:14 +00:00
Safihre
3b500ecf69 Update text files for 4.0.0 Alpha 3 2023-03-06 22:23:11 +01:00
SABnzbd Automation
b93dd4751d Update translatable texts
[skip ci]
2023-03-06 21:14:18 +00:00
jcfp
d651f8db34 Replace series/date/movie sorters with a generic one + season pack handling (#2461)
* replace series/date/movie sorters with a generic sorter

* fix test_eval_sort on windoze

* unbreak and de-uglify the fix

* add special setting for season pack sorting

* remove unused import

* replace series/date/movie sorters with a generic sorter

* fix test_eval_sort on windoze

* unbreak and de-uglify the fix

* add special setting for season pack sorting

* remove unused import

* correct type for sort_type entries

* standardize ui

* add visual hints for drag-n-drop

* move presets directly below sort string field

* replace hex with ascii letters to avoid random occurences of (cd|e)[0-9]+

* Some styling things

---------

Co-authored-by: Safihre <safihre@sabnzbd.org>
2023-03-06 22:13:12 +01:00
Safihre
3f8f7d21d0 Revert "Make renovate config less strict on when it runs on Monday"
This reverts commit a1d51502c4.
2023-03-06 21:38:05 +01:00
renovate[bot]
824341e396 Update all dependencies 2023-03-06 15:32:27 +00:00
SABnzbd Automation
a972708d69 Update translatable texts
[skip ci]
2023-03-06 01:29:48 +00:00
renovate[bot]
47b305c83b Update all dependencies 2023-03-06 01:28:44 +00:00
SABnzbd Automation
2ec3da18f2 Update translatable texts
[skip ci]
2023-03-02 21:32:12 +00:00
Michael Nightingale
70aea9ac0c Decode articles as they are downloaded (#2476)
* Decode articles as they are downloaded

* Combine the recv and process methods

* Less cryptic futures

* Lock get_article because it can be called by multiple threads within the pool

* Add handle_process_nw_result

* Use add_socket helper

* Lock finish_connect_nw

* Add locks and remove callback

* Use same lock for updating nzo statistics

* Remove None typing

* Add downloader lock

* read_fds by index because it will never fail

* Use downloader lock
2023-03-02 22:31:11 +01:00
Safihre
38270bf4e2 Do not auto-update sabctools
We will do it manually when needed, as it also requires the constants.py value to be updated.
2023-02-28 22:00:04 +01:00
thezoggy
05d58ca0da update unrar to 6.21 (#2479) 2023-02-28 11:42:42 +01:00
Safihre
91aab54b43 Update sabctools 2023-02-28 10:40:20 +00:00
renovate[bot]
25d552c09e Update all dependencies 2023-02-28 10:40:20 +00:00
Safihre
a1d51502c4 Make renovate config less strict on when it runs on Monday 2023-02-24 08:07:35 +01:00
SABnzbd Automation
883d1dfa19 Update translatable texts
[skip ci]
2023-02-22 22:05:59 +00:00
Safihre
fab36ec008 Set version to 3.7.2 2023-02-05 22:17:20 +01:00
Safihre
8a2b875779 Merge branch '3.7.x' 2023-02-05 22:15:54 +01:00
Safihre
efaffb8298 Update text files for 3.7.2 2023-02-05 22:15:40 +01:00
jcfp
e004eb3f00 restore startup history purge (#2449) 2023-02-05 22:08:12 +01:00
Safihre
43e8f6dc81 Update formatting with black 23 rules 2023-02-05 22:08:07 +01:00
Safihre
f5bff8fe7c Update copyright year to 2023 2023-02-05 22:07:42 +01:00
Safihre
fad8484b93 Update text files for 3.7.2RC1 2023-01-23 21:49:08 +01:00
Safihre
7664b54f89 Fix orjson to 3.8.3 due to issue in 3.8.4 2023-01-15 13:52:25 +01:00
Safihre
21cbc353dd Update text files for 3.7.2Beta1 2023-01-15 13:46:21 +01:00
Safihre
8d66306ec4 Merge branch 'develop' into 3.7.x 2023-01-15 13:35:21 +01:00
Safihre
479daf0e76 Set version to 3.7.1 2022-12-16 22:04:36 +01:00
Safihre
bf0fbb7b10 Merge branch '3.7.x' 2022-12-16 22:03:56 +01:00
Safihre
d3c91f1585 Update text files for 3.7.1 2022-12-16 22:02:40 +01:00
Safihre
ca165b328a Update text files for 3.7.1RC2 2022-12-06 17:10:08 +01:00
Safihre
fa2ffeea92 Merge branch 'develop' into 3.7.x 2022-12-06 17:07:31 +01:00
Safihre
0d00965ac3 Update text files for 3.7.1RC1 2022-12-01 16:33:59 +01:00
Safihre
7d7bec1f80 Merge branch 'develop' into 3.7.x 2022-12-01 16:09:09 +01:00
Safihre
b6fd915365 Set version to 3.7.0 2022-11-04 10:36:24 +01:00
Safihre
fecae72267 Merge branch '3.7.x' 2022-11-04 10:23:22 +01:00
Safihre
7bffd91e3f Update text files for 3.7.0 2022-11-04 10:18:37 +01:00
Safihre
f859521a7e Replace apple-actions/import-codesign-certs 2022-11-04 10:17:28 +01:00
renovate[bot]
a869386fac Update dependency cryptography to v38.0.3 [SECURITY] 2022-11-04 09:30:25 +01:00
Safihre
8bc7885b7a Update translatable texts
[skip ci]
2022-11-04 09:29:14 +01:00
Safihre
78be46738d Correct typo of Python 3.11 version 2022-10-27 10:07:01 +02:00
Safihre
6fce73855c Update text files for 3.7.0RC1 2022-10-27 09:08:20 +02:00
Safihre
fa844a6223 Update Release Notes with right version 2022-08-18 10:46:08 +02:00
Safihre
906379dd09 Set all versions to 3.6.1 2022-08-18 09:52:31 +02:00
Safihre
37cded612f Set version to 3.6.1 2022-08-18 08:48:09 +02:00
Safihre
73e8fade61 Merge branch '3.6.x' 2022-08-18 08:47:17 +02:00
Safihre
758cc7afab Update text files for 3.6.1RC2 2022-08-12 20:18:11 +02:00
Safihre
d74b7b06d2 Update Unrar to 6.11/6.12
Closes #2265
2022-08-12 20:16:34 +02:00
Safihre
39009f2f71 Update text files for 3.6.1RC1 2022-08-03 21:44:29 +02:00
jcfp
9fdc1c6813 use OSType in pyfakefs instead of setting separate properties (#2243) 2022-08-03 21:44:29 +02:00
Safihre
c5568fe830 Remove deprecation notices 2022-08-02 22:31:49 +02:00
Safihre
bad81f84b9 Update dependencies and Python version 2022-08-02 22:29:58 +02:00
Safihre
2ac08dd0e6 Remove new QuickCheck implementation
See https://github.com/sabnzbd/sabnzbd/discussions/2160
And https://github.com/sabnzbd/sabnzbd/issues/2251
2022-08-02 22:21:12 +02:00
Safihre
408ffc4539 Downloads in Checking-status were not displayed correctly
Closes #2249
2022-07-25 11:02:50 +02:00
Safihre
eb958327c5 Prevent scheduler crash if event is canceled that was no longer queued
https://www.reddit.com/r/SABnzbd/comments/vfa1fr/what_is_causing_this_error_its_not_harming/
2022-06-19 20:37:14 +02:00
Safihre
e157d77a1e Prevent crash in new Quick-check if file was already moved 2022-06-16 13:54:19 +02:00
Joulinar
e961c9ea8f Update sabyenc3 to 5.4.3 (#2209)
* Update requirements.txt

Update requirements sabyenc3 to new version

* Update sabyenc3 to 5.4.3

Update sabyenc3 to 5.4.2
2022-06-15 13:25:27 +02:00
Safihre
258c4f769d Prevent showing crash on Status window during Shutdown 2022-06-14 14:59:06 +02:00
Safihre
b31fedd857 Set version to 3.6.0 2022-06-07 12:23:13 +02:00
Safihre
eafe69500b Merge branch '3.6.x' 2022-06-07 12:22:36 +02:00
Safihre
ae09990c43 Update text files for 3.6.0 2022-06-07 12:20:28 +02:00
Safihre
cf54b65c32 Remove enable_https_verification from possible deprecation list 2022-06-07 09:29:09 +02:00
Safihre
7974421fa1 Update text files for 3.6.0RC3 2022-05-29 14:34:48 +02:00
Safihre
847a098d4e Update sabyenc3 to 5.4.2 2022-05-29 14:28:55 +02:00
Safihre
eb4de0ae0f Remove helpful warning about new quick-check for release 2022-05-28 20:19:59 +02:00
Safihre
bca9f3b753 Set version to 3.5.3 2022-03-17 14:29:50 +01:00
Safihre
cad8a9a5d3 Merge branch '3.5.x' 2022-03-17 14:12:55 +01:00
Safihre
f5f36d21e8 Update text files 3.5.3 2022-03-17 14:12:40 +01:00
Safihre
c51435c114 Revert "Notify users of Prowl/Pushover/Pushbullet to switch to nzb-notify"
This reverts commit 56fe140ebf.
2022-03-15 21:52:16 +01:00
Safihre
2a7f1780b4 Update text files for 3.5.3RC1 2022-03-13 13:26:18 +01:00
Safihre
98a44e40fb Jobs waiting to fetch get stuck indefinitely upon restart
Closes #2114
2022-03-11 16:29:28 +01:00
Safihre
65cf6fa9a1 Prevent Direct Unpack proceeding faster than it should, locking files
Relates to #2113
2022-03-11 16:29:19 +01:00
Safihre
b2e32d1720 Log also the OSError.winerror just to be sure 2022-03-11 16:29:11 +01:00
Safihre
f0bfedbe8e Revert "Revert "Disable buffering when writing files in assembler""
This reverts commit 03b380f90b.
2022-03-11 16:29:04 +01:00
Safihre
fd4e059c13 Set version to 3.5.2 2022-03-09 14:33:48 +01:00
Safihre
a53575e154 Merge branch '3.5.x' 2022-03-09 14:24:26 +01:00
Safihre
4a73484603 Update text files for 3.5.2 2022-03-09 14:24:13 +01:00
Safihre
03b380f90b Revert "Disable buffering when writing files in assembler"
This reverts commit 3c3aeac93c.

It turns out this causes problems!
2022-03-03 15:44:15 +01:00
Safihre
a2bd3b2dfe RSS filters At most/least were broken 2022-03-01 08:42:31 +01:00
Safihre
56fe140ebf Notify users of Prowl/Pushover/Pushbullet to switch to nzb-notify
Relates to #2093
2022-02-24 16:47:44 +01:00
Safihre
4fafcce740 Set version to 3.5.1 2022-02-20 19:47:55 +01:00
Safihre
02352c4ae6 Merge branch '3.5.x' 2022-02-20 19:37:50 +01:00
Safihre
4b74aab335 Update text files for 3.5.1 2022-02-20 19:36:51 +01:00
Safihre
2d67ac189d Add Debug logging when applying permissions failed 2022-02-16 13:08:12 +01:00
Safihre
8ece62e23d Add small delay to test_download check of result file
To prevent zip-test-failures on Windows.
2022-02-16 12:48:53 +01:00
Safihre
56c2bdd77d Allow chmod failures if no custom permissions are set
This is the same as before 3.5.0!
2022-02-16 11:32:15 +01:00
Safihre
1f555f1930 Update text files for 3.5.1RC2 2022-02-14 09:22:45 +01:00
Wolfgang Scherer
8496432c14 Do not fail if attribute subject is missing in NZB file-section (#2075)
* Use attribute poster of file element, if attribute subject ist missing

* Don't fail, if subject is missing.

* Textual change

Co-authored-by: Safihre <safihre@sabnzbd.org>
2022-02-14 09:16:29 +01:00
jcfp
1672ffa670 set log level of "completed not on fat" to debug 2022-02-14 09:16:23 +01:00
Safihre
6aab199f12 Wait before removing the temporary directory in binary test 2022-02-09 14:58:17 +01:00
Safihre
46d0c379a4 Fix version of more dependencies 2022-02-09 14:58:12 +01:00
Safihre
99240f145a Restore correct display of Direct Unpack progress 2022-02-07 15:27:54 +01:00
Safihre
3c9079d73c Correctly handle the transition from download to active post-processing 2022-02-07 15:22:58 +01:00
Safihre
0eb98b9a6c Use nzo.deleted instead of nzo.is_gone to prevent assembly during pp
Relates to #2059, #2054 and #1509.
2022-02-07 12:14:00 +01:00
Safihre
76bfd98b77 Prevent Direct Unpack crash on obfuscated posts
Closes #2060
2022-02-07 11:57:55 +01:00
Safihre
3348640c88 Correct undefined function remove_data 2022-02-05 09:51:36 +01:00
Safihre
d81c64fd2b Use notarytool on macOS to do notarization 2022-02-04 22:28:46 +01:00
Safihre
8b4c919617 Test starting of binary during release building 2022-02-04 21:53:04 +01:00
Safihre
76c58953df Pin even more requirements
Closes #2056
2022-02-04 10:09:53 +01:00
thezoggy
4ddc5caa49 pin builder setuptools to deal with breakage on pyinstaller 4.8 2022-02-04 09:08:51 +01:00
Safihre
694663bd95 Update text files for 3.5.1RC1 2022-02-03 20:09:38 +01:00
Safihre
62aba5844e Add small delay between volumes in Direct Unpack to prevent UnRar error 2022-01-31 12:23:38 +01:00
Safihre
d0d60cef05 Disable buffering when writing files in assembler 2022-01-31 12:23:31 +01:00
Safihre
3d293fdcb0 RSS feeds with HTML-chars in the feed name would result in crash 2022-01-31 12:23:23 +01:00
Safihre
96e9528046 Fix dependencies in requirements.txt and configure dependabot 2022-01-30 10:52:52 +01:00
Safihre
4ea24b3203 Black formatting update 2022-01-30 09:43:31 +01:00
Safihre
a756eea25a Set version to 3.5.0 2022-01-28 11:47:15 +01:00
Safihre
210020e489 Merge branch '3.5.x' 2022-01-28 11:42:22 +01:00
Safihre
e586ead024 Update text files for 3.5.0 2022-01-28 11:39:21 +01:00
Safihre
14c80bf1dc Reduce par2cmdline output log in Debug mode 2022-01-28 11:35:59 +01:00
Safihre
bdd56e794a Prevent extra error when no 7zip is available
Closes #2036, #2035
2022-01-23 13:41:26 +01:00
Safihre
a544548934 Set Python for macOS release to 3.10.2 2022-01-21 16:53:29 +01:00
Safihre
e06c1d61fb Update text files for 3.5.0RC4 2022-01-18 09:41:26 +01:00
Safihre
600c5209c6 HTML-sanitizer would sanitize the source data
Closes #2026
2022-01-17 14:08:08 +01:00
Safihre
bee90366ee Update text files for 3.5.0RC3 2022-01-16 19:02:50 +01:00
Safihre
e9bc4e9417 Sort sevenset so x.7z.001 is always the first file 2022-01-15 17:09:21 +01:00
Safihre
f01ff15761 Failed 7zip unpack was not reported in the history 2022-01-15 17:05:03 +01:00
Safihre
356ada159d Update text files for 3.5.0RC2 2022-01-13 14:48:30 +01:00
Safihre
cc831e16d8 Set version to 3.4.2 2021-10-15 08:28:14 +02:00
Safihre
b8dc46ad01 Merge branch '3.4.x' 2021-10-15 08:24:21 +02:00
Safihre
d8ab19087d Update text files for 3.4.2 2021-10-15 08:19:00 +02:00
Safihre
ec8a79eedd Revert to using regex based sample detection
Closes #1964
2021-10-13 18:24:48 +02:00
Safihre
f1e2a8e9d8 Prevent double guessit parsing 2021-10-12 09:02:03 +02:00
Safihre
4042a5fe5d Update text files for 3.4.2RC3 2021-10-08 10:41:27 +02:00
Safihre
a4752751ed Fix tavern for Python 3.6 and run tests on Python 3.10 (Linux-only) 2021-10-08 10:34:14 +02:00
Safihre
e23ecf46d1 Correct behavior of Sorter when no filename and/or extension is supplied
Closes #1962, #1957
2021-10-08 10:24:44 +02:00
Safihre
70a8c597a6 Only fail jobs if the sorter should have renamed 2021-10-08 09:58:17 +02:00
Safihre
fa639bdb53 Use general detection of RAR-files in file-extension correction
Correct file_extension test
2021-10-08 09:58:17 +02:00
Safihre
233bdd5b1d Update text files for 3.4.2RC2 2021-10-06 15:00:44 +02:00
Safihre
a0ab6d35c7 Require at least 1 category to be set for Sorting and warn if not set
Before 3.4.0, only for TV sorting we allowed to set 0 categories. But for Movies and Date Sorting we did require at least 1 category to be set. This was harmonized in 3.4.0, breaking existing setups. Added warning for those users.
The Sorting behavior is different from Notifications: in Notifications selecting Default only(!) means to apply it to all categories.
However, that has never been the case for Sorting. So for now added a bit more help texts to the Affected categories box on both pages.
2021-10-06 14:50:00 +02:00
Sander
bd29680ce7 make .cbz a well-known extension, so that no extension is added (#1960) 2021-10-06 14:49:54 +02:00
Sander
7139e92554 make .cbr a well-known extension, so that no extension (".rar") is added (#1959) 2021-10-05 12:19:55 +02:00
Safihre
897df53466 Check for puremagic and guessit first and add comments about cherrypy 2021-10-04 08:57:58 +02:00
Safihre
58281711f6 Always show number of MB missing
https://forums.sabnzbd.org/viewtopic.php?f=2&t=25573
2021-10-04 08:57:51 +02:00
Safihre
b524383aa3 Job failure due to Sorting-problems was not shown in the interface 2021-10-01 15:35:09 +02:00
Safihre
75a16e3588 Update text files for 3.4.2RC1 2021-09-30 09:04:12 +02:00
Safihre
1453032ad6 rXX files are popular extensions and don't need renames
Closes #1955
2021-09-29 13:53:47 +02:00
Safihre
824ab4afad Do not search whole file when checking if txt or nzb file 2021-09-29 13:53:37 +02:00
Safihre
73dd41c67f Only run process_unpacked_par2 when cleanup happened
Relates to https://forums.sabnzbd.org/viewtopic.php?f=1&t=25552
2021-09-29 13:53:32 +02:00
Safihre
59ee77355d Make add_parfile return if it could actually add the file
Maybe it was long finished, which could result in crashes.
Closes #1953
2021-09-29 13:53:20 +02:00
Safihre
5c758773ad Do not rename in decode_par2 if the filename didn't change
Closes #1952
2021-09-29 13:53:14 +02:00
Safihre
46de49df06 Set version to 3.4.1 2021-09-23 09:21:11 +02:00
Safihre
d1c54a9a74 Merge branch 'develop' 2021-09-23 08:50:17 +02:00
Safihre
e7527c45cd Set version to 3.4.0 2021-09-17 22:01:19 +02:00
Safihre
7d5207aa67 Merge branch 'develop' 2021-09-17 20:46:31 +02:00
Safihre
654302e691 Set version to 3.3.1 2021-06-18 13:52:58 +02:00
Safihre
ee673b57fd Merge branch '3.3.x' 2021-06-18 13:51:48 +02:00
Safihre
2be374b841 Update text files for 3.3.1 2021-06-18 13:51:33 +02:00
puzzledsab
906e1eda89 Keep password order 2021-06-13 16:21:41 +02:00
Safihre
ece02cc4fa Automatically publish release when all files are present 2021-06-11 17:39:30 +02:00
Safihre
876ad60ddf Update text files for 3.3.1RC1 2021-06-11 14:59:25 +02:00
Safihre
862da354ac Add direct opening of tabs by URL to Glitter tab-layout 2021-06-11 14:28:31 +02:00
Safihre
8fd477b979 Include wiki URL in Internal internet access denied message 2021-06-05 15:56:20 +02:00
Safihre
2d7005655c Clean timeline_total of BPSMeter
Received multiple reports that somehow it could get corrupt values in there
2021-06-05 15:56:16 +02:00
Safihre
7322f8348a Filtering active post-proc queue by category was broken 2021-06-05 15:56:09 +02:00
Safihre
e3e3a12e73 Correct example in test_name_extractor 2021-06-05 15:56:04 +02:00
Safihre
77cdd057a4 Filenames should end after the extension 2021-06-01 11:19:49 +02:00
Safihre
e8206fbdd9 Set version to 3.3.0 2021-06-01 07:35:13 +02:00
Jiri van Bergen
589f15a77b Merge branch '3.3.x' 2021-06-01 07:34:59 +02:00
Safihre
7bb443678a Build release when creating the tag 2021-06-01 07:18:41 +02:00
Safihre
6390415101 Update text files for 3.3.0 2021-06-01 07:16:42 +02:00
Sander
4abf192e11 deobfuscate: bugfix for collections if extension in CAPITALS (#1904) 2021-06-01 07:06:21 +02:00
Safihre
1fed37f9da Notify users that Plush will be removed in 3.4.0
Relates to #1902
2021-05-25 09:28:10 +02:00
Safihre
a9d86a7447 Set version to 3.2.1 2021-03-31 10:24:42 +02:00
Safihre
2abe4c3cef Merge branch '3.2.x' 2021-03-31 09:25:49 +02:00
Safihre
0542c25003 Update text files for 3.2.1
draft release
2021-03-31 09:24:31 +02:00
puzzledsab
1b8ee4e290 Show server expiration date in server summary (#1841) 2021-03-31 08:57:38 +02:00
Safihre
51128cba55 Do not notify warning/errors from same source twice
Closes #1842
2021-03-30 17:30:07 +02:00
Safihre
3612432581 Do not discard data for CrcError's
https://forums.sabnzbd.org/viewtopic.php?f=11&t=25278
2021-03-30 16:05:04 +02:00
Safihre
deca000a1b Revert some improvements to the encrypted RAR-detection
Closes #1840
2021-03-29 14:05:52 +02:00
Safihre
39cccb5653 Update text files for 3.2.1RC2
draft release
2021-03-24 10:13:43 +01:00
Safihre
f6838dc985 Improvements to the encrypted RAR-detection 2021-03-20 18:32:11 +01:00
Safihre
8cd4d92395 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 18:32:05 +01:00
Safihre
3bf9906f45 Update text files for 3.2.1RC1
draft release
2021-03-18 10:30:05 +01:00
Safihre
9f7daf96ef Update URL for Python 3 information 2021-03-18 09:10:39 +01:00
Sander
67de4df155 deobfuscate: no globber, but use given filelist (#1830) 2021-03-18 09:10:31 +01:00
Safihre
bc51a4bd1c Remove old compatibility code from BPSMeter that causes crash on startup
Closes #1827
2021-03-18 09:10:23 +01:00
Sander
bb54616018 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-18 09:10:18 +01:00
Safihre
6bcff5e014 More space for the RSS table
Closes #1824
2021-03-18 09:10:09 +01:00
puzzledsab
8970a03a9a Use binary mode to make write test more accurate on Windows (#1815) 2021-03-10 22:23:10 +01:00
Safihre
3ad717ca35 Single indexer categories would be saved with "," between each letter 2021-03-10 22:23:10 +01:00
jcfp
b14f72c67a fix config auto_sort setting, broken by #1666 (#1813)
* fix config auto_sort setting, broken by #1666

* oops I did it again
2021-03-10 22:23:10 +01:00
Safihre
45d036804f Show name of item to be deleted from queue/history in confirm dialog 2021-03-10 22:23:10 +01:00
Safihre
8f606db233 Add traceback when failing to read the password file
Closes #1810
2021-03-10 22:23:10 +01:00
Safihre
3766ba5402 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-03-10 22:23:10 +01:00
jxyzn
e851813cef Sanitize names possibly derived from X-DNZB-EpisodeName (#1806) 2021-03-10 22:15:23 +01:00
thezoggy
4d49ad9141 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:47:44 +01:00
Safihre
16618b3af2 Set version to 3.2.0 2021-02-26 10:30:00 +01:00
Safihre
0e5c0f664f Merge branch '3.2.x' 2021-02-26 10:29:39 +01:00
Safihre
7be9281431 Update text files for 3.2.0
draft release
2021-02-26 09:56:47 +01:00
Safihre
ee0327fac1 Update macOS build Python to 3.9.2 2021-02-26 09:44:51 +01:00
Safihre
9930de3e7f Log all nzo_info when adding NZB's
Relates to #1806
2021-02-26 09:18:14 +01:00
Sander
e8503e89c6 handle gracefully if no malloc_trim() available (#1800) 2021-02-26 09:18:00 +01:00
puzzledsab
1d9ed419eb Remove some redundant ifs (#1791) 2021-02-26 09:17:29 +01:00
Safihre
0207652e3e Update text files for 3.2.0RC2
draft release
2021-02-08 21:02:38 +01:00
Safihre
0f1e99c5cb Update translatable texts 2021-02-08 13:29:16 +01:00
puzzledsab
f134bc7efb 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-08 13:23:03 +01:00
puzzledsab
dcd7c7180e 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-08 13:19:38 +01:00
jcfp
fbbfcd075b 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-08 13:19:30 +01:00
Safihre
f42d2e4140 Rename Glitter Default to Light and make Auto the new Default 2021-02-05 15:01:28 +01:00
Sam Edwards
88882cebbc Support for auto night mode switching in Glitter (#1783) 2021-02-05 15:01:13 +01:00
Safihre
17a979675c Do not re-release from GA when the release tag is pushed 2021-02-05 15:01:04 +01:00
Safihre
4642850c79 Set macOS Python installer target to "/" 2021-02-05 15:01:00 +01:00
Safihre
e8d6eebb04 Set version to 3.1.1 2020-11-11 22:04:44 +01:00
Safihre
864c5160c0 Merge branch '3.1.x' 2020-11-11 22:01:20 +01:00
Safihre
99b5a00c12 Update text files for 3.1.1 2020-11-11 21:56:15 +01:00
Safihre
85ee1f07d7 Do not crash if we cannot format the error message 2020-11-08 15:06:50 +01:00
exizak42
e58b4394e0 Separate email message lines are with CRLF (#1671)
SMTP protocol dictates that all lines are supposed to be separated
with CRLF and not LF (even on LF-based systems). This change ensures
that even if the original byte string message is using `\n` for line
separators, the SMTP protocol will still work properly.

This resolves sabnzbd#1669

Fix code formatting
2020-11-08 14:44:44 +01:00
Safihre
1e91a57bf1 It was not possible to set directory-settings to empty values 2020-11-06 16:14:53 +01:00
Safihre
39cee52a7e Update text files for 3.1.1RC1 2020-11-02 20:03:43 +01:00
Safihre
72068f939d Improve handling of binary restarts (macOS / Windows) 2020-11-02 19:57:57 +01:00
Safihre
096d0d3cad Deobfuscate-during-download did not work
https://forums.sabnzbd.org/viewtopic.php?f=3&t=25037
2020-11-01 15:35:09 +01:00
Safihre
2472ab0121 Python 3.5 does not know ssl.PROTOCOL_TLS_SERVER
Closes #1658
2020-10-27 15:52:28 +01:00
Safihre
00421717b8 Queue Repair would fail if Rating is enabled
Closes #1649
2020-10-24 11:10:03 +02:00
Safihre
ae96d93f94 Set version to 3.1.0 2020-10-16 17:02:28 +02:00
Safihre
8522c40c8f Merge branch '3.1.x' 2020-10-16 16:58:58 +02:00
Safihre
23f86e95f1 Update text files for 3.1.0 2020-10-16 16:42:35 +02:00
Safihre
eed2045189 After pre-check the job was not restored to the original spot 2020-10-16 16:27:51 +02:00
Safihre
217785bf0f Applying Filters to a feed would result in crash
Closes #1634
2020-10-15 18:07:06 +02:00
Safihre
6aef50dc5d Update text files for 3.1.0RC3 2020-10-02 11:34:21 +02:00
Safihre
16b6e3caa7 Notify users of Deobfuscate.py that it is now part of SABnzbd 2020-09-29 14:08:51 +02:00
Safihre
3de4c99a8a Only set the "Waiting" status when the job hits post-processing
https://forums.sabnzbd.org/viewtopic.php?f=11&t=24969
2020-09-29 13:51:15 +02:00
Safihre
980aa19a75 Only run Windows Service code when executed from the executables
Could be made to work with the from-sources code.. But seems like very small usecase.
Closes #1623
2020-09-29 10:42:23 +02:00
Safihre
fb4b57e056 Update text files for 3.1.0RC2 2020-09-27 17:19:34 +02:00
Safihre
03638365ea Set execute bit on Deobfuscate.py 2020-09-27 17:17:30 +02:00
Safihre
157cb1c83d Handle failing RSS-feeds for feedparser 6.0.0+
Closes #1621
Now throws warnings (that can be disabled, helpfull_warnings) if readout failed.
2020-09-27 13:32:38 +02:00
Safihre
e51f11c2b1 Do not crash if attributes file is not present 2020-09-25 10:50:19 +02:00
Safihre
1ad0961dd8 Existing files were not parsed when re-adding a job 2020-09-25 10:49:50 +02:00
Safihre
46ff7dd4e2 Do not crash if we can't save attributes, the job might be gone 2020-09-25 10:03:05 +02:00
Safihre
8b067df914 Correctly parse failed_only for Plush 2020-09-23 16:56:57 +02:00
Safihre
ef43b13272 Assume RarFile parses the correct filepaths for the RAR-volumes
Parsing UTF8 from command-line still fails.
https://forums.sabnzbd.org/viewtopic.php?p=122267#p122267
2020-09-21 22:12:43 +02:00
Safihre
e8e9974224 work_name would not be sanatized when adding NZB's
Closes #1615
Now with tests, yeah.
2020-09-21 22:12:34 +02:00
Safihre
feebbb9f04 Merge branch '3.0.x' 2020-09-13 16:40:43 +02:00
Safihre
bc4f06dd1d Limit feedparser<6.0.0 for 3.0.x 2020-09-13 16:40:14 +02:00
Safihre
971e4fc909 Merge branch '3.0.x' 2020-08-30 20:58:31 +02:00
Safihre
51cc765949 Update text files for 3.0.2 2020-08-30 20:50:45 +02:00
Safihre
19c6a4fffa Propagation delay label was shown even if no delay was activated 2020-08-29 16:46:16 +02:00
Safihre
105ac32d2f Reading RSS feed with no categories set could result in crash
Closes #1589
2020-08-28 10:16:49 +02:00
Safihre
57550675d2 Removed logging in macOS sabApp that resulted in double logging 2020-08-28 10:16:41 +02:00
Safihre
e674abc5c0 Update text files for 3.0.2RC2 2020-08-26 08:56:29 +02:00
Safihre
f965c96f51 Change the macOS power assertion to NoIdleSleep 2020-08-26 08:50:54 +02:00
Safihre
c76b8ed9e0 End-of-queue-script did not run on Windows due to long-path
https://forums.sabnzbd.org/viewtopic.php?f=3&t=24918

Will refactor this so they all call 1 function.
2020-08-24 11:28:14 +02:00
Safihre
4fbd0d8a7b Check if name is a string before switching to nzbfile in addfile
Closes #1584
2020-08-24 09:05:25 +02:00
Safihre
2186c0fff6 Update text files for 3.0.2 RC 1 2020-08-21 15:42:35 +02:00
Safihre
1adca9a9c1 Do not crash if certifi certificates are not available
This could happen on Windows, due to overactive virus scanners
2020-08-21 15:26:06 +02:00
Safihre
9408353f2b Priority was not parsed correctly if supplied as string 2020-08-21 15:12:09 +02:00
Safihre
84f4d453d2 Permissions would be set even if user didn't set any
Windows developers like me shouldn't do permissions stuff..
2020-08-21 15:12:01 +02:00
Safihre
d10209f2a1 Extend tests of create_all_dirs to cover apply_umask=False 2020-08-21 15:11:53 +02:00
Safihre
3ae149c72f Split the make_mo.py command for NSIS 2020-08-19 22:21:02 +02:00
Safihre
47385acc3b Make sure we force the final_name to string on legacy get_attrib_file 2020-08-19 16:21:13 +02:00
Safihre
814eeaa900 Redesigned the saving of attributes
Now uses pickle, so that the type of the property is preserved.
Made flexible, so that more properties can be easily added later.
Closes #1575
2020-08-19 16:21:07 +02:00
Safihre
5f2ea13aad NzbFile comparison could crash when comparing finished_files
https://forums.sabnzbd.org/viewtopic.php?f=3&t=24902&p=121748
2020-08-19 08:50:06 +02:00
Safihre
41ca217931 Merge branch '3.0.x' 2020-08-18 11:05:50 +02:00
Safihre
b57d36e8dd Set version information to 3.0.1 2020-08-18 11:05:36 +02:00
Safihre
9a4be70734 List Cheetah minimal version in requirements.txt 2020-08-18 08:21:20 +02:00
Safihre
a8443595a6 Generalize use of certifi module 2020-08-18 08:20:47 +02:00
Safihre
fd0a70ac58 Update text files for 3.0.1 2020-08-17 16:52:23 +02:00
Safihre
8a8685c968 Permissions should only be applied if requested
Corrects 050b925f7b
2020-08-16 18:28:39 +02:00
Safihre
9e6cb8da8e Temporarily set cheroot version due to it breaking our tests
cherrypy/cheroot/issues/312
2020-08-16 18:28:13 +02:00
Safihre
054ec54d51 Basic authentication option was broken
Closes #1571
2020-08-10 15:34:01 +02:00
Safihre
272ce773cb Update text files for 3.0.1RC1 2020-08-07 15:28:11 +02:00
Safihre
050b925f7b Permissions were not set correctly when creating directories (#1568)
Restores changes made in d2e0ebe
2020-08-07 15:22:53 +02:00
Safihre
0087940898 Merge branch '3.0.x' into master 2020-08-02 09:46:41 +02:00
Safihre
e323c014f9 Set version information to 3.0.0 2020-08-01 16:17:08 +02:00
Safihre
cc465c7554 Update text files for 3.0.0
🎉🎉
2020-08-01 15:59:30 +02:00
Safihre
14cb37564f Update translate-link in SABnzbd 2020-07-19 13:01:39 +02:00
Safihre
094db56c3b Default-text for Automatically sort queue 2020-07-16 22:29:02 +02:00
Safihre
aabb709b8b Update text files for 3.0.0 RC 2 2020-07-15 14:10:35 +02:00
Safihre
0833dd2db9 Update translatable texts in 3.0.x branch 2020-07-15 14:07:21 +02:00
Safihre
cd3f912be4 RAR-renamer should be run on badly named RAR-files
https://forums.sabnzbd.org/viewtopic.php?f=2&t=24514&p=121433
2020-07-15 14:01:48 +02:00
Safihre
665c516db6 Only really run pre-script when it is set 2020-07-12 14:20:18 +02:00
Safihre
b670da9fa0 Always use Default-priority when creating NZB-objects
Closes #1552
2020-07-12 14:03:07 +02:00
Safihre
80bee9bffe Search-icon would be shown on top of drop-downs
Closes #1545
2020-06-30 12:57:28 +02:00
Safihre
d85a70e8ad Always report API paused status as a boolean
Closes #1542
2020-06-30 10:26:34 +02:00
Safihre
8f21533e76 Set version to 2.3.9 2019-05-24 11:39:14 +02:00
Safihre
89996482a1 Merge branch '2.3.x' 2019-05-24 09:33:12 +02:00
Safihre
03c10dce91 Update text files for 2.3.9 2019-05-24 09:32:34 +02:00
Safihre
bd5331be05 Merge branch 'develop' into 2.3.x 2019-05-24 09:12:02 +02:00
Safihre
46e1645289 Correct typo in release notes 2019-05-18 10:56:39 +02:00
Safihre
4ce3965747 Update text files for 2.3.9RC2 2019-05-18 09:56:05 +02:00
Safihre
9d4af19db3 Merge branch 'develop' into 2.3.x 2019-05-18 09:45:20 +02:00
Safihre
48e034f4be Update text files for 2.3.9RC1 2019-05-07 13:50:20 +02:00
Safihre
f8959baa2f Revert "Notify develop-users that we will switch to Python 3"
This reverts commit fb238af7de.
2019-05-07 13:35:13 +02:00
Safihre
8ed5997eae Merge branch 'develop' into 2.3.x 2019-05-07 13:10:10 +02:00
Safihre
daf9f50ac8 Set version to 2.3.8 2019-03-18 11:10:56 +01:00
Safihre
6b11013c1a Merge branch '2.3.x' 2019-03-18 11:09:35 +01:00
163 changed files with 5284 additions and 3749 deletions

View File

@@ -5,7 +5,7 @@
":disableDependencyDashboard"
],
"schedule": [
"before 3am on Monday"
"before 8am on Monday"
],
"ignorePaths": [
"tests/**",
@@ -19,7 +19,8 @@
]
},
"ignoreDeps": [
"jaraco.text"
"jaraco.text",
"sabctools"
],
"packageRules": [
{

23
.github/stale.yml vendored
View File

@@ -1,23 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 21
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- "Feature request"
- "Work in progress"
- "Bug"
# Label to use when marking an issue as stale
staleLabel: "Stale"
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

View File

@@ -32,7 +32,7 @@ jobs:
if: steps.cache-virtualenv-64bit.outputs.cache-hit != 'true'
run: |
python --version
pip install --upgrade pip wheel
python -m pip install --upgrade pip wheel
pip install --upgrade -r requirements.txt
pip install --upgrade -r builder/requirements.txt
- name: Build Windows standalone binary and installer (64bit)
@@ -87,7 +87,7 @@ jobs:
# 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.11.2"
PYTHON_VERSION: "3.11.3"
MACOSX_DEPLOYMENT_TARGET: "10.9"
# We need to force compile for universal2 support
CFLAGS: -arch x86_64 -arch arm64

View File

@@ -27,7 +27,7 @@ jobs:
test:
name: Test ${{ matrix.name }} - Python ${{ matrix.python-version }}
runs-on: ${{ matrix.os }}
timeout-minutes: 15
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
@@ -63,7 +63,7 @@ jobs:
if: steps.cache-virtualenv.outputs.cache-hit != 'true'
run: |
python --version
pip install --upgrade pip wheel
python -m pip install --upgrade pip wheel
pip install --upgrade -r requirements.txt
pip install --upgrade -r tests/requirements.txt
- name: Test SABnzbd

22
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: "Close stale issues"
on:
schedule:
- cron: "30 1 * * *"
workflow_dispatch:
jobs:
stale:
name: "Close stale issues"
if: github.repository_owner == 'sabnzbd'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
with:
days-before-stale: 21
days-before-close: 7
stale-issue-label: "Stale"
stale-issue-message: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
exempt-issue-labels: "Feature request, Work in progress, Bug"

View File

@@ -20,9 +20,11 @@ jobs:
python3 tools/extract_pot.py
- name: Push/pull Transifex translations
if: env.TX_TOKEN
# We sleep so all files are updated when we pull them back in
run: |
curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash
./tx push --translation --source
sleep 10s
./tx pull --all --force
- name: Compile translations to validate them
run: |

View File

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

View File

@@ -1,30 +1,29 @@
Release Notes - SABnzbd 4.0.0 Alpha 2
Release Notes - SABnzbd 4.0.0
=========================================================
## Changes since 4.0.0 Alpha 1
- There are now multiple settings that can tweak performance, see:
https://github.com/sabnzbd/sabnzbd/discussions/2474
We are trying to find the most optimal default settings, so you
can help us by letting us know the results on your system!
## Changes since 3.7.2
- In this major update we replaced a core part of Python's SSL handling
with our own improved version. This results in large performance increases
when downloading from news servers with SSL enabled.
In addition, the general connection handling was overhauled, resulting in
performance improvements for all news servers.
- In this major update we optimized a core part of the SSL handling.
This results in large performance increases when downloading from news
servers with SSL enabled. In addition, the general connection handling
was improved, resulting in performance improvements for all news servers.
Special thanks to: mnightingale, puzzledsab and animetosho!
- There are multiple settings that can tweak performance, see:
https://github.com/sabnzbd/sabnzbd/discussions/2474
- When adding a new news server, SSL is enabled by default.
- File assembly performance significantly improved by relying on the
CRC32 instead of the MD5 to perform QuickCheck of files.
- Slowdown more gracefully when the cache fills up.
- Replaced separate Series/Movie/Date Sorting with general Sorter.
- HTTPS files are included in the `Backup`.
- Improved `Watched Folder` scanning and processing.
- Ignore resource fork files created by macOS.
- `Deobfuscate final filenames` is enabled for new installations.
- Dropped support for Python 3.7.
# Bugfixes since 3.7.2
## Bugfixes since 3.7.2
- Restore applying `History Retention` setting at startup.
- Windows: Not all invalid characters were removed from filenames.
- Windows: Firewall rules were not removed by uninstaller.
## Upgrade notices
- The download statistics file `totals10.sab` is updated in 3.2.x

View File

@@ -1,3 +1,3 @@
# Special requirements for macOS universal2 binary release
# This way dependabot can auto-update them
cryptography==39.0.1
cryptography==40.0.2

View File

@@ -1,21 +1,21 @@
# Basic build requirements
# Note that not all sub-dependencies are listed, but only ones we know could cause trouble
pyinstaller==5.8.0
pyinstaller-hooks-contrib==2022.15
pyinstaller==5.10.1
pyinstaller-hooks-contrib==2023.2
altgraph==0.17.3
wrapt==1.14.1
setuptools==67.2.0
wrapt==1.15.0
setuptools==67.7.1
pkginfo==1.9.6
PyGithub==1.57
charset-normalizer==3.0.1
PyGithub==1.58.1
charset-normalizer==3.1.0
certifi
# orjson does not support 32bit Windows, exclude it based on Python-version
# This way we also test ujson on Python 3.8 in the CI-tests
orjson==3.8.6; python_version > '3.8'
orjson==3.8.10; python_version > '3.8'
# For the macOS build
dmgbuild==1.6.0; sys_platform == 'darwin'
dmgbuild==1.6.1; sys_platform == 'darwin'
mac-alias==2.2.2; sys_platform == 'darwin'
macholib==1.16.2; sys_platform == 'darwin'
ds-store==1.3.1; sys_platform == 'darwin'

View File

@@ -174,16 +174,19 @@ Section "SABnzbd" SecDummy
; Make sure old versions are gone (reg-key already read in onInt)
StrCmp $PREV_INST_DIR "" noPrevInstallRemove
${RemovePrev} "$PREV_INST_DIR"
Goto continueSetupAfterRemove
;------------------------------------------------------------------
; Add firewall rules for new installs
noPrevInstallRemove:
liteFirewallW::AddRule "$INSTDIR\SABnzbd.exe" "SABnzbd"
liteFirewallW::AddRule "$INSTDIR\SABnzbd-console.exe" "SABnzbd-console"
continueSetupAfterRemove:
; add files / whatever that need to be installed here.
File /r "dist\SABnzbd\*"
;------------------------------------------------------------------
; Add firewall rules
liteFirewallW::AddRule "$INSTDIR\SABnzbd.exe" "SABnzbd"
liteFirewallW::AddRule "$INSTDIR\SABnzbd-console.exe" "SABnzbd-console"
;------------------------------------------------------------------
; Add to registry
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" "" "$INSTDIR"
@@ -333,7 +336,6 @@ Section "un.$(MsgDelProgram)" Uninstall
${nsProcess::Unload}
DetailPrint "Process Killed"
; add delete commands to delete whatever files/registry keys/etc you installed here.
Delete "$INSTDIR\uninstall.exe"
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd"
@@ -341,6 +343,10 @@ Section "un.$(MsgDelProgram)" Uninstall
${RemovePrev} "$INSTDIR"
; Remove firewall entries
liteFirewallW::RemoveRule "$INSTDIR\SABnzbd.exe" "SABnzbd"
liteFirewallW::RemoveRule "$INSTDIR\SABnzbd-console.exe" "SABnzbd-console"
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd.lnk"

View File

@@ -3,13 +3,14 @@
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="section">
<div class="padTable"> <a class="main-helplink" href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a>
<div class="padTable">
<a class="main-helplink" href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a>
<p>$T('explain-catTags2')<br/>$T('explain-catTags')</p>
<hr>
<h5 class="darkred"><strong>$T('explain-relFolder'):</strong> <span class="path">$defdir</span></h5>
<!--#for $cur, $slot in enumerate($slotinfo)#-->
<!--#set $cansort = $slot.name != '*' and $slot.name != ''#-->
<form action="save" method="get" <!--#if $cansort#-->class="sorting-row"<!--#end if#-->>
<form action="save" method="post" <!--#if $cansort#-->class="sorting-row"<!--#end if#-->>
<table class="catTable">
<!--#if $cur == 0#-->
<tr>

View File

@@ -35,7 +35,8 @@
<div class="field-pair">
<label class="config" for="complete_dir">$T('opt-complete_dir')</label>
<input type="text" name="complete_dir" id="complete_dir" value="$complete_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-complete_dir')</span>
<a class="btn btn-default" href="${root}config/sorting/"><span class="glyphicon glyphicon-sort-by-alphabet"></span> $T('cmenu-sorting')</a>
<span class="desc">$T('explain-complete_dir') <br/> $T('explain-complete_dir-sorting')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="complete_free">$T('opt-complete_free')</label>

View File

@@ -17,7 +17,7 @@
<div class="col2-cats" <!--#if int($getVar($section_label + '_enable')) > 0 then '' else 'style="display:none"'#-->>
<hr>
<b>$T('affectedCat')</b><br/>
<select name="${section_label}_cats" multiple="multiple" class="multiple_cats">
<select name="${section_label}_cats" multiple="multiple" class="multiple_cats" size="$len($categories)">
<!--#for $ct in $categories#-->
<option value="$ct" <!--#if $ct in $getVar($section_label + '_cats') then 'selected="selected"' else ""#-->>$Tspec($ct)</option>
<!--#end for#-->
@@ -36,7 +36,7 @@
<h3>$T('cmenu-email') <a href="$helpuri$help_uri#toc0" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
<div class="col2-cats" <!--#if int($email_endjob) > 0 then '' else 'style="display:none"'#-->>
<b>$T('affectedCat')</b><br/>
<select name="email_cats" multiple="multiple" class="multiple_cats">
<select name="email_cats" multiple="multiple" class="multiple_cats" size="$len($categories)">
<!--#for $ct in $categories#-->
<option value="$ct" <!--#if $ct in $email_cats then 'selected="selected"' else ""#-->>$Tspec($ct)</option>
<!--#end for#-->

View File

@@ -5,7 +5,7 @@
<!--#import json#-->
<!--#import datetime#-->
<script type="text/javascript" xmlns="http://www.w3.org/1999/html">
<script type="text/javascript">
// Define variable needed for the server-statistics
var serverBandwithData = {}
var serverArticleTries = {}
@@ -60,12 +60,12 @@
</div>
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
<div class="field-pair">
<label class="config" for="${pid}_00">$T('srv-username')</label>
<input type="text" name="${pid}_00" id="${pid}_00" data-hide="username" />
<label class="config" for="${pid}_000">$T('srv-username')</label>
<input type="text" name="${pid}_000" id="${pid}_000" data-hide="username" />
</div>
<div class="field-pair">
<label class="config" for="${pid}_01">$T('srv-password')</label>
<input type="text" name="${pid}_01" id="${pid}_01" data-hide="password" />
<label class="config" for="${pid}_001">$T('srv-password')</label>
<input type="text" name="${pid}_001" id="${pid}_001" data-hide="password" />
</div>
<div class="field-pair">
<label class="config" for="connections">$T('srv-connections')</label>
@@ -147,7 +147,7 @@
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="output" value="json" />
<input type="hidden" name="server" value="$server['name']" />
<input type="hidden" id="ajax" name="ajax" value=1 />
<input type="hidden" name="ajax" value=1 />
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
@@ -225,8 +225,8 @@
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="ssl_ciphers">$T('opt-ssl_ciphers')</label>
<input type="text" name="ssl_ciphers" id="ssl_ciphers" value="$server['ssl_ciphers']" />
<label class="config" for="ssl_ciphers$cur">$T('opt-ssl_ciphers')</label>
<input type="text" name="ssl_ciphers" id="ssl_ciphers$cur" value="$server['ssl_ciphers']" />
<span class="desc">$T('explain-ssl_ciphers') <br>$T('readwiki')
<a href="${helpuri}advanced/ssl-ciphers" target="_blank">${helpuri}advanced/ssl-ciphers</a></span>
</div>

View File

File diff suppressed because it is too large Load Diff

View File

@@ -96,8 +96,13 @@ body {
.example {
background-color: #fefeee;
}
.presets strong {
display: inline-block;
width: 75px;
}
.presets {
margin-bottom: -6px;
max-width: 60%;
}
.presets input {
margin: 2px 0;
@@ -326,6 +331,53 @@ tr.separator {
margin: 5px;
}
.Sorting .explain-sorting {
background-color: #fff;
color: #000;
}
.Sorting .explain-pattern {
border: none;
width: 100%;
}
.Sorting .pattern-table {
border:1px solid #ccc;
}
.Sorting .sorter-switch {
margin-right: 0.2em;
}
.Sorting .sorter-switch-container {
margin: 10px 0px;
height: 1.5em;
display: block;
}
.Sorting .sorter-placeholder {
position: relative;
}
.Sorting .sorter-placeholder:after {
content: "\e034";
font-family: "Glyphicons Halflings";
background: unset;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 30px;
border-radius: 15px;
border: 1px dashed #444;
}
.Sorting .glyphicon-option-vertical {
margin-top: 1.5em;
margin-right: 0.2em;
cursor: move;
}
.Sorting form:not(.sorting-row) .glyphicon-option-vertical {
visibility: hidden;
}
.Sorting .sorting-quick-setup {
padding: 1.5em 2em 3em
}
.RSS .rss-section input[type="text"] {
max-width: 180px;
}
@@ -421,6 +473,9 @@ tr.separator {
.align-center {
text-align: center;
}
.valign-top {
vertical-align: top;
}
.nowrap {
white-space: nowrap;
}
@@ -784,6 +839,7 @@ select {
vertical-align:middle;
max-width: 100%;
min-height: 34px;
min-width: 55px;
font-size: 13px;
background-color: white;
}
@@ -1248,6 +1304,12 @@ html[dir="rtl"] .Scheduling form[action="addSchedule"] input[type="checkbox"] {
padding: 0px 15px 10px;
width: inherit;
}
.Sorting .glyphicon-option-vertical {
display: none;
}
.Sorting .sorter h3 {
cursor: move;
}
}
@media screen and (max-width: 768px) {

View File

@@ -203,7 +203,12 @@ $.fn.extractFormDataTo = function(target) {
var selects = $("select", this);
selects.each(function (i,elem) {
target[elem.name] = elem.value;
if (elem.selectedOptions.length > 1) {
// Handle <select multiple="multiple">
target[elem.name] = Array.from(elem.selectedOptions).map(({ value }) => value).toString();
} else {
target[elem.name] = elem.value;
}
});
return this;

View File

@@ -123,11 +123,9 @@
<span data-bind="text: statusInfo.loadavg"></span>
</div>
</div>
<div class="row" data-bind="visible: statusInfo.delayed_decoder() > 5 || statusInfo.delayed_assembler() > 5">
<div class="row" data-bind="visible: statusInfo.delayed_assembler() > 5">
<div class="col-sm-6">$T('dashboard-delayed') &nbsp; </div>
<div class="col-sm-6">
<span data-bind="visible: statusInfo.delayed_decoder() > 5">$T('dashboard-delayed-cpu')</span>
<small data-bind="visible: statusInfo.delayed_decoder() > 5">(<span data-bind="text: statusInfo.delayed_decoder"></span>x)</small>
<span data-bind="visible: statusInfo.delayed_assembler() > 5">$T('dashboard-delayed-disk')</span>
<small data-bind="visible: statusInfo.delayed_assembler() > 5">(<span data-bind="text: statusInfo.delayed_assembler"></span>x)</small>
</div>
@@ -456,6 +454,8 @@
<div class="form-group form-checkbox">
<label class="col-sm-6 control-label">
$T("Glitter-keyboardShortcuts")
<span class="glyphicon glyphicon-question-sign" data-tooltip="true" data-placement="top" data-html="true"
data-original-title="P: $T('link-pause')<br>A: $T('Glitter-addNZB')<br>S: $T('Glitter-statusInterfaceOptions')<br>C: $T('menu-config')<br>$T('Glitter-keyboardShortcuts-arrows')"></span>
</label>
<div class="col-sm-4">
<input type="checkbox" name="keyboardShortcuts" value="true" data-bind="checked: keyboardShortcuts" />

View File

@@ -62,7 +62,6 @@ function ViewModel() {
self.statusInfo.publicipv4 = ko.observable();
self.statusInfo.ipv6 = ko.observable();
self.statusInfo.dnslookup = ko.observable();
self.statusInfo.delayed_decoder = ko.observable();
self.statusInfo.delayed_assembler = ko.observable();
self.statusInfo.loadavg = ko.observable();
self.statusInfo.pystone = ko.observable();
@@ -759,7 +758,6 @@ function ViewModel() {
// Update basic
self.statusInfo.folders(data.status.folders)
self.statusInfo.loadavg(data.status.loadavg)
self.statusInfo.delayed_decoder(data.status.delayed_decoder)
self.statusInfo.delayed_assembler(data.status.delayed_assembler)
// Update the full set if the data is available

View File

Binary file not shown.

View File

Binary file not shown.

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.0.0Alpha1\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\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,9 +4,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
"Language-Team: Czech (https://app.transifex.com/sabnzbd/teams/111101/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Danish (https://app.transifex.com/sabnzbd/teams/111101/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: German (https://app.transifex.com/sabnzbd/teams/111101/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Spanish (https://app.transifex.com/sabnzbd/teams/111101/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Finnish (https://app.transifex.com/sabnzbd/teams/111101/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: French (https://app.transifex.com/sabnzbd/teams/111101/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Hebrew (https://app.transifex.com/sabnzbd/teams/111101/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Norwegian Bokmål (https://app.transifex.com/sabnzbd/teams/111101/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Dutch (https://app.transifex.com/sabnzbd/teams/111101/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Polish (https://app.transifex.com/sabnzbd/teams/111101/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Romanian (https://app.transifex.com/sabnzbd/teams/111101/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Russian (https://app.transifex.com/sabnzbd/teams/111101/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Serbian (https://app.transifex.com/sabnzbd/teams/111101/sr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Swedish (https://app.transifex.com/sabnzbd/teams/111101/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Chinese (China) (https://app.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.0.0Alpha1\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
@@ -134,11 +134,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -721,6 +716,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr ""
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr ""
@@ -1739,32 +1746,32 @@ msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr ""
#. Config->Scheduler
@@ -2044,10 +2051,6 @@ msgstr ""
msgid "Search"
msgstr ""
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr ""
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr ""
@@ -2332,10 +2335,6 @@ msgstr ""
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2750,6 +2749,10 @@ msgstr ""
msgid "Location to store finished, fully processed downloads.<br /><i>Can be overruled by user-defined categories.</i>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3450,6 +3453,10 @@ msgstr ""
msgid "Force Download"
msgstr ""
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -3804,20 +3811,6 @@ msgstr ""
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr ""
@@ -3826,23 +3819,10 @@ msgstr ""
msgid "Clear"
msgstr ""
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr ""
@@ -3859,26 +3839,6 @@ msgstr ""
msgid "Result"
msgstr ""
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr ""
@@ -3927,10 +3887,6 @@ msgstr ""
msgid "Episode_Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr ""
#: sabnzbd/skintext.py
msgid "Extension"
msgstr ""
@@ -3972,7 +3928,15 @@ msgid "Sort String"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
@@ -3983,25 +3947,12 @@ msgstr ""
msgid "No folders"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr ""
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
@@ -4033,6 +3984,58 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr ""
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid "<p>Use Sorters to automatically organize your completed downloads. For example, put all episodes from a series in a season-specific folder. Or, put movies in a folder named after the movie.</p><p>Sorters are tried in order of appearance and can be reordered by dragging and dropping.<br/>The first active sorter that matches both the affected category and job type is applied.</p><p>More options are available when Advanced Settings is checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid "Move and rename all episodes in the \"tv\" category to a show-specific folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Move and rename all movies in the \"movies\" category to a movie-specific folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Rarely used options. For their meaning and explanation, click on the Help button to go to the Wiki page.<br>Don't change these without checking the Wiki first, as some have serious side-effects.<br>The default values are between parentheses."
msgstr ""
@@ -4260,6 +4263,10 @@ msgstr ""
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr ""
@@ -4424,7 +4431,7 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
"Language-Team: Czech (https://app.transifex.com/sabnzbd/teams/111101/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -151,11 +151,6 @@ msgstr "Restartuji protože postprocessor selhal"
msgid "Restarting because of crashed downloader"
msgstr "Restartuji protože selhal downloader"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr "Restartuji protože selhal decoder"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -775,6 +770,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Python skript \"%s\" nemá nastaveno právo spuštění (+x)"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr ""
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Běžící skript"
@@ -1813,32 +1820,32 @@ msgstr "Odstranit dokončené úkoly"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pozastavit úkoly s nízkou prioritou"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pozastavit úkoly s normální prioritou"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pozastavit úkoly s vysokou prioritou"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Obnovit úkoly s vysokou prioritou"
#. Config->Scheduler
@@ -2118,10 +2125,6 @@ msgstr "Speciální"
msgid "Search"
msgstr "Vyhledávání"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr ""
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr ""
@@ -2408,10 +2411,6 @@ msgstr "DNS server / DNS dotazy"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2873,6 +2872,11 @@ msgid ""
"overruled by user-defined categories.</i>"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3629,6 +3633,10 @@ msgstr ""
msgid "Force Download"
msgstr ""
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -3991,20 +3999,6 @@ msgstr ""
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr ""
@@ -4013,23 +4007,10 @@ msgstr ""
msgid "Clear"
msgstr ""
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr ""
@@ -4046,26 +4027,6 @@ msgstr ""
msgid "Result"
msgstr ""
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr ""
@@ -4114,10 +4075,6 @@ msgstr ""
msgid "Episode_Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr ""
#: sabnzbd/skintext.py
msgid "Extension"
msgstr ""
@@ -4159,7 +4116,15 @@ msgid "Sort String"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
@@ -4170,25 +4135,12 @@ msgstr ""
msgid "No folders"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr ""
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
@@ -4220,6 +4172,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr ""
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4453,6 +4468,10 @@ msgstr ""
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr ""
@@ -4621,8 +4640,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Nezdařilo se přejmenovat: %s na %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Danish (https://www.transifex.com/sabnzbd/teams/111101/da/)\n"
"Language-Team: Danish (https://app.transifex.com/sabnzbd/teams/111101/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -151,11 +151,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -780,6 +775,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Python script \"%s\" har ikke udfør (+x) tilladelsessæt"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Serie sortering"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Dato sortering"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr "Film sortering"
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Køre script"
@@ -1844,32 +1851,32 @@ msgstr "Fjern fuldførte job"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pause lav prioritets jobs"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pause normal prioritets jobs"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pause høj prioritets jobs"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Genoptag lav prioritets jobs"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Genoptag normal prioritets jobs"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Genoptag høj prioritets jobs"
#. Config->Scheduler
@@ -2149,10 +2156,6 @@ msgstr "Speciel"
msgid "Search"
msgstr "Søg"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Download mappe"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Er du sikker på du vil lukke SABnzbd?"
@@ -2439,10 +2442,6 @@ msgstr "Nameserver/DNS Lookup"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2930,6 +2929,11 @@ msgstr ""
"Sted at opbevare færdige, fuldt forarbejdede downloads.<br /><i>Kan "
"tilsidesættes af bruger-definerede kategorier.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3724,6 +3728,10 @@ msgstr "Læs Feed"
msgid "Force Download"
msgstr "Gennemtving download"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Anvend filtre"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4092,20 +4100,6 @@ msgstr "Mappe/Søgesti"
msgid "Indexer Categories / Groups"
msgstr "Indekseringen kategorier/grupper"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Serie sortering"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Aktivere TV sortering"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Hjælp til Sorteringsstræng"
@@ -4114,23 +4108,10 @@ msgstr "Hjælp til Sorteringsstræng"
msgid "Clear"
msgstr "Ryd"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Anvend filtre"
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Forudindstillinger"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr "Film sortering"
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Aktivere filmsortering"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Påvirkede Kategorier"
@@ -4147,26 +4128,6 @@ msgstr "Mønster"
msgid "Result"
msgstr "Resultat"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Sæsonmappe"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Sæsonmappe"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Episodemappe"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodemappe"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Job Navn som Filnavn"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4215,10 +4176,6 @@ msgstr "Episode.Navn"
msgid "Episode_Name"
msgstr "Episode_Navn"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Filtype"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Endelse"
@@ -4260,8 +4217,16 @@ msgid "Sort String"
msgstr "Sorteringsstreng"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Multi-del etikette"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4271,26 +4236,13 @@ msgstr "I mappe"
msgid "No folders"
msgstr "Ingen mappe"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Dato sortering"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Job Navn som Filnavn"
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Aktivere datosortering"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Vis Navn på mappe"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "År-Måned mapper"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Daglige mapper"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4321,6 +4273,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Alle"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4560,6 +4575,10 @@ msgstr "Bekræft Historik-fjernelse"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Hvor længe eller indtil hvornår du vil standse? (på engelsk!)"
@@ -4734,8 +4753,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Det lykkedes ikke at omdøbe: %s til %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -12,13 +12,14 @@
# Nils Briggen, 2022
# reloxx13 <reloxx@interia.pl>, 2022
# Safihre <safihre@sabnzbd.org>, 2023
# kameb, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"
"Last-Translator: kameb, 2023\n"
"Language-Team: German (https://app.transifex.com/sabnzbd/teams/111101/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -166,11 +167,6 @@ msgstr "Neustart aufgrund eines abgestürzten Nachbearbeitungsprozesses"
msgid "Restarting because of crashed downloader"
msgstr "Neustart aufgrund eines abgestürzten Downloaders"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr "Neustart aufgrund eines abgestürzten Decoders"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -481,6 +477,8 @@ msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Von zu vielen unteschiedlichen IP Adressen beim Server eingeloggt %s[%s] "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
@@ -822,6 +820,18 @@ msgstr "[%s] Der Befehl in build_command ist nicht definiert."
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführungsrechte (+x)"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Sortieren von TV-Serien"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Sortieren nach Datum"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr "Film Sortierung"
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Ausführen des Skripts"
@@ -1908,32 +1918,32 @@ msgstr "Abgeschlossene Aufträge entfernen"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Aufträge mit niedriger Priorität pausieren"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Aufträge mit normaler Priorität pausieren"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Aufträge mit hoher Priorität pausieren"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Aufträge mit niedriger Priorität fortsetzen"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Aufträge mit normaler Priorität fortsetzen"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Aufträge mit hoher Priorität fortsetzen"
#. Config->Scheduler
@@ -2213,10 +2223,6 @@ msgstr "Spezial"
msgid "Search"
msgstr "Suchen"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Downloads"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Möchten Sie SABnzbd wirklich beenden?"
@@ -2506,10 +2512,6 @@ msgstr "DNS-Server"
msgid "Download speed limited by"
msgstr "Downloadgeschwindigkeit begrenzt durch"
#: sabnzbd/skintext.py
msgid "CPU"
msgstr "CPU"
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr "Festplattengeschwindigkeit"
@@ -3030,6 +3032,11 @@ msgstr ""
"Hier werden fertige, verarbeitete Downloads abgelegt.<br /><i>Kann von "
"benutzerdefinierten Kategorien ausser Kraft gesetzt werden.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr "Benutze Sortieren um deine Dateien zu orgenisieren und umzubennenen"
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr "Minimaler freier Speicherplatz des abgeschlossene Downloads-Ordners"
@@ -3120,7 +3127,7 @@ msgstr "System-Ordner"
#: sabnzbd/skintext.py
msgid "Hidden Folders"
msgstr ""
msgstr "Versteckte Ordner"
#: sabnzbd/skintext.py
msgid "Administrative Folder"
@@ -3874,6 +3881,10 @@ msgstr "Feed lesen"
msgid "Force Download"
msgstr "Download erzwingen"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Filter übernehmen"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4249,20 +4260,6 @@ msgstr "Ordner/Pfad"
msgid "Indexer Categories / Groups"
msgstr "Indexer Kategorien/Gruppen"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr "Wähle mindestens 1 Kategorie"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Sortieren von TV-Serien"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "TV-Sortierung aktivieren"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Muster-Schlüssel"
@@ -4271,23 +4268,10 @@ msgstr "Muster-Schlüssel"
msgid "Clear"
msgstr "Löschen"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Filter übernehmen"
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Voreinstellungen"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr "Film Sortierung"
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Film-Sortierung aktivieren"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Betroffene Kategorien"
@@ -4304,26 +4288,6 @@ msgstr "Muster"
msgid "Result"
msgstr "Resultat"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Staffel-Ordner"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Staffel-Ordner"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Episoden-Ordner"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episoden-Ordner"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Aufgabe Name als Ordnername"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4372,10 +4336,6 @@ msgstr "Episoden.Name"
msgid "Episode_Name"
msgstr "Episoden_Name"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Dateiendung"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Endung"
@@ -4417,8 +4377,16 @@ msgid "Sort String"
msgstr "Sortieranweisung"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Markierung für mehrere Teile"
msgid "Multi-part Label"
msgstr "Multi-part Kennzeichnung"
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr "Zeige Ordner"
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr "Staffelordner"
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4428,26 +4396,13 @@ msgstr "In Ordnern"
msgid "No folders"
msgstr "Keine Ordner"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Sortieren nach Datum"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Aufgabe Name als Ordnername"
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Sortieren nach Datum aktivieren"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Ordner mit Name der Sendung"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Jahr-Monat-Ordner"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Tägliche Ordner"
msgid "Series"
msgstr "Serien"
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4478,6 +4433,81 @@ msgstr "GuessIt.Eigenschaft"
msgid "GuessIt_Property"
msgstr "GuessIt_Eigenschaft"
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr "Minimale Dateigröße"
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr "Betroffener Aufgabentyp"
#: sabnzbd/skintext.py
msgid "All"
msgstr "Alle"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr "Serien mit Ausstrahlungsdatum"
#: sabnzbd/skintext.py
msgid "Movies"
msgstr "Filme"
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr "Andere / Unbekannte"
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
"<p>Benutze die Sortierer, um deine fertigen Downloads zu orgenisieren. Zum "
"Beispiel verschiebe alle Seriendateien in den Serien eigenen Ordner oder "
"Verschiege alle Filme in den Filme eigenen Ordner.</p><p>Die Sortierer "
"werden der Reihe nach bearbeitet und könne durch ziehen und ablegen "
"umsortiert werden.<br/>Der erste Aktive Sortierer der sowohl zur Kategorie "
"als auch zum Aufgabentyp passt wird angewendet.</p><p>Wenn erweiterte "
"Einstellungen aktiviert sind, sind noch mehr Einstellungen möglich.<br/> "
"Weitere informationen sind in der WIki zu finden.</p>"
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr "Sortierer hinzufügen"
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr "Sortierer entfernen"
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr "Testdaten"
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr "Schnellstart"
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
"Bennene alle Episodendateien in der Kategorie \"tv\" um und veschiebe sie in"
" den Serien eigenen Ordner"
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
"Bennene alle Filmdateien in der Kategorie \"filme\" um und veschiebe sie in "
"den Filme eigenen Ordner"
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4717,6 +4747,10 @@ msgstr "Löschen von Verlaufeinträgen bestätigen"
msgid "Keyboard shortcuts"
msgstr "Tastaturkürzel"
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Wie lange oder bis wann möchtest du pausieren? (in Englisch!)"
@@ -4893,8 +4927,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Umbenennen von %s nach %s fehlgeschlagen."
msgid "Failed to rename %s to %s"
msgstr "Fehler beim umbennenen von %s nach %s"
#. Error message
#: sabnzbd/sorting.py

View File

@@ -9,10 +9,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Spanish (https://www.transifex.com/sabnzbd/teams/111101/es/)\n"
"Language-Team: Spanish (https://app.transifex.com/sabnzbd/teams/111101/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -160,11 +160,6 @@ msgstr "Reiniciando a causa de un posprocesador colgado"
msgid "Restarting because of crashed downloader"
msgstr "Reiniciando debido al cuelgue del descargador"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr "Reiniciando a causa de un decodificador colgado"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -809,6 +804,18 @@ msgstr ""
"La secuencia de comandos Python \"%s\" no tiene configurado el permiso de "
"ejecutar (+x)"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Ordenación de Series"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Ordenar por fecha"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr "Clasificación de películas"
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Ejecutando script"
@@ -1900,32 +1907,32 @@ msgstr "Eliminar trabajos completados"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pausar trabajos de prioridad baja"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pausar trabajos de prioridad normal"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pausar trabajos de prioridad alta"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Reanudar trabajos de prioridad baja"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Reanudar trabajos de prioridad normal"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Reanudar trabajos de prioridad alta"
#. Config->Scheduler
@@ -2205,10 +2212,6 @@ msgstr "Especial"
msgid "Search"
msgstr "Buscar"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Dir de Descarga"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "¿Seguro que deseas detener SABnzbd?"
@@ -2498,10 +2501,6 @@ msgstr "Nombre del servidor / Búsqueda de DNS"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -3009,6 +3008,11 @@ msgstr ""
"Ubicación donde guardar descargas finalizadas, totalmente procesaddas.<br "
"/><i>Puede ser obviado debido a categorías definidas por el usuario.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3825,6 +3829,10 @@ msgstr "Leer Fuente"
msgid "Force Download"
msgstr "Forzar Descarga"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Aplicar filtros"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4197,20 +4205,6 @@ msgstr "Directorio/Ruta"
msgid "Indexer Categories / Groups"
msgstr "Categorías Indexer / Grupos"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Ordenación de Series"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Habilitar la ordenación de Series de TV"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Patrón"
@@ -4219,23 +4213,10 @@ msgstr "Patrón"
msgid "Clear"
msgstr "Limpiar"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Aplicar filtros"
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Preajustes"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr "Clasificación de películas"
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Habilitar Ordenado de Películas"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Categorías Afectadas"
@@ -4252,26 +4233,6 @@ msgstr "Patrón"
msgid "Result"
msgstr "Resultado"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Temporada Directorio"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Temporada Directorio"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Episodio Directorio"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodio Directorio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Nombre de la tarea para el nombre de archivo"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Título"
@@ -4320,10 +4281,6 @@ msgstr "Nombre.capítulo"
msgid "Episode_Name"
msgstr "Nombre_capítulo"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Extensión de archivo"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Extensión"
@@ -4365,8 +4322,16 @@ msgid "Sort String"
msgstr "Ordenar cadena"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Etiqueta"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4376,26 +4341,13 @@ msgstr "En directorios"
msgid "No folders"
msgstr "Sin Directorios"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Ordenar por fecha"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Nombre de la tarea para el nombre de archivo"
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Habilitar ordenar por fecha"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Carpeta de la serie"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Directorios Año-Mes"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Directorios diarios"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4426,6 +4378,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Todos"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4667,6 +4682,10 @@ msgstr "Confirmar eliminación del historial"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "¿Durante cuánto tiempo quieres dejarlo pausado?"
@@ -4844,8 +4863,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Error al renombrar: %s a %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -3,14 +3,14 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2022
# Safihre <safihre@sabnzbd.org>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
"Language-Team: Finnish (https://www.transifex.com/sabnzbd/teams/111101/fi/)\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Finnish (https://app.transifex.com/sabnzbd/teams/111101/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -153,11 +153,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -777,6 +772,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Sarjojen lajittelu"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Päivämäärän lajittelu"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Ajetaan skripti"
@@ -1838,32 +1845,32 @@ msgstr "Poista valmistuneet lataukset"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Keskeytä alhaisen prioriteetin lataukset"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Keskeytä normaalin prioriteetin lataukset"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Keskeytä korkean prioriteetin lataukset"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Jatka alhaisen prioriteetin lataukset"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Jatka normaalin prioriteetin lataukset"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Jatka korkean prioriteetin lataukset"
#. Config->Scheduler
@@ -2143,10 +2150,6 @@ msgstr "Erikoisasetukset"
msgid "Search"
msgstr "Etsi"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Lataukset-kansio"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Oletko varma, että haluat sammuttaa SABnzbdn?"
@@ -2433,10 +2436,6 @@ msgstr "Nimipalvelin / DNS-selvitys"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2933,6 +2932,11 @@ msgstr ""
"Sijainti jonne tallennetaan valmistuneet ja täysin käsitellyt ladatut "
"kohteet.<br /><i>Käyttäjän asettamat kategoriat voivat kumota tämän.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3726,6 +3730,10 @@ msgstr "Lue syöte"
msgid "Force Download"
msgstr "Pakota lataus"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4094,20 +4102,6 @@ msgstr "Kansio/Polku"
msgid "Indexer Categories / Groups"
msgstr "Indeksoijan kategoriat / ryhmä"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Sarjojen lajittelu"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "TV lajittelu käytössä"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Mallin avain"
@@ -4116,23 +4110,10 @@ msgstr "Mallin avain"
msgid "Clear"
msgstr "Tyhjennä"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Esiasetukset"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Elokuvien lajittelu käytössä"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Kategoriat joita koskee"
@@ -4149,26 +4130,6 @@ msgstr "Malli"
msgid "Result"
msgstr "Tulos"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Tuotantokausi kansio"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Tuotantokausi kansio"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Jakso kansio"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Jakso kansio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Nimi"
@@ -4217,10 +4178,6 @@ msgstr "Jakson.nimi"
msgid "Episode_Name"
msgstr "Jakson_nimi"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Tiedostotunniste"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Tunniste"
@@ -4262,8 +4219,16 @@ msgid "Sort String"
msgstr "Lajittelumerkkijono"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Moniosainen selite"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4273,26 +4238,13 @@ msgstr "Kansioissa"
msgid "No folders"
msgstr "Ei kansioita"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Päivämäärän lajittelu"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Päivämäärän lajittelu käytössä"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Ohjelman nimi kansio"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Vuosittaiset-Kuukausittaiset kansiot"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Päivittäiset kansiot"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4323,6 +4275,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Kaikki"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4565,6 +4580,10 @@ msgstr "Varmista historian poistot"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Kuinka pitkään tai mihin asti haluat keskeyttää? (englanniksi!)"
@@ -4740,8 +4759,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Virhe uudelleennimettäessä: %s %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -3,15 +3,15 @@
# team@sabnzbd.org
#
# Translators:
# Fred L <88com88@gmail.com>, 2023
# Safihre <safihre@sabnzbd.org>, 2023
# Fred L <88com88@gmail.com>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2023\n"
"Language-Team: French (https://app.transifex.com/sabnzbd/teams/111101/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -162,11 +162,6 @@ msgstr "Redémarrage suite au plantage du postprocesseur"
msgid "Restarting because of crashed downloader"
msgstr "Redémarrage suite au plantage du téléchargeur"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr "Redémarrage suite au plantage du décodeur"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -821,6 +816,18 @@ msgstr ""
"Le script Python \"%s\" n'est pas configuré avec les permissions dexécution"
" (+x)"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Tri des séries"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Tri par date"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr "Tri des films"
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Exécution du script"
@@ -1903,32 +1910,32 @@ msgstr "Effacer les tâches terminées"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Mettre en pause les tâches de priorité faible"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Mettre en pause les tâches de priorité normale"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Mettre en pause les tâches de priorité haute"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Reprendre les tâches de priorité faible"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Reprendre les tâches de priorité normale"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Reprendre les tâches de priorité haute"
#. Config->Scheduler
@@ -2208,10 +2215,6 @@ msgstr "Spécial"
msgid "Search"
msgstr "Rechercher"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Dossier de téléchargement"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Etes-vous sûr de vouloir arrêter SABnzbd ?"
@@ -2501,10 +2504,6 @@ msgstr "Nameserver / DNS Lookup"
msgid "Download speed limited by"
msgstr "Vitesse de téléchargement limitée par"
#: sabnzbd/skintext.py
msgid "CPU"
msgstr "processeur"
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr "Vitesse du disque"
@@ -3025,6 +3024,13 @@ msgstr ""
"Emplacement des téléchargements terminés et post-traités.<br /><i>Peut être "
"outrepassé par les catégories définies par l'utilisateur.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
"Utilisez le tri pour organiser et renommer automatiquement vos "
"téléchargements terminés."
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr "Espace libre minimum pour le dossier des téléchargements terminés"
@@ -3869,6 +3875,10 @@ msgstr "Lire le flux RSS"
msgid "Force Download"
msgstr "Forcer le téléchargement"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Appliquer les filtres"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4244,20 +4254,6 @@ msgstr "Dossier/Chemin"
msgid "Indexer Categories / Groups"
msgstr "Catégories de l'indexeur / Groupes"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr "Sélectionnez au moins une catégorie."
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Tri des séries"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Activer le tri TV"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Modèle de clé"
@@ -4266,23 +4262,10 @@ msgstr "Modèle de clé"
msgid "Clear"
msgstr "Effacer"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Appliquer les filtres"
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Modèles prédéfinis"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr "Tri des films"
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Activer le tri des films"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Catégories affectées"
@@ -4299,26 +4282,6 @@ msgstr "Modèle"
msgid "Result"
msgstr "Résultat"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Dossier Saison"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Dossier Saison"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Dossier Épisode"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Dossier Épisode"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Nom de la tâche en tant que nom de fichier"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titre"
@@ -4367,10 +4330,6 @@ msgstr "Nom.Épisode"
msgid "Episode_Name"
msgstr "Nom_Épisode"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Extension du fichier"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Extension"
@@ -4412,9 +4371,17 @@ msgid "Sort String"
msgstr "Chaîne de caractères de tri"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgid "Multi-part Label"
msgstr "Étiquette multi-bloc"
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr "Afficher le dossier"
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr "Dossier de la saison"
#: sabnzbd/skintext.py
msgid "In folders"
msgstr "Dans les dossiers"
@@ -4423,26 +4390,13 @@ msgstr "Dans les dossiers"
msgid "No folders"
msgstr "Pas de dossiers"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Tri par date"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Nom de la tâche en tant que nom de fichier"
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Activer le tri par date"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Dossier du nom de série"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Dossiers Année-Mois"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Dossiers Quotidiens"
msgid "Series"
msgstr "Séries"
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4473,6 +4427,82 @@ msgstr "Attribut.Guessit"
msgid "GuessIt_Property"
msgstr "Attribut_Guessit"
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr "Taille minimale du fichier"
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr "Types de tâche concernée"
#: sabnzbd/skintext.py
msgid "All"
msgstr "Tous"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr "Séries avec dates de diffusion"
#: sabnzbd/skintext.py
msgid "Movies"
msgstr "Films"
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr "Autre / Inconnu"
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
"<p>Utilisez les trieurs pour organiser automatiquement vos téléchargements "
"terminés. Par exemple, placez tous les épisodes d'une série dans un dossier "
"spécifique à la saison. Ou encore, placez les films dans un dossier portant "
"le nom du film.</p><p>Les trieurs sont essayés par ordre d'apparition et "
"peuvent être réorganisés par glisser-déposer.<br/>Le premier trieur actif "
"qui correspond à la fois à la catégorie et au type de tâche concernée est "
"appliqué.</p><p>D'autres options sont disponibles lorsque l'option "
"Paramètres avancés est cochée.<br/>Des informations détaillées sont "
"disponibles sur le Wiki.</p>"
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr "Ajouter un trieur"
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr "Supprimer le trieur"
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr "Données de test"
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr "Démarrage rapide"
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
"Déplacer et renommer tous les épisodes de la catégorie \"tv\" vers un "
"dossier de série spécifique"
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
"Déplacer et renommer tous les films de la catégorie \"films\" vers un "
"dossier de film spécifique"
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4715,6 +4745,10 @@ msgstr "Confirmer les suppressions de l'historique"
msgid "Keyboard shortcuts"
msgstr "Raccourcis clavier"
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Combien de temps ou jusqu'à quand souhaitez-vous mettre en pause ?"
@@ -4892,8 +4926,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Échec du renommage : %s en %s"
msgid "Failed to rename %s to %s"
msgstr "Échec du renommage de %s en %s"
#. Error message
#: sabnzbd/sorting.py

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Hebrew (https://www.transifex.com/sabnzbd/teams/111101/he/)\n"
"Language-Team: Hebrew (https://app.transifex.com/sabnzbd/teams/111101/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -150,11 +150,6 @@ msgstr "מפעיל מחדש בגלל בתר־מעבד שקרס"
msgid "Restarting because of crashed downloader"
msgstr "מפעיל מחדש בגלל מורידן שקרס"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr "מפעיל מחדש בגלל מפענח קוד שקרס"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -779,6 +774,18 @@ msgstr "[%s] הפקודה ב־build_command אינה מוגדרת."
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "לתסריט פייתון \"%s\" אין ערכת הרשאות ביצוע (+x)"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "מיון סדרות"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "מיון תאריכים"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr "מיון סרטים"
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "מריץ תסריט"
@@ -1845,32 +1852,32 @@ msgstr "הסר עבודות נשלמות"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "השהה עבודות עם עדיפות נמוכה"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "השהה עבודות עם עדיפות רגילה"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "השהה עבודות עם עדיפות גבוהה"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "המשך עבודות עם עדיפות נמוכה"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "המשך עבודות עם עדיפות רגילה"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "המשך עבודות עם עדיפות גבוהה"
#. Config->Scheduler
@@ -2150,10 +2157,6 @@ msgstr "מיוחד"
msgid "Search"
msgstr "חיפוש"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "תיקיית הורדות"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "האם אתה בטוח שאתה רוצה לכבות את SABnzbd?"
@@ -2442,10 +2445,6 @@ msgstr "שם שרת / חיפוש DNS"
msgid "Download speed limited by"
msgstr "מהירות הורדה מוגבלת ע״י"
#: sabnzbd/skintext.py
msgid "CPU"
msgstr "יע״מ"
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr "מהירות דיסק"
@@ -2938,6 +2937,11 @@ msgstr ""
"מיקום לאחסון הורדות שהסתיימו, מעבודות במלואן.<br /><i>ניתן להשתלטות ע״י "
"קטגוריות מוגדרות־משתמש.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr "שטח פנוי מזערי עבור תיקיית הורדות שלמות"
@@ -3732,6 +3736,10 @@ msgstr "קרא הזנה"
msgid "Force Download"
msgstr "אלץ הורדה"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "החל מסננים"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4100,20 +4108,6 @@ msgstr "תיקייה/נתיב"
msgid "Indexer Categories / Groups"
msgstr "קטגוריות / קבוצות של מדדן"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr "בחר קטגוריה 1 לפחות."
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "מיון סדרות"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "אפשר מיון טלוויזיה"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "מפתח דפוס"
@@ -4122,23 +4116,10 @@ msgstr "מפתח דפוס"
msgid "Clear"
msgstr "נקה"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "החל מסננים"
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "קדם־קביעות"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr "מיון סרטים"
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "אפשר מיון סרטים"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "קטגוריות מושפעות"
@@ -4155,26 +4136,6 @@ msgstr "דפוס"
msgid "Result"
msgstr "תוצאה"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "תיקיית עונה 1x05"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "תיקיית עונה S01E05"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "תיקיית פרק 1x05"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "תיקיית פרק S01E05"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "שם עבודה בתור שם קובץ"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "כותר"
@@ -4223,10 +4184,6 @@ msgstr "שם.פרק"
msgid "Episode_Name"
msgstr "שם_פרק"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "סיומת קובץ"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "סיומת"
@@ -4268,8 +4225,16 @@ msgid "Sort String"
msgstr "מחרוזת מיון"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "תווית מרובת־חלקים"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4279,26 +4244,13 @@ msgstr "בתיקיות"
msgid "No folders"
msgstr "אין תיקיות"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "מיון תאריכים"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "שם עבודה בתור שם קובץ"
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "אפשר מיון תאריכים"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "הראה שם תיקייה"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "תיקיות שנה־חודש"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "תיקיות יומיות"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4329,6 +4281,69 @@ msgstr "GuessIt.Property"
msgid "GuessIt_Property"
msgstr "GuessIt_Property"
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "הכל"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4567,6 +4582,10 @@ msgstr "אשר מחיקות היסטוריה"
msgid "Keyboard shortcuts"
msgstr "קיצורי דרך במקלדת"
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "כמה זמן או עד מתי תרצה להשהות? (באנגלית!)"
@@ -4743,8 +4762,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "נכשל בשינוי שם: %s אל %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Norwegian Bokmål (https://www.transifex.com/sabnzbd/teams/111101/nb/)\n"
"Language-Team: Norwegian Bokmål (https://app.transifex.com/sabnzbd/teams/111101/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -149,11 +149,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -772,6 +767,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Seriesortering"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Dato sortering"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Kjører skript"
@@ -1834,32 +1841,32 @@ msgstr "Fjern ferdige jobber"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pause jobber med lav prioritet"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pause jobber med normal prioritet"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pause jobber med høy prioritet"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Gjenoppta jobber med lav prioritet"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Gjenoppta jobber med normal prioritet"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Gjenoppta jobber med høy prioritet"
#. Config->Scheduler
@@ -2139,10 +2146,6 @@ msgstr "Spesiell"
msgid "Search"
msgstr "Søk"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Midlertidig nedlastingsmappe"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Er sikker på at du vil slå av SABnzbd?"
@@ -2429,10 +2432,6 @@ msgstr "Navnserver / DNS oppslag"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2918,6 +2917,11 @@ msgstr ""
"Plass for å lagre bearbeidede og ferdige nedlastinger.<br /><i>Kan "
"overstyres av brukerdefinerte kategorier.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3701,6 +3705,10 @@ msgstr "Les kilde"
msgid "Force Download"
msgstr "Tving nedlasting"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4065,20 +4073,6 @@ msgstr "Mappe/Søkesti"
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Seriesortering"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Aktiverer TV sortering"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Hjelp til Sorteringsstreng"
@@ -4087,23 +4081,10 @@ msgstr "Hjelp til Sorteringsstreng"
msgid "Clear"
msgstr "Rens"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "For innstillinger"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Aktiver filmsortering"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Påvirkede kategorier"
@@ -4120,26 +4101,6 @@ msgstr "Mønster"
msgid "Result"
msgstr "Resultat"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Sesongmappe"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Sesongmappe"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Episodemappe"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodemappe"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tittel"
@@ -4188,10 +4149,6 @@ msgstr "Episode.Navn"
msgid "Episode_Name"
msgstr "Episode_Navn"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Filendelse"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "endelse"
@@ -4233,8 +4190,16 @@ msgid "Sort String"
msgstr "Sorteringsstreng"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Multi-del etikett"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4244,26 +4209,13 @@ msgstr "I mappe"
msgid "No folders"
msgstr "Ingen mappe"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Dato sortering"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Aktiver datosortering"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Vis Navn på mappe"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "År-Måneds mapper"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Daglige mapper"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4294,6 +4246,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Alle"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4532,6 +4547,10 @@ msgstr "Bekreft Sletting av Historie"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Hvor lenge ønsker du å pause? (skriv på engelsk!)"
@@ -4708,8 +4727,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Kunne ikke endre navn fra: %s til %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"
"Language-Team: Dutch (https://app.transifex.com/sabnzbd/teams/111101/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -156,11 +156,6 @@ msgstr "SABnzbd wordt herstart omdat de postprocessor is gecrasht"
msgid "Restarting because of crashed downloader"
msgstr "SABnzbd wordt herstart omdat de downloader is gecrasht"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr "SABnzbd wordt herstart omdat de decoder is gecrasht"
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -812,6 +807,18 @@ msgstr "[%s] Het commando in build_command is ongedefinieerd"
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Python-script '%s' heeft geen uitvoerpermissie (+x)"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Serie sorteren"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Datum sorteren"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr "Film sorteren"
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Script uitvoeren"
@@ -1884,32 +1891,32 @@ msgstr "Verwijder voltooide downloads"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pauzeer downloads met prioriteit \"Laag\""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pauzeer downloads met prioriteit \"Normaal\""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pauzeer downloads met prioriteit \"Hoog\""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Hervat downloads met prioriteit \"Laag\""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Hervat downloads met prioriteit \"Normaal\""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Hervat downloads met prioriteit \"Hoog\""
#. Config->Scheduler
@@ -2189,10 +2196,6 @@ msgstr "Speciaal"
msgid "Search"
msgstr "Zoeken"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Map voor verwerkte downloads"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Weet je zeker dat je SABnzbd wilt afsluiten?"
@@ -2481,10 +2484,6 @@ msgstr "Nameserver / DNS opzoeken"
msgid "Download speed limited by"
msgstr "Downloadsnelheid beperkt door"
#: sabnzbd/skintext.py
msgid "CPU"
msgstr "Processor"
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr "Hardeschijf"
@@ -2993,6 +2992,11 @@ msgid ""
"overruled by user-defined categories.</i>"
msgstr "(kan aangepast worden door de categorieën)."
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr "Minimale vrije ruimte voor verwerkte downloads map"
@@ -3827,6 +3831,10 @@ msgstr "Uitlezen"
msgid "Force Download"
msgstr "Forceer download"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Filters toepassen"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4201,20 +4209,6 @@ msgstr "Map/Pad"
msgid "Indexer Categories / Groups"
msgstr "Indexer Categorieën / Groepen"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr "Selecteer minstens 1 categorie."
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Serie sorteren"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Serie sorteren aan"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Uitleg"
@@ -4223,23 +4217,10 @@ msgstr "Uitleg"
msgid "Clear"
msgstr "Wissen"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "Filters toepassen"
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Standaardinstellingen"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr "Film sorteren"
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Film sorteren aan"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Beïnvloede categorieën"
@@ -4256,26 +4237,6 @@ msgstr "Patroon"
msgid "Result"
msgstr "Resultaat"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Seizoensmappen"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Seizoensmap"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Aflevering-map"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Aflevering-map"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Downloadnaam als Bestandsnaam"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4324,10 +4285,6 @@ msgstr "Aflevering.Naam"
msgid "Episode_Name"
msgstr "Aflevering_Naam"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Bestandsextensie"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Extensie"
@@ -4369,8 +4326,16 @@ msgid "Sort String"
msgstr "Sorteertekst"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Meervoudig label"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4380,26 +4345,13 @@ msgstr "In mappen"
msgid "No folders"
msgstr "Geen mappen"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Datum sorteren"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Downloadnaam als Bestandsnaam"
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Datum sorteren aan"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Toon Naam map"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Jaar-Maand Mappen"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Dagelijkse Mappen"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4430,6 +4382,69 @@ msgstr "GuessIt.Eigenschap"
msgid "GuessIt_Property"
msgstr "GuessIt_Eigenschap"
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "alles"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4669,6 +4684,10 @@ msgstr "Bevestig verwijderen uit geschiedenis"
msgid "Keyboard shortcuts"
msgstr "Sneltoetsen"
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Voor hoe lang of tot wanneer wilt u pauzeren? (in het Engels!)"
@@ -4845,8 +4864,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Hernoemen van %s tot %s mislukt"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -3,14 +3,14 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2022
# Safihre <safihre@sabnzbd.org>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
"Language-Team: Polish (https://www.transifex.com/sabnzbd/teams/111101/pl/)\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Polish (https://app.transifex.com/sabnzbd/teams/111101/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -145,11 +145,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -772,6 +767,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Sortowanie seriali"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Sortowanie według daty"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Uruchamianie skryptu"
@@ -1840,32 +1847,32 @@ msgstr "Usuń ukończone zadania"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Wstrzymaj zadania o niskim priorytecie"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Wstrzymaj zadania o normalnym priorytecie"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Wstrzymaj zadania o wysokim priorytecie"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Wznów zadania o niskim priorytecie"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Wznów zadania o normalnym priorytecie"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Wznów zadania o wysokim priorytecie"
#. Config->Scheduler
@@ -2145,10 +2152,6 @@ msgstr "Specjalne"
msgid "Search"
msgstr "Szukaj"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Katalog pobierania"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Czy na pewno wyłączyć SABnzbd?"
@@ -2435,10 +2438,6 @@ msgstr "Serwer DNS"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2925,6 +2924,11 @@ msgstr ""
"Miejsce przechowywania ukończonych, przetworzonych plików. <br /><i>Może "
"zostać zmienione przez ustawienia kategorii.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3712,6 +3716,10 @@ msgstr "Pobierz kanał"
msgid "Force Download"
msgstr "Wymuś pobranie"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4076,20 +4084,6 @@ msgstr "Katalog/Ścieżka"
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Sortowanie seriali"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Włącz sortowanie TV"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Zastępowane ciągi"
@@ -4098,23 +4092,10 @@ msgstr "Zastępowane ciągi"
msgid "Clear"
msgstr "Wyczyść"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Predefiniowane"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Włącz sortowanie filmów"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Dotyczy kategorii"
@@ -4131,26 +4112,6 @@ msgstr "Ciąg"
msgid "Result"
msgstr "Wynik"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "Katalog sezonu 1x05"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "Katalog sezonu S01E05"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "Katalog odcinka 1x05"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "Katalog odcinka S01E05"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tytuł"
@@ -4199,10 +4160,6 @@ msgstr "Tytuł.odcinka"
msgid "Episode_Name"
msgstr "Tytuł_odcinka"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Rozszerzenie pliku"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Rozszerzenie"
@@ -4244,8 +4201,16 @@ msgid "Sort String"
msgstr "Wzorzec sortowania"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Etykieta wieloczęściowa"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4255,26 +4220,13 @@ msgstr "W katalogach"
msgid "No folders"
msgstr "Brak katalogów"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Sortowanie według daty"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Włącz sortowanie według daty"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Katalog z tytułem serialu"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Katalogi rok-miesiąc"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Katalogi dzienne"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4305,6 +4257,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Wszystko"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4543,6 +4558,10 @@ msgstr "Potwierdzaj usuwanie z historii"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Jak długo lub do kiedy chcesz wstrzymać? (po angielsku!)"
@@ -4717,8 +4736,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Nie udało się zmienić nazwy %s na %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -3,14 +3,14 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2022
# Safihre <safihre@sabnzbd.org>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -149,11 +149,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -776,6 +771,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Ordenação de Séries"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Ordenação por data"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Executando script"
@@ -1843,32 +1850,32 @@ msgstr "Remover trabalhos encerrados"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pausa tarefas de baixa prioridade"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pausa tarefas de prioridade normal"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pausa tarefas de alta prioridade"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Continua tarefas de baixa prioridade"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Continua tarefas de prioridade normal"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Continua tarefas de alta prioridade"
#. Config->Scheduler
@@ -2148,10 +2155,6 @@ msgstr "Especial"
msgid "Search"
msgstr "Busca"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Pasta de Download"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Tem certeza de que quer encerrar o SABnzbd?"
@@ -2438,10 +2441,6 @@ msgstr "Nome do servidor / DNS Lookup"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2927,6 +2926,11 @@ msgstr ""
"Local para armazenar downloads concluídos, totalmente processados.<br "
"/><i>Pode ser anulado por categorias definidas pelo usuário.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3714,6 +3718,10 @@ msgstr "Ler Feed"
msgid "Force Download"
msgstr "Forçar Download"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4078,20 +4086,6 @@ msgstr "Pasta/Caminho"
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Ordenação de Séries"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Ativar a ordenação de TV"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Modelo do padrão"
@@ -4100,23 +4094,10 @@ msgstr "Modelo do padrão"
msgid "Clear"
msgstr "Limpar"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Predefinições"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Ativar a ordenação de filmes"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Categorias Afetadas"
@@ -4133,26 +4114,6 @@ msgstr "Modelo"
msgid "Result"
msgstr "Resultado"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Pasta Da Temporada"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Pasta Da Temporada"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Pasta Do Episódio"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Pasta Do Episódio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tí­tulo"
@@ -4201,10 +4162,6 @@ msgstr "Nome.Episódio"
msgid "Episode_Name"
msgstr "Nome_Episódio"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Extensão do arquivo"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Extensão"
@@ -4246,8 +4203,16 @@ msgid "Sort String"
msgstr "String de ordenação"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Rótulo multi-parte"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4257,26 +4222,13 @@ msgstr "Em pastas"
msgid "No folders"
msgstr "Sem pastas"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Ordenação por data"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Ativar a ordenação por data"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Pasta do Nome do Show"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Pastas Ano-Mês"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Pastas Diárias"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4307,6 +4259,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Todos"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4545,6 +4560,10 @@ msgstr "Confirmar Exclusões do Histórico"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Por quanto tempo ou até quando você quer pausar? (em Inglês!)"
@@ -4719,8 +4738,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Falha ao renomear: %s para %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Romanian (https://www.transifex.com/sabnzbd/teams/111101/ro/)\n"
"Language-Team: Romanian (https://app.transifex.com/sabnzbd/teams/111101/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -154,11 +154,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -795,6 +790,18 @@ msgstr "[%s] Comanda din build_command este nedefinită."
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Scriptul Python „%s” nu are permisiuni de executare (+x)"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Sortare Seriale"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Sortare Dată"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Rulare script"
@@ -1870,32 +1877,32 @@ msgstr "Elimină sarcinile finalizate"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Întrerupte sarcinile cu prioritate redusă"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Întrerupe sarcinile cu prioritate normală"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Întrerupe sarcinile cu prioritate ridicată"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Reia sarcinile cu prioritate redusă"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Reia sarcinile cu prioritate normală"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Reia sarcinile cu prioritate ridicată"
#. Config->Scheduler
@@ -2175,10 +2182,6 @@ msgstr "Special"
msgid "Search"
msgstr "Caută"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Dosar Descărcare"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Sunteţi sigur că doriţi să inchideţi SABnzbd?"
@@ -2465,10 +2468,6 @@ msgstr "Server de nume/Căutare DNS"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2954,6 +2953,11 @@ msgstr ""
"Locație pentru stocare , a descărcărilor procesate complet.<br /><i>Poate fi"
" suprascris de categoriile definite de utilizator.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3743,6 +3747,10 @@ msgstr "Citeşte Flux"
msgid "Force Download"
msgstr "Descărcare Forţată"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4106,20 +4114,6 @@ msgstr "Dosar/Cale"
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Sortare Seriale"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Activează Sortare TV"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Model Cheie"
@@ -4128,23 +4122,10 @@ msgstr "Model Cheie"
msgid "Clear"
msgstr "Şterge"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Presetări"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Activează Sortare Filme"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Categorii Afectate"
@@ -4161,26 +4142,6 @@ msgstr "Șablon"
msgid "Result"
msgstr "Rezultat"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Dosar Sezon"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Dosar Sezon"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Dosar Episod"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Dosar Episod"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titlu"
@@ -4229,10 +4190,6 @@ msgstr "Nume.Episod"
msgid "Episode_Name"
msgstr "Nume_Episod"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Extensie fișier"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Extensie"
@@ -4274,8 +4231,16 @@ msgid "Sort String"
msgstr "Şir Caractere Sortare"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Etichetă Multi-părţi"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4285,26 +4250,13 @@ msgstr "În dosare"
msgid "No folders"
msgstr "Fără dosare"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Sortare Dată"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Activează Sortare Dată"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Arată Nume dosar"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Dosar An-Lună"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Dosare Zilnice"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4335,6 +4287,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Toate"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4574,6 +4589,10 @@ msgstr "Confirmă Ştergere Istoric"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Cât timp sau până când doriți să întrerupeți? (în Engleză!)"
@@ -4749,8 +4768,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Redenumire:%s în %s nereuşită"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -3,14 +3,14 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2022
# Safihre <safihre@sabnzbd.org>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
"Language-Team: Russian (https://www.transifex.com/sabnzbd/teams/111101/ru/)\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Russian (https://app.transifex.com/sabnzbd/teams/111101/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -149,11 +149,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -774,6 +769,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Сортировка сериалов"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Сортировка даты"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Запуск сценария"
@@ -1839,32 +1846,32 @@ msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr ""
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr ""
#. Config->Scheduler
@@ -2144,10 +2151,6 @@ msgstr "Особая"
msgid "Search"
msgstr ""
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Каталог загрузки"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Остановить SABnzbd?"
@@ -2434,10 +2437,6 @@ msgstr ""
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2923,6 +2922,11 @@ msgstr ""
"Место для сохранения готовых, полностью обработанных загрузок.<br /><i>Можно"
" переопределить в пользовательских категориях.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3705,6 +3709,10 @@ msgstr "Прочитать ленту"
msgid "Force Download"
msgstr "Загрузить принудительно"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4075,20 +4083,6 @@ msgstr "Папка или путь"
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Сортировка сериалов"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Использовать сортировку по ТВ-шоу"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Ключи шаблона"
@@ -4097,23 +4091,10 @@ msgstr "Ключи шаблона"
msgid "Clear"
msgstr "Очистить"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Готовые шаблоны"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Использовать сортировку по фильмам"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Задействованные категории"
@@ -4130,26 +4111,6 @@ msgstr "Шаблон"
msgid "Result"
msgstr "Результат"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Сезон Папка"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Сезон Папка"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Эпизод Папка"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Эпизод Папка"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Название"
@@ -4198,10 +4159,6 @@ msgstr "Название.эпизода"
msgid "Episode_Name"
msgstr "Название_эпизода"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Расширение файла"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Расширение"
@@ -4243,8 +4200,16 @@ msgid "Sort String"
msgstr "Строка сортировки"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Обозначение нескольких частей"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4254,26 +4219,13 @@ msgstr "В папках"
msgid "No folders"
msgstr "Без папок"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Сортировка даты"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Использовать сортировку по дате"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Папка с названием сериала"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Папки с годом и месяцем"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Папки по дням"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4304,6 +4256,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Все"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4541,6 +4556,10 @@ msgstr "Подтвердите удаление журнала"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr ""
@@ -4717,8 +4736,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Не удалось переименовать: %s в %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -3,14 +3,14 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2022
# Safihre <safihre@sabnzbd.org>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
"Language-Team: Serbian (https://www.transifex.com/sabnzbd/teams/111101/sr/)\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Serbian (https://app.transifex.com/sabnzbd/teams/111101/sr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -147,11 +147,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -769,6 +764,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Сортирање серије"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Сређивање датумом"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Покретање скрипта"
@@ -1831,32 +1838,32 @@ msgstr "Ukloni završene poslove"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pauziraj poslove sa niskim prioritetom"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pauziraj poslove sa normalnim prioritetom"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pauziraj poslove sa visokim prioritetom"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Настави радови са ниским приоритетом"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Настави радови са нормалним приоритетом"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Настави радови са високим приоритетом"
#. Config->Scheduler
@@ -2136,10 +2143,6 @@ msgstr "Посебно"
msgid "Search"
msgstr "Претрага"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Фасцикла преузимања"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Da li ste sigurni da želite ugasiti SABnzbd?"
@@ -2426,10 +2429,6 @@ msgstr "Nameserver/DNS Pretraga"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2909,6 +2908,11 @@ msgstr ""
"Смештај завршених, процесираних преузимања.<br /><i>Може се заобићи у "
"дефинисаним категоријама.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3690,6 +3694,10 @@ msgstr "Читај фид"
msgid "Force Download"
msgstr "Натерај преузимање"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4053,20 +4061,6 @@ msgstr "Фасцикла/Путања"
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Сортирање серије"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Упали сортирање ТВ-а"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Модел кључа"
@@ -4075,23 +4069,10 @@ msgstr "Модел кључа"
msgid "Clear"
msgstr "Очисти"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Предподешавања"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Упали сортирање филма"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Погођене категорије"
@@ -4108,26 +4089,6 @@ msgstr "Модел"
msgid "Result"
msgstr "Резултат"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Фасцикла сезоне"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Фасцикла сезоне"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Фасцикла епизоде"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Фасцикла епизоде"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Наслов"
@@ -4176,10 +4137,6 @@ msgstr "Име.Епизоде"
msgid "Episode_Name"
msgstr "Име_епизоде"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Екстензија датотеке"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Екстензија"
@@ -4221,8 +4178,16 @@ msgid "Sort String"
msgstr "Уреди низ"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Етикете више-партија"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4232,26 +4197,13 @@ msgstr "У фасциклама"
msgid "No folders"
msgstr "Нема фасцикле"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Сређивање датумом"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Упали сређивање по датуму"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Фасцикла Име Серије"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "Фасцикле Година-Месец"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Дневне фасцикле"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4282,6 +4234,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Све"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4520,6 +4535,10 @@ msgstr "Потврда брисања хронологије"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Koliko dugo ili dokle želite da pauzirate? (na engleskom!)"
@@ -4694,8 +4713,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Неуспешно преименовање : %s у %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -3,14 +3,14 @@
# team@sabnzbd.org
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2022
# Safihre <safihre@sabnzbd.org>, 2023
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
"Language-Team: Swedish (https://www.transifex.com/sabnzbd/teams/111101/sv/)\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Swedish (https://app.transifex.com/sabnzbd/teams/111101/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -147,11 +147,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -771,6 +766,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr ""
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "Seriesortering"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "Datum sortering"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "Kör skript"
@@ -1837,32 +1844,32 @@ msgstr "Ta bort färdiga jobb"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "Pausa lågprioriterade jobb"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "Pausa normalprioriterade jobb"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "Pausa högprioriterade jobb"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "Återuppta lågprioriterade jobb"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "Återuppta normalprioriterade jobb"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "Återuppta högprioriterade jobb"
#. Config->Scheduler
@@ -2142,10 +2149,6 @@ msgstr "Speciell"
msgid "Search"
msgstr "Sök"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "Temporär nedladdningmapp"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "Är du säker på att du vill stänga av SABnzbd?"
@@ -2432,10 +2435,6 @@ msgstr "Namnserver /DNS Lookup"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2920,6 +2919,11 @@ msgstr ""
"Plats för att lagra bearbetade och färdiga nedladdningar.<br /><i>Kan "
"åsidosättas av användar-definierade kategorier.</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3703,6 +3707,10 @@ msgstr "Läs flöde"
msgid "Force Download"
msgstr "Tvinga nedladdning"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4066,20 +4074,6 @@ msgstr "Mapp/Sökväg"
msgid "Indexer Categories / Groups"
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "Seriesortering"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "Aktivera TV sortering"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "Hjälp till Sorteringssträng"
@@ -4088,23 +4082,10 @@ msgstr "Hjälp till Sorteringssträng"
msgid "Clear"
msgstr "Rensa"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr ""
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "Förinställningar"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "Aktivera filmsortering"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "Påverkade kategorier"
@@ -4121,26 +4102,6 @@ msgstr "Mönster"
msgid "Result"
msgstr "Resultat"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 Säsongsmapp"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 Säsongsmapp"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 Episodmapp"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodmapp"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4189,10 +4150,6 @@ msgstr "Episod.Namn"
msgid "Episode_Name"
msgstr "Episod_Namn"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "Filändelse"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "Filändelse"
@@ -4234,8 +4191,16 @@ msgid "Sort String"
msgstr "Sorteringssträng"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "Multi-del etikett"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4245,26 +4210,13 @@ msgstr "In mapp"
msgid "No folders"
msgstr "Ingen mapp"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "Datum sortering"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "Aktivera datumssortering"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "Visa Namn på mapp"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "År-Månads mappar"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "Dagliga mappar"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4295,6 +4247,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "Alla"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4532,6 +4547,10 @@ msgstr "Bekräfta Historik-borttagningar"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "Hur lång tid eller tills då vill du pausa? (på engelska!)"
@@ -4708,8 +4727,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "Det gick inte att döpa om: %s till %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Chinese (China) (https://www.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
"Language-Team: Chinese (China) (https://app.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -145,11 +145,6 @@ msgstr ""
msgid "Restarting because of crashed downloader"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed decoder"
msgstr ""
#. Warning message
#: sabnzbd/__init__.py
msgid "Restarting because of crashed assembler"
@@ -764,6 +759,18 @@ msgstr ""
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Python 脚本 \"%s\" 不具有执行 (+x) 权限"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Series Sorting"
msgstr "TV 排序"
#: sabnzbd/misc.py
msgid "Date Sorting"
msgstr "日期排序"
#: sabnzbd/misc.py, sabnzbd/skintext.py
msgid "Movie Sorting"
msgstr "电影排序"
#: sabnzbd/newsunpack.py, sabnzbd/postproc.py
msgid "Running script"
msgstr "正在执行脚本"
@@ -1824,32 +1831,32 @@ msgstr "移除已完成任务"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause low prioirty jobs"
msgid "Pause low priority jobs"
msgstr "暂停低优先级任务"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause normal prioirty jobs"
msgid "Pause normal priority jobs"
msgstr "暂停常规优先级任务"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Pause high prioirty jobs"
msgid "Pause high priority jobs"
msgstr "暂停高优先级任务"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume low prioirty jobs"
msgid "Resume low priority jobs"
msgstr "继续低优先级任务"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume normal prioirty jobs"
msgid "Resume normal priority jobs"
msgstr "继续常规优先级任务"
#. Config->Scheduler
#: sabnzbd/skintext.py
msgid "Resume high prioirty jobs"
msgid "Resume high priority jobs"
msgstr "继续高优先级任务"
#. Config->Scheduler
@@ -2129,10 +2136,6 @@ msgstr "特殊"
msgid "Search"
msgstr "搜索"
#: sabnzbd/skintext.py
msgid "Download Dir"
msgstr "下载目录"
#: sabnzbd/skintext.py
msgid "Are you sure you want to shutdown SABnzbd?"
msgstr "是否确定要关闭 SABnzbd?"
@@ -2419,10 +2422,6 @@ msgstr "域名服务器 / DNS 查询"
msgid "Download speed limited by"
msgstr ""
#: sabnzbd/skintext.py
msgid "CPU"
msgstr ""
#: sabnzbd/skintext.py
msgid "Disk speed"
msgstr ""
@@ -2882,6 +2881,11 @@ msgid ""
"overruled by user-defined categories.</i>"
msgstr "存储完成且已完全处理的下载数据的位置。<br /><i>可以通过用户定义分类额外调整。</i>"
#: sabnzbd/skintext.py
msgid ""
"Use Sorting to automatically organize and rename your completed downloads."
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Free Space for Completed Download Folder"
msgstr ""
@@ -3641,6 +3645,10 @@ msgstr "读取 Feed"
msgid "Force Download"
msgstr "强制下载"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "应用过滤器"
#. Config->RSS edit button
#: sabnzbd/skintext.py
msgid "Edit"
@@ -4005,20 +4013,6 @@ msgstr "文件夹/路径"
msgid "Indexer Categories / Groups"
msgstr "索引 Categories / Groups"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Select at least 1 category."
msgstr ""
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Series Sorting"
msgstr "TV 排序"
#: sabnzbd/skintext.py
msgid "Enable TV Sorting"
msgstr "启用 TV 排序"
#: sabnzbd/skintext.py
msgid "Pattern Key"
msgstr "匹配符释义"
@@ -4027,23 +4021,10 @@ msgstr "匹配符释义"
msgid "Clear"
msgstr "清除"
#: sabnzbd/skintext.py
msgid "Apply filters"
msgstr "应用过滤器"
#: sabnzbd/skintext.py
msgid "Presets"
msgstr "预设"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Movie Sorting"
msgstr "电影排序"
#: sabnzbd/skintext.py
msgid "Enable Movie Sorting"
msgstr "启用电影排序"
#: sabnzbd/skintext.py
msgid "Affected Categories"
msgstr "影响分类"
@@ -4060,26 +4041,6 @@ msgstr "匹配"
msgid "Result"
msgstr "结果"
#: sabnzbd/skintext.py
msgid "1x05 Season Folder"
msgstr "1x05 季度文件夹"
#: sabnzbd/skintext.py
msgid "S01E05 Season Folder"
msgstr "S01E05 季度文件夹"
#: sabnzbd/skintext.py
msgid "1x05 Episode Folder"
msgstr "1x05 剧集文件夹"
#: sabnzbd/skintext.py
msgid "S01E05 Episode Folder"
msgstr "S01E05 剧集文件夹"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "标题"
@@ -4128,10 +4089,6 @@ msgstr "集.名"
msgid "Episode_Name"
msgstr "集_名"
#: sabnzbd/skintext.py
msgid "File Extension"
msgstr "文件扩展名"
#: sabnzbd/skintext.py
msgid "Extension"
msgstr "扩展名"
@@ -4173,8 +4130,16 @@ msgid "Sort String"
msgstr "排序字串"
#: sabnzbd/skintext.py
msgid "Multi-part label"
msgstr "多段标记"
msgid "Multi-part Label"
msgstr ""
#: sabnzbd/skintext.py
msgid "Show folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Season folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "In folders"
@@ -4184,26 +4149,13 @@ msgstr "分文件夹"
msgid "No folders"
msgstr "不分文件夹"
#. Warning message
#: sabnzbd/skintext.py, sabnzbd/sorting.py
msgid "Date Sorting"
msgstr "日期排序"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Date Sorting"
msgstr "启用日期排序"
#: sabnzbd/skintext.py
msgid "Show Name folder"
msgstr "节目名称文件夹"
#: sabnzbd/skintext.py
msgid "Year-Month Folders"
msgstr "年-月文件夹"
#: sabnzbd/skintext.py
msgid "Daily Folders"
msgstr "每天文件夹"
msgid "Series"
msgstr ""
#. Note for title expression in Sorting that does case adjustment
#: sabnzbd/skintext.py
@@ -4234,6 +4186,69 @@ msgstr ""
msgid "GuessIt_Property"
msgstr ""
#: sabnzbd/skintext.py
msgid "Minimum Filesize"
msgstr ""
#: sabnzbd/skintext.py
msgid "Affected Job Types"
msgstr ""
#: sabnzbd/skintext.py
msgid "All"
msgstr "全部"
#: sabnzbd/skintext.py
msgid "Series with air dates"
msgstr ""
#: sabnzbd/skintext.py
msgid "Movies"
msgstr ""
#: sabnzbd/skintext.py
msgid "Other / Unknown"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"<p>Use Sorters to automatically organize your completed downloads. For "
"example, put all episodes from a series in a season-specific folder. Or, put"
" movies in a folder named after the movie.</p><p>Sorters are tried in order "
"of appearance and can be reordered by dragging and dropping.<br/>The first "
"active sorter that matches both the affected category and job type is "
"applied.</p><p>More options are available when Advanced Settings is "
"checked.<br/>Detailed information can be found on the Wiki.</p>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Add Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Remove Sorter"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test Data"
msgstr ""
#: sabnzbd/skintext.py
msgid "Quick start"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all episodes in the \"tv\" category to a show-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Move and rename all movies in the \"movies\" category to a movie-specific "
"folder"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Rarely used options. For their meaning and explanation, click on the Help "
@@ -4469,6 +4484,10 @@ msgstr "确认历史删除"
msgid "Keyboard shortcuts"
msgstr ""
#: sabnzbd/skintext.py
msgid "Shift+Arrow key: Browse Queue and History pages"
msgstr ""
#: sabnzbd/skintext.py
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "您希望在多久之后/什么时候暂停? (用英语作答!)"
@@ -4641,8 +4660,8 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename: %s to %s"
msgstr "重命名失败: %s 为 %s"
msgid "Failed to rename %s to %s"
msgstr ""
#. Error message
#: sabnzbd/sorting.py

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.0.0Alpha1\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\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

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Pavel C <quoing_transifex@mess.cz>, 2022\n"
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
"Language-Team: Czech (https://app.transifex.com/sabnzbd/teams/111101/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Danish (https://app.transifex.com/sabnzbd/teams/111101/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.0.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0RC1\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: reloxx13 <reloxx@interia.pl>, 2022\n"
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"
"Language-Team: German (https://app.transifex.com/sabnzbd/teams/111101/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Spanish (https://app.transifex.com/sabnzbd/teams/111101/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Finnish (https://app.transifex.com/sabnzbd/teams/111101/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2021\n"
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"
"Language-Team: French (https://app.transifex.com/sabnzbd/teams/111101/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: ION, 2021\n"
"Language-Team: Hebrew (https://www.transifex.com/sabnzbd/teams/111101/he/)\n"
"Language-Team: Hebrew (https://app.transifex.com/sabnzbd/teams/111101/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Norwegian Bokmål (https://app.transifex.com/sabnzbd/teams/111101/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2021\n"
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"
"Language-Team: Dutch (https://app.transifex.com/sabnzbd/teams/111101/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Polish (https://app.transifex.com/sabnzbd/teams/111101/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Romanian (https://app.transifex.com/sabnzbd/teams/111101/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Russian (https://app.transifex.com/sabnzbd/teams/111101/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Serbian (https://app.transifex.com/sabnzbd/teams/111101/sr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Swedish (https://app.transifex.com/sabnzbd/teams/111101/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-3.8.0-develop\n"
"Project-Id-Version: SABnzbd-4.0.0Beta2\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"
"Language-Team: Chinese (China) (https://app.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -1,6 +1,6 @@
# Main requirements
# Note that not all sub-dependencies are listed, but only ones we know could cause trouble
sabctools==6.1.0
sabctools==7.0.1
cheetah3==3.2.6.post1
cffi==1.15.1
pycparser==2.21
@@ -9,38 +9,38 @@ configobj==5.0.8
cheroot==9.0.0
six==1.16.0
cherrypy==18.8.0
jaraco.functools==3.5.2
jaraco.collections==3.8.0
jaraco.functools==3.6.0
jaraco.collections==4.1.0
jaraco.text==3.8.1 # Newer version introduces irrelevant extra dependencies
jaraco.classes==3.2.3
jaraco.context==4.3.0
more-itertools==9.0.0
zc.lockfile==2.0
more-itertools==9.1.0
zc.lockfile==3.0.post1
python-dateutil==2.8.2
tempora==5.2.1
pytz==2022.7.1
tempora==5.2.2
pytz==2023.3
sgmllib3k==1.0.0
portend==3.1.0
chardet==5.1.0
PySocks==1.7.1
puremagic==1.14
guessit==3.5.0
puremagic==1.15
guessit==3.7.1
babelfish==0.6.0
rebulk==3.1.0
rebulk==3.2.0
# Recent cryptography versions require Rust. If you run into issues compiling this
# SABnzbd will also work with older pre-Rust versions such as cryptography==3.3.2
cryptography==39.0.1
cryptography==40.0.2
# We recommend using "orjson" as it is 2x as fast as "ujson". However, it requires
# Rust so SABnzbd works just as well with "ujson" or the Python built in "json" module
ujson==5.7.0
# Windows system integration
pywin32==305; sys_platform == 'win32'
pywin32==306; sys_platform == 'win32'
# macOS system calls
pyobjc==9.0.1; sys_platform == 'darwin'
pyobjc==9.1.1; sys_platform == 'darwin'
# Linux notifications
notify2==0.3.1; sys_platform != 'win32' and sys_platform != 'darwin'

View File

@@ -123,7 +123,6 @@ import sabnzbd.utils.ssdp
# Storage for the threads, variables are filled during initialization
ArticleCache: sabnzbd.articlecache.ArticleCache
Assembler: sabnzbd.assembler.Assembler
Decoder: sabnzbd.decoder.Decoder
Downloader: sabnzbd.downloader.Downloader
PostProcessor: sabnzbd.postproc.PostProcessor
NzbQueue: sabnzbd.nzbqueue.NzbQueue
@@ -292,6 +291,11 @@ def initialize(pause_downloader=False, clean_up=False, repair=0):
elif cfg.auto_sort() == "1":
cfg.auto_sort.set("avg_age asc")
# Convert old series/date/movie sorters
if not cfg.sorters_converted():
misc.convert_sorter_settings()
cfg.sorters_converted.set(True)
# Add hostname to the whitelist
if not cfg.host_whitelist():
cfg.host_whitelist.set(socket.gethostname())
@@ -306,7 +310,6 @@ def initialize(pause_downloader=False, clean_up=False, repair=0):
sabnzbd.BPSMeter = sabnzbd.bpsmeter.BPSMeter()
sabnzbd.NzbQueue = sabnzbd.nzbqueue.NzbQueue()
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()
sabnzbd.DirScanner = sabnzbd.dirscanner.DirScanner()
@@ -340,9 +343,6 @@ def start():
logging.debug("Starting downloader")
sabnzbd.Downloader.start()
logging.debug("Starting decoders")
sabnzbd.Decoder.start()
logging.debug("Starting scheduler")
sabnzbd.Scheduler.start()
@@ -398,11 +398,6 @@ def halt():
except:
pass
# Decoder handles join gracefully
logging.debug("Stopping decoders")
sabnzbd.Decoder.stop()
sabnzbd.Decoder.join()
logging.debug("Stopping assembler")
sabnzbd.Assembler.stop()
try:
@@ -487,9 +482,6 @@ def check_all_tasks():
if not sabnzbd.Downloader.is_alive():
logging.warning(T("Restarting because of crashed downloader"))
return False
if not sabnzbd.Decoder.is_alive():
logging.warning(T("Restarting because of crashed decoder"))
return False
if not sabnzbd.Assembler.is_alive():
logging.warning(T("Restarting because of crashed assembler"))
return False

View File

@@ -121,6 +121,8 @@ def _api_set_config(name, kwargs):
kwargs["keyword"] = handle_rss_api(kwargs)
elif kwargs.get("section") == "categories":
kwargs["keyword"] = handle_cat_api(kwargs)
elif kwargs.get("section") == "sorters":
kwargs["keyword"] = handle_sorter_api(kwargs)
else:
res = config.set_config(kwargs)
if not res:
@@ -627,10 +629,10 @@ LOG_API_JSON_RE = re.compile(rb"'(apikey|api)': '[\w]+'", re.I)
LOG_USER_RE = re.compile(rb"(user|username)\s?=\s?[\S]+", re.I)
LOG_PASS_RE = re.compile(rb"(password)\s?=\s?[\S]+", re.I)
LOG_INI_HIDE_RE = re.compile(
rb"(email_pwd|email_account|email_to|pushover_token|pushover_userkey|pushbullet_apikey|prowl_apikey|growl_password|growl_server|IPv[4|6] address)\s?=\s?[\S]+",
rb"(email_pwd|email_account|email_to|email_from|pushover_token|pushover_userkey|pushbullet_apikey|prowl_apikey|growl_password|growl_server|IPv[4|6] address)\s?=\s?[\S]+",
re.I,
)
LOG_HASH_RE = re.compile(rb"([a-fA-F\d]{25})", re.I)
LOG_HASH_RE = re.compile(rb"([a-zA-Z\d]{25})", re.I)
def _api_showlog(name, kwargs):
@@ -714,11 +716,10 @@ def _api_disconnect(name, kwargs):
def _api_eval_sort(name, kwargs):
"""API: evaluate sorting expression"""
name = kwargs.get("name", "")
value = kwargs.get("value", "")
title = kwargs.get("title")
multipart = kwargs.get("movieextra", "")
path = sabnzbd.sorting.eval_sort(value, title, name, multipart)
sort_string = kwargs.get("sort_string", "")
job_name = kwargs.get("job_name", "")
multipart_label = kwargs.get("multipart_label", "")
path = sabnzbd.sorting.eval_sort(sort_string, job_name, multipart_label)
if path is None:
return report(_MSG_NOT_IMPLEMENTED)
else:
@@ -1164,6 +1165,22 @@ def handle_server_api(kwargs):
return name
def handle_sorter_api(kwargs):
"""Special handler for API-call 'set_config' [sorters]"""
name = kwargs.get("keyword")
if not name:
name = kwargs.get("name")
if not name:
return None
sorter = config.get_config("sorters", name)
if sorter:
sorter.set_dict(kwargs)
else:
config.ConfigSorter(name, kwargs)
return name
def handle_rss_api(kwargs):
"""Special handler for API-call 'set_config' [rss]"""
name = kwargs.get("keyword")
@@ -1243,7 +1260,6 @@ def build_status(calculate_performance: bool = False, skip_dashboard: bool = Fal
sabnzbd.INTERNET_BANDWIDTH = round(internetspeed_future.result(), 1)
# How often did we delay?
info["delayed_decoder"] = sabnzbd.BPSMeter.delayed_decoder
info["delayed_assembler"] = sabnzbd.BPSMeter.delayed_assembler
# Dashboard: Speed and load of System
@@ -1785,7 +1801,7 @@ def plural_to_single(kw, def_kw=""):
def del_from_section(kwargs):
"""Remove keyword in section"""
section = kwargs.get("section", "")
if section in ("servers", "rss", "categories"):
if section in ("sorters", "servers", "rss", "categories"):
keyword = kwargs.get("keyword")
if keyword:
item = config.get_config(section, keyword)

View File

@@ -26,7 +26,7 @@ from typing import Dict, List
import sabnzbd
from sabnzbd.decorators import synchronized
from sabnzbd.constants import GIGI, ANFO, MEBI, LIMIT_DECODE_QUEUE, MIN_DECODE_QUEUE, ASSEMBLER_WRITE_THRESHOLD
from sabnzbd.constants import GIGI, ANFO, ASSEMBLER_WRITE_THRESHOLD
from sabnzbd.nzbstuff import Article
# Operations on the article table are handled via try/except.
@@ -41,10 +41,6 @@ class ArticleCache:
self.__cache_size = 0
self.__article_table: Dict[Article, bytes] = {} # Dict of buffered articles
# Limit for the decoder is based on the total available cache
# so it can be larger on memory-rich systems
self.decoder_cache_article_limit = 0
self.assembler_write_trigger: int = 1
# On 32 bit we only allow the user to set 1GB
@@ -64,19 +60,12 @@ class ArticleCache:
else:
self.__cache_limit = min(limit, self.__cache_upper_limit)
# The decoder-limit should not be larger than 1/3th of the whole cache
# Calculated in number of articles, assuming 1 article = 1MB max
decoder_cache_limit = int(min(self.__cache_limit / 3 / MEBI, LIMIT_DECODE_QUEUE))
# The cache should also not be too small
self.decoder_cache_article_limit = max(decoder_cache_limit, MIN_DECODE_QUEUE)
# Set assembler_write_trigger to be the equivalent of ASSEMBLER_WRITE_THRESHOLD %
# of the total cache, assuming an article size of 750 000 bytes
self.assembler_write_trigger = int(self.__cache_limit * ASSEMBLER_WRITE_THRESHOLD / 100 / 750_000) + 1
logging.debug(
"Decoder cache limit = %d - Assembler trigger = %d",
self.decoder_cache_article_limit,
"Assembler trigger = %d",
self.assembler_write_trigger,
)

View File

@@ -364,8 +364,7 @@ def check_encrypted_and_unwanted_files(nzo: NzbObject, filepath: str) -> Tuple[b
unwanted = somefile
zf.close()
del zf
except:
logging.info("Error during inspection of RAR-file %s", filepath)
logging.debug("Traceback: ", exc_info=True)
except rarfile.Error as e:
logging.info("Error during inspection of RAR-file %s: %s", filepath, e)
return encrypted, unwanted

View File

@@ -108,7 +108,6 @@ class BPSMeter:
"timeline_total",
"article_stats_tried",
"article_stats_failed",
"delayed_decoder",
"delayed_assembler",
"day_label",
"end_of_day",
@@ -147,7 +146,6 @@ class BPSMeter:
self.article_stats_tried: Dict[str, Dict[str, int]] = {}
self.article_stats_failed: Dict[str, Dict[str, int]] = {}
self.delayed_decoder: int = 0
self.delayed_assembler: int = 0
self.day_label: str = time.strftime("%Y-%m-%d")
@@ -288,7 +286,6 @@ class BPSMeter:
self.day_total = {}
# Reset delayed counters so they don't go too high
self.delayed_decoder = 0
self.delayed_assembler = 0
# Check end of week and end of month

View File

@@ -259,9 +259,10 @@ configlock = OptionBool("misc", "config_lock", False)
##############################################################################
# One time trackers
##############################################################################
fixed_ports = OptionBool("misc", "fixed_ports", False)
fixed_ports = OptionBool("misc", "fixed_ports", False, public=False)
notified_new_skin = OptionNumber("misc", "notified_new_skin", 0)
direct_unpack_tested = OptionBool("misc", "direct_unpack_tested", False)
direct_unpack_tested = OptionBool("misc", "direct_unpack_tested", False, public=False)
sorters_converted = OptionBool("misc", "sorters_converted", False, public=False)
##############################################################################
@@ -336,7 +337,7 @@ no_series_dupes = OptionNumber("misc", "no_series_dupes", 0)
series_propercheck = OptionBool("misc", "series_propercheck", True)
pause_on_pwrar = OptionNumber("misc", "pause_on_pwrar", 1)
ignore_samples = OptionBool("misc", "ignore_samples", False)
deobfuscate_final_filenames = OptionBool("misc", "deobfuscate_final_filenames", False)
deobfuscate_final_filenames = OptionBool("misc", "deobfuscate_final_filenames", True)
auto_sort = OptionStr("misc", "auto_sort")
direct_unpack = OptionBool("misc", "direct_unpack", False)
propagation_delay = OptionNumber("misc", "propagation_delay", 0)
@@ -361,20 +362,20 @@ quota_resume = OptionBool("misc", "quota_resume", False)
quota_period = OptionStr("misc", "quota_period", "m")
##############################################################################
# Config - Sorting
# Config - Sorting (OLD SORTER)
##############################################################################
enable_tv_sorting = OptionBool("misc", "enable_tv_sorting", False)
tv_sort_string = OptionStr("misc", "tv_sort_string")
tv_categories = OptionList("misc", "tv_categories", ["tv"])
enable_tv_sorting = OptionBool("misc", "enable_tv_sorting", False, public=False)
tv_sort_string = OptionStr("misc", "tv_sort_string", public=False)
tv_categories = OptionList("misc", "tv_categories", ["tv"], public=False)
enable_movie_sorting = OptionBool("misc", "enable_movie_sorting", False)
movie_sort_string = OptionStr("misc", "movie_sort_string")
movie_sort_extra = OptionStr("misc", "movie_sort_extra", "-cd%1", strip=False)
movie_categories = OptionList("misc", "movie_categories", ["movies"])
enable_movie_sorting = OptionBool("misc", "enable_movie_sorting", False, public=False)
movie_sort_string = OptionStr("misc", "movie_sort_string", public=False)
movie_sort_extra = OptionStr("misc", "movie_sort_extra", "-cd%1", strip=False, public=False)
movie_categories = OptionList("misc", "movie_categories", ["movies"], public=False)
enable_date_sorting = OptionBool("misc", "enable_date_sorting", False)
date_sort_string = OptionStr("misc", "date_sort_string")
date_categories = OptionList("misc", "date_categories", ["tv"])
enable_date_sorting = OptionBool("misc", "enable_date_sorting", False, public=False)
date_sort_string = OptionStr("misc", "date_sort_string", public=False)
date_categories = OptionList("misc", "date_categories", ["tv"], public=False)
##############################################################################
# Config - Scheduling and RSS
@@ -415,6 +416,7 @@ api_warnings = OptionBool("misc", "api_warnings", True, protect=True)
no_penalties = OptionBool("misc", "no_penalties", False)
x_frame_options = OptionBool("misc", "x_frame_options", True)
allow_old_ssl_tls = OptionBool("misc", "allow_old_ssl_tls", False)
enable_season_sorting = OptionBool("misc", "enable_season_sorting", True)
# Text values
rss_odd_titles = OptionList("misc", "rss_odd_titles", ["nzbindex.nl/", "nzbindex.com/", "nzbclub.com/"])
@@ -436,8 +438,7 @@ local_ranges = OptionList("misc", "local_ranges", protect=True)
max_url_retries = OptionNumber("misc", "max_url_retries", 10, minval=1)
downloader_sleep_time = OptionNumber("misc", "downloader_sleep_time", 10, minval=0)
receive_threads = OptionNumber("misc", "receive_threads", 2, minval=1)
num_simd_decoders = OptionNumber("misc", "num_simd_decoders", 2, minval=1)
switchinterval = OptionNumber("misc", "switchinterval", 0.005)
switchinterval = OptionNumber("misc", "switchinterval", 0.005, minval=0.001)
ssdp_broadcast_interval = OptionNumber("misc", "ssdp_broadcast_interval", 15, minval=1, maxval=600)
ext_rename_ignore = OptionList("misc", "ext_rename_ignore", validation=lower_case_ext)

View File

@@ -41,6 +41,7 @@ from sabnzbd.constants import (
CONFIG_BACKUP_FILES,
CONFIG_BACKUP_HTTPS,
DEF_INI_FILE,
DEF_SORTER_RENAME_SIZE,
)
from sabnzbd.decorators import synchronized
from sabnzbd.filesystem import clip_path, real_path, create_real_path, renamer, remove_file, is_writable
@@ -62,19 +63,29 @@ RE_PARAMFINDER = re.compile(r"""(?:'.*?')|(?:".*?")|(?:[^'",\s][^,]*)""")
class Option:
"""Basic option class, basic fields"""
def __init__(self, section: str, keyword: str, default_val: Any = None, add: bool = True, protect: bool = False):
def __init__(
self,
section: str,
keyword: str,
default_val: Any = None,
add: bool = True,
public: bool = True,
protect: bool = False,
):
"""Basic option
`section` : single section for this option
`keyword` : keyword in the section
`default_val` : value returned when no value has been set
`callback` : procedure to call when value is successfully changed
`protect` : Do not allow setting via the API (specifically set_dict)
`public` : if this value should be shown in API calls
`protect` : do not allow setting via the API (specifically set_dict)
"""
self.__section = section
self.__keyword: str = keyword
self.__default_val: Any = default_val
self.__value: Any = None
self.__callback: Optional[Callable] = None
self.__public: bool = public
self.__protect = protect
# Add myself to the config dictionary
@@ -91,8 +102,11 @@ class Option:
def get_string(self) -> str:
return str(self.get())
def get_dict(self, safe: bool = False) -> Dict[str, Any]:
"""Return value a dictionary"""
def get_dict(self, for_public_api: bool = False) -> Dict[str, Any]:
"""Return value as a dictionary.
Will not show non-public options if needed for the API"""
if not self.__public and for_public_api:
return {}
return {self.__keyword: self.get()}
def set_dict(self, values: Dict[str, Any]):
@@ -137,18 +151,19 @@ class OptionNumber(Option):
self,
section: str,
keyword: str,
default_val: Union[int, float] = 0,
minval: Optional[int] = None,
maxval: Optional[int] = None,
default_val: float = 0,
minval: Optional[float] = None,
maxval: Optional[float] = None,
validation: Optional[Callable] = None,
add: bool = True,
public: bool = True,
protect: bool = False,
):
self.__minval: Optional[int] = minval
self.__maxval: Optional[int] = maxval
self.__minval: Optional[float] = minval
self.__maxval: Optional[float] = maxval
self.__validation: Optional[Callable] = validation
self.__int: bool = isinstance(default_val, int)
super().__init__(section, keyword, default_val, add=add, protect=protect)
super().__init__(section, keyword, default_val, add=add, public=public, protect=protect)
def set(self, value: Any):
"""set new value, limited by range"""
@@ -178,8 +193,16 @@ class OptionNumber(Option):
class OptionBool(Option):
"""Boolean option class, always returns 0 or 1."""
def __init__(self, section: str, keyword: str, default_val: bool = False, add: bool = True, protect: bool = False):
super().__init__(section, keyword, int(default_val), add=add, protect=protect)
def __init__(
self,
section: str,
keyword: str,
default_val: bool = False,
add: bool = True,
public: bool = True,
protect: bool = False,
):
super().__init__(section, keyword, int(default_val), add=add, public=public, protect=protect)
def set(self, value: Any):
# Store the value as integer, easier to parse when reading the config.
@@ -203,13 +226,15 @@ class OptionDir(Option):
validation: Optional[Callable] = None,
writable: bool = True,
add: bool = True,
public: bool = True,
protect: bool = False,
):
self.__validation: Optional[Callable] = validation
self.__root: str = "" # Base directory for relative paths
self.__apply_permissions: bool = apply_permissions
self.__create: bool = create
self.__writable: bool = writable
super().__init__(section, keyword, default_val, add=add)
super().__init__(section, keyword, default_val, add=add, public=public, protect=protect)
def get(self) -> str:
"""Return value, corrected for platform"""
@@ -286,12 +311,13 @@ class OptionList(Option):
default_val: Union[str, List, None] = None,
validation: Optional[Callable] = None,
add: bool = True,
public: bool = True,
protect: bool = False,
):
self.__validation: Optional[Callable] = validation
if default_val is None:
default_val = []
super().__init__(section, keyword, default_val, add=add, protect=protect)
super().__init__(section, keyword, default_val, add=add, public=public, protect=protect)
def set(self, value: Union[str, List]) -> Optional[str]:
"""Set the list given a comma-separated string or a list"""
@@ -332,11 +358,12 @@ class OptionStr(Option):
validation: Optional[Callable] = None,
add: bool = True,
strip: bool = True,
public: bool = True,
protect: bool = False,
):
self.__validation: Optional[Callable] = validation
self.__strip: bool = strip
super().__init__(section, keyword, default_val, add=add, protect=protect)
super().__init__(section, keyword, default_val, add=add, public=public, protect=protect)
def get_float(self) -> float:
"""Return value converted to a float, allowing KMGT notation"""
@@ -380,9 +407,9 @@ class OptionPassword(Option):
return "*" * 10
return ""
def get_dict(self, safe: bool = False) -> Dict[str, str]:
def get_dict(self, for_public_api: bool = False) -> Dict[str, str]:
"""Return value a dictionary"""
if safe:
if for_public_api:
return {self.keyword: self.get_stars()}
else:
return {self.keyword: self.get()}
@@ -467,7 +494,7 @@ class ConfigServer:
if not self.displayname():
self.displayname.set(self.__name)
def get_dict(self, safe: bool = False) -> Dict[str, Any]:
def get_dict(self, for_public_api: bool = False) -> Dict[str, Any]:
"""Return a dictionary with all attributes"""
output_dict = {}
output_dict["name"] = self.__name
@@ -476,7 +503,7 @@ class ConfigServer:
output_dict["port"] = self.port()
output_dict["timeout"] = self.timeout()
output_dict["username"] = self.username()
if safe:
if for_public_api:
output_dict["password"] = self.password.get_stars()
else:
output_dict["password"] = self.password()
@@ -531,7 +558,7 @@ class ConfigCat:
except KeyError:
continue
def get_dict(self, safe: bool = False) -> Dict[str, Any]:
def get_dict(self, for_public_api: bool = False) -> Dict[str, Any]:
"""Return a dictionary with all attributes"""
output_dict = {}
output_dict["name"] = self.__name
@@ -548,6 +575,57 @@ class ConfigCat:
delete_from_database("categories", self.__name)
class ConfigSorter:
"""Class defining a single Sorter"""
def __init__(self, name, values):
self.__name = clean_section_name(name)
name = "sorters," + self.__name
self.order = OptionNumber(name, "order", len(get_sorters()), 0, 100, add=False)
self.min_size = OptionStr(name, "min_size", DEF_SORTER_RENAME_SIZE, add=False)
self.multipart_label = OptionStr(name, "multipart_label", add=False)
self.sort_string = OptionStr(name, "sort_string", add=False)
self.sort_cats = OptionList(name, "sort_cats", add=False)
self.sort_type = OptionList(name, "sort_type", add=False)
self.is_active = OptionBool(name, "is_active", add=False)
self.set_dict(values)
add_to_database("sorters", self.__name, self)
def set_dict(self, values: Dict[str, Any]):
"""Set one or more fields, passed as dictionary"""
for kw in ("order", "min_size", "multipart_label", "sort_string", "sort_cats", "sort_type", "is_active"):
try:
value = values[kw]
getattr(self, kw).set(value)
except KeyError:
continue
def get_dict(self, for_public_api: bool = False) -> Dict[str, Any]:
"""Return a dictionary with all attributes"""
output_dict = {}
output_dict["name"] = self.__name
output_dict["order"] = self.order()
output_dict["min_size"] = self.min_size()
output_dict["multipart_label"] = self.multipart_label()
output_dict["sort_string"] = self.sort_string()
output_dict["sort_cats"] = self.sort_cats()
output_dict["sort_type"] = [int(num) for num in self.sort_type()]
output_dict["is_active"] = self.is_active()
return output_dict
def delete(self):
"""Remove from database"""
delete_from_database("sorters", self.__name)
def rename(self, new_name: str):
"""Update the name and the saved entries"""
delete_from_database("sorters", self.__name)
self.__name = new_name
add_to_database("sorters", self.__name, self)
class OptionFilters(Option):
"""Filter list class"""
@@ -585,7 +663,7 @@ class OptionFilters(Option):
return
self.set(lst)
def get_dict(self, safe: bool = False) -> Dict[str, str]:
def get_dict(self, for_public_api: bool = False) -> Dict[str, str]:
"""Return filter list as a dictionary with keys 'filter[0-9]+'"""
output_dict = {}
for n, rss_filter in enumerate(self.get()):
@@ -637,7 +715,7 @@ class ConfigRSS:
continue
self.filters.set_dict(values)
def get_dict(self, safe: bool = False) -> Dict[str, Any]:
def get_dict(self, for_public_api: bool = False) -> Dict[str, Any]:
"""Return a dictionary with all attributes"""
output_dict = {}
output_dict["name"] = self.__name
@@ -677,6 +755,7 @@ AllConfigTypes = Union[
OptionList,
OptionDir,
ConfigCat,
ConfigSorter,
ConfigRSS,
ConfigServer,
]
@@ -719,8 +798,11 @@ def get_dconfig(section, keyword, nested=False):
sect = CFG_DATABASE[section]
except KeyError:
return False, {}
if section == "categories":
data[section] = get_ordered_categories()
elif section == "sorters":
data[section] = get_ordered_sorters()
elif section in ("servers", "rss"):
data[section] = []
for keyword in sect.keys():
@@ -737,9 +819,9 @@ def get_dconfig(section, keyword, nested=False):
item = CFG_DATABASE[section][keyword]
except KeyError:
return False, {}
data = item.get_dict(safe=True)
data = item.get_dict(for_public_api=True)
if not nested:
if section in ("servers", "categories", "rss"):
if section in ("sorters", "servers", "categories", "rss"):
data = {section: [data]}
else:
data = {section: data}
@@ -839,7 +921,7 @@ def _read_config(path, try_backup=False):
# Use CFG data to set values for all static options
for section in CFG_DATABASE:
if section not in ("servers", "categories", "rss"):
if section not in ("sorters", "servers", "categories", "rss"):
for option in CFG_DATABASE[section]:
config_option = CFG_DATABASE[section][option]
try:
@@ -857,6 +939,9 @@ def _read_config(path, try_backup=False):
if "servers" in CFG_OBJ:
for server in CFG_OBJ["servers"]:
ConfigServer(server, CFG_OBJ["servers"][server])
if "sorters" in CFG_OBJ:
for sorter in CFG_OBJ["sorters"]:
ConfigSorter(sorter, CFG_OBJ["sorters"][sorter])
CFG_MODIFIED = False
return True, ""
@@ -875,7 +960,7 @@ def save_config(force=False):
return False
for section in CFG_DATABASE:
if section in ("servers", "categories", "rss"):
if section in ("sorters", "servers", "categories", "rss"):
if section not in CFG_OBJ:
CFG_OBJ[section] = {}
@@ -1025,6 +1110,24 @@ def get_servers() -> Dict[str, ConfigServer]:
return {}
def get_sorters() -> Dict[str, ConfigSorter]:
global CFG_DATABASE
try:
return CFG_DATABASE["sorters"]
except KeyError:
return {}
def get_ordered_sorters() -> List[Dict]:
"""Return sorters as an ordered list"""
database_sorters = get_sorters()
sorters = [database_sorters[sorter].get_dict() for sorter in database_sorters.keys()]
sorters.sort(key=lambda sorter: sorter["order"])
return sorters
def get_categories() -> Dict[str, ConfigCat]:
"""Return link to categories section.
This section will always contain special category '*'

View File

@@ -49,7 +49,7 @@ RENAMES_FILE = "__renames__"
ATTRIB_FILE = "SABnzbd_attrib"
REPAIR_REQUEST = "repair-all.sab"
SABCTOOLS_VERSION_REQUIRED = "6.1.0"
SABCTOOLS_VERSION_REQUIRED = "7.0.1"
DB_HISTORY_VERSION = 1
DB_HISTORY_NAME = "history%s.db" % DB_HISTORY_VERSION
@@ -78,6 +78,7 @@ DEF_TIMEOUT = 60
DEF_SCANRATE = 5
DEF_HTTPS_CERT_FILE = "server.cert"
DEF_HTTPS_KEY_FILE = "server.key"
DEF_SORTER_RENAME_SIZE = "50M"
MAX_WARNINGS = 20
MAX_BAD_ARTICLES = 5
@@ -93,10 +94,8 @@ CONFIG_BACKUP_HTTPS = { # "basename": "associated setting"
}
# Constants affecting download performance
MIN_DECODE_QUEUE = 10
LIMIT_DECODE_QUEUE = 100
MAX_ASSEMBLER_QUEUE = 10
SOFT_QUEUE_LIMIT = 0.6
MAX_ASSEMBLER_QUEUE = 12
SOFT_QUEUE_LIMIT = 0.5
# Percentage of cache to use before adding file to assembler
ASSEMBLER_WRITE_THRESHOLD = 5
NNTP_BUFFER_SIZE = int(800 * KIBI)
@@ -141,6 +140,8 @@ IGNORED_MOVIE_FOLDERS = ("video_ts", "audio_ts", "bdmv")
EXCLUDED_GUESSIT_PROPERTIES = [
"part",
]
GUESSIT_PART_INDICATORS = ("cd", "part")
GUESSIT_SORT_TYPES = {0: "all", 1: "tv", 2: "date", 3: "movie", 4: "unknown"}
class Status:

View File

@@ -474,8 +474,8 @@ def build_history_info(nzo, workdir_complete="", postproc_time=0, script_output=
# Analyze series info only when job is finished
series = ""
if series_info:
seriesname, season, episode = sabnzbd.newsunpack.analyse_show(nzo.final_name)[:3]
if series_info and (show_analysis := sabnzbd.newsunpack.analyse_show(nzo.final_name))["job_type"] == "tv":
seriesname, season, episode = (show_analysis[key] for key in ("title", "season", "episode"))
if seriesname and season and episode:
series = "%s/%s/%s" % (seriesname.lower(), season, episode)

View File

@@ -21,15 +21,11 @@ sabnzbd.decoder - article decoder
import logging
import hashlib
import queue
import binascii
from io import BytesIO
from threading import Thread
from typing import Tuple, List, Optional
from zlib import crc32
import sabnzbd
import sabnzbd.cfg as cfg
from sabnzbd.constants import SABCTOOLS_VERSION_REQUIRED
from sabnzbd.encoding import ubtou
from sabnzbd.nzbstuff import Article
@@ -67,185 +63,116 @@ class BadUu(Exception):
pass
class Decoder:
"""Implement thread-like coordinator for the decoders"""
def decode(article: Article, raw_data: bytearray):
decoded_data = None
nzo = article.nzf.nzo
art_id = article.article
def __init__(self):
# Initialize queue and servers
self.decoder_queue = queue.Queue()
# Keeping track
article_success = False
# Initialize decoders
decoders = cfg.num_simd_decoders()
logging.debug("Initializing %d decoder(s)", decoders)
self.decoder_workers = []
for _ in range(decoders):
self.decoder_workers.append(DecoderWorker(self.decoder_queue))
try:
if nzo.precheck:
raise BadYenc
def start(self):
for decoder_worker in self.decoder_workers:
decoder_worker.start()
if sabnzbd.LOG_ALL:
logging.debug("Decoding %s", art_id)
def is_alive(self) -> bool:
# Check all workers
for decoder_worker in self.decoder_workers:
if not decoder_worker.is_alive():
return False
return True
if article.nzf.type == "uu":
decoded_data = decode_uu(article, raw_data)
else:
decoded_data = decode_yenc(article, raw_data)
def stop(self):
# Put multiple to stop all decoders
for _ in self.decoder_workers:
self.decoder_queue.put((None, None, None))
article_success = True
def join(self):
# Wait for all decoders to finish
for decoder_worker in self.decoder_workers:
try:
decoder_worker.join()
except:
pass
except MemoryError:
logging.warning(T("Decoder failure: Out of memory"))
logging.info("Cache: %d, %d, %d", *sabnzbd.ArticleCache.cache_info())
logging.info("Traceback: ", exc_info=True)
sabnzbd.Downloader.pause()
def process(self, article: Article, raw_data: bytearray, raw_data_size: int):
sabnzbd.ArticleCache.reserve_space(raw_data_size)
self.decoder_queue.put((article, raw_data, raw_data_size))
# This article should be fetched again
sabnzbd.NzbQueue.reset_try_lists(article)
return
def queue_level(self) -> float:
# Return level of decoder queue. 0 = empty, >=1 = full.
return self.decoder_queue.qsize() / sabnzbd.ArticleCache.decoder_cache_article_limit
except BadData as error:
# Continue to the next one if we found new server
if search_new_server(article):
return
# Store data, maybe par2 can still fix it
decoded_data = error.data
class DecoderWorker(Thread):
"""The actual workhorse that handles decoding!"""
except BadUu:
logging.info("Badly formed uu article in %s", art_id)
def __init__(self, decoder_queue):
super().__init__()
logging.debug("Initializing decoder %s", self.name)
self.decoder_queue: queue.Queue[Tuple[Optional[Article], Optional[bytearray], Optional[int]]] = decoder_queue
# Try the next server
if search_new_server(article):
return
def run(self):
while 1:
# Set Article and NzbObject objects to None so references from this
# thread do not keep the parent objects alive (see #1628)
decoded_data = raw_data = article = nzo = None
article, raw_data, raw_data_size = self.decoder_queue.get()
if not article:
logging.debug("Shutting down decoder %s", self.name)
break
nzo = article.nzf.nzo
art_id = article.article
# Free space in the decoder-queue
sabnzbd.ArticleCache.free_reserved_space(raw_data_size)
# Keeping track
article_success = False
try:
if nzo.precheck:
raise BadYenc
if sabnzbd.LOG_ALL:
logging.debug("Decoding %s", art_id)
if article.nzf.type == "uu":
except (BadYenc, ValueError):
# Handles precheck and badly formed articles
if nzo.precheck and raw_data and raw_data.startswith(b"223 "):
# STAT was used, so we only get a status code
article_success = True
else:
# Try uu-decoding
if (not nzo.precheck) and article.nzf.type != "yenc":
try:
decoded_data = decode_uu(article, raw_data)
else:
decoded_data = decode_yenc(article, raw_data, raw_data_size)
article_success = True
except MemoryError:
logging.warning(T("Decoder failure: Out of memory"))
logging.info("Decoder-Queue: %d", self.decoder_queue.qsize())
logging.info("Cache: %d, %d, %d", *sabnzbd.ArticleCache.cache_info())
logging.info("Traceback: ", exc_info=True)
sabnzbd.Downloader.pause()
# This article should be fetched again
sabnzbd.NzbQueue.reset_try_lists(article)
continue
except BadData as error:
# Continue to the next one if we found new server
if search_new_server(article):
continue
# Store data, maybe par2 can still fix it
decoded_data = error.data
except BadUu:
logging.info("Badly formed uu article in %s", art_id)
# Try the next server
if search_new_server(article):
continue
except (BadYenc, ValueError):
# Handles precheck and badly formed articles
if nzo.precheck and raw_data and raw_data.startswith(b"223 "):
# STAT was used, so we only get a status code
logging.debug("Found uu-encoded article %s in job %s", art_id, nzo.final_name)
article_success = True
else:
# Try uu-decoding
if (not nzo.precheck) and article.nzf.type != "yenc":
try:
decoded_data = decode_uu(article, raw_data)
logging.debug("Found uu-encoded article %s in job %s", art_id, nzo.final_name)
article_success = True
except Exception:
pass
# Only bother with further checks if uu-decoding didn't work out
if not article_success:
# Convert the first 2000 bytes of raw socket data to article lines,
# and examine the headers (for precheck) or body (for download).
for line in raw_data[:2000].split(b"\r\n"):
lline = line.lower()
if lline.startswith(b"message-id:"):
article_success = True
# Look for DMCA clues (while skipping "X-" headers)
if not lline.startswith(b"x-") and match_str(
lline, (b"dmca", b"removed", b"cancel", b"blocked")
):
article_success = False
logging.info("Article removed from server (%s)", art_id)
break
except Exception:
pass
# Only bother with further checks if uu-decoding didn't work out
if not article_success:
# Convert the first 2000 bytes of raw socket data to article lines,
# and examine the headers (for precheck) or body (for download).
for line in raw_data[:2000].split(b"\r\n"):
lline = line.lower()
if lline.startswith(b"message-id:"):
article_success = True
# Look for DMCA clues (while skipping "X-" headers)
if not lline.startswith(b"x-") and match_str(lline, (b"dmca", b"removed", b"cancel", b"blocked")):
article_success = False
logging.info("Article removed from server (%s)", art_id)
break
# Pre-check, proper article found so just register
if nzo.precheck and article_success and sabnzbd.LOG_ALL:
logging.debug("Server %s has article %s", article.fetcher, art_id)
elif not article_success:
# If not pre-check, this must be a bad article
if not nzo.precheck:
logging.info("Badly formed yEnc article %s", art_id)
# Pre-check, proper article found so just register
if nzo.precheck and article_success and sabnzbd.LOG_ALL:
logging.debug("Server %s has article %s", article.fetcher, art_id)
elif not article_success:
# If not pre-check, this must be a bad article
if not nzo.precheck:
logging.info("Badly formed yEnc article %s", art_id)
# Continue to the next one if we found new server
if search_new_server(article):
continue
# Continue to the next one if we found new server
if search_new_server(article):
return
except:
logging.warning(T("Unknown Error while decoding %s"), art_id)
logging.info("Traceback: ", exc_info=True)
except:
logging.warning(T("Unknown Error while decoding %s"), art_id)
logging.info("Traceback: ", exc_info=True)
# Continue to the next one if we found new server
if search_new_server(article):
continue
# Continue to the next one if we found new server
if search_new_server(article):
return
if decoded_data:
# If the data needs to be written to disk due to full cache, this will be slow
# Causing the decoder-queue to fill up and delay the downloader
sabnzbd.ArticleCache.save_article(article, decoded_data)
article.decoded = True
elif not nzo.precheck:
# Nothing to save
article.on_disk = True
if decoded_data:
# If the data needs to be written to disk due to full cache, this will be slow
# Causing the decoder-queue to fill up and delay the downloader
sabnzbd.ArticleCache.save_article(article, decoded_data)
article.decoded = True
elif not nzo.precheck:
# Nothing to save
article.on_disk = True
sabnzbd.NzbQueue.register_article(article, article_success)
sabnzbd.NzbQueue.register_article(article, article_success)
def decode_yenc(article: Article, data: bytearray, raw_data_size: int) -> bytearray:
def decode_yenc(article: Article, data: bytearray) -> bytearray:
# Let SABCTools do all the heavy lifting
yenc_filename, crc_correct = sabctools.yenc_decode(data)
yenc_filename, article.data_begin, article.data_size, crc_correct = sabctools.yenc_decode(data)
nzf = article.nzf
# Assume it is yenc

0
sabnzbd/deobfuscate_filenames.py Normal file → Executable file
View File

View File

@@ -28,8 +28,9 @@ import socket
import random
import sys
import ssl
from typing import List, Dict, Optional, Union
from concurrent.futures import ThreadPoolExecutor
from typing import List, Dict, Optional, Union, Set
import concurrent
from concurrent.futures import ThreadPoolExecutor, Future
import sabnzbd
from sabnzbd.decorators import synchronized, NzbQueueLocker, DOWNLOADER_CV
@@ -61,6 +62,7 @@ _ARTICLE_PREFETCH = 20
_DEFAULT_CHUNK_SIZE = 32768
TIMER_LOCK = RLock()
DOWNLOADER_LOCK = RLock()
class Server:
@@ -212,21 +214,14 @@ class Server:
nw.hard_reset(send_quit=True)
self.idle_threads = []
def request_info(self):
"""Launch async request to resolve server address.
getaddrinfo() can be very slow. In some situations this can lead
to delayed starts and timeouts on connections.
Because of this, the results will be cached in the server object."""
if not self.request:
self.request = True
Thread(target=self._request_info_internal).start()
@synchronized(DOWNLOADER_LOCK)
def get_article(self):
"""Get article from pre-fetched and pre-fetch new ones if necessary.
Articles that are too old for this server are immediately marked as tried"""
if self.article_queue:
return self.article_queue.pop(0)
elif self.next_article_search < time.time():
if self.next_article_search < time.time():
# Pre-fetch new articles
self.article_queue = sabnzbd.NzbQueue.get_articles(self, sabnzbd.Downloader.servers, _ARTICLE_PREFETCH)
if self.article_queue:
@@ -249,6 +244,15 @@ class Server:
sabnzbd.NzbQueue.reset_try_lists(article, remove_fetcher_from_trylist=False)
self.article_queue = []
def request_info(self):
"""Launch async request to resolve server address.
getaddrinfo() can be very slow. In some situations this can lead
to delayed starts and timeouts on connections.
Because of this, the results will be cached in the server object."""
if not self.request:
self.request = True
Thread(target=self._request_info_internal).start()
def _request_info_internal(self):
"""Async attempt to run getaddrinfo() for specified server"""
logging.debug("Retrieving server address information for %s", self.host)
@@ -284,6 +288,9 @@ class Downloader(Thread):
"read_fds",
"servers",
"timers",
"last_max_chunk_size",
"max_chunk_size",
"process_tasks",
)
def __init__(self, paused=False):
@@ -306,10 +313,16 @@ class Downloader(Thread):
self.sleep_time_set()
cfg.downloader_sleep_time.callback(self.sleep_time_set)
# Sleep check variables
self.last_max_chunk_size: int = 0
self.max_chunk_size: int = _DEFAULT_CHUNK_SIZE
self.recv_threads: int = cfg.receive_threads()
self.recv_pool: Optional[ThreadPoolExecutor] = ThreadPoolExecutor(self.recv_threads)
logging.debug("Receive threads: %s", self.recv_threads)
self.process_tasks: Set[Future[NewsWrapper, int]] = set()
self.paused_for_postproc: bool = False
self.shutdown: bool = False
@@ -534,10 +547,8 @@ class Downloader(Thread):
# Make sure server address resolution is refreshed
server.info = None
def decode(self, article, raw_data: Optional[bytearray] = None, raw_data_size: Optional[int] = None):
"""Decode article and check the status of
the decoder and the assembler
"""
def decode(self, article, raw_data: Optional[bytearray] = None):
"""Decode article"""
# Article was requested and fetched, update article stats for the server
sabnzbd.BPSMeter.register_server_article_tried(article.fetcher.id)
@@ -548,38 +559,8 @@ class Downloader(Thread):
article.nzf.nzo.increase_bad_articles_counter("missing_articles")
return
# Send to decoder-queue
sabnzbd.Decoder.process(article, raw_data, raw_data_size)
# See if we need to delay because the queues are full
logged_counter = 0
decoder_level = sabnzbd.Decoder.queue_level()
assembler_level = sabnzbd.Assembler.queue_level()
# Sleep for an increasing amount of time, depending on queue sizes.
if decoder_level > SOFT_QUEUE_LIMIT or assembler_level > SOFT_QUEUE_LIMIT:
time.sleep((decoder_level + assembler_level - SOFT_QUEUE_LIMIT) / 2)
sabnzbd.BPSMeter.delayed_decoder += int(decoder_level > SOFT_QUEUE_LIMIT)
sabnzbd.BPSMeter.delayed_assembler += int(assembler_level > SOFT_QUEUE_LIMIT)
while not self.shutdown and (sabnzbd.Decoder.queue_level() >= 1 or sabnzbd.Assembler.queue_level() >= 1):
# Only log/update once every second, to not waste any CPU-cycles
if not logged_counter % 10:
# Make sure the BPS-meter is updated
sabnzbd.BPSMeter.update()
# Update who is delaying us
logging.debug(
"Delayed - %d seconds - Decoder queue: %d - Assembler queue: %d",
logged_counter / 10,
sabnzbd.Decoder.decoder_queue.qsize(),
sabnzbd.Assembler.queue.qsize(),
)
# Wait and update the queue sizes
time.sleep(0.1)
logged_counter += 1
# Decode and send to article cache
sabnzbd.decoder.decode(article, raw_data)
def run(self):
# First check IPv6 connectivity
@@ -601,9 +582,6 @@ class Downloader(Thread):
BPSMeter.update()
next_bpsmeter_update = 0
# Sleep check variables
last_max_chunk_size: int = 0
max_chunk_size: int = _DEFAULT_CHUNK_SIZE
# Debugging code for v4 test release
sleep_count_start: float = time.time()
sleep_count: int = 0
@@ -718,10 +696,10 @@ class Downloader(Thread):
# If less data than possible was received then it should be ok to sleep a bit
if self.sleep_time:
if last_max_chunk_size > max_chunk_size:
logging.debug("New max_chunk_size %d -> %d", max_chunk_size, last_max_chunk_size)
max_chunk_size = last_max_chunk_size
elif last_max_chunk_size < max_chunk_size / 3:
if self.last_max_chunk_size > self.max_chunk_size:
logging.debug("New max_chunk_size %d -> %d", self.max_chunk_size, self.last_max_chunk_size)
self.max_chunk_size = self.last_max_chunk_size
elif self.last_max_chunk_size < self.max_chunk_size / 3:
time_before = time.time()
time.sleep(self.sleep_time)
now = time.time()
@@ -743,7 +721,7 @@ class Downloader(Thread):
sleep_count = 0
time_slept = 0
last_max_chunk_size = 0
self.last_max_chunk_size = 0
# Use select to find sockets ready for reading/writing
readkeys = self.read_fds.keys()
@@ -753,7 +731,7 @@ class Downloader(Thread):
read = []
BPSMeter.reset()
time.sleep(1.0)
max_chunk_size = _DEFAULT_CHUNK_SIZE
self.max_chunk_size = _DEFAULT_CHUNK_SIZE
with DOWNLOADER_CV:
while (
(sabnzbd.NzbQueue.is_empty() or self.no_active_jobs() or self.paused_for_postproc)
@@ -771,49 +749,71 @@ class Downloader(Thread):
continue
if self.recv_threads > 1:
for nw, bytes_received, done in self.recv_pool.map(self.__recv, read):
if bytes_received > last_max_chunk_size:
last_max_chunk_size = bytes_received
self.__handle_recv_result(nw, bytes_received, done)
if self.bandwidth_limit:
self.__check_speed()
# Submit a process_nw task to the pool for every NewWrapper which is readable
for selected in read:
self.process_tasks.add(self.recv_pool.submit(self.process_nw, self.read_fds[selected]))
# Wait for all the tasks to complete
concurrent.futures.wait(self.process_tasks)
# Clear task list
self.process_tasks.clear()
else:
for selected in read:
nw, bytes_received, done = self.__recv(selected)
if bytes_received > last_max_chunk_size:
last_max_chunk_size = bytes_received
self.__handle_recv_result(nw, bytes_received, done)
if self.bandwidth_limit and bytes_received:
self.__check_speed()
self.process_nw(self.read_fds[selected])
def __recv(self, selected):
nw = None
# Check the Assembler queue to see if we need to delay, depending on queue size
if (assembler_level := sabnzbd.Assembler.queue_level()) > SOFT_QUEUE_LIMIT:
time.sleep(min((assembler_level - SOFT_QUEUE_LIMIT) / 4, 0.15))
sabnzbd.BPSMeter.delayed_assembler += 1
logged_counter = 0
while not self.shutdown and sabnzbd.Assembler.queue_level() >= 1:
# Only log/update once every second, to not waste any CPU-cycles
if not logged_counter % 10:
# Make sure the BPS-meter is updated
sabnzbd.BPSMeter.update()
# Update who is delaying us
logging.debug(
"Delayed - %d seconds - Assembler queue: %d",
logged_counter / 10,
sabnzbd.Assembler.queue.qsize(),
)
# Wait and update the queue sizes
time.sleep(0.1)
logged_counter += 1
def process_nw(self, nw: NewsWrapper):
"""Receive data from NewsWrapper and handle response"""
try:
nw = self.read_fds[selected]
bytes_received, done = nw.recv_chunk()
return nw, bytes_received, done
except ssl.SSLWantReadError:
return nw, 0, False
return
except:
return nw, 0, True
def __check_speed(self):
BPSMeter = sabnzbd.BPSMeter
if BPSMeter.bps + BPSMeter.sum_cached_amount > self.bandwidth_limit:
BPSMeter.update()
while BPSMeter.bps > self.bandwidth_limit:
time.sleep(0.01)
BPSMeter.update()
def __handle_recv_result(self, nw: NewsWrapper, bytes_received: int = 0, done: bool = False):
if not bytes_received:
if done:
self.__reset_nw(nw, "server closed connection", wait=False)
self.__reset_nw(nw, "server closed connection", wait=False)
return
article = nw.article
server = nw.server
sabnzbd.BPSMeter.update(server.id, bytes_received)
with DOWNLOADER_LOCK:
sabnzbd.BPSMeter.update(server.id, bytes_received)
if bytes_received > self.last_max_chunk_size:
self.last_max_chunk_size = bytes_received
# Update statistics
if done:
article.nzf.nzo.update_download_stats(sabnzbd.BPSMeter.bps, server.id, nw.data_position)
# Check speedlimit
if (
self.bandwidth_limit
and sabnzbd.BPSMeter.bps + sabnzbd.BPSMeter.sum_cached_amount > self.bandwidth_limit
):
sabnzbd.BPSMeter.update()
while sabnzbd.BPSMeter.bps > self.bandwidth_limit:
time.sleep(0.01)
sabnzbd.BPSMeter.update()
if nw.status_code != 222 and not done:
if not nw.connected or nw.status_code == 480:
@@ -861,25 +861,28 @@ class Downloader(Thread):
server.bad_cons = 0
server.errormsg = server.warning = ""
# Update statistics and decode
article.nzf.nzo.update_download_stats(sabnzbd.BPSMeter.bps, server.id, nw.data_position)
self.decode(article, nw.get_data_buffer(), nw.data_position)
# Decode
self.decode(article, nw.get_data_buffer())
if sabnzbd.LOG_ALL:
logging.debug("Thread %s@%s: %s done", nw.thrdnum, server.host, article.article)
# Reset connection for new activity
nw.soft_reset()
# Request a new article immediately if possible
if nw.connected and server.active and not (self.paused or self.shutdown or self.paused_for_postproc):
nw.article = server.get_article()
if nw.article:
self.__request_article(nw)
return
server.busy_threads.remove(nw)
server.idle_threads.append(nw)
with DOWNLOADER_LOCK:
server.busy_threads.remove(nw)
server.idle_threads.append(nw)
self.remove_socket(nw)
@synchronized(DOWNLOADER_LOCK)
def __finish_connect_nw(self, nw: NewsWrapper) -> bool:
server = nw.server
try:
@@ -961,6 +964,7 @@ class Downloader(Thread):
self.__reset_nw(nw, retry_article=False)
return True
@synchronized(DOWNLOADER_LOCK)
def __reset_nw(
self,
nw: NewsWrapper,
@@ -1026,7 +1030,7 @@ class Downloader(Thread):
logging.debug("Thread %s@%s: BODY %s", nw.thrdnum, nw.server.host, nw.article.article)
nw.body()
# Mark as ready to be read
self.read_fds[nw.nntp.fileno] = nw
self.add_socket(nw.nntp.fileno, nw)
except socket.error as err:
logging.info("Looks like server closed connection: %s", err)
self.__reset_nw(nw, "server broke off connection", warn=True, send_quit=False)

View File

@@ -734,7 +734,7 @@ def create_all_dirs(path: str, apply_permissions: bool = False) -> Union[str, bo
@synchronized(DIR_LOCK)
def get_unique_dir(path: str, n: int = 0, create_dir: bool = True) -> str:
def get_unique_dir(path: str, n: int = 0, create_dir: bool = True) -> Union[str, bool]:
"""Determine a unique folder or filename"""
if not check_mount(path):
return path
@@ -773,7 +773,8 @@ def listdir_full(input_dir: str, recursive: bool = True) -> List[str]:
filelist = []
for root, dirs, files in os.walk(input_dir):
for file in files:
if not sabnzbd.misc.match_str(root, IGNORED_FILES_AND_FOLDERS):
# Ignore special folders and resources files created by macOS
if not sabnzbd.misc.match_str(root, IGNORED_FILES_AND_FOLDERS) and not file.startswith("._"):
filelist.append(os.path.join(root, file))
if not recursive:
break

View File

@@ -76,6 +76,8 @@ from sabnzbd.constants import (
CHEETAH_DIRECTIVES,
EXCLUDED_GUESSIT_PROPERTIES,
DEF_HTTPS_CERT_FILE,
DEF_SORTER_RENAME_SIZE,
GUESSIT_SORT_TYPES,
)
from sabnzbd.lang import list_languages
from sabnzbd.api import (
@@ -874,12 +876,11 @@ SPECIAL_BOOL_LIST = (
"api_logging",
"x_frame_options",
"allow_old_ssl_tls",
"enable_season_sorting",
)
SPECIAL_VALUE_LIST = (
"downloader_sleep_time",
"size_limit",
"movie_rename_limit",
"episode_rename_limit",
"nomedia_marker",
"max_url_retries",
"req_completion_rate",
@@ -887,7 +888,6 @@ SPECIAL_VALUE_LIST = (
"max_foldername_length",
"url_base",
"receive_threads",
"num_simd_decoders",
"switchinterval",
"direct_unpack_threads",
"ipv6_servers",
@@ -1081,7 +1081,7 @@ class ConfigServer:
% (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower()),
)
for svr in server_names:
new.append(servers[svr].get_dict(safe=True))
new.append(servers[svr].get_dict(for_public_api=True))
t, m, w, d, daily, articles_tried, articles_success = sabnzbd.BPSMeter.amounts(svr)
if t:
new[-1]["amounts"] = (
@@ -1825,20 +1825,6 @@ class ConfigCats:
##############################################################################
SORT_LIST = (
"enable_tv_sorting",
"tv_sort_string",
"tv_categories",
"enable_movie_sorting",
"movie_sort_string",
"movie_sort_extra",
"enable_date_sorting",
"date_sort_string",
"movie_categories",
"date_categories",
)
class ConfigSorting:
def __init__(self, root):
self.__root = root
@@ -1846,14 +1832,26 @@ class ConfigSorting:
@secured_expose(check_configlock=True)
def index(self, **kwargs):
conf = build_header(sabnzbd.WEB_DIR_CONFIG)
conf["complete_dir"] = cfg.complete_dir.get_clipped_path()
for kw in SORT_LIST:
conf[kw] = config.get_config("misc", kw)()
sorters = config.get_ordered_sorters()
# Add empty sorter entry, used as a template at the top of the page
empty = {
"is_active": "1",
"name": "",
"order": len(sorters), # Last in line
"min_size": DEF_SORTER_RENAME_SIZE,
"sort_string": "",
"sort_cats": "",
"sort_type": "0,",
"multipart_label": "",
}
sorters.insert(0, empty)
conf["slotinfo"] = sorters
conf["categories"] = list_cats(False)
conf["guessit_properties"] = tuple(
prop for prop in guessit_properties().keys() if prop not in EXCLUDED_GUESSIT_PROPERTIES
)
conf["sort_types"] = GUESSIT_SORT_TYPES
return template_filtered_response(
file=os.path.join(sabnzbd.WEB_DIR_CONFIG, "config_sorting.tmpl"),
@@ -1861,17 +1859,41 @@ class ConfigSorting:
)
@secured_expose(check_api_key=True, check_configlock=True)
def saveSorting(self, **kwargs):
for kw in SORT_LIST:
item = config.get_config("misc", kw)
value = kwargs.get(kw)
msg = item.set(value)
if msg:
return badParameterResponse(msg)
def delete(self, **kwargs):
kwargs["section"] = "sorters"
kwargs["keyword"] = kwargs.get("name")
del_from_section(kwargs)
raise Raiser(self.__root)
@secured_expose(check_api_key=True, check_configlock=True)
def save_sorter(self, **kwargs):
name = kwargs.get("name", "*")
newname = kwargs.get("newname", "")
newname = config.clean_section_name(newname)
if name == "*":
newname = name
if newname:
# Delete current one and replace with new one
if name:
config.delete("sorters", name)
config.ConfigSorter(newname, kwargs)
config.save_config()
raise Raiser(self.__root)
@secured_expose(check_api_key=True, check_configlock=True)
def toggle_sorter(self, **kwargs):
"""Toggle is_active flag of a sorter"""
try:
sorter = config.get_sorters()[kwargs.get("sorter")]
sorter.is_active.set(not sorter.is_active())
config.save_config()
except Exception:
pass
raise Raiser(self.__root)
def badParameterResponse(msg, ajax=None):
"""Return a html page with error message and a 'back' button"""

View File

@@ -40,7 +40,14 @@ from typing import Union, Tuple, Any, AnyStr, Optional, List, Dict
import sabnzbd
import sabnzbd.getipaddress
from sabnzbd.constants import DEFAULT_PRIORITY, MEBI, DEF_ARTICLE_CACHE_DEFAULT, DEF_ARTICLE_CACHE_MAX, REPAIR_REQUEST
from sabnzbd.constants import (
DEFAULT_PRIORITY,
MEBI,
DEF_ARTICLE_CACHE_DEFAULT,
DEF_ARTICLE_CACHE_MAX,
REPAIR_REQUEST,
GUESSIT_SORT_TYPES,
)
import sabnzbd.config as config
import sabnzbd.cfg as cfg
from sabnzbd.encoding import ubtou, platform_btou
@@ -240,6 +247,16 @@ def opts_to_pp(repair: bool, unpack: bool, delete: bool) -> int:
return 0
def sort_to_opts(sort_type: str) -> int:
"""Convert a guessed sort_type to its integer equivalent"""
for k, v in GUESSIT_SORT_TYPES.items():
if v == sort_type:
return k
else:
logging.debug("Invalid sort_type %s, pretending a match to 0 ('all')", sort_type)
return 0
_wildcard_to_regex = {
"\\": r"\\",
"^": r"\^",
@@ -1377,3 +1394,88 @@ def history_updated():
# Never go over the limit
if sabnzbd.LAST_HISTORY_UPDATE + 1 >= sys.maxsize:
sabnzbd.LAST_HISTORY_UPDATE = 1
def convert_sorter_settings():
"""Convert older tv/movie/date sorter settings to the new universal sorter
The old settings used:
-enable_tv_sorting = OptionBool("misc", "enable_tv_sorting", False)
-tv_sort_string = OptionStr("misc", "tv_sort_string")
-tv_categories = OptionList("misc", "tv_categories", ["tv"])
-enable_movie_sorting = OptionBool("misc", "enable_movie_sorting", False)
-movie_sort_string = OptionStr("misc", "movie_sort_string")
-movie_sort_extra = OptionStr("misc", "movie_sort_extra", "-cd%1", strip=False)
-movie_categories = OptionList("misc", "movie_categories", ["movies"])
-enable_date_sorting = OptionBool("misc", "enable_date_sorting", False)
-date_sort_string = OptionStr("misc", "date_sort_string")
-date_categories = OptionList("misc", "date_categories", ["tv"])
-movie_rename_limit = OptionStr("misc", "movie_rename_limit", "100M")
-episode_rename_limit = OptionStr("misc", "episode_rename_limit", "20M")
The new settings define a sorter as follows (cf. class config.ConfigSorter):
name: str {
name: str
order: int
min_size: Union[str|int] = "50M"
multipart_label: Optional[str] = ""
sort_string: str
sort_cats: List[str]
sort_type: List[int]
is_active: bool = 1
}
With the old settings, sorting was tried in a fixed order (series first, movies last);
that order is retained by the conversion code.
We only convert enabled sorters."""
# Keep track of order
order = 0
if cfg.enable_tv_sorting() and cfg.tv_sort_string() and cfg.tv_categories():
# Define a new sorter based on the old configuration
tv_sorter = {}
tv_sorter["order"] = order
tv_sorter["min_size"] = cfg.episode_rename_limit()
tv_sorter["multipart_label"] = "" # Previously only available for movie sorting
tv_sorter["sort_string"] = cfg.tv_sort_string()
tv_sorter["sort_cats"] = cfg.tv_categories()
tv_sorter["sort_type"] = [sort_to_opts("tv")]
tv_sorter["is_active"] = int(cfg.enable_tv_sorting())
# Configure the new sorter
logging.debug("Converted old series sorter config to '%s': %s", T("Series Sorting"), tv_sorter)
config.ConfigSorter(T("Series Sorting"), tv_sorter)
order += 1
if cfg.enable_date_sorting() and cfg.date_sort_string() and cfg.date_categories():
date_sorter = {}
date_sorter["order"] = order
date_sorter["min_size"] = cfg.episode_rename_limit()
date_sorter["multipart_label"] = "" # Previously only available for movie sorting
date_sorter["sort_string"] = cfg.date_sort_string()
date_sorter["sort_cats"] = cfg.date_categories()
date_sorter["sort_type"] = [sort_to_opts("date")]
date_sorter["is_active"] = int(cfg.enable_date_sorting())
# Configure the new sorter
logging.debug("Converted old date sorter config to '%s': %s", T("Date Sorting"), date_sorter)
config.ConfigSorter(T("Date Sorting"), date_sorter)
order += 1
if cfg.enable_movie_sorting() and cfg.movie_sort_string() and cfg.movie_categories():
movie_sorter = {}
movie_sorter["order"] = order
movie_sorter["min_size"] = cfg.movie_rename_limit()
movie_sorter["multipart_label"] = cfg.movie_sort_extra()
movie_sorter["sort_string"] = cfg.movie_sort_string()
movie_sorter["sort_cats"] = cfg.movie_categories()
movie_sorter["sort_type"] = [sort_to_opts("movie")]
movie_sorter["is_active"] = int(cfg.enable_movie_sorting())
# Configure the new sorter
logging.debug("Converted old movie sorter config to '%s': %s", T("Movie Sorting"), movie_sorter)
config.ConfigSorter(T("Movie Sorting"), movie_sorter)

View File

@@ -64,9 +64,9 @@ from sabnzbd.filesystem import (
is_size,
)
from sabnzbd.nzbstuff import NzbObject
from sabnzbd.sorting import SeriesSorter
import sabnzbd.cfg as cfg
from sabnzbd.constants import Status, JOB_ADMIN
from sabnzbd.sorting import Sorter
# Regex globals
RAR_V3_RE = re.compile(r"\.(?P<ext>part\d*)$", re.I)
@@ -2249,18 +2249,39 @@ def add_time_left(perc: float, start_time: Optional[float] = None, time_used: Op
return ""
def analyse_show(name: str) -> Tuple[str, str, str, str, bool]:
"""Do a quick SeasonSort check and return basic facts"""
job = SeriesSorter(None, name, None, None, force=True)
if job.matched:
job.get_values()
return (
job.info.get("title", ""),
job.info.get("season_num", ""),
job.info.get("episode_num", ""),
job.info.get("ep_name", ""),
job.is_proper(),
def analyse_show(name: str) -> Dict[str, str]:
"""Use the Sorter to collect some basic info on series"""
job = Sorter(
None,
name,
None,
None,
force=True,
sorter_config={
"name": "newsunpack__analyse_show",
"order": 0,
"min_size": -1,
"multipart_label": "",
"sort_string": "",
"sort_cats": [], # Categories and types are ignored when using the force
"sort_type": [],
"is_active": 1,
},
)
job.get_values()
return {
"title": job.info.get("title", ""),
"season": job.info.get("season_num", ""),
"episode": job.info.get("episode_num", ""),
"episode_name": job.info.get("ep_name", ""),
"is_proper": str(job.is_proper()),
"resolution": job.info.get("resolution", ""),
"decade": job.info.get("decade", ""),
"year": job.info.get("year", ""),
"month": job.info.get("month", ""),
"day": job.info.get("day", ""),
"job_type": job.type,
}
def pre_queue(nzo: NzbObject, pp, cat):
@@ -2288,7 +2309,7 @@ def pre_queue(nzo: NzbObject, pp, cat):
str(nzo.bytes),
" ".join(nzo.groups),
]
command.extend(analyse_show(nzo.final_name_with_password)[:4])
command.extend(list(analyse_show(nzo.final_name_with_password).values()))
command = [fix(arg) for arg in command]
# Fields not in the NZO directly
@@ -2298,6 +2319,13 @@ def pre_queue(nzo: NzbObject, pp, cat):
"show_season": command[9],
"show_episode": command[10],
"show_episode_name": command[11],
"proper": command[12],
"resolution": command[13],
"decade": command[14],
"year": command[15],
"month": command[16],
"day": command[17],
"type": command[18],
}
try:

View File

@@ -468,14 +468,12 @@ def nzbfile_parser(full_nzb_path: str, nzo):
# Check if we already have this exact NZF (see custom eq-checks)
if nzf in nzo.files:
logging.info("File %s occurred twice in NZB, skipping", nzf.filename)
remove_data(nzf.nzf_id, nzo.admin_path)
continue
# Add valid NZF's
if file_name and nzf.valid and nzf.nzf_id:
logging.info("File %s added to queue", nzf.filename)
nzo.files.append(nzf)
nzo.files_table[nzf.nzf_id] = nzf
nzo.bytes += nzf.bytes
nzo.add_nzf(nzf)
valid_files += 1
avg_age_sum += file_timestamp
else:

View File

@@ -157,7 +157,18 @@ class TryList:
##############################################################################
# Article
##############################################################################
ArticleSaver = ("article", "art_id", "bytes", "lowest_partnum", "decoded", "on_disk", "nzf", "crc32")
ArticleSaver = (
"article",
"art_id",
"bytes",
"lowest_partnum",
"decoded",
"data_begin",
"data_size",
"on_disk",
"nzf",
"crc32",
)
class Article(TryList):
@@ -176,6 +187,8 @@ class Article(TryList):
self.fetcher_priority: int = 0
self.tries: int = 0 # Try count
self.decoded: bool = False
self.data_begin: Optional[int] = None
self.data_size: Optional[int] = None
self.on_disk: bool = False
self.crc32: Optional[int] = None
self.nzf: NzbFile = nzf
@@ -300,7 +313,7 @@ class NzbFile(TryList):
"""Representation of one file consisting of multiple articles"""
# Pre-define attributes to save memory
__slots__ = NzbFileSaver
__slots__ = NzbFileSaver + ("first_article",)
def __init__(self, date, subject, raw_article_db, file_bytes, nzo):
"""Setup object"""
@@ -336,17 +349,16 @@ class NzbFile(TryList):
self.valid: bool = bool(raw_article_db)
if self.valid and self.nzf_id:
# Save first article separate so we can do
# duplicate file detection and deobfuscate-during-download
first_article = self.add_article(raw_article_db.pop(0))
first_article.lowest_partnum = True
self.nzo.first_articles.append(first_article)
self.nzo.first_articles_count += 1
# Temporarily hold the first article during import
self.first_article: Optional[Article] = None
# Count how many bytes are available for repair
if sabnzbd.par2file.is_parfile(self.filename):
self.nzo.bytes_par2 += self.bytes
if self.valid and self.nzf_id:
# Save first article separate, so we can deobfuscate-during-download
# We process the first_file in nzo.add_nzf because if this NZF turns
# out to be a duplicate file inside the NZB, the first article would
# otherwise become a ghost article.
self.first_article = self.add_article(raw_article_db.pop(0))
self.first_article.lowest_partnum = True
# Any articles left?
if raw_article_db:
@@ -743,7 +755,10 @@ class NzbObject(TryList):
else:
# Determine "incomplete" folder
self.download_path = os.path.join(cfg.download_dir.get_path(), self.work_name)
self.download_path = long_path(get_unique_dir(self.download_path, create_dir=True))
self.download_path = get_unique_dir(self.download_path, create_dir=True)
if not self.download_path:
raise NzbEmpty
self.download_path = long_path(self.download_path)
set_permissions(self.download_path)
# Always create the admin-directory, just to be sure
@@ -963,6 +978,24 @@ class NzbObject(TryList):
else:
self.servercount[serverid] = bytes_received
def add_nzf(self, nzf: NzbFile):
"""Bookkeeping when adding new files
Only used during import, so not locked"""
self.files.append(nzf)
self.files_table[nzf.nzf_id] = nzf
self.bytes += nzf.bytes
# Only now add first article to the list
self.first_articles.append(nzf.first_article)
self.first_articles_count += 1
nzf.first_article = None
# Count how many bytes are available for repair
if sabnzbd.par2file.is_parfile(nzf.filename):
self.bytes_par2 += nzf.bytes
logging.info("File %s added to queue", nzf.filename)
@synchronized(NZO_LOCK)
def remove_nzf(self, nzf: NzbFile) -> bool:
if nzf in self.files:
@@ -1940,7 +1973,10 @@ class NzbObject(TryList):
# Dupe check off nzb filename
if not res and no_series_dupes:
series, season, episode, _, is_proper = sabnzbd.newsunpack.analyse_show(self.final_name)
show_analysis = sabnzbd.newsunpack.analyse_show(self.final_name)
series, season, episode, is_proper = (
show_analysis[key] for key in ("title", "season", "episode", "is_proper")
)
if is_proper and series_propercheck:
logging.debug("Dupe checking series+season+ep in history aborted due to PROPER/REAL/REPACK found")
else:

View File

@@ -25,7 +25,7 @@ import re
import struct
import sabctools
from dataclasses import dataclass
from typing import Dict, Optional, Tuple, BinaryIO
from typing import Dict, Optional, Tuple
from sabnzbd.constants import MEBI
from sabnzbd.encoding import correct_unknown_encoding
@@ -44,9 +44,10 @@ PAR_RECOVERY_ID = b"RecvSlic"
class FilePar2Info:
"""Class for keeping track of par2 information of a file"""
filename: str
hash16k: bytes
filehash: bytes
filesize: int
filehash: Optional[int] = None
has_duplicate: bool = False
@@ -104,71 +105,133 @@ def parse_par2_file(fname: str, md5of16k: Dict[bytes, str]) -> Tuple[str, Dict[s
Return as dictionary, indexed on names or hashes for the first-16 table
The input md5of16k is modified in place and thus not returned!
Note that par2 can and will appear in random order, so the code has to collect data first
before we process them!
For a full description of the par2 specification, visit:
http://parchive.sourceforge.net/docs/specifications/parity-volume-spec/article-spec.html
"""
total_size = os.path.getsize(fname)
metadata = {}
metadata["nr_files"] = -1
filedata = {}
set_id = slice_size = coeff = nr_files = None
filepar2info = {}
filecrc32 = {}
table = {}
duplicates16k = []
try:
total_size = os.path.getsize(fname)
with open(fname, "rb") as f:
header = f.read(8)
while header:
while header := f.read(8):
if header == PAR_PKT_ID:
parse_par2_packet(f, metadata, filedata)
# All packages start with a header before the body
# 8 : PAR2\x00PKT
# 8 : Length of the entire packet. Must be multiple of 4. (NB: Includes length of header.)
# 16 : MD5 Hash of packet.
# 16 : Recovery Set ID.
# 16 : Type of packet.
# ?*4 : Body of Packet. Must be a multiple of 4 bytes.
# Length must be multiple of 4 and at least 20
pack_len = struct.unpack("<Q", f.read(8))[0]
if int(pack_len / 4) * 4 != pack_len or pack_len < 20:
continue
# Next 16 bytes is md5sum of this packet
md5sum = f.read(16)
# Read and check the data
# Subtract 32 because we already read these bytes of the header
data = f.read(pack_len - 32)
if md5sum != hashlib.md5(data).digest():
continue
# See if it's any of the packages we care about
par2_packet_type = data[16:32]
# Get the Recovery Set ID
set_id = data[:16].hex()
if par2_packet_type == PAR_FILE_ID:
# The FileDesc packet looks like:
# 16 : "PAR 2.0\0FileDesc"
# 16 : FileId
# 16 : Hash for full file
# 16 : Hash for first 16K
# 8 : File length
# xx : Name (multiple of 4, padded with \0 if needed)
fileid = data[32:48].hex()
if filepar2info.get(fileid):
# Already have data
continue
hash16k = data[64:80]
filesize = struct.unpack("<Q", data[80:88])[0]
filename = correct_unknown_encoding(data[88:].strip(b"\0"))
filepar2info[fileid] = FilePar2Info(filename, hash16k, filesize)
elif par2_packet_type == PAR_CREATOR_ID:
# From here until the end is the creator-text
# Useful in case of bugs in the par2-creating software
# "PAR 2.0\x00Creator\x00"
par2creator = data[32:].strip(b"\0") # Remove any trailing \0
logging.debug(
"Par2-creator of %s is: %s", os.path.basename(f.name), correct_unknown_encoding(par2creator)
)
elif par2_packet_type == PAR_MAIN_ID:
# The Main packet looks like:
# 16 : "PAR 2.0\0Main"
# 8 : Slice size
# 4 : Number of files in the recovery set
slice_size = struct.unpack("<Q", data[32:40])[0]
coeff = sabctools.crc32_xpow8n(slice_size)
nr_files = struct.unpack("<I", data[40:44])[0]
elif par2_packet_type == PAR_SLICE_ID:
# "PAR 2.0\0IFSC\0\0\0\0"
fileid = data[32:48].hex()
if not filecrc32.get(fileid):
filecrc32[fileid] = []
for i in range(48, pack_len - 32, 20):
filecrc32[fileid].append(struct.unpack("<I", data[i + 16 : i + 20])[0])
# On large files, we stop after seeing all the listings
# On smaller files, we scan them fully to get the par2-creator
if total_size > SCAN_LIMIT and len(filedata) == metadata["nr_files"]:
if total_size > SCAN_LIMIT and len(filepar2info) == nr_files:
break
header = f.read(8)
# Process all the data
for fileid in filepar2info.keys():
# Sanity check
par2info = filepar2info[fileid]
if not filecrc32.get(fileid) or not nr_files or not slice_size:
logging.debug("Missing essential information for %s", par2info)
continue
set_id = metadata["set_id"]
slice_size = metadata["slice_size"]
coeff = sabctools.crc32_xpow8n(slice_size)
# Handle also cases where slice_size is exact match for filesize
# We currently don't have an unittest for that!
slices = par2info.filesize // slice_size
slice_nr = 0
crc32 = 0
while slice_nr < slices:
crc32 = sabctools.crc32_multiply(crc32, coeff) ^ filecrc32[fileid][slice_nr]
slice_nr += 1
for fileid in filedata:
name = filedata[fileid][0]
hash16k = filedata[fileid][1]
filesize = filedata[fileid][3]
if tail_size := par2info.filesize % slice_size:
crc32 = sabctools.crc32_combine(
crc32, sabctools.crc32_zero_unpad(filecrc32[fileid][-1], slice_size - tail_size), tail_size
)
par2info.filehash = crc32
crclist = filedata[fileid][4]
if not crclist:
logging.debug("Missing CRC32 data in %s. Unfinished download?", fname)
table = {}
break
# We found hash data, add it to final tabel
table[par2info.filename] = par2info
slices = filesize // slice_size
tail_size = filesize % slice_size
crc32 = 0
slice_nr = 0
# logging.debug("File %s size %d slices %d tail %d, list %d", name, filesize, slices, tail_size, len(crclist))
while slice_nr < slices:
crc32 = sabctools.crc32_multiply(crc32, coeff) ^ crclist[slice_nr]
slice_nr += 1
# Check for md5of16k duplicates
if par2info.hash16k not in md5of16k:
md5of16k[par2info.hash16k] = par2info.filename
elif md5of16k[par2info.hash16k] != par2info.filename:
# Not unique and not already linked to this file
# Mark and remove to avoid false-renames
duplicates16k.append(par2info.hash16k)
table[par2info.filename].has_duplicate = True
if tail_size:
crc32 = sabctools.crc32_combine(
crc32, sabctools.crc32_zero_unpad(crclist[slice_nr], slice_size - tail_size), tail_size
)
# logging.debug("File %s crc32 %s, int %d", name, hex(crc32), crc32)
table[name] = FilePar2Info(hash16k, crc32, filesize)
if hash16k not in md5of16k:
md5of16k[hash16k] = name
elif md5of16k[hash16k] != name:
# Not unique and not already linked to this file
# Mark and remove to avoid false-renames
duplicates16k.append(hash16k)
table[name].has_duplicate = True
except:
except Exception as e:
logging.info("Par2 parser crashed in file %s", fname)
logging.debug("Traceback: ", exc_info=True)
table = {}
@@ -182,84 +245,3 @@ def parse_par2_file(fname: str, md5of16k: Dict[bytes, str]) -> Tuple[str, Dict[s
logging.debug("Par2-16k signature of %s not unique, discarding", old_name)
return set_id, table
def parse_par2_packet(f: BinaryIO, metadata: Dict, filedata: Dict):
"""Look up and analyze a PAR2 packet"""
# All packages start with a header before the body
# 8 : PAR2\x00PKT
# 8 : Length of the entire packet. Must be multiple of 4. (NB: Includes length of header.)
# 16 : MD5 Hash of packet. Calculation starts at first byte of Recovery Set ID and ends at last byte of body.
# 16 : Recovery Set ID.
# 16 : Type of packet.
# ?*4 : Body of Packet. Must be a multiple of 4 bytes.
# Length must be multiple of 4 and at least 20
pack_len = struct.unpack("<Q", f.read(8))[0]
if int(pack_len / 4) * 4 != pack_len or pack_len < 20:
return
# Next 16 bytes is md5sum of this packet
md5sum = f.read(16)
# Read and check the data
# Subtract 32 because we already read these bytes of the header
data = f.read(pack_len - 32)
md5 = hashlib.md5()
md5.update(data)
if md5sum != md5.digest():
return
# See if it's any of the packages we care about
par2_packet_type = data[16:32]
# Get the Recovery Set ID
metadata["set_id"] = data[:16].hex()
if par2_packet_type == PAR_FILE_ID:
# The FileDesc packet looks like:
# 16 : "PAR 2.0\0FileDesc"
# 16 : FileId
# 16 : Hash for full file
# 16 : Hash for first 16K
# 8 : File length
# xx : Name (multiple of 4, padded with \0 if needed)
fileid = data[32:48].hex()
if filedata.get(fileid):
# Already have data
return
filehash = data[48:64]
hash16k = data[64:80]
filesize = struct.unpack("<Q", data[80:88])[0]
filename = correct_unknown_encoding(data[88:].strip(b"\0"))
filedata[fileid] = [filename, hash16k, filehash, filesize, []]
elif par2_packet_type == PAR_CREATOR_ID:
# From here until the end is the creator-text
# Useful in case of bugs in the par2-creating software
# "PAR 2.0\x00Creator\x00"
par2creator = data[32:].strip(b"\0") # Remove any trailing \0
metadata["creator"] = par2creator
logging.debug("Par2-creator of %s is: %s", os.path.basename(f.name), correct_unknown_encoding(par2creator))
elif par2_packet_type == PAR_MAIN_ID:
# The Main packet looks like:
# 16 : "PAR 2.0\0Main"
# 8 : Slice size
# 4 : Number of files in the recovery set
metadata["slice_size"] = struct.unpack("<Q", data[32:40])[0]
metadata["nr_files"] = struct.unpack("<I", data[40:44])[0]
elif par2_packet_type == PAR_SLICE_ID:
# "PAR 2.0\0IFSC\0\0\0\0"
fileid = data[32:48].hex()
try:
if filedata[fileid][4]:
# Already have data
return
except KeyError:
logging.debug("Unknown fileid %s for par2 slice, skipping", fileid)
return
i = 48
for i in range(48, pack_len - 32, 20):
filedata[fileid][4].append(struct.unpack("<I", data[i + 16 : i + 20])[0])
return

View File

@@ -502,7 +502,7 @@ def process_job(nzo: NzbObject):
)
logging.info("Traceback: ", exc_info=True)
# Better disable sorting because filenames are all off now
file_sorter.sorter_active = None
file_sorter.sorter_active = False
if empty:
job_result = -1
@@ -515,7 +515,7 @@ def process_job(nzo: NzbObject):
# TV/Movie/Date Renaming code part 2 - rename and move files to parent folder
if all_ok and file_sorter.sorter_active:
if newfiles:
workdir_complete, ok = file_sorter.sorter.rename(newfiles, workdir_complete)
workdir_complete, ok = file_sorter.rename(newfiles, workdir_complete)
if not ok:
nzo.set_unpack_info("Unpack", T("Failed to move files"))
nzo.fail_msg = T("Failed to move files")
@@ -588,7 +588,7 @@ def process_job(nzo: NzbObject):
nzo.set_unpack_info("Script", "%s%s " % (script_ret, script_line), unique=True)
# Cleanup again, including NZB files
if all_ok:
if all_ok and os.path.isdir(workdir_complete):
cleanup_list(workdir_complete, False)
# Force error for empty result
@@ -668,32 +668,37 @@ def prepare_extraction_path(nzo: NzbObject) -> Tuple[str, str, Sorter, bool, Opt
the extraction path and create the directory.
Separated so it can be called from DirectUnpacker
"""
one_folder = False
create_job_dir = True
marker_file = None
# Determine category directory
catdir = config.get_category(nzo.cat).dir()
if not catdir:
# If none defined, check Default category directory
# Fall back to Default if undefined at category-level
catdir = config.get_category().dir()
# Check if it should have a directory
# Check whether the creation of job directories has been disabled
if catdir.endswith("*"):
catdir = catdir.strip("*")
one_folder = True
catdir = catdir[:-1]
create_job_dir = False
complete_dir = real_path(cfg.complete_dir.get_path(), catdir)
complete_dir = long_path(complete_dir)
complete_dir = long_path(real_path(cfg.complete_dir.get_path(), catdir))
# TV/Movie/Date Renaming code part 1 - detect and construct paths
file_sorter = Sorter(nzo, nzo.cat)
complete_dir = file_sorter.detect(nzo.final_name, complete_dir)
# Initialize the sorter and let it construct a path for the Complete directory
file_sorter = Sorter(
nzo,
nzo.final_name,
complete_dir,
nzo.cat,
)
if file_sorter.sorter_active:
one_folder = False
complete_dir = file_sorter.get_final_path()
# Sorting overrides the per-category job directory creation setting
create_job_dir = True
complete_dir = sanitize_and_trim_path(complete_dir)
if one_folder:
if not create_job_dir:
workdir_complete = create_all_dirs(complete_dir, apply_permissions=True)
else:
workdir_complete = get_unique_dir(os.path.join(complete_dir, nzo.final_name), create_dir=True)
@@ -703,7 +708,7 @@ def prepare_extraction_path(nzo: NzbObject) -> Tuple[str, str, Sorter, bool, Opt
logging.error(T("Cannot create final folder %s") % os.path.join(complete_dir, nzo.final_name))
raise IOError
if cfg.folder_rename() and not one_folder:
if create_job_dir and cfg.folder_rename():
prefixed_path = prefix(workdir_complete, "_UNPACK_")
tmp_workdir_complete = get_unique_dir(prefix(workdir_complete, "_UNPACK_"), create_dir=False)
@@ -718,7 +723,7 @@ def prepare_extraction_path(nzo: NzbObject) -> Tuple[str, str, Sorter, bool, Opt
else:
tmp_workdir_complete = workdir_complete
return tmp_workdir_complete, workdir_complete, file_sorter, one_folder, marker_file
return tmp_workdir_complete, workdir_complete, file_sorter, not create_job_dir, marker_file
def parring(nzo: NzbObject):
@@ -1064,24 +1069,21 @@ def cleanup_list(wdir, skip_nzb):
"""
if cfg.cleanup_list():
try:
files = os.listdir(wdir)
with os.scandir(wdir) as files:
for entry in files:
if entry.is_dir():
cleanup_list(entry.path, skip_nzb)
cleanup_empty_directories(entry.path)
else:
if on_cleanup_list(entry.name, skip_nzb):
try:
logging.info("Removing unwanted file %s", entry.path)
remove_file(entry.path)
except:
logging.error(T("Removing %s failed"), clip_path(entry.path))
logging.info("Traceback: ", exc_info=True)
except:
files = ()
for filename in files:
path = os.path.join(wdir, filename)
if os.path.isdir(path):
cleanup_list(path, skip_nzb)
else:
if on_cleanup_list(filename, skip_nzb):
try:
logging.info("Removing unwanted file %s", path)
remove_file(path)
except:
logging.error(T("Removing %s failed"), clip_path(path))
logging.info("Traceback: ", exc_info=True)
if files:
# If directories only contained unwanted files, remove them
cleanup_empty_directories(wdir)
logging.info("Traceback: ", exc_info=True)
def prefix(path, pre):

View File

@@ -308,7 +308,8 @@ class RSSReader:
myPrio = defPrio
n = 0
if ("F" in reTypes or "S" in reTypes) and (not season or not episode):
season, episode = sabnzbd.newsunpack.analyse_show(title)[1:3]
show_analysis = sabnzbd.newsunpack.analyse_show(title)
season, episode = show_analysis["season"], show_analysis["episode"]
# Match against all filters until an positive or negative match
logging.debug("Size %s", size)

View File

@@ -52,12 +52,12 @@ SKIN_TEXT = {
"sch-rss_scan": TT("Read RSS feeds"), #: #: Config->Scheduler
"sch-remove_failed": TT("Remove failed jobs"), #: Config->Scheduler
"sch-remove_completed": TT("Remove completed jobs"), #: Config->Scheduler
"sch-pause_all_low": TT("Pause low prioirty jobs"), #: Config->Scheduler
"sch-pause_all_normal": TT("Pause normal prioirty jobs"), #: Config->Scheduler
"sch-pause_all_high": TT("Pause high prioirty jobs"), #: Config->Scheduler
"sch-resume_all_low": TT("Resume low prioirty jobs"), #: Config->Scheduler
"sch-resume_all_normal": TT("Resume normal prioirty jobs"), #: Config->Scheduler
"sch-resume_all_high": TT("Resume high prioirty jobs"), #: Config->Scheduler
"sch-pause_all_low": TT("Pause low priority jobs"), #: Config->Scheduler
"sch-pause_all_normal": TT("Pause normal priority jobs"), #: Config->Scheduler
"sch-pause_all_high": TT("Pause high priority jobs"), #: Config->Scheduler
"sch-resume_all_low": TT("Resume low priority jobs"), #: Config->Scheduler
"sch-resume_all_normal": TT("Resume normal priority jobs"), #: Config->Scheduler
"sch-resume_all_high": TT("Resume high priority jobs"), #: Config->Scheduler
"sch-enable_quota": TT("Enable quota management"), #: Config->Scheduler
"sch-disable_quota": TT("Disable quota management"), #: Config->Scheduler
"sch-pause_cat": TT("Pause jobs with category"), #: Config->Scheduler
@@ -140,8 +140,6 @@ SKIN_TEXT = {
"cmenu-sorting": TT("Sorting"), #: Main menu item
"cmenu-special": TT("Special"), #: Main menu item
"cmenu-search": TT("Search"), #: Main menu item
# Footer
"ft-download": TT("Download Dir"), # Used in Footer
# Main page
"shutdownOK?": TT("Are you sure you want to shutdown SABnzbd?"),
"link-pause": TT("Pause"), #: Pause downloading
@@ -225,7 +223,6 @@ SKIN_TEXT = {
"dashboard-IP6": TT("IPv6 address"),
"dashboard-NameserverDNS": TT("Nameserver / DNS Lookup"),
"dashboard-delayed": TT("Download speed limited by"),
"dashboard-delayed-cpu": TT("CPU"),
"dashboard-delayed-disk": TT("Disk speed"),
"dashboard-loadavg": TT("System load"),
"dashboard-systemPerformance": TT("System Performance (Pystone)"), #: Do not translate Pystone
@@ -366,6 +363,7 @@ SKIN_TEXT = {
"explain-complete_dir": TT(
"Location to store finished, fully processed downloads.<br /><i>Can be overruled by user-defined categories.</i>"
),
"explain-complete_dir-sorting": TT("Use Sorting to automatically organize and rename your completed downloads."),
"opt-complete_free": TT("Minimum Free Space for Completed Download Folder"),
"explain-complete_free": TT("Will not work if a category folder is on a different disk."),
"opt-fulldisk_autoresume": TT("Auto resume"),
@@ -616,6 +614,7 @@ SKIN_TEXT = {
"addMultipleFeeds": TT("Seperate multiple URLs by a comma"), #: Config->RSS, placeholder (cannot be too long)
"button-preFeed": TT("Read Feed"), #: Config->RSS button
"button-forceFeed": TT("Force Download"), #: Config->RSS button
"button-evalFeed": TT("Apply filters"),
"rss-edit": TT("Edit"), #: Config->RSS edit button
"rss-nextscan": TT("Next scan at"), #: Config->RSS when will be the next RSS scan
"rss-order": TT("Order"), #: Config->RSS table column header
@@ -710,29 +709,19 @@ SKIN_TEXT = {
"catFolderPath": TT("Folder/Path"),
"catTags": TT("Indexer Categories / Groups"),
# Config->Sorting
"selectOneCat": TT("Select at least 1 category."),
"seriesSorting": TT("Series Sorting"),
"opt-tvsort": TT("Enable TV Sorting"),
"sort-legenda": TT("Pattern Key"),
"button-clear": TT("Clear"),
"button-evalFeed": TT("Apply filters"),
"presetSort": TT("Presets"),
"movieSort": TT("Movie Sorting"),
"opt-movieSort": TT("Enable Movie Sorting"),
"seriesSort": TT("Series Sorting"),
"presetSort": TT("Presets"),
"affectedCat": TT("Affected Categories"),
"sort-meaning": TT("Meaning"),
"sort-pattern": TT("Pattern"),
"sort-result": TT("Result"),
"button-Season1x05": TT("1x05 Season Folder"),
"button-SeasonS01E05": TT("S01E05 Season Folder"),
"button-Ep1x05": TT("1x05 Episode Folder"),
"button-EpS01E05": TT("S01E05 Episode Folder"),
"button-FileLikeFolder": TT("Job Name as Filename"),
"sort-title": TT("Title"),
"movie-sp-name": TT("Movie Name"),
"movie-dot-name": TT("Movie.Name"),
"movie-us-name": TT("Movie_Name"),
"show-name": TT("Show Name"),
"show-sp-name": TT("Show Name"),
"show-dot-name": TT("Show.Name"),
"show-us-name": TT("Show_Name"),
@@ -742,7 +731,6 @@ SKIN_TEXT = {
"ep-sp-name": TT("Episode Name"),
"ep-dot-name": TT("Episode.Name"),
"ep-us-name": TT("Episode_Name"),
"fileExt": TT("File Extension"),
"extension": TT("Extension"),
"partNumber": TT("Part Number"),
"decade": TT("Decade"),
@@ -753,14 +741,13 @@ SKIN_TEXT = {
"text": TT("text"),
"sort-File": TT("file"),
"sortString": TT("Sort String"),
"multiPartLabel": TT("Multi-part label"),
"multiPartLabel": TT("Multi-part Label"),
"button-showFolder": TT("Show folder"),
"button-seasonFolder": TT("Season folder"),
"button-inFolders": TT("In folders"),
"button-noFolders": TT("No folders"),
"dateSorting": TT("Date Sorting"),
"opt-dateSort": TT("Enable Date Sorting"),
"button-ShowNameF": TT("Show Name folder"),
"button-YMF": TT("Year-Month Folders"),
"button-DailyF": TT("Daily Folders"),
"button-FileLikeFolder": TT("Job Name as Filename"),
"button-Series": TT("Series"),
"case-adjusted": TT("case-adjusted"), #: Note for title expression in Sorting that does case adjustment
"sortResult": TT("Processed Result"),
"sort-guessitMeaning": TT("Any property"),
@@ -768,6 +755,31 @@ SKIN_TEXT = {
"guessit-sp-property": TT("GuessIt Property"),
"guessit-dot-property": TT("GuessIt.Property"),
"guessit-us-property": TT("GuessIt_Property"),
"sort-minimum-size": TT("Minimum Filesize"),
"guessit-type": TT("Affected Job Types"),
"guessit-type-all": TT("All"),
"guessit-type-tv": TT("Series"),
"guessit-type-date": TT("Series with air dates"),
"guessit-type-movie": TT("Movies"),
"guessit-type-other": TT("Other / Unknown"),
"explain-sorting": TT(
"<p>Use Sorters to automatically organize your completed downloads. For example, put all episodes from a series "
"in a season-specific folder. Or, put movies in a folder named after the movie.</p>"
"<p>Sorters are tried in order of appearance and can be reordered by dragging and dropping.<br/>"
"The first active sorter that matches both the affected category and job type is applied.</p>"
"<p>More options are available when Advanced Settings is checked.<br/>"
"Detailed information can be found on the Wiki.</p>"
),
"add-sorter": TT("Add Sorter"),
"remove-sorter": TT("Remove Sorter"),
"sort-test-data": TT("Test Data"),
"sort-quick-add": TT("Quick start"),
"sort-quick-add-series": TT(
'Move and rename all episodes in the "tv" category to a show-specific folder'
), #: Do not translate "tv"!
"sort-quick-add-movies": TT(
'Move and rename all movies in the "movies" category to a movie-specific folder'
), #: Do not translate "movies"!
# Config->Special
"explain-special": TT(
"Rarely used options. For their meaning and explanation, click on the Help button to go to the Wiki page.<br>"
@@ -857,6 +869,7 @@ SKIN_TEXT = {
"Glitter-confirmDeleteQueue": TT("Confirm Queue Deletions"),
"Glitter-confirmDeleteHistory": TT("Confirm History Deletions"),
"Glitter-keyboardShortcuts": TT("Keyboard shortcuts"),
"Glitter-keyboardShortcuts-arrows": TT("Shift+Arrow key: Browse Queue and History pages"),
"Glitter-pausePrompt": TT("How long or untill when do you want to pause? (in English!)"),
"Glitter-pausePromptFail": TT("Sorry, we could not interpret that. Try again."),
"Glitter-pauseFor": TT("Pause for..."),

View File

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,8 @@ SIZE_URL_LIST = [
[5, "https://sabnzbd.org/tests/internetspeed/5MB.bin"],
[10, "https://sabnzbd.org/tests/internetspeed/10MB.bin"],
[20, "https://sabnzbd.org/tests/internetspeed/20MB.bin"],
[50, "https://sabnzbd.org/tests/internetspeed/50MB.bin"],
[100, "https://sabnzbd.org/tests/internetspeed/100MB.bin"],
]

View File

@@ -5,5 +5,5 @@
# You MUST use double quotes (so " and not ')
__version__ = "4.0.0Alpha2"
__baseline__ = "unknown"
__version__ = "4.0.0"
__baseline__ = "c27c9564cf424e898e85fb1e393d6aeadef63deb"

View File

@@ -28,7 +28,7 @@ parts:
source: .
requirements: [snap/local/requirements_snap.txt, requirements.txt]
stage-packages: [python3-dev, libdb5.3, unrar, p7zip-full, par2]
build-packages: [libffi-dev, python3-dev, libssl-dev, cargo]
build-packages: [pkg-config, libffi-dev, python3-dev, libssl-dev, cargo]
override-build: |
snapcraftctl set-version $(grep -oP '(?<=^Version: ).*' PKG-INFO)
snapcraftctl build

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