9358a7ecbb99f9ca963513d1af8658667be85ea2
[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 => { sql => $self->{'sql'}, event => 'find_photo_result' }
29   );
30 }
31
32 sub find_photo_result {
33   my ($self, $kernel, $args) = @_[OBJECT, KERNEL, ARG0];
34   my $file = $args->{'result'};
35   $file =~ s|^file://||;
36
37   $kernel->yield('display_photo', $file);
38 }
39
40 sub init {
41   my $self = shift;
42
43   my $db = $self->{'config'}{'_config'}{'plugins'}{'FSpot'}{'DB'} || $default_f_spot_db;
44
45   if (! -f $db) {
46     carp "Can't find F-Spot database file: $db";
47     return;
48   }
49
50   POE::Component::EasyDBI->spawn(
51     alias => 'FSpotDB',
52     dsn   => "dbi:SQLite:dbname=" . ($self->{'config'}{'_config'}{'plugins'}{'FSpot'}{'DB'} || $default_f_spot_db),
53     username => '',
54     password => '',
55   );
56
57   $self->{'sql'} = "
58 SELECT uri
59 FROM photos, photo_tags, tags
60   WHERE photos.id = photo_tags.photo_id
61   AND photo_tags.tag_id = tags.id
62   AND tags.name = 'Brooke'
63 ORDER BY random()
64 LIMIT 1
65 ";
66
67   $self->{'kernel'}->state('find_photo_result', $self);
68   $self->{'kernel'}->yield('find_photo');
69 }
70
71 1;