diff --git a/approot/templates.xml b/approot/templates.xml index 80afcd58..007c9824 100644 --- a/approot/templates.xml +++ b/approot/templates.xml @@ -297,7 +297,7 @@ - ${title} + ${scan-title}
- + + ${tags-title} +
${tags-highlevel-acousticbrainz} @@ -359,9 +361,22 @@
+
+ +
+ ${tags-highlevel-acousticbrainz-min-probability} +
+
+ ${tags-highlevel-acousticbrainz-min-probability-info} +
+
+ +
${tags-similarity-acousticbrainz} diff --git a/src/database/DatabaseHandler.cpp b/src/database/DatabaseHandler.cpp index 270e4fe1..f9c46053 100644 --- a/src/database/DatabaseHandler.cpp +++ b/src/database/DatabaseHandler.cpp @@ -126,6 +126,9 @@ Handler::Handler(Wt::Dbo::SqlConnectionPool& connectionPool) if (!Setting::exists(_session, "tags_highlevel_acousticbrainz")) 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")) Setting::setBool(_session, "tags_similarity_acousticbrain", false); } diff --git a/src/database/cluster/DatabaseHighLevelCluster.cpp b/src/database/cluster/DatabaseHighLevelCluster.cpp index 81ce53f9..84af0d28 100644 --- a/src/database/cluster/DatabaseHighLevelCluster.cpp +++ b/src/database/cluster/DatabaseHighLevelCluster.cpp @@ -35,7 +35,7 @@ static Cluster::pointer getCluster(std::string type, std::string value) return cluster; } -static std::list getClustersFromFeature(Feature::Type& feature) +static std::list getClustersFromFeature(Feature::Type& feature, double minProb) { struct HighLevelNodeDesc { @@ -168,6 +168,7 @@ void HighLevelCluster::processDatabaseUpdate(Updater::Stats stats) { 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..."; @@ -187,7 +188,7 @@ HighLevelCluster::processDatabaseUpdate(Updater::Stats stats) if (!Feature::Store::instance().get(UpdaterDboSession(), trackId, "high_level", feature)) continue; - newClusterNames = getClustersFromFeature(feature); + newClusterNames = getClustersFromFeature(feature, minProb); } Wt::Dbo::Transaction transaction(UpdaterDboSession()); diff --git a/src/main/main.cpp b/src/main/main.cpp index f22afc8f..1c8eecc5 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -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::FeatureExtractor::processDatabaseUpdate, &dbFeatureExtractor, std::placeholders::_1)); +// dbHighLevelCluster.processDatabaseUpdate(Database::Updater::Stats()); + // bind entry point server.addEntryPoint(Wt::Application, boost::bind(UserInterface::LmsApplication::create, _1, boost::ref(*connectionPool))); diff --git a/src/ui/settings/SettingsDatabaseFormView.cpp b/src/ui/settings/SettingsDatabaseFormView.cpp index 1c93f1d8..ffc15630 100644 --- a/src/ui/settings/SettingsDatabaseFormView.cpp +++ b/src/ui/settings/SettingsDatabaseFormView.cpp @@ -23,7 +23,9 @@ #include #include #include +#include #include +#include #include #include @@ -50,6 +52,7 @@ class DatabaseFormModel : public Wt::WFormModel static const Field AudioFileExtensionsField; static const Field VideoFileExtensionsField; static const Field TagsHighLevelAcousticBrainz; + static const Field TagsHighLevelAcousticBrainzMinProbability; static const Field TagsSimilarityAcousticBrainz; DatabaseFormModel(Wt::WObject *parent = 0) @@ -62,12 +65,14 @@ class DatabaseFormModel : public Wt::WFormModel addField(AudioFileExtensionsField); addField(VideoFileExtensionsField); addField(TagsHighLevelAcousticBrainz); + addField(TagsHighLevelAcousticBrainzMinProbability); addField(TagsSimilarityAcousticBrainz); setValidator(UpdatePeriodField, createUpdatePeriodValidator()); setValidator(UpdateStartTimeField, createStartTimeValidator()); setValidator(AudioFileExtensionsField, createFileExtensionValidator()); setValidator(VideoFileExtensionsField, createFileExtensionValidator()); + setValidator(TagsHighLevelAcousticBrainzMinProbability, createMinProbabilityValidator()); // populate the model with initial data loadData(); @@ -90,6 +95,7 @@ class DatabaseFormModel : public Wt::WFormModel setValue(VideoFileExtensionsField, Setting::getString(DboSession(), "video_file_extensions")); 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")); } @@ -107,6 +113,7 @@ class DatabaseFormModel : public Wt::WFormModel Setting::setString(DboSession(), "video_file_extensions", boost::any_cast(value(VideoFileExtensionsField)).toUTF8()); Setting::setBool(DboSession(), "tags_highlevel_acousticbrainz", boost::any_cast(value(TagsHighLevelAcousticBrainz))); + Setting::setInt(DboSession(), "tags_highlevel_acousticbrainz_min_probability", std::stoi(boost::any_cast(value(TagsHighLevelAcousticBrainzMinProbability)).toUTF8())); Setting::setBool(DboSession(), "tags_similarity_acousticbrainz", boost::any_cast(value(TagsSimilarityAcousticBrainz))); } @@ -238,6 +245,13 @@ class DatabaseFormModel : public Wt::WFormModel return v; } + Wt::WValidator *createMinProbabilityValidator() + { + Wt::WIntValidator *v = new Wt::WIntValidator(50, 100); + v->setMandatory(true); + return v; + } + Wt::WStringListModel* _updatePeriodModel; 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::VideoFileExtensionsField = "video-file-extensions"; 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"; @@ -288,13 +303,24 @@ DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent) videoFileExtensionsEdit->changed().connect(_applyInfo, &Wt::WWidget::hide); // 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 setFormWidget(DatabaseFormModel::TagsSimilarityAcousticBrainz, new Wt::WCheckBox()); // Title & Buttons - bindString("title", "Database settings"); + bindString("scan-title", "Scan settings"); + bindString("tags-title", "Tag settings"); Wt::WPushButton *saveButton = new Wt::WPushButton("Apply"); bindWidget("apply-button", saveButton);