Remove lots of DB calls just for getting the current track. Add update call for vote closing. Add some code to try and avoid having current playing track show up in votes again.
This commit is contained in:
@@ -89,33 +89,57 @@ std::list<AudioTrack> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio
|
||||
}
|
||||
|
||||
//Determine first track
|
||||
int trackAlbumCount = session->query<int>("select count(fingerprint) from tracks").where("album = ?").bind(getCurrentTrack(session).trackAlbumName);
|
||||
int trackArtistCount = session->query<int>("select count(fingerprint) from tracks").where("artist = ?").bind(getCurrentTrack(session).trackArtistName);
|
||||
int trackAlbumCount = session->query<int>("select count(fingerprint) from tracks").where("album = ?").bind(currentTrack.trackAlbumName);
|
||||
int trackArtistCount = session->query<int>("select count(fingerprint) from tracks").where("artist = ?").bind(currentTrack.trackArtistName);
|
||||
int computerSlightOfHand = rand() % 10 + 1;
|
||||
if(trackAlbumCount > 0 && computerSlightOfHand > 3)
|
||||
if(trackAlbumCount > 0 && ((computerSlightOfHand > 3 && trackAlbumCount > 1) || (computerSlightOfHand > 3 && trackAlbumCount == 1 && trackArtistCount == 1) || !(trackArtistCount > 1 && trackAlbumCount == 1)))
|
||||
{
|
||||
//Pick item from album
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(getCurrentTrack(session).trackAlbumName);
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(currentTrack.trackAlbumName);
|
||||
//Try to make sure the same track isn't up to vote again.
|
||||
if((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint && trackAlbumCount > 1)
|
||||
{
|
||||
while((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint)
|
||||
{
|
||||
eligibleTrack = session->find<AudioTrack>().where("album = ?").limit(1).offset(rand() % trackAlbumCount).bind(currentTrack.trackAlbumName);
|
||||
}
|
||||
}
|
||||
selectedTracks.push_back(*eligibleTrack);
|
||||
}
|
||||
else if(trackArtistCount > 0)
|
||||
else
|
||||
{
|
||||
//Pick item from artist
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(getCurrentTrack(session).trackArtistName);
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(currentTrack.trackArtistName);
|
||||
//Try to make sure the same track isn't up to vote again.
|
||||
if((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint && trackArtistCount > 1)
|
||||
{
|
||||
while((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint)
|
||||
{
|
||||
eligibleTrack = session->find<AudioTrack>().where("artist = ?").limit(1).offset(rand() % trackArtistCount).bind(currentTrack.trackArtistName);
|
||||
}
|
||||
}
|
||||
selectedTracks.push_back(*eligibleTrack);
|
||||
}
|
||||
|
||||
//Determine second track
|
||||
int trackGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre = ?").bind(getCurrentTrack(session).trackGenre);
|
||||
int trackGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre = ?").bind(currentTrack.trackGenre);
|
||||
if(trackGenreCount > 0)
|
||||
{
|
||||
//Pick item from genre
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(getCurrentTrack(session).trackGenre);
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(currentTrack.trackGenre);
|
||||
//Try to make sure same track isn't up to vote again
|
||||
if((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint && trackGenreCount > 1)
|
||||
{
|
||||
while((*eligibleTrack).trackFingerprint == currentTrack.trackFingerprint)
|
||||
{
|
||||
eligibleTrack = session->find<AudioTrack>().where("genre = ?").limit(1).offset(rand() % trackGenreCount).bind(currentTrack.trackGenre);
|
||||
}
|
||||
}
|
||||
selectedTracks.push_back(*eligibleTrack);
|
||||
}
|
||||
|
||||
//Determine third track
|
||||
int trackNotGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre != ?").bind(getCurrentTrack(session).trackGenre);
|
||||
int trackNotGenreCount = session->query<int>("select count(fingerprint) from tracks").where("genre != ?").bind(currentTrack.trackGenre);
|
||||
if(requestQueue.size() > 0)
|
||||
{
|
||||
//There's a request. Pick one up front and put as third item.
|
||||
@@ -124,7 +148,7 @@ std::list<AudioTrack> GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio
|
||||
else if(trackNotGenreCount > 0)
|
||||
{
|
||||
//Pick from other genre
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("genre != ?").limit(1).offset(rand() % trackNotGenreCount).bind(getCurrentTrack(session).trackGenre);
|
||||
Wt::Dbo::ptr<AudioTrack> eligibleTrack = session->find<AudioTrack>().where("genre != ?").limit(1).offset(rand() % trackNotGenreCount).bind(currentTrack.trackGenre);
|
||||
selectedTracks.push_back(*eligibleTrack);
|
||||
}
|
||||
else
|
||||
@@ -200,7 +224,7 @@ void GroovePlayerMgr::grooveEventLoop()
|
||||
Wt::WApplication* app = Wt::WApplication::instance();
|
||||
if(app != nullptr)
|
||||
{
|
||||
static_cast<WebInterface*>(app)->songChangedFromServer(getCurrentTrack(&sqlSession));
|
||||
static_cast<WebInterface*>(app)->songChangedFromServer(currentTrack);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -216,6 +240,7 @@ void GroovePlayerMgr::grooveEventLoop()
|
||||
}
|
||||
else if(event == GROOVE_NOWPLAYING)
|
||||
{
|
||||
currentTrack = getCurrentTrackDB(&sqlSession);
|
||||
//Pick new batch of tracks to vote on and inform UI of update.
|
||||
currentVoteBatch = getNextVoteBatch(&sqlSession);
|
||||
currentVoteStatus = std::list<std::pair<AudioTrack, int>>();
|
||||
@@ -227,12 +252,12 @@ void GroovePlayerMgr::grooveEventLoop()
|
||||
Wt::WApplication* app = Wt::WApplication::instance();
|
||||
if(app != nullptr)
|
||||
{
|
||||
static_cast<WebInterface*>(app)->songChangedFromServer(getCurrentTrack(&sqlSession));
|
||||
static_cast<WebInterface*>(app)->songChangedFromServer(currentTrack);
|
||||
static_cast<WebInterface*>(app)->voteTracksUpdatedFromServer(currentVoteBatch);
|
||||
}
|
||||
}
|
||||
);
|
||||
Wt::log("info") << "Track playing changed to: " << getCurrentTrack(&sqlSession).trackName;
|
||||
Wt::log("info") << "Track playing changed to: " << currentTrack.trackName;
|
||||
}
|
||||
else if(event == VOTING_ENDED)
|
||||
{
|
||||
@@ -317,12 +342,23 @@ void GroovePlayerMgr::grooveEventLoop()
|
||||
}
|
||||
}
|
||||
groove_playlist_insert(currentPlaylist,groove_file_open(winner.trackPath.c_str()),1.0,1.0,nullptr);
|
||||
Wt::WServer::instance()->postAll([]() {
|
||||
Wt::WApplication* app = Wt::WApplication::instance();
|
||||
if(app != nullptr)
|
||||
{
|
||||
static_cast<WebInterface*>(app)->voteNextPollClosedFromServer();
|
||||
}
|
||||
}
|
||||
);
|
||||
Wt::log("info")<< "Voting has ended. Next track is: " << winner.trackName;
|
||||
}
|
||||
else if(event == VOTE_CAST)
|
||||
{
|
||||
if(!voteEndedButNotNextTrackYet)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
else if(event == PLAYING_PAUSED)
|
||||
{
|
||||
//
|
||||
@@ -366,7 +402,7 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi
|
||||
{
|
||||
double timeIntoTrack;
|
||||
groove_player_position(currentPlayer,nullptr,&timeIntoTrack);
|
||||
if(!voteEndedButNotNextTrackYet && getCurrentTrack(session).trackName != std::string() && getCurrentTrack(session).trackLengthSeconds-timeIntoTrack < 3)
|
||||
if(!voteEndedButNotNextTrackYet && currentTrack.trackName != std::string() && currentTrack.trackLengthSeconds-timeIntoTrack < 3)
|
||||
{
|
||||
voteEndedButNotNextTrackYet = true;
|
||||
return VOTING_ENDED;
|
||||
@@ -389,7 +425,7 @@ GroovePlayerMgr::PlayerEvents GroovePlayerMgr::getNextPlayerEvent(Wt::Dbo::Sessi
|
||||
return NOTHING;
|
||||
}
|
||||
|
||||
AudioTrack GroovePlayerMgr::getCurrentTrack(Wt::Dbo::Session* session)
|
||||
AudioTrack GroovePlayerMgr::getCurrentTrackDB(Wt::Dbo::Session* session)
|
||||
{
|
||||
Wt::Dbo::Transaction transaction(*session);
|
||||
GroovePlaylistItem* currentItem;
|
||||
|
||||
@@ -47,6 +47,7 @@ public:
|
||||
|
||||
struct GroovePlaylist* currentPlaylist;
|
||||
struct GroovePlayer* currentPlayer;
|
||||
AudioTrack currentTrack;
|
||||
std::list<AudioTrack> currentVoteBatch;
|
||||
std::list<std::pair<AudioTrack, int>> currentVoteStatus;
|
||||
bool voteEndedButNotNextTrackYet = false;
|
||||
@@ -73,7 +74,7 @@ private:
|
||||
PlayerEvents getNextPlayerEvent(Wt::Dbo::Session* session);
|
||||
void removeOrphanedTracks(Wt::Dbo::Session* session);
|
||||
|
||||
AudioTrack getCurrentTrack(Wt::Dbo::Session* session);
|
||||
AudioTrack getCurrentTrackDB(Wt::Dbo::Session* session);
|
||||
void getPictureFromTrack(AudioTrack* trackToFill);
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user