/// <summary>
        /// Event handler for the "Find Images" button.  Fetches image URL's based on the field values in
        /// the first tab, and uses that information to set field values in the second tab.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FindImagesButton_Click(object sender, RoutedEventArgs e)
        {
            MainTabControl.SelectedItem = DownloadImagesTabItem;

            // TODO:  Refactor, and make this asynchronous so it doesn't block the main UI thread

            // Get user input from XAML fields
            string       entity = EntityTextBox.Text;
            RedditEntity type   = (UserEntityType.IsChecked == true) ? RedditEntity.User : RedditEntity.Subreddit;
            int          maxPages;

            if (!int.TryParse(MaxPagesTextBox.Text, out maxPages))
            {
                maxPages = 1;
            }

            // Parse Imgur image and album URL's for the given Reddit user or subuser, stopping when we
            // either run out of pages or else hit the maximum page count
            HashSet <string> imageUrls      = new HashSet <string>();
            HashSet <string> albumUrls      = new HashSet <string>();
            string           nextPageCursor = "";
            int pageCount = 1;

            for ( ; pageCount <= maxPages && nextPageCursor != null; pageCount++)
            {
                Console.WriteLine("Processing page {0} for {1} {2}", pageCount, type.ToString().ToLower(), entity);
                Uri redditUrl = RedditUtils.BuildUrl(entity, type, "".Equals(nextPageCursor) ? null : nextPageCursor);
                RedditUtils.ParsePage(redditUrl, ref imageUrls, ref albumUrls, out nextPageCursor);
                if (nextPageCursor != null)
                {
                    Console.WriteLine("nextPageCursor == {0}", nextPageCursor);
                }
            }
            Console.WriteLine("Parsed {0} image URL's and {1} album URL's from {2} pages", imageUrls.Count, albumUrls.Count, pageCount);

            // Parse out image URL's from the albums
            var imagesFromAlbums = albumUrls.SelectMany(albumUrl => ImgurUtils.ParseAlbum(new Uri(albumUrl)));

            imageUrls.UnionWith(imagesFromAlbums);
            Console.WriteLine("There are {0} total images after extracting {1} from albums", imageUrls.Count, imagesFromAlbums.ToList().Count);

            PageCountLabel.Content     = pageCount;
            ImagesCountLabel.Content   = imageUrls.Count;
            ImagesDataGrid.ItemsSource = imageUrls.Select(imageUrl => new ImgurUrl {
                URL = imageUrl
            });
        }
Beispiel #2
0
        public void TestBuildUrl()
        {
            Uri shouldBeNull = RedditUtils.BuildUrl(null, RedditEntity.Subreddit);

            Assert.IsNull(shouldBeNull);

            Uri subreddit = RedditUtils.BuildUrl("downloaddit", RedditEntity.Subreddit);

            Assert.AreEqual(new Uri("https://www.reddit.com/r/downloaddit.json"), subreddit);

            Uri user = RedditUtils.BuildUrl("downloaddit", RedditEntity.User);

            Assert.AreEqual(new Uri("https://www.reddit.com/user/downloaddit/submitted.json"), user);

            Uri cursor = RedditUtils.BuildUrl("downloaddit", RedditEntity.User, "testCursor");

            Assert.AreEqual(new Uri("https://www.reddit.com/user/downloaddit/submitted.json?after=testCursor"), cursor);
        }
Beispiel #3
0
        public void TestRedditParsePage()
        {
            HashSet <string> imageUrls = new HashSet <string>();
            HashSet <string> albumUrls = new HashSet <string>();
            string           nextPageCursor;

            Uri redditUrl = RedditUtils.BuildUrl("downloaddit", RedditEntity.User);

            RedditUtils.ParsePage(redditUrl, ref imageUrls, ref albumUrls, out nextPageCursor);

            Assert.AreEqual(7, imageUrls.Count);
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/S4C7aXQ.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/ZpfAWXh.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/7uhgGPV.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/p9rEApr.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/vK86CfT.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/QxzTjP1.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/0DIjbFw.jpg"));

            Assert.AreEqual(2, albumUrls.Count);
            Assert.IsTrue(albumUrls.Contains("http://imgur.com/gallery/iC1HR"));
            Assert.IsTrue(albumUrls.Contains("http://imgur.com/gallery/qLp4E"));

            Assert.IsNotNull(nextPageCursor);

            redditUrl = RedditUtils.BuildUrl("downloaddit", RedditEntity.User, nextPageCursor);
            RedditUtils.ParsePage(redditUrl, ref imageUrls, ref albumUrls, out nextPageCursor);

            Assert.AreEqual(10, imageUrls.Count);  // 3 were added to the initial 7
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/zpCdbSo.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/NAjPBsa.jpg"));
            Assert.IsTrue(imageUrls.Contains("https://i.imgur.com/7gnUdfU.jpg"));

            Assert.AreEqual(4, albumUrls.Count);  // 2 were added to the initial 2
            Assert.IsTrue(albumUrls.Contains("http://imgur.com/a/Rjjn2"));
            Assert.IsTrue(albumUrls.Contains("http://imgur.com/gallery/w32RT/new"));

            Assert.IsNull(nextPageCursor);
        }