feat: implement multi-provider support in media library

- Introduced IProviderRegistry to manage multiple media providers.
- Updated AppState to use provider_registry instead of a single media_provider.
- Refactored library routes to support provider-specific queries for collections, series, genres, and items.
- Enhanced ProgrammingBlock to include provider_id for algorithmic and manual content types.
- Modified frontend components to allow selection of providers and updated API calls to include provider parameters.
- Adjusted hooks and types to accommodate provider-specific functionality.
This commit is contained in:
2026-03-14 23:59:21 +01:00
parent c53892159a
commit ead65e6be2
21 changed files with 468 additions and 150 deletions

View File

@@ -1,6 +1,7 @@
use axum::{Json, Router, extract::State, routing::get};
use domain::{IProviderRegistry as _, ProviderCapabilities, StreamingProtocol};
use crate::dto::ConfigResponse;
use crate::dto::{ConfigResponse, ProviderInfo};
use crate::state::AppState;
pub fn router() -> Router<AppState> {
@@ -8,8 +9,35 @@ pub fn router() -> Router<AppState> {
}
async fn get_config(State(state): State<AppState>) -> Json<ConfigResponse> {
let providers: Vec<ProviderInfo> = state
.provider_registry
.provider_ids()
.into_iter()
.filter_map(|id| {
state.provider_registry.capabilities(&id).map(|caps| ProviderInfo {
id: id.clone(),
capabilities: caps,
})
})
.collect();
let primary_capabilities = state
.provider_registry
.capabilities(state.provider_registry.primary_id())
.unwrap_or(ProviderCapabilities {
collections: false,
series: false,
genres: false,
tags: false,
decade: false,
search: false,
streaming_protocol: StreamingProtocol::DirectFile,
rescan: false,
});
Json(ConfigResponse {
allow_registration: state.config.allow_registration,
provider_capabilities: state.media_provider.capabilities(),
providers,
provider_capabilities: primary_capabilities,
})
}