Bengt Thuree wrote:

I guess I have done something bad...

Whoops --- no, I did something bad - I let one file from my slideshow interval patch sneak into this file. You can just undo the changes to PreferenceDialog.cs and it should be fine...

Here's a new patch with that diff removed...

Many apologies... I regened the patch at the last minute and didn't check it carefully enough... I guess I should have tried building it against a clean copy to be sure...

Warren
diff -ur clean/f-spot-0.1.11/src/FileImportBackend.cs 
f-spot-0.1.11/src/FileImportBackend.cs
--- clean/f-spot-0.1.11/src/FileImportBackend.cs        2006-03-12 
22:49:25.000000000 -0500
+++ f-spot-0.1.11/src/FileImportBackend.cs      2006-04-20 19:00:17.000000000 
-0400
@@ -3,6 +3,8 @@
 using Gnome;
 using System.Collections;
 using System;
+using FSpot.Xmp;
+using FSpot;
 
 public class ImportException : System.Exception {
        public ImportException (string msg) : base (msg)
@@ -142,8 +144,9 @@
 
                // FIXME Need to get the EXIF info etc.
                string path = (string) file_paths [this.count];
-               
+               string origPath = (string) file_paths [this.count];
                try {
+                                               
                        if (copy) {
                                string dest = ChooseLocation (path);
                                System.IO.File.Copy (path, dest);
@@ -152,6 +155,36 @@
                        } else {
                 photo = store.Create (path, out thumbnail);
                        }
+
+                       // check for Xmp headers in the jpeg file itself
+                       try {
+                               JpegFile jpegfile = new JpegFile(path);
+                               JpegHeader jpegheader = jpegfile.Header;
+                               XmpFile xmpfile = jpegheader.GetXmp();
+                               if (xmpfile != null) {
+                                       string [] tagNames = 
xmpfile.Store.GetTagNames();
+                                       foreach (string tagName in tagNames) {
+                                               Tag t = 
store.GetTagByName(tagName);
+                                               photo.AddTag(t);
+                                       }
+                                       store.Commit(photo);
+                               }
+                       } catch (System.Exception e) {
+                               System.Console.WriteLine ("Error reading XMP 
headers for {0}\n{1}", path, e.ToString ());
+                       }
+
+                       
+                       // check for an xmp "sidecar" file
+                       if (System.IO.File.Exists(origPath + ".xmp")) {
+                               XmpFile sidecar = new 
XmpFile(System.IO.File.OpenRead(origPath + ".xmp"));
+                               string [] tagNames = 
sidecar.Store.GetTagNames();
+                               foreach (string tagName in tagNames) {
+                                       System.Console.WriteLine("adding tag 
for: " + tagName);
+                                       Tag t = store.GetTagByName(tagName);
+                                       photo.AddTag(t);
+                               }
+                               store.Commit(photo);
+                       }
                        
                        if (tags != null) {
                                foreach (Tag t in tags) {
diff -ur clean/f-spot-0.1.11/src/MetadataStore.cs 
f-spot-0.1.11/src/MetadataStore.cs
--- clean/f-spot-0.1.11/src/MetadataStore.cs    2006-02-11 13:02:14.000000000 
-0500
+++ f-spot-0.1.11/src/MetadataStore.cs  2006-04-20 18:38:56.000000000 -0400
@@ -189,6 +189,39 @@
                        }
                }
 
+
+               // Note that this is a very incomplete implementation.  It 
currently returns an array
+               // containing all strings that appear in an RDF:Bag structure 
in the xmp file
+               // This will not work in general, but it does provide an easy 
way to import existing tags.
+               // 
+               // TODO: Implement proper XMP/RDF parsing here to only look for 
bags inside a dc:subject node
+               
+               public string []  GetTagNames() 
+               {
+                       System.Collections.ArrayList tags = new 
System.Collections.ArrayList();
+                       bool savingTags = false;
+                       foreach (SemWeb.Statement stmt in this) {
+                               if (stmt.Object.ToString() == 
"http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag";) {
+                                       savingTags = true;
+                                       continue;
+                               }
+                               if (savingTags) {
+                                       if (stmt.Object.ToString() == "_") {
+                                               savingTags = false;
+                                               continue;
+                                       }
+                                       string tag = stmt.Object.ToString();
+                                       // SemWeb puts quotes around the 
strings it returns, 
+                                       // so we need to remove them
+                                       if (tag.StartsWith("\"") && 
tag.EndsWith("\"")) {
+                                               tag = 
tag.Substring(1,tag.Length-2);
+                                       }
+                                       tags.Add(tag);
+                               }
+                       }
+                       return  (string []) tags.ToArray (typeof (string));
+               }
+
                public void Dump ()
                {
                        foreach (SemWeb.Statement stmt in this) {
diff -ur clean/f-spot-0.1.11/src/PhotoStore.cs f-spot-0.1.11/src/PhotoStore.cs
--- clean/f-spot-0.1.11/src/PhotoStore.cs       2006-03-07 12:54:54.000000000 
-0500
+++ f-spot-0.1.11/src/PhotoStore.cs     2006-04-20 18:47:18.000000000 -0400
@@ -635,6 +635,20 @@
                           Thumbnail.PathForUri (new_uri, ThumbnailSize.Large));
        }
 
+       // Lookup a tag by name --- needed for importing tags
+       // If the requested tag doesn't exist, a new top-level tag
+       // is created and returned.
+       
+       public Tag GetTagByName (string name) {
+       
+               Tag tag = tag_store.GetTagByName(name);
+               
+               if (tag == null) {
+                       tag = tag_store.CreateCategory(null,name);
+               }
+               return tag;
+       }
+
 
        // Constructor
 
_______________________________________________
F-spot-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/f-spot-list

Reply via email to