selene-core 0.5.0

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

use lofty::{config::WriteOptions, tag::TagExt};
use lunar_lib::{
    database::Database,
    formatter::{FormatTable, format_str},
};

use crate::{
    config::common::common_config,
    database::LibraryDb,
    library::{artist::add_from_artists, track::Track},
};

pub fn export(
    track: &Track,
    export_dir: impl AsRef<Path>,
) -> Result<(), Box<dyn std::error::Error>> {
    let db = LibraryDb::open().unwrap();
    let export_path = {
        let mut format_table = FormatTable::new();
        format_table.extend_from_taggable(&track.metadata);
        add_from_artists(&mut format_table, &track.metadata.artists(&db)?, "track");
        if let Some(album) = track.album(&db)? {
            format_table.extend_from_taggable(&album.album);
        }

        let mut path = format_str(&common_config().track_name.format_string, &format_table)?;
        path.push_str(track.container().extension());

        export_dir.as_ref().join(path)
    };

    let buf = fs::read(track.container().path())?;
    let mut cursor = io::Cursor::new(buf);

    let tag = track.metadata_key_values()?;

    // for image_art in track.metadata.art {
    //     tag.insert_picture(picture, None)
    // }

    tag.save_to(&mut cursor, WriteOptions::default()).unwrap();

    fs::write(export_path, cursor.into_inner())?;

    Ok(())
}