18b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum# Copyright (C) 2001-2007 Python Software Foundation
28b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum# Author: Anthony Baxter
38b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum# Contact: email-sig@python.org
48b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
58b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum"""Class representing audio/* type MIME documents."""
68b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
78b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum__all__ = ['MIMEAudio']
88b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
98b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossumimport sndhdr
108b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
118b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossumfrom io import BytesIO
128b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossumfrom email import encoders
138b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossumfrom email.mime.nonmultipart import MIMENonMultipart
148b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
158b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
168b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
178b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum_sndhdr_MIMEmap = {'au'  : 'basic',
188b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum                   'wav' :'x-wav',
198b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum                   'aiff':'x-aiff',
208b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum                   'aifc':'x-aiff',
218b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum                   }
228b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
238b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum# There are others in sndhdr that don't have MIME types. :(
248b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum# Additional ones to be added to sndhdr? midi, mp3, realaudio, wma??
258b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossumdef _whatsnd(data):
268b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    """Try to identify a sound file type.
278b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
288b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    sndhdr.what() has a pretty cruddy interface, unfortunately.  This is why
298b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    we re-do it here.  It would be easier to reverse engineer the Unix 'file'
308b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    command and use the standard 'magic' file, as shipped with a modern Unix.
318b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    """
328b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    hdr = data[:512]
338b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    fakefile = BytesIO(hdr)
348b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    for testfn in sndhdr.tests:
358b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        res = testfn(hdr, fakefile)
368b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        if res is not None:
378b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum            return _sndhdr_MIMEmap.get(res[0])
388b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    return None
398b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
408b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
418b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
428b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossumclass MIMEAudio(MIMENonMultipart):
438b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    """Class for generating audio/* MIME documents."""
448b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
458b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum    def __init__(self, _audiodata, _subtype=None,
4656b1f1b4d5edef1ca6184225145cffc59d2b3b5dR David Murray                 _encoder=encoders.encode_base64, *, policy=None, **_params):
478b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        """Create an audio/* type MIME document.
488b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
498b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        _audiodata is a string containing the raw audio data.  If this data
508b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        can be decoded by the standard Python `sndhdr' module, then the
518b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        subtype will be automatically included in the Content-Type header.
528b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        Otherwise, you can specify  the specific audio subtype via the
538b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        _subtype parameter.  If _subtype is not given, and no subtype can be
548b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        guessed, a TypeError is raised.
558b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
568b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        _encoder is a function which will perform the actual encoding for
578b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        transport of the image data.  It takes one argument, which is this
588b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        Image instance.  It should use get_payload() and set_payload() to
598b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        change the payload to the encoded form.  It should also add any
608b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        Content-Transfer-Encoding or other headers to the message as
618b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        necessary.  The default encoding is Base64.
628b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum
638b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        Any additional keyword arguments are passed to the base class
648b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        constructor, which turns them into parameters on the Content-Type
658b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        header.
668b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        """
678b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        if _subtype is None:
688b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum            _subtype = _whatsnd(_audiodata)
698b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        if _subtype is None:
708b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum            raise TypeError('Could not find audio MIME subtype')
7156b1f1b4d5edef1ca6184225145cffc59d2b3b5dR David Murray        MIMENonMultipart.__init__(self, 'audio', _subtype, policy=policy,
7256b1f1b4d5edef1ca6184225145cffc59d2b3b5dR David Murray                                  **_params)
738b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        self.set_payload(_audiodata)
748b3febef2f96c35e9aad9db2ef499db040fdefaeGuido van Rossum        _encoder(self)
75