From a88f4a70b9fdc899c4f54c1ade180965d6645255 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 --- audioread/rawread.py | 53 ++++++++++++++++++++++++++++---------------- pyproject.toml | 8 ++++++- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/audioread/rawread.py b/audioread/rawread.py index fabf96b..df0a589 100644 --- 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 @@ def __init__(self, filename): 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() diff --git a/pyproject.toml b/pyproject.toml index 10f14dd..fa0000e 100644 --- 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,6 +19,8 @@ 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', 'License :: OSI Approved :: MIT License', ] license = {file = "LICENSE"} @@ -27,3 +29,7 @@ license = {file = "LICENSE"} test = [ "tox" ] +legacy = [ + "standard-aifc; python_version >= '3.13'", + "standard-sunau; python_version >= '3.13'" +] From cd92fde48089ceab7e426cdd731d6bb6cf20f068 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 --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index fa0000e..6800f9f 100644 --- 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 = [ From 310cd628ba51dbe6bc365d488cdd47de3f777134 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 --- README.rst | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index b30f62b..d4b8c30 100644 --- 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 --------------- From 28e6272ae9bb9e20b64ff49291e43e6905a8441f 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 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6800f9f..80d9961 100644 --- 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"]