public Task<ScrobbleResponse> ScrobbleAsync(Scrobble scrobble) { var command = new ScrobbleCommand(Auth, scrobble) { HttpClient = HttpClient }; return command.ExecuteAsync(); }
public TrackScrobbleCommandTests() { _scrobblePlayed = DateTimeOffset.UtcNow; _testScrobble = new Scrobble("Kate Nash", "Made of Bricks", "Foundations", _scrobblePlayed) { AlbumArtist = "Kate Nash" }; _command = new ScrobbleCommand(MAuth.Object, _testScrobble); }
public TrackScrobbleCommandTests() { _scrobblePlayed = DateTimeOffset.UtcNow; _testScrobble = new Scrobble("Kate Nash", "Made of Bricks", "Foundations", _scrobblePlayed) { AlbumArtist = "Kate Nash" }; _command = new ScrobbleCommand(MAuth.Object, _testScrobble); }
public async Task <ScrobbleResponse> ScrobbleAsyncInternal(IEnumerable <Scrobble> scrobbles) { var scrobblesList = scrobbles.ToList(); var cached = await GetCachedAsync(); var pending = scrobblesList.Concat(cached).OrderBy(s => s.TimePlayed).ToList(); if (!pending.Any()) { return(new ScrobbleResponse(LastResponseStatus.Successful)); } var batches = pending.Batch(MaxBatchSize); var responses = new List <ScrobbleResponse>(pending.Count % MaxBatchSize); var responseExceptions = new List <Exception>(); foreach (var batch in batches) { var command = new ScrobbleCommand(_auth, batch) { HttpClient = HttpClient }; try { var response = await command.ExecuteAsync(); responses.Add(response); } catch (HttpRequestException httpEx) { responseExceptions.Add(httpEx); } } ScrobbleResponse scrobblerResponse; if (!responses.Any() || responses.All(r => r.Success)) { scrobblerResponse = new ScrobbleResponse(LastResponseStatus.Successful); } else { try { var firstBadResponse = responses.FirstOrDefault(r => !r.Success && r.Status != LastResponseStatus.Unknown); var originalResponseStatus = firstBadResponse != null ? firstBadResponse.Status : LastResponseStatus.RequestFailed; // TODO check httpEx var cacheStatus = await CacheAsync(scrobblesList, originalResponseStatus); scrobblerResponse = new ScrobbleResponse(cacheStatus); } catch (Exception e) { scrobblerResponse = new ScrobbleResponse(LastResponseStatus.CacheFailed) { Exception = e }; } } var ignoredScrobbles = responses.SelectMany(r => r.Ignored); scrobblerResponse.Ignored = ignoredScrobbles; AfterSend?.Invoke(this, scrobblerResponse); return(scrobblerResponse); }
public async Task <ScrobbleResponse> ScrobbleAsyncInternal(IEnumerable <Scrobble> scrobbles) { var scrobblesList = new ReadOnlyCollection <Scrobble>(scrobbles.ToList()); var cached = await GetCachedAsync(); var pending = scrobblesList.Concat(cached).OrderBy(s => s.TimePlayed).ToList(); if (!pending.Any()) { return(new ScrobbleResponse(LastResponseStatus.Successful)); } var batches = pending.Batch(MaxBatchSize); var responses = new List <ScrobbleResponse>(pending.Count % MaxBatchSize); var responseExceptions = new List <Exception>(); foreach (var batch in batches) { var command = new ScrobbleCommand(Auth, batch) { HttpClient = HttpClient }; try { var response = await command.ExecuteAsync(); var acceptedMap = new HashSet <Scrobble>(pending); foreach (var ignored in response.Ignored) { acceptedMap.Remove(ignored); } await RemoveFromCacheAsync(acceptedMap); responses.Add(response); } catch (HttpRequestException httpEx) { responseExceptions.Add(httpEx); } } ScrobbleResponse scrobblerResponse; if (!responses.Any() || responses.All(r => r.Success)) { scrobblerResponse = new ScrobbleResponse(LastResponseStatus.Successful); } else { var firstBadResponse = responses.FirstOrDefault(r => !r.Success && r.Status != LastResponseStatus.Unknown); var originalResponseStatus = firstBadResponse?.Status ?? LastResponseStatus.RequestFailed; // TODO check httpEx var cacheStatus = await CacheAsync(scrobblesList, originalResponseStatus); scrobblerResponse = new ScrobbleResponse(cacheStatus); } scrobblerResponse.Ignored = responses.SelectMany(r => r.Ignored); scrobblerResponse.AcceptedCount = responses.Sum(r => r.AcceptedCount); AfterSend?.Invoke(this, scrobblerResponse); return(scrobblerResponse); }
public async Task<ScrobbleResponse> ScrobbleAsyncInternal(IEnumerable<Scrobble> scrobbles) { var scrobblesList = scrobbles.ToList(); var cached = await GetCachedAsync(); var pending = scrobblesList.Concat(cached).OrderBy(s => s.TimePlayed).ToList(); if (!pending.Any()) { return new ScrobbleResponse(LastResponseStatus.Successful); } var batches = pending.Batch(MaxBatchSize); var responses = new List<ScrobbleResponse>(pending.Count % MaxBatchSize); var responseExceptions = new List<Exception>(); foreach(var batch in batches) { var command = new ScrobbleCommand(_auth, batch) { HttpClient = HttpClient }; try { var response = await command.ExecuteAsync(); responses.Add(response); } catch (HttpRequestException httpEx) { responseExceptions.Add(httpEx); } } ScrobbleResponse scrobblerResponse; if (!responses.Any() || responses.All(r => r.Success)) { scrobblerResponse = new ScrobbleResponse(LastResponseStatus.Successful); } else { try { var firstBadResponse = responses.FirstOrDefault(r => !r.Success && r.Status != LastResponseStatus.Unknown); var originalResponseStatus = firstBadResponse != null ? firstBadResponse.Status : LastResponseStatus.RequestFailed; // TODO check httpEx var cacheStatus = await CacheAsync(scrobblesList, originalResponseStatus); scrobblerResponse = new ScrobbleResponse(cacheStatus); } catch (Exception e) { scrobblerResponse = new ScrobbleResponse(LastResponseStatus.CacheFailed) { Exception = e }; } } var ignoredScrobbles = responses.SelectMany(r => r.Ignored); scrobblerResponse.Ignored = ignoredScrobbles; return scrobblerResponse; }