From d330c5f0bda45de6477f6758e553b96534fac21e Mon Sep 17 00:00:00 2001 From: G2_Games Date: Fri, 3 Nov 2023 12:29:04 -0500 Subject: [PATCH] Switched album list to BTreeMap, improved perf --- src/music_storage/music_db.rs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/music_storage/music_db.rs b/src/music_storage/music_db.rs index a115e53..5070d97 100644 --- a/src/music_storage/music_db.rs +++ b/src/music_storage/music_db.rs @@ -1,7 +1,7 @@ use file_format::{FileFormat, Kind}; use lofty::{AudioFile, ItemKey, ItemValue, Probe, TagType, TaggedFileExt}; use std::ffi::OsStr; -use std::collections::{HashMap, HashSet}; +use std::collections::{HashMap, HashSet, BTreeMap}; use std::{error::Error, io::BufReader}; use chrono::{serde::ts_seconds_option, DateTime, Utc}; @@ -766,7 +766,7 @@ impl MusicLibrary { } pub fn albums(&self) -> Result, Box> { - let mut albums: Vec = Vec::new(); + let mut albums: BTreeMap<&String, Album> = BTreeMap::new(); for result in &self.library { let title = match result.get_tag(&Tag::Album){ Some(title) => title, @@ -774,26 +774,21 @@ impl MusicLibrary { }; normalize(title); - match albums.binary_search_by_key(&title, |album| { - normalize(&album.title); - album.title - }) { - Ok(pos) => { - albums[pos].tracks.push(result); - }, - Err(pos) => { + match albums.get_mut(&title) { + Some(album) => album.tracks.push(result), + None => { let new_album = Album { title, artist: result.get_tag(&Tag::AlbumArtist), tracks: vec![result], cover: None, }; - albums.insert(pos, new_album); + albums.insert(title, new_album); } } } - Ok(albums) + Ok(albums.into_par_iter().map(|album| album.1).collect()) } }