]> jfr.im git - irssi-scripts.git/blame - listenbrainz.pl
no autorun smshilight
[irssi-scripts.git] / listenbrainz.pl
CommitLineData
f9fa1f2e 1# listenbrainz.pl
2# CC0 https://creativecommons.org/publicdomain/zero/1.0/
3
4use strict;
5use warnings;
6
7use Irssi;
8use vars qw($VERSION %IRSSI);
9
10my $have_uri_escape = eval { require URI::Escape; URI::Escape->import('uri_escape'); 1; };
11unless ($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
20use JSON qw/decode_json/;
21use LWP::UserAgent;
22my $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
35sub 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
77sub cmd_np {
78 if (Irssi::settings_get_bool('listenbrainz_alias_np')) {
79 cmd_listenbrainz(@_);
80 }
81}
82
83Irssi::settings_add_bool('listenbrainz', 'listenbrainz_debug', 0); # Output info when an error occurs?
84Irssi::settings_add_bool('listenbrainz', 'listenbrainz_alias_np', 1); # Should /np work as an alias for /listenbrainz? Set to OFF if also using lastfm.pl.
85Irssi::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
87Irssi::settings_add_str('listenbrainz', 'listenbrainz_format', '%1$s playing %2$s by %3$s (%4$s) (from %5$s)');
1a1f33ed 88Irssi::settings_add_bool('listenbrainz', 'listenbrainz_append_link', 1);
f9fa1f2e 89
90Irssi::command_bind('listenbrainz', 'cmd_listenbrainz', 'listenbrainz');
91Irssi::command_bind('np', 'cmd_np', 'listenbrainz');
92Irssi::print('%G>>%n '.$IRSSI{name}.' '.$VERSION.' loaded');