private async Task <bool> ExecuteApiRequest(IApiRequest request, params HttpStatusCode[] validStatusCodes)
        {
            try
            {
                IRestResponse response = await request.ExecuteRequestAsync();

                // if request was successful, return immediately...
                if (IsSuccessStatusCode(response.StatusCode))
                {
                    return(true);
                }

                // if request is among other accepted status codes, return the corresponding value...
                if (validStatusCodes != null && validStatusCodes.Contains(response.StatusCode))
                {
                    return(true);
                }

                // at this point, we've eliminated all acceptable responses, throw an exception...
                throw new VimeoApiException(string.Format("{1}{0}Code: {2}{0}Message: {3}",
                                                          Environment.NewLine,
                                                          "Error retrieving information from Vimeo API.",
                                                          response.StatusCode,
                                                          response.Content
                                                          ));
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving information from Vimeo API.", ex);
            }
        }
        /// <summary>
        /// Get text track asynchronously
        /// </summary>
        /// <param name="videoId">VideoId</param>
        /// <param name="trackId">TrackId</param>
        /// <returns>Return text track</returns>
        public async Task <TextTrack> GetTextTrackAsync(long videoId, long trackId)
        {
            try
            {
                IApiRequest request = GenerateTextTracksRequest(videoId, trackId);
                IRestResponse <TextTrack> response = await request.ExecuteRequestAsync <TextTrack>();

                UpdateRateLimit(response);
                CheckStatusCodeError(response, "Error retrieving text track for video.", HttpStatusCode.NotFound);

                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return(null);
                }
                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving text track for video.", ex);
            }
        }
        /// <summary>
        /// Upload new text track file asynchronously
        /// </summary>
        /// <param name="fileContent">File content</param>
        /// <param name="videoId">VideoId</param>
        /// <param name="track">Track</param>
        /// <returns>New text track</returns>
        public async Task <TextTrack> UploadTextTrackFileAsync(IBinaryContent fileContent, long videoId, TextTrack track)
        {
            if (!fileContent.Data.CanRead)
            {
                throw new ArgumentException("fileContent should be readable");
            }
            if (fileContent.Data.CanSeek && fileContent.Data.Position > 0)
            {
                fileContent.Data.Position = 0;
            }

            TextTrack ticket = await GetUploadTextTrackTicketAsync(videoId, track);

            IApiRequest request = ApiRequestFactory.GetApiRequest();

            request.Method = Method.PUT;
            request.ExcludeAuthorizationHeader = true;
            request.Path = ticket.link;
            request.Headers.Add(Request.HeaderContentType, fileContent.ContentType);
            request.Headers.Add(Request.HeaderContentLength, fileContent.Data.Length.ToString());
            request.BinaryContent = await fileContent.ReadAllAsync();

            IRestResponse response = await request.ExecuteRequestAsync();

            CheckStatusCodeError(null, response, "Error uploading text track file.", HttpStatusCode.BadRequest);

            return(ticket);
        }
예제 #4
0
        public async Task CompleteFileUploadAsync(IUploadRequest uploadRequest)
        {
            ThrowIfUnauthorized();

            try
            {
                IApiRequest   request  = GenerateCompleteUploadRequest(uploadRequest.Ticket);
                IRestResponse response = await request.ExecuteRequestAsync();

                CheckStatusCodeError(uploadRequest, response, "Error marking file upload as complete.");

                Parameter locationHeader =
                    response.Headers.FirstOrDefault(h => string.Compare(h.Name, "Location", true) == 0);
                if (locationHeader != null && locationHeader.Value != null)
                {
                    uploadRequest.ClipUri = locationHeader.Value as string;
                }
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoUploadException("Error marking file upload as complete.", uploadRequest, ex);
            }
        }
