[UI] Added settings to select the audio/video files to be scanned using the file extensions
This commit is contained in:
@@ -311,6 +311,30 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-sm-2" for="${id:audio-file-extensions}">
|
||||||
|
Audio file extensions
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-5">
|
||||||
|
${audio-file-extensions}
|
||||||
|
</div>
|
||||||
|
<div class="help-block col-sm-5">
|
||||||
|
${audio-file-extensions-info}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-sm-2" for="${id:video-file-extensions}">
|
||||||
|
Video file extensions
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-5">
|
||||||
|
${video-file-extensions}
|
||||||
|
</div>
|
||||||
|
<div class="help-block col-sm-5">
|
||||||
|
${video-file-extensions-info}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-2 col-sm-10">
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
${apply-button} ${discard-button} ${immediate-scan-button}
|
${apply-button} ${discard-button} ${immediate-scan-button}
|
||||||
|
|||||||
@@ -128,20 +128,6 @@ _metadataParser(parser)
|
|||||||
_ioService.setThreadCount(1);
|
_ioService.setThreadCount(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Updater::setAudioExtensions(const std::vector<std::string>& extensions)
|
|
||||||
{
|
|
||||||
for (const std::string& extension : extensions)
|
|
||||||
_audioExtensions.push_back("." + extension);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Updater::setVideoExtensions(const std::vector<std::string>& extensions)
|
|
||||||
{
|
|
||||||
for (const std::string& extension : extensions)
|
|
||||||
_videoExtensions.push_back("." + extension);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Updater::start(void)
|
Updater::start(void)
|
||||||
{
|
{
|
||||||
@@ -233,6 +219,8 @@ Updater::process(boost::system::error_code err)
|
|||||||
{
|
{
|
||||||
if (!err)
|
if (!err)
|
||||||
{
|
{
|
||||||
|
updateFileExtensions();
|
||||||
|
|
||||||
Stats stats;
|
Stats stats;
|
||||||
|
|
||||||
checkAudioFiles(stats);
|
checkAudioFiles(stats);
|
||||||
@@ -284,6 +272,15 @@ Updater::process(boost::system::error_code err)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Updater::updateFileExtensions()
|
||||||
|
{
|
||||||
|
Wt::Dbo::Transaction transaction(_db.getSession());
|
||||||
|
|
||||||
|
_audioFileExtensions = MediaDirectorySettings::get(_db.getSession())->getAudioFileExtensions();
|
||||||
|
_videoFileExtensions = MediaDirectorySettings::get(_db.getSession())->getVideoFileExtensions();
|
||||||
|
}
|
||||||
|
|
||||||
Artist::pointer
|
Artist::pointer
|
||||||
Updater::getArtist( const boost::filesystem::path& file, const std::string& name, const std::string& mbid)
|
Updater::getArtist( const boost::filesystem::path& file, const std::string& name, const std::string& mbid)
|
||||||
{
|
{
|
||||||
@@ -574,13 +571,13 @@ Updater::processRootDirectory(RootDirectory rootDirectory, Stats& stats)
|
|||||||
switch( rootDirectory.type )
|
switch( rootDirectory.type )
|
||||||
{
|
{
|
||||||
case Database::MediaDirectory::Audio:
|
case Database::MediaDirectory::Audio:
|
||||||
if (isFileSupported(*itPath, _audioExtensions))
|
if (isFileSupported(*itPath, _audioFileExtensions))
|
||||||
processAudioFile( *itPath, stats );
|
processAudioFile( *itPath, stats );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Database::MediaDirectory::Video:
|
case Database::MediaDirectory::Video:
|
||||||
if (isFileSupported(*itPath, _videoExtensions))
|
if (isFileSupported(*itPath, _videoFileExtensions))
|
||||||
processVideoFile( *itPath, stats);
|
processVideoFile( *itPath, stats);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -655,7 +652,7 @@ Updater::checkAudioFiles( Stats& stats )
|
|||||||
if (!_running)
|
if (!_running)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!checkFile(trackPath, rootDirs, _audioExtensions))
|
if (!checkFile(trackPath, rootDirs, _audioFileExtensions))
|
||||||
{
|
{
|
||||||
Wt::Dbo::Transaction transaction(_db.getSession());
|
Wt::Dbo::Transaction transaction(_db.getSession());
|
||||||
|
|
||||||
@@ -723,7 +720,7 @@ Updater::checkVideoFiles( Stats& stats )
|
|||||||
if (!_running)
|
if (!_running)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!checkFile(videoPath, rootDirs, _videoExtensions))
|
if (!checkFile(videoPath, rootDirs, _videoFileExtensions))
|
||||||
{
|
{
|
||||||
Wt::Dbo::Transaction transaction(_db.getSession());
|
Wt::Dbo::Transaction transaction(_db.getSession());
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ class Updater
|
|||||||
Database::Artist::pointer getArtist( const boost::filesystem::path& file, const std::string& name, const std::string& MBID);
|
Database::Artist::pointer getArtist( const boost::filesystem::path& file, const std::string& name, const std::string& MBID);
|
||||||
Database::Release::pointer getRelease( const boost::filesystem::path& file, const std::string& name, const std::string& MBID);
|
Database::Release::pointer getRelease( const boost::filesystem::path& file, const std::string& name, const std::string& MBID);
|
||||||
std::vector<Database::Genre::pointer> getGenres( const std::list<std::string>& names);
|
std::vector<Database::Genre::pointer> getGenres( const std::list<std::string>& names);
|
||||||
|
void updateFileExtensions();
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
void checkAudioFiles( Stats& stats );
|
void checkAudioFiles( Stats& stats );
|
||||||
@@ -96,11 +97,8 @@ class Updater
|
|||||||
|
|
||||||
Database::Handler _db;
|
Database::Handler _db;
|
||||||
|
|
||||||
std::vector<boost::filesystem::path> _audioExtensions
|
std::vector<boost::filesystem::path> _audioFileExtensions;
|
||||||
= {".mp3", ".ogg", ".oga", ".aac", ".m4a", ".flac", ".wav", ".wma", ".aif", ".aiff", ".ape", ".mpc", ".shn"}; // TODO parametrize
|
std::vector<boost::filesystem::path> _videoFileExtensions;
|
||||||
|
|
||||||
std::vector<boost::filesystem::path> _videoExtensions
|
|
||||||
= {".flv", ".avi", ".mpg", ".mpeg", ".mp4", ".m4v", ".mkv", ".mov", ".wmv", ".ogv", ".divx", ".m2ts"}; // TODO parametrize
|
|
||||||
|
|
||||||
MetaData::Parser& _metadataParser;
|
MetaData::Parser& _metadataParser;
|
||||||
|
|
||||||
|
|||||||
@@ -21,11 +21,40 @@
|
|||||||
|
|
||||||
#include "Types.hpp"
|
#include "Types.hpp"
|
||||||
|
|
||||||
|
static std::string pathsToString(const std::vector<boost::filesystem::path>& paths)
|
||||||
|
{
|
||||||
|
std::ostringstream oss;
|
||||||
|
|
||||||
|
bool first = true;
|
||||||
|
for (auto& path : paths)
|
||||||
|
{
|
||||||
|
if (!first)
|
||||||
|
oss << " ";
|
||||||
|
|
||||||
|
oss << path.string();
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<boost::filesystem::path> stringToPaths(const std::string value)
|
||||||
|
{
|
||||||
|
std::vector<std::string> res;
|
||||||
|
std::istringstream iss(value);
|
||||||
|
|
||||||
|
std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(res));
|
||||||
|
|
||||||
|
return std::vector<boost::filesystem::path>(res.begin(), res.end());
|
||||||
|
}
|
||||||
|
|
||||||
namespace Database {
|
namespace Database {
|
||||||
|
|
||||||
MediaDirectorySettings::MediaDirectorySettings()
|
MediaDirectorySettings::MediaDirectorySettings()
|
||||||
: _manualScanRequested(false),
|
: _manualScanRequested(false),
|
||||||
_updatePeriod(Never)
|
_updatePeriod(Never),
|
||||||
|
_audioFileExtensions(".mp3 .ogg .oga .aac .m4a .flac .wav .wma .aif .aiff .ape .mpc .shn"),
|
||||||
|
_videoFileExtensions(".flv .avi .mpg .mpeg .mp4 .m4v .mkv .mov .wmv .ogv .divx .m2ts")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,6 +77,31 @@ MediaDirectorySettings::get(Wt::Dbo::Session& session)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<boost::filesystem::path>
|
||||||
|
MediaDirectorySettings::getAudioFileExtensions(void) const
|
||||||
|
{
|
||||||
|
return stringToPaths(_audioFileExtensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<boost::filesystem::path>
|
||||||
|
MediaDirectorySettings::getVideoFileExtensions(void) const
|
||||||
|
{
|
||||||
|
return stringToPaths(_videoFileExtensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MediaDirectorySettings::setAudioFileExtensions(std::vector<boost::filesystem::path> extensions)
|
||||||
|
{
|
||||||
|
_audioFileExtensions = pathsToString(extensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MediaDirectorySettings::setVideoFileExtensions(std::vector<boost::filesystem::path> extensions)
|
||||||
|
{
|
||||||
|
_videoFileExtensions = pathsToString(extensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MediaDirectory::pointer
|
MediaDirectory::pointer
|
||||||
MediaDirectory::create(Wt::Dbo::Session& session, boost::filesystem::path p, Type type)
|
MediaDirectory::create(Wt::Dbo::Session& session, boost::filesystem::path p, Type type)
|
||||||
{
|
{
|
||||||
@@ -84,4 +138,5 @@ MediaDirectory::get(Wt::Dbo::Session& session, boost::filesystem::path p, Type t
|
|||||||
return session.find<MediaDirectory>().where("path = ?").where("type = ?").bind( p.string()).bind(type);
|
return session.find<MediaDirectory>().where("path = ?").where("type = ?").bind( p.string()).bind(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace Database
|
} // namespace Database
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ class MediaDirectorySettings
|
|||||||
void setUpdateStartTime(boost::posix_time::time_duration dur) { _updateStartTime = dur;}
|
void setUpdateStartTime(boost::posix_time::time_duration dur) { _updateStartTime = dur;}
|
||||||
void setLastUpdate(boost::posix_time::ptime time) { _lastUpdate = time; }
|
void setLastUpdate(boost::posix_time::ptime time) { _lastUpdate = time; }
|
||||||
void setLastScan(boost::posix_time::ptime time) { _lastScan = time; }
|
void setLastScan(boost::posix_time::ptime time) { _lastScan = time; }
|
||||||
|
void setAudioFileExtensions(std::vector<boost::filesystem::path> extensions);
|
||||||
|
void setVideoFileExtensions(std::vector<boost::filesystem::path> extensions);
|
||||||
|
|
||||||
// Read accessors
|
// Read accessors
|
||||||
bool getManualScanRequested(void) const { return _manualScanRequested; }
|
bool getManualScanRequested(void) const { return _manualScanRequested; }
|
||||||
@@ -62,6 +64,8 @@ class MediaDirectorySettings
|
|||||||
boost::posix_time::time_duration getUpdateStartTime(void) const { return _updateStartTime; }
|
boost::posix_time::time_duration getUpdateStartTime(void) const { return _updateStartTime; }
|
||||||
boost::posix_time::ptime getLastUpdated(void) const { return _lastUpdate; }
|
boost::posix_time::ptime getLastUpdated(void) const { return _lastUpdate; }
|
||||||
boost::posix_time::ptime getLastScan(void) const { return _lastScan; }
|
boost::posix_time::ptime getLastScan(void) const { return _lastScan; }
|
||||||
|
std::vector<boost::filesystem::path> getAudioFileExtensions(void) const;
|
||||||
|
std::vector<boost::filesystem::path> getVideoFileExtensions(void) const;
|
||||||
|
|
||||||
template<class Action>
|
template<class Action>
|
||||||
void persist(Action& a)
|
void persist(Action& a)
|
||||||
@@ -69,6 +73,8 @@ class MediaDirectorySettings
|
|||||||
Wt::Dbo::field(a, _manualScanRequested, "manual_scan_requested");
|
Wt::Dbo::field(a, _manualScanRequested, "manual_scan_requested");
|
||||||
Wt::Dbo::field(a, _updatePeriod, "update_period");
|
Wt::Dbo::field(a, _updatePeriod, "update_period");
|
||||||
Wt::Dbo::field(a, _updateStartTime, "update_start_time");
|
Wt::Dbo::field(a, _updateStartTime, "update_start_time");
|
||||||
|
Wt::Dbo::field(a, _audioFileExtensions, "audio_file_extensions");
|
||||||
|
Wt::Dbo::field(a, _videoFileExtensions, "video_file_extensions");
|
||||||
Wt::Dbo::field(a, _lastUpdate, "last_update");
|
Wt::Dbo::field(a, _lastUpdate, "last_update");
|
||||||
Wt::Dbo::field(a, _lastScan, "last_scan");
|
Wt::Dbo::field(a, _lastScan, "last_scan");
|
||||||
Wt::Dbo::hasMany(a, _mediaDirectories, Wt::Dbo::ManyToOne, "media_directory_settings");
|
Wt::Dbo::hasMany(a, _mediaDirectories, Wt::Dbo::ManyToOne, "media_directory_settings");
|
||||||
@@ -79,6 +85,8 @@ class MediaDirectorySettings
|
|||||||
bool _manualScanRequested; // Immadiate scan has been requested by user
|
bool _manualScanRequested; // Immadiate scan has been requested by user
|
||||||
UpdatePeriod _updatePeriod; // How long between updates
|
UpdatePeriod _updatePeriod; // How long between updates
|
||||||
boost::posix_time::time_duration _updateStartTime; // Time of day to begin the update
|
boost::posix_time::time_duration _updateStartTime; // Time of day to begin the update
|
||||||
|
std::string _audioFileExtensions; // Extension of the audio files to be scanned
|
||||||
|
std::string _videoFileExtensions; // Extension of the video files to be scanned
|
||||||
boost::posix_time::ptime _lastUpdate; // last time the database has changed
|
boost::posix_time::ptime _lastUpdate; // last time the database has changed
|
||||||
boost::posix_time::ptime _lastScan; // last time the database has been scanned
|
boost::posix_time::ptime _lastScan; // last time the database has been scanned
|
||||||
Wt::Dbo::collection< Wt::Dbo::ptr<MediaDirectory> > _mediaDirectories; // list of media directories
|
Wt::Dbo::collection< Wt::Dbo::ptr<MediaDirectory> > _mediaDirectories; // list of media directories
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ Settings::Settings(Wt::WContainerWidget* parent)
|
|||||||
|
|
||||||
DatabaseFormView* databaseFormView = new DatabaseFormView();
|
DatabaseFormView* databaseFormView = new DatabaseFormView();
|
||||||
databaseFormView->changed().connect(this, &Settings::restartDatabaseUpdateService);
|
databaseFormView->changed().connect(this, &Settings::restartDatabaseUpdateService);
|
||||||
menu->addItem("Database Update", databaseFormView);
|
menu->addItem("Database", databaseFormView);
|
||||||
|
|
||||||
menu->addItem("Users", new Users());
|
menu->addItem("Users", new Users());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
#include <Wt/WCheckBox>
|
#include <Wt/WCheckBox>
|
||||||
#include <Wt/WComboBox>
|
#include <Wt/WComboBox>
|
||||||
#include <Wt/WMessageBox>
|
#include <Wt/WMessageBox>
|
||||||
|
#include <Wt/WLineEdit>
|
||||||
|
#include <Wt/WRegExpValidator>
|
||||||
|
|
||||||
#include <Wt/WFormModel>
|
#include <Wt/WFormModel>
|
||||||
#include <Wt/WStringListModel>
|
#include <Wt/WStringListModel>
|
||||||
@@ -37,12 +39,16 @@
|
|||||||
namespace UserInterface {
|
namespace UserInterface {
|
||||||
namespace Settings {
|
namespace Settings {
|
||||||
|
|
||||||
|
using namespace Database;
|
||||||
|
|
||||||
class DatabaseFormModel : public Wt::WFormModel
|
class DatabaseFormModel : public Wt::WFormModel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Associate each field with a unique string literal.
|
// Associate each field with a unique string literal.
|
||||||
static const Field UpdatePeriodField;
|
static const Field UpdatePeriodField;
|
||||||
static const Field UpdateStartTimeField;
|
static const Field UpdateStartTimeField;
|
||||||
|
static const Field AudioFileExtensionsField;
|
||||||
|
static const Field VideoFileExtensionsField;
|
||||||
|
|
||||||
DatabaseFormModel(Wt::WObject *parent = 0)
|
DatabaseFormModel(Wt::WObject *parent = 0)
|
||||||
: Wt::WFormModel(parent)
|
: Wt::WFormModel(parent)
|
||||||
@@ -51,9 +57,13 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
|
|
||||||
addField(UpdatePeriodField);
|
addField(UpdatePeriodField);
|
||||||
addField(UpdateStartTimeField);
|
addField(UpdateStartTimeField);
|
||||||
|
addField(AudioFileExtensionsField);
|
||||||
|
addField(VideoFileExtensionsField);
|
||||||
|
|
||||||
setValidator(UpdatePeriodField, createUpdatePeriodValidator());
|
setValidator(UpdatePeriodField, createUpdatePeriodValidator());
|
||||||
setValidator(UpdateStartTimeField, createStartTimeValidator());
|
setValidator(UpdateStartTimeField, createStartTimeValidator());
|
||||||
|
setValidator(AudioFileExtensionsField, createFileExtensionValidator());
|
||||||
|
setValidator(VideoFileExtensionsField, createFileExtensionValidator());
|
||||||
|
|
||||||
// populate the model with initial data
|
// populate the model with initial data
|
||||||
loadData();
|
loadData();
|
||||||
@@ -67,7 +77,7 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
Wt::Dbo::Transaction transaction(DboSession());
|
Wt::Dbo::Transaction transaction(DboSession());
|
||||||
|
|
||||||
// Get refresh settings
|
// Get refresh settings
|
||||||
::Database::MediaDirectorySettings::pointer settings = ::Database::MediaDirectorySettings::get(DboSession());
|
MediaDirectorySettings::pointer settings = MediaDirectorySettings::get(DboSession());
|
||||||
|
|
||||||
int periodRow = getUpdatePeriodModelRow( settings->getUpdatePeriod() );
|
int periodRow = getUpdatePeriodModelRow( settings->getUpdatePeriod() );
|
||||||
if (periodRow != -1)
|
if (periodRow != -1)
|
||||||
@@ -77,13 +87,30 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
if (startTimeRow != -1)
|
if (startTimeRow != -1)
|
||||||
setValue(UpdateStartTimeField, updateStartTime( startTimeRow ) );
|
setValue(UpdateStartTimeField, updateStartTime( startTimeRow ) );
|
||||||
|
|
||||||
|
std::vector<boost::filesystem::path> audioFileExtensions = settings->getAudioFileExtensions();
|
||||||
|
{
|
||||||
|
std::ostringstream oss;
|
||||||
|
for (auto& fileExtension : audioFileExtensions)
|
||||||
|
oss << fileExtension.string() << " ";
|
||||||
|
|
||||||
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveData()
|
void saveData()
|
||||||
{
|
{
|
||||||
Wt::Dbo::Transaction transaction(DboSession());
|
Wt::Dbo::Transaction transaction(DboSession());
|
||||||
|
|
||||||
::Database::MediaDirectorySettings::pointer settings = ::Database::MediaDirectorySettings::get(DboSession());
|
MediaDirectorySettings::pointer settings = MediaDirectorySettings::get(DboSession());
|
||||||
|
|
||||||
int periodRow = getUpdatePeriodModelRow( boost::any_cast<Wt::WString>(value(UpdatePeriodField)));
|
int periodRow = getUpdatePeriodModelRow( boost::any_cast<Wt::WString>(value(UpdatePeriodField)));
|
||||||
assert(periodRow != -1);
|
assert(periodRow != -1);
|
||||||
@@ -93,14 +120,32 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
assert(startTimeRow != -1);
|
assert(startTimeRow != -1);
|
||||||
settings.modify()->setUpdateStartTime( updateStartTimeDuration( startTimeRow ) );
|
settings.modify()->setUpdateStartTime( updateStartTimeDuration( startTimeRow ) );
|
||||||
|
|
||||||
|
{
|
||||||
|
std::vector<std::string> res;
|
||||||
|
std::istringstream iss(boost::any_cast<Wt::WString>(value(AudioFileExtensionsField)).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()) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool setImmediateScan(Wt::WString& error)
|
bool setImmediateScan(Wt::WString& error)
|
||||||
{
|
{
|
||||||
try {
|
try
|
||||||
|
{
|
||||||
Wt::Dbo::Transaction transaction( DboSession());
|
Wt::Dbo::Transaction transaction( DboSession());
|
||||||
|
|
||||||
::Database::MediaDirectorySettings::pointer settings = ::Database::MediaDirectorySettings::get(DboSession() );
|
MediaDirectorySettings::pointer settings = MediaDirectorySettings::get(DboSession() );
|
||||||
|
|
||||||
settings.modify()->setManualScanRequested( true );
|
settings.modify()->setManualScanRequested( true );
|
||||||
}
|
}
|
||||||
@@ -123,7 +168,7 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getUpdatePeriodModelRow(Database::MediaDirectorySettings::UpdatePeriod duration)
|
int getUpdatePeriodModelRow(MediaDirectorySettings::UpdatePeriod duration)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < _updatePeriodModel->rowCount(); ++i)
|
for (int i = 0; i < _updatePeriodModel->rowCount(); ++i)
|
||||||
{
|
{
|
||||||
@@ -134,8 +179,8 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Database::MediaDirectorySettings::UpdatePeriod updatePeriodDuration(int row) {
|
MediaDirectorySettings::UpdatePeriod updatePeriodDuration(int row) {
|
||||||
return boost::any_cast<Database::MediaDirectorySettings::UpdatePeriod>
|
return boost::any_cast<MediaDirectorySettings::UpdatePeriod>
|
||||||
(_updatePeriodModel->data(_updatePeriodModel->index(row, 0), Wt::UserRole));
|
(_updatePeriodModel->data(_updatePeriodModel->index(row, 0), Wt::UserRole));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,16 +230,16 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
_updatePeriodModel = new Wt::WStringListModel(this);
|
_updatePeriodModel = new Wt::WStringListModel(this);
|
||||||
|
|
||||||
_updatePeriodModel->addString("Never");
|
_updatePeriodModel->addString("Never");
|
||||||
_updatePeriodModel->setData(0, 0, Database::MediaDirectorySettings::Never, Wt::UserRole);
|
_updatePeriodModel->setData(0, 0, MediaDirectorySettings::Never, Wt::UserRole);
|
||||||
|
|
||||||
_updatePeriodModel->addString("Daily");
|
_updatePeriodModel->addString("Daily");
|
||||||
_updatePeriodModel->setData(1, 0, Database::MediaDirectorySettings::Daily, Wt::UserRole);
|
_updatePeriodModel->setData(1, 0, MediaDirectorySettings::Daily, Wt::UserRole);
|
||||||
|
|
||||||
_updatePeriodModel->addString("Weekly");
|
_updatePeriodModel->addString("Weekly");
|
||||||
_updatePeriodModel->setData(2, 0, Database::MediaDirectorySettings::Weekly, Wt::UserRole);
|
_updatePeriodModel->setData(2, 0, MediaDirectorySettings::Weekly, Wt::UserRole);
|
||||||
|
|
||||||
_updatePeriodModel->addString("Monthly");
|
_updatePeriodModel->addString("Monthly");
|
||||||
_updatePeriodModel->setData(3, 0, Database::MediaDirectorySettings::Monthly, Wt::UserRole);
|
_updatePeriodModel->setData(3, 0, MediaDirectorySettings::Monthly, Wt::UserRole);
|
||||||
|
|
||||||
_updateStartTimeModel = new Wt::WStringListModel(this);
|
_updateStartTimeModel = new Wt::WStringListModel(this);
|
||||||
|
|
||||||
@@ -216,18 +261,25 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::WValidator *createUpdatePeriodValidator() {
|
Wt::WValidator *createUpdatePeriodValidator()
|
||||||
|
{
|
||||||
Wt::WValidator* v = new Wt::WValidator();
|
Wt::WValidator* v = new Wt::WValidator();
|
||||||
v->setMandatory(true);
|
v->setMandatory(true);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::WValidator *createStartTimeValidator() {
|
Wt::WValidator *createStartTimeValidator()
|
||||||
|
{
|
||||||
Wt::WValidator* v = new Wt::WValidator();
|
Wt::WValidator* v = new Wt::WValidator();
|
||||||
v->setMandatory(true);
|
v->setMandatory(true);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Wt::WValidator *createFileExtensionValidator()
|
||||||
|
{
|
||||||
|
Wt::WRegExpValidator *v = new Wt::WRegExpValidator("(?:\\.\\w+(?:\\s*))+");
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
Wt::WStringListModel* _updatePeriodModel;
|
Wt::WStringListModel* _updatePeriodModel;
|
||||||
Wt::WStringListModel* _updateStartTimeModel;
|
Wt::WStringListModel* _updateStartTimeModel;
|
||||||
@@ -236,6 +288,8 @@ class DatabaseFormModel : public Wt::WFormModel
|
|||||||
|
|
||||||
const Wt::WFormModel::Field DatabaseFormModel::UpdatePeriodField = "update-period";
|
const Wt::WFormModel::Field DatabaseFormModel::UpdatePeriodField = "update-period";
|
||||||
const Wt::WFormModel::Field DatabaseFormModel::UpdateStartTimeField = "update-start-time";
|
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";
|
||||||
|
|
||||||
|
|
||||||
DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent)
|
DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent)
|
||||||
@@ -264,8 +318,18 @@ DatabaseFormView::DatabaseFormView(Wt::WContainerWidget *parent)
|
|||||||
updateStartTimeCB->setModel(_model->updateStartTimeModel());
|
updateStartTimeCB->setModel(_model->updateStartTimeModel());
|
||||||
updateStartTimeCB->changed().connect(_applyInfo, &Wt::WWidget::hide);
|
updateStartTimeCB->changed().connect(_applyInfo, &Wt::WWidget::hide);
|
||||||
|
|
||||||
|
// Audio file extensions
|
||||||
|
Wt::WLineEdit *audioFileExtensionsEdit = new Wt::WLineEdit();
|
||||||
|
setFormWidget(DatabaseFormModel::AudioFileExtensionsField, audioFileExtensionsEdit);
|
||||||
|
audioFileExtensionsEdit->changed().connect(_applyInfo, &Wt::WWidget::hide);
|
||||||
|
|
||||||
|
// Video file extensions
|
||||||
|
Wt::WLineEdit *videoFileExtensionsEdit = new Wt::WLineEdit();
|
||||||
|
setFormWidget(DatabaseFormModel::VideoFileExtensionsField, videoFileExtensionsEdit);
|
||||||
|
videoFileExtensionsEdit->changed().connect(_applyInfo, &Wt::WWidget::hide);
|
||||||
|
|
||||||
// Title & Buttons
|
// Title & Buttons
|
||||||
bindString("title", "Database update settings");
|
bindString("title", "Database 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