Allow specifying tags in the config file, default to Favorites.
[picture-display.git] / lib / Display / Plugins / Photo / FSpot.pm
1 package Display::Plugins::Photo::FSpot;
2
3 use base ('Display::Plugins::Photo');
4 use Clutter;
5 use Carp;
6 use POE;
7 use POE::Component::EasyDBI;
8 use strict;
9
10 my $default_f_spot_db = "$ENV{HOME}/.gnome2/f-spot/photos.db";
11 my $delay = 10;
12
13 sub new {
14   my $proto = shift;
15   my $class = ref($proto) || $proto;
16
17   my $self = $class->SUPER::new(@_);
18
19   bless ($self, $class);
20   $self->init();
21   return $self;
22 }
23
24 sub find_photo {
25   my $self = shift;
26
27   $self->{'kernel'}->post('FSpotDB',
28     single => {
29       sql          => $self->{'sql'},
30       placeholders => $self->{'tags'},
31       event        => 'find_photo_result',
32     }
33   );
34 }
35
36 sub find_photo_result {
37   my ($self, $kernel, $args) = @_[OBJECT, KERNEL, ARG0];
38   my $file = $args->{'result'};
39   $file =~ s|^file://||;
40
41   $kernel->yield('display_photo', $file);
42 }
43
44 sub init {
45   my $self = shift;
46
47   my $db = $self->{'config'}{'_config'}{'plugins'}{'FSpot'}{'DB'} || $default_f_spot_db;
48
49   if (! -f $db) {
50     carp "Can't find F-Spot database file: $db";
51     return;
52   }
53
54   POE::Component::EasyDBI->spawn(
55     alias => 'FSpotDB',
56     dsn   => "dbi:SQLite:dbname=" . ($self->{'config'}{'_config'}{'plugins'}{'FSpot'}{'DB'} || $default_f_spot_db),
57     username => '',
58     password => '',
59   );
60
61   $self->{'sql'} = "
62 SELECT uri
63 FROM photos, photo_tags, tags
64   WHERE photos.id = photo_tags.photo_id
65   AND photo_tags.tag_id = tags.id
66   ";
67
68   if (defined $self->{'config'}{'_config'}{'plugins'}{'FSpot'}{'tags'}) {
69     $self->{'tags'} = $self->{'config'}{'_config'}{'plugins'}{'FSpot'}{'tags'};
70
71     if (scalar (@{ $self->{'tags'} })) {
72       my $holders = "?, " x scalar(@{ $self->{'tags'} });
73       $holders =~ s/, $//;
74
75       $self->{'sql'} .= "AND tags.name IN ($holders)";
76     } else {
77       $self->{'sql'} .= "AND tags.name = '?'";
78     }
79
80     $self->{'tags'} = $self->{'config'}{'_config'}{'plugins'}{'FSpot'}{'tags'};
81   } else {
82     $self->{'sql'} .= "AND tags.name = 'Favorites'";  # Sigh
83   }
84
85   $self->{'sql'} .= "
86 ORDER BY random()
87 LIMIT 1
88 ";
89
90   $self->{'kernel'}->state('find_photo_result', $self);
91   $self->{'kernel'}->yield('find_photo');
92 }
93
94 1;