From 78b4338f9597d58d4ae6671671c774e38c1e8180 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 25 Jul 2026 11:56:30 +0200 Subject: [PATCH] Show files as {track_number} - {track_title} --- crates/musicfs-client/src/virtual_dirs.rs | 25 ++++++++++++++------- crates/musicfs-client/tests/control_test.rs | 6 ++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/crates/musicfs-client/src/virtual_dirs.rs b/crates/musicfs-client/src/virtual_dirs.rs index f1335ca..854c163 100644 --- a/crates/musicfs-client/src/virtual_dirs.rs +++ b/crates/musicfs-client/src/virtual_dirs.rs @@ -127,13 +127,22 @@ pub fn restore_virtual_paths( /// `origins::local::snapshot::read_into_map`: /// - artist dir = `album_artist` if set, else `artists.join("-")` /// - if `track_title` is non-empty, the filename becomes -/// `{track_title}.{ext}` where ext is preserved from `current_name` +/// `{track_number:02} - {track_title}.{ext}` (zero-padded track number +/// when > 0, otherwise just `{track_title}.{ext}`), ext preserved from +/// `current_name` /// - otherwise the filename is unchanged /// Returns `(new_name, new_local_path)`. pub fn compute_new_layout(current_name: &str, mm: &MusicMetadata) -> (String, PathBuf) { let artist_dir = artist_dir(mm); let filename = match &mm.track_title { - title if !title.is_empty() => rename_with_extension(current_name, title), + title if !title.is_empty() => { + let stem = if mm.track_number > 0 { + format!("{:02} - {}", mm.track_number, title) + } else { + title.clone() + }; + rename_with_extension(current_name, &stem) + } _ => current_name.to_string(), }; @@ -263,10 +272,10 @@ mod tests { "Shine On You Crazy Diamond", ); let (name, path) = compute_new_layout("01-track.flac", &mm); - assert_eq!(name, "Shine On You Crazy Diamond.flac"); + assert_eq!(name, "01 - Shine On You Crazy Diamond.flac"); assert_eq!( path, - PathBuf::from("Pink Floyd/Wish You Were Here/Shine On You Crazy Diamond.flac") + PathBuf::from("Pink Floyd/Wish You Were Here/01 - Shine On You Crazy Diamond.flac") ); } @@ -274,14 +283,14 @@ mod tests { fn compute_new_layout_preserves_extension_through_rename() { let mm = mm("A", "B", "New Title"); let (name, _) = compute_new_layout("old.mp3", &mm); - assert_eq!(name, "New Title.mp3"); + assert_eq!(name, "01 - New Title.mp3"); } #[test] fn compute_new_layout_handles_multi_dot_extensions() { let mm = mm("A", "B", "New"); let (name, _) = compute_new_layout("old.tar.gz", &mm); - assert_eq!(name, "New.gz", "only the final extension is preserved"); + assert_eq!(name, "01 - New.gz", "only the final extension is preserved"); } #[test] @@ -298,7 +307,7 @@ mod tests { let mut metadata = mm("Secondary", "Album", "Title"); metadata.album_artist = Some("Primary Artist".to_string()); let (_, path) = compute_new_layout("track.flac", &metadata); - assert_eq!(path, PathBuf::from("Primary Artist/Album/Title.flac")); + assert_eq!(path, PathBuf::from("Primary Artist/Album/01 - Title.flac")); } #[test] @@ -306,7 +315,7 @@ mod tests { let mut metadata = mm("Foo", "Album", "Title"); metadata.artist = vec!["Foo".to_string(), "Bar".to_string()]; let (_, path) = compute_new_layout("track.flac", &metadata); - assert_eq!(path, PathBuf::from("Foo-Bar/Album/Title.flac")); + assert_eq!(path, PathBuf::from("Foo-Bar/Album/01 - Title.flac")); } // ---- find_orphaned_dirs ---- diff --git a/crates/musicfs-client/tests/control_test.rs b/crates/musicfs-client/tests/control_test.rs index 4faa1c7..6d6a166 100644 --- a/crates/musicfs-client/tests/control_test.rs +++ b/crates/musicfs-client/tests/control_test.rs @@ -232,7 +232,7 @@ async fn update_removes_orphaned_virtual_dirs_when_last_file_moves_out() { let item = guard.get(&INodeNo(100)).expect("file still present"); assert_eq!( item.local_path, - std::path::PathBuf::from("New Artist/New Album/New Title.flac") + std::path::PathBuf::from("New Artist/New Album/01 - New Title.flac") ); } @@ -471,10 +471,10 @@ async fn update_changes_tags_and_response_reflects_new_values() { assert_eq!(mm.track_number, 7); // Layout was recomputed from the new metadata. - assert_eq!(item.name, "Updated Title.flac"); + assert_eq!(item.name, "07 - Updated Title.flac"); assert_eq!( item.local_path, - std::path::PathBuf::from("Updated Artist/Updated Album/Updated Title.flac") + std::path::PathBuf::from("Updated Artist/Updated Album/07 - Updated Title.flac") ); }