Added retry to writing manifest. Keep track of temporary download locations to avoid multiple downloads.
parent
a07416277b
commit
7c1f282feb
|
@ -0,0 +1,32 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace LANCommander.PlaynitePlugin.Helpers
|
||||||
|
{
|
||||||
|
internal static class RetryHelper
|
||||||
|
{
|
||||||
|
internal static T RetryOnException<T>(int maxAttempts, TimeSpan delay, T @default, Func<T> action)
|
||||||
|
{
|
||||||
|
int attempts = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
attempts++;
|
||||||
|
return action();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (attempts >= maxAttempts)
|
||||||
|
return @default;
|
||||||
|
|
||||||
|
Task.Delay(delay).Wait();
|
||||||
|
}
|
||||||
|
} while (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,6 +16,8 @@ using YamlDotNet.Serialization;
|
||||||
using YamlDotNet.Serialization.NamingConventions;
|
using YamlDotNet.Serialization.NamingConventions;
|
||||||
using LANCommander.SDK.Models;
|
using LANCommander.SDK.Models;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Web.Caching;
|
||||||
|
using LANCommander.PlaynitePlugin.Helpers;
|
||||||
|
|
||||||
namespace LANCommander.PlaynitePlugin
|
namespace LANCommander.PlaynitePlugin
|
||||||
{
|
{
|
||||||
|
@ -41,13 +43,19 @@ namespace LANCommander.PlaynitePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
var gameId = Guid.Parse(Game.GameId);
|
var gameId = Guid.Parse(Game.GameId);
|
||||||
|
|
||||||
var game = Plugin.LANCommander.GetGame(gameId);
|
var game = Plugin.LANCommander.GetGame(gameId);
|
||||||
var manifest = Plugin.LANCommander.GetGameManifest(gameId);
|
|
||||||
|
|
||||||
var tempFile = Download(game);
|
string tempDownloadLocation;
|
||||||
|
|
||||||
var installDirectory = Extract(game, tempFile);
|
if (Plugin.DownloadCache.ContainsKey(gameId))
|
||||||
|
tempDownloadLocation = Plugin.DownloadCache[gameId];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tempDownloadLocation = Download(game);
|
||||||
|
Plugin.DownloadCache[gameId] = tempDownloadLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
var installDirectory = Extract(game, tempDownloadLocation);
|
||||||
|
|
||||||
var installInfo = new GameInstallationData()
|
var installInfo = new GameInstallationData()
|
||||||
{
|
{
|
||||||
|
@ -56,7 +64,19 @@ namespace LANCommander.PlaynitePlugin
|
||||||
|
|
||||||
PlayniteGame.InstallDirectory = installDirectory;
|
PlayniteGame.InstallDirectory = installDirectory;
|
||||||
|
|
||||||
WriteManifest(manifest, installDirectory);
|
SDK.GameManifest manifest = null;
|
||||||
|
|
||||||
|
var writeManifestSuccess = RetryHelper.RetryOnException(10, TimeSpan.FromSeconds(1), false, () =>
|
||||||
|
{
|
||||||
|
manifest = Plugin.LANCommander.GetGameManifest(gameId);
|
||||||
|
|
||||||
|
WriteManifest(manifest, installDirectory);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!writeManifestSuccess)
|
||||||
|
throw new Exception("Could not get or write the manifest file. Retry the install or check your connection.");
|
||||||
|
|
||||||
SaveScript(game, installDirectory, ScriptType.Install);
|
SaveScript(game, installDirectory, ScriptType.Install);
|
||||||
SaveScript(game, installDirectory, ScriptType.Uninstall);
|
SaveScript(game, installDirectory, ScriptType.Uninstall);
|
||||||
|
@ -76,6 +96,9 @@ namespace LANCommander.PlaynitePlugin
|
||||||
|
|
||||||
Plugin.UpdateGame(manifest, gameId);
|
Plugin.UpdateGame(manifest, gameId);
|
||||||
|
|
||||||
|
Plugin.DownloadCache.Remove(gameId);
|
||||||
|
File.Delete(tempDownloadLocation);
|
||||||
|
|
||||||
InvokeOnInstalled(new GameInstalledEventArgs(installInfo));
|
InvokeOnInstalled(new GameInstalledEventArgs(installInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,8 +186,6 @@ namespace LANCommander.PlaynitePlugin
|
||||||
file.IsStreamOwner = true;
|
file.IsStreamOwner = true;
|
||||||
file.Close();
|
file.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
File.Delete(archivePath);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new GlobalProgressOptions($"Extracting {game.Title}...")
|
new GlobalProgressOptions($"Extracting {game.Title}...")
|
||||||
|
|
|
@ -94,6 +94,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Extensions\MultiplayerInfoExtensions.cs" />
|
<Compile Include="Extensions\MultiplayerInfoExtensions.cs" />
|
||||||
|
<Compile Include="Helpers\RetryHelper.cs" />
|
||||||
<Compile Include="PowerShellRuntime.cs" />
|
<Compile Include="PowerShellRuntime.cs" />
|
||||||
<Compile Include="UninstallController.cs" />
|
<Compile Include="UninstallController.cs" />
|
||||||
<Compile Include="InstallController.cs" />
|
<Compile Include="InstallController.cs" />
|
||||||
|
|
|
@ -34,6 +34,8 @@ namespace LANCommander.PlaynitePlugin
|
||||||
public override string Name => "LANCommander";
|
public override string Name => "LANCommander";
|
||||||
public override LibraryClient Client { get; } = new LANCommanderLibraryClient();
|
public override LibraryClient Client { get; } = new LANCommanderLibraryClient();
|
||||||
|
|
||||||
|
internal Dictionary<Guid, string> DownloadCache = new Dictionary<Guid, string>();
|
||||||
|
|
||||||
public LANCommanderLibraryPlugin(IPlayniteAPI api) : base(api)
|
public LANCommanderLibraryPlugin(IPlayniteAPI api) : base(api)
|
||||||
{
|
{
|
||||||
Properties = new LibraryPluginProperties
|
Properties = new LibraryPluginProperties
|
||||||
|
@ -227,6 +229,21 @@ namespace LANCommander.PlaynitePlugin
|
||||||
ShowNameChangeWindow();
|
ShowNameChangeWindow();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
yield return new MainMenuItem
|
||||||
|
{
|
||||||
|
Description = "Clear Download Cache",
|
||||||
|
Action = (args2) =>
|
||||||
|
{
|
||||||
|
foreach (var gameId in DownloadCache.Keys)
|
||||||
|
{
|
||||||
|
File.Delete(DownloadCache[gameId]);
|
||||||
|
DownloadCache.Remove(gameId);
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayniteApi.Dialogs.ShowMessage("The download cache has been cleared and any temporary files have been deleted.", "Cache Cleared!", MessageBoxButton.OK);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<TopPanelItem> GetTopPanelItems()
|
public override IEnumerable<TopPanelItem> GetTopPanelItems()
|
||||||
|
|
Loading…
Reference in New Issue