command: "lsinfo" and "readcomments" allowed for remote files

This commit is contained in:
Max Kellermann 2013-12-29 14:40:24 +01:00
parent b5f3bfce92
commit 809b0eb1f5
6 changed files with 68 additions and 0 deletions

1
NEWS
View File

@ -1,6 +1,7 @@
ver 0.19 (not yet released) ver 0.19 (not yet released)
* protocol * protocol
- new commands "addtagid", "cleartagid" - new commands "addtagid", "cleartagid"
- "lsinfo" and "readcomments" allowed for remote files
* archive * archive
- read tags from songs in an archive - read tags from songs in an archive
* input * input

View File

@ -1617,6 +1617,10 @@ OK
the list of stored playlists. This behavior is the list of stored playlists. This behavior is
deprecated; use "listplaylists" instead. deprecated; use "listplaylists" instead.
</para> </para>
<para>
This command may be used to list metadata of remote
files (e.g. URI beginning with "http://" or "smb://").
</para>
<para> <para>
Clients that are connected via UNIX domain socket may Clients that are connected via UNIX domain socket may
use this command to read the tags of an arbitrary local use this command to read the tags of an arbitrary local
@ -1638,6 +1642,10 @@ OK
to the music directory or a URL in the form to the music directory or a URL in the form
"file:///foo/bar.ogg". "file:///foo/bar.ogg".
</para> </para>
<para>
This command may be used to list metadata of remote
files (e.g. URI beginning with "http://" or "smb://").
</para>
<para> <para>
The response consists of lines in the form "KEY: VALUE". The response consists of lines in the form "KEY: VALUE".
Comments with suspicious characters (e.g. newlines) are Comments with suspicious characters (e.g. newlines) are

View File

@ -130,6 +130,7 @@ struct Song {
bool UpdateFile(); bool UpdateFile();
bool UpdateFileInArchive(); bool UpdateFileInArchive();
bool UpdateStream();
/** /**
* Returns the URI of the song in UTF-8 encoding, including its * Returns the URI of the song in UTF-8 encoding, including its

View File

@ -132,3 +132,17 @@ Song::UpdateFileInArchive()
tag = tag_builder.Commit(); tag = tag_builder.Commit();
return true; 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.Commit();
return true;
}

View File

@ -25,13 +25,16 @@
#include "ClientFile.hxx" #include "ClientFile.hxx"
#include "Client.hxx" #include "Client.hxx"
#include "util/CharUtil.hxx" #include "util/CharUtil.hxx"
#include "util/UriUtil.hxx"
#include "util/Error.hxx" #include "util/Error.hxx"
#include "tag/TagHandler.hxx" #include "tag/TagHandler.hxx"
#include "tag/ApeTag.hxx" #include "tag/ApeTag.hxx"
#include "tag/TagId3.hxx" #include "tag/TagId3.hxx"
#include "TagStream.hxx"
#include "TagFile.hxx" #include "TagFile.hxx"
#include "Mapper.hxx" #include "Mapper.hxx"
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#include "ls.hxx"
#include <assert.h> #include <assert.h>
@ -80,6 +83,25 @@ static constexpr tag_handler print_comment_handler = {
print_pair, print_pair,
}; };
static CommandResult
read_stream_comments(Client &client, const char *uri)
{
if (!uri_supported_scheme(uri)) {
command_error(client, ACK_ERROR_NO_EXIST,
"unsupported URI scheme");
return CommandResult::ERROR;
}
if (!tag_stream_scan(uri, print_comment_handler, &client)) {
command_error(client, ACK_ERROR_NO_EXIST,
"Failed to load file");
return CommandResult::ERROR;
}
return CommandResult::OK;
}
CommandResult CommandResult
handle_read_comments(Client &client, gcc_unused int argc, char *argv[]) handle_read_comments(Client &client, gcc_unused int argc, char *argv[])
{ {
@ -102,6 +124,8 @@ handle_read_comments(Client &client, gcc_unused int argc, char *argv[])
Error error; Error error;
if (!client_allow_file(client, path_fs, error)) if (!client_allow_file(client, path_fs, error))
return print_error(client, error); return print_error(client, error);
} else if (uri_has_scheme(uri)) {
return read_stream_comments(client, uri);
} else if (*uri != '/') { } else if (*uri != '/') {
path_fs = map_uri_fs(uri); path_fs = map_uri_fs(uri);
if (path_fs.IsNull()) { if (path_fs.IsNull()) {

View File

@ -136,6 +136,26 @@ handle_lsinfo(Client &client, int argc, char *argv[])
return CommandResult::OK; return CommandResult::OK;
} }
if (uri_has_scheme(uri)) {
if (!uri_supported_scheme(uri)) {
command_error(client, ACK_ERROR_NO_EXIST,
"unsupported URI scheme");
return CommandResult::ERROR;
}
Song *song = Song::NewRemote(uri);
if (!song->UpdateStream()) {
song->Free();
command_error(client, ACK_ERROR_NO_EXIST,
"No such file");
return CommandResult::ERROR;
}
song_print_info(client, *song);
song->Free();
return CommandResult::OK;
}
CommandResult result = handle_lsinfo2(client, argc, argv); CommandResult result = handle_lsinfo2(client, argc, argv);
if (result != CommandResult::OK) if (result != CommandResult::OK)
return result; return result;