33using System . IO ;
44using System . Linq ;
55using System . Management ;
6+ using System . Net . Http ;
7+ using System . Net . Http . Headers ;
68using System . Runtime . InteropServices ;
79using System . Text ;
10+ using System . Text . Json ;
811using System . Threading ;
912using System . Threading . Tasks ;
1013using DiscUtils . Iso9660 ;
1114using IrdLibraryClient ;
1215using IrdLibraryClient . IrdFormat ;
1316using Ps3DiscDumper . DiscInfo ;
1417using Ps3DiscDumper . DiscKeyProviders ;
18+ using Ps3DiscDumper . POCOs ;
1519using Ps3DiscDumper . Sfb ;
1620using Ps3DiscDumper . Sfo ;
1721using 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 ;
0 commit comments