Updated some small stuff
This commit is contained in:
@@ -801,6 +801,44 @@ command_result ConnectedClient::handleCommandPlaylistClientDelPerm(ts::Command &
|
||||
return command_result{error::ok};
|
||||
}
|
||||
|
||||
constexpr auto max_song_meta_info = 1024 * 512;
|
||||
|
||||
inline size_t estimated_song_info_size(const std::shared_ptr<ts::music::PlaylistEntryInfo>& song, bool extract_metadata) {
|
||||
return 128 + std::min(song->metadata.json_string.length(), (size_t) max_song_meta_info) + extract_metadata * 256;
|
||||
}
|
||||
|
||||
inline void fill_song_info(ts::command_builder_bulk bulk, const std::shared_ptr<ts::music::PlaylistEntryInfo>& song, bool extract_metadata) {
|
||||
bulk.reserve(estimated_song_info_size(song, extract_metadata));
|
||||
|
||||
bulk.put("song_id", song->song_id);
|
||||
bulk.put("song_invoker", song->invoker);
|
||||
bulk.put("song_previous_song_id", song->previous_song_id);
|
||||
bulk.put("song_url", song->original_url);
|
||||
bulk.put("song_url_loader", song->url_loader);
|
||||
bulk.put("song_loaded", song->metadata.is_loaded());
|
||||
if(song->metadata.json_string.length() > 1024 * 1024 * 512) {
|
||||
logWarning(LOG_GENERAL, "Dropping song metadata because its way to big. ({}bytes)", song->metadata.json_string.size());
|
||||
} else {
|
||||
bulk.put("song_metadata", song->metadata.json_string);
|
||||
}
|
||||
|
||||
if(extract_metadata) {
|
||||
bulk.reserve(256, true);
|
||||
auto metadata = song->metadata.loaded_data;
|
||||
if(extract_metadata && song->metadata.is_loaded() && metadata) {
|
||||
bulk.put("song_metadata_title", metadata->title);
|
||||
bulk.put("song_metadata_description", metadata->description);
|
||||
bulk.put("song_metadata_url", metadata->url);
|
||||
bulk.put("song_metadata_length", metadata->length.count());
|
||||
if(auto thumbnail = static_pointer_cast<::music::ThumbnailUrl>(metadata->thumbnail); thumbnail && thumbnail->type() == ::music::THUMBNAIL_URL) {
|
||||
bulk.put("song_metadata_thumbnail_url", thumbnail->url());
|
||||
} else {
|
||||
bulk.put("song_metadata_thumbnail_url", "none");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
command_result ConnectedClient::handleCommandPlaylistSongList(ts::Command &cmd) {
|
||||
CMD_REF_SERVER(ref_server);
|
||||
CMD_RESET_IDLE;
|
||||
@@ -816,39 +854,29 @@ command_result ConnectedClient::handleCommandPlaylistSongList(ts::Command &cmd)
|
||||
if(songs.empty())
|
||||
return command_result{error::database_empty_result};
|
||||
|
||||
Command notify(this->notify_response_command("notifyplaylistsonglist"));
|
||||
notify["playlist_id"] = playlist->playlist_id();
|
||||
|
||||
ts::command_builder result{this->notify_response_command("notifyplaylistsonglist")};
|
||||
result.put(0, "version", 2); /* to signalize that we're sending the response bulked */
|
||||
auto extract_metadata = cmd.hasParm("extract-metadata");
|
||||
|
||||
size_t index = 0;
|
||||
size_t index{0};
|
||||
for(const auto& song : songs) {
|
||||
notify[index]["song_id"] = song->song_id;
|
||||
notify[index]["song_invoker"] = song->invoker;
|
||||
notify[index]["song_previous_song_id"] = song->previous_song_id;
|
||||
notify[index]["song_url"] = song->original_url;
|
||||
notify[index]["song_url_loader"] = song->url_loader;
|
||||
notify[index]["song_loaded"] = song->metadata.is_loaded();
|
||||
notify[index]["song_metadata"] = song->metadata.json_string;
|
||||
|
||||
if(extract_metadata) {
|
||||
auto metadata = song->metadata.loaded_data;
|
||||
if(extract_metadata && song->metadata.is_loaded() && metadata) {
|
||||
notify[index]["song_metadata_title"] = metadata->title;
|
||||
notify[index]["song_metadata_description"] = metadata->description;
|
||||
notify[index]["song_metadata_url"] = metadata->url;
|
||||
notify[index]["song_metadata_length"] = metadata->length.count();
|
||||
if(auto thumbnail = static_pointer_cast<::music::ThumbnailUrl>(metadata->thumbnail); thumbnail && thumbnail->type() == ::music::THUMBNAIL_URL) {
|
||||
notify[index]["song_metadata_thumbnail_url"] = thumbnail->url();
|
||||
} else {
|
||||
notify[index]["song_metadata_thumbnail_url"] = "none";
|
||||
}
|
||||
}
|
||||
if(index == 0) {
|
||||
result.put(0, "playlist_id", playlist->playlist_id());
|
||||
}
|
||||
fill_song_info(result.bulk(index), song, extract_metadata);
|
||||
|
||||
index++;
|
||||
if(this->getExternalType() == ClientType::CLIENT_TEAMSPEAK && result.current_size() + estimated_song_info_size(song, extract_metadata) > 128 * 1024) {
|
||||
this->sendCommand(result);
|
||||
result.reset();
|
||||
index = 0;
|
||||
} else {
|
||||
index++;
|
||||
}
|
||||
}
|
||||
this->sendCommand(notify);
|
||||
if(index > 0)
|
||||
this->sendCommand(result);
|
||||
if(this->getExternalType() == ClientType::CLIENT_TEAMSPEAK)
|
||||
this->sendCommand(ts::command_builder{"notifyplaylistsonglistfinished"});
|
||||
|
||||
return command_result{error::ok};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user