/
magnusroot
/
nm
Обзор
Документация
Войти
/
magnusroot
/
nm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
crates/library/src/model.rs
63 строки
2 KB
Magnus Root
First version
13 июл 2026, 09:24
13 июл 2026, 09:24
50f8b8c
Код
Авторство
О чём код?
use std::path::{Path, PathBuf}; use std::time::Duration; #[derive(Debug, Clone, PartialEq)] pub struct Track { pub path: PathBuf, pub title: String, pub artist: String, pub album: String, pub album_artist: Option<String>, pub track_no: Option<u32>, pub disc_no: Option<u32>, pub year: Option<i32>, pub genre: Option<String>, pub duration: Option<Duration>, /// Если трек — часть cue-листа (несколько логических треков в одном физическом файле), /// здесь его диапазон внутри файла. `cue_end == None` означает "до конца файла" /// (последний трек на cue-листе). pub cue_start: Option<Duration>, pub cue_end: Option<Duration>, /// Значение из тега ReplayGain (REPLAYGAIN_TRACK_GAIN и аналоги в других форматах), /// в децибелах, если тег есть в файле — для выравнивания громкости между треками. pub replay_gain_db: Option<f32>, } impl Track { /// Ключ группировки в альбом: (album_artist или artist, album). pub fn album_key(&self) -> (String, String) { let artist = self.album_artist.clone().unwrap_or_else(|| self.artist.clone()); (artist, self.album.clone()) } pub fn file_name(&self) -> String { self.path .file_name() .and_then(|n| n.to_str()) .unwrap_or("") .to_string() } } #[derive(Debug, Clone)] pub struct AlbumView<'a> { pub artist: String, pub album: String, pub tracks: Vec<&'a Track>, } pub(crate) const AUDIO_EXTENSIONS: &[&str] = &["mp3", "flac", "ogg", "oga", "wav", "m4a", "aac"]; pub(crate) fn is_audio_file(path: &Path) -> bool { path.extension() .and_then(|e| e.to_str()) .map(|ext| AUDIO_EXTENSIONS.contains(&ext.to_lowercase().as_str())) .unwrap_or(false) } pub(crate) fn is_cue_file(path: &Path) -> bool { path.extension() .and_then(|e| e.to_str()) .map(|ext| ext.eq_ignore_ascii_case("cue")) .unwrap_or(false) }