/// <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;
        }
Beispiel #2
0
        /// <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);
        }