Create a new base object for the photo classes which contains common code.
[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 POE;
6 use POE::Component::EasyDBI;
7 use strict;
8
9 my $default_f_spot_db = "$ENV{HOME}/.gnome2/f-spot/photos.db";
10 my $delay = 10;
11
12 sub new {
13   my $proto = shift;
14   my $class = ref($proto) || $proto;
15
16   my $self = $class->SUPER::new(@_);
17
18   bless ($self, $class);
19   $self->init();
20   return $self;
21 }
22
23 sub find_photo {
24   my $self = shift;
25
26   $self->{'kernel'}->post('FSpotDB',
27     single => { sql => $self->{'sql'}, event => 'find_photo_result' }
28   );
29 }
30
31 sub find_photo_result {
32   my ($self, $kernel, $args) = @_[OBJECT, KERNEL, ARG0];
33   my $file = $args->{'result'};
34   $file =~ s|^file://||;
35
36   $kernel->yield('display_photo', $file);
37 }
38
39 sub init {
40   my $self = shift;
41
42   POE::Component::EasyDBI->spawn(
43     alias => 'FSpotDB',
44     dsn   => "dbi:SQLite:dbname=" . ($self->{'config'}{'_config'}{'plugins'}{'DB'} || $default_f_spot_db),
45     username => '',
46     password => '',
47   );
48
49   $self->{'sql'} = "
50 SELECT uri
51 FROM photos, photo_tags, tags
52   WHERE photos.id = photo_tags.photo_id
53   AND photo_tags.tag_id = tags.id
54   AND tags.name = 'Brooke'
55 ORDER BY random()
56 LIMIT 1
57 ";
58
59   $self->{'kernel'}->state('find_photo_result', $self);
60   $self->{'kernel'}->yield('find_photo');
61 }
62
63 1;