AnyEvent-DAAP-Server

 view release on metacpan or  search on metacpan

lib/AnyEvent/DAAP/Server.pm  view on Meta::CPAN

sub _databases {
    my ($self, $connection) = @_;

    $connection->respond_dmap([[
        'daap.serverdatabases' => [
            [ 'dmap.status'              => 200 ],
            [ 'dmap.updatetype'          => 0 ],
            [ 'dmap.specifiedtotalcount' => 1 ],
            [ 'dmap.returnedcount'       => 1 ],
            [ 'dmap.listing' => [
                [ 'dmap.listingitem' => [
                    [ 'dmap.itemid'         => 1 ], # XXX magic
                    [ 'dmap.persistentid'   => $self->db_id ],
                    [ 'dmap.itemname'       => $self->name ],
                    [ 'dmap.itemcount'      => scalar keys %{ $self->tracks } ],
                    [ 'dmap.containercount' => 1 ],
                ] ],
            ] ],
        ]
    ]]);
}

sub _database_items {
    my ($self, $connection, $req, $args) = @_;
    # $args->{database_id};

    my $tracks = $self->__format_tracks_as_dmap($req, [ values %{ $self->tracks } ]);
    $connection->respond_dmap([[
        'daap.databasesongs' => [
            [ 'dmap.status'              => 200 ],
            [ 'dmap.updatetype'          => 0 ],
            [ 'dmap.specifiedtotalcount' => scalar @$tracks ],
            [ 'dmap.returnedcount'       => scalar @$tracks ],
            [ 'dmap.listing'             => $tracks ]
        ]
    ]]);
}

sub _database_containers {
    my ($self, $connection, $req, $args) = @_;
    # $args->{database_id};

    my @playlists = map { $_->as_dmap_struct } $self->global_playlist, values %{ $self->playlists };

    $connection->respond_dmap([[
        'daap.databaseplaylists' => [
            [ 'dmap.status'              => 200 ],
            [ 'dmap.updatetype'          => 0 ],
            [ 'dmap.specifiedtotalcount' => 1 ],
            [ 'dmap.returnedcount'       => 1 ],
            [ 'dmap.listing'             => \@playlists ],
        ]
    ]]);
}

sub _database_container_items {
    my ($self, $connection, $req, $args) = @_;
    # $args->{database_id}, $args->{container_id}

    my $playlist = $self->playlists->{ $args->{container_id} }
        or return $connection->respond(404);

    my $tracks = $self->__format_tracks_as_dmap($req, scalar $playlist->tracks);
    $connection->respond_dmap([[
        'daap.playlistsongs' => [
            [ 'dmap.status'              => 200 ],
            [ 'dmap.updatetype'          => 0 ],
            [ 'dmap.specifiedtotalcount' => scalar @$tracks ],
            [ 'dmap.returnedcount'       => scalar @$tracks ],
            [ 'dmap.listing'             => $tracks ]
        ]
    ]]);
}

sub _database_item {
    my ($self, $connection, $req, $args) = @_;
    # $args->{database_id}, $args->{item_id}

    my $track = $self->tracks->{ $args->{item_id} }
        or return $connection->respond(404);

    $track->stream($connection, $req, $args);
}

sub __format_tracks_as_dmap {
    my ($self, $req, $tracks) = @_;

    my @fields = ( qw(dmap.itemkind dmap.itemid dmap.itemname), split /,|%2C/i, scalar $req->uri->query_param('meta') || '' );

    my @tracks;
    foreach my $track (@$tracks) {
        push @tracks, [
            'dmap.listingitem' => [ map { [ $_ => $track->_dmap_field($_) ] } @fields ]
        ]
    }

    return \@tracks;
}

1;

__END__

=head1 NAME

AnyEvent::DAAP::Server - DAAP Server implemented with AnyEvent

=head1 SYNOPSIS

  use AnyEvent;
  use AnyEvent::DAAP::Server;
  use AnyEvent::DAAP::Server::Track::File::MP3;
  use File::Find::Rule;

  my $daap = AnyEvent::DAAP::Server->new(port => 3689);

  foreach my $file (find name => '*.mp3', in => '.') {
      my $track = AnyEvent::DAAP::Server::Track::File::MP3->new(file => $file);
      $daap->add_track($track);
  }

  $daap->setup;

  AE::cv->wait;


=head1 DESCRIPTION

AnyEvent::DAAP::Server is a DAAP Server implementation on AnyEvent.
It is like L<Net::DAAP::Server>, but does not find files automatically (see SYNOPSIS.)

=head1 METHODS

=over 4

=item my $daap = AnyEvent::DAAP::Server->new(name => 'AnyEvent::DAAP::Server', port => 3689);

Create new DAAP server instance.

=item $daap->setup;



( run in 1.686 second using v1.01-cache-2.11-cpan-39bf76dae61 )