/// <summary> /// Fetches the tracklist of the clicked release and displays it. /// </summary> /// <param name="sender">Clicked release as <see cref="LastAlbum"/>.</param> /// <param name="e">Ignored.</param> public async void ReleaseClicked(object sender, EventArgs e) { if (EnableControls) { EnableControls = false; try { var release = sender as Release; OnStatusUpdated(string.Format("Trying to fetch tracklist from release '{0}'", release.Name)); LastResponse <LastAlbum> response = null; if (!string.IsNullOrEmpty(release.Mbid)) { response = await _lastfmAlbumAPI.GetInfoByMbidAsync(release.Mbid); } else { response = await _lastfmAlbumAPI.GetInfoAsync(release.ArtistName, release.Name); } if (response.Success && response.Status == LastResponseStatus.Successful) { Scrobbles.Clear(); foreach (var t in response.Content.Tracks) { FetchedTrackViewModel vm = new FetchedTrackViewModel(new ScrobbleBase(t.Name, t.ArtistName, t.AlbumName, "", t.Duration), release.Image); vm.ToScrobbleChanged += ToScrobbleChanged; Scrobbles.Add(vm); } if (Scrobbles.Count != 0) { CurrentView = _trackResultView; OnStatusUpdated(string.Format("Successfully fetched tracklist from release '{0}'", release.Name)); } else { OnStatusUpdated(string.Format("Release '{0}' has no tracks", release.Name)); } } else { OnStatusUpdated(string.Format("Error while fetching tracklist from release '{0}': {1}", release.Name, response.Status)); } } catch (Exception ex) { OnStatusUpdated(string.Format("Fatal error while fetching tracklist from release: {0}", ex.Message)); } finally { EnableControls = true; } } }
/// <summary> /// Fetches the recent scrobbles of the user with the given <see cref="Username"/>. /// </summary> public async Task FetchScrobbles() { try { EnableControls = false; OnStatusUpdated(string.Format("Trying to fetch scrobbles of '{0}' ...", Username)); Scrobbles.Clear(); var response = await _userApi.GetRecentScrobbles(Username, null, 1, Amount); if (response.Success) { foreach (var s in response) { if (!s.IsNowPlaying.HasValue || !s.IsNowPlaying.Value) { FetchedFriendTrackViewModel vm = new FetchedFriendTrackViewModel(s); vm.ToScrobbleChanged += ToScrobbleChanged; Scrobbles.Add(vm); } } OnStatusUpdated(string.Format("Successfully fetched scrobbles of '{0}'", Username)); } else { OnStatusUpdated(string.Format("Failed to fetch scrobbles of '{0}': {1}", Username, response.Status)); } } catch (Exception ex) { OnStatusUpdated(string.Format("Fatal error while fetching scrobbles of '{0}': {1}", Username, ex.Message)); } finally { EnableControls = true; } }
/// <summary> /// Loads and parses a csv file. /// </summary> /// <returns>Task.</returns> public async Task ParseCSVFile() { try { EnableControls = false; OnStatusUpdated("Reading CSV file..."); Scrobbles.Clear(); using (ITextFieldParser parser = _parserFactory.CreateParser(CSVFilePath)) { parser.SetDelimiters(Settings.Default.CSVDelimiters.Select(x => new string(x, 1)).ToArray()); string[] fields = null; List <string> errors = new List <string>(); ObservableCollection <ParsedCSVScrobbleViewModel> parsedScrobbles = new ObservableCollection <ParsedCSVScrobbleViewModel>(); await Task.Run(() => { while (!parser.EndOfData) { try { fields = parser.ReadFields(); string dateString = fields[Settings.Default.TimestampFieldIndex]; // check for 'now playing' if (dateString == "" && ScrobbleMode == CSVScrobbleMode.Normal) { continue; } DateTime date = DateTime.Now; if (!DateTime.TryParse(dateString, out date)) { bool parsed = false; // try different formats until succeeded foreach (string format in _formats) { parsed = DateTime.TryParseExact(dateString, format, CultureInfo.CurrentCulture, DateTimeStyles.None, out date); if (parsed) { break; } } if (!parsed && ScrobbleMode == CSVScrobbleMode.Normal) { throw new Exception("Timestamp could not be parsed!"); } } // try to get optional parameters first string album = fields.ElementAtOrDefault(Settings.Default.AlbumFieldIndex); string albumArtist = fields.ElementAtOrDefault(Settings.Default.AlbumArtistFieldIndex); string duration = fields.ElementAtOrDefault(Settings.Default.DurationFieldIndex); TimeSpan time = TimeSpan.FromSeconds(Duration); TimeSpan.TryParse(duration, out time); DatedScrobble parsedScrobble = new DatedScrobble(date.AddSeconds(1), fields[Settings.Default.TrackFieldIndex], fields[Settings.Default.ArtistFieldIndex], album, albumArtist, time); ParsedCSVScrobbleViewModel vm = new ParsedCSVScrobbleViewModel(parsedScrobble, ScrobbleMode); vm.ToScrobbleChanged += ToScrobbleChanged; parsedScrobbles.Add(vm); } catch (Exception ex) { string errorString = "CSV line number: " + parser.LineNumber + ","; foreach (string s in fields) { errorString += s + ","; } errorString += ex.Message; errors.Add(errorString); } } }); if (errors.Count == 0) { OnStatusUpdated("Successfully parsed CSV file. Parsed " + parsedScrobbles.Count + " rows"); } else { OnStatusUpdated("Partially parsed CSV file. " + errors.Count + " rows could not be parsed"); if (MessageBox.Show("Some rows could not be parsed. Do you want to save a text file with the rows that could not be parsed?", "Error parsing rows", MessageBoxButtons.YesNo) == DialogResult.Yes) { SaveFileDialog sfd = new SaveFileDialog() { Filter = "Text Files|*.txt" }; if (sfd.ShowDialog() == DialogResult.OK) { File.WriteAllLines(sfd.FileName, errors.ToArray()); } } } Scrobbles = parsedScrobbles; } } catch (Exception ex) { Scrobbles.Clear(); OnStatusUpdated("Error parsing CSV file: " + ex.Message); } finally { EnableControls = true; } }