Here are my thoughts about what is required from the updating components point of view (informational fields for users may be left out). The format is a data-only subset of Lua 5.1, because it's less verbos than XML:
Component {
-- same information that appears in Components section in preferences,
-- so a tool can be used to extract that automatically
name = "Playlists tools",
version = "1.5.3",
description = "...",
-- declares that this component replaces an older component,
-- also used to track component name changes
supersedes = "Utilities",
-- name of the DLL that implements this component, a DLL can contain
-- multiple components, for example "Playlist tools" and "Text tools" in foo_utils
-- or the different archive format readers in foo_unpack.
-- used to determine which DLL to download/update
dllname = "foo_utils",
-- foobar2000 version that this component has been designed for
coreVersion = "0.9",
-- used to determine if foobar2000 can load this component atall,
-- reported by the component entrypoint function, so it can be
-- extracted by the same tool that gets the name, version and description
clientVersion = 71,
-- a link to the download location of this file, either on the central repository
-- or on the site of the component's author
tracker = "http://...",
}
This allows searching for functionality and describes where that functionality is implemented, now for ways to describe how to install that functionality:
-- download declaration for a raw DLL file
Dll {
-- which components are implemented in this Dll, strings are a concatenation
-- of component name and version instead of DLL name to make matching
-- more robust in the presence of multiple versions of the same component
contains = {"Playlist tools|1.5.3", "Text tools|1.0"},
-- download link
download = "http://.../foo_utils.dll",
}
-- alternatively, an archive with a fixed internal layout can be used,
-- I propose one that is similar to the format i use for the "component archives" on my site
DllArchive {
-- see comments for Dll, but an archive could contain more than one DLL
contains = {"Playlist tools|1.5.3", "Text tools|1.0"},
-- download link
download = "http://.../foo_utils-x.y.z.zip",
}
-- the final alternative for components that require special setup procedures
DllInstaller {
-- see comments for Dll, but an installer could contain more than one DLL
contains = {"COM Automation Server|0.7"},
-- download link
download = "http://.../foo_comserver2-0.7-setup.exe",
}
I'm not sure, if it is a good idea to have raw DLL downloads, but I included it for the sake of completeness.
The goal of this approach is to have as much of the component description file as possible generated from already existing data. What's still missing is tracking of intercomponent dependencies.