summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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
4 files changed, 36 insertions, 2 deletions
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>