selene-core 0.6.0

selene-core is the backend for Selene, a local-first music player
Documentation
use std::{
    fs,
    io::Read,
    path::{Path, PathBuf},
};

use lunar_lib::config::Config;

use crate::{
    config::CommonConfig, media_container::ContainerFormat, utils::recurse_list_from_root,
};

// Config trait
impl Config for CommonConfig {
    const CONFIG_FILE_NAME: &'static str = "common";

    fn config_dir() -> Option<&'static Path> {
        Some(crate::config_dir())
    }
}

// Accessors
impl CommonConfig {
    #[must_use]
    pub fn sources(&self) -> &[PathBuf] {
        &self.library.source_directories
    }

    /// Returns all supported audio files from the configured source directories
    #[must_use]
    pub fn get_source_files(&self) -> Vec<PathBuf> {
        self.library
            .source_directories
            .iter()
            .flat_map(|path| -> Vec<PathBuf> {
                recurse_list_from_root(path, false)
                    .filter_map(|f| {
                        let mut file = fs::File::open(&f).ok()?;
                        let mut buf = [0_u8; 16];
                        file.read_exact(&mut buf).ok()?;
                        ContainerFormat::from_buf(&buf)?;
                        Some(f)
                    })
                    .collect()
            })
            .collect()
    }
}