diff --git a/conf/lms.conf.sample b/conf/lms.conf.sample deleted file mode 100644 index d2e3378b..00000000 --- a/conf/lms.conf.sample +++ /dev/null @@ -1,28 +0,0 @@ - -main = { - - logger = { - level = 7; # level common for all loggers - file = { - enable = true; - path = "/var/lms/lms.log"; # comment to disable file logging - } - console = { - enable = true; - } - } - - database = { - path = "/var/lms/lms.db"; - - audio_extensions = "mp3 ogg oga aac m4a flac wav wma aif aiff ape mpc shn"; - video_extensions = "flv avi mpg mpeg mp4 m4v mkv mov wmv ogv divx m2ts"; - } - - cover = { - file_extensions = "jpg jpeg"; - file_max_size = 5000000; - file_preferred_names = "cover front"; - } -} - diff --git a/configure.ac b/configure.ac index e7408b53..a670f809 100644 --- a/configure.ac +++ b/configure.ac @@ -43,11 +43,6 @@ AC_CHECK_HEADERS([Wt/WApplication jpeglib.h], [], [AC_MSG_ERROR([Header not found or unusable !])]) -AC_CHECK_LIB([config++], - [main], - , - [AC_MSG_ERROR([config++ not found!])]) - AC_CHECK_LIB([jpeg], [jpeg_destroy], , @@ -118,16 +113,6 @@ AC_CHECK_LIB( [boost_iostreams], , [AC_MSG_ERROR([libboost_iostreams not found!])]) -AC_CHECK_LIB( [boost_log], - [main], - , - [AC_MSG_ERROR([libboost_log not found!])]) - -AC_CHECK_LIB( [boost_log_setup], - [main], - , - [AC_MSG_ERROR([libboost_log_setup not found!])]) - # TODO -> PARAMETRIZE THIS AC_CHECK_LIB([wthttp], [main], diff --git a/src/Makefile.am b/src/Makefile.am index c8d3d1d0..7cf37c2d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,7 +8,6 @@ lms_SOURCES = \ $(srcdir)/av/FormatContext.cpp \ $(srcdir)/av/InputFormatContext.cpp \ $(srcdir)/av/Stream.cpp \ - $(srcdir)/config/ConfigReader.cpp \ $(srcdir)/cover/CoverArt.cpp \ $(srcdir)/cover/CoverArtGrabber.cpp \ $(srcdir)/database/Artist.cpp \ diff --git a/src/cover/CoverArtGrabber.cpp b/src/cover/CoverArtGrabber.cpp index 695ddc3e..2d5e81bc 100644 --- a/src/cover/CoverArtGrabber.cpp +++ b/src/cover/CoverArtGrabber.cpp @@ -26,18 +26,6 @@ namespace { -std::vector splitStrings(const std::string& source) -{ - std::vector res; - std::istringstream oss(source); - - std::string str; - while(oss >> str) - res.push_back(str); - - return res; -} - bool isFileSupported(const boost::filesystem::path& file, const std::vector extensions) { @@ -67,15 +55,6 @@ Grabber::instance() return instance; } -void -Grabber::init() -{ - for (const std::string& extension : splitStrings( ConfigReader::instance().getString("main.cover.file_extensions"))) - _fileExtensions.push_back("." + extension); - - _maxFileSize = ConfigReader::instance().getULong("main.cover.file_max_size"); -} - std::vector Grabber::getFromInputFormatContext(const Av::InputFormatContext& input, std::size_t nbMaxCovers) const { diff --git a/src/cover/CoverArtGrabber.hpp b/src/cover/CoverArtGrabber.hpp index f2dbb33e..85609f90 100644 --- a/src/cover/CoverArtGrabber.hpp +++ b/src/cover/CoverArtGrabber.hpp @@ -38,8 +38,6 @@ class Grabber static Grabber& instance(); - void init(); - std::vector getCoverPaths(const boost::filesystem::path& directoryPath, std::size_t nbMaxCovers = 1) const; std::vector getFromDirectory(const boost::filesystem::path& path, std::size_t nbMaxCovers = 1) const; std::vector getFromInputFormatContext(const Av::InputFormatContext& input, std::size_t nbMaxCovers = 1) const; @@ -50,9 +48,11 @@ class Grabber private: Grabber(); - std::vector _fileExtensions; - std::size_t _maxFileSize; - std::vector _preferredFileNames; + std::vector _fileExtensions + = {"jpg", "jpeg"}; + std::size_t _maxFileSize = 5000000; + std::vector _preferredFileNames + = {"cover", "front"}; }; diff --git a/src/database-updater/DatabaseUpdater.hpp b/src/database-updater/DatabaseUpdater.hpp index 03575b39..ee085bb1 100644 --- a/src/database-updater/DatabaseUpdater.hpp +++ b/src/database-updater/DatabaseUpdater.hpp @@ -96,8 +96,11 @@ class Updater Database::Handler _db; - std::vector _audioExtensions; - std::vector _videoExtensions; + std::vector _audioExtensions + = {"mp3", "ogg", "oga", "aac", "m4a", "flac", "wav", "wma", "aif", "aiff", "ape", "mpc", "shn"}; + + std::vector _videoExtensions + = {"flv", "avi", "mpg", "mpeg", "mp4", "m4v", "mkv", "mov", "wmv", "ogv", "divx", "m2ts"}; MetaData::Parser& _metadataParser; diff --git a/src/database/DatabaseHandler.cpp b/src/database/DatabaseHandler.cpp index e21bcf0f..3a15fffc 100644 --- a/src/database/DatabaseHandler.cpp +++ b/src/database/DatabaseHandler.cpp @@ -155,6 +155,8 @@ Handler::getUser(const Wt::Auth::User& authUser) Wt::Dbo::SqlConnectionPool* Handler::createConnectionPool(boost::filesystem::path p) { + LMS_LOG(MOD_DB, SEV_INFO) << "Creating connection pool on file " << p; + Wt::Dbo::backend::Sqlite3 *connection = new Wt::Dbo::backend::Sqlite3(p.string()); connection->executeSql("pragma journal_mode=WAL"); diff --git a/src/logger/Logger.cpp b/src/logger/Logger.cpp index fa9a71ad..99b14075 100644 --- a/src/logger/Logger.cpp +++ b/src/logger/Logger.cpp @@ -17,105 +17,37 @@ * along with LMS. If not, see . */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "config/ConfigReader.hpp" - - #include "Logger.hpp" -Logger& -Logger::instance() +std::string getModuleName(Module mod) { - static Logger instance; - return instance; -} - -Logger::Logger() -{ - // Initialiaz loggers - static const std::vector modules = + switch (mod) { - MOD_AV, - MOD_COVER, - MOD_DB, - MOD_DBUPDATER, - MOD_MAIN, - MOD_METADATA, - MOD_REMOTE, - MOD_SERVICE, - MOD_TRANSCODE, - MOD_UI, - }; - - for(Module module : modules) - _loggers[module].add_attribute("Module", boost::log::attributes::constant< Module >(module)); -} - -boost::log::sources::severity_logger< Severity >& -Logger::get(Module module) -{ - return _loggers[module]; -} - -void -Logger::init() -{ - boost::log::add_common_attributes(); - - boost::log::register_simple_formatter_factory< Severity, char >("Severity"); - - if (ConfigReader::instance().getBool("main.logger.console.enable", false)) - { - boost::log::add_console_log(std::cout, - boost::log::keywords::format = ( - boost::log::expressions::stream - << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "[%Y-%m-%d %H:%M:%S]") - << " [" << boost::log::expressions::attr< Module >("Module") << "]" - << " [" << boost::log::expressions::attr< Severity >("Severity") << "]" - << " " << boost::log::expressions::smessage - ) - ); + case MOD_AV: return "AV"; + case MOD_COVER: return "COVER"; + case MOD_DB: return "DB"; + case MOD_DBUPDATER: return "DB UPDATER"; + case MOD_MAIN: return "MAIN"; + case MOD_METADATA: return "METADATA"; + case MOD_REMOTE: return "REMOTE"; + case MOD_SERVICE: return "SERVICE"; + case MOD_TRANSCODE: return "TRANSCODE"; + case MOD_UI: return "UI"; } - - if (ConfigReader::instance().getBool("main.logger.file.enable", false)) - { - boost::log::add_file_log - ( - boost::log::keywords::file_name = ConfigReader::instance().getString("main.logger.file.path") + std::string(".%N"), - boost::log::keywords::rotation_size = 10 * 1024 * 1024, - boost::log::keywords::open_mode = std::ios_base::app, - boost::log::keywords::auto_flush = true, - boost::log::keywords::format = ( - boost::log::expressions::stream - << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "[%Y-%m-%d %H:%M:%S]") - << " [" << boost::log::expressions::attr< Module >("Module") << "]" - << " [" << boost::log::expressions::attr< Severity >("Severity") << "]" - << " " << boost::log::expressions::smessage - ) - ); - } - - boost::log::core::get()->set_filter - ( - boost::log::expressions::attr("Severity") <= ConfigReader::instance().getULong("main.logger.level", SEV_DEBUG) - ); - + return ""; +} + +std::string getSeverityName(Severity sev) +{ + switch (sev) + { + case SEV_CRIT: return "fatal"; + case SEV_ERROR: return "error"; + case SEV_WARNING: return "warning"; + case SEV_NOTICE: + case SEV_INFO: return "info"; + case SEV_DEBUG: return "debug"; + } + return ""; } diff --git a/src/logger/Logger.hpp b/src/logger/Logger.hpp index 1949b512..e5234192 100644 --- a/src/logger/Logger.hpp +++ b/src/logger/Logger.hpp @@ -20,15 +20,11 @@ #ifndef LOGGER_HPP__ #define LOGGER_HPP__ -#include +#include +#include -#include -#include +#include -#include -#include - -#define LMS_LOG(module, level) BOOST_LOG_SEV(Logger::instance().get(module), level) enum Severity { @@ -42,7 +38,7 @@ enum Severity enum Module { - MOD_AV = 0, + MOD_AV, MOD_COVER, MOD_DB, MOD_DBUPDATER, @@ -54,78 +50,9 @@ enum Module MOD_UI, }; -BOOST_LOG_ATTRIBUTE_KEYWORD(module, "Module", Module) +std::string getModuleName(Module mod); +std::string getSeverityName(Severity sev); -class Logger -{ - public: - - Logger(const Logger&) = delete; - Logger& operator=(const Logger&) = delete; - - static Logger& instance(); - - void init(); - - boost::log::sources::severity_logger< Severity >& - get(Module module); - - private: - Logger(); - - std::map > _loggers; -}; - -// The formatting logic for the severity level -template< typename CharT, typename TraitsT > -inline std::basic_ostream< CharT, TraitsT >& operator<< ( - std::basic_ostream< CharT, TraitsT >& strm, Severity lvl) -{ - static const char* const str[] = - { - "", - "", - "CRIT", - "ERROR", - "WARNING", - "NOTICE", - "INFO", - "DEBUG" - }; - if (static_cast< std::size_t >(lvl) < (sizeof(str) / sizeof(*str))) - strm << str[lvl]; - else - strm << static_cast< int >(lvl); - return strm; -} - -template< typename CharT, typename TraitsT > -inline std::basic_ostream< CharT, TraitsT >& operator<< ( - std::basic_ostream< CharT, TraitsT >& strm, Module val) -{ - const char* res = NULL; - - switch(val) - { - case MOD_AV: res = "AV"; break; - case MOD_COVER: res = "COVER"; break; - case MOD_DB: res = "DB"; break; - case MOD_DBUPDATER: res = "DBUPDATER"; break; - case MOD_MAIN: res = "MAIN"; break; - case MOD_METADATA: res = "METADATA"; break; - case MOD_REMOTE: res = "REMOTE"; break; - case MOD_SERVICE: res = "SERVICE"; break; - case MOD_TRANSCODE: res = "TRANSCODE"; break; - case MOD_UI: res = "UI"; break; - } - - if (res) - strm << res; - else - strm << static_cast< int >(val); - return strm; -} - - -#endif // LOGGER_HPP__ +#define LMS_LOG(module, level) Wt::WServer::instance()->log(getSeverityName(level)) << Wt::WLogger::sep << "[" << getModuleName(module) << "]" << Wt::WLogger::sep +#endif diff --git a/src/main/main.cpp b/src/main/main.cpp index 8e41efd1..3bad3ca5 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -20,7 +20,6 @@ #include #include "config/config.h" -#include "config/ConfigReader.hpp" #include "transcode/AvConvTranscoder.hpp" #include "av/Common.hpp" #include "logger/Logger.hpp" @@ -45,13 +44,8 @@ int main(int argc, char* argv[]) try { - // Open configuration file - boost::filesystem::path configFilePath("/etc/lms.conf"); // TODO use $confdir from autotools - - ConfigReader::instance().setFile(configFilePath); - - Logger::instance().init(); - CoverArt::Grabber::instance().init(); + Wt::WServer server(argv[0]); + server.setServerConfiguration (argc, argv); Service::ServiceManager& serviceManager = Service::ServiceManager::instance(); @@ -61,8 +55,7 @@ int main(int argc, char* argv[]) Database::Handler::configureAuth(); // Initializing a connection pool to the database that will be shared along services - std::unique_ptr connectionPool( Database::Handler::createConnectionPool( ConfigReader::instance().getString("main.database.path") )); - + std::unique_ptr connectionPool( Database::Handler::createConnectionPool("/var/lms/lms.db")); // TODO use $datadir from autotools serviceManager.add( std::make_shared(*connectionPool)); @@ -70,37 +63,31 @@ int main(int argc, char* argv[]) serviceManager.add( std::make_shared(*connectionPool)); #endif - Wt::WServer server(argv[0]); - server.setServerConfiguration (argc, argv); // bind entry point server.addEntryPoint(Wt::Application, boost::bind(UserInterface::LmsApplication::create, _1, boost::ref(*connectionPool))); LMS_LOG(MOD_MAIN, SEV_NOTICE) << "Now running..."; - // Start underlying services - LMS_LOG(MOD_MAIN, SEV_INFO) << "Starting services..."; - serviceManager.start(); - // Starting the main server LMS_LOG(MOD_MAIN, SEV_INFO) << "Starting server..."; server.start(); + // Start underlying services + LMS_LOG(MOD_MAIN, SEV_INFO) << "Starting services..."; + serviceManager.start(); + // Waiting for shutdown command Wt::WServer::waitForShutdown(argv[0]); + LMS_LOG(MOD_MAIN, SEV_INFO) << "Stopping services..."; + serviceManager.stop(); + serviceManager.clear(); + LMS_LOG(MOD_MAIN, SEV_INFO) << "Stopping server..."; server.stop(); - LMS_LOG(MOD_MAIN, SEV_INFO) << "Stopping services..."; - serviceManager.stop(); - res = EXIT_SUCCESS; } - // TODO catch setting not found exception - catch( libconfig::ParseException& e) - { - std::cerr << "Caught libconfig::ParseException! error='" << e.getError() << "', file = '" << e.getFile() << "', line = " << e.getLine() << std::endl; - } catch( Wt::WServer::Exception& e) { LMS_LOG(MOD_MAIN, SEV_CRIT) << "Caught a WServer::Exception: " << e.what(); diff --git a/src/service/DatabaseUpdateService.cpp b/src/service/DatabaseUpdateService.cpp index 09482f78..df201019 100644 --- a/src/service/DatabaseUpdateService.cpp +++ b/src/service/DatabaseUpdateService.cpp @@ -20,51 +20,32 @@ #include #include "config/ConfigReader.hpp" -#include "logger/Logger.hpp" #include "DatabaseUpdateService.hpp" -static std::vector splitStrings(const std::string& source) -{ - std::vector res; - std::istringstream oss(source); - - std::string str; - while(oss >> str) - res.push_back(str); - - return res; -} - namespace Service { DatabaseUpdateService::DatabaseUpdateService(Wt::Dbo::SqlConnectionPool &connectionPool) : _metadataParser(), _databaseUpdater( connectionPool, _metadataParser) { - _databaseUpdater.setAudioExtensions(splitStrings(ConfigReader::instance().getString("main.database.audio_extensions"))); - _databaseUpdater.setVideoExtensions(splitStrings(ConfigReader::instance().getString("main.database.video_extensions"))); } void DatabaseUpdateService::start(void) { - LMS_LOG(MOD_SERVICE, SEV_DEBUG) << "DatabaseUpdateService, starting..."; _databaseUpdater.start(); } void DatabaseUpdateService::stop(void) { - LMS_LOG(MOD_SERVICE, SEV_DEBUG) << "DatabaseUpdateService, stopping..."; _databaseUpdater.stop(); - LMS_LOG(MOD_SERVICE, SEV_DEBUG) << "DatabaseUpdateService, stopped"; } void DatabaseUpdateService::restart(void) { - LMS_LOG(MOD_SERVICE, SEV_DEBUG) << "DatabaseUpdateService, restart"; stop(); start(); } diff --git a/src/service/ServiceManager.cpp b/src/service/ServiceManager.cpp index 59469857..b5dd2d7c 100644 --- a/src/service/ServiceManager.cpp +++ b/src/service/ServiceManager.cpp @@ -17,8 +17,6 @@ * along with LMS. If not, see . */ -#include "logger/Logger.hpp" - #include "ServiceManager.hpp" namespace Service { @@ -36,7 +34,6 @@ ServiceManager::ServiceManager() ServiceManager::~ServiceManager() { - LMS_LOG(MOD_SERVICE, SEV_NOTICE) << "Stopping services..."; stop(); } @@ -54,6 +51,13 @@ ServiceManager::del(Service::pointer service) _services.erase(service); } +void +ServiceManager::clear(void) +{ + stop(); + _services.clear(); +} + void ServiceManager::start(void) { @@ -72,7 +76,6 @@ ServiceManager::stop(void) void ServiceManager::restart(void) { - LMS_LOG(MOD_SERVICE, SEV_NOTICE) << "Restarting services..."; for (Service::pointer service : _services) service->restart(); } diff --git a/src/service/ServiceManager.hpp b/src/service/ServiceManager.hpp index 266c850b..84fcafab 100644 --- a/src/service/ServiceManager.hpp +++ b/src/service/ServiceManager.hpp @@ -36,6 +36,7 @@ class ServiceManager void add(Service::pointer service); void del(Service::pointer service); + void clear(); void start(); void stop(); diff --git a/src/ui/video/VideoWidget.cpp b/src/ui/video/VideoWidget.cpp index 31ebeebc..57dc1a85 100644 --- a/src/ui/video/VideoWidget.cpp +++ b/src/ui/video/VideoWidget.cpp @@ -49,7 +49,7 @@ VideoWidget::search(const std::string& searchText) void VideoWidget::playVideo(boost::filesystem::path p) { - LMS_LOG(MOD_UI, SEV_DEBUG) << "Want to play video " << p << "'" << std::endl; + LMS_LOG(MOD_UI, SEV_DEBUG) << "Want to play video " << p << "'"; try { std::size_t audioBitrate = 0; @@ -82,7 +82,8 @@ VideoWidget::playVideo(boost::filesystem::path p) parameters.setBitrate(Transcode::Stream::Video, 0/*videoBitrate*/); VideoMediaPlayerWidget *mediaPlayer = new VideoMediaPlayerWidget(parameters, this); - mediaPlayer->close().connect(std::bind([=] () { + mediaPlayer->close().connect(std::bind([=] () + { _videoDbWidget->setHidden(false); delete mediaPlayer; })); @@ -90,7 +91,7 @@ VideoWidget::playVideo(boost::filesystem::path p) _videoDbWidget->setHidden(true); } catch( std::exception& e) { - LMS_LOG(MOD_UI, SEV_ERROR) << "Caught exception while loading '" << p << "': " << e.what() << std::endl; + LMS_LOG(MOD_UI, SEV_ERROR) << "Caught exception while loading '" << p << "': " << e.what(); } }