diff --git a/src/metadata/TagLibParser.cpp b/src/metadata/TagLibParser.cpp index ce4a7a5b..7280e753 100644 --- a/src/metadata/TagLibParser.cpp +++ b/src/metadata/TagLibParser.cpp @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include "logger/Logger.hpp" #include "utils/Utils.hpp" @@ -48,12 +50,24 @@ TagLibParser::parse(const boost::filesystem::path& p, Items& items) boost::posix_time::time_duration duration = boost::posix_time::seconds(properties->length()); - items.insert( std::make_pair(MetaData::Type::Duration, duration) ); + items.insert( std::make_pair(MetaData::Type::Duration, duration) ); - MetaData::AudioStream audioStream = { .desc = "", .bitRate = static_cast(properties->bitrate()) }; + MetaData::AudioStream audioStream = { .desc = "", .bitRate = static_cast(properties->bitrate() * 1000) }; items.insert( std::make_pair(MetaData::Type::AudioStreams, std::vector(1, audioStream ) )); } + // Not that good embedded pictures handling + + // MP3 + if (TagLib::MPEG::File *mp3File = dynamic_cast(f.file())) + { + if (mp3File->ID3v2Tag()) + { + if (!mp3File->ID3v2Tag()->frameListMap()["APIC"].isEmpty()) + items.insert( std::make_pair(MetaData::Type::HasCover, true)); + } + } + if (f.tag()) { TagLib::PropertyMap tags = f.file()->properties(); diff --git a/test/Makefile.am b/test/Makefile.am index 14eef55b..0df0354b 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,7 +1,7 @@ -TESTS = database-basics database-integrity sql-query database-user +TESTS = sql-query database-user -check_PROGRAMS = database-basics database-integrity sql-query database-user test-wt test-avmetadata +check_PROGRAMS = sql-query database-user test-wt test-avmetadata database_basics_SOURCES = \ $(srcdir)/CheckDbBasics.cpp \ @@ -91,6 +91,7 @@ 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/metadata/TagLibParser.cpp \ $(top_srcdir)/src/av/AvInfo.cpp test_avmetadata_CXXFLAGS=-std=c++11 -Wall -Wextra -I$(top_srcdir)/src diff --git a/test/TestAvMetadata.cpp b/test/TestAvMetadata.cpp index ede3931d..2ce4e1c5 100644 --- a/test/TestAvMetadata.cpp +++ b/test/TestAvMetadata.cpp @@ -1,10 +1,14 @@ #include +#include +#include + #include #include #include "av/AvInfo.hpp" #include "metadata/AvFormat.hpp" +#include "metadata/TagLibParser.hpp" int main(int argc, char *argv[]) { @@ -18,37 +22,91 @@ int main(int argc, char *argv[]) { Av::AvInit(); - MetaData::AvFormat parser; - MetaData::Items items; - if (!parser.parse(argv[1], items)) - { - std::cout << "Parsing failed" << std::endl; - return EXIT_FAILURE; - } + MetaData::AvFormat avFormatParser; + MetaData::TagLibParser tagLibParser; - for (auto item : items) + std::vector parsers = { &avFormatParser, &tagLibParser }; + + for (auto& parser : parsers) { - switch (item.first) + MetaData::Items items; + + if (!parser->parse(argv[1], items)) { - 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; + std::cout << "Parsing failed" << std::endl; + continue; } + + std::cout << "Items:" << std::endl; + for (auto item : items) + { + switch (item.first) + { + case MetaData::Type::Title: + std::cout << "Title: " << boost::any_cast(item.second) << std::endl; + break; + + case MetaData::Type::Artist: + std::cout << "Artist: " << boost::any_cast(item.second) << std::endl; + break; + + case MetaData::Type::Album: + std::cout << "Album: " << boost::any_cast(item.second) << std::endl; + break; + + case MetaData::Type::Genres: + for (auto& genre : boost::any_cast >(item.second)) + std::cout << "Genre: " << genre << std::endl; + break; + + case MetaData::Type::Duration: + std::cout << "Duration: " << boost::posix_time::to_simple_string(boost::any_cast(item.second)) << std::endl; + break; + + + 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; + break; + + case MetaData::Type::Date: + std::cout << "Date: " << boost::posix_time::to_simple_string(boost::any_cast(item.second)) << std::endl; + break; + + case MetaData::Type::OriginalDate: + std::cout << "Original date: " << boost::posix_time::to_simple_string(boost::any_cast(item.second)) << std::endl; + break; + + case MetaData::Type::HasCover: + std::cout << "HasCover = " << std::boolalpha << boost::any_cast(item.second) << std::endl; + break; + + case MetaData::Type::AudioStreams: + { + for (auto& audioStream : boost::any_cast >(item.second)) + std::cout << "Audio stream '" << audioStream.desc << "' - " << audioStream.bitRate << " bps" << std::endl; + + + } + + default: + break; + } + } + + std::cout << std::endl; } return EXIT_SUCCESS;