gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r9702 - in Extractor/src: include main plugins/exiv2


From: gnunet
Subject: [GNUnet-SVN] r9702 - in Extractor/src: include main plugins/exiv2
Date: Sat, 5 Dec 2009 14:28:15 +0100

Author: grothoff
Date: 2009-12-05 14:28:15 +0100 (Sat, 05 Dec 2009)
New Revision: 9702

Modified:
   Extractor/src/include/extractor.h
   Extractor/src/main/extractor.c
   Extractor/src/plugins/exiv2/exiv2extractor.cc
Log:
also extract xmp data

Modified: Extractor/src/include/extractor.h
===================================================================
--- Extractor/src/include/extractor.h   2009-12-05 11:52:01 UTC (rev 9701)
+++ Extractor/src/include/extractor.h   2009-12-05 13:28:15 UTC (rev 9702)
@@ -197,7 +197,9 @@
   EXTRACTOR_GPS_LATITUDE_REF = 141,
   EXTRACTOR_GPS_LATITUDE = 142,
   EXTRACTOR_GPS_LONGITUDE_REF = 143,
-  EXTRACTOR_GPS_LONGITUDE = 144
+  EXTRACTOR_GPS_LONGITUDE = 144,
+  EXTRACTOR_RATING = 145,
+  EXTRACTOR_COUNTRY_CODE = 146
 } EXTRACTOR_KeywordType;
 
 /**

Modified: Extractor/src/main/extractor.c
===================================================================
--- Extractor/src/main/extractor.c      2009-12-05 11:52:01 UTC (rev 9701)
+++ Extractor/src/main/extractor.c      2009-12-05 13:28:15 UTC (rev 9702)
@@ -187,11 +187,13 @@
   gettext_noop("GPS latitude"),
   gettext_noop("GPS longitude ref"),
   gettext_noop("GPS longitude"),
+  gettext_noop("rating"), /* 145 */
+  gettext_noop("country code"),
   NULL
 };
 
 /* the number of keyword types (for bounds-checking) */
-#define HIGHEST_TYPE_NUMBER 145
+#define HIGHEST_TYPE_NUMBER 147
 
 #ifdef HAVE_LIBOGG
 #if HAVE_VORBIS

Modified: Extractor/src/plugins/exiv2/exiv2extractor.cc
===================================================================
--- Extractor/src/plugins/exiv2/exiv2extractor.cc       2009-12-05 11:52:01 UTC 
(rev 9701)
+++ Extractor/src/plugins/exiv2/exiv2extractor.cc       2009-12-05 13:28:15 UTC 
(rev 9702)
@@ -45,27 +45,30 @@
 
 extern "C" {
 
-    static struct EXTRACTOR_Keywords * addKeyword(EXTRACTOR_KeywordType type,
-                                                  char * keyword,
-                                                  struct EXTRACTOR_Keywords * 
next)
-    {
-        EXTRACTOR_KeywordList * result;
+  static struct EXTRACTOR_Keywords * 
+  addKeyword(EXTRACTOR_KeywordType type,
+            char * keyword,
+            struct EXTRACTOR_Keywords * next)
+  {
+    EXTRACTOR_KeywordList * result;
+    
+    if (keyword == NULL)
+      return next;
+    result = (EXTRACTOR_KeywordList*) malloc(sizeof(EXTRACTOR_KeywordList));
+    result->next = next;
+    result->keyword = keyword;
+    result->keywordType = type;
+    return result;
+  }
+  
+}
 
-        if (keyword == NULL)
-            return next;
-        result = (EXTRACTOR_KeywordList*) 
malloc(sizeof(EXTRACTOR_KeywordList));
-        result->next = next;
-        result->keyword = keyword;
-        result->keywordType = type;
-        return result;
-    }
 
-}
-
-struct EXTRACTOR_Keywords * addExiv2Tag(const Exiv2::ExifData& exifData,
-                                        const std::string& key,
-                                        EXTRACTOR_KeywordType type,
-                                        struct EXTRACTOR_Keywords * result)
+static struct EXTRACTOR_Keywords * 
+addExiv2Tag(const Exiv2::ExifData& exifData,
+           const std::string& key,
+           EXTRACTOR_KeywordType type,
+           struct EXTRACTOR_Keywords * result)
 {
     const char * str;
        
@@ -85,10 +88,12 @@
 }
 
 
