Example #1
0
        private Datamodels.TumblrJson RequestData(string url, string authHeaders)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "GET";
                request.ServicePoint.Expect100Continue = false;
                request.ContentType = "x-www-from-urlencoded";

                if (authHeaders != null)
                {
                    // add OAuth header
                    request.Headers["Authorization"] = authHeaders;
                }

                var jsserializer = new JavaScriptSerializer();
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    ThrottledStream stream = new ThrottledStream(response.GetResponseStream(), (shellService.Settings.Bandwidth / shellService.Settings.ParallelImages) * 1024);
                    StreamReader    reader = new StreamReader(stream);

                    DataModels.TumblrJson data = jsserializer.Deserialize <DataModels.TumblrJson>(reader.ReadToEnd());
                    if (data.meta.status == 200)
                    {
                        return(data);
                    }
                    return(null);
                }
            }
            catch (WebException ex)
            {
                return(null);
            }
        }
Example #2
0
        public Tuple <uint, List <string> > GetImageUrls(TumblrBlog blog, IProgress <DataModels.DownloadProgress> progress, CancellationToken ct, PauseToken pt)
        {
            int           totalPosts           = 0;
            int           numberOfPostsCrawled = 0;
            uint          totalImages;
            List <string> images = new List <string>();

            string url        = GetApiUrl(blog.Name, 1);
            string authHeader = shellService.OAuthManager.GenerateauthHeader(url, "GET");

            var blogDoc = RequestData(url, authHeader);

            totalPosts = blogDoc.response.blog.total_posts;

            // Generate URL list of Images
            // the api v2 shows 20 posts at max, determine the number of pages to crawl
            int totalPages = (totalPosts / 20) + 1;

            Parallel.For(0, totalPages,
                         new ParallelOptions {
                MaxDegreeOfParallelism = (shellService.Settings.ParallelImages / selectionService.ActiveItems.Count)
            },
                         (i, state) =>
            {
                if (ct.IsCancellationRequested)
                {
                    state.Break();
                }
                if (pt.IsPaused)
                {
                    pt.WaitWhilePausedWithResponseAsyc().Wait();
                }
                try
                {
                    // check for tags -- crawling for all images here
                    if (blog.Tags == null || blog.Tags.Count() == 0)
                    {
                        DataModels.TumblrJson document = null;

                        // get 20 posts per crawl/page
                        url        = GetApiUrl(blog.Name, 20, i * 20);
                        authHeader = shellService.OAuthManager.GenerateauthHeader(url, "GET");

                        document = RequestData(url, authHeader);

                        if (shellService.Settings.DownloadImages == true)
                        {
                            foreach (Datamodels.Post post in document.response.posts.Where(posts => posts.type.Equals("photo")))
                            {
                                foreach (DataModels.Photo photo in post.photos)
                                {
                                    var imageUrl = photo.alt_sizes.ElementAt(shellService.Settings.ImageSizes.IndexOf(shellService.Settings.ImageSize.ToString())).url;
                                    if (shellService.Settings.SkipGif == true && imageUrl.EndsWith(".gif"))
                                    {
                                        continue;
                                    }
                                    Monitor.Enter(images);
                                    images.Add(imageUrl);
                                    Monitor.Exit(images);
                                }
                            }
                        }
                        if (shellService.Settings.DownloadVideos == true)
                        {
                            foreach (DataModels.Post post in document.response.posts.Where(posts => posts.type.Equals("video")))
                            {
                                if (shellService.Settings.VideoSize == 1080)
                                {
                                    Monitor.Enter(images);
                                    images.Add(post.video_url);
                                    Monitor.Exit(images);
                                }
                                if (shellService.Settings.VideoSize == 480)
                                {
                                    Monitor.Enter(images);
                                    images.Add(post.video_url.Insert(post.video_url.LastIndexOf("."), "_480"));
                                    Monitor.Exit(images);
                                }
                            }
                        }
                    }
                    // crawling only for tagged images
                    else
                    {
                        List <string> tags = blog.Tags.Split(',').Select(x => x.Trim()).ToList();

                        DataModels.TumblrJson document = null;

                        // get 20 posts per crawl/page
                        url        = GetApiUrl(blog.Name, 20, i * 20);
                        authHeader = shellService.OAuthManager.GenerateauthHeader(url, "GET");

                        document = RequestData(url, authHeader);

                        if (shellService.Settings.DownloadImages == true)
                        {
                            foreach (Datamodels.Post post in document.response.posts.Where(posts => posts.tags.Any(tag => tags.Equals(tag)) && posts.type.Equals("photo")))
                            {
                                foreach (DataModels.Photo photo in post.photos ?? new List <Datamodels.Photo>())
                                {
                                    var imageUrl = photo.alt_sizes.ElementAt(shellService.Settings.ImageSizes.IndexOf(shellService.Settings.ImageSize.ToString())).url;
                                    if (shellService.Settings.SkipGif == true && imageUrl.EndsWith(".gif"))
                                    {
                                        continue;
                                    }
                                    Monitor.Enter(images);
                                    images.Add(imageUrl);
                                    Monitor.Exit(images);
                                }
                            }
                        }
                        if (shellService.Settings.DownloadVideos == true)
                        {
                            foreach (DataModels.Post post in document.response.posts.Where(posts => posts.tags.Any(tag => tags.Equals(tag)) && posts.type.Equals("video")))
                            {
                                if (shellService.Settings.VideoSize == 1080)
                                {
                                    Monitor.Enter(images);
                                    images.Add(post.video_url);
                                    Monitor.Exit(images);
                                }
                                if (shellService.Settings.VideoSize == 480)
                                {
                                    Monitor.Enter(images);
                                    images.Add(post.video_url.Insert(post.video_url.LastIndexOf("."), "_480"));
                                    Monitor.Exit(images);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Data);
                }

                numberOfPostsCrawled += 20;
                var newProgress       = new DataModels.DownloadProgress();
                newProgress.Progress  = string.Format(CultureInfo.CurrentCulture, Resources.ProgressGetUrl, numberOfPostsCrawled, totalPosts);
                progress.Report(newProgress);
            }
                         );

            images = images.Distinct().ToList();

            totalImages = (uint)images.Count;
            return(Tuple.Create(totalImages, images));
        }