diff --git a/approot/messages_es.xml b/approot/messages_es.xml
index bf9f2e0c..7f47b917 100644
--- a/approot/messages_es.xml
+++ b/approot/messages_es.xml
@@ -73,9 +73,9 @@
Ruta raíz
-Permitir la fusión de artistas sin MBID con aquellos que tienen uno
+Permitir la fusión de artistas sin MBID con aquellos que sí lo tienen
Delimitadores usados para separar las etiquetas de los artistas
-Artistas que no se deben dividir usando los delimitadores (un artista por línea)
+Artistas que no se deben separar usando los delimitadores (un artista por línea)
Diariamente
Delimitadores usados para separar otras etiquetas
diff --git a/src/libs/database/impl/Migration.cpp b/src/libs/database/impl/Migration.cpp
index 71640710..a0318ed8 100644
--- a/src/libs/database/impl/Migration.cpp
+++ b/src/libs/database/impl/Migration.cpp
@@ -35,7 +35,7 @@ namespace lms::db
{
namespace
{
- static constexpr Version LMS_DATABASE_VERSION{ 88 };
+ static constexpr Version LMS_DATABASE_VERSION{ 90 };
}
VersionInfo::VersionInfo()
@@ -1164,7 +1164,7 @@ FROM tracklist)");
dropIndexes(session);
// Artist merging feature
- utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings ADD COLUMN allow_mbid_artist_merge BOLLEAN DEFAULT(false)");
+ utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings ADD COLUMN allow_mbid_artist_merge BOOLEAN DEFAULT(false)");
utils::executeCommand(*session.getDboSession(), "ALTER TABLE track_artist_link ADD COLUMN artist_name TEXT NULL DEFAULT('')");
utils::executeCommand(*session.getDboSession(), "ALTER TABLE track_artist_link ADD COLUMN artist_sort_name TEXT NULL DEFAULT('')");
@@ -1180,13 +1180,30 @@ FROM tracklist)");
void migrateFromV86(Session& session)
{
- utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings ADD COLUMN name TEXT NON NULL DEFAULT('')");
+ utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings ADD COLUMN name TEXT NOT NULL DEFAULT('')");
utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings RENAME COLUMN scan_version TO audio_scan_version");
}
void migrateFromV87(Session& session)
{
- utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings ADD COLUMN artists_to_not_split TEXT NON NULL DEFAULT('')");
+ utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings ADD COLUMN artists_to_not_split TEXT NOT NULL DEFAULT('')");
+ }
+
+ void migrateFromV88(Session& session)
+ {
+ // Badly populated mbid_matched fields for tracks and artist info: need to rescan everything
+ // Just increment the scan version of the settings to make the next scan rescan everything
+ utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET audio_scan_version = audio_scan_version + 1");
+ }
+
+ void migrateFromV89(Session& session)
+ {
+ // ArtistInfo need to be force rescanned: introduced a field for this
+ utils::executeCommand(*session.getDboSession(), "ALTER TABLE scan_settings ADD COLUMN artist_info_scan_version INTEGER NOT NULL DEFAULT(0)");
+ utils::executeCommand(*session.getDboSession(), "ALTER TABLE artist_info ADD COLUMN scan_version INTEGER NOT NULL DEFAULT(0)");
+
+ // Just increment the scan version of the settings to make the next scan rescan everything
+ utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET artist_info_scan_version = artist_info_scan_version + 1");
}
bool doDbMigration(Session& session)
@@ -1253,6 +1270,8 @@ FROM tracklist)");
{ 85, migrateFromV85 },
{ 86, migrateFromV86 },
{ 87, migrateFromV87 },
+ { 88, migrateFromV88 },
+ { 89, migrateFromV89 },
};
bool migrationPerformed{};
diff --git a/src/libs/database/include/database/ArtistInfo.hpp b/src/libs/database/include/database/ArtistInfo.hpp
index 9842e6b6..381fbca2 100644
--- a/src/libs/database/include/database/ArtistInfo.hpp
+++ b/src/libs/database/include/database/ArtistInfo.hpp
@@ -55,6 +55,7 @@ namespace lms::db
static void findWithArtistNameAmbiguity(Session& session, std::optional range, bool allowArtistMBIDFallback, const std::function& func);
// getters
+ std::size_t getScanVersion() const { return _scanVersion; }
const std::filesystem::path& getAbsoluteFilePath() const { return _absoluteFilePath; }
const Wt::WDateTime& getLastWriteTime() const { return _fileLastWrite; }
ObjectPtr getDirectory() const;
@@ -69,6 +70,7 @@ namespace lms::db
bool isMBIDMatched() const { return _MBIDMatched; }
// setters
+ void setScanVersion(std::size_t version) { _scanVersion = version; }
void setAbsoluteFilePath(const std::filesystem::path& filePath);
void setLastWriteTime(Wt::WDateTime time) { _fileLastWrite = time; }
void setDirectory(ObjectPtr directory);
@@ -84,6 +86,7 @@ namespace lms::db
template
void persist(Action& a)
{
+ Wt::Dbo::field(a, _scanVersion, "scan_version");
Wt::Dbo::field(a, _absoluteFilePath, "absolute_file_path");
Wt::Dbo::field(a, _fileLastWrite, "file_last_write");
@@ -104,6 +107,8 @@ namespace lms::db
friend class Session;
static pointer create(Session& session);
+ int _scanVersion{};
+
// Set when coming from artist info file
std::filesystem::path _absoluteFilePath;
std::string _fileStem;
diff --git a/src/libs/database/include/database/ScanSettings.hpp b/src/libs/database/include/database/ScanSettings.hpp
index 4e54ad2f..53af481f 100644
--- a/src/libs/database/include/database/ScanSettings.hpp
+++ b/src/libs/database/include/database/ScanSettings.hpp
@@ -64,6 +64,7 @@ namespace lms::db
// Getters
std::size_t getAudioScanVersion() const { return _audioScanVersion; }
+ std::size_t getArtistInfoScanVersion() const { return _artistInfoScanVersion; }
Wt::WTime getUpdateStartTime() const { return _startTime; }
UpdatePeriod getUpdatePeriod() const { return _updatePeriod; }
std::vector getExtraTagsToScan() const;
@@ -90,6 +91,7 @@ namespace lms::db
{
Wt::Dbo::field(a, _name, "name");
Wt::Dbo::field(a, _audioScanVersion, "audio_scan_version");
+ Wt::Dbo::field(a, _artistInfoScanVersion, "artist_info_scan_version");
Wt::Dbo::field(a, _startTime, "start_time");
Wt::Dbo::field(a, _updatePeriod, "update_period");
Wt::Dbo::field(a, _similarityEngineType, "similarity_engine_type");
@@ -111,6 +113,7 @@ namespace lms::db
std::string _name;
int _audioScanVersion{};
+ int _artistInfoScanVersion{};
Wt::WTime _startTime = Wt::WTime{ 0, 0, 0 };
UpdatePeriod _updatePeriod{ UpdatePeriod::Never };
SimilarityEngineType _similarityEngineType{ SimilarityEngineType::Clusters };
diff --git a/src/libs/metadata/bench/CMakeLists.txt b/src/libs/metadata/bench/CMakeLists.txt
index aa093de4..4e3a392d 100644
--- a/src/libs/metadata/bench/CMakeLists.txt
+++ b/src/libs/metadata/bench/CMakeLists.txt
@@ -1,6 +1,12 @@
add_executable(bench-metadata
LyricsBench.cpp
+ Metadata.cpp
+ )
+
+target_include_directories(bench-metadata PRIVATE
+ ../impl
+ ../test
)
target_link_libraries(bench-metadata PRIVATE
diff --git a/src/libs/metadata/bench/LyricsBench.cpp b/src/libs/metadata/bench/LyricsBench.cpp
index caa59ed5..2e1a213e 100644
--- a/src/libs/metadata/bench/LyricsBench.cpp
+++ b/src/libs/metadata/bench/LyricsBench.cpp
@@ -90,5 +90,3 @@ namespace lms::metadata::benchmarks
BENCHMARK(BM_Lyrics);
} // namespace lms::metadata::benchmarks
-
-BENCHMARK_MAIN();
\ No newline at end of file
diff --git a/src/libs/metadata/bench/Metadata.cpp b/src/libs/metadata/bench/Metadata.cpp
new file mode 100644
index 00000000..306788ca
--- /dev/null
+++ b/src/libs/metadata/bench/Metadata.cpp
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2024 Emeric Poupon
+ *
+ * This file is part of LMS.
+ *
+ * LMS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * LMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with LMS. If not, see .
+ */
+
+#include
+
+#include "AudioFileParser.hpp"
+#include "TestTagReader.hpp"
+#include "core/String.hpp"
+#include "metadata/Types.hpp"
+
+namespace lms::metadata::benchmarks
+{
+ class TestAudioFileParser : public AudioFileParser
+ {
+ public:
+ using AudioFileParser::AudioFileParser;
+ using AudioFileParser::parseMetaData;
+ };
+
+ static void BM_Metadata_parse(benchmark::State& state)
+ {
+ AudioFileParserParameters params;
+ params.userExtraTags = { "MY_AWESOME_TAG_A", "MY_AWESOME_TAG_B", "MY_AWESOME_MISSING_TAG" };
+
+ std::unique_ptr testTags{ tests::createDefaultPopulatedTestTagReader() };
+ const TestAudioFileParser parser{ params };
+ for (auto _ : state)
+ {
+ std::unique_ptr