392b8aa12a
Reconciles the compile-time provider registry with the cover_art_provider_settings table at boot, and on every admin update. Calls Configure() on each provider with the row data so runtime config (enabled, api_key) propagates immediately. Owns the cover_art_sources_meta.current_version stamp. UpdateProvider returns versionBumped=true only when the change altered the *enabled set* of providers — key rotations don't bump version (the recheck trigger is for "we have a new source to ask," not config rotations). Capability filtering: EnabledAlbumProviders / EnabledArtistProviders return only registered providers that (a) are enabled per DB and (b) implement the requested capability interface. Snapshots — callers don't mutate. ListProviderInfo builds the wire-shaped slice the admin GET handler returns. APIKeySet bool replaces echoing the key (credential never leaves the server). TestProvider dispatches to TestableProvider.TestConnection on the named provider, ErrNotTestable if the provider doesn't implement the capability, ErrProviderNotFound if not registered. UpdateProviderSettingsParams uses the sqlc-generated field names: Enabled bool (not *bool — the COALESCE is handled by passing the cached current value when patch.Enabled is nil), Column3 bool (apiKeyChanged flag), ApiKey *string (the api_key value — sqlc named this from the column, not Column4 as the task spec assumed). Tests gated on MINSTREL_TEST_DATABASE_URL: boot-inserts-defaults, flip-enabled-bumps-version, key-only-doesn't-bump, clear-key, TestProvider routing for testable / non-testable / missing, ListProviderInfo capability badges. Reuses newPool / discardLogger and fakeProvider / fakeAlbumProvider from enricher_test.go and provider_test.go (same package).