diff options
author | Christian Grothoff <christian@grothoff.org> | 2009-12-18 21:34:38 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2009-12-18 21:34:38 +0000 |
commit | 125acede703192d4fe43dc885c232d0b25cf117e (patch) | |
tree | c4c6743363d68884a3edbed7272019a1e6af876f | |
parent | 9c7cd611928aa5838bf8d5073e81d6193e73d522 (diff) | |
download | libextractor-125acede703192d4fe43dc885c232d0b25cf117e.tar.gz libextractor-125acede703192d4fe43dc885c232d0b25cf117e.zip |
qt
-rw-r--r-- | src/include/extractor.h | 13 | ||||
-rw-r--r-- | src/main/extractor_metatypes.c | 15 | ||||
-rw-r--r-- | src/plugins/Makefile.am | 18 | ||||
-rw-r--r-- | src/plugins/qt_extractor.c (renamed from src/plugins/qtextractor.c) | 585 | ||||
-rw-r--r-- | src/plugins/rpm_extractor.c | 2 |
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 = \ | |||
249 | libextractor_ps_la_LDFLAGS = \ | 250 | libextractor_ps_la_LDFLAGS = \ |
250 | $(PLUGINFLAGS) | 251 | $(PLUGINFLAGS) |
251 | 252 | ||
253 | libextractor_qt_la_SOURCES = \ | ||
254 | qt_extractor.c | ||
255 | libextractor_qt_la_LDFLAGS = \ | ||
256 | $(PLUGINFLAGS) | ||
257 | libextractor_qt_la_LIBADD = \ | ||
258 | -lz -lm | ||
259 | |||
252 | libextractor_real_la_SOURCES = \ | 260 | libextractor_real_la_SOURCES = \ |
253 | real_extractor.c | 261 | real_extractor.c |
254 | libextractor_real_la_LDFLAGS = \ | 262 | libextractor_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 | ||
316 | if HAVE_ZLIB | ||
317 | libextractor_qt_la_SOURCES = \ | ||
318 | qtextractor.c | ||
319 | libextractor_qt_la_LDFLAGS = \ | ||
320 | $(PLUGINFLAGS) | ||
321 | libextractor_qt_la_LIBADD = \ | ||
322 | -lz | ||
323 | endif | ||
324 | |||
325 | 323 | ||
326 | libextractor_id3v2_la_SOURCES = \ | 324 | libextractor_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 | ||
184 | static 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 | |||
296 | typedef 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/ */ | ||
304 | static 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 | |||
326 | typedef struct CHE | ||
327 | { | ||
328 | const char *pfx; | ||
329 | enum EXTRACTOR_MetaType type; | ||
330 | } CHE; | ||
331 | |||
332 | static 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 | |||
372 | typedef 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 */ | ||
380 | static 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 | |||
184 | typedef struct | 405 | typedef 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 | ||
207 | static void | ||
208 | addKeyword (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 | ||
494 | struct ExtractContext | ||
495 | { | ||
496 | EXTRACTOR_MetaDataProcessor proc; | ||
497 | void *proc_cls; | ||
498 | int ret; | ||
499 | }; | ||
500 | |||
501 | static void | ||
502 | addKeyword (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 | */ |
291 | typedef int (*AtomHandler) (const char *input, | 522 | typedef 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 | ||
295 | typedef struct | 526 | typedef struct |
296 | { | 527 | { |
@@ -307,7 +538,8 @@ typedef struct | |||
307 | static int handleAtom (HandlerEntry *handlers, | 538 | static 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 | ||
312 | static HandlerEntry all_handlers[]; | 544 | static HandlerEntry all_handlers[]; |
313 | static HandlerEntry ilst_handlers[]; | 545 | static HandlerEntry ilst_handlers[]; |
@@ -318,7 +550,7 @@ static HandlerEntry ilst_handlers[]; | |||
318 | */ | 550 | */ |
319 | static int | 551 | static int |
320 | processAtoms (HandlerEntry *handlers, const char *input, | 552 | processAtoms (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 | */ |
341 | static int | 573 | static int |
342 | processAllAtoms (const char *input, | 574 | processAllAtoms (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 | */ |
352 | static int | 584 | static int |
353 | moovHandler (const char *input, | 585 | moovHandler (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 | ||
373 | typedef 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/ */ | ||
381 | static 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 | |||
403 | static int | 605 | static int |
404 | ftypHandler (const char *input, | 606 | ftypHandler (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 | ||
453 | static int | 655 | static int |
454 | mvhdHandler (const char *input, | 656 | mvhdHandler (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 | ||
476 | static int | 681 | static int |
477 | cmovHandler (const char *input, | 682 | cmovHandler (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 | ||
567 | static int | 772 | static int |
568 | tkhdHandler (const char *input, | 773 | tkhdHandler (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 | ||
590 | static int | 795 | static int |
591 | trakHandler (const char *input, | 796 | trakHandler (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 | ||
599 | static int | 804 | static int |
600 | metaHandler (const char *input, | 805 | metaHandler (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 | ||
610 | typedef struct | 815 | typedef struct |
@@ -614,117 +819,6 @@ typedef struct | |||
614 | unsigned short language; | 819 | unsigned short language; |
615 | } InternationalText; | 820 | } InternationalText; |
616 | 821 | ||
617 | static 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 | |||
735 | processTextTag (const char *input, | 829 | processTextTag (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 | ||
772 | typedef struct CHE | ||
773 | { | ||
774 | const char *pfx; | ||
775 | EXTRACTOR_KeywordType type; | ||
776 | } CHE; | ||
777 | |||
778 | static 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 | ||
813 | static int | 867 | static int |
814 | c_Handler (const char *input, | 868 | c_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 | ||
827 | static int | 881 | static int |
828 | udtaHandler (const char *input, | 882 | udtaHandler (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 | ||
836 | static int | 890 | static int |
837 | processDataAtom (const char *input, | 891 | processDataAtom (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 | ||
913 | typedef 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 */ | ||
921 | static 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. */ |
948 | static int | 970 | static int |
949 | iTunesTagHandler (const char *input, | 971 | iTunesTagHandler (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 | ||
974 | static int | 996 | static int |
975 | ilstHandler (const char *input, | 997 | ilstHandler (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 | */ |
1070 | static int | 1092 | static int |
1071 | handleAtom (HandlerEntry *handlers, const char *input, | 1093 | handleAtom (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 | */ |
1106 | struct EXTRACTOR_Keywords * | 1128 | |
1107 | libextractor_qt_extract (const char *filename, | 1129 | int |
1108 | const char *data, | 1130 | EXTRACTOR_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}, |