AnyEvent-Net-MPD
view release on metacpan or search on metacpan
lib/AnyEvent/Net/MPD.pm view on Meta::CPAN
$cv->send if $cv;
$self->send( 'noidle' );
return $self;
}
}
sub send {
my $self = shift;
my $opt = ( ref $_[0] eq 'HASH' ) ? shift : {};
my $cb = pop if ref $_[-1] eq 'CODE';
my (@commands) = @_;
# Normalise input
if (ref $commands[0] eq 'ARRAY') {
@commands = map {
( ref $_ eq 'ARRAY' ) ? join( q{ }, @{$_} ) : $_;
} @{$commands[0]};
}
else {
@commands = join q{ }, @commands;
}
my $command = '';
# Remove underscores from command names
@commands = map {
my $args;
($command, $args) = split /\s/, $_, 2;
$command =~ s/_//g unless $command =~ /^replay_gain_/;
$args //= q{};
"$command $args";
} @commands;
# Create block if command list
if (scalar @commands > 1) {
unshift @commands, "command_list_begin";
push @commands, "command_list_end";
}
my $parser = $opt->{parser} // $command;
$parser = $parsers->{$parser} // $parsers->{none}
unless ref $parser eq 'CODE';
my $cv = AnyEvent->condvar( $cb ? ( cb => $cb ) : () );
$self->push_read( sub {
my $response = shift;
$cv->send( $parser->( $response ) );
});
$log->tracef( '> %s', $_ ) foreach @commands;
$self->handle->push_write( join("\n", @commands) . "\n" );
return $cv;
}
sub get { shift->send( @_ )->recv }
sub until {
my ($self, $name, $check, $cb) = @_;
weaken $self;
my $wrapper;
$wrapper = sub {
if ($check->(@_)) {
$self->unsubscribe($name => $wrapper);
$cb->(@_);
}
};
$self->on($name => $wrapper);
return $wrapper;
}
sub BUILD {
my ($self, $args) = @_;
$self->socket( $self->_build_socket );
$self->connect if $self->auto_connect;
}
sub _build_socket {
my $self = shift;
my $socket = tcp_connect $self->host, $self->port, sub {
my ($fh) = @_
or die "MPD connect failed: $!";
$log->debugf('Connecting to %s:%s', $self->host, $self->port);
$self->handle(
AnyEvent::Handle->new(
fh => $fh,
on_error => sub {
my ($hdl, $fatal, $msg) = @_;
$self->emit( error => $msg );
$hdl->destroy;
},
)
);
$self->handle->on_read(sub {
$self->handle->push_read( line => $self->_parse_block )
});
$self->handle->on_error(sub {
my ($h, $fatal, $message) = @_;
$self->emit( error => $message // 'Error' );
$self->handle(undef);
});
$self->handle->on_eof(sub {
my ($h, $fatal, $message) = @_;
$self->emit( eof => $message // 'EOF' );
$self->handle(undef);
});
};
return $socket;
}
sub connect {
( run in 2.257 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )