Päätin kokeilla libextractor:n käyttöä Pythonista. En ole ikinä nähnyt yhtä säälittävää Python-bindingia - sitkeän selvittelyn jälkeen olen saanut selville, miten ilmeisesti kirjastoa pitää kutsua, että saa jonkin tiedoston metadatat luetuksi avain-arvo-pareina (johon vielä lisään pluginin nimen, koska joidenkin pluginien tuottama tieto on luotettavampaa kuin toisten).
Koodi kertoo kaiken; Python-koodin ei tosiaankaan pitäisi mielestäni näyttää tältä:
good_types = [extractor.EXTRACTOR_METAFORMAT_UTF8,
extractor.EXTRACTOR_METAFORMAT_C_STRING]
def strip_prefix(string, prefix):
if string.startswith(prefix): return string[len(prefix):]
return string
def extract(filename):
x = extractor.Extractor()
keywords = x.keywordTypes()
result = []
def callback(_, plugin, kwtype, mdformat, mdmime, data, datalen):
if mdformat not in good_types: return 0
assert mdmime == 'text/plain'
metadata_val = ctypes.cast(data, ctypes.c_char_p).value
assert len(metadata_val) == datalen - 1
if mdformat == extractor.EXTRACTOR_METAFORMAT_UTF8:
metadata_val = metadata_val.decode('utf-8')
metadata_key = keywords[kwtype]
plugin_name, fnext = os.path.splitext(os.path.basename(plugin))
plugin_name = strip_prefix(plugin_name, 'libextractor_')
result.append((plugin_name, metadata_key, metadata_val))
return 0
x.extract(callback, None, filename)
return result