diff --git a/approot/messages.xml b/approot/messages.xml
index 04bc9e86..c82129b1 100644
--- a/approot/messages.xml
+++ b/approot/messages.xml
@@ -250,9 +250,10 @@
-Similar albums
Copyright
Disc {1}
+Other versions
+Similar albums
Type
Album
Broadcast
diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml
index 6b082834..8083fc56 100644
--- a/approot/messages_fr.xml
+++ b/approot/messages_fr.xml
@@ -250,9 +250,10 @@
-Albums similaires
Copyright
Disque {1}
+Autres versions
+Albums similaires
Type
Album
Diffusion
diff --git a/approot/messages_it.xml b/approot/messages_it.xml
index 63fdce7e..567097ab 100644
--- a/approot/messages_it.xml
+++ b/approot/messages_it.xml
@@ -250,9 +250,10 @@
-Album simili
Copyright
Disco {1}
+Altre versioni
+Album simili
Tipo
Album
Trasmissione
diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml
index 305e4a30..ac97014a 100644
--- a/approot/messages_pl.xml
+++ b/approot/messages_pl.xml
@@ -276,9 +276,10 @@
-Podobne albumy
Prawa autorskie
Dysk {1}
+Inne wersje
+Podobne albumy
Typ
Album
Audycja
diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml
index 5193f55f..21e240fa 100644
--- a/approot/messages_zh.xml
+++ b/approot/messages_zh.xml
@@ -250,10 +250,11 @@
-相似专辑
版权所有
唱片 {1}
+相似专辑
+
diff --git a/approot/release.xml b/approot/release.xml
index 128582d2..448006e3 100644
--- a/approot/release.xml
+++ b/approot/release.xml
@@ -39,6 +39,10 @@
${}
+ ${}
+ ${tr:Lms.Explore.Release.other-versions}
+ ${other-versions class="row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 gx-2 gy-4"}
+ ${}
${}
${tr:Lms.Explore.Release.similar-releases}
${similar-releases class="row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 gx-2 gy-4"}
diff --git a/src/lms/ui/explore/ReleaseHelpers.cpp b/src/lms/ui/explore/ReleaseHelpers.cpp
index 09bda9be..1acfa647 100644
--- a/src/lms/ui/explore/ReleaseHelpers.cpp
+++ b/src/lms/ui/explore/ReleaseHelpers.cpp
@@ -23,6 +23,7 @@
#include
#include
+#include "core/EnumSet.hpp"
#include "database/Artist.hpp"
#include "database/Release.hpp"
@@ -34,9 +35,15 @@ namespace lms::ui::releaseListHelpers
namespace
{
- std::unique_ptr createEntryInternal(const Release::pointer& release, const std::string& templateKey, const Artist::pointer& artist, const bool showYear)
+ enum class ReleaseOptions
{
- auto entry{ std::make_unique(Wt::WString::tr(templateKey)) };
+ ShowArtist,
+ ShowYear,
+ };
+
+ std::unique_ptr createEntryInternal(const Release::pointer& release, const Artist::pointer& artist, core::EnumSet options)
+ {
+ auto entry{ std::make_unique(Wt::WString::tr("Lms.Explore.Releases.template.entry-grid")) };
entry->bindWidget("release-name", utils::createReleaseAnchor(release));
entry->addFunction("tr", &Wt::WTemplate::Functions::tr);
@@ -48,14 +55,17 @@ namespace lms::ui::releaseListHelpers
anchor->setImage(std::move(image));
}
- auto artistAnchors{ utils::createArtistsAnchorsForRelease(release, artist ? artist->getId() : ArtistId{}, "link-secondary") };
- if (artistAnchors)
+ if (options.contains(ReleaseOptions::ShowArtist))
{
- entry->setCondition("if-has-artist", true);
- entry->bindWidget("artist-name", std::move(artistAnchors));
+ auto artistAnchors{ utils::createArtistsAnchorsForRelease(release, artist ? artist->getId() : ArtistId{}, "link-secondary") };
+ if (artistAnchors)
+ {
+ entry->setCondition("if-has-artist", true);
+ entry->bindWidget("artist-name", std::move(artistAnchors));
+ }
}
- if (showYear)
+ if (options.contains(ReleaseOptions::ShowYear))
{
Wt::WString year{ releaseHelpers::buildReleaseYearString(release->getYear(), release->getOriginalYear()) };
if (!year.empty())
@@ -69,19 +79,19 @@ namespace lms::ui::releaseListHelpers
}
} // namespace
- std::unique_ptr createEntry(const Release::pointer& release, const Artist::pointer& artist, bool showYear)
- {
- return createEntryInternal(release, "Lms.Explore.Releases.template.entry-grid", artist, showYear);
- }
-
std::unique_ptr createEntry(const Release::pointer& release)
{
- return createEntry(release, Artist::pointer{}, false /*year*/);
+ return createEntryInternal(release, Artist::pointer{}, core::EnumSet{ ReleaseOptions::ShowArtist });
}
std::unique_ptr createEntryForArtist(const db::Release::pointer& release, const db::Artist::pointer& artist)
{
- return createEntry(release, artist, true);
+ return createEntryInternal(release, artist, core::EnumSet{ ReleaseOptions::ShowArtist, ReleaseOptions::ShowYear });
+ }
+
+ std::unique_ptr createEntryForOtherVersions(const db::ObjectPtr& release)
+ {
+ return createEntryInternal(release, Artist::pointer{}, core::EnumSet{ ReleaseOptions::ShowYear });
}
} // namespace lms::ui::releaseListHelpers
diff --git a/src/lms/ui/explore/ReleaseHelpers.hpp b/src/lms/ui/explore/ReleaseHelpers.hpp
index 791a9a2e..4bd0eea2 100644
--- a/src/lms/ui/explore/ReleaseHelpers.hpp
+++ b/src/lms/ui/explore/ReleaseHelpers.hpp
@@ -40,6 +40,7 @@ namespace lms::ui::releaseListHelpers
{
std::unique_ptr createEntry(const db::ObjectPtr& release);
std::unique_ptr createEntryForArtist(const db::ObjectPtr& release, const db::ObjectPtr& artist);
+ std::unique_ptr createEntryForOtherVersions(const db::ObjectPtr& release);
} // namespace lms::ui::releaseListHelpers
namespace lms::ui::releaseHelpers
diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp
index a8507f0b..343b03d1 100644
--- a/src/lms/ui/explore/ReleaseView.cpp
+++ b/src/lms/ui/explore/ReleaseView.cpp
@@ -238,6 +238,7 @@ namespace lms::ui
refreshCopyright(release);
refreshLinks(release);
+ refreshOtherVersions(release);
refreshSimilarReleases(similarReleasesIds);
bindString("name", Wt::WString::fromUTF8(std::string{ release->getName() }), Wt::TextFormat::Plain);
@@ -560,15 +561,44 @@ namespace lms::ui
}
}
- void Release::refreshSimilarReleases(const std::vector& similarReleasesId)
+ void Release::refreshOtherVersions(const db::Release::pointer& release)
{
- if (similarReleasesId.empty())
+ const auto groupMBID{ release->getGroupMBID() };
+ if (!groupMBID)
+ return;
+
+ db::Release::FindParameters params;
+ params.setReleaseGroupMBID(groupMBID);
+
+ const auto releaseIds{ db::Release::findIds(LmsApp->getDbSession(), params) };
+ if (releaseIds.results.size() <= 1)
+ return;
+
+ setCondition("if-has-other-versions", true);
+ auto* container{ bindNew("other-versions") };
+
+ for (const ReleaseId id : releaseIds.results)
+ {
+ if (id == _releaseId)
+ continue;
+
+ const db::Release::pointer release{ db::Release::find(LmsApp->getDbSession(), id) };
+ if (!release)
+ continue;
+
+ container->addWidget(releaseListHelpers::createEntryForOtherVersions(release));
+ }
+ }
+
+ void Release::refreshSimilarReleases(const std::vector& similarReleaseIds)
+ {
+ if (similarReleaseIds.empty())
return;
setCondition("if-has-similar-releases", true);
auto* similarReleasesContainer{ bindNew("similar-releases") };
- for (const ReleaseId id : similarReleasesId)
+ for (const ReleaseId id : similarReleaseIds)
{
const db::Release::pointer similarRelease{ db::Release::find(LmsApp->getDbSession(), id) };
if (!similarRelease)
diff --git a/src/lms/ui/explore/ReleaseView.hpp b/src/lms/ui/explore/ReleaseView.hpp
index b874a809..87a17a67 100644
--- a/src/lms/ui/explore/ReleaseView.hpp
+++ b/src/lms/ui/explore/ReleaseView.hpp
@@ -44,7 +44,8 @@ namespace lms::ui
void refreshReleaseArtists(const db::ObjectPtr& release);
void refreshCopyright(const db::ObjectPtr& release);
void refreshLinks(const db::ObjectPtr& release);
- void refreshSimilarReleases(const std::vector& similarReleasesId);
+ void refreshOtherVersions(const db::ObjectPtr& release);
+ void refreshSimilarReleases(const std::vector& similarReleaseIds);
Filters& _filters;
PlayQueueController& _playQueueController;