//using System; //using System.Collections.Concurrent; //using System.Collections.Generic; //using System.Globalization; //using System.IO; //using System.Linq; //using System.Net; //using System.Runtime.Serialization; //using System.Security.Cryptography; //using System.ServiceModel.Web; //using System.Threading.Tasks; //using MoreLinq; //using Sony.Filtr.Applications; //using Sony.Filtr.API.ViewModels; //using Sony.Filtr.API.ViewModels.v2; //using Sony.Filtr.Contracts.Definitions; //using Sony.Filtr.Contracts.Entities; //using Sony.Filtr.Contracts.Entities.Genre; //using Sony.Filtr.Core; //using Sony.Filtr.Core.EditorialPlaylists; //using Sony.Filtr.Core.Genres; //using Sony.Filtr.Core.LastModified; //using Sony.Filtr.Core.Releases; //using Sony.Filtr.Core.Seasons; //using Sony.Filtr.Core.Settings; //using Sony.Filtr.DistributedCaching; //using Sony.Filtr.Globalization; //using Sony.Filtr.PersistentCaching; //using Sony.Filtr.PlaylistGeneration; //using Sony.Filtr.PlaylistGeneration.Autocomplete; //using Sony.Filtr.Utility.Extensions; //using PlaylistViewModel = Sony.Filtr.API.ViewModels.v2.PlaylistViewModel; //namespace Sony.Filtr.API.Service //{ // public class SpotifyService2 // { // private readonly SeasonManager _seasonManager; // private readonly ApplicationInstanceManager _applicationInstanceManager; // private readonly EditorialPlaylistManager _editorialPlaylistManager; // private readonly PlaylistCategoryManager _playlistCategoryManager; // private readonly PlaylistGenerationManager _playlistGenerationManager; // private readonly ReleasesManager _releasesManager; // private readonly GenreManager _genreManager; // private readonly DistributedCacheHandler _distributedCacheHandler; // public GlobalizationHandler2 GlobalizationHandler2 { get; set; } // public TrackSuggestionManager2 TrackSuggestionManager2 { get; set; } // public EditorialPlaylistStatsManager EditorialPlaylistStatsManager { get; set; } // public LastModifiedManager LastModifiedManager { get; set; } // private readonly DateTime _codeLastModified = new DateTime(2015, 03, 23, 16, 00, 00); // public SpotifyService2(GlobalizationHandler2 globalizationHandler, TrackSuggestionManager2 trackSuggestionManager, // EditorialPlaylistStatsManager editorialPlaylistStatsManager, LastModifiedManager lastModifiedManager, // SeasonManager seasonManager, ApplicationInstanceManager applicationInstanceManager, // EditorialPlaylistManager editorialPlaylistManager, PlaylistCategoryManager playlistCategoryManager, PlaylistGenerationManager playlistGenerationManager, // ReleasesManager releasesManager, GenreManager genreManager, DistributedCacheHandler distributedCacheHandler) // { // _seasonManager = seasonManager; // _applicationInstanceManager = applicationInstanceManager; // _editorialPlaylistManager = editorialPlaylistManager; // _playlistCategoryManager = playlistCategoryManager; // _playlistGenerationManager = playlistGenerationManager; // _releasesManager = releasesManager; // _genreManager = genreManager; // _distributedCacheHandler = distributedCacheHandler; // GlobalizationHandler2 = globalizationHandler; // TrackSuggestionManager2 = trackSuggestionManager; // EditorialPlaylistStatsManager = editorialPlaylistStatsManager; // LastModifiedManager = lastModifiedManager; // } // public virtual async Task> GetTracks(Application app, string countryCode, string tag, string artist) // { // var allTagCategories = _genreManager.GetGenreCategories(); // var tagCategories = allTagCategories.ToDictionary(g => g.ID, g => g.Name); // //var genreCategory = allTagCategories.FirstOrDefault(t => t.Name.Equals("genre", StringComparison.CurrentCultureIgnoreCase)); //TODO: filter so we only include genres-tags. // if (!string.IsNullOrWhiteSpace(artist)) // { // var artistArtist = await _playlistGenerationManager.GetArtistAsync(artist); // if (artistArtist == null) // return null; // var tracks = await TrackSuggestionManager2.GetSuggestedTracksAsync(app, countryCode, artistArtist); // var artists = tracks.Select(t => t.Artist).DistinctBy(a => a.Name).ToList(); // var artistsTags = await _playlistGenerationManager.GetArtistTagsAsync(app, artists); // var artistTagViewModel = artistsTags.ToDictionary(k => k.Key, v => v.Value.Select(t => new TagViewModel(t, tagCategories))); // //var artistMoods = artists.AsParallel().ToDictionary(k => k.Name, v => PlaylistGenerationManager.Instance.GetMood(v).Result); // return tracks.Select(t => TrackViewModel.BuildTrackViewModel(t, artistTagViewModel[t.Artist.Name])).ToList(); // } // else if (!string.IsNullOrWhiteSpace(tag)) // { // var genre = GetGlobalAndLocalGenre(app, tag); // if (genre == null) // return null; // var tracks = await TrackSuggestionManager2.GetSuggestedTracksForGenreAsync(genre, countryCode); // var artists = tracks.Select(t => t.Artist).DistinctBy(a => a.Name).ToList(); // var artistsTags = await _playlistGenerationManager.GetArtistTagsAsync(app, artists); // var artistTagViewModel = artistsTags.ToDictionary(k => k.Key, v => v.Value.Select(t => new TagViewModel(t, tagCategories))); // //var artistMoods = tracks.Select(t => t.Artist).DistinctBy(a => a.Name).ToDictionary(k => k.Name, v => PlaylistGenerationManager.Instance.GetMood(v).Result); // return tracks.Select(t => TrackViewModel.BuildTrackViewModel(t, artistTagViewModel[t.Artist.Name])).ToList(); // } // return new List(); // } // private List GetGlobalAndLocalGenres(Application application) // { // return _genreManager.GetGenres(application).Union(_genreManager.GetGenres(_applicationInstanceManager.GetGlobalPushApplication())).DistinctBy(t => t.Name).ToList(); // } // private Genre GetGlobalAndLocalGenre(Application app, string tag) // { // var genre = _genreManager.GetGenre(app, tag); // if (genre == null) // genre = _genreManager.GetGenre(_applicationInstanceManager.GetGlobalPushApplication(), tag); // return genre; // } // public virtual List GetTags(Application app, string[] artists, string[] tags) // { // const int lagomSimilarArtists = 30; // var tagResult = new ConcurrentBag(); // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // if (artists != null) // { // var artistList = artists.Select(a => _playlistGenerationManager.GetArtistAsync(a).Result).Where(a => a != null).ToList(); // if (artistList.Any()) // { // var artistTags = _playlistGenerationManager.GetArtistTagsAsync(app, artistList).Result; // //TODO: Just flatten? Sum? Average? // var flatTags = artistTags.SelectMany(t => t.Value).GroupBy(a => a.Item).Select(t => new RankedItem(t.Key, t.Sum(v => v.Weight))).ToList(); // //var flatTags = artistTags.SelectMany(t => t.Value).Where(t => t.Weight > 0); // foreach (var tag in flatTags) // { // tagResult.Add(new TagViewModel(tag, genreCategories)); // } // var similarArtists = artistList.AsParallel().SelectMany(a => _playlistGenerationManager.GetSimilarArtistsAsync(a, lagomSimilarArtists).Result) // .Where(a=> a != null && a.Artist != null).ToList(); // var groupedSimilarArtists = similarArtists.GroupBy(a => a.Artist).Where(IsAcceptableArtistRecommendation).Select(t => new SimilarArtistMatch(t.Key, t.Sum(v => v.Match))); // foreach (var artist in groupedSimilarArtists) // { // tagResult.Add(new TagViewModel(artist)); // } // } // } // else // { // //We return all tags. // var localTags = GetGlobalAndLocalGenres(app); // foreach (var tag in localTags) // { // tagResult.Add(new TagViewModel(tag, genreCategories)); // } // } // //if (tags != null) // //{ // // foreach (var tag in tags) // // { // // var relatedTags = PlaylistGenerationManager.Instance.GetRelatedTags(app, tag).Where(t => t.Weight > 0).ToList(); // // foreach (var tag in relatedTags) // // { // // tagsResult.Add(relatedTags.Select(g => new TagViewModel(g, genreCategories))); // // } // // } // //} // return tagResult.DistinctBy(t => t.ID).OrderByDescending(t=> t.Match).ToList(); // } // private bool IsAcceptableArtistRecommendation(IGrouping a) // { // var artistName = a.Key.Name; // if (artistName.Contains(" feat ") || artistName.Contains(" feat.")) // return false; // return true; // } // public virtual SeasonViewModel GetSeason(Application app) // { // var season = _seasonManager.GetActiveSeason(app); // if (season == null) // return null; // var themeViewModel = new ThemeViewModel() // { // Active = season.ThemeActive, // //HeaderBackgroundColor = season.HeaderBackgroundColor, // BackgroundColor = season.BackgroundColor, // TextColor = season.TextColor, // AccentColor = season.AccentColor, // AccentColorPlaylist = season.AccentColorPlaylist, // AccentColorPlaylists = season.AccentColorPlaylists, // AccentColorReleases = season.AccentColorReleases, // //HeaderBackgroundImage = season.HeaderBackgroundImage, // HeaderPlaylistBackgroundImage = BuildUrl(EditorialImageBaseUrl, season.HeaderPlaylistBackgroundImage), // HeaderPlaylistsBackgroundImage = BuildUrl(EditorialImageBaseUrl, season.HeaderPlaylistsBackgroundImage), // HeaderReleasesBackgroundImage = BuildUrl(EditorialImageBaseUrl, season.HeaderReleasesBackgroundImage), // HeaderStartBackgroundImage = BuildUrl(EditorialImageBaseUrl, season.HeaderStartBackgroundImage), // }; // return new SeasonViewModel() // { // SpotifyUri = season.SpotifyUri, // Label = season.Label, // Description = season.Description, // Theme = themeViewModel, // }; // } // private string BuildUrl(string baseUrl, string filename) // { // if (string.IsNullOrWhiteSpace(filename)) // return null; // return baseUrl + "/" + filename; // } // public virtual List Search(Application app, string searchString) // { // const int maxAutocompleteResults = 15; // var autocompleteManager = new AutocompleteManager(new DBMemoryFactory()); // var artists = autocompleteManager.SearchAutocompleteArtistsAsync(searchString, count: maxAutocompleteResults).Result.ToList(); // var tags = GetGlobalAndLocalGenres(app).Where(g => g.Name.StartsWith(searchString, StringComparison.CurrentCultureIgnoreCase)); // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // List tagViewModels = new List(); // tagViewModels.AddRange(artists.Select(a => new TagViewModel(a.Name))); // tagViewModels.AddRange(tags.Select(g => new TagViewModel(g, genreCategories))); // return tagViewModels.OrderBy(t => t.Label).ToList(); // } // internal List Search2(Application app, string searchString) // { // const int maxAutocompleteResults = 15; // var autocompleteManager = new AutocompleteManager(new EchoNestDataFactory()); // var artists = autocompleteManager.SearchAutocompleteArtistsAsync(searchString, count: maxAutocompleteResults).Result.ToList(); // var tags = GetGlobalAndLocalGenres(app).Where(g => g.Name.StartsWith(searchString, StringComparison.CurrentCultureIgnoreCase)); // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // List tagViewModels = new List(); // tagViewModels.AddRange(artists.Select(a => new TagViewModel(a.Name))); // tagViewModels.AddRange(tags.Select(g => new TagViewModel(g, genreCategories))); // return tagViewModels.OrderBy(t => t.Label).Take(maxAutocompleteResults).ToList(); // } // internal List GetNewReleases(Application app, string countryCode) // { // var viewModels = new ConcurrentBag(); // var releases = _releasesManager.GetReleases(app, countryCode).Take(100); //We have a sanity check at 100 so we // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // Parallel.ForEach(releases.ItemIndex(), new ParallelOptions() { MaxDegreeOfParallelism = 5 }, release => // { // var artist = _playlistGenerationManager.GetArtistAsync(release.Item.ArtistName).Result; // if (artist == null) // return; // //var similarArtists = PlaylistGenerationManager.Instance.GetSimilarArtists(artist, MaxSimilarArtists); // var tags = _playlistGenerationManager.GetArtistTagsAsync(app, artist).Result; // //var viewModel = new ReleaseViewModel(release, similarArtists, genres); // var tagViewModels = tags.Select(t => new TagViewModel(t, genreCategories)).ToList(); // var playlistViewModel = new PlaylistViewModel(release.Item, release.Index, tagViewModels, EditorialImageBaseUrl); // viewModels.Add(playlistViewModel); // }); // return viewModels.OrderBy(r => r.Index).ToList(); // } // //internal List GetPlaylists(Application app) // //{ // // var globalPlaylists = _editorialPlaylistManager.GetEditorialPlaylists(_applicationInstanceManager.GetGlobalPushApplication(), onlyActive: true); // // var playlists = _editorialPlaylistManager.GetEditorialPlaylists(app, onlyActive: true); // // playlists = playlists.Union(globalPlaylists).Where(p => p.SpotifyLink != null && p.PriorityLevel != 0).DistinctBy(playlist => playlist.SpotifyLink).ToList(); // // var playlistStats = EditorialPlaylistStatsManager.GetPlaylistStats(playlists); // // var genreCategories = SonyMusicManager.Instance.GenreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // // var currentGenres = GetGlobalAndLocalGenres(app).ToDictionary(k => k.Name, v => v); // // ConcurrentBag playlistViewModels = new ConcurrentBag(); // // Parallel.ForEach(playlistStats, new ParallelOptions() { MaxDegreeOfParallelism = 5 }, playlistStat => // // { // // var playlist = playlistStat.Playlist; // // var rankedRealTags = playlist.Genres.Join(currentGenres, match => match.Genre.ToLower(), pair => pair.Key.ToLower(), (match, pair) => new RankedItem(pair.Value, match.Score)); // // //var currentRealGenres = playlist.Genres.Where(g => currentGenres.ContainsKey(g.Genre)).Select(g => currentGenres[g.Genre]); // // var tags = rankedRealTags.Select(t => new TagViewModel(t, genreCategories)).ToList(); // // //var categoryViewModels = FakeCategories(playlist.ID); // // var categories = _playlistCategoryManager.GetCategories(playlist); // // var categoryViewModels = categories.Select(c => new TagViewModel(c)).ToList(); // // playlistViewModels.Add(new PlaylistViewModel(playlistStat, tags, categoryViewModels, EditorialImageBaseUrl)); // // }); // // return playlistViewModels.OrderBy(p => p.Match).ToList(); // //} // internal List GetPlaylistsCache(Application app) // { // //Determine if anything has changed. // var globalMarket = _applicationInstanceManager.GetGlobalPushApplication(); // var fallbackMarket = _applicationInstanceManager.GetFallbackApplication(); // DateTime lastModified = DateTime.Now; // if (PersistentCachingManager.Instance.Connection != null) // { // var globalPlaylistLastModified = LastModifiedManager.GetLastModifyDate(globalMarket, EntityType.Playlists); // var localPlaylistLastModified = LastModifiedManager.GetLastModifyDate(app, EntityType.Playlists); // var globalGenreLastModified = LastModifiedManager.GetLastModifyDate(globalMarket, EntityType.Genres); // var localGenreLastModified = LastModifiedManager.GetLastModifyDate(app, EntityType.Genres); // var statsLastModified = LastModifiedManager.GetLastModifyDate(null, EntityType.PlaylistStats); // var localPlaylistCategoriesLastModified = LastModifiedManager.GetLastModifyDate(app, EntityType.PlaylistCategories); // var marketLastModified = LastModifiedManager.GetLastModifyDate(app, EntityType.Applications); // var codeLastModified = _codeLastModified; // DateTime fallbackMarketLastModified = DateTime.MinValue; // if (app.IncludeOtherPlaylists) // { // fallbackMarketPlaylistLastModified = LastModifiedManager.GetLastModifyDate(app, EntityType.Playlists); // } // lastModified = new[] // { // globalPlaylistLastModified, localPlaylistLastModified, globalGenreLastModified, localGenreLastModified, // statsLastModified, localPlaylistCategoriesLastModified, codeLastModified, fallbackMarketLastModified, marketLastModified // }.Where(d => d != null).Max(); // } // WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.CacheControl] = "public, max-age=0"; // WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(lastModified); // WebOperationContext.Current.OutgoingResponse.LastModified = lastModified; // var cacheKey = "Playlists-Cache-:" + typeof(PlaylistsCacheResponse) + ":" + PlaylistsCacheResponse.Version + ":" + app.ID; // var playlistCacheResponse = DistributedCacheHandler.Instance.Get(cacheKey) as PlaylistsCacheResponse; // if (playlistCacheResponse != null) // { // //We have a fully cached response. Determine if we should use it. // if (playlistCacheResponse.GenerateDate >= lastModified) // { // WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(playlistCacheResponse.HashETag); // WebOperationContext.Current.OutgoingResponse.SetETag(playlistCacheResponse.HashETag); // return playlistCacheResponse.ViewModels; // } // } // var allPlaylists = GetPlaylistsToIncludeAsync(app, globalMarket, fallbackMarket).Result; // var playlistAttributes = _editorialPlaylistManager.GetPlaylistAttributesAsync(allPlaylists).Result; //Ugly and might cause issues // var viewModels = BuildPlaylistViewModelsAsync(playlistAttributes, app).Result; // var hash = CalculateHash(viewModels); // DistributedCacheHandler.Instance.Put(cacheKey, new PlaylistsCacheResponse() // { // ViewModels = viewModels, GenerateDate = DateTime.Now, HashETag = hash, LastModified = lastModified, // }); // WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(hash); // WebOperationContext.Current.OutgoingResponse.SetETag(hash); // return viewModels; // } // private async Task> GetPlaylistsToIncludeAsync(Application app, Application globalMarket, Application fallbackMarket) // { // var globalPlaylists = await _editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(globalMarket, onlyActive: true); // var playlists = await _editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(app, onlyActive: true); // var allPlaylists = playlists.Union(globalPlaylists); // if (app.IncludeOtherPlaylists) // { // var fallbackPlaylists = await _editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(fallbackMarket, // onlyActive: true); // allPlaylists = allPlaylists.Union(fallbackPlaylists); // } // return allPlaylists.Where(p => p.SpotifyLink != null && p.PriorityLevel != 0).DistinctBy(playlist => playlist.SpotifyLink).ToList(); // } // [Serializable] // public class PlaylistsCacheResponse // { // public static string Version = "2"; // public List ViewModels { get; set; } // public DateTime LastModified { get; set; } // public DateTime GenerateDate { get; set; } // public string HashETag { get; set; } // } // private string CalculateHash(List viewModels) // { // using (HashAlgorithm crypto = System.Security.Cryptography.MD5.Create()) // { // using (MemoryStream memStream = new MemoryStream()) // { // DataContractSerializer x = new DataContractSerializer(typeof(List)); // x.WriteObject(memStream, viewModels); // memStream.Position = 0; // return System.Convert.ToBase64String(crypto.ComputeHash(memStream)); // } // } // } // private async Task> BuildPlaylistViewModelsAsync(IEnumerable playlists, Application app) // { // var editorialPlaylistsLocal = playlists.Select(p => p.EditorialPlaylist).ToList(); // var playlistStats = EditorialPlaylistStatsManager.GetPlaylistStats(editorialPlaylistsLocal); // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // var currentGenres = GetGlobalAndLocalGenres(app).ToDictionary(k => k.Name, v => v); // var allPlaylistTags = await _editorialPlaylistManager.GetTagsAsync(editorialPlaylistsLocal); // ConcurrentBag playlistViewModels = new ConcurrentBag(); // Parallel.ForEach(playlists, new ParallelOptions() { MaxDegreeOfParallelism = 5 }, playlist => // { // var playlistTags = allPlaylistTags[playlist.EditorialPlaylist.ID]; // playlistTags = playlistTags.Where(t => t.Score > 1).OrderByDescending(p => p.Score).Take(5).ToList(); // var rankedRealTags = playlistTags.Join(currentGenres, match => match.Genre.ToLower(), pair => pair.Key.ToLower(), // (match, pair) => new RankedItem(pair.Value, match.Score)); // //var currentRealGenres = playlist.Genres.Where(g => currentGenres.ContainsKey(g.Genre)).Select(g => currentGenres[g.Genre]); // var tags = rankedRealTags.Select(t => new TagViewModel(t, genreCategories)).OrderByDescending(t=> t.Match).ThenBy(t=> t.Label).ToList(); // //var categoryViewModels = FakeCategories(playlist.ID); // var categories = _playlistCategoryManager.GetCategories(playlist.EditorialPlaylist); // var categoryViewModels = categories.Select(c => new TagViewModel(c)).ToList(); // var playlistStat = playlistStats.FirstOrDefault(p => p.Playlist.ID == playlist.EditorialPlaylist.ID); // playlistViewModels.Add(new PlaylistViewModel(playlistStat, tags, categoryViewModels, EditorialImageBaseUrl, playlist.Attributes)); // }); // return playlistViewModels.OrderBy(p => p.Match).ThenBy(p=> p.Id).ToList(); // } // internal List GetCategories(Application app) // { // var categories = _playlistCategoryManager.GetCategories(app); // var icons = _playlistCategoryManager.GetIcons().ToDictionary(c=> c.ID); // return categories.Where(c=> c.Active).Select(c => new PlaylistCategoryViewModel(c, icons)).ToList(); // } // internal List GetCategoriesCache(Application app) // { // DateTime lastModified = DateTime.Now; // if (PersistentCachingManager.Instance.Connection != null) // { // var categoriesLastModified = LastModifiedManager.GetLastModifyDate(app, EntityType.PlaylistCategories); // var categoriIconLastModified = LastModifiedManager.GetLastModifyDate(null, EntityType.PlaylistCategoryIcons); // lastModified = new[] { categoriesLastModified, _codeLastModified, categoriIconLastModified }.Max(); // } // WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.CacheControl] = "public, max-age=0"; // WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(lastModified); // WebOperationContext.Current.OutgoingResponse.LastModified = lastModified; // var categories = GetCategories(app); // return categories; // } // internal async Task GetPlaylistAsync(string playlistId) // { // int id; // if (!int.TryParse(playlistId, out id)) // return null; // var playlist = await _editorialPlaylistManager.GetEditorialPlaylistAsync(id); // if (playlist == null) // return null; // var playlistStat = EditorialPlaylistStatsManager.GetPlaylistStats(playlist.AsEnumerable().ToList()).FirstOrDefault(); // if (playlistStat == null) // return null; // var app = _applicationInstanceManager.GetApplication(playlist.ApplicationID); // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // var currentGenres = GetGlobalAndLocalGenres(app).ToDictionary(k => k.Name, v => v); // var rankedRealTags = playlist.Genres.Join(currentGenres, match => match.Genre.ToLower(), pair => pair.Key.ToLower(), (match, pair) => new RankedItem(pair.Value, match.Score)); // var tags = rankedRealTags.Select(t => new TagViewModel(t, genreCategories)).ToList(); // var categories = _playlistCategoryManager.GetCategories(playlist); // var categoryViewModels = categories.Select(c => new TagViewModel(c)).ToList(); // var attributes = await _editorialPlaylistManager.LoadAttributesAsync(playlist.SpotifyLinkUri); // return new PlaylistViewModel(playlistStat, tags, categoryViewModels, EditorialImageBaseUrl, attributes); // } // internal IEnumerable GetPromotedTracks(Application app) // { // var promotedTracks = SonyMusicManager.Instance.PromotedTracksManager.GetPromotedTracksAsync(app).Result; // //var globalPromotedTracks = SonyMusicManager.Instance.PromotedTracksManager.GetPromotedTracks(app); // //promotedTracks = promotedTracks.Union(globalPromotedTracks).DistinctBy(p => p.Name); // promotedTracks = promotedTracks.Where(HasMatchData).ToList(); //Filter in case something is missing. // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // var trackViewModels = new ConcurrentBag(); // Parallel.ForEach(promotedTracks.ItemIndex(), promotedTrack => // { // //var artist = PlaylistGenerationManager.Instance.GetArtist(promotedTrack.Item.ExtendedTrack.ArtistName); // //if (artist == null) // // continue; // var localTags = _genreManager.MatchTags(app, promotedTrack.Item.Tags); // var tags = localTags.Select(t => new TagViewModel(t, genreCategories)); // var trackSuggestion = new ExtendedTrackSuggestion() // { // ExtendedTrack = promotedTrack.Item.ExtendedTrack, // Score = promotedTrack.Index // }; // List> artistMoods = null; // //PlaylistGenerationManager.Instance.GetMood(artist).Result; // var viewModel = TrackViewModel.BuildTrackViewModel(trackSuggestion, tags, artistMoods); // trackViewModels.Add(viewModel); // }); // return trackViewModels.OrderBy(t => t.Match).ToList(); // } // private bool HasMatchData(PromotedTrack promotedTrack) // { // return (promotedTrack.Tags != null); // } // internal MyJsonDictionary> GetGlobalization(Application app) // { // var translations = GlobalizationHandler.Instance.GetTranslations(app); // return GroupTranslations(translations); // } // private static MyJsonDictionary> GroupTranslations(Dictionary translations) // { // var groupedTranslations = new MyJsonDictionary>(); // foreach (var translation in translations) // { // //TODO: would be nice to group in several layers. // var keyGroup = translation.Key.Split('.').First(); // var key = translation.Key.Split('.').Last(); // if (groupedTranslations.ContainsKey(keyGroup)) // { // groupedTranslations[keyGroup].Add(key, translation.Value); // } // else // { // var inner = new MyJsonDictionary(); // inner[key] = translation.Value; // groupedTranslations[keyGroup] = inner; // } // } // return groupedTranslations; // } // internal Dictionary GetGlobalizationForLanguage(string language) // { // if (string.IsNullOrEmpty(language)) // return null; // var cultureInfo = CultureInfo.GetCultureInfo(language); // var translations = GlobalizationHandler2.GetTranslations(cultureInfo); // var fallbackTranslations = GlobalizationHandler2.GetTranslations(_fallbackLanguage); // var keys = GlobalizationHandler2.GetKeys(); // return keys.ToDictionary(k => k.Key, v => GetGlobalizationOrFallback(v.Id, translations, fallbackTranslations)); // } // private string GetGlobalizationOrFallback(int keyId, List translations, List fallbackTranslations) // { // var trans = translations.FirstOrDefault(t => t.GlobalizationKey.Id == keyId); // if (trans != null) // return trans.Value; // trans = fallbackTranslations.FirstOrDefault(t => t.GlobalizationKey.Id == keyId); // if (trans != null) // return trans.Value; // return string.Empty; // } // private const string CDNBaseUrl = "https://d2ahw2mlask527.cloudfront.net"; // private const string EditorialImageBaseUrl = "https://dhfsk7jl2g0km.cloudfront.net"; // private const string ProxyBaseUrl = "https://d2ahw2mlask527.cloudfront.net/Proxy"; // private readonly CultureInfo _fallbackLanguage = new CultureInfo("en-GB"); // internal BootstrapViewModel GetBootstrap(Application app) // { // var languageViewModels = GetOrderedLanguageViewModels(app); // var bootstrap = new BootstrapViewModel // { // Languages = languageViewModels, // Markets = new List() { app.SpotifyRegionCode }, // BaseUrls = new BaseUrlsViewModel() // { // CDNBaseUrl = CDNBaseUrl, // EditorialImageBaseUrl = EditorialImageBaseUrl, // ProxyBaseUrl = ProxyBaseUrl, // }, // DefaultFilteringValues = GetDefaultFilteringValues(), // }; // return bootstrap; // } // internal BootstrapViewModel GetBootstrapNew(string service, string countryCode) // { // var applicationsInCountry = // _applicationInstanceManager.GetApplications() // .Where(a => a.Active // && !a.WorkoutMarket // && a.SpotifyRegionCode.Equals(countryCode, StringComparison.InvariantCultureIgnoreCase)).ToList(); // //TODO: Only include applications which are active for service? // if (!applicationsInCountry.Any()) // applicationsInCountry = new List() { _applicationInstanceManager.GetFallbackApplication() }; // //TODO: Which languages to use? // //var languageViewModels = GetOrderedLanguageViewModels(app); // var bootstrap = new BootstrapViewModel // { // //Languages = languageViewModels, // Markets = applicationsInCountry.Select(p=> p.ID.ToString()).ToList(), // BaseUrls = new BaseUrlsViewModel() // { // CDNBaseUrl = CDNBaseUrl, // EditorialImageBaseUrl = EditorialImageBaseUrl, // ProxyBaseUrl = ProxyBaseUrl, // }, // DefaultFilteringValues = GetDefaultFilteringValues(), // }; // return bootstrap; // } // internal BootstrapViewModel GetWorkoutBootstrap(Application application) // { // var bootstrap = new BootstrapViewModel // { // Markets = new List() { application.ID.ToString() }, // BaseUrls = new BaseUrlsViewModel() // { // CDNBaseUrl = CDNBaseUrl, // EditorialImageBaseUrl = EditorialImageBaseUrl, // ProxyBaseUrl = ProxyBaseUrl, // }, // DefaultFilteringValues = GetDefaultFilteringValues(), // }; // return bootstrap; // } // private MyJsonDictionary GetDefaultFilteringValues() // { // MyJsonDictionary defaultFilteringValues = new MyJsonDictionary(); // foreach (var defaultFilteringKey in _defaultFilteringKeys) // { // var value = SettingsManager.Instance.GetDoubleSetting(defaultFilteringKey, _applicationInstanceManager.GetGlobalPushApplication()); // defaultFilteringValues.Add(defaultFilteringKey, value); // } // return defaultFilteringValues; // } // private readonly List _defaultFilteringKeys = new List() // { // "minTempo", "maxTempo", "minDanceability", "maxDanceability", "minEnergy", "maxEnergy", "minHotness", "maxHotness", "minDuration", "maxDuration", // }; // private List GetOrderedLanguageViewModels(Application app) // { // IEnumerable languages = GlobalizationHandler2.GetTranslatedLanguages(); // if (languages.Contains(app.CultureInfo)) // languages = languages.OrderByDescending(l => l.Equals(app.CultureInfo)).ThenBy(l => l.NativeName); // else // languages = languages.OrderByDescending(l => l.Equals(_fallbackLanguage)).ThenBy(l => l.NativeName); // var languageViewModels = languages.Select(l => new LanguageViewModel(l)).ToList(); // return languageViewModels; // } // internal async Task> SearchTracks(Application app, string countryCode, SearchTracksParameters searchTracksParameters) // { // if (searchTracksParameters.Artists != null && searchTracksParameters.Artists.Any()) // { // var allArtistTracks = new ConcurrentBag(); // foreach (var artist in searchTracksParameters.Artists) // { // var artistArtist = await _playlistGenerationManager.GetArtistAsync(artist); // if (artistArtist == null) // continue; // List tracks = await TrackSuggestionManager2.GetEchoNestSuggestedTracksWithLocalFilteringAsync(app, countryCode, artistArtist.Name, searchTracksParameters); // var artists = tracks.Select(t => t.Artist).DistinctBy(a => a.Name).ToList(); // var artistsTags = await _playlistGenerationManager.GetArtistTagsAsync(app, artists); // var genreCategories = _genreManager.GetGenreCategories().ToDictionary(g => g.ID, g => g.Name); // var artistTagViewModel = artistsTags.ToDictionary(k => k.Key, v => v.Value.Select(t => new TagViewModel(t, genreCategories))); // //var artistMoods = artists.AsParallel().ToDictionary(k => k.Name, v => PlaylistGenerationManager.Instance.GetMood(v).Result); // var trackViewModels = tracks.Select(t => TrackViewModel.BuildTrackViewModel(t, artistTagViewModel[t.Artist.Name], relatedTo: artist)).ToList(); // trackViewModels.ForEach(t=> allArtistTracks.Add(t)); // } // return allArtistTracks.ToList(); // } // else if (searchTracksParameters.Tag != null) // { // var tag = searchTracksParameters.Tag; // var genre = GetGlobalAndLocalGenre(app, tag); // if (genre == null) // return null; // var allTagCategories = _genreManager.GetGenreCategories(); // var tagCategories = allTagCategories.ToDictionary(g => g.ID, g => g.Name); // var tracks = await TrackSuggestionManager2.GetSuggestedTracksForGenreNewAsync(genre, countryCode, searchTracksParameters); // //var tracks = await TrackSuggestionManager2.GetSuggestedTracksForGenreAsync(genre, countryCode, searchTracksParameters); // var artists = tracks.Select(t => t.Artist).DistinctBy(a => a.Name).ToList(); // var artistsTags = await _playlistGenerationManager.GetArtistTagsAsync(app, artists); // var artistTagViewModel = artistsTags.ToDictionary(k => k.Key, v => v.Value.Select(t => new TagViewModel(t, tagCategories))); // //var artistMoods = tracks.Select(t => t.Artist).DistinctBy(a => a.Name).ToDictionary(k => k.Name, v => PlaylistGenerationManager.Instance.GetMood(v).Result); // return tracks.Select(t => TrackViewModel.BuildTrackViewModel(t, artistTagViewModel[t.Artist.Name])).ToList(); // } // return null; // } // public DateTime fallbackMarketPlaylistLastModified { get; set; } // } //}