RkBlog

Hardware, programming and astronomy tutorials and reviews.

Odczytywanie mime i metainformacji plików

Środowiska graficzne takie jak GNOME, czy KDE posiadają własne biblioteki odpowiedzialne za określanie typu MIME pliku, czy też sugerowanie aplikacji za pomocą których można te pliki otworzyć, uruchomić. W przypadku GNOME można użyć gnomevfs:
import gnomevfs

def get_meta_info(filename):
	# filename - nazwa pliku ze ścieżką
	try:
		file_mimetype = gnomevfs.get_mime_type(filename)
	except:
		return False
	
	ret = {}
	# Typ Mime
	ret['mime'] = file_mimetype
	# domyślna aplikacja
	ret['default_app'] = gnomevfs.mime_get_default_application(file_mimetype)
	# inne aplikacje
	ret['other_apps'] = gnomevfs.mime_get_all_applications(file_mimetype)
	# opis typu mime
	ret ['description'] = gnomevfs.mime_get_description(file_mimetype)
	return ret

Teoretycznie obecnie powinna być już stosowana biblioteka GIO (w Pythonie API dostępne w pygobject):

import gio
print gio.content_type_guess('plik.ods')

a = gio.content_type_guess('plik.ods')
print gio.content_type_get_description(a)
By biblioteka zwróciła jakąś listę aplikacji - muszą one być zainstalowane (obsługuje aplikacje GNOME, GTK i chyba większość aplikacji KDE4). Podobną funkcjonalność można wyszukać w pykde4, lecz wersja 4.1.2 nie chciała się skompilować na moim komputerze (jak i dokumentacja na temat możliwości tego API jest dość surowa).

Bardziej przenośnym rozwiązaniem pobierania metainformacji o plikach jest zastosowanie bibliotek z projektu Hachoir. Dla wybranych binarnych typów plików potrafi pobrać metainformacje (grafika, multimedia, archiwa itp.):

from hachoir_core.error import HachoirError
from hachoir_core.cmd_line import unicodeFilename
from hachoir_parser import createParser
from hachoir_core.tools import makePrintable
from hachoir_metadata import extractMetadata
from hachoir_core.i18n import getTerminalCharset

def get_meta_info(filename):
	# filename - nazwa pliku ze ścieżką
	try:
		parser = createParser(filename, filename)
	except:
		return False
	if parser:
		try:
			metadata = extractMetadata(parser)
		except HachoirError, err:
			return False
		else:
			if metadata:
				return metadata.exportPlaintext()
	return False
Niestety hachoir obsługuje tylko wybrane formaty i zazwyczaj można używać go w roli "dopełniacza" (choć można pisać własne "parsery" dla nieobsługiwanych domyślnie plików).

RkBlog

Interfejsy Graficzne, 12 December 2008, Piotr Maliński

Comment article