summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2020-11-04 15:25:03 +0100
committerMax Kellermann <max@musicpd.org>2020-11-04 16:13:12 +0100
commit92a218b7a9f5b3d89682de28075f158e53c57464 (patch)
treee2a5969b990146e5cba9d6ff91a53b36b325593e
parentd69a1f98af6a967bc740e383389c092cd22c1634 (diff)
playlist/registry: add option "as_directory"
This allows users to disable the "CUE files as directories" feature without having to disable the CUE playlist plugin completely. This feature has been annoying some users.
-rw-r--r--NEWS1
-rw-r--r--doc/plugins.rst2
-rw-r--r--doc/user.rst5
-rw-r--r--src/db/update/Playlist.cxx2
-rw-r--r--src/db/update/SpecialDirectory.cxx11
-rw-r--r--src/playlist/PlaylistRegistry.cxx17
-rw-r--r--src/playlist/PlaylistRegistry.hxx8
7 files changed, 44 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index a1b778d7e..7781f6e9a 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ ver 0.22.2 (2020/10/28)
- qobuz/tidal: fix protocol errors due to newlines in error messages
- smbclient: disable by default due to libsmbclient crash bug
* playlist
+ - add option "as_directory", making CUE file expansion optional
- soundcloud: fix protocol errors due to newlines in error messages
* state_file: save on shutdown
diff --git a/doc/plugins.rst b/doc/plugins.rst
index 45a7b347f..06fe714c1 100644
--- a/doc/plugins.rst
+++ b/doc/plugins.rst
@@ -1231,6 +1231,8 @@ asx
Reads :file:`.asx` playlist files.
+.. _cue_playlist:
+
cue
---
Reads :file:`.cue` files.
diff --git a/doc/user.rst b/doc/user.rst
index 06235c432..abd7c7b1f 100644
--- a/doc/user.rst
+++ b/doc/user.rst
@@ -500,6 +500,11 @@ The following table lists the playlist_plugin options valid for all plugins:
- The name of the plugin
* - **enabled yes|no**
- Allows you to disable a playlist plugin without recompiling. By default, all plugins are enabled.
+ * - **as_directory yes|no**
+ - With this option, a playlist file of this type is parsed during
+ database update and converted to a virtual directory, allowing
+ MPD clients to access individual entries. By default, this is
+ only enabled for the :ref:`cue plugin <cue_playlist>`.
More information can be found in the :ref:`playlist_plugins`
reference.
diff --git a/src/db/update/Playlist.cxx b/src/db/update/Playlist.cxx
index 03509522a..46286bb90 100644
--- a/src/db/update/Playlist.cxx
+++ b/src/db/update/Playlist.cxx
@@ -95,7 +95,7 @@ UpdateWalk::UpdatePlaylistFile(Directory &directory,
if (plugin == nullptr)
return false;
- if (plugin->as_folder)
+ if (GetPlaylistPluginAsFolder(*plugin))
UpdatePlaylistFile(directory, name, info, *plugin);
PlaylistInfo pi(name, info.mtime);
diff --git a/src/db/update/SpecialDirectory.cxx b/src/db/update/SpecialDirectory.cxx
index 49c025d18..368bfb2db 100644
--- a/src/db/update/SpecialDirectory.cxx
+++ b/src/db/update/SpecialDirectory.cxx
@@ -52,7 +52,16 @@ static bool
HavePlaylistPluginForFilename(const char *filename) noexcept
{
const char *suffix = PathTraitsUTF8::GetFilenameSuffix(filename);
- return suffix != nullptr && playlist_suffix_supported(suffix);
+ if (suffix == nullptr)
+ return false;
+
+ const auto plugin = FindPlaylistPluginBySuffix(suffix);
+ if (plugin == nullptr)
+ return false;
+
+ /* discard the special directory if the user disables the
+ plugin's "as_directory" setting */
+ return GetPlaylistPluginAsFolder(*plugin);
}
bool
diff --git a/src/playlist/PlaylistRegistry.cxx b/src/playlist/PlaylistRegistry.cxx
index 5b7ef71d3..b9f6bb7ec 100644
--- a/src/playlist/PlaylistRegistry.cxx
+++ b/src/playlist/PlaylistRegistry.cxx
@@ -71,6 +71,9 @@ static constexpr unsigned n_playlist_plugins =
/** which plugins have been initialized successfully? */
static bool playlist_plugins_enabled[n_playlist_plugins];
+/** which plugins have the "as_folder" option enabled? */
+static bool playlist_plugins_as_folder[n_playlist_plugins];
+
#define playlist_plugins_for_each_enabled(plugin) \
playlist_plugins_for_each(plugin) \
if (playlist_plugins_enabled[playlist_plugin_iterator - playlist_plugins])
@@ -96,6 +99,10 @@ playlist_list_global_init(const ConfigData &config)
playlist_plugins_enabled[i] =
playlist_plugin_init(playlist_plugins[i], *param);
+
+ playlist_plugins_as_folder[i] =
+ param->GetBlockValue("as_directory",
+ playlist_plugins[i]->as_folder);
}
}
@@ -106,6 +113,16 @@ playlist_list_global_finish() noexcept
playlist_plugin_finish(plugin);
}
+bool
+GetPlaylistPluginAsFolder(const PlaylistPlugin &plugin) noexcept
+{
+ /* this loop has no end condition because it must finish when
+ the plugin was found */
+ for (std::size_t i = 0;; ++i)
+ if (playlist_plugins[i] == &plugin)
+ return playlist_plugins_as_folder[i];
+}
+
static std::unique_ptr<SongEnumerator>
playlist_list_open_uri_scheme(const char *uri, Mutex &mutex,
bool *tried)
diff --git a/src/playlist/PlaylistRegistry.hxx b/src/playlist/PlaylistRegistry.hxx
index 5e38ca23a..205fbb4b2 100644
--- a/src/playlist/PlaylistRegistry.hxx
+++ b/src/playlist/PlaylistRegistry.hxx
@@ -60,6 +60,14 @@ public:
};
/**
+ * Shall this playlists supported by this plugin be represented as
+ * directories in the database?
+ */
+gcc_const
+bool
+GetPlaylistPluginAsFolder(const PlaylistPlugin &plugin) noexcept;
+
+/**
* Opens a playlist by its URI.
*/
std::unique_ptr<SongEnumerator>