Skip to main content

qubit_mime/classifier/
ffprobe_command_media_stream_classifier_provider.rs

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