[DB] Reworked settings for acousticbrainz tagging

This commit is contained in:
emeric
2016-05-28 18:32:09 +02:00
parent b1b139ffcc
commit 2ea4ba7f22
23 changed files with 787 additions and 355 deletions
+11 -13
View File
@@ -31,6 +31,7 @@
#include "logger/Logger.hpp"
#include "database/DatabaseUpdater.hpp"
#include "database/Setting.hpp"
#include "LmsApplication.hpp"
@@ -39,6 +40,8 @@
namespace UserInterface {
namespace Settings {
using namespace Database;
Settings::Settings(Wt::WContainerWidget* parent)
: Wt::WContainerWidget(parent)
{
@@ -65,7 +68,7 @@ Settings::Settings(Wt::WContainerWidget* parent)
{
Wt::Dbo::Transaction transaction(DboSession());
userId = Database::User::getId(CurrentUser());
userId = User::getId(CurrentUser());
userIsAdmin = CurrentUser()->isAdmin();
}
@@ -77,24 +80,19 @@ Settings::Settings(Wt::WContainerWidget* parent)
{
LMS_LOG(UI, INFO) << "Media directories have changed: requesting imediate scan";
// On directory add or delete, request an immediate scan
//
{
Wt::Dbo::Transaction transaction(DboSession());
Database::MediaDirectorySettings::get(DboSession()).modify()->setManualScanRequested(true);
}
{
std::lock_guard<std::mutex> lock(Database::Updater::instance().getMutex());
Database::Updater::instance().restart();
}
// On directory change, request an immediate scan
std::lock_guard<std::mutex> lock(Updater::instance().getMutex());
Setting::setBool(DboSession(), "manual_scan_requested", true);
Updater::instance().restart();
}));
menu->addItem("Media Folders", mediaDirectories)->setPathComponent("mediadirectories");
DatabaseFormView* databaseFormView = new DatabaseFormView();
databaseFormView->changed().connect(std::bind([=]
{
std::lock_guard<std::mutex> lock(Database::Updater::instance().getMutex());
Database::Updater::instance().restart();
std::lock_guard<std::mutex> lock(Updater::instance().getMutex());
Updater::instance().restart();
}));
menu->addItem("Database", databaseFormView)->setPathComponent("database");
+44 -86
View File
@@ -29,7 +29,7 @@
#include <Wt/WStringListModel>
#include "logger/Logger.hpp"
#include "database/MediaDirectory.hpp"
#include "database/Setting.hpp"
#include "common/DirectoryValidator.hpp"
#include "LmsApplication.hpp"
@@ -49,6 +49,8 @@ class DatabaseFormModel : public Wt::WFormModel
static const Field UpdateStartTimeField;
static const Field AudioFileExtensionsField;
static const Field VideoFileExtensionsField;
static const Field TagsHighLevelAcousticBrainz;
static const Field TagsSimilarityAcousticBrainz;
DatabaseFormModel(Wt::WObject *parent = 0)
: Wt::WFormModel(parent)
@@ -59,6 +61,8 @@ class DatabaseFormModel : public Wt::WFormModel
addField(UpdateStartTimeField);
addField(AudioFileExtensionsField);
addField(VideoFileExtensionsField);
addField(TagsHighLevelAcousticBrainz);
addField(TagsSimilarityAcousticBrainz);
setValidator(UpdatePeriodField, createUpdatePeriodValidator());
setValidator(UpdateStartTimeField, createStartTimeValidator());
@@ -74,117 +78,70 @@ class DatabaseFormModel : public Wt::WFormModel
void loadData()
{
Wt::Dbo::Transaction transaction(DboSession());
// Get refresh settings
MediaDirectorySettings::pointer settings = MediaDirectorySettings::get(DboSession());
int periodRow = getUpdatePeriodModelRow( settings->getUpdatePeriod() );
int periodRow = getUpdatePeriodModelRow( Setting::getString(DboSession(), "update_period"));
if (periodRow != -1)
setValue(UpdatePeriodField, updatePeriod(periodRow));
setValue(UpdatePeriodField, updatePeriodDisplay(periodRow));
int startTimeRow = getUpdateStartTimeModelRow( settings->getUpdateStartTime() );
int startTimeRow = getUpdateStartTimeModelRow( Setting::getDuration(DboSession(), "update_start_time") );
if (startTimeRow != -1)
setValue(UpdateStartTimeField, updateStartTime( startTimeRow ) );
std::vector<boost::filesystem::path> audioFileExtensions = settings->getAudioFileExtensions();
{
std::ostringstream oss;
for (auto& fileExtension : audioFileExtensions)
oss << fileExtension.string() << " ";
setValue(AudioFileExtensionsField, Setting::getString(DboSession(), "audio_file_extensions"));
setValue(VideoFileExtensionsField, Setting::getString(DboSession(), "video_file_extensions"));
setValue(AudioFileExtensionsField, oss.str());
}
std::vector<boost::filesystem::path> videoFileExtensions = settings->getVideoFileExtensions();
{
std::ostringstream oss;
for (auto& fileExtension : videoFileExtensions)
oss << fileExtension.string() << " ";
setValue(VideoFileExtensionsField, oss.str());
}
setValue(TagsHighLevelAcousticBrainz, Setting::getBool(DboSession(), "tags_highlevel_acousticbrainz"));
setValue(TagsSimilarityAcousticBrainz, Setting::getBool(DboSession(), "tags_similarity_acousticbrainz"));
}
void saveData()
{
Wt::Dbo::Transaction transaction(DboSession());
MediaDirectorySettings::pointer settings = MediaDirectorySettings::get(DboSession());
int periodRow = getUpdatePeriodModelRow( boost::any_cast<Wt::WString>(value(UpdatePeriodField)));
assert(periodRow != -1);
settings.modify()->setUpdatePeriod( updatePeriodDuration( periodRow ) );
Setting::setString(DboSession(), "update_period", updatePeriodSetting( periodRow ) );
int startTimeRow = getUpdateStartTimeModelRow( boost::any_cast<Wt::WString>(value(UpdateStartTimeField)));
assert(startTimeRow != -1);
settings.modify()->setUpdateStartTime( updateStartTimeDuration( startTimeRow ) );
Setting::setDuration(DboSession(), "update_start_time", updateStartTimeDuration( startTimeRow ) );
{
std::vector<std::string> res;
std::istringstream iss(boost::any_cast<Wt::WString>(value(AudioFileExtensionsField)).toUTF8());
Setting::setString(DboSession(), "audio_file_extensions", boost::any_cast<Wt::WString>(value(AudioFileExtensionsField)).toUTF8());
Setting::setString(DboSession(), "video_file_extensions", boost::any_cast<Wt::WString>(value(VideoFileExtensionsField)).toUTF8());
std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(res));
settings.modify()->setAudioFileExtensions( std::vector<boost::filesystem::path>(res.begin(), res.end()) );
}
{
std::vector<std::string> res;
std::istringstream iss(boost::any_cast<Wt::WString>(value(VideoFileExtensionsField)).toUTF8());
std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(res));
settings.modify()->setVideoFileExtensions( std::vector<boost::filesystem::path>(res.begin(), res.end()) );
}
Setting::setBool(DboSession(), "tags_highlevel_acousticbrainz", boost::any_cast<bool>(value(TagsHighLevelAcousticBrainz)));
Setting::setBool(DboSession(), "tags_similarity_acousticbrainz", boost::any_cast<bool>(value(TagsSimilarityAcousticBrainz)));
}
bool setImmediateScan(Wt::WString& error)
void setImmediateScan()
{
try
{
Wt::Dbo::Transaction transaction( DboSession());
MediaDirectorySettings::pointer settings = MediaDirectorySettings::get(DboSession() );
settings.modify()->setManualScanRequested( true );
}
catch(Wt::Dbo::Exception& exception)
{
LMS_LOG(UI, ERROR) << "Dbo exception: " << exception.what();
return false;
}
return true;
Setting::setBool(DboSession(), "manual_scan_requested", true);
}
int getUpdatePeriodModelRow(Wt::WString value)
{
for (int i = 0; i < _updatePeriodModel->rowCount(); ++i)
{
if (updatePeriod(i) == value)
if (updatePeriodDisplay(i) == value)
return i;
}
return -1;
}
int getUpdatePeriodModelRow(MediaDirectorySettings::UpdatePeriod duration)
int getUpdatePeriodModelRow(std::string value)
{
for (int i = 0; i < _updatePeriodModel->rowCount(); ++i)
{
if (updatePeriodDuration(i) == duration)
if (updatePeriodSetting(i) == value)
return i;
}
return -1;
}
MediaDirectorySettings::UpdatePeriod updatePeriodDuration(int row) {
return boost::any_cast<MediaDirectorySettings::UpdatePeriod>
std::string updatePeriodSetting(int row) {
return boost::any_cast<std::string>
(_updatePeriodModel->data(_updatePeriodModel->index(row, 0), Wt::UserRole));
}
Wt::WString updatePeriod(int row) {
Wt::WString updatePeriodDisplay(int row) {
return boost::any_cast<Wt::WString>
(_updatePeriodModel->data(_updatePeriodModel->index(row, 0), Wt::DisplayRole));
}
@@ -230,16 +187,16 @@ class DatabaseFormModel : public Wt::WFormModel
_updatePeriodModel = new Wt::WStringListModel(this);
_updatePeriodModel->addString("Never");
_updatePeriodModel->setData(0, 0, MediaDirectorySettings::Never, Wt::UserRole);
_updatePeriodModel->setData(0, 0, std::string("never"), Wt::UserRole);
_updatePeriodModel->addString("Daily");
_updatePeriodModel->setData(1, 0, MediaDirectorySettings::Daily, Wt::UserRole);
_updatePeriodModel->setData(1, 0, std::string("daily"), Wt::UserRole);
_updatePeriodModel->addString("Weekly");
_updatePeriodModel->setData(2, 0, MediaDirectorySettings::Weekly, Wt::UserRole);
_updatePeriodModel->setData(2, 0, std::string("weekly"), Wt::UserRole);
_updatePeriodModel->addString("Monthly");
_updatePeriodModel->setData(3, 0, MediaDirectorySettings::Monthly, Wt::UserRole);
_updatePeriodModel->setData(3, 0, std::string("monthly"), Wt::UserRole);
_updateStartTimeModel = new Wt::WStringListModel(this);
@@ -290,6 +247,8 @@ const Wt::WFormModel::Field DatabaseFormModel::UpdatePeriodField = "update-peri
const Wt::WFormModel::Field DatabaseFormModel::UpdateStartTimeField = "update-start-time";
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::TagsSimilarityAcousticBrainz = "tags-similarity-acousticbrainz";
DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent)
@@ -328,6 +287,12 @@ DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent)
setFormWidget(DatabaseFormModel::VideoFileExtensionsField, videoFileExtensionsEdit);
videoFileExtensionsEdit->changed().connect(_applyInfo, &Wt::WWidget::hide);
// Tags from AB high level
setFormWidget(DatabaseFormModel::TagsHighLevelAcousticBrainz, new Wt::WCheckBox());
// Tags from AB similarity
setFormWidget(DatabaseFormModel::TagsSimilarityAcousticBrainz, new Wt::WCheckBox());
// Title & Buttons
bindString("title", "Database settings");
@@ -353,21 +318,14 @@ DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent)
void
DatabaseFormView::processImmediateScan()
{
Wt::WString error;
_model->setImmediateScan();
_applyInfo->setText( Wt::WString::fromUTF8("Media folder scan has been started!" ) );
_applyInfo->setStyleClass("alert alert-warning");
_applyInfo->show();
if (_model->setImmediateScan(error))
{
_applyInfo->setText( Wt::WString::fromUTF8("Media folder scan has been started!" ) );
_applyInfo->setStyleClass("alert alert-warning");
_sigChanged.emit();
}
else
{
_applyInfo->setText( error );
_applyInfo->setStyleClass("alert alert-danger");
}
_sigChanged.emit();
}
void