Now displaying other versions of the release, ref #568

This commit is contained in:
emeric
2025-02-17 19:27:45 +01:00
parent f96f0d6377
commit 506e2c45db
10 changed files with 74 additions and 23 deletions
+2 -1
View File
@@ -250,9 +250,10 @@
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.similar-releases">Similar albums</message>
<message id="Lms.Explore.Release.copyright">Copyright</message>
<message id="Lms.Explore.Release.disc">Disc {1}</message>
<message id="Lms.Explore.Release.other-versions">Other versions</message>
<message id="Lms.Explore.Release.similar-releases">Similar albums</message>
<message id="Lms.Explore.Release.type">Type</message>
<message id="Lms.Explore.Release.type-primary-album">Album</message>
<message id="Lms.Explore.Release.type-primary-broadcast">Broadcast</message>
+2 -1
View File
@@ -250,9 +250,10 @@
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.similar-releases">Albums similaires</message>
<message id="Lms.Explore.Release.copyright">Copyright</message>
<message id="Lms.Explore.Release.disc">Disque {1}</message>
<message id="Lms.Explore.Release.other-versions">Autres versions</message>
<message id="Lms.Explore.Release.similar-releases">Albums similaires</message>
<message id="Lms.Explore.Release.type">Type</message>
<message id="Lms.Explore.Release.type-primary-album">Album</message>
<message id="Lms.Explore.Release.type-primary-broadcast">Diffusion</message>
+2 -1
View File
@@ -250,9 +250,10 @@
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.similar-releases">Album simili</message>
<message id="Lms.Explore.Release.copyright">Copyright</message>
<message id="Lms.Explore.Release.disc">Disco {1}</message>
<message id="Lms.Explore.Release.other-versions">Altre versioni</message>
<message id="Lms.Explore.Release.similar-releases">Album simili</message>
<message id="Lms.Explore.Release.type">Tipo</message>
<message id="Lms.Explore.Release.type-primary-album">Album</message>
<message id="Lms.Explore.Release.type-primary-broadcast">Trasmissione</message>
+2 -1
View File
@@ -276,9 +276,10 @@
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.similar-releases">Podobne albumy</message>
<message id="Lms.Explore.Release.copyright">Prawa autorskie</message>
<message id="Lms.Explore.Release.disc">Dysk {1}</message>
<message id="Lms.Explore.Release.other-versions">Inne wersje</message>
<message id="Lms.Explore.Release.similar-releases">Podobne albumy</message>
<message id="Lms.Explore.Release.type">Typ</message>
<message id="Lms.Explore.Release.type-primary-album">Album</message>
<message id="Lms.Explore.Release.type-primary-broadcast">Audycja</message>
+2 -1
View File
@@ -250,10 +250,11 @@
<!--Explore:Release-->
<message id="Lms.Explore.Release.similar-releases">相似专辑</message>
<message id="Lms.Explore.Release.copyright">版权所有</message>
<message id="Lms.Explore.Release.disc">唱片 {1}</message>
<message id="Lms.Explore.Release.similar-releases">相似专辑</message>
+4
View File
@@ -39,6 +39,10 @@
${</if-has-copyright>}
</div>
</div>
${<if-has-other-versions>}
<h3>${tr:Lms.Explore.Release.other-versions}</h3>
${other-versions class="row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 gx-2 gy-4"}
${</if-has-other-versions>}
${<if-has-similar-releases>}
<h3>${tr:Lms.Explore.Release.similar-releases}</h3>
${similar-releases class="row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 gx-2 gy-4"}
+24 -14
View File
@@ -23,6 +23,7 @@
#include <Wt/WImage.h>
#include <Wt/WText.h>
#include "core/EnumSet.hpp"
#include "database/Artist.hpp"
#include "database/Release.hpp"
@@ -34,9 +35,15 @@ namespace lms::ui::releaseListHelpers
namespace
{
std::unique_ptr<Wt::WTemplate> 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::WTemplate>(Wt::WString::tr(templateKey)) };
ShowArtist,
ShowYear,
};
std::unique_ptr<Wt::WTemplate> createEntryInternal(const Release::pointer& release, const Artist::pointer& artist, core::EnumSet<ReleaseOptions> options)
{
auto entry{ std::make_unique<Wt::WTemplate>(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<Wt::WTemplate> 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<Wt::WTemplate> createEntry(const Release::pointer& release)
{
return createEntry(release, Artist::pointer{}, false /*year*/);
return createEntryInternal(release, Artist::pointer{}, core::EnumSet<ReleaseOptions>{ ReleaseOptions::ShowArtist });
}
std::unique_ptr<Wt::WTemplate> createEntryForArtist(const db::Release::pointer& release, const db::Artist::pointer& artist)
{
return createEntry(release, artist, true);
return createEntryInternal(release, artist, core::EnumSet<ReleaseOptions>{ ReleaseOptions::ShowArtist, ReleaseOptions::ShowYear });
}
std::unique_ptr<Wt::WTemplate> createEntryForOtherVersions(const db::ObjectPtr<db::Release>& release)
{
return createEntryInternal(release, Artist::pointer{}, core::EnumSet<ReleaseOptions>{ ReleaseOptions::ShowYear });
}
} // namespace lms::ui::releaseListHelpers
+1
View File
@@ -40,6 +40,7 @@ namespace lms::ui::releaseListHelpers
{
std::unique_ptr<Wt::WTemplate> createEntry(const db::ObjectPtr<db::Release>& release);
std::unique_ptr<Wt::WTemplate> createEntryForArtist(const db::ObjectPtr<db::Release>& release, const db::ObjectPtr<db::Artist>& artist);
std::unique_ptr<Wt::WTemplate> createEntryForOtherVersions(const db::ObjectPtr<db::Release>& release);
} // namespace lms::ui::releaseListHelpers
namespace lms::ui::releaseHelpers
+33 -3
View File
@@ -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<ReleaseId>& 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<Wt::WContainerWidget>("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<ReleaseId>& similarReleaseIds)
{
if (similarReleaseIds.empty())
return;
setCondition("if-has-similar-releases", true);
auto* similarReleasesContainer{ bindNew<Wt::WContainerWidget>("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)
+2 -1
View File
@@ -44,7 +44,8 @@ namespace lms::ui
void refreshReleaseArtists(const db::ObjectPtr<db::Release>& release);
void refreshCopyright(const db::ObjectPtr<db::Release>& release);
void refreshLinks(const db::ObjectPtr<db::Release>& release);
void refreshSimilarReleases(const std::vector<db::ReleaseId>& similarReleasesId);
void refreshOtherVersions(const db::ObjectPtr<db::Release>& release);
void refreshSimilarReleases(const std::vector<db::ReleaseId>& similarReleaseIds);
Filters& _filters;
PlayQueueController& _playQueueController;