-struct EXTRACTOR_Keywords * addIptcData(const Exiv2::IptcData& iptcData,
-                                        const std::string& key,
-                                        EXTRACTOR_KeywordType type,
-                                        struct EXTRACTOR_Keywords * result)
+
+static struct EXTRACTOR_Keywords * 
+addIptcData(const Exiv2::IptcData& iptcData,
+           const std::string& key,
+           EXTRACTOR_KeywordType type,
+           struct EXTRACTOR_Keywords * result)
 {
     const char * str;
        
@@ -113,9 +118,38 @@
 
 
 
+static struct EXTRACTOR_Keywords * 
+addXmpData(const Exiv2::XmpData& xmpData,
+           const std::string& key,
+           EXTRACTOR_KeywordType type,
+           struct EXTRACTOR_Keywords * result)
+{
+    const char * str;
+       
+    Exiv2::XmpKey ek(key);
+    Exiv2::XmpData::const_iterator md = xmpData.findKey(ek);
+    while (md != xmpData.end()) 
+      {
+       if (0 != strcmp (Exiv2::toString(md->key()).c_str(), key.c_str()))
+         break;
+       std::string ccstr = Exiv2::toString(*md);
+       str = ccstr.c_str();
+        while ( (strlen(str) > 0) && isspace(str[0])) str++;
+       if (strlen(str) > 0)
+        result = addKeyword(type,
+                            strdup(str),
+                            result);
+       md++;
+    }
+    return result;
+}
 
 
 
+
+
+
+
 extern "C" {
   
 #if WORKAROUND_905
@@ -131,6 +165,7 @@
 #endif
   {
     struct EXTRACTOR_Keywords * result = prev;
+    struct EXTRACTOR_Keywords * newResult;
     try 
       {            
        Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(data, size);
@@ -165,7 +200,6 @@
            
            // Exposure time
            // From ExposureTime, failing that, try ShutterSpeedValue
-           struct EXTRACTOR_Keywords * newResult;
            newResult = addExiv2Tag(exifData,
                                    "Exif.Photo.ExposureTime",
                                    EXTRACTOR_EXPOSURE,
@@ -480,27 +514,68 @@
          }
 
        Exiv2::IptcData &iptcData = image->iptcData();
+       Exiv2::XmpData &xmpData = image->xmpData();
+
        if (! iptcData.empty()) {
          result = addIptcData (iptcData,
                                "Iptc.Application2.Keywords",
                                EXTRACTOR_KEYWORDS,
                                result);
+         newResult = addIptcData (iptcData,
+                                  "Iptc.Application2.City",
+                                  EXTRACTOR_LOCATION_CITY,
+                                  result);
+         if ((result == newResult) && (!xmpData.empty()))
+           result = addXmpData (xmpData,
+                                "Xmp.photoshop.City",
+                                EXTRACTOR_RATING,
+                                result);
+         else
+           result = newResult;
+
          result = addIptcData (iptcData,
-                               "Iptc.Application2.City",
-                               EXTRACTOR_LOCATION_CITY,
-                               result);
-         result = addIptcData (iptcData,
                                "Iptc.Application2.SubLocation",
                                EXTRACTOR_LOCATION_SUBLOCATION,
                                result);
-         result = addIptcData (iptcData,
-                               "Iptc.Application2.CountryName",
-                               EXTRACTOR_LOCATION_COUNTRY,
-                               result);
+         newResult = addIptcData (iptcData,
+                                  "Iptc.Application2.CountryName",
+                                  EXTRACTOR_LOCATION_COUNTRY,
+                                  result);
+         if ( (result == newResult) && (!xmpData.empty())) 
+           result = addXmpData (xmpData,
+                                "Xmp.photoshop.Country",
+                                EXTRACTOR_RATING,
+                                result);
+         else
+           result = newResult;
          
        }
 
-       
+       if (! xmpData.empty()) {
+         newResult = addXmpData (xmpData,
+                                 "Xmp.xmp.Rating",
+                                 EXTRACTOR_RATING,
+                                 result);
+         if (result == newResult)
+           result = addXmpData (xmpData,
+                                "Xmp.MicrosoftPhoto.Rating",
+                                EXTRACTOR_RATING,
+                                result);
+         else
+           result = newResult;
+         result = addXmpData (xmpData,
+                              "Xmp.iptc.CountryCode",
+                              EXTRACTOR_COUNTRY_CODE,
+                              result);
+         result = addXmpData (xmpData,
+                              "Xmp.xmp.CreatorTool",
+                              EXTRACTOR_CREATED_BY_SOFTWARE,
+                              result);
+         result = addXmpData (xmpData,
+                              "Xmp.lr.hierarchicalSubject",
+                              EXTRACTOR_SUBJECT,
+                              result);
+       }       
       }
     catch (const Exiv2::AnyError& e) {
 #ifndef SUPPRESS_WARNINGS





reply via email to

[Prev in Thread] Current Thread [Next in Thread]