public async Task ExifToolCmdHelper_TestForFakeExifToolInjection() { var folderPaths = new List <string> { "/" }; var inputSubPaths = new List <string> { "/test.dng" }; var storage = new FakeIStorage(folderPaths, inputSubPaths, new List <byte[]> { FakeCreateAn.CreateAnImage.Bytes }); var readMeta = new ReadMeta(storage); var fakeExifTool = new FakeExifTool(storage, _appSettings); await new ExifCopy(storage, storage, fakeExifTool, readMeta).XmpSync("/test.dng"); Assert.AreEqual(true, storage.ExistFile("/test.xmp")); var xmpContentReadStream = storage.ReadStream("/test.xmp"); var xmpContent = await new PlainTextFileHelper().StreamToStringAsync(xmpContentReadStream); // Those values are injected by fakeExifTool Assert.AreEqual(true, xmpContent.Contains("<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.30'>")); Assert.AreEqual(true, xmpContent.Contains("<rdf:li>test</rdf:li>")); }
public MetaInfo(IQuery query, AppSettings appSettings, ISelectorStorage selectorStorage, IMemoryCache memoryCache) { _query = query; _iStorage = selectorStorage.Get(SelectorStorage.StorageServices.SubPath); _readMeta = new ReadMeta(_iStorage, appSettings, memoryCache); _statusCodeHelper = new StatusCodesHelper(appSettings); }
public void ReadMetaTest_HalfCompleteFile() { const string xmpString = "<x:xmpmeta xmlns:x=\'adobe:ns:meta/\' x:xmptk=\'Image::ExifTool 11.11\'>" + "<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>" + " <rdf:Description rdf:about=\'\' xmlns:dc=\'http://purl.org/dc/elements/1.1/\'> " + " <dc:subject> <rdf:Bag> <rdf:li>example</rdf:li> <rdf:li>keyword</rdf:li> " + " <rdf:li>test</rdf:li> </rdf:Bag> </dc:subject> </rdf:Description> " + "<rdf:Description rdf:about=\'\' xmlns:pdf=\'http://ns.adobe.com/pdf/1.3/\'> " + "<pdf:Keywords>example, test</pdf:Keywords> </rdf:Description> <rdf:Description rdf:about=\'\' " + " xmlns:photomechanic=\'http://ns.camerabits.com/photomechanic/1.0/\'> " + "<photomechanic:ColorClass>8</photomechanic:ColorClass> " + "<photomechanic:PMVersion>PM5</photomechanic:PMVersion> " + " <photomechanic:Prefs>0:8:0:0</photomechanic:Prefs> " + "<photomechanic:Tagged>False</photomechanic:Tagged>" + " </rdf:Description> <rdf:Description rdf:about=\'\' " + " xmlns:photoshop=\'http://ns.adobe.com/photoshop/1.0/\'> " + " <photoshop:DateCreated>2019-03-02T11:29:18+01:00</photoshop:DateCreated> " + "</rdf:Description> <rdf:Description rdf:about=\'\' xmlns:xmp=\'http://ns.adobe.com/xap/1.0/\'> " + " <xmp:CreateDate>2019-03-02T11:29:18+01:00</xmp:CreateDate> <xmp:Rating>0</xmp:Rating> " + "</rdf:Description></rdf:RDF></x:xmpmeta>"; byte[] xmpByteArray = Encoding.UTF8.GetBytes(xmpString); var fakeIStorage = new FakeIStorage(new List <string> { "/" }, new List <string> { "/test.arw", "/test.xmp" }, new List <byte[]> { CreateAnImage.Bytes, xmpByteArray }); var data = new ReadMeta(fakeIStorage).ReadExifAndXmpFromFile("/test.arw"); // Is in source file Assert.AreEqual(200, data.IsoSpeed); Assert.AreEqual("Diepenveen", data.LocationCity); Assert.AreEqual("caption", data.Description); // Words overwritten in xmp file Assert.AreEqual("example, keyword, test", data.Tags); DateTime.TryParseExact("2019-03-02T11:29:18+01:00", "yyyy-MM-dd\\THH:mm:sszzz", CultureInfo.InvariantCulture, DateTimeStyles.None, out var expectDateTime); Assert.AreEqual(expectDateTime, data.DateTime); Assert.AreEqual(ColorClassParser.Color.Trash, data.ColorClass); }
public void ReadMetaTest_CheckIfCacheIsUpdated_SingleItem() { var provider = new ServiceCollection() .AddMemoryCache() .BuildServiceProvider(); var memoryCache = provider.GetService <IMemoryCache>(); var readMeta = new ReadMeta(new FakeIStorage(), new AppSettings(), memoryCache); readMeta.UpdateReadMetaCache("/test.jpg", new FileIndexItem("/test.jpg") { Tags = "t2" } ); Assert.AreEqual("t2", readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); }
public void ReadMeta_ReadMetaBothTest_ReadBothWithFilePath() { var appsettings = new AppSettings { StorageFolder = new CreateAnImage().BasePath }; var iStorage = new StorageSubPathFilesystem(appsettings, new FakeIWebLogger()); var listofFiles = new List <string> { new CreateAnImage().DbPath }; var fakeCache = new FakeMemoryCache(new Dictionary <string, object>()); var listOfMetas = new ReadMeta(iStorage, appsettings, fakeCache) .ReadExifAndXmpFromFileAddFilePathHash(listofFiles); Assert.AreEqual(new CreateAnImage().DbPath.Remove(0, 1), listOfMetas.FirstOrDefault().FileName); }
public RenameServiceTest() { var provider = new ServiceCollection() .AddMemoryCache() .BuildServiceProvider(); var memoryCache = provider.GetService <IMemoryCache>(); var builder = new DbContextOptionsBuilder <ApplicationDbContext>(); builder.UseInMemoryDatabase(nameof(RenameServiceTest)); var options = builder.Options; var context = new ApplicationDbContext(options); _newImage = new CreateAnImage(); _appSettings = new AppSettings { StorageFolder = PathHelper.AddBackslash(_newImage.BasePath), ThumbnailTempFolder = _newImage.BasePath }; _query = new Query(context, _appSettings, null, new FakeIWebLogger(), memoryCache); if (_query.GetAllFiles("/").All(p => p.FileName != _newImage.FileName)) { _query.AddItem(new FileIndexItem { FileName = _newImage.FileName, ParentDirectory = "/", AddToDatabase = DateTime.UtcNow, }); } var iStorage = new StorageSubPathFilesystem(_appSettings, new FakeIWebLogger()); var readMeta = new ReadMeta(iStorage, _appSettings, memoryCache); _iStorageSubPath = new StorageSubPathFilesystem(_appSettings, new FakeIWebLogger()); var services = new ServiceCollection(); var selectorStorage = new FakeSelectorStorage(iStorage); //_sync = new Synchronize(_appSettings, _query, selectorStorage, new FakeIWebLogger()); }
public async Task ExifToolCmdHelper_XmpSync() { var folderPaths = new List <string> { "/" }; var inputSubPaths = new List <string> { "/test.dng" }; var storage = new FakeIStorage(folderPaths, inputSubPaths, new List <byte[]> { FakeCreateAn.CreateAnImage.Bytes }); var fakeReadMeta = new ReadMeta(storage); var fakeExifTool = new FakeExifTool(storage, _appSettings); var helperResult = await new ExifCopy(storage, storage, fakeExifTool, fakeReadMeta).XmpSync("/test.dng"); Assert.AreEqual("/test.xmp", helperResult); }
public async Task ExifToolCmdHelper_CopyExifPublish() { var folderPaths = new List <string> { "/" }; var inputSubPaths = new List <string> { "/test.jpg" }; var storage = new FakeIStorage(folderPaths, inputSubPaths, new List <byte[]> { FakeCreateAn.CreateAnImage.Bytes }); var fakeReadMeta = new ReadMeta(storage); var fakeExifTool = new FakeExifTool(storage, _appSettings); var helperResult = await new ExifCopy(storage, storage, fakeExifTool, fakeReadMeta).CopyExifPublish("/test.jpg", "/test2"); Assert.AreEqual(true, helperResult.Contains("HistorySoftwareAgent")); }
public GeoIndexGpxTest() { var createAnGpx = new CreateAnGpx(); _appSettings = new AppSettings { StorageFolder = createAnGpx.BasePath, CameraTimeZone = "Europe/Minsk" }; var fakeIStorage = new FakeIStorage(); _readMeta = new ReadMeta(fakeIStorage, _appSettings); _metaFilesDirectory = new List <FileIndexItem> { new FileIndexItem { FileName = createAnGpx.FileName, ImageFormat = ExtensionRolesHelper.ImageFormat.gpx } }; }
public void ExifToolCmdHelper_XmpCreate() { var folderPaths = new List <string> { "/" }; var inputSubPaths = new List <string> { "/test.dng" }; var storage = new FakeIStorage(folderPaths, inputSubPaths, new List <byte[]> { FakeCreateAn.CreateAnImage.Bytes }); var fakeReadMeta = new ReadMeta(storage); var fakeExifTool = new FakeExifTool(storage, _appSettings); new ExifCopy(storage, storage, fakeExifTool, fakeReadMeta).XmpCreate("/test.xmp"); var result = new PlainTextFileHelper().StreamToString(storage.ReadStream("/test.xmp")); Assert.AreEqual("<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Starsky'>\n" + "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n</rdf:RDF>\n</x:xmpmeta>", result); }
public MetaUpdateServiceTest() { var provider = new ServiceCollection() .AddMemoryCache() .BuildServiceProvider(); _memoryCache = provider.GetService <IMemoryCache>(); var builder = new DbContextOptionsBuilder <ApplicationDbContext>(); builder.UseInMemoryDatabase(nameof(MetaUpdateService)); var options = builder.Options; var dbContext = new ApplicationDbContext(options); _query = new Query(dbContext, new AppSettings(), null, null, _memoryCache); _queryWithoutCache = new Query(dbContext, new AppSettings { AddMemoryCache = false }, null, new FakeIWebLogger(), null); _appSettings = new AppSettings(); _iStorageFake = new FakeIStorage(new List <string> { "/" }, new List <string> { "/test.jpg", _exampleHash, "/test_default.jpg" }, new List <byte[]> { FakeCreateAn.CreateAnImageNoExif.Bytes }); _exifTool = new FakeExifTool(_iStorageFake, _appSettings); _exampleHash = new FileHash(_iStorageFake).GetHashCode("/test.jpg").Key; _readMeta = new ReadMeta(_iStorageFake, _appSettings, _memoryCache); }
/// <summary> /// Command Line Helper to server WebHtml Content /// </summary> /// <param name="args">arguments to adjust settings, see starskywebhtml/readme.md for more details</param> /// <returns>void</returns> public async Task Publisher(string[] args) { _appSettings.Verbose = ArgsHelper.NeedVerbose(args); if (_argsHelper.NeedHelp(args)) { _appSettings.ApplicationType = AppSettings.StarskyAppType.WebHtml; _argsHelper.NeedHelpShowDialog(); return; } var inputFullPath = _argsHelper.GetPathFormArgs(args, false); if (string.IsNullOrWhiteSpace(inputFullPath)) { _console.WriteLine("Please use the -p to add a path first"); return; } if (_hostFileSystemStorage.IsFolderOrFile(inputFullPath) != FolderOrFileModel.FolderOrFileTypeList.Folder) { _console.WriteLine("Please add a valid folder: " + inputFullPath + ". " + "This folder is not found"); return; } var settingsFullFilePath = Path.Combine(inputFullPath, "_settings.json"); if (_hostFileSystemStorage.ExistFile(settingsFullFilePath)) { _console.WriteLine($"You have already run this program for this folder remove the " + $"_settings.json first and try it again"); return; } var itemName = _publishPreflight.GetNameConsole(inputFullPath, args); if (_appSettings.IsVerbose()) { _console.WriteLine("Name: " + itemName); _console.WriteLine("inputPath " + inputFullPath); } // used in this session to find the photos back // outside the webRoot of iStorage _appSettings.StorageFolder = inputFullPath; // use relative to StorageFolder var listOfFiles = _subPathStorage.GetAllFilesInDirectory("/") .Where(ExtensionRolesHelper.IsExtensionExifToolSupported).ToList(); var fileIndexList = new ReadMeta(_subPathStorage) .ReadExifAndXmpFromFileAddFilePathHash(listOfFiles); // todo introduce selector var profileName = new PublishPreflight(_appSettings, _console) .GetPublishProfileNameByIndex(0); await _publishService.RenderCopy(fileIndexList, profileName, itemName, inputFullPath, true); _console.WriteLine("publish done"); }
public UploadControllerTest() { var provider = new ServiceCollection() .AddMemoryCache() .BuildServiceProvider(); _memoryCache = provider.GetService <IMemoryCache>(); var builderDb = new DbContextOptionsBuilder <ApplicationDbContext>(); builderDb.UseInMemoryDatabase(nameof(ExportControllerTest)); var options = builderDb.Options; var context = new ApplicationDbContext(options); var scopeFactory = provider.GetService <IServiceScopeFactory>(); var services = new ServiceCollection(); // Fake the readMeta output services.AddSingleton <IReadMeta, FakeReadMeta>(); // Inject Config helper services.AddSingleton <IConfiguration>(new ConfigurationBuilder().Build()); // random config var createAnImage = new CreateAnImage(); _appSettings = new AppSettings { TempFolder = createAnImage.BasePath }; _query = new Query(context, _appSettings, scopeFactory, new FakeIWebLogger(), _memoryCache); _iStorage = new FakeIStorage(new List <string> { "/", "/test" }, new List <string> { createAnImage.DbPath }, new List <byte[]> { CreateAnImage.Bytes }); var readMeta = new ReadMeta(_iStorage, _appSettings); var selectorStorage = new FakeSelectorStorage(_iStorage); _import = new Import(selectorStorage, _appSettings, new FakeIImportQuery(), new FakeExifTool(_iStorage, _appSettings), _query, new ConsoleWrapper(), new FakeIMetaExifThumbnailService(), new FakeIWebLogger(), _memoryCache); // Start using dependency injection var builder = new ConfigurationBuilder(); // Add random config to dependency injection // build config var configuration = builder.Build(); // inject config as object to a service // Add Background services services.AddSingleton <IHostedService, UpdateBackgroundQueuedHostedService>(); services.AddSingleton <IUpdateBackgroundTaskQueue, UpdateBackgroundTaskQueue>(); // build the service var serviceProvider = services.BuildServiceProvider(); // get the service serviceProvider.GetRequiredService <IServiceScopeFactory>(); }