public async Task Run(string fileName, int?chapterNo, bool localLinking) { try { var inputDoc = await _inputDocParser.ExtractMetadata(fileName); _ui.PrintInputInfo(inputDoc); var chapter = GetOrAskForChapter(inputDoc, chapterNo); var photos = _inputDocParser.GetPhotosUsedInContent(chapter.Content); inputDoc.PhotoFilePaths = _fileSvc.GatherPhotoPaths(inputDoc, photos).ToArray(); var validationErrors = _validator.CheckGatheredFiles(photos, inputDoc.PhotoFilePaths).ToList(); if (localLinking) { validationErrors.ForEach(x => _ui.Danger(x)); } else if (validationErrors.Any()) { throw new InvalidOperationException(string.Join("\r\n", validationErrors)); } var photosOnServer = Enumerable.Empty <PhotoInfo>(); if (!localLinking) { photosOnServer = await _flickr.GetPhotosAsync(inputDoc); var photosToUpload = photos.Except(photosOnServer.Select(x => x.Title.ToLower())).ToList(); await _flickr.UploadPhotosAsync(inputDoc.AlbumName, inputDoc.PhotoFilePaths.Where(x => photosToUpload.Contains(x.Name)), true); photosOnServer = await _flickr.GetPhotosAsync(inputDoc, true); } else { photosOnServer = inputDoc.PhotoFilePaths.Select(_photoProcessor.CreatePhotoInfoFromFile); } var output = _formatter.FormatPost(chapter, photosOnServer, localLinking); await _fileSvc.SaveOutputAsync(inputDoc, chapter, output); _ui.WriteLine("Done!"); } catch (Exception ex) { _ui.Danger(ex.Message); _ui.Danger("Application stopped."); } Console.ReadKey(); }