]>
Commit | Line | Data |
---|---|---|
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 | ||
24 | $VERSION = "2.1"; | |
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', | |
31 | url => 'https://jfr.im/git/', | |
32 | contact => 'git@jfr.im' | |
33 | ); | |
34 | ||
35 | sub cmd_listenbrainz { | |
36 | my ($username, $server, $witem) = @_; | |
37 | unless (length $username) { | |
38 | $username = Irssi::settings_get_str('listenbrainz_username'); | |
39 | } | |
40 | unless (length $username) { | |
41 | Irssi::print('%R>>%n '.$IRSSI{name}.': No username specified.'); | |
42 | return; | |
43 | } | |
44 | ||
45 | unless (defined $witem) { | |
46 | Irssi::print("Irssi says you're not in an active window!"); | |
47 | return; | |
48 | } | |
49 | ||
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); | |
56 | unless (scalar @{ $data->{payload}{listens} }) { | |
57 | $witem->print("ListenBrainz says you're not listening to anything!"); | |
58 | return; | |
59 | } | |
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}; | |
64 | } | |
65 | $witem->command("say $s"); | |
66 | } else { | |
67 | $witem->print("ListenBrainz request Failed!"); | |
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)'); | |
88 | Irssi::settings_add_bool('listenbrainz', 'listenbrainz_append_link', 1); | |
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'); |