437a11df8d6aec29ec5a121caf7f6b689a945717
[picture-display.git] / lib / Display / Plugins / FSpot.pm
1 package Display::Plugins::FSpot;
2
3 use DBI;
4 use Clutter;
5
6 my $f_spot_db = "/home/andrew/.gnome2/f-spot/photos.db";
7
8 sub new {
9   my ($class,$stage) = @_;
10
11   my $self = {
12     'stage' => $stage
13   };
14
15   bless ($self, $class);
16   $self->init();
17   return $self;
18 }
19
20 sub display {
21   my $self = shift;
22   my $file;
23
24   # Keep on looking until we find a file that exists.
25   do {
26     $file = $self->find_photo();
27   } until (-f $file);
28   
29   $self->{'picture'}->set_from_file($file);
30
31   return $file;
32 }
33
34 sub find_photo {
35   my $self = shift;
36   
37   my $uri;
38   $self->{'sth'}->bind_columns(\$uri);
39   my $rc = $self->{'sth'}->execute()
40     || die "Failed to execute statement: $DBI::errstr\n";
41
42   $self->{'sth'}->fetch;
43
44   $self->{'sth'}->finish()
45     || die "Failed to finish statement: $DBI::errstr\n";;
46
47   $uri =~ s|^file://||;
48
49   return $uri;
50 }
51
52 sub init {
53   my $self = shift;
54
55   $self->{'dbh'} = DBI->connect("dbi:SQLite:dbname=$f_spot_db","","")
56     || die "Failed to connect to $f_spot_db: $DBI::errstr\n";
57
58   my $sql = "
59 SELECT uri
60 FROM photos, photo_tags, tags
61   WHERE photos.id = photo_tags.photo_id
62   AND photo_tags.tag_id = tags.id
63   AND tags.name = 'Brooke'
64 ORDER BY random()
65 LIMIT 1
66 ";
67
68   $self->{'sth'} = $self->{'dbh'}->prepare($sql)
69     || die "Failed to prepare statement: $DBI::errstr\n";
70
71   $self->{'picture'} = Clutter::Texture->new();
72   $self->{'picture'}->set_size($self->{'stage'}->get_size());
73   $self->{'picture'}->set('keep-aspect-ratio' => 1);
74   $self->{'picture'}->set('sync-size' => 1);
75   $self->display();
76   $self->{'stage'}->add($self->{'picture'});
77
78   Glib::Timeout->add_seconds(30, $self->can('display'), $self);
79 }
80
81 1;