Show files as {track_number} - {track_title}

This commit is contained in:
Alexander
2026-07-25 11:56:30 +02:00
parent 82be15b960
commit 78b4338f95
2 changed files with 20 additions and 11 deletions
+17 -8
View File
@@ -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 ----
+3 -3
View File
@@ -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")
);
}