#!/usr/bin/perl # This is a hack, which takes a Digikam album, finds all photos # possessing a "web" tag and imports them to UCW::Gallery. use common::sense; use Cwd; use DBI; use Getopt::Long; if (@ARGV && $ARGV[0] eq '--help') { die <] AMEN } my $photos_root = $ENV{HOME} . '/photos'; my $album = $ARGV[0]; if (!defined $album) { my $cwd = getcwd; $cwd =~ m{/photos/(.*)} or die "Cannot identify album from current directory, need to specify maunally.\n"; $album = $1; } if (! -f "gallery.cf") { system 'gal', 'mj-init'; die if $?; } my $dbfile = "$photos_root/digikam4.db"; my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", "", "") or die "Cannot access $dbfile\n"; my %alba = (); for my $r (@{$dbh->selectall_arrayref( 'SELECT a.id AS id, r.label AS label, a.relativePath AS rpath FROM Albums a JOIN AlbumRoots r ON (r.id = a.albumRoot)', { Slice => {} })}) { my $name = $r->{label} . $r->{rpath}; # print "$name\n"; $alba{$name} = $r->{id}; } my $album_id = $alba{$album} // die "Unknown album $album\n"; print "## Album $album: id=$album_id\n"; my ($tag_id) = $dbh->selectrow_array('SELECT id FROM Tags WHERE pid=0 AND name="web"'); $tag_id // die "Cannot find web tag\n"; print "## Tag ID: $tag_id\n"; my $res = $dbh->selectall_arrayref( < {} }, SELECT i.name AS name, p.latitudeNumber AS lat, p.longitudeNumber AS lon, p.altitude AS alt, inf.creationDate AS cdate, cmt.comment FROM Images i JOIN ImageTags t ON (i.id = t.imageid) LEFT JOIN ImagePositions p ON (i.id = p.imageid) LEFT JOIN ImageInformation inf ON (i.id = inf.imageid) LEFT JOIN ImageComments cmt ON (i.id = cmt.imageid) WHERE i.album=? AND t.tagid=? AND ((cmt.type=3 AND cmt.language='x-default' AND cmt.author IS NULL) OR cmt.type IS NULL) ORDER BY cdate, i.modificationDate AMEN $album_id, $tag_id, ); open OUT, '|-', $ENV{GALLERY_ROOT} . '/bin/gal-scan' or die "Cannot feed gal scan\n"; for my $r (@$res) { print OUT join("\t", "$photos_root/$album/" . $r->{name}, '-', # no ID '-', # rotation = autodetect '-', # transform = autodetect $r->{comment} // "", ), "\n"; for my $k (qw(lat lon alt)) { print OUT "\t$k=", $r->{$k}, "\n" if defined $r->{$k}; } } close OUT;