Can now download individual tracks
This commit is contained in:
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user