From 57e745b460c8cf03897ec319875d785cec1df7fd Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 6 May 2018 17:14:15 +0200 Subject: [PATCH] Simplifiying the cluster types handling --- src/Makefile.am | 1 + src/metadata/AvFormat.cpp | 8 ++++---- src/metadata/AvFormat.hpp | 11 +---------- src/metadata/MetaData.hpp | 20 ++++++++++++++------ src/metadata/TagLibParser.cpp | 8 ++++---- src/metadata/TagLibParser.hpp | 11 +---------- src/scanner/MediaScanner.cpp | 25 ++++++++++++------------- src/scanner/MediaScanner.hpp | 1 - test/Makefile.am | 1 + 9 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 88626589..20275a2c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,6 +16,7 @@ lms_SOURCES = \ $(srcdir)/database/User.cpp \ $(srcdir)/image/Image.cpp \ $(srcdir)/metadata/AvFormat.cpp \ + $(srcdir)/metadata/MetaData.cpp \ $(srcdir)/metadata/TagLibParser.cpp \ $(srcdir)/scanner/MediaScanner.cpp \ $(srcdir)/ui/Auth.cpp \ diff --git a/src/metadata/AvFormat.cpp b/src/metadata/AvFormat.cpp index bb6dad82..deb9db2b 100644 --- a/src/metadata/AvFormat.cpp +++ b/src/metadata/AvFormat.cpp @@ -30,8 +30,8 @@ namespace MetaData { -AvFormat::AvFormat(const std::map& clusterMap) -: _clusterMap(clusterMap) +AvFormat::AvFormat(const ClusterTypes& clusterTypes) +: Parser(clusterTypes) { } @@ -155,13 +155,13 @@ AvFormat::parse(const boost::filesystem::path& p) { items.insert( std::make_pair(MetaData::Type::AcoustID, stringTrim(value)) ); } - else if (_clusterMap.find(tag) != _clusterMap.end()) + else if (_clusterTypes.find(tag) != _clusterTypes.end()) { std::vector clusterNames = splitString(value, ";,\\"); if (!clusterNames.empty()) { - clusters[_clusterMap[tag]] = std::set(clusterNames.begin(), clusterNames.end()); + clusters[tag] = std::set(clusterNames.begin(), clusterNames.end()); } } diff --git a/src/metadata/AvFormat.hpp b/src/metadata/AvFormat.hpp index 8c3c9504..aaec59fe 100644 --- a/src/metadata/AvFormat.hpp +++ b/src/metadata/AvFormat.hpp @@ -32,18 +32,9 @@ class AvFormat : public Parser { public: - AvFormat(const std::map& clusterMap - = { - {"GENRE", "Genre" }, - {"ALBUMGROUPING", "Group" } - }); - + AvFormat(const ClusterTypes& clusterTypes = defaultClusterTypes); boost::optional parse(const boost::filesystem::path& p); - - private: - - std::map _clusterMap; }; } // namespace MetaData diff --git a/src/metadata/MetaData.hpp b/src/metadata/MetaData.hpp index b2237a9f..11606b70 100644 --- a/src/metadata/MetaData.hpp +++ b/src/metadata/MetaData.hpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Emeric Poupon + * Copyright (C) 2018 Emeric Poupon * * This file is part of LMS. * @@ -17,8 +17,7 @@ * along with LMS. If not, see . */ -#ifndef METADATA_HPP -#define METADATA_HPP +#pragma once #include #include @@ -63,17 +62,26 @@ namespace MetaData // Type and associated data // See enum Type's comments using Items = std::map; - using Clusters = std::map>; + using Clusters = std::map /* names */>; + using ClusterTypes = std::set; class Parser { public: + static const ClusterTypes defaultClusterTypes; + + // Provide a map for tag name -> Cluster name + Parser(const ClusterTypes& clusterTypes) : _clusterTypes(clusterTypes) {} virtual boost::optional parse(const boost::filesystem::path& p) = 0; + void updateClusterTypes(const ClusterTypes& clusterTypes) { _clusterTypes = clusterTypes; } + const ClusterTypes& getClusterTypes() const { return _clusterTypes; } + bool isClusterTypeSupported(const std::string& clusterType) const { return _clusterTypes.find(clusterType) != _clusterTypes.end(); } + + protected: + ClusterTypes _clusterTypes; }; } // namespace MetaData -#endif - diff --git a/src/metadata/TagLibParser.cpp b/src/metadata/TagLibParser.cpp index ad27e481..acc12cc4 100644 --- a/src/metadata/TagLibParser.cpp +++ b/src/metadata/TagLibParser.cpp @@ -32,8 +32,8 @@ namespace MetaData { -TagLibParser::TagLibParser(const std::map& clusterMap) -: _clusterMap(clusterMap) +TagLibParser::TagLibParser(const ClusterTypes& clusterTypes) +: Parser(clusterTypes) { } @@ -188,14 +188,14 @@ TagLibParser::parse(const boost::filesystem::path& p) items.insert( std::make_pair(MetaData::Type::HasCover, true)); } // Check if a hit a cluster tag - else if (_clusterMap.find(tag) != _clusterMap.end()) + else if (_clusterTypes.find(tag) != _clusterTypes.end()) { std::set clusterNames; for (const auto& value : values) clusterNames.insert(value.to8Bit(true)); if (!clusterNames.empty()) - clusters[_clusterMap[tag]] = clusterNames; + clusters[tag] = clusterNames; } } diff --git a/src/metadata/TagLibParser.hpp b/src/metadata/TagLibParser.hpp index baefc112..1b85ed0d 100644 --- a/src/metadata/TagLibParser.hpp +++ b/src/metadata/TagLibParser.hpp @@ -32,18 +32,9 @@ class TagLibParser : public Parser { public: - // Provide a map for TagLib name -> Cluster name - TagLibParser(const std::map& clusterMap - = { - {"GENRE", "Genre" }, - {"ALBUMGROUPING", "Group" } - }); + TagLibParser(const ClusterTypes& clusterTypes = defaultClusterTypes); boost::optional parse(const boost::filesystem::path& p); - - private: - - std::map _clusterMap; }; } // namespace MetaData diff --git a/src/scanner/MediaScanner.cpp b/src/scanner/MediaScanner.cpp index 1d3819f9..933adb25 100644 --- a/src/scanner/MediaScanner.cpp +++ b/src/scanner/MediaScanner.cpp @@ -59,13 +59,6 @@ const std::vector defaultFileExtensions = ".shn", }; -// Caution current implementation prevents spaces with the names -const std::vector defaultClusters = -{ - "Genre", - "Group", -}; - Wt::WDate getNextMonday(Wt::WDate current) { @@ -160,7 +153,12 @@ _db(connectionPool) Setting::setString(_db.getSession(), fileExtensionsSetting, joinStrings(defaultFileExtensions, " ")); if (!Setting::exists(_db.getSession(), clustersSetting)) - Setting::setString(_db.getSession(), clustersSetting, joinStrings(defaultClusters, " ")); + { + std::vector defaultClusterTypes(MetaData::Parser::defaultClusterTypes.begin(), MetaData::Parser::defaultClusterTypes.end()); + Setting::setString(_db.getSession(), clustersSetting, joinStrings(defaultClusterTypes, " ")); + } + + refreshScanSettings(); } void @@ -325,9 +323,11 @@ MediaScanner::refreshScanSettings() for (auto rootDir : Database::MediaDirectory::getAll(_db.getSession())) _rootDirectories.push_back(rootDir->getPath()); - _clusterTypes.clear(); + MetaData::ClusterTypes clusterTypes; for (auto cluster : splitString(Setting::getString(_db.getSession(), clustersSetting), " ")) - _clusterTypes.push_back(cluster); + clusterTypes.insert(cluster); + + _metadataParser.updateClusterTypes(clusterTypes); } Artist::pointer @@ -800,8 +800,7 @@ MediaScanner::checkClusters() // Remove no longer desired clusters for (auto clusterType : clusterTypes) { - if (std::none_of(_clusterTypes.begin(), _clusterTypes.end(), - [&clusterType](std::string clusterTypeName) { return clusterTypeName == clusterType->getName(); })) + if (!_metadataParser.isClusterTypeSupported(clusterType->getName())) { LMS_LOG(DBUPDATER, INFO) << "Removing cluster type " << clusterType->getName(); clusterType.remove(); @@ -810,7 +809,7 @@ MediaScanner::checkClusters() } // Add any missing clusters - for (auto clusterTypeName : _clusterTypes) + for (auto clusterTypeName : _metadataParser.getClusterTypes()) { if (std::none_of(clusterTypes.begin(), clusterTypes.end(), [&clusterTypeName](ClusterType::pointer clusterType) { return (clusterType->getName() == clusterTypeName); })) diff --git a/src/scanner/MediaScanner.hpp b/src/scanner/MediaScanner.hpp index 9d8cfa3d..a27b9a13 100644 --- a/src/scanner/MediaScanner.hpp +++ b/src/scanner/MediaScanner.hpp @@ -126,7 +126,6 @@ class MediaScanner Database::Handler _db; // Scan settings - std::vector _clusterTypes; std::vector _fileExtensions; std::vector _rootDirectories; diff --git a/test/Makefile.am b/test/Makefile.am index 411aef1a..deb16d46 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -92,6 +92,7 @@ test_avmetadata_SOURCES = TestAvMetadata.cpp \ $(top_srcdir)/src/utils/Utils.cpp \ $(top_srcdir)/src/metadata/AvFormat.cpp \ $(top_srcdir)/src/metadata/TagLibParser.cpp \ + $(top_srcdir)/src/metadata/MetaData.cpp \ $(top_srcdir)/src/av/AvInfo.cpp test_avmetadata_CXXFLAGS=-std=c++11 -Wall -Wextra -I$(top_srcdir)/src