diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index 1bdb41fc..aa2f9f5e 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -32,6 +32,7 @@ #include "utils/Logger.hpp" #include "utils/String.hpp" +#include "resource/DownloadResource.hpp" #include "resource/ImageResource.hpp" #include "Filters.hpp" #include "LmsApplication.hpp" @@ -247,6 +248,8 @@ Release::refreshView() { tracksAction.emit(PlayQueueAction::PlayLast, {trackId}); }); + popup->addItem(Wt::WString::tr("Lms.Explore.download")) + ->setLink(Wt::WLink {std::make_unique(trackId)}); popup->popup(moreBtn); }); diff --git a/src/lms/ui/explore/TrackListHelpers.cpp b/src/lms/ui/explore/TrackListHelpers.cpp index 649f92d5..371fd586 100644 --- a/src/lms/ui/explore/TrackListHelpers.cpp +++ b/src/lms/ui/explore/TrackListHelpers.cpp @@ -27,6 +27,7 @@ #include "database/Artist.hpp" #include "database/Release.hpp" #include "database/Track.hpp" +#include "resource/DownloadResource.hpp" #include "resource/ImageResource.hpp" #include "LmsApplication.hpp" #include "MediaPlayer.hpp" @@ -103,6 +104,8 @@ namespace UserInterface::TrackListHelpers { tracksAction.emit(PlayQueueAction::PlayLast, {trackId}); }); + popup->addItem(Wt::WString::tr("Lms.Explore.download")) + ->setLink(Wt::WLink {std::make_unique(trackId)}); popup->popup(moreBtn); }); diff --git a/src/lms/ui/resource/DownloadResource.cpp b/src/lms/ui/resource/DownloadResource.cpp index dfa96f5d..4cd5f298 100644 --- a/src/lms/ui/resource/DownloadResource.cpp +++ b/src/lms/ui/resource/DownloadResource.cpp @@ -168,6 +168,32 @@ createZipper(const std::vector& tracks) return std::make_unique(files, Wt::WLocalDateTime::currentDateTime().toUTC()); } +DownloadArtistResource::DownloadArtistResource(Database::IdType artistId) +: _artistId {artistId} +{ + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + + Database::Artist::pointer artist {Database::Artist::getById(LmsApp->getDbSession(), artistId)}; + if (artist) + suggestFileName(getArtistPathName(artist) + ".zip"); +} + +std::unique_ptr +DownloadArtistResource::createZipper() +{ + Wt::WApplication::UpdateLock lock {LmsApp}; // DbSession are not thread safe + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + + const Database::Artist::pointer artist {Database::Artist::getById(LmsApp->getDbSession(), _artistId)}; + if (!artist) + { + LOG(DEBUG) << "Cannot find artist"; + return {}; + } + + return UserInterface::createZipper(artist->getTracks()); +} + DownloadReleaseResource::DownloadReleaseResource(Database::IdType releaseId) : _releaseId {releaseId} { @@ -195,30 +221,30 @@ DownloadReleaseResource::createZipper() return UserInterface::createZipper(release->getTracks()); } -DownloadArtistResource::DownloadArtistResource(Database::IdType artistId) -: _artistId {artistId} +DownloadTrackResource::DownloadTrackResource(Database::IdType trackId) +: _trackId {trackId} { auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - Database::Artist::pointer artist {Database::Artist::getById(LmsApp->getDbSession(), artistId)}; - if (artist) - suggestFileName(getArtistPathName(artist) + ".zip"); + Database::Track::pointer track {Database::Track::getById(LmsApp->getDbSession(), trackId)}; + if (track) + suggestFileName(getTrackPathName(track) + ".zip"); } std::unique_ptr -DownloadArtistResource::createZipper() +DownloadTrackResource::createZipper() { Wt::WApplication::UpdateLock lock {LmsApp}; // DbSession are not thread safe auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - const Database::Artist::pointer artist {Database::Artist::getById(LmsApp->getDbSession(), _artistId)}; - if (!artist) + const Database::Track::pointer track {Database::Track::getById(LmsApp->getDbSession(), _trackId)}; + if (!track) { - LOG(DEBUG) << "Cannot find artist"; + LOG(DEBUG) << "Cannot find track"; return {}; } - return UserInterface::createZipper(artist->getTracks()); + return UserInterface::createZipper({track}); } } // namespace UserInterface diff --git a/src/lms/ui/resource/DownloadResource.hpp b/src/lms/ui/resource/DownloadResource.hpp index 8b29ff8a..adc6ce76 100644 --- a/src/lms/ui/resource/DownloadResource.hpp +++ b/src/lms/ui/resource/DownloadResource.hpp @@ -40,16 +40,6 @@ class DownloadResource : public Wt::WResource virtual std::unique_ptr createZipper() = 0; }; -class DownloadReleaseResource : public DownloadResource -{ - public: - DownloadReleaseResource(Database::IdType releaseId); - - private: - std::unique_ptr createZipper() override; - Database::IdType _releaseId; -}; - class DownloadArtistResource : public DownloadResource { public: @@ -60,5 +50,25 @@ class DownloadArtistResource : public DownloadResource Database::IdType _artistId; }; +class DownloadReleaseResource : public DownloadResource +{ + public: + DownloadReleaseResource(Database::IdType releaseId); + + private: + std::unique_ptr createZipper() override; + Database::IdType _releaseId; +}; + +class DownloadTrackResource : public DownloadResource +{ + public: + DownloadTrackResource(Database::IdType trackId); + + private: + std::unique_ptr createZipper() override; + Database::IdType _trackId; +}; + } // namespace UserInterface