From ae8310b837ed0b3796b6cd9d3e14b90770052a12 Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 26 Jan 2016 21:01:00 +0100 Subject: [PATCH 01/19] [DB] Added MBID for tracks --- src/database-updater/DatabaseUpdater.cpp | 5 +++++ src/metadata/AvFormat.cpp | 6 ++++++ src/metadata/MetaData.hpp | 1 + 3 files changed, 12 insertions(+) diff --git a/src/database-updater/DatabaseUpdater.cpp b/src/database-updater/DatabaseUpdater.cpp index 33afd506..ca0caf8f 100644 --- a/src/database-updater/DatabaseUpdater.cpp +++ b/src/database-updater/DatabaseUpdater.cpp @@ -547,6 +547,11 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) track.modify()->setDate( boost::any_cast(items[MetaData::Type::OriginalDate]) ); } + if (items.find(MetaData::Type::MusicBrainzTrackID) != items.end()) + { + track.modify()->setMBID( boost::any_cast(items[MetaData::Type::MusicBrainzTrackID]) ); + } + if (items.find(MetaData::Type::HasCover) != items.end()) { bool hasCover = boost::any_cast(items[MetaData::Type::HasCover]); diff --git a/src/metadata/AvFormat.cpp b/src/metadata/AvFormat.cpp index 07778457..8ff7148f 100644 --- a/src/metadata/AvFormat.cpp +++ b/src/metadata/AvFormat.cpp @@ -185,6 +185,12 @@ AvFormat::parse(const boost::filesystem::path& p, Items& items) { items.insert( std::make_pair(MetaData::Type::MusicBrainzAlbumID, stringTrim( stringToUTF8(it->second)) )); } + else if (boost::iequals(it->first, "MusicBrainz Release Track Id") + || boost::iequals(it->first, "MUSICBRAINZ_RELEASETRACKID") + || boost::iequals(it->first, "MUSICBRAINZ_TRACKID")) + { + items.insert( std::make_pair(MetaData::Type::MusicBrainzTrackID, stringTrim( stringToUTF8(it->second)) )); + } } return true; diff --git a/src/metadata/MetaData.hpp b/src/metadata/MetaData.hpp index fdb65d04..9a1728fe 100644 --- a/src/metadata/MetaData.hpp +++ b/src/metadata/MetaData.hpp @@ -47,6 +47,7 @@ namespace MetaData SubtitleStreams, // vector MusicBrainzArtistID, // string MusicBrainzAlbumID, // string + MusicBrainzTrackID, // string }; // Used by Streams From e5d12c7aeafb38ec2c23f198364855423a470f35 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 1 Feb 2016 12:57:43 +0100 Subject: [PATCH 02/19] [DB] Corrected total duration calculation in the stats of the track view --- src/database/Track.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/Track.cpp b/src/database/Track.cpp index 75b226ba..8ca5f038 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -128,7 +128,7 @@ Track::getStats(Wt::Dbo::Session& session, SearchFilter filter) { SqlQuery sqlQuery = generatePartialQuery(filter); - Wt::Dbo::Query query = session.query( "SELECT COUNT(DISTINCT t.id), SUM(t.duration) FROM track t INNER JOIN artist a ON t.artist_id = a.id INNER JOIN genre g ON g.id = t_g.genre_id INNER JOIN track_genre t_g ON t_g.track_id = t.id INNER JOIN release r ON r.id = t.release_id " + sqlQuery.where().get()); + Wt::Dbo::Query query = session.query( "SELECT COUNT(\"id\"), SUM(\"dur\") FROM (SELECT t.id as \"id\", t.duration as \"dur\" FROM track t INNER JOIN artist a ON t.artist_id = a.id INNER JOIN genre g ON g.id = t_g.genre_id INNER JOIN track_genre t_g ON t_g.track_id = t.id INNER JOIN release r ON r.id = t.release_id " + sqlQuery.where().get() + " GROUP BY t.id)"); for (const std::string& bindArg : sqlQuery.where().getBindArgs()) query.bind(bindArg); From 4de5b64b6a5338d7d827c11f47fc4cc3acb7b6d1 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 1 Feb 2016 13:09:47 +0100 Subject: [PATCH 03/19] [DB] Added '\' as a multi genre separator --- src/metadata/AvFormat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metadata/AvFormat.cpp b/src/metadata/AvFormat.cpp index 8ff7148f..51679271 100644 --- a/src/metadata/AvFormat.cpp +++ b/src/metadata/AvFormat.cpp @@ -171,7 +171,7 @@ AvFormat::parse(const boost::filesystem::path& p, Items& items) { // TODO use splitStrings std::list genres; - if (readList(it->second, ";,", genres)) + if (readList(it->second, ";,\\", genres)) items.insert( std::make_pair(MetaData::Type::Genres, genres)); } From 9118b6d970ab98262033dbc6830bf26b3298cf1a Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 1 Feb 2016 13:10:14 +0100 Subject: [PATCH 04/19] [DOC] updated README --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ff89fca0..9602a973 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,11 @@ LMS is a self-hosted media streaming software, released under the GPLv3 license. It allows you to access your music and your videos using an https web interface. ## Features - - Winamp-like interface, suited for large databases + - Winamp-like interface, suited for large media collections - Audio/Video transcode for maximum interoperability and low bandwith requirements - User management + - Multi genre + - MusicBrainzID support Please note LMS is still under development and will gain more features in the future. @@ -42,13 +44,15 @@ $ make install This command requires root privileges ## Running - +Here is a command line example to run on port 5081: ```sh $ /usr/bin/lms --docroot='/usr/share/lms/docroot/;/resources,/css,/images' --approot=/usr/share/lms/approot --http-address 0.0.0.0 --http-port 5081 ``` It is highly recommended to run LMS as a non root user. The exectuable needs write accesses to the /var/lms/ directory. +To connect to LMS, just open your favorite browser and go to http://localhost:5081 + ## Mobile Add the following code in your wt_config.xml file: @@ -69,12 +73,14 @@ Generate a self signed certificate: ```sh $ openssl req -x509 -out cert.pem -keyout privkey.pem -newkey rsa:4096 ``` -Run: +Run (on port 5081): ```sh $ /usr/bin/lms --docroot='/usr/share/lms/docroot/;/resources,/css,/images' --approot=/usr/share/lms/approot --https-address 0.0.0.0 --https-port 5081 --ssl-certificate cert.pem --ssl-private-key privkey.pem --ssl-tmp-dh dh2048.pem ``` Depending on your SSL parameters, you may be asked for the PEM passphrase to unlock the private key. +To connect to LMS, just open your favorite browser and go to https://localhost:5081 + ## Credits - Wt (http://www.webtoolkit.eu/) From e912b1bad7d734ed28f58bf7dde0c4c5fa69a19b Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 1 Feb 2016 13:59:26 +0100 Subject: [PATCH 05/19] Removed unnecessary file --- src/ui/video/tags | 171 ---------------------------------------------- 1 file changed, 171 deletions(-) delete mode 100644 src/ui/video/tags diff --git a/src/ui/video/tags b/src/ui/video/tags deleted file mode 100644 index 5f317564..00000000 --- a/src/ui/video/tags +++ /dev/null @@ -1,171 +0,0 @@ -!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ -!_TAG_FILE_SORTED 2 /0=unsorted, 1=sorted, 2=foldcase/ -!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ -!_TAG_PROGRAM_NAME Exuberant Ctags // -!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ -!_TAG_PROGRAM_VERSION 5.9~svn20110310 // -addDirectory /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::addDirectory(const std::string& name, boost::filesystem::path path, size_t depth)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -addDirectory /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void addDirectory(const std::string& name, boost::filesystem::path path, size_t depth);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -addHeader /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::addHeader(void)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -addHeader /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void addHeader(void);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -addStreams /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::addStreams(Wt::WStringListModel* model, const std::vector& streams)$/;" f language:C++ class:UserInterface::VideoParametersDialog -addStreams /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void addStreams(Wt::WStringListModel* model, const std::vector& streams);$/;" p language:C++ class:UserInterface::VideoParametersDialog -addVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::addVideo(const std::string& name, const boost::posix_time::time_duration& duration, const boost::filesystem::path& path)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -addVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void addVideo(const std::string& name, const boost::posix_time::time_duration& duration, const boost::filesystem::path& path);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -apply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ Wt::Signal& apply() { return _apply; }$/;" f language:C++ class:UserInterface::VideoParametersDialog -AvEncoding_to_WtEncoding /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^AvEncoding_to_WtEncoding(Av::Encoding encoding)$/;" f language:C++ namespace:UserInterface -backToList /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ void backToList(void);$/;" p language:C++ class:UserInterface::VideoWidget -close /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::Signal& close() { return _close; };$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -createStreamWidgets /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::createStreamWidgets(const Wt::WString& labelString, Av::Stream::Type type, Wt::WTable* layout)$/;" f language:C++ class:UserInterface::VideoParametersDialog -createStreamWidgets /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void createStreamWidgets(const Wt::WString& label, Av::Stream::Type type, Wt::WTable* layout);$/;" p language:C++ class:UserInterface::VideoParametersDialog -handleApply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::handleApply()$/;" f language:C++ class:UserInterface::VideoParametersDialog -handleApply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void handleApply(void);$/;" p language:C++ class:UserInterface::VideoParametersDialog -handleClose /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleClose(void)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -handleClose /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleClose(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -handleFullscreen /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleFullscreen(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -handleParametersDone /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleParametersDone(Wt::WDialog::DialogCode code)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -handleParametersDone /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleParametersDone(Wt::WDialog::DialogCode);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -handleParametersEdit /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleParametersEdit(void)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -handleParametersEdit /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleParametersEdit(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -handlePlayOffset /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handlePlayOffset(int offsetSecs)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -handlePlayOffset /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handlePlayOffset(int offsetSecs);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -handleSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleSliderMoved(int value)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -handleSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleSliderMoved(int value);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -handleTimeUpdated /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleTimeUpdated(void)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -handleTimeUpdated /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleTimeUpdated(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -handleVolumeSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleVolumeSliderMoved(int value)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -handleVolumeSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleVolumeSliderMoved(int value);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -load /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::load(const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -load /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void load(const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -load /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::load(const Av::MediaFile& mediaFile, Av::TranscodeParameters currentParameters)$/;" f language:C++ class:UserInterface::VideoParametersDialog -load /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void load(const Av::MediaFile& mediaFile, Av::TranscodeParameters currentParameters);$/;" p language:C++ class:UserInterface::VideoParametersDialog -playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ Wt::Signal< boost::filesystem::path >& playVideo() { return _playVideo; }$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.cpp /^VideoWidget::playVideo(boost::filesystem::path p)$/;" f language:C++ class:UserInterface::VideoWidget -playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ void playVideo(boost::filesystem::path p);$/;" p language:C++ class:UserInterface::VideoWidget -save /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::save(Av::TranscodeParameters& parameters)$/;" f language:C++ class:UserInterface::VideoParametersDialog -save /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void save(Av::TranscodeParameters& parameters);$/;" p language:C++ class:UserInterface::VideoParametersDialog -search /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.cpp /^VideoWidget::search(const std::string& searchText)$/;" f language:C++ class:UserInterface::VideoWidget -search /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ void search(const std::string& searchText);$/;" p language:C++ class:UserInterface::VideoWidget -selectStream /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::selectStream(const Wt::WStringListModel* model, int streamId, Wt::WComboBox* combo)$/;" f language:C++ class:UserInterface::VideoParametersDialog -selectStream /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void selectStream(const Wt::WStringListModel* model, int streamId, Wt::WComboBox* combo);$/;" p language:C++ class:UserInterface::VideoParametersDialog -streamTypes /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^static const std::list streamTypes = {Av::Stream::Type::Video, Av::Stream::Type::Audio, Av::Stream::Type::Subtitle};$/;" m language:C++ namespace:UserInterface file: -updateView /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::updateView(boost::filesystem::path directory, size_t depth)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -updateView /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void updateView(boost::filesystem::path directory, size_t depth);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^namespace UserInterface {$/;" n language:C++ file: -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^namespace UserInterface {$/;" n language:C++ -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^namespace UserInterface {$/;" n language:C++ file: -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^namespace UserInterface {$/;" n language:C++ -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^namespace UserInterface {$/;" n language:C++ file: -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^namespace UserInterface {$/;" n language:C++ -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.cpp /^namespace UserInterface {$/;" n language:C++ file: -UserInterface /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^namespace UserInterface {$/;" n language:C++ -UserInterface::AvEncoding_to_WtEncoding /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^AvEncoding_to_WtEncoding(Av::Encoding encoding)$/;" f language:C++ namespace:UserInterface -UserInterface::streamTypes /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^static const std::list streamTypes = {Av::Stream::Type::Video, Av::Stream::Type::Audio, Av::Stream::Type::Subtitle};$/;" m language:C++ namespace:UserInterface file: -UserInterface::VideoDatabaseWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^class VideoDatabaseWidget : public Wt::WContainerWidget$/;" c language:C++ namespace:UserInterface -UserInterface::VideoDatabaseWidget::addDirectory /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::addDirectory(const std::string& name, boost::filesystem::path path, size_t depth)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::addDirectory /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void addDirectory(const std::string& name, boost::filesystem::path path, size_t depth);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::addHeader /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::addHeader(void)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::addHeader /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void addHeader(void);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::addVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::addVideo(const std::string& name, const boost::posix_time::time_duration& duration, const boost::filesystem::path& path)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::addVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void addVideo(const std::string& name, const boost::posix_time::time_duration& duration, const boost::filesystem::path& path);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ Wt::Signal< boost::filesystem::path >& playVideo() { return _playVideo; }$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::updateView /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::updateView(boost::filesystem::path directory, size_t depth)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::updateView /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ void updateView(boost::filesystem::path directory, size_t depth);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::VideoDatabaseWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::VideoDatabaseWidget(Wt::WContainerWidget *parent)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::VideoDatabaseWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ VideoDatabaseWidget(Wt::WContainerWidget *parent = 0);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::_playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ Wt::Signal< boost::filesystem::path > _playVideo;$/;" m language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoDatabaseWidget::_table /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ Wt::WTable* _table;$/;" m language:C++ class:UserInterface::VideoDatabaseWidget -UserInterface::VideoMediaPlayerWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^class VideoMediaPlayerWidget : public Wt::WContainerWidget$/;" c language:C++ namespace:UserInterface -UserInterface::VideoMediaPlayerWidget::close /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::Signal& close() { return _close; };$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleClose /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleClose(void)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleClose /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleClose(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleFullscreen /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleFullscreen(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleParametersDone /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleParametersDone(Wt::WDialog::DialogCode code)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleParametersDone /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleParametersDone(Wt::WDialog::DialogCode);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleParametersEdit /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleParametersEdit(void)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleParametersEdit /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleParametersEdit(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handlePlayOffset /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handlePlayOffset(int offsetSecs)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handlePlayOffset /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handlePlayOffset(int offsetSecs);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleSliderMoved(int value)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleSliderMoved(int value);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleTimeUpdated /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleTimeUpdated(void)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleTimeUpdated /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleTimeUpdated(void);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleVolumeSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::handleVolumeSliderMoved(int value)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::handleVolumeSliderMoved /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void handleVolumeSliderMoved(int value);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::load /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::load(const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::load /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ void load(const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::VideoMediaPlayerWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::VideoMediaPlayerWidget( const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters, Wt::WContainerWidget *parent)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::VideoMediaPlayerWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ VideoMediaPlayerWidget( const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters, Wt::WContainerWidget *parent = 0);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_close /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::Signal _close;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_currentParameters /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Av::TranscodeParameters _currentParameters;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_curTime /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WText* _curTime;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_dialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ VideoParametersDialog* _dialog;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_duration /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WText* _duration;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_mediaInternalLink /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WLink _mediaInternalLink;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_mediaPlayer /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WMediaPlayer* _mediaPlayer;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_mediaResource /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ AvConvTranscodeStreamResource* _mediaResource;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_pauseBtn /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WPushButton* _pauseBtn;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_playBtn /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WPushButton* _playBtn;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_timeSlider /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WSlider* _timeSlider;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoMediaPlayerWidget::_volumeSlider /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WSlider* _volumeSlider;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -UserInterface::VideoParametersDialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^class VideoParametersDialog : public Wt::WDialog$/;" c language:C++ namespace:UserInterface -UserInterface::VideoParametersDialog::addStreams /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::addStreams(Wt::WStringListModel* model, const std::vector& streams)$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::addStreams /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void addStreams(Wt::WStringListModel* model, const std::vector& streams);$/;" p language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::apply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ Wt::Signal& apply() { return _apply; }$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::createStreamWidgets /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::createStreamWidgets(const Wt::WString& labelString, Av::Stream::Type type, Wt::WTable* layout)$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::createStreamWidgets /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void createStreamWidgets(const Wt::WString& label, Av::Stream::Type type, Wt::WTable* layout);$/;" p language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::handleApply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::handleApply()$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::handleApply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void handleApply(void);$/;" p language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::load /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::load(const Av::MediaFile& mediaFile, Av::TranscodeParameters currentParameters)$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::load /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void load(const Av::MediaFile& mediaFile, Av::TranscodeParameters currentParameters);$/;" p language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::save /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::save(Av::TranscodeParameters& parameters)$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::save /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void save(Av::TranscodeParameters& parameters);$/;" p language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::selectStream /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::selectStream(const Wt::WStringListModel* model, int streamId, Wt::WComboBox* combo)$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::selectStream /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ void selectStream(const Wt::WStringListModel* model, int streamId, Wt::WComboBox* combo);$/;" p language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::VideoParametersDialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::VideoParametersDialog(Wt::WString windowTitle, Wt::WDialog* parent)$/;" f language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::VideoParametersDialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ VideoParametersDialog(Wt::WString windowTitle, Wt::WDialog* parent = 0);$/;" p language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::_apply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ Wt::Signal _apply;$/;" m language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoParametersDialog::_streamSelection /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ std::map > _streamSelection;$/;" m language:C++ class:UserInterface::VideoParametersDialog -UserInterface::VideoWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^class VideoWidget : public Wt::WContainerWidget$/;" c language:C++ namespace:UserInterface -UserInterface::VideoWidget::backToList /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ void backToList(void);$/;" p language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.cpp /^VideoWidget::playVideo(boost::filesystem::path p)$/;" f language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ void playVideo(boost::filesystem::path p);$/;" p language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::search /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.cpp /^VideoWidget::search(const std::string& searchText)$/;" f language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::search /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ void search(const std::string& searchText);$/;" p language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::VideoWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.cpp /^VideoWidget::VideoWidget(Wt::WContainerWidget* parent )$/;" f language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::VideoWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ VideoWidget(Wt::WContainerWidget* parent = 0);$/;" p language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::_mediaPlayer /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ VideoMediaPlayerWidget* _mediaPlayer;$/;" m language:C++ class:UserInterface::VideoWidget -UserInterface::VideoWidget::_videoDbWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ VideoDatabaseWidget* _videoDbWidget;$/;" m language:C++ class:UserInterface::VideoWidget -VideoDatabaseWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.cpp /^VideoDatabaseWidget::VideoDatabaseWidget(Wt::WContainerWidget *parent)$/;" f language:C++ class:UserInterface::VideoDatabaseWidget -VideoDatabaseWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ VideoDatabaseWidget(Wt::WContainerWidget *parent = 0);$/;" p language:C++ class:UserInterface::VideoDatabaseWidget -VideoDatabaseWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^class VideoDatabaseWidget : public Wt::WContainerWidget$/;" c language:C++ namespace:UserInterface -VideoMediaPlayerWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.cpp /^VideoMediaPlayerWidget::VideoMediaPlayerWidget( const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters, Wt::WContainerWidget *parent)$/;" f language:C++ class:UserInterface::VideoMediaPlayerWidget -VideoMediaPlayerWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ VideoMediaPlayerWidget( const Av::MediaFile& mediaFile, Av::TranscodeParameters parameters, Wt::WContainerWidget *parent = 0);$/;" p language:C++ class:UserInterface::VideoMediaPlayerWidget -VideoMediaPlayerWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^class VideoMediaPlayerWidget : public Wt::WContainerWidget$/;" c language:C++ namespace:UserInterface -VideoParametersDialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.cpp /^VideoParametersDialog::VideoParametersDialog(Wt::WString windowTitle, Wt::WDialog* parent)$/;" f language:C++ class:UserInterface::VideoParametersDialog -VideoParametersDialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ VideoParametersDialog(Wt::WString windowTitle, Wt::WDialog* parent = 0);$/;" p language:C++ class:UserInterface::VideoParametersDialog -VideoParametersDialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^class VideoParametersDialog : public Wt::WDialog$/;" c language:C++ namespace:UserInterface -VideoWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.cpp /^VideoWidget::VideoWidget(Wt::WContainerWidget* parent )$/;" f language:C++ class:UserInterface::VideoWidget -VideoWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ VideoWidget(Wt::WContainerWidget* parent = 0);$/;" p language:C++ class:UserInterface::VideoWidget -VideoWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^class VideoWidget : public Wt::WContainerWidget$/;" c language:C++ namespace:UserInterface -VIDEO_DB_WIDGET_HPP /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp 21;" d language:C++ -VIDEO_WIDGET_HPP /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp 21;" d language:C++ -_apply /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ Wt::Signal _apply;$/;" m language:C++ class:UserInterface::VideoParametersDialog -_close /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::Signal _close;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_currentParameters /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Av::TranscodeParameters _currentParameters;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_curTime /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WText* _curTime;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_dialog /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ VideoParametersDialog* _dialog;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_duration /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WText* _duration;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_mediaInternalLink /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WLink _mediaInternalLink;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_mediaPlayer /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WMediaPlayer* _mediaPlayer;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_mediaPlayer /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ VideoMediaPlayerWidget* _mediaPlayer;$/;" m language:C++ class:UserInterface::VideoWidget -_mediaResource /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ AvConvTranscodeStreamResource* _mediaResource;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_pauseBtn /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WPushButton* _pauseBtn;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_playBtn /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WPushButton* _playBtn;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_playVideo /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ Wt::Signal< boost::filesystem::path > _playVideo;$/;" m language:C++ class:UserInterface::VideoDatabaseWidget -_streamSelection /home/emericp/Documents/Progs/lms/src/ui/video/VideoParametersDialog.hpp /^ std::map > _streamSelection;$/;" m language:C++ class:UserInterface::VideoParametersDialog -_table /home/emericp/Documents/Progs/lms/src/ui/video/VideoDatabaseWidget.hpp /^ Wt::WTable* _table;$/;" m language:C++ class:UserInterface::VideoDatabaseWidget -_timeSlider /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WSlider* _timeSlider;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -_videoDbWidget /home/emericp/Documents/Progs/lms/src/ui/video/VideoWidget.hpp /^ VideoDatabaseWidget* _videoDbWidget;$/;" m language:C++ class:UserInterface::VideoWidget -_volumeSlider /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp /^ Wt::WSlider* _volumeSlider;$/;" m language:C++ class:UserInterface::VideoMediaPlayerWidget -__VIDEO_MEDIA_PLAYER_WIDGET_HPP /home/emericp/Documents/Progs/lms/src/ui/video/VideoMediaPlayerWidget.hpp 21;" d language:C++ From b9a770784904a0edcd7fbe8d7e9bd83144660833 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 1 Feb 2016 20:48:58 +0100 Subject: [PATCH 06/19] [DB] Added detection for duplicated audio files (mbid or checksum) --- src/database-updater/DatabaseUpdater.cpp | 32 +++++++++++++++++++++++- src/database-updater/DatabaseUpdater.hpp | 1 + src/database/Track.cpp | 15 +++++++++++ src/database/Track.hpp | 3 +++ src/utils/Utils.cpp | 12 +++++++++ src/utils/Utils.hpp | 3 +++ 6 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/database-updater/DatabaseUpdater.cpp b/src/database-updater/DatabaseUpdater.cpp index ca0caf8f..7857d1f3 100644 --- a/src/database-updater/DatabaseUpdater.cpp +++ b/src/database-updater/DatabaseUpdater.cpp @@ -23,6 +23,7 @@ #include #include "logger/Logger.hpp" +#include "utils/Utils.hpp" #include "database/Types.hpp" @@ -244,7 +245,9 @@ Updater::process(boost::system::error_code err) LMS_LOG(DBUPDATER, INFO) << "Processing root directory '" << rootDirectory.path << "' DONE"; } - LMS_LOG(DBUPDATER, INFO) << "Scan complete. Changes = " << stats.nbChanges() << ", Errors = " << stats.nbScanErrors; + checkDuplicatedAudioFiles(stats); + + LMS_LOG(DBUPDATER, INFO) << "Scan complete. Changes = " << stats.nbChanges() << "(added = " << stats.nbAdded << ", nbRemoved = " << stats.nbRemoved << ", nbModified = " << stats.nbModified << "), Errors = " << stats.nbScanErrors; // Update database stats boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); @@ -394,6 +397,9 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) if (!_metadataParser.parse(file, items)) return; + std::vector checksum ; + computeCrc(file, checksum); + Wt::Dbo::Transaction transaction(_db.getSession()); Wt::Dbo::ptr track = Track::getByPath(_db.getSession(), file); @@ -502,6 +508,7 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) assert(track); + track.modify()->setChecksum(checksum); track.modify()->setArtist(artist); track.modify()->setRelease(release); track.modify()->setLastWriteTime(lastWriteTime); @@ -719,6 +726,29 @@ Updater::checkAudioFiles( Stats& stats ) LMS_LOG(DBUPDATER, INFO) << "Check audio files done!"; } +void +Updater::checkDuplicatedAudioFiles(Stats& stats) +{ + LMS_LOG(DBUPDATER, INFO) << "Checking duplicated audio files"; + + Wt::Dbo::Transaction transaction(_db.getSession()); + + std::vector tracks = Database::Track::getMBIDDuplicates(_db.getSession()); + for (Track::pointer track : tracks) + { + LMS_LOG(DBUPDATER, INFO) << "Found duplicated MBID [" << track->getMBID() << "], file: " << track->getPath() << " - " << track->getArtist()->getName() << " - " << track->getName(); + } + + tracks = Database::Track::getChecksumDuplicates(_db.getSession()); + for (Track::pointer track : tracks) + { + LMS_LOG(DBUPDATER, INFO) << "Found duplicated checksum [" << bufferToString(track->getChecksum()) << "], file: " << track->getPath() << " - " << track->getArtist()->getName() << " - " << track->getName(); + } + + + LMS_LOG(DBUPDATER, INFO) << "Checking duplicated audio files done!"; +} + void Updater::checkVideoFiles( Stats& stats ) { diff --git a/src/database-updater/DatabaseUpdater.hpp b/src/database-updater/DatabaseUpdater.hpp index ed90ebdf..39924667 100644 --- a/src/database-updater/DatabaseUpdater.hpp +++ b/src/database-updater/DatabaseUpdater.hpp @@ -84,6 +84,7 @@ class Updater // Audio void checkAudioFiles( Stats& stats ); + void checkDuplicatedAudioFiles( Stats& stats ); void processAudioFile( const boost::filesystem::path& file, Stats& stats); // Video diff --git a/src/database/Track.cpp b/src/database/Track.cpp index 8ca5f038..f8f8a811 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -87,6 +87,20 @@ Track::getAllPaths(Wt::Dbo::Session& session) return std::vector(res.begin(), res.end()); } +std::vector +Track::getMBIDDuplicates(Wt::Dbo::Session& session) +{ + Wt::Dbo::collection res = session.query( "SELECT track FROM track WHERE mbid in (SELECT mbid FROM track WHERE mbid <> '' GROUP BY mbid HAVING COUNT (*) > 1)").orderBy("track.mbid"); + return std::vector(res.begin(), res.end()); +} + +std::vector +Track::getChecksumDuplicates(Wt::Dbo::Session& session) +{ + Wt::Dbo::collection res = session.query( "SELECT track FROM track WHERE checksum in (SELECT checksum FROM track WHERE Length(checksum) > 0 GROUP BY checksum HAVING COUNT(*) > 1)").orderBy("track.checksum"); + return std::vector(res.begin(), res.end()); +} + std::vector< Genre::pointer > Track::getGenres(void) const { @@ -167,6 +181,7 @@ Track::updateUIQueryModel(Wt::Dbo::Session& session, Wt::Dbo::QueryModel< UIQuer } + Genre::Genre() { } diff --git a/src/database/Track.hpp b/src/database/Track.hpp index cd96cf17..29c8dc6f 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -53,6 +53,7 @@ class Genre static pointer getNone(Wt::Dbo::Session& session); static std::vector getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1); static Wt::Dbo::collection getAll(Wt::Dbo::Session& session); + // MVC models for the user interface // Genre ID, name, track count typedef boost::tuple UIQueryResult; @@ -106,6 +107,8 @@ class Track static std::vector getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1); static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session); static std::vector getAllPaths(Wt::Dbo::Session& session); + static std::vector getMBIDDuplicates(Wt::Dbo::Session& session); + static std::vector getChecksumDuplicates(Wt::Dbo::Session& session); // Utility fonctions // MVC models for the user interface diff --git a/src/utils/Utils.cpp b/src/utils/Utils.cpp index 517a9e4e..3f968730 100644 --- a/src/utils/Utils.cpp +++ b/src/utils/Utils.cpp @@ -118,4 +118,16 @@ stringToUTF8(const std::string& str) return boost::locale::conv::to_utf(str, "UTF-8"); } +std::string +bufferToString(const std::vector& data) +{ + std::ostringstream oss; + + for (unsigned char c : data) + { + oss << std::setw(2) << std::setfill('0') << std::hex << (int)c; + } + + return oss.str(); +} diff --git a/src/utils/Utils.hpp b/src/utils/Utils.hpp index 5c9013a7..e8c71ea6 100644 --- a/src/utils/Utils.hpp +++ b/src/utils/Utils.hpp @@ -44,6 +44,9 @@ stringTrim(const std::string& str, const std::string& whitespace = " \t"); std::string stringToUTF8(const std::string& str); +std::string +bufferToString(const std::vector& data); + template static inline bool readAs(const std::string& str, T& data) { From 5676ef866c0c6a82980717f63582f311d2878099 Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 2 Feb 2016 18:25:05 +0100 Subject: [PATCH 07/19] [DB] Better reporting database scan results (errors, grouped duplicates) --- src/database-updater/DatabaseUpdater.cpp | 7 ++++++- src/database/Track.cpp | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/database-updater/DatabaseUpdater.cpp b/src/database-updater/DatabaseUpdater.cpp index 7857d1f3..c5b7b1c4 100644 --- a/src/database-updater/DatabaseUpdater.cpp +++ b/src/database-updater/DatabaseUpdater.cpp @@ -247,7 +247,7 @@ Updater::process(boost::system::error_code err) checkDuplicatedAudioFiles(stats); - LMS_LOG(DBUPDATER, INFO) << "Scan complete. Changes = " << stats.nbChanges() << "(added = " << stats.nbAdded << ", nbRemoved = " << stats.nbRemoved << ", nbModified = " << stats.nbModified << "), Errors = " << stats.nbScanErrors; + LMS_LOG(DBUPDATER, INFO) << "Scan complete. Changes = " << stats.nbChanges() << " (added = " << stats.nbAdded << ", nbRemoved = " << stats.nbRemoved << ", nbModified = " << stats.nbModified << "), Errors = " << stats.nbScanErrors; // Update database stats boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); @@ -395,7 +395,10 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) MetaData::Items items; if (!_metadataParser.parse(file, items)) + { + stats.nbScanErrors++; return; + } std::vector checksum ; computeCrc(file, checksum); @@ -418,6 +421,7 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) track.remove(); stats.nbRemoved++; } + stats.nbScanErrors++; return; } if (items.find(MetaData::Type::Duration) == items.end() @@ -431,6 +435,7 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) track.remove(); stats.nbRemoved++; } + stats.nbScanErrors++; return; } diff --git a/src/database/Track.cpp b/src/database/Track.cpp index f8f8a811..495d1670 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -90,14 +90,14 @@ Track::getAllPaths(Wt::Dbo::Session& session) std::vector Track::getMBIDDuplicates(Wt::Dbo::Session& session) { - Wt::Dbo::collection res = session.query( "SELECT track FROM track WHERE mbid in (SELECT mbid FROM track WHERE mbid <> '' GROUP BY mbid HAVING COUNT (*) > 1)").orderBy("track.mbid"); + Wt::Dbo::collection res = session.query( "SELECT track FROM track WHERE mbid in (SELECT mbid FROM track WHERE mbid <> '' GROUP BY mbid HAVING COUNT (*) > 1)").orderBy("track.release_id,track.disc_number,track.track_number,track.mbid"); return std::vector(res.begin(), res.end()); } std::vector Track::getChecksumDuplicates(Wt::Dbo::Session& session) { - Wt::Dbo::collection res = session.query( "SELECT track FROM track WHERE checksum in (SELECT checksum FROM track WHERE Length(checksum) > 0 GROUP BY checksum HAVING COUNT(*) > 1)").orderBy("track.checksum"); + Wt::Dbo::collection res = session.query( "SELECT track FROM track WHERE checksum in (SELECT checksum FROM track WHERE Length(checksum) > 0 GROUP BY checksum HAVING COUNT(*) > 1)").orderBy("track.release_id,track.disc_number,track.track_number,track.checksum"); return std::vector(res.begin(), res.end()); } From 6da1b42f93a4d86d0c89fe99fdd1e64b26f333e5 Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 3 Feb 2016 12:46:27 +0100 Subject: [PATCH 08/19] [DB] Better reporting database scan results (skipped, import errors) --- src/database-updater/DatabaseUpdater.cpp | 375 ++++++++++++----------- src/database-updater/DatabaseUpdater.hpp | 5 +- 2 files changed, 192 insertions(+), 188 deletions(-) diff --git a/src/database-updater/DatabaseUpdater.cpp b/src/database-updater/DatabaseUpdater.cpp index c5b7b1c4..cd8582ca 100644 --- a/src/database-updater/DatabaseUpdater.cpp +++ b/src/database-updater/DatabaseUpdater.cpp @@ -245,9 +245,10 @@ Updater::process(boost::system::error_code err) LMS_LOG(DBUPDATER, INFO) << "Processing root directory '" << rootDirectory.path << "' DONE"; } - checkDuplicatedAudioFiles(stats); + if (_running) + checkDuplicatedAudioFiles(stats); - LMS_LOG(DBUPDATER, INFO) << "Scan complete. Changes = " << stats.nbChanges() << " (added = " << stats.nbAdded << ", nbRemoved = " << stats.nbRemoved << ", nbModified = " << stats.nbModified << "), Errors = " << stats.nbScanErrors; + LMS_LOG(DBUPDATER, INFO) << "Scan complete. Scanned = " << stats.nbScanned << ", Skipped = " << stats.nbSkipped << ", Changes = " << stats.nbChanges() << " (added = " << stats.nbAdded << ", nbRemoved = " << stats.nbRemoved << ", nbModified = " << stats.nbModified << "), Scan errors = " << stats.nbScanErrors << ", Not imported = " << stats.nbNotImported; // Update database stats boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); @@ -384,13 +385,17 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) boost::posix_time::ptime lastWriteTime (boost::posix_time::from_time_t( boost::filesystem::last_write_time( file ) ) ); // Skip file if last write is the same + // We chose not to compare { Wt::Dbo::Transaction transaction(_db.getSession()); Wt::Dbo::ptr track = Track::getByPath(_db.getSession(), file); if (track && track->getLastWriteTime() == lastWriteTime) + { + stats.nbSkipped++; return; + } } MetaData::Items items; @@ -400,6 +405,8 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) return; } + stats.nbScanned++; + std::vector checksum ; computeCrc(file, checksum); @@ -421,7 +428,7 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) track.remove(); stats.nbRemoved++; } - stats.nbScanErrors++; + stats.nbNotImported++; return; } if (items.find(MetaData::Type::Duration) == items.end() @@ -435,147 +442,147 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) track.remove(); stats.nbRemoved++; } - stats.nbScanErrors++; + stats.nbNotImported++; return; } // ***** Title std::string title; - if (items.find(MetaData::Type::Title) != items.end()) { - title = boost::any_cast(items[MetaData::Type::Title]); - } - else + if (items.find(MetaData::Type::Title) != items.end()) + { + title = boost::any_cast(items[MetaData::Type::Title]); + } + else + { + // TODO parse file name guess track etc. + // For now juste use file name as title + title = file.filename().string(); + } + + // ***** Genres + std::vector< Genre::pointer > genres; + { + std::list genreList; + + if (items.find(MetaData::Type::Genres) != items.end()) + genreList = boost::any_cast< std::list > (items[MetaData::Type::Genres]); + + genres = getGenres( genreList ); + } + assert( !genres.empty() ); + + // ***** Artist + Artist::pointer artist; + { + std::string artistName; + std::string artistMusicBrainzID; + + if (items.find(MetaData::Type::MusicBrainzArtistID) != items.end()) + artistMusicBrainzID = boost::any_cast(items[MetaData::Type::MusicBrainzArtistID] ); + + if (items.find(MetaData::Type::Artist) != items.end()) + artistName = boost::any_cast(items[MetaData::Type::Artist]); + + artist = getArtist(file, artistName, artistMusicBrainzID); + } + assert(artist); + + // ***** Release + Release::pointer release; + { + std::string releaseName; + std::string releaseMusicBrainzID; + + if (items.find(MetaData::Type::MusicBrainzAlbumID) != items.end()) + releaseMusicBrainzID = boost::any_cast(items[MetaData::Type::MusicBrainzAlbumID] ); + + if (items.find(MetaData::Type::Album) != items.end()) + releaseName = boost::any_cast(items[MetaData::Type::Album]); + + release = getRelease(file, releaseName, releaseMusicBrainzID); + } + assert(release); + + // If file already exist, update data + // Otherwise, create it + if (!track) + { + // Create a new song + track = Track::create(_db.getSession(), file); + LMS_LOG(DBUPDATER, INFO) << "Adding '" << file << "'"; + stats.nbAdded++; + } + else + { + LMS_LOG(DBUPDATER, INFO) << "Updating '" << file << "'"; + stats.nbModified++; + } + + assert(track); + + track.modify()->setChecksum(checksum); + track.modify()->setArtist(artist); + track.modify()->setRelease(release); + track.modify()->setLastWriteTime(lastWriteTime); + track.modify()->setName(title); + track.modify()->setDuration( boost::any_cast(items[MetaData::Type::Duration]) ); + track.modify()->setAddedTime( boost::posix_time::second_clock::local_time() ); + + { + std::string trackGenreList; + // Product genre list + for (Genre::pointer genre : genres) { - // TODO parse file name guess track etc. - // For now juste use file name as title - title = file.filename().string(); + if (!trackGenreList.empty()) + trackGenreList += ", "; + trackGenreList += genre->getName(); } + track.modify()->setGenres( trackGenreList ); + } + track.modify()->setGenres( genres ); - // ***** Genres - std::vector< Genre::pointer > genres; - { - std::list genreList; + if (items.find(MetaData::Type::TrackNumber) != items.end()) + track.modify()->setTrackNumber( boost::any_cast(items[MetaData::Type::TrackNumber]) ); - if (items.find(MetaData::Type::Genres) != items.end()) - genreList = boost::any_cast< std::list > (items[MetaData::Type::Genres]); + if (items.find(MetaData::Type::TotalTrack) != items.end()) + track.modify()->setTotalTrackNumber( boost::any_cast(items[MetaData::Type::TotalTrack]) ); - genres = getGenres( genreList ); - } - assert( !genres.empty() ); + if (items.find(MetaData::Type::DiscNumber) != items.end()) + track.modify()->setDiscNumber( boost::any_cast(items[MetaData::Type::DiscNumber]) ); - // ***** Artist - Artist::pointer artist; - { - std::string artistName; - std::string artistMusicBrainzID; + if (items.find(MetaData::Type::TotalDisc) != items.end()) + track.modify()->setTotalDiscNumber( boost::any_cast(items[MetaData::Type::TotalDisc]) ); - if (items.find(MetaData::Type::MusicBrainzArtistID) != items.end()) - artistMusicBrainzID = boost::any_cast(items[MetaData::Type::MusicBrainzArtistID] ); + if (items.find(MetaData::Type::Date) != items.end()) + track.modify()->setDate( boost::any_cast(items[MetaData::Type::Date]) ); - if (items.find(MetaData::Type::Artist) != items.end()) - artistName = boost::any_cast(items[MetaData::Type::Artist]); + if (items.find(MetaData::Type::OriginalDate) != items.end()) + { + track.modify()->setOriginalDate( boost::any_cast(items[MetaData::Type::OriginalDate]) ); - artist = getArtist(file, artistName, artistMusicBrainzID); - } - assert(artist); + // If a file has an OriginalDate but no date, set the date to ease filtering + if (items.find(MetaData::Type::Date) == items.end()) + track.modify()->setDate( boost::any_cast(items[MetaData::Type::OriginalDate]) ); + } - // ***** Release - Release::pointer release; - { - std::string releaseName; - std::string releaseMusicBrainzID; + if (items.find(MetaData::Type::MusicBrainzTrackID) != items.end()) + { + track.modify()->setMBID( boost::any_cast(items[MetaData::Type::MusicBrainzTrackID]) ); + } - if (items.find(MetaData::Type::MusicBrainzAlbumID) != items.end()) - releaseMusicBrainzID = boost::any_cast(items[MetaData::Type::MusicBrainzAlbumID] ); + if (items.find(MetaData::Type::HasCover) != items.end()) + { + bool hasCover = boost::any_cast(items[MetaData::Type::HasCover]); - if (items.find(MetaData::Type::Album) != items.end()) - releaseName = boost::any_cast(items[MetaData::Type::Album]); + track.modify()->setCoverType( hasCover ? Track::CoverType::Embedded : Track::CoverType::None ); + } - release = getRelease(file, releaseName, releaseMusicBrainzID); - } - assert(release); - - // If file already exist, update data - // Otherwise, create it - if (!track) - { - // Create a new song - track = Track::create(_db.getSession(), file); - LMS_LOG(DBUPDATER, INFO) << "Adding '" << file << "'"; - stats.nbAdded++; - } - else - { - LMS_LOG(DBUPDATER, INFO) << "Updating '" << file << "'"; - stats.nbModified++; - } - - assert(track); - - track.modify()->setChecksum(checksum); - track.modify()->setArtist(artist); - track.modify()->setRelease(release); - track.modify()->setLastWriteTime(lastWriteTime); - track.modify()->setName(title); - track.modify()->setDuration( boost::any_cast(items[MetaData::Type::Duration]) ); - track.modify()->setAddedTime( boost::posix_time::second_clock::local_time() ); - - { - std::string trackGenreList; - // Product genre list - for (Genre::pointer genre : genres) - { - if (!trackGenreList.empty()) - trackGenreList += ", "; - trackGenreList += genre->getName(); - } - - track.modify()->setGenres( trackGenreList ); - } - track.modify()->setGenres( genres ); - - if (items.find(MetaData::Type::TrackNumber) != items.end()) - track.modify()->setTrackNumber( boost::any_cast(items[MetaData::Type::TrackNumber]) ); - - if (items.find(MetaData::Type::TotalTrack) != items.end()) - track.modify()->setTotalTrackNumber( boost::any_cast(items[MetaData::Type::TotalTrack]) ); - - if (items.find(MetaData::Type::DiscNumber) != items.end()) - track.modify()->setDiscNumber( boost::any_cast(items[MetaData::Type::DiscNumber]) ); - - if (items.find(MetaData::Type::TotalDisc) != items.end()) - track.modify()->setTotalDiscNumber( boost::any_cast(items[MetaData::Type::TotalDisc]) ); - - if (items.find(MetaData::Type::Date) != items.end()) - track.modify()->setDate( boost::any_cast(items[MetaData::Type::Date]) ); - - if (items.find(MetaData::Type::OriginalDate) != items.end()) - { - track.modify()->setOriginalDate( boost::any_cast(items[MetaData::Type::OriginalDate]) ); - - // If a file has an OriginalDate but no date, set the date to ease filtering - if (items.find(MetaData::Type::Date) == items.end()) - track.modify()->setDate( boost::any_cast(items[MetaData::Type::OriginalDate]) ); - } - - if (items.find(MetaData::Type::MusicBrainzTrackID) != items.end()) - { - track.modify()->setMBID( boost::any_cast(items[MetaData::Type::MusicBrainzTrackID]) ); - } - - if (items.find(MetaData::Type::HasCover) != items.end()) - { - bool hasCover = boost::any_cast(items[MetaData::Type::HasCover]); - - track.modify()->setCoverType( hasCover ? Track::CoverType::Embedded : Track::CoverType::None ); - } - - transaction.commit(); + transaction.commit(); } -void + void Updater::processRootDirectory(RootDirectory rootDirectory, Stats& stats) { @@ -781,80 +788,74 @@ Updater::checkVideoFiles( Stats& stats ) LMS_LOG(DBUPDATER, DEBUG) << "Check video files done!"; } + void Updater::processVideoFile( const boost::filesystem::path& file, Stats& stats) { - try { + // Check last update time + boost::posix_time::ptime lastWriteTime (boost::posix_time::from_time_t( boost::filesystem::last_write_time( file ) ) ); - // Check last update time - boost::posix_time::ptime lastWriteTime (boost::posix_time::from_time_t( boost::filesystem::last_write_time( file ) ) ); + Wt::Dbo::Transaction transaction(_db.getSession()); - Wt::Dbo::Transaction transaction(_db.getSession()); + // Skip file if last write is the same + Wt::Dbo::ptr