[UI] Added option to parametrize the min probability for creating high level tags

This commit is contained in:
emeric
2016-05-30 13:57:18 +02:00
parent 445f459654
commit fd9fdb8e87
5 changed files with 55 additions and 8 deletions
+19 -4
View File
@@ -297,7 +297,7 @@
</message> </message>
<message id="settings-database"> <message id="settings-database">
<legend>${title}</legend> <legend>${scan-title}</legend>
<div class="form-horizontal"> <div class="form-horizontal">
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2" for="${id:update-period}"> <label class="control-label col-sm-2" for="${id:update-period}">
@@ -346,10 +346,12 @@
${video-file-extensions-info} ${video-file-extensions-info}
</div> </div>
</div> </div>
</div>
<legend>${tags-title}</legend>
<div class="form-horizontal">
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2" for="${id:tags-highlevel-acousticbrainz}"> <label class="control-label col-sm-2" for="${id:tags-highlevel-acousticbrainz}">
Create tags from AcousticBrainz High-Level information Create tags from <a href="https://acousticbrainz.org" target="_blank">AcousticBrainz</a> High-level information
</label> </label>
<div class="col-sm-5"> <div class="col-sm-5">
${tags-highlevel-acousticbrainz} ${tags-highlevel-acousticbrainz}
@@ -359,9 +361,22 @@
</div> </div>
</div> </div>
<div class="form-group">
<label class="control-label col-sm-2" for="${id:tags-highlevel-acousticbrainz-min-probability}">
Minimum probability for High-level tags creation
</label>
<div class="col-sm-5">
${tags-highlevel-acousticbrainz-min-probability}
</div>
<div class="help-block col-sm-5">
${tags-highlevel-acousticbrainz-min-probability-info}
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2" for="${id:tags-similarity-acousticbrainz}"> <label class="control-label col-sm-2" for="${id:tags-similarity-acousticbrainz}">
Create tags from AcousticBrainz similarities Create tags from <a href="https://acousticbrainz.org" target="_blank">AcousticBrainz</a> Low-level similarities
</label> </label>
<div class="col-sm-5"> <div class="col-sm-5">
${tags-similarity-acousticbrainz} ${tags-similarity-acousticbrainz}
+3
View File
@@ -126,6 +126,9 @@ Handler::Handler(Wt::Dbo::SqlConnectionPool& connectionPool)
if (!Setting::exists(_session, "tags_highlevel_acousticbrainz")) if (!Setting::exists(_session, "tags_highlevel_acousticbrainz"))
Setting::setBool(_session, "tags_highlevel_acousticbrainz", true); Setting::setBool(_session, "tags_highlevel_acousticbrainz", true);
if (!Setting::exists(_session, "tags_highlevel_acousticbrainz_min_probability"))
Setting::setInt(_session, "tags_highlevel_acousticbrainz_min_probability", 90);
if (!Setting::exists(_session, "tags_similarity_acousticbrainz")) if (!Setting::exists(_session, "tags_similarity_acousticbrainz"))
Setting::setBool(_session, "tags_similarity_acousticbrain", false); Setting::setBool(_session, "tags_similarity_acousticbrain", false);
} }
@@ -35,7 +35,7 @@ static Cluster::pointer getCluster(std::string type, std::string value)
return cluster; return cluster;
} }
static std::list<std::string> getClustersFromFeature(Feature::Type& feature) static std::list<std::string> getClustersFromFeature(Feature::Type& feature, double minProb)
{ {
struct HighLevelNodeDesc struct HighLevelNodeDesc
{ {
@@ -168,6 +168,7 @@ void
HighLevelCluster::processDatabaseUpdate(Updater::Stats stats) HighLevelCluster::processDatabaseUpdate(Updater::Stats stats)
{ {
bool createTags = Setting::getBool(UpdaterDboSession(), "tags_highlevel_acousticbrainz", false); bool createTags = Setting::getBool(UpdaterDboSession(), "tags_highlevel_acousticbrainz", false);
double minProb = Setting::getInt(UpdaterDboSession(), "tags_highlevel_acousticbrainz_min_probability", false) / 100.;
LMS_LOG(DBUPDATER, INFO) << "Creating high level based clusters..."; LMS_LOG(DBUPDATER, INFO) << "Creating high level based clusters...";
@@ -187,7 +188,7 @@ HighLevelCluster::processDatabaseUpdate(Updater::Stats stats)
if (!Feature::Store::instance().get(UpdaterDboSession(), trackId, "high_level", feature)) if (!Feature::Store::instance().get(UpdaterDboSession(), trackId, "high_level", feature))
continue; continue;
newClusterNames = getClustersFromFeature(feature); newClusterNames = getClustersFromFeature(feature, minProb);
} }
Wt::Dbo::Transaction transaction(UpdaterDboSession()); Wt::Dbo::Transaction transaction(UpdaterDboSession());
+2
View File
@@ -113,6 +113,8 @@ int main(int argc, char* argv[])
dbUpdater.scanComplete().connect(std::bind(&Database::HighLevelCluster::processDatabaseUpdate, &dbHighLevelCluster, std::placeholders::_1)); dbUpdater.scanComplete().connect(std::bind(&Database::HighLevelCluster::processDatabaseUpdate, &dbHighLevelCluster, std::placeholders::_1));
dbUpdater.scanComplete().connect(std::bind(&Database::FeatureExtractor::processDatabaseUpdate, &dbFeatureExtractor, std::placeholders::_1)); dbUpdater.scanComplete().connect(std::bind(&Database::FeatureExtractor::processDatabaseUpdate, &dbFeatureExtractor, std::placeholders::_1));
// dbHighLevelCluster.processDatabaseUpdate(Database::Updater::Stats());
// bind entry point // bind entry point
server.addEntryPoint(Wt::Application, boost::bind(UserInterface::LmsApplication::create, server.addEntryPoint(Wt::Application, boost::bind(UserInterface::LmsApplication::create,
_1, boost::ref(*connectionPool))); _1, boost::ref(*connectionPool)));
+28 -2
View File
@@ -23,7 +23,9 @@
#include <Wt/WComboBox> #include <Wt/WComboBox>
#include <Wt/WMessageBox> #include <Wt/WMessageBox>
#include <Wt/WLineEdit> #include <Wt/WLineEdit>
#include <Wt/WSpinBox>
#include <Wt/WRegExpValidator> #include <Wt/WRegExpValidator>
#include <Wt/WIntValidator>
#include <Wt/WFormModel> #include <Wt/WFormModel>
#include <Wt/WStringListModel> #include <Wt/WStringListModel>
@@ -50,6 +52,7 @@ class DatabaseFormModel : public Wt::WFormModel
static const Field AudioFileExtensionsField; static const Field AudioFileExtensionsField;
static const Field VideoFileExtensionsField; static const Field VideoFileExtensionsField;
static const Field TagsHighLevelAcousticBrainz; static const Field TagsHighLevelAcousticBrainz;
static const Field TagsHighLevelAcousticBrainzMinProbability;
static const Field TagsSimilarityAcousticBrainz; static const Field TagsSimilarityAcousticBrainz;
DatabaseFormModel(Wt::WObject *parent = 0) DatabaseFormModel(Wt::WObject *parent = 0)
@@ -62,12 +65,14 @@ class DatabaseFormModel : public Wt::WFormModel
addField(AudioFileExtensionsField); addField(AudioFileExtensionsField);
addField(VideoFileExtensionsField); addField(VideoFileExtensionsField);
addField(TagsHighLevelAcousticBrainz); addField(TagsHighLevelAcousticBrainz);
addField(TagsHighLevelAcousticBrainzMinProbability);
addField(TagsSimilarityAcousticBrainz); addField(TagsSimilarityAcousticBrainz);
setValidator(UpdatePeriodField, createUpdatePeriodValidator()); setValidator(UpdatePeriodField, createUpdatePeriodValidator());
setValidator(UpdateStartTimeField, createStartTimeValidator()); setValidator(UpdateStartTimeField, createStartTimeValidator());
setValidator(AudioFileExtensionsField, createFileExtensionValidator()); setValidator(AudioFileExtensionsField, createFileExtensionValidator());
setValidator(VideoFileExtensionsField, createFileExtensionValidator()); setValidator(VideoFileExtensionsField, createFileExtensionValidator());
setValidator(TagsHighLevelAcousticBrainzMinProbability, createMinProbabilityValidator());
// populate the model with initial data // populate the model with initial data
loadData(); loadData();
@@ -90,6 +95,7 @@ class DatabaseFormModel : public Wt::WFormModel
setValue(VideoFileExtensionsField, Setting::getString(DboSession(), "video_file_extensions")); setValue(VideoFileExtensionsField, Setting::getString(DboSession(), "video_file_extensions"));
setValue(TagsHighLevelAcousticBrainz, Setting::getBool(DboSession(), "tags_highlevel_acousticbrainz")); setValue(TagsHighLevelAcousticBrainz, Setting::getBool(DboSession(), "tags_highlevel_acousticbrainz"));
setValue(TagsHighLevelAcousticBrainzMinProbability, Setting::getInt(DboSession(), "tags_highlevel_acousticbrainz_min_probability"));
setValue(TagsSimilarityAcousticBrainz, Setting::getBool(DboSession(), "tags_similarity_acousticbrainz")); setValue(TagsSimilarityAcousticBrainz, Setting::getBool(DboSession(), "tags_similarity_acousticbrainz"));
} }
@@ -107,6 +113,7 @@ class DatabaseFormModel : public Wt::WFormModel
Setting::setString(DboSession(), "video_file_extensions", boost::any_cast<Wt::WString>(value(VideoFileExtensionsField)).toUTF8()); Setting::setString(DboSession(), "video_file_extensions", boost::any_cast<Wt::WString>(value(VideoFileExtensionsField)).toUTF8());
Setting::setBool(DboSession(), "tags_highlevel_acousticbrainz", boost::any_cast<bool>(value(TagsHighLevelAcousticBrainz))); Setting::setBool(DboSession(), "tags_highlevel_acousticbrainz", boost::any_cast<bool>(value(TagsHighLevelAcousticBrainz)));
Setting::setInt(DboSession(), "tags_highlevel_acousticbrainz_min_probability", std::stoi(boost::any_cast<Wt::WString>(value(TagsHighLevelAcousticBrainzMinProbability)).toUTF8()));
Setting::setBool(DboSession(), "tags_similarity_acousticbrainz", boost::any_cast<bool>(value(TagsSimilarityAcousticBrainz))); Setting::setBool(DboSession(), "tags_similarity_acousticbrainz", boost::any_cast<bool>(value(TagsSimilarityAcousticBrainz)));
} }
@@ -238,6 +245,13 @@ class DatabaseFormModel : public Wt::WFormModel
return v; return v;
} }
Wt::WValidator *createMinProbabilityValidator()
{
Wt::WIntValidator *v = new Wt::WIntValidator(50, 100);
v->setMandatory(true);
return v;
}
Wt::WStringListModel* _updatePeriodModel; Wt::WStringListModel* _updatePeriodModel;
Wt::WStringListModel* _updateStartTimeModel; Wt::WStringListModel* _updateStartTimeModel;
@@ -248,6 +262,7 @@ const Wt::WFormModel::Field DatabaseFormModel::UpdateStartTimeField = "update-s
const Wt::WFormModel::Field DatabaseFormModel::AudioFileExtensionsField = "audio-file-extensions"; const Wt::WFormModel::Field DatabaseFormModel::AudioFileExtensionsField = "audio-file-extensions";
const Wt::WFormModel::Field DatabaseFormModel::VideoFileExtensionsField = "video-file-extensions"; const Wt::WFormModel::Field DatabaseFormModel::VideoFileExtensionsField = "video-file-extensions";
const Wt::WFormModel::Field DatabaseFormModel::TagsHighLevelAcousticBrainz = "tags-highlevel-acousticbrainz"; const Wt::WFormModel::Field DatabaseFormModel::TagsHighLevelAcousticBrainz = "tags-highlevel-acousticbrainz";
const Wt::WFormModel::Field DatabaseFormModel::TagsHighLevelAcousticBrainzMinProbability = "tags-highlevel-acousticbrainz-min-probability";
const Wt::WFormModel::Field DatabaseFormModel::TagsSimilarityAcousticBrainz = "tags-similarity-acousticbrainz"; const Wt::WFormModel::Field DatabaseFormModel::TagsSimilarityAcousticBrainz = "tags-similarity-acousticbrainz";
@@ -288,13 +303,24 @@ DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent)
videoFileExtensionsEdit->changed().connect(_applyInfo, &Wt::WWidget::hide); videoFileExtensionsEdit->changed().connect(_applyInfo, &Wt::WWidget::hide);
// Tags from AB high level // Tags from AB high level
setFormWidget(DatabaseFormModel::TagsHighLevelAcousticBrainz, new Wt::WCheckBox()); Wt::WCheckBox* highLevel = new Wt::WCheckBox();
setFormWidget(DatabaseFormModel::TagsHighLevelAcousticBrainz, highLevel);
setFormWidget(DatabaseFormModel::TagsHighLevelAcousticBrainzMinProbability, new Wt::WSpinBox());
highLevel->changed().connect(std::bind([=] {
_model->setReadOnly(DatabaseFormModel::TagsHighLevelAcousticBrainzMinProbability,
!(highLevel->checkState() == Wt::Checked));
updateModel(_model);
updateViewField(_model, DatabaseFormModel::TagsHighLevelAcousticBrainzMinProbability);
}));
// Tags from AB similarity // Tags from AB similarity
setFormWidget(DatabaseFormModel::TagsSimilarityAcousticBrainz, new Wt::WCheckBox()); setFormWidget(DatabaseFormModel::TagsSimilarityAcousticBrainz, new Wt::WCheckBox());
// Title & Buttons // Title & Buttons
bindString("title", "Database settings"); bindString("scan-title", "Scan settings");
bindString("tags-title", "Tag settings");
Wt::WPushButton *saveButton = new Wt::WPushButton("Apply"); Wt::WPushButton *saveButton = new Wt::WPushButton("Apply");
bindWidget("apply-button", saveButton); bindWidget("apply-button", saveButton);