private void ImportSongs (LibraryImportManager manager, XmlNodeList songs) { foreach (XmlElement song in songs) { if (CheckForCanceled ()) { break; } processed++; string title = String.Empty, genre = String.Empty, artist = String.Empty, album = String.Empty; int year = 0, rating = 0, play_count = 0, track_number = 0; DateTime date_added = DateTime.Now, last_played = DateTime.MinValue; SafeUri uri = null; foreach (XmlElement child in song.ChildNodes) { if (child == null || child.InnerText == null || child.InnerText == String.Empty) { continue; } try { switch (child.Name) { case "title": title = child.InnerText; break; case "genre": genre = child.InnerText; break; case "artist": artist = child.InnerText; break; case "album": album = child.InnerText; break; case "track-number": track_number = Int32.Parse (child.InnerText); break; case "location": uri = new SafeUri (child.InnerText); break; case "date": if (child.InnerText != "0") { year = (new DateTime (1, 1, 1).AddDays (Double.Parse (child.InnerText))).Year; } break; case "rating": rating = Int32.Parse (child.InnerText); break; case "play-count": play_count = Int32.Parse (child.InnerText); break; case "last-played": last_played = Hyena.DateTimeUtil.ToDateTime (Int64.Parse (child.InnerText)); break; case "first-seen": date_added = Hyena.DateTimeUtil.ToDateTime (Int64.Parse (child.InnerText));; break; } } catch (Exception) { // parsing InnerText failed } } if (uri == null) { continue; } UpdateUserJob (processed, count, artist, title); try { DatabaseTrackInfo track = manager.ImportTrack (uri); if (track == null) { LogError (SafeUri.UriToFilename (uri), Catalog.GetString ("Unable to import song.")); continue; } track.TrackTitle = title; track.ArtistName = artist; track.Genre = genre; track.AlbumTitle = album; track.TrackNumber = track_number; track.Year = year; track.DateAdded = date_added; track.Rating = (rating >= 0 && rating <= 5) ? rating : 0; track.PlayCount = (play_count >= 0) ? play_count : 0; track.LastPlayed = last_played; track.Save (false); } catch (Exception e) { LogError (SafeUri.UriToFilename (uri), e); } } }
private void ProcessSong (LibraryImportManager import_manager, XmlReader xml_reader) { data.total_processed++; var itunes_id = 0; var title = String.Empty; var title_sort = String.Empty; var genre = String.Empty; var artist = String.Empty; var artist_sort = String.Empty; var album_artist = String.Empty; var album_artist_sort = String.Empty; var composer = String.Empty; var album = String.Empty; var album_sort = String.Empty; var grouping = String.Empty; var year = 0; var rating = 0; var play_count = 0; var track_number = 0; var date_added = DateTime.Now; var last_played = DateTime.MinValue; SafeUri uri = null; using (xml_reader) { while (xml_reader.ReadToFollowing ("key")) { xml_reader.Read(); string key = xml_reader.ReadContentAsString (); xml_reader.Read (); xml_reader.Read (); try { switch (key) { case "Track ID": itunes_id = Int32.Parse (xml_reader.ReadContentAsString ()); break; case "Name": title = xml_reader.ReadContentAsString (); break; case "Sort Name": title_sort = xml_reader.ReadContentAsString (); break; case "Genre": genre = xml_reader.ReadContentAsString (); break; case "Artist": artist = xml_reader.ReadContentAsString (); break; case "Sort Artist": artist_sort = xml_reader.ReadContentAsString (); break; case "Album Artist": album_artist = xml_reader.ReadContentAsString (); break; case "Sort Album Artist": album_artist_sort = xml_reader.ReadContentAsString (); break; case "Composer": composer = xml_reader.ReadContentAsString (); break; case "Album": album = xml_reader.ReadContentAsString (); break; case "Sort Album": album_sort = xml_reader.ReadContentAsString (); break; case "Grouping": grouping = xml_reader.ReadContentAsString (); break; case "Year": year = Int32.Parse (xml_reader.ReadContentAsString ()); break; case "Rating": rating = Int32.Parse (xml_reader.ReadContentAsString ()) / 20; break; case "Play Count": play_count = Int32.Parse (xml_reader.ReadContentAsString ()); break; case "Track Number": track_number = Int32.Parse (xml_reader.ReadContentAsString ()); break; case "Date Added": date_added = DateTime.Parse (xml_reader.ReadContentAsString (), DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeUniversal); break; case "Play Date UTC": last_played = DateTime.Parse (xml_reader.ReadContentAsString (), DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeUniversal); break; case "Location": uri = ConvertToLocalUri (xml_reader.ReadContentAsString ()); break; } } catch { } } } if (uri == null) { return; } UpdateUserJob (data.total_processed, data.total_songs, artist, title); try { DatabaseTrackInfo track = import_manager.ImportTrack (uri); if (track == null) { LogError (SafeUri.UriToFilename (uri), Catalog.GetString ("Unable to import song.")); return; } if (!String.IsNullOrEmpty (title)) { track.TrackTitle = title; } if (!String.IsNullOrEmpty (title_sort)) { track.TrackTitleSort = title_sort; } if (!String.IsNullOrEmpty (artist)) { track.ArtistName = artist; } if (!String.IsNullOrEmpty (artist_sort)) { track.ArtistNameSort = artist_sort; } if (!String.IsNullOrEmpty (genre)) { track.Genre = genre; } if (!String.IsNullOrEmpty (album_artist)) { track.AlbumArtist = album_artist; } if (!String.IsNullOrEmpty (album_artist_sort)) { track.AlbumArtistSort = album_artist_sort; } if (!String.IsNullOrEmpty (composer)) { track.Composer = composer; } if (!String.IsNullOrEmpty (album)) { track.AlbumTitle = album; } if (!String.IsNullOrEmpty (album_sort)) { track.AlbumTitleSort = album_sort; } if (!String.IsNullOrEmpty (grouping)) { track.Grouping = grouping; } if (year > 0) { track.Year = year; } if (data.get_ratings && rating > 0 && rating <= 5) { track.Rating = rating; } if (data.get_stats && play_count > 0) { track.PlayCount = play_count; } if (track_number > 0) { track.TrackNumber = track_number; } if (data.get_stats) { track.DateAdded = date_added; } if (data.get_stats && last_played > DateTime.MinValue) { track.LastPlayed = last_played; } data.track_ids.Add (itunes_id, track.TrackId); track.Save (false); } catch (Exception e) { LogError (SafeUri.UriToFilename (uri), e); } }