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 )