public static List<MusicItemInfo> GetTree() { List<MusicItemInfo> items = new List<MusicItemInfo>(); IEnumerable<MusicTrackInfo> tracks = files.Select(file => new MusicTrackInfo() { Path = file, Tag = EncodingFixer.FixProperties(TagLib.File.Create(file).Tag) }); const string otherDirName = "Other"; List<string> artists = tracks.GroupBy(track => track.Tag.JoinedAlbumArtists) .Select(grp => GetStringOrReplacement(grp.First().Tag.JoinedAlbumArtists, otherDirName)).ToList(); artists.Sort(); foreach (string artist in artists) { MusicCollectionInfo artistInfo = new MusicCollectionInfo { Name = artist, Children = new List<MusicItemInfo>() }; items.Add(artistInfo); IEnumerable<MusicTrackInfo> tracksByArtist = tracks .Where(track => GetStringOrReplacement(track.Tag.JoinedAlbumArtists, otherDirName) == artist); if (artist == otherDirName) AddTracksToTree(tracksByArtist, artistInfo, items); else { List<string> albums = tracksByArtist.GroupBy(tag => tag.Tag.Album) .Select(grp => grp.First().Tag.Album).ToList(); albums.Sort(); foreach (string album in albums) { IEnumerable<MusicTrackInfo> tracksByAlbum = tracksByArtist.Where(track => track.Tag.Album == album); if (String.IsNullOrEmpty(album)) AddTracksToTree(tracksByAlbum, artistInfo, items); else { MusicCollectionInfo albumInfo = new MusicCollectionInfo() { Name = album, Parent = artistInfo, Children = new List<MusicItemInfo>() }; items.Add(albumInfo); artistInfo.Children.Add(albumInfo); AddTracksToTree(tracksByAlbum, albumInfo, items); } } } } return items; }
public void ThenShouldBeAbleToGetTree() { List<MusicItemInfo> trueItems = new List<MusicItemInfo>(); string dir1 = DirUtils.GetAbsoluteDir(DirUtils.dir1); string dir2 = DirUtils.GetAbsoluteDir(DirUtils.dir2); MusicCollectionInfo[] topLevel = new MusicCollectionInfo[] { new MusicCollectionInfo() { Name = "In Flames", Children = new List<MusicItemInfo>() { new MusicCollectionInfo() { Name = "A Sense Of Purpose", Children = new List<MusicItemInfo>() { new MusicTrackInfo() { Name = "Alias", Path = dir1 + "Alias.m4a" } } } } }, new MusicCollectionInfo() { Name = "Linkin Park", Children = new List<MusicItemInfo>() { new MusicCollectionInfo() { Name = "Hybrid Theory [Bonus CD] Disc 1", Children = new List<MusicItemInfo>() { new MusicTrackInfo() { Name = "Papercut", Path = dir2 + "01 - Papercut.mp3" }, new MusicTrackInfo() { Name = "One Step Closer", Path = dir2 + "02 - One Step Closer.mp3" }, new MusicTrackInfo() { Name = "With You", Path = dir2 + "03 - With You.mp3" }, new MusicTrackInfo() { Name = "Points of Authority", Path = dir2 + "04 - Points of Authority.mp3" } } }, new MusicCollectionInfo() { Name = "OST Transformers: Revenge of the Fallen", Children = new List<MusicItemInfo>() { new MusicTrackInfo() { Name = "New Divide", Path = dir2 + "New Divide.mp3" } } } } }, new MusicCollectionInfo() { Name = "Other", Children = new List<MusicItemInfo>() { new MusicTrackInfo() { Name = "Phantom of the Opera", Path = dir1 + "Phantom of the Opera.mp3" } } }, new MusicCollectionInfo() { Name = "Ария", Children = new List<MusicItemInfo>() { new MusicCollectionInfo() { Name = "Смутное Время", Children = new List<MusicItemInfo>() { new MusicTrackInfo() { Name = "Я свободен!", Path = dir1 + "Ya svoboden.mp3" } } } } } }; foreach (MusicItemInfo item in topLevel) PrepareItemsRecursive(trueItems, item); List<MusicItemInfo> actualItems = FilesList.GetTree(); Assert.AreEqual(trueItems.Count, actualItems.Count); for (int i = 0; i < trueItems.Count; i++) { MusicItemInfo expectedItem = trueItems[i], actualItem = actualItems[i]; Assert.AreEqual(expectedItem.GetType(), actualItem.GetType()); Assert.AreEqual(expectedItem.Name, actualItem.Name); if (expectedItem is MusicCollectionInfo) Assert.AreEqual((expectedItem as MusicCollectionInfo).Children.Count, (actualItem as MusicCollectionInfo).Children.Count); else Assert.AreEqual((expectedItem as MusicTrackInfo).Path, (actualItem as MusicTrackInfo).Path); } }
private static void AddTracksToTree(IEnumerable<MusicTrackInfo> tracks, MusicCollectionInfo parent, List<MusicItemInfo> items) { foreach (MusicTrackInfo track in tracks) { track.Name = String.IsNullOrEmpty(track.Tag.Title) ? new FileInfo(track.Path).Name : track.Tag.Title; track.Parent = parent; parent.Children.Add(track); items.Add(track); } }