using System; using System.Collections.Generic; using System.Linq; using EchoNest; using EchoNest.Artist; using EchoNest.Song; using MusicMatch.Core.Data; using Sony.Core.Data; using Spotifony.Core.Data; using SearchArgument = EchoNest.Artist.SearchArgument; using System.Threading.Tasks; namespace Sony.Filtr.PlaylistGeneration.MusicInfoStore { public class EchoNestManagerAsync : IMusicInfoStoreAsync { private readonly EchoNestSession _echoNestSession; public EchoNestManagerAsync(string apiKey) { _echoNestSession = new EchoNestSession(apiKey); } public async Task GetArtistAsync(string artistName) { var artistSearch = _echoNestSession.Query(); var searchParams = new SearchArgument() { Name = artistName, Results = 1 }; var resp = await artistSearch.ExecuteAsync(searchParams).ConfigureAwait(continueOnCapturedContext: false); Artist artist = null; if (resp.Status.Code == ResponseCode.Success) { if (resp.Artists.Count > 0) artist = new Artist(resp.Artists[0].Name) { ImageUrl = null, IsSonyArtist = false, LastFMImageID = null, Listeners = 0, }; } return artist; } public async Task> GetGenreMatchesAsync(Artist artist) { var req = _echoNestSession.Query(); var resp = await req.ExecuteAsync(artist.Name, TermsSort.Frequency).ConfigureAwait(continueOnCapturedContext:false); IEnumerable genres = new List(); if (resp.Status.Code == ResponseCode.Success) { genres = resp.Terms.Select(t => new GenreMatch(t.Name, (int)t.Weight * 100)); } return genres; } public List GetSimilarArtists(string artistName) { var req = _echoNestSession.Query(); var parameters = new SimilarArtistsArgument() { Name = artistName, Bucket = ArtistBucket.IdFacebook, Results = 25, }; var resp = req.Execute(parameters); List similarArtistMatches = new List(); if (resp.Status.Code == ResponseCode.Success) { similarArtistMatches = resp.Artists.Select(a => new SimilarArtistMatch(new Artist(a.Name), 100)).ToList(); } return similarArtistMatches; } public List GetSimilarArtistsByGenre(string name) { var test = _echoNestSession.Query(); var genres = new TermList(); genres.Add(name); var searchParams = new SearchArgument() { Styles = genres, Results = 25, Sort = Sorting.FamiliarityDesc, }; var resp = test.Execute(searchParams); List similarArtistMatches = new List(); if (resp.Status.Code == ResponseCode.Success) { if (resp.Artists.Count > 0) similarArtistMatches = resp.Artists.Select(a => new SimilarArtistMatch(new Artist(a.Name), 100)).ToList(); } return similarArtistMatches; } public List> SearchTracks(string mood, string style) { List> allTracks = new List>(); int startFrom = 0; for (int i = 0; i < 10; i++) { var tracks = SearchTracks(mood, style, startFrom); startFrom = startFrom + 100; if (tracks != null) allTracks.AddRange(tracks); } return allTracks; } private List> SearchTracks(string mood, string style, int startFrom) { var query = _echoNestSession.Query(); var searchParams = new EchoNest.Song.SearchArgument(); if (!string.IsNullOrEmpty(mood)) searchParams.Moods.Add(mood); if (!string.IsNullOrEmpty(style)) searchParams.Styles.Add(style); searchParams.Results = 100; searchParams.Bucket = SongBucket.Tracks | SongBucket.IdSpotify | SongBucket.SongHotttness; searchParams.Start = startFrom; searchParams.Limit = true; var resp = query.Execute(searchParams); if (resp.Status.Code == ResponseCode.Success) { if (resp.Songs.Count > 0) { { var list = resp.Songs.Select(s => BuildTrack(s)).Where(t => t != null).ToList(); return list; } } } return null; } //public List SearchTracks(string mood, string style) //{ // var query = _echoNestSession.Query(); // var args = new StaticArgument(); // args.Type = "artist-description"; // args.Styles.Add(style); // args.Moods.Add(mood); // args.Bucket = PlaylistBucket.Tracks | PlaylistBucket.IdSpotify; // args.ArtistMinFamiliarity = 0.8; // args.Results = 100; // var playlistResponse = query.Execute(args); // if (playlistResponse.Status.Code == ResponseCode.Success) // { // if (playlistResponse.Songs.Count > 0) // { // var tracks = playlistResponse.Songs.Select(s => BuildTrack(s)).Where(t => t != null).ToList(); // return tracks; // } // } // return null; //} private RankedItem BuildTrack(SongBucketItem song) { var track = new Track(song.ArtistName, song.Title); var spotifyTrack = song.Tracks.FirstOrDefault(t=> t.Catalog == "spotify-WW"); if (spotifyTrack != null) { var spotifyTrackUri = "spotify:track:" + spotifyTrack.ForeignID.Replace("spotify-WW:track:", string.Empty); track.SpotifyLink = new SpotifyLink(spotifyTrackUri); return new RankedItem(track, (int)(song.SongHotttnesss*100)); } return null; } public List GetTags(Track track) { throw new NotImplementedException(); } public List GetTags(Artist artist) { throw new NotImplementedException(); } } }