예제 #1
0
        public ParallelPhilomenaImageSearchDownloader(IPhilomenaImageSearch imageSearch, IPhilomenaImageDownloader imageDownloader, int maxDownloadThreads)
        {
            _logger = Logger.Factory.CreateLogger(GetType());

            _imageSearch        = imageSearch;
            _imageDownloader    = imageDownloader;
            _maxDownloadThreads = maxDownloadThreads;
        }
        public async Task RunExample()
        {
            PhilomenaClient       client = new PhilomenaClient("https://derpibooru.org");
            IPhilomenaImageSearch search = client.GetImageSearch("fluttershy", o => o
                                                                 .WithMaxImages(5)
                                                                 );

            Log.Information("Download query simple");

            // Using download all method
            await search
            .CreateParallelDownloader(maxDownloadThreads : 8, o => o
                                      .WithImageFileDownloader(image => $"ExampleDownloads/EnumerateSearchQuery/{image.Id}.{image.Format}")
                                      )
            .BeginDownload();

            Log.Information("Download query with delegates, skipping existing images");

            // Use a conditional downloader to skip images already downloaded
            // Note that filters in the search query itself are preferred since they will provide better performance. Don't use conditional downloaders for conditions like image score.
            await search
            .CreateParallelDownloader(maxDownloadThreads : 8, o => o
                                      .WithConditionalDownloader(SkipImagesAlreadyDownloaded, o => o
                                                                 .WithImageFileDownloader(GetFileForImage)
                                                                 )
                                      )
            .BeginDownload();

            Log.Information("Downloading images explicitly");

            // Explicitly looping over each image and saving
            await foreach (IPhilomenaImage image in search.BeginSearch())
            {
                string filename = $"ExampleDownloads/EnumerateSearchQuery/{image.Id}.{image.Format}";

                await image.DownloadToFile(filename);
            }

            Log.Information("Downloading with multiple threads and progress updates");

            // Downloading with multiple threads and progress updates
            // Also skips downloaded images like before
            SyncProgress <PhilomenaImageSearchDownloadProgressInfo> progress = new SyncProgress <PhilomenaImageSearchDownloadProgressInfo>(DownloadProgressUpdate);
            await client
            .GetImageSearch("fluttershy", o => o
                            .WithMaxImages(100)
                            )
            .CreateParallelDownloader(maxDownloadThreads: 8, o => o
                                      .WithConditionalDownloader(SkipImagesAlreadyDownloaded, o => o
                                                                 .WithImageFileDownloader(GetFileForImage)
                                                                 .WithImageMetadataFileDownloader(GetMetadataFileForImage)
                                                                 )
                                      )
            .BeginDownload(searchDownloadProgress: progress);
        }
        /// <summary>
        /// Creates a parallel downloader for a search query
        /// </summary>
        /// <param name="imageSearch">The image search to download</param>
        /// <param name="maxDownloadThreads">The max number of threads to use when downloading</param>
        /// <param name="buildImageDownloader">Configures a sequential image downloader builder</param>
        /// <returns>A parallel downloader for the search query</returns>
        public static ParallelPhilomenaImageSearchDownloader CreateParallelDownloader(this IPhilomenaImageSearch imageSearch, int maxDownloadThreads, Func <SequentialPhilomenaImageDownloaderBuilder, SequentialPhilomenaImageDownloaderBuilder> buildImageDownloader)
        {
            SequentialPhilomenaImageDownloaderBuilder builder         = new SequentialPhilomenaImageDownloaderBuilder();
            SequentialPhilomenaImageDownloader        imageDownloader = buildImageDownloader(builder).Build();

            return(new ParallelPhilomenaImageSearchDownloader(imageSearch, imageDownloader, maxDownloadThreads));
        }
 /// <summary>
 /// Creates a parallel downloader for a search query
 /// </summary>
 /// <param name="imageSearch">The image search to download</param>
 /// <param name="maxDownloadThreads">The max number of threads to use when downloading</param>
 /// <param name="imageDownloader">The downloader to use</param>
 /// <returns>A parallel downloader for the search query</returns>
 public static ParallelPhilomenaImageSearchDownloader CreateParallelDownloader(this IPhilomenaImageSearch imageSearch, int maxDownloadThreads, IPhilomenaImageDownloader imageDownloader)
 {
     return(new ParallelPhilomenaImageSearchDownloader(imageSearch, imageDownloader, maxDownloadThreads));
 }