use crate::{cache::Cache, fetchers::lrclib::Lrclib, info_log, lyrics::Lyrics, song::SongData};
pub mod lrclib;
const MAX_TITLE_LENGTH: usize = 25;
const RESPONSE_TIMEOUT: f64 = 5.0;
const MAX_DEVIATION: f64 = 1.;
pub(crate) trait Fetcher {
async fn fetch(data: &SongData) -> Option<Vec<Lyrics>>;
}
pub async fn fetch_all(data: &SongData, cache: &mut Cache) -> Option<Lyrics> {
if let Some(lyrics) = cache.get_lyrics(data) {
info_log(format!("Found cached lyrics for {}", data.get_title_truncated(MAX_TITLE_LENGTH - 10)));
return Some(lyrics);
}
info_log(format!("Requesting {}", data.get_title_truncated(MAX_TITLE_LENGTH)));
let choices = Lrclib::fetch(data).await?;
info_log(format!("Found {} lyrics", choices.len()));
let lyrics = choices.into_iter().nth(0);
cache.save_lyrics(data, &lyrics, 1);
match cache.clone().save_to_file().await {
Ok(_) => {},
Err(e) => info_log(format!("Error saving cache: {}", e)),
};
*cache = Cache::read_from_file(&cache.location, cache.max_size).await.unwrap();
lyrics
}