From 22577c84ae54dec1497850bfe2619d2386b48dc2 Mon Sep 17 00:00:00 2001 From: Allex Rodrigues Date: Mon, 28 Dec 2020 19:34:30 -0300 Subject: [PATCH] Refactoring grid images download to avoid downloading the same images multiple times unnecessarily --- UWPHook/GamesWindow.xaml.cs | 74 +++++++++++++++++++++++++++++-------- UWPHook/UWPHook.csproj | 1 - 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/UWPHook/GamesWindow.xaml.cs b/UWPHook/GamesWindow.xaml.cs index 684308a..19f653c 100644 --- a/UWPHook/GamesWindow.xaml.cs +++ b/UWPHook/GamesWindow.xaml.cs @@ -150,10 +150,34 @@ namespace UWPHook }); } - private async Task DownloadGridImages(string userId, string appName, string appTarget) + private void CopyTempGridImagesToSteamUser(string user) + { + string tmpGridDirectory = Path.GetTempPath() + "UWPHook\\tmp_grid\\"; + string userGridDirectory = user + "\\config\\grid\\"; + string[] images = Directory.GetFiles(tmpGridDirectory); + + if (!Directory.Exists(userGridDirectory)) + { + Directory.CreateDirectory(userGridDirectory); + } + + foreach (string image in images) + { + string destFile = userGridDirectory + Path.GetFileName(image); + File.Copy(image, destFile, true); + } + } + + private void RemoveTempGridImages() + { + string tmpGridDirectory = Path.GetTempPath() + "UWPHook\\tmp_grid\\"; + Directory.Delete(tmpGridDirectory, true); + } + + private async Task DownloadTempGridImages(string appName, string appTarget) { SteamGridDbApi api = new SteamGridDbApi(Properties.Settings.Default.SteamGridDbApiKey); - string gridDirectory = userId + @"\\config\\grid\\"; + string tmpGridDirectory = Path.GetTempPath() + "UWPHook\\tmp_grid\\"; var games = await api.SearchGame(appName); @@ -162,9 +186,9 @@ namespace UWPHook var game = games[0]; UInt64 gameId = GenerateSteamGridAppId(appName, appTarget); - if (!Directory.Exists(gridDirectory)) + if (!Directory.Exists(tmpGridDirectory)) { - Directory.CreateDirectory(gridDirectory); + Directory.CreateDirectory(tmpGridDirectory); } var gameGridsVertical = api.GetGameGrids(game.Id, "600x900", "static"); @@ -189,25 +213,25 @@ namespace UWPHook if (gridsHorizontal != null && gridsHorizontal.Length > 0) { var grid = gridsHorizontal[0]; - saveImagesTasks.Add(SaveImage(grid.Url, $"{gridDirectory}\\{gameId}.png", ImageFormat.Png)); + saveImagesTasks.Add(SaveImage(grid.Url, $"{tmpGridDirectory}\\{gameId}.png", ImageFormat.Png)); } if (gridsVertical != null && gridsVertical.Length > 0) { var grid = gridsVertical[0]; - saveImagesTasks.Add(SaveImage(grid.Url, $"{gridDirectory}\\{gameId}p.png", ImageFormat.Png)); + saveImagesTasks.Add(SaveImage(grid.Url, $"{tmpGridDirectory}\\{gameId}p.png", ImageFormat.Png)); } if (heroes != null && heroes.Length > 0) { var hero = heroes[0]; - saveImagesTasks.Add(SaveImage(hero.Url, $"{gridDirectory}\\{gameId}_hero.png", ImageFormat.Png)); + saveImagesTasks.Add(SaveImage(hero.Url, $"{tmpGridDirectory}\\{gameId}_hero.png", ImageFormat.Png)); } if (logos != null && logos.Length > 0) { var logo = logos[0]; - saveImagesTasks.Add(SaveImage(logo.Url, $"{gridDirectory}\\{gameId}_logo.png", ImageFormat.Png)); + saveImagesTasks.Add(SaveImage(logo.Url, $"{tmpGridDirectory}\\{gameId}_logo.png", ImageFormat.Png)); } await Task.WhenAll(saveImagesTasks); @@ -223,6 +247,8 @@ namespace UWPHook var users = SteamManager.GetUsers(steam_folder); var selected_apps = Apps.Entries.Where(app => app.Selected); + List gridImagesDownloadTasks = new List(); + //To make things faster, decide icons before looping users foreach (var app in selected_apps) { @@ -251,11 +277,17 @@ namespace UWPHook { var exePath = @"""" + System.Reflection.Assembly.GetExecutingAssembly().Location + @""""; var exeDir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); - List gridImagesDownloadTasks = new List(); - bool downloadGridImages = !String.IsNullOrEmpty(Properties.Settings.Default.SteamGridDbApiKey); foreach (var app in selected_apps) { + /* + * We download the images only if there's an API key set and the amount of tasks already triggered is less than the amount of games selected. + * Since the selected games will be imported to all steam users on the computer, we download the images for only one user, and later copy + * them to the others. If the amount o tasks triggered match the amount of selected games, we can assume that's all the images we'll need. + */ + bool downloadGridImages = !String.IsNullOrEmpty(Properties.Settings.Default.SteamGridDbApiKey) + && gridImagesDownloadTasks.Count < selected_apps.Count(); + VDFEntry newApp = new VDFEntry() { AppName = app.Name, @@ -281,7 +313,7 @@ namespace UWPHook if (downloadGridImages) { - gridImagesDownloadTasks.Add(DownloadGridImages(user, app.Name, exePath)); + gridImagesDownloadTasks.Add(DownloadTempGridImages(app.Name, exePath)); } } @@ -293,11 +325,6 @@ namespace UWPHook } //Write the file with all the shortcuts File.WriteAllBytes(user + @"\\config\\shortcuts.vdf", VDFSerializer.Serialize(shortcuts)); - - if (gridImagesDownloadTasks.Count > 0) - { - await Task.WhenAll(gridImagesDownloadTasks); - } } catch (Exception ex) { @@ -310,6 +337,21 @@ namespace UWPHook MessageBox.Show("Error: Program failed exporting your games:" + Environment.NewLine + ex.Message + ex.StackTrace); } } + + if (gridImagesDownloadTasks.Count > 0) + { + await Task.WhenAll(gridImagesDownloadTasks); + + await Task.Run(() => + { + foreach (var user in users) + { + CopyTempGridImagesToSteamUser(user); + } + + RemoveTempGridImages(); + }); + } } } diff --git a/UWPHook/UWPHook.csproj b/UWPHook/UWPHook.csproj index 6d4fa79..66d1eee 100644 --- a/UWPHook/UWPHook.csproj +++ b/UWPHook/UWPHook.csproj @@ -106,7 +106,6 @@ - FullScreenLauncher.xaml