summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--src/LocateUri.cxx23
-rw-r--r--src/LocateUri.hxx9
-rw-r--r--src/SongLoader.cxx3
-rw-r--r--src/command/FileCommands.cxx4
-rw-r--r--src/command/OtherCommands.cxx4
-rw-r--r--src/command/PlaylistCommands.cxx9
-rw-r--r--src/command/QueueCommands.cxx3
8 files changed, 42 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index 542905467..c0c91d028 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@ ver 0.21.8 (not yet released)
* output
- httpd: add missing mutex lock
- httpd: fix use-after-free bug
+* playlist
+ - soundcloud: fix "Unsupported URI scheme" (0.21.6 regression)
* fix Bonjour bug
* fix build failure with GCC 9
* fix build failure with -Ddatabase=false
diff --git a/src/LocateUri.cxx b/src/LocateUri.cxx
index dba43b0de..7d82f5436 100644
--- a/src/LocateUri.cxx
+++ b/src/LocateUri.cxx
@@ -55,14 +55,26 @@ LocateFileUri(const char *uri, const Client *client
}
static LocatedUri
-LocateAbsoluteUri(const char *uri
+LocateAbsoluteUri(UriPluginKind kind, const char *uri
#ifdef ENABLE_DATABASE
, const Storage *storage
#endif
)
{
- if (!uri_supported_scheme(uri))
- throw std::runtime_error("Unsupported URI scheme");
+ switch (kind) {
+ case UriPluginKind::INPUT:
+ case UriPluginKind::STORAGE: // TODO: separate check for storage plugins
+ if (!uri_supported_scheme(uri))
+ throw std::runtime_error("Unsupported URI scheme");
+ break;
+
+ case UriPluginKind::PLAYLIST:
+ /* for now, no validation for playlist URIs; this is
+ more complicated because there are three ways to
+ identify which plugin to use: URI scheme, filename
+ suffix and MIME type */
+ break;
+ }
#ifdef ENABLE_DATABASE
if (storage != nullptr) {
@@ -76,7 +88,8 @@ LocateAbsoluteUri(const char *uri
}
LocatedUri
-LocateUri(const char *uri, const Client *client
+LocateUri(UriPluginKind kind,
+ const char *uri, const Client *client
#ifdef ENABLE_DATABASE
, const Storage *storage
#endif
@@ -100,7 +113,7 @@ LocateUri(const char *uri, const Client *client
#endif
);
else if (uri_has_scheme(uri))
- return LocateAbsoluteUri(uri
+ return LocateAbsoluteUri(kind, uri
#ifdef ENABLE_DATABASE
, storage
#endif
diff --git a/src/LocateUri.hxx b/src/LocateUri.hxx
index 953671d79..c0bf8ec2f 100644
--- a/src/LocateUri.hxx
+++ b/src/LocateUri.hxx
@@ -41,6 +41,12 @@ class Client;
class Storage;
#endif
+enum class UriPluginKind {
+ INPUT,
+ STORAGE,
+ PLAYLIST,
+};
+
struct LocatedUri {
enum class Type {
/**
@@ -84,7 +90,8 @@ struct LocatedUri {
* that feature is disabled if this parameter is nullptr
*/
LocatedUri
-LocateUri(const char *uri, const Client *client
+LocateUri(UriPluginKind kind,
+ const char *uri, const Client *client
#ifdef ENABLE_DATABASE
, const Storage *storage
#endif
diff --git a/src/SongLoader.cxx b/src/SongLoader.cxx
index ad96ecfec..fee94f8b3 100644
--- a/src/SongLoader.cxx
+++ b/src/SongLoader.cxx
@@ -94,7 +94,8 @@ SongLoader::LoadSong(const char *uri_utf8) const
assert(uri_utf8 != nullptr);
#endif
- const auto located_uri = LocateUri(uri_utf8, client
+ const auto located_uri = LocateUri(UriPluginKind::INPUT,
+ uri_utf8, client
#ifdef ENABLE_DATABASE
, storage
#endif
diff --git a/src/command/FileCommands.cxx b/src/command/FileCommands.cxx
index c0e88abff..448da2caf 100644
--- a/src/command/FileCommands.cxx
+++ b/src/command/FileCommands.cxx
@@ -218,7 +218,7 @@ handle_read_comments(Client &client, Request args, Response &r)
const char *const uri = args.front();
- const auto located_uri = LocateUri(uri, &client
+ const auto located_uri = LocateUri(UriPluginKind::INPUT, uri, &client
#ifdef ENABLE_DATABASE
, nullptr
#endif
@@ -331,7 +331,7 @@ handle_album_art(Client &client, Request args, Response &r)
const char *uri = args.front();
size_t offset = args.ParseUnsigned(1);
- const auto located_uri = LocateUri(uri, &client
+ const auto located_uri = LocateUri(UriPluginKind::INPUT, uri, &client
#ifdef ENABLE_DATABASE
, nullptr
#endif
diff --git a/src/command/OtherCommands.cxx b/src/command/OtherCommands.cxx
index 5228868d9..f441c73e0 100644
--- a/src/command/OtherCommands.cxx
+++ b/src/command/OtherCommands.cxx
@@ -99,7 +99,7 @@ handle_listfiles(Client &client, Request args, Response &r)
/* default is root directory */
const auto uri = args.GetOptional(0, "");
- const auto located_uri = LocateUri(uri, &client
+ const auto located_uri = LocateUri(UriPluginKind::STORAGE, uri, &client
#ifdef ENABLE_DATABASE
, nullptr
#endif
@@ -219,7 +219,7 @@ handle_lsinfo(Client &client, Request args, Response &r)
compatibility, work around this here */
uri = "";
- const auto located_uri = LocateUri(uri, &client
+ const auto located_uri = LocateUri(UriPluginKind::INPUT, uri, &client
#ifdef ENABLE_DATABASE
, nullptr
#endif
diff --git a/src/command/PlaylistCommands.cxx b/src/command/PlaylistCommands.cxx
index 89b64ff6f..2914ea82b 100644
--- a/src/command/PlaylistCommands.cxx
+++ b/src/command/PlaylistCommands.cxx
@@ -69,7 +69,8 @@ handle_save(Client &client, Request args, gcc_unused Response &r)
CommandResult
handle_load(Client &client, Request args, gcc_unused Response &r)
{
- const auto uri = LocateUri(args.front(), &client
+ const auto uri = LocateUri(UriPluginKind::PLAYLIST, args.front(),
+ &client
#ifdef ENABLE_DATABASE
, nullptr
#endif
@@ -99,7 +100,8 @@ handle_load(Client &client, Request args, gcc_unused Response &r)
CommandResult
handle_listplaylist(Client &client, Request args, Response &r)
{
- const auto name = LocateUri(args.front(), &client
+ const auto name = LocateUri(UriPluginKind::PLAYLIST, args.front(),
+ &client
#ifdef ENABLE_DATABASE
, nullptr
#endif
@@ -115,7 +117,8 @@ handle_listplaylist(Client &client, Request args, Response &r)
CommandResult
handle_listplaylistinfo(Client &client, Request args, Response &r)
{
- const auto name = LocateUri(args.front(), &client
+ const auto name = LocateUri(UriPluginKind::PLAYLIST, args.front(),
+ &client
#ifdef ENABLE_DATABASE
, nullptr
#endif
diff --git a/src/command/QueueCommands.cxx b/src/command/QueueCommands.cxx
index 3c3e32e2f..c0bb8c95b 100644
--- a/src/command/QueueCommands.cxx
+++ b/src/command/QueueCommands.cxx
@@ -83,7 +83,8 @@ handle_add(Client &client, Request args, Response &r)
here */
uri = "";
- const auto located_uri = LocateUri(uri, &client
+ const auto located_uri = LocateUri(UriPluginKind::INPUT, uri,
+ &client
#ifdef ENABLE_DATABASE
, nullptr
#endif