예제 #5
0
        /// <summary>
        /// Get all thumbnails on a video
        /// </summary>
        /// <param name="clipId"></param>
        /// <returns></returns>
        public async Task <Paginated <Picture> > GetPicturesAsync(long clipId)
        {
            try
            {
                ThrowIfUnauthorized();
                IApiRequest request = ApiRequestFactory.GetApiRequest(AccessToken);
                request.Method = HttpMethod.Get;
                request.Path   = Endpoints.Pictures;
                request.UrlSegments.Add("clipId", clipId.ToString());

                var response = await request.ExecuteRequestAsync <Paginated <Picture> >();

                UpdateRateLimit(response);
                CheckStatusCodeError(response, "Error retrieving video picture.", HttpStatusCode.NotFound);

                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return(null);
                }

                return(response.Content);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving video picture.", ex);
            }
        }
        /// <summary>
        /// Get video from album by AlbumId and ClipId asynchronously
        /// </summary>
        /// <param name="albumId">AlbumId</param>
        /// <param name="clipId">ClipId</param>
        /// <returns>Video</returns>
        public async Task <Video> GetAlbumVideoAsync(long albumId, long clipId)
        {
            try
            {
                IApiRequest           request  = GenerateAlbumVideosRequest(albumId, clipId: clipId);
                IRestResponse <Video> response = await request.ExecuteRequestAsync <Video>();

                UpdateRateLimit(response);
                CheckStatusCodeError(response, "Error retrieving user album video.", HttpStatusCode.NotFound);

                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return(null);
                }
                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving user album video.", ex);
            }
        }
        // Added 28/07/2015
        public async Task <Paginated <Video> > GetAlbumVideosAsync(long albumId, int?page, int?perPage, string sort = null, string direction = null)
        {
            try
            {
                IApiRequest request = GenerateAlbumVideosRequest(albumId, page: page, perPage: perPage, sort: sort, direction: direction);
                IRestResponse <Paginated <Video> > response = await request.ExecuteRequestAsync <Paginated <Video> >();

                CheckStatusCodeError(response, "Error retrieving account album videos.", HttpStatusCode.NotFound);

                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return(new Paginated <Video>
                    {
                        data = new List <Video>(),
                        page = 0,
                        total = 0
                    });
                }
                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving account album videos.", ex);
            }
        }
예제 #8
0
        public async Task <Paginated <Video> > GetUserVideosAsync(long userId)
        {
            try
            {
                IApiRequest request = GenerateVideosRequest(userId: userId);
                IRestResponse <Paginated <Video> > response = await request.ExecuteRequestAsync <Paginated <Video> >();

                CheckStatusCodeError(response, "Error retrieving user videos.", HttpStatusCode.NotFound);

                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return(new Paginated <Video>
                    {
                        data = new List <Video>(),
                        page = 0,
                        total = 0
                    });
                }
                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving user videos.", ex);
            }
        }
예제 #9
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);
            }
        }
예제 #10
0
        public async Task <VerifyUploadResponse> ContinueUploadFileAsync(IUploadRequest uploadRequest)
        {
            if (uploadRequest.AllBytesWritten)
            {
                // Already done, there's nothing to do.
                return(new VerifyUploadResponse
                {
                    Status = UploadStatusEnum.InProgress,
                    BytesWritten = uploadRequest.BytesWritten
                });
            }

            try
            {
                IApiRequest request = await GenerateFileStreamRequest(uploadRequest.File, uploadRequest.Ticket,
                                                                      chunkSize : uploadRequest.ChunkSize, written : uploadRequest.BytesWritten);

                IRestResponse response = await request.ExecuteRequestAsync();

                CheckStatusCodeError(uploadRequest, response, "Error uploading file chunk.", HttpStatusCode.BadRequest);

                if (response.StatusCode == HttpStatusCode.BadRequest)
                {
                    // something went wrong, figure out where we need to start over
                    return(await VerifyUploadFileAsync(uploadRequest));
                }

                // Success, update total written
                uploadRequest.BytesWritten += uploadRequest.ChunkSize;
                uploadRequest.BytesWritten  = Math.Min(uploadRequest.BytesWritten, uploadRequest.FileLength);
                return(new VerifyUploadResponse
                {
                    Status = UploadStatusEnum.InProgress,
                    BytesWritten = uploadRequest.BytesWritten
                });
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoUploadException("Error uploading file chunk", uploadRequest, ex);
            }
        }
        public async Task AddTagToVideoAsync(long clipId, string tag)
        {
            try
            {
                IApiRequest   request  = GenerateAddTagRequest(clipId, tag);
                IRestResponse response = await request.ExecuteRequestAsync();

                CheckStatusCodeError(response, "Error adding tag to video.");
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error tagging video.", ex);
            }
        }
        public async Task UpdateVideoAllowedDomainAsync(long clipId, string domain)
        {
            try
            {
                IApiRequest   request  = GenerateVideoAllowedDomainPatchRequest(clipId, domain);
                IRestResponse response = await request.ExecuteRequestAsync();

                CheckStatusCodeError(response, "Error updating user video allowed domain.");
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error updating user video metadata.", ex);
            }
        }
