From: zonidjan Date: Sat, 13 Nov 2021 10:56:54 +0000 (-0600) Subject: add listenbrainz X-Git-Url: https://jfr.im/git/irssi-scripts.git/commitdiff_plain/f9fa1f2e1a07eb37013db89e298dbd381ec6f5c3 add listenbrainz --- diff --git a/autorun/lastfm.pl b/autorun/lastfm.pl deleted file mode 120000 index a663918..0000000 --- a/autorun/lastfm.pl +++ /dev/null @@ -1 +0,0 @@ -../lastfm.pl \ No newline at end of file diff --git a/autorun/listenbrainz.pl b/autorun/listenbrainz.pl new file mode 120000 index 0000000..b720eab --- /dev/null +++ b/autorun/listenbrainz.pl @@ -0,0 +1 @@ +../listenbrainz.pl \ No newline at end of file diff --git a/listenbrainz.pl b/listenbrainz.pl new file mode 100644 index 0000000..c697fe3 --- /dev/null +++ b/listenbrainz.pl @@ -0,0 +1,79 @@ +# listenbrainz.pl +# CC0 https://creativecommons.org/publicdomain/zero/1.0/ + +use strict; +use warnings; + +use Irssi; +use vars qw($VERSION %IRSSI); + +my $have_uri_escape = eval { require URI::Escape; URI::Escape->import('uri_escape'); 1; }; +unless ($have_uri_escape) { + sub _uri_escape_char { + '%' . uc(unpack('H*', $_[0])); + } + sub uri_escape { + $_[0] =~ s/([^a-zA-Z0-9._~-])/_uri_escape_char($1)/ger; + } +} + +use JSON qw/decode_json/; +use LWP::UserAgent; +my $ua = LWP::UserAgent->new; + +$VERSION = "2.0"; +$ua->agent("irssi+listenbrainz.pl/$VERSION "); +%IRSSI = ( + authors => "John Runyon", + name => "listenbrainz", + description => "A now-playing-script which uses ListenBrainz", + license => 'CC0', + url => 'https://github.com/zonidjan/irssi-scripts', + contact => 'https://github.com/zonidjan/irssi-scripts/issues' +); + +sub cmd_listenbrainz { + my ($username, $server, $witem) = @_; + if (!length $username) { + $username = Irssi::settings_get_str('listenbrainz_username'); + } + if (!length $username) { + Irssi::print('%R>>%n '.$IRSSI{name}.': No username specified.'); + return; + } + + my $url = "https://api.listenbrainz.org/1/user/" . uri_escape($username) . "/playing-now"; + my $req = HTTP::Request->new('GET', $url); + + my $res = $ua->request($req); + if ($res->is_success) { + my $data = decode_json($res->content); + my %track = %{ $data->{payload}{listens}[0]{track_metadata} }; + my $s = sprintf(Irssi::settings_get_str('listenbrainz_format'), $username, $track{track_name}, $track{artist_name}, $track{release_name}, $track{additional_info}{listening_from}); + $witem->command("say $s"); + } else { + print "ListenBrainz request Failed!"; + if (Irssi::settings_get_bool('listenbrainz_debug')) { + print $req->url; + print $req->content; + print $res->status_line; + print $res->content; + } + } +} + +sub cmd_np { + if (Irssi::settings_get_bool('listenbrainz_alias_np')) { + cmd_listenbrainz(@_); + } +} + +Irssi::settings_add_bool('listenbrainz', 'listenbrainz_debug', 0); # Output info when an error occurs? +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. +Irssi::settings_add_str('listenbrainz', 'listenbrainz_username', ''); # Default username when none is supplied +# Output format - 1: username, 2: track, 3: artist, 4: album, 5: player +Irssi::settings_add_str('listenbrainz', 'listenbrainz_format', '%1$s playing %2$s by %3$s (%4$s) (from %5$s)'); + +Irssi::command_bind('listenbrainz', 'cmd_listenbrainz', 'listenbrainz'); +Irssi::command_bind('np', 'cmd_np', 'listenbrainz'); +Irssi::print('%G>>%n '.$IRSSI{name}.' '.$VERSION.' loaded');