/// <summary> /// Solicita al servidor subir una cancion /// </summary> /// <param name="path">La ruta de la cancion</param> /// <param name="idSong">El id de la cancion a subir</param> /// <param name="isPersonal">Indica si la cancion personal</param> /// <returns>Task</returns> public async Task UploadSong(string path, int idSong, bool isPersonal) { var channel = new Channel(Configuration.URIGrpcServer, ChannelCredentials.Insecure); var client = new Canciones.CancionesClient(channel); var extension = Path.GetExtension(path).Replace(".", ""); var formatAudio = ConvertExtensionToFormatAudio(extension); if (File.Exists(path)) { for (var o = 1; o <= CounTrys; o++) { var resquestUploadSong = new SolicitudSubirCancion(); resquestUploadSong.InformacionCancion = new InformacionCancion(); resquestUploadSong.InformacionCancion.IdCancion = idSong; resquestUploadSong.InformacionCancion.FormatoCancion = formatAudio; resquestUploadSong.TokenAutenticacion = ApiServiceLogin.GetServiceLogin().GetAccessToken(); var songBytes = File.ReadAllBytes(path); AsyncClientStreamingCall <SolicitudSubirCancion, RespuestaSolicitudSubirArchivo> call; call = isPersonal ? client.SubirCancionPersonal() : client.SubirCancion(); using (call) { try { var totalChunks = songBytes.Length / ChunkSize; var finalBytes = songBytes.Length % ChunkSize; for (var i = 0; i < totalChunks; i++) { resquestUploadSong.Data = ByteString.CopyFrom(FileManager.SubArray(songBytes, i * ChunkSize, ChunkSize)); await call.RequestStream.WriteAsync(resquestUploadSong); OnPorcentageUp?.Invoke(CalculatePercentageUpload(i, totalChunks)); } resquestUploadSong.Data = ByteString.CopyFrom(FileManager.SubArray(songBytes, totalChunks, finalBytes)); await call.RequestStream.WriteAsync(resquestUploadSong); await call.RequestStream.CompleteAsync(); } catch (RpcException ex) { throw new RpcException(ex.Status); } var response = await call.ResponseAsync; if (response.Error == Error.Ninguno) { OnUploadTerminated?.Invoke(); return; } if (response.Error == Error.TokenInvalido || response.Error == Error.TokenFaltante) { await ApiServiceLogin.GetServiceLogin().ReLogin(); } else { ManageErrorsUploadSong(response.Error); } } } throw new Exception("AuntenticacionFallida"); } }
/// <summary> /// Solicita al servidor la cancion con el id cancion en la calidad indicada /// </summary> /// <param name="idGetSong">El id de la cancion a solicitar al servidor</param> /// <param name="calidad">La calidad de la cancion a solicitar</param> /// <param name="isPersonalGetSong">Indica si la cancion es personal o normal</param> public async void GetSong(int idGetSong, Calidad calidad, bool isPersonalGetSong) { _getSong = true; var channel = new Channel(Configuration.URIGrpcServer, ChannelCredentials.Insecure); var client = new Canciones.CancionesClient(channel); var request = new SolicitudObtenerCancion(); var memoryStream = new MemoryStream(); var position = 0; FormatoAudio formatAudio; var error = Error.Ninguno; for (var i = 1; i <= CounTrys; i++) { try { request.IdCancion = idGetSong; request.CalidadCancionARecuperar = calidad; request.TokenAutenticacion = ApiServiceLogin.GetServiceLogin().GetAccessToken(); var call = isPersonalGetSong ? client.ObtenerCancionPersonal(request) : client.ObtenerCancion(request); using (call) { while (await call.ResponseStream.MoveNext() && _getSong) { var response = call.ResponseStream.Current; memoryStream.Write(response.Data.ToByteArray(), 0, response.Data.Length); position += response.Data.Length; formatAudio = response.FormatoCancion; error = response.Error; if (position == ChunkSize) { OnInitialRecivedSong?.Invoke(response.Data.ToByteArray(), ConvertFormatAudioToExtension(formatAudio)); } else if (position > ChunkSize) { OnSongChunkRived?.Invoke(response.Data.ToByteArray()); } if (!_getSong) { memoryStream.Dispose(); } } } } catch (RpcException) { OnErrorRaised?.Invoke("No se pudo recuperar la canción, porfavor verifique su conexion a internet"); break; } if (error != Error.Ninguno) { if (error == Error.TokenFaltante || error == Error.TokenInvalido) { await ApiServiceLogin.GetServiceLogin().ReLogin(); } else { OnErrorRaised?.Invoke(ManageGetSongError(error)); break; } } else { OnTerminatedRecivedSong?.Invoke(); memoryStream.Dispose(); break; } } if (error == Error.TokenFaltante || error == Error.TokenInvalido) { OnErrorRaised?.Invoke("AuntenticacionFallida"); } }