/// <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");
            }
        }