diff --git a/Lib/email/mime/audio.py b/Lib/email/mime/audio.py index 065819b2a2101d..bf3265448fcb6a 100644 --- a/Lib/email/mime/audio.py +++ b/Lib/email/mime/audio.py @@ -6,7 +6,6 @@ __all__ = ['MIMEAudio'] -from io import BytesIO from email import encoders from email.mime.nonmultipart import MIMENonMultipart @@ -36,65 +35,20 @@ def __init__(self, _audiodata, _subtype=None, constructor, which turns them into parameters on the Content-Type header. """ - if _subtype is None: - _subtype = _what(_audiodata) - if _subtype is None: - raise TypeError('Could not find audio MIME subtype') + _subtype = _subtype or _infer_subtype(_audiodata) 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'}: +def _infer_subtype(h: bytes) -> str: + """Infer the audio format based on the data's header""" + if h.startswith(b'FORM') and h[8:12] in (b'AIFC', b'AIFF'): return 'x-aiff' - else: - return None - - -@rule -def _au(h, f): - if h.startswith(b'.snd'): + elif h.startswith(b'.snd'): return 'basic' - else: - return None - + elif h.startswith(b'RIFF') and h[8:16] == b'WAVEfmt ': + return 'x-wav' -@rule -def _wav(h, f): - # 'RIFF' 'WAVE' 'fmt ' - if not h.startswith(b'RIFF') or h[8:12] != b'WAVE' or h[12:16] != b'fmt ': - return None - else: - return "x-wav" + raise TypeError('Could not find audio MIME subtype')