diff options
author | Max Kellermann <max@musicpd.org> | 2020-11-04 15:25:03 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2020-11-04 16:13:12 +0100 |
commit | 92a218b7a9f5b3d89682de28075f158e53c57464 (patch) | |
tree | e2a5969b990146e5cba9d6ff91a53b36b325593e /src | |
parent | d69a1f98af6a967bc740e383389c092cd22c1634 (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.cxx | 2 | ||||
-rw-r--r-- | src/db/update/SpecialDirectory.cxx | 11 | ||||
-rw-r--r-- | src/playlist/PlaylistRegistry.cxx | 17 | ||||
-rw-r--r-- | src/playlist/PlaylistRegistry.hxx | 8 |
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> |