Sophie

Sophie

distrib > Mandriva > current > i586 > by-pkgid > 99044a4c52d9540eb881fca012f267d8 > files > 4

vdr-plugin-xineliboutput-1.0.5-4mdv2010.1.src.rpm

diff -Nurpa -x '*~' -x '*.orig' -x '*.rej' -x '*.swp' xineliboutput-1.0.5//tools/metainfo_menu.c newdir/tools/metainfo_menu.c
--- xineliboutput-1.0.5//tools/metainfo_menu.c	2010-05-21 19:17:30.583647682 +0300
+++ xineliboutput-1.0.5/tools/metainfo_menu.c	2010-05-21 19:17:31.594397429 +0300
@@ -19,15 +19,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)
@@ -45,32 +102,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);
@@ -85,14 +151,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));
 }