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