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