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;