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 )