aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2009-12-18 21:34:38 +0000
committerChristian Grothoff <christian@grothoff.org>2009-12-18 21:34:38 +0000
commit125acede703192d4fe43dc885c232d0b25cf117e (patch)
treec4c6743363d68884a3edbed7272019a1e6af876f
parent9c7cd611928aa5838bf8d5073e81d6193e73d522 (diff)
downloadlibextractor-125acede703192d4fe43dc885c232d0b25cf117e.tar.gz
libextractor-125acede703192d4fe43dc885c232d0b25cf117e.zip
qt
-rw-r--r--src/include/extractor.h13
-rw-r--r--src/main/extractor_metatypes.c15
-rw-r--r--src/plugins/Makefile.am18
-rw-r--r--src/plugins/qt_extractor.c (renamed from src/plugins/qtextractor.c)585
-rw-r--r--src/plugins/rpm_extractor.c2
5 files changed, 338 insertions, 295 deletions
diff --git a/src/include/extractor.h b/src/include/extractor.h
index 47eb197..960c13a 100644
--- a/src/include/extractor.h
+++ b/src/include/extractor.h
@@ -207,7 +207,7 @@ enum EXTRACTOR_MetaType
207 EXTRACTOR_METATYPE_PACKAGE_PRE_DEPENDENCY = 84, 207 EXTRACTOR_METATYPE_PACKAGE_PRE_DEPENDENCY = 84,
208 EXTRACTOR_METATYPE_LICENSE = 85, 208 EXTRACTOR_METATYPE_LICENSE = 85,
209 EXTRACTOR_METATYPE_PACKAGE_DISTRIBUTION = 86, 209 EXTRACTOR_METATYPE_PACKAGE_DISTRIBUTION = 86,
210 EXTRACTOR_METATYPE_PACKAGE_BUILDHOST = 87, 210 EXTRACTOR_METATYPE_BUILDHOST = 87,
211 EXTRACTOR_METATYPE_VENDOR = 88, 211 EXTRACTOR_METATYPE_VENDOR = 88,
212 EXTRACTOR_METATYPE_TARGET_OS = 89, 212 EXTRACTOR_METATYPE_TARGET_OS = 89,
213 EXTRACTOR_METATYPE_SOFTWARE_VERSION = 90, 213 EXTRACTOR_METATYPE_SOFTWARE_VERSION = 90,
@@ -276,6 +276,13 @@ enum EXTRACTOR_MetaType
276 EXTRACTOR_METATYPE_DISCLAIMER = 144, 276 EXTRACTOR_METATYPE_DISCLAIMER = 144,
277 EXTRACTOR_METATYPE_WARNING = 145, 277 EXTRACTOR_METATYPE_WARNING = 145,
278 EXTRACTOR_METATYPE_PAGE_ORDER = 146, 278 EXTRACTOR_METATYPE_PAGE_ORDER = 146,
279 EXTRACTOR_METATYPE_WRITER = 147,
280 EXTRACTOR_METATYPE_PRODUCT_VERSION = 148,
281 EXTRACTOR_METATYPE_CONTRIBUTOR_NAME = 149,
282 EXTRACTOR_METATYPE_MOVIE_DIRECTOR = 150,
283 EXTRACTOR_METATYPE_TV_NETWORK_NAME = 151,
284 EXTRACTOR_METATYPE_TV_SHOW_NAME = 152,
285 EXTRACTOR_METATYPE_CHAPTER_NAME = 153,
279 286
280 /* fixme: used up to here! */ 287 /* fixme: used up to here! */
281 288
@@ -283,7 +290,6 @@ enum EXTRACTOR_MetaType
283 EXTRACTOR_METATYPE_CONDUCTOR = 64, 290 EXTRACTOR_METATYPE_CONDUCTOR = 64,
284 EXTRACTOR_METATYPE_INTERPRET = 65, 291 EXTRACTOR_METATYPE_INTERPRET = 65,
285 EXTRACTOR_METATYPE_MUSIC_CD_IDENTIFIER = 117, 292 EXTRACTOR_METATYPE_MUSIC_CD_IDENTIFIER = 117,
286 EXTRACTOR_METATYPE_MOVIE_DIRECTOR = 110,
287 EXTRACTOR_METATYPE_SONG_COUNT = 127, 293 EXTRACTOR_METATYPE_SONG_COUNT = 127,
288 EXTRACTOR_METATYPE_STARTING_SONG = 128, 294 EXTRACTOR_METATYPE_STARTING_SONG = 128,
289 EXTRACTOR_METATYPE_MUSICIAN_CREDITS_LIST = 123, 295 EXTRACTOR_METATYPE_MUSICIAN_CREDITS_LIST = 123,
@@ -311,12 +317,10 @@ enum EXTRACTOR_MetaType
311 317
312 EXTRACTOR_METATYPE_GENERATOR = 103, 318 EXTRACTOR_METATYPE_GENERATOR = 103,
313 EXTRACTOR_METATYPE_ENCODED_BY = 121, 319 EXTRACTOR_METATYPE_ENCODED_BY = 121,
314 EXTRACTOR_METATYPE_PROUCUCTVERSION = 90,
315 320
316 EXTRACTOR_METATYPE_FULL_DATA = 137, 321 EXTRACTOR_METATYPE_FULL_DATA = 137,
317 322
318 EXTRACTOR_METATYPE_ORGANIZATION = 15, 323 EXTRACTOR_METATYPE_ORGANIZATION = 15,
319 EXTRACTOR_METATYPE_CONTRIBUTOR = 19,
320 EXTRACTOR_METATYPE_RELATION = 24, 324 EXTRACTOR_METATYPE_RELATION = 24,
321 EXTRACTOR_METATYPE_COVERAGE = 25, 325 EXTRACTOR_METATYPE_COVERAGE = 25,
322 EXTRACTOR_METATYPE_SOFTWARE = 26, 326 EXTRACTOR_METATYPE_SOFTWARE = 26,
@@ -328,7 +332,6 @@ enum EXTRACTOR_MetaType
328 EXTRACTOR_METATYPE_OWNER = 66, 332 EXTRACTOR_METATYPE_OWNER = 66,
329 EXTRACTOR_METATYPE_MEDIA_TYPE = 68, 333 EXTRACTOR_METATYPE_MEDIA_TYPE = 68,
330 EXTRACTOR_METATYPE_SECURITY = 97, 334 EXTRACTOR_METATYPE_SECURITY = 97,
331 EXTRACTOR_METATYPE_INFORMATION = 112,
332 EXTRACTOR_METATYPE_FULL_NAME = 113, 335 EXTRACTOR_METATYPE_FULL_NAME = 113,
333 EXTRACTOR_METATYPE_LINK = 116, 336 EXTRACTOR_METATYPE_LINK = 116,
334 EXTRACTOR_METATYPE_TIME = 122, 337 EXTRACTOR_METATYPE_TIME = 122,
diff --git a/src/main/extractor_metatypes.c b/src/main/extractor_metatypes.c
index f59172a..2864488 100644
--- a/src/main/extractor_metatypes.c
+++ b/src/main/extractor_metatypes.c
@@ -360,8 +360,21 @@ static const struct MetaTypeDescription meta_type_descriptions[] = {
360 gettext_noop ("warning about the nature of the content") }, 360 gettext_noop ("warning about the nature of the content") },
361 { gettext_noop ("page order"), 361 { gettext_noop ("page order"),
362 gettext_noop ("order of the pages") }, 362 gettext_noop ("order of the pages") },
363 { gettext_noop (""), 363 { gettext_noop ("writer"),
364 gettext_noop ("contributing writer") },
365 { gettext_noop ("product version"),
364 gettext_noop ("") }, 366 gettext_noop ("") },
367 { gettext_noop ("contributor"),
368 gettext_noop ("name of a contributor") },
369 /* 150 */
370 { gettext_noop ("movie director"),
371 gettext_noop ("name of the director") },
372 { gettext_noop ("TV network"),
373 gettext_noop ("name of the broadcasting TV network") },
374 { gettext_noop ("TV show"),
375 gettext_noop ("name of the TV show") },
376 { gettext_noop ("chapter name"),
377 gettext_noop ("name of the chapter") },
365 { gettext_noop (""), 378 { gettext_noop (""),
366 gettext_noop ("") }, 379 gettext_noop ("") },
367 { gettext_noop (""), 380 { gettext_noop (""),
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index ee0184d..91f8d6b 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -89,6 +89,7 @@ plugin_LTLIBRARIES = \
89 $(pdf) \ 89 $(pdf) \
90 libextractor_png.la \ 90 libextractor_png.la \
91 libextractor_ps.la \ 91 libextractor_ps.la \
92 libextractor_qt.la \
92 libextractor_real.la \ 93 libextractor_real.la \
93 $(rpm) \ 94 $(rpm) \
94 libextractor_tar.la \ 95 libextractor_tar.la \
@@ -249,6 +250,13 @@ libextractor_ps_la_SOURCES = \
249libextractor_ps_la_LDFLAGS = \ 250libextractor_ps_la_LDFLAGS = \
250 $(PLUGINFLAGS) 251 $(PLUGINFLAGS)
251 252
253libextractor_qt_la_SOURCES = \
254 qt_extractor.c
255libextractor_qt_la_LDFLAGS = \
256 $(PLUGINFLAGS)
257libextractor_qt_la_LIBADD = \
258 -lz -lm
259
252libextractor_real_la_SOURCES = \ 260libextractor_real_la_SOURCES = \
253 real_extractor.c 261 real_extractor.c
254libextractor_real_la_LDFLAGS = \ 262libextractor_real_la_LDFLAGS = \
@@ -303,7 +311,6 @@ OLD_LIBS = \
303 $(extrampeg) \ 311 $(extrampeg) \
304 libextractor_nsf.la \ 312 libextractor_nsf.la \
305 libextractor_nsfe.la \ 313 libextractor_nsfe.la \
306 $(extraqt) \
307 libextractor_riff.la \ 314 libextractor_riff.la \
308 libextractor_s3m.la \ 315 libextractor_s3m.la \
309 libextractor_sid.la \ 316 libextractor_sid.la \
@@ -313,15 +320,6 @@ OLD_LIBS = \
313 libextractor_xm.la \ 320 libextractor_xm.la \
314 libextractor_zip.la 321 libextractor_zip.la
315 322
316if HAVE_ZLIB
317libextractor_qt_la_SOURCES = \
318 qtextractor.c
319libextractor_qt_la_LDFLAGS = \
320 $(PLUGINFLAGS)
321libextractor_qt_la_LIBADD = \
322 -lz
323endif
324
325 323
326libextractor_id3v2_la_SOURCES = \ 324libextractor_id3v2_la_SOURCES = \
327 id3v2extractor.c 325 id3v2extractor.c
diff --git a/src/plugins/qtextractor.c b/src/plugins/qt_extractor.c
index 0f89a1f..3abd543 100644
--- a/src/plugins/qtextractor.c
+++ b/src/plugins/qt_extractor.c
@@ -181,6 +181,227 @@ static const char *const genre_names[] = {
181 ((unsigned int)(sizeof genre_names / sizeof (const char *const))) 181 ((unsigned int)(sizeof genre_names / sizeof (const char *const)))
182 182
183 183
184static const char *languages[] = {
185 "English",
186 "French",
187 "German",
188 "Italian",
189 "Dutch",
190 "Swedish",
191 "Spanish",
192 "Danish",
193 "Portuguese",
194 "Norwegian",
195 "Hebrew",
196 "Japanese",
197 "Arabic",
198 "Finnish",
199 "Greek",
200 "Icelandic",
201 "Maltese",
202 "Turkish",
203 "Croatian",
204 "Traditional Chinese",
205 "Urdu",
206 "Hindi",
207 "Thai",
208 "Korean",
209 "Lithuanian",
210 "Polish",
211 "Hungarian",
212 "Estonian",
213 "Lettish",
214 "Saamisk",
215 "Lappish",
216 "Faeroese",
217 "Farsi",
218 "Russian",
219 "Simplified Chinese",
220 "Flemish",
221 "Irish",
222 "Albanian",
223 "Romanian",
224 "Czech",
225 "Slovak",
226 "Slovenian",
227 "Yiddish",
228 "Serbian",
229 "Macedonian",
230 "Bulgarian",
231 "Ukrainian",
232 "Byelorussian",
233 "Uzbek",
234 "Kazakh",
235 "Azerbaijani",
236 "AzerbaijanAr",
237 "Armenian",
238 "Georgian",
239 "Moldavian",
240 "Kirghiz",
241 "Tajiki",
242 "Turkmen",
243 "Mongolian",
244 "MongolianCyr",
245 "Pashto",
246 "Kurdish",
247 "Kashmiri",
248 "Sindhi",
249 "Tibetan",
250 "Nepali",
251 "Sanskrit",
252 "Marathi",
253 "Bengali",
254 "Assamese",
255 "Gujarati",
256 "Punjabi",
257 "Oriya",
258 "Malayalam",
259 "Kannada",
260 "Tamil",
261 "Telugu",
262 "Sinhalese",
263 "Burmese",
264 "Khmer",
265 "Lao",
266 "Vietnamese",
267 "Indonesian",
268 "Tagalog",
269 "MalayRoman",
270 "MalayArabic",
271 "Amharic",
272 "Tigrinya",
273 "Galla",
274 "Oromo",
275 "Somali",
276 "Swahili",
277 "Ruanda",
278 "Rundi",
279 "Chewa",
280 "Malagasy",
281 "Esperanto",
282 "Welsh",
283 "Basque",
284 "Catalan",
285 "Latin",
286 "Quechua",
287 "Guarani",
288 "Aymara",
289 "Tatar",
290 "Uighur",
291 "Dzongkha",
292 "JavaneseRom",
293};
294
295
296typedef struct
297{
298 const char *ext;
299 const char *mime;
300} C2M;
301
302/* see http://www.mp4ra.org/filetype.html
303 * http://www.ftyps.com/ */
304static C2M ftMap[] = {
305 {"qt ", "video/quicktime"},
306 {"isom", "video/mp4"}, /* ISO Base Media files */
307 {"iso2", "video/mp4"},
308 {"mp41", "video/mp4"}, /* MPEG-4 (ISO/IEC 14491-1) version 1 */
309 {"mp42", "video/mp4"}, /* MPEG-4 (ISO/IEC 14491-1) version 2 */
310 {"3gp1", "video/3gpp"},
311 {"3gp2", "video/3gpp"},
312 {"3gp3", "video/3gpp"},
313 {"3gp4", "video/3gpp"},
314 {"3gp5", "video/3gpp"},
315 {"3g2a", "video/3gpp2"},
316 {"mmp4", "video/mp4"}, /* Mobile MPEG-4 */
317 {"M4A ", "audio/mp4"},
318 {"M4B ", "audio/mp4"},
319 {"M4P ", "audio/mp4"},
320 {"M4V ", "video/mp4"},
321 {"mj2s", "video/mj2"}, /* Motion JPEG 2000 */
322 {"mjp2", "video/mj2"},
323 {NULL, NULL},
324};
325
326typedef struct CHE
327{
328 const char *pfx;
329 enum EXTRACTOR_MetaType type;
330} CHE;
331
332static CHE cHm[] = {
333 {"aut", EXTRACTOR_METATYPE_AUTHOR_NAME},
334 {"cpy", EXTRACTOR_METATYPE_COPYRIGHT},
335 {"day", EXTRACTOR_METATYPE_CREATION_DATE},
336 {"ed1", EXTRACTOR_METATYPE_MODIFICATION_DATE},
337 {"ed2", EXTRACTOR_METATYPE_MODIFICATION_DATE},
338 {"ed3", EXTRACTOR_METATYPE_MODIFICATION_DATE},
339 {"ed4", EXTRACTOR_METATYPE_MODIFICATION_DATE},
340 {"ed5", EXTRACTOR_METATYPE_MODIFICATION_DATE},
341 {"ed6", EXTRACTOR_METATYPE_MODIFICATION_DATE},
342 {"ed7", EXTRACTOR_METATYPE_MODIFICATION_DATE},
343 {"ed8", EXTRACTOR_METATYPE_MODIFICATION_DATE},
344 {"ed9", EXTRACTOR_METATYPE_MODIFICATION_DATE},
345 {"cmt", EXTRACTOR_METATYPE_COMMENT},
346 {"url", EXTRACTOR_METATYPE_URL},
347 {"enc", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
348 {"hst", EXTRACTOR_METATYPE_BUILDHOST},
349 {"nam", EXTRACTOR_METATYPE_TITLE},
350 {"gen", EXTRACTOR_METATYPE_GENRE},
351 {"mak", EXTRACTOR_METATYPE_CAMERA_MAKE},
352 {"mod", EXTRACTOR_METATYPE_CAMERA_MODEL},
353 {"des", EXTRACTOR_METATYPE_DESCRIPTION},
354 {"dis", EXTRACTOR_METATYPE_DISCLAIMER},
355 {"dir", EXTRACTOR_METATYPE_MOVIE_DIRECTOR},
356 {"src", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME},
357 {"prf", EXTRACTOR_METATYPE_PERFORMER },
358 {"prd", EXTRACTOR_METATYPE_PRODUCER},
359 {"PRD", EXTRACTOR_METATYPE_PRODUCT_VERSION},
360 {"swr", EXTRACTOR_METATYPE_PRODUCED_BY_SOFTWARE},
361 {"isr", EXTRACTOR_METATYPE_ISRC},
362 {"wrt", EXTRACTOR_METATYPE_WRITER},
363 {"wrn", EXTRACTOR_METATYPE_WARNING},
364 {"chp", EXTRACTOR_METATYPE_CHAPTER_NAME},
365 {"inf", EXTRACTOR_METATYPE_DESCRIPTION},
366 {"req", EXTRACTOR_METATYPE_TARGET_PLATFORM}, /* hardware requirements */
367 {"fmt", EXTRACTOR_METATYPE_FORMAT},
368 {NULL, EXTRACTOR_METATYPE_RESERVED },
369};
370
371
372typedef struct
373{
374 const char *atom_type;
375 enum EXTRACTOR_MetaType type;
376} ITTagConversionEntry;
377
378/* iTunes Tags:
379 * see http://atomicparsley.sourceforge.net/mpeg-4files.html */
380static ITTagConversionEntry it_to_extr_table[] = {
381 {"\xa9" "alb", EXTRACTOR_METATYPE_ALBUM},
382 {"\xa9" "ART", EXTRACTOR_METATYPE_ARTIST},
383 {"aART", EXTRACTOR_METATYPE_ARTIST},
384 {"\xa9" "cmt", EXTRACTOR_METATYPE_COMMENT},
385 {"\xa9" "day", EXTRACTOR_METATYPE_UNKNOWN_DATE},
386 {"\xa9" "nam", EXTRACTOR_METATYPE_TITLE},
387 {"trkn", EXTRACTOR_METATYPE_TRACK_NUMBER},
388 {"disk", EXTRACTOR_METATYPE_DISC_NUMBER},
389 {"\xa9" "gen", EXTRACTOR_METATYPE_GENRE},
390 {"gnre", EXTRACTOR_METATYPE_GENRE},
391 {"\xa9" "wrt", EXTRACTOR_METATYPE_WRITER},
392 {"\xa9" "too", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
393 {"cprt", EXTRACTOR_METATYPE_COPYRIGHT},
394 {"\xa9" "grp", EXTRACTOR_METATYPE_GROUP},
395 {"catg", EXTRACTOR_METATYPE_SECTION},
396 {"keyw", EXTRACTOR_METATYPE_KEYWORDS},
397 {"desc", EXTRACTOR_METATYPE_DESCRIPTION},
398 {"tvnn", EXTRACTOR_METATYPE_TV_NETWORK_NAME},
399 {"tvsh", EXTRACTOR_METATYPE_TV_SHOW_NAME},
400 {"tven", EXTRACTOR_METATYPE_TV_NETWORK_NAME},
401 {NULL, EXTRACTOR_METATYPE_RESERVED}
402};
403
404
184typedef struct 405typedef struct
185{ 406{
186 unsigned int size; 407 unsigned int size;
@@ -204,21 +425,6 @@ ntohll (unsigned long long n)
204#endif 425#endif
205} 426}
206 427
207static void
208addKeyword (EXTRACTOR_KeywordType type,
209 const char *keyword, struct EXTRACTOR_Keywords **list)
210{
211 EXTRACTOR_KeywordList *result;
212
213 if (keyword == NULL)
214 return;
215 result = malloc (sizeof (EXTRACTOR_KeywordList));
216 result->next = *list;
217 result->keyword = strdup (keyword);
218 result->keywordType = type;
219 *list = result;
220}
221
222 428
223/** 429/**
224 * Check if at position pos there is a valid atom. 430 * Check if at position pos there is a valid atom.
@@ -285,12 +491,37 @@ getAtomHeaderSize (const char *buf)
285 return sizeof (Atom); 491 return sizeof (Atom);
286} 492}
287 493
494struct ExtractContext
495{
496 EXTRACTOR_MetaDataProcessor proc;
497 void *proc_cls;
498 int ret;
499};
500
501static void
502addKeyword (enum EXTRACTOR_MetaType type,
503 const char *str,
504 struct ExtractContext *ec)
505{
506 if (ec->ret != 0)
507 return;
508 ec->ret = ec->proc (ec->proc_cls,
509 "qt",
510 type,
511 EXTRACTOR_METAFORMAT_UTF8,
512 "text/plain",
513 str,
514 strlen(str)+1);
515}
516
517
518
288/** 519/**
289 * Assumes that checkAtomValid has already been called. 520 * Assumes that checkAtomValid has already been called.
290 */ 521 */
291typedef int (*AtomHandler) (const char *input, 522typedef int (*AtomHandler) (const char *input,
292 size_t size, 523 size_t size,
293 size_t pos, struct EXTRACTOR_Keywords ** list); 524 size_t pos, struct ExtractContext *ec);
294 525
295typedef struct 526typedef struct
296{ 527{
@@ -307,7 +538,8 @@ typedef struct
307static int handleAtom (HandlerEntry *handlers, 538static int handleAtom (HandlerEntry *handlers,
308 const char *input, 539 const char *input,
309 size_t size, 540 size_t size,
310 size_t pos, struct EXTRACTOR_Keywords **list); 541 size_t pos,
542 struct ExtractContext *ec);
311 543
312static HandlerEntry all_handlers[]; 544static HandlerEntry all_handlers[];
313static HandlerEntry ilst_handlers[]; 545static HandlerEntry ilst_handlers[];
@@ -318,7 +550,7 @@ static HandlerEntry ilst_handlers[];
318 */ 550 */
319static int 551static int
320processAtoms (HandlerEntry *handlers, const char *input, 552processAtoms (HandlerEntry *handlers, const char *input,
321 size_t size, struct EXTRACTOR_Keywords **list) 553 size_t size, struct ExtractContext *ec)
322{ 554{
323 size_t pos; 555 size_t pos;
324 556
@@ -327,7 +559,7 @@ processAtoms (HandlerEntry *handlers, const char *input,
327 pos = 0; 559 pos = 0;
328 while (pos < size - sizeof (Atom)) 560 while (pos < size - sizeof (Atom))
329 { 561 {
330 if (0 == handleAtom (handlers, input, size, pos, list)) 562 if (0 == handleAtom (handlers, input, size, pos, ec))
331 return 0; 563 return 0;
332 pos += getAtomSize (&input[pos]); 564 pos += getAtomSize (&input[pos]);
333 } 565 }
@@ -340,9 +572,9 @@ processAtoms (HandlerEntry *handlers, const char *input,
340 */ 572 */
341static int 573static int
342processAllAtoms (const char *input, 574processAllAtoms (const char *input,
343 size_t size, struct EXTRACTOR_Keywords **list) 575 size_t size, struct ExtractContext *ec)
344{ 576{
345 return processAtoms(all_handlers, input, size, list); 577 return processAtoms(all_handlers, input, size, ec);
346} 578}
347 579
348/** 580/**
@@ -351,11 +583,11 @@ processAllAtoms (const char *input,
351 */ 583 */
352static int 584static int
353moovHandler (const char *input, 585moovHandler (const char *input,
354 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 586 size_t size, size_t pos, struct ExtractContext *ec)
355{ 587{
356 unsigned int hdr = getAtomHeaderSize (&input[pos]); 588 unsigned int hdr = getAtomHeaderSize (&input[pos]);
357 return processAllAtoms (&input[pos + hdr], 589 return processAllAtoms (&input[pos + hdr],
358 getAtomSize (&input[pos]) - hdr, list); 590 getAtomSize (&input[pos]) - hdr, ec);
359} 591}
360 592
361/* see http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap1/chapter_2_section_5.html */ 593/* see http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap1/chapter_2_section_5.html */
@@ -370,39 +602,9 @@ typedef struct
370 char compatibility[4]; 602 char compatibility[4];
371} FileType; 603} FileType;
372 604
373typedef struct
374{
375 const char *ext;
376 const char *mime;
377} C2M;
378
379/* see http://www.mp4ra.org/filetype.html
380 * http://www.ftyps.com/ */
381static C2M ftMap[] = {
382 {"qt ", "video/quicktime"},
383 {"isom", "video/mp4"}, /* ISO Base Media files */
384 {"iso2", "video/mp4"},
385 {"mp41", "video/mp4"}, /* MPEG-4 (ISO/IEC 14491-1) version 1 */
386 {"mp42", "video/mp4"}, /* MPEG-4 (ISO/IEC 14491-1) version 2 */
387 {"3gp1", "video/3gpp"},
388 {"3gp2", "video/3gpp"},
389 {"3gp3", "video/3gpp"},
390 {"3gp4", "video/3gpp"},
391 {"3gp5", "video/3gpp"},
392 {"3g2a", "video/3gpp2"},
393 {"mmp4", "video/mp4"}, /* Mobile MPEG-4 */
394 {"M4A ", "audio/mp4"},
395 {"M4B ", "audio/mp4"},
396 {"M4P ", "audio/mp4"},
397 {"M4V ", "video/mp4"},
398 {"mj2s", "video/mj2"}, /* Motion JPEG 2000 */
399 {"mjp2", "video/mj2"},
400 {NULL, NULL},
401};
402
403static int 605static int
404ftypHandler (const char *input, 606ftypHandler (const char *input,
405 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 607 size_t size, size_t pos, struct ExtractContext *ec)
406{ 608{
407 const FileType *ft; 609 const FileType *ft;
408 int i; 610 int i;
@@ -416,7 +618,7 @@ ftypHandler (const char *input,
416 while ((ftMap[i].ext != NULL) && (0 != memcmp (ft->type, ftMap[i].ext, 4))) 618 while ((ftMap[i].ext != NULL) && (0 != memcmp (ft->type, ftMap[i].ext, 4)))
417 i++; 619 i++;
418 if (ftMap[i].ext != NULL) 620 if (ftMap[i].ext != NULL)
419 addKeyword (EXTRACTOR_MIMETYPE, ftMap[i].mime, list); 621 addKeyword (EXTRACTOR_METATYPE_MIMETYPE, ftMap[i].mime, ec);
420 return 1; 622 return 1;
421} 623}
422 624
@@ -452,15 +654,18 @@ typedef struct
452 654
453static int 655static int
454mvhdHandler (const char *input, 656mvhdHandler (const char *input,
455 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 657 size_t size, size_t pos, struct ExtractContext *ec)
456{ 658{
457 const MovieHeaderAtom *m; 659 const MovieHeaderAtom *m;
458 char duration[16]; 660 char duration[16];
459 if (getAtomSize (&input[pos]) != sizeof (MovieHeaderAtom)) 661 if (getAtomSize (&input[pos]) != sizeof (MovieHeaderAtom))
460 return 0; 662 return 0;
461 m = (const MovieHeaderAtom *) &input[pos]; 663 m = (const MovieHeaderAtom *) &input[pos];
462 snprintf (duration, 16, "%us", ntohl (m->duration) / ntohl (m->timeScale)); 664 snprintf (duration,
463 addKeyword (EXTRACTOR_DURATION, duration, list); 665 sizeof(duration),
666 "%us",
667 ntohl (m->duration) / ntohl (m->timeScale));
668 addKeyword (EXTRACTOR_METATYPE_DURATION, duration, ec);
464 return 1; 669 return 1;
465} 670}
466 671
@@ -475,7 +680,7 @@ typedef struct
475 680
476static int 681static int
477cmovHandler (const char *input, 682cmovHandler (const char *input,
478 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 683 size_t size, size_t pos, struct ExtractContext *ec)
479{ 684{
480 const CompressedMovieHeaderAtom *c; 685 const CompressedMovieHeaderAtom *c;
481 unsigned int s; 686 unsigned int s;
@@ -529,7 +734,7 @@ cmovHandler (const char *input,
529 free (buf); 734 free (buf);
530 return 0; /* decode error? */ 735 return 0; /* decode error? */
531 } 736 }
532 ret = handleAtom (all_handlers, buf, s, 0, list); 737 ret = handleAtom (all_handlers, buf, s, 0, ec);
533 free (buf); 738 free (buf);
534 return ret; 739 return ret;
535} 740}
@@ -566,7 +771,7 @@ typedef struct
566 771
567static int 772static int
568tkhdHandler (const char *input, 773tkhdHandler (const char *input,
569 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 774 size_t size, size_t pos, struct ExtractContext *ec)
570{ 775{
571 const TrackAtom *m; 776 const TrackAtom *m;
572 char dimensions[40]; 777 char dimensions[40];
@@ -578,33 +783,33 @@ tkhdHandler (const char *input,
578 { 783 {
579 /* if actually a/the video track */ 784 /* if actually a/the video track */
580 snprintf (dimensions, 785 snprintf (dimensions,
581 40, 786 sizeof(dimensions),
582 "%dx%d", 787 "%dx%d",
583 ntohs (m->track_width.integer), 788 ntohs (m->track_width.integer),
584 ntohs (m->track_height.integer)); 789 ntohs (m->track_height.integer));
585 addKeyword (EXTRACTOR_FORMAT, dimensions, list); 790 addKeyword (EXTRACTOR_METATYPE_IMAGE_DIMENSIONS, dimensions, ec);
586 } 791 }
587 return 1; 792 return 1;
588} 793}
589 794
590static int 795static int
591trakHandler (const char *input, 796trakHandler (const char *input,
592 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 797 size_t size, size_t pos, struct ExtractContext *ec)
593{ 798{
594 unsigned int hdr = getAtomHeaderSize (&input[pos]); 799 unsigned int hdr = getAtomHeaderSize (&input[pos]);
595 return processAllAtoms (&input[pos + hdr], 800 return processAllAtoms (&input[pos + hdr],
596 getAtomSize (&input[pos]) - hdr, list); 801 getAtomSize (&input[pos]) - hdr, ec);
597} 802}
598 803
599static int 804static int
600metaHandler (const char *input, 805metaHandler (const char *input,
601 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 806 size_t size, size_t pos, struct ExtractContext *ec)
602{ 807{
603 unsigned int hdr = getAtomHeaderSize (&input[pos]); 808 unsigned int hdr = getAtomHeaderSize (&input[pos]);
604 if (getAtomSize (&input[pos]) < hdr + 4) 809 if (getAtomSize (&input[pos]) < hdr + 4)
605 return 0; 810 return 0;
606 return processAllAtoms (&input[pos + hdr + 4], 811 return processAllAtoms (&input[pos + hdr + 4],
607 getAtomSize (&input[pos]) - hdr - 4, list); 812 getAtomSize (&input[pos]) - hdr - 4, ec);
608} 813}
609 814
610typedef struct 815typedef struct
@@ -614,117 +819,6 @@ typedef struct
614 unsigned short language; 819 unsigned short language;
615} InternationalText; 820} InternationalText;
616 821
617static const char *languages[] = {
618 "English",
619 "French",
620 "German",
621 "Italian",
622 "Dutch",
623 "Swedish",
624 "Spanish",
625 "Danish",
626 "Portuguese",
627 "Norwegian",
628 "Hebrew",
629 "Japanese",
630 "Arabic",
631 "Finnish",
632 "Greek",
633 "Icelandic",
634 "Maltese",
635 "Turkish",
636 "Croatian",
637 "Traditional Chinese",
638 "Urdu",
639 "Hindi",
640 "Thai",
641 "Korean",
642 "Lithuanian",
643 "Polish",
644 "Hungarian",
645 "Estonian",
646 "Lettish",
647 "Saamisk",
648 "Lappish",
649 "Faeroese",
650 "Farsi",
651 "Russian",
652 "Simplified Chinese",
653 "Flemish",
654 "Irish",
655 "Albanian",
656 "Romanian",
657 "Czech",
658 "Slovak",
659 "Slovenian",
660 "Yiddish",
661 "Serbian",
662 "Macedonian",
663 "Bulgarian",
664 "Ukrainian",
665 "Byelorussian",
666 "Uzbek",
667 "Kazakh",
668 "Azerbaijani",
669 "AzerbaijanAr",
670 "Armenian",
671 "Georgian",
672 "Moldavian",
673 "Kirghiz",
674 "Tajiki",
675 "Turkmen",
676 "Mongolian",
677 "MongolianCyr",
678 "Pashto",
679 "Kurdish",
680 "Kashmiri",
681 "Sindhi",
682 "Tibetan",
683 "Nepali",
684 "Sanskrit",
685 "Marathi",
686 "Bengali",
687 "Assamese",
688 "Gujarati",
689 "Punjabi",
690 "Oriya",
691 "Malayalam",
692 "Kannada",
693 "Tamil",
694 "Telugu",
695 "Sinhalese",
696 "Burmese",
697 "Khmer",
698 "Lao",
699 "Vietnamese",
700 "Indonesian",
701 "Tagalog",
702 "MalayRoman",
703 "MalayArabic",
704 "Amharic",
705 "Tigrinya",
706 "Galla",
707 "Oromo",
708 "Somali",
709 "Swahili",
710 "Ruanda",
711 "Rundi",
712 "Chewa",
713 "Malagasy",
714 "Esperanto",
715 "Welsh",
716 "Basque",
717 "Catalan",
718 "Latin",
719 "Quechua",
720 "Guarani",
721 "Aymara",
722 "Tatar",
723 "Uighur",
724 "Dzongkha",
725 "JavaneseRom",
726};
727
728/* 822/*
729 * see http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter 823 * see http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter
730_3_section_2.html 824_3_section_2.html
@@ -735,7 +829,7 @@ static int
735processTextTag (const char *input, 829processTextTag (const char *input,
736 size_t size, 830 size_t size,
737 size_t pos, 831 size_t pos,
738 EXTRACTOR_KeywordType type, struct EXTRACTOR_Keywords **list) 832 enum EXTRACTOR_MetaType type, struct ExtractContext *ec)
739{ 833{
740 unsigned long long as; 834 unsigned long long as;
741 unsigned short len; 835 unsigned short len;
@@ -756,7 +850,7 @@ processTextTag (const char *input,
756 lang = ntohs (txt->language); 850 lang = ntohs (txt->language);
757 if (lang >= sizeof (languages) / sizeof (char *)) 851 if (lang >= sizeof (languages) / sizeof (char *))
758 return 0; /* invalid */ 852 return 0; /* invalid */
759 addKeyword (EXTRACTOR_LANGUAGE, languages[lang], list); 853 addKeyword (EXTRACTOR_METATYPE_DOCUMENT_LANGUAGE, languages[lang], ec);
760 854
761 meta = malloc (len + 1); 855 meta = malloc (len + 1);
762 memcpy (meta, &txt[1], len); 856 memcpy (meta, &txt[1], len);
@@ -764,55 +858,15 @@ processTextTag (const char *input,
764 for (i = 0; i < len; i++) 858 for (i = 0; i < len; i++)
765 if (meta[i] == '\r') 859 if (meta[i] == '\r')
766 meta[i] = '\n'; 860 meta[i] = '\n';
767 addKeyword (type, meta, list); 861 addKeyword (type, meta, ec);
768 free (meta); 862 free (meta);
769 return 1; 863 return 1;
770} 864}
771 865
772typedef struct CHE
773{
774 const char *pfx;
775 EXTRACTOR_KeywordType type;
776} CHE;
777
778static CHE cHm[] = {
779 {"aut", EXTRACTOR_AUTHOR,},
780 {"cpy", EXTRACTOR_COPYRIGHT,},
781 {"day", EXTRACTOR_CREATION_DATE,},
782 {"cmt", EXTRACTOR_COMMENT,},
783 {"hst", EXTRACTOR_BUILDHOST,},
784 {"inf", EXTRACTOR_INFORMATION,},
785 {"nam", EXTRACTOR_FULL_NAME,},
786 {"mak", EXTRACTOR_CAMERA_MAKE,},
787 {"mod", EXTRACTOR_CAMERA_MODEL,},
788 {"des", EXTRACTOR_DESCRIPTION,},
789 {"dis", EXTRACTOR_DISCLAIMER,},
790 {"dir", EXTRACTOR_MOVIE_DIRECTOR,},
791 {"src", EXTRACTOR_CONTRIBUTOR,},
792 {"prf", EXTRACTOR_ARTIST,}, /* performer */
793 {"req", EXTRACTOR_CREATED_FOR,}, /* hardware requirements */
794 {"fmt", EXTRACTOR_FORMAT,},
795 {"prd", EXTRACTOR_PRODUCER,},
796 {"PRD", EXTRACTOR_PRODUCTVERSION,}, /* just product */
797 {"swr", EXTRACTOR_SOFTWARE,},
798 {"wrt", EXTRACTOR_AUTHOR,}, /* writer */
799 {"wrn", EXTRACTOR_WARNING,},
800 {"ed1", EXTRACTOR_REVISION_HISTORY,},
801 {"ed2", EXTRACTOR_REVISION_HISTORY,},
802 {"ed3", EXTRACTOR_REVISION_HISTORY,},
803 {"ed4", EXTRACTOR_REVISION_HISTORY,},
804 {"ed5", EXTRACTOR_REVISION_HISTORY,},
805 {"ed6", EXTRACTOR_REVISION_HISTORY,},
806 {"ed7", EXTRACTOR_REVISION_HISTORY,},
807 {"ed8", EXTRACTOR_REVISION_HISTORY,},
808 {"ed9", EXTRACTOR_REVISION_HISTORY,},
809 {"chp", EXTRACTOR_CHAPTER,},
810 {NULL, EXTRACTOR_UNKNOWN},
811};
812 866
813static int 867static int
814c_Handler (const char *input, 868c_Handler (const char *input,
815 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 869 size_t size, size_t pos, struct ExtractContext *ec)
816{ 870{
817 int i; 871 int i;
818 872
@@ -820,26 +874,26 @@ c_Handler (const char *input,
820 while ((cHm[i].pfx != NULL) && (0 != memcmp (&input[pos+5], cHm[i].pfx, 3))) 874 while ((cHm[i].pfx != NULL) && (0 != memcmp (&input[pos+5], cHm[i].pfx, 3)))
821 i++; 875 i++;
822 if (cHm[i].pfx != NULL) 876 if (cHm[i].pfx != NULL)
823 return processTextTag (input, size, pos, cHm[i].type, list); 877 return processTextTag (input, size, pos, cHm[i].type, ec);
824 return -1; /* not found */ 878 return -1; /* not found */
825} 879}
826 880
827static int 881static int
828udtaHandler (const char *input, 882udtaHandler (const char *input,
829 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 883 size_t size, size_t pos, struct ExtractContext *ec)
830{ 884{
831 unsigned int hdr = getAtomHeaderSize (&input[pos]); 885 unsigned int hdr = getAtomHeaderSize (&input[pos]);
832 return processAllAtoms (&input[pos + hdr], 886 return processAllAtoms (&input[pos + hdr],
833 getAtomSize (&input[pos]) - hdr, list); 887 getAtomSize (&input[pos]) - hdr, ec);
834} 888}
835 889
836static int 890static int
837processDataAtom (const char *input, 891processDataAtom (const char *input,
838 size_t size, /* parent atom size */ 892 size_t size, /* parent atom size */
839 size_t pos, 893 size_t pos,
840 const char *patom, 894 const char *patom,
841 EXTRACTOR_KeywordType type, 895 enum EXTRACTOR_MetaType type,
842 struct EXTRACTOR_Keywords **list) 896 struct ExtractContext *ec)
843{ 897{
844 char *meta; 898 char *meta;
845 unsigned char version; 899 unsigned char version;
@@ -877,7 +931,7 @@ processDataAtom (const char *input,
877 unsigned short genre = ((unsigned char)input[pos+16] << 8) | 931 unsigned short genre = ((unsigned char)input[pos+16] << 8) |
878 (unsigned char)input[pos+17]; 932 (unsigned char)input[pos+17];
879 if (genre > 0 && genre < GENRE_NAME_COUNT) 933 if (genre > 0 && genre < GENRE_NAME_COUNT)
880 addKeyword(type, genre_names[genre-1], list); 934 addKeyword(type, genre_names[genre-1], ec);
881 } 935 }
882 return 1; 936 return 1;
883 } 937 }
@@ -888,7 +942,7 @@ processDataAtom (const char *input,
888 (unsigned char)input[pos+19]; 942 (unsigned char)input[pos+19];
889 char s[8]; 943 char s[8];
890 snprintf(s, 8, "%d", n); 944 snprintf(s, 8, "%d", n);
891 addKeyword(type, s, list); 945 addKeyword(type, s, ec);
892 } 946 }
893 } 947 }
894 else { 948 else {
@@ -902,7 +956,7 @@ processDataAtom (const char *input,
902 for (i = 0; i < len; i++) 956 for (i = 0; i < len; i++)
903 if (meta[i] == '\r') 957 if (meta[i] == '\r')
904 meta[i] = '\n'; 958 meta[i] = '\n';
905 addKeyword (type, meta, list); 959 addKeyword (type, meta, ec);
906 free (meta); 960 free (meta);
907 return 1; 961 return 1;
908 } 962 }
@@ -910,44 +964,12 @@ processDataAtom (const char *input,
910 return -1; 964 return -1;
911} 965}
912 966
913typedef struct
914{
915 const char *atom_type;
916 EXTRACTOR_KeywordType type;
917} ITTagConversionEntry;
918
919/* iTunes Tags:
920 * see http://atomicparsley.sourceforge.net/mpeg-4files.html */
921static ITTagConversionEntry it_to_extr_table[] = {
922 {"\xa9" "alb", EXTRACTOR_ALBUM,},
923 {"\xa9" "ART", EXTRACTOR_ARTIST,},
924 {"aART", EXTRACTOR_ARTIST,},
925 {"\xa9" "cmt", EXTRACTOR_COMMENT,},
926 {"\xa9" "day", EXTRACTOR_YEAR,},
927 {"\xa9" "nam", EXTRACTOR_TITLE,},
928 {"trkn", EXTRACTOR_TRACK_NUMBER,},
929 {"disk", EXTRACTOR_DISC_NUMBER,},
930 {"\xa9" "gen", EXTRACTOR_GENRE,},
931 {"gnre", EXTRACTOR_GENRE,},
932 {"\xa9" "wrt", EXTRACTOR_AUTHOR,},
933 {"\xa9" "too", EXTRACTOR_ENCODED_BY,},
934 {"cprt", EXTRACTOR_COPYRIGHT,},
935 {"\xa9" "grp", EXTRACTOR_GROUP,},
936 {"catg", EXTRACTOR_CATEGORY,},
937 {"keyw", EXTRACTOR_KEYWORDS,},
938 {"desc", EXTRACTOR_DESCRIPTION,},
939 {"tvnn", EXTRACTOR_PUBLISHER,}, /* TV Network Name */
940 {"tvsh", EXTRACTOR_TITLE,}, /* TV Show Name */
941/* {"tven", EXTRACTOR_i,},*/ /* TV Network Name */
942 {NULL, EXTRACTOR_UNKNOWN},
943};
944
945/* NOTE: iTunes tag processing should, in theory, be limited to iTunes 967/* NOTE: iTunes tag processing should, in theory, be limited to iTunes
946 * file types (from ftyp), but, in reality, it seems that there are other 968 * file types (from ftyp), but, in reality, it seems that there are other
947 * files, like 3gpp, out in the wild with iTunes tags. */ 969 * files, like 3gpp, out in the wild with iTunes tags. */
948static int 970static int
949iTunesTagHandler (const char *input, 971iTunesTagHandler (const char *input,
950 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 972 size_t size, size_t pos, struct ExtractContext *ec)
951{ 973{
952 unsigned long long asize; 974 unsigned long long asize;
953 unsigned int hdr; 975 unsigned int hdr;
@@ -965,7 +987,7 @@ iTunesTagHandler (const char *input,
965 i++; 987 i++;
966 if (it_to_extr_table[i].atom_type != NULL) 988 if (it_to_extr_table[i].atom_type != NULL)
967 return processDataAtom(input, asize, pos+hdr, &input[pos], 989 return processDataAtom(input, asize, pos+hdr, &input[pos],
968 it_to_extr_table[i].type, list); 990 it_to_extr_table[i].type, ec);
969 991
970 return -1; 992 return -1;
971} 993}
@@ -973,11 +995,11 @@ iTunesTagHandler (const char *input,
973 995
974static int 996static int
975ilstHandler (const char *input, 997ilstHandler (const char *input,
976 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 998 size_t size, size_t pos, struct ExtractContext *ec)
977{ 999{
978 unsigned int hdr = getAtomHeaderSize (&input[pos]); 1000 unsigned int hdr = getAtomHeaderSize (&input[pos]);
979 return processAtoms(ilst_handlers, &input[pos + hdr], 1001 return processAtoms(ilst_handlers, &input[pos + hdr],
980 getAtomSize(&input[pos]) - hdr, list); 1002 getAtomSize(&input[pos]) - hdr, ec);
981} 1003}
982 1004
983 1005
@@ -1069,7 +1091,7 @@ static HandlerEntry ilst_handlers[] = {
1069 */ 1091 */
1070static int 1092static int
1071handleAtom (HandlerEntry *handlers, const char *input, 1093handleAtom (HandlerEntry *handlers, const char *input,
1072 size_t size, size_t pos, struct EXTRACTOR_Keywords **list) 1094 size_t size, size_t pos, struct ExtractContext *ec)
1073{ 1095{
1074 int i; 1096 int i;
1075 if (0 == checkAtomValid (input, size, pos)) 1097 if (0 == checkAtomValid (input, size, pos))
@@ -1090,7 +1112,7 @@ handleAtom (HandlerEntry *handlers, const char *input,
1090#endif 1112#endif
1091 return -1; 1113 return -1;
1092 } 1114 }
1093 i = handlers[i].handler (input, size, pos, list); 1115 i = handlers[i].handler (input, size, pos, ec);
1094#if DEBUG 1116#if DEBUG
1095 printf ("Running handler for `%4s' at %u completed with result %d\n", 1117 printf ("Running handler for `%4s' at %u completed with result %d\n",
1096 &input[pos + 4], pos, i); 1118 &input[pos + 4], pos, i);
@@ -1103,13 +1125,20 @@ handleAtom (HandlerEntry *handlers, const char *input,
1103 video/x-quicktime: mov,qt: Quicktime animation; 1125 video/x-quicktime: mov,qt: Quicktime animation;
1104 application/x-quicktimeplayer: qtl: Quicktime list; 1126 application/x-quicktimeplayer: qtl: Quicktime list;
1105 */ 1127 */
1106struct EXTRACTOR_Keywords * 1128
1107libextractor_qt_extract (const char *filename, 1129int
1108 const char *data, 1130EXTRACTOR_qt_extract (const char *data,
1109 size_t size, struct EXTRACTOR_Keywords *prev) 1131 size_t size,
1132 EXTRACTOR_MetaDataProcessor proc,
1133 void *proc_cls,
1134 const char *options)
1110{ 1135{
1111 processAllAtoms (data, size, &prev); 1136 struct ExtractContext ec;
1112 return prev; 1137 ec.proc = proc;
1138 ec.proc_cls = proc_cls;
1139 ec.ret = 0;
1140 processAllAtoms (data, size, &ec);
1141 return ec.ret;
1113} 1142}
1114 1143
1115/* end of qtextractor.c */ 1144/* end of qt_extractor.c */
diff --git a/src/plugins/rpm_extractor.c b/src/plugins/rpm_extractor.c
index d77da7a..f8ed431 100644
--- a/src/plugins/rpm_extractor.c
+++ b/src/plugins/rpm_extractor.c
@@ -81,7 +81,7 @@ static Matches tests[] = {
81#endif 81#endif
82 {RPMTAG_LICENSE, EXTRACTOR_METATYPE_LICENSE}, 82 {RPMTAG_LICENSE, EXTRACTOR_METATYPE_LICENSE},
83 {RPMTAG_DISTRIBUTION, EXTRACTOR_METATYPE_PACKAGE_DISTRIBUTION}, 83 {RPMTAG_DISTRIBUTION, EXTRACTOR_METATYPE_PACKAGE_DISTRIBUTION},
84 {RPMTAG_BUILDHOST, EXTRACTOR_METATYPE_PACKAGE_BUILDHOST}, 84 {RPMTAG_BUILDHOST, EXTRACTOR_METATYPE_BUILDHOST},
85 {RPMTAG_VENDOR, EXTRACTOR_METATYPE_VENDOR}, 85 {RPMTAG_VENDOR, EXTRACTOR_METATYPE_VENDOR},
86 {RPMTAG_OS, EXTRACTOR_METATYPE_TARGET_OS}, 86 {RPMTAG_OS, EXTRACTOR_METATYPE_TARGET_OS},
87 {RPMTAG_DESCRIPTION, EXTRACTOR_METATYPE_DESCRIPTION}, 87 {RPMTAG_DESCRIPTION, EXTRACTOR_METATYPE_DESCRIPTION},