queue/PlaylistEdit: throw PlaylistError on error
This commit is contained in:
parent
50b930f283
commit
b6cb9b853a
@ -66,7 +66,7 @@ handle_save(Client &client, Request args, gcc_unused Response &r)
|
||||
}
|
||||
|
||||
CommandResult
|
||||
handle_load(Client &client, Request args, Response &r)
|
||||
handle_load(Client &client, Request args, gcc_unused Response &r)
|
||||
{
|
||||
RangeArg range = args.ParseOptional(1, RangeArg::All());
|
||||
|
||||
@ -74,12 +74,10 @@ handle_load(Client &client, Request args, Response &r)
|
||||
|
||||
Error error;
|
||||
const SongLoader loader(client);
|
||||
if (!playlist_open_into_queue(args.front(),
|
||||
range.start, range.end,
|
||||
client.playlist,
|
||||
client.player_control, loader, error))
|
||||
return print_error(r, error);
|
||||
|
||||
playlist_open_into_queue(args.front(),
|
||||
range.start, range.end,
|
||||
client.playlist,
|
||||
client.player_control, loader);
|
||||
return CommandResult::OK;
|
||||
}
|
||||
|
||||
|
@ -54,11 +54,7 @@ AddUri(Client &client, const LocatedUri &uri, Response &r)
|
||||
return print_error(r, error);
|
||||
|
||||
auto &partition = client.partition;
|
||||
unsigned id = partition.playlist.AppendSong(partition.pc,
|
||||
std::move(*song), error);
|
||||
if (id == 0)
|
||||
return print_error(r, error);
|
||||
|
||||
partition.playlist.AppendSong(partition.pc, std::move(*song));
|
||||
return CommandResult::OK;
|
||||
}
|
||||
|
||||
@ -186,12 +182,8 @@ handle_rangeid(Client &client, Request args, Response &r)
|
||||
return CommandResult::ERROR;
|
||||
}
|
||||
|
||||
Error error;
|
||||
if (!client.partition.playlist.SetSongIdRange(client.partition.pc,
|
||||
id, start, end,
|
||||
error))
|
||||
return print_error(r, error);
|
||||
|
||||
client.partition.playlist.SetSongIdRange(client.partition.pc,
|
||||
id, start, end);
|
||||
return CommandResult::OK;
|
||||
}
|
||||
|
||||
|
@ -28,15 +28,13 @@
|
||||
#include <functional>
|
||||
|
||||
static bool
|
||||
AddToQueue(Partition &partition, const LightSong &song, Error &error)
|
||||
AddToQueue(Partition &partition, const LightSong &song)
|
||||
{
|
||||
const Storage &storage = *partition.instance.storage;
|
||||
unsigned id =
|
||||
partition.playlist.AppendSong(partition.pc,
|
||||
DatabaseDetachSong(storage,
|
||||
song),
|
||||
error);
|
||||
return id != 0;
|
||||
partition.playlist.AppendSong(partition.pc,
|
||||
DatabaseDetachSong(storage,
|
||||
song));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -48,6 +46,6 @@ AddFromDatabase(Partition &partition, const DatabaseSelection &selection,
|
||||
return false;
|
||||
|
||||
using namespace std::placeholders;
|
||||
const auto f = std::bind(AddToQueue, std::ref(partition), _1, _2);
|
||||
const auto f = std::bind(AddToQueue, std::ref(partition), _1);
|
||||
return db->Visit(selection, f, error);
|
||||
}
|
||||
|
@ -35,12 +35,11 @@
|
||||
|
||||
#include <memory>
|
||||
|
||||
bool
|
||||
void
|
||||
playlist_load_into_queue(const char *uri, SongEnumerator &e,
|
||||
unsigned start_index, unsigned end_index,
|
||||
playlist &dest, PlayerControl &pc,
|
||||
const SongLoader &loader,
|
||||
Error &error)
|
||||
const SongLoader &loader)
|
||||
{
|
||||
const std::string base_uri = uri != nullptr
|
||||
? PathTraitsUTF8::GetParent(uri)
|
||||
@ -60,20 +59,15 @@ playlist_load_into_queue(const char *uri, SongEnumerator &e,
|
||||
continue;
|
||||
}
|
||||
|
||||
unsigned id = dest.AppendSong(pc, std::move(*song), error);
|
||||
if (id == 0)
|
||||
return false;
|
||||
dest.AppendSong(pc, std::move(*song));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
playlist_open_into_queue(const char *uri,
|
||||
unsigned start_index, unsigned end_index,
|
||||
playlist &dest, PlayerControl &pc,
|
||||
const SongLoader &loader,
|
||||
Error &error)
|
||||
const SongLoader &loader)
|
||||
{
|
||||
Mutex mutex;
|
||||
Cond cond;
|
||||
@ -83,13 +77,10 @@ playlist_open_into_queue(const char *uri,
|
||||
loader.GetStorage(),
|
||||
#endif
|
||||
mutex, cond));
|
||||
if (playlist == nullptr) {
|
||||
error.Set(playlist_domain, int(PlaylistResult::NO_SUCH_LIST),
|
||||
"No such playlist");
|
||||
return false;
|
||||
}
|
||||
if (playlist == nullptr)
|
||||
throw PlaylistError::NoSuchList();
|
||||
|
||||
return playlist_load_into_queue(uri, *playlist,
|
||||
start_index, end_index,
|
||||
dest, pc, loader, error);
|
||||
playlist_load_into_queue(uri, *playlist,
|
||||
start_index, end_index,
|
||||
dest, pc, loader);
|
||||
}
|
||||
|
@ -41,22 +41,21 @@ struct PlayerControl;
|
||||
* @param start_index the index of the first song
|
||||
* @param end_index the index of the last song (excluding)
|
||||
*/
|
||||
bool
|
||||
void
|
||||
playlist_load_into_queue(const char *uri, SongEnumerator &e,
|
||||
unsigned start_index, unsigned end_index,
|
||||
playlist &dest, PlayerControl &pc,
|
||||
const SongLoader &loader,
|
||||
Error &error);
|
||||
const SongLoader &loader);
|
||||
|
||||
/**
|
||||
* Opens a playlist with a playlist plugin and append to the specified
|
||||
* play queue.
|
||||
*/
|
||||
bool
|
||||
void
|
||||
playlist_open_into_queue(const char *uri,
|
||||
unsigned start_index, unsigned end_index,
|
||||
playlist &dest, PlayerControl &pc,
|
||||
const SongLoader &loader, Error &error);
|
||||
const SongLoader &loader);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -195,11 +195,11 @@ public:
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @return the new song id or 0 on error
|
||||
* Throws PlaylistError if the queue would be too large.
|
||||
*
|
||||
* @return the new song id
|
||||
*/
|
||||
unsigned AppendSong(PlayerControl &pc,
|
||||
DetachedSong &&song,
|
||||
Error &error);
|
||||
unsigned AppendSong(PlayerControl &pc, DetachedSong &&song);
|
||||
|
||||
/**
|
||||
* @return the new song id or 0 on error
|
||||
@ -254,9 +254,8 @@ public:
|
||||
* Sets the start_time and end_time attributes on the song
|
||||
* with the specified id.
|
||||
*/
|
||||
bool SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
SongTime start, SongTime end,
|
||||
Error &error);
|
||||
void SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
SongTime start, SongTime end);
|
||||
|
||||
void AddSongIdTag(unsigned id, TagType tag_type, const char *value);
|
||||
void ClearSongIdTag(unsigned id, TagType tag_type);
|
||||
|
@ -92,15 +92,13 @@ playlist::CommitBulk(PlayerControl &pc)
|
||||
}
|
||||
|
||||
unsigned
|
||||
playlist::AppendSong(PlayerControl &pc, DetachedSong &&song, Error &error)
|
||||
playlist::AppendSong(PlayerControl &pc, DetachedSong &&song)
|
||||
{
|
||||
unsigned id;
|
||||
|
||||
if (queue.IsFull()) {
|
||||
error.Set(playlist_domain, int(PlaylistResult::TOO_LARGE),
|
||||
"Playlist is too large");
|
||||
return 0;
|
||||
}
|
||||
if (queue.IsFull())
|
||||
throw PlaylistError(PlaylistResult::TOO_LARGE,
|
||||
"Playlist is too large");
|
||||
|
||||
const DetachedSong *const queued_song = GetQueuedSong();
|
||||
|
||||
@ -134,7 +132,7 @@ playlist::AppendURI(PlayerControl &pc, const SongLoader &loader,
|
||||
if (song == nullptr)
|
||||
return 0;
|
||||
|
||||
return AppendSong(pc, std::move(*song), error);
|
||||
return AppendSong(pc, std::move(*song));
|
||||
}
|
||||
|
||||
void
|
||||
@ -419,26 +417,20 @@ playlist::Shuffle(PlayerControl &pc, unsigned start, unsigned end)
|
||||
OnModified();
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
SongTime start, SongTime end,
|
||||
Error &error)
|
||||
SongTime start, SongTime end)
|
||||
{
|
||||
assert(end.IsZero() || start < end);
|
||||
|
||||
int position = queue.IdToPosition(id);
|
||||
if (position < 0) {
|
||||
error.Set(playlist_domain, int(PlaylistResult::NO_SUCH_SONG),
|
||||
"No such song");
|
||||
return false;
|
||||
}
|
||||
if (position < 0)
|
||||
throw PlaylistError::NoSuchSong();
|
||||
|
||||
if (playing) {
|
||||
if (position == current) {
|
||||
error.Set(playlist_domain, int(PlaylistResult::DENIED),
|
||||
"Cannot edit the current song");
|
||||
return false;
|
||||
}
|
||||
if (position == current)
|
||||
throw PlaylistError(PlaylistResult::DENIED,
|
||||
"Cannot edit the current song");
|
||||
|
||||
if (position == queued) {
|
||||
/* if we're manipulating the "queued" song,
|
||||
@ -455,12 +447,9 @@ playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
if (!duration.IsNegative()) {
|
||||
/* validate the offsets */
|
||||
|
||||
if (start > duration) {
|
||||
error.Set(playlist_domain,
|
||||
int(PlaylistResult::BAD_RANGE),
|
||||
"Invalid start offset");
|
||||
return false;
|
||||
}
|
||||
if (start > duration)
|
||||
throw PlaylistError(PlaylistResult::BAD_RANGE,
|
||||
"Invalid start offset");
|
||||
|
||||
if (end >= duration)
|
||||
end = SongTime::zero();
|
||||
@ -474,5 +463,4 @@ playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
UpdateQueuedSong(pc, nullptr);
|
||||
queue.ModifyAtPosition(position);
|
||||
OnModified();
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user