archive/List: add option to disable archive plugins in mpd.conf

Closes https://github.com/MusicPlayerDaemon/MPD/issues/1384
This commit is contained in:
Max Kellermann 2022-02-14 16:30:38 +01:00
parent d3db0400b0
commit fdc0329e64
11 changed files with 59 additions and 9 deletions

2
NEWS
View File

@ -2,6 +2,8 @@ ver 0.24 (not yet released)
* protocol
- "playlistfind"/"playlistsearch" have "sort" and "window" parameters
- filter "prio" (for "playlistfind"/"playlistsearch")
* archive
- add option to disable archive plugins in mpd.conf
* player
- add option "mixramp_analyzer" to scan MixRamp tags on-the-fly
* tags

View File

@ -1395,6 +1395,8 @@ xspf
Reads XSPF playlist files.
.. _archive_plugins:
Archive plugins
===============

View File

@ -341,6 +341,35 @@ The following table lists the input options valid for all plugins:
More information can be found in the :ref:`input_plugins` reference.
Configuring archive plugins
---------------------------
To configure an archive plugin, add an :code:`archive_plugin` block to
:file:`mpd.conf`:
.. code-block:: none
archive_plugin {
name "zzip"
enabled "no"
}
The following table lists the input options valid for all plugins:
.. list-table::
:widths: 20 80
:header-rows: 1
* - Name
- Description
* - **name**
- The name of the plugin
* - **enabled yes|no**
- Allows you to disable a plugin without recompiling. By
default, all plugins are enabled.
More information can be found in the :ref:`archive_plugins` reference.
.. _input_cache:
Configuring the Input Cache

View File

@ -385,7 +385,7 @@ MainConfigured(const CommandLineOptions &options,
initPermissions(raw_config);
spl_global_init(raw_config);
#ifdef ENABLE_ARCHIVE
const ScopeArchivePluginsInit archive_plugins_init;
const ScopeArchivePluginsInit archive_plugins_init{raw_config};
#endif
pcm_convert_global_init(raw_config);

View File

@ -20,6 +20,8 @@
#include "ArchiveList.hxx"
#include "ArchivePlugin.hxx"
#include "archive/Features.h"
#include "config/Data.hxx"
#include "config/Block.hxx"
#include "util/StringUtil.hxx"
#include "plugins/Bzip2ArchivePlugin.hxx"
#include "plugins/Iso9660ArchivePlugin.hxx"
@ -74,10 +76,21 @@ archive_plugin_from_name(const char *name) noexcept
return nullptr;
}
void archive_plugin_init_all()
void
archive_plugin_init_all(const ConfigData &config)
{
ConfigBlock empty;
for (unsigned i = 0; archive_plugins[i] != nullptr; ++i) {
const auto &plugin = *archive_plugins[i];
const auto *param =
config.FindBlock(ConfigBlockOption::ARCHIVE_PLUGIN,
"name", plugin.name);
if (param != nullptr && !param->GetBlockValue("enabled", true))
/* the plugin is disabled in mpd.conf */
continue;
if (plugin.init == nullptr || plugin.init())
archive_plugins_enabled[i] = true;
}
@ -86,8 +99,9 @@ void archive_plugin_init_all()
void
archive_plugin_deinit_all() noexcept
{
unsigned i = 0;
archive_plugins_for_each_enabled(plugin)
if (plugin->finish != nullptr)
if (archive_plugins_enabled[i++] && plugin->finish != nullptr)
plugin->finish();
}

View File

@ -22,6 +22,7 @@
#include <string_view>
struct ConfigData;
struct ArchivePlugin;
extern const ArchivePlugin *const archive_plugins[];
@ -42,7 +43,7 @@ archive_plugin_from_name(const char *name) noexcept;
/* this is where we "load" all the "plugins" ;-) */
void
archive_plugin_init_all();
archive_plugin_init_all(const ConfigData &config);
/* this is where we "unload" all the "plugins" */
void
@ -50,8 +51,8 @@ archive_plugin_deinit_all() noexcept;
class ScopeArchivePluginsInit {
public:
ScopeArchivePluginsInit() {
archive_plugin_init_all();
explicit ScopeArchivePluginsInit(const ConfigData &config) {
archive_plugin_init_all(config);
}
~ScopeArchivePluginsInit() noexcept {

View File

@ -91,6 +91,7 @@ enum class ConfigBlockOption {
DECODER,
INPUT,
INPUT_CACHE,
ARCHIVE_PLUGIN,
PLAYLIST_PLUGIN,
RESAMPLER,
AUDIO_FILTER,

View File

@ -90,6 +90,7 @@ const ConfigTemplate config_block_templates[] = {
{ "decoder", true },
{ "input", true },
{ "input_cache" },
{ "archive_plugin", true },
{ "playlist_plugin", true },
{ "resampler" },
{ "filter", true },

View File

@ -41,7 +41,7 @@ class GlobalInit {
EventThread io_thread;
#ifdef ENABLE_ARCHIVE
const ScopeArchivePluginsInit archive_plugins_init;
const ScopeArchivePluginsInit archive_plugins_init{config};
#endif
const ScopeInputPluginsInit input_plugins_init{config, io_thread.GetEventLoop()};

View File

@ -137,7 +137,7 @@ class GlobalInit {
EventThread io_thread;
#ifdef ENABLE_ARCHIVE
const ScopeArchivePluginsInit archive_plugins_init;
const ScopeArchivePluginsInit archive_plugins_init{config};
#endif
const ScopeInputPluginsInit input_plugins_init{config, io_thread.GetEventLoop()};

View File

@ -41,7 +41,7 @@ class GlobalInit {
EventThread io_thread;
#ifdef ENABLE_ARCHIVE
const ScopeArchivePluginsInit archive_plugins_init;
const ScopeArchivePluginsInit archive_plugins_init{config};
#endif
const ScopeInputPluginsInit input_plugins_init{config, io_thread.GetEventLoop()};