Net-LCDproc
view release on metacpan or search on metacpan
eg/music.pl view on Meta::CPAN
no if $] >= 5.018, 'warnings', 'experimental::smartmatch';
my $log;
my $mediaplayer;
my $mpris;
my $lcdproc;
my $screen;
my $widget = {};
# map mpris playback states to icon names
my $icon = {
Playing => 'PLAY',
Paused => 'PAUSE',
Stopped => 'STOP',
};
sub start_logging {
my $log =
Log::Dispatch->new(outputs => [['Syslog', min_level => 'debug',]]);
Log::Any::Adapter->set('Dispatch', dispatcher => $log);
return $log;
}
sub get_metadata {
my $raw_metadata =
$mpris->Get('org.mpris.MediaPlayer2.Player', "Metadata");
my $metadata = {
artist => ($raw_metadata->{'xesam:artist'}->[0] || 'unknown'), # I am lazy
album => ($raw_metadata->{'xesam:album'} || 'unknown'),
title => $raw_metadata->{'xesam:title'},
tracknum => $raw_metadata->{'xesam:trackNumber'},
length_sec => $raw_metadata->{'mpris:length'} / 1_000_000,
playbackstatus =>
$mpris->Get('org.mpris.MediaPlayer2.Player', 'PlaybackStatus'),
};
if ($metadata->{playbackstatus} eq 'Stopped') {
$metadata->{artist_album_str} = 'Not Playing';
$metadata->{track_str} = '';
} else {
# space at the end because using marquee
$metadata->{artist_album_str} = sprintf '%s :: %s :: ',
$metadata->{artist}, $metadata->{album};
$metadata->{track_str} = sprintf '%d. %s ',
$metadata->{tracknum} // 0, $metadata->{title};
$metadata->{position_sec} =
$mpris->Get('org.mpris.MediaPlayer2.Player', "Position") / 1_000_000;
}
return $metadata;
}
sub get_mpris {
my $bus = Net::DBus->session;
# find a music player
my $service = $bus->get_service("org.freedesktop.DBus");
my $dbus = $service->get_object("/org/freedesktop/DBus");
foreach (@{$dbus->ListNames}) {
next if not m/org\.mpris\.MediaPlayer2/;
$log->info("Trying '$_'");
my $mpris_service = $bus->get_service($_);
$mpris = $mpris_service->get_object('/org/mpris/MediaPlayer2');
$mediaplayer = $mpris->Get('org.mpris.MediaPlayer2', 'Identity');
$log->info("Using $mediaplayer");
last;
}
}
sub calc_bar_length {
my $metadata = shift;
if (!$metadata->{length_sec}) {
return 0;
}
if (!$metadata->{position_sec}) {
return 0;
}
my $total_screen_length = $lcdproc->width * $lcdproc->cell_width;
my $curr_pc = $metadata->{position_sec} / $metadata->{length_sec} * 100;
$log->debug(sprintf 'Track progress: %.2f%%', $curr_pc);
my $length = int($total_screen_length * ($curr_pc / 100));
return $length;
}
sub setup_screen {
my $server = shift @ARGV || 'localhost';
$lcdproc = Net::LCDproc->new(server => $server);
$screen = Net::LCDproc::Screen->new(id => 'mediaplayer');
$lcdproc->add_screen($screen);
my $metadata = get_metadata;
$widget->{artist_album} = Net::LCDproc::Widget::Scroller->new(
id => 'artist_album',
left => 1,
top => 1,
right => $lcdproc->width,
bottom => 1,
speed => 5,
direction => 'm',
text => $metadata->{artist_album_str},
);
$screen->add_widget($widget->{artist_album});
$widget->{track} = Net::LCDproc::Widget::Scroller->new(
id => 'track',
left => 1,
top => 2,
right => $lcdproc->width,
bottom => 2,
speed => 5,
direction => 'm',
( run in 3.135 seconds using v1.01-cache-2.11-cpan-d8267643d1d )