Ajoute la source pmoparadise au mediaserver

This commit is contained in:
2025-10-17 12:01:36 +02:00
parent 4e5f86730d
commit 0ddf7d9637
6 changed files with 204 additions and 23 deletions

View File

@@ -65,6 +65,15 @@ pub struct QobuzCredentials {
pub password: Option<String>,
}
/// Paramètres pour Radio Paradise (actuellement vide, mais peut être étendu)
#[cfg(feature = "paradise")]
#[derive(Debug, Deserialize, utoipa::ToSchema)]
pub struct ParadiseParams {
/// Capacité FIFO (optionnelle, 50 par défaut)
#[serde(default)]
pub fifo_capacity: Option<usize>,
}
/// Réponse d'enregistrement de source
#[derive(Debug, Serialize, utoipa::ToSchema)]
pub struct SourceRegisteredResponse {
@@ -226,6 +235,65 @@ async fn register_qobuz(Json(creds): Json<QobuzCredentials>) -> impl IntoRespons
.into_response()
}
/// Enregistre une source Radio Paradise
///
/// Enregistre une nouvelle source Radio Paradise (ne nécessite pas d'authentification).
#[cfg(feature = "paradise")]
#[utoipa::path(
post,
path = "/sources/paradise",
request_body = ParadiseParams,
responses(
(status = 201, description = "Source enregistrée", body = SourceRegisteredResponse),
(status = 400, description = "Erreur d'enregistrement", body = ErrorResponse),
),
tag = "sources"
)]
async fn register_paradise(Json(params): Json<ParadiseParams>) -> impl IntoResponse {
use pmoparadise::{RadioParadiseClient, RadioParadiseSource};
let registry = get_source_registry().await;
// Créer le client (Radio Paradise ne nécessite pas d'auth)
let client = match RadioParadiseClient::new().await {
Ok(c) => c,
Err(e) => {
return (
StatusCode::BAD_REQUEST,
Json(ErrorResponse {
error: format!("Failed to create Radio Paradise client: {}", e),
}),
)
.into_response();
}
};
// Récupérer l'URL de base du serveur depuis la config
let config = pmoconfig::get_config();
let port = config.get_http_port();
let base_url = format!("http://localhost:{}", port);
// Créer et enregistrer la source
let source = if let Some(capacity) = params.fifo_capacity {
Arc::new(RadioParadiseSource::new(client, &base_url, capacity))
} else {
Arc::new(RadioParadiseSource::new_default(client, &base_url))
};
let source_id = source.as_ref().id().to_string();
registry.register(source).await;
(
StatusCode::CREATED,
Json(SourceRegisteredResponse {
message: "Radio Paradise source registered successfully".to_string(),
source_id,
}),
)
.into_response()
}
/// Désenregistre une source musicale
///
/// Supprime une source du registre par son ID.
@@ -281,19 +349,52 @@ async fn unregister_source(Path(id): Path<String>) -> impl IntoResponse {
pub fn sources_api_router() -> Router {
let mut router = Router::new()
.route("/sources", get(list_sources))
.route("/sources/:id", get(get_source))
.route("/sources/:id", delete(unregister_source));
.route("/sources/{id}", get(get_source))
.route("/sources/{id}", delete(unregister_source));
#[cfg(feature = "qobuz")]
{
router = router.route("/sources/qobuz", post(register_qobuz));
}
#[cfg(feature = "paradise")]
{
router = router.route("/sources/paradise", post(register_paradise));
}
router
}
/// Structure pour la documentation OpenAPI
#[cfg(feature = "qobuz")]
/// Structure pour la documentation OpenAPI (Qobuz + Paradise)
#[cfg(all(feature = "qobuz", feature = "paradise"))]
#[derive(utoipa::OpenApi)]
#[openapi(
paths(
list_sources,
get_source,
unregister_source,
register_qobuz,
register_paradise,
),
components(
schemas(
SourceInfo,
SourceCapabilitiesInfo,
SourcesList,
SourceRegisteredResponse,
ErrorResponse,
QobuzCredentials,
ParadiseParams,
)
),
tags(
(name = "sources", description = "Gestion des sources musicales")
)
)]
pub struct SourcesApiDoc;
/// Structure pour la documentation OpenAPI (Qobuz uniquement)
#[cfg(all(feature = "qobuz", not(feature = "paradise")))]
#[derive(utoipa::OpenApi)]
#[openapi(
paths(
@@ -318,8 +419,34 @@ pub fn sources_api_router() -> Router {
)]
pub struct SourcesApiDoc;
/// Structure pour la documentation OpenAPI (sans Qobuz)
#[cfg(not(feature = "qobuz"))]
/// Structure pour la documentation OpenAPI (Paradise uniquement)
#[cfg(all(feature = "paradise", not(feature = "qobuz")))]
#[derive(utoipa::OpenApi)]
#[openapi(
paths(
list_sources,
get_source,
unregister_source,
register_paradise,
),
components(
schemas(
SourceInfo,
SourceCapabilitiesInfo,
SourcesList,
SourceRegisteredResponse,
ErrorResponse,
ParadiseParams,
)
),
tags(
(name = "sources", description = "Gestion des sources musicales")
)
)]
pub struct SourcesApiDoc;
/// Structure pour la documentation OpenAPI (sans sources spécifiques)
#[cfg(not(any(feature = "qobuz", feature = "paradise")))]
#[derive(utoipa::OpenApi)]
#[openapi(
paths(