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()?;
tag.save_to(&mut cursor, WriteOptions::default()).unwrap();
fs::write(export_path, cursor.into_inner())?;
Ok(())
}