Merge branch 'develop'
This commit is contained in:
@@ -103,13 +103,11 @@ Grabber::getFromRelease(Wt::Dbo::Session& session, std::string releaseName)
|
|||||||
SearchFilter filter;
|
SearchFilter filter;
|
||||||
filter.exactMatch[SearchFilter::Field::Release].push_back(releaseName);
|
filter.exactMatch[SearchFilter::Field::Release].push_back(releaseName);
|
||||||
|
|
||||||
Wt::Dbo::collection<Track::pointer> tracks
|
std::vector<Track::pointer> tracks
|
||||||
= Track::getAll(session, filter, -1, 1 /* limit result size */);
|
= Track::getAll(session, filter, -1, 1 /* limit result size */);
|
||||||
|
|
||||||
Wt::Dbo::collection<Database::Track::pointer>::iterator it = tracks.begin();
|
if (!tracks.empty())
|
||||||
|
return getFromTrack( tracks.front() );
|
||||||
if (it != tracks.end())
|
|
||||||
return getFromTrack(*it);
|
|
||||||
else
|
else
|
||||||
return std::vector<CoverArt>();
|
return std::vector<CoverArt>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,18 +194,17 @@ Track::getAllQuery(Wt::Dbo::Session& session, SearchFilter filter)
|
|||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::Dbo::collection< Track::pointer >
|
std::vector<Track::pointer>
|
||||||
Track::getAll(Wt::Dbo::Session& session, SearchFilter filter, int offset, int size)
|
Track::getAll(Wt::Dbo::Session& session, SearchFilter filter, int offset, int size)
|
||||||
{
|
{
|
||||||
return getAllQuery(session, filter).limit(size).offset(offset);
|
Wt::Dbo::collection<Track::pointer> res = getAllQuery(session, filter).limit(size).offset(offset);
|
||||||
|
return std::vector<Track::pointer>(res.begin(), res.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Track::pointer>
|
std::vector<Track::pointer>
|
||||||
Track::getTracks(Wt::Dbo::Session& session, SearchFilter filter, int offset, int size)
|
Track::getTracks(Wt::Dbo::Session& session, SearchFilter filter, int offset, int size)
|
||||||
{
|
{
|
||||||
Wt::Dbo::collection< Track::pointer > tracks = getAll(session, filter, offset, size);
|
return getAll(session, filter, offset, size);
|
||||||
|
|
||||||
return std::vector<Track::pointer>(tracks.begin(), tracks.end());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::Dbo::Query<Track::ReleaseResult>
|
Wt::Dbo::Query<Track::ReleaseResult>
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ class Track
|
|||||||
static pointer getById(Wt::Dbo::Session& session, id_type id);
|
static pointer getById(Wt::Dbo::Session& session, id_type id);
|
||||||
static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session);
|
static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session);
|
||||||
// Used for remote
|
// Used for remote
|
||||||
static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
static std::vector<pointer> getAll(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
||||||
static std::vector<pointer> getTracks(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
static std::vector<pointer> getTracks(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
||||||
static std::vector<std::string> getReleases(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
static std::vector<std::string> getReleases(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
||||||
static std::vector<std::string> getArtists(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
static std::vector<std::string> getArtists(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
||||||
|
|||||||
@@ -256,33 +256,31 @@ AudioCollectionRequestHandler::processGetTracks(const AudioCollectionRequest::Ge
|
|||||||
|
|
||||||
Wt::Dbo::Transaction transaction( _db.getSession() );
|
Wt::Dbo::Transaction transaction( _db.getSession() );
|
||||||
|
|
||||||
Wt::Dbo::collection<Database::Track::pointer> tracks
|
std::vector<Database::Track::pointer> tracks
|
||||||
= Database::Track::getAll( _db.getSession(), filter,
|
= Database::Track::getAll( _db.getSession(), filter,
|
||||||
request.batch_parameter().offset(), static_cast<int>(size));
|
request.batch_parameter().offset(), static_cast<int>(size));
|
||||||
|
|
||||||
typedef Wt::Dbo::collection< Database::Track::pointer > Tracks;
|
BOOST_FOREACH(Database::Track::pointer track, tracks)
|
||||||
|
|
||||||
for (Tracks::const_iterator it = tracks.begin(); it != tracks.end(); ++it)
|
|
||||||
{
|
{
|
||||||
AudioCollectionResponse_Track* track = response.add_tracks();
|
AudioCollectionResponse_Track* newTrack = response.add_tracks();
|
||||||
|
|
||||||
track->set_id(it->id());
|
newTrack->set_id(track.id());
|
||||||
track->set_disc_number( (*it)->getDiscNumber() );
|
newTrack->set_disc_number( track->getDiscNumber() );
|
||||||
track->set_track_number( (*it)->getTrackNumber() );
|
newTrack->set_track_number( track->getTrackNumber() );
|
||||||
track->set_artist( (*it)->getArtistName() );
|
newTrack->set_artist( track->getArtistName() );
|
||||||
track->set_release( (*it)->getReleaseName() );
|
newTrack->set_release( track->getReleaseName() );
|
||||||
|
|
||||||
track->set_name( std::string( boost::locale::conv::to_utf<char>((*it)->getName(), "UTF-8") ) );
|
newTrack->set_name( std::string( boost::locale::conv::to_utf<char>(track->getName(), "UTF-8") ) );
|
||||||
track->set_duration_secs( (*it)->getDuration().total_seconds() );
|
newTrack->set_duration_secs( track->getDuration().total_seconds() );
|
||||||
|
|
||||||
// Only send the year part of the release times
|
// Only send the year part of the release times
|
||||||
if (!(*it)->getDate().is_special())
|
if (!track->getDate().is_special())
|
||||||
track->set_release_date( std::to_string((*it)->getDate().date().year()) );
|
newTrack->set_release_date( std::to_string(track->getDate().date().year()) );
|
||||||
if (!(*it)->getOriginalDate().is_special())
|
if (!track->getOriginalDate().is_special())
|
||||||
track->set_original_release_date( std::to_string((*it)->getOriginalDate().date().year()) );
|
newTrack->set_original_release_date( std::to_string(track->getOriginalDate().date().year()) );
|
||||||
|
|
||||||
BOOST_FOREACH(Database::Genre::pointer genre, (*it)->getGenres())
|
BOOST_FOREACH(Database::Genre::pointer genre, track->getGenres())
|
||||||
track->add_genre( genre->getName() );
|
newTrack->add_genre( genre->getName() );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,13 +305,11 @@ AudioCollectionRequestHandler::processGetCoverArt(const AudioCollectionRequest::
|
|||||||
SearchFilter filter;
|
SearchFilter filter;
|
||||||
filter.exactMatch[SearchFilter::Field::Release].push_back(request.release());
|
filter.exactMatch[SearchFilter::Field::Release].push_back(request.release());
|
||||||
|
|
||||||
Wt::Dbo::collection<Database::Track::pointer> tracks
|
std::vector<Database::Track::pointer> tracks
|
||||||
= Database::Track::getAll(_db.getSession(), filter, -1, 1 /* limit reuslt size */);
|
= Database::Track::getAll(_db.getSession(), filter, -1, 1 /* limit reuslt size */);
|
||||||
|
|
||||||
Wt::Dbo::collection<Database::Track::pointer>::iterator it = tracks.begin();
|
if (!tracks.empty())
|
||||||
|
track = tracks.front();
|
||||||
if (it != tracks.end())
|
|
||||||
track = *it;
|
|
||||||
|
|
||||||
res = true;
|
res = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ CoverResource::getTrackUrl(Database::Track::id_type trackId)
|
|||||||
void
|
void
|
||||||
CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Get the id of the track
|
// Get the id of the track
|
||||||
const std::string *trackIdStr = request.getParameter("trackid");
|
const std::string *trackIdStr = request.getParameter("trackid");
|
||||||
const std::string *releaseStr = request.getParameter("release");
|
const std::string *releaseStr = request.getParameter("release");
|
||||||
@@ -80,22 +81,35 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
|
|||||||
|
|
||||||
if (trackIdStr)
|
if (trackIdStr)
|
||||||
{
|
{
|
||||||
Database::Track::id_type trackId;
|
Database::Track::id_type trackId = std::stol(*trackIdStr);
|
||||||
|
std::string path;
|
||||||
|
bool hasCover = false;;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::istringstream iss(*trackIdStr);
|
// transactions are not thread safe
|
||||||
iss >> trackId;
|
std::unique_lock<std::mutex> lock(_mutex);
|
||||||
|
|
||||||
|
Wt::Dbo::Transaction transaction(_db.getSession());
|
||||||
|
|
||||||
|
Database::Track::pointer track = Database::Track::getById(_db.getSession(), trackId);
|
||||||
|
if (track)
|
||||||
|
{
|
||||||
|
hasCover = track->hasCover();;
|
||||||
|
path = track->getPath();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::Dbo::Transaction transaction(_db.getSession());
|
if (hasCover)
|
||||||
|
{
|
||||||
Database::Track::pointer track = Database::Track::getById(_db.getSession(), trackId);
|
covers = CoverArt::Grabber::getFromTrack(path);
|
||||||
covers = CoverArt::Grabber::getFromTrack(track);
|
}
|
||||||
|
|
||||||
transaction.commit();
|
|
||||||
}
|
}
|
||||||
else if (releaseStr)
|
else if (releaseStr)
|
||||||
{
|
{
|
||||||
|
// transactions are not thread safe
|
||||||
|
std::unique_lock<std::mutex> lock(_mutex);
|
||||||
Wt::Dbo::Transaction transaction(_db.getSession());
|
Wt::Dbo::Transaction transaction(_db.getSession());
|
||||||
|
|
||||||
covers = CoverArt::Grabber::getFromRelease(_db.getSession(), *releaseStr);
|
covers = CoverArt::Grabber::getFromRelease(_db.getSession(), *releaseStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
#ifndef COVER_RESOURCE_HPP_
|
#ifndef COVER_RESOURCE_HPP_
|
||||||
#define COVER_RESOURCE_HPP_
|
#define COVER_RESOURCE_HPP_
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
@@ -45,6 +47,7 @@ class CoverResource : public Wt::WResource
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
std::mutex _mutex;
|
||||||
Database::Handler& _db;
|
Database::Handler& _db;
|
||||||
std::size_t _size;
|
std::size_t _size;
|
||||||
CoverArt::CoverArt _defaultCover;
|
CoverArt::CoverArt _defaultCover;
|
||||||
|
|||||||
Reference in New Issue
Block a user