Skip to main content

qubit_mime/classifier/
ffprobe_command_media_stream_classifier_provider.rs

1// =============================================================================
2//    Copyright (c) 2026 Haixing Hu.
3//
4//    SPDX-License-Identifier: Apache-2.0
5//
6//    Licensed under the Apache License, Version 2.0.
7// =============================================================================
8//! Provider for the built-in `ffprobe` media stream classifier.
9
10use crate::{
11    FfprobeCommandMediaStreamClassifier,
12    MediaStreamClassifier,
13    MimeConfig,
14    ProviderAvailability,
15    ProviderCreateError,
16    ProviderDescriptor,
17    ProviderRegistryError,
18    ServiceProvider,
19};
20
21use super::{
22    MediaStreamClassifierAvailability,
23    MediaStreamClassifierSpec,
24};
25
26/// Provider for the built-in FFprobe-backed media stream classifier.
27#[derive(Debug, Clone, Copy, Default)]
28pub struct FfprobeCommandMediaStreamClassifierProvider;
29
30impl ServiceProvider<MediaStreamClassifierSpec>
31    for FfprobeCommandMediaStreamClassifierProvider
32{
33    /// Gets FFprobe classifier metadata.
34    fn descriptor(&self) -> Result<ProviderDescriptor, ProviderRegistryError> {
35        let descriptor = ProviderDescriptor::new("ffprobe")
36            .expect("built-in FFprobe classifier provider id should be valid")
37            .with_aliases(&[
38                "ffprobe-command",
39                "ffprobe-command-media-stream-classifier",
40            ])
41            .expect("built-in FFprobe classifier aliases should be valid")
42            .with_priority(10);
43        Ok(descriptor)
44    }
45
46    /// Reports the provider as available.
47    ///
48    /// The classifier itself handles command execution lazily so temporary
49    /// `PATH` changes and best-effort refinement do not make registry creation
50    /// environment-sensitive.
51    fn availability(
52        &self,
53        _config: &MimeConfig,
54    ) -> MediaStreamClassifierAvailability {
55        ProviderAvailability::Available
56    }
57
58    /// Creates an FFprobe-backed classifier.
59    fn create_box(
60        &self,
61        config: &MimeConfig,
62    ) -> Result<Box<dyn MediaStreamClassifier>, ProviderCreateError> {
63        Ok(Box::new(
64            FfprobeCommandMediaStreamClassifier::from_mime_config(
65                config.clone(),
66            ),
67        ))
68    }
69}