Odczytywanie mime i metainformacji plików

Zastosowanie bibliotek hachoir i gnomevfs do odczytu metainformacje 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).

blog comments powered by Disqus

Kategorie

Strony