| @@ -11,7 +11,7 @@ namespace GrpcShared.DTO.Track.MultipleTrack | |||
| public class MultipleTrackResponse | |||
| { | |||
| [ProtoMember(1)] | |||
| public AudioFeature AudioFeatures { get; set; } | |||
| public List<AudioFeature>? Audio_Features { get; set; } | |||
| } | |||
| [ProtoContract] | |||
| public class AudioFeature | |||
| @@ -0,0 +1,18 @@ | |||
| using ProtoBuf; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace GrpcShared.DTO.Track.SaveTracks | |||
| { | |||
| [ProtoContract] | |||
| public class SaveTracksRequest | |||
| { | |||
| [ProtoMember(1)] | |||
| public List<string> Ids { get; set; } | |||
| [ProtoMember(2)] | |||
| public string Token { get; set; } | |||
| } | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| using GrpcShared.DTO.Search; | |||
| using GrpcShared.DTO.Track.MultipleTrack; | |||
| using GrpcShared.DTO.Track.SaveTracks; | |||
| using GrpcShared.DTO.Track.SingleTrack; | |||
| using ProtoBuf.Grpc.Configuration; | |||
| using System; | |||
| @@ -16,5 +17,6 @@ namespace GrpcShared.Interfaces | |||
| Task<SearchResponse> ListSearchAsync(SearchRequest request); | |||
| Task<SingleTrackResponse> ListSingleTrackAsync(SingleTrackRequest request); | |||
| Task<MultipleTrackResponse> ListMultipleTrackAsync(MultipleTrackRequest request); | |||
| Task SaveTracks(SaveTracksRequest request); | |||
| } | |||
| } | |||
| @@ -21,11 +21,11 @@ | |||
| //SearchRequest request = new() { Query = "aitch", Type = "track", Token = token }; | |||
| //SearchResponse searchResponse = await SearchService.GetListSearchAsync(request); | |||
| //MultipleTrackRequest mreq = new() { Ids = new List<string>(){"3JAeYOjyJodI4PRs44lx2l", "6clZa1yrZe7pJrYFUcD9KW"}, Token = token }; | |||
| //MultipleTrackResponse multipleTrackResponse = await SearchService.GetListMultipleTrackAsync(mreq); | |||
| MultipleTrackRequest mreq = new() { Ids = new List<string>(){"3JAeYOjyJodI4PRs44lx2l", "6clZa1yrZe7pJrYFUcD9KW"}, Token = token }; | |||
| MultipleTrackResponse multipleTrackResponse = await SearchService.GetListMultipleTrackAsync(mreq); | |||
| SingleTrackRequest singleTrackRequest = new() { Id = "3JAeYOjyJodI4PRs44lx2l", Token = token }; | |||
| SingleTrackResponse singleTrackResponse = await SearchService.GetListSingleTrackAsync(singleTrackRequest); | |||
| //SingleTrackRequest singleTrackRequest = new() { Id = "3JAeYOjyJodI4PRs44lx2l", Token = token }; | |||
| //SingleTrackResponse singleTrackResponse = await SearchService.GetListSingleTrackAsync(singleTrackRequest); | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| using GrpcShared.DTO.Search; | |||
| using GrpcShared.DTO.Track.MultipleTrack; | |||
| using GrpcShared.DTO.Track.SaveTracks; | |||
| using GrpcShared.DTO.Track.SingleTrack; | |||
| namespace NemAnBlazor.Services.Interfaces | |||
| @@ -9,5 +10,6 @@ namespace NemAnBlazor.Services.Interfaces | |||
| Task<SearchResponse> GetListSearchAsync(SearchRequest request); | |||
| Task<SingleTrackResponse> GetListSingleTrackAsync(SingleTrackRequest request); | |||
| Task<MultipleTrackResponse> GetListMultipleTrackAsync(MultipleTrackRequest request); | |||
| Task PutSaveTracks(SaveTracksRequest request); | |||
| } | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| using Grpc.Net.Client; | |||
| using GrpcShared.DTO.Search; | |||
| using GrpcShared.DTO.Track.MultipleTrack; | |||
| using GrpcShared.DTO.Track.SaveTracks; | |||
| using GrpcShared.DTO.Track.SingleTrack; | |||
| using GrpcShared.Interfaces; | |||
| using NemAnBlazor.Services.Interfaces; | |||
| @@ -31,5 +32,10 @@ namespace NemAnBlazor.Services | |||
| { | |||
| return await _serviceClient.ListMultipleTrackAsync(request); | |||
| } | |||
| public async Task PutSaveTracks(SaveTracksRequest request) | |||
| { | |||
| await _serviceClient.SaveTracks(request); | |||
| } | |||
| } | |||
| } | |||
| @@ -2,6 +2,7 @@ | |||
| using GrpcShared; | |||
| using GrpcShared.DTO.Search; | |||
| using GrpcShared.DTO.Track.MultipleTrack; | |||
| using GrpcShared.DTO.Track.SaveTracks; | |||
| using GrpcShared.DTO.Track.SingleTrack; | |||
| using GrpcShared.Interfaces; | |||
| using Microsoft.Net.Http.Headers; | |||
| @@ -9,6 +10,7 @@ using Newtonsoft.Json; | |||
| using System.Text; | |||
| using System.Text.Json; | |||
| using System.Web; | |||
| using static GrpcShared.DTO.Search.SearchDetails; | |||
| namespace SpotifyService.Services | |||
| { | |||
| @@ -79,37 +81,62 @@ namespace SpotifyService.Services | |||
| client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token); | |||
| bool startingQuestionMarkAdded = false; | |||
| var sb = new StringBuilder(); | |||
| //bool startingQuestionMarkAdded = false; | |||
| //var sb = new StringBuilder(); | |||
| var param = new Dictionary<string, List<string>>(); | |||
| 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 query = UriUtil(param); | |||
| var trackMultipleResult = await client.GetAsync($"audio-features{sb}"); | |||
| var trackMultipleResult = await client.GetAsync($"audio-features{query}"); | |||
| var responses = JsonConvert.DeserializeObject<MultipleTrackResponse>(await trackMultipleResult.Content.ReadAsStringAsync())!; | |||
| return new MultipleTrackResponse | |||
| { | |||
| AudioFeatures = responses!.AudioFeatures | |||
| Audio_Features = responses!.Audio_Features | |||
| }; | |||
| } | |||
| public async Task SaveTracks(SaveTracksRequest request) | |||
| { | |||
| var client = _httpClientFactory.CreateClient("HttpClient"); | |||
| client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token); | |||
| var param = new Dictionary<string, List<string>>(); | |||
| param["ids"] = request.Ids; | |||
| var query = UriUtil(param); | |||
| await client.PutAsync($"me/tracks/{query}", null); | |||
| } | |||
| public static string UriUtil(Dictionary<string, List<string>> param) | |||
| { | |||
| bool startingQuestionMarkAdded = false; | |||
| var sb = new StringBuilder(); | |||
| 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; | |||
| return sb.ToString(); | |||
| } | |||
| } | |||
| } | |||