Skip to content

v4.1 — written by other people

Choose a tag to compare

@LeyckerS LeyckerS released this 12 Aug 01:22
· 26 commits to main since this release

Every entry in this release came from an outside contributor. Two are bugs you can hit in normal use; the rest make the project harder to break by accident.

Two you can hit

A full destination disk now stops the run. ENOSPC was handled like any other transfer error, so the queue kept going and the retry machinery kept re-fetching data that could never be written — on the run that reported it, 46 files each downloading for ~236s before failing, roughly 12 GB pulled off the network and discarded, with nothing on screen saying why. It is now detected by errno and treated as a run-level fatal state: intake and retries stop, active transfers unwind at their next write boundary, and the live log names the folder and the shortfall. Interrupted files keep their .tmp and stay resumable, and only the URL that triggered it is recorded as failed. Thanks to @shard872 (#116, #150).

Stop interrupts downloads already in flight. It used to set a flag and close Chrome while a transfer that had already started ran to completion — on a large file the button appeared to do nothing for minutes. Each active download's kill event is now signalled directly, and a user-initiated stop is recorded as stopped rather than as a stall kill, so the retry path cannot re-queue the file and undo it. The partial .tmp is kept and failed_links.txt is not written for a run you ended yourself. Thanks to @Allen58562 (#65, #149).

The rest

  • The CLI reports the run's outcome in its exit code — 0 all succeeded, 1 some failed, 3 every URL failed, 2 a pre-flight problem. It previously exited 0 whether one file failed or all of them did. Note that the two pre-flight errors moved from 1 to 2, matching argparse; a script testing for 1 specifically needs updating. Thanks to @AdvaitVarhade (#32, #153).
  • ruff runs once per pull request instead of once inside each of five Python versions, checking identical work every time. The pinned version is unchanged. Thanks to @nightcityblade (#81, #158).
  • A test assertion that could not fail — shared by four tests, comparing a fabricated number against itself through two of them. Thanks to @XEDAB (#155, #157).
  • The test suite could have made real network requests — one stub sat outside the loop that patches both front-ends, so the engine held the real downloader. Thanks to @XEDAB (#160, #162).
  • pytest.ini, the project's first pytest configuration, silencing one deprecation by exact message rather than by category. Thanks to @Divesh-Kshirsagar (#151, #161).
  • The dead THEME palette is gone from moon_engine.py — residue from when the engine was generated from a tkinter GUI. Thanks to @AashishGupta2007 (#145, #159).

Upgrading

Nothing to do beyond pulling. No new dependencies, no settings changed, and the interface is unchanged since 3.0. The only behaviour change to be aware of is the CLI pre-flight exit code moving from 1 to 2.

Full detail, with the reasoning behind each fix, is in CHANGELOG.md.