use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RawIndexLine {
pub metadata: Vec<(String, Vec<String>)>,
pub raw_lyric_file: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct LyricsEntry {
pub raw_lyric_file: String,
pub music_names: Vec<String>,
pub artists: Vec<String>,
pub albums: Vec<String>,
pub ncm_music_ids: Vec<String>,
pub qq_music_ids: Vec<String>,
pub apple_music_ids: Vec<String>,
pub spotify_ids: Vec<String>,
pub isrcs: Vec<String>,
pub ttml_authors: Vec<String>,
}
impl LyricsEntry {
pub fn title(&self) -> &str {
self.music_names.first().map_or("", String::as_str)
}
pub fn album(&self) -> &str {
self.albums.first().map_or("", String::as_str)
}
}
impl From<RawIndexLine> for LyricsEntry {
fn from(line: RawIndexLine) -> Self {
let mut entry = Self {
raw_lyric_file: line.raw_lyric_file,
..Self::default()
};
for (key, values) in line.metadata {
let field = match key.as_str() {
"musicName" => &mut entry.music_names,
"artists" => &mut entry.artists,
"album" => &mut entry.albums,
"ncmMusicId" => &mut entry.ncm_music_ids,
"qqMusicId" => &mut entry.qq_music_ids,
"appleMusicId" => &mut entry.apple_music_ids,
"spotifyId" => &mut entry.spotify_ids,
"isrc" => &mut entry.isrcs,
"ttmlAuthorGithubLogin" => &mut entry.ttml_authors,
_ => continue,
};
field.extend(
values
.into_iter()
.map(|value| value.trim().to_string())
.filter(|value| !value.is_empty()),
);
}
entry
}
}