예제 #13
0
        public async Task UpdateVideoMetadataAsync(long clipId, VideoUpdateMetadata metaData)
        {
            try
            {
                IApiRequest   request  = GenerateVideoPatchRequest(clipId, metaData);
                IRestResponse response = await request.ExecuteRequestAsync();

                CheckStatusCodeError(response, "Error updating user video metadata.");
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error updating user video metadata.", ex);
            }
        }
        /// <summary>
        /// Delete text track asynchronously
        /// </summary>
        /// <param name="videoId">VideoId</param>
        /// <param name="trackId">TrackId</param>
        /// <returns></returns>
        public async Task DeleteTextTrackAsync(long videoId, long trackId)
        {
            try
            {
                IApiRequest request = GenerateDeleteTextTrackRequest(videoId, trackId);
                IRestResponse <TextTrack> response = await request.ExecuteRequestAsync <TextTrack>();

                UpdateRateLimit(response);
                CheckStatusCodeError(response, "Error updating text track for video.", HttpStatusCode.NotFound);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error updating text track for video.", ex);
            }
        }
예제 #15
0
        /// <summary>
        /// Delete video asynchronously
        /// </summary>
        /// <param name="clipId">CliepId</param>
        public async Task DeleteVideoAsync(long clipId)
        {
            try
            {
                IApiRequest   request  = GenerateVideoDeleteRequest(clipId);
                IRestResponse response = await request.ExecuteRequestAsync();

                UpdateRateLimit(response);
                CheckStatusCodeError(response, "Error deleting video.");
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error updating user video metadata.", ex);
            }
        }
예제 #16
0
        public async Task <User> GetAccountInformationAsync()
        {
            try
            {
                IApiRequest          request  = GenerateUserInformationRequest();
                IRestResponse <User> response = await request.ExecuteRequestAsync <User>();

                CheckStatusCodeError(response, "Error retrieving account information.");

                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving account information.", ex);
            }
        }
예제 #17
0
        public async Task <UploadTicket> GetUploadTicketAsync()
        {
            try
            {
                IApiRequest request = GenerateUploadTicketRequest();
                IRestResponse <UploadTicket> response = await request.ExecuteRequestAsync <UploadTicket>();

                CheckStatusCodeError(null, response, "Error generating upload ticket.");

                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoUploadException("Error generating upload ticket.", null, ex);
            }
        }
예제 #18
0
        public async Task <Paginated <Video> > GetAlbumVideosAsync(long albumId)
        {
            try
            {
                IApiRequest request = GenerateAlbumVideosRequest(albumId);
                IRestResponse <Paginated <Video> > response = await request.ExecuteRequestAsync <Paginated <Video> >();

                CheckStatusCodeError(response, "Error retrieving account album videos.");

                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving account album videos.", ex);
            }
        }
예제 #19
0
        public async Task <Paginated <Video> > GetVideosAsync(int?page = null, int?perPage = null)
        {
            try
            {
                IApiRequest request = GenerateVideosRequest(page: page, perPage: perPage);
                IRestResponse <Paginated <Video> > response = await request.ExecuteRequestAsync <Paginated <Video> >();

                CheckStatusCodeError(response, "Error retrieving account videos.");

                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving account videos.", ex);
            }
        }
