Can now download individual tracks

This commit is contained in:
emeric
2020-09-02 19:46:15 +02:00
parent 72763850bb
commit 64f476ceca
4 changed files with 62 additions and 20 deletions
+3
View File
@@ -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<DownloadTrackResource>(trackId)});
popup->popup(moreBtn);
});
+3
View File
@@ -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<DownloadTrackResource>(trackId)});
popup->popup(moreBtn);
});
+36 -10
View File
@@ -168,6 +168,32 @@ createZipper(const std::vector<Database::Track::pointer>& tracks)
return std::make_unique<Zip::Zipper>(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<Zip::Zipper>
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<Zip::Zipper>
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
+20 -10
View File
@@ -40,16 +40,6 @@ class DownloadResource : public Wt::WResource
virtual std::unique_ptr<Zip::Zipper> createZipper() = 0;
};
class DownloadReleaseResource : public DownloadResource
{
public:
DownloadReleaseResource(Database::IdType releaseId);
private:
std::unique_ptr<Zip::Zipper> 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<Zip::Zipper> createZipper() override;
Database::IdType _releaseId;
};
class DownloadTrackResource : public DownloadResource
{
public:
DownloadTrackResource(Database::IdType trackId);
private:
std::unique_ptr<Zip::Zipper> createZipper() override;
Database::IdType _trackId;
};
} // namespace UserInterface