aboutsummaryrefslogtreecommitdiffstats
path: root/fixery
diff options
context:
space:
mode:
Diffstat (limited to 'fixery')
-rw-r--r--fixery/now_playing_mpd.pl205
1 files changed, 205 insertions, 0 deletions
diff --git a/fixery/now_playing_mpd.pl b/fixery/now_playing_mpd.pl
new file mode 100644
index 0000000..c80a7c3
--- /dev/null
+++ b/fixery/now_playing_mpd.pl
@@ -0,0 +1,205 @@
+# MPD Now-Playing Script for irssi
+# Copyright (C) 2005 Erik Scharwaechter
+# <diozaka@gmx.de>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 2
+# as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# The full version of the license can be found at
+# http://www.gnu.org/copyleft/gpl.html.
+#
+#
+#######################################################################
+# I'd like to thank Bumby <bumby@evilninja.org> for his impc script, #
+# which helped me a lot with making this script. #
+#######################################################################
+# Type "/np help" for a help page! #
+#######################################################################
+# TODO: #
+# - add more format directives #
+#######################################################################
+# CHANGELOG: #
+# 0.4: First official release #
+#######################################################################
+
+use strict;
+#use IO::Socket;
+use Irssi;
+use IrssiX::Async qw(fork_off);
+use Audio::MPD;
+#use Storable;
+use JSON::Any;
+use Data::Dumper;
+
+our $VERSION = "0.5";
+our %IRSSI = (
+ name => 'mpd',
+ authors => 'Erik Scharwaechter',
+ contact => 'diozaka@gmx.de',
+ license => 'GPLv2',
+ description => 'print the song you are listening to',
+ );
+
+sub _to_json {
+ my $data = shift;
+ # add terminal newline to ensure flushing without having to mess
+ # with autoflush on all pipes.
+ return JSON::Any->new->objToJson($data) . "\n";
+}
+
+sub _from_json {
+ my $json = shift;
+ return JSON::Any->new->jsonToObj($json);
+}
+
+sub _freeze_witem {
+ my ($witem) = @_;
+ my $win_item_ref;
+
+ if (defined $witem) {
+ $win_item_ref = { server_tag => $witem->window->{servertag},
+ win_refnum => $witem->window->{refnum},
+ item_name => $witem->{name} };
+
+ } else {
+ # make this more better (find status window)
+ $win_item_ref = { server_tag => undef,
+ win_refnum => 1,
+ item_name => '' };
+
+ }
+
+ return $win_item_ref;
+}
+
+sub _thaw_witem {
+ my ($frozen_witem) = @_;
+
+ my $witem;
+ my ($server_tag, $win_refnum, $witem_name)
+ = map { $frozen_witem->{$_} } qw/server_tag win_refnum item_name/;
+
+ my $server = Irssi::server_find_tag($server_tag);
+ my $win = Irssi::window_find_refnum($win_refnum);
+
+ if ($win) {
+ $witem = $win->item_find($server, $witem_name);
+ } else {
+ Irssi::print("Failed to find window item from params: tag: $server_tag, "
+ . "refnum: $win_refnum, item_name: $witem_name");
+ }
+ return $witem;
+}
+
+sub cmd_now_playing {
+ my ($data, $server, $witem) = @_;
+
+ if($data =~ /^help/i){
+ cmd_now_playing_help();
+ return;
+ }
+
+ my $host = Irssi::settings_get_str('mpd_port') || 'localhost';
+ my $port = Irssi::settings_get_str('mpd_host') || 6060;
+ my $pass = Irssi::settings_get_str('mpd_pass') || '';
+ my $timeout = Irssi::settings_get_str('mpd_timeout') || 5;
+
+
+ my $mpd_options = { win => _freeze_witem($witem),
+ host => $host,
+ port => $port,
+ password => $pass };
+
+ my $json_data = _to_json($mpd_options);
+ fork_off($json_data, \&now_playing_request, \&now_playing_callback);
+}
+
+sub now_playing_request {
+ my (@input) = <STDIN>;
+ my $json_data = join('', @input);
+
+ my $data = _from_json($json_data);
+ #my $win = delete $data->{win};
+
+# my $mpd = Audio::MPD->new(%options);
+
+# my $am_playing = $mpd->current->as_string;
+# my %x;
+# if (defined $am_playing) {
+ # %x = ( result => $am_playing, win => $win );
+
+ # } else {
+ # %x = ( result => '__ERROR__', win => $win );
+ # }
+ # my %x = (result => "foo", win => undef);
+ # my $r = Storable::freeze(\%x);
+ #print $r;
+
+ my $response = { status => 1,
+ message => "Foo",
+ win => $data->{win},
+ };
+
+ my $json_data = _to_json($response);
+ print $json_data;
+}
+
+sub now_playing_callback {
+ my ($json_data) = @_;
+ #chomp $result;
+ #my $data = Storable::thaw($frozen_data);
+ my $data = _from_json($json_data);
+ print "received data: " . Dumper($data);
+ my $witem = _thaw_witem($data->{win});
+ print "Witem: " . Dumper($witem);
+ if ($witem) {
+ $witem->print("Moo!");
+ }
+ # unless ($deserialised->{result} eq "__ERROR__") {
+ # my $output_message = "/me is playing: " . $deserialised->{result};
+ # my $witem = $deserialised->{win};
+
+ # if ($witem && ($witem->{type} eq "CHANNEL" ||
+ # $witem->{type} eq "QUERY")) {
+ # #$witem->command($output_message);
+ # $witem->print("Printing: $output_message");
+ # }
+ # } else {
+ # print "Now Playing MPD: Unable to do thingie (Got ERROR from child)";
+ # }
+
+}
+
+sub cmd_now_playing_help {
+ print '
+ MPD Now-Playing Script
+========================
+
+by Erik Scharwaechter (diozaka@gmx.de)
+
+Variables:
+ mpd_host (137.224.241.20)
+ mpd_port (6600)
+ mpd_timeout (5)
+
+Usage:
+ /np Print the song you are listening to
+ /np help Print this text
+';
+}
+
+
+Irssi::settings_add_str('mpd', 'mpd_host', '137.224.241.20');
+Irssi::settings_add_str('mpd', 'mpd_port', '6600');
+Irssi::settings_add_str('mpd', 'mpd_timeout', '5');
+Irssi::settings_add_str('mpd', 'mpd_pass', '');
+
+Irssi::command_bind('np' => \&cmd_now_playing);
+Irssi::command_bind('np help' => \&cmd_now_playing_help);
+