Compare commits

...

104 Commits
4.3.3 ... 4.4.0

Author SHA1 Message Date
Safihre
708fad33f3 Set version to 4.4.0 2024-12-09 21:56:46 +01:00
Safihre
c6dc25c9c2 Merge branch '4.4.x' 2024-12-09 21:56:29 +01:00
Safihre
07be38cd01 Update text files for 4.4.0 2024-12-09 21:55:33 +01:00
Safihre
0121e0ae16 Update release date of 4.4.0 in appdata 2024-12-09 21:50:07 +01:00
Safihre
6f9bf68528 Update text files for 4.4.0RC1 2024-12-02 09:55:22 +01:00
Safihre
5a48301d25 Prevent division by zero in bad server check
Closes #2963
2024-12-02 09:51:41 +01:00
SABnzbd Automation
d1d3e27dea Update translatable texts
[skip ci]
2024-12-02 08:45:53 +00:00
Safihre
2f1805123a Add 4.4.0 to appdata 2024-12-02 09:42:38 +01:00
renovate[bot]
f05c82b3a7 Update all dependencies (#2985)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-02 01:13:49 +00:00
Michael Nightingale
1fe01f2724 Fix displayTabbed observable default value (#2984) 2024-12-01 18:47:00 +01:00
renovate[bot]
a5239808eb Update all dependencies (#2977)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-25 00:55:58 +00:00
SABnzbd Automation
00a7b4fffc Update translatable texts
[skip ci]
2024-11-21 21:00:04 +00:00
Safihre
0c5010f5c1 Warn users that the legacy Windows release will be dropped 2024-11-21 21:51:41 +01:00
renovate[bot]
a8b33e7686 Update all dependencies (develop) (#2974)
* Update all dependencies

* Add fix for Python 3.8 for PyJWT

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Safihre <safihre@sabnzbd.org>
2024-11-19 09:09:13 +00:00
Safihre
0294e01fae Always notarize the macOS release 2024-11-19 08:52:33 +01:00
SABnzbd Automation
c2621f56eb Update translatable texts
[skip ci]
2024-11-18 21:03:49 +00:00
Safihre
ebac7707ff Always run release preparation 2024-11-18 22:03:04 +01:00
SABnzbd Automation
26adade8be Update translatable texts
[skip ci]
2024-11-18 14:30:25 +00:00
Safihre
dd9c7488c6 Update text files for 4.4.0Beta2 2024-11-18 15:29:25 +01:00
Safihre
754b862a29 Build release using Python 3.13 2024-11-17 21:10:48 +01:00
Safihre
0ddf343bb7 Generalize wildcard addition in par2cmdline call 2024-11-17 21:06:30 +01:00
SABnzbd Automation
7a8a45b811 Update translatable texts
[skip ci]
2024-11-17 19:56:02 +00:00
Safihre
66c525ef95 Remove any custom Multipar parameters when updating 2024-11-17 20:54:59 +01:00
SABnzbd Automation
7cd3e50ded Update translatable texts
[skip ci]
2024-11-17 19:45:37 +00:00
Safihre
d5094e1aa6 Switch to modified par2cmdline-turbo-utf8 2024-11-17 20:35:33 +01:00
renovate[bot]
bca9559783 Update all dependencies (#2961)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-12 14:34:43 +00:00
Safihre
0cbb8af7a0 More compatibility fixes for Python 3.8 2024-11-12 15:14:53 +01:00
Safihre
afab90ca68 Ignore package updates that are unsupported on Python 3.8 2024-11-12 08:58:42 +01:00
SABnzbd Automation
92ecfc4930 Update translatable texts
[skip ci]
2024-11-11 11:17:53 +00:00
Safihre
b064f112cd Fix version of blinker for Python 3.8 2024-11-11 12:16:56 +01:00
renovate[bot]
629da51be7 Update all dependencies 2024-11-04 08:08:53 +00:00
Safihre
0fa0f7286c Let renovate also update uvicorn branch 2024-11-03 20:47:24 +01:00
Safihre
6cd8f3e333 Add server note to the main servers display
Closes #2957
2024-11-03 16:45:52 +01:00
Safihre
ff18fe03e9 Update the release builder configuration 2024-10-31 21:33:34 +01:00
SABnzbd Automation
a1e30d19e3 Update translatable texts
[skip ci]
2024-10-31 20:23:25 +00:00
Safihre
3d74c19f41 Update text files for 4.4.0Beta1 2024-10-31 21:22:40 +01:00
SABnzbd Automation
33a831e87c Update translatable texts
[skip ci]
2024-10-29 21:03:01 +00:00
Safihre
7b04917f0e Kill unrar if it reports disk full, since it can hang
See #2948
2024-10-29 22:02:17 +01:00
SABnzbd Automation
2f62b76279 Update translatable texts
[skip ci]
2024-10-29 20:17:28 +00:00
Safihre
bd43bca1cf Include dateutil timezone file that would show warning in executables 2024-10-29 21:16:41 +01:00
Safihre
d200f0a618 Small refactor of improved warnings for weird ports
Not needed, but I liked it
2024-10-29 21:08:49 +01:00
SABnzbd Automation
c5314569db Update translatable texts
[skip ci]
2024-10-29 11:11:35 +00:00
Sander
001e215b7d Better analysis & better user info if newsserver connection fails (#2951)
* Better analysis & better user info if newsserver connection fails

* make Black happy

* make Black happy

* make Black happy

* make Black happy ... corrected

* make Black happy ... corrected

* make Black happy ... corrected

* make Black happy ... corrected

* Safihre's feedback handled

* more Safihre's feedback handled

---------

Co-authored-by: sanderjo <sander.jonkers+github@github.com>
2024-10-29 12:10:45 +01:00
SABnzbd Automation
3a628a0025 Update translatable texts
[skip ci]
2024-10-28 01:04:25 +00:00
renovate[bot]
7e48207fbc Update all dependencies 2024-10-28 01:03:38 +00:00
renovate[bot]
48a6d6b289 Update all dependencies (#2949)
Co-authored-by: Safihre <safihre@sabnzbd.org>
2024-10-22 12:19:15 +02:00
SABnzbd Automation
21f05ad3d9 Update translatable texts
[skip ci]
2024-10-21 06:56:44 +00:00
Safihre
d93c861eb3 Add disk full error to Direct Unpacker
Closes #2948
2024-10-21 08:55:56 +02:00
Safihre
fb0ef21768 The tests folder was ignored by default by Renovate 2024-10-15 11:55:26 +02:00
Safihre
277679ef53 Add Python 3.13 to CI tests 2024-10-15 10:10:24 +02:00
Safihre
e7e47bbcb0 Do not compare articles just based on article-ID
Turns out that there are NZBs that contain duplicate article-ID's within 1 file. This causes all "article in nzf.article" comparisons to return the wrong comparison.
2024-10-15 09:44:04 +02:00
Safihre
65ffb5ca81 All resets of try lists should be locked fully 2024-10-15 09:43:55 +02:00
SABnzbd Automation
6cf308e441 Update translatable texts
[skip ci]
2024-10-14 01:47:23 +00:00
renovate[bot]
870fa40c91 Update all dependencies 2024-10-14 01:46:42 +00:00
Safihre
39d9eaec2a Create new history database in case of no such table error 2024-10-08 21:06:59 +02:00
SABnzbd Automation
6fd4d0882c Update translatable texts
[skip ci]
2024-10-08 07:39:00 +00:00
Safihre
32591f7c46 Update text files for 4.4.0Alpha2 2024-10-08 09:38:01 +02:00
SABnzbd Automation
6b47d1126d Update translatable texts
[skip ci]
2024-10-07 00:23:20 +00:00
renovate[bot]
53df39dd12 Update dependency pywin32 to v307 2024-10-07 00:22:35 +00:00
Safihre
b5d33fc17c Mount interface again on both / and url_base
Closes #2936
2024-10-05 20:58:45 +02:00
SABnzbd Automation
8a517b668e Update translatable texts
[skip ci]
2024-10-01 06:27:56 +00:00
thezoggy
67135ba4c8 Update 7zip and multipar (#2942)
* Update 7zip to 24.08

* Update multipar to 1.3.3.3
2024-10-01 08:27:12 +02:00
renovate[bot]
c9efda1889 Update all dependencies 2024-09-30 00:44:59 +00:00
Safihre
250869c242 Force Selenium browser_version to 127
Closes #2932
2024-09-26 22:41:20 +02:00
SABnzbd Automation
844650e6be Update translatable texts
[skip ci]
2024-09-26 20:27:25 +00:00
Safihre
6685c72894 Saving Specials page would result in restart even for no changes
Relates to #2932
2024-09-26 22:26:39 +02:00
renovate[bot]
154a5e4989 Update all dependencies (#2937)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 07:34:11 +02:00
SABnzbd Automation
93d302c9d7 Update translatable texts
[skip ci]
2024-09-20 08:11:43 +00:00
Safihre
f664df7f05 Update text files for 4.4.1Alpha1 2024-09-20 10:10:55 +02:00
thezoggy
8fbf50292b Add additional server priority colors (#2934) 2024-09-17 20:27:22 +02:00
Safihre
f3fed43022 Remove logging line for scheduled history purge 2024-09-17 15:06:56 +02:00
Safihre
2d323ba18c Update to Python 3.12.6 and drop macOS <10.13 support
Closes #2784
2024-09-16 13:59:38 +02:00
Safihre
1ec30a56e1 Improve logging of server address retrieval 2024-09-16 13:58:57 +02:00
renovate[bot]
b98f3a07dd Update all dependencies (#2933)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-16 13:58:12 +02:00
Safihre
46170ffb3d Reset article queue only when really stopping the server
Closes #2866
2024-09-10 20:25:56 +03:00
renovate[bot]
5e8b41be5a Update all dependencies (#2930)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-10 20:13:14 +03:00
SABnzbd Automation
47a2d5387d Update translatable texts
[skip ci]
2024-09-10 07:57:26 +00:00
Safihre
1e61239933 Add Bootstrap tooltips to any elements with title 2024-09-10 10:55:06 +03:00
Safihre
aedbf35be8 Show file being moved during Moving phase 2024-09-07 11:10:58 +03:00
Safihre
cf9540842b Config restart would always try to build URL instead of using current
#2835
2024-09-07 10:51:11 +03:00
Safihre
9205b9161b Update Linux test runners 2024-09-05 12:43:31 +03:00
Safihre
07b64b4abb Update tests for change in webpage mounting 2024-09-04 12:09:07 +03:00
Safihre
c56145e424 Only mount webpages on /, no longer on /sabnzbd
Closes #2929
2024-09-04 11:39:38 +03:00
Safihre
ef11aba166 Add basic system to do trigger one-time config conversions 2024-09-04 11:39:37 +03:00
SABnzbd Automation
fcf03e9a59 Update translatable texts
[skip ci]
2024-09-03 09:06:42 +00:00
renovate[bot]
6662065bb1 Update all dependencies (#2928)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-03 12:05:52 +03:00
SABnzbd Automation
4973672892 Update translatable texts
[skip ci]
2024-08-30 12:47:50 +00:00
bt90
efa73a52e1 Add doctype to login page (#2927) 2024-08-30 14:47:02 +02:00
SABnzbd Automation
82098a6228 Update translatable texts
[skip ci]
2024-08-26 02:47:15 +00:00
renovate[bot]
07250aa355 Update all dependencies 2024-08-26 02:46:28 +00:00
Safihre
46caa8b33f Add Docker to CPU label 2024-08-19 20:21:19 +02:00
Safihre
b0564c1bab Small style fixes for the Config 2024-08-19 11:42:12 +02:00
SABnzbd Automation
3c8a85ff35 Update translatable texts
[skip ci]
2024-08-19 09:28:34 +00:00
Safihre
656c329912 Update version to 4.4.0-develop 2024-08-19 11:27:46 +02:00
SABnzbd Automation
983253908c Update translatable texts
[skip ci]
2024-08-19 01:20:50 +00:00
renovate[bot]
cef0eeb25b Update all dependencies 2024-08-19 01:20:10 +00:00
Safihre
a9eace759f increase_bad_articles_counter should be called before register_article 2024-08-16 22:23:14 +02:00
Safihre
ad0e7bf5df Prevent excessive newswrapper data buffer size
Closes #2895
2024-08-16 17:25:57 +02:00
Safihre
bea348232a Do not use article_queue when resetting newswrapper
Relates to #2866
2024-08-16 16:50:28 +02:00
jcfp
1519dbc554 Remove pyfakefs workarounds and put its new apply_umask option to good use (#2922) 2024-08-16 15:44:52 +02:00
SABnzbd Automation
297455cd35 Update translatable texts
[skip ci]
2024-08-12 02:04:47 +00:00
renovate[bot]
56b68024db Update all dependencies 2024-08-12 02:04:06 +00:00
SABnzbd Automation
09aa09a55b Update translatable texts
[skip ci]
2024-08-09 17:46:39 +00:00
Sander
f1d134fe2e Deobfuscate subtitles (#2903)
* deobfuscate_subtitles

* deobfuscate_subtitles: unit test aka pytest

* deobfuscate_subtitles: unit test aka pytest

* deobfuscate_subtitles: no reanem is first part of filename is the samen

* deobfuscate_subtitles: no reanem is first part of filename is the samen

* deobfuscate_subtitles: no reanem is first part of filename is the samen

* deobfuscate_subtitles: more structured unit test method

* deobfuscate_subtitles: back to basic testing method

* deobfuscate_subtitles: cleanup

* deobfuscate_subtitles: cleanup

* deobfuscate_filenames.test_first_file_is_much_bigger() improved

* deobfuscate_subtitles(): checks on biggest file and srt files. input can be directory or filelist.

* rename to clearly_one_biggest_file()

* WIP on develop

* accept work by safihre

* do nothing when not one_file_is_biggest

* a lot of cleanup, also with help of the walrus

* a lot of cleanup, also with help of the walrus

* fix typo's in test_deobfuscate_filenames.py

* Update sabnzbd/postproc.py

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

* handle review comments

* handle review comments

* remove import glob

* remove special underscore support. Add srt deob info into GUI-history

---------

Co-authored-by: sander <san.d.erjonkers+github@gmail.com>
Co-authored-by: Safihre <safihre@sabnzbd.org>
2024-08-09 19:45:57 +02:00
110 changed files with 1290 additions and 562 deletions

View File

@@ -7,6 +7,7 @@
"schedule": [
"before 8am on Monday"
],
"baseBranches": ["develop", "feature/uvicorn"],
"pip_requirements": {
"fileMatch": [
"requirements.txt",
@@ -15,14 +16,14 @@
"builder/release-requirements.txt"
]
},
"ignorePaths": [],
"ignoreDeps": [
"jaraco.text",
"jaraco.context",
"jaraco.collections",
"sabctools",
"paho-mqtt",
"werkzeug",
"pyinstaller"
"werkzeug"
],
"packageRules": [
{

View File

@@ -13,10 +13,10 @@ jobs:
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.12 (64bit)
- name: Set up Python 3.13 (64bit)
uses: actions/setup-python@v5
with:
python-version: "3.12"
python-version: "3.13"
architecture: "x64"
cache: pip
cache-dependency-path: "**/requirements.txt"
@@ -69,18 +69,18 @@ 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.12.5"
MACOSX_DEPLOYMENT_TARGET: "10.9"
PYTHON_VERSION: "3.13.0"
MACOSX_DEPLOYMENT_TARGET: "10.13"
# We need to force compile for universal2 support
CFLAGS: -arch x86_64 -arch arm64
ARCHFLAGS: -arch x86_64 -arch arm64
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.12
- name: Set up Python 3.13.0
# Only use this for the caching of pip packages!
uses: actions/setup-python@v5
with:
python-version: "3.12"
python-version: "3.13"
cache: pip
cache-dependency-path: "**/requirements.txt"
- name: Cache Python download
@@ -95,14 +95,12 @@ jobs:
- name: Install Python
run: sudo installer -pkg ~/python.pkg -target /
- name: Install Python dependencies
# We have to manually take a few steps:
# 1. We need to build the PyInstaller bootloader:
# https://github.com/pyinstaller/pyinstaller/issues/6235
# We have to manually compile some modules as they don't automatically fetch universal2 binaries
run: |
python3 --version
pip3 install --upgrade pip wheel
pip3 install --upgrade -r requirements.txt --no-binary cffi,CT3,PyYAML,charset_normalizer --no-dependencies
PYINSTALLER_COMPILE_BOOTLOADER=1 pip3 install --upgrade -r builder/requirements.txt --no-binary pyinstaller --no-dependencies
pip3 install --upgrade -r builder/requirements.txt --no-dependencies
- name: Import macOS codesign certificates
# Taken from https://github.com/Apple-Actions/import-codesign-certs/pull/27 (comments)
env:
@@ -138,13 +136,12 @@ jobs:
uses: actions/upload-artifact@v4
with:
path: "*-osx.dmg"
name: macOS binary (not notarized)
name: macOS binary
release:
name: Publish Release
name: Prepare Release
runs-on: ubuntu-latest
needs: [build_windows, build_macos]
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
steps:
- uses: actions/checkout@v4
- name: Set up Python
@@ -165,6 +162,7 @@ jobs:
pip3 install -r builder/release-requirements.txt
python3 builder/release.py
- name: Release latest available Snap
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_TOKEN }}
run: |

View File

@@ -31,18 +31,18 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
python-architecture: ["x64"]
name: ["Linux"]
os: [ubuntu-20.04]
os: [ubuntu-latest]
include:
- name: macOS
os: macos-latest
python-version: "3.12"
python-version: "3.13"
python-architecture: "x64"
- name: Windows
os: windows-latest
python-version: "3.12"
python-version: "3.13"
python-architecture: "x64"
- name: Windows (32bit)
os: windows-latest
@@ -60,7 +60,7 @@ jobs:
cache-dependency-path: "**/requirements.txt"
- name: Install system dependencies
if: runner.os == 'Linux'
run: sudo apt-get install unrar p7zip-full par2
run: sudo apt-get install unrar 7zip par2
- name: Install Python dependencies
run: |
python --version

View File

@@ -1,58 +1,23 @@
Release Notes - SABnzbd 4.3.3
Release Notes - SABnzbd 4.4.0
=========================================================
This is the third bug fix release of SABnzbd 4.3.0.
## New features in 4.4.0
## Bug fixes and changes since 4.3.2
* Reduced chance of jobs getting stuck at 99%.
* Prevent crash in case of invalid articles.
* Correct handling of empty or `Default` category when adding a job.
* History API-output could contain inconsistent variable types.
* Skip external IPv6 check if only link local addresses are available.
* Shortened timeouts when resolving addresses during checks.
* Windows: Could not repair or extract on ARM platforms.
* Windows: Add file version information to installer.
* Subtitle files will be deobfuscated if required.
* Show server `Personal notes` on the main servers display.
* Windows: Use par2cmdline-turbo by default (thanks to @dnzbk).
* macOS: Dropped support for macOS 10.12 and below.
* macOS and Windows: Use Python 3.13 for release.
* Windows: The next release will no longer support Windows 32bit or Windows 7.
## Bug fixes and changes since 4.3.1
## Bug fixes in 4.4.0
* Added Special option `disable_archive` for jobs to always be permanently deleted.
* Specific AppRise notifications could fail to send.
* Update of the article decoder core (`rapidyenc`).
* Windows: After some time the interface would no longer load.
* Windows: Custom shortcuts would be removed by the installer.
* Windows/macOS: Updated Unrar to 7.01 and 7zip to 24.05.
## Key changes since 4.2.0
* **Archive:**
* When jobs are removed from the History, they are moved to the Archive.
* Keep your History clean and still be able to reliably use Duplicate Detection.
* **Apprise Integrated:**
* Send notifications using Apprise to almost any notification service.
* Supported notifications: https://github.com/caronc/apprise/wiki
* Notification Script `SABnzbd-notify.py` is no longer needed.
* **Added IPv6-staging option:**
* Enable `ipv6_staging` in Config - Specials to get additional IPv6 features:
* Add IPv6 hostnames during address selection.
* Internet Bandwidth is measured separately for IPv4 and IPv6.
* **Other:**
* The `text` output format is removed from the API, `json` is the default.
* Handling of multiple inputs to several API methods was improved.
* File browser dialog is available to select file paths in the Config.
* Users will be warned if they configure an Indexer as a Server.
* Added `SAB_API_KEY` and `SAB_API_URL` to script environment variables.
* Windows/macOS: Updated Python to 3.12.3, Multipar to v1.3.3.2,
Unrar to 7.00 and 7zip to 24.03.
## Bug fixes since 4.2.0
* Incorrect warnings of unknown status codes could be thrown.
* Watched Folder would not work if Socks5 proxy was active.
* Prevent crash on invalid Server Expiration Date.
* Windows: Installer could create duplicate shortcuts.
* Toggling of Servers could result in jobs being stuck at 99%.
* Corrupt NZB's could also result in jobs being stuck at 99%.
* Config restart would always determine redirect URL instead of using current.
* Correctly handle `disk full` errors from Unrar.
* Create new history database in case of `no such table` error.
* Interface could load in tabbed mode even though it was not enabled.
## Upgrade notices

View File

@@ -1496,6 +1496,10 @@ def main():
ssdp_broadcast_interval=sabnzbd.cfg.ssdp_broadcast_interval(),
)
# TODO: Remove in 4.5
if hasattr(sys, "frozen") and sabnzbd.WIN32 and not sabnzbd.WIN64:
logging.warning("SABnzbd 4.5.0 will not have a legacy release, because Python no longer support it!")
# Have to keep this running, otherwise logging will terminate
timer = 0
while not sabnzbd.SABSTOP:

View File

@@ -13,7 +13,7 @@ from builder.constants import EXTRA_FILES, EXTRA_FOLDERS, RELEASE_VERSION, RELEA
extra_pyinstaller_files = []
# Add hidden imports
extra_hiddenimports = ["Cheetah.DummyTransaction", "cheroot.ssl.builtin", "certifi", "pkg_resources.extern"]
extra_hiddenimports = ["Cheetah.DummyTransaction", "cheroot.ssl.builtin", "certifi"]
extra_hiddenimports.extend(collect_submodules("apprise"))
extra_hiddenimports.extend(collect_submodules("babelfish.converters"))
extra_hiddenimports.extend(collect_submodules("guessit.data"))
@@ -40,7 +40,7 @@ else:
)
# Windows
extra_hiddenimports.extend(["win32timezone", "winrt.windows.foundation.collections"])
extra_hiddenimports.extend(["win32timezone"])
EXTRA_FOLDERS += ["win/multipar/", "win/par2/", "win/unrar/", "win/7zip/"]
EXTRA_FILES += ["portable.cmd"]
@@ -88,6 +88,7 @@ for folder_item in EXTRA_FOLDERS:
extra_pyinstaller_files.extend(collect_data_files("babelfish"))
extra_pyinstaller_files.extend(collect_data_files("guessit"))
extra_pyinstaller_files.extend(collect_data_files("apprise"))
extra_pyinstaller_files.extend(collect_data_files("dateutil"))
pyi_analysis = Analysis(
["SABnzbd.py"],
@@ -165,7 +166,7 @@ if sys.platform == "darwin":
"NSPersistentStoreTypeKey": "Binary",
}
],
"LSMinimumSystemVersion": "10.9",
"LSMinimumSystemVersion": "10.13",
"LSEnvironment": {"LANG": "en_US.UTF-8", "LC_ALL": "en_US.UTF-8"},
}

View File

@@ -37,6 +37,7 @@ PRERELEASE = len(RELEASE_VERSION) > 5
# Parse the version info for Windows file properties information
version_regexed = re.search(r"(\d+)\.(\d+)\.(\d+)([a-zA-Z]*)(\d*)", RELEASE_VERSION)
RELEASE_VERSION_TUPLE = (int(version_regexed.group(1)), int(version_regexed.group(2)), int(version_regexed.group(3)), 0)
RELEASE_VERSION_BASE = f"{RELEASE_VERSION_TUPLE[0]}.{RELEASE_VERSION_TUPLE[1]}.{RELEASE_VERSION_TUPLE[2]}"
# Define release name
RELEASE_NAME = "SABnzbd-%s" % RELEASE_VERSION

View File

@@ -356,8 +356,8 @@ if __name__ == "__main__":
if authority not in sign_result or "adhoc" in sign_result or "invalid" in sign_result:
raise RuntimeError("Signature of %s seems invalid!" % file_to_check)
# Only notarize for real builds that we want to deploy
if notarization_user and notarization_pass and RELEASE_THIS:
# Always notarize, as newer macOS versions don't allow any code without it
if notarization_user and notarization_pass:
# Prepare zip to upload to notarization service
print("Creating zip to send to Apple notarization service")
# We need to use ditto, otherwise the signature gets lost!
@@ -391,8 +391,6 @@ if __name__ == "__main__":
# Staple the notarization!
print("Approved! Stapling the result to the app")
run_external_command(["xcrun", "stapler", "staple", "dist/SABnzbd.app"])
elif notarization_user and notarization_pass:
print("Notarization skipped, tag commit to trigger notarization!")
else:
print("Notarization skipped, NOTARIZATION_USER or NOTARIZATION_PASS missing.")
else:

View File

@@ -1,2 +1,2 @@
PyGithub==2.3.0
praw==7.7.1
PyGithub==2.5.0
praw==7.8.1

View File

@@ -26,6 +26,7 @@ import praw
from constants import (
RELEASE_VERSION,
RELEASE_VERSION_BASE,
PRERELEASE,
RELEASE_SRC,
RELEASE_BINARY_32,
@@ -36,6 +37,7 @@ from constants import (
RELEASE_THIS,
RELEASE_TITLE,
APPDATA_FILE,
ON_GITHUB_ACTIONS,
)
# Verify we have all assets
@@ -53,9 +55,14 @@ for file_to_check in files_to_check:
print("All release files are present")
# Verify that appdata file is updated
if not PRERELEASE:
if not isinstance(ET.parse(APPDATA_FILE).find(f"./releases/release[@version='{RELEASE_VERSION}']"), ET.Element):
raise RuntimeError(f"Could not find {RELEASE_VERSION} in {APPDATA_FILE}")
if not isinstance(ET.parse(APPDATA_FILE).find(f"./releases/release[@version='{RELEASE_VERSION_BASE}']"), ET.Element):
release_missing = f"Could not find {RELEASE_VERSION_BASE} in {APPDATA_FILE}"
if RELEASE_THIS:
raise RuntimeError(release_missing)
elif ON_GITHUB_ACTIONS:
print(f"::warning file={APPDATA_FILE},title=Missing release::{release_missing}")
else:
print(release_missing)
# Calculate hashes for Synology release
with open(RELEASE_SRC, "rb") as inp_file:

View File

@@ -1,23 +1,24 @@
# Basic build requirements
# Note that not all sub-dependencies are listed, but only ones we know could cause trouble
pyinstaller==5.13.2
packaging==24.1
pyinstaller-hooks-contrib==2024.8
pyinstaller==6.11.1
packaging==24.2
pyinstaller-hooks-contrib==2024.10
altgraph==0.17.4
wrapt==1.16.0
setuptools==72.1.0
wrapt==1.17.0
setuptools # List version-less for Python 3.8 to just get latest supported
setuptools==75.6.0; python_version > '3.8'
# Required on 32bit Windows, exclude it based on Python-version
importlib_metadata==8.2.0; python_version < '3.10'
importlib_resources==6.4.0; python_version < '3.10'
zipp==3.20.0; python_version < '3.10'
importlib_metadata==8.5.0; python_version < '3.10'
importlib_resources==6.4.5; python_version < '3.10'
zipp; python_version < '3.10' # List version-less for Python 3.8 to just get latest supported
# orjson does not support 32bit Windows, also exclude based on Python-version
orjson==3.10.7; python_version > '3.8'
orjson==3.10.12; python_version > '3.8'
# For the Windows build
pefile==2023.2.7; sys_platform == 'win32'
pywin32-ctypes==0.2.2; sys_platform == 'win32'
pefile==2024.8.26; sys_platform == 'win32'
pywin32-ctypes==0.2.3; sys_platform == 'win32'
# For the macOS build
dmgbuild==1.6.2; sys_platform == 'darwin'

View File

@@ -92,7 +92,7 @@
<span class="icon-bar"></span>
</button>
<a class="navbar-logo navbar-logo-small" href="${root}" title="$T('Home')">
<a class="navbar-logo navbar-logo-small" href="${root}" title="$T('Home')" data-placement="bottom">
#include $webdir + "/staticcfg/images/logo-small.svg"#
</a>
</div>

View File

@@ -28,7 +28,7 @@
</label>
<div class="advanced-buttonSeperator"></div>
<div class="chart-selector-container" title="$T('selectedDates')">
<div class="chart-selector-container" title="$T('selectedDates')" data-placement="bottom">
<span class="glyphicon glyphicon-signal"></span>
<!--#set today = datetime.date.today()#-->
<input type="date" name="chart-start" id="chart-start" value="<!--#echo (today-datetime.timedelta(days=30)).strftime('%Y-%m-%d')#-->"> -
@@ -142,7 +142,7 @@
</div>
</div>
<!--#set $prio_colors = ["#59cc33", "#3366cc","#7f33cc", "#cc33a6", "#cc3333"] #-->
<!--#set $prio_colors = ["#59cc33", "#26a69a", "#3366cc", "#7f33cc", "#cc33a6", "#f39c12", "#cc3333", "#8d6e63"] #-->
<!--#set $cur_prio_color = -1 #-->
<!--#set $last_prio = -1 #-->
<!--#for $cur, $server in enumerate($servers) #-->
@@ -171,6 +171,9 @@
</table>
<button type="button" class="btn btn-default showserver"><span class="glyphicon glyphicon-pencil"></span> $T('showDetails')</button>
<button type="button" class="btn btn-default clrServer"><span class="glyphicon glyphicon-remove"></span> $T('button-clrServer')</button>
<!--#if $server['notes'] #-->
<p>$server['notes'].replace('\n', '<br>')</p>
<!--#end if#-->
</div>
<div class="col1" style="display:none;">
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
@@ -459,8 +462,8 @@
When finished loading
**/
jQuery(document).ready(function(){
// Exception when change of priority, reload
jQuery('input[name="priority"], input[name="displayname"]').on('change', function() {
// Reload form in case we change items that make the servers appear different
jQuery('input[name="priority"], input[name="displayname"], textarea[name="notes"]').on('change', function() {
jQuery('.fullform').submit(function() {
// No ajax this time
jQuery('input[name="ajax"]').val('')

View File

@@ -71,7 +71,7 @@
<div class="field-pair">
<label class="config" for="field_sort_string_$cur">$T('sortString')</label>
<input type="text" name="sort_string" id="field_sort_string_$cur" value="$slot.sort_string" required="required" />
<button type="button" title="$T('sort-legenda')" class="btn btn-default patternKey" onclick="jQuery('#pattern_explainer_$cur').toggle(); window.scrollBy(0, 500);">
<button type="button" class="btn btn-default patternKey" onclick="jQuery('#pattern_explainer_$cur').toggle(); window.scrollBy(0, 500);">
<span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')
</button>
</div>

View File

@@ -1,3 +1,4 @@
<!DOCTYPE HTML>
<html lang="$active_lang">
<head>
<title>SABnzbd - $T('login')</title>

View File

@@ -165,6 +165,9 @@ input[type="checkbox"]+.desc {
color: #666;
margin: 1em 0;
}
.col2 p {
margin-left: 3px;
}
.field-pair {
padding: 6px;
clear: both;

View File

@@ -262,9 +262,10 @@ function do_restart() {
// Show overlay
$('.main-restarting').show()
// What template
// Check if we need redirect
// Uses == on purpose, because val() returns string and data() returns int!
var switchedHTTPS = ($('#enable_https').is(':checked') === ($('#enable_https').data('original') === undefined))
var portsUnchanged = ($('#port').val() === $('#port').data('original')) && ($('#https_port').val() === $('#https_port').data('original'))
var portsUnchanged = ($('#port').val() == $('#port').data('original')) && ($('#https_port').val() == $('#https_port').data('original'))
// Are we on settings page or did nothing change?
if(!$('body').hasClass('General') || (!switchedHTTPS && portsUnchanged)) {
@@ -489,6 +490,9 @@ $(document).ready(function () {
addRowColor()
}
addRowColor()
// Add tooltips
jQuery('[title]').tooltip()
});
/*

View File

@@ -13,7 +13,7 @@ function ViewModel() {
self.useGlobalOptions = ko.observable(true).extend({ persist: 'useGlobalOptions' });
self.refreshRate = ko.observable(1).extend({ persist: 'pageRefreshRate' });
self.dateFormat = ko.observable('fromNow').extend({ persist: 'pageDateFormat' });
self.displayTabbed = ko.observable().extend({ persist: 'displayTabbed' });
self.displayTabbed = ko.observable(false).extend({ persist: 'displayTabbed' });
self.displayCompact = ko.observable(false).extend({ persist: 'displayCompact' });
self.displayFullWidth = ko.observable(false).extend({ persist: 'displayFullWidth' });
self.confirmDeleteQueue = ko.observable(true).extend({ persist: 'confirmDeleteQueue' });

View File

@@ -30,7 +30,8 @@
<url type="faq">https://sabnzbd.org/wiki/faq</url>
<url type="contact">https://sabnzbd.org/live-chat.html</url>
<releases>
<release version="4.3.3" date="2024-08-20" type="stable"/>
<release version="4.4.0" date="2024-12-09" type="stable"/>
<release version="4.3.3" date="2024-08-01" type="stable"/>
<release version="4.3.2" date="2024-05-30" type="stable"/>
<release version="4.3.1" date="2024-05-03" type="stable"/>
<release version="4.3.0" date="2024-05-01" type="stable"/>

View File

Binary file not shown.

View File

@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Italian (https://app.transifex.com/sabnzbd/teams/111101/it/)\n"
"MIME-Version: 1.0\n"

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.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://app.transifex.com/sabnzbd/teams/111101/nb/)\n"

View File

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

View File

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

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.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://app.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.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://app.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"

View File

@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
@@ -168,6 +168,14 @@ msgstr ""
msgid "Could not connect to %s on port %s. It appears that %s operates as a web server (port 80), possibly an indexer, not a usenet server. You have to fill a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid "Could not connect to %s on port %s. Use the default usenet settings: port 563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid "Could not connect to %s on port %s. Use the default usenet settings: port 119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr ""
@@ -327,6 +335,11 @@ msgstr ""
msgid "Do not use a folder in the application folder as your Scripts Folder, it might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid "The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -399,6 +412,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -868,6 +885,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr ""

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Czech (https://app.transifex.com/sabnzbd/teams/111101/cs/)\n"
@@ -188,6 +188,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Adresa serveru \"%s:%s\" není správná."
@@ -362,6 +374,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -434,6 +452,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Přímé rozbalení"
@@ -929,6 +951,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "Rozbalování selhalo, chyba zápisu nebo plný disk?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Rozbalování selhalo, cesta k souboru je příliš dlouhá."

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Danish (https://app.transifex.com/sabnzbd/teams/111101/da/)\n"
@@ -188,6 +188,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Serveradressen \"%s:%s\" er ikke gyldigt."
@@ -365,6 +377,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -437,6 +455,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -937,6 +959,10 @@ msgstr "Udpakningen fejlede, da filen er for stor til filsystemet (FAT?)"
msgid "Unpacking failed, write error or disk is full?"
msgstr "Udpakning mislykkedes, skrivefejl eller disken fuld?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Udpakningen mislykkedes, stien er for lang"

View File

@@ -14,12 +14,14 @@
# HandyDandy04, 2024
# Safihre <safihre@sabnzbd.org>, 2024
# Gjelbrim Haskaj, 2024
# Stefan Rodriguez Galeano, 2024
# M Z, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Gjelbrim Haskaj, 2024\n"
"Last-Translator: M Z, 2024\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"
@@ -211,6 +213,22 @@ msgstr ""
"als sei %s ein Webserver (Port 80), vielleicht ein Indexer, aber kein "
"Usenet-Server. Trage einen Usenet-Server ein."
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
"Konnte keine Verbindung zu %s auf Port %s herstellen. Verwenden Sie die "
"Standard-Usenet-Einstellungen: Port 563 und aktiviertes SSL."
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
"Konnte keine Verbindung zu %s auf Port %s herstellen. Verwenden Sie die "
"Standard-Usenet-Einstellungen: Port 119 und deaktiviertes SSL."
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Server-Adresse \"%s:%s\" ist ungültig."
@@ -257,7 +275,7 @@ msgstr "Die Verbindung konnte nicht überprüft werden. (%s)"
#: sabnzbd/api.py
msgid "Resolving address"
msgstr "Adresse wird aufgelöst"
msgstr "Adresse wird aufgelöst"
#. No value, used in dropdown menus
#: sabnzbd/api.py, sabnzbd/skintext.py
@@ -401,6 +419,14 @@ msgstr ""
"Verwenden Sie keinen Ordner im Anwendungsordner als Ihren Skriptordner, er "
"könnte während Updates geleert werden."
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
"Die Par2-Anwendung wurde geändert, benutzerdefinierte Par2-Parameter wurden "
"entfernt."
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -477,6 +503,10 @@ msgstr "Entschleiern korrigierte die Erweiterung von %d Datei(en)"
msgid "Deobfuscate renamed %d file(s)"
msgstr "Entschleiern hat %dDatei(en) umbenannt"
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr "Umbenannte Untertiteldatei(en)%d verschleiern"
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Direkt entpacken"
@@ -557,7 +587,7 @@ msgstr "Schwerer Fehler im Downloader"
#. Warning message
#: sabnzbd/downloader.py
msgid "%s@%s: Received unknown status code %s for article %s"
msgstr ""
msgstr "%s@%s:Unbekannter Statuscode%s für Artikel erhalten %s"
#: sabnzbd/downloader.py
msgid "Too many connections to server %s [%s]"
@@ -999,6 +1029,10 @@ msgid "Unpacking failed, write error or disk is full?"
msgstr ""
"Entpacken fehlgeschlagen. Fehler beim Schreiben oder volle Festplatte?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr "Fehler beim Entpacken: Festplatte voll"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Entpacken fehlgeschlagen, Pfad ist zu lang"
@@ -1231,21 +1265,22 @@ msgstr "Prowl-Nachricht konnte nicht versendet werden"
#. Warning message
#: sabnzbd/notifier.py
msgid "Failed to send Apprise message - no URLs defined"
msgstr ""
msgstr "Übertragung der Info-Nachricht fehlgeschlagen - keine URLs definiert"
#. Warning message
#: sabnzbd/notifier.py
msgid "One or more Apprise URLs could not be loaded."
msgstr ""
msgstr "Eine oder mehrere Informations-URLs konnten nicht geladen werden."
#: sabnzbd/notifier.py
msgid "Failed to send one or more Apprise Notifications"
msgstr ""
"Eine oder mehrere Info-Benachrichtigungen konnten nicht gesendet werden"
#. Warning message
#: sabnzbd/notifier.py
msgid "Failed to send Apprise message"
msgstr ""
msgstr "Info-Nachricht konnte nicht gesendet werden"
#. Error message
#: sabnzbd/notifier.py
@@ -2430,7 +2465,7 @@ msgstr "Alle Elemente in der Warteschlange löschen?"
#. Delete confirmation popup
#: sabnzbd/skintext.py
msgid "Are you sure you want to remove these jobs?"
msgstr ""
msgstr "Sind Sie sicher, dass Sie diese Aufträge entfernen wollen?"
#. Queue page button
#: sabnzbd/skintext.py
@@ -2455,7 +2490,7 @@ msgstr "NZBs und Dateien löschen"
#. Checkbox if job should be added to Archive
#: sabnzbd/skintext.py
msgid "Permanently delete (skip archive)"
msgstr ""
msgstr "Endgültig löschen (Archiv überspringen)"
#. Caption for missing articles in Queue
#: sabnzbd/skintext.py
@@ -2478,7 +2513,7 @@ msgstr "Kontingent jetzt zurücksetzen"
#: sabnzbd/skintext.py
msgid "Archive"
msgstr ""
msgstr "Archiv"
#. Button/link hiding History job details
#: sabnzbd/skintext.py
@@ -2503,7 +2538,7 @@ msgstr "Alle anzeigen"
#. Button showing all archived jobs
#: sabnzbd/skintext.py
msgid "Show Archive"
msgstr ""
msgstr "Zeige Archiv"
#. History table header - Size of the download quota
#: sabnzbd/skintext.py
@@ -2796,11 +2831,11 @@ msgstr "Port, auf dem SABnzbd auf Anfragen warten soll."
#: sabnzbd/skintext.py
msgid "Web Interface Theme"
msgstr ""
msgstr "Benutzeroberfläche"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
msgstr "Wählen Sie ein Theme."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
@@ -2971,28 +3006,36 @@ msgstr "Alle Aufträge behalten"
msgid ""
"Move jobs to the archive if the history exceeds specified number of jobs"
msgstr ""
"Verschieben von Aufträgen in das Archiv, wenn der Verlauf die angegebene "
"Anzahl von Aufträgen überschreitet."
#: sabnzbd/skintext.py
msgid ""
"Delete jobs if the history and archive exceeds specified number of jobs"
msgstr ""
"Löschen von Aufträgen, wenn der Verlauf und das Archiv die angegebene Anzahl"
" von Aufträgen überschreiten"
#: sabnzbd/skintext.py
msgid "Move jobs to the archive after specified number of days"
msgstr ""
"Verschieben von Aufträgen in das Archiv nach einer bestimmten Anzahl von "
"Tagen"
#: sabnzbd/skintext.py
msgid ""
"Delete jobs from the history and archive after specified number of days"
msgstr ""
"Löschen von Aufträgen aus der Historie und dem Archiv nach einer bestimmten "
"Anzahl von Tagen"
#: sabnzbd/skintext.py
msgid "Move all completed jobs to archive"
msgstr ""
msgstr "Alle abgeschlossenen Aufträge ins Archiv verschieben"
#: sabnzbd/skintext.py
msgid "Delete all completed jobs"
msgstr ""
msgstr "Alle abgeschlossenen Aufträge löschen"
#: sabnzbd/skintext.py
msgid "Jobs"
@@ -3281,7 +3324,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid "Purge Logs"
msgstr ""
msgstr "Protokolle bereinigen"
#: sabnzbd/skintext.py
msgid ".nzb Backup Folder"
@@ -3406,7 +3449,7 @@ msgstr "Aufgabe abgebrochen (verschoben in die Historie)"
#: sabnzbd/skintext.py
msgid "Abort post-processing"
msgstr ""
msgstr "Nachbearbeitung abbrechen"
#: sabnzbd/skintext.py
msgid "Action when unwanted extension detected"
@@ -3479,7 +3522,7 @@ msgstr ""
#: sabnzbd/skintext.py
msgid "On queue finish script"
msgstr ""
msgstr "Skript zur Beendigung der Warteschlange"
#: sabnzbd/skintext.py
msgid "Executed after the queue finishes downloading."
@@ -4280,26 +4323,32 @@ msgstr "Geräte, welche die Benachrichtigungen empfangen sollen"
#. Apprise settings
#: sabnzbd/skintext.py
msgid "Enable Apprise notifications"
msgstr ""
msgstr "Aktivieren Sie Info-Benachrichtigungen"
#: sabnzbd/skintext.py
msgid "Send notifications using Apprise to almost any notification service"
msgstr ""
"Senden Sie Benachrichtigungen mit Anfragen an fast jeden "
"Benachrichtigungsdienst"
#. Apprise settings
#: sabnzbd/skintext.py
msgid "Default Apprise URLs"
msgstr ""
msgstr "Standard Apprise URLs"
#. Apprise settings
#: sabnzbd/skintext.py
msgid "Use a comma and/or space to identify more than one URL."
msgstr ""
"Verwenden Sie ein Komma und/oder ein Leerzeichen, um mehr als eine URL zu "
"kennzeichnen."
#: sabnzbd/skintext.py
msgid ""
"Override the default URLs for specific notification types below, if desired."
msgstr ""
"Falls gewünscht, können Sie die Standard-URLs für bestimmte "
"Benachrichtigungstypen unten überschreiben."
#. Header for Notification Script notification section
#: sabnzbd/skintext.py
@@ -4798,6 +4847,9 @@ msgid ""
"When you Retry a job, 'Duplicate Detection' and 'Abort jobs that cannot be "
"completed' are disabled."
msgstr ""
"Wenn Sie einen Auftrag wiederholen, sind die Funktionen „Erkennung von "
"Duplikaten“ und „Abbruch von Aufträgen, die nicht abgeschlossen werden "
"können“ deaktiviert."
#: sabnzbd/skintext.py
msgid "View Script Log"
@@ -5032,7 +5084,7 @@ msgstr ""
#. Error message
#: sabnzbd/sorting.py
msgid "Failed to rename %s to %s"
msgstr "Fehler beim umbennenen von %s nach %s"
msgstr "Fehler beim Umbenennen von %s nach %s"
#. Error message
#: sabnzbd/sorting.py

View File

@@ -4,13 +4,14 @@
# Translators:
# Ester Molla Aragones <moarages@gmail.com>, 2020
# 1024mb <angelb2203@gmail.com>, 2023
# Safihre <safihre@sabnzbd.org>, 2023
# Carmen Gonzalez, 2024
# Safihre <safihre@sabnzbd.org>, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2024\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"
@@ -196,6 +197,25 @@ msgid ""
"server (port 80), possibly an indexer, not a usenet server. You have to fill"
" a usenet server."
msgstr ""
"No se pudo conectar a %s en el puerto %s. Parece que %s funciona como un "
"servidor web (puerto 80), posiblemente un indexador, no un servidor Usenet. "
"Debe agregar un servidor Usenet."
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
"No se pudo conectar a %s en el puerto %s. Utilice la configuración de Usenet"
" predeterminada: puerto 563 y SSL activado"
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
"No se pudo conectar a %s en el puerto %s. Utilice la configuración de Usenet"
" predeterminada: puerto 119 y SSL desactivado"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
@@ -345,7 +365,7 @@ msgstr "Dirección del servidor no válida."
#: sabnzbd/cfg.py
msgid "%s is not a valid script"
msgstr ""
msgstr "%s no es un script válido"
#: sabnzbd/cfg.py
msgid "%s is not a correct octal value"
@@ -357,11 +377,13 @@ msgid ""
"Permissions setting of %s might deny SABnzbd access to the files and folders"
" it creates."
msgstr ""
"La configuración de permisos de %s podría negar a SABnzbd el acceso a los "
"archivos y carpetas que crea."
#. Warning message
#: sabnzbd/cfg.py
msgid "Network path \"%s\" should not be used here"
msgstr ""
msgstr "La ruta de red \"%s\" no debe usarse aquí"
#: sabnzbd/cfg.py
msgid "Queue not empty, cannot change folder."
@@ -380,6 +402,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -455,6 +483,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Descomprimir directamente"
@@ -970,6 +1002,10 @@ msgid "Unpacking failed, write error or disk is full?"
msgstr ""
"Error al descomprimir; ¿Error de escritura, o tal vez el disco está lleno?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Aperture de archivo fallo, la via es muy larga"

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Finnish (https://app.transifex.com/sabnzbd/teams/111101/fi/)\n"
@@ -190,6 +190,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Palvelimen osoite \"%s:%s\" ei ole kelvollinen."
@@ -361,6 +373,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -433,6 +451,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -932,6 +954,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "Purkaminen epäonnistui, kirjoitusvirhe tai levy täynnä?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Purkaminen epäonnistui, polku on liian pitkä"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2024\n"
"Language-Team: French (https://app.transifex.com/sabnzbd/teams/111101/fr/)\n"
@@ -203,6 +203,22 @@ msgstr ""
"comme un serveur web (port 80), peut-être un indexeur, et non comme un "
"serveur Usenet. Vous devez spécifier un serveur Usenet."
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
"Impossible de se connecter à %s sur le port %s. Utilisez les paramètres "
"usenet par défaut : port 563 et SSL activés"
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
"Impossible de se connecter à %s sur le port %s. Utilisez les paramètres "
"usenet par défaut : port 119 et SSL désactivés"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "L' adresse du serveur \"%s:%s\" n'est pas valide."
@@ -395,6 +411,14 @@ msgstr ""
"N'utilisez pas un dossier à l'intérieur du dossier de l'application pour y "
"stocker les scripts, il pourrait être vidé lors des mises à jour."
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
"L'application par2 a été changée, tous les paramètres par2 personnalisés ont"
" été supprimés"
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -469,6 +493,10 @@ msgstr "La désobfuscation a corrigé l'extension de %d fichier(s)"
msgid "Deobfuscate renamed %d file(s)"
msgstr "La désobfuscation a renommé %d fichier(s)"
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr "Désobfusquer le(s) fichier(s) de sous-titres renommé(s) %d"
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Décompression Directe"
@@ -994,6 +1022,10 @@ msgid "Unpacking failed, write error or disk is full?"
msgstr ""
"Échec de l'extraction, erreur d'écriture ou espace disque insuffisant ?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr "Échec de l'extraction, disque plein"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Extraction échoué, le chemin est trop long"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: ION, 2024\n"
"Language-Team: Hebrew (https://app.transifex.com/sabnzbd/teams/111101/he/)\n"
@@ -189,6 +189,18 @@ msgstr ""
"לא היה ניתן להתחבר אל %s על פתחה %s. נראה כי %s פועל כשרת רשת (פתחה 80), "
"כנראה מדדן, לא שרת Usenet. אתה חייב למלא שרת Usenet."
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "כתובת השרת \"%s:%s\" אינה תקפה."
@@ -365,6 +377,12 @@ msgstr ""
"אל תשתמש בתיקייה בתוך תיקיית היישום כתיקיית התסריטים שלך, היא עשויה להתרוקן "
"במהלך עדכונים."
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -437,6 +455,10 @@ msgstr "אי־האפלה תיקנה את הסיומת של %d קבצים"
msgid "Deobfuscate renamed %d file(s)"
msgstr "אי־האפלה שינתה שם של %d קבצים"
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "פריקה ישירה"
@@ -940,6 +962,10 @@ msgstr "פריקה נכשלה, קובץ גדול מדי עבור מערכת הק
msgid "Unpacking failed, write error or disk is full?"
msgstr "פריקה נכשלה, שגיאת כתיבה או דיסק מלא?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "פריקה נכשלה, נתיב ארוך מדי"

View File

@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Language-Team: Italian (https://app.transifex.com/sabnzbd/teams/111101/it/)\n"
"MIME-Version: 1.0\n"
@@ -178,6 +178,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr ""
@@ -348,6 +360,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -420,6 +438,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -904,6 +926,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr ""

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\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://app.transifex.com/sabnzbd/teams/111101/nb/)\n"
@@ -186,6 +186,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Serveradressen \"%s:%s\" er ikke gyldig."
@@ -359,6 +371,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -431,6 +449,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -929,6 +951,10 @@ msgstr "Utpakking feilet, filen er for stor for filsystemet (FAT?)"
msgid "Unpacking failed, write error or disk is full?"
msgstr "Utpakking mislyktes, skrivefeil eller er disken full?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Utpakking feilet, stien er for lang"

View File

@@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2024\n"
"Language-Team: Dutch (https://app.transifex.com/sabnzbd/teams/111101/nl/)\n"
@@ -198,6 +198,18 @@ msgstr ""
"functioneert als een webserver (poort 80), mogelijk een indexer, geen "
"usenetserver. Vul een usenetserver in."
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Serveradres \"%s:%s\" is niet geldig."
@@ -386,6 +398,12 @@ msgstr ""
"automatisch verwijderd worden tijdens updates. We adviseren een andere "
"locatie te gebruiken voor je scripts."
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -463,6 +481,10 @@ msgstr "Extensie van %d bestand(en) gecorrigeerd"
msgid "Deobfuscate renamed %d file(s)"
msgstr "Bestandsnamen van %d bestand(en) aangepast."
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Direct Uitpakken"
@@ -983,6 +1005,10 @@ msgstr "Uitplakken mislukt, bestand te groot voor het bestandssysteem (FAT?)"
msgid "Unpacking failed, write error or disk is full?"
msgstr "Uitpakken mislukt, schrijffout of schijf vol?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Uitpakken mislukt, bestandspad is te lang"

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Polish (https://app.transifex.com/sabnzbd/teams/111101/pl/)\n"
@@ -184,6 +184,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Nieprawidłowy adres serwera \"%s:%s\"."
@@ -358,6 +370,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -430,6 +448,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -932,6 +954,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "Rozpakowywanie nie powiodło się, błąd zapisu lub zapełniony dysk?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Rozpakowywanie nie powiodło się, zbyt długa ścieżka"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
@@ -191,6 +191,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Endereço de servidor \"%s:%s\" não é válido."
@@ -370,6 +382,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -444,6 +462,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -944,6 +966,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "A descompactação falhou. Erro de escrita ou disco cheio?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Descompactação falhou, o caminho é muito extenso"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Romanian (https://app.transifex.com/sabnzbd/teams/111101/ro/)\n"
@@ -192,6 +192,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Adresa server \"%s:%s\" nu este validă"
@@ -374,6 +386,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -447,6 +465,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr "Dezarhivare directă"
@@ -955,6 +977,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "Dezarhivare nereuşită, eroare scriere sau disc plin?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Dezarhivare eșuată, calea este prea lungă"

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Russian (https://app.transifex.com/sabnzbd/teams/111101/ru/)\n"
@@ -186,6 +186,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Адрес сервера «%s:%s» является недопустимым."
@@ -358,6 +370,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -430,6 +448,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -928,6 +950,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "Не удалось распаковать: ошибка записи или на диске нет места?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr ""

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Serbian (https://app.transifex.com/sabnzbd/teams/111101/sr/)\n"
@@ -184,6 +184,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Adresa servera \"%s:%s\" je neispravna"
@@ -355,6 +367,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -427,6 +445,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -924,6 +946,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "Neuspašno raspakivanje, greška u pisanju ili je disk pun?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Neuspešno raspakivanje, putanja je predugačka"

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2023\n"
"Language-Team: Swedish (https://app.transifex.com/sabnzbd/teams/111101/sv/)\n"
@@ -185,6 +185,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "Serveradressen \"%s:%s\" är ej giltig."
@@ -355,6 +367,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -428,6 +446,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -926,6 +948,10 @@ msgstr ""
msgid "Unpacking failed, write error or disk is full?"
msgstr "Uppackning misslyckades, skrivfel eller disken full?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "Uppackning misslyckades, sökvägen är för lång"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Kangwei Li <lkw20010211@gmail.com>, 2023\n"
"Language-Team: Chinese (China) (https://app.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
@@ -183,6 +183,18 @@ msgid ""
" a usenet server."
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"563 and SSL turned on"
msgstr ""
#: sabnzbd/api.py
msgid ""
"Could not connect to %s on port %s. Use the default usenet settings: port "
"119 and SSL turned off"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Server address \"%s:%s\" is not valid."
msgstr "服务器地址 \"%s:%s\" 无效。"
@@ -353,6 +365,12 @@ msgid ""
"might be emptied during updates."
msgstr ""
#. Warning message
#: sabnzbd/cfg.py
msgid ""
"The par2 application was switched, any custom par2 parameters were removed"
msgstr ""
#. Warning message
#: sabnzbd/config.py
msgid "Configuration locked, cannot save settings"
@@ -425,6 +443,10 @@ msgstr ""
msgid "Deobfuscate renamed %d file(s)"
msgstr ""
#: sabnzbd/deobfuscate_filenames.py
msgid "Deobfuscate renamed %d subtitle file(s)"
msgstr ""
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
msgid "Direct Unpack"
msgstr ""
@@ -919,6 +941,10 @@ msgstr "解压失败,文件太大文件系统不支持 (FAT?)"
msgid "Unpacking failed, write error or disk is full?"
msgstr "解压失败,写入出错或磁盘已满?"
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, disk full"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Unpacking failed, path is too long"
msgstr "解压失败,路径过长"

View File

@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\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

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\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://app.transifex.com/sabnzbd/teams/111101/cs/)\n"

View File

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

View File

@@ -9,7 +9,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Lorenz B, 2024\n"
"Language-Team: German (https://app.transifex.com/sabnzbd/teams/111101/de/)\n"

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\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://app.transifex.com/sabnzbd/teams/111101/es/)\n"

View File

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

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2024\n"
"Language-Team: French (https://app.transifex.com/sabnzbd/teams/111101/fr/)\n"

View File

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

View File

@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta2\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Italian (https://app.transifex.com/sabnzbd/teams/111101/it/)\n"
"MIME-Version: 1.0\n"

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\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://app.transifex.com/sabnzbd/teams/111101/nb/)\n"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-4.3.3Beta2\n"
"Project-Id-Version: SABnzbd-4.4.0Beta1\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Petter Ramme, 2024\n"
"Language-Team: Swedish (https://app.transifex.com/sabnzbd/teams/111101/sv/)\n"

View File

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

View File

@@ -1,54 +1,54 @@
# Main requirements
# Note that not all sub-dependencies are listed, but only ones we know could cause trouble
apprise==1.8.1
apprise==1.9.0
sabctools==8.2.5
CT3==3.3.3.post1
cffi==1.17.0
CT3==3.4.0b6
cffi==1.17.1
pycparser==2.22
feedparser==6.0.11
configobj==5.0.8
configobj==5.0.9
cheroot==10.0.1
six==1.16.0
cherrypy==18.10.0
jaraco.functools==4.0.2
jaraco.functools==4.1.0
jaraco.collections==5.0.0
jaraco.text==3.8.1 # Newer version introduces irrelevant extra dependencies
jaraco.classes==3.4.0
jaraco.context==4.3.0
more-itertools==10.4.0
more-itertools==10.5.0
zc.lockfile==3.0.post1
python-dateutil==2.9.0.post0
tempora==5.7.0
pytz==2024.1
pytz==2024.2
sgmllib3k==1.0.0
portend==3.2.0
chardet==5.2.0
PySocks==1.7.1
puremagic==1.27
puremagic==1.28
guessit==3.8.0
babelfish==0.6.1
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==43.0.0
cryptography==44.0.0
# 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.10.0
# Windows system integration
pywin32==306; sys_platform == 'win32'
windows-toasts==1.2.0; sys_platform == 'win32' and python_version > '3.8'
winrt-runtime==2.1.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.Data.Xml.Dom==2.1.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.Foundation==2.1.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.Foundation.Collections==2.1.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.UI.Notifications==2.1.0; sys_platform == 'win32' and python_version > '3.8'
pywin32==308; sys_platform == 'win32'
windows-toasts==1.3.0; sys_platform == 'win32' and python_version > '3.8'
winrt-runtime==2.3.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.Data.Xml.Dom==2.3.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.Foundation==2.3.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.Foundation.Collections==2.3.0; sys_platform == 'win32' and python_version > '3.8'
winrt-Windows.UI.Notifications==2.3.0; sys_platform == 'win32' and python_version > '3.8'
# macOS system calls
pyobjc-core==10.3.1; sys_platform == 'darwin'
pyobjc-framework-Cocoa==10.3.1; sys_platform == 'darwin'
pyobjc-core==10.3.2; sys_platform == 'darwin'
pyobjc-framework-Cocoa==10.3.2; sys_platform == 'darwin'
# Linux notifications
notify2==0.3.1; sys_platform != 'win32' and sys_platform != 'darwin'
@@ -57,17 +57,19 @@ notify2==0.3.1; sys_platform != 'win32' and sys_platform != 'darwin'
requests==2.32.3
requests-oauthlib==2.0.0
PyYAML==6.0.2
markdown==3.6
markdown==3.7
paho-mqtt==1.6.1 # Pinned, newer versions don't work with AppRise yet
# Requests Requirements
charset_normalizer==3.3.2
idna==3.7
urllib3==2.2.2
certifi==2024.7.4
charset_normalizer==3.4.0
idna==3.10
urllib3==2.2.3
certifi==2024.8.30
oauthlib==3.2.2
PyJWT==2.9.0
blinker==1.8.2
PyJWT # List version-less for Python 3.8 to just get latest supported
PyJWT==2.10.1; python_version > '3.8'
blinker # List version-less for Python 3.8 to just get latest supported
blinker==1.9.0; python_version > '3.8'
# Optional support for *nix tray icon.
# Note that pygobject depends on pycairo, which requires pkg-config and cairo headers.

View File

@@ -249,6 +249,7 @@ def initialize(pause_downloader=False, clean_up=False, repair=0):
cfg.web_port.callback(cfg.guard_restart)
cfg.web_dir.callback(cfg.guard_restart)
cfg.web_color.callback(cfg.guard_restart)
cfg.url_base.callback(trigger_restart)
cfg.username.callback(cfg.guard_restart)
cfg.password.callback(cfg.guard_restart)
cfg.log_dir.callback(cfg.guard_restart)
@@ -274,30 +275,8 @@ def initialize(pause_downloader=False, clean_up=False, repair=0):
# Set end-of-queue action
sabnzbd.misc.change_queue_complete_action(cfg.queue_complete(), new=False)
# Convert auto-sort
if cfg.auto_sort() == "0":
cfg.auto_sort.set("")
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)
# Convert duplicate settings
if cfg.no_series_dupes():
cfg.no_smart_dupes.set(cfg.no_series_dupes())
cfg.no_series_dupes.set(0)
# Convert history retention setting
if cfg.history_retention():
misc.convert_history_retention()
cfg.history_retention.set("")
# Add hostname to the whitelist
if not cfg.host_whitelist():
cfg.host_whitelist.set(socket.gethostname())
# Do any config conversions
cfg.config_conversions()
# Do repair if requested
if misc.check_repair_request():
@@ -319,10 +298,6 @@ def initialize(pause_downloader=False, clean_up=False, repair=0):
# Run startup tasks
sabnzbd.NzbQueue.read_queue(repair)
sabnzbd.Scheduler.analyse(pause_downloader)
# Set cache limit for new users
if not cfg.cache_limit():
cfg.cache_limit.set(misc.get_cache_limit())
sabnzbd.ArticleCache.new_limit(cfg.cache_limit.get_int())
logging.info("All processes started")

View File

@@ -1317,15 +1317,39 @@ def test_nntp_server_dict(kwargs: Dict[str, Union[str, List[str]]]) -> Tuple[boo
# All exceptions are caught internally
test_server.request_addrinfo_blocking()
if not test_server.addrinfo:
# Try if we can connect on port 80 (so web server), forcing a short timeout
test_server.port = 80
test_server.timeout = DEF_NETWORKING_TEST_TIMEOUT
test_server.request_addrinfo_blocking()
if test_server.addrinfo:
# so NNTP connection was tried, but did not succeed: no addrinfo. Possible causes:
# - user has filled out an indexer as newsserver. Not good.
# - user has filled out a weird port on which there is no newsserver
# - generic network problem (?)
test_server.timeout = DEF_NETWORKING_TEST_TIMEOUT # force a short timeout
# let's try well-known ports: HTTP and NTTP(S)
port_working = {80: False, 119: False, 563: False}
for port_to_check in port_working:
# Don't re-check if it was already tried by user
if port_to_check != port:
test_server.port = port_to_check
test_server.request_addrinfo_blocking()
port_working[port_to_check] = bool(test_server.addrinfo)
if not port_working[119] and not port_working[563] and port_working[80]:
# That's a webserver, not a newsserver!
return False, T(
"Could not connect to %s on port %s. It appears that %s operates as a web server (port 80), "
"possibly an indexer, not a usenet server. You have to fill a usenet server."
) % (host, port, host)
elif port not in (119, 563):
# User specified a weird port, so check if regular ones do work
if port_working[563]:
return False, T(
"Could not connect to %s on port %s. Use the default usenet settings: port 563 and SSL turned on"
) % (host, port)
if port_working[119]:
return False, T(
"Could not connect to %s on port %s. Use the default usenet settings: port 119 and SSL turned off"
) % (host, port)
# Sorry, no clever analysis:
return False, T('Server address "%s:%s" is not valid.') % (host, port)
try:

View File

@@ -115,9 +115,11 @@ def validate_single_tag(value: List[str]) -> Tuple[None, List[str]]:
return None, value
def validate_strip_right_slash(value: str) -> Tuple[None, str]:
"""Strips the right slash"""
if value:
def validate_url_base(value: str) -> Tuple[None, str]:
"""Strips the right slash and adds starting slash, if not present"""
if value and isinstance(value, str):
if not value.startswith("/"):
value = "/" + value
return None, value.rstrip("/")
return None, value
@@ -277,6 +279,9 @@ def validate_default_if_empty(root: str, value: str, default: str) -> Tuple[None
# Special settings
##############################################################################
# Increase everytime we do a configuration conversion
config_conversion_version = OptionNumber("misc", "config_conversion_version", default_val=0)
# This should be here so it's initialized first when the config is read
helpful_warnings = OptionBool("misc", "helpful_warnings", True)
@@ -443,7 +448,7 @@ start_paused = OptionBool("misc", "start_paused", False)
preserve_paused_state = OptionBool("misc", "preserve_paused_state", False)
enable_par_cleanup = OptionBool("misc", "enable_par_cleanup", True)
process_unpacked_par2 = OptionBool("misc", "process_unpacked_par2", True)
enable_multipar = OptionBool("misc", "enable_multipar", True)
disable_par2cmdline = OptionBool("misc", "disable_par2cmdline", False)
enable_unrar = OptionBool("misc", "enable_unrar", True)
enable_7zip = OptionBool("misc", "enable_7zip", True)
enable_filejoin = OptionBool("misc", "enable_filejoin", True)
@@ -486,7 +491,7 @@ wait_ext_drive = OptionNumber("misc", "wait_ext_drive", 5, minval=1, maxval=60)
max_foldername_length = OptionNumber("misc", "max_foldername_length", DEF_FOLDER_MAX, minval=20, maxval=65000)
marker_file = OptionStr("misc", "nomedia_marker")
ipv6_servers = OptionBool("misc", "ipv6_servers", True)
url_base = OptionStr("misc", "url_base", "/sabnzbd", validation=validate_strip_right_slash)
url_base = OptionStr("misc", "url_base", "", validation=validate_url_base)
host_whitelist = OptionList("misc", "host_whitelist", validation=all_lowercase)
local_ranges = OptionList("misc", "local_ranges", protect=True)
max_url_retries = OptionNumber("misc", "max_url_retries", 10, minval=1)
@@ -691,7 +696,9 @@ def set_root_folders2():
##############################################################################
def new_limit():
"""Callback for article cache changes"""
sabnzbd.ArticleCache.new_limit(cache_limit.get_int())
if sabnzbd.__INITIALIZED__:
# Only update after full startup
sabnzbd.ArticleCache.new_limit(cache_limit.get_int())
def guard_restart():
@@ -732,3 +739,63 @@ def guard_language():
def guard_https_ver():
"""Callback for change of https verification"""
sabnzbd.misc.set_https_verification(enable_https_verification())
##############################################################################
# Conversions
##############################################################################
def config_conversions():
"""Update sections of the config, only once"""
# Basic old conversions
if config_conversion_version() < 1:
logging.info("Config conversion set 1")
# Convert auto-sort
if auto_sort() == "0":
auto_sort.set("")
elif auto_sort() == "1":
auto_sort.set("avg_age asc")
# Convert old series/date/movie sorters
if not sorters_converted():
sabnzbd.misc.convert_sorter_settings()
sorters_converted.set(True)
# Convert duplicate settings
if no_series_dupes():
no_smart_dupes.set(no_series_dupes())
no_series_dupes.set(0)
# Convert history retention setting
if history_retention():
sabnzbd.misc.convert_history_retention()
history_retention.set("")
# Add hostname to the whitelist
if not host_whitelist():
host_whitelist.set(socket.gethostname())
# Set cache limit for new users
if not cache_limit():
cache_limit.set(sabnzbd.misc.get_cache_limit())
# Done
config_conversion_version.set(1)
# url_base conversion
if config_conversion_version() < 2:
# We did not end up applying this conversion, so we skip this conversion_version
logging.info("Config conversion set 2")
config_conversion_version.set(2)
# Switch to par2cmdline-turbo on Windows
if config_conversion_version() < 3:
logging.info("Config conversion set 3")
if sabnzbd.WIN32 and par_option():
# Just empty it, so we don't pass the wrong parameters
logging.warning(T("The par2 application was switched, any custom par2 parameters were removed"))
par_option.set("")
# Done
config_conversion_version.set(3)

View File

@@ -120,7 +120,8 @@ class Option:
"""Set new value, no validation"""
global CFG_MODIFIED
if value is not None:
if isinstance(value, list) or isinstance(value, dict) or value != self.__value:
# Use get() to make sure we use default if nothing was set yet
if isinstance(value, list) or isinstance(value, dict) or value != self.get():
self.__value = value
CFG_MODIFIED = True
if self.__callback:

View File

@@ -35,7 +35,7 @@ from sabnzbd.constants import DB_HISTORY_NAME, STAGES, Status, PP_LOOKUP
from sabnzbd.bpsmeter import this_week, this_month
from sabnzbd.decorators import synchronized
from sabnzbd.encoding import ubtou, utob
from sabnzbd.misc import caller_name, opts_to_pp, to_units, bool_conv
from sabnzbd.misc import caller_name, opts_to_pp, to_units, bool_conv, match_str
from sabnzbd.filesystem import remove_file, clip_path
DB_LOCK = threading.Lock()
@@ -129,7 +129,7 @@ class HistoryDB:
logging.error(T("Cannot write to History database, check access rights!"))
# Report back success, because there's no recovery possible
return True
elif "not a database" in error or "malformed" in error or "duplicate column name" in error:
elif match_str(error, ("not a database", "malformed", "no such table", "duplicate column name")):
logging.error(T("Damaged History database, created empty replacement"))
logging.info("Traceback: ", exc_info=True)
self.close()
@@ -141,7 +141,7 @@ class HistoryDB:
self.connect()
# Return False in case of "duplicate column" error
# because the column addition in connect() must be terminated
return "duplicate column name" not in error
return True
else:
logging.error(T("SQL Command Failed, see log"))
logging.info("SQL: %s", command)
@@ -604,6 +604,5 @@ def unpack_history_info(item: sqlite3.Row) -> Dict[str, Any]:
def scheduled_history_purge():
logging.info("Scheduled history purge")
with HistoryDB() as history_db:
history_db.auto_history_purge()

View File

@@ -92,7 +92,7 @@ def decode(article: Article, data_view: memoryview):
sabnzbd.Downloader.pause()
# This article should be fetched again
sabnzbd.NzbQueue.reset_try_lists(article)
article.allow_new_fetcher()
return
except BadData as error:

View File

@@ -27,7 +27,6 @@ files to the job-name in the queue if the filename looks obfuscated
Based on work by P1nGu1n
"""
import hashlib
import logging
import os
@@ -169,21 +168,29 @@ def is_probably_obfuscated(myinputfilename: str) -> bool:
return True # default is obfuscated
def first_file_is_much_bigger(filelist):
# returns True if first file is much bigger than second file
# Note: input parameter filelist must ordered on size!
def get_biggest_file(filelist: List[str]) -> str:
"""Returns biggest file if that file is much bigger than the other files
If only one file exists, return that. If no file, return None
Note: the files in filelist must exist, because their sizes on disk are checked"""
# sort from big to small
filelist = sorted(filelist, key=os.path.getsize)[::-1] # reversed, so big to small. Format [start:stop:step]
try:
factor = os.path.getsize(filelist[0]) / os.path.getsize(filelist[1])
if factor > 3:
return True
return filelist[0]
else:
return False
except:
# no second file at all
return True
if len(filelist) == 1:
# the only file, so biggest
return filelist[0]
else:
# no existing file(s)
return None
def deobfuscate(nzo, filelist: List[str], usefulname: str):
def deobfuscate(nzo, filelist: List[str], usefulname: str) -> List[str]:
"""
For files in filelist:
1. if a file has no meaningful extension, add it (for example ".txt" or ".png")
@@ -225,69 +232,60 @@ def deobfuscate(nzo, filelist: List[str], usefulname: str):
nzo: sabnzbd.nzbstuff.NzbObject
# to be sure, only keep really existing files and remove any duplicates:
filelist = set(f for f in filelist if os.path.isfile(f))
filtered_filelist = list(set(f for f in filelist if os.path.isfile(f)))
# Do not deobfuscate/rename anything if there is a typical DVD or Bluray directory:
ignored_movie_folders_with_dir_sep = tuple(os.path.sep + f + os.path.sep for f in IGNORED_MOVIE_FOLDERS)
match_ignored_movie_folders = [f for f in filelist if match_str(f, ignored_movie_folders_with_dir_sep)]
match_ignored_movie_folders = [f for f in filtered_filelist if match_str(f, ignored_movie_folders_with_dir_sep)]
if match_ignored_movie_folders:
logging.info(
"Skipping deobfuscation because of DVD/Bluray directory name(s), like: %s",
str(match_ignored_movie_folders)[:200],
)
nzo.set_unpack_info("Deobfuscate", T("Deobfuscate skipped due to DVD/Bluray directories"))
return
return filtered_filelist
# If needed, add a useful extension (by looking at file contents)
# Example: if 'kjladsflkjadf.adsflkjads' is probably a PNG, rename to 'kjladsflkjadf.adsflkjads.png'
newlist = []
new_filelist = []
nr_ext_renamed = 0
for file in filelist:
for file in filtered_filelist:
if file_extension.has_popular_extension(file):
# common extension, like .doc or .iso, so assume OK and change nothing
logging.debug("Extension of %s looks common", file)
newlist.append(file)
new_filelist.append(file)
else:
# uncommon (so: obfuscated) extension
new_extension_to_add = file_extension.what_is_most_likely_extension(file)
if new_extension_to_add:
if new_extension_to_add := file_extension.what_is_most_likely_extension(file):
new_name = get_unique_filename("%s%s" % (file, new_extension_to_add))
logging.info("Deobfuscate renaming (adding extension) %s to %s", file, new_name)
renamer(file, new_name)
newlist.append(new_name)
# Use output of renamer, just in case it's somehow modified by sanitization
new_filelist.append(renamer(file, new_name))
nr_ext_renamed += 1
else:
# no new extension found
newlist.append(file)
new_filelist.append(file)
if nr_ext_renamed:
nzo.set_unpack_info("Deobfuscate", T("Deobfuscate corrected the extension of %d file(s)") % nr_ext_renamed)
filelist = newlist
filtered_filelist = new_filelist
logging.debug("Trying to see if there are qualifying files to be deobfuscated")
nr_files_renamed = 0
# We pick the biggest file ... probably the most important file
# so sort filelist on size:
filelist = sorted(filelist, key=os.path.getsize, reverse=True)
if filelist:
biggest_file = filelist[0]
else:
biggest_file = None
if not biggest_file or not os.path.isfile(biggest_file):
logging.debug("Trying to see if there are qualifying files to be deobfuscated")
if not (biggest_file := get_biggest_file(filtered_filelist)) or not os.path.isfile(biggest_file):
# no file found, which is weird
logging.info("No file given, or not found (%s)", biggest_file)
return
logging.info("No biggest file found, or not found (%s)", biggest_file)
return filtered_filelist
logging.debug("Deobfuscate inspecting biggest file%s", biggest_file)
if not first_file_is_much_bigger(filelist):
logging.debug("%s excluded from deobfuscation because it is not much bigger than other file(s)", biggest_file)
return
if get_ext(biggest_file) in EXCLUDED_FILE_EXTS:
logging.debug("%s excluded from deobfuscation because of excluded extension", biggest_file)
return
return filtered_filelist
if not is_probably_obfuscated(biggest_file):
logging.debug("%s excluded from deobfuscation because filename does not look obfuscated", biggest_file)
return
return filtered_filelist
# if we get here, the biggest_file is relatively big, has no excluded extension, and is obfuscated
# Rename the biggest_file and make sure the new filename is unique
@@ -295,20 +293,89 @@ def deobfuscate(nzo, filelist: List[str], usefulname: str):
# construct new_name: <path><usefulname><extension>
new_name = get_unique_filename("%s%s" % (os.path.join(path, usefulname), get_ext(biggest_file)))
logging.info("Deobfuscate renaming %s to %s", biggest_file, new_name)
renamer(biggest_file, new_name)
filtered_filelist.remove(biggest_file)
filtered_filelist.append(renamer(biggest_file, new_name))
nr_files_renamed += 1
# Now find other files with the same basename in filelist, and rename them in the same way:
basedirfile = get_basename(biggest_file) # something like "/home/this/myiso"
for otherfile in filelist:
for otherfile in filtered_filelist[:]:
if otherfile.startswith(basedirfile) and os.path.isfile(otherfile):
# yes, same basedirfile, only different ending
remaining_ending = otherfile.replace(basedirfile, "") # might be long ext, like ".dut.srt" or "-sample.iso"
new_name = get_unique_filename("%s%s" % (os.path.join(path, usefulname), remaining_ending))
logging.info("Deobfuscate renaming %s to %s", otherfile, new_name)
# Rename and make sure the new filename is unique
renamer(otherfile, new_name)
filtered_filelist.remove(otherfile)
filtered_filelist.append(renamer(otherfile, new_name))
nr_files_renamed += 1
if nr_files_renamed:
nzo.set_unpack_info("Deobfuscate", T("Deobfuscate renamed %d file(s)") % nr_files_renamed)
return filtered_filelist
def without_extension(fullpathfilename: str) -> str:
"""Returns full file path, without extension
So '/some/dir/somefile.bin' results in '/some/dir/somefile'"""
return os.path.splitext(fullpathfilename)[0]
def deobfuscate_subtitles(nzo, filelist: List[str]):
"""
input:
nzo, so we can update result via set_unpack_info()
filelist must be a List of existing filenames
Find .srt subtitle files, and rename to match the biggest file (if there is a clearly biggest file)
Some_Big_File_2024.avi # biggest file
Some_Big_File_2024.srt # no renaming wanted
Some_Big_File_2024.ger.srt # no renaming wanted
14_English.srt # to be renamed
dut.srt # to be renamed
Something.else.txt # no renaming wanted, because no .srt
will result in
Some_Big_File_2024.avi
Some_Big_File_2024.srt
Some_Big_File_2024.ger.srt
Some_Big_File_2024.14_English.srt # renamed by prepending base name
Some_Big_File_2024.dut.srt # renamed by prepending base name
Something.else.txt
"""
# Can't be imported directly due to circular import
nzo: sabnzbd.nzbstuff.NzbObject
# find .srt files
if not (srt_files := [f for f in filelist if f.endswith(".srt")]):
logging.debug("No .srt files found, so nothing to do")
return None
# check there is a clearly biggest file
if not (biggest_file := get_biggest_file(filelist)):
logging.debug("No clearly biggest file found, so no subtitle renaming feasible")
return None
biggest_file_without_ext = without_extension(biggest_file) # get full path base name of biggest file
logging.debug(f"Using as base filename: {biggest_file_without_ext}")
# handle srt files one by one
nr_files_renamed = 0
for srt_file in srt_files:
if without_extension(srt_file).startswith(biggest_file_without_ext):
# already the same start as the biggest file, so skip
continue
# not the same start, so rename the srt file
nr_files_renamed += 1
filename_only = os.path.basename(srt_file) # like "14_English.srt", so without path
# now put that name after the base name of the biggestfile:
new_full_name = f"{biggest_file_without_ext}.{filename_only}" # put (renamed) srt behind that
unique_filename = get_unique_filename(new_full_name) # make sure it's really unique
renamer(srt_file, unique_filename) # ... and rename actual file on disk
if nr_files_renamed > 0:
# and put it into history to be shown in GUI
nzo.set_unpack_info("Deobfuscate", T("Deobfuscate renamed %d subtitle file(s)") % nr_files_renamed)

View File

@@ -214,7 +214,7 @@ class DirectUnpacker(threading.Thread):
"in the encrypted file",
"CRC failed",
"checksum failed",
"You need to start extraction from a previous volume",
"not enough space on the disk",
"password is incorrect",
"Incorrect password",
"Write error",

View File

@@ -165,11 +165,12 @@ class Server:
self.reset_article_queue()
def stop(self):
"""Remove all connections from server"""
"""Remove all connections and cached articles from server"""
for nw in self.idle_threads:
sabnzbd.Downloader.remove_socket(nw)
nw.hard_reset()
self.idle_threads = set()
self.reset_article_queue()
@synchronized(DOWNLOADER_LOCK)
def get_article(self):
@@ -195,10 +196,13 @@ class Server:
self.next_article_search = time.time() + _SERVER_CHECK_DELAY
return None
@synchronized(DOWNLOADER_LOCK)
def reset_article_queue(self):
logging.debug("Resetting article queue for %s", self)
"""Reset articles queued for the Server. Locked to prevent
articles getting stuck in the Server when enabled/disabled"""
logging.debug("Resetting article queue for %s (%s)", self, self.article_queue)
for article in self.article_queue:
sabnzbd.NzbQueue.reset_try_lists(article)
article.allow_new_fetcher()
self.article_queue = []
def request_addrinfo(self):
@@ -211,7 +215,7 @@ class Server:
def request_addrinfo_blocking(self):
"""Blocking attempt to run getaddrinfo() and Happy Eyeballs for specified server"""
logging.debug("Retrieving server address information for %s", self.host)
logging.debug("Retrieving server address information for %s", self)
# Disable IPV6 if desired
family = socket.AF_UNSPEC
@@ -229,7 +233,7 @@ class Server:
sabnzbd.Downloader.wakeup()
def __repr__(self):
return "<Server: %s:%s>" % (self.host, self.port)
return "<Server: id=%s, host=%s:%s>" % (self.id, self.host, self.port)
class Downloader(Thread):
@@ -329,7 +333,6 @@ class Downloader(Thread):
create = False
server.newid = newserver
server.restart = True
server.reset_article_queue()
self.server_restarts += 1
break
@@ -487,7 +490,7 @@ class Downloader(Thread):
# Optional and active server had too many problems.
# Disable it now and send a re-enable plan to the scheduler
if server.optional and server.active and (server.bad_cons / server.threads) > 3:
if server.optional and server.active and (server.threads < 1 or (server.bad_cons / server.threads) > 3):
# Deactivate server
server.bad_cons = 0
server.deactivate()
@@ -965,9 +968,9 @@ class Downloader(Thread):
self.decode(nw.article)
nw.article.tries = 0
else:
# Allow all servers again on this server
# Allow all servers again for this article
# Do not use the article_queue, as the server could already have been disabled when we get here!
sabnzbd.NzbQueue.reset_try_lists(nw.article)
nw.article.allow_new_fetcher()
# Reset connection object
nw.hard_reset(wait)

View File

@@ -70,10 +70,12 @@ class AddrInfo:
canonname: str
sockaddr: Union[Tuple[str, int], Tuple[str, int, int, int]]
ipaddress: str = ""
port: int = 0
def __post_init__(self):
# For easy access
self.ipaddress = self.sockaddr[0]
self.port = self.sockaddr[1]
def family_type(family) -> str:
@@ -98,16 +100,18 @@ def do_socket_connect(result_queue: queue.Queue, addrinfo: AddrInfo, timeout: in
s.connect(addrinfo.sockaddr)
result_queue.put(addrinfo)
logging.debug(
"Happy Eyeballs connected to %s (%s) in %dms",
"Happy Eyeballs connected to %s (%s, port=%d) in %dms",
addrinfo.ipaddress,
addrinfo.canonname,
addrinfo.port,
1000 * (time.time() - start),
)
except socket.error:
logging.debug(
"Happy Eyeballs failed to connect to %s (%s) in %dms",
"Happy Eyeballs failed to connect to %s (%s, port=%d) in %dms",
addrinfo.ipaddress,
addrinfo.canonname,
addrinfo.port,
1000 * (time.time() - start),
)
finally:

View File

@@ -395,9 +395,8 @@ def Raiser(root: str = "", **kwargs):
if kwargs:
root = "%s?%s" % (root, urllib.parse.urlencode(kwargs))
# Optionally add the leading /sabnzbd/ (or what the user set)
if not root.startswith(cfg.url_base()):
root = cherrypy.request.script_name + root
# Add the leading /sabnzbd/ (or what the user set)
root = cfg.url_base() + root
# Log the redirect
if cfg.api_logging():
@@ -642,7 +641,7 @@ class LoginPage:
# Check if there's even a username/password set
if check_login():
raise Raiser(cherrypy.request.script_name + "/")
raise Raiser("/")
# Check login info
if kwargs.get("username") == cfg.username() and kwargs.get("password") == cfg.password():
@@ -651,7 +650,7 @@ class LoginPage:
# Log the success
logging.info("Successful login from %s", cherrypy.request.remote_label)
# Redirect
raise Raiser(cherrypy.request.script_name + "/")
raise Raiser("/")
elif kwargs.get("username") or kwargs.get("password"):
info["error"] = T("Authentication failed, check username/password.")
# Warn about the potential security problem
@@ -844,7 +843,7 @@ SPECIAL_BOOL_LIST = (
"api_warnings",
"helpful_warnings",
"ampm",
"enable_multipar",
"disable_par2cmdline",
"enable_unrar",
"enable_7zip",
"enable_filejoin",

View File

@@ -734,6 +734,7 @@ def rar_extract_core(
extracted = []
rarfiles = []
fail = 0
requires_kill = False
inrecovery = False
lines = []
@@ -789,6 +790,14 @@ def rar_extract_core(
nzo.set_unpack_info("Unpack", msg, setname)
fail = 1
elif line.startswith("There is not enough space on the disk"):
msg = T("Unpacking failed, disk full")
nzo.fail_msg = msg
nzo.set_unpack_info("Unpack", msg, setname)
fail = 1
# After this is a line that requires user input ([R]etry, [A]bort), which hangs, so we need a kill
requires_kill = True
elif line.startswith("Cannot create"):
line2 = p.stdout.readline()
if "must not exceed 260" in line2:
@@ -799,7 +808,7 @@ def rar_extract_core(
nzo.set_unpack_info("Unpack", msg, setname)
fail = 1
# Kill the process (can stay in endless loop on Windows Server)
p.kill()
requires_kill = True
elif line.startswith("ERROR: "):
nzo.fail_msg = line
@@ -844,9 +853,10 @@ def rar_extract_core(
extracted.append(real_path(extraction_path, unpacked_file))
if fail:
if p.stdout:
p.stdout.close()
p.wait()
if requires_kill:
p.kill()
else:
p.wait()
logging.debug("UNRAR output: \n%s", "\n".join(lines))
return fail, [], []
@@ -1059,7 +1069,7 @@ def par2_repair(nzo: NzbObject, setname: str) -> Tuple[bool, bool]:
joinables, _, _, _ = build_filelists(nzo.download_path, check_rar=False)
# Multipar on Windows, par2cmdline on the other platforms
if cfg.enable_multipar() and sabnzbd.WIN32:
if cfg.disable_par2cmdline() and sabnzbd.WIN32:
finished, readd, used_joinables, used_for_repair = multipar_verify(parfile, nzo, setname, joinables)
else:
finished, readd, used_joinables, used_for_repair = par2cmdline_verify(parfile, nzo, setname, joinables)
@@ -1150,13 +1160,7 @@ def par2cmdline_verify(
else:
# Normal case, everything is named after set
wildcard = setname + "*"
if sabnzbd.MACOS or sabnzbd.WIN32:
command.append(os.path.join(parfolder, wildcard))
else:
# For Unix systems, remove folders, due to bug in some par2cmdline versions
flist = [item for item in globber_full(parfolder, wildcard) if os.path.isfile(item)]
command.extend(flist)
command.append(os.path.join(parfolder, wildcard))
# We need to check for the bad par2cmdline that skips blocks
# Or the one that complains about basepath

View File

@@ -669,16 +669,6 @@ class NzbQueue:
except:
return -1
@staticmethod
def reset_try_lists(article: Article, remove_fetcher_from_trylist: bool = True):
"""Let article get new fetcher and reset trylists"""
if remove_fetcher_from_trylist:
article.remove_from_try_list(article.fetcher)
article.fetcher = None
article.tries = 0
article.nzf.reset_try_list()
article.nzf.nzo.reset_try_list()
def has_forced_jobs(self) -> bool:
"""Check if the queue contains any Forced
Priority jobs to download while paused
@@ -885,7 +875,7 @@ class NzbQueue:
logging.info("Found idle job %s", nzo.final_name)
empty.append(nzo)
# Stall prevention by checking if all servers are in the trylist
# Stall prevention by checking if all servers are in the try list
# This is a CPU-cheaper alternative to prevent stalling
if nzo.all_servers_in_try_list(active_servers):
# Maybe the NZF's need a reset too?
@@ -904,7 +894,7 @@ class NzbQueue:
logging.info("Resetting bad trylist for file %s in job %s", nzf.filename, nzo.final_name)
nzf.reset_try_list()
# Reset main trylist, minimal performance impact
# Reset main try list, minimal performance impact
logging.info("Resetting bad trylist for job %s", nzo.final_name)
nzo.reset_try_list()

View File

@@ -111,7 +111,7 @@ RE_RAR = re.compile(r"(\.rar|\.r\d\d|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d)$", re.I)
# Trylist
##############################################################################
TRYLIST_LOCK = threading.Lock()
TRYLIST_LOCK = threading.RLock()
class TryList:
@@ -203,12 +203,25 @@ class Article(TryList):
self.crc32: Optional[int] = None
self.nzf: NzbFile = nzf
@synchronized(TRYLIST_LOCK)
def reset_try_list(self):
"""In addition to resetting the try list, also reset fetcher so all servers are tried again"""
"""In addition to resetting the try list, also reset fetcher so all servers
are tried again. Locked so fetcher setting changes are also protected."""
self.fetcher = None
self.fetcher_priority = 0
super().reset_try_list()
@synchronized(TRYLIST_LOCK)
def allow_new_fetcher(self, remove_fetcher_from_try_list: bool = True):
"""Let article get new fetcher and reset try lists of file and job.
Locked so all resets are performed at once"""
if remove_fetcher_from_try_list:
self.remove_from_try_list(self.fetcher)
self.fetcher = None
self.tries = 0
self.nzf.reset_try_list()
self.nzf.nzo.reset_try_list()
def get_article(self, server: Server, servers: List[Server]):
"""Return article when appropriate for specified server"""
if self.fetcher or self.server_in_try_list(server):
@@ -249,7 +262,7 @@ class Article(TryList):
if server.priority >= self.fetcher.priority:
self.tries = 0
# Allow all servers for this nzo and nzf again (but not this fetcher for this article)
sabnzbd.NzbQueue.reset_try_lists(self, remove_fetcher_from_trylist=False)
self.allow_new_fetcher(remove_fetcher_from_try_list=False)
return True
logging.info("Article %s unavailable on all servers, discarding", self.article)
@@ -276,17 +289,6 @@ class Article(TryList):
self.fetcher_priority = 0
self.tries = 0
def __eq__(self, other):
"""Articles with the same usenet address are the same"""
return self.article == other.article
def __hash__(self):
"""Required because we implement eq. Articles with the same
usenet address can appear in different NZF's. So we make every
article object unique, even though it is bad practice.
"""
return id(self)
def __repr__(self):
return "<Article: article=%s, bytes=%s, art_id=%s>" % (self.article, self.bytes, self.art_id)
@@ -431,8 +433,11 @@ class NzbFile(TryList):
self.add_to_try_list(server)
return articles
@synchronized(TRYLIST_LOCK)
def reset_all_try_lists(self):
"""Clear all lists of visited servers"""
"""Reset all try lists. Locked so reset is performed
for all items at the same time without chance of another
thread changing any of the items while we are resetting"""
for art in self.articles:
art.reset_try_list()
self.reset_try_list()
@@ -481,10 +486,12 @@ class NzbFile(TryList):
"""Assume it's the same file if the number bytes and first article
are the same or if there are no articles left, use the filenames.
Some NZB's are just a mess and report different sizes for the same article.
We used to compare (__eq__) articles based on article-ID, however, this failed
because some NZB's had the same article-ID twice within one NZF.
"""
if other and (self.bytes == other.bytes or len(self.decodetable) == len(other.decodetable)):
if self.decodetable and other.decodetable:
return self.decodetable[0] == other.decodetable[0]
return self.decodetable[0].article == other.decodetable[0].article
# Fallback to filename comparison
return self.filename == other.filename
return False
@@ -1001,7 +1008,11 @@ class NzbObject(TryList):
except:
logging.debug("The lastrar swap did not go well")
@synchronized(TRYLIST_LOCK)
def reset_all_try_lists(self):
"""Reset all try lists. Locked so reset is performed
for all items at the same time without chance of another
thread changing any of the items while we are resetting"""
for nzf in self.files:
nzf.reset_all_try_lists()
self.reset_try_list()
@@ -1212,7 +1223,7 @@ class NzbObject(TryList):
# Abort the job due to failure
if not job_can_succeed:
self.fail_msg = T("Aborted, cannot be completed") + " - https://sabnzbd.org/not-complete"
self.set_unpack_info("Download", self.fail_msg, unique=False)
self.set_unpack_info("Download", self.fail_msg)
logging.debug('Abort job "%s", due to impossibility to complete it', self.final_name)
return True, True, True
@@ -1442,7 +1453,7 @@ class NzbObject(TryList):
@synchronized(NZO_LOCK)
def add_parfile(self, parfile: NzbFile) -> bool:
"""Add parfile to the files to be downloaded
Resets trylist just to be sure
Resets try list just to be sure
Adjust download-size accordingly
Returns False when the file couldn't be added
"""

View File

@@ -486,12 +486,12 @@ def process_job(nzo: NzbObject) -> bool:
if all_ok:
# Move any (left-over) files to destination
nzo.status = Status.MOVING
nzo.set_action_line(T("Moving"), "...")
for root, _, files in os.walk(nzo.download_path):
if not root.endswith(JOB_ADMIN):
for file in files:
path = os.path.join(root, file)
new_path = path.replace(nzo.download_path, tmp_workdir_complete)
nzo.set_action_line(T("Moving"), file)
ok, new_path = move_to_path(path, new_path)
if new_path:
newfiles.append(new_path)
@@ -573,7 +573,9 @@ def process_job(nzo: NzbObject) -> bool:
if cfg.deobfuscate_final_filenames():
# Deobfuscate the filenames
logging.info("Running deobfuscate")
deobfuscate.deobfuscate(nzo, newfiles, nzo.final_name)
newfiles = deobfuscate.deobfuscate(nzo, newfiles, nzo.final_name)
# Deobfuscate the subtitles
deobfuscate.deobfuscate_subtitles(nzo, newfiles)
# Run the user script
if script_path := make_script_path(script):

View File

@@ -6,5 +6,5 @@
# You MUST use double quotes (so " and not ')
# Do not forget to update the appdata file for every major release!
__version__ = "4.3.3"
__baseline__ = "157dfc928d2a4fef13182ea64ab8d0b533d677c4"
__version__ = "4.4.0"
__baseline__ = "c6dc25c9c2d3285ff949d0a7fdc3506908cfdefc"

View File

@@ -134,6 +134,7 @@ def run_sabnews_and_selenium(request):
# Headless during CI testing
if "CI" in os.environ:
driver_options.browser_version = "127"
driver_options.add_argument("--headless")
driver_options.add_argument("--no-sandbox")

View File

@@ -7,7 +7,7 @@ strict:
stages:
- name: get_files format (json)
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: get_files
@@ -39,7 +39,7 @@ strict:
stages:
- name: get_files format (xml)
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: get_files

View File

@@ -7,7 +7,7 @@ strict:
stages:
- name: history format empty
request:
url: http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api
url: http://{SAB_HOST}:{SAB_PORT}/api
method: GET
params:
mode: history
@@ -38,7 +38,7 @@ test_name: Check empty history format (xml output)
stages:
- name: history format empty
request:
url: http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api
url: http://{SAB_HOST}:{SAB_PORT}/api
method: GET
params:
mode: history

View File

@@ -7,7 +7,7 @@ strict:
stages:
- name: history format single entry
request:
url: http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api
url: http://{SAB_HOST}:{SAB_PORT}/api
method: GET
params:
mode: history
@@ -70,7 +70,7 @@ test_name: Check general history format (xml output)
stages:
- name: history format single entry
request:
url: http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api
url: http://{SAB_HOST}:{SAB_PORT}/api
method: GET
params:
mode: history
@@ -145,7 +145,7 @@ strict:
stages:
- name: history slot count
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: history

View File

@@ -7,7 +7,7 @@ strict:
stages:
- name: queue format empty
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: queue
@@ -61,7 +61,7 @@ test_name: Check empty queue format (xml output)
stages:
- name: queue format empty
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: queue

View File

@@ -7,7 +7,7 @@ strict:
stages:
- name: queue format single entry
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: queue
@@ -81,7 +81,7 @@ test_name: Check general queue format (xml output)
stages:
- name: queue format single entry
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: queue

View File

@@ -7,7 +7,7 @@ strict:
stages:
- name: server_stats (json output)
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: server_stats
@@ -31,7 +31,7 @@ stages:
- name: server_stats (xml output)
request:
url: "http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api"
url: "http://{SAB_HOST}:{SAB_PORT}/api"
method: GET
params:
mode: server_stats

View File

@@ -7,7 +7,7 @@ strict:
stages:
- name: version (json output)
request:
url: http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api
url: http://{SAB_HOST}:{SAB_PORT}/api
method: GET
params:
mode: version
@@ -22,7 +22,7 @@ stages:
- name: version (xml output)
request:
url: http://{SAB_HOST}:{SAB_PORT}/sabnzbd/api
url: http://{SAB_HOST}:{SAB_PORT}/api
method: GET
params:
mode: version

View File

@@ -1,5 +1,5 @@
# Testing requirements
pytest==7.4.4
pytest
setuptools
selenium
requests

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