Skip to content

Commit 541a1e0

Browse files
committed
implement update check
1 parent 38d0fc4 commit 541a1e0

File tree

8 files changed

+242
-122
lines changed

8 files changed

+242
-122
lines changed

Ps3DiscDumper/Dumper.cs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@
33
using System.IO;
44
using System.Linq;
55
using System.Management;
6+
using System.Net.Http;
7+
using System.Net.Http.Headers;
68
using System.Runtime.InteropServices;
79
using System.Text;
10+
using System.Text.Json;
811
using System.Threading;
912
using System.Threading.Tasks;
1013
using DiscUtils.Iso9660;
1114
using IrdLibraryClient;
1215
using IrdLibraryClient.IrdFormat;
1316
using Ps3DiscDumper.DiscInfo;
1417
using Ps3DiscDumper.DiscKeyProviders;
18+
using Ps3DiscDumper.POCOs;
1519
using Ps3DiscDumper.Sfb;
1620
using Ps3DiscDumper.Sfo;
1721
using Ps3DiscDumper.Utils;
@@ -21,7 +25,7 @@ namespace Ps3DiscDumper
2125
{
2226
public class Dumper: IDisposable
2327
{
24-
public const string Version = "3.3.0";
28+
public const string Version = "3.3.1";
2529

2630
private static readonly HashSet<char> InvalidChars = new(Path.GetInvalidFileNameChars().Concat(Path.GetInvalidPathChars()));
2731
private static readonly char[] MultilineSplit = {'\r', '\n'};
@@ -41,6 +45,12 @@ public class Dumper: IDisposable
4145
private Stream driveStream;
4246
private static readonly byte[] Iso9660PrimaryVolumeDescriptorHeader = {0x01, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x00};
4347

48+
private static readonly JsonSerializerOptions JsonOptions = new()
49+
{
50+
PropertyNamingPolicy = new SnakeCasePolicy(),
51+
WriteIndented = true,
52+
};
53+
4454
public ParamSfo ParamSfo { get; private set; }
4555
public string ProductCode { get; private set; }
4656
public string DiscVersion { get; private set; }
@@ -607,6 +617,46 @@ select v.Files[file.TargetFileName].Hashes
607617
Log.Info("Completed");
608618
}
609619

620+
public static async Task<(Version, GitHubReleaseInfo)> CheckUpdatesAsync()
621+
{
622+
try
623+
{
624+
using var client = new HttpClient();
625+
var curVerParts = Version.Split(new[] {' ', '-'}, 2);
626+
client.DefaultRequestHeaders.UserAgent.Add(new("PS3DiscDumper", curVerParts[0]));
627+
var responseJson = await client.GetStringAsync("https://api.github.com/repos/13xforever/ps3-disc-dumper/releases").ConfigureAwait(false);
628+
var releaseList = JsonSerializer.Deserialize<List<GitHubReleaseInfo>>(responseJson, JsonOptions);
629+
releaseList = releaseList?.OrderByDescending(r => System.Version.TryParse(r.TagName.TrimStart('v'), out var v) ? v : null).ToList();
630+
var latest = releaseList?.FirstOrDefault(r => !r.Prerelease);
631+
var latestBeta = releaseList?.FirstOrDefault(r => r.Prerelease);
632+
System.Version.TryParse(curVerParts[0], out var curVer);
633+
System.Version.TryParse(latest?.TagName.TrimStart('v') ?? "0", out var latestVer);
634+
var latestBetaParts = latestBeta?.TagName.Split(new[] {' ', '-'}, 2);
635+
System.Version.TryParse(latestBetaParts?[0] ?? "0", out var latestBetaVer);
636+
if (latestVer > curVer || latestVer == curVer && curVerParts.Length > 1)
637+
{
638+
Log.Warn($"Newer version available: v{latestVer}\n\n{latest?.Name}\n{"".PadRight(latest?.Name.Length ?? 0, '-')}\n{latest?.Body}\n{latest?.HtmlUrl}\n");
639+
return (latestVer, latest);
640+
}
641+
642+
if (latestBetaVer > latestVer
643+
|| (latestVer == latestBetaVer
644+
&& curVerParts.Length > 1
645+
&& (latestBetaParts?.Length > 1 && latestBetaParts[1] != curVerParts[1]
646+
|| (latestBetaParts?.Length ?? 0) == 0)))
647+
{
648+
Log.Warn($"Newer prerelease version available: v{latestBetaVer}\n\n{latestBeta?.Name}\n{"".PadRight(latestBeta?.Name.Length ?? 0, '-')}\n{latestBeta?.Body}\n{latestBeta?.HtmlUrl}\n");
649+
return (latestBetaVer, latestBeta);
650+
}
651+
}
652+
catch
653+
{
654+
Log.Warn("Failed to check for updates");
655+
}
656+
return (null, null);
657+
}
658+
659+
610660
private (List<FileRecord> files, List<DirRecord> dirs) GetFilesystemStructure()
611661
{
612662
var pos = driveStream.Position;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
3+
namespace Ps3DiscDumper.POCOs;
4+
5+
public class GitHubReleaseInfo
6+
{
7+
public string Url { get; set; }
8+
public string AssetsUrl { get; set; }
9+
public string HtmlUrl { get; set; }
10+
public int Id { get; set; }
11+
public string TagName { get; set; }
12+
public string Name { get; set; }
13+
public string Body { get; set; }
14+
public bool Prerelease { get; set; }
15+
public DateTime CreatedAt { get; set; }
16+
public DateTime PublishedAt { get; set; }
17+
}

Ps3DiscDumper/Ps3DiscDumper.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<!-- explicit references to fix msbuild complaints -->
1515
<PackageReference Include="System.Buffers" Version="4.3.0" />
1616
<PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" />
17+
<PackageReference Include="System.Text.Json" Version="6.0.5" />
1718
<PackageReference Include="System.Threading.ThreadPool" Version="4.3.0" />
1819
</ItemGroup>
1920

Ps3DiscDumper/SnakeCasePolicy.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Text;
2+
using System.Text.Json;
3+
4+
namespace Ps3DiscDumper;
5+
6+
public class SnakeCasePolicy : JsonNamingPolicy
7+
{
8+
public override string ConvertName(string name)
9+
{
10+
var result = new StringBuilder(name.Length + 3);
11+
for (var i = 0; i < name.Length; i++)
12+
{
13+
var c = name[i];
14+
if (char.IsLower(c))
15+
result.Append(c);
16+
else
17+
{
18+
c = char.ToLower(c);
19+
if (i > 0)
20+
result.Append('_').Append(c);
21+
else
22+
result.Append(c);
23+
}
24+
}
25+
return result.ToString();
26+
}
27+
}

UI.Console/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ internal static async Task<int> Main(string[] args)
1818
Log.Info("PS3 Disc Dumper v" + Dumper.Version);
1919
Log.Debug($"Log file location: {Log.LogPath}");
2020

21+
await Dumper.CheckUpdatesAsync().ConfigureAwait(false);
22+
2123
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && Console.WindowHeight < 1 && Console.WindowWidth < 1)
2224
try
2325
{

0 commit comments

Comments
 (0)