private async Task ProcessSetlistShow(ImportStats stats, PhishinShow show, Artist artist, Source dbSource, IDictionary <string, SourceSet> sets) { var dbShow = existingSetlistShows.GetValue(show.date); var addSongs = false; if (dbShow == null) { dbShow = await _setlistShowService.Save(new SetlistShow() { artist_id = artist.id, upstream_identifier = show.date, date = DateTime.Parse(show.date), venue_id = existingVenues[show.venue.id.ToString()].id, tour_id = existingTours[show.tour_id.ToString()].id, era_id = yearToEraMapping.GetValue(show.date.Substring(0, 4), yearToEraMapping["1983-1987"]).id, updated_at = dbSource.updated_at }); stats.Created++; addSongs = true; } else if (show.updated_at > dbShow.updated_at) { dbShow.date = DateTime.Parse(show.date); dbShow.venue_id = existingVenues[show.venue.id.ToString()].id; dbShow.tour_id = existingTours[show.tour_id.ToString()].id; dbShow.era_id = yearToEraMapping.GetValue(show.date.Substring(0, 4), yearToEraMapping["1983-1987"]).id; dbShow.updated_at = dbSource.updated_at; dbShow = await _setlistShowService.Save(dbShow); stats.Updated++; stats.Removed += await _setlistShowService.RemoveSongPlays(dbShow); addSongs = true; } if (addSongs) { var dbSongs = show.tracks. SelectMany(phishinTrack => phishinTrack.song_ids.Select(song_id => existingSetlistSongs.GetValue(song_id.ToString()))). Where(t => t != null). GroupBy(t => t.upstream_identifier). Select(g => g.First()). ToList() ; stats.Created += await _setlistShowService.AddSongPlays(dbShow, dbSongs); } }
private async Task <Source> ProcessShow(ImportStats stats, Artist artist, PhishinShow fullShow, ArtistUpstreamSource src, Source dbSource, PerformContext ctx) { dbSource.has_jamcharts = fullShow.tags.Count(t => t.name == "Jamcharts") > 0; dbSource = await _sourceService.Save(dbSource); var sets = new Dictionary <string, SourceSet>(); foreach (var track in fullShow.tracks) { var set = sets.GetValue(track.set); if (set == null) { set = new SourceSet() { source_id = dbSource.id, index = SetIndexForIdentifier(track.set), name = track.set_name, is_encore = track.set[0] == 'E', updated_at = dbSource.updated_at }; // this needs to be set after loading from the db set.tracks = new List <SourceTrack>(); sets[track.set] = set; } } var setMaps = (await _sourceSetService.UpdateAll(dbSource, sets.Values)) .GroupBy(s => s.index) .ToDictionary(kvp => kvp.Key, kvp => kvp.Single()); foreach (var kvp in setMaps) { kvp.Value.tracks = new List <SourceTrack>(); } foreach (var track in fullShow.tracks) { var set = setMaps[SetIndexForIdentifier(track.set)]; set.tracks.Add(new SourceTrack() { source_set_id = set.id, source_id = dbSource.id, title = track.title, duration = track.duration / 1000, track_position = track.position, slug = SlugifyTrack(track.title), mp3_url = track.mp3.Replace("http:", "https:"), updated_at = dbSource.updated_at, artist_id = artist.id }); } stats.Created += (await _sourceTrackService.InsertAll(dbSource, setMaps.SelectMany(kvp => kvp.Value.tracks))).Count(); await ProcessSetlistShow(stats, fullShow, artist, src, dbSource, sets); ResetTrackSlugCounts(); return(dbSource); }