Commit 809b0eb1 authored by Max Kellermann's avatar Max Kellermann

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

parent b5f3bfce
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
......
...@@ -1618,6 +1618,10 @@ OK ...@@ -1618,6 +1618,10 @@ OK
deprecated; use "listplaylists" instead. deprecated; use "listplaylists" instead.
</para> </para>
<para> <para>
This command may be used to list metadata of remote
files (e.g. URI beginning with "http://" or "smb://").
</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
file (URI beginning with "file:///"). file (URI beginning with "file:///").
...@@ -1639,6 +1643,10 @@ OK ...@@ -1639,6 +1643,10 @@ OK
"file:///foo/bar.ogg". "file:///foo/bar.ogg".
</para> </para>
<para> <para>
This command may be used to list metadata of remote
files (e.g. URI beginning with "http://" or "smb://").
</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
ignored silently. ignored silently.
......
...@@ -130,6 +130,7 @@ struct Song { ...@@ -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
......
...@@ -132,3 +132,17 @@ Song::UpdateFileInArchive() ...@@ -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;
}
...@@ -25,13 +25,16 @@ ...@@ -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 = { ...@@ -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[]) ...@@ -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()) {
......
...@@ -136,6 +136,26 @@ handle_lsinfo(Client &client, int argc, char *argv[]) ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment