Esempio n. 1
0
        public ApiProviderResult DownloadFiles()
        {
            NasaApiProvider   provider = new NasaApiProvider(nasaConfiguration);
            ApiProviderResult result   = provider.DownloadFiles("dates.txt");

            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// Saves metadata file on downloaded files.
        /// </summary>
        /// <param name="imageData"></param>
        private void SaveMetadata(ApiProviderResult imageData)
        {
            var metadataFolder = localFolder + "/metadata/";

            if (!System.IO.Directory.Exists(metadataFolder))
            {
                System.IO.Directory.CreateDirectory(metadataFolder);
            }

            var metadataFileFullPath = metadataFolder + "metadata.json";

            if (File.Exists(metadataFileFullPath))
            {
                File.Delete(metadataFileFullPath);
            }

            using (TextWriter createStream = new StreamWriter(metadataFileFullPath))
                (new JsonSerializer()).Serialize(createStream, imageData);
        }
Esempio n. 3
0
        /// <summary>
        /// Obtain metadata for previously downloaded files.
        /// </summary>
        /// <returns>ApiProviderResult</returns>
        public ApiProviderResult GetMetadata()
        {
            ApiProviderResult result;
            var metadataFolder       = localFolder + "/metadata/";
            var metadataFileFullPath = metadataFolder + "metadata.json";

            if (File.Exists(metadataFileFullPath))
            {
                string            json     = File.ReadAllText(metadataFileFullPath);
                ApiProviderResult metadata = JsonConvert.DeserializeObject <ApiProviderResult>(json);
                result = metadata;
            }
            else
            {
                result = new ApiProviderResult()
                {
                    success = false, message = "Metadata file not found. Please call Download endpoint before attempting to get metadata."
                };
            }

            return(result);
        }
Esempio n. 4
0
        // TODO: add action filter for handling exceptions.
        public async Task <IActionResult> ViewFilesAsync()
        {
            var res = await RestHelper.ProcessGetRequestAsync("/api/image/getmetadata");

            var data     = res.data;
            var metadata = JsonConvert.DeserializeObject <ApiProviderResult>(data);

            if (metadata == null || metadata.data == null)
            {
                metadata = new ApiProviderResult()
                {
                    data = new List <ImageData>()
                };
                ViewData["Message"] = "No images. Please use Download link above to get images before viewing.";
            }
            else
            {
                ViewData["Message"] = $"Images available for viewing: {metadata.data.Count}.";
            }
            ViewData["Images"] = metadata.data;
            return(View());
        }
Esempio n. 5
0
        /// <summary>
        /// Method drives download process by:
        /// 1. Reading input file from dates.txt
        /// 2. Getting metadata for a rover/date combinations.
        /// 3. Write files to disk.
        /// 4. Saves metadata file with information on downloaded files.
        /// 5. Sends back report on downloaded/existing image files.
        /// </summary>
        /// <param name="inputFile"></param>
        /// <returns></returns>
        public ApiProviderResult DownloadFiles(string inputFile)
        {
            ApiProviderResult result;

            // Read in the dates from input file
            var dateFileContents = DateHelper.GetDatesFromFileAsString(inputFile);
            var dates            = DateHelper.GetFormattedDatesFromString(dateFileContents);

            if (dates.Count > 0)
            {
                result      = new ApiProviderResult();
                result.data = new List <ImageData>();
                List <Task> tasks = new List <Task>();

                // Process all the dates from input file and keep track of processing for each date
                foreach (var date in dates)
                {
                    // TODO: need to figure out what to do with invalid dates.
                    if (date.Ticks > 0)
                    {
                        tasks.Add(Task.Run(() => DownloadFilesForDate(date.ToString("yyyy-MM-dd"))));
                    }
                }
                Task.WaitAll(tasks.ToArray());

                foreach (Task <Dictionary <string, List <RoverPhotosResponse> > > task in tasks)
                {
                    var taskResult = task.Result;
                    var imageData  = new ImageData();
                    foreach (var roverImageData in taskResult)
                    {
                        var date = roverImageData.Key;
                        foreach (var roverImage in roverImageData.Value)
                        {
                            roverImage.photos.ForEach(delegate(RoverPhotosResponse.Photo photo)
                            {
                                var imageData = new ImageData()
                                {
                                    imageSource  = photo.img_src,
                                    filename     = Path.GetFileName(photo.img_src),
                                    localPath    = $"{localFolder}{date}/{photo.rover.name}/{Path.GetFileName(photo.img_src)}",
                                    roverName    = photo.rover.name,
                                    date         = date,
                                    isDownloaded = photo.isDownloaded,
                                    isExists     = photo.isExists
                                };
                                result.data.Add(imageData);
                            });
                        }
                    }
                }

                // Save metadata for more performant viewing process later.
                SaveMetadata(result);

                result.success  = true;
                result.message  = $"Images found on NASA site: {result.data.Count}. Number of images downloaded: {result.data.Where(w => w.isDownloaded).Count()}. ";
                result.message += $"Number of images previously downloaded: {result.data.Where(w => w.isExists).Count()}.";
            }
            else
            {
                result = new ApiProviderResult()
                {
                    message = "Unable to read dates for input."
                };
            }

            return(result);
        }