예제 #1
0
        public async Task <List <Domain.Track> > GetRecommendedTracksAsync(PartyGoer partyGoer, RecommendedTracksSeed recommendedTrackSeeds)
        {
            List <string> seedTrackUris  = recommendedTrackSeeds?.SeedTrackUris;
            List <string> seedArtistUris = recommendedTrackSeeds?.SeedArtistUris;

            if (seedTrackUris?.Count + seedArtistUris?.Count > 5 || seedTrackUris?.Count + seedArtistUris?.Count == 0)
            {
                throw new ArgumentException("The count of seeds need to be between 1 and 5");
            }

            recommendedTrackSeeds.SeedTrackUris = seedTrackUris.Select(p => p.Replace("spotify:track:", "").Split("+").First()).ToList();

            var response = await SendHttpRequestAsync(partyGoer.GetSpotifyId(), _apiEndpoints[ApiEndpointType.GetRecommendedTracks], AddRecommendedSeedApiParmeters(recommendedTrackSeeds), true);

            RecommendedTracks tracks = await response.Content.ReadFromJsonAsync <RecommendedTracks>();

            List <Domain.Track> recommendedSongs = new List <Domain.Track>();

            foreach (SpotifyModels.Track track in tracks.Tracks)
            {
                if (track.Markets.Contains(partyGoer.GetMarket()) && track != null)
                {
                    recommendedSongs.Add(new Domain.Track
                    {
                        AlbumImageUrl = null,
                        Artists       = track.Artists.Select(p => new SpotifyModels.Artist {
                            Id = p.Id, Name = p.Name
                        }).ToList(),
                        Explicit = track.Explicit,
                        Length   = track.Duration,
                        Name     = track.Name,
                        Id       = track.Id
                    });
                }
            }

            return(recommendedSongs.ToList());
        }
예제 #2
0
        public List <Band> GetBandsByGenre(string genre)
        {
            try
            {
                List <Band>       bands = null;
                RecommendedTracks json  = null;

                using (System.Net.WebClient web = new System.Net.WebClient())
                {
                    web.Headers.Add(SPOTIFY_AUTHORIZATION_HEADER, string.Format(SPOTIFY_ACCESS_TOKEN, AccessToken));
                    string response = web.DownloadString(string.Format(_spotifySecrets.GetUrlByGenre(), genre));
                    json = JsonConvert.DeserializeObject <RecommendedTracks>(response);
                }

                bands = new List <Band>();

                foreach (var track in json.Tracks)
                {
                    Band band = new Band
                    {
                        Id   = track.Artists.FirstOrDefault().Id,
                        Name = track.Artists.FirstOrDefault().Name
                    };

                    if (!bands.Exists(b => b.Id.Equals(band.Id)))
                    {
                        bands.Add(band);
                    }
                }

                int           totalPagesBySeveralArtists = (int)Math.Ceiling((decimal)bands.Count / SPOTIFY_MAX_AMOUNT_IDS_BY_SEVERAL_ARISTS);
                List <Artist> artists = new List <Artist>();

                //Get pictures in batch from a list of artists
                for (int i = 0; i < totalPagesBySeveralArtists; i++)
                {
                    var filteredIds = bands.Skip(i * SPOTIFY_MAX_AMOUNT_IDS_BY_SEVERAL_ARISTS)
                                      .Take(SPOTIFY_MAX_AMOUNT_IDS_BY_SEVERAL_ARISTS).ToList();

                    string ids = string.Join(",", filteredIds.Select(b => b.Id).ToArray());
                    artists.AddRange(GetArtistsPicturesFromIds(ids).Artists);
                }

                //TODO: INJECT BY A INJECTION MECHANISM
                MusicBrainz.MusicBrainz musicBrainz = new MusicBrainz.MusicBrainz();
                LastFm lastFm = new LastFm(_lastFmSecrets);

                //TODO: MOVE THE LINES ABOVE TO A CLASS TO COMBINE ALL THE DATA
                foreach (var artist in artists)
                {
                    var band = bands.FirstOrDefault(b => b.Id.Equals(artist.Id));
                    band.Picture = artist.Images?.FirstOrDefault().Url;
                    Task.Delay(2000).Wait(); //FIXME: IT'S JUST A WORKAROUND DUE TO THE RATE LIMITING OF MUSICBRAINZ.ORG API
                    band.Begin = musicBrainz.GetBeginDate(artist.Name, genre);

                    //GET DATA FROM LASTFM
                    band.Summary = lastFm.GetInfo(band.Name).Artist?.Biography?.Summary;
                }

                return(bands);
            }
            catch (Exception)
            {
                throw;
            }
        }