[UI] Added option to parametrize the min probability for creating high level tags
This commit is contained in:
+19
-4
@@ -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}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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)));
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user