Example #1
0
        private async Task <DownloadNewImagesResult> DownloadNewImages(String id)
        {
            logger.Info("downloadNewImages");

            var wallpaperResponse = await _irpyteDownloader.Wallpaper(id);

            if (wallpaperResponse.imageResults.Count == 0)
            {
                logger.Info("Search resulted in 0 images");
            }

            var downloadedFilenamesMaybe = await Task.WhenAll(wallpaperResponse.imageResults.Select(entry =>
            {
                try
                {
                    var fileId        = Guid.NewGuid();
                    var fileExtension = Path.GetExtension(entry.url);
                    var filePath      = Path.Combine(DB.Instance.ImagesPath, fileId.ToString() + fileExtension);
                    var fileStream    = new FileStream(filePath, FileMode.CreateNew);
                    var fileName      = Path.GetFileName(filePath);

                    logger.Info($"Getting {entry.url} into {filePath}");
                    var responseStream = _httpClient.GetStreamAsync(entry.url);
                    return(responseStream
                           .ContinueWith(r => r.Result.CopyToAsync(fileStream),
                                         TaskContinuationOptions.OnlyOnRanToCompletion).Unwrap()
                           .ContinueWith(r => fileName, TaskContinuationOptions.OnlyOnRanToCompletion)
                           .ContinueWith(t =>
                    {
                        logger.Info($"Disposing fileStream {filePath} and responseStream");
                        fileStream.Dispose();
                        responseStream.Dispose();
                        return t;
                    }).Unwrap());
                }
                catch (Exception e)
                {
                    logger.Error(e, "Error while downloading a file");
                    return(null);
                }
            }));

            var downloadedFilenames = downloadedFilenamesMaybe.Where(x => x != null);

            var downloadedImages = downloadedFilenames.ToList();

            logger.Info($"Downloaded {downloadedImages.Count}");

            var appConfig = DB.Instance.GetConfig();

            appConfig.imageFileNames.AddRange(downloadedImages);
            DB.Instance.UpdateConfig(appConfig);

            if (downloadedImages.Count == 0)
            {
                return(new DownloadNewImagesResult(true));
            }
            else
            {
                return(new DownloadNewImagesResult());
            }
        }