use super::QualityProfile;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Track {
pub file_path: PathBuf,
pub quality: QualityProfile,
pub title: Option<String>,
pub track_number: Option<u32>,
pub album: Option<String>,
pub artist: Option<String>,
pub album_artist: Option<String>,
pub year: Option<u32>,
pub genre: Option<String>,
pub comment: Option<String>,
pub composer: Option<String>,
}
impl Track {
pub fn new(file_path: PathBuf, quality: QualityProfile) -> Self {
Self {
file_path,
quality,
title: None,
track_number: None,
album: None,
artist: None,
album_artist: None,
year: None,
genre: None,
comment: None,
composer: None,
}
}
pub fn get_filename_stem(&self) -> String {
self.file_path
.file_stem()
.and_then(|s| s.to_str())
.unwrap_or("unknown")
.to_string()
}
pub fn get_extension(&self) -> Option<String> {
self.file_path
.extension()
.and_then(|s| s.to_str())
.map(|s| s.to_lowercase())
}
pub fn is_mp3(&self) -> bool {
matches!(self.get_extension().as_deref(), Some("mp3"))
}
pub fn is_m4a(&self) -> bool {
matches!(self.get_extension().as_deref(), Some("m4a" | "m4b"))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_track_creation() {
let quality = QualityProfile::new(128, 44100, 2, "mp3".to_string(), 3600.0).unwrap();
let track = Track::new(PathBuf::from("/path/to/track.mp3"), quality);
assert_eq!(track.get_filename_stem(), "track");
assert_eq!(track.get_extension(), Some("mp3".to_string()));
assert!(track.is_mp3());
assert!(!track.is_m4a());
}
#[test]
fn test_track_extensions() {
let quality = QualityProfile::new(128, 44100, 2, "aac".to_string(), 3600.0).unwrap();
let track_m4a = Track::new(PathBuf::from("/path/to/track.m4a"), quality.clone());
let track_m4b = Track::new(PathBuf::from("/path/to/track.m4b"), quality);
assert!(track_m4a.is_m4a());
assert!(track_m4b.is_m4a());
assert!(!track_m4a.is_mp3());
}
}