import re # pylint: disable=too-many-return-statements def get_mime_type(content): if not content: return 'application/octet-stream' if content[0:3] in (b'CWS', b'FWS', b'ZWS'): return 'application/x-shockwave-flash' if content[0:3] == b'\xFF\xD8\xFF': return 'image/jpeg' if content[0:6] == b'\x89PNG\x0D\x0A': return 'image/png' if content[0:6] in (b'GIF87a', b'GIF89a'): return 'image/gif' if content[0:4] == b'\x1A\x45\xDF\xA3': return 'video/webm' if content[4:12] in (b'ftypisom', b'ftypmp42'): return 'video/mp4' return 'application/octet-stream' def get_extension(mime_type): extension_map = { 'application/x-shockwave-flash': 'swf', 'image/gif': 'gif', 'image/jpeg': 'jpg', 'image/png': 'png', 'video/mp4': 'mp4', 'video/webm': 'webm', } return extension_map.get((mime_type or '').strip().lower(), None) def is_flash(mime_type): return mime_type.lower() == 'application/x-shockwave-flash' def is_video(mime_type): return mime_type.lower() in ('application/ogg', 'video/mp4', 'video/webm') def is_image(mime_type): return mime_type.lower() in ('image/jpeg', 'image/png', 'image/gif') def is_animated_gif(content): return get_mime_type(content) == 'image/gif' \ and len(re.findall(b'\x21\xF9\x04.{4}\x00[\x2C\x21]', content)) > 1