using System; using System.Collections.Generic; using System.Linq; using MoreLinq; using MusicMatch.Core.Data; using Sony.Core; using Sony.Filtr.Application; using Sony.Filtr.Core; using Sony.Filtr.Core.Settings; using Sony.Filtr.PlaylistGeneration; using Sony.Filtr.Utility.Extensions; using Sony.Core.Data; using System.Threading.Tasks; using Artist = Spotifony.Core.Data.Artist; using Track = Spotifony.Core.Data.Track; namespace Sony.Filtr.ScheduledTask.Tasks { public class PersonaSync { private static int NumberOfTrackGenreFails = 0; public void Execute() { Console.WriteLine("Start persona update"); UpdatePersonaPushTracks(); Console.WriteLine("Failed to get any genres for " + NumberOfTrackGenreFails + " tracks."); Console.WriteLine("Personas updated"); } private void UpdatePersonaPushTracks() { foreach (var app in ApplicationInstanceManager.GetApplications()) { UpdatePersonas(app); } } private void UpdatePersonasNew(Application.Application app) { var playlistUrl = SettingsManager.Instance.GetStringSetting("PromotedTracksPlaylist", app); if (string.IsNullOrWhiteSpace(playlistUrl)) return; Console.WriteLine("Beginning persona sync for " + app.Name); var personas = SonyMusicManager.Instance.PersonaManager.GetPersonas(app).ToList(); Console.WriteLine("Found " + personas.Count + " existing personas"); var groupedPersonas = personas.DistinctBy(p => p.PromotedSongsSpotifyUrl).ToDictionary(p => p.PromotedSongsSpotifyUrl); Console.WriteLine("Will fetch playlist:" + playlistUrl); var playlist = SpotifyIntegration.SpotifyIntegration.Instance.GetPlaylist(playlistUrl); if (playlist == null || playlist.CurrentTracks == null) { Console.WriteLine("Could not get playlist for " + playlistUrl); return; } Console.WriteLine("Fetched playlist"); Console.WriteLine("playlist contains " + playlist.CurrentTracks.Count + " tracks"); int index = 0; foreach (var spotifyTrack in playlist.CurrentTracks) { try { if (groupedPersonas.ContainsKey(spotifyTrack.LinkString)) { var persona = GeneratePersona(app, spotifyTrack, index); var existingPersona = groupedPersonas[spotifyTrack.LinkString]; persona.ID = existingPersona.ID; UpdatePersona(persona); } else { var persona = GeneratePersona(app, spotifyTrack, index); AddPersona(persona); } index++; } catch (Exception ex) { } } var spotifyUrls = playlist.CurrentTracks.Select(t => t.LinkString); var personasToRemove = personas.Where(p => !spotifyUrls.Contains(p.PromotedSongsSpotifyUrl)); foreach (var persona in personasToRemove.Where(a => a.Active)) { Console.WriteLine("Removing " + persona.Name); persona.Active = false; SonyMusicManager.Instance.PersonaManager.SavePersona(persona); } } private void UpdatePersonas(Application.Application app) { var playlistUrl = SettingsManager.Instance.GetStringSetting("PromotedTracksPlaylist", app); if (string.IsNullOrWhiteSpace(playlistUrl)) return; Console.WriteLine("Beginning persona sync for " + app.Name); var personas = SonyMusicManager.Instance.PersonaManager.GetPersonas(app).ToList(); Console.WriteLine("Found " + personas.Count + " existing personas"); var groupedPersonas = personas.DistinctBy(p => p.PromotedSongsSpotifyUrl).ToDictionary(p => p.PromotedSongsSpotifyUrl); Console.WriteLine("Will fetch playlist:" + playlistUrl); var playlist = SpotifyIntegration.SpotifyIntegration.Instance.GetPlaylist(playlistUrl); if (playlist == null || playlist.CurrentTracks == null) { Console.WriteLine("Could not get playlist for " + playlistUrl); return; } Console.WriteLine("Fetched playlist"); Console.WriteLine("playlist contains " + playlist.CurrentTracks.Count + " tracks"); int index = 0; foreach (var spotifyTrack in playlist.CurrentTracks) { try { if (groupedPersonas.ContainsKey(spotifyTrack.LinkString)) { var persona = GeneratePersona(app, spotifyTrack, index); var existingPersona = groupedPersonas[spotifyTrack.LinkString]; persona.ID = existingPersona.ID; UpdatePersona(persona); } else { var persona = GeneratePersona(app, spotifyTrack, index); AddPersona(persona); } index++; } catch (Exception ex) { } } var spotifyUrls = playlist.CurrentTracks.Select(t => t.LinkString); var personasToRemove = personas.Where(p => !spotifyUrls.Contains(p.PromotedSongsSpotifyUrl)); foreach (var persona in personasToRemove.Where(a => a.Active)) { Console.WriteLine("Removing " + persona.Name); persona.Active = false; SonyMusicManager.Instance.PersonaManager.SavePersona(persona); } } private Persona GeneratePersona(Application.Application app, Sony.Filtr.Contracts.SpotifyIntegration.SpotifyTrack track, int index) { var personaName = track.Artists.First().Name + " - " + track.Name; Console.WriteLine("Fetching info for: " + personaName); var persona = new Persona() { Active = true }; var artists = track.Artists.Select(a => new Artist(a.Name)).ToList(); var artist = artists.First(); var localTrack = new Track(artist.Name, track.Name); var genres = PlaylistGenerationManager.Instance.GetGenres(app, localTrack).ToList(); if (!genres.Any()) { //Console.WriteLine("Could not get genre for track:" + localTrack.ArtistName + " " + localTrack.Name); NumberOfTrackGenreFails++; genres = PlaylistGenerationManager.Instance.GetGenres(app, artists.First()).ToList(); } var similarArtists = PlaylistGenerationManager.Instance.GetSimilarArtists(artist, 25) .Union(new SimilarArtistMatch(artist, 100).AsEnumerable()); var promotedTrack = new Track() { ArtistName = track.Artists.First().Name, Name = track.Name, SpotifyLink = new SpotifyLink(track.LinkString) }; persona.Active = true; persona.Name = personaName; persona.PromotedSongsSpotifyUrl = track.LinkString; persona.TypicalSongsSpotifyUrl = string.Empty; persona.Template = PersonaTemplate.Popular; persona.Artists = similarArtists; persona.Genres = genres; persona.PromotedTracks = promotedTrack.AsEnumerable(); persona.ApplicationID = app.ID; persona.Index = index; return persona; } private static void AddPersona(Persona persona) { Console.WriteLine("Adding " + persona.Name); SonyMusicManager.Instance.PersonaManager.SavePersona(persona); } private static void UpdatePersona(Persona persona) { Console.WriteLine("Updating " + persona.Name); SonyMusicManager.Instance.PersonaManager.SavePersona(persona); } } }