summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/metainfo_menu.c112
1 files changed, 91 insertions, 21 deletions
diff --git a/tools/metainfo_menu.c b/tools/metainfo_menu.c
index 64558917..ddb438ad 100644
--- a/tools/metainfo_menu.c
+++ b/tools/metainfo_menu.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: metainfo_menu.c,v 1.9 2010-02-23 18:43:00 phintuka Exp $
+ * $Id: metainfo_menu.c,v 1.10 2010-03-12 20:26:43 phintuka Exp $
*
*/
@@ -21,15 +21,72 @@
#include "metainfo_menu.h"
-#if defined(HAVE_LIBEXTRACTOR) && EXTRACTOR_VERSION >= 0x00060000
-# undef HAVE_LIBEXTRACTOR
-# warning metainfo menu: libextractor 0.6.0 API not supported
-#endif
-
//
// cMetainfoMenu
//
+struct CallbackData
+{
+ uint8_t *seen_types;
+ char *text;
+ size_t text_len;
+ size_t text_size;
+
+ CallbackData(void)
+ {
+#if defined(HAVE_LIBEXTRACTOR) && EXTRACTOR_VERSION >= 0x00060000
+ seen_types = (uint8_t*)calloc(1, EXTRACTOR_metatype_get_max());
+#else
+ seen_types = NULL;
+#endif
+ text_size = 4096;
+ text = (char*)malloc(text_size);
+ text[0] = 0;
+ text_len = 0;
+ }
+ ~CallbackData()
+ {
+ free(seen_types);
+ free(text);
+ }
+ void Append(const char *key, const char *data)
+ {
+ if (text_len < text_size - 1) {
+ cString s = cString::sprintf("%s: %s\n", key, data);
+ strn0cpy(text + text_len, s, text_size - text_len);
+ text_len = strlen(text);
+ }
+ }
+};
+
+#if defined(HAVE_LIBEXTRACTOR) && EXTRACTOR_VERSION >= 0x00060000
+static int extractor_callback_metainfo(void *priv,
+ const char *plugin_name,
+ enum EXTRACTOR_MetaType type,
+ enum EXTRACTOR_MetaFormat format,
+ const char *data_mime_type,
+ const char *data,
+ size_t data_len)
+{
+ struct CallbackData *cd = (struct CallbackData *)priv;
+
+ if (format == EXTRACTOR_METAFORMAT_UTF8 &&
+ type != EXTRACTOR_METATYPE_THUMBNAIL &&
+ cd && !cd->seen_types[type] &&
+ data && data[0]) {
+
+ const char *key = EXTRACTOR_metatype_to_string(type);
+ if (key) {
+ cd->Append(key, data);
+ cd->seen_types[type] = 1;
+ }
+ }
+
+ return 0;
+}
+#endif // defined(HAVE_LIBEXTRACTOR) && EXTRACTOR_VERSION >= 0x00060000
+
+
cMetainfoMenu::cMetainfoMenu(cString Filename) :
cOsdMenu(Filename),
m_Filename(Filename)
@@ -47,32 +104,41 @@ void cMetainfoMenu::Display(void)
{
cOsdMenu::Display();
- char metadata[4096];
- metadata[0] = 0;
+ CallbackData data;
#ifdef HAVE_LIBEXTRACTOR
+# if EXTRACTOR_VERSION >= 0x00060000
+
+ EXTRACTOR_PluginList * plugins;
+
+ plugins = EXTRACTOR_plugin_add_defaults(EXTRACTOR_OPTION_DEFAULT_POLICY);
+ EXTRACTOR_extract(plugins, m_Filename, NULL, 0, (EXTRACTOR_MetaDataProcessor)&extractor_callback_metainfo, &data);
+ EXTRACTOR_plugin_remove_all(plugins); /* unload plugins */
+
+# else // EXTRACTOR_VERSION >= 0x00060000
+
EXTRACTOR_ExtractorList * plugins;
EXTRACTOR_KeywordList * md_list;
+
plugins = EXTRACTOR_loadDefaultLibraries();
md_list = EXTRACTOR_getKeywords(plugins, m_Filename);
md_list = EXTRACTOR_removeEmptyKeywords (md_list);
md_list = EXTRACTOR_removeDuplicateKeywords(md_list, 0);
md_list = EXTRACTOR_removeKeywordsOfType(md_list, EXTRACTOR_THUMBNAILS);
- uint pos = 0;
- int n;
while(md_list) {
const char *key = EXTRACTOR_getKeywordTypeAsString(md_list->keywordType);
- if(key && pos < sizeof(metadata))
- if(0 < (n = snprintf(metadata+pos, sizeof(metadata)-pos, "%s: %s\n", key, md_list->keyword)))
- pos += n;
+ if (key)
+ data.Append(key, md_list->keyword);
md_list = md_list->next;
}
- metadata[sizeof(metadata)-1] = 0;
EXTRACTOR_freeKeywords(md_list);
EXTRACTOR_removeAll(plugins); /* unload plugins */
-#else
+
+# endif // EXTRACTOR_VERSION >= 0x00060000
+#else // HAVE_LIBEXTRACTOR
+
cString cmd;
if(xc.IsPlaylistFile(m_Filename))
cmd = cString::sprintf("file -b '%s'; cat '%s'", *m_Filename, *m_Filename);
@@ -87,14 +153,18 @@ void cMetainfoMenu::Display(void)
cPipe p;
if(p.Open(*cmd, "r")) {
- int n = fread(metadata, 1, sizeof(metadata)-1, p);
- if(n>0) {
- metadata[n] = 0;
- strreplace(metadata, ',', '\n');
+ data.text_len = fread(data.text, 1, data.text_size - 1, p);
+ if (data.text_len > 0) {
+ data.text[data.text_len] = 0;
+ strreplace(data.text, ',', '\n');
}
}
-#endif
- DisplayMenu()->SetText(metadata, false);
+
+#endif // HAVE_LIBEXTRACTOR
+
+ DisplayMenu()->SetText(data.text, false);
+ data.text = NULL;
+
cStatus::MsgOsdTextItem(cString::sprintf("%s\n%s", tr("Metainfo"), *m_Filename));
}