예제 #20
0
        /// <summary>
        /// Create new upload ticket for replace video asynchronously
        /// </summary>
        /// <param name="videoId">VideoId</param>
        /// <returns>Upload ticket</returns>
        public async Task <UploadTicket> GetReplaceVideoUploadTicketAsync(long videoId)
        {
            try
            {
                IApiRequest request = GenerateReplaceVideoUploadTicketRequest(videoId);
                IRestResponse <UploadTicket> response = await request.ExecuteRequestAsync <UploadTicket>();

                UpdateRateLimit(response);
                CheckStatusCodeError(null, response, "Error generating upload ticket to replace video.");

                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoUploadException("Error generating upload ticket to replace video.", null, ex);
            }
        }
예제 #21
0
        /// <summary>
        /// Utility method for performing API requests that retrieve data in a consistent manner.
        ///
        /// The given request will be performed, and if the response is an outright success then
        /// the response data will be unwrapped and returned.
        ///
        /// If the call is not an outright success, but the status code is among the other acceptable
        /// results (provided via validStatusCodes), the getValueForStatusCode method will be called
        /// to generate a return value. This allows the caller to return null or an empty list as
        /// desired.
        ///
        /// If neither of the above is possible, an exception will be thrown.
        /// </summary>
        /// <typeparam name="T">Type of the expected response data.</typeparam>
        /// <param name="request"></param>
        /// <param name="getValueForStatusCode"></param>
        /// <param name="validStatusCodes"></param>
        /// <returns></returns>
        private async Task <T> ExecuteApiRequest <T>(IApiRequest request, Func <HttpStatusCode, T> getValueForStatusCode,
                                                     params HttpStatusCode[] validStatusCodes) where T : new()
        {
            try
            {
                var response = await request.ExecuteRequestAsync <T>().ConfigureAwait(false);

                UpdateRateLimit(response);

                // if request was successful, return immediately...
                if (IsSuccessStatusCode(response.StatusCode))
                {
                    return(response.Content);
                }

                // if request is among other accepted status codes, return the corresponding value...
                if (validStatusCodes != null && validStatusCodes.Contains(response.StatusCode))
                {
                    return(getValueForStatusCode(response.StatusCode));
                }

                // at this point, we've eliminated all acceptable responses, throw an exception...
                throw new VimeoApiException(string.Format("{1}{0}Code: {2}{0}Message: {3}",
                                                          Environment.NewLine,
                                                          "Error retrieving information from Vimeo API.",
                                                          response.StatusCode,
                                                          response.Text
                                                          ));
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }

                throw new VimeoApiException("Error retrieving information from Vimeo API.", ex);
            }
        }
        private async Task <TextTrack> GetUploadTextTrackTicketAsync(long clipId, TextTrack track)
        {
            try
            {
                IApiRequest request = GenerateUploadTextTrackTicketRequest(clipId, track);

                IRestResponse <TextTrack> response = await request.ExecuteRequestAsync <TextTrack>();

                UpdateRateLimit(response);
                CheckStatusCodeError(null, response, "Error generating upload text track ticket.");

                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoUploadException("Error generating upload text track ticket.", null, ex);
            }
        }
예제 #23
0
        /// <summary>
        /// set thumbnail picture asynchronously
        /// </summary>
        /// <param name="link">link</param>
        /// <returns>Set thumbnail pic </returns>
        public async Task SetThumbnailActiveAsync(string link)
        {
            try
            {
                ThrowIfUnauthorized();
                IApiRequest request = ApiRequestFactory.GetApiRequest(AccessToken);
                request.Method = new HttpMethod("PATCH");
                request.Path   = link;
                request.Query.Add("active", "true");

                var response = await request.ExecuteRequestAsync();

                CheckStatusCodeError(null, response, "Error Setting thumbnail image active.");
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoUploadException("Error Setting thumbnail image active.", null, ex);
            }
        }
예제 #24
0
        public async Task <User> GetUserInformationAsync(long userId)
        {
            try
            {
                IApiRequest          request  = GenerateUserInformationRequest(userId);
                IRestResponse <User> response = await request.ExecuteRequestAsync <User>();

                CheckStatusCodeError(response, "Error retrieving user information.", HttpStatusCode.NotFound);

                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return(null);
                }
                return(response.Data);
            }
            catch (Exception ex)
            {
                if (ex is VimeoApiException)
                {
                    throw;
                }
                throw new VimeoApiException("Error retrieving user information.", ex);
            }
        }