public ApiProviderResult DownloadFiles() { NasaApiProvider provider = new NasaApiProvider(nasaConfiguration); ApiProviderResult result = provider.DownloadFiles("dates.txt"); return(result); }
/// <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); }
/// <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); }
// 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()); }
/// <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); }