SongUpdate: move code to handle_lsinfo()
Don't create a temporary Song object in handle_lsinfo(). Instead, print all tags while parsing the remote file.
This commit is contained in:
		| @@ -130,7 +130,6 @@ struct Song { | ||||
|  | ||||
| 	bool UpdateFile(); | ||||
| 	bool UpdateFileInArchive(); | ||||
| 	bool UpdateStream(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Returns the URI of the song in UTF-8 encoding, including its | ||||
|   | ||||
| @@ -132,17 +132,3 @@ Song::UpdateFileInArchive() | ||||
| 	tag = tag_builder.CommitNew(); | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| bool | ||||
| Song::UpdateStream() | ||||
| { | ||||
| 	assert(!IsFile()); | ||||
|  | ||||
| 	TagBuilder tag_builder; | ||||
| 	if (!tag_stream_scan(uri, full_tag_handler, &tag_builder)) | ||||
| 		return false; | ||||
|  | ||||
| 	delete tag; | ||||
| 	tag = tag_builder.CommitNew(); | ||||
| 	return true; | ||||
| } | ||||
|   | ||||
| @@ -35,6 +35,12 @@ void tag_print_types(Client &client) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
| tag_print(Client &client, TagType type, const char *value) | ||||
| { | ||||
| 	client_printf(client, "%s: %s\n", tag_item_names[type], value); | ||||
| } | ||||
|  | ||||
| void tag_print(Client &client, const Tag &tag) | ||||
| { | ||||
| 	if (tag.time >= 0) | ||||
|   | ||||
| @@ -20,11 +20,18 @@ | ||||
| #ifndef MPD_TAG_PRINT_HXX | ||||
| #define MPD_TAG_PRINT_HXX | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| enum TagType : uint8_t; | ||||
|  | ||||
| struct Tag; | ||||
| class Client; | ||||
|  | ||||
| void tag_print_types(Client &client); | ||||
|  | ||||
| void | ||||
| tag_print(Client &client, TagType type, const char *value); | ||||
|  | ||||
| void | ||||
| tag_print(Client &client, const Tag &tag); | ||||
|  | ||||
|   | ||||
| @@ -26,6 +26,8 @@ | ||||
| #include "Song.hxx" | ||||
| #include "SongPrint.hxx" | ||||
| #include "TagPrint.hxx" | ||||
| #include "TagStream.hxx" | ||||
| #include "tag/TagHandler.hxx" | ||||
| #include "TimePrint.hxx" | ||||
| #include "Mapper.hxx" | ||||
| #include "DecoderPrint.hxx" | ||||
| @@ -98,6 +100,20 @@ handle_close(gcc_unused Client &client, | ||||
| 	return CommandResult::FINISH; | ||||
| } | ||||
|  | ||||
| static void | ||||
| print_tag(TagType type, const char *value, void *ctx) | ||||
| { | ||||
| 	Client &client = *(Client *)ctx; | ||||
|  | ||||
| 	tag_print(client, type, value); | ||||
| } | ||||
|  | ||||
| static constexpr tag_handler print_tag_handler = { | ||||
| 	nullptr, | ||||
| 	print_tag, | ||||
| 	nullptr, | ||||
| }; | ||||
|  | ||||
| CommandResult | ||||
| handle_lsinfo(Client &client, int argc, char *argv[]) | ||||
| { | ||||
| @@ -143,16 +159,12 @@ handle_lsinfo(Client &client, int argc, char *argv[]) | ||||
| 			return CommandResult::ERROR; | ||||
| 		} | ||||
|  | ||||
| 		Song *song = Song::NewRemote(uri); | ||||
| 		if (!song->UpdateStream()) { | ||||
| 			song->Free(); | ||||
| 		if (!tag_stream_scan(uri, print_tag_handler, &client)) { | ||||
| 			command_error(client, ACK_ERROR_NO_EXIST, | ||||
| 				      "No such file"); | ||||
| 			return CommandResult::ERROR; | ||||
| 		} | ||||
|  | ||||
| 		song_print_info(client, *song); | ||||
| 		song->Free(); | ||||
| 		return CommandResult::OK; | ||||
| 	} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann