diff --git a/NEWS b/NEWS
index 48c65826f..4f1be509b 100644
--- a/NEWS
+++ b/NEWS
@@ -12,8 +12,11 @@ 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
 * systemd: add user socket unit
 
 ver 0.21.7 (2019/04/03)
diff --git a/meson.build b/meson.build
index 19ac06ecf..1355edc2b 100644
--- a/meson.build
+++ b/meson.build
@@ -377,8 +377,10 @@ basic_dep = declare_dependency(
 
 if enable_database
   subdir('src/storage')
-  subdir('src/db')
+else
+  storage_glue_dep = dependency('', required: false)
 endif
+subdir('src/db')
 
 if neighbor_glue_dep.found()
   sources += 'src/command/NeighborCommands.cxx'
diff --git a/src/CommandLine.cxx b/src/CommandLine.cxx
index b820e396b..5ede49580 100644
--- a/src/CommandLine.cxx
+++ b/src/CommandLine.cxx
@@ -108,17 +108,17 @@ static constexpr Domain cmdline_domain("cmdline");
 gcc_noreturn
 static void version(void)
 {
-	printf("Music Player Daemon " VERSION " (%s)\n"
+	printf("Music Player Daemon " VERSION " (%s)"
 	       "\n"
 	       "Copyright 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n"
 	       "Copyright 2008-2018 Max Kellermann <max.kellermann@gmail.com>\n"
 	       "This is free software; see the source for copying conditions.  There is NO\n"
-	       "warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+	       "warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
+	       GIT_VERSION);
 
 #ifdef ENABLE_DATABASE
-	       "\n"
-	       "Database plugins:\n",
-	       GIT_VERSION);
+	printf("\n"
+	       "Database plugins:\n");
 
 	for (auto i = database_plugins; *i != nullptr; ++i)
 		printf(" %s", (*i)->name);
@@ -129,18 +129,18 @@ static void version(void)
 	for (auto i = storage_plugins; *i != nullptr; ++i)
 		printf(" %s", (*i)->name);
 
-	printf("\n"
+	printf("\n");
 #endif
 
 #ifdef ENABLE_NEIGHBOR_PLUGINS
-	       "\n"
+	printf("\n"
 	       "Neighbor plugins:\n");
 	for (auto i = neighbor_plugins; *i != nullptr; ++i)
 		printf(" %s", (*i)->name);
 
-	printf("\n"
 #endif
 
+	printf("\n"
 	       "\n"
 	       "Decoders plugins:\n");
 
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/FingerprintCommands.cxx b/src/command/FingerprintCommands.cxx
index 3deacd8ec..ed957b899 100644
--- a/src/command/FingerprintCommands.cxx
+++ b/src/command/FingerprintCommands.cxx
@@ -314,7 +314,7 @@ handle_getfingerprint(Client &client, Request args, Response &)
 {
 	const char *_uri = args.front();
 
-	auto lu = LocateUri(_uri, &client
+	auto lu = 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 8f2801bcc..6704b7b1e 100644
--- a/src/command/PlaylistCommands.cxx
+++ b/src/command/PlaylistCommands.cxx
@@ -70,7 +70,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
@@ -100,7 +101,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
@@ -116,7 +118,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
diff --git a/src/db/meson.build b/src/db/meson.build
index 3ad0be246..4f2b32f8e 100644
--- a/src/db/meson.build
+++ b/src/db/meson.build
@@ -9,6 +9,11 @@ db_api_dep = declare_dependency(
   link_with: db_api,
 )
 
+if not enable_database
+  db_glue_dep = db_api_dep
+  subdir_done()
+endif
+
 subdir('plugins')
 
 db_glue_sources = [