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 )