using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using MoreLinq; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.Core.EditorialPlaylists; namespace Sony.Filtr.Worker.Onetime { public class AnalyzePlaylistsCatalogFrontline { private readonly EditorialPlaylistManager _editorialPlaylistManager; public AnalyzePlaylistsCatalogFrontline(EditorialPlaylistManager editorialPlaylistManager) { _editorialPlaylistManager = editorialPlaylistManager; } public async Task ExecuteAsync() { var allPlaylists = await _editorialPlaylistManager.GetLightweightEditorialPlaylistsAsync(null, false, false); var inputPlaylistsFile = new FileInfo("Input-Playlists.csv"); HashSet inputPlaylists = new HashSet(); using (var textReader = inputPlaylistsFile.OpenText()) { while (!textReader.EndOfStream) { inputPlaylists.Add(new SpotifyLink(textReader.ReadLine())); } } //var countries = new[] { "US", "CA", "MX", "BR", "ES", "AU" }; //var playlists = allPlaylists.DistinctBy(p => p.SpotifyLink).Where(p => countries.Contains(p.CountryCode, StringComparer.InvariantCultureIgnoreCase)).ToList(); var playlists = allPlaylists.Where(p => inputPlaylists.Contains(p.SpotifyLink)).DistinctBy(p => p.SpotifyLink.Uri).ToList(); var playlistTracks = await _editorialPlaylistManager.GetTracksAsync(playlists); FileInfo file = new FileInfo("Output-CataloguePercent.csv"); using (var fileStream = file.OpenWrite()) { fileStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length); using (var fileWriter = new StreamWriter(fileStream)) { fileWriter.WriteLine(string.Join(";", "Uri", "Name", "CountryCode", "Catalogue%")); foreach (var playlist in playlists) { var tracks = playlistTracks[playlist.ID].Where(t => !string.IsNullOrWhiteSpace(t.ISRC)) .DistinctBy(t => t.ISRC) .ToList(); var totalTracksWithISRC = tracks.Count; var frontLine = tracks.Count(t => IsFrontline(t.ISRC)); var catalog = tracks.Count(t => !IsFrontline(t.ISRC)); var percentString = "-"; if (totalTracksWithISRC != 0) { var percentage = (catalog / (totalTracksWithISRC * 1.0)) * 100; percentString = Math.Round(percentage).ToString(CultureInfo.InvariantCulture); } fileWriter.WriteLine(string.Join(";", playlist.SpotifyLinkUri, playlist.Name, playlist.CountryCode, percentString)); } } } } private bool IsFrontline(string isrc) { var frontLine = new[] { "14", "15" }; return frontLine.Contains(isrc.Substring(5, 2)); } } }