diff --git a/approot/mediaplayer.xml b/approot/mediaplayer.xml
index f7b70da6..46f1078f 100644
--- a/approot/mediaplayer.xml
+++ b/approot/mediaplayer.xml
@@ -35,7 +35,7 @@
diff --git a/approot/messages.xml b/approot/messages.xml
index 36d4bedd..751053d9 100644
--- a/approot/messages.xml
+++ b/approot/messages.xml
@@ -68,7 +68,7 @@
Scanned {1} files in {2} on {3} ({4} errors, {5} duplicates)
No audio track
Duplicated file hash
-Duplicated MBID
+Duplicated recording MBID
Scan now
Scanner
Status
diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml
index bf3ba440..808cebb4 100644
--- a/approot/messages_fr.xml
+++ b/approot/messages_fr.xml
@@ -68,7 +68,7 @@
{1} fichiers scannés en {2} le {3} ({4} erreurs, {5} duplicatas)
Pas de piste audio
Hash dupliqué
-MBID dupliqué
+Recording MBID dupliqué
Lancer un scan
Scanner
Statut
diff --git a/approot/messages_it.xml b/approot/messages_it.xml
index f285e9dc..c3a3b895 100644
--- a/approot/messages_it.xml
+++ b/approot/messages_it.xml
@@ -67,7 +67,7 @@
Scansionati {1} files in {2} su {3} ({4} errori, {5} duplicati)
Nessuna traccia audio
Hash doppio
-MBID doppio
+Recording MBID doppio
Scansiona ora
Scanner
Stato
diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml
index e7f5dab7..cd3c18be 100644
--- a/approot/messages_zh.xml
+++ b/approot/messages_zh.xml
@@ -68,7 +68,7 @@
已扫描 {1} 文件 在 {2} 和 {3} ({4} 错误, {5} 副本)
没有音轨
复制文件哈希值
-复制 MBID
+复制 Recording MBID
立即扫描
扫描器
状态
diff --git a/approot/release.xml b/approot/release.xml
index b440c6c6..724dc1c1 100644
--- a/approot/release.xml
+++ b/approot/release.xml
@@ -16,7 +16,7 @@
${name}
${}${artists}${}
${}${tr:Lms.Explore.various-artists}
${}
- ${}${year}${}${} (${orig-year})${}
+ ${}${year}${} (${orig-year})${} · ${}${duration}
${clusters}
${play-btn class="Lms-explore-btn Lms-btn"}${more-btn class="Lms-explore-btn Lms-btn"}
diff --git a/conf/lms.conf b/conf/lms.conf
index ab0ba1c9..b44af624 100644
--- a/conf/lms.conf
+++ b/conf/lms.conf
@@ -70,3 +70,6 @@ cover-max-cache-size = 30;
# JPEG quality for covers (range is 1-100)
cover-jpeg-quality = 75;
+
+# Set to true if you want to hide duplicate tracks
+scanner-skip-duplicate-recording-mbid = false;
diff --git a/docroot/css/lms.css b/docroot/css/lms.css
index c2ff47ac..cf818f88 100644
--- a/docroot/css/lms.css
+++ b/docroot/css/lms.css
@@ -184,7 +184,7 @@ a.Lms-artistname:hover, a.Lms-artistname:focus {
}
.Lms-explore-release-entry {
- min-height: 34px;
+ min-height: 36px;
}
.Lms-explore-release-entry:hover .Lms-explore-release-entry-controls {
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c796f0e9..79236cc5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -4,8 +4,5 @@ add_subdirectory(libs)
add_subdirectory(lms)
add_subdirectory(tools)
-if(BUILD_TESTING)
- add_subdirectory(test)
-endif()
diff --git a/src/libs/CMakeLists.txt b/src/libs/CMakeLists.txt
index e8c1413c..ca904a17 100644
--- a/src/libs/CMakeLists.txt
+++ b/src/libs/CMakeLists.txt
@@ -1,14 +1,7 @@
-
-add_subdirectory(auth)
add_subdirectory(av)
-add_subdirectory(cover)
-add_subdirectory(database)
+add_subdirectory(image)
add_subdirectory(metadata)
-add_subdirectory(recommendation)
-add_subdirectory(scanner)
-add_subdirectory(scrobbling)
+add_subdirectory(services)
add_subdirectory(som)
add_subdirectory(subsonic)
add_subdirectory(utils)
-
-
diff --git a/src/libs/av/impl/Transcoder.cpp b/src/libs/av/impl/Transcoder.cpp
index 7efa0442..55b00d1b 100644
--- a/src/libs/av/impl/Transcoder.cpp
+++ b/src/libs/av/impl/Transcoder.cpp
@@ -119,7 +119,6 @@ Transcoder::start()
args.emplace_back("-b:a");
args.emplace_back(std::to_string(_parameters.bitrate));
-
// Codecs and formats
switch (_parameters.format)
{
diff --git a/src/libs/av/include/av/TranscodeParameters.hpp b/src/libs/av/include/av/TranscodeParameters.hpp
index 7449e2d9..c155f6e7 100644
--- a/src/libs/av/include/av/TranscodeParameters.hpp
+++ b/src/libs/av/include/av/TranscodeParameters.hpp
@@ -24,16 +24,15 @@
#include "Types.hpp"
-namespace Av {
-
-struct TranscodeParameters
+namespace Av
{
- Format format;
- std::size_t bitrate {128000};
- std::optional stream; // Id of the stream to be transcoded (auto detect by default)
- std::chrono::milliseconds offset {0};
- bool stripMetadata {true};
-};
-
+ struct TranscodeParameters
+ {
+ Format format;
+ std::size_t bitrate {128000};
+ std::optional stream; // Id of the stream to be transcoded (auto detect by default)
+ std::chrono::milliseconds offset {0};
+ bool stripMetadata {true};
+ };
} // namespace Av
diff --git a/src/libs/av/include/av/Types.hpp b/src/libs/av/include/av/Types.hpp
index d1cc4cb5..166a19da 100644
--- a/src/libs/av/include/av/Types.hpp
+++ b/src/libs/av/include/av/Types.hpp
@@ -33,12 +33,11 @@ namespace Av {
enum class Format
{
- // Values are important and must not be changed (stored in the UI's localstorage)
- MP3 = 0,
- OGG_OPUS = 1,
- MATROSKA_OPUS = 2,
- OGG_VORBIS = 3,
- WEBM_VORBIS = 4,
+ MP3,
+ OGG_OPUS,
+ MATROSKA_OPUS,
+ OGG_VORBIS,
+ WEBM_VORBIS,
};
std::string_view formatToMimetype(Format format);
diff --git a/src/libs/cover/CMakeLists.txt b/src/libs/cover/CMakeLists.txt
deleted file mode 100644
index a675db76..00000000
--- a/src/libs/cover/CMakeLists.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-
-add_library(lmscover SHARED
- impl/CoverArtGrabber.cpp
- )
-
-target_include_directories(lmscover INTERFACE
- include
- )
-
-target_include_directories(lmscover PRIVATE
- include
- impl
- )
-
-target_link_libraries(lmscover PRIVATE
- lmsav
- )
-
-target_link_libraries(lmscover PUBLIC
- lmsdatabase
- lmsutils
- std::filesystem
- )
-
-if (IMAGE_LIBRARY STREQUAL STB)
- target_sources(lmscover PRIVATE
- impl/stb/JPEGImage.cpp
- impl/stb/RawImage.cpp
- )
- target_compile_options(lmscover PRIVATE "-DLMS_SUPPORT_IMAGE_STB")
- target_include_directories(lmscover PRIVATE ${STB_INCLUDE_DIR})
-elseif (IMAGE_LIBRARY STREQUAL GraphicsMagick++)
- target_sources(lmscover PRIVATE
- impl/graphicsmagick/JPEGImage.cpp
- impl/graphicsmagick/RawImage.cpp
- )
- target_compile_options(lmscover PRIVATE "-DLMS_SUPPORT_IMAGE_GM")
- target_link_libraries(lmscover PRIVATE PkgConfig::GraphicsMagick++)
-else ()
- message(FATAL_ERROR "Invalid IMAGE_LIBRARY provided")
-endif()
-
-install(TARGETS lmscover DESTINATION lib)
-
diff --git a/src/libs/database/impl/Session.cpp b/src/libs/database/impl/Session.cpp
deleted file mode 100644
index 56ec77d1..00000000
--- a/src/libs/database/impl/Session.cpp
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Copyright (C) 2020 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 "database/Session.hpp"
-
-#include