Repository navigation
Releases: PyXiion/PxSteamDL
Releases · PyXiion/PxSteamDL
Release list
v0.4.0
Added
- Release workflow publishes the wheels and sdist to PyPI (trusted publishing).
Fixed
- On Linux/macOS, item lock files are removed on normal release, including error and cancellation unwinding.
Waiters validate the locked inode and reopen an unlinked file before entering; Windows keeps persistent locks.
A crash or failed unlink may still leave a reusable lock file. Stop older clients before upgrading: versions
without inode validation must not download to the same destination concurrently with this version.
v0.3.0
Fixed
- Failed updates preserve the previous item even when a file becomes a directory or a whole-file hash fails after
other files were verified. Items are staged separately, then installed with rollback on ordinary rename errors. - Cancellation during the last in-flight chunk, an up-to-date item's progress callback or a legacy request is checked
before installation. Legacy progress callback failures preserve the old file too. - Concurrent downloads of the same destination wait for a persistent
.<item id>.lockwith the owner's PID and a
kernel lock. Waiting supports cancellation; process exit releases the lock and the next owner replaces stale PID data.
Added
examples/: programs using the whole C++, Python and asyncio API.pxsteamdl::Version(), thePXSTEAMDL_VERSION_*macros (<pxsteamdl/version.hpp>),pxsteamdl --versionand
pxsteamdl.__version__.cmake --installandfind_package(PxSteamDL): headers, the CLI, and one static archive that already contains
curl, mbedTLS, zlib, liblzma and zstd.- Transient failures are retried up to four times with exponential backoff (0.5 s, 1 s, 2 s): item details, the CDN
server list, depot keys, manifest request codes, legacy files and the CM server list. After a transient failure
(HTTP 429/5xx, a network error) CDN downloads pause before they try the next host. Pauses end when the download is
cancelled. - Steam's result codes are spelled out:
Steam rejected the item: not found (EResult 9)instead ofSteam result 9. ErrorKind(kNone,kCancelled,kNotFound,kRejected,kNetwork,kData,kFilesystem,kOther) in
Result::error_kindandItemInfo::error_kind, so callers need not parse messages;pxsteamdl::Error(a
std::runtime_errorwithkind()) is whatClient's constructor throws. Python:ErrorKind,Error,
Result.error_kind,ItemInfo.error_kind.Result::ok(),Result::cancelled(),ItemInfo::ok(),ItemInfo::cancelled()(Python propertiesokand
cancelled;Result.okexisted).ClientOptions(C++) andClient(proxy=, connect_timeout=, stall_timeout=)(Python): a proxy, a connect timeout and
a stall timeout for all connections.Result::downloaded_bytesandunpacked_bytes: what a run fetched for the item, over the network and on disk.Clientcan be moved. Python:Result,ItemInfoandProgresscan be constructed (keyword arguments), for tests.pxsteamdl -h/--help(exit code 0) and--(the rest are item IDs).- Unit tests (GoogleTest,
-DPXSTEAMDL_BUILD_TESTS=ON), including end-to-end tests ofClientagainst a pretend
Steam; the network smoke tests run in CI again, on all three platforms.
Changed
- Breaking:
Progress::bytes_doneandbytes_totalare replaced bydownloaded_bytes/downloaded_total(what came
over the network: encrypted, compressed chunks) andunpacked_bytes/unpacked_total(what was decrypted,
decompressed and written). The old pair counted the unpacked bytes, sounpacked_*is the drop-in replacement. Same
in Python. - Behavior change:
download()returns oneResultper entry of the ID list, also for a repeated ID: the item is
downloaded once and every occurrence gets the same result. Before, a repeated ID made two jobs write the same
directory at once, and one of them could fail. - Behavior change:
download()throwsstd::invalid_argumentifparallel_itemsorthreads_per_itemis 0
(the CLI refuses-j 0and-t 0with exit code 2); before, 0 was taken as 1. Python already raisedValueError. Result::pathis documented: it isroot/<id>for every item, failed ones included. An exception thrown by
on_progressfails its item (kindkOther), one thrown byon_resolvedpropagates out ofdownload(); both are
now documented.- Item details are looked up in batches while earlier items already download, instead of all before the first byte.
on_resolvedis still called once per item, in order, on the thread that calleddownload(), but progress of
earlier items may now arrive before it. - Behavior change: a failed item-details request no longer throws out of
download(). The items of the failed
batch carry the error inResult.error(item details: ...), and the other items are downloaded. Items that were
not looked up before a stop request reportcancelled. - A depot key reply that succeeds without a key now says so, instead of reporting
EResult 1. - The source is split into modules, one header each, and follows the style described in
CONTRIBUTING.md; nothing changes for users.
v0.2.0
v0.1.1
What's Changed
- Review fixes: fair item scheduling, CM reconnect, fd limits, case-insensitive paths by @PyXiion in #2
Full Changelog: v0.1.0...v0.1.1
v0.1.0
What's Changed
- Cross-platform support (Linux, macOS, Windows), CPM vendored dependencies, and Python wheels by @PyXiion in #1
New Contributors
Full Changelog: https://github.com/PyXiion/PxSteamDL/commits/v0.1.0