]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-91217: deprecate-sndhdr (#91806)
authorBrett Cannon <brett@python.org>
Fri, 22 Apr 2022 22:48:03 +0000 (15:48 -0700)
committerGitHub <noreply@github.com>
Fri, 22 Apr 2022 22:48:03 +0000 (15:48 -0700)
Also inline necessary functionality from `sndhdr` into `email.mime.audio` for `MIMEAudio`.

Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
Doc/library/email.mime.rst
Doc/whatsnew/3.11.rst
Lib/email/mime/audio.py
Lib/sndhdr.py
Lib/test/test_sndhdr.py
Misc/NEWS.d/next/Library/2022-04-17-12-27-46.gh-issue-91217.tNDWtK.rst [new file with mode: 0644]

index ab4f7bc54e02568794230313ad606d0f9f328689..3fe5fe88a09462153d1cc54710d016edba98d818 100644 (file)
@@ -146,7 +146,7 @@ Here are the classes:
    A subclass of :class:`~email.mime.nonmultipart.MIMENonMultipart`, the
    :class:`MIMEAudio` class is used to create MIME message objects of major type
    :mimetype:`audio`. *_audiodata* is a string containing the raw audio data.  If
-   this data can be decoded by the standard Python module :mod:`sndhdr`, then the
+   this data can be decoded as au, wav, aiff, or aifc, then the
    subtype will be automatically included in the :mailheader:`Content-Type` header.
    Otherwise you can explicitly specify the audio subtype via the *_subtype*
    argument.  If the minor type could not be guessed and *_subtype* was not given,
index 75ea70b7a18322b3162aeb8f542af6bc239e6907..653d32aaf540bf7d729a3c4d71c8228afdfb91cc 100644 (file)
@@ -920,6 +920,7 @@ Deprecated
   * :mod:`nntplib`
   * :mod:`ossaudiodev`
   * :mod:`pipes`
+  * :mod:`sndhdr`
 
   (Contributed by Brett Cannon in :issue:`47061`.)
 
index 4bcd7b224a862a7e977cb31f1079cf038bbbee75..e859c2e8a2b6cdd4ec95e49ffdca940d90a54370 100644 (file)
@@ -6,19 +6,43 @@
 
 __all__ = ['MIMEAudio']
 
-import sndhdr
-
 from io import BytesIO
 from email import encoders
 from email.mime.nonmultipart import MIMENonMultipart
 
 
-\f
-_sndhdr_MIMEmap = {'au'  : 'basic',
-                   'wav' :'x-wav',
-                   'aiff':'x-aiff',
-                   'aifc':'x-aiff',
-                   }
+_tests = []
+
+def _test_aifc_aiff(h, f):
+    if not h.startswith(b'FORM'):
+        return None
+    if h[8:12] in {b'AIFC', b'AIFF'}:
+        return 'x-aiff'
+    else:
+        return None
+
+_tests.append(_test_aifc_aiff)
+
+
+def _test_au(h, f):
+    if h.startswith(b'.snd'):
+        return 'basic'
+    else:
+        return None
+
+_tests.append(_test_au)
+
+
+def _test_wav(h, f):
+    import wave
+    # 'RIFF' <len> 'WAVE' 'fmt ' <len>
+    if not h.startswith(b'RIFF') or h[8:12] != b'WAVE' or h[12:16] != b'fmt ':
+        return None
+    else:
+        return "x-wav"
+
+_tests.append(_test_wav)
+
 
 # There are others in sndhdr that don't have MIME types. :(
 # Additional ones to be added to sndhdr? midi, mp3, realaudio, wma??
@@ -31,14 +55,14 @@ def _whatsnd(data):
     """
     hdr = data[:512]
     fakefile = BytesIO(hdr)
-    for testfn in sndhdr.tests:
+    for testfn in _tests:
         res = testfn(hdr, fakefile)
         if res is not None:
-            return _sndhdr_MIMEmap.get(res[0])
-    return None
+            return res
+    else:
+        return None
 
 
-\f
 class MIMEAudio(MIMENonMultipart):
     """Class for generating audio/* MIME documents."""
 
@@ -47,7 +71,7 @@ class MIMEAudio(MIMENonMultipart):
         """Create an audio/* type MIME document.
 
         _audiodata is a string containing the raw audio data.  If this data
-        can be decoded by the standard Python `sndhdr' module, then the
+        can be decoded as au, wav, aiff, or aifc, then the
         subtype will be automatically included in the Content-Type header.
         Otherwise, you can specify  the specific audio subtype via the
         _subtype parameter.  If _subtype is not given, and no subtype can be
index a63b6fd20220c0d881f39957c6edff3238fec3ed..98a783448239a86a53bd771e633277f4f32b4c72 100644 (file)
@@ -27,13 +27,16 @@ option -r tells it to recurse down directories found inside
 explicitly given directories.
 """
 
+import warnings
+
+warnings._deprecated(__name__, remove=(3, 13))
+
 # The file structure is top-down except that the test program and its
 # subroutine come last.
 
 __all__ = ['what', 'whathdr']
 
 from collections import namedtuple
-import warnings
 
 SndHeaders = namedtuple('SndHeaders',
                         'filetype framerate nchannels nframes sampwidth')
index 426417c038208bdac5841b5fcd83db3a7311d5da..4d97437f9072c252f92a3c2afa796b703d965689 100644 (file)
@@ -1,7 +1,10 @@
-import sndhdr
 import pickle
 import unittest
 from test.support import findfile
+from test.support import warnings_helper
+
+sndhdr = warnings_helper.import_deprecated("sndhdr")
+
 
 class TestFormats(unittest.TestCase):
     def test_data(self):
diff --git a/Misc/NEWS.d/next/Library/2022-04-17-12-27-46.gh-issue-91217.tNDWtK.rst b/Misc/NEWS.d/next/Library/2022-04-17-12-27-46.gh-issue-91217.tNDWtK.rst
new file mode 100644 (file)
index 0000000..4ee6ba2
--- /dev/null
@@ -0,0 +1,2 @@
+Deprecate the sndhdr module, as well as inline needed functionality for
+``email.mime.MIMEAudio``.