Adding basic radio mode

This commit is contained in:
emeric
2018-05-30 13:35:49 +02:00
parent b92717fa4f
commit e0ae294abf
8 changed files with 117 additions and 9 deletions
+52
View File
@@ -19,6 +19,8 @@
#include "PlayQueueView.hpp"
#include <random>
#include <Wt/WAnchor.h>
#include <Wt/WImage.h>
#include <Wt/WText.h>
@@ -46,6 +48,8 @@ PlayQueue::PlayQueue()
_showMore->addFunction("tr", &Wt::WTemplate::Functions::tr);
_showMore->setHidden(true);
_radioMode = bindNew<Wt::WCheckBox>("radio-mode", Wt::WString::tr("Lms.PlayQueue.radio-mode"));
_nbTracks = bindNew<Wt::WText>("nb-tracks");
{
@@ -107,6 +111,10 @@ PlayQueue::play(std::size_t pos)
return;
}
// If last and radio mode, fill the next song
if (_radioMode->checkState() == Wt::CheckState::Checked && pos == playlist->getCount() - 1)
addRadioTrack();
_trackPos = pos;
trackId = playlist->getEntry(*_trackPos)->getTrack().id();
updateCurrentTrack(true);
@@ -181,6 +189,12 @@ PlayQueue::enqueueTracks(const std::vector<Database::Track::pointer>& tracks)
addSome();
}
void
PlayQueue::enqueueTrack(Database::Track::pointer track)
{
enqueueTracks(std::vector<Database::Track::pointer>(1, track));
}
void
PlayQueue::addTracks(const std::vector<Database::Track::pointer>& tracks)
{
@@ -274,5 +288,43 @@ PlayQueue::addSome()
_showMore->setHidden(!moreResults);
}
void
PlayQueue::addRadioTrack()
{
auto now = std::chrono::system_clock::now();
std::mt19937 randGenerator(std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count());
LMS_LOG(UI, INFO) << "Radio mode: adding track";
auto playlist = Database::Playlist::get(LmsApp->getDboSession(), currentPlayQueueName, LmsApp->getCurrentUser());
// Get all the tracks of the playlist, get the cluster that is mostly used
// and reuse it to get the next track
auto clusters = playlist->getClusters();
if (clusters.empty())
return;
for (auto cluster : clusters)
{
LMS_LOG(UI, DEBUG) << "Processing cluster '" << cluster->getName() << "'";
auto nbTracks = cluster->getTrackCount();
if (nbTracks == 0)
continue;
std::uniform_int_distribution<int> dist(0, nbTracks - 1);
auto trackToAdd = cluster->getTracks(dist(randGenerator), 1).front();
if (!playlist->hasTrack(trackToAdd.id()))
{
enqueueTrack(trackToAdd);
return;
}
}
LMS_LOG(UI, INFO) << "No more track to be added!";
}
} // namespace UserInterface
+4
View File
@@ -19,6 +19,7 @@
#pragma once
#include <Wt/WCheckBox.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WSignal.h>
#include <Wt/WTemplate.h>
@@ -52,13 +53,16 @@ class PlayQueue : public Wt::WTemplate
private:
void enqueueTracks(const std::vector<Database::Track::pointer>& tracks);
void enqueueTrack(Database::Track::pointer track);
void addSome();
void addRadioTrack();
void updateInfo();
void updateCurrentTrack(bool selected);
void play(std::size_t pos);
void stop();
Wt::WCheckBox* _radioMode;
Wt::WContainerWidget* _entriesContainer;
Wt::WTemplate* _showMore;
Wt::WText* _nbTracks;