[EMAIL PROTECTED], 2008-10-14 09:50:35 +0200 :

> I would like to use f-spot to just import the pictures from an
> inserted memory stick into the database without any user interaction
> and graphical ui from the command line (headless
> system). Unfortunately, I have not found any information on how to
> do this e.g. with f-spot-import nor a documentation of available
> command line parameters that could be helpful.
>
> Does f-spot support such kind of batch import, at all, and is there
> a documentation somewhere?

I have an importer script that tries to do that.  I used to do it in
Perl by accessing the database directly, but I rewrote it in C# to
make use of the F-Spot classes, so I don't have to care about the
database schema any more.  Unfortunately, there is a drawback: part of
the code in F-Spot assumes that there's an X11 server running and
available, so although the program is runnable through the command
line with no GUI, it still needs to be run under X to work.

  Old script can be found at
http://roland.entierement.nu/pages/sync-digicams.html, my new importer
is below (beware: it needs F-Spot to be patched with
http://bugzilla.gnome.org/show_bug.cgi?id=507919).

// Download pictures from a camera and import the files into F-Spot, 
non-interactively
// Roland Mas <[EMAIL PROTECTED]>
// Based on code from F-Spot by Larry Ewing and others

using System;
using System.IO;
using System.Collections;
using FSpot;
using FSpot.Utils;
using Gdk;
using Mono.GetOptions;

namespace camsync2 {
        struct Config {
                public string camera;
                public string tagname;
                public string rawtagname;
                public string destdir;
                public string camera_name;
                public int max_remaining ;
        }
        
        class MainClass {
                static Tag tag;
                static Tag rawtag;
                static Config config ;
                static Roll roll ;

                static void ReadOptions (string[] args) {
                        CamsyncOptions options = new CamsyncOptions ();
                        options.ProcessArgs (args);
                        options.Validate();
                        
                        string configfile = Path.Combine(
                                
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                                "camsync.conf");

                        if (options.config != null) {
                                configfile = options.config ;
                        }
                        
                        Nini.Config.IConfigSource configsource = new 
Nini.Config.IniConfigSource (configfile);

                        config.camera = 
configsource.Configs["default"].Get("default_camera");
                        if (options.camera != null)
                                config.camera = options.camera ;
                        if (config.camera == null) {
                                Console.WriteLine("No camera specified, 
exiting");
                                Environment.Exit (1);
                        }
                        Console.WriteLine ("Default camera : {0}", 
config.camera);
                        
                        if (options.tagname != null) {
                                config.tagname = options.tagname ;
                        } else if 
(configsource.Configs[config.camera].Get("tag_name") != null) {
                                config.tagname = 
configsource.Configs[config.camera].Get("tag_name") ;
                        } else if 
(configsource.Configs["default"].Get("tag_name") != null) {
                                config.tagname = 
configsource.Configs["default"].Get("tag_name") ;
                        } else {
                                Console.WriteLine("No tag specified, exiting");
                                Environment.Exit (1);
                        }                               

                        if (options.rawtagname != null) {
                                config.rawtagname = options.rawtagname ;
                        } else if 
(configsource.Configs[config.camera].Get("raw_tag_name") != null) {
                                config.rawtagname = 
configsource.Configs[config.camera].Get("raw_tag_name") ;
                        } else if 
(configsource.Configs["default"].Get("raw_tag_name") != null) {
                                config.rawtagname = 
configsource.Configs["default"].Get("raw_tag_name") ;
                        } else {
                                config.rawtagname = config.tagname ;
                        }                               

                        if (options.camera_name != null) {
                                config.camera_name = options.camera_name ;
                        } else if 
(configsource.Configs[config.camera].Get("camera_name") != null) {
                                config.camera_name = 
configsource.Configs[config.camera].Get("camera_name") ;
                        } else if 
(configsource.Configs["default"].Get("camera_name") != null) {
                                config.camera_name = 
configsource.Configs["default"].Get("camera_name") ;
                        } else {
                                Console.WriteLine("No camera name found, 
exiting");
                                Environment.Exit (1);
                        }                               

                        if (options.destdir != null) {
                                config.destdir = options.destdir ;
                        } else if 
(configsource.Configs[config.camera].Get("destination_dir") != null) {
                                config.destdir = 
configsource.Configs[config.camera].Get("destination_dir") ;
                        } else if 
(configsource.Configs["default"].Get("destination_dir") != null) {
                                config.destdir = 
configsource.Configs["default"].Get("destination_dir") ;
                        } else {
                                Console.WriteLine("No destination directory 
found, exiting");
                                Environment.Exit (1);
                        }                               

                        if (options.max_remaining != 0) {
                                config.max_remaining = options.max_remaining ;
                        } else if 
(configsource.Configs[config.camera].GetInt("max_remaining") != 0) {
                                config.max_remaining = 
configsource.Configs[config.camera].GetInt("max_remaining") ;
                        } else if 
(configsource.Configs["default"].GetInt("max_remaining") != 0) {
                                config.max_remaining = 
configsource.Configs["default"].GetInt("max_remaining") ;
                        } else {
                                config.max_remaining = 0 ;
                        }
                }
                
                static void RegisterPhoto(Uri uri) {
                        Pixbuf thumb ;
                        
                        Photo photo = Core.Database.Photos.GetByUri(uri);
                        if (photo == null) {
                                if (roll == null) {
                                        roll = Core.Database.Rolls.Create();
                                }
                                Console.WriteLine("Registering URI \"{0}\"", 
uri);
                                photo = Core.Database.Photos.Create(uri, 
roll.Id, out thumb);
                                photo.AddTag (tag) ;
                                if (ImageFile.IsRaw(uri.LocalPath)) {
                                        photo.AddTag (rawtag) ;
                                }
                                Core.Database.Photos.Commit(photo);
                                Core.Database.Tags.Commit(tag);
                                Core.Database.Tags.Commit(rawtag);
                        } else {
                                // Console.WriteLine("URI \"{0}\" already 
registered", uri);
                        }
                }
                
                public static void Main(string[] args) {
                        ReadOptions (args);
                        
                        Console.WriteLine("Starting up");
                        Gtk.Application.Init();
                        Console.WriteLine("{0} photos currently registered in 
database", Core.Database.Photos.TotalPhotos);
                        Console.WriteLine("Got here");
                                                
                        tag = Core.Database.Tags.GetTagByName (config.tagname);
                        if (tag == null) {
                                Console.WriteLine("No tag \"{0}\" found, 
exiting", config.tagname);
                                return ;
                        }
                        rawtag = Core.Database.Tags.GetTagByName 
(config.rawtagname);
                        if (rawtag == null) {
                                Console.WriteLine("No tag \"{0}\" found, 
exiting", config.rawtagname);
                                return ;
                        }
                        
                        Gnome.Vfs.Vfs.Initialize ();
                        Core.Database.Sync = true ;

                        GPhotoCamera cam = new GPhotoCamera ();
                        cam.DetectCameras ();
                        Console.WriteLine ("Found {0} cameras", 
cam.CameraList.Count ()) ;
                
                        bool camera_found = false ;
                        int cam_id = 0 ;
                        while ((! camera_found)
                               && (cam_id < cam.CameraList.Count ())) {
                                string camera_name = 
cam.CameraList.GetName(cam_id);
                                if (camera_name.Equals(config.camera_name)) {
                                        Console.WriteLine("Found camera \"{0}\" 
at rank {1}", camera_name, cam_id);
                                        cam.SelectCamera(cam_id);
                                        camera_found = true ;
                                        cam.InitializeCamera();
                                        
                                        foreach (GPhotoCameraFile f in 
cam.FileList) {
                                                int file_id = 
cam.FileList.IndexOf (f) ;
                                                string destfile = 
config.destdir + f.Directory + f.FileName ;
                                                
                                                string dir = 
Path.GetDirectoryName (destfile) ;
                                                if (!Directory.Exists (dir)) {
                                                        
Directory.CreateDirectory (dir) ;
                                                }
                                                if (File.Exists (destfile)) {
                                                        // 
Console.WriteLine("File \"{0}\" already exists", destfile);
                                                } else {        
                                                        Console.WriteLine 
("Saving file {0} as {1}", file_id, destfile) ;
                                                        cam.SaveFile(file_id, 
destfile);
                                                }
                                                Uri uri = 
UriUtils.PathToFileUri (destfile);
                                                RegisterPhoto (uri);
                                        }

                                        Console.WriteLine ("{0} files on 
camera", cam.FileList.Count);
                                        if (config.max_remaining > 0) {
                                                for (int file_id = 0 ; file_id 
< cam.FileList.Count - config.max_remaining ; file_id++) {
                                                        Console.WriteLine 
("Deleting {0}", file_id) ;
                                                        cam.DeleteFile 
(file_id) ;
                                                }
                                        }
                                        
                                        cam.ReleaseGPhotoResources () ;
                                        break ;
                                } else {
                                        Console.WriteLine("Found other camera 
\"{0}\" at rank {1}", camera_name, cam_id);
                                }
                                
                                cam_id++ ;
                        }
                        if (! camera_found) {
                                Console.WriteLine("Camera not found");
                        }
                        
                        int tmp = Core.Database.Photos.TotalPhotos;
                        Console.WriteLine("{0} photos currently registered in 
database", tmp);
                        Console.WriteLine("Done");

                        Environment.Exit (0);
                }
        }
        
        public class CamsyncOptions : Options {
                //--config, -f
                [Option ("use configuration file", 'f', "config")]
                public string config;

                //--camera, -c
                [Option ("import from the given camera", 'c', "camera")]
                public string camera;

                //--destdir, -d
                [Option ("base directory for destination files", 'd', 
"destdir")]
                public string destdir;

                //--tag, -t
                [Option ("tag name", 't', "tag")]
                public string tagname;

                //--rawtag, -r
                [Option ("raw tag name", 'r', "rawtag")]
                public string rawtagname;

                //--camera-name, -n
                [Option ("camera name", 'n', "camera-name")]
                public string camera_name;

                //--max-remaining, -m
                [Option ("maximum number of photos to keep", 'm', 
"max-remaining")]
                public int max_remaining;

                public CamsyncOptions () {
                        base.ParsingMode = OptionsParsingMode.Both;
                }

                public bool Validate () {
                        foreach (string s in RemainingArguments) {
                                Console.WriteLine ("Unknown option {0}", s);
                                return false;
                        }
                        
                        return true;
                }
        }
}
  Patches welcome, as well as pushing patch #507919 upstream, and
patches to remove the X11 dependency.

Roland.
-- 
Roland Mas

Plant a radish, get a radish, never any doubt!
  -- Bellamy & Hucklebee, in The Fantasticks
_______________________________________________
F-spot-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/f-spot-list

Reply via email to