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 | |
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.
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | doc/plugins.rst | 2 | ||||
-rw-r--r-- | doc/user.rst | 5 | ||||
-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 |
7 files changed, 44 insertions, 2 deletions
@@ -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> |