public override bool Equals(object obj) { if (obj is AlbumKey) { AlbumKey a = (AlbumKey)obj; return(_albumString == a._albumString && _albumArtistString == a._albumArtistString); } else { return(false); } }
/// <summary> /// Helper method to process an iTunes PLIST into a List of Album objects. /// </summary> /// <returns>Whether the process was successful or not.</returns> /// <exception cref="System.Exception">if the PLIST parsing failed.</exception> private static void ParseXml(string actualLibaryPath, PList libraryIndex, out IEnumerable <Album> outAlbums, out IEnumerable <Playlist> outPlaylists) { Contract.Requires(!string.IsNullOrEmpty(actualLibaryPath)); Contract.Requires(libraryIndex != null); // file://localhost/C:/Users/Steve/Music/iTunes/iTunes%20Media/ // file://localhost/Users/Steve/Music/iTunes/iTunes%20Media/ string musicFolderString = libraryIndex.GetStringOrDefault("Music Folder"); string declaredMediaPath = new Uri(musicFolderString).LocalPath; var absoluteMediaPath = GetAbsoluteMediaPathUri(actualLibaryPath, declaredMediaPath); IEnumerable <PList> trackListRaw = libraryIndex.GetOrDefault <PList>("Tracks").Values.Cast <PList>(); IEnumerable <PList> playlistListRaw = libraryIndex.GetOrDefault <List <object> >("Playlists").Cast <PList>(); if (string.IsNullOrEmpty(declaredMediaPath) || trackListRaw == null || playlistListRaw == null) { throw new InvalidOperationException(); } Dictionary <AlbumKey, AlbumBuilder> albumBuilders = new Dictionary <AlbumKey, AlbumBuilder>(); foreach (var trackInfoRaw in trackListRaw) { string trackLocationString = trackInfoRaw.GetStringOrDefault("Location"); long trackBitRateLong = trackInfoRaw.GetLongOrDefault("Bit Rate"); if (IsValidMediaKind(trackLocationString, trackBitRateLong)) { string titleString = trackInfoRaw.GetStringOrDefault("Name"); string albumString = trackInfoRaw.GetStringOrDefault("Album"); string artistString = trackInfoRaw.GetStringOrDefault("Artist"); string albumArtistString = trackInfoRaw.GetStringOrDefault("Album Artist") ?? artistString; int trackIDInt = trackInfoRaw.GetIntOrDefault("Track ID"); int discNumberInt = trackInfoRaw.GetIntOrDefault("Disc Number"); int trackNumberInt = trackInfoRaw.GetIntOrDefault("Track Number"); int yearInt = trackInfoRaw.GetIntOrDefault("Year"); int totalTimeInt = trackInfoRaw.GetIntOrDefault("Total Time"); var relativeTrackLocation = new Uri(trackLocationString).LocalPath.Replace(declaredMediaPath, string.Empty); string formattedLocationString = Path.Combine(absoluteMediaPath, relativeTrackLocation); AlbumBuilder albumBuilder; var albumBuilderID = new AlbumKey(albumString, albumArtistString); if (!albumBuilders.TryGetValue(albumBuilderID, out albumBuilder)) { albumBuilder = new AlbumBuilder(albumString, albumArtistString, yearInt); albumBuilders.Add(albumBuilderID, albumBuilder); } Contract.Assume(albumBuilder != null); // New AlbumBuilder should have been created if it doesn't yet exist. albumBuilder.AddTrack( trackID: trackIDInt, title: titleString, artist: artistString, discNumber: discNumberInt, trackNumber: trackNumberInt, location: formattedLocationString, totalTime: new TimeSpan(0, 0, totalTimeInt / 1000)); } } IEnumerable <Album> libraryAlbumsUnsorted = albumBuilders.Values.AsParallel().Select(thatBuilder => thatBuilder.GetAlbum()).ToList(); IEnumerable <Track> libraryTracksUnsorted = libraryAlbumsUnsorted.AsParallel().SelectMany(thatAlbum => thatAlbum.TrackList); List <Playlist> libraryPlaylists = new List <Playlist>(); foreach (var playlistInfoRaw in playlistListRaw) { List <object> playlistItemsRaw = playlistInfoRaw.GetOrDefault <List <object> >("Playlist Items"); if (playlistItemsRaw != null) { List <Track> playlistItems = playlistItemsRaw .Cast <PList>() // This is the only thing I can think of that would cause an exception in this method. .Select(thatPlist => thatPlist.GetIntOrDefault("Track ID")) .Join(libraryTracksUnsorted, itemIndex => itemIndex, track => track.TrackID, (index, track) => track).ToList(); if (playlistItems.Count > 0) { libraryPlaylists.Add(new Playlist(playlistInfoRaw.GetStringOrDefault("Name"), playlistItems)); } } } outAlbums = libraryAlbumsUnsorted.OrderBy(thatAlbum => thatAlbum.AlbumArtist).ThenBy(thatAlbum => thatAlbum.Title); outPlaylists = libraryPlaylists.OrderBy(playlist => playlist.Title); }