https://bugs.gentoo.org/952317 https://github.com/beetbox/audioread/issues/144 https://github.com/beetbox/audioread/pull/148 (Cherrypicked) From 1ddd63b3ba6bcb11ef993c7da18db0fc83af84b7 Mon Sep 17 00:00:00 2001 From: Brian McFee Date: Wed, 29 Jan 2025 12:51:27 -0500 Subject: [PATCH 1/4] implemented flexible legacy codec handling --- a/audioread/rawread.py +++ b/audioread/rawread.py @@ -13,11 +13,10 @@ # included in all copies or substantial portions of the Software. """Uses standard-library modules to read AIFF, AIFF-C, and WAV files.""" -import aifc import audioop import struct -import sunau import wave +import warnings from .exceptions import DecodeError from .base import AudioFile @@ -54,20 +53,13 @@ def byteswap(s): class RawAudioFile(AudioFile): """An AIFF, WAV, or Au file that can be read by the Python standard library modules ``wave``, ``aifc``, and ``sunau``. + + On Python 3.13 and later, ``aifc`` and ``sunau`` support require + installing the ``standard-aifc`` and ``standard-sunau`` packages, respectively. """ def __init__(self, filename): self._fh = open(filename, 'rb') - try: - self._file = aifc.open(self._fh) - except aifc.Error: - # Return to the beginning of the file to try the next reader. - self._fh.seek(0) - else: - self._needs_byteswap = True - self._check() - return - try: self._file = wave.open(self._fh) except wave.Error: @@ -78,15 +70,38 @@ class RawAudioFile(AudioFile): self._check() return + # The following are deprecated formats and may not be supported try: - self._file = sunau.open(self._fh) - except sunau.Error: - self._fh.seek(0) - pass + import aifc + except ImportError: + warnings.warn("aifc module not found; AIFF files will not be supported. " + "You may need to install the standard-aifc package.") else: - self._needs_byteswap = True - self._check() - return + try: + self._file = aifc.open(self._fh) + except aifc.Error: + # Return to the beginning of the file to try the next reader. + self._fh.seek(0) + else: + self._needs_byteswap = True + self._check() + return + + try: + import sunau + except ImportError: + warnings.warn("sunau module not found; Au files will not be supported. " + "You may need to install the standard-sunau package.") + else: + try: + self._file = sunau.open(self._fh) + except sunau.Error: + self._fh.seek(0) + pass + else: + self._needs_byteswap = True + self._check() + return # None of the three libraries could open the file. self._fh.close() --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ authors = [ {name = "Adrian Sampson", email = "adrian@radbox.org"} ] readme = "README.rst" -requires-python = ">=3.6" +requires-python = ">=3.8" dynamic = ["version", "description"] urls.Home = "https://github.com/beetbox/audioread" classifiers = [ @@ -19,9 +19,15 @@ classifiers = [ 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', ] [project.optional-dependencies] test = [ "tox" ] +legacy = [ + "standard-aifc; python_version >= '3.13'", + "standard-sunau; python_version >= '3.13'" +] -- 2.49.0 From d761d0c9df6ca423aa7e69c27d0946c1d9c7b5d3 Mon Sep 17 00:00:00 2001 From: Brian McFee Date: Mon, 3 Feb 2025 12:17:55 -0500 Subject: [PATCH 2/4] added audioop-lts dependency for modern python installs --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,9 @@ authors = [ ] readme = "README.rst" requires-python = ">=3.8" +requires = [ + "audioop-lts; python_version >= '3.13'" +] dynamic = ["version", "description"] urls.Home = "https://github.com/beetbox/audioread" classifiers = [ -- 2.49.0 From a7d86b7c2a22489a58d0ff9dc3e0b7608aa25914 Mon Sep 17 00:00:00 2001 From: Brian McFee Date: Mon, 3 Feb 2025 12:29:58 -0500 Subject: [PATCH 3/4] updated readme --- a/README.rst +++ b/README.rst @@ -8,8 +8,8 @@ currently supports: - `Core Audio`_ on Mac OS X via `ctypes`_. (PyObjC not required.) - `MAD`_ via the `pymad`_ bindings. - `FFmpeg`_ or `Libav`_ via its command-line interface. -- The standard library `wave`_, `aifc`_, and `sunau`_ modules (for - uncompressed audio formats). +- The standard library `wave`_ module (for + uncompressed audio formats). Legacy formats `aifc`_ and `sunau`_ are also optionally supported, see the note below. .. _Gstreamer: http://gstreamer.freedesktop.org/ .. _gst-python: http://gstreamer.freedesktop.org/modules/gst-python.html @@ -73,6 +73,18 @@ that you have a broken installation of `FFmpeg`_. To check, try typing FFmpeg with your OS's package manager (e.g., apt or yum) or `using Conda `_. +Legacy formats +-------------- +The `aifc`_ and `sunau`_ modules were deprecated and removed from the standard +Python distribution in version 3.13. +Support for `aifc` and `sunau` formats is still available through `deadlib`_. +To install audioread with continued support for these formats, you can +use the following command:: + + python -m pip install audioread[legacy] + +.. _deadlib: https://github.com/youknowone/python-deadlib + Version History --------------- -- 2.49.0 From 7f932069d2e44e97d2da7d243f067d3726a0db8d Mon Sep 17 00:00:00 2001 From: Brian McFee Date: Mon, 3 Feb 2025 14:14:15 -0500 Subject: [PATCH 4/4] fixed wrong format spec for dependencies --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ authors = [ ] readme = "README.rst" requires-python = ">=3.8" -requires = [ +dependencies = [ "audioop-lts; python_version >= '3.13'" ] dynamic = ["version", "description"] -- 2.49.0