1 |
vapier 12/10/02 06:35:33 |
2 |
|
3 |
Added: mediatomb-0.12.1-libextractor.patch |
4 |
Log: |
5 |
Port to libextractor-0.6.x by me #435394 by BT. |
6 |
|
7 |
(Portage version: 2.2.0_alpha131/cvs/Linux x86_64) |
8 |
|
9 |
Revision Changes Path |
10 |
1.1 net-misc/mediatomb/files/mediatomb-0.12.1-libextractor.patch |
11 |
|
12 |
file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/mediatomb/files/mediatomb-0.12.1-libextractor.patch?rev=1.1&view=markup |
13 |
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/mediatomb/files/mediatomb-0.12.1-libextractor.patch?rev=1.1&content-type=text/plain |
14 |
|
15 |
Index: mediatomb-0.12.1-libextractor.patch |
16 |
=================================================================== |
17 |
http://bugs.gentoo.org/435394 |
18 |
|
19 |
port to libextractor-0.6.x |
20 |
|
21 |
patch by Mike Frysinger <vapier@g.o> |
22 |
|
23 |
--- a/configure.ac |
24 |
+++ b/configure.ac |
25 |
@@ -1631,7 +1631,7 @@ MT_CHECK_OPTIONAL_PACKAGE([lastfmlib], [disable], |
26 |
######## extractor |
27 |
|
28 |
if test "x$LIBEXTRACTOR_OPTION_ENABLED" = xyes; then |
29 |
- MT_CHECK_PACKAGE([libextractor], [extractor], [extractor], [EXTRACTOR_getKeywords]) |
30 |
+ MT_CHECK_PACKAGE([libextractor], [extractor], [extractor], [EXTRACTOR_extract]) |
31 |
fi |
32 |
|
33 |
if test "x$LIBEXTRACTOR_STATUS" = xyes; then |
34 |
--- a/src/metadata/extractor_handler.cc |
35 |
+++ b/src/metadata/extractor_handler.cc |
36 |
@@ -55,322 +55,344 @@ ExtractorHandler::ExtractorHandler() : MetadataHandler() |
37 |
{ |
38 |
} |
39 |
|
40 |
-static EXTRACTOR_KeywordType getTagFromString(String tag) |
41 |
+static EXTRACTOR_MetaType getTagFromString(String tag) |
42 |
{ |
43 |
- if (tag == "EXTRACTOR_UNKNOWN") |
44 |
- return EXTRACTOR_UNKNOWN; |
45 |
- if (tag == "EXTRACTOR_FILENAME") |
46 |
- return EXTRACTOR_FILENAME; |
47 |
- if (tag == "EXTRACTOR_MIMETYPE") |
48 |
- return EXTRACTOR_MIMETYPE; |
49 |
- if (tag == "EXTRACTOR_TITLE") |
50 |
- return EXTRACTOR_TITLE; |
51 |
- if (tag == "EXTRACTOR_AUTHOR") |
52 |
- return EXTRACTOR_AUTHOR; |
53 |
- if (tag == "EXTRACTOR_ARTIST") |
54 |
- return EXTRACTOR_ARTIST; |
55 |
- if (tag == "EXTRACTOR_DESCRIPTION") |
56 |
- return EXTRACTOR_DESCRIPTION; |
57 |
- if (tag == "EXTRACTOR_COMMENT") |
58 |
- return EXTRACTOR_COMMENT; |
59 |
- if (tag == "EXTRACTOR_DATE") |
60 |
- return EXTRACTOR_DATE; |
61 |
- if (tag == "EXTRACTOR_PUBLISHER") |
62 |
- return EXTRACTOR_PUBLISHER; |
63 |
- if (tag == "EXTRACTOR_LANGUAGE") |
64 |
- return EXTRACTOR_LANGUAGE; |
65 |
- if (tag == "EXTRACTOR_ALBUM") |
66 |
- return EXTRACTOR_ALBUM; |
67 |
- if (tag == "EXTRACTOR_GENRE") |
68 |
- return EXTRACTOR_GENRE; |
69 |
- if (tag == "EXTRACTOR_LOCATION") |
70 |
- return EXTRACTOR_LOCATION; |
71 |
- if (tag == "EXTRACTOR_VERSIONNUMBER") |
72 |
- return EXTRACTOR_VERSIONNUMBER; |
73 |
- if (tag == "EXTRACTOR_ORGANIZATION") |
74 |
- return EXTRACTOR_ORGANIZATION; |
75 |
- if (tag == "EXTRACTOR_COPYRIGHT") |
76 |
- return EXTRACTOR_COPYRIGHT; |
77 |
- if (tag == "EXTRACTOR_SUBJECT") |
78 |
- return EXTRACTOR_SUBJECT; |
79 |
- if (tag == "EXTRACTOR_KEYWORDS") |
80 |
- return EXTRACTOR_KEYWORDS; |
81 |
- if (tag == "EXTRACTOR_CONTRIBUTOR") |
82 |
- return EXTRACTOR_CONTRIBUTOR; |
83 |
- if (tag == "EXTRACTOR_RESOURCE_TYPE") |
84 |
- return EXTRACTOR_RESOURCE_TYPE; |
85 |
- if (tag == "EXTRACTOR_FORMAT") |
86 |
- return EXTRACTOR_FORMAT; |
87 |
- if (tag == "EXTRACTOR_RESOURCE_IDENTIFIER") |
88 |
- return EXTRACTOR_RESOURCE_IDENTIFIER; |
89 |
- if (tag == "EXTRACTOR_SOURCE") |
90 |
- return EXTRACTOR_SOURCE; |
91 |
- if (tag == "EXTRACTOR_RELATION") |
92 |
- return EXTRACTOR_RELATION; |
93 |
- if (tag == "EXTRACTOR_COVERAGE") |
94 |
- return EXTRACTOR_COVERAGE; |
95 |
- if (tag == "EXTRACTOR_SOFTWARE") |
96 |
- return EXTRACTOR_SOFTWARE; |
97 |
- if (tag == "EXTRACTOR_DISCLAIMER") |
98 |
- return EXTRACTOR_DISCLAIMER; |
99 |
- if (tag == "EXTRACTOR_WARNING") |
100 |
- return EXTRACTOR_WARNING; |
101 |
- if (tag == "EXTRACTOR_TRANSLATED") |
102 |
- return EXTRACTOR_TRANSLATED; |
103 |
- if (tag == "EXTRACTOR_CREATION_DATE") |
104 |
- return EXTRACTOR_CREATION_DATE; |
105 |
- if (tag == "EXTRACTOR_MODIFICATION_DATE") |
106 |
- return EXTRACTOR_MODIFICATION_DATE; |
107 |
- if (tag == "EXTRACTOR_CREATOR") |
108 |
- return EXTRACTOR_CREATOR; |
109 |
- if (tag == "EXTRACTOR_PRODUCER") |
110 |
- return EXTRACTOR_PRODUCER; |
111 |
- if (tag == "EXTRACTOR_PAGE_COUNT") |
112 |
- return EXTRACTOR_PAGE_COUNT; |
113 |
- if (tag == "EXTRACTOR_PAGE_ORIENTATION") |
114 |
- return EXTRACTOR_PAGE_ORIENTATION; |
115 |
- if (tag == "EXTRACTOR_PAPER_SIZE") |
116 |
- return EXTRACTOR_PAPER_SIZE; |
117 |
- if (tag == "EXTRACTOR_USED_FONTS") |
118 |
- return EXTRACTOR_USED_FONTS; |
119 |
- if (tag == "EXTRACTOR_PAGE_ORDER") |
120 |
- return EXTRACTOR_PAGE_ORDER; |
121 |
- if (tag == "EXTRACTOR_CREATED_FOR") |
122 |
- return EXTRACTOR_CREATED_FOR; |
123 |
- if (tag == "EXTRACTOR_MAGNIFICATION") |
124 |
- return EXTRACTOR_MAGNIFICATION; |
125 |
- if (tag == "EXTRACTOR_RELEASE") |
126 |
- return EXTRACTOR_RELEASE; |
127 |
- if (tag == "EXTRACTOR_GROUP") |
128 |
- return EXTRACTOR_GROUP; |
129 |
- if (tag == "EXTRACTOR_SIZE") |
130 |
- return EXTRACTOR_SIZE; |
131 |
- if (tag == "EXTRACTOR_SUMMARY") |
132 |
- return EXTRACTOR_SUMMARY; |
133 |
- if (tag == "EXTRACTOR_PACKAGER") |
134 |
- return EXTRACTOR_PACKAGER; |
135 |
- if (tag == "EXTRACTOR_VENDOR") |
136 |
- return EXTRACTOR_VENDOR; |
137 |
- if (tag == "EXTRACTOR_LICENSE") |
138 |
- return EXTRACTOR_LICENSE; |
139 |
- if (tag == "EXTRACTOR_DISTRIBUTION") |
140 |
- return EXTRACTOR_DISTRIBUTION; |
141 |
- if (tag == "EXTRACTOR_BUILDHOST") |
142 |
- return EXTRACTOR_BUILDHOST; |
143 |
- if (tag == "EXTRACTOR_OS") |
144 |
- return EXTRACTOR_OS; |
145 |
- if (tag == "EXTRACTOR_DEPENDENCY") |
146 |
- return EXTRACTOR_DEPENDENCY; |
147 |
- if (tag == "EXTRACTOR_HASH_MD4") |
148 |
- return EXTRACTOR_HASH_MD4; |
149 |
- if (tag == "EXTRACTOR_HASH_MD5") |
150 |
- return EXTRACTOR_HASH_MD5; |
151 |
- if (tag == "EXTRACTOR_HASH_SHA0") |
152 |
- return EXTRACTOR_HASH_SHA0; |
153 |
- if (tag == "EXTRACTOR_HASH_SHA1") |
154 |
- return EXTRACTOR_HASH_SHA1; |
155 |
- if (tag == "EXTRACTOR_HASH_RMD160") |
156 |
- return EXTRACTOR_HASH_RMD160; |
157 |
- if (tag == "EXTRACTOR_RESOLUTION") |
158 |
- return EXTRACTOR_RESOLUTION; |
159 |
- if (tag == "EXTRACTOR_CATEGORY") |
160 |
- return EXTRACTOR_CATEGORY; |
161 |
- if (tag == "EXTRACTOR_BOOKTITLE") |
162 |
- return EXTRACTOR_BOOKTITLE; |
163 |
- if (tag == "EXTRACTOR_PRIORITY") |
164 |
- return EXTRACTOR_PRIORITY; |
165 |
- if (tag == "EXTRACTOR_CONFLICTS") |
166 |
- return EXTRACTOR_CONFLICTS; |
167 |
- if (tag == "EXTRACTOR_REPLACES") |
168 |
- return EXTRACTOR_REPLACES; |
169 |
- if (tag == "EXTRACTOR_PROVIDES") |
170 |
- return EXTRACTOR_PROVIDES; |
171 |
- if (tag == "EXTRACTOR_CONDUCTOR") |
172 |
- return EXTRACTOR_CONDUCTOR; |
173 |
- if (tag == "EXTRACTOR_INTERPRET") |
174 |
- return EXTRACTOR_INTERPRET; |
175 |
- if (tag == "EXTRACTOR_OWNER") |
176 |
- return EXTRACTOR_OWNER; |
177 |
- if (tag == "EXTRACTOR_LYRICS") |
178 |
- return EXTRACTOR_LYRICS; |
179 |
- if (tag == "EXTRACTOR_MEDIA_TYPE") |
180 |
- return EXTRACTOR_MEDIA_TYPE; |
181 |
- if (tag == "EXTRACTOR_CONTACT") |
182 |
- return EXTRACTOR_CONTACT; |
183 |
- if (tag == "EXTRACTOR_THUMBNAIL_DATA") |
184 |
- return EXTRACTOR_THUMBNAIL_DATA; |
185 |
- |
186 |
-#ifdef EXTRACTOR_GE_0_5_2 |
187 |
- if (tag == "EXTRACTOR_PUBLICATION_DATE") |
188 |
- return EXTRACTOR_PUBLICATION_DATE; |
189 |
- if (tag == "EXTRACTOR_CAMERA_MAKE") |
190 |
- return EXTRACTOR_CAMERA_MAKE; |
191 |
- if (tag == "EXTRACTOR_CAMERA_MODEL") |
192 |
- return EXTRACTOR_CAMERA_MODEL; |
193 |
- if (tag == "EXTRACTOR_EXPOSURE") |
194 |
- return EXTRACTOR_EXPOSURE; |
195 |
- if (tag == "EXTRACTOR_APERTURE") |
196 |
- return EXTRACTOR_APERTURE; |
197 |
- if (tag == "EXTRACTOR_EXPOSURE_BIAS") |
198 |
- return EXTRACTOR_EXPOSURE_BIAS; |
199 |
- if (tag == "EXTRACTOR_FLASH") |
200 |
- return EXTRACTOR_FLASH; |
201 |
- if (tag == "EXTRACTOR_FLASH_BIAS") |
202 |
- return EXTRACTOR_FLASH_BIAS; |
203 |
- if (tag == "EXTRACTOR_FOCAL_LENGTH") |
204 |
- return EXTRACTOR_FOCAL_LENGTH; |
205 |
- if (tag == "EXTRACTOR_FOCAL_LENGTH_35MM") |
206 |
- return EXTRACTOR_FOCAL_LENGTH_35MM; |
207 |
- if (tag == "EXTRACTOR_ISO_SPEED") |
208 |
- return EXTRACTOR_ISO_SPEED; |
209 |
- if (tag == "EXTRACTOR_EXPOSURE_MODE") |
210 |
- return EXTRACTOR_EXPOSURE_MODE; |
211 |
- if (tag == "EXTRACTOR_METERING_MODE") |
212 |
- return EXTRACTOR_METERING_MODE; |
213 |
- if (tag == "EXTRACTOR_MACRO_MODE") |
214 |
- return EXTRACTOR_MACRO_MODE; |
215 |
- if (tag == "EXTRACTOR_IMAGE_QUALITY") |
216 |
- return EXTRACTOR_IMAGE_QUALITY; |
217 |
- if (tag == "EXTRACTOR_WHITE_BALANCE") |
218 |
- return EXTRACTOR_WHITE_BALANCE; |
219 |
- if (tag == "EXTRACTOR_ORIENTATION") |
220 |
- return EXTRACTOR_ORIENTATION; |
221 |
-#endif // EXTRACTOR_GE_0_5_2 |
222 |
+#define T(x) [EXTRACTOR_METATYPE_##x] = "EXTRACTOR_METATYPE_"#x, |
223 |
+ /* XXX: should convert to EXTRACTOR_metatype_to_string() somehow */ |
224 |
+ const char *types[] = |
225 |
+ { |
226 |
+ T(RESERVED) |
227 |
+ T(MIMETYPE) |
228 |
+ T(FILENAME) |
229 |
+ T(COMMENT) |
230 |
+ |
231 |
+ T(TITLE) |
232 |
+ T(BOOK_TITLE) |
233 |
+ T(BOOK_EDITION) |
234 |
+ T(BOOK_CHAPTER_NUMBER) |
235 |
+ T(JOURNAL_NAME) |
236 |
+ T(JOURNAL_VOLUME) |
237 |
+ T(JOURNAL_NUMBER) |
238 |
+ T(PAGE_COUNT) |
239 |
+ T(PAGE_RANGE) |
240 |
+ T(AUTHOR_NAME) |
241 |
+ T(AUTHOR_EMAIL) |
242 |
+ T(AUTHOR_INSTITUTION) |
243 |
+ T(PUBLISHER) |
244 |
+ T(PUBLISHER_ADDRESS) |
245 |
+ T(PUBLISHER_INSTITUTION) |
246 |
+ T(PUBLISHER_SERIES) |
247 |
+ T(PUBLICATION_TYPE) |
248 |
+ T(PUBLICATION_YEAR) |
249 |
+ T(PUBLICATION_MONTH) |
250 |
+ T(PUBLICATION_DAY) |
251 |
+ T(PUBLICATION_DATE) |
252 |
+ T(BIBTEX_EPRINT) |
253 |
+ T(BIBTEX_ENTRY_TYPE) |
254 |
+ T(LANGUAGE) |
255 |
+ T(CREATION_TIME) |
256 |
+ T(URL) |
257 |
+ |
258 |
+ T(URI) |
259 |
+ T(ISRC) |
260 |
+ T(HASH_MD4) |
261 |
+ T(HASH_MD5) |
262 |
+ T(HASH_SHA0) |
263 |
+ T(HASH_SHA1) |
264 |
+ T(HASH_RMD160) |
265 |
+ |
266 |
+ T(GPS_LATITUDE_REF) |
267 |
+ T(GPS_LATITUDE) |
268 |
+ T(GPS_LONGITUDE_REF) |
269 |
+ T(GPS_LONGITUDE) |
270 |
+ T(LOCATION_CITY) |
271 |
+ T(LOCATION_SUBLOCATION) |
272 |
+ T(LOCATION_COUNTRY) |
273 |
+ T(LOCATION_COUNTRY_CODE) |
274 |
+ |
275 |
+ T(UNKNOWN) |
276 |
+ T(DESCRIPTION) |
277 |
+ T(COPYRIGHT) |
278 |
+ T(RIGHTS) |
279 |
+ T(KEYWORDS) |
280 |
+ T(ABSTRACT) |
281 |
+ T(SUMMARY) |
282 |
+ T(SUBJECT) |
283 |
+ T(CREATOR) |
284 |
+ T(FORMAT) |
285 |
+ T(FORMAT_VERSION) |
286 |
+ |
287 |
+ T(CREATED_BY_SOFTWARE) |
288 |
+ T(UNKNOWN_DATE) |
289 |
+ T(CREATION_DATE) |
290 |
+ T(MODIFICATION_DATE) |
291 |
+ T(LAST_PRINTED) |
292 |
+ T(LAST_SAVED_BY) |
293 |
+ T(TOTAL_EDITING_TIME) |
294 |
+ T(EDITING_CYCLES) |
295 |
+ T(MODIFIED_BY_SOFTWARE) |
296 |
+ T(REVISION_HISTORY) |
297 |
+ |
298 |
+ T(EMBEDDED_FILE_SIZE) |
299 |
+ T(FINDER_FILE_TYPE) |
300 |
+ T(FINDER_FILE_CREATOR) |
301 |
+ |
302 |
+ T(PACKAGE_NAME) |
303 |
+ T(PACKAGE_VERSION) |
304 |
+ T(SECTION) |
305 |
+ T(UPLOAD_PRIORITY) |
306 |
+ T(PACKAGE_DEPENDENCY) |
307 |
+ T(PACKAGE_CONFLICTS) |
308 |
+ T(PACKAGE_REPLACES) |
309 |
+ T(PACKAGE_PROVIDES) |
310 |
+ T(PACKAGE_RECOMMENDS) |
311 |
+ T(PACKAGE_SUGGESTS) |
312 |
+ T(PACKAGE_MAINTAINER) |
313 |
+ T(PACKAGE_INSTALLED_SIZE) |
314 |
+ T(PACKAGE_SOURCE) |
315 |
+ T(PACKAGE_ESSENTIAL) |
316 |
+ T(TARGET_ARCHITECTURE) |
317 |
+ T(PACKAGE_PRE_DEPENDENCY) |
318 |
+ T(LICENSE) |
319 |
+ T(PACKAGE_DISTRIBUTION) |
320 |
+ T(BUILDHOST) |
321 |
+ T(VENDOR) |
322 |
+ T(TARGET_OS) |
323 |
+ T(SOFTWARE_VERSION) |
324 |
+ T(TARGET_PLATFORM) |
325 |
+ T(RESOURCE_TYPE) |
326 |
+ T(LIBRARY_SEARCH_PATH) |
327 |
+ T(LIBRARY_DEPENDENCY) |
328 |
+ |
329 |
+ T(CAMERA_MAKE) |
330 |
+ T(CAMERA_MODEL) |
331 |
+ T(EXPOSURE) |
332 |
+ T(APERTURE) |
333 |
+ T(EXPOSURE_BIAS) |
334 |
+ T(FLASH) |
335 |
+ T(FLASH_BIAS) |
336 |
+ T(FOCAL_LENGTH) |
337 |
+ T(FOCAL_LENGTH_35MM) |
338 |
+ T(ISO_SPEED) |
339 |
+ T(EXPOSURE_MODE) |
340 |
+ T(METERING_MODE) |
341 |
+ T(MACRO_MODE) |
342 |
+ T(IMAGE_QUALITY) |
343 |
+ T(WHITE_BALANCE) |
344 |
+ T(ORIENTATION) |
345 |
+ T(MAGNIFICATION) |
346 |
+ |
347 |
+ T(IMAGE_DIMENSIONS) |
348 |
+ T(PRODUCED_BY_SOFTWARE) |
349 |
+ T(THUMBNAIL) |
350 |
+ T(IMAGE_RESOLUTION) |
351 |
+ T(SOURCE) |
352 |
+ |
353 |
+ T(CHARACTER_SET) |
354 |
+ T(LINE_COUNT) |
355 |
+ T(PARAGRAPH_COUNT) |
356 |
+ T(WORD_COUNT) |
357 |
+ T(CHARACTER_COUNT) |
358 |
+ T(PAGE_ORIENTATION) |
359 |
+ T(PAPER_SIZE) |
360 |
+ T(TEMPLATE) |
361 |
+ T(COMPANY) |
362 |
+ T(MANAGER) |
363 |
+ T(REVISION_NUMBER) |
364 |
+ |
365 |
+ T(DURATION) |
366 |
+ T(ALBUM) |
367 |
+ T(ARTIST) |
368 |
+ T(GENRE) |
369 |
+ T(TRACK_NUMBER) |
370 |
+ T(DISC_NUMBER) |
371 |
+ T(PERFORMER) |
372 |
+ T(CONTACT_INFORMATION) |
373 |
+ T(SONG_VERSION) |
374 |
+ T(PICTURE) |
375 |
+ T(COVER_PICTURE) |
376 |
+ T(CONTRIBUTOR_PICTURE) |
377 |
+ T(EVENT_PICTURE) |
378 |
+ T(LOGO) |
379 |
+ T(BROADCAST_TELEVISION_SYSTEM) |
380 |
+ T(SOURCE_DEVICE) |
381 |
+ T(DISCLAIMER) |
382 |
+ T(WARNING) |
383 |
+ T(PAGE_ORDER) |
384 |
+ T(WRITER) |
385 |
+ T(PRODUCT_VERSION) |
386 |
+ T(CONTRIBUTOR_NAME) |
387 |
+ T(MOVIE_DIRECTOR) |
388 |
+ T(NETWORK_NAME) |
389 |
+ T(SHOW_NAME) |
390 |
+ T(CHAPTER_NAME) |
391 |
+ T(SONG_COUNT) |
392 |
+ T(STARTING_SONG) |
393 |
+ T(PLAY_COUNTER) |
394 |
+ T(CONDUCTOR) |
395 |
+ T(INTERPRETATION) |
396 |
+ T(COMPOSER) |
397 |
+ T(BEATS_PER_MINUTE) |
398 |
+ T(ENCODED_BY) |
399 |
+ T(ORIGINAL_TITLE) |
400 |
+ T(ORIGINAL_ARTIST) |
401 |
+ T(ORIGINAL_WRITER) |
402 |
+ T(ORIGINAL_RELEASE_YEAR) |
403 |
+ T(ORIGINAL_PERFORMER) |
404 |
+ T(LYRICS) |
405 |
+ T(POPULARITY_METER) |
406 |
+ T(LICENSEE) |
407 |
+ T(MUSICIAN_CREDITS_LIST) |
408 |
+ T(MOOD) |
409 |
+ T(SUBTITLE) |
410 |
+ |
411 |
+ T(GNUNET_DISPLAY_TYPE) |
412 |
+ T(GNUNET_FULL_DATA) |
413 |
+ T(RATING) |
414 |
+ T(ORGANIZATION) |
415 |
+ T(RIPPER) |
416 |
+ T(PRODUCER) |
417 |
+ T(GROUP) |
418 |
+ T(GNUNET_ORIGINAL_FILENAME) |
419 |
+ }; |
420 |
+#undef T |
421 |
+ size_t i; |
422 |
+ |
423 |
+ for (i = 0; i < sizeof(types) / sizeof(types[0]); ++i) |
424 |
+ if (!strcmp(types[i], tag.c_str())) |
425 |
+ return (EXTRACTOR_MetaType) i; |
426 |
|
427 |
log_warning("Ignoring unknown libextractor tag: %s\n", tag.c_str()); |
428 |
- return EXTRACTOR_UNKNOWN; |
429 |
+ return EXTRACTOR_METATYPE_UNKNOWN; |
430 |
} |
431 |
|
432 |
-static void addMetaField(metadata_fields_t field, EXTRACTOR_KeywordList *keywords, Ref<CdsItem> item, Ref<StringConverter> sc) |
433 |
+struct field_state { |
434 |
+ Ref<CdsItem> item; |
435 |
+ Ref<StringConverter> sc; |
436 |
+ Ref<Array<StringBase> > aux; |
437 |
+}; |
438 |
+ |
439 |
+static int addField(void *cls, const char *plugin_name, enum EXTRACTOR_MetaType type, |
440 |
+ enum EXTRACTOR_MetaFormat format, const char *data_mime_type, |
441 |
+ const char *data, size_t data_len) |
442 |
{ |
443 |
- String value; |
444 |
- const char *temp = NULL; |
445 |
- |
446 |
+ metadata_fields_t field = M_MAX; |
447 |
+ resource_attributes_t attr = R_MAX; |
448 |
+ |
449 |
+ if (!data) |
450 |
+ return 0; |
451 |
+ |
452 |
+ log_debug("metadata %zu [%s] -> %s\n", (size_t)type, EXTRACTOR_metatype_to_string(type), data); |
453 |
+ |
454 |
/// \todo check if UTF-8 conversion is needed, may already be in UTF-8 |
455 |
- |
456 |
- switch (field) |
457 |
+ |
458 |
+ switch (type) |
459 |
{ |
460 |
- case M_TITLE: |
461 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_TITLE, keywords); |
462 |
+ case EXTRACTOR_METATYPE_TITLE: |
463 |
+ field = M_TITLE; |
464 |
break; |
465 |
- case M_ARTIST: |
466 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_ARTIST, keywords); |
467 |
+ case EXTRACTOR_METATYPE_ARTIST: |
468 |
+ field = M_ARTIST; |
469 |
break; |
470 |
- case M_ALBUM: |
471 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_ALBUM, keywords); |
472 |
+ case EXTRACTOR_METATYPE_ALBUM: |
473 |
+ field = M_ALBUM; |
474 |
break; |
475 |
- case M_DATE: |
476 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_DATE, keywords); |
477 |
+ case EXTRACTOR_METATYPE_PUBLICATION_YEAR: |
478 |
+ field = M_DATE; |
479 |
break; |
480 |
- case M_GENRE: |
481 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_GENRE, keywords); |
482 |
+ case EXTRACTOR_METATYPE_GENRE: |
483 |
+ field = M_GENRE; |
484 |
break; |
485 |
- case M_DESCRIPTION: |
486 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_DESCRIPTION, keywords); |
487 |
- |
488 |
- if (temp == NULL) |
489 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_COMMENT, keywords); |
490 |
+ case EXTRACTOR_METATYPE_DESCRIPTION: |
491 |
+ field = M_DESCRIPTION; |
492 |
+ break; |
493 |
+ case EXTRACTOR_METATYPE_COMMENT: |
494 |
+ field = M_DESCRIPTION; |
495 |
+ break; |
496 |
+ case EXTRACTOR_METATYPE_IMAGE_DIMENSIONS: |
497 |
+ attr = R_RESOLUTION; |
498 |
break; |
499 |
- default: |
500 |
- return; |
501 |
} |
502 |
|
503 |
- if (temp != NULL) |
504 |
- value = temp; |
505 |
+ String value; |
506 |
+ struct field_state *field_state = (struct field_state *)cls; |
507 |
+ Ref<CdsItem> item = field_state->item; |
508 |
+ Ref<StringConverter> sc = field_state->sc; |
509 |
+ Ref<Array<StringBase> > aux = field_state->aux; |
510 |
+ |
511 |
+ if (field == M_MAX && attr == R_MAX && aux == nil) |
512 |
+ { |
513 |
+ log_debug("no match\n"); |
514 |
+ return 0; |
515 |
+ } |
516 |
|
517 |
+ value = data; |
518 |
value = trim_string(value); |
519 |
- |
520 |
- if (string_ok(value)) |
521 |
+ if (!string_ok(value)) |
522 |
+ return 0; |
523 |
+ |
524 |
+ if (field != M_MAX) |
525 |
{ |
526 |
item->setMetadata(MT_KEYS[field].upnp, sc->convert(value)); |
527 |
-// log_debug("Setting metadata on item: %d, %s\n", field, sc->convert(value).c_str()); |
528 |
+ log_debug("Setting metadata on item: %d, %s\n", field, sc->convert(value).c_str()); |
529 |
} |
530 |
-} |
531 |
|
532 |
-static void addResourceField(resource_attributes_t attr, EXTRACTOR_KeywordList *keywords, Ref<CdsItem> item, Ref<StringConverter> sc) |
533 |
-{ |
534 |
- String value; |
535 |
- const char *temp = NULL; |
536 |
- |
537 |
- switch (attr) |
538 |
+ if (attr != R_MAX) |
539 |
{ |
540 |
- case R_RESOLUTION: |
541 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_SIZE, keywords); |
542 |
- break; |
543 |
-/* case R_SIZE: |
544 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_SIZE, keywords); |
545 |
- break; |
546 |
-*/ |
547 |
- default: |
548 |
- return; |
549 |
+ item->getResource(0)->addAttribute(MetadataHandler::getResAttrName(attr), value); |
550 |
+ log_debug("Setting attribute on item: %d, %s\n", attr, value.c_str()); |
551 |
} |
552 |
|
553 |
- if (temp != NULL) |
554 |
- value = temp; |
555 |
- |
556 |
- if (string_ok(value)) |
557 |
+ if (aux != nil) |
558 |
{ |
559 |
- item->getResource(0)->addAttribute(MetadataHandler::getResAttrName(attr), value); |
560 |
+ String tmp; |
561 |
+ for (int j = 0; j < aux->size(); j++) |
562 |
+ { |
563 |
+ tmp = aux->get(j); |
564 |
+ if (string_ok(tmp)) |
565 |
+ { |
566 |
+ if (type == getTagFromString(tmp)) |
567 |
+ { |
568 |
+ value = sc->convert(value); |
569 |
+ item->setAuxData(tmp, value); |
570 |
+ log_debug(("Adding tag: %s with value %s\n", tmp.c_str(), value.c_str())); |
571 |
+ } |
572 |
+ } |
573 |
+ } |
574 |
} |
575 |
+ |
576 |
+ return 0; |
577 |
} |
578 |
|
579 |
|
580 |
|
581 |
-Ref<RExp> ReAudioFormat; |
582 |
-EXTRACTOR_ExtractorList *extractors = NULL; |
583 |
-bool load_libraries_failed = false; |
584 |
+static Ref<RExp> ReAudioFormat; |
585 |
+static EXTRACTOR_PluginList *plugins = NULL; |
586 |
+static bool load_libraries_failed = false; |
587 |
|
588 |
void ExtractorHandler::fillMetadata(Ref<CdsItem> item) |
589 |
{ |
590 |
if (load_libraries_failed) |
591 |
return; |
592 |
- Ref<Array<StringBase> > aux; |
593 |
- Ref<StringConverter> sc = StringConverter::i2i(); |
594 |
- |
595 |
- if (! extractors) |
596 |
+ if (! plugins) |
597 |
{ |
598 |
- extractors = EXTRACTOR_loadDefaultLibraries(); |
599 |
- if (! extractors) |
600 |
+ plugins = EXTRACTOR_plugin_add_defaults(EXTRACTOR_OPTION_DEFAULT_POLICY); |
601 |
+ if (! plugins) |
602 |
+ { |
603 |
load_libraries_failed = true; |
604 |
+ return; |
605 |
+ } |
606 |
} |
607 |
- EXTRACTOR_KeywordList *keywords = EXTRACTOR_getKeywords(extractors, item->getLocation().c_str()); |
608 |
- |
609 |
- //EXTRACTOR_printKeywords(stdout, keywords); |
610 |
|
611 |
- for (int i = 0; i < M_MAX; i++) |
612 |
- addMetaField((metadata_fields_t)i, keywords, item, sc); |
613 |
- |
614 |
- for (int i = 0; i < R_MAX; i++) |
615 |
- addResourceField((resource_attributes_t)i, keywords, item, sc); |
616 |
+ log_debug("processing %s\n", item->getLocation().c_str()); |
617 |
|
618 |
Ref<ConfigManager> cm = ConfigManager::getInstance(); |
619 |
- aux = cm->getStringArrayOption(CFG_IMPORT_LIBOPTS_EXTRACTOR_AUXDATA_TAGS_LIST); |
620 |
- if (aux != nil) |
621 |
- { |
622 |
- String value; |
623 |
- String tmp; |
624 |
- const char *temp = NULL; |
625 |
- |
626 |
- for (int j = 0; j < aux->size(); j++) |
627 |
- { |
628 |
- |
629 |
- tmp = aux->get(j); |
630 |
- if (string_ok(tmp)) |
631 |
- { |
632 |
- temp = EXTRACTOR_extractLast(getTagFromString(tmp), keywords); |
633 |
- if (temp != NULL) |
634 |
- { |
635 |
- value = temp; |
636 |
- if (string_ok(value)) |
637 |
- { |
638 |
- value = sc->convert(value); |
639 |
- item->setAuxData(tmp, value); |
640 |
-// log_debug(("Adding tag: %s with value %s\n", tmp.c_str(), value.c_str())); |
641 |
- } |
642 |
- } |
643 |
- } |
644 |
- } |
645 |
- } |
646 |
+ struct field_state field_state = { |
647 |
+ .item = item, |
648 |
+ .sc = StringConverter::i2i(), |
649 |
+ .aux = cm->getStringArrayOption(CFG_IMPORT_LIBOPTS_EXTRACTOR_AUXDATA_TAGS_LIST), |
650 |
+ }; |
651 |
+ EXTRACTOR_extract(plugins, item->getLocation().c_str(), NULL, 0, addField, &field_state); |
652 |
|
653 |
if (ReAudioFormat == nil) |
654 |
{ |
655 |
@@ -379,35 +401,9 @@ void ExtractorHandler::fillMetadata(Ref<CdsItem> item) |
656 |
ReAudioFormat->compile(_("([0-9]+)\\s+kbps,\\s*([0-9]+)\\s+hz,\\s*" |
657 |
"(([0-9]+)h)?([0-9]+)m([0-9]+)\\s(\\S+)"), "i"); |
658 |
} |
659 |
- |
660 |
- /* |
661 |
- temp = EXTRACTOR_extractLast(EXTRACTOR_FORMAT, keywords); |
662 |
- log_debug("EXTRACTOR_FORMAT: %s\n", temp); |
663 |
- |
664 |
- if (temp) |
665 |
- { |
666 |
- Ref<Matcher> matcher = ReAudioFormat->match((char *)temp); |
667 |
- if (matcher != nil) |
668 |
- { |
669 |
- log_debug(("BR:%s FR:%s H:%s M:%s S:%s TYPE:%s\n", |
670 |
- matcher->group(1).c_str(), |
671 |
- matcher->group(2).c_str(), |
672 |
- matcher->group(4).c_str(), |
673 |
- matcher->group(5).c_str(), |
674 |
- matcher->group(6).c_str(), |
675 |
- matcher->group(7).c_str())); |
676 |
- } |
677 |
- else |
678 |
- { |
679 |
- log_debug(("format pattern unmatched!")); |
680 |
- } |
681 |
- } |
682 |
- |
683 |
- */ |
684 |
- EXTRACTOR_freeKeywords(keywords); |
685 |
|
686 |
// commented out for the sake of efficiency |
687 |
- // EXTRACTOR_removeAll(extractors); |
688 |
+ // EXTRACTOR_plugin_remove_all(plugins); |
689 |
} |
690 |
|
691 |
Ref<IOHandler> ExtractorHandler::serveContent(Ref<CdsItem> item, int resNum, off_t *data_size) |