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 \n" "Copyright 2008-2018 Max Kellermann \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 = [