Skip to content

Release v0.5.0

Latest

Choose a tag to compare

@github-actions github-actions released this 05 Aug 21:27
v0.5.0
af7e9cb

Breaking

  • 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)