diff options
author | Barry Warsaw <barry@python.org> | 2022-04-24 22:50:07 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-24 22:50:07 (GMT) |
commit | 440332072706c5e422e6c54a2ec0ebb88e09c85c (patch) | |
tree | 76e0e5a12d37b250849b3a23486c33e57dda019c /Lib/email | |
parent | e93d2fbddaee329b2e8f405cbb5aec44ca221de6 (diff) | |
download | cpython-440332072706c5e422e6c54a2ec0ebb88e09c85c.zip cpython-440332072706c5e422e6c54a2ec0ebb88e09c85c.tar.gz cpython-440332072706c5e422e6c54a2ec0ebb88e09c85c.tar.bz2 |
Rewrite audio.py to jive with image.py (#91886)
Similar to the rewrite of email/mime/image.py and associated test after the
deprecation of imghdr.py, thisrewrites email/mime/audio.py and associated
tests after the deprecation of sndhdr.py.
Closes #91885
Diffstat (limited to 'Lib/email')
-rw-r--r-- | Lib/email/mime/audio.py | 108 |
1 files changed, 55 insertions, 53 deletions
diff --git a/Lib/email/mime/audio.py b/Lib/email/mime/audio.py index e859c2e..8815f5c 100644 --- a/Lib/email/mime/audio.py +++ b/Lib/email/mime/audio.py @@ -11,58 +11,6 @@ from email import encoders from email.mime.nonmultipart import MIMENonMultipart -_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?? -def _whatsnd(data): - """Try to identify a sound file type. - - sndhdr.what() has a pretty cruddy interface, unfortunately. This is why - we re-do it here. It would be easier to reverse engineer the Unix 'file' - command and use the standard 'magic' file, as shipped with a modern Unix. - """ - hdr = data[:512] - fakefile = BytesIO(hdr) - for testfn in _tests: - res = testfn(hdr, fakefile) - if res is not None: - return res - else: - return None - - class MIMEAudio(MIMENonMultipart): """Class for generating audio/* MIME documents.""" @@ -89,10 +37,64 @@ class MIMEAudio(MIMENonMultipart): header. """ if _subtype is None: - _subtype = _whatsnd(_audiodata) + _subtype = _what(_audiodata) if _subtype is None: raise TypeError('Could not find audio MIME subtype') MIMENonMultipart.__init__(self, 'audio', _subtype, policy=policy, **_params) self.set_payload(_audiodata) _encoder(self) + + +_rules = [] + + +# Originally from the sndhdr module. +# +# There are others in sndhdr that don't have MIME types. :( +# Additional ones to be added to sndhdr? midi, mp3, realaudio, wma?? +def _what(data): + # Try to identify a sound file type. + # + # sndhdr.what() had a pretty cruddy interface, unfortunately. This is why + # we re-do it here. It would be easier to reverse engineer the Unix 'file' + # command and use the standard 'magic' file, as shipped with a modern Unix. + hdr = data[:512] + fakefile = BytesIO(hdr) + for testfn in _rules: + if res := testfn(hdr, fakefile): + return res + else: + return None + + +def rule(rulefunc): + _rules.append(rulefunc) + return rulefunc + + +@rule +def _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 + + +@rule +def _au(h, f): + if h.startswith(b'.snd'): + return 'basic' + else: + return None + + +@rule +def _wav(h, f): + # '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" |