/// <summary>
        /// See <see cref="ISource{T}.GetContent(string)"/>
        ///
        /// Respects the ratelimits imposed on Imgur requests.
        /// </summary>
        /// <param name="imageId">The id of the image to get</param>
        public async Task <ImgurImage> GetContent(string imageId)
        {
            if (!_ratelimiter.LimitsHaveBeenLoaded())
            {
                await _ratelimiter.AttemptToLoadLimits();
            }

            if (_ratelimiter.IsRequestAllowed())
            {
                var result = await _client.GetAsync($"https://api.imgur.com/3/image/{imageId}");

                _ratelimiter.UpdateLimit(result.Headers.ToList());

                if (result.IsSuccessStatusCode)
                {
                    var val = await result.Content.ReadAsStringAsync();

                    var image = JsonConvert.DeserializeObject <ApiHelper <ImgurImage> >(val);

                    var ext = await image.Data.GetImageType();

                    if (Settings.GetSupportedExtensions().Contains(ext.ToLower()))
                    {
                        return(image.Data);
                    }
                }
            }

            return(null);
        }
Example #2
0
        /// <summary>
        /// See <see cref="ISource{T}.GetContent(string)"/>
        ///
        /// Respects the ratelimits imposed on Imgur requests.
        /// </summary>
        /// <param name="albumId">The id of the album to get</param>
        public async Task <ImgurAlbum> GetContent(string albumId)
        {
            if (!_ratelimiter.LimitsHaveBeenLoaded())
            {
                await _ratelimiter.AttemptToLoadLimits();
            }

            if (_ratelimiter.IsRequestAllowed())
            {
                var result = await _client.GetAsync($"https://api.imgur.com/3/album/{albumId}");

                _ratelimiter.UpdateLimit(result.Headers.ToList());

                if (result.IsSuccessStatusCode)
                {
                    var val = await result.Content.ReadAsStringAsync();

                    var album = JsonConvert.DeserializeObject <ApiHelper <ImgurAlbum> >(val);

                    await album.Data.RemoveNonsupportedImages();

                    return(album.Data);
                }
            }

            return(new ImgurAlbum());
        }
        public async void IsRequestAllowed_when_limists_are_hit_returns_false()
        {
            var limitSourceMock = new Mock <ISource <ImgurRatelimitResponse> >();

            var limitResponse = new ImgurRatelimitResponse {
                ClientLimit = 12500, ClientRemaining = 0, UserLimit = 500, UserRemaining = 0, StatusCode = HttpStatusCode.OK
            };

            limitSourceMock.Setup(m => m.GetContent(It.IsAny <string>())).ReturnsAsync(limitResponse);

            var source = new ImgurRatelimiter(limitSourceMock.Object);
            await source.LoadLimits();

            Assert.False(source.IsRequestAllowed());
        }
        /// <summary>
        /// See <see cref="ISource{T}.GetContent(string)"/>
        ///
        /// Respects the ratelimits imposed on Imgur requests.
        /// </summary>
        /// <param name="username">The users username</param>
        public async Task <GenericAlbum> GetContent(string username)
        {
            if (!_ratelimiter.LimitsHaveBeenLoaded())
            {
                await _ratelimiter.AttemptToLoadLimits();
            }

            var images = new List <IApiImage>();

            if (_ratelimiter.IsRequestAllowed())
            {
                var imageNumberResult = await _client.GetAsync($"https://api.imgur.com/3/account/{username}/images/count");

                _ratelimiter.UpdateLimit(imageNumberResult.Headers.ToList());

                if (!imageNumberResult.IsSuccessStatusCode)
                {
                    return(new GenericAlbum {
                        Images = images
                    });
                }

                //The number of images that the user has.
                var numVal = await imageNumberResult.Content.ReadAsStringAsync();

                var numImages = JsonConvert.DeserializeObject <ApiHelper <int> >(numVal).Data;

                //Each page contains 50 images, so page through them if we need to.
                for (var page = 0; page < Math.Ceiling(numImages / 50.0); page++)
                {
                    if (_ratelimiter.IsRequestAllowed())
                    {
                        var result = await _client.GetAsync($"https://api.imgur.com/3/account/{username}/images/{page}");

                        _ratelimiter.UpdateLimit(result.Headers.ToList());

                        if (result.IsSuccessStatusCode)
                        {
                            var val = await result.Content.ReadAsStringAsync();

                            var valParsed = JsonConvert.DeserializeObject <ApiHelper <ICollection <ImgurImage> > >(val);

                            foreach (var image in valParsed.Data)
                            {
                                var ext = await image.GetImageType();

                                if (Settings.GetSupportedExtensions().Contains(ext.ToLower()))
                                {
                                    images.Add(image);
                                }
                            }
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(new GenericAlbum {
                Images = images
            });
        }