mirror of
https://github.com/clangen/musikcube.git
synced 2025-04-16 14:42:41 +00:00
Updated WebSocketServer to support creating new playlists from
subqueries, the same way appending playlists does.
This commit is contained in:
parent
d73178ed4e
commit
3f85bf00e3
@ -265,9 +265,10 @@ IMapList* LocalSimpleDataProvider::QueryAlbums(const char* filter) {
|
|||||||
return this->QueryAlbums(nullptr, -1, filter);
|
return this->QueryAlbums(nullptr, -1, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TrackListType>
|
||||||
static uint64_t savePlaylist(
|
static uint64_t savePlaylist(
|
||||||
ILibraryPtr library,
|
ILibraryPtr library,
|
||||||
std::shared_ptr<TrackList> trackList,
|
TrackListType trackList,
|
||||||
const char* playlistName,
|
const char* playlistName,
|
||||||
const int64_t playlistId)
|
const int64_t playlistId)
|
||||||
{
|
{
|
||||||
@ -275,7 +276,7 @@ static uint64_t savePlaylist(
|
|||||||
/* replacing (and optionally renaming) an existing playlist */
|
/* replacing (and optionally renaming) an existing playlist */
|
||||||
if (playlistId != 0) {
|
if (playlistId != 0) {
|
||||||
std::shared_ptr<SavePlaylistQuery> query =
|
std::shared_ptr<SavePlaylistQuery> query =
|
||||||
SavePlaylistQuery::Replace(playlistId, trackList);
|
SavePlaylistQuery::Replace(library, playlistId, trackList);
|
||||||
|
|
||||||
library->Enqueue(query, ILibrary::QuerySynchronous);
|
library->Enqueue(query, ILibrary::QuerySynchronous);
|
||||||
|
|
||||||
@ -296,7 +297,7 @@ static uint64_t savePlaylist(
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::shared_ptr<SavePlaylistQuery> query =
|
std::shared_ptr<SavePlaylistQuery> query =
|
||||||
SavePlaylistQuery::Save(playlistName, trackList);
|
SavePlaylistQuery::Save(library, playlistName, trackList);
|
||||||
|
|
||||||
library->Enqueue(query, ILibrary::QuerySynchronous);
|
library->Enqueue(query, ILibrary::QuerySynchronous);
|
||||||
|
|
||||||
@ -352,8 +353,21 @@ int64_t LocalSimpleDataProvider::SavePlaylistWithExternalIds(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t LocalSimpleDataProvider::SavePlaylistWithTrackList(
|
||||||
|
ITrackList* trackList,
|
||||||
|
const char* playlistName,
|
||||||
|
const int64_t playlistId)
|
||||||
|
{
|
||||||
|
if (playlistId == 0 && (!playlistName || !strlen(playlistName))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return savePlaylist(this->library, trackList, playlistName, playlistId);
|
||||||
|
}
|
||||||
|
|
||||||
bool LocalSimpleDataProvider::RenamePlaylist(const int64_t playlistId, const char* name)
|
bool LocalSimpleDataProvider::RenamePlaylist(const int64_t playlistId, const char* name)
|
||||||
{
|
{
|
||||||
|
if (strlen(name)) {
|
||||||
try {
|
try {
|
||||||
std::shared_ptr<SavePlaylistQuery> query =
|
std::shared_ptr<SavePlaylistQuery> query =
|
||||||
SavePlaylistQuery::Rename(playlistId, name);
|
SavePlaylistQuery::Rename(playlistId, name);
|
||||||
@ -367,6 +381,7 @@ bool LocalSimpleDataProvider::RenamePlaylist(const int64_t playlistId, const cha
|
|||||||
catch (...) {
|
catch (...) {
|
||||||
musik::debug::err(TAG, "RenamePlaylist failed");
|
musik::debug::err(TAG, "RenamePlaylist failed");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,11 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
const char* playlistName,
|
const char* playlistName,
|
||||||
const int64_t playlistId = 0) override;
|
const int64_t playlistId = 0) override;
|
||||||
|
|
||||||
|
virtual int64_t SavePlaylistWithTrackList(
|
||||||
|
musik::core::sdk::ITrackList* trackList,
|
||||||
|
const char* playlistName,
|
||||||
|
const int64_t playlistId = 0) override;
|
||||||
|
|
||||||
virtual bool RenamePlaylist(
|
virtual bool RenamePlaylist(
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
const char* name) override;
|
const char* name) override;
|
||||||
|
@ -36,6 +36,8 @@
|
|||||||
#include "SavePlaylistQuery.h"
|
#include "SavePlaylistQuery.h"
|
||||||
#include "CategoryTrackListQuery.h"
|
#include "CategoryTrackListQuery.h"
|
||||||
|
|
||||||
|
#include <core/library/track/LibraryTrack.h>
|
||||||
|
#include <core/library/query/local/TrackMetadataQuery.h>
|
||||||
#include <core/db/ScopedTransaction.h>
|
#include <core/db/ScopedTransaction.h>
|
||||||
#include <core/db/Statement.h>
|
#include <core/db/Statement.h>
|
||||||
|
|
||||||
@ -43,6 +45,8 @@ using namespace musik::core;
|
|||||||
using namespace musik::core::db;
|
using namespace musik::core::db;
|
||||||
using namespace musik::core::db::local;
|
using namespace musik::core::db::local;
|
||||||
|
|
||||||
|
/* CONSTANTS */
|
||||||
|
|
||||||
static std::string CREATE_PLAYLIST_QUERY =
|
static std::string CREATE_PLAYLIST_QUERY =
|
||||||
"INSERT INTO playlists (name) VALUES (?);";
|
"INSERT INTO playlists (name) VALUES (?);";
|
||||||
|
|
||||||
@ -58,12 +62,24 @@ static std::string RENAME_PLAYLIST_QUERY =
|
|||||||
static std::string GET_MAX_SORT_ORDER_QUERY =
|
static std::string GET_MAX_SORT_ORDER_QUERY =
|
||||||
"SELECT MAX(sort_order) from playlist_tracks where playlist_id = ?";
|
"SELECT MAX(sort_order) from playlist_tracks where playlist_id = ?";
|
||||||
|
|
||||||
|
/* STATIC FACTORY METHODS */
|
||||||
|
|
||||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Save(
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Save(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const std::string& playlistName,
|
const std::string& playlistName,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks)
|
std::shared_ptr<musik::core::TrackList> tracks)
|
||||||
{
|
{
|
||||||
return std::shared_ptr<SavePlaylistQuery>(
|
return std::shared_ptr<SavePlaylistQuery>(
|
||||||
new SavePlaylistQuery(playlistName, tracks));
|
new SavePlaylistQuery(library, playlistName, tracks));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Save(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const std::string& playlistName,
|
||||||
|
musik::core::sdk::ITrackList* tracks)
|
||||||
|
{
|
||||||
|
return std::shared_ptr<SavePlaylistQuery>(
|
||||||
|
new SavePlaylistQuery(library, playlistName, tracks));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Save(
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Save(
|
||||||
@ -77,11 +93,21 @@ std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Save(
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Replace(
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Replace(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks)
|
std::shared_ptr<musik::core::TrackList> tracks)
|
||||||
{
|
{
|
||||||
return std::shared_ptr<SavePlaylistQuery>(
|
return std::shared_ptr<SavePlaylistQuery>(
|
||||||
new SavePlaylistQuery(playlistId, tracks));
|
new SavePlaylistQuery(library, playlistId, tracks));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Replace(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const int64_t playlistId,
|
||||||
|
musik::core::sdk::ITrackList* tracks)
|
||||||
|
{
|
||||||
|
return std::shared_ptr<SavePlaylistQuery>(
|
||||||
|
new SavePlaylistQuery(library, playlistId, tracks));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Rename(
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Rename(
|
||||||
@ -92,16 +118,20 @@ std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Rename(
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Append(
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Append(
|
||||||
const int64_t playlistId, std::shared_ptr<musik::core::TrackList> tracks)
|
musik::core::ILibraryPtr library,
|
||||||
|
const int64_t playlistId,
|
||||||
|
std::shared_ptr<musik::core::TrackList> tracks)
|
||||||
{
|
{
|
||||||
auto result = std::shared_ptr<SavePlaylistQuery>(
|
auto result = std::shared_ptr<SavePlaylistQuery>(
|
||||||
new SavePlaylistQuery(playlistId, tracks));
|
new SavePlaylistQuery(library, playlistId, tracks));
|
||||||
|
|
||||||
result->op = AppendOp;
|
result->op = AppendOp;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* CONSTRUCTORS */
|
||||||
|
|
||||||
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Append(
|
std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Append(
|
||||||
musik::core::ILibraryPtr library,
|
musik::core::ILibraryPtr library,
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
@ -117,16 +147,31 @@ std::shared_ptr<SavePlaylistQuery> SavePlaylistQuery::Append(
|
|||||||
}
|
}
|
||||||
|
|
||||||
SavePlaylistQuery::SavePlaylistQuery(
|
SavePlaylistQuery::SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const std::string& playlistName,
|
const std::string& playlistName,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks)
|
std::shared_ptr<musik::core::TrackList> tracks)
|
||||||
{
|
{
|
||||||
|
this->library = library;
|
||||||
this->playlistId = -1;
|
this->playlistId = -1;
|
||||||
this->categoryId = -1;
|
this->categoryId = -1;
|
||||||
this->playlistName = playlistName;
|
this->playlistName = playlistName;
|
||||||
this->tracks = tracks;
|
this->tracks.rawTracks = nullptr;
|
||||||
|
this->tracks.sharedTracks = tracks;
|
||||||
this->op = CreateOp;
|
this->op = CreateOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SavePlaylistQuery::SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const std::string& playlistName,
|
||||||
|
musik::core::sdk::ITrackList* tracks)
|
||||||
|
{
|
||||||
|
this->library = library;
|
||||||
|
this->playlistId = -1;
|
||||||
|
this->categoryId = -1;
|
||||||
|
this->playlistName = playlistName;
|
||||||
|
this->tracks.rawTracks = tracks;
|
||||||
|
this->op = CreateOp;
|
||||||
|
}
|
||||||
|
|
||||||
SavePlaylistQuery::SavePlaylistQuery(
|
SavePlaylistQuery::SavePlaylistQuery(
|
||||||
musik::core::ILibraryPtr library,
|
musik::core::ILibraryPtr library,
|
||||||
@ -143,11 +188,24 @@ SavePlaylistQuery::SavePlaylistQuery(
|
|||||||
}
|
}
|
||||||
|
|
||||||
SavePlaylistQuery::SavePlaylistQuery(
|
SavePlaylistQuery::SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks)
|
std::shared_ptr<musik::core::TrackList> tracks)
|
||||||
{
|
{
|
||||||
|
this->library = library;
|
||||||
this->playlistId = playlistId;
|
this->playlistId = playlistId;
|
||||||
this->tracks = tracks;
|
this->tracks.sharedTracks = tracks;
|
||||||
|
this->op = ReplaceOp;
|
||||||
|
}
|
||||||
|
|
||||||
|
SavePlaylistQuery::SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const int64_t playlistId,
|
||||||
|
musik::core::sdk::ITrackList* tracks)
|
||||||
|
{
|
||||||
|
this->library = library;
|
||||||
|
this->playlistId = playlistId;
|
||||||
|
this->tracks.rawTracks = tracks;
|
||||||
this->op = ReplaceOp;
|
this->op = ReplaceOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +219,6 @@ SavePlaylistQuery::SavePlaylistQuery(
|
|||||||
this->playlistId = playlistId;
|
this->playlistId = playlistId;
|
||||||
this->categoryId = categoryId;
|
this->categoryId = categoryId;
|
||||||
this->categoryType = categoryType;
|
this->categoryType = categoryType;
|
||||||
this->tracks = tracks;
|
|
||||||
this->op = AppendOp;
|
this->op = AppendOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,6 +235,8 @@ SavePlaylistQuery::SavePlaylistQuery(
|
|||||||
SavePlaylistQuery::~SavePlaylistQuery() {
|
SavePlaylistQuery::~SavePlaylistQuery() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* METHODS */
|
||||||
|
|
||||||
int64_t SavePlaylistQuery::GetPlaylistId() const {
|
int64_t SavePlaylistQuery::GetPlaylistId() const {
|
||||||
return playlistId;
|
return playlistId;
|
||||||
}
|
}
|
||||||
@ -185,7 +244,7 @@ int64_t SavePlaylistQuery::GetPlaylistId() const {
|
|||||||
bool SavePlaylistQuery::AddTracksToPlaylist(
|
bool SavePlaylistQuery::AddTracksToPlaylist(
|
||||||
musik::core::db::Connection &db,
|
musik::core::db::Connection &db,
|
||||||
int64_t playlistId,
|
int64_t playlistId,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks)
|
TrackListWrapper& tracks)
|
||||||
{
|
{
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
@ -201,8 +260,8 @@ bool SavePlaylistQuery::AddTracksToPlaylist(
|
|||||||
Statement insertTrack(INSERT_PLAYLIST_TRACK_QUERY.c_str(), db);
|
Statement insertTrack(INSERT_PLAYLIST_TRACK_QUERY.c_str(), db);
|
||||||
|
|
||||||
TrackPtr track;
|
TrackPtr track;
|
||||||
for (size_t i = 0; i < tracks->Count(); i++) {
|
for (size_t i = 0; i < tracks.Count(); i++) {
|
||||||
track = tracks->Get(i);
|
track = tracks.Get(this->library, i);
|
||||||
if (track) {
|
if (track) {
|
||||||
insertTrack.Reset();
|
insertTrack.Reset();
|
||||||
insertTrack.BindText(0, track->GetString("external_id"));
|
insertTrack.BindText(0, track->GetString("external_id"));
|
||||||
@ -229,7 +288,7 @@ bool SavePlaylistQuery::AddCategoryTracksToPlaylist(
|
|||||||
|
|
||||||
if (query->GetStatus() == IQuery::Finished) {
|
if (query->GetStatus() == IQuery::Finished) {
|
||||||
auto tracks = query->GetResult();
|
auto tracks = query->GetResult();
|
||||||
if (this->AddTracksToPlaylist(db, playlistId, tracks)) {
|
if (this->AddTracksToPlaylist(db, playlistId, TrackListWrapper(tracks))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,7 +311,7 @@ bool SavePlaylistQuery::CreatePlaylist(musik::core::db::Connection &db) {
|
|||||||
this->playlistId = db.LastInsertedId();
|
this->playlistId = db.LastInsertedId();
|
||||||
|
|
||||||
/* add tracks to playlist */
|
/* add tracks to playlist */
|
||||||
if (this->tracks) {
|
if (this->tracks.Exists()) {
|
||||||
if (!this->AddTracksToPlaylist(db, this->playlistId, this->tracks)) {
|
if (!this->AddTracksToPlaylist(db, this->playlistId, this->tracks)) {
|
||||||
transaction.Cancel();
|
transaction.Cancel();
|
||||||
return false;
|
return false;
|
||||||
@ -299,7 +358,7 @@ bool SavePlaylistQuery::ReplacePlaylist(musik::core::db::Connection &db) {
|
|||||||
bool SavePlaylistQuery::AppendToPlaylist(musik::core::db::Connection& db) {
|
bool SavePlaylistQuery::AppendToPlaylist(musik::core::db::Connection& db) {
|
||||||
ScopedTransaction transaction(db);
|
ScopedTransaction transaction(db);
|
||||||
|
|
||||||
bool result = this->tracks
|
bool result = this->tracks.Exists()
|
||||||
? this->AddTracksToPlaylist(db, this->playlistId, this->tracks)
|
? this->AddTracksToPlaylist(db, this->playlistId, this->tracks)
|
||||||
: this->AddCategoryTracksToPlaylist(db, this->playlistId);
|
: this->AddCategoryTracksToPlaylist(db, this->playlistId);
|
||||||
|
|
||||||
@ -319,3 +378,46 @@ bool SavePlaylistQuery::OnRun(musik::core::db::Connection &db) {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SUPPORTING TYPES */
|
||||||
|
|
||||||
|
SavePlaylistQuery::TrackListWrapper::TrackListWrapper() {
|
||||||
|
this->rawTracks = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
SavePlaylistQuery::TrackListWrapper::TrackListWrapper(
|
||||||
|
std::shared_ptr<musik::core::TrackList> shared)
|
||||||
|
{
|
||||||
|
this->rawTracks = nullptr;
|
||||||
|
this->sharedTracks = shared;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SavePlaylistQuery::TrackListWrapper::Exists() {
|
||||||
|
return this->sharedTracks || this->rawTracks;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t SavePlaylistQuery::TrackListWrapper::Count() {
|
||||||
|
if (sharedTracks) {
|
||||||
|
return sharedTracks->Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
return rawTracks ? rawTracks->Count() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackPtr SavePlaylistQuery::TrackListWrapper::Get(
|
||||||
|
musik::core::ILibraryPtr library, size_t index)
|
||||||
|
{
|
||||||
|
if (sharedTracks) {
|
||||||
|
return sharedTracks->Get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackPtr result = std::make_shared<LibraryTrack>(rawTracks->GetId(index), library);
|
||||||
|
if (rawTracks) {
|
||||||
|
std::shared_ptr<TrackMetadataQuery> query(
|
||||||
|
new TrackMetadataQuery(result, library, TrackMetadataQuery::IdsOnly));
|
||||||
|
|
||||||
|
library->Enqueue(query, ILibrary::QuerySynchronous);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
@ -45,9 +45,15 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
class SavePlaylistQuery : public musik::core::db::LocalQueryBase {
|
class SavePlaylistQuery : public musik::core::db::LocalQueryBase {
|
||||||
public:
|
public:
|
||||||
static std::shared_ptr<SavePlaylistQuery> Save(
|
static std::shared_ptr<SavePlaylistQuery> Save(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const std::string& playlistName,
|
const std::string& playlistName,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks);
|
std::shared_ptr<musik::core::TrackList> tracks);
|
||||||
|
|
||||||
|
static std::shared_ptr<SavePlaylistQuery> Save(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const std::string& playlistName,
|
||||||
|
musik::core::sdk::ITrackList* tracks);
|
||||||
|
|
||||||
static std::shared_ptr<SavePlaylistQuery> Save(
|
static std::shared_ptr<SavePlaylistQuery> Save(
|
||||||
musik::core::ILibraryPtr library,
|
musik::core::ILibraryPtr library,
|
||||||
const std::string& playlistName,
|
const std::string& playlistName,
|
||||||
@ -55,14 +61,21 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
int64_t categoryId);
|
int64_t categoryId);
|
||||||
|
|
||||||
static std::shared_ptr<SavePlaylistQuery> Replace(
|
static std::shared_ptr<SavePlaylistQuery> Replace(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks);
|
std::shared_ptr<musik::core::TrackList> tracks);
|
||||||
|
|
||||||
|
static std::shared_ptr<SavePlaylistQuery> Replace(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const int64_t playlistId,
|
||||||
|
musik::core::sdk::ITrackList* tracks);
|
||||||
|
|
||||||
static std::shared_ptr<SavePlaylistQuery> Rename(
|
static std::shared_ptr<SavePlaylistQuery> Rename(
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
const std::string& playlistName);
|
const std::string& playlistName);
|
||||||
|
|
||||||
static std::shared_ptr<SavePlaylistQuery> Append(
|
static std::shared_ptr<SavePlaylistQuery> Append(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks);
|
std::shared_ptr<musik::core::TrackList> tracks);
|
||||||
|
|
||||||
@ -83,9 +96,15 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
SavePlaylistQuery(
|
SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const std::string& playlistName,
|
const std::string& playlistName,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks);
|
std::shared_ptr<musik::core::TrackList> tracks);
|
||||||
|
|
||||||
|
SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const std::string& playlistName,
|
||||||
|
musik::core::sdk::ITrackList* tracks);
|
||||||
|
|
||||||
SavePlaylistQuery(
|
SavePlaylistQuery(
|
||||||
musik::core::ILibraryPtr library,
|
musik::core::ILibraryPtr library,
|
||||||
const std::string& playlistName,
|
const std::string& playlistName,
|
||||||
@ -93,9 +112,15 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
int64_t categoryId);
|
int64_t categoryId);
|
||||||
|
|
||||||
SavePlaylistQuery(
|
SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks);
|
std::shared_ptr<musik::core::TrackList> tracks);
|
||||||
|
|
||||||
|
SavePlaylistQuery(
|
||||||
|
musik::core::ILibraryPtr library,
|
||||||
|
const int64_t playlistId,
|
||||||
|
musik::core::sdk::ITrackList* tracks);
|
||||||
|
|
||||||
SavePlaylistQuery(
|
SavePlaylistQuery(
|
||||||
musik::core::ILibraryPtr library,
|
musik::core::ILibraryPtr library,
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
@ -106,6 +131,18 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
const std::string& newName);
|
const std::string& newName);
|
||||||
|
|
||||||
|
struct TrackListWrapper {
|
||||||
|
TrackListWrapper();
|
||||||
|
TrackListWrapper(std::shared_ptr<musik::core::TrackList> shared);
|
||||||
|
|
||||||
|
bool Exists();
|
||||||
|
size_t Count();
|
||||||
|
TrackPtr Get(musik::core::ILibraryPtr library, size_t index);
|
||||||
|
|
||||||
|
std::shared_ptr<musik::core::TrackList> sharedTracks;
|
||||||
|
musik::core::sdk::ITrackList* rawTracks;
|
||||||
|
};
|
||||||
|
|
||||||
enum Operation { CreateOp, RenameOp, ReplaceOp, AppendOp };
|
enum Operation { CreateOp, RenameOp, ReplaceOp, AppendOp };
|
||||||
|
|
||||||
bool CreatePlaylist(musik::core::db::Connection &db);
|
bool CreatePlaylist(musik::core::db::Connection &db);
|
||||||
@ -118,13 +155,13 @@ namespace musik { namespace core { namespace db { namespace local {
|
|||||||
bool AddTracksToPlaylist(
|
bool AddTracksToPlaylist(
|
||||||
musik::core::db::Connection &db,
|
musik::core::db::Connection &db,
|
||||||
int64_t playlistId,
|
int64_t playlistId,
|
||||||
std::shared_ptr<musik::core::TrackList> tracks);
|
TrackListWrapper& tracks);
|
||||||
|
|
||||||
Operation op;
|
Operation op;
|
||||||
musik::core::ILibraryPtr library;
|
musik::core::ILibraryPtr library;
|
||||||
std::string playlistName, categoryType;
|
std::string playlistName, categoryType;
|
||||||
int64_t playlistId, categoryId;
|
int64_t playlistId, categoryId;
|
||||||
std::shared_ptr<musik::core::TrackList> tracks;
|
TrackListWrapper tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
} } } }
|
} } } }
|
||||||
|
@ -82,6 +82,11 @@ namespace musik { namespace core { namespace sdk {
|
|||||||
const char* playlistName,
|
const char* playlistName,
|
||||||
const int64_t playlistId = 0) = 0;
|
const int64_t playlistId = 0) = 0;
|
||||||
|
|
||||||
|
virtual int64_t SavePlaylistWithTrackList(
|
||||||
|
ITrackList* trackList,
|
||||||
|
const char* playlistName,
|
||||||
|
const int64_t playlistId = 0) = 0;
|
||||||
|
|
||||||
virtual bool RenamePlaylist(
|
virtual bool RenamePlaylist(
|
||||||
const int64_t playlistId,
|
const int64_t playlistId,
|
||||||
const char* playlistName) = 0;
|
const char* playlistName) = 0;
|
||||||
|
@ -300,6 +300,7 @@ bool BrowseLayout::ProcessPlaylistOperation(const std::string& key) {
|
|||||||
this->ShowModifiedLabel(false);
|
this->ShowModifiedLabel(false);
|
||||||
auto tracks = this->trackList->GetTrackList().get();
|
auto tracks = this->trackList->GetTrackList().get();
|
||||||
this->library->Enqueue(SavePlaylistQuery::Replace(
|
this->library->Enqueue(SavePlaylistQuery::Replace(
|
||||||
|
this->library,
|
||||||
this->categoryList->GetSelectedId(),
|
this->categoryList->GetSelectedId(),
|
||||||
std::shared_ptr<TrackList>(new TrackList(tracks))));
|
std::shared_ptr<TrackList>(new TrackList(tracks))));
|
||||||
return true;
|
return true;
|
||||||
|
@ -185,7 +185,7 @@ static void confirmOverwritePlaylist(
|
|||||||
"ENTER",
|
"ENTER",
|
||||||
_TSTR("button_yes"),
|
_TSTR("button_yes"),
|
||||||
[library, playlistId, tracks](const std::string& str) {
|
[library, playlistId, tracks](const std::string& str) {
|
||||||
library->Enqueue(SavePlaylistQuery::Replace(playlistId, tracks));
|
library->Enqueue(SavePlaylistQuery::Replace(library, playlistId, tracks));
|
||||||
});
|
});
|
||||||
|
|
||||||
App::Overlays().Push(dialog);
|
App::Overlays().Push(dialog);
|
||||||
@ -205,7 +205,7 @@ static void createNewPlaylist(
|
|||||||
.SetInputAcceptedCallback(
|
.SetInputAcceptedCallback(
|
||||||
[&queue, tracks, library, callback](const std::string& name) {
|
[&queue, tracks, library, callback](const std::string& name) {
|
||||||
if (name.size()) {
|
if (name.size()) {
|
||||||
auto query = SavePlaylistQuery::Save(name, tracks);
|
auto query = SavePlaylistQuery::Save(library, name, tracks);
|
||||||
library->Enqueue(query, 0, [&queue, callback](auto query) {
|
library->Enqueue(query, 0, [&queue, callback](auto query) {
|
||||||
queue.Post(Message::Create(nullptr, message::PlaylistCreated));
|
queue.Post(Message::Create(nullptr, message::PlaylistCreated));
|
||||||
|
|
||||||
@ -444,7 +444,7 @@ static void showAddTrackToPlaylistOverlay(
|
|||||||
int64_t playlistId = (*result)[index - 1]->id;
|
int64_t playlistId = (*result)[index - 1]->id;
|
||||||
setLastPlaylistId(playlistId);
|
setLastPlaylistId(playlistId);
|
||||||
|
|
||||||
library->Enqueue(SavePlaylistQuery::Append(playlistId, list), 0,
|
library->Enqueue(SavePlaylistQuery::Append(library, playlistId, list), 0,
|
||||||
[&queue, playlistId](auto query) {
|
[&queue, playlistId](auto query) {
|
||||||
/* the nesting is real... */
|
/* the nesting is real... */
|
||||||
queue.Post(Message::Create(nullptr, message::TracksAddedToPlaylist, playlistId));
|
queue.Post(Message::Create(nullptr, message::TracksAddedToPlaylist, playlistId));
|
||||||
|
@ -790,17 +790,17 @@ void WebSocketServer::RespondWithCurrentTime(connection_hdl connection, json& re
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& request) {
|
void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& request) {
|
||||||
|
/* TODO: a lot of copy/paste between this method and RespondWithAppendToPlaylist */
|
||||||
|
|
||||||
auto& options = request[message::options];
|
auto& options = request[message::options];
|
||||||
int64_t id = options.value(key::playlist_id, 0);
|
int64_t id = options.value(key::playlist_id, 0);
|
||||||
|
std::string name = options.value(key::playlist_name, "");
|
||||||
|
|
||||||
if (id) {
|
|
||||||
/* by int64 id (faster, but less reliable) */
|
/* by int64 id (faster, but less reliable) */
|
||||||
if (options.find(key::ids) != options.end()) {
|
if (options.find(key::ids) != options.end()) {
|
||||||
json& ids = options[key::ids];
|
json& ids = options[key::ids];
|
||||||
|
|
||||||
if (ids.is_array()) {
|
if (ids.is_array()) {
|
||||||
std::string name = options.value(key::playlist_name, "");
|
|
||||||
|
|
||||||
size_t count = ids.size();
|
size_t count = ids.size();
|
||||||
int64_t* idArray = new int64_t[count];
|
int64_t* idArray = new int64_t[count];
|
||||||
|
|
||||||
@ -819,19 +819,16 @@ void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& r
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
this->RespondWithFailure(connection, request);
|
this->RespondWithFailure(connection, request);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/* by external id (slower, more reliable) */
|
/* by external id (slower, more reliable) */
|
||||||
else if (options.find(key::external_ids) != options.end()) {
|
else if (options.find(key::external_ids) != options.end()) {
|
||||||
json& externalIds = options[key::external_ids];
|
json& externalIds = options[key::external_ids];
|
||||||
|
|
||||||
if (externalIds.is_array()) {
|
if (externalIds.is_array()) {
|
||||||
std::string name = options.value(key::playlist_name, "");
|
|
||||||
|
|
||||||
size_t count = externalIds.size();
|
size_t count = externalIds.size();
|
||||||
char** externalIdArray = (char**)malloc(count * sizeof(char*));
|
char** externalIdArray = (char**)malloc(count * sizeof(char*));
|
||||||
|
|
||||||
@ -862,11 +859,42 @@ void WebSocketServer::RespondWithSavePlaylist(connection_hdl connection, json& r
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
this->RespondWithFailure(connection, request);
|
this->RespondWithFailure(connection, request);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* by subquery (query_tracks or query_tracks_by_category) */
|
||||||
|
else if (options.find(key::subquery) != options.end()) {
|
||||||
|
auto& subquery = options[key::subquery];
|
||||||
|
std::string type = subquery.value(key::type, "");
|
||||||
|
|
||||||
|
if (subquery.find(message::options) != subquery.end()) {
|
||||||
|
ITrackList* tracks = nullptr;
|
||||||
|
int queryLimit, queryOffset;
|
||||||
|
if (type == request::query_tracks) {
|
||||||
|
tracks = this->QueryTracks(subquery, queryLimit, queryOffset);
|
||||||
|
}
|
||||||
|
else if (type == request::query_tracks_by_category) {
|
||||||
|
tracks = this->QueryTracksByCategory(subquery, queryLimit, queryOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tracks) {
|
||||||
|
int64_t newPlaylistId = this->context.dataProvider
|
||||||
|
->SavePlaylistWithTrackList(tracks, name.c_str(), id);
|
||||||
|
|
||||||
|
tracks->Release();
|
||||||
|
|
||||||
|
if (newPlaylistId > 0) {
|
||||||
|
this->RespondWithOptions(connection, request, {
|
||||||
|
{ key::playlist_id, newPlaylistId }
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->RespondWithFailure(connection, request);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -894,6 +922,8 @@ void WebSocketServer::RespondWithDeletePlaylist(connection_hdl connection, json&
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketServer::RespondWithAppendToPlaylist(connection_hdl connection, json& request) {
|
void WebSocketServer::RespondWithAppendToPlaylist(connection_hdl connection, json& request) {
|
||||||
|
/* TODO: a lot of copy/paste between this method and RespondWithSavePlaylist */
|
||||||
|
|
||||||
auto& options = request[message::options];
|
auto& options = request[message::options];
|
||||||
int offset = options.value(key::offset, -1);
|
int offset = options.value(key::offset, -1);
|
||||||
int64_t id = options.value(key::playlist_id, 0);
|
int64_t id = options.value(key::playlist_id, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user