From 5377615bc269f53f1e8422d5e19409b24b5f6c2b Mon Sep 17 00:00:00 2001 From: Michael Green Date: Thu, 16 Feb 2023 01:16:46 +1100 Subject: [PATCH 01/36] Separated TOSEC signature scanner to it's own class and enhanced --- gaseous-identifier/Classes/TosecParser.cs | 368 ++++++++++++++++++ .../Objects/RomSignatureObject.cs | 106 +++++ gaseous-identifier/Program.cs | 136 +------ .../Support/Parsers/TOSEC/Copyright.txt | 9 + .../Support/Parsers/TOSEC/Country.txt | 68 ++++ .../Parsers/TOSEC/DevelopmentStatus.txt | 5 + .../Support/Parsers/TOSEC/Language.txt | 45 +++ .../Support/Parsers/TOSEC/Systems.txt | 57 +++ .../Support/Parsers/TOSEC/Video.txt | 13 + gaseous-identifier/classes/tosecXML.cs | 55 --- gaseous-identifier/gaseous-identifier.csproj | 24 +- 11 files changed, 701 insertions(+), 185 deletions(-) create mode 100644 gaseous-identifier/Classes/TosecParser.cs create mode 100644 gaseous-identifier/Objects/RomSignatureObject.cs create mode 100644 gaseous-identifier/Support/Parsers/TOSEC/Copyright.txt create mode 100644 gaseous-identifier/Support/Parsers/TOSEC/Country.txt create mode 100644 gaseous-identifier/Support/Parsers/TOSEC/DevelopmentStatus.txt create mode 100644 gaseous-identifier/Support/Parsers/TOSEC/Language.txt create mode 100644 gaseous-identifier/Support/Parsers/TOSEC/Systems.txt create mode 100644 gaseous-identifier/Support/Parsers/TOSEC/Video.txt delete mode 100644 gaseous-identifier/classes/tosecXML.cs diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs new file mode 100644 index 0000000..c5ddfb9 --- /dev/null +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -0,0 +1,368 @@ +using System; +using System.Xml; +using System.IO; +using System.Reflection; + +namespace gaseous_identifier.classes +{ + public class TosecParser + { + public objects.RomSignatureObject Parse(string XMLFile) + { + // load resources + var assembly = Assembly.GetExecutingAssembly(); + // load systems list + List TOSECSystems = new List(); + var resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Systems.txt"; + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + TOSECSystems = reader.ReadToEnd().Split(Environment.NewLine).ToList(); + } + // load video list + List TOSECVideo = new List(); + resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Video.txt"; + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + TOSECVideo = reader.ReadToEnd().Split(Environment.NewLine).ToList(); + } + // load country list + Dictionary TOSECCountry = new Dictionary(); + resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Country.txt"; + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split(","); + TOSECCountry.Add(line[0], line[1]); + } while (reader.EndOfStream == false); + } + // load language list + Dictionary TOSECLanguage = new Dictionary(); + resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Language.txt"; + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split(","); + TOSECLanguage.Add(line[0], line[1]); + } while (reader.EndOfStream == false); + } + // load copyright list + Dictionary TOSECCopyright = new Dictionary(); + resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Copyright.txt"; + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split(","); + TOSECCopyright.Add(line[0], line[1]); + } while (reader.EndOfStream == false); + } + // load development status list + Dictionary TOSECDevelopment = new Dictionary(); + resourceName = "gaseous_identifier.Support.Parsers.TOSEC.DevelopmentStatus.txt"; + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split(","); + TOSECDevelopment.Add(line[0], line[1]); + } while (reader.EndOfStream == false); + } + + // load TOSEC file + XmlDocument tosecXmlDoc = new XmlDocument(); + tosecXmlDoc.Load(XMLFile); + + objects.RomSignatureObject tosecObject = new objects.RomSignatureObject(); + + // get header + XmlNode xmlHeader = tosecXmlDoc.DocumentElement.SelectSingleNode("/datafile/header"); + foreach (XmlNode childNode in xmlHeader.ChildNodes) + { + switch (childNode.Name.ToLower()) + { + case "name": + tosecObject.Name = childNode.InnerText; + break; + + case "description": + tosecObject.Description = childNode.InnerText; + break; + + case "category": + tosecObject.Category = childNode.InnerText; + break; + + case "version": + tosecObject.Version = childNode.InnerText; + break; + + case "author": + tosecObject.Author = childNode.InnerText; + break; + + case "email": + tosecObject.Email = childNode.InnerText; + break; + + case "homepage": + tosecObject.Homepage = childNode.InnerText; + break; + + case "url": + try + { + tosecObject.Url = new Uri(childNode.InnerText); + } + catch + { + tosecObject.Url = null; + } + break; + } + } + + // get games + tosecObject.Games = new List(); + XmlNodeList xmlGames = tosecXmlDoc.DocumentElement.SelectNodes("/datafile/game"); + foreach (XmlNode xmlGame in xmlGames) + { + objects.RomSignatureObject.Game gameObject = new objects.RomSignatureObject.Game(); + + // parse game name + string gameName = xmlGame.Attributes["name"].Value; + + // before split, save and remove the demo tag if present + if (gameName.Contains("(demo) ", StringComparison.CurrentCulture)) + { + gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo; + gameName.Replace("(demo) ", ""); + } + else if (gameName.Contains("(demo-kiosk) ", StringComparison.CurrentCulture)) + { + gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_kiosk; + gameName.Replace("(demo-kiosk) ", ""); + } + else if (gameName.Contains("(demo-playable) ", StringComparison.CurrentCulture)) + { + gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_playable; + gameName.Replace("(demo-playable) ", ""); + } + else if (gameName.Contains("(demo-rolling) ", StringComparison.CurrentCulture)) + { + gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_rolling; + gameName.Replace("(demo-rolling) ", ""); + } + else if (gameName.Contains("(demo-slideshow) ", StringComparison.CurrentCulture)) + { + gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_slideshow; + gameName.Replace("(demo-slideshow) ", ""); + } + else + { + gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.NotDemo; + } + + string[] gameNameTokens = gameName.Split("("); + // game title should be first item + gameObject.Name = gameNameTokens[0].Trim(); + + // game year should be second item + if (gameNameTokens.Length >= 2) + { + gameObject.Year = gameNameTokens[1].Replace(")", "").Trim(); + } + else + { + gameObject.Year = ""; + } + // game publisher should be third item + if (gameNameTokens.Length >= 3) + { + gameObject.Publisher = gameNameTokens[2].Replace(")", "").Trim(); + } + else + { + gameObject.Publisher = ""; + } + // process remaining tokens + // set default values + gameObject.System = tosecObject.Name.Split(" - ")[0]; + // process title values + UInt16 StartToken = 0; + foreach (string rawToken in gameNameTokens) + { + if (StartToken > 2) + { + string[] tokenSplit = rawToken.Split("["); + + // replace the extra closing bracket + string token = tokenSplit[0].Replace(")", "").Trim(); + + // perform tests on the token to see what it is + // exclude strings that start with [ in this part + if (!(token.StartsWith("[") && token.EndsWith("]"))) + { + // check for systems + if (TOSECSystems.Contains(token, StringComparer.CurrentCulture)) + { + // this is a system token + gameObject.SystemVariant = token; + } + + // check for video + if (TOSECVideo.Contains(token, StringComparer.CurrentCulture)) + { + // this is a system token + gameObject.Video = token; + } + + // check for country + if (TOSECCountry.ContainsKey(token)) + { + gameObject.Country = new KeyValuePair(token, TOSECCountry[token]); + } + + // check for language + if (TOSECLanguage.ContainsKey(token)) + { + gameObject.Language = new KeyValuePair(token, TOSECLanguage[token]); + } + + // check for copyright + if (TOSECCopyright.ContainsKey(token)) + { + gameObject.Copyright = new KeyValuePair(token, TOSECCopyright[token]); + } + + // check for copyright + if (TOSECDevelopment.ContainsKey(token)) + { + gameObject.DevelopmentStatus = new KeyValuePair(token, TOSECDevelopment[token]); + } + } + else + { + // handle the square bracket tokens + } + } + StartToken += 1; + } + + + + + + + + + + gameObject.Roms = new List(); + + // get the roms + foreach (XmlNode xmlGameDetail in xmlGame.ChildNodes) + { + switch (xmlGameDetail.Name.ToLower()) + { + case "description": + gameObject.Description = xmlGameDetail.InnerText; + break; + + case "rom": + objects.RomSignatureObject.Game.Rom romObject = new objects.RomSignatureObject.Game.Rom(); + romObject.Name = xmlGameDetail.Attributes["name"]?.Value; + romObject.Size = UInt64.Parse(xmlGameDetail.Attributes["size"]?.Value); + romObject.Crc = xmlGameDetail.Attributes["crc"]?.Value; + romObject.Md5 = xmlGameDetail.Attributes["md5"]?.Value; + romObject.Sha1 = xmlGameDetail.Attributes["sha1"]?.Value; + + // parse name + string[] romNameTokens = romObject.Name.Split("("); + foreach (string rawToken in gameNameTokens) { + string[] tokenSplit = rawToken.Split("["); + + // replace the extra closing bracket + string token = tokenSplit[0].Replace(")", "").Trim(); + + // check for media type + if (token.StartsWith("Disc") || + token.StartsWith("Disk") || + token.StartsWith("File") || + token.StartsWith("Part") || + token.StartsWith("Side") || + token.StartsWith("Tape")) + { + string[] tokens = token.Split(" "); + switch (tokens[0]) + { + case "Disc": + romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Disc; + break; + case "Disk": + romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Disk; + break; + case "File": + romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.File; + break; + case "Part": + romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Part; + break; + case "Side": + romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Side; + break; + case "Tape": + romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Tape; + break; + } + romObject.RomTypeMedia = token; + } + + // check for media label + if (token.Length > 0 && + token == gameNameTokens.Last() && + gameNameTokens.Length > 2 && + ( + token != romObject.RomTypeMedia && + token != gameObject.Publisher && + token != gameObject.Country.Key) + ) + { + // likely the media label? + romObject.MediaLabel = token; + } + } + + gameObject.Roms.Add(romObject); + break; + } + } + + // search for existing gameObject to update + bool existingGameFound = false; + foreach (gaseous_identifier.objects.RomSignatureObject.Game existingGame in tosecObject.Games) + { + if (existingGame.Name == gameObject.Name && existingGame.Year == gameObject.Year && existingGame.Publisher == gameObject.Publisher) + { + existingGame.Roms.AddRange(gameObject.Roms); + existingGameFound = true; + break; + } + } + if (existingGameFound == false) + { + tosecObject.Games.Add(gameObject); + } + } + + return tosecObject; + } + } +} + diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs new file mode 100644 index 0000000..56d7d11 --- /dev/null +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; + +namespace gaseous_identifier.objects +{ + /// + /// Object returned by all signature engines containing metadata about the ROM's in the data files + /// + /// This class was based on the TOSEC dataset, so may need to be expanded as new signature engines are added + /// + public class RomSignatureObject + { + public string Name { get; set; } + public string Description { get; set; } + public string Category { get; set; } + public string Version { get; set; } + public string Author { get; set; } + public string Email { get; set; } + public string Homepage { get; set; } + public Uri? Url { get; set; } + + public List Games { get; set; } + + public class Game + { + public string Name { get; set; } + public string Description { get; set; } + public string Year { get; set; } + public string Publisher { get; set; } + public DemoTypes Demo { get; set; } + public string System { get; set; } + public string SystemVariant { get; set; } + public string Video { get; set; } + public KeyValuePair Country { get; set; } + public KeyValuePair Language { get; set; } + public KeyValuePair Copyright { get; set; } + public KeyValuePair DevelopmentStatus { get; set; } + public List Roms { get; set; } + + public enum DemoTypes + { + NotDemo = 0, + demo = 1, + demo_kiosk = 2, + demo_playable = 3, + demo_rolling = 4, + demo_slideshow = 5 + } + + public class Rom + { + public string Name { get; set; } + public UInt64 Size { get; set; } + public string Crc { get; set; } + public string Md5 { get; set; } + public string Sha1 { get; set; } + + public string flags { get; set; } + + public RomTypes RomType { get; set; } + public string RomTypeMedia { get; set; } + public string MediaLabel { get; set; } + + public enum RomTypes + { + /// + /// Media type is unknown + /// + Unknown = 0, + + /// + /// Optical media + /// + Disc = 1, + + /// + /// Magnetic media + /// + Disk = 2, + + /// + /// Individual files + /// + File = 3, + + /// + /// Individual pars + /// + Part = 4, + + /// + /// Tape base media + /// + Tape = 5, + + /// + /// Side of the media + /// + Side = 6 + } + } + + } + } +} + diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 27d7a5f..7b3dfac 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -50,8 +50,7 @@ scanPath = Path.GetFullPath(scanPath); Console.WriteLine("ROM search path: " + scanPath); System.Collections.ArrayList TOSEC = new System.Collections.ArrayList(); -List tosecLists = new List(); -UInt32 GameCounter = 0; +List tosecLists = new List(); if (tosecXML != null && tosecXML.Length > 0) { tosecXML = Path.GetFullPath(tosecXML); @@ -61,127 +60,8 @@ if (tosecXML != null && tosecXML.Length > 0) string[] tosecPathContents = Directory.GetFiles(tosecXML); foreach (string tosecXMLFile in tosecPathContents) { - XmlDocument tosecXmlDoc = new XmlDocument(); - tosecXmlDoc.Load(tosecXMLFile); - - gaseous_identifier.classes.tosecXML tosecObject = new gaseous_identifier.classes.tosecXML(); - - // get header - XmlNode xmlHeader = tosecXmlDoc.DocumentElement.SelectSingleNode("/datafile/header"); - foreach (XmlNode childNode in xmlHeader.ChildNodes) - { - switch (childNode.Name.ToLower()) - { - case "name": - tosecObject.Name = childNode.InnerText; - break; - - case "description": - tosecObject.Description = childNode.InnerText; - break; - - case "category": - tosecObject.Category = childNode.InnerText; - break; - - case "version": - tosecObject.Version = childNode.InnerText; - break; - - case "author": - tosecObject.Author = childNode.InnerText; - break; - - case "email": - tosecObject.Email = childNode.InnerText; - break; - - case "homepage": - tosecObject.Homepage = childNode.InnerText; - break; - - case "url": - try - { - tosecObject.Url = new Uri(childNode.InnerText); - } catch - { - tosecObject.Url = null; - } - break; - } - } - - // get games - tosecObject.Games = new List(); - XmlNodeList xmlGames = tosecXmlDoc.DocumentElement.SelectNodes("/datafile/game"); - foreach (XmlNode xmlGame in xmlGames) - { - gaseous_identifier.classes.tosecXML.Game gameObject = new gaseous_identifier.classes.tosecXML.Game(); - - // parse game name - string gameName = xmlGame.Attributes["name"].Value; - string[] gameNameTokens = gameName.Split("("); - // game title should be first item - gameObject.Name = gameNameTokens[0].Trim(); - // game year should be second item - if (gameNameTokens.Length == 2) - { - gameObject.Year = gameNameTokens[1].Replace(")", "").Trim(); - } else - { - gameObject.Year = ""; - } - // game publisher should be third item - if (gameNameTokens.Length == 3) - { - gameObject.Publisher = gameNameTokens[2].Replace(")", "").Trim(); - } else - { - gameObject.Publisher = ""; - } - - gameObject.Roms = new List(); - - // get the roms - foreach (XmlNode xmlGameDetail in xmlGame.ChildNodes) - { - switch (xmlGameDetail.Name.ToLower()) - { - case "description": - gameObject.Description = xmlGameDetail.InnerText; - break; - - case "rom": - gaseous_identifier.classes.tosecXML.Game.Rom romObject = new gaseous_identifier.classes.tosecXML.Game.Rom(); - romObject.Name = xmlGameDetail.Attributes["name"]?.Value; - romObject.Size = UInt64.Parse(xmlGameDetail.Attributes["size"]?.Value); - romObject.Crc = xmlGameDetail.Attributes["crc"]?.Value; - romObject.Md5 = xmlGameDetail.Attributes["md5"]?.Value; - romObject.Sha1 = xmlGameDetail.Attributes["sha1"]?.Value; - - gameObject.Roms.Add(romObject); - break; - } - } - - // search for existing gameObject to update - bool existingGameFound = false; - foreach (gaseous_identifier.classes.tosecXML.Game existingGame in tosecObject.Games) - { - if (existingGame.Name == gameObject.Name && existingGame.Year == gameObject.Year && existingGame.Publisher == gameObject.Publisher) - { - existingGame.Roms.AddRange(gameObject.Roms); - existingGameFound = true; - break; - } - } - if (existingGameFound == false) - { - tosecObject.Games.Add(gameObject); - GameCounter += 1; - } - } + gaseous_identifier.classes.TosecParser tosecParser = new gaseous_identifier.classes.TosecParser(); + gaseous_identifier.objects.RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); Console.Write("."); tosecLists.Add(tosecObject); @@ -191,12 +71,12 @@ if (tosecXML != null && tosecXML.Length > 0) { Console.WriteLine("TOSEC is disabled, title matching will be by file name only."); } -Console.WriteLine(tosecLists.Count + " TOSEC files loaded - " + GameCounter + " games cataloged"); +Console.WriteLine(tosecLists.Count + " TOSEC files loaded"); if (tosecLists.Count > 0) { Console.WriteLine("TOSEC lists available:"); - foreach (gaseous_identifier.classes.tosecXML tosecList in tosecLists) + foreach (gaseous_identifier.objects.RomSignatureObject tosecList in tosecLists) { Console.WriteLine(" * " + tosecList.Name); } @@ -219,11 +99,11 @@ foreach (string romFile in romPathContents) string sha1Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); bool gameFound = false; - foreach (gaseous_identifier.classes.tosecXML tosecList in tosecLists) + foreach (gaseous_identifier.objects.RomSignatureObject tosecList in tosecLists) { - foreach (gaseous_identifier.classes.tosecXML.Game gameObject in tosecList.Games) + foreach (gaseous_identifier.objects.RomSignatureObject.Game gameObject in tosecList.Games) { - foreach (gaseous_identifier.classes.tosecXML.Game.Rom romObject in gameObject.Roms) + foreach (gaseous_identifier.objects.RomSignatureObject.Game.Rom romObject in gameObject.Roms) { if (md5Hash == romObject.Md5) { diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Copyright.txt b/gaseous-identifier/Support/Parsers/TOSEC/Copyright.txt new file mode 100644 index 0000000..6874cd5 --- /dev/null +++ b/gaseous-identifier/Support/Parsers/TOSEC/Copyright.txt @@ -0,0 +1,9 @@ +CW,Cardware +CW-R,Cardware-Registered +FW,Freeware +GW,Giftware +GW-R,Giftware-Registered +LW,Licenceware +PD,Public Domain +SW,Shareware +SW-R,Shareware-Registered \ No newline at end of file diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Country.txt b/gaseous-identifier/Support/Parsers/TOSEC/Country.txt new file mode 100644 index 0000000..3acd129 --- /dev/null +++ b/gaseous-identifier/Support/Parsers/TOSEC/Country.txt @@ -0,0 +1,68 @@ +AE,United Arab Emirates +AL,Albania +AS,Asia +AT,Austria +AU,Australia +BA,Bosnia and Herzegovina +BE,Belgium +BG,Bulgaria +BR,Brazil +CA,Canada +CH,Switzerland +CL,Chile +CN,China +CS,Serbia and Montenegro +CY,Cyprus +CZ,Czech Republic +DE,Germany +DK,Denmark +EE,Estonia +EG,Egypt +ES,Spain +EU,Europe +FI,Finland +FR,France +GB,United Kingdom +GR,Greece +HK,Hong Kong +HR,Croatia +HU,Hungary +ID,Indonesia +IE,Ireland +IL,Israel +IN,India +IR,Iran +IS,Iceland +IT,Italy +JO,Jordan +JP,Japan +KR,South Korea +LT,Lithuania +LU,Luxembourg +LV,Latvia +MN,Mongolia +MX,Mexico +MY,Malaysia +NL,Netherlands +NO,Norway +NP,Nepal +NZ,New Zealand +OM,Oman +PE,Peru +PH,Philippines +PL,Poland +PT,Portugal +QA,Qatar +RO,Romania +RU,Russia +SE,Sweden +SG,Singapore +SI,Slovenia +SK,Slovakia +TH,Thailand +TR,Turkey +TW,Taiwan +US,United States +VN,Vietnam +YU,Yugoslavia +ZA,South Africa \ No newline at end of file diff --git a/gaseous-identifier/Support/Parsers/TOSEC/DevelopmentStatus.txt b/gaseous-identifier/Support/Parsers/TOSEC/DevelopmentStatus.txt new file mode 100644 index 0000000..c153038 --- /dev/null +++ b/gaseous-identifier/Support/Parsers/TOSEC/DevelopmentStatus.txt @@ -0,0 +1,5 @@ +alpha,Early test build +beta,Later; feature complete test build +preview,Near complete build +pre-release,Near complete build +proto,Unreleased; prototype software \ No newline at end of file diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Language.txt b/gaseous-identifier/Support/Parsers/TOSEC/Language.txt new file mode 100644 index 0000000..fb89374 --- /dev/null +++ b/gaseous-identifier/Support/Parsers/TOSEC/Language.txt @@ -0,0 +1,45 @@ +ar,Arabic +bg,Bulgarian +bs,Bosnian +cs,Czech +cy,Welsh +da,Danish +de,German +el,Greek +en,English +eo,Esperanto +es,Spanish +et,Estonian +fa,Persian +fi,Finnish +fr,French +ga,Irish +gu,Gujarati +he,Hebrew +hi,Hindi +hr,Croatian +hu,Hungarian +is,Icelandic +it,Italian +ja,Japanese +ko,Korean +lt,Lithuanian +lv,Latvian +ms,Malay +nl,Dutch +no,Norwegian +pl,Polish +pt,Portuguese +ro,Romanian +ru,Russian +sk,Slovakian +sl,Slovenian +sq,Albanian +sr,Serbian +sv,Swedish +th,Thai +tr,Turkish +ur,Urdu +vi,Vietnamese +yi,Yiddish +zh,Chinese \ No newline at end of file diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Systems.txt b/gaseous-identifier/Support/Parsers/TOSEC/Systems.txt new file mode 100644 index 0000000..fadd02b --- /dev/null +++ b/gaseous-identifier/Support/Parsers/TOSEC/Systems.txt @@ -0,0 +1,57 @@ ++2 ++2a ++3 +130XE +A1000 +A1200 +A1200-A4000 +A2000 +A2000-A3000 +A2024 +A2500-A3000UX +A3000 +A4000 +A4000T +A500 +A500+ +A500-A1000-A2000 +A500-A1000-A2000-CDTV +A500-A1200 +A500-A1200-A2000-A4000 +A500-A2000 +A500-A600-A2000 +A570 +A600 +A600HD +AGA +AGA-CD32 +Aladdin Deck Enhancer +CD32 +CDTV +Computrainer +Doctor PC Jr. +ECS +ECS-AGA +Executive +Mega ST +Mega-STE +OCS +OCS-AGA +ORCH80 +Osbourne 1 +PIANO90 +PlayChoice-10 +Plus4 +Primo-A +Primo-A64 +Primo-B +Primo-B64 +Pro-Primo +ST +STE +STE-Falcon +TT +TURBO-R GT +TURBO-R ST +VS DualSystem +VS UniSystem \ No newline at end of file diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Video.txt b/gaseous-identifier/Support/Parsers/TOSEC/Video.txt new file mode 100644 index 0000000..f8ab8ff --- /dev/null +++ b/gaseous-identifier/Support/Parsers/TOSEC/Video.txt @@ -0,0 +1,13 @@ +CGA +EGA +HGC +MCGA +MDA +NTSC +NTSC-PAL +PAL +PAL-60 +PAL-NTSC +SVGA +VGA +XGA \ No newline at end of file diff --git a/gaseous-identifier/classes/tosecXML.cs b/gaseous-identifier/classes/tosecXML.cs deleted file mode 100644 index 72c2502..0000000 --- a/gaseous-identifier/classes/tosecXML.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace gaseous_identifier.classes -{ - public class tosecXML - { - public string Name { get; set; } - public string Description { get; set; } - public string Category { get; set; } - public string Version { get; set; } - public string Author { get; set; } - public string Email { get; set; } - public string Homepage { get; set; } - public Uri? Url { get; set; } - - public List Games { get; set; } - - public class Game - { - public string Name { get; set; } - public string Description { get; set; } - public string Year { get; set; } - public string Publisher { get; set; } - public List Roms { get; set; } - - public class Rom - { - public string Name { get; set; } - public UInt64 Size { get; set; } - public string Crc { get; set; } - public string Md5 { get; set; } - public string Sha1 { get; set; } - - public string flags { get; set; } - - public RomTypes RomType { get; set; } - public UInt16 DiskNumber { get; set; } - public string DiskSide { get; set; } - - public enum RomTypes - { - Cartridge = 0, - Cassette = 1, - Floppy = 2, - CD = 3, - DVD = 4, - Unknown = 100 - } - } - - } - } -} - diff --git a/gaseous-identifier/gaseous-identifier.csproj b/gaseous-identifier/gaseous-identifier.csproj index 4aa190e..50bb812 100644 --- a/gaseous-identifier/gaseous-identifier.csproj +++ b/gaseous-identifier/gaseous-identifier.csproj @@ -9,9 +9,29 @@ - + + + + + + + + + + - + + + + + + + + + + + + From e36b49d82fa8837caca3f55641e0a2f3c184841e Mon Sep 17 00:00:00 2001 From: Michael Green Date: Thu, 16 Feb 2023 17:28:44 +1100 Subject: [PATCH 02/36] (Hopefully) resolved issues with the media label field --- gaseous-identifier/Classes/TosecParser.cs | 19 ++++++++----------- gaseous-identifier/Program.cs | 19 ++++++++++++++----- gaseous-identifier/gaseous-identifier.csproj | 4 ++++ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index c5ddfb9..d09d3f0 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -256,14 +256,6 @@ namespace gaseous_identifier.classes StartToken += 1; } - - - - - - - - gameObject.Roms = new List(); // get the roms @@ -326,13 +318,18 @@ namespace gaseous_identifier.classes // check for media label if (token.Length > 0 && - token == gameNameTokens.Last() && - gameNameTokens.Length > 2 && + (token + ")") == gameNameTokens.Last() && ( token != romObject.RomTypeMedia && token != gameObject.Publisher && - token != gameObject.Country.Key) + token != gameObject.Country.Key && + token != gameObject.Copyright.Key && + token != gameObject.Language.Key && + token != gameObject.SystemVariant && + token != gameObject.Video && + token != gameObject.DevelopmentStatus.Key ) + ) { // likely the media label? romObject.MediaLabel = token; diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 7b3dfac..28b556b 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -105,12 +105,21 @@ foreach (string romFile in romPathContents) { foreach (gaseous_identifier.objects.RomSignatureObject.Game.Rom romObject in gameObject.Roms) { - if (md5Hash == romObject.Md5) + if (romObject.Md5 != null) { - // match - gameFound = true; - Console.WriteLine(romObject.Name); - break; + if (md5Hash == romObject.Md5.ToLowerInvariant()) + { + // match + gameFound = true; + Console.WriteLine(romObject.Name); + + gaseous_identifier.objects.RomSignatureObject.Game gameSignature = gameObject; + gameSignature.Roms.Clear(); + gameSignature.Roms.Add(romObject); + + Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented)); + break; + } } } if (gameFound == true) { break; } diff --git a/gaseous-identifier/gaseous-identifier.csproj b/gaseous-identifier/gaseous-identifier.csproj index 50bb812..4b0419b 100644 --- a/gaseous-identifier/gaseous-identifier.csproj +++ b/gaseous-identifier/gaseous-identifier.csproj @@ -19,6 +19,7 @@ + @@ -34,4 +35,7 @@ + + + From af087b43131bfa983b388974a92d6ba7d5bda9fb Mon Sep 17 00:00:00 2001 From: Michael Green Date: Fri, 17 Feb 2023 22:23:24 +1100 Subject: [PATCH 03/36] Fixed date field handling --- gaseous-identifier/Classes/TosecParser.cs | 87 +++++++++++++++++-- .../Objects/RomSignatureObject.cs | 1 + 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index d09d3f0..0349e56 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -84,6 +84,7 @@ namespace gaseous_identifier.classes // get header XmlNode xmlHeader = tosecXmlDoc.DocumentElement.SelectSingleNode("/datafile/header"); + tosecObject.SourceType = "TOSEC"; foreach (XmlNode childNode in xmlHeader.ChildNodes) { switch (childNode.Name.ToLower()) @@ -143,27 +144,27 @@ namespace gaseous_identifier.classes if (gameName.Contains("(demo) ", StringComparison.CurrentCulture)) { gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo; - gameName.Replace("(demo) ", ""); + gameName = gameName.Replace("(demo) ", ""); } else if (gameName.Contains("(demo-kiosk) ", StringComparison.CurrentCulture)) { gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_kiosk; - gameName.Replace("(demo-kiosk) ", ""); + gameName = gameName.Replace("(demo-kiosk) ", ""); } else if (gameName.Contains("(demo-playable) ", StringComparison.CurrentCulture)) { gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_playable; - gameName.Replace("(demo-playable) ", ""); + gameName = gameName.Replace("(demo-playable) ", ""); } else if (gameName.Contains("(demo-rolling) ", StringComparison.CurrentCulture)) { gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_rolling; - gameName.Replace("(demo-rolling) ", ""); + gameName = gameName.Replace("(demo-rolling) ", ""); } else if (gameName.Contains("(demo-slideshow) ", StringComparison.CurrentCulture)) { gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_slideshow; - gameName.Replace("(demo-slideshow) ", ""); + gameName = gameName.Replace("(demo-slideshow) ", ""); } else { @@ -177,7 +178,81 @@ namespace gaseous_identifier.classes // game year should be second item if (gameNameTokens.Length >= 2) { - gameObject.Year = gameNameTokens[1].Replace(")", "").Trim(); + bool dateFound = false; + + // verify the value + string dateToken = gameNameTokens[1].Replace(")", ""); + if (dateToken.Length >= 4) + { + // test for possible year values + // first up - centuries + if (dateToken == "19xx" || dateToken == "20xx") + { + // date is a century + gameObject.Year = dateToken; + dateFound = true; + } else + { + // check for decades + for (UInt16 i = 0; i < 10; i++) + { + if (dateToken == "19" + i + "x" || dateToken == "20" + i + "x") + { + // date is a decade + gameObject.Year = dateToken; + dateFound = true; + break; + } + } + + if (dateFound == false) + { + // check if the year is a four digit number + DateTime dateTime = new DateTime(); + if (DateTime.TryParse(string.Format("1/1/{0}", dateToken), out dateTime)) + { + // is a valid year! + gameObject.Year = dateToken; + dateFound = true; + } + + // if we still haven't found a valid date, check if the whole string is a valid date object + if (dateFound == false) + { + if (DateTime.TryParse(dateToken, out dateTime)) + { + // is a valid year! + gameObject.Year = dateToken; + dateFound = true; + } + } + + // if we still haven't found a valid date, check if the whole string is a valid date object, but with x's + // example: 19xx-12-2x + if (dateFound == false) + { + if (DateTime.TryParse(dateToken.Replace("x", "0"), out dateTime)) + { + // is a valid year! + gameObject.Year = dateToken; + dateFound = true; + } + } + + // if we still haven't found a valid date, perhaps it a year and month? + // example: 19xx-12 + if (dateFound == false) + { + if (DateTime.TryParse(dateToken.Replace("x", "0") + "-01", out dateTime)) + { + // is a valid year! + gameObject.Year = dateToken; + dateFound = true; + } + } + } + } + } } else { diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs index 56d7d11..4843e4e 100644 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -18,6 +18,7 @@ namespace gaseous_identifier.objects public string Email { get; set; } public string Homepage { get; set; } public Uri? Url { get; set; } + public string SourceType { get; set; } public List Games { get; set; } From d76931c949fdc9449337850722aa00daf8770b4a Mon Sep 17 00:00:00 2001 From: Michael Green Date: Fri, 17 Feb 2023 23:04:05 +1100 Subject: [PATCH 04/36] Enhanced the loading output on the console --- .../Objects/RomSignatureObject.cs | 50 +++++++++---------- gaseous-identifier/Program.cs | 42 +++++++++++----- 2 files changed, 55 insertions(+), 37 deletions(-) diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs index 4843e4e..6d7482c 100644 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -10,33 +10,33 @@ namespace gaseous_identifier.objects /// public class RomSignatureObject { - public string Name { get; set; } - public string Description { get; set; } - public string Category { get; set; } - public string Version { get; set; } - public string Author { get; set; } - public string Email { get; set; } - public string Homepage { get; set; } + public string? Name { get; set; } + public string? Description { get; set; } + public string? Category { get; set; } + public string? Version { get; set; } + public string? Author { get; set; } + public string? Email { get; set; } + public string? Homepage { get; set; } public Uri? Url { get; set; } - public string SourceType { get; set; } + public string? SourceType { get; set; } - public List Games { get; set; } + public List Games { get; set; } = new List(); public class Game { - public string Name { get; set; } - public string Description { get; set; } - public string Year { get; set; } - public string Publisher { get; set; } + public string? Name { get; set; } + public string? Description { get; set; } + public string? Year { get; set; } + public string? Publisher { get; set; } public DemoTypes Demo { get; set; } - public string System { get; set; } - public string SystemVariant { get; set; } - public string Video { get; set; } + public string? System { get; set; } + public string? SystemVariant { get; set; } + public string? Video { get; set; } public KeyValuePair Country { get; set; } public KeyValuePair Language { get; set; } public KeyValuePair Copyright { get; set; } public KeyValuePair DevelopmentStatus { get; set; } - public List Roms { get; set; } + public List Roms { get; set; } = new List(); public enum DemoTypes { @@ -50,17 +50,17 @@ namespace gaseous_identifier.objects public class Rom { - public string Name { get; set; } - public UInt64 Size { get; set; } - public string Crc { get; set; } - public string Md5 { get; set; } - public string Sha1 { get; set; } + public string? Name { get; set; } + public UInt64? Size { get; set; } + public string? Crc { get; set; } + public string? Md5 { get; set; } + public string? Sha1 { get; set; } - public string flags { get; set; } + public string? flags { get; set; } public RomTypes RomType { get; set; } - public string RomTypeMedia { get; set; } - public string MediaLabel { get; set; } + public string? RomTypeMedia { get; set; } + public string? MediaLabel { get; set; } public enum RomTypes { diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 28b556b..bfdfe5a 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -49,8 +49,10 @@ foreach (string commandLineArg in commandLineArgs) scanPath = Path.GetFullPath(scanPath); Console.WriteLine("ROM search path: " + scanPath); -System.Collections.ArrayList TOSEC = new System.Collections.ArrayList(); -List tosecLists = new List(); +List romSignatures = new List(); +System.Collections.ArrayList availablePlatforms = new System.Collections.ArrayList(); + +// load TOSEC XML files if (tosecXML != null && tosecXML.Length > 0) { tosecXML = Path.GetFullPath(tosecXML); @@ -58,27 +60,43 @@ if (tosecXML != null && tosecXML.Length > 0) Console.WriteLine("TOSEC XML search path: " + tosecXML); string[] tosecPathContents = Directory.GetFiles(tosecXML); - foreach (string tosecXMLFile in tosecPathContents) + int lastCLILineLength = 0; + for (UInt16 i = 0; i < tosecPathContents.Length; ++i) { + string tosecXMLFile = tosecPathContents[i]; + gaseous_identifier.classes.TosecParser tosecParser = new gaseous_identifier.classes.TosecParser(); gaseous_identifier.objects.RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); - Console.Write("."); - tosecLists.Add(tosecObject); + string statusOutput = i + " / " + tosecPathContents.Length + " : " + Path.GetFileName(tosecXMLFile); + Console.Write("\r " + statusOutput.PadRight(lastCLILineLength, ' ') + "\r"); + lastCLILineLength = statusOutput.Length; + + foreach (gaseous_identifier.objects.RomSignatureObject.Game gameRom in tosecObject.Games) + { + if (!availablePlatforms.Contains(gameRom.System)) + { + availablePlatforms.Add(gameRom.System); + } + } + + romSignatures.Add(tosecObject); } Console.WriteLine(""); } else { - Console.WriteLine("TOSEC is disabled, title matching will be by file name only."); + Console.WriteLine("TOSEC is disabled."); } -Console.WriteLine(tosecLists.Count + " TOSEC files loaded"); +Console.WriteLine(romSignatures.Count + " TOSEC files loaded"); -if (tosecLists.Count > 0) +// Summarise signatures +if (availablePlatforms.Count > 0) { - Console.WriteLine("TOSEC lists available:"); - foreach (gaseous_identifier.objects.RomSignatureObject tosecList in tosecLists) + availablePlatforms.Sort(); + Console.WriteLine("Platforms loaded:"); + foreach (string platform in availablePlatforms) { - Console.WriteLine(" * " + tosecList.Name); + Console.WriteLine(" * " + platform); } } @@ -99,7 +117,7 @@ foreach (string romFile in romPathContents) string sha1Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); bool gameFound = false; - foreach (gaseous_identifier.objects.RomSignatureObject tosecList in tosecLists) + foreach (gaseous_identifier.objects.RomSignatureObject tosecList in romSignatures) { foreach (gaseous_identifier.objects.RomSignatureObject.Game gameObject in tosecList.Games) { From 1a79850d371fee376b5e7635402a674c00c103b6 Mon Sep 17 00:00:00 2001 From: Michael Green Date: Fri, 17 Feb 2023 23:43:23 +1100 Subject: [PATCH 05/36] Add TOSEC dump flag support --- gaseous-identifier/Classes/TosecParser.cs | 53 ++++++++++++++++++- .../Objects/RomSignatureObject.cs | 2 +- gaseous-identifier/Program.cs | 6 ++- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index 0349e56..451b0ed 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -397,11 +397,11 @@ namespace gaseous_identifier.classes ( token != romObject.RomTypeMedia && token != gameObject.Publisher && + token != gameObject.SystemVariant && + token != gameObject.Video && token != gameObject.Country.Key && token != gameObject.Copyright.Key && token != gameObject.Language.Key && - token != gameObject.SystemVariant && - token != gameObject.Video && token != gameObject.DevelopmentStatus.Key ) ) @@ -409,6 +409,55 @@ namespace gaseous_identifier.classes // likely the media label? romObject.MediaLabel = token; } + + // process dump flags + if (rawToken.IndexOf("[") > 0) + { + // has dump flags + string rawDumpFlags = rawToken.Substring(rawToken.IndexOf("[")); + string[] dumpFlags = rawDumpFlags.Split("["); + foreach (string dumpFlag in dumpFlags) + { + string dToken = dumpFlag.Replace("]", ""); + if (dToken.Length > 0) + { + string[] dTokenCompare = dToken.Split(" "); + switch (dTokenCompare[0].Trim().ToLower()) + { + case "cr": + // cracked + case "f": + // fixed + case "h": + // hacked + case "m": + // modified + case "p": + // pirated + case "t": + // trained + case "tr": + // translated + case "o": + // overdump + case "u": + // underdump + case "v": + // virus + case "b": + // bad dump + case "a": + // alternate + case "!": + // known verified dump + // ------------------- + romObject.flags.Add(dToken); + break; + } + + } + } + } } gameObject.Roms.Add(romObject); diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs index 6d7482c..d6ff210 100644 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -56,7 +56,7 @@ namespace gaseous_identifier.objects public string? Md5 { get; set; } public string? Sha1 { get; set; } - public string? flags { get; set; } + public List flags { get; set; } = new List(); public RomTypes RomType { get; set; } public string? RomTypeMedia { get; set; } diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index bfdfe5a..48ad5ac 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -3,6 +3,7 @@ using System.Security.Cryptography; using System.Text; using System.Xml; using System.Xml.Serialization; +using Newtonsoft.Json; string[] commandLineArgs = Environment.GetCommandLineArgs(); @@ -135,7 +136,10 @@ foreach (string romFile in romPathContents) gameSignature.Roms.Clear(); gameSignature.Roms.Add(romObject); - Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented)); + var jsonSerializerSettings = new JsonSerializerSettings(); + jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); + jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; + Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); break; } } From bf18e4886df39b728466c8d9e94014a55f0db870 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sat, 18 Feb 2023 23:11:07 +1100 Subject: [PATCH 06/36] feat: added hashes of data source files --- gaseous-identifier/Classes/TosecParser.cs | 14 ++++++++++++++ gaseous-identifier/Objects/RomSignatureObject.cs | 2 ++ 2 files changed, 16 insertions(+) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index 451b0ed..7c54aaa 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -2,6 +2,7 @@ using System.Xml; using System.IO; using System.Reflection; +using System.Security.Cryptography; namespace gaseous_identifier.classes { @@ -76,6 +77,17 @@ namespace gaseous_identifier.classes } while (reader.EndOfStream == false); } + // get hashes of TOSEC file + var xmlStream = File.OpenRead(XMLFile); + + var md5 = MD5.Create(); + byte[] md5HashByte = md5.ComputeHash(xmlStream); + string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + + var sha1 = SHA1.Create(); + byte[] sha1HashByte = sha1.ComputeHash(xmlStream); + string sha1Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + // load TOSEC file XmlDocument tosecXmlDoc = new XmlDocument(); tosecXmlDoc.Load(XMLFile); @@ -85,6 +97,8 @@ namespace gaseous_identifier.classes // get header XmlNode xmlHeader = tosecXmlDoc.DocumentElement.SelectSingleNode("/datafile/header"); tosecObject.SourceType = "TOSEC"; + tosecObject.SourceMd5 = md5Hash; + tosecObject.SourceSHA1 = sha1Hash; foreach (XmlNode childNode in xmlHeader.ChildNodes) { switch (childNode.Name.ToLower()) diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs index d6ff210..5bd39ee 100644 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -19,6 +19,8 @@ namespace gaseous_identifier.objects public string? Homepage { get; set; } public Uri? Url { get; set; } public string? SourceType { get; set; } + public string SourceMd5 { get; set; } = ""; + public string SourceSHA1 { get; set; } = ""; public List Games { get; set; } = new List(); From d18be38c3a61ab4df014e9b5c0ff8cbd58b0a5e0 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sat, 18 Feb 2023 23:27:47 +1100 Subject: [PATCH 07/36] fix: resolved typo in hash computation --- gaseous-identifier/Classes/TosecParser.cs | 2 +- gaseous-identifier/Program.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index 7c54aaa..3baec42 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -86,7 +86,7 @@ namespace gaseous_identifier.classes var sha1 = SHA1.Create(); byte[] sha1HashByte = sha1.ComputeHash(xmlStream); - string sha1Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); // load TOSEC file XmlDocument tosecXmlDoc = new XmlDocument(); diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 48ad5ac..24e5a39 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -115,7 +115,7 @@ foreach (string romFile in romPathContents) var sha1 = SHA1.Create(); byte[] sha1HashByte = sha1.ComputeHash(stream); - string sha1Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); bool gameFound = false; foreach (gaseous_identifier.objects.RomSignatureObject tosecList in romSignatures) From 78e8df1d8b8e2eb1ef0fa6f7bfb86fd7af0368b2 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sat, 18 Feb 2023 23:43:44 +1100 Subject: [PATCH 08/36] =?UTF-8?q?fix:=20compare=20both=20md5=20and=20sha1?= =?UTF-8?q?=20when=20search=20for=20rom=E2=80=99s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gaseous-identifier/Program.cs | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 24e5a39..382be23 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -130,19 +130,30 @@ foreach (string romFile in romPathContents) { // match gameFound = true; - Console.WriteLine(romObject.Name); - - gaseous_identifier.objects.RomSignatureObject.Game gameSignature = gameObject; - gameSignature.Roms.Clear(); - gameSignature.Roms.Add(romObject); - - var jsonSerializerSettings = new JsonSerializerSettings(); - jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); - jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; - Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); - break; } } + if (romObject.Sha1 != null) + { + if (md5Hash == romObject.Sha1.ToLowerInvariant()) + { + // match + gameFound = true; + } + } + if (gameFound == true) + { + Console.WriteLine(romObject.Name); + + gaseous_identifier.objects.RomSignatureObject.Game gameSignature = gameObject; + gameSignature.Roms.Clear(); + gameSignature.Roms.Add(romObject); + + var jsonSerializerSettings = new JsonSerializerSettings(); + jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); + jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; + Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); + break; + } } if (gameFound == true) { break; } } From 88c64235b5df789f00d9b9a286f60aa3a97ce653 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Mon, 20 Feb 2023 22:58:15 +1100 Subject: [PATCH 09/36] refactor: removed unneeded else statement --- gaseous-identifier/Classes/TosecParser.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index 3baec42..aecff15 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -337,10 +337,6 @@ namespace gaseous_identifier.classes gameObject.DevelopmentStatus = new KeyValuePair(token, TOSECDevelopment[token]); } } - else - { - // handle the square bracket tokens - } } StartToken += 1; } From 0dcd720199347b499a62694b75f523724b96bed0 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Mon, 20 Feb 2023 22:59:57 +1100 Subject: [PATCH 10/36] refactor: added more specific title matching - ensuring that different language versions are separated out --- gaseous-identifier/Classes/TosecParser.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index aecff15..141c949 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -479,7 +479,11 @@ namespace gaseous_identifier.classes bool existingGameFound = false; foreach (gaseous_identifier.objects.RomSignatureObject.Game existingGame in tosecObject.Games) { - if (existingGame.Name == gameObject.Name && existingGame.Year == gameObject.Year && existingGame.Publisher == gameObject.Publisher) + if (existingGame.Name == gameObject.Name && + existingGame.Year == gameObject.Year && + existingGame.Publisher == gameObject.Publisher && + existingGame.Country.Key == gameObject.Country.Key && + existingGame.Language.Key == gameObject.Language.Key) { existingGame.Roms.AddRange(gameObject.Roms); existingGameFound = true; From cb44f1a509004393bfee1522ab67f22cca14ab05 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 10:12:23 +1100 Subject: [PATCH 11/36] refactor: moved development status to the rom object --- gaseous-identifier/Classes/TosecParser.cs | 14 +++++++------- gaseous-identifier/Objects/RomSignatureObject.cs | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index 141c949..27c438b 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -330,12 +330,6 @@ namespace gaseous_identifier.classes { gameObject.Copyright = new KeyValuePair(token, TOSECCopyright[token]); } - - // check for copyright - if (TOSECDevelopment.ContainsKey(token)) - { - gameObject.DevelopmentStatus = new KeyValuePair(token, TOSECDevelopment[token]); - } } } StartToken += 1; @@ -368,6 +362,12 @@ namespace gaseous_identifier.classes // replace the extra closing bracket string token = tokenSplit[0].Replace(")", "").Trim(); + // check for copyright + if (TOSECDevelopment.ContainsKey(token)) + { + romObject.DevelopmentStatus = new KeyValuePair(token, TOSECDevelopment[token]); + } + // check for media type if (token.StartsWith("Disc") || token.StartsWith("Disk") || @@ -412,7 +412,7 @@ namespace gaseous_identifier.classes token != gameObject.Country.Key && token != gameObject.Copyright.Key && token != gameObject.Language.Key && - token != gameObject.DevelopmentStatus.Key + token != romObject.DevelopmentStatus.Key ) ) { diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs index 5bd39ee..4464e65 100644 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -37,7 +37,6 @@ namespace gaseous_identifier.objects public KeyValuePair Country { get; set; } public KeyValuePair Language { get; set; } public KeyValuePair Copyright { get; set; } - public KeyValuePair DevelopmentStatus { get; set; } public List Roms { get; set; } = new List(); public enum DemoTypes @@ -58,6 +57,8 @@ namespace gaseous_identifier.objects public string? Md5 { get; set; } public string? Sha1 { get; set; } + public KeyValuePair DevelopmentStatus { get; set; } + public List flags { get; set; } = new List(); public RomTypes RomType { get; set; } From fef758c32c5015ff1d7e4eb7e520bf0f1b4cfb73 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 21:57:34 +1100 Subject: [PATCH 12/36] refactor: removed keyvaluepairs for various values --- gaseous-identifier/Classes/TosecParser.cs | 20 +++++++++---------- .../Objects/RomSignatureObject.cs | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index 27c438b..a55b985 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -316,19 +316,19 @@ namespace gaseous_identifier.classes // check for country if (TOSECCountry.ContainsKey(token)) { - gameObject.Country = new KeyValuePair(token, TOSECCountry[token]); + gameObject.Country = token; } // check for language if (TOSECLanguage.ContainsKey(token)) { - gameObject.Language = new KeyValuePair(token, TOSECLanguage[token]); + gameObject.Language = token; } // check for copyright if (TOSECCopyright.ContainsKey(token)) { - gameObject.Copyright = new KeyValuePair(token, TOSECCopyright[token]); + gameObject.Copyright = token; } } } @@ -365,7 +365,7 @@ namespace gaseous_identifier.classes // check for copyright if (TOSECDevelopment.ContainsKey(token)) { - romObject.DevelopmentStatus = new KeyValuePair(token, TOSECDevelopment[token]); + romObject.DevelopmentStatus = token; } // check for media type @@ -409,10 +409,10 @@ namespace gaseous_identifier.classes token != gameObject.Publisher && token != gameObject.SystemVariant && token != gameObject.Video && - token != gameObject.Country.Key && - token != gameObject.Copyright.Key && - token != gameObject.Language.Key && - token != romObject.DevelopmentStatus.Key + token != gameObject.Country && + token != gameObject.Copyright && + token != gameObject.Language && + token != romObject.DevelopmentStatus ) ) { @@ -482,8 +482,8 @@ namespace gaseous_identifier.classes if (existingGame.Name == gameObject.Name && existingGame.Year == gameObject.Year && existingGame.Publisher == gameObject.Publisher && - existingGame.Country.Key == gameObject.Country.Key && - existingGame.Language.Key == gameObject.Language.Key) + existingGame.Country == gameObject.Country && + existingGame.Language == gameObject.Language) { existingGame.Roms.AddRange(gameObject.Roms); existingGameFound = true; diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs index 4464e65..4aa7c9e 100644 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -34,9 +34,9 @@ namespace gaseous_identifier.objects public string? System { get; set; } public string? SystemVariant { get; set; } public string? Video { get; set; } - public KeyValuePair Country { get; set; } - public KeyValuePair Language { get; set; } - public KeyValuePair Copyright { get; set; } + public string? Country { get; set; } + public string? Language { get; set; } + public string? Copyright { get; set; } public List Roms { get; set; } = new List(); public enum DemoTypes @@ -57,7 +57,7 @@ namespace gaseous_identifier.objects public string? Md5 { get; set; } public string? Sha1 { get; set; } - public KeyValuePair DevelopmentStatus { get; set; } + public string? DevelopmentStatus { get; set; } public List flags { get; set; } = new List(); From f84d5e8ec72c2df65015c96abdf206e2ea1e23a1 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 22:17:06 +1100 Subject: [PATCH 13/36] refactor: remove title description field --- gaseous-identifier/Classes/TosecParser.cs | 2 +- gaseous-identifier/Program.cs | 129 ++++++++++++---------- 2 files changed, 73 insertions(+), 58 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index a55b985..abd47ac 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -343,7 +343,7 @@ namespace gaseous_identifier.classes switch (xmlGameDetail.Name.ToLower()) { case "description": - gameObject.Description = xmlGameDetail.InnerText; + //gameObject.Description = xmlGameDetail.InnerText; break; case "rom": diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 382be23..0f5b344 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -101,66 +101,81 @@ if (availablePlatforms.Count > 0) } } -Console.WriteLine("Examining files"); -string[] romPathContents = Directory.GetFiles(scanPath); -foreach (string romFile in romPathContents) +//Console.WriteLine("Examining files"); +//string[] romPathContents = Directory.GetFiles(scanPath); +//foreach (string romFile in romPathContents) +//{ +// Console.WriteLine("Checking " + romFile); + +// var stream = File.OpenRead(romFile); + +// var md5 = MD5.Create(); +// byte[] md5HashByte = md5.ComputeHash(stream); +// string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + +// var sha1 = SHA1.Create(); +// byte[] sha1HashByte = sha1.ComputeHash(stream); +// string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); + +// bool gameFound = false; +// foreach (gaseous_identifier.objects.RomSignatureObject tosecList in romSignatures) +// { +// foreach (gaseous_identifier.objects.RomSignatureObject.Game gameObject in tosecList.Games) +// { +// foreach (gaseous_identifier.objects.RomSignatureObject.Game.Rom romObject in gameObject.Roms) +// { +// if (romObject.Md5 != null) +// { +// if (md5Hash == romObject.Md5.ToLowerInvariant()) +// { +// // match +// gameFound = true; +// } +// } +// if (romObject.Sha1 != null) +// { +// if (md5Hash == romObject.Sha1.ToLowerInvariant()) +// { +// // match +// gameFound = true; +// } +// } +// if (gameFound == true) +// { +// Console.WriteLine(romObject.Name); + +// gaseous_identifier.objects.RomSignatureObject.Game gameSignature = gameObject; +// gameSignature.Roms.Clear(); +// gameSignature.Roms.Add(romObject); + +// var jsonSerializerSettings = new JsonSerializerSettings(); +// jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); +// jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; +// Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); +// break; +// } +// } +// if (gameFound == true) { break; } +// } +// if (gameFound == true) { break; } +// } +// if (gameFound == false) +// { +// Console.WriteLine("File not found in TOSEC library"); +// } +//} + +string SearchTitle = "California Games"; +foreach (gaseous_identifier.objects.RomSignatureObject romSignatureObject in romSignatures) { - Console.WriteLine("Checking " + romFile); - - var stream = File.OpenRead(romFile); - - var md5 = MD5.Create(); - byte[] md5HashByte = md5.ComputeHash(stream); - string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); - - var sha1 = SHA1.Create(); - byte[] sha1HashByte = sha1.ComputeHash(stream); - string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); - - bool gameFound = false; - foreach (gaseous_identifier.objects.RomSignatureObject tosecList in romSignatures) + foreach (gaseous_identifier.objects.RomSignatureObject.Game gameObject in romSignatureObject.Games) { - foreach (gaseous_identifier.objects.RomSignatureObject.Game gameObject in tosecList.Games) + if (gameObject.Name == SearchTitle) { - foreach (gaseous_identifier.objects.RomSignatureObject.Game.Rom romObject in gameObject.Roms) - { - if (romObject.Md5 != null) - { - if (md5Hash == romObject.Md5.ToLowerInvariant()) - { - // match - gameFound = true; - } - } - if (romObject.Sha1 != null) - { - if (md5Hash == romObject.Sha1.ToLowerInvariant()) - { - // match - gameFound = true; - } - } - if (gameFound == true) - { - Console.WriteLine(romObject.Name); - - gaseous_identifier.objects.RomSignatureObject.Game gameSignature = gameObject; - gameSignature.Roms.Clear(); - gameSignature.Roms.Add(romObject); - - var jsonSerializerSettings = new JsonSerializerSettings(); - jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); - jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; - Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); - break; - } - } - if (gameFound == true) { break; } + var jsonSerializerSettings = new JsonSerializerSettings(); + jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); + jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; + Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameObject, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); } - if (gameFound == true) { break; } - } - if (gameFound == false) - { - Console.WriteLine("File not found in TOSEC library"); } } \ No newline at end of file From 4c844f99cd9ca3eb11b9303ac83ba98d2d6a70a3 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 22:56:20 +1100 Subject: [PATCH 14/36] refactor: fixed bug with parsing publisher --- gaseous-identifier/Classes/TosecParser.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index abd47ac..7b575c7 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -152,7 +152,8 @@ namespace gaseous_identifier.classes objects.RomSignatureObject.Game gameObject = new objects.RomSignatureObject.Game(); // parse game name - string gameName = xmlGame.Attributes["name"].Value; + string[] gameNameTitleParts = xmlGame.Attributes["name"].Value.Split("["); + string gameName = gameNameTitleParts[0]; // before split, save and remove the demo tag if present if (gameName.Contains("(demo) ", StringComparison.CurrentCulture)) @@ -338,12 +339,13 @@ namespace gaseous_identifier.classes gameObject.Roms = new List(); // get the roms + string romDescription = ""; foreach (XmlNode xmlGameDetail in xmlGame.ChildNodes) { switch (xmlGameDetail.Name.ToLower()) { case "description": - //gameObject.Description = xmlGameDetail.InnerText; + romDescription = xmlGameDetail.InnerText; break; case "rom": @@ -355,8 +357,8 @@ namespace gaseous_identifier.classes romObject.Sha1 = xmlGameDetail.Attributes["sha1"]?.Value; // parse name - string[] romNameTokens = romObject.Name.Split("("); - foreach (string rawToken in gameNameTokens) { + string[] romNameTokens = romDescription.Split("("); + foreach (string rawToken in romNameTokens) { string[] tokenSplit = rawToken.Split("["); // replace the extra closing bracket From 3491968519b43ede83770af5d9258455f6a839bf Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:07:07 +1100 Subject: [PATCH 15/36] =?UTF-8?q?fix:=20fixed=20parsing=20of=20=E2=80=9Ca?= =?UTF-8?q?=E2=80=9D=20dump=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gaseous-identifier/Classes/TosecParser.cs | 68 +++++++++++-------- .../Objects/RomSignatureObject.cs | 5 ++ 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index 7b575c7..b4e1a9c 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -434,37 +434,45 @@ namespace gaseous_identifier.classes if (dToken.Length > 0) { string[] dTokenCompare = dToken.Split(" "); - switch (dTokenCompare[0].Trim().ToLower()) + if (dTokenCompare[0].Trim().ToLower().StartsWith("a")) { - case "cr": - // cracked - case "f": - // fixed - case "h": - // hacked - case "m": - // modified - case "p": - // pirated - case "t": - // trained - case "tr": - // translated - case "o": - // overdump - case "u": - // underdump - case "v": - // virus - case "b": - // bad dump - case "a": - // alternate - case "!": - // known verified dump - // ------------------- - romObject.flags.Add(dToken); - break; + romObject.flags.Add(dTokenCompare[0].Trim()); + } + else + { + + switch (dTokenCompare[0].Trim().ToLower()) + { + case "cr": + // cracked + case "f": + // fixed + case "h": + // hacked + case "m": + // modified + case "p": + // pirated + case "t": + // trained + case "tr": + // translated + case "o": + // overdump + case "u": + // underdump + case "v": + // virus + case "b": + // bad dump + case "a": + // alternate + case "!": + // known verified dump + // ------------------- + romObject.flags.Add(dToken); + break; + } } } diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs index 4aa7c9e..6ad3ae7 100644 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ b/gaseous-identifier/Objects/RomSignatureObject.cs @@ -38,6 +38,11 @@ namespace gaseous_identifier.objects public string? Language { get; set; } public string? Copyright { get; set; } public List Roms { get; set; } = new List(); + public int RomCount { get + { + return Roms.Count(); + } + } public enum DemoTypes { From 0a6585ea17481859f6156649800e530ae3b48aab Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:36:49 +1100 Subject: [PATCH 16/36] refactor: add RomSignatureObject as git submodule --- .gitmodules | 3 +++ RomSignatureObject | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 RomSignatureObject diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..303a6c4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "RomSignatureObject"] + path = RomSignatureObject + url = https://github.com/gaseous-project/RomSignatureObject.git diff --git a/RomSignatureObject b/RomSignatureObject new file mode 160000 index 0000000..970955e --- /dev/null +++ b/RomSignatureObject @@ -0,0 +1 @@ +Subproject commit 970955e3da09bb557cd9bdb9ce855dbc51f116eb From cc31bd3bbe591fe4f96020da03b02bba840d77f7 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:37:59 +1100 Subject: [PATCH 17/36] refactor: add RomSignatureObject as additional project --- Gaseous.sln | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Gaseous.sln b/Gaseous.sln index 0666cea..f0160e3 100644 --- a/Gaseous.sln +++ b/Gaseous.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 25.0.1704.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-identifier", "gaseous-identifier\gaseous-identifier.csproj", "{F5C42134-5372-430A-A9AE-1871981850DB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gaseous-ROMSignatureObject", "RomSignatureObject\Gaseous-ROMSignatureObject\Gaseous-ROMSignatureObject.csproj", "{08699C93-15CD-4E39-9053-D3C8056CE938}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {F5C42134-5372-430A-A9AE-1871981850DB}.Debug|Any CPU.Build.0 = Debug|Any CPU {F5C42134-5372-430A-A9AE-1871981850DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {F5C42134-5372-430A-A9AE-1871981850DB}.Release|Any CPU.Build.0 = Release|Any CPU + {08699C93-15CD-4E39-9053-D3C8056CE938}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08699C93-15CD-4E39-9053-D3C8056CE938}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 0747f3a028f29cd243de68705f78e5ce173802d5 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:48:30 +1100 Subject: [PATCH 18/36] refactor: moved all code over to submodule linked RomSignatureObject --- .../Objects/RomSignatureObject.cs | 115 ------------------ 1 file changed, 115 deletions(-) delete mode 100644 gaseous-identifier/Objects/RomSignatureObject.cs diff --git a/gaseous-identifier/Objects/RomSignatureObject.cs b/gaseous-identifier/Objects/RomSignatureObject.cs deleted file mode 100644 index 6ad3ae7..0000000 --- a/gaseous-identifier/Objects/RomSignatureObject.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace gaseous_identifier.objects -{ - /// - /// Object returned by all signature engines containing metadata about the ROM's in the data files - /// - /// This class was based on the TOSEC dataset, so may need to be expanded as new signature engines are added - /// - public class RomSignatureObject - { - public string? Name { get; set; } - public string? Description { get; set; } - public string? Category { get; set; } - public string? Version { get; set; } - public string? Author { get; set; } - public string? Email { get; set; } - public string? Homepage { get; set; } - public Uri? Url { get; set; } - public string? SourceType { get; set; } - public string SourceMd5 { get; set; } = ""; - public string SourceSHA1 { get; set; } = ""; - - public List Games { get; set; } = new List(); - - public class Game - { - public string? Name { get; set; } - public string? Description { get; set; } - public string? Year { get; set; } - public string? Publisher { get; set; } - public DemoTypes Demo { get; set; } - public string? System { get; set; } - public string? SystemVariant { get; set; } - public string? Video { get; set; } - public string? Country { get; set; } - public string? Language { get; set; } - public string? Copyright { get; set; } - public List Roms { get; set; } = new List(); - public int RomCount { get - { - return Roms.Count(); - } - } - - public enum DemoTypes - { - NotDemo = 0, - demo = 1, - demo_kiosk = 2, - demo_playable = 3, - demo_rolling = 4, - demo_slideshow = 5 - } - - public class Rom - { - public string? Name { get; set; } - public UInt64? Size { get; set; } - public string? Crc { get; set; } - public string? Md5 { get; set; } - public string? Sha1 { get; set; } - - public string? DevelopmentStatus { get; set; } - - public List flags { get; set; } = new List(); - - public RomTypes RomType { get; set; } - public string? RomTypeMedia { get; set; } - public string? MediaLabel { get; set; } - - public enum RomTypes - { - /// - /// Media type is unknown - /// - Unknown = 0, - - /// - /// Optical media - /// - Disc = 1, - - /// - /// Magnetic media - /// - Disk = 2, - - /// - /// Individual files - /// - File = 3, - - /// - /// Individual pars - /// - Part = 4, - - /// - /// Tape base media - /// - Tape = 5, - - /// - /// Side of the media - /// - Side = 6 - } - } - - } - } -} - From d6763623f4cad05ab1a246e40dbaa089e63b343a Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:48:57 +1100 Subject: [PATCH 19/36] refactor: moved over to submodule based linking for RomSignatureObject --- gaseous-identifier/Classes/TosecParser.cs | 38 +++--- gaseous-identifier/Program.cs | 124 +++++++++---------- gaseous-identifier/gaseous-identifier.csproj | 5 + 3 files changed, 86 insertions(+), 81 deletions(-) diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-identifier/Classes/TosecParser.cs index b4e1a9c..f6ea727 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-identifier/Classes/TosecParser.cs @@ -8,7 +8,7 @@ namespace gaseous_identifier.classes { public class TosecParser { - public objects.RomSignatureObject Parse(string XMLFile) + public Gaseous_ROMSignatureObject.RomSignatureObject Parse(string XMLFile) { // load resources var assembly = Assembly.GetExecutingAssembly(); @@ -92,7 +92,7 @@ namespace gaseous_identifier.classes XmlDocument tosecXmlDoc = new XmlDocument(); tosecXmlDoc.Load(XMLFile); - objects.RomSignatureObject tosecObject = new objects.RomSignatureObject(); + Gaseous_ROMSignatureObject.RomSignatureObject tosecObject = new Gaseous_ROMSignatureObject.RomSignatureObject(); // get header XmlNode xmlHeader = tosecXmlDoc.DocumentElement.SelectSingleNode("/datafile/header"); @@ -145,11 +145,11 @@ namespace gaseous_identifier.classes } // get games - tosecObject.Games = new List(); + tosecObject.Games = new List(); XmlNodeList xmlGames = tosecXmlDoc.DocumentElement.SelectNodes("/datafile/game"); foreach (XmlNode xmlGame in xmlGames) { - objects.RomSignatureObject.Game gameObject = new objects.RomSignatureObject.Game(); + Gaseous_ROMSignatureObject.RomSignatureObject.Game gameObject = new Gaseous_ROMSignatureObject.RomSignatureObject.Game(); // parse game name string[] gameNameTitleParts = xmlGame.Attributes["name"].Value.Split("["); @@ -158,32 +158,32 @@ namespace gaseous_identifier.classes // before split, save and remove the demo tag if present if (gameName.Contains("(demo) ", StringComparison.CurrentCulture)) { - gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo; + gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo; gameName = gameName.Replace("(demo) ", ""); } else if (gameName.Contains("(demo-kiosk) ", StringComparison.CurrentCulture)) { - gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_kiosk; + gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_kiosk; gameName = gameName.Replace("(demo-kiosk) ", ""); } else if (gameName.Contains("(demo-playable) ", StringComparison.CurrentCulture)) { - gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_playable; + gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_playable; gameName = gameName.Replace("(demo-playable) ", ""); } else if (gameName.Contains("(demo-rolling) ", StringComparison.CurrentCulture)) { - gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_rolling; + gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_rolling; gameName = gameName.Replace("(demo-rolling) ", ""); } else if (gameName.Contains("(demo-slideshow) ", StringComparison.CurrentCulture)) { - gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.demo_slideshow; + gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_slideshow; gameName = gameName.Replace("(demo-slideshow) ", ""); } else { - gameObject.Demo = objects.RomSignatureObject.Game.DemoTypes.NotDemo; + gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.NotDemo; } string[] gameNameTokens = gameName.Split("("); @@ -336,7 +336,7 @@ namespace gaseous_identifier.classes StartToken += 1; } - gameObject.Roms = new List(); + gameObject.Roms = new List(); // get the roms string romDescription = ""; @@ -349,7 +349,7 @@ namespace gaseous_identifier.classes break; case "rom": - objects.RomSignatureObject.Game.Rom romObject = new objects.RomSignatureObject.Game.Rom(); + Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom romObject = new Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom(); romObject.Name = xmlGameDetail.Attributes["name"]?.Value; romObject.Size = UInt64.Parse(xmlGameDetail.Attributes["size"]?.Value); romObject.Crc = xmlGameDetail.Attributes["crc"]?.Value; @@ -382,22 +382,22 @@ namespace gaseous_identifier.classes switch (tokens[0]) { case "Disc": - romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Disc; + romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Disc; break; case "Disk": - romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Disk; + romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Disk; break; case "File": - romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.File; + romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.File; break; case "Part": - romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Part; + romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Part; break; case "Side": - romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Side; + romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Side; break; case "Tape": - romObject.RomType = objects.RomSignatureObject.Game.Rom.RomTypes.Tape; + romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Tape; break; } romObject.RomTypeMedia = token; @@ -487,7 +487,7 @@ namespace gaseous_identifier.classes // search for existing gameObject to update bool existingGameFound = false; - foreach (gaseous_identifier.objects.RomSignatureObject.Game existingGame in tosecObject.Games) + foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game existingGame in tosecObject.Games) { if (existingGame.Name == gameObject.Name && existingGame.Year == gameObject.Year && diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 0f5b344..4430fdd 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -50,7 +50,7 @@ foreach (string commandLineArg in commandLineArgs) scanPath = Path.GetFullPath(scanPath); Console.WriteLine("ROM search path: " + scanPath); -List romSignatures = new List(); +List romSignatures = new List(); System.Collections.ArrayList availablePlatforms = new System.Collections.ArrayList(); // load TOSEC XML files @@ -67,13 +67,13 @@ if (tosecXML != null && tosecXML.Length > 0) string tosecXMLFile = tosecPathContents[i]; gaseous_identifier.classes.TosecParser tosecParser = new gaseous_identifier.classes.TosecParser(); - gaseous_identifier.objects.RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); + Gaseous_ROMSignatureObject.RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); string statusOutput = i + " / " + tosecPathContents.Length + " : " + Path.GetFileName(tosecXMLFile); Console.Write("\r " + statusOutput.PadRight(lastCLILineLength, ' ') + "\r"); lastCLILineLength = statusOutput.Length; - foreach (gaseous_identifier.objects.RomSignatureObject.Game gameRom in tosecObject.Games) + foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game gameRom in tosecObject.Games) { if (!availablePlatforms.Contains(gameRom.System)) { @@ -101,74 +101,74 @@ if (availablePlatforms.Count > 0) } } -//Console.WriteLine("Examining files"); -//string[] romPathContents = Directory.GetFiles(scanPath); -//foreach (string romFile in romPathContents) -//{ -// Console.WriteLine("Checking " + romFile); +Console.WriteLine("Examining files"); +string[] romPathContents = Directory.GetFiles(scanPath); +foreach (string romFile in romPathContents) +{ + Console.WriteLine("Checking " + romFile); -// var stream = File.OpenRead(romFile); + var stream = File.OpenRead(romFile); -// var md5 = MD5.Create(); -// byte[] md5HashByte = md5.ComputeHash(stream); -// string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + var md5 = MD5.Create(); + byte[] md5HashByte = md5.ComputeHash(stream); + string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); -// var sha1 = SHA1.Create(); -// byte[] sha1HashByte = sha1.ComputeHash(stream); -// string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); + var sha1 = SHA1.Create(); + byte[] sha1HashByte = sha1.ComputeHash(stream); + string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); -// bool gameFound = false; -// foreach (gaseous_identifier.objects.RomSignatureObject tosecList in romSignatures) -// { -// foreach (gaseous_identifier.objects.RomSignatureObject.Game gameObject in tosecList.Games) -// { -// foreach (gaseous_identifier.objects.RomSignatureObject.Game.Rom romObject in gameObject.Roms) -// { -// if (romObject.Md5 != null) -// { -// if (md5Hash == romObject.Md5.ToLowerInvariant()) -// { -// // match -// gameFound = true; -// } -// } -// if (romObject.Sha1 != null) -// { -// if (md5Hash == romObject.Sha1.ToLowerInvariant()) -// { -// // match -// gameFound = true; -// } -// } -// if (gameFound == true) -// { -// Console.WriteLine(romObject.Name); + bool gameFound = false; + foreach (Gaseous_ROMSignatureObject.RomSignatureObject tosecList in romSignatures) + { + foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game gameObject in tosecList.Games) + { + foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom romObject in gameObject.Roms) + { + if (romObject.Md5 != null) + { + if (md5Hash == romObject.Md5.ToLowerInvariant()) + { + // match + gameFound = true; + } + } + if (romObject.Sha1 != null) + { + if (md5Hash == romObject.Sha1.ToLowerInvariant()) + { + // match + gameFound = true; + } + } + if (gameFound == true) + { + Console.WriteLine(romObject.Name); -// gaseous_identifier.objects.RomSignatureObject.Game gameSignature = gameObject; -// gameSignature.Roms.Clear(); -// gameSignature.Roms.Add(romObject); + Gaseous_ROMSignatureObject.RomSignatureObject.Game gameSignature = gameObject; + gameSignature.Roms.Clear(); + gameSignature.Roms.Add(romObject); -// var jsonSerializerSettings = new JsonSerializerSettings(); -// jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); -// jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; -// Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); -// break; -// } -// } -// if (gameFound == true) { break; } -// } -// if (gameFound == true) { break; } -// } -// if (gameFound == false) -// { -// Console.WriteLine("File not found in TOSEC library"); -// } -//} + var jsonSerializerSettings = new JsonSerializerSettings(); + jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); + jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore; + Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(gameSignature, Newtonsoft.Json.Formatting.Indented, jsonSerializerSettings)); + break; + } + } + if (gameFound == true) { break; } + } + if (gameFound == true) { break; } + } + if (gameFound == false) + { + Console.WriteLine("File not found in TOSEC library"); + } +} string SearchTitle = "California Games"; -foreach (gaseous_identifier.objects.RomSignatureObject romSignatureObject in romSignatures) +foreach (Gaseous_ROMSignatureObject.RomSignatureObject romSignatureObject in romSignatures) { - foreach (gaseous_identifier.objects.RomSignatureObject.Game gameObject in romSignatureObject.Games) + foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game gameObject in romSignatureObject.Games) { if (gameObject.Name == SearchTitle) { diff --git a/gaseous-identifier/gaseous-identifier.csproj b/gaseous-identifier/gaseous-identifier.csproj index 4b0419b..dbee03d 100644 --- a/gaseous-identifier/gaseous-identifier.csproj +++ b/gaseous-identifier/gaseous-identifier.csproj @@ -20,12 +20,14 @@ + + @@ -38,4 +40,7 @@ + + + From 2a3d5b9d5cc91085e0973a87566f4141391db66c Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 22 Feb 2023 00:07:30 +1100 Subject: [PATCH 20/36] chore: update submodule --- RomSignatureObject | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RomSignatureObject b/RomSignatureObject index 970955e..48a4b8b 160000 --- a/RomSignatureObject +++ b/RomSignatureObject @@ -1 +1 @@ -Subproject commit 970955e3da09bb557cd9bdb9ce855dbc51f116eb +Subproject commit 48a4b8b8b2474940cc76d1399d8480a927863f5c From 44f1beaf69fc3cd4fc4f22bdf073f0b46919e044 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 22 Feb 2023 20:38:58 +1100 Subject: [PATCH 21/36] =?UTF-8?q?chore:=20removal=20of=20annoying=20git=20?= =?UTF-8?q?submodules=20that=20didn=E2=80=99t=20work=20properly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 3 - Gaseous.sln | 8 +- RomSignatureObject | 1 - ...proj => gaseous-identifier-testapp.csproj} | 4 +- gaseous-romsignatureobject/.DS_Store | Bin 0 -> 6148 bytes .../Gaseous-ROMSignatureObject.csproj | 10 ++ .../RomSignatureObject.cs | 117 ++++++++++++++++++ .../Gaseous-ROMSignatureObject.deps.json | 23 ++++ .../net7.0/Gaseous-ROMSignatureObject.dll | Bin 0 -> 10752 bytes .../net7.0/Gaseous-ROMSignatureObject.pdb | Bin 0 -> 12620 bytes .../gaseous-romsignatureobject.csproj | 10 ++ ...CoreApp,Version=v7.0.AssemblyAttributes.cs | 4 + ...Gaseous-ROMSignatureObject.AssemblyInfo.cs | 22 ++++ ...OMSignatureObject.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 11 ++ ...seous-ROMSignatureObject.GlobalUsings.g.cs | 8 ++ .../Gaseous-ROMSignatureObject.assets.cache | Bin 0 -> 157 bytes ...atureObject.csproj.AssemblyReference.cache | Bin 0 -> 73466 bytes ...atureObject.csproj.CoreCompileInputs.cache | 1 + ...ignatureObject.csproj.FileListAbsolute.txt | 12 ++ .../net7.0/Gaseous-ROMSignatureObject.dll | Bin 0 -> 10752 bytes .../net7.0/Gaseous-ROMSignatureObject.pdb | Bin 0 -> 12620 bytes .../net7.0/ref/Gaseous-ROMSignatureObject.dll | Bin 0 -> 9216 bytes .../refint/Gaseous-ROMSignatureObject.dll | Bin 0 -> 9216 bytes ...OMSignatureObject.csproj.nuget.dgspec.json | 61 +++++++++ ...us-ROMSignatureObject.csproj.nuget.g.props | 15 +++ ...-ROMSignatureObject.csproj.nuget.g.targets | 2 + .../obj/project.assets.json | 66 ++++++++++ .../obj/project.nuget.cache | 8 ++ 29 files changed, 378 insertions(+), 9 deletions(-) delete mode 160000 RomSignatureObject rename gaseous-identifier/{gaseous-identifier.csproj => gaseous-identifier-testapp.csproj} (89%) create mode 100644 gaseous-romsignatureobject/.DS_Store create mode 100644 gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj create mode 100644 gaseous-romsignatureobject/RomSignatureObject.cs create mode 100644 gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json create mode 100644 gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll create mode 100644 gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.pdb create mode 100644 gaseous-romsignatureobject/gaseous-romsignatureobject.csproj create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.assets.cache create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.pdb create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll create mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/refint/Gaseous-ROMSignatureObject.dll create mode 100644 gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.dgspec.json create mode 100644 gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.props create mode 100644 gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets create mode 100644 gaseous-romsignatureobject/obj/project.assets.json create mode 100644 gaseous-romsignatureobject/obj/project.nuget.cache diff --git a/.gitmodules b/.gitmodules index 303a6c4..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "RomSignatureObject"] - path = RomSignatureObject - url = https://github.com/gaseous-project/RomSignatureObject.git diff --git a/Gaseous.sln b/Gaseous.sln index f0160e3..32f3f25 100644 --- a/Gaseous.sln +++ b/Gaseous.sln @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 25.0.1704.4 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-identifier", "gaseous-identifier\gaseous-identifier.csproj", "{F5C42134-5372-430A-A9AE-1871981850DB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-identifier-testapp", "gaseous-identifier\gaseous-identifier-testapp.csproj", "{F5C42134-5372-430A-A9AE-1871981850DB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gaseous-ROMSignatureObject", "RomSignatureObject\Gaseous-ROMSignatureObject\Gaseous-ROMSignatureObject.csproj", "{08699C93-15CD-4E39-9053-D3C8056CE938}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-romsignatureobject", "gaseous-romsignatureobject\Gaseous-ROMSignatureObject.csproj", "{B0328A09-F50C-40BB-AC3D-040635AF927F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +21,10 @@ Global {08699C93-15CD-4E39-9053-D3C8056CE938}.Debug|Any CPU.Build.0 = Debug|Any CPU {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.ActiveCfg = Release|Any CPU {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.Build.0 = Release|Any CPU + {B0328A09-F50C-40BB-AC3D-040635AF927F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0328A09-F50C-40BB-AC3D-040635AF927F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0328A09-F50C-40BB-AC3D-040635AF927F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0328A09-F50C-40BB-AC3D-040635AF927F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RomSignatureObject b/RomSignatureObject deleted file mode 160000 index 48a4b8b..0000000 --- a/RomSignatureObject +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 48a4b8b8b2474940cc76d1399d8480a927863f5c diff --git a/gaseous-identifier/gaseous-identifier.csproj b/gaseous-identifier/gaseous-identifier-testapp.csproj similarity index 89% rename from gaseous-identifier/gaseous-identifier.csproj rename to gaseous-identifier/gaseous-identifier-testapp.csproj index dbee03d..5b51fd7 100644 --- a/gaseous-identifier/gaseous-identifier.csproj +++ b/gaseous-identifier/gaseous-identifier-testapp.csproj @@ -20,14 +20,12 @@ - - @@ -41,6 +39,6 @@ - + diff --git a/gaseous-romsignatureobject/.DS_Store b/gaseous-romsignatureobject/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2493af2831919ef5939f4df0a9d35114ad1f3901 GIT binary patch literal 6148 zcmeHK%SyvQ6rE|SNhm@V3SADkEm&X0;wHrU14eYAQWH`%8Z)Iy&7u^t)*tdq{2uR} znSjNvMeMyWbMA8{b0G6zjB$S!?=$8y#%ySa9F-MP=v)S_rvK8T9;C$QLTs3RWdF| z?)I6?iZIE>Q&o_}V@SEZPO?~*zMN%ou4)4va2(qixt;m^c+l^Pe(z+_74yMCuPcrY z`-_ER@9gfKUW}g8mrTBCIytbdWXoU;@1U5~yav-OmDvM$>g+m;kQg8ahyh|?y%{j) zg56$k8ff*z05PzF0o)%1G(^u}rBQ7i(BbtN<1IuK(D5ySC=7ZAD~%8V;kp!1mvZyO z;JO_A!sK}dD~-CGaWylHV`i=&FI>$IexcGC_cT&Z3=jj$3^cXr;`x6Lzs$-<{&ERf z!~iky&lupXVKDSzQRZy@u{=C$1+;r;D418F0s{KdB>)WEM>;B~;{tWa^9)uRaTN5c QazMHWC_< + + + net7.0 + Gaseous_ROMSignatureObject + enable + enable + + + diff --git a/gaseous-romsignatureobject/RomSignatureObject.cs b/gaseous-romsignatureobject/RomSignatureObject.cs new file mode 100644 index 0000000..98cfde8 --- /dev/null +++ b/gaseous-romsignatureobject/RomSignatureObject.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; + +namespace Gaseous_ROMSignatureObject +{ + /// + /// Object returned by all signature engines containing metadata about the ROM's in the data files + /// + /// This class was based on the TOSEC dataset, so may need to be expanded as new signature engines are added + /// + public class RomSignatureObject + { + public string? Name { get; set; } + public string? Description { get; set; } + public string? Category { get; set; } + public string? Version { get; set; } + public string? Author { get; set; } + public string? Email { get; set; } + public string? Homepage { get; set; } + public Uri? Url { get; set; } + public string? SourceType { get; set; } + public string SourceMd5 { get; set; } = ""; + public string SourceSHA1 { get; set; } = ""; + + public List Games { get; set; } = new List(); + + public class Game + { + public string? Name { get; set; } + public string? Description { get; set; } + public string? Year { get; set; } + public string? Publisher { get; set; } + public DemoTypes Demo { get; set; } + public string? System { get; set; } + public string? SystemVariant { get; set; } + public string? Video { get; set; } + public string? Country { get; set; } + public string? Language { get; set; } + public string? Copyright { get; set; } + public List Roms { get; set; } = new List(); + public int RomCount + { + get + { + return Roms.Count(); + } + } + + public enum DemoTypes + { + NotDemo = 0, + demo = 1, + demo_kiosk = 2, + demo_playable = 3, + demo_rolling = 4, + demo_slideshow = 5 + } + + public class Rom + { + public string? Name { get; set; } + public UInt64? Size { get; set; } + public string? Crc { get; set; } + public string? Md5 { get; set; } + public string? Sha1 { get; set; } + + public string? DevelopmentStatus { get; set; } + + public List flags { get; set; } = new List(); + + public RomTypes RomType { get; set; } + public string? RomTypeMedia { get; set; } + public string? MediaLabel { get; set; } + + public enum RomTypes + { + /// + /// Media type is unknown + /// + Unknown = 0, + + /// + /// Optical media + /// + Disc = 1, + + /// + /// Magnetic media + /// + Disk = 2, + + /// + /// Individual files + /// + File = 3, + + /// + /// Individual pars + /// + Part = 4, + + /// + /// Tape base media + /// + Tape = 5, + + /// + /// Side of the media + /// + Side = 6 + } + } + + } + } +} + diff --git a/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json b/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json new file mode 100644 index 0000000..a927cc5 --- /dev/null +++ b/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v7.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v7.0": { + "Gaseous-ROMSignatureObject/1.0.0": { + "runtime": { + "Gaseous-ROMSignatureObject.dll": {} + } + } + } + }, + "libraries": { + "Gaseous-ROMSignatureObject/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll b/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll new file mode 100644 index 0000000000000000000000000000000000000000..dfba6bbac6d3b849bbdb5cddd47e232c2b3abc14 GIT binary patch literal 10752 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 literal 0 HcmV?d00001 diff --git a/gaseous-romsignatureobject/gaseous-romsignatureobject.csproj b/gaseous-romsignatureobject/gaseous-romsignatureobject.csproj new file mode 100644 index 0000000..7b43d45 --- /dev/null +++ b/gaseous-romsignatureobject/gaseous-romsignatureobject.csproj @@ -0,0 +1,10 @@ + + + + net7.0 + Gaseous_ROMSignatureObject + enable + enable + + + diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs b/gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs new file mode 100644 index 0000000..d69481d --- /dev/null +++ b/gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")] diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs new file mode 100644 index 0000000..e886bac --- /dev/null +++ b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Gaseous-ROMSignatureObject")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("Gaseous-ROMSignatureObject")] +[assembly: System.Reflection.AssemblyTitleAttribute("Gaseous-ROMSignatureObject")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4b35e90 --- /dev/null +++ b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcc23f2b2fef12195f6a41d44e616c5e9171deb5 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..9006218 --- /dev/null +++ b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,11 @@ +is_global = true +build_property.TargetFramework = net7.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Gaseous_ROMSignatureObject +build_property.ProjectDir = /Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/ diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs new file mode 100644 index 0000000..8578f3d --- /dev/null +++ b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.assets.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..877101a8bc3a9112caa61188cb1427a6cfe26463 GIT binary patch literal 157 zcmWIWc6a1qU|^Ww*nMF=FRyXd^$q_PbEdttnJQ!+XP&&*Yv=3;7BB)8 ss_2Inrxq3K=Vm5nB&O!17p11=>Fec{rl*$Z7bGTUC#I(s>k~2%0LX40_5c6? literal 0 HcmV?d00001 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..4ed82c20784bed6167448235d69b65be6c3e3599 GIT binary patch literal 73466 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 S^aQl@F|A0ZlFKKuLh=79FMsL) literal 0 HcmV?d00001 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..311de99 --- /dev/null +++ b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +d99a0ab321ea37181f1996193c5ebb0787582b08 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..b1ae6e5 --- /dev/null +++ b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt @@ -0,0 +1,12 @@ +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.pdb +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/refint/Gaseous-ROMSignatureObject.dll +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.pdb +/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll new file mode 100644 index 0000000000000000000000000000000000000000..dfba6bbac6d3b849bbdb5cddd47e232c2b3abc14 GIT binary patch literal 10752 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 literal 0 HcmV?d00001 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll b/gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll new file mode 100644 index 0000000000000000000000000000000000000000..d22ab9c5e5cc8f84ee5b009dfb52c776ce52d50d GIT binary patch literal 9216 zcmeHNYit}>6+U%RVW|>b0oyC^TYDk*etIVCx_G6aAFT6F7f)I_=+ZSE0>%>b8hM9lxQCLtYg%3tWw@(k1N{z z^wlvwN-dB%M|KR15BA}#LmxrT>eyefC)pVVs=966oN9zX|5V$k*8k;Dm*7~2V+cn( z4m2l68D~!S9XN0clHPK4PMbvEiTUGC(&x3m#*?%<#`uc*b^JJghv{iVZi=&IeXT3D^hah> zwa^3V?!-;#D|!d*mx#$4kH3Y^qenME#t5L@Ct3`%tuTM9l5Z#a!6d=A(1%c+we_Sy z+KcfVg~oMTr~%dcsfjgkJA`YZVY-G6CI)~bu|q&TK1|8vJ+L3IelmU(_^9ARF_xPY zxhTQEKU!;v9=8}*z5Hr#g zxTcV60T*c-5-y$)g7&r~?u#^8m8Buavm0qVyOGAT+Z=lG>_*z-;I0h0C&5M9GvHc6 z?s;&Lb~64jwT9dS@ki>kw=lcQLhfIf-AFr#)x0X??!;rj)O9BDk) zk+wJXEUgaer3PYW>$I2A&ov?UUGy{3dcmy?xkKP0tsC6BklPI|(q2g9@OT-F;d}yF zCDe{5UP5jOxQWEK>$JT30qG&YQ;xDruPSl={I zr)|KEvLGQbKwzm=T;1tP0Kv&I>LGQd0Z{GlCO>Rl&I= zk84ikd6DNu)*HB1MsPx~DmW)NFSsB`DTyzb5u6aL3eKe@zR2?;&x^buNR3igFe5l2 zSQShn12o_+)QAj7)TLen4#ydvOfu>szbg2x7+d~8jBmzX2YyuiO|i5IUZ40C?DcV; zmbxzqJ`(>uSQ7aziC-4^1(7w0wpZlOCjJb^a`JCsv_r9fK>oh8G9$QG@TUpxPcESp z(J9pkd|d2j&|3{p3^5sD401}I?;3#`u8RiPn}8bb){T&P4m4_pP2uj^1ex#7oL81Y zUIv@O^?N1cHrNy`2Wq&7T?KgsP(#L84tW(&!)&gAyauQthpd9U4yYlwuYs%sHRS7c zklTS8b%0UGDR|1HO<)wB8#h3{7K}p9>43Z$j6y!y1bGV>MO%RyT?a-Xmu!Z7Js5@T zv;}fE7)3V#HDs9UA#Vq2v;&Ny8-W__1fwBG?to=CP(v2l3HcVFhAhTU%zOFymiB>B zlmTkUrh6do2Wr#{Mo}M7!?SP?^ zEHaGFx}I4~_u7Smne{BYC164&XBO=f<$^KG1EvEOV8AH)v4&aTW<;oU=~$)YS+I{8W#7vmCyzyZ>r`&F zHY%Y4xxYAR=5l7P$HVLCWW_V7*DjXPv?F6Qym~5h8h6q8P@_I`vXakpuOnNqaFM0Q zb&>K(@n2c0{B531%V+nKr8pC{tD>A0Bri^;*#l{U#l7y>k)cs5UoyOkV;-5j z8`nxYS13rpamTN~XAa?a$={=LbrJR>^_MC|p=(_fK9GY^m{YZ@P(1rgH|tnsUVibe z*T+jUCHqv#kBDp1_T!1fo#?~mR;vVI*!IN0QzupKFbzj&5xBxgWwKzo)245ZH0F9L z-n8u#H8Gv_V5oJw&oc5Q+x4uh8<=X#i@f4rZ=5MPc zu3q*n+I+dY6l^_Sf4|a{NSrf#X~@btwrfv$XfkK^;Ch*LE#DRK{O}^w`dpXrDBP9) z)#}&kGf(1Md%0+qyipI!?uWS8`raD^`AzoDiHr9R?}!VwlT1agU7mHU{In<25otV4 ze#eg+j%Ad5ezApp5VqGw-lP%3@%)YN7O*GWY5SDl0CHa5c4qzffx=a#UO;dR$Wku) z#vIp`O2u?i2?(vNtTv0dCv|q;i3eI=Te4fe!{HqWk5=+oj=$B#*%;?rC0=caV##$0 zEs1}rSh7{e(aC`l9B5qv(VOEsEgNKY*$zF+b^F~v1>c&t~n`h9jBEm4$^8y3F9qQ!1}y2T$pq{1!=zTk34=^90! znBkAFW7^W5Lcu;YR4I5?8F%F|t#Pn~JYeDO$Zm)6&Gx@=<8}T|ZfF{AKom?!6Q36q z`8}=9lB#{*W>b6c8)6+Fh{1PoU&mf{`U-_1!zxkH&0?ZWN!HB1vxzczkiIMne=C-s z7^{niCku{eaJtCOe*D|P?Gr>EU!=9-#kNB_j`#f&z zdE0+xmNi8k|Gcjjhc9{F81c<=Lo9MCl6j0?D==Zc{qfgz1nt=9WkuFyIE+qszq_<`?ZSH6+U%RVW|>b0oyC^TYDk*etIVCx_G6aAFT6F7f)I_=+ZSE0>%>b8hM9lxQCLtYg%3tWw@(k1N{z z^wlvwN-dB%M|KR15BA}#LmxrT>eyefC)pVVs=966oN9zX|5V$k*8k;Dm*7~2V+cn( z4m2l68D~!S9XN0clHPK4PMbvEiTUGC(&x3m#*?%<#`uc*b^JJghv{iVZi=&IeXT3D^hah> zwa^3V?!-;#D|!d*mx#$4kH3Y^qenME#t5L@Ct3`%tuTM9l5Z#a!6d=A(1%c+we_Sy z+KcfVg~oMTr~%dcsfjgkJA`YZVY-G6CI)~bu|q&TK1|8vJ+L3IelmU(_^9ARF_xPY zxhTQEKU!;v9=8}*z5Hr#g zxTcV60T*c-5-y$)g7&r~?u#^8m8Buavm0qVyOGAT+Z=lG>_*z-;I0h0C&5M9GvHc6 z?s;&Lb~64jwT9dS@ki>kw=lcQLhfIf-AFr#)x0X??!;rj)O9BDk) zk+wJXEUgaer3PYW>$I2A&ov?UUGy{3dcmy?xkKP0tsC6BklPI|(q2g9@OT-F;d}yF zCDe{5UP5jOxQWEK>$JT30qG&YQ;xDruPSl={I zr)|KEvLGQbKwzm=T;1tP0Kv&I>LGQd0Z{GlCO>Rl&I= zk84ikd6DNu)*HB1MsPx~DmW)NFSsB`DTyzb5u6aL3eKe@zR2?;&x^buNR3igFe5l2 zSQShn12o_+)QAj7)TLen4#ydvOfu>szbg2x7+d~8jBmzX2YyuiO|i5IUZ40C?DcV; zmbxzqJ`(>uSQ7aziC-4^1(7w0wpZlOCjJb^a`JCsv_r9fK>oh8G9$QG@TUpxPcESp z(J9pkd|d2j&|3{p3^5sD401}I?;3#`u8RiPn}8bb){T&P4m4_pP2uj^1ex#7oL81Y zUIv@O^?N1cHrNy`2Wq&7T?KgsP(#L84tW(&!)&gAyauQthpd9U4yYlwuYs%sHRS7c zklTS8b%0UGDR|1HO<)wB8#h3{7K}p9>43Z$j6y!y1bGV>MO%RyT?a-Xmu!Z7Js5@T zv;}fE7)3V#HDs9UA#Vq2v;&Ny8-W__1fwBG?to=CP(v2l3HcVFhAhTU%zOFymiB>B zlmTkUrh6do2Wr#{Mo}M7!?SP?^ zEHaGFx}I4~_u7Smne{BYC164&XBO=f<$^KG1EvEOV8AH)v4&aTW<;oU=~$)YS+I{8W#7vmCyzyZ>r`&F zHY%Y4xxYAR=5l7P$HVLCWW_V7*DjXPv?F6Qym~5h8h6q8P@_I`vXakpuOnNqaFM0Q zb&>K(@n2c0{B531%V+nKr8pC{tD>A0Bri^;*#l{U#l7y>k)cs5UoyOkV;-5j z8`nxYS13rpamTN~XAa?a$={=LbrJR>^_MC|p=(_fK9GY^m{YZ@P(1rgH|tnsUVibe z*T+jUCHqv#kBDp1_T!1fo#?~mR;vVI*!IN0QzupKFbzj&5xBxgWwKzo)245ZH0F9L z-n8u#H8Gv_V5oJw&oc5Q+x4uh8<=X#i@f4rZ=5MPc zu3q*n+I+dY6l^_Sf4|a{NSrf#X~@btwrfv$XfkK^;Ch*LE#DRK{O}^w`dpXrDBP9) z)#}&kGf(1Md%0+qyipI!?uWS8`raD^`AzoDiHr9R?}!VwlT1agU7mHU{In<25otV4 ze#eg+j%Ad5ezApp5VqGw-lP%3@%)YN7O*GWY5SDl0CHa5c4qzffx=a#UO;dR$Wku) z#vIp`O2u?i2?(vNtTv0dCv|q;i3eI=Te4fe!{HqWk5=+oj=$B#*%;?rC0=caV##$0 zEs1}rSh7{e(aC`l9B5qv(VOEsEgNKY*$zF+b^F~v1>c&t~n`h9jBEm4$^8y3F9qQ!1}y2T$pq{1!=zTk34=^90! znBkAFW7^W5Lcu;YR4I5?8F%F|t#Pn~JYeDO$Zm)6&Gx@=<8}T|ZfF{AKom?!6Q36q z`8}=9lB#{*W>b6c8)6+Fh{1PoU&mf{`U-_1!zxkH&0?ZWN!HB1vxzczkiIMne=C-s z7^{niCku{eaJtCOe*D|P?Gr>EU!=9-#kNB_j`#f&z zdE0+xmNi8k|Gcjjhc9{F81c<=Lo9MCl6j0?D==Zc{qfgz1nt=9WkuFyIE+qszq_<`?ZSH + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/michaelgreen/.nuget/packages/ + /Users/michaelgreen/.nuget/packages/ + PackageReference + 6.4.0 + + + + + \ No newline at end of file diff --git a/gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets b/gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/gaseous-romsignatureobject/obj/project.assets.json b/gaseous-romsignatureobject/obj/project.assets.json new file mode 100644 index 0000000..fb736bb --- /dev/null +++ b/gaseous-romsignatureobject/obj/project.assets.json @@ -0,0 +1,66 @@ +{ + "version": 3, + "targets": { + "net7.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net7.0": [] + }, + "packageFolders": { + "/Users/michaelgreen/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj", + "projectName": "Gaseous-ROMSignatureObject", + "projectPath": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj", + "packagesPath": "/Users/michaelgreen/.nuget/packages/", + "outputPath": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/michaelgreen/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net7.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/7.0.200/RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/gaseous-romsignatureobject/obj/project.nuget.cache b/gaseous-romsignatureobject/obj/project.nuget.cache new file mode 100644 index 0000000..04baee7 --- /dev/null +++ b/gaseous-romsignatureobject/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "QzFseClXWjOhiJwwzg5hojHFA6smvJmer7lTIdcxUdoP7JHfx0elP2vLsSQEXOjmZD+Koe+dG5lfwqTfBpFfLg==", + "success": true, + "projectFilePath": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file From e2e98ddc2ae2c7ead14e57d206331dbf3afdc3fa Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 22 Feb 2023 21:09:13 +1100 Subject: [PATCH 22/36] chore: separated components into separate projects --- Gaseous.sln | 22 +++++--- gaseous-identifier/Program.cs | 22 ++++---- .../gaseous-identifier-testapp.csproj | 27 +--------- .../Gaseous-ROMSignatureObject.csproj | 10 ---- .../RomSignatureObject.cs | 2 +- .../gaseous-romsignatureobject.csproj | 5 +- .../Parsers}/TosecParser.cs | 53 ++++++++++--------- .../Support/Parsers/TOSEC/Copyright.txt | 0 .../Support/Parsers/TOSEC/Country.txt | 0 .../Parsers/TOSEC/DevelopmentStatus.txt | 0 .../Support/Parsers/TOSEC/Language.txt | 0 .../Support/Parsers/TOSEC/Systems.txt | 0 .../Support/Parsers/TOSEC/Video.txt | 0 .../gaseous-signature-parser.csproj | 38 +++++++++++++ 14 files changed, 100 insertions(+), 79 deletions(-) delete mode 100644 gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj rename {gaseous-identifier/Classes => gaseous-signature-parser/Parsers}/TosecParser.cs (90%) rename {gaseous-identifier => gaseous-signature-parser}/Support/Parsers/TOSEC/Copyright.txt (100%) rename {gaseous-identifier => gaseous-signature-parser}/Support/Parsers/TOSEC/Country.txt (100%) rename {gaseous-identifier => gaseous-signature-parser}/Support/Parsers/TOSEC/DevelopmentStatus.txt (100%) rename {gaseous-identifier => gaseous-signature-parser}/Support/Parsers/TOSEC/Language.txt (100%) rename {gaseous-identifier => gaseous-signature-parser}/Support/Parsers/TOSEC/Systems.txt (100%) rename {gaseous-identifier => gaseous-signature-parser}/Support/Parsers/TOSEC/Video.txt (100%) create mode 100644 gaseous-signature-parser/gaseous-signature-parser.csproj diff --git a/Gaseous.sln b/Gaseous.sln index 32f3f25..2e09c95 100644 --- a/Gaseous.sln +++ b/Gaseous.sln @@ -1,11 +1,13 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 25.0.1704.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-identifier-testapp", "gaseous-identifier\gaseous-identifier-testapp.csproj", "{F5C42134-5372-430A-A9AE-1871981850DB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-romsignatureobject", "gaseous-romsignatureobject\Gaseous-ROMSignatureObject.csproj", "{B0328A09-F50C-40BB-AC3D-040635AF927F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-signature-parser", "gaseous-signature-parser\gaseous-signature-parser.csproj", "{DAEBBB82-5051-43FD-A406-F9D64A38F468}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-romsignatureobject", "gaseous-romsignatureobject\gaseous-romsignatureobject.csproj", "{9DCD243D-37CE-4562-8411-B5242B687D4F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,10 +23,18 @@ Global {08699C93-15CD-4E39-9053-D3C8056CE938}.Debug|Any CPU.Build.0 = Debug|Any CPU {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.ActiveCfg = Release|Any CPU {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.Build.0 = Release|Any CPU - {B0328A09-F50C-40BB-AC3D-040635AF927F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B0328A09-F50C-40BB-AC3D-040635AF927F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B0328A09-F50C-40BB-AC3D-040635AF927F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B0328A09-F50C-40BB-AC3D-040635AF927F}.Release|Any CPU.Build.0 = Release|Any CPU + {DAEBBB82-5051-43FD-A406-F9D64A38F468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DAEBBB82-5051-43FD-A406-F9D64A38F468}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAEBBB82-5051-43FD-A406-F9D64A38F468}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DAEBBB82-5051-43FD-A406-F9D64A38F468}.Release|Any CPU.Build.0 = Release|Any CPU + {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Release|Any CPU.Build.0 = Release|Any CPU + {9DCD243D-37CE-4562-8411-B5242B687D4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DCD243D-37CE-4562-8411-B5242B687D4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DCD243D-37CE-4562-8411-B5242B687D4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DCD243D-37CE-4562-8411-B5242B687D4F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/gaseous-identifier/Program.cs b/gaseous-identifier/Program.cs index 4430fdd..e7a4ef2 100644 --- a/gaseous-identifier/Program.cs +++ b/gaseous-identifier/Program.cs @@ -4,6 +4,8 @@ using System.Text; using System.Xml; using System.Xml.Serialization; using Newtonsoft.Json; +using gaseous_romsignatureobject; +using gaseous_signature_parser.parsers; string[] commandLineArgs = Environment.GetCommandLineArgs(); @@ -50,7 +52,7 @@ foreach (string commandLineArg in commandLineArgs) scanPath = Path.GetFullPath(scanPath); Console.WriteLine("ROM search path: " + scanPath); -List romSignatures = new List(); +List romSignatures = new List(); System.Collections.ArrayList availablePlatforms = new System.Collections.ArrayList(); // load TOSEC XML files @@ -66,14 +68,14 @@ if (tosecXML != null && tosecXML.Length > 0) { string tosecXMLFile = tosecPathContents[i]; - gaseous_identifier.classes.TosecParser tosecParser = new gaseous_identifier.classes.TosecParser(); - Gaseous_ROMSignatureObject.RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); + TosecParser tosecParser = new TosecParser(); + RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); string statusOutput = i + " / " + tosecPathContents.Length + " : " + Path.GetFileName(tosecXMLFile); Console.Write("\r " + statusOutput.PadRight(lastCLILineLength, ' ') + "\r"); lastCLILineLength = statusOutput.Length; - foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game gameRom in tosecObject.Games) + foreach (RomSignatureObject.Game gameRom in tosecObject.Games) { if (!availablePlatforms.Contains(gameRom.System)) { @@ -118,11 +120,11 @@ foreach (string romFile in romPathContents) string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); bool gameFound = false; - foreach (Gaseous_ROMSignatureObject.RomSignatureObject tosecList in romSignatures) + foreach (RomSignatureObject tosecList in romSignatures) { - foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game gameObject in tosecList.Games) + foreach (RomSignatureObject.Game gameObject in tosecList.Games) { - foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom romObject in gameObject.Roms) + foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) { if (romObject.Md5 != null) { @@ -144,7 +146,7 @@ foreach (string romFile in romPathContents) { Console.WriteLine(romObject.Name); - Gaseous_ROMSignatureObject.RomSignatureObject.Game gameSignature = gameObject; + RomSignatureObject.Game gameSignature = gameObject; gameSignature.Roms.Clear(); gameSignature.Roms.Add(romObject); @@ -166,9 +168,9 @@ foreach (string romFile in romPathContents) } string SearchTitle = "California Games"; -foreach (Gaseous_ROMSignatureObject.RomSignatureObject romSignatureObject in romSignatures) +foreach (RomSignatureObject romSignatureObject in romSignatures) { - foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game gameObject in romSignatureObject.Games) + foreach (RomSignatureObject.Game gameObject in romSignatureObject.Games) { if (gameObject.Name == SearchTitle) { diff --git a/gaseous-identifier/gaseous-identifier-testapp.csproj b/gaseous-identifier/gaseous-identifier-testapp.csproj index 5b51fd7..02cc813 100644 --- a/gaseous-identifier/gaseous-identifier-testapp.csproj +++ b/gaseous-identifier/gaseous-identifier-testapp.csproj @@ -9,36 +9,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj b/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj deleted file mode 100644 index 7b43d45..0000000 --- a/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj +++ /dev/null @@ -1,10 +0,0 @@ - - - - net7.0 - Gaseous_ROMSignatureObject - enable - enable - - - diff --git a/gaseous-romsignatureobject/RomSignatureObject.cs b/gaseous-romsignatureobject/RomSignatureObject.cs index 98cfde8..5c04359 100644 --- a/gaseous-romsignatureobject/RomSignatureObject.cs +++ b/gaseous-romsignatureobject/RomSignatureObject.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace Gaseous_ROMSignatureObject +namespace gaseous_romsignatureobject { /// /// Object returned by all signature engines containing metadata about the ROM's in the data files diff --git a/gaseous-romsignatureobject/gaseous-romsignatureobject.csproj b/gaseous-romsignatureobject/gaseous-romsignatureobject.csproj index 7b43d45..f46a538 100644 --- a/gaseous-romsignatureobject/gaseous-romsignatureobject.csproj +++ b/gaseous-romsignatureobject/gaseous-romsignatureobject.csproj @@ -2,9 +2,12 @@ net7.0 - Gaseous_ROMSignatureObject + gaseous_romsignatureobject enable enable + + 4 + diff --git a/gaseous-identifier/Classes/TosecParser.cs b/gaseous-signature-parser/Parsers/TosecParser.cs similarity index 90% rename from gaseous-identifier/Classes/TosecParser.cs rename to gaseous-signature-parser/Parsers/TosecParser.cs index f6ea727..73a43e3 100644 --- a/gaseous-identifier/Classes/TosecParser.cs +++ b/gaseous-signature-parser/Parsers/TosecParser.cs @@ -3,18 +3,19 @@ using System.Xml; using System.IO; using System.Reflection; using System.Security.Cryptography; +using gaseous_romsignatureobject; -namespace gaseous_identifier.classes +namespace gaseous_signature_parser.parsers { public class TosecParser { - public Gaseous_ROMSignatureObject.RomSignatureObject Parse(string XMLFile) + public RomSignatureObject Parse(string XMLFile) { // load resources var assembly = Assembly.GetExecutingAssembly(); // load systems list List TOSECSystems = new List(); - var resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Systems.txt"; + var resourceName = "gaseous_signature_parser.Support.Parsers.TOSEC.Systems.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { @@ -22,7 +23,7 @@ namespace gaseous_identifier.classes } // load video list List TOSECVideo = new List(); - resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Video.txt"; + resourceName = "gaseous_signature_parser.Support.Parsers.TOSEC.Video.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { @@ -30,7 +31,7 @@ namespace gaseous_identifier.classes } // load country list Dictionary TOSECCountry = new Dictionary(); - resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Country.txt"; + resourceName = "gaseous_signature_parser.Support.Parsers.TOSEC.Country.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { @@ -42,7 +43,7 @@ namespace gaseous_identifier.classes } // load language list Dictionary TOSECLanguage = new Dictionary(); - resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Language.txt"; + resourceName = "gaseous_signature_parser.Support.Parsers.TOSEC.Language.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { @@ -54,7 +55,7 @@ namespace gaseous_identifier.classes } // load copyright list Dictionary TOSECCopyright = new Dictionary(); - resourceName = "gaseous_identifier.Support.Parsers.TOSEC.Copyright.txt"; + resourceName = "gaseous_signature_parser.Support.Parsers.TOSEC.Copyright.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { @@ -66,7 +67,7 @@ namespace gaseous_identifier.classes } // load development status list Dictionary TOSECDevelopment = new Dictionary(); - resourceName = "gaseous_identifier.Support.Parsers.TOSEC.DevelopmentStatus.txt"; + resourceName = "gaseous_signature_parser.Support.Parsers.TOSEC.DevelopmentStatus.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { @@ -92,7 +93,7 @@ namespace gaseous_identifier.classes XmlDocument tosecXmlDoc = new XmlDocument(); tosecXmlDoc.Load(XMLFile); - Gaseous_ROMSignatureObject.RomSignatureObject tosecObject = new Gaseous_ROMSignatureObject.RomSignatureObject(); + RomSignatureObject tosecObject = new RomSignatureObject(); // get header XmlNode xmlHeader = tosecXmlDoc.DocumentElement.SelectSingleNode("/datafile/header"); @@ -145,11 +146,11 @@ namespace gaseous_identifier.classes } // get games - tosecObject.Games = new List(); + tosecObject.Games = new List(); XmlNodeList xmlGames = tosecXmlDoc.DocumentElement.SelectNodes("/datafile/game"); foreach (XmlNode xmlGame in xmlGames) { - Gaseous_ROMSignatureObject.RomSignatureObject.Game gameObject = new Gaseous_ROMSignatureObject.RomSignatureObject.Game(); + RomSignatureObject.Game gameObject = new RomSignatureObject.Game(); // parse game name string[] gameNameTitleParts = xmlGame.Attributes["name"].Value.Split("["); @@ -158,32 +159,32 @@ namespace gaseous_identifier.classes // before split, save and remove the demo tag if present if (gameName.Contains("(demo) ", StringComparison.CurrentCulture)) { - gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo; + gameObject.Demo = RomSignatureObject.Game.DemoTypes.demo; gameName = gameName.Replace("(demo) ", ""); } else if (gameName.Contains("(demo-kiosk) ", StringComparison.CurrentCulture)) { - gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_kiosk; + gameObject.Demo = RomSignatureObject.Game.DemoTypes.demo_kiosk; gameName = gameName.Replace("(demo-kiosk) ", ""); } else if (gameName.Contains("(demo-playable) ", StringComparison.CurrentCulture)) { - gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_playable; + gameObject.Demo = RomSignatureObject.Game.DemoTypes.demo_playable; gameName = gameName.Replace("(demo-playable) ", ""); } else if (gameName.Contains("(demo-rolling) ", StringComparison.CurrentCulture)) { - gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_rolling; + gameObject.Demo = RomSignatureObject.Game.DemoTypes.demo_rolling; gameName = gameName.Replace("(demo-rolling) ", ""); } else if (gameName.Contains("(demo-slideshow) ", StringComparison.CurrentCulture)) { - gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.demo_slideshow; + gameObject.Demo = RomSignatureObject.Game.DemoTypes.demo_slideshow; gameName = gameName.Replace("(demo-slideshow) ", ""); } else { - gameObject.Demo = Gaseous_ROMSignatureObject.RomSignatureObject.Game.DemoTypes.NotDemo; + gameObject.Demo = RomSignatureObject.Game.DemoTypes.NotDemo; } string[] gameNameTokens = gameName.Split("("); @@ -336,7 +337,7 @@ namespace gaseous_identifier.classes StartToken += 1; } - gameObject.Roms = new List(); + gameObject.Roms = new List(); // get the roms string romDescription = ""; @@ -349,7 +350,7 @@ namespace gaseous_identifier.classes break; case "rom": - Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom romObject = new Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom(); + RomSignatureObject.Game.Rom romObject = new RomSignatureObject.Game.Rom(); romObject.Name = xmlGameDetail.Attributes["name"]?.Value; romObject.Size = UInt64.Parse(xmlGameDetail.Attributes["size"]?.Value); romObject.Crc = xmlGameDetail.Attributes["crc"]?.Value; @@ -382,22 +383,22 @@ namespace gaseous_identifier.classes switch (tokens[0]) { case "Disc": - romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Disc; + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Disc; break; case "Disk": - romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Disk; + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Disk; break; case "File": - romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.File; + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.File; break; case "Part": - romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Part; + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Part; break; case "Side": - romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Side; + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Side; break; case "Tape": - romObject.RomType = Gaseous_ROMSignatureObject.RomSignatureObject.Game.Rom.RomTypes.Tape; + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Tape; break; } romObject.RomTypeMedia = token; @@ -487,7 +488,7 @@ namespace gaseous_identifier.classes // search for existing gameObject to update bool existingGameFound = false; - foreach (Gaseous_ROMSignatureObject.RomSignatureObject.Game existingGame in tosecObject.Games) + foreach (RomSignatureObject.Game existingGame in tosecObject.Games) { if (existingGame.Name == gameObject.Name && existingGame.Year == gameObject.Year && diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Copyright.txt b/gaseous-signature-parser/Support/Parsers/TOSEC/Copyright.txt similarity index 100% rename from gaseous-identifier/Support/Parsers/TOSEC/Copyright.txt rename to gaseous-signature-parser/Support/Parsers/TOSEC/Copyright.txt diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Country.txt b/gaseous-signature-parser/Support/Parsers/TOSEC/Country.txt similarity index 100% rename from gaseous-identifier/Support/Parsers/TOSEC/Country.txt rename to gaseous-signature-parser/Support/Parsers/TOSEC/Country.txt diff --git a/gaseous-identifier/Support/Parsers/TOSEC/DevelopmentStatus.txt b/gaseous-signature-parser/Support/Parsers/TOSEC/DevelopmentStatus.txt similarity index 100% rename from gaseous-identifier/Support/Parsers/TOSEC/DevelopmentStatus.txt rename to gaseous-signature-parser/Support/Parsers/TOSEC/DevelopmentStatus.txt diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Language.txt b/gaseous-signature-parser/Support/Parsers/TOSEC/Language.txt similarity index 100% rename from gaseous-identifier/Support/Parsers/TOSEC/Language.txt rename to gaseous-signature-parser/Support/Parsers/TOSEC/Language.txt diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Systems.txt b/gaseous-signature-parser/Support/Parsers/TOSEC/Systems.txt similarity index 100% rename from gaseous-identifier/Support/Parsers/TOSEC/Systems.txt rename to gaseous-signature-parser/Support/Parsers/TOSEC/Systems.txt diff --git a/gaseous-identifier/Support/Parsers/TOSEC/Video.txt b/gaseous-signature-parser/Support/Parsers/TOSEC/Video.txt similarity index 100% rename from gaseous-identifier/Support/Parsers/TOSEC/Video.txt rename to gaseous-signature-parser/Support/Parsers/TOSEC/Video.txt diff --git a/gaseous-signature-parser/gaseous-signature-parser.csproj b/gaseous-signature-parser/gaseous-signature-parser.csproj new file mode 100644 index 0000000..f09d93a --- /dev/null +++ b/gaseous-signature-parser/gaseous-signature-parser.csproj @@ -0,0 +1,38 @@ + + + + net7.0 + gaseous_signature_parser + enable + enable + + + + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + From 789b41ff120b4781c912fc71602ee29774aadbdf Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 22 Feb 2023 21:12:58 +1100 Subject: [PATCH 23/36] chore: cleanup --- .../Gaseous-ROMSignatureObject.deps.json | 23 ------------------ .../net7.0/Gaseous-ROMSignatureObject.dll | Bin 10752 -> 0 bytes .../net7.0/Gaseous-ROMSignatureObject.pdb | Bin 12620 -> 0 bytes 3 files changed, 23 deletions(-) delete mode 100644 gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json delete mode 100644 gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll delete mode 100644 gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.pdb diff --git a/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json b/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json deleted file mode 100644 index a927cc5..0000000 --- a/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v7.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v7.0": { - "Gaseous-ROMSignatureObject/1.0.0": { - "runtime": { - "Gaseous-ROMSignatureObject.dll": {} - } - } - } - }, - "libraries": { - "Gaseous-ROMSignatureObject/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll b/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll deleted file mode 100644 index dfba6bbac6d3b849bbdb5cddd47e232c2b3abc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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 From 96e6355c709c44ca791d25548efbe3a77b0b89cb Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 22 Feb 2023 21:13:12 +1100 Subject: [PATCH 24/36] chore: cleanup --- ...CoreApp,Version=v7.0.AssemblyAttributes.cs | 4 -- ...Gaseous-ROMSignatureObject.AssemblyInfo.cs | 22 ------ ...OMSignatureObject.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 11 --- ...seous-ROMSignatureObject.GlobalUsings.g.cs | 8 --- .../Gaseous-ROMSignatureObject.assets.cache | Bin 157 -> 0 bytes ...atureObject.csproj.AssemblyReference.cache | Bin 73466 -> 0 bytes ...atureObject.csproj.CoreCompileInputs.cache | 1 - ...ignatureObject.csproj.FileListAbsolute.txt | 12 ---- .../net7.0/Gaseous-ROMSignatureObject.dll | Bin 10752 -> 0 bytes .../net7.0/Gaseous-ROMSignatureObject.pdb | Bin 12620 -> 0 bytes .../net7.0/ref/Gaseous-ROMSignatureObject.dll | Bin 9216 -> 0 bytes .../refint/Gaseous-ROMSignatureObject.dll | Bin 9216 -> 0 bytes ...OMSignatureObject.csproj.nuget.dgspec.json | 61 ---------------- ...us-ROMSignatureObject.csproj.nuget.g.props | 15 ---- ...-ROMSignatureObject.csproj.nuget.g.targets | 2 - .../obj/project.assets.json | 66 ------------------ .../obj/project.nuget.cache | 8 --- 18 files changed, 211 deletions(-) delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.assets.cache delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.pdb delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll delete mode 100644 gaseous-romsignatureobject/obj/Debug/net7.0/refint/Gaseous-ROMSignatureObject.dll delete mode 100644 gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.dgspec.json delete mode 100644 gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.props delete mode 100644 gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets delete mode 100644 gaseous-romsignatureobject/obj/project.assets.json delete mode 100644 gaseous-romsignatureobject/obj/project.nuget.cache diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs b/gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs deleted file mode 100644 index d69481d..0000000 --- a/gaseous-romsignatureobject/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")] diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs deleted file mode 100644 index e886bac..0000000 --- a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Gaseous-ROMSignatureObject")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] -[assembly: System.Reflection.AssemblyProductAttribute("Gaseous-ROMSignatureObject")] -[assembly: System.Reflection.AssemblyTitleAttribute("Gaseous-ROMSignatureObject")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache deleted file mode 100644 index 4b35e90..0000000 --- a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -dcc23f2b2fef12195f6a41d44e616c5e9171deb5 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index 9006218..0000000 --- a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -is_global = true -build_property.TargetFramework = net7.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = Gaseous_ROMSignatureObject -build_property.ProjectDir = /Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/ diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.assets.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.assets.cache deleted file mode 100644 index 877101a8bc3a9112caa61188cb1427a6cfe26463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWIWc6a1qU|^Ww*nMF=FRyXd^$q_PbEdttnJQ!+XP&&*Yv=3;7BB)8 ss_2Inrxq3K=Vm5nB&O!17p11=>Fec{rl*$Z7bGTUC#I(s>k~2%0LX40_5c6? diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache deleted file mode 100644 index 4ed82c20784bed6167448235d69b65be6c3e3599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73466 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 S^aQl@F|A0ZlFKKuLh=79FMsL) diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache deleted file mode 100644 index 311de99..0000000 --- a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -d99a0ab321ea37181f1996193c5ebb0787582b08 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt deleted file mode 100644 index b1ae6e5..0000000 --- a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,12 +0,0 @@ -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.deps.json -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.dll -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/bin/Debug/net7.0/Gaseous-ROMSignatureObject.pdb -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.AssemblyReference.cache -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.GeneratedMSBuildEditorConfig.editorconfig -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfoInputs.cache -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.AssemblyInfo.cs -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.csproj.CoreCompileInputs.cache -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/refint/Gaseous-ROMSignatureObject.dll -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.pdb -/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll b/gaseous-romsignatureobject/obj/Debug/net7.0/Gaseous-ROMSignatureObject.dll deleted file mode 100644 index dfba6bbac6d3b849bbdb5cddd47e232c2b3abc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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 diff --git a/gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll b/gaseous-romsignatureobject/obj/Debug/net7.0/ref/Gaseous-ROMSignatureObject.dll deleted file mode 100644 index d22ab9c5e5cc8f84ee5b009dfb52c776ce52d50d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 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 - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - /Users/michaelgreen/.nuget/packages/ - /Users/michaelgreen/.nuget/packages/ - PackageReference - 6.4.0 - - - - - \ No newline at end of file diff --git a/gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets b/gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef..0000000 --- a/gaseous-romsignatureobject/obj/Gaseous-ROMSignatureObject.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/gaseous-romsignatureobject/obj/project.assets.json b/gaseous-romsignatureobject/obj/project.assets.json deleted file mode 100644 index fb736bb..0000000 --- a/gaseous-romsignatureobject/obj/project.assets.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "version": 3, - "targets": { - "net7.0": {} - }, - "libraries": {}, - "projectFileDependencyGroups": { - "net7.0": [] - }, - "packageFolders": { - "/Users/michaelgreen/.nuget/packages/": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj", - "projectName": "Gaseous-ROMSignatureObject", - "projectPath": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj", - "packagesPath": "/Users/michaelgreen/.nuget/packages/", - "outputPath": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/Users/michaelgreen/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net7.0" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net7.0": { - "targetAlias": "net7.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net7.0": { - "targetAlias": "net7.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/7.0.200/RuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/gaseous-romsignatureobject/obj/project.nuget.cache b/gaseous-romsignatureobject/obj/project.nuget.cache deleted file mode 100644 index 04baee7..0000000 --- a/gaseous-romsignatureobject/obj/project.nuget.cache +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "QzFseClXWjOhiJwwzg5hojHFA6smvJmer7lTIdcxUdoP7JHfx0elP2vLsSQEXOjmZD+Koe+dG5lfwqTfBpFfLg==", - "success": true, - "projectFilePath": "/Users/michaelgreen/Development/gaseous-server/gaseous-romsignatureobject/Gaseous-ROMSignatureObject.csproj", - "expectedPackageFiles": [], - "logs": [] -} \ No newline at end of file From f97ae60175251ccab82a49a91a4aba86a537ccc1 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 22 Feb 2023 21:13:27 +1100 Subject: [PATCH 25/36] chore: cleanup --- gaseous-romsignatureobject/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 gaseous-romsignatureobject/.DS_Store diff --git a/gaseous-romsignatureobject/.DS_Store b/gaseous-romsignatureobject/.DS_Store deleted file mode 100644 index 2493af2831919ef5939f4df0a9d35114ad1f3901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%SyvQ6rE|SNhm@V3SADkEm&X0;wHrU14eYAQWH`%8Z)Iy&7u^t)*tdq{2uR} znSjNvMeMyWbMA8{b0G6zjB$S!?=$8y#%ySa9F-MP=v)S_rvK8T9;C$QLTs3RWdF| z?)I6?iZIE>Q&o_}V@SEZPO?~*zMN%ou4)4va2(qixt;m^c+l^Pe(z+_74yMCuPcrY z`-_ER@9gfKUW}g8mrTBCIytbdWXoU;@1U5~yav-OmDvM$>g+m;kQg8ahyh|?y%{j) zg56$k8ff*z05PzF0o)%1G(^u}rBQ7i(BbtN<1IuK(D5ySC=7ZAD~%8V;kp!1mvZyO z;JO_A!sK}dD~-CGaWylHV`i=&FI>$IexcGC_cT&Z3=jj$3^cXr;`x6Lzs$-<{&ERf z!~iky&lupXVKDSzQRZy@u{=C$1+;r;D418F0s{KdB>)WEM>;B~;{tWa^9)uRaTN5c QazMHWC_< Date: Sat, 25 Feb 2023 01:49:20 +1100 Subject: [PATCH 26/36] feat: first version to introduce database storage (incomplete) --- Gaseous.sln | 12 ++ gaseous-signature-ingestor/Program.cs | 126 ++++++++++++++++++ .../gaseous-signature-ingestor.csproj | 19 +++ gaseous-tools/Database.cs | 111 +++++++++++++++ gaseous-tools/gaseous-tools.csproj | 13 ++ 5 files changed, 281 insertions(+) create mode 100644 gaseous-signature-ingestor/Program.cs create mode 100644 gaseous-signature-ingestor/gaseous-signature-ingestor.csproj create mode 100644 gaseous-tools/Database.cs create mode 100644 gaseous-tools/gaseous-tools.csproj diff --git a/Gaseous.sln b/Gaseous.sln index 2e09c95..d15120a 100644 --- a/Gaseous.sln +++ b/Gaseous.sln @@ -9,6 +9,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-signature-parser", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-romsignatureobject", "gaseous-romsignatureobject\gaseous-romsignatureobject.csproj", "{9DCD243D-37CE-4562-8411-B5242B687D4F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-signature-ingestor", "gaseous-signature-ingestor\gaseous-signature-ingestor.csproj", "{86DF6E45-2C2B-4C30-AEC1-E7EF8C5CEA7D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-tools", "gaseous-tools\gaseous-tools.csproj", "{08FE408A-5EC1-4110-ABD8-D19A1155B8CE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,6 +39,14 @@ Global {9DCD243D-37CE-4562-8411-B5242B687D4F}.Debug|Any CPU.Build.0 = Debug|Any CPU {9DCD243D-37CE-4562-8411-B5242B687D4F}.Release|Any CPU.ActiveCfg = Release|Any CPU {9DCD243D-37CE-4562-8411-B5242B687D4F}.Release|Any CPU.Build.0 = Release|Any CPU + {86DF6E45-2C2B-4C30-AEC1-E7EF8C5CEA7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86DF6E45-2C2B-4C30-AEC1-E7EF8C5CEA7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86DF6E45-2C2B-4C30-AEC1-E7EF8C5CEA7D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86DF6E45-2C2B-4C30-AEC1-E7EF8C5CEA7D}.Release|Any CPU.Build.0 = Release|Any CPU + {08FE408A-5EC1-4110-ABD8-D19A1155B8CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08FE408A-5EC1-4110-ABD8-D19A1155B8CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08FE408A-5EC1-4110-ABD8-D19A1155B8CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08FE408A-5EC1-4110-ABD8-D19A1155B8CE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs new file mode 100644 index 0000000..7988159 --- /dev/null +++ b/gaseous-signature-ingestor/Program.cs @@ -0,0 +1,126 @@ +using System; +using System.IO; +using MySql.Data.MySqlClient; +using gaseous_romsignatureobject; +using gaseous_signature_parser.parsers; +using gaseous_tools; + +string configPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gaseous-server"); + +// process command line +string[] commandLineArgs = Environment.GetCommandLineArgs(); + +string tosecXML = ""; +string inArgument = ""; +foreach (string commandLineArg in commandLineArgs) +{ + if (commandLineArg != commandLineArgs[0]) + { + if (inArgument == "") + { + switch (commandLineArg.ToLower()) + { + case "-tosecpath": + inArgument = commandLineArg.ToLower(); + break; + default: + break; + } + } + else + { + switch (inArgument) + { + case "-tosecpath": + tosecXML = commandLineArg; + break; + default: + break; + } + inArgument = ""; + } + } +} + +// check if configPath is valid and create it if not +if (!Directory.Exists(configPath)) +{ + Directory.CreateDirectory(configPath); +} + +// connect to database +string cs = @"server=localhost;userid=gaseous;password=gaseous;database=gaseous"; +Database db = new gaseous_tools.Database(Database.databaseType.MySql, cs); + +// process provided files +Console.WriteLine("Processing input files:"); +if (Directory.Exists(tosecXML)) +{ + Console.WriteLine("Processing TOSEC data files", ConsoleColor.Green); + Console.WriteLine(""); + Console.WriteLine(""); + + tosecXML = Path.GetFullPath(tosecXML); + string[] tosecPathContents = Directory.GetFiles(tosecXML); + int lineFileNameLength = 0; + for (UInt16 i = 0; i < tosecPathContents.Length; ++i) + { + string tosecXMLFile = tosecPathContents[i]; + + string statusOutput = i + " / " + tosecPathContents.Length + " : " + Path.GetFileName(tosecXMLFile); + Console.SetCursorPosition(0, Console.CursorTop - 2); + Console.WriteLine("\r " + statusOutput.PadRight(lineFileNameLength, ' ') + "\r"); + lineFileNameLength = statusOutput.Length; + + Console.WriteLine("Parsing file"); + + TosecParser tosecParser = new TosecParser(); + RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); + + // store in database + foreach (RomSignatureObject.Game gameObject in tosecObject.Games) + { + string sql = ""; + Dictionary dbDict = new Dictionary(); + System.Data.DataTable sigDB; + + // store platform + if (gameObject.System != null) + { + sql = "SELECT * FROM signatures_platforms WHERE platform=@platform"; + dbDict = new Dictionary(); + dbDict.Add("platform", gameObject.System); + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + Console.SetCursorPosition(0, Console.CursorTop - 1); + Console.WriteLine("Saving platform: " + gameObject.System); + + sql = "INSERT INTO signatures_platforms (platform) VALUES (@platform)"; + db.ExecuteCMD(sql, dbDict); + } + } + + // store publisher + if (gameObject.Publisher != null) + { + sql = "SELECT * FROM signatures_publishers WHERE publisher=@publisher"; + dbDict = new Dictionary(); + dbDict.Add("publisher", gameObject.Publisher); + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + Console.SetCursorPosition(0, Console.CursorTop - 1); + Console.WriteLine("Saving publisher: " + gameObject.Publisher); + + sql = "INSERT INTO signatures_publishers (publisher) VALUES (@publisher)"; + db.ExecuteCMD(sql, dbDict); + } + } + } + } +} \ No newline at end of file diff --git a/gaseous-signature-ingestor/gaseous-signature-ingestor.csproj b/gaseous-signature-ingestor/gaseous-signature-ingestor.csproj new file mode 100644 index 0000000..9434a6f --- /dev/null +++ b/gaseous-signature-ingestor/gaseous-signature-ingestor.csproj @@ -0,0 +1,19 @@ + + + + Exe + net7.0 + gaseous_signature_ingestor + enable + enable + + + + + + + + + + + diff --git a/gaseous-tools/Database.cs b/gaseous-tools/Database.cs new file mode 100644 index 0000000..31e1bc1 --- /dev/null +++ b/gaseous-tools/Database.cs @@ -0,0 +1,111 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using System.Diagnostics; +using MySql.Data.MySqlClient; + +namespace gaseous_tools +{ + public class Database + { + public Database() + { + + } + + public Database(databaseType Type, string ConnectionString) + { + _ConnectorType = Type; + _ConnectionString = ConnectionString; + } + + public enum databaseType + { + MySql + } + + string _ConnectionString = ""; + + public string ConnectionString + { + get + { + return _ConnectionString; + } + set + { + _ConnectionString = value; + } + } + + databaseType? _ConnectorType = null; + + public databaseType? ConnectorType + { + get + { + return _ConnectorType; + } + set + { + _ConnectorType = value; + } + } + + + public DataTable ExecuteCMD(string Command, Dictionary Parameters, int Timeout = 30) + { + switch (_ConnectorType) + { + case databaseType.MySql: + MySQLServerConnector conn = new MySQLServerConnector(_ConnectionString); + return (DataTable)conn.ExecCMD(Command, Parameters, Timeout); + default: + return new DataTable(); + } + } + + private partial class MySQLServerConnector + { + private string DBConn = ""; + + public MySQLServerConnector(string ConnectionString) + { + DBConn = ConnectionString; + } + + public DataTable ExecCMD(string SQL, Dictionary Parameters, int Timeout) + { + DataTable RetTable = new DataTable(); + + MySqlConnection conn = new MySqlConnection(DBConn); + conn.Open(); + + MySqlCommand cmd = new MySqlCommand + { + Connection = conn, + CommandText = SQL, + CommandTimeout = Timeout + }; + + foreach (string Parameter in Parameters.Keys) + { + cmd.Parameters.AddWithValue(Parameter, Parameters[Parameter]); + } + + try + { + RetTable.Load(cmd.ExecuteReader()); + } catch (Exception ex) { + Trace.WriteLine("Error executing " + SQL); + Trace.WriteLine("Full exception: " + ex.ToString()); + } + + conn.Close(); + + return RetTable; + } + } + } +} + diff --git a/gaseous-tools/gaseous-tools.csproj b/gaseous-tools/gaseous-tools.csproj new file mode 100644 index 0000000..3d07bdc --- /dev/null +++ b/gaseous-tools/gaseous-tools.csproj @@ -0,0 +1,13 @@ + + + + net7.0 + gaseous_tools + enable + enable + + + + + + From c9e55c03f8e38080094327a1645d8ce0b7187692 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sun, 26 Feb 2023 00:58:38 +1100 Subject: [PATCH 27/36] feat: signature ingestor (mostly) complete --- gaseous-signature-ingestor/Program.cs | 391 ++++++++++++++++-- .../gaseous-signature-ingestor.csproj | 1 + 2 files changed, 358 insertions(+), 34 deletions(-) diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs index 7988159..8dda979 100644 --- a/gaseous-signature-ingestor/Program.cs +++ b/gaseous-signature-ingestor/Program.cs @@ -4,6 +4,7 @@ using MySql.Data.MySqlClient; using gaseous_romsignatureobject; using gaseous_signature_parser.parsers; using gaseous_tools; +using MySqlX.XDevAPI; string configPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gaseous-server"); @@ -11,6 +12,7 @@ string configPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFo string[] commandLineArgs = Environment.GetCommandLineArgs(); string tosecXML = ""; +bool showGames = false; string inArgument = ""; foreach (string commandLineArg in commandLineArgs) { @@ -23,6 +25,9 @@ foreach (string commandLineArg in commandLineArgs) case "-tosecpath": inArgument = commandLineArg.ToLower(); break; + case "-showgames": + showGames = true; + break; default: break; } @@ -42,6 +47,8 @@ foreach (string commandLineArg in commandLineArgs) } } +tosecXML = "/Users/michaelgreen/Downloads/TOSEC - DAT Pack - Complete (3764) (TOSEC-v2023-01-23)/TOSEC"; + // check if configPath is valid and create it if not if (!Directory.Exists(configPath)) { @@ -63,62 +70,378 @@ if (Directory.Exists(tosecXML)) tosecXML = Path.GetFullPath(tosecXML); string[] tosecPathContents = Directory.GetFiles(tosecXML); int lineFileNameLength = 0; + int lineGameNameLength = 0; + + string sql = ""; + Dictionary dbDict = new Dictionary(); + System.Data.DataTable sigDB; + for (UInt16 i = 0; i < tosecPathContents.Length; ++i) { string tosecXMLFile = tosecPathContents[i]; - string statusOutput = i + " / " + tosecPathContents.Length + " : " + Path.GetFileName(tosecXMLFile); + string statusOutput = (i + 1).ToString().PadLeft(7, ' ') + " / " + tosecPathContents.Length.ToString().PadLeft(7, ' ') + " : " + Path.GetFileName(tosecXMLFile); Console.SetCursorPosition(0, Console.CursorTop - 2); Console.WriteLine("\r " + statusOutput.PadRight(lineFileNameLength, ' ') + "\r"); lineFileNameLength = statusOutput.Length; - Console.WriteLine("Parsing file"); + Console.WriteLine(" ==> Parsing file"); TosecParser tosecParser = new TosecParser(); RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); // store in database - foreach (RomSignatureObject.Game gameObject in tosecObject.Games) + + // store source object + bool processGames = false; + if (tosecObject.SourceMd5 != null) { - string sql = ""; - Dictionary dbDict = new Dictionary(); - System.Data.DataTable sigDB; - - // store platform - if (gameObject.System != null) + sql = "SELECT * FROM signatures_sources WHERE sourcemd5=@sourcemd5"; + dbDict = new Dictionary(); + if (tosecObject.Name != null) { - sql = "SELECT * FROM signatures_platforms WHERE platform=@platform"; - dbDict = new Dictionary(); - dbDict.Add("platform", gameObject.System); + dbDict.Add("name", tosecObject.Name); + } + else + { + dbDict.Add("name", ""); + } + if (tosecObject.Description != null) + { + dbDict.Add("description", tosecObject.Description); + } + else + { + dbDict.Add("description", ""); + } + if (tosecObject.Category != null) + { + dbDict.Add("category", tosecObject.Category); + } + else + { + dbDict.Add("category", ""); + } + if (tosecObject.Version != null) + { + dbDict.Add("version", tosecObject.Version); + } + else + { + dbDict.Add("version", ""); + } + if (tosecObject.Author != null) + { + dbDict.Add("author", tosecObject.Author); + } + else + { + dbDict.Add("author", ""); + } + if (tosecObject.Email != null) + { + dbDict.Add("email", tosecObject.Email); + } + else + { + dbDict.Add("email", ""); + } + if (tosecObject.Homepage != null) + { + dbDict.Add("homepage", tosecObject.Homepage); + } + else + { + dbDict.Add("homepage", ""); + } + if (tosecObject.Url != null) + { + dbDict.Add("uri", tosecObject.Url.ToString()); + } + else + { + dbDict.Add("uri", ""); + } + if (tosecObject.SourceType != null) + { + dbDict.Add("sourcetype", tosecObject.SourceType); + } + else + { + dbDict.Add("sourcetype", ""); + } + dbDict.Add("sourcemd5", tosecObject.SourceMd5); + dbDict.Add("sourcesha1", tosecObject.SourceSHA1); - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) - { - // entry not present, insert it - Console.SetCursorPosition(0, Console.CursorTop - 1); - Console.WriteLine("Saving platform: " + gameObject.System); + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_sources (name, description, category, version, author, email, homepage, url, sourcetype, sourcemd5, sourcesha1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)"; - sql = "INSERT INTO signatures_platforms (platform) VALUES (@platform)"; - db.ExecuteCMD(sql, dbDict); - } + db.ExecuteCMD(sql, dbDict); + + processGames = true; } - // store publisher - if (gameObject.Publisher != null) + if (processGames == true) { - sql = "SELECT * FROM signatures_publishers WHERE publisher=@publisher"; - dbDict = new Dictionary(); - dbDict.Add("publisher", gameObject.Publisher); - - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + for (int x = 0; x < tosecObject.Games.Count; ++x) { - // entry not present, insert it - Console.SetCursorPosition(0, Console.CursorTop - 1); - Console.WriteLine("Saving publisher: " + gameObject.Publisher); + RomSignatureObject.Game gameObject = tosecObject.Games[x]; - sql = "INSERT INTO signatures_publishers (publisher) VALUES (@publisher)"; - db.ExecuteCMD(sql, dbDict); + // update display + if (showGames == true) + { + Console.SetCursorPosition(0, Console.CursorTop - 1); + string statusGameOutput = " ==> " + (x + 1).ToString().PadLeft(7, ' ') + " / " + tosecObject.Games.Count.ToString().PadLeft(7, ' ') + " : " + gameObject.Name; + Console.WriteLine("\r " + statusGameOutput.PadRight(lineGameNameLength, ' ') + "\r"); + lineGameNameLength = statusGameOutput.Length; + } + + // set up game dictionary + dbDict = new Dictionary(); + if (gameObject.Name != null) + { + dbDict.Add("name", gameObject.Name); + } else + { + dbDict.Add("name", ""); + } + if (gameObject.Description != null) + { + dbDict.Add("description", gameObject.Description); + } + else + { + dbDict.Add("description", ""); + } + if (gameObject.Year != null) + { + dbDict.Add("year", gameObject.Year); + } + else + { + dbDict.Add("year", ""); + } + if (gameObject.Publisher != null) + { + dbDict.Add("publisher", gameObject.Publisher); + } + else + { + dbDict.Add("publisher", ""); + } + dbDict.Add("demo", (int)gameObject.Demo); + if (gameObject.System != null) + { + dbDict.Add("system", gameObject.System); + dbDict.Add("platform", gameObject.System); + } + else + { + dbDict.Add("system", ""); + } + if (gameObject.SystemVariant != null) + { + dbDict.Add("systemvariant", gameObject.SystemVariant); + } + else + { + dbDict.Add("systemvariant", ""); + } + if (gameObject.Video != null) + { + dbDict.Add("video", gameObject.Video); + } + else + { + dbDict.Add("video", ""); + } + if (gameObject.Country != null) + { + dbDict.Add("country", gameObject.Country); + } + else + { + dbDict.Add("country", ""); + } + if (gameObject.Language != null) + { + dbDict.Add("language", gameObject.Language); + } + else + { + dbDict.Add("language", ""); + } + if (gameObject.Copyright != null) + { + dbDict.Add("copyright", gameObject.Copyright); + } + else + { + dbDict.Add("copyright", ""); + } + + // store platform + int gameSystem = 0; + if (gameObject.System != null) + { + sql = "SELECT id FROM signatures_platforms WHERE platform=@platform"; + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_platforms (platform) VALUES (@platform); SELECT LAST_INSERT_ID()"; + sigDB = db.ExecuteCMD(sql, dbDict); + + gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); + } else + { + gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); + } + } + dbDict.Add("systemid", gameSystem); + + // store publisher + int gamePublisher = 0; + if (gameObject.Publisher != null) + { + sql = "SELECT * FROM signatures_publishers WHERE publisher=@publisher"; + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_publishers (publisher) VALUES (@publisher); SELECT LAST_INSERT_ID()"; + sigDB = db.ExecuteCMD(sql, dbDict); + gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); + } + else + { + gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); + } + } + dbDict.Add("publisherid", gamePublisher); + + // store game + int gameId = 0; + sql = "SELECT * FROM signatures_games WHERE name=@name AND year=@year AND publisherid=@publisher AND systemid=@systemid AND country=@country AND language=@language"; + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_games " + + "(name, description, year, publisherid, demo, systemid, systemvariant, video, country, language, copyright) VALUES " + + "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT LAST_INSERT_ID()"; + sigDB = db.ExecuteCMD(sql, dbDict); + + gameId = int.Parse(sigDB.Rows[0][0].ToString()); + } + else + { + gameId = int.Parse(sigDB.Rows[0][0].ToString()); + } + + // store rom + foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) + { + if (romObject.Md5 != null) + { + int romId = 0; + sql = "SELECT * FROM signatures_roms WHERE gameid=@gameid AND md5=@md5"; + dbDict = new Dictionary(); + dbDict.Add("gameid", gameId); + if (romObject.Name != null) + { + dbDict.Add("name", romObject.Name); + } else + { + dbDict.Add("name", ""); + } + if (romObject.Size != null) + { + dbDict.Add("size", romObject.Size); + } + else + { + dbDict.Add("size", 0); + } + if (romObject.Crc != null) + { + dbDict.Add("crc", romObject.Crc); + } + else + { + dbDict.Add("name", ""); + } + dbDict.Add("md5", romObject.Md5); + if (romObject.Sha1 != null) + { + dbDict.Add("sha1", romObject.Sha1); + } + else + { + dbDict.Add("sha1", ""); + } + if (romObject.DevelopmentStatus != null) + { + dbDict.Add("developmentstatus", romObject.DevelopmentStatus); + } + else + { + dbDict.Add("developmentstatus", ""); + } + if (romObject.flags != null) + { + if (romObject.flags.Count > 0) + { + dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags)); + } else + { + dbDict.Add("flags", "{ }"); + } + } + else + { + dbDict.Add("flags", "{ }"); + } + dbDict.Add("romtype", (int)romObject.RomType); + if (romObject.RomTypeMedia != null) + { + dbDict.Add("romtypemedia", romObject.RomTypeMedia); + } + else + { + dbDict.Add("romtypemedia", ""); + } + if (romObject.MediaLabel != null) + { + dbDict.Add("medialabel", romObject.MediaLabel); + } + else + { + dbDict.Add("medialabel", ""); + } + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_roms (gameid, name, size, crc, md5, sha1, developmentstatus, flags, romtype, romtypemedia, medialabel) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel); SELECT LAST_INSERT_ID()"; + sigDB = db.ExecuteCMD(sql, dbDict); + + + romId = int.Parse(sigDB.Rows[0][0].ToString()); + } + else + { + romId = int.Parse(sigDB.Rows[0][0].ToString()); + } + } + } } } } diff --git a/gaseous-signature-ingestor/gaseous-signature-ingestor.csproj b/gaseous-signature-ingestor/gaseous-signature-ingestor.csproj index 9434a6f..473788c 100644 --- a/gaseous-signature-ingestor/gaseous-signature-ingestor.csproj +++ b/gaseous-signature-ingestor/gaseous-signature-ingestor.csproj @@ -15,5 +15,6 @@ + From e9b7e146bec0adde9481c427830a3c5c7df88c72 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sun, 26 Feb 2023 23:48:27 +1100 Subject: [PATCH 28/36] refactor: included checkifnull function, added sql schema for the signature database --- gaseous-signature-ingestor/Program.cs | 243 +++-------------------- gaseous-tools/Common.cs | 24 +++ gaseous-tools/Database/MySQL/gaseous.sql | 144 ++++++++++++++ gaseous-tools/gaseous-tools.csproj | 8 + 4 files changed, 207 insertions(+), 212 deletions(-) create mode 100644 gaseous-tools/Common.cs create mode 100644 gaseous-tools/Database/MySQL/gaseous.sql diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs index 8dda979..163d953 100644 --- a/gaseous-signature-ingestor/Program.cs +++ b/gaseous-signature-ingestor/Program.cs @@ -47,8 +47,6 @@ foreach (string commandLineArg in commandLineArgs) } } -tosecXML = "/Users/michaelgreen/Downloads/TOSEC - DAT Pack - Complete (3764) (TOSEC-v2023-01-23)/TOSEC"; - // check if configPath is valid and create it if not if (!Directory.Exists(configPath)) { @@ -98,78 +96,15 @@ if (Directory.Exists(tosecXML)) { sql = "SELECT * FROM signatures_sources WHERE sourcemd5=@sourcemd5"; dbDict = new Dictionary(); - if (tosecObject.Name != null) - { - dbDict.Add("name", tosecObject.Name); - } - else - { - dbDict.Add("name", ""); - } - if (tosecObject.Description != null) - { - dbDict.Add("description", tosecObject.Description); - } - else - { - dbDict.Add("description", ""); - } - if (tosecObject.Category != null) - { - dbDict.Add("category", tosecObject.Category); - } - else - { - dbDict.Add("category", ""); - } - if (tosecObject.Version != null) - { - dbDict.Add("version", tosecObject.Version); - } - else - { - dbDict.Add("version", ""); - } - if (tosecObject.Author != null) - { - dbDict.Add("author", tosecObject.Author); - } - else - { - dbDict.Add("author", ""); - } - if (tosecObject.Email != null) - { - dbDict.Add("email", tosecObject.Email); - } - else - { - dbDict.Add("email", ""); - } - if (tosecObject.Homepage != null) - { - dbDict.Add("homepage", tosecObject.Homepage); - } - else - { - dbDict.Add("homepage", ""); - } - if (tosecObject.Url != null) - { - dbDict.Add("uri", tosecObject.Url.ToString()); - } - else - { - dbDict.Add("uri", ""); - } - if (tosecObject.SourceType != null) - { - dbDict.Add("sourcetype", tosecObject.SourceType); - } - else - { - dbDict.Add("sourcetype", ""); - } + dbDict.Add("name", Common.ReturnValueIfNull(tosecObject.Name, "")); + dbDict.Add("description", Common.ReturnValueIfNull(tosecObject.Description, "")); + dbDict.Add("category", Common.ReturnValueIfNull(tosecObject.Category, "")); + dbDict.Add("version", Common.ReturnValueIfNull(tosecObject.Version, "")); + dbDict.Add("author", Common.ReturnValueIfNull(tosecObject.Author, "")); + dbDict.Add("email", Common.ReturnValueIfNull(tosecObject.Email, "")); + dbDict.Add("homepage", Common.ReturnValueIfNull(tosecObject.Homepage, "")); + dbDict.Add("uri", Common.ReturnValueIfNull(tosecObject.Url, "")); + dbDict.Add("sourcetype", Common.ReturnValueIfNull(tosecObject.SourceType, "")); dbDict.Add("sourcemd5", tosecObject.SourceMd5); dbDict.Add("sourcesha1", tosecObject.SourceSHA1); @@ -201,88 +136,19 @@ if (Directory.Exists(tosecXML)) // set up game dictionary dbDict = new Dictionary(); - if (gameObject.Name != null) - { - dbDict.Add("name", gameObject.Name); - } else - { - dbDict.Add("name", ""); - } - if (gameObject.Description != null) - { - dbDict.Add("description", gameObject.Description); - } - else - { - dbDict.Add("description", ""); - } - if (gameObject.Year != null) - { - dbDict.Add("year", gameObject.Year); - } - else - { - dbDict.Add("year", ""); - } - if (gameObject.Publisher != null) - { - dbDict.Add("publisher", gameObject.Publisher); - } - else - { - dbDict.Add("publisher", ""); - } + dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, "")); + dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, "")); + dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, "")); + dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, "")); dbDict.Add("demo", (int)gameObject.Demo); - if (gameObject.System != null) - { - dbDict.Add("system", gameObject.System); - dbDict.Add("platform", gameObject.System); - } - else - { - dbDict.Add("system", ""); - } - if (gameObject.SystemVariant != null) - { - dbDict.Add("systemvariant", gameObject.SystemVariant); - } - else - { - dbDict.Add("systemvariant", ""); - } - if (gameObject.Video != null) - { - dbDict.Add("video", gameObject.Video); - } - else - { - dbDict.Add("video", ""); - } - if (gameObject.Country != null) - { - dbDict.Add("country", gameObject.Country); - } - else - { - dbDict.Add("country", ""); - } - if (gameObject.Language != null) - { - dbDict.Add("language", gameObject.Language); - } - else - { - dbDict.Add("language", ""); - } - if (gameObject.Copyright != null) - { - dbDict.Add("copyright", gameObject.Copyright); - } - else - { - dbDict.Add("copyright", ""); - } - + dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, "")); + dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, "")); + dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, "")); + dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, "")); + dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, "")); + dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, "")); + dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, "")); + // store platform int gameSystem = 0; if (gameObject.System != null) @@ -354,46 +220,13 @@ if (Directory.Exists(tosecXML)) sql = "SELECT * FROM signatures_roms WHERE gameid=@gameid AND md5=@md5"; dbDict = new Dictionary(); dbDict.Add("gameid", gameId); - if (romObject.Name != null) - { - dbDict.Add("name", romObject.Name); - } else - { - dbDict.Add("name", ""); - } - if (romObject.Size != null) - { - dbDict.Add("size", romObject.Size); - } - else - { - dbDict.Add("size", 0); - } - if (romObject.Crc != null) - { - dbDict.Add("crc", romObject.Crc); - } - else - { - dbDict.Add("name", ""); - } + dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, "")); + dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, "")); + dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "")); dbDict.Add("md5", romObject.Md5); - if (romObject.Sha1 != null) - { - dbDict.Add("sha1", romObject.Sha1); - } - else - { - dbDict.Add("sha1", ""); - } - if (romObject.DevelopmentStatus != null) - { - dbDict.Add("developmentstatus", romObject.DevelopmentStatus); - } - else - { - dbDict.Add("developmentstatus", ""); - } + dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "")); + dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); + if (romObject.flags != null) { if (romObject.flags.Count > 0) @@ -401,30 +234,16 @@ if (Directory.Exists(tosecXML)) dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags)); } else { - dbDict.Add("flags", "{ }"); + dbDict.Add("flags", "[ ]"); } } else { - dbDict.Add("flags", "{ }"); + dbDict.Add("flags", "[ ]"); } dbDict.Add("romtype", (int)romObject.RomType); - if (romObject.RomTypeMedia != null) - { - dbDict.Add("romtypemedia", romObject.RomTypeMedia); - } - else - { - dbDict.Add("romtypemedia", ""); - } - if (romObject.MediaLabel != null) - { - dbDict.Add("medialabel", romObject.MediaLabel); - } - else - { - dbDict.Add("medialabel", ""); - } + dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, "")); + dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, "")); sigDB = db.ExecuteCMD(sql, dbDict); if (sigDB.Rows.Count == 0) diff --git a/gaseous-tools/Common.cs b/gaseous-tools/Common.cs new file mode 100644 index 0000000..756e410 --- /dev/null +++ b/gaseous-tools/Common.cs @@ -0,0 +1,24 @@ +using System; +namespace gaseous_tools +{ + public class Common + { + /// + /// Returns IfNullValue if the ObjectToCheck is null + /// + /// Any nullable object to check for null + /// Any object to return if ObjectToCheck is null + /// + static public object ReturnValueIfNull(object? ObjectToCheck, object IfNullValue) + { + if (ObjectToCheck == null) + { + return IfNullValue; + } else + { + return ObjectToCheck; + } + } + } +} + diff --git a/gaseous-tools/Database/MySQL/gaseous.sql b/gaseous-tools/Database/MySQL/gaseous.sql new file mode 100644 index 0000000..098b318 --- /dev/null +++ b/gaseous-tools/Database/MySQL/gaseous.sql @@ -0,0 +1,144 @@ +-- MySQL dump 10.13 Distrib 8.0.32, for macos13.0 (arm64) +-- +-- Host: localhost Database: gaseous +-- ------------------------------------------------------ +-- Server version 8.0.32 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `signatures_games` +-- + +DROP TABLE IF EXISTS `signatures_games`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `signatures_games` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `year` varchar(15) DEFAULT NULL, + `publisherid` int DEFAULT NULL, + `demo` int DEFAULT NULL, + `systemid` int DEFAULT NULL, + `systemvariant` varchar(100) DEFAULT NULL, + `video` varchar(10) DEFAULT NULL, + `country` varchar(5) DEFAULT NULL, + `language` varchar(5) DEFAULT NULL, + `copyright` varchar(15) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `id_UNIQUE` (`id`), + KEY `publisher_idx` (`publisherid`), + KEY `system_idx` (`systemid`), + KEY `ingest_idx` (`name`,`year`,`publisherid`,`systemid`,`country`,`language`) USING BTREE, + CONSTRAINT `publisher` FOREIGN KEY (`publisherid`) REFERENCES `signatures_publishers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `system` FOREIGN KEY (`systemid`) REFERENCES `signatures_platforms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1134279 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `signatures_platforms` +-- + +DROP TABLE IF EXISTS `signatures_platforms`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `signatures_platforms` ( + `id` int NOT NULL AUTO_INCREMENT, + `platform` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `idsignatures_platforms_UNIQUE` (`id`), + KEY `platforms_idx` (`platform`,`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1091 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `signatures_publishers` +-- + +DROP TABLE IF EXISTS `signatures_publishers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `signatures_publishers` ( + `id` int NOT NULL AUTO_INCREMENT, + `publisher` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `id_UNIQUE` (`id`), + KEY `publisher_idx` (`publisher`,`id`) +) ENGINE=InnoDB AUTO_INCREMENT=71898 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `signatures_roms` +-- + +DROP TABLE IF EXISTS `signatures_roms`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `signatures_roms` ( + `id` int NOT NULL AUTO_INCREMENT, + `gameid` int DEFAULT NULL, + `name` varchar(255) DEFAULT NULL, + `size` bigint DEFAULT NULL, + `crc` varchar(20) DEFAULT NULL, + `md5` varchar(100) DEFAULT NULL, + `sha1` varchar(100) DEFAULT NULL, + `developmentstatus` varchar(100) DEFAULT NULL, + `flags` json DEFAULT NULL, + `romtype` int DEFAULT NULL, + `romtypemedia` varchar(100) DEFAULT NULL, + `medialabel` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `id_UNIQUE` (`id`,`gameid`) USING BTREE, + KEY `gameid_idx` (`gameid`), + KEY `flags_idx` ((cast(`flags` as char(255) array))), + CONSTRAINT `gameid` FOREIGN KEY (`gameid`) REFERENCES `signatures_games` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=2587448 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `signatures_sources` +-- + +DROP TABLE IF EXISTS `signatures_sources`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `signatures_sources` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `category` varchar(45) DEFAULT NULL, + `version` varchar(45) DEFAULT NULL, + `author` varchar(255) DEFAULT NULL, + `email` varchar(45) DEFAULT NULL, + `homepage` varchar(45) DEFAULT NULL, + `url` varchar(45) DEFAULT NULL, + `sourcetype` varchar(45) DEFAULT NULL, + `sourcemd5` varchar(45) DEFAULT NULL, + `sourcesha1` varchar(45) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `id_UNIQUE` (`id`), + KEY `sourcemd5_idx` (`sourcemd5`,`id`) USING BTREE, + KEY `sourcesha1_idx` (`sourcesha1`,`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=5968 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2023-02-26 23:40:56 diff --git a/gaseous-tools/gaseous-tools.csproj b/gaseous-tools/gaseous-tools.csproj index 3d07bdc..bf015c7 100644 --- a/gaseous-tools/gaseous-tools.csproj +++ b/gaseous-tools/gaseous-tools.csproj @@ -10,4 +10,12 @@ + + + + + + + + From 4f19c9b8a3d72e29ab4b80edbb209b18cadb7e11 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:00:30 +1100 Subject: [PATCH 29/36] fix: applied an index to the md5 and sha1 columns on the roms signature table --- gaseous-tools/Database/MySQL/gaseous.sql | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gaseous-tools/Database/MySQL/gaseous.sql b/gaseous-tools/Database/MySQL/gaseous.sql index 098b318..83b73cb 100644 --- a/gaseous-tools/Database/MySQL/gaseous.sql +++ b/gaseous-tools/Database/MySQL/gaseous.sql @@ -42,7 +42,7 @@ CREATE TABLE `signatures_games` ( KEY `ingest_idx` (`name`,`year`,`publisherid`,`systemid`,`country`,`language`) USING BTREE, CONSTRAINT `publisher` FOREIGN KEY (`publisherid`) REFERENCES `signatures_publishers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `system` FOREIGN KEY (`systemid`) REFERENCES `signatures_platforms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=1134279 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=1466355 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -58,7 +58,7 @@ CREATE TABLE `signatures_platforms` ( PRIMARY KEY (`id`), UNIQUE KEY `idsignatures_platforms_UNIQUE` (`id`), KEY `platforms_idx` (`platform`,`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1091 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=1231 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -74,7 +74,7 @@ CREATE TABLE `signatures_publishers` ( PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`), KEY `publisher_idx` (`publisher`,`id`) -) ENGINE=InnoDB AUTO_INCREMENT=71898 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=97693 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -100,9 +100,11 @@ CREATE TABLE `signatures_roms` ( PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`,`gameid`) USING BTREE, KEY `gameid_idx` (`gameid`), + KEY `md5_idx` (`md5`) USING BTREE, + KEY `sha1_idx` (`sha1`) USING BTREE, KEY `flags_idx` ((cast(`flags` as char(255) array))), CONSTRAINT `gameid` FOREIGN KEY (`gameid`) REFERENCES `signatures_games` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=2587448 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=3350963 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -129,7 +131,7 @@ CREATE TABLE `signatures_sources` ( UNIQUE KEY `id_UNIQUE` (`id`), KEY `sourcemd5_idx` (`sourcemd5`,`id`) USING BTREE, KEY `sourcesha1_idx` (`sourcesha1`,`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=5968 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=7573 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -141,4 +143,4 @@ CREATE TABLE `signatures_sources` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2023-02-26 23:40:56 +-- Dump completed on 2023-02-27 8:54:22 From a6003372f517895c54c6d6bc203d06f5a9cc5669 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 28 Feb 2023 22:45:14 +1100 Subject: [PATCH 30/36] refactor: added additional hash check on ingestion --- gaseous-signature-ingestor/Program.cs | 319 ++++++++++++++------------ gaseous-tools/Common.cs | 39 ++++ 2 files changed, 207 insertions(+), 151 deletions(-) diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs index 163d953..60a09da 100644 --- a/gaseous-signature-ingestor/Program.cs +++ b/gaseous-signature-ingestor/Program.cs @@ -83,181 +83,198 @@ if (Directory.Exists(tosecXML)) Console.WriteLine("\r " + statusOutput.PadRight(lineFileNameLength, ' ') + "\r"); lineFileNameLength = statusOutput.Length; - Console.WriteLine(" ==> Parsing file"); + // check tosec file md5 + Console.WriteLine(" ==> Checking input file "); + Common.hashObject hashObject = new Common.hashObject(tosecXMLFile); + sql = "SELECT * FROM signatures_sources WHERE sourcemd5=@sourcemd5"; + dbDict = new Dictionary(); + dbDict.Add("sourcemd5", hashObject.md5hash); + sigDB = db.ExecuteCMD(sql, dbDict); - TosecParser tosecParser = new TosecParser(); - RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); - - // store in database - - // store source object - bool processGames = false; - if (tosecObject.SourceMd5 != null) + if (sigDB.Rows.Count == 0) { - sql = "SELECT * FROM signatures_sources WHERE sourcemd5=@sourcemd5"; - dbDict = new Dictionary(); - dbDict.Add("name", Common.ReturnValueIfNull(tosecObject.Name, "")); - dbDict.Add("description", Common.ReturnValueIfNull(tosecObject.Description, "")); - dbDict.Add("category", Common.ReturnValueIfNull(tosecObject.Category, "")); - dbDict.Add("version", Common.ReturnValueIfNull(tosecObject.Version, "")); - dbDict.Add("author", Common.ReturnValueIfNull(tosecObject.Author, "")); - dbDict.Add("email", Common.ReturnValueIfNull(tosecObject.Email, "")); - dbDict.Add("homepage", Common.ReturnValueIfNull(tosecObject.Homepage, "")); - dbDict.Add("uri", Common.ReturnValueIfNull(tosecObject.Url, "")); - dbDict.Add("sourcetype", Common.ReturnValueIfNull(tosecObject.SourceType, "")); - dbDict.Add("sourcemd5", tosecObject.SourceMd5); - dbDict.Add("sourcesha1", tosecObject.SourceSHA1); + // start parsing file + Console.SetCursorPosition(0, Console.CursorTop - 1); + Console.WriteLine(" ==> Parsing file "); + TosecParser tosecParser = new TosecParser(); + RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + // store in database + + // store source object + bool processGames = false; + if (tosecObject.SourceMd5 != null) { - // entry not present, insert it - sql = "INSERT INTO signatures_sources (name, description, category, version, author, email, homepage, url, sourcetype, sourcemd5, sourcesha1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)"; + Console.SetCursorPosition(0, Console.CursorTop - 1); + Console.WriteLine(" ==> Storing file in database "); - db.ExecuteCMD(sql, dbDict); + sql = "SELECT * FROM signatures_sources WHERE sourcemd5=@sourcemd5"; + dbDict = new Dictionary(); + dbDict.Add("name", Common.ReturnValueIfNull(tosecObject.Name, "")); + dbDict.Add("description", Common.ReturnValueIfNull(tosecObject.Description, "")); + dbDict.Add("category", Common.ReturnValueIfNull(tosecObject.Category, "")); + dbDict.Add("version", Common.ReturnValueIfNull(tosecObject.Version, "")); + dbDict.Add("author", Common.ReturnValueIfNull(tosecObject.Author, "")); + dbDict.Add("email", Common.ReturnValueIfNull(tosecObject.Email, "")); + dbDict.Add("homepage", Common.ReturnValueIfNull(tosecObject.Homepage, "")); + dbDict.Add("uri", Common.ReturnValueIfNull(tosecObject.Url, "")); + dbDict.Add("sourcetype", Common.ReturnValueIfNull(tosecObject.SourceType, "")); + dbDict.Add("sourcemd5", tosecObject.SourceMd5); + dbDict.Add("sourcesha1", tosecObject.SourceSHA1); - processGames = true; - } - - if (processGames == true) - { - for (int x = 0; x < tosecObject.Games.Count; ++x) + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) { - RomSignatureObject.Game gameObject = tosecObject.Games[x]; + // entry not present, insert it + sql = "INSERT INTO signatures_sources (name, description, category, version, author, email, homepage, url, sourcetype, sourcemd5, sourcesha1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)"; - // update display - if (showGames == true) + db.ExecuteCMD(sql, dbDict); + + processGames = true; + } + + if (processGames == true) + { + for (int x = 0; x < tosecObject.Games.Count; ++x) { - Console.SetCursorPosition(0, Console.CursorTop - 1); - string statusGameOutput = " ==> " + (x + 1).ToString().PadLeft(7, ' ') + " / " + tosecObject.Games.Count.ToString().PadLeft(7, ' ') + " : " + gameObject.Name; - Console.WriteLine("\r " + statusGameOutput.PadRight(lineGameNameLength, ' ') + "\r"); - lineGameNameLength = statusGameOutput.Length; - } + RomSignatureObject.Game gameObject = tosecObject.Games[x]; - // set up game dictionary - dbDict = new Dictionary(); - dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, "")); - dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, "")); - dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, "")); - dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, "")); - dbDict.Add("demo", (int)gameObject.Demo); - dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, "")); - dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, "")); - dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, "")); - dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, "")); - dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, "")); - dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, "")); - dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, "")); - - // store platform - int gameSystem = 0; - if (gameObject.System != null) - { - sql = "SELECT id FROM signatures_platforms WHERE platform=@platform"; - - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + // update display + if (showGames == true) { - // entry not present, insert it - sql = "INSERT INTO signatures_platforms (platform) VALUES (@platform); SELECT LAST_INSERT_ID()"; - sigDB = db.ExecuteCMD(sql, dbDict); - - gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); - } else - { - gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); + Console.SetCursorPosition(0, Console.CursorTop - 1); + string statusGameOutput = " ==> " + (x + 1).ToString().PadLeft(7, ' ') + " / " + tosecObject.Games.Count.ToString().PadLeft(7, ' ') + " : " + gameObject.Name; + Console.WriteLine("\r " + statusGameOutput.PadRight(lineGameNameLength, ' ') + "\r"); + lineGameNameLength = statusGameOutput.Length; } - } - dbDict.Add("systemid", gameSystem); - // store publisher - int gamePublisher = 0; - if (gameObject.Publisher != null) - { - sql = "SELECT * FROM signatures_publishers WHERE publisher=@publisher"; - - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + // set up game dictionary + dbDict = new Dictionary(); + dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, "")); + dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, "")); + dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, "")); + dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, "")); + dbDict.Add("demo", (int)gameObject.Demo); + dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, "")); + dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, "")); + dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, "")); + dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, "")); + dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, "")); + dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, "")); + dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, "")); + + // store platform + int gameSystem = 0; + if (gameObject.System != null) { - // entry not present, insert it - sql = "INSERT INTO signatures_publishers (publisher) VALUES (@publisher); SELECT LAST_INSERT_ID()"; - sigDB = db.ExecuteCMD(sql, dbDict); - gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); - } - else - { - gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); - } - } - dbDict.Add("publisherid", gamePublisher); - - // store game - int gameId = 0; - sql = "SELECT * FROM signatures_games WHERE name=@name AND year=@year AND publisherid=@publisher AND systemid=@systemid AND country=@country AND language=@language"; - - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) - { - // entry not present, insert it - sql = "INSERT INTO signatures_games " + - "(name, description, year, publisherid, demo, systemid, systemvariant, video, country, language, copyright) VALUES " + - "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT LAST_INSERT_ID()"; - sigDB = db.ExecuteCMD(sql, dbDict); - - gameId = int.Parse(sigDB.Rows[0][0].ToString()); - } - else - { - gameId = int.Parse(sigDB.Rows[0][0].ToString()); - } - - // store rom - foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) - { - if (romObject.Md5 != null) - { - int romId = 0; - sql = "SELECT * FROM signatures_roms WHERE gameid=@gameid AND md5=@md5"; - dbDict = new Dictionary(); - dbDict.Add("gameid", gameId); - dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, "")); - dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, "")); - dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "")); - dbDict.Add("md5", romObject.Md5); - dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "")); - dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); - - if (romObject.flags != null) - { - if (romObject.flags.Count > 0) - { - dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags)); - } else - { - dbDict.Add("flags", "[ ]"); - } - } - else - { - dbDict.Add("flags", "[ ]"); - } - dbDict.Add("romtype", (int)romObject.RomType); - dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, "")); - dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, "")); + sql = "SELECT id FROM signatures_platforms WHERE platform=@platform"; sigDB = db.ExecuteCMD(sql, dbDict); if (sigDB.Rows.Count == 0) { // entry not present, insert it - sql = "INSERT INTO signatures_roms (gameid, name, size, crc, md5, sha1, developmentstatus, flags, romtype, romtypemedia, medialabel) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel); SELECT LAST_INSERT_ID()"; + sql = "INSERT INTO signatures_platforms (platform) VALUES (@platform); SELECT LAST_INSERT_ID()"; sigDB = db.ExecuteCMD(sql, dbDict); - - romId = int.Parse(sigDB.Rows[0][0].ToString()); + gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); } else { - romId = int.Parse(sigDB.Rows[0][0].ToString()); + gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); + } + } + dbDict.Add("systemid", gameSystem); + + // store publisher + int gamePublisher = 0; + if (gameObject.Publisher != null) + { + sql = "SELECT * FROM signatures_publishers WHERE publisher=@publisher"; + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_publishers (publisher) VALUES (@publisher); SELECT LAST_INSERT_ID()"; + sigDB = db.ExecuteCMD(sql, dbDict); + gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); + } + else + { + gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); + } + } + dbDict.Add("publisherid", gamePublisher); + + // store game + int gameId = 0; + sql = "SELECT * FROM signatures_games WHERE name=@name AND year=@year AND publisherid=@publisher AND systemid=@systemid AND country=@country AND language=@language"; + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_games " + + "(name, description, year, publisherid, demo, systemid, systemvariant, video, country, language, copyright) VALUES " + + "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT LAST_INSERT_ID()"; + sigDB = db.ExecuteCMD(sql, dbDict); + + gameId = int.Parse(sigDB.Rows[0][0].ToString()); + } + else + { + gameId = int.Parse(sigDB.Rows[0][0].ToString()); + } + + // store rom + foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) + { + if (romObject.Md5 != null) + { + int romId = 0; + sql = "SELECT * FROM signatures_roms WHERE gameid=@gameid AND md5=@md5"; + dbDict = new Dictionary(); + dbDict.Add("gameid", gameId); + dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, "")); + dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, "")); + dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "")); + dbDict.Add("md5", romObject.Md5); + dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "")); + dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); + + if (romObject.flags != null) + { + if (romObject.flags.Count > 0) + { + dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags)); + } + else + { + dbDict.Add("flags", "[ ]"); + } + } + else + { + dbDict.Add("flags", "[ ]"); + } + dbDict.Add("romtype", (int)romObject.RomType); + dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, "")); + dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, "")); + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO signatures_roms (gameid, name, size, crc, md5, sha1, developmentstatus, flags, romtype, romtypemedia, medialabel) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel); SELECT LAST_INSERT_ID()"; + sigDB = db.ExecuteCMD(sql, dbDict); + + + romId = int.Parse(sigDB.Rows[0][0].ToString()); + } + else + { + romId = int.Parse(sigDB.Rows[0][0].ToString()); + } } } } diff --git a/gaseous-tools/Common.cs b/gaseous-tools/Common.cs index 756e410..00bc713 100644 --- a/gaseous-tools/Common.cs +++ b/gaseous-tools/Common.cs @@ -1,4 +1,6 @@ using System; +using System.Security.Cryptography; + namespace gaseous_tools { public class Common @@ -19,6 +21,43 @@ namespace gaseous_tools return ObjectToCheck; } } + + public class hashObject + { + public hashObject(string FileName) + { + var xmlStream = File.OpenRead(FileName); + + var md5 = MD5.Create(); + byte[] md5HashByte = md5.ComputeHash(xmlStream); + string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + _md5hash = md5hash; + + var sha1 = SHA1.Create(); + byte[] sha1HashByte = sha1.ComputeHash(xmlStream); + string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); + _sha1hash = sha1hash; + } + + string _md5hash = ""; + string _sha1hash = ""; + + public string md5hash + { + get + { + return _md5hash; + } + } + + public string sha1hash + { + get + { + return _sha1hash; + } + } + } } } From 055d09d77a3f16f9e5feec070edca1dda8c1207f Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:22:19 +1100 Subject: [PATCH 31/36] feat: Added config file class to keep track of local settings such as database connectivity --- gaseous-signature-ingestor/Program.cs | 11 +-- gaseous-tools/Config.cs | 112 ++++++++++++++++++++++++++ gaseous-tools/gaseous-tools.csproj | 1 + 3 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 gaseous-tools/Config.cs diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs index 60a09da..878bfb9 100644 --- a/gaseous-signature-ingestor/Program.cs +++ b/gaseous-signature-ingestor/Program.cs @@ -6,8 +6,6 @@ using gaseous_signature_parser.parsers; using gaseous_tools; using MySqlX.XDevAPI; -string configPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gaseous-server"); - // process command line string[] commandLineArgs = Environment.GetCommandLineArgs(); @@ -47,15 +45,14 @@ foreach (string commandLineArg in commandLineArgs) } } -// check if configPath is valid and create it if not -if (!Directory.Exists(configPath)) +// check if Config.ConfigurationPath is valid and create it if not +if (!Directory.Exists(Config.ConfigurationPath)) { - Directory.CreateDirectory(configPath); + Directory.CreateDirectory(Config.ConfigurationPath); } // connect to database -string cs = @"server=localhost;userid=gaseous;password=gaseous;database=gaseous"; -Database db = new gaseous_tools.Database(Database.databaseType.MySql, cs); +Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); // process provided files Console.WriteLine("Processing input files:"); diff --git a/gaseous-tools/Config.cs b/gaseous-tools/Config.cs new file mode 100644 index 0000000..c9e8e4e --- /dev/null +++ b/gaseous-tools/Config.cs @@ -0,0 +1,112 @@ +using System; +using Newtonsoft.Json; + +namespace gaseous_tools +{ + public static class Config + { + static ConfigFile _config; + + public static string ConfigurationPath + { + get + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gaseous-server"); + } + } + + static string ConfigurationFilePath + { + get + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gaseous-server", "config.json"); + } + } + + static string ConfigurationFilePath_Backup + { + get + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".gaseous-server", "config.json.backup"); + } + } + + public static ConfigFile.Database DatabaseConfiguration + { + get + { + return _config.DatabaseConfiguration; + } + } + + static Config() + { + if (_config == null) + { + // load the config file + if (File.Exists(ConfigurationFilePath)) + { + string configRaw = File.ReadAllText(ConfigurationFilePath); + ConfigFile? _tempConfig = Newtonsoft.Json.JsonConvert.DeserializeObject(configRaw); + if (_tempConfig != null) + { + _config = _tempConfig; + } else + { + throw new Exception("There was an error reading the config file: Json returned null"); + } + } else + { + // no config file! + // use defaults and save + _config = new ConfigFile(); + string configRaw = Newtonsoft.Json.JsonConvert.SerializeObject(_config, Newtonsoft.Json.Formatting.Indented); + File.WriteAllText(ConfigurationFilePath, configRaw); + } + } + + Console.WriteLine("Using configuration:"); + Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(_config, Formatting.Indented)); + } + + public static void UpdateConfig() + { + // save any updates to the configuration + string configRaw = Newtonsoft.Json.JsonConvert.SerializeObject(_config, Newtonsoft.Json.Formatting.Indented); + if (File.Exists(ConfigurationFilePath_Backup)) + { + File.Delete(ConfigurationFilePath_Backup); + } + if (File.Exists(ConfigurationFilePath)) + { + File.Move(ConfigurationFilePath, ConfigurationFilePath_Backup); + } + File.WriteAllText(ConfigurationFilePath, configRaw); + } + + public class ConfigFile + { + public Database DatabaseConfiguration = new Database(); + + public class Database + { + public string HostName = "localhost"; + public string UserName = "gaseous"; + public string Password = "gaseous"; + public string DatabaseName = "gaseous"; + public int Port = 3306; + + [JsonIgnore] + public string ConnectionString + { + get + { + string dbConnString = "server=" + HostName + ";port=" + Port + ";userid=" + UserName + ";password=" + Password + ";database=" + DatabaseName + ""; + return dbConnString; + } + } + } + } + } +} + diff --git a/gaseous-tools/gaseous-tools.csproj b/gaseous-tools/gaseous-tools.csproj index bf015c7..5420952 100644 --- a/gaseous-tools/gaseous-tools.csproj +++ b/gaseous-tools/gaseous-tools.csproj @@ -9,6 +9,7 @@ + From 85726ada7aa582f3da3ed36a24e8ba341126dacf Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 1 Mar 2023 11:50:58 +1100 Subject: [PATCH 32/36] feat: added capability of creating/updating the database schema --- gaseous-signature-ingestor/Program.cs | 2 + gaseous-tools/Database.cs | 78 ++++++++++++++++++- .../MySQL/{gaseous.sql => gaseous-1000.sql} | 0 gaseous-tools/gaseous-tools.csproj | 4 + 4 files changed, 81 insertions(+), 3 deletions(-) rename gaseous-tools/Database/MySQL/{gaseous.sql => gaseous-1000.sql} (100%) diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs index 878bfb9..e40afb1 100644 --- a/gaseous-signature-ingestor/Program.cs +++ b/gaseous-signature-ingestor/Program.cs @@ -53,6 +53,8 @@ if (!Directory.Exists(Config.ConfigurationPath)) // connect to database Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); +// initialise the db +db.InitDB(); // process provided files Console.WriteLine("Processing input files:"); diff --git a/gaseous-tools/Database.cs b/gaseous-tools/Database.cs index 31e1bc1..81ffa47 100644 --- a/gaseous-tools/Database.cs +++ b/gaseous-tools/Database.cs @@ -2,6 +2,7 @@ using System.Data; using System.Data.SqlClient; using System.Diagnostics; +using System.Reflection; using MySql.Data.MySqlClient; namespace gaseous_tools @@ -52,13 +53,84 @@ namespace gaseous_tools } } + public void InitDB() + { + // load resources + var assembly = Assembly.GetExecutingAssembly(); - public DataTable ExecuteCMD(string Command, Dictionary Parameters, int Timeout = 30) - { switch (_ConnectorType) { case databaseType.MySql: - MySQLServerConnector conn = new MySQLServerConnector(_ConnectionString); + // check if the database exists first - first run must have permissions to create a database + string sql = "CREATE DATABASE IF NOT EXISTS `" + Config.DatabaseConfiguration.DatabaseName + "`;"; + Dictionary dbDict = new Dictionary(); + ExecuteCMD(sql, dbDict, 30, "server=" + Config.DatabaseConfiguration.HostName + ";port=" + Config.DatabaseConfiguration.Port + ";userid=" + Config.DatabaseConfiguration.UserName + ";password=" + Config.DatabaseConfiguration.Password); + + // check if schema version table is in place - if not, create the schema version table + sql = "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'gaseous' AND TABLE_NAME = 'schema_version';"; + DataTable SchemaVersionPresent = ExecuteCMD(sql, dbDict); + if (SchemaVersionPresent.Rows.Count == 0) + { + // no schema table present - create it + sql = "CREATE TABLE `schema_version` (`schema_version` INT NOT NULL, PRIMARY KEY (`schema_version`)); INSERT INTO `schema_version` (`schema_version`) VALUES (0);"; + ExecuteCMD(sql, dbDict); + } + + for (int i = 1000; i < 10000; i++) + { + string resourceName = "gaseous_tools.Database.MySQL.gaseous-" + i + ".sql"; + string dbScript = ""; + + try + { + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + dbScript = reader.ReadToEnd(); + + // apply script + sql = "SELECT schema_version FROM schema_version;"; + DataTable SchemaVersion = ExecuteCMD(sql, dbDict); + if (SchemaVersion.Rows.Count == 0) + { + // something is broken here... where's the table? + throw new Exception("schema_version table is missing!"); + } + else + { + int SchemaVer = (int)SchemaVersion.Rows[0][0]; + if (SchemaVer < i) + { + // apply schema! + ExecuteCMD(dbScript, dbDict); + + sql = "UPDATE schema_version SET schema_version=@schemaver"; + dbDict.Add("schemaver", i); + ExecuteCMD(sql, dbDict); + } + if (SchemaVer == i) + { + // no more updates, no point looping anymore + break; + } + } + } + } catch + { + break; + } + } + break; + } + } + + public DataTable ExecuteCMD(string Command, Dictionary Parameters, int Timeout = 30, string ConnectionString = "") + { + if (ConnectionString == "") { ConnectionString = _ConnectionString; } + switch (_ConnectorType) + { + case databaseType.MySql: + MySQLServerConnector conn = new MySQLServerConnector(ConnectionString); return (DataTable)conn.ExecCMD(Command, Parameters, Timeout); default: return new DataTable(); diff --git a/gaseous-tools/Database/MySQL/gaseous.sql b/gaseous-tools/Database/MySQL/gaseous-1000.sql similarity index 100% rename from gaseous-tools/Database/MySQL/gaseous.sql rename to gaseous-tools/Database/MySQL/gaseous-1000.sql diff --git a/gaseous-tools/gaseous-tools.csproj b/gaseous-tools/gaseous-tools.csproj index 5420952..c3b885a 100644 --- a/gaseous-tools/gaseous-tools.csproj +++ b/gaseous-tools/gaseous-tools.csproj @@ -14,9 +14,13 @@ + + + + From 39e0bd97402ca1e60e99cfa63e52af730d305fe1 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 1 Mar 2023 12:34:28 +1100 Subject: [PATCH 33/36] =?UTF-8?q?refactor:=20check=20for=20the=20existance?= =?UTF-8?q?=20of=20a=20database=20upgrade=20script=20rather=20than=20swall?= =?UTF-8?q?ow=20an=20error=20that=20it=20doesn=E2=80=99t=20exist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gaseous-tools/Database.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gaseous-tools/Database.cs b/gaseous-tools/Database.cs index 81ffa47..9f87e3c 100644 --- a/gaseous-tools/Database.cs +++ b/gaseous-tools/Database.cs @@ -81,7 +81,8 @@ namespace gaseous_tools string resourceName = "gaseous_tools.Database.MySQL.gaseous-" + i + ".sql"; string dbScript = ""; - try + string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames(); + if (resources.Contains(resourceName)) { using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) @@ -115,9 +116,6 @@ namespace gaseous_tools } } } - } catch - { - break; } } break; From 959f6f2419a5a47eb59ab616cedf5cdd574a4ac8 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:27:42 +1100 Subject: [PATCH 34/36] refactor: better casting of int types from database --- gaseous-signature-ingestor/Program.cs | 16 +- .../Parsers/TosecParser.cs | 237 +++++++++--------- 2 files changed, 132 insertions(+), 121 deletions(-) diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs index e40afb1..6746f5f 100644 --- a/gaseous-signature-ingestor/Program.cs +++ b/gaseous-signature-ingestor/Program.cs @@ -175,11 +175,11 @@ if (Directory.Exists(tosecXML)) sql = "INSERT INTO signatures_platforms (platform) VALUES (@platform); SELECT LAST_INSERT_ID()"; sigDB = db.ExecuteCMD(sql, dbDict); - gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); + gameSystem = (int)sigDB.Rows[0][0]; } else { - gameSystem = int.Parse(sigDB.Rows[0][0].ToString()); + gameSystem = (int)sigDB.Rows[0][0]; } } dbDict.Add("systemid", gameSystem); @@ -196,11 +196,11 @@ if (Directory.Exists(tosecXML)) // entry not present, insert it sql = "INSERT INTO signatures_publishers (publisher) VALUES (@publisher); SELECT LAST_INSERT_ID()"; sigDB = db.ExecuteCMD(sql, dbDict); - gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); + gamePublisher = (int)sigDB.Rows[0][0]; } else { - gamePublisher = int.Parse(sigDB.Rows[0][0].ToString()); + gamePublisher = (int)sigDB.Rows[0][0]; } } dbDict.Add("publisherid", gamePublisher); @@ -218,11 +218,11 @@ if (Directory.Exists(tosecXML)) "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT LAST_INSERT_ID()"; sigDB = db.ExecuteCMD(sql, dbDict); - gameId = int.Parse(sigDB.Rows[0][0].ToString()); + gameId = (int)sigDB.Rows[0][0]; } else { - gameId = int.Parse(sigDB.Rows[0][0].ToString()); + gameId = (int)sigDB.Rows[0][0]; } // store rom @@ -268,11 +268,11 @@ if (Directory.Exists(tosecXML)) sigDB = db.ExecuteCMD(sql, dbDict); - romId = int.Parse(sigDB.Rows[0][0].ToString()); + romId = (int)sigDB.Rows[0][0]; } else { - romId = int.Parse(sigDB.Rows[0][0].ToString()); + romId = (int)sigDB.Rows[0][0]; } } } diff --git a/gaseous-signature-parser/Parsers/TosecParser.cs b/gaseous-signature-parser/Parsers/TosecParser.cs index 73a43e3..d63c4f8 100644 --- a/gaseous-signature-parser/Parsers/TosecParser.cs +++ b/gaseous-signature-parser/Parsers/TosecParser.cs @@ -351,131 +351,142 @@ namespace gaseous_signature_parser.parsers case "rom": RomSignatureObject.Game.Rom romObject = new RomSignatureObject.Game.Rom(); - romObject.Name = xmlGameDetail.Attributes["name"]?.Value; - romObject.Size = UInt64.Parse(xmlGameDetail.Attributes["size"]?.Value); - romObject.Crc = xmlGameDetail.Attributes["crc"]?.Value; - romObject.Md5 = xmlGameDetail.Attributes["md5"]?.Value; - romObject.Sha1 = xmlGameDetail.Attributes["sha1"]?.Value; - - // parse name - string[] romNameTokens = romDescription.Split("("); - foreach (string rawToken in romNameTokens) { - string[] tokenSplit = rawToken.Split("["); - - // replace the extra closing bracket - string token = tokenSplit[0].Replace(")", "").Trim(); - - // check for copyright - if (TOSECDevelopment.ContainsKey(token)) + if (xmlGameDetail != null) + { + romObject.Name = xmlGameDetail.Attributes["name"]?.Value; + if (xmlGameDetail.Attributes["size"]?.Value != null) { - romObject.DevelopmentStatus = token; + romObject.Size = UInt64.Parse(xmlGameDetail.Attributes["size"]?.Value); } - - // check for media type - if (token.StartsWith("Disc") || - token.StartsWith("Disk") || - token.StartsWith("File") || - token.StartsWith("Part") || - token.StartsWith("Side") || - token.StartsWith("Tape")) + else { - string[] tokens = token.Split(" "); - switch (tokens[0]) + romObject.Size = 0; + } + romObject.Crc = xmlGameDetail.Attributes["crc"]?.Value; + romObject.Md5 = xmlGameDetail.Attributes["md5"]?.Value; + romObject.Sha1 = xmlGameDetail.Attributes["sha1"]?.Value; + + // parse name + string[] romNameTokens = romDescription.Split("("); + foreach (string rawToken in romNameTokens) + { + string[] tokenSplit = rawToken.Split("["); + + // replace the extra closing bracket + string token = tokenSplit[0].Replace(")", "").Trim(); + + // check for copyright + if (TOSECDevelopment.ContainsKey(token)) { - case "Disc": - romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Disc; - break; - case "Disk": - romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Disk; - break; - case "File": - romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.File; - break; - case "Part": - romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Part; - break; - case "Side": - romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Side; - break; - case "Tape": - romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Tape; - break; + romObject.DevelopmentStatus = token; } - romObject.RomTypeMedia = token; - } - // check for media label - if (token.Length > 0 && - (token + ")") == gameNameTokens.Last() && - ( - token != romObject.RomTypeMedia && - token != gameObject.Publisher && - token != gameObject.SystemVariant && - token != gameObject.Video && - token != gameObject.Country && - token != gameObject.Copyright && - token != gameObject.Language && - token != romObject.DevelopmentStatus - ) - ) - { - // likely the media label? - romObject.MediaLabel = token; - } - - // process dump flags - if (rawToken.IndexOf("[") > 0) - { - // has dump flags - string rawDumpFlags = rawToken.Substring(rawToken.IndexOf("[")); - string[] dumpFlags = rawDumpFlags.Split("["); - foreach (string dumpFlag in dumpFlags) + // check for media type + if (token.StartsWith("Disc") || + token.StartsWith("Disk") || + token.StartsWith("File") || + token.StartsWith("Part") || + token.StartsWith("Side") || + token.StartsWith("Tape")) { - string dToken = dumpFlag.Replace("]", ""); - if (dToken.Length > 0) + string[] tokens = token.Split(" "); + switch (tokens[0]) { - string[] dTokenCompare = dToken.Split(" "); - if (dTokenCompare[0].Trim().ToLower().StartsWith("a")) - { - romObject.flags.Add(dTokenCompare[0].Trim()); - } - else - { + case "Disc": + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Disc; + break; + case "Disk": + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Disk; + break; + case "File": + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.File; + break; + case "Part": + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Part; + break; + case "Side": + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Side; + break; + case "Tape": + romObject.RomType = RomSignatureObject.Game.Rom.RomTypes.Tape; + break; + } + romObject.RomTypeMedia = token; + } - switch (dTokenCompare[0].Trim().ToLower()) + // check for media label + if (token.Length > 0 && + (token + ")") == gameNameTokens.Last() && + ( + token != romObject.RomTypeMedia && + token != gameObject.Publisher && + token != gameObject.SystemVariant && + token != gameObject.Video && + token != gameObject.Country && + token != gameObject.Copyright && + token != gameObject.Language && + token != romObject.DevelopmentStatus + ) + ) + { + // likely the media label? + romObject.MediaLabel = token; + } + + // process dump flags + if (rawToken.IndexOf("[") > 0) + { + // has dump flags + string rawDumpFlags = rawToken.Substring(rawToken.IndexOf("[")); + string[] dumpFlags = rawDumpFlags.Split("["); + foreach (string dumpFlag in dumpFlags) + { + string dToken = dumpFlag.Replace("]", ""); + if (dToken.Length > 0) + { + string[] dTokenCompare = dToken.Split(" "); + if (dTokenCompare[0].Trim().ToLower().StartsWith("a")) { - case "cr": - // cracked - case "f": - // fixed - case "h": - // hacked - case "m": - // modified - case "p": - // pirated - case "t": - // trained - case "tr": - // translated - case "o": - // overdump - case "u": - // underdump - case "v": - // virus - case "b": - // bad dump - case "a": - // alternate - case "!": - // known verified dump - // ------------------- - romObject.flags.Add(dToken); - break; + romObject.flags.Add(dTokenCompare[0].Trim()); } + else + { + + switch (dTokenCompare[0].Trim().ToLower()) + { + case "cr": + // cracked + case "f": + // fixed + case "h": + // hacked + case "m": + // modified + case "p": + // pirated + case "t": + // trained + case "tr": + // translated + case "o": + // overdump + case "u": + // underdump + case "v": + // virus + case "b": + // bad dump + case "a": + // alternate + case "!": + // known verified dump + // ------------------- + romObject.flags.Add(dToken); + break; + } + } + } - } } } From 8175b4b6e6d8dd796e80d62af66f0dda61ff9404 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 7 Mar 2023 10:53:46 +1100 Subject: [PATCH 35/36] feat: initial signature look up support --- .github/dependabot.yml | 11 +++ .vscode/launch.json | 35 +++++++ .vscode/tasks.json | 41 ++++++++ Gaseous.sln | 12 +++ .../Controllers/SignaturesController.cs | 92 +++++++++++++++++ gaseous-server/Models/Signatures_Games.cs | 98 +++++++++++++++++++ gaseous-server/Models/Signatures_Status.cs | 63 ++++++++++++ gaseous-server/Program.cs | 38 +++++++ gaseous-server/Properties/launchSettings.json | 41 ++++++++ gaseous-server/appsettings.Development.json | 9 ++ gaseous-server/appsettings.json | 10 ++ gaseous-server/gaseous-server.csproj | 34 +++++++ gaseous-tools/Database.cs | 30 ++++-- 13 files changed, 507 insertions(+), 7 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 gaseous-server/Controllers/SignaturesController.cs create mode 100644 gaseous-server/Models/Signatures_Games.cs create mode 100644 gaseous-server/Models/Signatures_Status.cs create mode 100644 gaseous-server/Program.cs create mode 100644 gaseous-server/Properties/launchSettings.json create mode 100644 gaseous-server/appsettings.Development.json create mode 100644 gaseous-server/appsettings.json create mode 100644 gaseous-server/gaseous-server.csproj diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..8c23067 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "nuget" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6d9f542 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/gaseous-server/bin/Debug/net7.0/gaseous-server.dll", + "args": [], + "cwd": "${workspaceFolder}/gaseous-server", + "stopAtEntry": false, + // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser + "serverReadyAction": { + "action": "openExternally", + "pattern": "\\bNow listening on:\\s+(https?://\\S+)" + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..04fd839 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/gaseous-server/gaseous-server.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/gaseous-server/gaseous-server.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/gaseous-server/gaseous-server.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Gaseous.sln b/Gaseous.sln index d15120a..f7adb01 100644 --- a/Gaseous.sln +++ b/Gaseous.sln @@ -13,6 +13,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-signature-ingestor" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-tools", "gaseous-tools\gaseous-tools.csproj", "{08FE408A-5EC1-4110-ABD8-D19A1155B8CE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-server", "gaseous-server\gaseous-server.csproj", "{A01D2EFF-C82E-473B-84D7-7C25E736F5D2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{B07A4655-A003-416B-A790-ADAA5B548E1A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -47,6 +51,14 @@ Global {08FE408A-5EC1-4110-ABD8-D19A1155B8CE}.Debug|Any CPU.Build.0 = Debug|Any CPU {08FE408A-5EC1-4110-ABD8-D19A1155B8CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {08FE408A-5EC1-4110-ABD8-D19A1155B8CE}.Release|Any CPU.Build.0 = Release|Any CPU + {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Release|Any CPU.Build.0 = Release|Any CPU + {B07A4655-A003-416B-A790-ADAA5B548E1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B07A4655-A003-416B-A790-ADAA5B548E1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B07A4655-A003-416B-A790-ADAA5B548E1A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B07A4655-A003-416B-A790-ADAA5B548E1A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/gaseous-server/Controllers/SignaturesController.cs b/gaseous-server/Controllers/SignaturesController.cs new file mode 100644 index 0000000..7f69893 --- /dev/null +++ b/gaseous-server/Controllers/SignaturesController.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Security.Cryptography; +using System.Threading.Tasks; +using gaseous_tools; +using Microsoft.AspNetCore.Mvc; + +// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 + +namespace gaseous_server.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class SignaturesController : ControllerBase + { + /// + /// Get the current signature counts from the database + /// + /// Number of sources, publishers, games, and rom signatures in the database + [HttpGet] + public Models.Signatures_Status Status() + { + return new Models.Signatures_Status(); + } + + [HttpGet] + [Route("api/[controller]/[action]")] + public List GetSignature(string md5 = "", string sha1 = "") + { + if (md5.Length > 0) + { + return _GetSignature("signatures_roms.md5 = @searchstring", md5); + } else + { + return _GetSignature("signatures_roms.sha1 = @searchstring", sha1); + } + } + + private List _GetSignature(string sqlWhere, string searchString) + { + Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT \n view_signatures_games.*,\n signatures_roms.id AS romid,\n signatures_roms.name AS romname,\n signatures_roms.size,\n signatures_roms.crc,\n signatures_roms.md5,\n signatures_roms.sha1,\n signatures_roms.developmentstatus,\n signatures_roms.flags,\n signatures_roms.romtype,\n signatures_roms.romtypemedia,\n signatures_roms.medialabel\nFROM\n signatures_roms\n INNER JOIN\n view_signatures_games ON signatures_roms.gameid = view_signatures_games.id WHERE " + sqlWhere; + Dictionary dbDict = new Dictionary(); + dbDict.Add("searchString", searchString); + + DataTable sigDb = db.ExecuteCMD(sql, dbDict); + + List GamesList = new List(); + + foreach (DataRow sigDbRow in sigDb.Rows) + { + Models.Signatures_Games gameItem = new Models.Signatures_Games + { + Game = new Models.Signatures_Games.GameItem + { + Id = (Int32)sigDbRow["id"], + Name = (string)sigDbRow["name"], + Description = (string)sigDbRow["description"], + Year = (string)sigDbRow["year"], + Publisher = (string)sigDbRow["publisher"], + Demo = (Models.Signatures_Games.GameItem.DemoTypes)(int)sigDbRow["demo"], + System = (string)sigDbRow["platform"], + SystemVariant = (string)sigDbRow["systemvariant"], + Video = (string)sigDbRow["video"], + Country = (string)sigDbRow["country"], + Language = (string)sigDbRow["language"], + Copyright = (string)sigDbRow["copyright"] + }, + Rom = new Models.Signatures_Games.RomItem + { + Id = (Int32)sigDbRow["romid"], + Name = (string)sigDbRow["romname"], + Size = (Int64)sigDbRow["size"], + Crc = (string)sigDbRow["crc"], + Md5 = (string)sigDbRow["md5"], + Sha1 = (string)sigDbRow["sha1"], + DevelopmentStatus = (string)sigDbRow["developmentstatus"], + flags = Newtonsoft.Json.JsonConvert.DeserializeObject>((string)sigDbRow["flags"]), + RomType = (Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["romtype"], + RomTypeMedia = (string)sigDbRow["romtypemedia"], + MediaLabel = (string)sigDbRow["medialabel"] + } + }; + GamesList.Add(gameItem); + } + return GamesList; + } + } +} + diff --git a/gaseous-server/Models/Signatures_Games.cs b/gaseous-server/Models/Signatures_Games.cs new file mode 100644 index 0000000..9765714 --- /dev/null +++ b/gaseous-server/Models/Signatures_Games.cs @@ -0,0 +1,98 @@ +using System; +using static gaseous_romsignatureobject.RomSignatureObject.Game; + +namespace gaseous_server.Models +{ + public class Signatures_Games + { + public Signatures_Games() + { + } + + public GameItem? Game { get; set; } + public RomItem? Rom { get; set; } + + public class GameItem + { + public Int32? Id { get; set; } + public string? Name { get; set; } + public string? Description { get; set; } + public string? Year { get; set; } + public string? Publisher { get; set; } + public DemoTypes Demo { get; set; } + public string? System { get; set; } + public string? SystemVariant { get; set; } + public string? Video { get; set; } + public string? Country { get; set; } + public string? Language { get; set; } + public string? Copyright { get; set; } + + public enum DemoTypes + { + NotDemo = 0, + demo = 1, + demo_kiosk = 2, + demo_playable = 3, + demo_rolling = 4, + demo_slideshow = 5 + } + } + + public class RomItem + { + public Int32? Id { get; set; } + public string? Name { get; set; } + public Int64? Size { get; set; } + public string? Crc { get; set; } + public string? Md5 { get; set; } + public string? Sha1 { get; set; } + + public string? DevelopmentStatus { get; set; } + + public List flags { get; set; } = new List(); + + public RomTypes RomType { get; set; } + public string? RomTypeMedia { get; set; } + public string? MediaLabel { get; set; } + + public enum RomTypes + { + /// + /// Media type is unknown + /// + Unknown = 0, + + /// + /// Optical media + /// + Disc = 1, + + /// + /// Magnetic media + /// + Disk = 2, + + /// + /// Individual files + /// + File = 3, + + /// + /// Individual pars + /// + Part = 4, + + /// + /// Tape base media + /// + Tape = 5, + + /// + /// Side of the media + /// + Side = 6 + } + } + } +} + diff --git a/gaseous-server/Models/Signatures_Status.cs b/gaseous-server/Models/Signatures_Status.cs new file mode 100644 index 0000000..8d2c904 --- /dev/null +++ b/gaseous-server/Models/Signatures_Status.cs @@ -0,0 +1,63 @@ +using System; +using System.Data; +using gaseous_tools; + +namespace gaseous_server.Models +{ + public class Signatures_Status + { + + private Int64 _SourceCount = 0; + private Int64 _PlatformCount = 0; + private Int64 _GameCount = 0; + private Int64 _RomCount = 0; + + public Signatures_Status() + { + Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "select (select count(*) from signatures_sources) as SourceCount, (select count(*) from signatures_platforms) as PlatformCount, (select count(*) from signatures_games) as GameCount, (select count(*) from signatures_roms) as RomCount;"; + + DataTable sigDb = db.ExecuteCMD(sql); + if (sigDb.Rows.Count > 0) + { + _SourceCount = (Int64)sigDb.Rows[0]["SourceCount"]; + _PlatformCount = (Int64)sigDb.Rows[0]["PlatformCount"]; + _GameCount = (Int64)sigDb.Rows[0]["GameCount"]; + _RomCount = (Int64)sigDb.Rows[0]["RomCount"]; + } + } + + public Int64 Sources + { + get + { + return _SourceCount; + } + } + + public Int64 Platforms + { + get + { + return _PlatformCount; + } + } + + public Int64 Games + { + get + { + return _GameCount; + } + } + + public Int64 Roms + { + get + { + return _RomCount; + } + } + } +} + diff --git a/gaseous-server/Program.cs b/gaseous-server/Program.cs new file mode 100644 index 0000000..6fd856e --- /dev/null +++ b/gaseous-server/Program.cs @@ -0,0 +1,38 @@ +using System.Text.Json.Serialization; +using gaseous_tools; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddControllers().AddJsonOptions(x => +{ + // serialize enums as strings in api responses (e.g. Role) + x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); +}); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +// set up db +Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); +db.InitDB(); + +// start the app +app.Run(); + diff --git a/gaseous-server/Properties/launchSettings.json b/gaseous-server/Properties/launchSettings.json new file mode 100644 index 0000000..6cb3fd1 --- /dev/null +++ b/gaseous-server/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:38715", + "sslPort": 44314 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5198", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true + }, + "https": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7282;http://localhost:5198", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/gaseous-server/appsettings.Development.json b/gaseous-server/appsettings.Development.json new file mode 100644 index 0000000..ce16a2e --- /dev/null +++ b/gaseous-server/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} + diff --git a/gaseous-server/appsettings.json b/gaseous-server/appsettings.json new file mode 100644 index 0000000..af0538f --- /dev/null +++ b/gaseous-server/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} + diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj new file mode 100644 index 0000000..35f78b0 --- /dev/null +++ b/gaseous-server/gaseous-server.csproj @@ -0,0 +1,34 @@ + + + + net7.0 + enable + enable + gaseous_server + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gaseous-tools/Database.cs b/gaseous-tools/Database.cs index 9f87e3c..db1f2c6 100644 --- a/gaseous-tools/Database.cs +++ b/gaseous-tools/Database.cs @@ -122,17 +122,33 @@ namespace gaseous_tools } } + public DataTable ExecuteCMD(string Command) + { + Dictionary dbDict = new Dictionary(); + return _ExecuteCMD(Command, dbDict, 30, ""); + } + + public DataTable ExecuteCMD(string Command, Dictionary Parameters) + { + return _ExecuteCMD(Command, Parameters, 30, ""); + } + public DataTable ExecuteCMD(string Command, Dictionary Parameters, int Timeout = 30, string ConnectionString = "") { - if (ConnectionString == "") { ConnectionString = _ConnectionString; } + return _ExecuteCMD(Command, Parameters, Timeout, ConnectionString); + } + + private DataTable _ExecuteCMD(string Command, Dictionary Parameters, int Timeout = 30, string ConnectionString = "") + { + if (ConnectionString == "") { ConnectionString = _ConnectionString; } switch (_ConnectorType) - { - case databaseType.MySql: + { + case databaseType.MySql: MySQLServerConnector conn = new MySQLServerConnector(ConnectionString); - return (DataTable)conn.ExecCMD(Command, Parameters, Timeout); - default: - return new DataTable(); - } + return (DataTable)conn.ExecCMD(Command, Parameters, Timeout); + default: + return new DataTable(); + } } private partial class MySQLServerConnector From d484ee32cb31e4e4ebf6f122c1d1266c0cf2e995 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Tue, 7 Mar 2023 10:59:19 +1100 Subject: [PATCH 36/36] fix: fixed database upgrade bug --- gaseous-tools/Database.cs | 5 ---- gaseous-tools/Database/MySQL/gaseous-1001.sql | 25 +++++++++++++++++++ gaseous-tools/gaseous-tools.csproj | 2 ++ 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 gaseous-tools/Database/MySQL/gaseous-1001.sql diff --git a/gaseous-tools/Database.cs b/gaseous-tools/Database.cs index db1f2c6..81bc5f7 100644 --- a/gaseous-tools/Database.cs +++ b/gaseous-tools/Database.cs @@ -109,11 +109,6 @@ namespace gaseous_tools dbDict.Add("schemaver", i); ExecuteCMD(sql, dbDict); } - if (SchemaVer == i) - { - // no more updates, no point looping anymore - break; - } } } } diff --git a/gaseous-tools/Database/MySQL/gaseous-1001.sql b/gaseous-tools/Database/MySQL/gaseous-1001.sql new file mode 100644 index 0000000..1b39072 --- /dev/null +++ b/gaseous-tools/Database/MySQL/gaseous-1001.sql @@ -0,0 +1,25 @@ +CREATE + ALGORITHM = UNDEFINED + DEFINER = `root`@`localhost` + SQL SECURITY DEFINER +VIEW `view_signatures_games` AS + SELECT + `signatures_games`.`id` AS `id`, + `signatures_games`.`name` AS `name`, + `signatures_games`.`description` AS `description`, + `signatures_games`.`year` AS `year`, + `signatures_games`.`publisherid` AS `publisherid`, + `signatures_publishers`.`publisher` AS `publisher`, + `signatures_games`.`demo` AS `demo`, + `signatures_games`.`systemid` AS `platformid`, + `signatures_platforms`.`platform` AS `platform`, + `signatures_games`.`systemvariant` AS `systemvariant`, + `signatures_games`.`video` AS `video`, + `signatures_games`.`country` AS `country`, + `signatures_games`.`language` AS `language`, + `signatures_games`.`copyright` AS `copyright` + FROM + ((`signatures_games` + JOIN `signatures_publishers` ON ((`signatures_games`.`publisherid` = `signatures_publishers`.`id`))) + JOIN `signatures_platforms` ON ((`signatures_games`.`systemid` = `signatures_platforms`.`id`))); + diff --git a/gaseous-tools/gaseous-tools.csproj b/gaseous-tools/gaseous-tools.csproj index c3b885a..33e2fc7 100644 --- a/gaseous-tools/gaseous-tools.csproj +++ b/gaseous-tools/gaseous-tools.csproj @@ -15,6 +15,7 @@ + @@ -22,5 +23,6 @@ +