Пример #1
0
        public async Task <IUploadRequest> StartUploadFileAsync(IBinaryContent fileContent,
                                                                int chunkSize       = DEFAULT_UPLOAD_CHUNK_SIZE,
                                                                long?replaceVideoId = null)
        {
            if (!fileContent.Data.CanRead)
            {
                throw new ArgumentException("fileContent should be readable");
            }
            if (fileContent.Data.CanSeek && fileContent.Data.Position > 0)
            {
                fileContent.Data.Position = 0;
            }

            UploadTicket ticket = replaceVideoId.HasValue
                ? await GetReplaceVideoUploadTicketAsync(replaceVideoId.Value)
                : await GetUploadTicketAsync();

            var uploadRequest = new UploadRequest
            {
                Ticket    = ticket,
                File      = fileContent,
                ChunkSize = chunkSize
            };

            VerifyUploadResponse uploadStatus = await ContinueUploadFileAsync(uploadRequest);

            return(uploadRequest);
        }
Пример #2
0
        public async Task <IUploadRequest> StartUploadFileAsync(IBinaryContent fileContent,
                                                                int chunkSize = DEFAULT_UPLOAD_CHUNK_SIZE)
        {
            if (!fileContent.Data.CanRead)
            {
                throw new ArgumentException("fileContent should be readable");
            }
            if (fileContent.Data.CanSeek && fileContent.Data.Position > 0)
            {
                fileContent.Data.Position = 0;
            }

            UploadTicket ticket = await GetUploadTicketAsync();

            var uploadRequest = new UploadRequest
            {
                Ticket    = ticket,
                File      = fileContent,
                ChunkSize = chunkSize
            };

            VerifyUploadResponse uploadStatus = await ContinueUploadFileAsync(uploadRequest);

            uploadRequest.BytesWritten = uploadStatus.BytesWritten;

            return(uploadRequest);
        }
Пример #3
0
        /// <summary>
        /// Verify upload file part asynchronously
        /// </summary>
        /// <param name="uploadRequest">UploadRequest</param>
        /// <returns>Verification reponse</returns>
        private async Task <VerifyUploadResponse> VerifyUploadFileAsync(IUploadRequest uploadRequest)
        {
            try
            {
                var request =
                    await GenerateFileStreamRequest(uploadRequest.File, uploadRequest.Ticket, verifyOnly : true)
                    .ConfigureAwait(false);

                var response = await request.ExecuteRequestAsync().ConfigureAwait(false);

                var verify = new VerifyUploadResponse();
                CheckStatusCodeError(uploadRequest, response, "Error verifying file upload.", (HttpStatusCode)308);

                // ReSharper disable once ConvertIfStatementToSwitchStatement
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    verify.BytesWritten = uploadRequest.FileLength;
                    verify.Status       = UploadStatusEnum.Completed;
                }
                else if (response.StatusCode == (HttpStatusCode)308)
                {
                    verify.Status = UploadStatusEnum.InProgress;
                    if (!response.Headers.Contains("Range"))
                    {
                        return(verify);
                    }
                    var match = RangeRegex.Match(response.Headers.GetValues("Range").First());
                    // ReSharper disable once InvertIf
                    if (match.Success &&
                        long.TryParse(match.Groups["start"].Value, out var startIndex) &&
                        long.TryParse(match.Groups["end"].Value, out var endIndex))
                    {
                        verify.BytesWritten        = endIndex - startIndex;
                        uploadRequest.BytesWritten = verify.BytesWritten;
                        if (verify.BytesWritten == uploadRequest.FileLength)
                        {
                            verify.Status = UploadStatusEnum.Completed;
                        }
                    }
                }
                else
                {
                    verify.Status = UploadStatusEnum.NotFound;
                }

                return(verify);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }

                throw new VimeoUploadException("Error verifying file upload.", uploadRequest, ex);
            }
        }
Пример #4
0
        public async Task <VerifyUploadResponse> VerifyUploadFileAsync(IUploadRequest uploadRequest)
        {
            try
            {
                IApiRequest request =
                    await GenerateFileStreamRequest(uploadRequest.File, uploadRequest.Ticket, verifyOnly : true);

                IRestResponse response = await request.ExecuteRequestAsync();

                var verify = new VerifyUploadResponse();
                CheckStatusCodeError(uploadRequest, response, "Error verifying file upload.", (HttpStatusCode)308);

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    verify.BytesWritten = uploadRequest.FileLength;
                    verify.Status       = UploadStatusEnum.Completed;
                }
                else if (response.StatusCode == (HttpStatusCode)308)
                {
                    verify.Status = UploadStatusEnum.InProgress;
                    int       startIndex  = 0;
                    int       endIndex    = 0;
                    Parameter rangeHeader =
                        response.Headers.FirstOrDefault(h => string.Compare(h.Name, "Range", true) == 0);
                    if (rangeHeader != null && rangeHeader.Value != null)
                    {
                        Match match = _rangeRegex.Match(rangeHeader.Value as string);
                        if (match.Success &&
                            int.TryParse(match.Groups["start"].Value, out startIndex) &&
                            int.TryParse(match.Groups["end"].Value, out endIndex))
                        {
                            verify.BytesWritten = endIndex - startIndex;
                            if (verify.BytesWritten == uploadRequest.FileLength)
                            {
                                verify.Status = UploadStatusEnum.Completed;
                            }
                        }
                    }
                }
                else
                {
                    verify.Status = UploadStatusEnum.NotFound;
                }

                return(verify);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoUploadException("Error verifying file upload.", uploadRequest, ex);
            }
        }
Пример #5
0
        public async Task <IUploadRequest> UploadEntireFileAsync(IBinaryContent fileContent,
                                                                 int chunkSize       = DEFAULT_UPLOAD_CHUNK_SIZE,
                                                                 long?replaceVideoId = null)
        {
            IUploadRequest uploadRequest = await StartUploadFileAsync(fileContent, chunkSize, replaceVideoId);

            VerifyUploadResponse uploadStatus = null;

            while (!uploadRequest.IsVerifiedComplete)
            {
                uploadStatus = await ContinueUploadFileAsync(uploadRequest);

                if (uploadRequest.AllBytesWritten)
                {
                    // We presumably wrote all the bytes in the file, so verify with Vimeo that it
                    // is completed
                    uploadStatus = await VerifyUploadFileAsync(uploadRequest);

                    if (uploadStatus.Status == UploadStatusEnum.Completed)
                    {
                        // If completed, mark file as complete
                        await CompleteFileUploadAsync(uploadRequest);

                        uploadRequest.IsVerifiedComplete = true;
                    }
                    else if (uploadStatus.BytesWritten == uploadRequest.FileLength)
                    {
                        // Supposedly all bytes are written, but Vimeo doesn't think so, so just
                        // bail out
                        throw new VimeoUploadException(
                                  string.Format(
                                      "Vimeo failed to mark file as completed, Bytes Written: {0:N0}, Expected: {1:N0}.",
                                      uploadStatus.BytesWritten),
                                  uploadRequest);
                    }
                }
            }

            return(uploadRequest);
        }