AnyEvent-DAAP-Server
view release on metacpan or search on metacpan
lib/AnyEvent/DAAP/Server.pm view on Meta::CPAN
# XXX dmap_itemid is used as only its lower 3 bytes
sub add_track {
my ($self, $track) = @_;
$self->tracks->{ $track->dmap_itemid & 0xFFFFFF } = $track;
$self->global_playlist->add_track($track);
}
sub add_playlist {
my ($self, $playlist) = @_;
$self->playlists->{ $playlist->dmap_itemid & 0xFFFFFF } = $playlist;
}
### Handlers
sub _server_info {
my ($self, $connection) = @_;
$connection->respond_dmap([[
'dmap.serverinforesponse' => [
[ 'dmap.status' => 200 ],
[ 'dmap.protocolversion' => 2 ],
[ 'daap.protocolversion' => '3.11' ],
[ 'dmap.itemname' => $self->name ],
[ 'dmap.loginrequired' => 1 ],
[ 'dmap.timeoutinterval' => 1800 ],
[ 'dmap.supportsautologout' => 0 ],
[ 'dmap.supportsupdate' => 1 ],
[ 'dmap.supportspersistentids' => 0 ],
[ 'dmap.supportsextensions' => 0 ],
[ 'dmap.supportsbrowse' => 0 ],
[ 'dmap.supportsquery' => 0 ],
[ 'dmap.supportsindex' => 0 ],
[ 'dmap.supportsresolve' => 0 ],
[ 'dmap.databasescount' => 1 ],
]
]]);
}
sub _login {
my ($self, $connection) = @_;
$connection->respond_dmap([[
'dmap.loginresponse' => [
[ 'dmap.status' => 200 ],
[ 'dmap.sessionid' => 42 ], # XXX does not have session, magic number
]
]]);
}
sub _update {
my ($self, $connection, $req) = @_;
if ($req->uri->query_param('delta')) {
my $cv = $connection->pause(sub {
$connection->respond_dmap([[
'dmap.updateresponse' => [
[ 'dmap.status' => 200 ],
[ 'dmap.serverrevision' => $self->revision ],
]
]]);
});
my $w; $w = AE::timer 60, 0, sub { undef $w; $cv->send };
} else {
$connection->respond_dmap([[
'dmap.updateresponse' => [
[ 'dmap.status' => 200 ],
[ 'dmap.serverrevision' => $self->revision ],
]
]]);
}
}
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 ],
( run in 1.898 second using v1.01-cache-2.11-cpan-d7f47b0818f )