blob: c7290c4b1c27dda6fe4a97f6c3d79ac6924bafd3 [file] [log] [blame]
Barry Warsaw40ef0062006-03-18 15:41:53 +00001# Copyright (C) 2001-2006 Python Software Foundation
Barry Warsaw53f8fe42001-10-09 19:41:18 +00002# Author: Anthony Baxter
Barry Warsawbb113862004-10-03 03:16:19 +00003# Contact: email-sig@python.org
Barry Warsaw53f8fe42001-10-09 19:41:18 +00004
Barry Warsawbb113862004-10-03 03:16:19 +00005"""Class representing audio/* type MIME documents."""
Barry Warsaw53f8fe42001-10-09 19:41:18 +00006
Barry Warsaw40ef0062006-03-18 15:41:53 +00007__all__ = ['MIMEAudio']
Barry Warsaw53f8fe42001-10-09 19:41:18 +00008
Barry Warsaw40ef0062006-03-18 15:41:53 +00009import sndhdr
10
11from cStringIO import StringIO
12from email import encoders
13from email.mime.nonmultipart import MIMENonMultipart
Barry Warsaw53f8fe42001-10-09 19:41:18 +000014
15
16
17_sndhdr_MIMEmap = {'au' : 'basic',
18 'wav' :'x-wav',
19 'aiff':'x-aiff',
20 'aifc':'x-aiff',
21 }
22
23# There are others in sndhdr that don't have MIME types. :(
24# Additional ones to be added to sndhdr? midi, mp3, realaudio, wma??
25def _whatsnd(data):
26 """Try to identify a sound file type.
27
28 sndhdr.what() has a pretty cruddy interface, unfortunately. This is why
29 we re-do it here. It would be easier to reverse engineer the Unix 'file'
30 command and use the standard 'magic' file, as shipped with a modern Unix.
31 """
32 hdr = data[:512]
33 fakefile = StringIO(hdr)
34 for testfn in sndhdr.tests:
35 res = testfn(hdr, fakefile)
36 if res is not None:
37 return _sndhdr_MIMEmap.get(res[0])
38 return None
39
40
41
Barry Warsaw524af6f2002-06-02 19:05:08 +000042class MIMEAudio(MIMENonMultipart):
Barry Warsaw53f8fe42001-10-09 19:41:18 +000043 """Class for generating audio/* MIME documents."""
44
45 def __init__(self, _audiodata, _subtype=None,
Barry Warsaw40ef0062006-03-18 15:41:53 +000046 _encoder=encoders.encode_base64, **_params):
Barry Warsaw53f8fe42001-10-09 19:41:18 +000047 """Create an audio/* type MIME document.
48
49 _audiodata is a string containing the raw audio data. If this data
50 can be decoded by the standard Python `sndhdr' module, then the
Barry Warsaw03a75592002-09-30 21:29:10 +000051 subtype will be automatically included in the Content-Type header.
Barry Warsaw53f8fe42001-10-09 19:41:18 +000052 Otherwise, you can specify the specific audio subtype via the
53 _subtype parameter. If _subtype is not given, and no subtype can be
54 guessed, a TypeError is raised.
55
56 _encoder is a function which will perform the actual encoding for
57 transport of the image data. It takes one argument, which is this
58 Image instance. It should use get_payload() and set_payload() to
59 change the payload to the encoded form. It should also add any
Barry Warsaw03a75592002-09-30 21:29:10 +000060 Content-Transfer-Encoding or other headers to the message as
Barry Warsaw53f8fe42001-10-09 19:41:18 +000061 necessary. The default encoding is Base64.
62
63 Any additional keyword arguments are passed to the base class
Barry Warsaw03a75592002-09-30 21:29:10 +000064 constructor, which turns them into parameters on the Content-Type
Barry Warsaw53f8fe42001-10-09 19:41:18 +000065 header.
66 """
67 if _subtype is None:
68 _subtype = _whatsnd(_audiodata)
69 if _subtype is None:
Barry Warsawbb113862004-10-03 03:16:19 +000070 raise TypeError('Could not find audio MIME subtype')
Barry Warsaw524af6f2002-06-02 19:05:08 +000071 MIMENonMultipart.__init__(self, 'audio', _subtype, **_params)
Barry Warsaw53f8fe42001-10-09 19:41:18 +000072 self.set_payload(_audiodata)
73 _encoder(self)