public static iTunesMusicLibrary GetDetailsFromXml(iTunesMusicLibrary existingLibrary) { string path = Settings.Instance.iTunesLibraryXMLPath; if (!File.Exists(path)) { throw new FileNotFoundException("iTunesLibraryXMLPath " + path + " not found!"); } XPathDocument doc = new XPathDocument(path); XPathNavigator nav = doc.CreateNavigator(); // Move to plist, then master library and tracks nav.MoveToChild("plist", ""); nav.MoveToChild("dict", ""); nav.MoveToChild("dict", ""); Dictionary<string, iTunesArtist> dictionaryArtist = new Dictionary<string, iTunesArtist>(); Dictionary<string, iTunesAlbum> dictionaryAlbum = new Dictionary<string, iTunesAlbum>(); Dictionary<string, iTunesAlbum> dictionaryUniqueAlbum = new Dictionary<string, iTunesAlbum>(); Dictionary<string, iTunesGenre> dictionaryGenre = new Dictionary<string, iTunesGenre>(); iTunesArtist childArtistFolder; iTunesAlbum childAlbumFolder; iTunesGenre childGenreFolder = null; iTunesAlbum childUniqueAlbumFolder; // Move to first track info bool success = nav.MoveToChild("dict", ""); //int count = 0; // Read each song until we have enough or no more iTunesMusicLibrary folder; if (existingLibrary == null) folder = new iTunesMusicLibrary(); else { folder = existingLibrary; ClearCache(folder); } folder.LastUpdate = DateTime.Now; while (success) { success = nav.MoveToFirstChild(); // Read each piece of information about the song Dictionary<string, string> data = new Dictionary<string, string>(); while (success) { string key = nav.Value; nav.MoveToNext(); data[key] = nav.Value; success = nav.MoveToNext(); } if (!data.ContainsKey("Name")) data.Add("Name", ""); if (!data.ContainsKey("Artist")) data.Add("Artist", ""); if (!data.ContainsKey("Album")) data.Add("Album", ""); if (!data.ContainsKey("Genre")) data.Add("Genre", ""); string uncPath = GetUncFileName(data["Location"]); if (string.IsNullOrEmpty(data["Artist"]) || string.IsNullOrEmpty(data["Album"])) { success = NewElement(nav, success); continue; } #if !DEBUG else if (!File.Exists(uncPath)) { Logger.ReportError(string.Format("MusicPlugin, file {0} does not exist, not added to iTunes Library", uncPath)); success = NewElement(nav, success); continue; } #endif else if (!MusicHelper.IsMusic(uncPath)) { Logger.ReportError(string.Format("MusicPlugin, file {0} is not supported, not added to iTunes Library", uncPath)); success = NewElement(nav, success); continue; } childGenreFolder = BuildGenre(dictionaryGenre, childGenreFolder, folder, data); childArtistFolder = BuildArtist(dictionaryArtist, childGenreFolder, folder, data); childAlbumFolder = BuildAlbum(dictionaryAlbum, childArtistFolder, data); iTunesSong newSong = BuildSong(childArtistFolder, childAlbumFolder, data); ReadFileImage(childAlbumFolder, newSong); if (dictionaryUniqueAlbum.ContainsKey(data["Album"])) childUniqueAlbumFolder = dictionaryUniqueAlbum[data["Album"]]; else { childUniqueAlbumFolder = new iTunesAlbum(); childUniqueAlbumFolder.Name = data["Album"]; childUniqueAlbumFolder.AlbumName = data["Album"]; childUniqueAlbumFolder.Id = childUniqueAlbumFolder.AlbumName.GetMD5(); folder.Albums.Add(childUniqueAlbumFolder); dictionaryUniqueAlbum.Add(data["Album"], childUniqueAlbumFolder); } childUniqueAlbumFolder.Songs.Add(newSong); childUniqueAlbumFolder.PrimaryImagePath = childAlbumFolder.PrimaryImagePath; childUniqueAlbumFolder.BackdropImagePath = childAlbumFolder.BackdropImagePath; success = NewElement(nav, success); } if (Settings.Instance.ShowPlaylistAsFolder) AddSpecialMusicFolder(folder); return folder; }
private static void ClearCache(iTunesMusicLibrary folder) { folder.Artists.Clear(); folder.Genres.Clear(); folder.Albums.Clear(); }
private static iTunesArtist BuildArtist(Dictionary<string, iTunesArtist> dictionaryArtist, iTunesGenre childGenreFolder, iTunesMusicLibrary folder, Dictionary<string, string> data) { iTunesArtist childArtistFolder; if (dictionaryArtist.ContainsKey(data["Artist"])) childArtistFolder = dictionaryArtist[data["Artist"]]; else { childArtistFolder = new iTunesArtist(); childArtistFolder.ArtistName = data["Artist"]; childArtistFolder.Id = childArtistFolder.Name.GetMD5(); if (childGenreFolder != null && !string.IsNullOrEmpty(data["Genre"])) { childGenreFolder.Artists.Add(childArtistFolder); } folder.Artists.Add(childArtistFolder); dictionaryArtist.Add(data["Artist"], childArtistFolder); } return childArtistFolder; }
private static iTunesGenre BuildGenre(Dictionary<string, iTunesGenre> dictionaryGenre, iTunesGenre childGenreFolder, iTunesMusicLibrary folder, Dictionary<string, string> data) { if (!string.IsNullOrEmpty(data["Genre"])) { if (dictionaryGenre.ContainsKey(data["Genre"])) childGenreFolder = dictionaryGenre[data["Genre"]]; else { childGenreFolder = new iTunesGenre(); childGenreFolder.GenreName = data["Genre"]; childGenreFolder.Id = childGenreFolder.Name.GetMD5(); folder.Genres.Add(childGenreFolder); dictionaryGenre.Add(data["Genre"], childGenreFolder); } } return childGenreFolder; }
private static void AddSpecialMusicFolder(iTunesMusicLibrary folder) { Folder musicFolder = MusicHelper.GetPlaylistFolder(); if (folder.Albums != null) folder.Albums.Add(musicFolder); if (folder.Artists != null) folder.Artists.Add(musicFolder); if (folder.Genres != null) folder.Genres.Add(musicFolder); }