| public class MultipleTrackResponse | public class MultipleTrackResponse | ||||
| { | { | ||||
| [ProtoMember(1)] | [ProtoMember(1)] | ||||
| public AudioFeature AudioFeatures { get; set; } | |||||
| public List<AudioFeature>? Audio_Features { get; set; } | |||||
| } | } | ||||
| [ProtoContract] | [ProtoContract] | ||||
| public class AudioFeature | public class AudioFeature |
| 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; } | |||||
| } | |||||
| } |
| using GrpcShared.DTO.Search; | using GrpcShared.DTO.Search; | ||||
| using GrpcShared.DTO.Track.MultipleTrack; | using GrpcShared.DTO.Track.MultipleTrack; | ||||
| using GrpcShared.DTO.Track.SaveTracks; | |||||
| using GrpcShared.DTO.Track.SingleTrack; | using GrpcShared.DTO.Track.SingleTrack; | ||||
| using ProtoBuf.Grpc.Configuration; | using ProtoBuf.Grpc.Configuration; | ||||
| using System; | using System; | ||||
| Task<SearchResponse> ListSearchAsync(SearchRequest request); | Task<SearchResponse> ListSearchAsync(SearchRequest request); | ||||
| Task<SingleTrackResponse> ListSingleTrackAsync(SingleTrackRequest request); | Task<SingleTrackResponse> ListSingleTrackAsync(SingleTrackRequest request); | ||||
| Task<MultipleTrackResponse> ListMultipleTrackAsync(MultipleTrackRequest request); | Task<MultipleTrackResponse> ListMultipleTrackAsync(MultipleTrackRequest request); | ||||
| Task SaveTracks(SaveTracksRequest request); | |||||
| } | } | ||||
| } | } |
| //SearchRequest request = new() { Query = "aitch", Type = "track", Token = token }; | //SearchRequest request = new() { Query = "aitch", Type = "track", Token = token }; | ||||
| //SearchResponse searchResponse = await SearchService.GetListSearchAsync(request); | //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); | |||||
| } | } | ||||
| using GrpcShared.DTO.Search; | using GrpcShared.DTO.Search; | ||||
| using GrpcShared.DTO.Track.MultipleTrack; | using GrpcShared.DTO.Track.MultipleTrack; | ||||
| using GrpcShared.DTO.Track.SaveTracks; | |||||
| using GrpcShared.DTO.Track.SingleTrack; | using GrpcShared.DTO.Track.SingleTrack; | ||||
| namespace NemAnBlazor.Services.Interfaces | namespace NemAnBlazor.Services.Interfaces | ||||
| Task<SearchResponse> GetListSearchAsync(SearchRequest request); | Task<SearchResponse> GetListSearchAsync(SearchRequest request); | ||||
| Task<SingleTrackResponse> GetListSingleTrackAsync(SingleTrackRequest request); | Task<SingleTrackResponse> GetListSingleTrackAsync(SingleTrackRequest request); | ||||
| Task<MultipleTrackResponse> GetListMultipleTrackAsync(MultipleTrackRequest request); | Task<MultipleTrackResponse> GetListMultipleTrackAsync(MultipleTrackRequest request); | ||||
| Task PutSaveTracks(SaveTracksRequest request); | |||||
| } | } | ||||
| } | } |
| using Grpc.Net.Client; | using Grpc.Net.Client; | ||||
| using GrpcShared.DTO.Search; | using GrpcShared.DTO.Search; | ||||
| using GrpcShared.DTO.Track.MultipleTrack; | using GrpcShared.DTO.Track.MultipleTrack; | ||||
| using GrpcShared.DTO.Track.SaveTracks; | |||||
| using GrpcShared.DTO.Track.SingleTrack; | using GrpcShared.DTO.Track.SingleTrack; | ||||
| using GrpcShared.Interfaces; | using GrpcShared.Interfaces; | ||||
| using NemAnBlazor.Services.Interfaces; | using NemAnBlazor.Services.Interfaces; | ||||
| { | { | ||||
| return await _serviceClient.ListMultipleTrackAsync(request); | return await _serviceClient.ListMultipleTrackAsync(request); | ||||
| } | } | ||||
| public async Task PutSaveTracks(SaveTracksRequest request) | |||||
| { | |||||
| await _serviceClient.SaveTracks(request); | |||||
| } | |||||
| } | } | ||||
| } | } |
| using GrpcShared; | using GrpcShared; | ||||
| using GrpcShared.DTO.Search; | using GrpcShared.DTO.Search; | ||||
| using GrpcShared.DTO.Track.MultipleTrack; | using GrpcShared.DTO.Track.MultipleTrack; | ||||
| using GrpcShared.DTO.Track.SaveTracks; | |||||
| using GrpcShared.DTO.Track.SingleTrack; | using GrpcShared.DTO.Track.SingleTrack; | ||||
| using GrpcShared.Interfaces; | using GrpcShared.Interfaces; | ||||
| using Microsoft.Net.Http.Headers; | using Microsoft.Net.Http.Headers; | ||||
| using System.Text; | using System.Text; | ||||
| using System.Text.Json; | using System.Text.Json; | ||||
| using System.Web; | using System.Web; | ||||
| using static GrpcShared.DTO.Search.SearchDetails; | |||||
| namespace SpotifyService.Services | namespace SpotifyService.Services | ||||
| { | { | ||||
| client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + request.Token); | 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>>(); | var param = new Dictionary<string, List<string>>(); | ||||
| param["ids"] = request.Ids; | 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())!; | var responses = JsonConvert.DeserializeObject<MultipleTrackResponse>(await trackMultipleResult.Content.ReadAsStringAsync())!; | ||||
| return new MultipleTrackResponse | 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(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||