From 397c6f4e9c08fabfaea0b17ed8379d3471d38f45 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 6 May 2019 13:51:17 +0200 Subject: [PATCH] Add Opus file scan + fixed ogg tag parsing --- src/database/ScanSettings.hpp | 10 +++++----- src/metadata/TagLibParser.cpp | 36 +++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/database/ScanSettings.hpp b/src/database/ScanSettings.hpp index 2621ed1a..e1831521 100644 --- a/src/database/ScanSettings.hpp +++ b/src/database/ScanSettings.hpp @@ -70,11 +70,11 @@ class ScanSettings : public Wt::Dbo::Dbo private: - int _scanVersion = 0; - std::string _mediaDirectory = ""; - Wt::WTime _startTime = Wt::WTime(0,0,0); - UpdatePeriod _updatePeriod = UpdatePeriod::Never; - std::string _audioFileExtensions = ".mp3 .ogg .oga .aac .m4a .flac .wav .wma .aif .aiff .ape .mpc .shn"; + int _scanVersion {}; + std::string _mediaDirectory; + Wt::WTime _startTime = Wt::WTime {0,0,0}; + UpdatePeriod _updatePeriod {UpdatePeriod::Never}; + std::string _audioFileExtensions {".mp3 .ogg .oga .aac .m4a .flac .wav .wma .aif .aiff .ape .mpc .shn .opus"}; Wt::Dbo::collection> _clusterTypes; }; diff --git a/src/metadata/TagLibParser.cpp b/src/metadata/TagLibParser.cpp index 0b3cff37..178a508c 100644 --- a/src/metadata/TagLibParser.cpp +++ b/src/metadata/TagLibParser.cpp @@ -32,18 +32,31 @@ namespace MetaData { std::vector -getPropertyValues(const TagLib::PropertyMap& properties, const std::string& key) +getPropertyValuesFirstMatch(const TagLib::PropertyMap& properties, const std::set& keys) { std::vector res; - const TagLib::StringList& values {properties[key]}; + for (const std::string& key : keys) + { + const TagLib::StringList& values {properties[key]}; + if (values.isEmpty()) + continue; - res.reserve(values.size()); - std::transform(std::cbegin(values), std::cend(values), std::back_inserter(res), [](const auto& value) { return stringTrim(value.to8Bit(true)); }); + res.reserve(values.size()); + std::transform(std::cbegin(values), std::cend(values), std::back_inserter(res), [](const auto& value) { return stringTrim(value.to8Bit(true)); }); + + break; + } return res; } +std::vector +getPropertyValues(const TagLib::PropertyMap& properties, const std::string& key) +{ + return getPropertyValuesFirstMatch(properties, {std::move(key)}); +} + static std::vector splitAndTrimString(const std::string& str, const std::string& delimiters) @@ -70,7 +83,7 @@ getArtists(const TagLib::PropertyMap& properties) if (artistNames.empty()) return res; - const std::vector artistsMBID {getPropertyValues(properties, "MUSICBRAINZ_ARTISTID")}; + const std::vector artistsMBID {getPropertyValuesFirstMatch(properties, {"MUSICBRAINZ_ARTISTID", "MUSICBRAINZ ARTIST ID"})}; if (artistNames.size() == artistsMBID.size()) { @@ -96,7 +109,7 @@ getAlbumArtists(const TagLib::PropertyMap& properties) if (artistNames.empty()) return res; - const std::vector artistsMBID {getPropertyValues(properties, "MUSICBRAINZ_ALBUMARTISTID")}; + const std::vector artistsMBID {getPropertyValuesFirstMatch(properties, {"MUSICBRAINZ_ALBUMARTISTID", "MUSICBRAINZ ALBUM ARTIST ID"})}; if (artistNames.size() == artistsMBID.size()) { @@ -122,7 +135,7 @@ getAlbum(const TagLib::PropertyMap& properties) if (albumName.empty()) return res; - std::vector albumMBID {getPropertyValues(properties, "MUSICBRAINZ_ALBUMID")}; + std::vector albumMBID {getPropertyValuesFirstMatch(properties, {"MUSICBRAINZ_ALBUMID", "MUSICBRAINZ ALBUM ID"})}; res = Album{std::move(albumName.front()), ""}; @@ -140,10 +153,16 @@ TagLibParser::parse(const boost::filesystem::path& p, bool debug) TagLib::AudioProperties::Average}; if (f.isNull()) + { + LMS_LOG(METADATA, ERROR) << "File '" << p.string() << "': parsing failed"; return boost::none; + } if (!f.audioProperties()) + { + LMS_LOG(METADATA, INFO) << "File '" << p.string() << "': no audio properties"; return boost::none; + } Track track; @@ -199,7 +218,8 @@ TagLibParser::parse(const boost::filesystem::path& p, bool debug) { track.musicBrainzTrackID = value; } - else if (tag == "MUSICBRAINZ_TRACKID") + else if (tag == "MUSICBRAINZ_TRACKID" + || tag == "MUSICBRAINZ TRACK ID") track.musicBrainzRecordID = value; else if (tag == "ACOUSTID_ID") track.acoustID = value;