Refactoring grid images download to avoid downloading the same images multiple times unnecessarily

pull/50/head
Allex Rodrigues 3 years ago
parent e3abf499ba
commit 22577c84ae

@ -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<Task> gridImagesDownloadTasks = new List<Task>();
//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<Task> gridImagesDownloadTasks = new List<Task>();
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();
});
}
}
}

@ -106,7 +106,6 @@
</ApplicationDefinition>
<Compile Include="AppEntry.cs" />
<Compile Include="AppEntryModel.cs" />
<Compile Include="Crc32.cs" />
<Compile Include="FullScreenLauncher.xaml.cs">
<DependentUpon>FullScreenLauncher.xaml</DependentUpon>
</Compile>

Loading…
Cancel
Save