From 3fdc25572a036ae133fc6bb3782b58b2e6e892d0 Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 22 Nov 2015 22:45:13 +0100 Subject: [PATCH] [UI/MOBILE] Display disc number only if necessary --- src/database-updater/DatabaseUpdater.cpp | 6 +++ src/database/Track.cpp | 2 + src/database/Track.hpp | 10 +++- src/metadata/AvFormat.cpp | 41 ++++++++++++--- src/metadata/MetaData.hpp | 2 + src/ui/audio/mobile/MobileAudio.cpp | 2 +- src/ui/audio/mobile/TrackSearch.cpp | 2 +- src/utils/Utils.cpp | 2 +- src/utils/Utils.hpp | 2 +- test/CheckDbBasics.cpp | 2 - test/Makefile.am | 13 ++++- test/TestAvMetadata.cpp | 63 ++++++++++++++++++++++++ 12 files changed, 132 insertions(+), 15 deletions(-) create mode 100644 test/TestAvMetadata.cpp diff --git a/src/database-updater/DatabaseUpdater.cpp b/src/database-updater/DatabaseUpdater.cpp index eba1e54b..33afd506 100644 --- a/src/database-updater/DatabaseUpdater.cpp +++ b/src/database-updater/DatabaseUpdater.cpp @@ -526,9 +526,15 @@ Updater::processAudioFile( const boost::filesystem::path& file, Stats& stats) 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]) ); diff --git a/src/database/Track.cpp b/src/database/Track.cpp index cf78eac0..75b226ba 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -30,7 +30,9 @@ namespace Database { Track::Track(const boost::filesystem::path& p) : _trackNumber(0), +_totalTrackNumber(0), _discNumber(0), +_totalDiscNumber(0), _filePath( p.string() ), _coverType(CoverType::None) { diff --git a/src/database/Track.hpp b/src/database/Track.hpp index 17d4f809..cd96cf17 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -136,7 +136,9 @@ class Track // Accessors void setTrackNumber(int num) { _trackNumber = num; } + void setTotalTrackNumber(int num) { _totalTrackNumber = num; } void setDiscNumber(int num) { _discNumber = num; } + void setTotalDiscNumber(int num) { _totalDiscNumber = num; } void setName(const std::string& name) { _name = std::string(name, 0, _maxNameLength); } void setDuration(boost::posix_time::time_duration duration) { _duration = duration; } void setLastWriteTime(boost::posix_time::ptime time) { _fileLastWrite = time; } @@ -146,13 +148,15 @@ class Track void setOriginalDate(const boost::posix_time::ptime& date) { _originalDate = date; } void setGenres(const std::string& genreList) { _genreList = genreList; } void setCoverType(CoverType coverType) { _coverType = coverType; } - void setMBID(const std::string& MBID) { _MBID = MBID; } + void setMBID(const std::string& MBID) { _MBID = MBID; } void setArtist(Wt::Dbo::ptr artist) { _artist = artist; } void setRelease(Wt::Dbo::ptr release) { _release = release; } void setGenres(std::vector genres); int getTrackNumber(void) const { return _trackNumber; } + int getTotalTrackNumber(void) const { return _totalTrackNumber; } int getDiscNumber(void) const { return _discNumber; } + int getTotalDiscNumber(void) const { return _totalDiscNumber; } std::string getName(void) const { return _name; } boost::filesystem::path getPath(void) const { return _filePath; } boost::posix_time::time_duration getDuration(void) const { return _duration; } @@ -172,7 +176,9 @@ class Track void persist(Action& a) { Wt::Dbo::field(a, _trackNumber, "track_number"); + Wt::Dbo::field(a, _totalTrackNumber, "total_track_number"); Wt::Dbo::field(a, _discNumber, "disc_number"); + Wt::Dbo::field(a, _totalDiscNumber, "total_disc_number"); Wt::Dbo::field(a, _name, "name"); Wt::Dbo::field(a, _duration, "duration"); Wt::Dbo::field(a, _date, "date"); @@ -197,7 +203,9 @@ class Track static const std::size_t _maxNameLength = 128; int _trackNumber; + int _totalTrackNumber; int _discNumber; + int _totalDiscNumber; std::string _name; std::string _artistName; std::string _releaseName; diff --git a/src/metadata/AvFormat.cpp b/src/metadata/AvFormat.cpp index 6d751cee..07778457 100644 --- a/src/metadata/AvFormat.cpp +++ b/src/metadata/AvFormat.cpp @@ -114,16 +114,43 @@ AvFormat::parse(const boost::filesystem::path& p, Items& items) items.insert( std::make_pair(MetaData::Type::Album, stringTrim( stringToUTF8(it->second)) )); else if (boost::iequals(it->first, "title")) items.insert( std::make_pair(MetaData::Type::Title, stringTrim( stringToUTF8(it->second)) )); - else if (boost::iequals(it->first, "track")) { - std::size_t number; - if (readAs(it->second, number)) - items.insert( std::make_pair(MetaData::Type::TrackNumber, number )); + else if (boost::iequals(it->first, "track")) + { + // Expecting 'Number/Total' + auto strings = splitString(it->second, "/"); + + if (strings.size() > 0) + { + std::size_t number; + if (readAs(strings[0], number)) + items.insert( std::make_pair(MetaData::Type::TrackNumber, number )); + + if (strings.size() > 1) + { + std::size_t totalNumber; + if (readAs(strings[1], totalNumber)) + items.insert( std::make_pair(MetaData::Type::TotalTrack, totalNumber )); + } + } } else if (boost::iequals(it->first, "disc")) { - std::size_t number; - if (readAs(it->second, number)) - items.insert( std::make_pair(MetaData::Type::DiscNumber, number )); + // Expecting 'Number/Total' + auto strings = splitString(it->second, "/"); + + if (strings.size() > 0) + { + std::size_t number; + if (readAs(strings[0], number)) + items.insert( std::make_pair(MetaData::Type::DiscNumber, number )); + + if (strings.size() > 1) + { + std::size_t totalNumber; + if (readAs(strings[1], totalNumber)) + items.insert( std::make_pair(MetaData::Type::TotalDisc, totalNumber )); + } + } } else if (boost::iequals(it->first, "date") || boost::iequals(it->first, "year") diff --git a/src/metadata/MetaData.hpp b/src/metadata/MetaData.hpp index 7548bb68..fdb65d04 100644 --- a/src/metadata/MetaData.hpp +++ b/src/metadata/MetaData.hpp @@ -37,6 +37,8 @@ namespace MetaData Duration, // boost::posix_time::time_duration TrackNumber, // size_t DiscNumber, // size_t + TotalTrack, // size_t + TotalDisc, // size_t Date, // boost::posix_time::ptime OriginalDate, // boost::posix_time::ptime HasCover, // bool diff --git a/src/ui/audio/mobile/MobileAudio.cpp b/src/ui/audio/mobile/MobileAudio.cpp index 054710dd..31816f25 100644 --- a/src/ui/audio/mobile/MobileAudio.cpp +++ b/src/ui/audio/mobile/MobileAudio.cpp @@ -93,7 +93,7 @@ Audio::Audio(Wt::WContainerWidget *parent) // Artist // Release // Song - std::vector keywords = splitStrings(edit->text().toUTF8(), " ");; + auto keywords = splitString(edit->text().toUTF8(), " ");; releaseSearch->search(SearchFilter::ByName(SearchFilter::Field::Release, keywords), SEARCH_NB_ITEMS); artistSearch->search(SearchFilter::ByName(SearchFilter::Field::Artist, keywords), SEARCH_NB_ITEMS); diff --git a/src/ui/audio/mobile/TrackSearch.cpp b/src/ui/audio/mobile/TrackSearch.cpp index 3030a743..294b3797 100644 --- a/src/ui/audio/mobile/TrackSearch.cpp +++ b/src/ui/audio/mobile/TrackSearch.cpp @@ -167,7 +167,7 @@ TrackSearch::addResults(size_t nb) trackRes->setCondition("if-has-track-num", true); trackRes->bindInt("track-num", track->getTrackNumber()); - if (track->getDiscNumber() > 0) + if (track->getDiscNumber() > 0 && track->getTotalDiscNumber() > 1) { trackRes->setCondition("if-has-disc-num", true); trackRes->bindInt("disc-num", track->getDiscNumber()); } diff --git a/src/utils/Utils.cpp b/src/utils/Utils.cpp index e95ea8d0..517a9e4e 100644 --- a/src/utils/Utils.cpp +++ b/src/utils/Utils.cpp @@ -90,7 +90,7 @@ durationToString(boost::posix_time::time_duration duration, std::string format) } std::vector -splitStrings(std::string string, std::string separators) +splitString(std::string string, std::string separators) { std::vector res; diff --git a/src/utils/Utils.hpp b/src/utils/Utils.hpp index f59b840c..5c9013a7 100644 --- a/src/utils/Utils.hpp +++ b/src/utils/Utils.hpp @@ -36,7 +36,7 @@ std::string durationToString(boost::posix_time::time_duration duration, std::string format); std::vector -splitStrings(std::string string, std::string separators); +splitString(std::string string, std::string separators); std::string stringTrim(const std::string& str, const std::string& whitespace = " \t"); diff --git a/test/CheckDbBasics.cpp b/test/CheckDbBasics.cpp index c993105b..716873a8 100644 --- a/test/CheckDbBasics.cpp +++ b/test/CheckDbBasics.cpp @@ -185,8 +185,6 @@ int main(void) assert(res.front().id() == 1); assert(res.front()->getName() == "release01"); - // Make sure release has an artist - assert(res.front()->getArtists().size() == 1); } // Select genre by name diff --git a/test/Makefile.am b/test/Makefile.am index 15cea22f..2d08aae0 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,7 +1,7 @@ TESTS = database-basics database-integrity sql-query database-user -check_PROGRAMS = database-basics database-integrity sql-query database-user test-wt +check_PROGRAMS = database-basics database-integrity sql-query database-user test-wt test-avmetadata database_basics_SOURCES = \ $(srcdir)/CheckDbBasics.cpp \ @@ -63,3 +63,14 @@ test_wt_SOURCES = TestWt.cpp test_wt_CXXFLAGS=-std=c++11 -Wall -Wextra + +test_avmetadata_SOURCES = TestAvMetadata.cpp \ + $(top_srcdir)/src/logger/Logger.cpp \ + $(top_srcdir)/src/utils/Utils.cpp \ + $(top_srcdir)/src/metadata/AvFormat.cpp \ + $(top_srcdir)/src/av/AvInfo.cpp \ + $(top_srcdir)/src/av/AvTranscoder.cpp + +test_avmetadata_CXXFLAGS=-std=c++11 -Wall -Wextra -I$(top_srcdir)/src + + diff --git a/test/TestAvMetadata.cpp b/test/TestAvMetadata.cpp new file mode 100644 index 00000000..ede3931d --- /dev/null +++ b/test/TestAvMetadata.cpp @@ -0,0 +1,63 @@ +#include + +#include +#include + +#include "av/AvInfo.hpp" +#include "metadata/AvFormat.hpp" + +int main(int argc, char *argv[]) +{ + if (argc != 2) + { + std::cerr << "Usage: " << std::endl; + return EXIT_FAILURE; + } + + try + { + Av::AvInit(); + + MetaData::AvFormat parser; + MetaData::Items items; + + if (!parser.parse(argv[1], items)) + { + std::cout << "Parsing failed" << std::endl; + return EXIT_FAILURE; + } + + for (auto item : items) + { + switch (item.first) + { + case MetaData::Type::TrackNumber: + std::cout << "Track: " << boost::any_cast(item.second) << std::endl; + break; + + case MetaData::Type::TotalTrack: + std::cout << "TotalTrack: " << boost::any_cast(item.second) << std::endl; + break; + + case MetaData::Type::DiscNumber: + std::cout << "Disc: " << boost::any_cast(item.second) << std::endl; + break; + + case MetaData::Type::TotalDisc: + std::cout << "TotalDisc: " << boost::any_cast(item.second) << std::endl; + + default: + break; + } + } + + return EXIT_SUCCESS; + } + catch (std::exception& e) + { + std::cerr << "Caught exception: " << e.what(); + return EXIT_FAILURE; + } + +} +