diff --git a/approot/messages.xml b/approot/messages.xml index cf0918e3..87f6afde 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -60,6 +60,7 @@ Add filter Artists Most played artists +Most played releases Albums Search... Show more diff --git a/approot/releases.xml b/approot/releases.xml index 69f6864f..a77d74c6 100644 --- a/approot/releases.xml +++ b/approot/releases.xml @@ -3,6 +3,10 @@ + + ${tr:Lms.Explore.most-played-releases} + + ${most-played-releases} ${tr:Lms.Explore.releases} @@ -24,6 +28,12 @@ + + ${cover} + ${release-name} + ${}${artist-name}${} + + diff --git a/src/ui/explore/ReleasesView.cpp b/src/ui/explore/ReleasesView.cpp index c823a79f..3220cefd 100644 --- a/src/ui/explore/ReleasesView.cpp +++ b/src/ui/explore/ReleasesView.cpp @@ -26,6 +26,7 @@ #include #include "database/Release.hpp" +#include "database/TrackStats.hpp" #include "utils/Logger.hpp" #include "utils/Utils.hpp" @@ -50,6 +51,7 @@ _filters(filters) _search->textInput().connect(this, &Releases::refresh); _releasesContainer = bindNew("releases"); + _mostPlayedReleasesContainer = bindNew("most-played-releases"); _showMore = bindNew("show-more", Wt::WString::tr("Lms.Explore.show-more")); _showMore->addFunction("tr", &Wt::WTemplate::Functions::tr); @@ -58,11 +60,46 @@ _filters(filters) addSome(); })); + refreshMostPlayed(); refresh(); filters->updated().connect(this, &Releases::refresh); } +void +Releases::refreshMostPlayed() +{ + _mostPlayedReleasesContainer->clear(); + + Wt::Dbo::Transaction transaction(LmsApp->getDboSession()); + + auto releases = TrackStats::getMostPlayedReleases(LmsApp->getDboSession(), LmsApp->getCurrentUser(), 5); + + for (auto release : releases) + { + Wt::WTemplate* entry = _mostPlayedReleasesContainer->addNew(Wt::WString::tr("Lms.Explore.Releases.template.most-played-entry")); + + entry->bindWidget("release-name", LmsApplication::createReleaseAnchor(release)); + + Wt::WAnchor* anchor = entry->bindWidget("cover", LmsApplication::createReleaseAnchor(release, false)); + auto cover = std::make_unique(); + cover->setImageLink(LmsApp->getImageResource()->getReleaseUrl(release.id(), 128)); + anchor->setImage(std::move(cover)); + + auto artists = release->getArtists(); + if (artists.size() > 1) + { + entry->setCondition("if-has-artist", true); + entry->bindString("artist-name", Wt::WString::tr("Lms.Explore.various-artists")); + } + else if (artists.size() == 1) + { + entry->setCondition("if-has-artist", true); + entry->bindWidget("artist-name", LmsApplication::createArtistAnchor(artists.front())); + } + } +} + void Releases::refresh() { diff --git a/src/ui/explore/ReleasesView.hpp b/src/ui/explore/ReleasesView.hpp index eec4ec62..934afeeb 100644 --- a/src/ui/explore/ReleasesView.hpp +++ b/src/ui/explore/ReleasesView.hpp @@ -39,6 +39,7 @@ class Releases : public Wt::WTemplate Wt::Signal releasePlay; private: + void refreshMostPlayed(); void refresh(); void addSome(); @@ -46,6 +47,7 @@ class Releases : public Wt::WTemplate Wt::WTemplate* _showMore; Wt::WLineEdit* _search; Wt::WContainerWidget* _releasesContainer; + Wt::WContainerWidget* _mostPlayedReleasesContainer; }; } // namespace UserInterface