Breaking
parse_api_datetime()anddatetime_typenow return timezone-aware UTC values instead of naive ones. Plugins comparing them against naive datetimes raiseTypeError, and.isoformat()output gains a+00:00suffix (#266)
Changed
- API timestamps, library date filters and voucher deadlines are now timezone-aware UTC; naive
--start-date/--end-dateinput is interpreted as UTC, as the option help already stated (#266) - Replaced
datetime.utcnow()anddatetime.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) --jobsnow rejects values below 1 instead of accepting0, 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-datecrash on podcast episodes and the mirror-image crash inis_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 nolibrary_status(#268) - Skip the voucher refresh check when
refresh_dateis empty or null rather than only when the key is absent, instead of raising aTypeError(#268) - Treat an unknown
publication_datetimeas published rather than crashing, and letItemNotPublishedreport the ASIN without a countdown when no usable date is available (#268) - Reach
LicenseDeniedandNoDownloadUrlas intended whenlicense_denial_reasons,content_metadataorcontent_urlare null, instead of raising aTypeErrororAttributeError(#268) audible manage config editno longer crashes withTypeError: 'PosixPath' object is not iterable;click.edit()accepts astror an iterable of them, but not apathlib.Path(#248)- The download command no longer hangs forever after failed downloads. A failing job killed its consumer, and once every
--jobsconsumer had died the queue was never drained (#235, #239)