/// <summary> /// Maps the specified iTunes playlist to a directory structure. /// </summary> /// <param name="playlistName">The playlist.</param> /// <returns>A directory structure which represents the specified iTunes playlist</returns> public static IEnumerable<ITunesDirectoryInfo> MapPlaylistToDirectoryStructure(string playlistName) { if (String.IsNullOrEmpty(playlistName)) throw new ArgumentException("The playlist name name cannot be null or empty", Reflector.GetMemberName(() => playlistName)); var root = new ITunesDirectoryInfo(playlistName); var files = new iTunesApp() .LibrarySource .Playlists .ItemByName[playlistName] .Tracks .Cast<IITFileOrCDTrack>(); var tracksByArtist = files .GroupBy(file => file.Artist) .OrderBy(group => group.Key); var artistDirectories = new List<ITunesDirectoryInfo>(); foreach (var artistGroup in tracksByArtist) { var albumGroups = artistGroup .GroupBy(track => track.Album); // The artist name has to be normalized, so that it doesn't contain any characters that are invalid for a path string artistName = NormalizeArtistOrAlbumName(artistGroup.Key); var albumDirectories = albumGroups .Select(album => new { Album = album, AlbumName = NormalizeArtistOrAlbumName(album.Key) }) .Select ( directory => new ITunesDirectoryInfo ( directory.AlbumName, directory.Album .Where(track => track.Location != null) .Select ( track => (IFileInfo)new LocalFileInfo(new FileInfo(track.Location)) ), null ) ) .ToList(); //Execute the query immediately, because a streaming causes weird bugs var artistDirectory = new ITunesDirectoryInfo(artistName, albumDirectories, root); foreach (ITunesDirectoryInfo albumDirectory in artistDirectory.GetDirectories()) { albumDirectory.Parent = artistDirectory; } artistDirectories.Add(artistDirectory); } return artistDirectories; }
/// <summary> /// Maps the specified iTunes playlist to a directory structure. /// </summary> /// <param name="playlistName">The playlist.</param> /// <returns>A directory structure which represents the specified iTunes playlist</returns> public static IEnumerable <ITunesDirectoryInfo> MapPlaylistToDirectoryStructure(string playlistName) { if (String.IsNullOrEmpty(playlistName)) { throw new ArgumentException("The playlist name name cannot be null or empty", Reflector.GetMemberName(() => playlistName)); } var root = new ITunesDirectoryInfo(playlistName); var files = new iTunesApp() .LibrarySource .Playlists .ItemByName[playlistName] .Tracks .Cast <IITFileOrCDTrack>(); var tracksByArtist = files .GroupBy(file => file.Artist) .OrderBy(group => group.Key); var artistDirectories = new List <ITunesDirectoryInfo>(); foreach (var artistGroup in tracksByArtist) { var albumGroups = artistGroup .GroupBy(track => track.Album); // The artist name has to be normalized, so that it doesn't contain any characters that are invalid for a path string artistName = NormalizeArtistOrAlbumName(artistGroup.Key); var albumDirectories = albumGroups .Select(album => new { Album = album, AlbumName = NormalizeArtistOrAlbumName(album.Key) }) .Select ( directory => new ITunesDirectoryInfo ( directory.AlbumName, directory.Album .Where(track => track.Location != null) .Select ( track => (IFileInfo) new LocalFileInfo(new FileInfo(track.Location)) ), null ) ) .ToList(); //Execute the query immediately, because a streaming causes weird bugs var artistDirectory = new ITunesDirectoryInfo(artistName, albumDirectories, root); foreach (ITunesDirectoryInfo albumDirectory in artistDirectory.GetDirectories()) { albumDirectory.Parent = artistDirectory; } artistDirectories.Add(artistDirectory); } return(artistDirectories); }