public Task <ImageSource> DownloadImageFor(IGameDetails game, CancellationToken cancellationToken = default) { ImageSource imageSource = new BitmapImage(); imageSource.Freeze(); if (game is null) { return(Task.FromResult(imageSource)); } var uri = $"https://staticdelivery.nexusmods.com/Images/games/4_3/tile_{game.Id}.jpg"; var imageFile = GetImageFileFor(game); return(_downloadClient.GetStreamAsync(uri).ContinueWith(task => { if (File.Exists(imageFile)) { File.Delete(imageFile); } Image.FromStream(task.Result).GetThumbnailImage(180, 255, null, IntPtr.Zero).Save(imageFile, ImageFormat.Jpeg); return GetImageFor(game); }, cancellationToken)); }
public ImageSource GetImageFor(IGameDetails game) { var imageFile = GetImageFileFor(game); if (!File.Exists(imageFile)) { ExtractImage(game); } return(GetImageFrom(imageFile, 255, 180)); }
public IGameDetails Delete(IGameDetails entity) { if (entity is null) { return(null); } _appDatabaseProvider.TransactionalSqlCommand((db, transaction) => { db.Execute(SqliteScripts.Table.Game.Delete, new { entity.Id }, transaction); }); return(entity); }
private void ExtractImage(IGameDetails game) { // using the Embedded resource file "images.zip" var resourceName = Assembly.GetExecutingAssembly() .GetManifestResourceNames() .First(r => r.EndsWith("images.zip")); using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); using var archive = new ZipArchive(stream ?? throw new InvalidOperationException("Couldn't find the embedded resource file images.zip")); var imageFile = GetImageFileFor(game); var entry = archive.Entries.FirstOrDefault(e => e.Name == Path.GetFileName(imageFile)); entry?.ExtractToFile(imageFile, true); }
public IGameDetails Insert(IGameDetails entity) { if (entity is null) { return(null); } _appDatabaseProvider.TransactionalSqlCommand((db, transaction) => { db.Execute(SqliteScripts.Table.Game.Insert, entity, transaction); foreach (var category in entity.Categories) { db.Execute(SqliteScripts.Table.GameCategory.Insert, new { category.Id, category.Name, category.ParentCategoryId, GameId = entity.Id }, transaction); } }); return(entity); }
public IGameDetails Update(IGameDetails entity) { if (entity is null) { return(null); } _appDatabaseProvider.TransactionalSqlCommand((db, transaction) => { db.Execute(SqliteScripts.Table.Game.Update, entity, transaction); // Delete all categories db.Execute("DELETE FROM GameCategory WHERE GameId = @GameId", new { GameId = entity.Id }, transaction); foreach (var category in entity.Categories) { db.Execute(SqliteScripts.Table.GameCategory.Insert, new { category.Id, category.Name, category.ParentCategoryId, GameId = entity.Id }, transaction); } }); return(entity); }
/* Helpers */ private string GetImageFileFor(IGameDetails game) { return(Path.Combine(_gameImagesDir, $"tile_{game.Id}.jpg")); }