WIP, Remote Client/Server, fist working track list

This commit is contained in:
emeric
2014-05-23 14:56:22 +02:00
parent d945f4623f
commit 61341a090a
19 changed files with 932 additions and 587 deletions
+132 -24
View File
@@ -1,4 +1,6 @@
#include <algorithm> // std::max
#include <algorithm> // std::min
#include <boost/foreach.hpp>
#include "AudioCollectionRequestHandler.hpp"
@@ -44,9 +46,27 @@ AudioCollectionRequestHandler::process(const AudioCollectionRequest& request, Au
break;
case AudioCollectionRequest_Type_TypeGetReleaseList:
if (request.has_get_releases())
{
res = processGetReleases(request.get_releases(), *response.mutable_release_list());
if (res)
response.set_type(AudioCollectionResponse_Type_TypeReleaseList);
}
else
std::cerr << "Bad AudioCollectionRequest_Type_TypeGetReleaseList" << std::endl;
break;
case AudioCollectionRequest_Type_TypeGetTrackList:
if (request.has_get_tracks())
{
res = processGetTracks(request.get_tracks(), *response.mutable_track_list());
if (res)
response.set_type(AudioCollectionResponse_Type_TypeTrackList);
}
else
std::cerr << "Bad AudioCollectionRequest_Type_TypeGetTrackList" << std::endl;
break;
default:
@@ -67,16 +87,18 @@ AudioCollectionRequestHandler::processGetGenres(const AudioCollectionRequest::Ge
return false;
}
std::cout << "Offset = " << request.batch_parameter().offset() << std::endl;
std::cout << "Size = " << request.batch_parameter().size() << std::endl;
std::size_t size = request.batch_parameter().size();
if (!size)
size = _maxListArtists;
size = std::min(size, _maxListArtists);
Wt::Dbo::Transaction transaction( _db.getSession() );
Wt::Dbo::collection<Genre::pointer> genres = Genre::getAll( _db.getSession(), request.batch_parameter().offset(), std::max(static_cast<std::size_t>(request.batch_parameter().size()), _maxListGenres) );
Wt::Dbo::collection<Genre::pointer> genres = Genre::getAll( _db.getSession(), request.batch_parameter().offset(), static_cast<int>(size));
typedef Wt::Dbo::collection< Genre::pointer > Genres;
for (Genres::iterator it = genres.begin(); it != genres.end(); ++it)
for (Genres::const_iterator it = genres.begin(); it != genres.end(); ++it)
{
AudioCollectionResponse_Genre* genre = response.add_genres();
@@ -90,7 +112,6 @@ AudioCollectionRequestHandler::processGetGenres(const AudioCollectionRequest::Ge
bool
AudioCollectionRequestHandler::processGetArtists(const AudioCollectionRequest::GetArtistList& request, AudioCollectionResponse::ArtistList& response)
{
// sanity checks
if (!request.has_batch_parameter())
{
@@ -98,31 +119,20 @@ AudioCollectionRequestHandler::processGetArtists(const AudioCollectionRequest::G
return false;
}
std::cout << "Offset = " << request.batch_parameter().offset() << std::endl;
std::cout << "Size = " << request.batch_parameter().size() << std::endl;
if (request.batch_parameter().size() > _maxListArtists)
std::cerr << "Warning: batch parameter size too high (" << request.batch_parameter().size() << ")" << std::endl;
for (int id = 0; id < request.genre_id_size(); ++id)
{
std::cout << "Genre id " << id << " = '" << request.genre_id(id) << "'" << std::endl;
}
std::size_t size = request.batch_parameter().size();
if (!size)
size = _maxListArtists;
size = std::min(size, _maxListArtists);
// Now fetch requested data...
std::cout << "Getting artists..." << std::endl;
Wt::Dbo::Transaction transaction( _db.getSession() );
Wt::Dbo::collection<Artist::pointer> artists = Artist::getAll( _db.getSession(), request.batch_parameter().offset(), std::max(static_cast<std::size_t>(request.batch_parameter().size()), _maxListArtists) );
std::cout << "size = " << artists.size() << std::endl;
Wt::Dbo::collection<Artist::pointer> artists = Artist::getAll( _db.getSession(), request.batch_parameter().offset(), static_cast<int>(size) );
typedef Wt::Dbo::collection< Artist::pointer > Artists;
for (Artists::iterator it = artists.begin(); it != artists.end(); ++it)
for (Artists::const_iterator it = artists.begin(); it != artists.end(); ++it)
{
AudioCollectionResponse_Artist* artist = response.add_artists();
@@ -131,7 +141,105 @@ AudioCollectionRequestHandler::processGetArtists(const AudioCollectionRequest::G
artist->set_id(it->id());
}
std::cout << "Getting artists DONE" << std::endl;
return true;
}
bool
AudioCollectionRequestHandler::processGetReleases(const AudioCollectionRequest::GetReleaseList& request, AudioCollectionResponse::ReleaseList& response)
{
// sanity checks
if (!request.has_batch_parameter())
{
std::cerr << "No batch parameters found!" << std::endl;
return false;
}
std::size_t size = request.batch_parameter().size();
if (!size)
size = _maxListReleases;
size = std::min(size, _maxListReleases);
std::vector<Artist::id_type> artistIds;
for (int id = 0; id < request.artist_id_size(); ++id)
artistIds.push_back( request.artist_id(id) );
Wt::Dbo::Transaction transaction( _db.getSession() );
Wt::Dbo::collection<Release::pointer> releases = Release::getAll( _db.getSession(), artistIds, request.batch_parameter().offset(), static_cast<int>(size));
typedef Wt::Dbo::collection< Release::pointer > Releases;
for (Releases::const_iterator it = releases.begin(); it != releases.end(); ++it)
{
AudioCollectionResponse_Release* release = response.add_releases();
release->set_name((*it)->getName());
release->set_id(it->id());
// WARNING: next two lines are very time consuming!
release->set_nb_tracks( (*it)->getTracks().size() );
release->set_duration_secs( (*it)->getDuration().total_seconds() );
}
return true;
}
bool
AudioCollectionRequestHandler::processGetTracks(const AudioCollectionRequest::GetTrackList& request, AudioCollectionResponse::TrackList& response)
{
// sanity checks
if (!request.has_batch_parameter())
{
std::cerr << "No batch parameters found!" << std::endl;
return false;
}
std::size_t size = request.batch_parameter().size();
if (!size)
size = _maxListTracks;
size = std::min(size, _maxListTracks);
// Get filters
std::vector<Artist::id_type> artistIds;
for (int id = 0; id < request.artist_id_size(); ++id)
artistIds.push_back( request.artist_id(id) );
std::vector<Release::id_type> releaseIds;
for (int id = 0; id < request.release_id_size(); ++id)
releaseIds.push_back( request.release_id(id) );
std::vector<Release::id_type> genreIds;
for (int id = 0; id < request.genre_id_size(); ++id)
genreIds.push_back( request.genre_id(id) );
Wt::Dbo::Transaction transaction( _db.getSession() );
Wt::Dbo::collection<Track::pointer> tracks = Track::getAll( _db.getSession(),
artistIds, releaseIds, genreIds,
request.batch_parameter().offset(), static_cast<int>(size));
typedef Wt::Dbo::collection< Track::pointer > Tracks;
for (Tracks::const_iterator it = tracks.begin(); it != tracks.end(); ++it)
{
AudioCollectionResponse_Track* track = response.add_tracks();
track->set_id(it->id());
track->set_disc_number( (*it)->getDiscNumber() );
track->set_track_number( (*it)->getTrackNumber() );
track->set_artist_id( (*it)->getArtist().id() );
track->set_release_id( (*it)->getRelease().id() );
track->set_name( (*it)->getName() );
track->set_duration_secs( (*it)->getDuration().total_seconds() );
// if (!(*it)->getCreationTime().is_special())
// track->set_release_date( boost::posix_time::to_simple_string((*it)->getCreationTime()) );
BOOST_FOREACH(Genre::pointer genre, (*it)->getGenres())
track->add_genre_id( genre.id() );
// if (!(*it)->getCoverArt().empty)
// track->set_coverart( (*it)->getCoverArt() );
}
return true;
}