using Grpc.Core; using GrpcShared; using GrpcShared.DTO.Search; using GrpcShared.DTO.Track.MultipleTrack; using GrpcShared.DTO.Track.SingleTrack; using GrpcShared.Interfaces; using Microsoft.Net.Http.Headers; using Newtonsoft.Json; using System.Text; using System.Text.Json; using System.Web; namespace SpotifyService.Services { public class TrackService : ITrackService { private readonly IHttpClientFactory _httpClientFactory; public TrackService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public async Task ListSearchAsync(SearchRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token ); var searchResult = await client.GetAsync($"search?q={request.Query}&type={request.Type}"); var responses = JsonConvert.DeserializeObject(await searchResult.Content.ReadAsStringAsync())!; return new SearchResponse { Tracks = responses!.Tracks }; } public async Task ListSingleTrackAsync(SingleTrackRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token); var trackResult = await client.GetAsync($"audio-features/{request.Id}"); var responses = JsonConvert.DeserializeObject(await trackResult.Content.ReadAsStringAsync())!; return new SingleTrackResponse { Id = responses!.Id, Danceability = responses!.Danceability, Key = responses!.Key, Loudness = responses!.Loudness, Mode = responses!.Mode, Speechiness = responses!.Speechiness, Acousticness = responses!.Acousticness, Instrumentalness = responses!.Instrumentalness, Liveness = responses!.Liveness, Valence = responses!.Valence, Tempo = responses!.Tempo, Type = responses!.Type, Uri = responses!.Uri, TrackHref = responses!.TrackHref, AnalysisUrl = responses!.AnalysisUrl, DurationMs = responses!.DurationMs, TimeSignature = responses!.TimeSignature, }; } public async Task ListMultipleTrackAsync(MultipleTrackRequest request) { var client = _httpClientFactory.CreateClient("HttpClient"); client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token); bool startingQuestionMarkAdded = false; var sb = new StringBuilder(); var param = new Dictionary>(); param["ids"] = request.Ids; foreach(var id in param) { sb.Append(startingQuestionMarkAdded ? '&' : '?'); sb.Append(id.Key); sb.Append('='); foreach(var Xid in id.Value) { sb.Append(Xid); sb.Append("%2C"); startingQuestionMarkAdded = true; } } sb.Length = sb.Length - 3; sb.ToString(); var trackMultipleResult = await client.GetAsync($"audio-features{sb}"); var responses = JsonConvert.DeserializeObject(await trackMultipleResult.Content.ReadAsStringAsync())!; return new MultipleTrackResponse { AudioFeatures = responses!.AudioFeatures }; } } }