diff options
Diffstat (limited to 'fixery')
| -rw-r--r-- | fixery/now_playing_mpd.pl | 205 | 
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); + | 
