Introduction
GNU libextractor 是一個種用來從 file 中提取 meta data 的 library。他的設計為以輔助程式庫的方式來執行提取文件實際內容,Meta data 格式的資料有下列 (mime type, image dimensions, color depth, recording frequency),GNU libextractor 主要是被我們用來提取 meta data 之用。目前,GNU libextractor 支持以下格式:HTML, PDF, PS, OLE2 (DOC, XLS, PPT), OpenOffice (sxw), StarOffice (sdw), DVI, MAN, FLAC, MP3 (ID3v1 and ID3v2), NSF(E) (NES music), SID (C64 music), OGG, WAV, EXIV2, JPEG, GIF, PNG, TIFF, DEB, RPM, TAR(.GZ), ZIP, ELF, S3M (Scream Tracker 3), XM (eXtended Module), IT (Impulse Tracker), FLV, REAL, RIFF (AVI), MPEG, QT and ASF. 此外,還有各種額外的 MIME 類型檢測。
GNU libextractor 是免費軟件,可以下載下來修改以及發布。
GNU libextractor 使用 plugin 來處理各種文件格式。從技術上講一個 plugin 可以支持多種文件格式,但大多數 plugin 只支持一個特定的格式。默認情況下,GNU libextractor 將使用所有在安裝目錄下發現的可用 plugin。應用程序可以要求使用特定 plugin 或只有排除某些 plugin。
Example for using dynamic library
// hello.c
#include <extractor.h>
int main()
{
struct EXTRACTOR_PluginList *el;
el = EXTRACTOR_plugin_load_defaults (EXTRACTOR_OPTION_DEFAULT_POLICY);
// ...
EXTRACTOR_plugin_remove_all (el);
return 0;
} |
執行以下指令 compile
$ gcc \ -I/Library/Frameworks/Extractor.framework/Versions/Current/include \
-o hello hello.c \
-L/Library/Frameworks/Extractor.framework/Versions/Current/lib \
-lextractor
Plugin management
C Struct: EXTRACTOR_PluginList
建立一組 plugin
Function: void EXTRACTOR_plugin_remove_all (struct EXTRACTOR_PluginList *plugins)
刪除所有給定 plugin 列表
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList *plugins, const char*name)
刪除給定 plugin 列表例如 mime 中的 mpeg
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_add (struct EXTRACTOR_PluginList *plugins, const char* name,const char* options, enum EXTRACTOR_Options flags)
增加給定 plugin 列表
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_add_config (struct EXTRACTOR_PluginList *plugins, const char* config, enum EXTRACTOR_Options flags)
根據 config string load 或是 unload 或是修改已存在的列表
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_add_defaults (enum EXTRACTOR_Options flags)
載入所有在 plugin 資料夾下的預設 plugin 列表
Example for a minimal extract method
以下範例告訴我們如何利用 plugin 解讀出 MIME type
|
int
EXTRACTOR_mymime_extract
(const char *data,
size_t data_size,
EXTRACTOR_MetaDataProcessor proc,
void *proc_cls,
const char * options)
{
if (data_size < 4)
return 0;
if (0 != memcmp (data, "\177ELF", 4))
return 0;
if (0 != proc (proc_cls,
"mymime",
EXTRACTOR_METATYPE_MIMETYPE,
EXTRACTOR_METAFORMAT_UTF8,
"text/plain",
"application/x-executable",
1 + strlen("application/x-executable")))
return 1;
/* more calls to 'proc' here as needed */
return 0;
}
|
Internal utility functions
有些實用的內部開發 API
“convert_numeric.h” 定義了各種數字的轉換功能(特別是轉換為浮點數)。
“unzip.h” 定義了一個訪問壓縮文件的 API。
“pack.h” 可以把有 integer 的 struts 分解順便也可以把 big/little endian 轉成 host byte order。
“convert.h” 提供了一個函數進行所需之字符集轉換。
Function: char * EXTRACTOR_common_convert_to_utf8 (const char *input, size_t len, const char * charset) 可以用來方便地從任何字符集轉換為 UTF - 8 文本。
Conclusion
總之,對於訊息解析平凡的我們來說,GNU libextractor 不只幫助了我們找到檔案的正確格式,還可以撰寫各種 plugin 工具,分析各種文字格式,找到相對應的 MIME type。這對 email 這塊領域而言,可說是不可或缺的一項工具。