using DeepDrftContent.FileDatabase.Models; namespace DeepDrftContent.Processors; /// /// Dispatches an audio file to the correct format processor by extension. The single seam through /// which processes uploads, so callers depend on one abstraction /// rather than three concrete processors. /// public class AudioProcessorRouter { private readonly AudioProcessor _wavProcessor; private readonly Mp3AudioProcessor _mp3Processor; private readonly FlacAudioProcessor _flacProcessor; public AudioProcessorRouter( AudioProcessor wavProcessor, Mp3AudioProcessor mp3Processor, FlacAudioProcessor flacProcessor) { _wavProcessor = wavProcessor; _mp3Processor = mp3Processor; _flacProcessor = flacProcessor; } /// /// Processes with the processor matching its extension, returning a /// store plan (extracted metadata plus a streamed writer for the /// canonical vault bytes). Throws for unsupported extensions. /// public async Task ProcessAudioFileAsync(string filePath, CancellationToken cancellationToken = default) { var ext = Path.GetExtension(filePath).ToLowerInvariant(); return ext switch { ".wav" => await _wavProcessor.ProcessWavFileAsync(filePath, cancellationToken), ".mp3" => await _mp3Processor.ProcessMp3FileAsync(filePath, cancellationToken), ".flac" => await _flacProcessor.ProcessFlacFileAsync(filePath, cancellationToken), _ => throw new ArgumentException($"Unsupported audio format: {ext}", nameof(filePath)), }; } }