using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using MoreLinq; using Sony.Filtr.Contracts.Definitions; using Sony.Filtr.Playlists.Models; using Sony.Filtr.Playlists.Spotify; using Sony.Filtr.PlaylistSynchronization; using Sony.Filtr.SpotifyWebAPI; using Sony.Filtr.Tasks.Helpers; using Sony.Filtr.Utility.Extensions; namespace Sony.Filtr.Worker.Onetime { public class PersonalizedPlaylists { private readonly SpotifyPlaylistManager _spotifyPlaylistManager; private readonly ServiceAccountManager _serviceAccountManager; private readonly SpotifyWebApi _spotifyWebApi; private readonly UpdatePlaylistsHelper _updatePlaylistsHelper; public PersonalizedPlaylists(SpotifyPlaylistManager spotifyPlaylistManager, ServiceAccountManager serviceAccountManager, SpotifyWebApi spotifyWebApi, UpdatePlaylistsHelper updatePlaylistsHelper) { _spotifyPlaylistManager = spotifyPlaylistManager; _serviceAccountManager = serviceAccountManager; _spotifyWebApi = spotifyWebApi; _updatePlaylistsHelper = updatePlaylistsHelper; } public async Task ExecuteAsync() { var serviceAccount1 = _serviceAccountManager.GetServiceAccount(MusicService.Spotify, "filtr"); //var serviceAccount2 = _serviceAccountManager.GetServiceAccount(MusicService.Spotify, "sonymusicentertainment"); var playlists = _spotifyPlaylistManager.GetAllPlaylists(); //var personalizedPlaylists = _spotifyPlaylistManager.GetPersonalizedPlaylists(); //var joinedPlaylists = personalizedPlaylists.Join(playlists, playlist => playlist.PlaylistId, playlist => playlist.PlaylistId, (playlist, spotifyPlaylist) => new { PlaylistId = playlist.PlaylistId, Name = spotifyPlaylist.Name }).ToList(); var joinedPlaylists = playlists.Where(p=> _updatePlaylistsHelper.ShouldCheckForPersonalizedPlaylist(p.User, p.Name)).Select(playlist=> new { PlaylistId = playlist.PlaylistId, Name = playlist.Name }).ToList(); List results = new List(); var authApi1 = _spotifyWebApi.GetAuthenticatedSession(serviceAccount1, _serviceAccountManager); //var authApi2 = _spotifyWebApi.GetAuthenticatedSession(serviceAccount2, _serviceAccountManager); foreach(var spotifyPersonalizedPlaylist in joinedPlaylists.Index()) { var playlistId = spotifyPersonalizedPlaylist.Value.PlaylistId; var playlistName = spotifyPersonalizedPlaylist.Value.Name; Console.WriteLine($"Looking up {spotifyPersonalizedPlaylist.Key} of {joinedPlaylists.Count} | {playlistId} ({playlistName}) ({spotifyPersonalizedPlaylist}) "); try { var apiTracks = await _spotifyWebApi.GetPlaylistTracksByIdAsync(playlistId); var authTracks1 = await authApi1.GetPlaylistTracksByIdAsync(playlistId); //var authTracks2 = await authApi2.GetPlaylistTracksByIdAsync(playlistId); var apiTrackModels = apiTracks.items.Where(p=> p?.track?.id != null).Index().Select(x => _updatePlaylistsHelper.BuildSpotifyPlaylistTrack(x.Value, x.Key)).ToList(); var authTrackModels1 = authTracks1.items.Where(p=> p?.track?.id != null).Index().Select(x => _updatePlaylistsHelper.BuildSpotifyPlaylistTrack(x.Value, x.Key)).ToList(); //var authTrackModels2 = authTracks2.items.Where(p=> p?.track?.id != null).Index().Select(x => _updatePlaylistsHelper.BuildSpotifyPlaylistTrack(x.Value, x.Key)).ToList(); var trackListChanged1 = _updatePlaylistsHelper.IsTrackListChanged(apiTrackModels, authTrackModels1); //var trackListChanged2 = _updatePlaylistsHelper.IsTrackListChanged(authTrackModels1, authTrackModels2); if (!trackListChanged1) { Console.WriteLine($"Removing {playlistId} as personalized"); await _spotifyPlaylistManager.UpdatePlaylistPersonalizedStatusAsync(playlistId, false); } else { Console.WriteLine($"Setting {playlistId} as personalized"); await _spotifyPlaylistManager.UpdatePlaylistPersonalizedStatusAsync(playlistId, true); } //results.Add(new Temp() //{ // PlaylistId = playlistId, // PlaylistName = playlistName, // ApiTracks = apiTrackModels, // AuthTracks1 = authTrackModels1, // AuthTracks2 = authTrackModels2, // Different1 = trackListChanged1, // Different2 = trackListChanged2 //}); } catch(Exception e) { Console.WriteLine(e); } } Console.WriteLine($"Done with fetching, writing results..."); FileInfo file = new FileInfo("PersonalizedPlaylists.csv"); using(var fileStream = file.OpenWrite()) { fileStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length); using(var fileWriter = new StreamWriter(fileStream)) { fileWriter.WriteLine("PlaylistId;Playlist name;API Track count;User1 Track Count;User2 Track Count;Different between api and auth;Different between users;API tracks;User1 Tracks;User2 tracks;"); foreach(var result in results) { var apiTracksString = string.Join(",", result.ApiTracks.Select(t => t.Track.Id)); var authTracks1String = string.Join(",", result.AuthTracks1.Select(t => t.Track.Id)); var authTracks2String = string.Join(",", result.AuthTracks2.Select(t => t.Track.Id)); fileWriter.WriteLine(string.Join(";", result.PlaylistId, result.PlaylistName, result.ApiTracks.Count, result.AuthTracks1.Count, result.AuthTracks2.Count, result.Different1, result.Different2 ,apiTracksString, authTracks1String, authTracks2String)); } } } } private class Temp { public List ApiTracks { get; set; } public List AuthTracks1 { get; set; } public List AuthTracks2 { get; set; } public string PlaylistId { get; set; } public string PlaylistName { get; set; } public bool Different1 { get; set; } public bool Different2 { get; set; } } } }