Чтобы сделать этот модуль проигрывателя медиафайлов еще более удобным, мы использовали в нем модуль mimetypes, входящий в состав стандартной библиотеки Python, который автоматически определяет тип медиафайла по его имени. Если тип может быть определен, модуль возвращает строку типа содержимого вида type/subtype, или None — если тип не определяется:
>>> import mimetypes
>>> mimetypes.guess_type(‘spam.jpg’)
(‘image/jpeg’, None)
>>> mimetypes.guess_type(‘TheBrightSideOfLife.mp3’)
(‘audio/mpeg’, None)
>>> mimetypes.guess_type(‘lifeofbrian.mpg’)
(‘video/mpeg’, None)
>>> mimetypes.guess_type(‘lifeofbrian.xyz’) # неизвестный тип (None, None)
Выделив первую часть строки типа содержимого, можно получить обобщенный тип медиафайла, который можно использовать для выбора универсальной программы-проигрывателя. Вторая часть (подтип) сообщает, например, является текст разметкой HTML или простым текстом:
>>> contype, encoding = mimetypes.guess_type(‘spam.jpg’)
>>> contype.split(‘/’)[0]
‘image’
>>> mimetypes.guess_type(‘spam.txt’) # подтип ‘plain’ (‘text/plain’, None)
>>> mimetypes.guess_type(‘spam.html’)
(‘text/html’, None)
>>> mimetypes.guess_type(‘spam.html’)[0].split(‘/’)[1] ‘html’
Тут есть одна тонкость: второй элемент кортежа, возвращаемого функцией определения типа из модуля mimetypes, является названием кодировки, которое мы не используем здесь. Тем не менее мы не должны забывать про него — если данный элемент имеет значение, отличное от None, это означает, что файл был сжат (с помощью gzip или compress), даже если в первом элементе кортежа возвращается тип медиафайла. Например, если файл имеет такое имя, как spam.gif.gz, будет считаться, что это сжатое изображение, которое не следует пытаться открывать непосредственно:
>>> mimetypes.guess_type(‘spam.gz’) # тип содержимого неизвестен
(None, ‘gzip’)
>>> mimetypes.guess_type(‘spam.gif.gz’) # не открывать напрямую! (‘image/gif’, ‘gzip’)
>>> mimetypes.guess_type(‘spam.zip’) # архивы
(‘application/zip’, None)
>>> mimetypes.guess_type(‘spam.doc’) # файлы офисных приложений
(‘application/msword’, None)
Если имя файла, передаваемое функции, содержит путь к каталогу, то эта часть имени будет игнорироваться (при определении типа используется только расширение). Этот модуль позволяет даже определять расширение имени файла по заданному типу, что можно использовать при создании имен файлов по известному типу содержимого:
>>> mimetypes.guess_type(r’C:\songs\sousa.au’)
(‘audio/basic’, None)
>>> mimetypes.guess_extension(‘audio/basic’)
‘.au’
Поэкспериментируйте с другими функциями из этого модуля, чтобы получить более полное представление о нем. Мы еще раз вернемся к модулю mimetypes в примерах FTP в главе 13, где будем определять тип передаваемых данных (текст или двоичные), а также в примерах работы с электронной почтой в главах 13, 14 и 16, где реализуем отправку, сохранение и открытие вложений.
В примере 6.23 модуль mimetypes используется для организации выбора платформозависимых команд запуска программ-проигрывателей для данного типа медиафайлов. То есть модуль выбирает проигрыватель из таблицы по указанному типу медиафайла, а затем выбирает из таблицы проигрывателей команду для данной платформы. На любом из двух этапах мы отступаем назад и запускаем веб-броузер, если не было найдено чего-то более определенного.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011