Add support for showing the current track playing on MusicPD system.
authorAndrew Ruthven <andrew@etc.gen.nz>
Thu, 18 Sep 2008 11:07:56 +0000 (23:07 +1200)
committerAndrew Ruthven <andrew@etc.gen.nz>
Thu, 18 Sep 2008 11:07:56 +0000 (23:07 +1200)
lib/Display/Plugins/MPD.pm [new file with mode: 0644]

diff --git a/lib/Display/Plugins/MPD.pm b/lib/Display/Plugins/MPD.pm
new file mode 100644 (file)
index 0000000..4db3081
--- /dev/null
@@ -0,0 +1,83 @@
+package Display::Plugins::MPD;
+
+use Clutter;
+use Audio::MPD;
+use POSIX qw/strftime/;
+
+sub new {
+  my ($class,$stage) = @_;
+
+  my $self = {
+    'stage' => $stage,
+    'mpd' => Audio::MPD->new(),
+    'file' => '',
+    'active'=> 0,
+  };
+
+  bless ($self, $class);
+  $self->init();
+  return $self;
+}
+
+sub display {
+  my $self = shift;
+
+  my $current = $self->{'mpd'}->current();
+
+  if ($self->{'file'} ne $current->file()) {
+    my @lines = ();
+    push @lines, $current->title()  if defined $current->title();
+    push @lines, $current->album()  if defined $current->album();
+    push @lines, $current->artist() if defined $current->artist();
+
+    $self->{'status'}->set_text(join("\n", @lines));
+
+    $self->{'file'} = $current->file();
+
+    $self->{'bg'}->set_height($self->{'status'}->get_height() + 10);
+    $self->{'bg'}->set_anchor_point(1, $self->{'bg'}->get_height());
+    $self->{'bg'}->set_position(10, $self->{'stage'}->get_height() - 10);
+
+    $self->{'status'}->set_anchor_point(1, $self->{'status'}->get_height());
+    $self->{'status'}->set_position(15, $self->{'stage'}->get_height() - 20);
+
+    if (! $self->{'active'}) {
+      $self->{'stage'}->add($self->{'bg'});
+      $self->{'stage'}->add($self->{'status'});
+      
+      $self->{'active'} = time() + 30;
+    }
+
+    Glib::Timeout->add_seconds(30, $self->can('hide_display'), $self);
+  }
+
+  return 1;
+}
+
+sub hide_display {
+  my $self = shift;
+
+  if ($self->{'active'} <= time()) {
+    $self->{'stage'}->remove($self->{'status'});
+    $self->{'stage'}->remove($self->{'bg'});
+
+    $self->{'active'} = 0;
+  }
+
+  return 0;
+}
+
+sub init {
+  my $self = shift;
+
+  $self->{'status'} = Clutter::Label->new('Sans 20', "Song\nAlbum");
+  $self->{'status'}->set_color(Clutter::Color->parse('White'));
+
+  $self->{'bg'} = Clutter::Rectangle->new(Clutter::Color->parse('Black'));
+  $self->{'bg'}->set_width($self->{'stage'}->get_width() - 40);
+  $self->{'bg'}->set_opacity(100);
+
+  Glib::Timeout->add_seconds(5, $self->can('display'), $self);
+}
+
+1;