librespot_metadata/audio/
file.rs

1use std::{
2    collections::HashMap,
3    fmt::Debug,
4    ops::{Deref, DerefMut},
5};
6
7use librespot_core::FileId;
8
9use librespot_protocol as protocol;
10pub use protocol::metadata::audio_file::Format as AudioFileFormat;
11use protocol::metadata::AudioFile as AudioFileMessage;
12
13use crate::util::impl_deref_wrapped;
14
15#[derive(Debug, Clone, Default)]
16pub struct AudioFiles(pub HashMap<AudioFileFormat, FileId>);
17
18impl_deref_wrapped!(AudioFiles, HashMap<AudioFileFormat, FileId>);
19
20impl AudioFiles {
21    pub fn is_ogg_vorbis(format: AudioFileFormat) -> bool {
22        matches!(
23            format,
24            AudioFileFormat::OGG_VORBIS_320
25                | AudioFileFormat::OGG_VORBIS_160
26                | AudioFileFormat::OGG_VORBIS_96
27        )
28    }
29
30    pub fn is_mp3(format: AudioFileFormat) -> bool {
31        matches!(
32            format,
33            AudioFileFormat::MP3_320
34                | AudioFileFormat::MP3_256
35                | AudioFileFormat::MP3_160
36                | AudioFileFormat::MP3_96
37                | AudioFileFormat::MP3_160_ENC
38        )
39    }
40
41    pub fn is_flac(format: AudioFileFormat) -> bool {
42        matches!(format, AudioFileFormat::FLAC_FLAC)
43    }
44}
45
46impl From<&[AudioFileMessage]> for AudioFiles {
47    fn from(files: &[AudioFileMessage]) -> Self {
48        let audio_files: HashMap<AudioFileFormat, FileId> = files
49            .iter()
50            .filter_map(|file| {
51                let file_id = FileId::from(file.file_id());
52                if file.has_format() {
53                    Some((file.format(), file_id))
54                } else {
55                    trace!("Ignoring file <{}> with unspecified format", file_id);
56                    None
57                }
58            })
59            .collect();
60
61        AudioFiles(audio_files)
62    }
63}