Compare commits

...

8 Commits

Author SHA1 Message Date
mnightingale
47e71912d5 Ignore all OSError from FakeNNTPServer (#3309) 2026-02-06 18:18:18 +01:00
mnightingale
b90be6e35a Allow new fetcher for stuck articles (#3308) 2026-02-06 18:17:32 +01:00
mnightingale
4e7a70c5e7 Fix server retention not always applied (#3304)
* Fix server retention not always applied

* Comment why safe to discard remaining queue and not check retention for each
2026-02-06 13:04:16 +01:00
Safihre
9fc2215fc8 Skip orjson on Python 3.9 2026-02-06 12:01:31 +01:00
Safihre
cba63c0c3e No longer specify cryptography version
To support win_arm64 again
See https://github.com/pyca/cryptography/pull/14216
2026-02-06 12:01:30 +01:00
renovate[bot]
2b62846122 Update all dependencies 2026-02-05 19:13:22 +00:00
thezoggy
cb5030d152 bump mac to build with python 3.14.3 (#3307) 2026-02-05 20:12:49 +01:00
thezoggy
499e9639e9 unrar 7.20 (#3306) 2026-02-05 20:12:23 +01:00
9 changed files with 23 additions and 25 deletions

View File

@@ -32,10 +32,11 @@ jobs:
cache-dependency-path: "**/requirements.txt"
- name: Install Python dependencies
# Without dependencies to make sure everything is covered in the requirements.txt
# Special cryptography is due to https://github.com/pyca/cryptography/pull/14216
run: |
python --version
python -m pip install --upgrade pip wheel
pip install --upgrade -r requirements.txt --no-dependencies
pip install --upgrade -r requirements.txt --no-dependencies --only-binary=cryptography
pip install --upgrade -r builder/requirements.txt --no-dependencies
- name: Build Windows standalone binary
id: windows_binary
@@ -101,7 +102,7 @@ jobs:
# We need the official Python, because the GA ones only support newer macOS versions
# The deployment target is picked up by the Python build tools automatically
# If updated, make sure to also set LSMinimumSystemVersion in SABnzbd.spec
PYTHON_VERSION: "3.14.2"
PYTHON_VERSION: "3.14.3"
MACOSX_DEPLOYMENT_TARGET: "10.15"
# We need to force compile for universal2 support
CFLAGS: -arch x86_64 -arch arm64

View File

@@ -4,7 +4,7 @@ pyinstaller==6.18.0
packaging==26.0
pyinstaller-hooks-contrib==2026.0
altgraph==0.17.5
wrapt==2.0.1
wrapt==2.1.1
setuptools==80.10.2
# For the Windows build

View File

Binary file not shown.

View File

Binary file not shown.

View File

@@ -33,12 +33,13 @@ 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==46.0.3
# Using older versions can have security implications!
cryptography>=3.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.11.0
orjson==3.11.5
orjson==3.11.7; python_version > '3.9'
# Windows system integration
pywin32==311; sys_platform == 'win32'
@@ -71,7 +72,7 @@ idna==3.11
urllib3==2.6.3
certifi==2026.1.4
oauthlib==3.3.1
PyJWT==2.10.1
PyJWT==2.11.0
blinker==1.9.0
# Optional support for *nix tray icon.

View File

@@ -188,8 +188,12 @@ class Server:
if self.article_queue:
article = self.article_queue[0] if peek else self.article_queue.popleft()
# Mark expired articles as tried on this server
if not peek and self.retention and article.nzf.nzo.avg_stamp < time.time() - self.retention:
sabnzbd.Downloader.decode(article)
if self.retention and article.nzf.nzo.avg_stamp < time.time() - self.retention:
if not peek:
sabnzbd.Downloader.decode(article)
# sabnzbd.NzbQueue.get_articles stops after each nzo with articles.
# As a result, if one article is out of retention, all remaining
# entries in article_queue will also be out of retention.
while self.article_queue:
sabnzbd.Downloader.decode(self.article_queue.pop())
else:

View File

@@ -899,31 +899,23 @@ class NzbQueue:
nzo.increase_bad_articles_counter("missing_articles")
sabnzbd.NzbQueue.register_article(article, success=False)
logging.info("Resetting bad trylist for file %s in job %s", nzf.filename, nzo.final_name)
nzf.reset_try_list()
if not nzf.assembled and not nzf.articles:
logging.debug("Not assembled but no remaining articles for file %s", nzf.filename)
if not nzf.assembled and (next_article := nzf.assembler_next_article):
logging.debug(
"Next article to assemble for file %s is %s, decoded: %s, on_disk: %s, decoded_size: %s",
"Next article to assemble for file %s is %s, decoded: %s, on_disk: %s, decoded_size: %s, has_fetcher: %s, tries: %s",
nzf.filename,
next_article,
next_article.decoded,
next_article.on_disk,
next_article.decoded_size,
next_article.fetcher is not None,
next_article.tries,
)
for article in nzo.first_articles.copy():
logging.debug(
"First article for file %s is %s, decoded: %s, on_disk: %s, decoded_size: %s, has_fetcher: %s, tries: %s",
article.nzf.filename,
article,
article.decoded,
article.on_disk,
article.decoded_size,
article.fetcher is not None,
article.tries,
)
if not next_article.decoded and not next_article.on_disk:
next_article.allow_new_fetcher()
logging.info("Resetting bad trylist for file %s in job %s", nzf.filename, nzo.final_name)
nzf.reset_try_list()
# Reset main try list, minimal performance impact
logging.info("Resetting bad trylist for job %s", nzo.final_name)

View File

@@ -57,8 +57,8 @@ class FakeNNTPServer:
conn, addr = self.server_socket.accept()
self.connections.append(conn)
threading.Thread(target=self._handle_client, args=(conn,), daemon=True).start()
except socket.timeout:
continue
except OSError:
pass
def _handle_client(self, conn):
try:

View File

Binary file not shown.