]>
jfr.im git - irssi-scripts.git/blob - listenbrainz.pl
2 # CC0 https://creativecommons.org/publicdomain/zero/1.0/
8 use vars
qw( $VERSION %IRSSI ) ;
10 my $have_uri_escape = eval { require URI
:: Escape
; URI
:: Escape-
> import ( 'uri_escape' ); 1 ; };
11 unless ( $have_uri_escape ) {
12 sub _uri_escape_char
{
13 '%' . uc ( unpack ( 'H*' , $_ [ 0 ]));
16 $_ [ 0 ] =~ s/([^a-zA-Z0-9._~-])/_uri_escape_char($1)/ger ;
20 use JSON qw
/decode_json/ ;
22 my $ua = LWP
:: UserAgent-
> new ;
25 $ua -> agent ( "irssi+listenbrainz.pl/ $VERSION " );
27 authors
=> "John Runyon" ,
28 name
=> "listenbrainz" ,
29 description
=> "A now-playing-script which uses ListenBrainz" ,
31 url
=> 'https://jfr.im/git/' ,
32 contact
=> 'git @jfr .im'
35 sub cmd_listenbrainz
{
36 my ( $username , $server , $witem ) = @_ ;
37 unless ( length $username ) {
38 $username = Irssi
:: settings_get_str
( 'listenbrainz_username' );
40 unless ( length $username ) {
41 Irssi
:: print ( ' %R >> %n ' . $IRSSI { name
}. ': No username specified.' );
45 unless ( defined $witem ) {
46 Irssi
:: print ( "Irssi says you're not in an active window!" );
50 my $url = "https://api.listenbrainz.org/1/user/" . uri_escape
( $username ) . "/playing-now" ;
51 my $req = HTTP
:: Request-
> new ( 'GET' , $url );
53 my $res = $ua -> request ( $req );
54 if ( $res -> is_success ) {
55 my $data = decode_json
( $res -> content );
56 unless ( scalar @{ $data ->{ payload
}{ listens
} }) {
57 $witem -> print ( "ListenBrainz says you're not listening to anything!" );
60 my %track = %{ $data ->{ payload
}{ listens
}[ 0 ]{ track_metadata
} };
61 my $s = sprintf ( Irssi
:: settings_get_str
( 'listenbrainz_format' ), $username , $track { track_name
}, $track { artist_name
}, $track { release_name
}, $track { additional_info
}{ media_player
} // $track { additional_info
}{ listening_from
});
62 if ( Irssi
:: settings_get_bool
( 'listenbrainz_append_link' ) && defined $track { mbid_mapping
}{ recording_mbid
}) {
63 $s .= ' https://musicbrainz.org/recording/' . $track { mbid_mapping
}{ recording_mbid
};
65 $witem -> command ( "say $s " );
67 $witem -> print ( "ListenBrainz request Failed!" );
68 if ( Irssi
:: settings_get_bool
( 'listenbrainz_debug' )) {
71 print $res -> status_line ;
78 if ( Irssi
:: settings_get_bool
( 'listenbrainz_alias_np' )) {
83 Irssi
:: settings_add_bool
( 'listenbrainz' , 'listenbrainz_debug' , 0 ); # Output info when an error occurs?
84 Irssi
:: settings_add_bool
( 'listenbrainz' , 'listenbrainz_alias_np' , 1 ); # Should /np work as an alias for /listenbrainz? Set to OFF if also using lastfm.pl.
85 Irssi
:: settings_add_str
( 'listenbrainz' , 'listenbrainz_username' , '' ); # Default username when none is supplied
86 # Output format - 1: username, 2: track, 3: artist, 4: album, 5: player
87 Irssi
:: settings_add_str
( 'listenbrainz' , 'listenbrainz_format' , ' %1$s playing %2$s by %3$s ( %4$s ) (from %5$s )' );
88 Irssi
:: settings_add_bool
( 'listenbrainz' , 'listenbrainz_append_link' , 1 );
90 Irssi
:: command_bind
( 'listenbrainz' , 'cmd_listenbrainz' , 'listenbrainz' );
91 Irssi
:: command_bind
( 'np' , 'cmd_np' , 'listenbrainz' );
92 Irssi
:: print ( ' %G >> %n ' . $IRSSI { name
}. ' ' . $VERSION . ' loaded' );