mirror of
https://github.com/sabnzbd/sabnzbd.git
synced 2026-01-07 15:08:04 -05:00
Compare commits
104 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
708fad33f3 | ||
|
|
c6dc25c9c2 | ||
|
|
07be38cd01 | ||
|
|
0121e0ae16 | ||
|
|
6f9bf68528 | ||
|
|
5a48301d25 | ||
|
|
d1d3e27dea | ||
|
|
2f1805123a | ||
|
|
f05c82b3a7 | ||
|
|
1fe01f2724 | ||
|
|
a5239808eb | ||
|
|
00a7b4fffc | ||
|
|
0c5010f5c1 | ||
|
|
a8b33e7686 | ||
|
|
0294e01fae | ||
|
|
c2621f56eb | ||
|
|
ebac7707ff | ||
|
|
26adade8be | ||
|
|
dd9c7488c6 | ||
|
|
754b862a29 | ||
|
|
0ddf343bb7 | ||
|
|
7a8a45b811 | ||
|
|
66c525ef95 | ||
|
|
7cd3e50ded | ||
|
|
d5094e1aa6 | ||
|
|
bca9559783 | ||
|
|
0cbb8af7a0 | ||
|
|
afab90ca68 | ||
|
|
92ecfc4930 | ||
|
|
b064f112cd | ||
|
|
629da51be7 | ||
|
|
0fa0f7286c | ||
|
|
6cd8f3e333 | ||
|
|
ff18fe03e9 | ||
|
|
a1e30d19e3 | ||
|
|
3d74c19f41 | ||
|
|
33a831e87c | ||
|
|
7b04917f0e | ||
|
|
2f62b76279 | ||
|
|
bd43bca1cf | ||
|
|
d200f0a618 | ||
|
|
c5314569db | ||
|
|
001e215b7d | ||
|
|
3a628a0025 | ||
|
|
7e48207fbc | ||
|
|
48a6d6b289 | ||
|
|
21f05ad3d9 | ||
|
|
d93c861eb3 | ||
|
|
fb0ef21768 | ||
|
|
277679ef53 | ||
|
|
e7e47bbcb0 | ||
|
|
65ffb5ca81 | ||
|
|
6cf308e441 | ||
|
|
870fa40c91 | ||
|
|
39d9eaec2a | ||
|
|
6fd4d0882c | ||
|
|
32591f7c46 | ||
|
|
6b47d1126d | ||
|
|
53df39dd12 | ||
|
|
b5d33fc17c | ||
|
|
8a517b668e | ||
|
|
67135ba4c8 | ||
|
|
c9efda1889 | ||
|
|
250869c242 | ||
|
|
844650e6be | ||
|
|
6685c72894 | ||
|
|
154a5e4989 | ||
|
|
93d302c9d7 | ||
|
|
f664df7f05 | ||
|
|
8fbf50292b | ||
|
|
f3fed43022 | ||
|
|
2d323ba18c | ||
|
|
1ec30a56e1 | ||
|
|
b98f3a07dd | ||
|
|
46170ffb3d | ||
|
|
5e8b41be5a | ||
|
|
47a2d5387d | ||
|
|
1e61239933 | ||
|
|
aedbf35be8 | ||
|
|
cf9540842b | ||
|
|
9205b9161b | ||
|
|
07b64b4abb | ||
|
|
c56145e424 | ||
|
|
ef11aba166 | ||
|
|
fcf03e9a59 | ||
|
|
6662065bb1 | ||
|
|
4973672892 | ||
|
|
efa73a52e1 | ||
|
|
82098a6228 | ||
|
|
07250aa355 | ||
|
|
46caa8b33f | ||
|
|
b0564c1bab | ||
|
|
3c8a85ff35 | ||
|
|
656c329912 | ||
|
|
983253908c | ||
|
|
cef0eeb25b | ||
|
|
a9eace759f | ||
|
|
ad0e7bf5df | ||
|
|
bea348232a | ||
|
|
1519dbc554 | ||
|
|
297455cd35 | ||
|
|
56b68024db | ||
|
|
09aa09a55b | ||
|
|
f1d134fe2e |
5
.github/renovate.json
vendored
5
.github/renovate.json
vendored
@@ -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": [
|
||||
{
|
||||
|
||||
24
.github/workflows/build_release.yml
vendored
24
.github/workflows/build_release.yml
vendored
@@ -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: |
|
||||
|
||||
10
.github/workflows/integration_testing.yml
vendored
10
.github/workflows/integration_testing.yml
vendored
@@ -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
|
||||
|
||||
65
README.mkd
65
README.mkd
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"},
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
PyGithub==2.3.0
|
||||
praw==7.7.1
|
||||
PyGithub==2.5.0
|
||||
praw==7.8.1
|
||||
@@ -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:
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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('')
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="$active_lang">
|
||||
<head>
|
||||
<title>SABnzbd - $T('login')</title>
|
||||
|
||||
@@ -165,6 +165,9 @@ input[type="checkbox"]+.desc {
|
||||
color: #666;
|
||||
margin: 1em 0;
|
||||
}
|
||||
.col2 p {
|
||||
margin-left: 3px;
|
||||
}
|
||||
.field-pair {
|
||||
padding: 6px;
|
||||
clear: both;
|
||||
|
||||
@@ -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()
|
||||
});
|
||||
|
||||
/*
|
||||
|
||||
@@ -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' });
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
BIN
osx/7zip/7zz
BIN
osx/7zip/7zz
Binary file not shown.
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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á."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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ä"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 "פריקה נכשלה, נתיב ארוך מדי"
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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ă"
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 "解压失败,路径过长"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user