You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
parse_api_datetime() and datetime_type now return timezone-aware UTC values instead of naive ones. Plugins comparing them against naive datetimes raise TypeError, and .isoformat() output gains a +00:00 suffix (#266)
Changed
API timestamps, library date filters and voucher deadlines are now timezone-aware UTC; naive --start-date/--end-date input is interpreted as UTC, as the option help already stated (#266)
Replaced datetime.utcnow() and datetime.utcfromtimestamp(), deprecated since Python 3.12 (#266)
Without --ignore-errors, the download command now really aborts on the first failure: running downloads finish, queued ones are skipped (#235)
The download command exits non-zero when a download job raised an error, also with --ignore-errors. Failures that are only logged, such as an unknown ASIN or a download rejected by its HTTP status, still exit zero for now (#256)
--jobs now rejects values below 1 instead of accepting 0, which queued work that no consumer would ever pick up (#235)
Fixed
Accept API timestamps with and without fractional seconds, fixing the --start-date/--end-date crash on podcast episodes and the mirror-image crash in is_published() (#264)
Keep items whose date cannot be determined instead of crashing with an AttributeError, when a date filter is active and an item carries no library_status (#268)
Skip the voucher refresh check when refresh_date is empty or null rather than only when the key is absent, instead of raising a TypeError (#268)
Treat an unknown publication_datetime as published rather than crashing, and let ItemNotPublished report the ASIN without a countdown when no usable date is available (#268)
Reach LicenseDenied and NoDownloadUrl as intended when license_denial_reasons, content_metadata or content_url are null, instead of raising a TypeError or AttributeError (#268)
audible manage config edit no longer crashes with TypeError: 'PosixPath' object is not iterable; click.edit() accepts a str or an iterable of them, but not a pathlib.Path (#248)
The download command no longer hangs forever after failed downloads. A failing job killed its consumer, and once every --jobs consumer had died the queue was never drained (#235, #239)