Adding basic radio mode
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user