示例#1
0
        public async Task <ImportStats> ProcessVenues(Artist artist, PerformContext ctx)
        {
            var stats = new ImportStats();

            foreach (var venue in (await PhishinApiRequest <IEnumerable <PhishinSmallVenue> >("venues", ctx)).data)
            {
                var dbVenue = existingVenues.GetValue(venue.id.ToString());

                if (dbVenue == null)
                {
                    var sc = new VenueWithShowCount()
                    {
                        updated_at          = venue.updated_at,
                        artist_id           = artist.id,
                        name                = venue.name,
                        location            = venue.location,
                        slug                = Slugify(venue.name),
                        latitude            = venue.latitude,
                        longitude           = venue.longitude,
                        past_names          = venue.past_names,
                        upstream_identifier = venue.id.ToString()
                    };

                    var createdDb = await _venueService.Save(sc);

                    sc.id = createdDb.id;

                    existingVenues[sc.upstream_identifier] = sc;

                    stats.Created++;

                    dbVenue = sc;
                }
                else if (venue.updated_at > dbVenue.updated_at)
                {
                    dbVenue.name       = venue.name;
                    dbVenue.location   = venue.location;
                    dbVenue.longitude  = venue.longitude;
                    dbVenue.latitude   = venue.latitude;
                    dbVenue.past_names = venue.past_names;
                    dbVenue.updated_at = venue.updated_at;

                    await _venueService.Save(dbVenue);

                    existingVenues[dbVenue.upstream_identifier] = dbVenue;

                    stats.Updated++;
                }
            }

            return(stats);
        }
        async Task _ImportSingle(Artist artist, ImportStats stats, PerformContext ctx, int showId)
        {
            ctx?.WriteLine($"Requesting page for show id {showId}");

            var res = await http.GetAsync(UrlForShow(showId));

            var body = await res.Content.ReadAsStringAsync();

            ctx?.WriteLine($"Result: [{res.StatusCode}]: {body.Length}");

            var json = JsonConvert.DeserializeObject <PhantasyTourEnvelope>(body).data;

            var now = DateTime.UtcNow;

            Venue dbVenue = existingVenues.GetValue(UpstreamIdentifierForPhantasyTourId(json.venue.id));

            if (dbVenue == null)
            {
                var sc = new VenueWithShowCount()
                {
                    updated_at          = now,
                    artist_id           = artist.id,
                    name                = json.venue.name,
                    latitude            = null,
                    longitude           = null,
                    location            = $"{json.venue.city}, {json.venue.state}, {json.venue.country}",
                    upstream_identifier = UpstreamIdentifierForPhantasyTourId(json.venue.id),
                    slug                = Slugify($"{json.venue.name}, {json.venue.city}, {json.venue.state}")
                };

                dbVenue = await _venueService.Save(sc);

                sc.id = dbVenue.id;

                existingVenues[dbVenue.upstream_identifier] = sc;

                stats.Created++;
            }

            ctx?.WriteLine($"Importing show id {showId}");

            // tour
            Tour dbTour = null;

            if (artist.features.tours)
            {
                var tour_name     = json.tour?.name ?? "Not Part of a Tour";
                var tour_upstream = UpstreamIdentifierForPhantasyTourId(json.tour?.id ?? -1);

                dbTour = existingTours.GetValue(tour_upstream);
                if (dbTour == null)
                {
                    dbTour = await _tourService.Save(new Tour()
                    {
                        updated_at          = now,
                        artist_id           = artist.id,
                        start_date          = null,
                        end_date            = null,
                        name                = tour_name,
                        slug                = Slugify(tour_name),
                        upstream_identifier = tour_upstream
                    });

                    existingTours[dbTour.upstream_identifier] = dbTour;

                    stats.Created++;
                }
            }

            var dbShow = existingSetlistShows.GetValue(UpstreamIdentifierForPhantasyTourId(json.id));
            var date   = json.dateTimeUtc.Date;

            if (dbShow == null)
            {
                dbShow = await _setlistShowService.Save(new SetlistShow()
                {
                    artist_id           = artist.id,
                    updated_at          = now,
                    date                = date,
                    upstream_identifier = UpstreamIdentifierForPhantasyTourId(json.id),
                    venue_id            = dbVenue.id,
                    tour_id             = artist.features.tours ? dbTour?.id : null
                });

                existingSetlistShows[dbShow.upstream_identifier] = dbShow;

                stats.Created++;
            }

            // phantasy tour doesn't provide much info about tours so we need to find the start
            // and end date ourselves.
            if (artist.features.tours &&
                (dbTour.start_date == null ||
                 dbTour.end_date == null ||
                 dbShow.date < dbTour.start_date ||
                 dbShow.date > dbTour.end_date))
            {
                if (!tourToStartDate.ContainsKey(dbTour.upstream_identifier) ||
                    dbShow.date < tourToStartDate[dbTour.upstream_identifier])
                {
                    tourToStartDate[dbTour.upstream_identifier] = dbShow.date;
                }

                if (!tourToEndDate.ContainsKey(dbTour.upstream_identifier) ||
                    dbShow.date > tourToEndDate[dbTour.upstream_identifier])
                {
                    tourToEndDate[dbTour.upstream_identifier] = dbShow.date;
                }
            }

            var songs = json.sets.
                        SelectMany(set => set.songs).
                        Select(song => new { Name = song.name, Slug = Slugify(song.name) }).
                        GroupBy(song => song.Slug).
                        Select(grp => grp.First()).
                        ToList();

            var dbSongs = existingSetlistSongs.
                          Where(kvp => songs.Select(song => song.Slug).Contains(kvp.Key)).
                          Select(kvp => kvp.Value).
                          ToList();

            if (songs.Count != dbSongs.Count)
            {
                var newSongs = songs.
                               Where(song => dbSongs.Find(dbSong => dbSong.slug == song.Slug) == null).
                               Select(song => new SetlistSong()
                {
                    artist_id           = artist.id,
                    name                = song.Name,
                    slug                = song.Slug,
                    updated_at          = now,
                    upstream_identifier = song.Slug
                }).
                               ToList();

                var justAdded = await _setlistSongService.InsertAll(artist, newSongs);

                dbSongs.AddRange(justAdded);
                stats.Created += newSongs.Count;

                foreach (var justAddedSong in justAdded)
                {
                    existingSetlistSongs[justAddedSong.upstream_identifier] = justAddedSong;
                }
            }

            stats += await _setlistShowService.UpdateSongPlays(dbShow, dbSongs);
        }
        async Task <ImportStats> ProcessSetlist(Artist artist, Relisten.Vendor.SetlistFm.Setlist setlist)
        {
            var stats = new ImportStats();
            var now   = DateTime.UtcNow;

            // venue
            Venue dbVenue = existingVenues.GetValue(setlist.venue._iguanaUpstreamId);

            if (dbVenue == null)
            {
                var sc = new VenueWithShowCount()
                {
                    updated_at          = now,
                    artist_id           = artist.id,
                    name                = setlist.venue.name,
                    latitude            = setlist.venue.city.coords?.lat,
                    longitude           = setlist.venue.city.coords?.@long,
                    location            = $"{setlist.venue.city.name}, {setlist.venue.city.state}",
                    upstream_identifier = setlist.venue._iguanaUpstreamId,
                    slug                = Slugify(setlist.venue.name)
                };

                dbVenue = await _venueService.Save(sc);

                sc.id = dbVenue.id;

                existingVenues[dbVenue.upstream_identifier] = sc;

                stats.Created++;
            }

            // tour
            Tour dbTour = null;

            if (artist.features.tours)
            {
                var tour_upstream = setlist.tour?.name ?? "Not Part of a Tour";
                dbTour = existingTours.GetValue(tour_upstream);
                if (dbTour == null)
                {
                    dbTour = await _tourService.Save(new Tour()
                    {
                        updated_at          = now,
                        artist_id           = artist.id,
                        start_date          = null,
                        end_date            = null,
                        name                = tour_upstream,
                        slug                = Slugify(tour_upstream),
                        upstream_identifier = tour_upstream
                    });

                    existingTours[dbTour.upstream_identifier] = dbTour;

                    stats.Created++;
                }
            }

            // show
            var dbShow             = existingSetlistShows.GetValue(setlist.id);
            var date               = DateTime.ParseExact(setlist.eventDate, "dd-MM-yyyy", null);
            var setlistLastUpdated = setlist.lastUpdated;

            var shouldAddSongs = false;

            if (dbShow == null)
            {
                dbShow = await _setlistShowService.Save(new SetlistShow()
                {
                    artist_id           = artist.id,
                    updated_at          = setlistLastUpdated,
                    date                = date,
                    upstream_identifier = setlist.id,
                    venue_id            = dbVenue.id,
                    tour_id             = artist.features.tours ? dbTour?.id : null
                });

                existingSetlistShows[dbShow.upstream_identifier] = dbShow;

                stats.Created++;

                shouldAddSongs = true;
            }
            else if (setlistLastUpdated > dbShow.updated_at)
            {
                dbShow.artist_id  = artist.id;
                dbShow.updated_at = setlistLastUpdated;
                dbShow.date       = date;
                dbShow.venue_id   = dbVenue.id;
                dbShow.tour_id    = dbTour?.id;

                dbShow = await _setlistShowService.Save(dbShow);

                existingSetlistShows[dbShow.upstream_identifier] = dbShow;

                stats.Updated++;

                shouldAddSongs = true;
            }

            // setlist.fm doesn't provide much info about tours so we need to find the start
            // and end date ourselves.
            if (artist.features.tours &&
                (dbTour.start_date == null ||
                 dbTour.end_date == null ||
                 dbShow.date < dbTour.start_date ||
                 dbShow.date > dbTour.end_date))
            {
                if (!tourToStartDate.ContainsKey(dbTour.upstream_identifier) ||
                    dbShow.date < tourToStartDate[dbTour.upstream_identifier])
                {
                    tourToStartDate[dbTour.upstream_identifier] = dbShow.date;
                }

                if (!tourToEndDate.ContainsKey(dbTour.upstream_identifier) ||
                    dbShow.date > tourToEndDate[dbTour.upstream_identifier])
                {
                    tourToEndDate[dbTour.upstream_identifier] = dbShow.date;
                }
            }

            if (shouldAddSongs)
            {
                var songs = setlist.sets.set.
                            SelectMany(set => set.song).
                            Select(song => new { Name = song.name, Slug = Slugify(song.name) }).
                            GroupBy(song => song.Slug).
                            Select(grp => grp.First()).
                            ToList();

                var dbSongs = existingSetlistSongs.
                              Where(kvp => songs.Select(song => song.Slug).Contains(kvp.Key)).
                              Select(kvp => kvp.Value).
                              ToList();

                if (songs.Count != dbSongs.Count)
                {
                    var newSongs = songs.
                                   Where(song => dbSongs.Find(dbSong => dbSong.slug == song.Slug) == null).
                                   Select(song => new SetlistSong()
                    {
                        artist_id           = artist.id,
                        name                = song.Name,
                        slug                = song.Slug,
                        updated_at          = now,
                        upstream_identifier = song.Slug
                    }).
                                   ToList();

                    var justAdded = await _setlistSongService.InsertAll(artist, newSongs);

                    dbSongs.AddRange(justAdded);
                    stats.Created += newSongs.Count;

                    foreach (var justAddedSong in justAdded)
                    {
                        existingSetlistSongs[justAddedSong.upstream_identifier] = justAddedSong;
                    }
                }

                stats += await _setlistShowService.UpdateSongPlays(dbShow, dbSongs);
            }

            return(stats);
        }
        private async Task ProcessPage(ImportStats stats, Artist artist, FileMetaObject meta, string pageContents, DateTime updated_at, PerformContext ctx)
        {
            var dbShow = existingSetlistShows.GetValue(meta.Identifier);

            if (dbShow != null)
            {
                return;
            }

            ctx.WriteLine($"Processing: {meta.FilePath}");

            var html = new HtmlDocument();

            html.LoadHtml(pageContents);

            var root = html.DocumentNode;

            var ps = root.DescendantsWithClass("venue-name").ToList();

            var bandName = ps[1].InnerText.CollapseSpacesAndTrim();

            var venueName            = ps[0].InnerText.CollapseSpacesAndTrim();
            var venueCityOrCityState = root.DescendantsWithClass("venue-address").Single().InnerText.CollapseSpacesAndTrim().TrimEnd(',');
            var venueCountry         = root.DescendantsWithClass("venue-country").Single().InnerText.CollapseSpacesAndTrim();

            string tourName = ps.Count > 2 ? ps[2].InnerText.CollapseSpacesAndTrim() : "Not Part of a Tour";

            var venueUpstreamId = "jerrygarcia.com_" + venueName;

            Venue dbVenue = existingVenues.GetValue(venueUpstreamId);

            if (dbVenue == null)
            {
                var sc = new VenueWithShowCount
                {
                    artist_id           = artist.id,
                    name                = venueName,
                    location            = venueCityOrCityState + ", " + venueCountry,
                    upstream_identifier = venueUpstreamId,
                    slug                = Slugify(venueName),
                    updated_at          = updated_at
                };

                dbVenue = await _venueService.Save(sc);

                sc.id = dbVenue.id;

                existingVenues[dbVenue.upstream_identifier] = sc;

                stats.Created++;
            }

            var dbTour = existingTours.GetValue(tourName);

            if (dbTour == null && artist.features.tours)
            {
                dbTour = await _tourService.Save(new Tour
                {
                    artist_id           = artist.id,
                    name                = tourName,
                    slug                = Slugify(tourName),
                    upstream_identifier = tourName,
                    updated_at          = updated_at
                });

                existingTours[dbTour.upstream_identifier] = dbTour;

                stats.Created++;
            }

            dbShow = await _setlistShowService.Save(new SetlistShow
            {
                artist_id           = artist.id,
                tour_id             = dbTour?.id,
                venue_id            = dbVenue.id,
                date                = meta.Date,
                upstream_identifier = meta.Identifier,
                updated_at          = updated_at
            });

            existingSetlistShows[dbShow.upstream_identifier] = dbShow;

            stats.Created++;

            var dbSongs = root.Descendants("ol")
                          .SelectMany(node => node.Descendants("li"))
                          .Select(node =>
            {
                var trackName = node.InnerText.Trim().TrimEnd('>', '*', ' ');
                var slug      = SlugifyTrack(trackName);

                return(new SetlistSong
                {
                    artist_id = artist.id,
                    name = trackName,
                    slug = slug,
                    upstream_identifier = slug,
                    updated_at = updated_at
                });
            })
                          .GroupBy(s => s.upstream_identifier)
                          .Select(g => g.First())
                          .ToList()
            ;

            ResetTrackSlugCounts();

            var dbSongsToAdd = dbSongs.Where(song => !existingSetlistSongs.ContainsKey(song.upstream_identifier));

            dbSongs = dbSongs.Where(song => existingSetlistSongs.ContainsKey(song.upstream_identifier))
                      .Select(song => existingSetlistSongs[song.upstream_identifier])
                      .ToList()
            ;

            var added = await _setlistSongService.InsertAll(artist, dbSongsToAdd);

            foreach (var s in added)
            {
                existingSetlistSongs[s.upstream_identifier] = s;
            }

            stats.Created += added.Count();
            dbSongs.AddRange(added);

            if (artist.features.tours &&
                (dbTour.start_date == null ||
                 dbTour.end_date == null ||
                 dbShow.date < dbTour.start_date ||
                 dbShow.date > dbTour.end_date))
            {
                if (!tourToStartDate.ContainsKey(dbTour.upstream_identifier) ||
                    dbShow.date < tourToStartDate[dbTour.upstream_identifier])
                {
                    tourToStartDate[dbTour.upstream_identifier] = dbShow.date;
                }

                if (!tourToEndDate.ContainsKey(dbTour.upstream_identifier) ||
                    dbShow.date > tourToEndDate[dbTour.upstream_identifier])
                {
                    tourToEndDate[dbTour.upstream_identifier] = dbShow.date;
                }
            }

            await _setlistShowService.UpdateSongPlays(dbShow, dbSongs);
        }