diff --git a/approot/messages.xml b/approot/messages.xml index b913e32e..9673b06a 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -177,6 +177,7 @@ Duration Filter added Filters +Label Music Library Most played MusicBrainz Artist diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index 34bb5cda..54920f49 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -177,6 +177,7 @@ Durée Filtre ajouté Filtres +Label Bibliothèque musicale Plus joués MusicBrainz Artist diff --git a/approot/messages_it.xml b/approot/messages_it.xml index 6c18325b..c7ee2ebd 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -177,6 +177,7 @@ Durata Filtro aggiunto Filtri +Etichetta Libreria musicale Più ascoltati Artista MusicBrainz diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml index 5ece9b62..6bb2b14d 100644 --- a/approot/messages_pl.xml +++ b/approot/messages_pl.xml @@ -194,6 +194,7 @@ Długość Filtr dodany Filtry +Wytwórnia Biblioteka muzyczna Najczęściej odtwarzane Artysta w MusicBrainz diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index de9ebbc1..8f0640fc 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -178,6 +178,7 @@ 过滤器已添加 过滤器 + 播放最多 MusicBrainz 歌手 MusicBrainz 专辑 diff --git a/approot/release.xml b/approot/release.xml index 1c80b1e3..8badeed3 100644 --- a/approot/release.xml +++ b/approot/release.xml @@ -132,6 +132,16 @@ ${} ${artist-table class="d-grid gap-2"} ${} + ${} +
+
+ ${tr:Lms.Explore.label} +
+
+ ${release-labels} +
+
+ ${
} ${}
diff --git a/src/libs/database/impl/Artist.cpp b/src/libs/database/impl/Artist.cpp index b602ae0b..8d3782bc 100644 --- a/src/libs/database/impl/Artist.cpp +++ b/src/libs/database/impl/Artist.cpp @@ -50,7 +50,8 @@ namespace lms::db || params.track.isValid() || params.release.isValid() || params.clusters.size() == 1 - || params.mediaLibrary.isValid()) + || params.mediaLibrary.isValid() + || params.label.isValid()) { query.join("track_artist_link t_a_l ON t_a_l.artist_id = a.id"); } @@ -59,7 +60,8 @@ namespace lms::db || params.sortMethod == ArtistSortMethod::AddedDesc || params.writtenAfter.isValid() || params.release.isValid() - || params.mediaLibrary.isValid()) + || params.mediaLibrary.isValid() + || params.label.isValid()) { query.join("track t ON t.id = t_a_l.track_id"); @@ -71,6 +73,12 @@ namespace lms::db if (params.mediaLibrary.isValid()) query.where("t.media_library_id = ?").bind(params.mediaLibrary); + + if (params.label.isValid()) + { + query.join("release_label r_l ON r_l.release_id = t.release_id"); + query.where("r_l.label_id = ?").bind(params.label); + } } if (params.linkType) diff --git a/src/libs/database/impl/Listen.cpp b/src/libs/database/impl/Listen.cpp index 9c5b6c17..0bf51cdb 100644 --- a/src/libs/database/impl/Listen.cpp +++ b/src/libs/database/impl/Listen.cpp @@ -42,10 +42,18 @@ namespace lms::db assert(!params.artist.isValid()); // poor check - if (params.library.isValid()) + if (params.library.isValid() || params.label.isValid()) { query.join("track t ON t.id = t_a_l.track_id"); + } + + if (params.library.isValid()) query.where("t.media_library_id = ?").bind(params.library); + + if (params.label.isValid()) + { + query.join("release_label r_l ON t.release_id = r_l.release_id"); + query.where("r_l.label_id = ?").bind(params.label); } if (params.linkType) @@ -113,6 +121,12 @@ namespace lms::db if (params.library.isValid()) query.where("t.media_library_id = ?").bind(params.library); + if (params.label.isValid()) + { + query.join("release_label r_l ON r_l.release_id = r.id"); + query.where("r_l.label_id = ?").bind(params.label); + } + if (!params.clusters.empty()) { std::ostringstream oss; @@ -160,6 +174,12 @@ namespace lms::db if (params.library.isValid()) query.where("t.media_library_id = ?").bind(params.library); + if (params.label.isValid()) + { + query.join("release_label r_l ON r_l.release_id = t.release_id"); + query.where("r_l.label_id = ?").bind(params.label); + } + if (!params.clusters.empty()) { std::ostringstream oss; diff --git a/src/libs/database/impl/Migration.cpp b/src/libs/database/impl/Migration.cpp index a75ca82f..08c8d31d 100644 --- a/src/libs/database/impl/Migration.cpp +++ b/src/libs/database/impl/Migration.cpp @@ -1074,6 +1074,9 @@ FROM tracklist)"); void migrateFromV81(Session& session) { + // Make sure we remove all the previoulsy created index, the createIndexesIfNeeded will recreate them all + dropIndexes(session); + // Add country + release country utils::executeCommand(*session.getDboSession(), R"(CREATE TABLE IF NOT EXISTS "country" ( "id" integer primary key autoincrement, diff --git a/src/libs/database/impl/Release.cpp b/src/libs/database/impl/Release.cpp index 6c19be1f..392dc3d2 100644 --- a/src/libs/database/impl/Release.cpp +++ b/src/libs/database/impl/Release.cpp @@ -28,6 +28,7 @@ #include "database/Image.hpp" #include "database/Session.hpp" #include "database/Track.hpp" +#include "database/Types.hpp" #include "database/User.hpp" #include "EnumSetTraits.hpp" @@ -76,6 +77,12 @@ namespace lms::db if (params.mediaLibrary.isValid()) query.where("t.media_library_id = ?").bind(params.mediaLibrary); + if (params.label.isValid()) + { + query.join("release_label r_l ON r_l.release_id = r.id"); + query.where("r_l.label_id = ?").bind(params.label); + } + if (params.directory.isValid()) query.where("t.directory_id = ?").bind(params.directory); @@ -332,6 +339,24 @@ namespace lms::db return utils::fetchQuerySingleResult(session.getDboSession()->query>("SELECT l from label l").where("l.name = ?").bind(name)); } + void Label::find(Session& session, LabelSortMethod sortMethod, std::function func) + { + session.checkReadTransaction(); + + auto query{ session.getDboSession()->find