]>
Commit | Line | Data |
---|---|---|
f9fa1f2e | 1 | # listenbrainz.pl |
2 | # CC0 https://creativecommons.org/publicdomain/zero/1.0/ | |
3 | ||
4 | use strict; | |
5 | use warnings; | |
6 | ||
7 | use Irssi; | |
8 | use vars qw($VERSION %IRSSI); | |
9 | ||
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])); | |
14 | } | |
15 | sub uri_escape { | |
16 | $_[0] =~ s/([^a-zA-Z0-9._~-])/_uri_escape_char($1)/ger; | |
17 | } | |
18 | } | |
19 | ||
20 | use JSON qw/decode_json/; | |
21 | use LWP::UserAgent; | |
22 | my $ua = LWP::UserAgent->new; | |
23 | ||
aa96707c | 24 | $VERSION = "2.1"; |
f9fa1f2e | 25 | $ua->agent("irssi+listenbrainz.pl/$VERSION "); |
26 | %IRSSI = ( | |
27 | authors => "John Runyon", | |
28 | name => "listenbrainz", | |
29 | description => "A now-playing-script which uses ListenBrainz", | |
30 | license => 'CC0', | |
aa96707c JR |
31 | url => 'https://jfr.im/git/', |
32 | contact => 'git@jfr.im' | |
f9fa1f2e | 33 | ); |
34 | ||
35 | sub cmd_listenbrainz { | |
36 | my ($username, $server, $witem) = @_; | |
d652ed56 | 37 | unless (length $username) { |
f9fa1f2e | 38 | $username = Irssi::settings_get_str('listenbrainz_username'); |
39 | } | |
d652ed56 | 40 | unless (length $username) { |
f9fa1f2e | 41 | Irssi::print('%R>>%n '.$IRSSI{name}.': No username specified.'); |
42 | return; | |
43 | } | |
44 | ||
d652ed56 JR |
45 | unless (defined $witem) { |
46 | Irssi::print("Irssi says you're not in an active window!"); | |
47 | return; | |
48 | } | |
49 | ||
f9fa1f2e | 50 | my $url = "https://api.listenbrainz.org/1/user/" . uri_escape($username) . "/playing-now"; |
51 | my $req = HTTP::Request->new('GET', $url); | |
52 | ||
53 | my $res = $ua->request($req); | |
54 | if ($res->is_success) { | |
55 | my $data = decode_json($res->content); | |
d652ed56 JR |
56 | unless (scalar @{ $data->{payload}{listens} }) { |
57 | $witem->print("ListenBrainz says you're not listening to anything!"); | |
58 | return; | |
59 | } | |
f9fa1f2e | 60 | my %track = %{ $data->{payload}{listens}[0]{track_metadata} }; |
aa96707c | 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}); |
1a1f33ed JR |
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}; | |
64 | } | |
f9fa1f2e | 65 | $witem->command("say $s"); |
66 | } else { | |
d652ed56 | 67 | $witem->print("ListenBrainz request Failed!"); |
f9fa1f2e | 68 | if (Irssi::settings_get_bool('listenbrainz_debug')) { |
69 | print $req->url; | |
70 | print $req->content; | |
71 | print $res->status_line; | |
72 | print $res->content; | |
73 | } | |
74 | } | |
75 | } | |
76 | ||
77 | sub cmd_np { | |
78 | if (Irssi::settings_get_bool('listenbrainz_alias_np')) { | |
79 | cmd_listenbrainz(@_); | |
80 | } | |
81 | } | |
82 | ||
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)'); | |
1a1f33ed | 88 | Irssi::settings_add_bool('listenbrainz', 'listenbrainz_append_link', 1); |
f9fa1f2e | 89 | |
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'); |