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.
This commit is contained in:
Max Kellermann
2020-11-04 15:25:03 +01:00
parent d69a1f98af
commit 92a218b7a9
7 changed files with 44 additions and 2 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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)

View File

@@ -59,6 +59,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.
*/