use crate::testing_prelude::*;
pub struct AlbumGenerator;
impl AlbumGenerator {
pub(super) async fn generate_in_dir(
config: &AlbumConfig,
source_dir: &Path,
) -> Result<(), Failure<SampleAction>> {
Self::generate_files(config, source_dir).await
}
pub(super) async fn generate_files(
config: &AlbumConfig,
source_dir: &Path,
) -> Result<(), Failure<SampleAction>> {
create_dir_all(source_dir).map_err(Failure::wrap(SampleAction::CreateDirectory))?;
for track in &config.tracks {
let mut generator = FlacGenerator::new()
.with_filename(config.track_filename(track))
.with_bit_depth(config.format.depth.as_u16())
.with_sample_rate(config.format.rate.as_u32())
.with_frequency(track.frequency)
.with_artist(config.artist)
.with_album(config.album)
.with_title(track.title)
.with_track_number(track.track_number)
.with_date(config.year.to_string())
.with_disc_number(track.disc_number)
.with_cover_image();
if let Some(subdir) = config.disc_subdir(track) {
generator = generator.with_sub_directory(subdir);
}
if let Some(duration) = track.duration_secs {
generator = generator.with_duration_secs(duration);
}
generator.generate(source_dir).await?;
}
ImageGenerator::new()
.with_filename("cover.png")
.generate(source_dir)?;
let torrent_path = append_extension(source_dir, "torrent");
TorrentCreator::create(
source_dir,
&torrent_path,
format!("{RED_TRACKER_URL}/test/announce"),
Indexer::Red,
)
.await
.map_err(Failure::wrap(SampleAction::CreateTorrent))?;
Ok(())
}
}
fn append_extension(path: &Path, ext: &str) -> PathBuf {
let mut result = path.as_os_str().to_os_string();
result.push(".");
result.push(ext);
PathBuf::from(result)
}