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 )