diff --git a/.gitignore b/.gitignore index 21896b9..c608dca 100644 --- a/.gitignore +++ b/.gitignore @@ -404,7 +404,4 @@ ASALocalRun/ # Local History for Visual Studio .localhistory/ gaseous-server/.DS_Store -gaseous-server/wwwroot/.DS_Store gaseous-server/wwwroot/emulators/EmulatorJS -.devcontainer/.env -.mono/ diff --git a/gaseous-server/Classes/Config.cs b/gaseous-server/Classes/Config.cs index 9ce5cca..be3fe93 100644 --- a/gaseous-server/Classes/Config.cs +++ b/gaseous-server/Classes/Config.cs @@ -645,7 +645,7 @@ namespace gaseous_server.Classes return MetadataPath; } - public string LibrarySignaturesDirectory + public string LibrarySignatureImportDirectory { get { @@ -653,14 +653,6 @@ namespace gaseous_server.Classes } } - public string LibrarySignaturesProcessedDirectory - { - get - { - return Path.Combine(LibraryRootDirectory, "Signatures - Processed"); - } - } - public void InitLibrary() { if (!Directory.Exists(LibraryRootDirectory)) { Directory.CreateDirectory(LibraryRootDirectory); } @@ -670,8 +662,7 @@ namespace gaseous_server.Classes if (!Directory.Exists(LibraryMetadataDirectory)) { Directory.CreateDirectory(LibraryMetadataDirectory); } if (!Directory.Exists(LibraryTempDirectory)) { Directory.CreateDirectory(LibraryTempDirectory); } if (!Directory.Exists(LibraryCollectionsDirectory)) { Directory.CreateDirectory(LibraryCollectionsDirectory); } - if (!Directory.Exists(LibrarySignaturesDirectory)) { Directory.CreateDirectory(LibrarySignaturesDirectory); } - if (!Directory.Exists(LibrarySignaturesProcessedDirectory)) { Directory.CreateDirectory(LibrarySignaturesProcessedDirectory); } + if (!Directory.Exists(LibrarySignatureImportDirectory)) { Directory.CreateDirectory(LibrarySignatureImportDirectory); } } } @@ -707,10 +698,6 @@ namespace gaseous_server.Classes } } - private static bool _HasheousSubmitFixes { get; set; } = false; - - private static string _HasheousAPIKey { get; set; } = ""; - private static int _MaxLibraryScanWorkers { get @@ -745,10 +732,6 @@ namespace gaseous_server.Classes public HasheousClient.Models.MetadataModel.SignatureSources SignatureSource = _SignatureSource; - public bool HasheousSubmitFixes = _HasheousSubmitFixes; - - public string HasheousAPIKey = _HasheousAPIKey; - public int MaxLibraryScanWorkers = _MaxLibraryScanWorkers; public string HasheousHost = _HasheousHost; diff --git a/gaseous-server/Classes/DatabaseMigration.cs b/gaseous-server/Classes/DatabaseMigration.cs index b701076..b901b28 100644 --- a/gaseous-server/Classes/DatabaseMigration.cs +++ b/gaseous-server/Classes/DatabaseMigration.cs @@ -1,9 +1,6 @@ using System; using System.Data; using System.Reflection; -using gaseous_server.Classes.Metadata; -using gaseous_server.Models; -using IGDB.Models; namespace gaseous_server.Classes { @@ -67,8 +64,6 @@ namespace gaseous_server.Classes public static void PostUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType) { - var assembly = Assembly.GetExecutingAssembly(); - Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); string sql = ""; Dictionary dbDict = new Dictionary(); @@ -108,51 +103,6 @@ namespace gaseous_server.Classes sql = "DELETE FROM Settings WHERE Setting LIKE 'LastRun_%';"; db.ExecuteNonQuery(sql); break; - - case 1022: - // load country list - Logging.Log(Logging.LogType.Information, "Database Upgrade", "Adding country look up table contents"); - - string countryResourceName = "gaseous_server.Support.Country.txt"; - using (Stream stream = assembly.GetManifestResourceStream(countryResourceName)) - using (StreamReader reader = new StreamReader(stream)) - { - do - { - string[] line = reader.ReadLine().Split("|"); - - sql = "INSERT INTO Country (Code, Value) VALUES (@code, @value);"; - dbDict = new Dictionary{ - { "code", line[0] }, - { "value", line[1] } - }; - db.ExecuteNonQuery(sql, dbDict); - } while (reader.EndOfStream == false); - } - - // load language list - Logging.Log(Logging.LogType.Information, "Database Upgrade", "Adding language look up table contents"); - - string languageResourceName = "gaseous_server.Support.Language.txt"; - using (Stream stream = assembly.GetManifestResourceStream(languageResourceName)) - using (StreamReader reader = new StreamReader(stream)) - { - do - { - string[] line = reader.ReadLine().Split("|"); - - sql = "INSERT INTO Language (Code, Value) VALUES (@code, @value);"; - dbDict = new Dictionary{ - { "code", line[0] }, - { "value", line[1] } - }; - db.ExecuteNonQuery(sql, dbDict); - } while (reader.EndOfStream == false); - } - - // this is a safe background task - BackgroundUpgradeTargetSchemaVersions.Add(1022); - break; } break; } @@ -167,10 +117,6 @@ namespace gaseous_server.Classes case 1002: MySql_1002_MigrateMetadataVersion(); break; - - case 1022: - MySql_1022_MigrateMetadataVersion(); - break; } } } @@ -271,36 +217,5 @@ namespace gaseous_server.Classes } } } - - public static void MySql_1022_MigrateMetadataVersion() - { - FileSignature fileSignature = new FileSignature(); - - Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = "SELECT * FROM Games_Roms WHERE RomDataVersion = 1;"; - DataTable data = db.ExecuteCMD(sql); - foreach (DataRow row in data.Rows) - { - Logging.Log(Logging.LogType.Information, "Database Migration", "Updating ROM table for ROM: " + (string)row["Name"]); - - GameLibrary.LibraryItem library = GameLibrary.GetLibrary((int)row["LibraryId"]); - Common.hashObject hash = new Common.hashObject() - { - md5hash = (string)row["MD5"], - sha1hash = (string)row["SHA1"] - }; - Signatures_Games signature = fileSignature.GetFileSignature( - library, - hash, - new FileInfo((string)row["Path"]), - (string)row["Path"] - ); - - Platform platform = Platforms.GetPlatform((long)row["PlatformId"], false); - Game game = Games.GetGame((long)row["GameId"], false, false, false); - - ImportGame.StoreROM(library, hash, game, platform, signature, (string)row["Path"], (long)row["Id"]); - } - } } } \ No newline at end of file diff --git a/gaseous-server/Classes/FileSignature.cs b/gaseous-server/Classes/FileSignature.cs index 3df2ded..7e2ed88 100644 --- a/gaseous-server/Classes/FileSignature.cs +++ b/gaseous-server/Classes/FileSignature.cs @@ -1,8 +1,6 @@ using System.Collections.Concurrent; using System.IO.Compression; -using gaseous_server.Classes.Metadata; using HasheousClient.Models; -using Microsoft.CodeAnalysis.CSharp.Syntax; using NuGet.Common; using SevenZip; using SharpCompress.Archives; @@ -112,10 +110,8 @@ namespace gaseous_server.Classes // loop through contents until we find the first signature match List archiveFiles = new List(); bool signatureFound = false; - bool signatureSelectorAlreadyApplied = false; foreach (string file in Directory.GetFiles(ExtractPath, "*.*", SearchOption.AllDirectories)) { - bool signatureSelector = false; if (File.Exists(file)) { FileInfo zfi = new FileInfo(file); @@ -125,6 +121,16 @@ namespace gaseous_server.Classes if (zfi != null) { + ArchiveData archiveData = new ArchiveData + { + FileName = Path.GetFileName(file), + FilePath = zfi.Directory.FullName.Replace(ExtractPath, ""), + Size = zfi.Length, + MD5 = hash.md5hash, + SHA1 = hash.sha1hash + }; + archiveFiles.Add(archiveData); + if (signatureFound == false) { gaseous_server.Models.Signatures_Games zDiscoveredSignature = _GetFileSignature(zhash, zfi.Name, zfi.Extension, zfi.Length, file, true); @@ -146,37 +152,15 @@ namespace gaseous_server.Classes discoveredSignature = zDiscoveredSignature; signatureFound = true; - - if (signatureSelectorAlreadyApplied == false) - { - signatureSelector = true; - signatureSelectorAlreadyApplied = true; - } } } - - ArchiveData archiveData = new ArchiveData - { - FileName = Path.GetFileName(file), - FilePath = zfi.Directory.FullName.Replace(ExtractPath, ""), - Size = zfi.Length, - MD5 = zhash.md5hash, - SHA1 = zhash.sha1hash, - isSignatureSelector = signatureSelector - }; - archiveFiles.Add(archiveData); } } } - if (discoveredSignature.Rom.Attributes == null) - { - discoveredSignature.Rom.Attributes = new Dictionary(); - } - - discoveredSignature.Rom.Attributes.Add( + discoveredSignature.Rom.Attributes.Add(new KeyValuePair( "ZipContents", Newtonsoft.Json.JsonConvert.SerializeObject(archiveFiles) - ); + )); } catch (Exception ex) { @@ -395,7 +379,6 @@ namespace gaseous_server.Classes public long Size { get; set; } public string MD5 { get; set; } public string SHA1 { get; set; } - public bool isSignatureSelector { get; set; } = false; } } } \ No newline at end of file diff --git a/gaseous-server/Classes/ImportGames.cs b/gaseous-server/Classes/ImportGames.cs index e4a1267..de338c9 100644 --- a/gaseous-server/Classes/ImportGames.cs +++ b/gaseous-server/Classes/ImportGames.cs @@ -308,11 +308,11 @@ namespace gaseous_server.Classes if (UpdateId == 0) { - sql = "INSERT INTO Games_Roms (PlatformId, GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Attributes, RomType, RomTypeMedia, MediaLabel, Path, MetadataSource, MetadataGameName, MetadataVersion, LibraryId, RomDataVersion) VALUES (@platformid, @gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @Attributes, @romtype, @romtypemedia, @medialabel, @path, @metadatasource, @metadatagamename, @metadataversion, @libraryid, @romdataversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sql = "INSERT INTO Games_Roms (PlatformId, GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Attributes, RomType, RomTypeMedia, MediaLabel, Path, MetadataSource, MetadataGameName, MetadataVersion, LibraryId) VALUES (@platformid, @gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @Attributes, @romtype, @romtypemedia, @medialabel, @path, @metadatasource, @metadatagamename, @metadataversion, @libraryid); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; } else { - sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid, Name=@name, Size=@size, DevelopmentStatus=@developmentstatus, Attributes=@Attributes, RomType=@romtype, RomTypeMedia=@romtypemedia, MediaLabel=@medialabel, MetadataSource=@metadatasource, MetadataGameName=@metadatagamename, MetadataVersion=@metadataversion, RomDataVersion=@romdataversion WHERE Id=@id;"; + sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid, Name=@name, Size=@size, DevelopmentStatus=@developmentstatus, Attributes=@Attributes, RomType=@romtype, RomTypeMedia=@romtypemedia, MediaLabel=@medialabel, MetadataSource=@metadatasource, MetadataGameName=@metadatagamename, MetadataVersion=@metadataversion WHERE Id=@id;"; dbDict.Add("id", UpdateId); } dbDict.Add("platformid", Common.ReturnValueIfNull(determinedPlatform.Id, 0)); @@ -327,7 +327,6 @@ namespace gaseous_server.Classes dbDict.Add("metadatagamename", discoveredSignature.Game.Name); dbDict.Add("metadataversion", 2); dbDict.Add("libraryid", library.Id); - dbDict.Add("romdataversion", 2); if (discoveredSignature.Rom.Attributes != null) { diff --git a/gaseous-server/Classes/Roms.cs b/gaseous-server/Classes/Roms.cs index 77b54ca..e871746 100644 --- a/gaseous-server/Classes/Roms.cs +++ b/gaseous-server/Classes/Roms.cs @@ -4,9 +4,6 @@ using gaseous_signature_parser.models.RomSignatureObject; using static gaseous_server.Classes.RomMediaGroup; using gaseous_server.Classes.Metadata; using IGDB.Models; -using static HasheousClient.Models.FixMatchModel; -using NuGet.Protocol.Core.Types; -using static gaseous_server.Classes.FileSignature; namespace gaseous_server.Classes { @@ -150,53 +147,6 @@ namespace gaseous_server.Classes GameRomItem rom = GetRom(RomId); - // send update to Hasheous if enabled - if (PlatformId != 0 && GameId != 0) - { - if (Config.MetadataConfiguration.HasheousSubmitFixes == true) - { - if ( - Config.MetadataConfiguration.SignatureSource == HasheousClient.Models.MetadataModel.SignatureSources.Hasheous && - ( - Config.MetadataConfiguration.HasheousAPIKey != null && - Config.MetadataConfiguration.HasheousAPIKey != "") - ) - { - try - { - // find signature used for identifing the rom - string md5String = rom.Md5; - string sha1String = rom.Sha1; - if (rom.Attributes.ContainsKey("ZipContents")) - { - bool selectorFound = false; - List archiveDataValues = Newtonsoft.Json.JsonConvert.DeserializeObject>(rom.Attributes["ZipContents"].ToString()); - foreach (ArchiveData archiveData in archiveDataValues) - { - if (archiveData.isSignatureSelector == true) - { - md5String = archiveData.MD5; - sha1String = archiveData.SHA1; - selectorFound = true; - break; - } - } - } - - HasheousClient.WebApp.HttpHelper.AddHeader("X-API-Key", Config.MetadataConfiguration.HasheousAPIKey); - HasheousClient.Hasheous hasheousClient = new HasheousClient.Hasheous(); - List metadataMatchList = new List(); - metadataMatchList.Add(new MetadataMatch(HasheousClient.Models.MetadataSources.IGDB, platform.Slug, game.Slug)); - hasheousClient.FixMatch(new HasheousClient.Models.FixMatchModel(md5String, sha1String, metadataMatchList)); - } - catch (Exception ex) - { - Logging.Log(Logging.LogType.Critical, "Fix Match", "An error occurred while sending a fixed match to Hasheous.", ex); - } - } - } - } - return rom; } @@ -229,22 +179,6 @@ namespace gaseous_server.Classes } } - Dictionary romAttributes = new Dictionary(); - if (romDR["attributes"] != DBNull.Value) - { - try - { - if ((string)romDR["attributes"] != "[ ]") - { - romAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject>((string)romDR["attributes"]); - } - } - catch (Exception ex) - { - Logging.Log(Logging.LogType.Warning, "Roms", "Error parsing rom attributes: " + ex.Message); - } - } - GameRomItem romItem = new GameRomItem { Id = (long)romDR["id"], @@ -289,7 +223,7 @@ namespace gaseous_server.Classes public int Count { get; set; } } - public class GameRomItem : HasheousClient.Models.SignatureModel.RomItem + public class GameRomItem : HasheousClient.Models.LookupResponseModel.RomItem { public long PlatformId { get; set; } public string Platform { get; set; } @@ -301,5 +235,4 @@ namespace gaseous_server.Classes public GameLibrary.LibraryItem Library { get; set; } } } -} - +} \ No newline at end of file diff --git a/gaseous-server/Classes/SignatureIngestors/XML.cs b/gaseous-server/Classes/SignatureIngestors/XML.cs index ff5ee6f..b3f05c2 100644 --- a/gaseous-server/Classes/SignatureIngestors/XML.cs +++ b/gaseous-server/Classes/SignatureIngestors/XML.cs @@ -8,49 +8,21 @@ namespace gaseous_server.SignatureIngestors.XML { public class XMLIngestor : QueueItemStatus { - public void Import(string SearchPath, string ProcessedDirectory, gaseous_signature_parser.parser.SignatureParser XMLType) + public void Import(string SearchPath, gaseous_signature_parser.parser.SignatureParser XMLType) { // connect to database Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string? XMLDBSearchPath = null; - string? XMLDBProcessedDirectory = null; - if (XMLType == gaseous_signature_parser.parser.SignatureParser.NoIntro) - { - XMLDBSearchPath = Path.Combine(SearchPath, "DB"); - XMLDBProcessedDirectory = Path.Combine(ProcessedDirectory, "DB"); - SearchPath = Path.Combine(SearchPath, "DAT"); - ProcessedDirectory = Path.Combine(ProcessedDirectory, "DAT"); - } - // process provided files + Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing from " + SearchPath); if (!Directory.Exists(SearchPath)) { Directory.CreateDirectory(SearchPath); } - if (!Directory.Exists(ProcessedDirectory)) - { - Directory.CreateDirectory(ProcessedDirectory); - } string[] PathContents = Directory.GetFiles(SearchPath); Array.Sort(PathContents); - string[]? DBPathContents = null; - if (XMLDBSearchPath != null) - { - if (!Directory.Exists(XMLDBSearchPath)) - { - Directory.CreateDirectory(XMLDBSearchPath); - } - if (!Directory.Exists(XMLDBProcessedDirectory)) - { - Directory.CreateDirectory(XMLDBProcessedDirectory); - } - - DBPathContents = Directory.GetFiles(XMLDBSearchPath); - } - string sql = ""; Dictionary dbDict = new Dictionary(); System.Data.DataTable sigDB; @@ -61,380 +33,226 @@ namespace gaseous_server.SignatureIngestors.XML SetStatus(i + 1, PathContents.Length, "Processing signature file: " + XMLFile); - Logging.Log(Logging.LogType.Information, "Signature Ingest", "(" + (i + 1) + " / " + PathContents.Length + ") Processing " + XMLType.ToString() + " DAT file: " + XMLFile); - - string? DBFile = null; - if (XMLDBSearchPath != null) + if (Common.SkippableFiles.Contains(Path.GetFileName(XMLFile), StringComparer.OrdinalIgnoreCase)) { - switch (XMLType) - { - case gaseous_signature_parser.parser.SignatureParser.NoIntro: - for (UInt16 x = 0; x < DBPathContents.Length; x++) - { - string tempDBFileName = Path.GetFileNameWithoutExtension(DBPathContents[x].Replace(" (DB Export)", "")); - if (tempDBFileName == Path.GetFileNameWithoutExtension(XMLFile)) - { - DBFile = DBPathContents[x]; - Logging.Log(Logging.LogType.Information, "Signature Ingest", "Using DB file: " + DBFile); - break; - } - } - break; - } + Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Skipping file: " + XMLFile); } - - // check xml file md5 - Common.hashObject hashObject = new Common.hashObject(XMLFile); - sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; - dbDict = new Dictionary(); - dbDict.Add("sourcemd5", hashObject.md5hash); - sigDB = db.ExecuteCMD(sql, dbDict); - - if (sigDB.Rows.Count == 0) + else { - try + // check xml file md5 + Common.hashObject hashObject = new Common.hashObject(XMLFile); + sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; + dbDict = new Dictionary(); + dbDict.Add("sourcemd5", hashObject.md5hash); + sigDB = db.ExecuteCMD(sql, dbDict); + + if (sigDB.Rows.Count == 0) { - // start parsing file - gaseous_signature_parser.parser Parser = new gaseous_signature_parser.parser(); - RomSignatureObject Object = Parser.ParseSignatureDAT(XMLFile, DBFile, XMLType); - - // store in database - string[] flipNameAndDescription = { - "MAMEArcade", - "MAMEMess" - }; - - // store source object - bool processGames = false; - if (Object.SourceMd5 != null) + try { - int sourceId = 0; + Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing file: " + XMLFile); - sql = "SELECT * FROM Signatures_Sources WHERE `SourceMD5`=@sourcemd5"; - dbDict = new Dictionary - { - { "name", Common.ReturnValueIfNull(Object.Name, "") }, - { "description", Common.ReturnValueIfNull(Object.Description, "") }, - { "category", Common.ReturnValueIfNull(Object.Category, "") }, - { "version", Common.ReturnValueIfNull(Object.Version, "") }, - { "author", Common.ReturnValueIfNull(Object.Author, "") }, - { "email", Common.ReturnValueIfNull(Object.Email, "") }, - { "homepage", Common.ReturnValueIfNull(Object.Homepage, "") } + // start parsing file + gaseous_signature_parser.parser Parser = new gaseous_signature_parser.parser(); + RomSignatureObject Object = Parser.ParseSignatureDAT(XMLFile, XMLType); + + // store in database + string[] flipNameAndDescription = { + "MAMEArcade", + "MAMEMess" }; - if (Object.Url == null) - { - dbDict.Add("uri", ""); - } - else - { - dbDict.Add("uri", Common.ReturnValueIfNull(Object.Url.ToString(), "")); - } - dbDict.Add("sourcetype", Common.ReturnValueIfNull(Object.SourceType, "")); - dbDict.Add("sourcemd5", Object.SourceMd5); - dbDict.Add("sourcesha1", Object.SourceSHA1); - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + // store source object + bool processGames = false; + if (Object.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); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; + dbDict = new Dictionary(); + string sourceUriStr = ""; + if (Object.Url != null) + { + sourceUriStr = Object.Url.ToString(); + } + dbDict.Add("name", Common.ReturnValueIfNull(Object.Name, "")); + dbDict.Add("description", Common.ReturnValueIfNull(Object.Description, "")); + dbDict.Add("category", Common.ReturnValueIfNull(Object.Category, "")); + dbDict.Add("version", Common.ReturnValueIfNull(Object.Version, "")); + dbDict.Add("author", Common.ReturnValueIfNull(Object.Author, "")); + dbDict.Add("email", Common.ReturnValueIfNull(Object.Email, "")); + dbDict.Add("homepage", Common.ReturnValueIfNull(Object.Homepage, "")); + dbDict.Add("uri", sourceUriStr); + dbDict.Add("sourcetype", Common.ReturnValueIfNull(Object.SourceType, "")); + dbDict.Add("sourcemd5", Object.SourceMd5); + dbDict.Add("sourcesha1", Object.SourceSHA1); sigDB = db.ExecuteCMD(sql, dbDict); - - sourceId = Convert.ToInt32(sigDB.Rows[0][0]); - - processGames = true; - } - - if (processGames == true) - { - for (int x = 0; x < Object.Games.Count; ++x) + if (sigDB.Rows.Count == 0) { - RomSignatureObject.Game gameObject = Object.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)"; - // set up game dictionary - dbDict = new Dictionary(); - if (flipNameAndDescription.Contains(Object.SourceType)) - { - dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, "")); - dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Name, "")); - } - else - { - 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, "")); + db.ExecuteCMD(sql, dbDict); - List gameCountries = new List(); - if ( - gameObject.Country != null && - gameObject.Country != "Unknown" - ) + processGames = true; + } + + if (processGames == true) + { + for (int x = 0; x < Object.Games.Count; ++x) { - string[] countries = gameObject.Country.Split(","); - foreach (string country in countries) + RomSignatureObject.Game gameObject = Object.Games[x]; + + // set up game dictionary + dbDict = new Dictionary(); + if (flipNameAndDescription.Contains(Object.SourceType)) { - int countryId = -1; - countryId = Common.GetLookupByCode(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), "")); - if (countryId == -1) - { - countryId = Common.GetLookupByValue(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), "")); - - if (countryId == -1) - { - Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Unable to locate country id for " + country.Trim()); - sql = "INSERT INTO Country (`Code`, `Value`) VALUES (@code, @name); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - Dictionary countryDict = new Dictionary{ - { "code", country.Trim() }, - { "name", country.Trim() } - }; - countryId = int.Parse(db.ExecuteCMD(sql, countryDict).Rows[0][0].ToString()); - } - } - - if (countryId > 0) - { - gameCountries.Add(countryId); - } - } - } - - List gameLanguages = new List(); - if ( - gameObject.Language != null && - gameObject.Language != "nolang" - ) - { - string[] languages = gameObject.Language.Split(","); - foreach (string language in languages) - { - int languageId = -1; - languageId = Common.GetLookupByCode(Common.LookupTypes.Language, (string)Common.ReturnValueIfNull(language.Trim(), "")); - if (languageId == -1) - { - languageId = Common.GetLookupByValue(Common.LookupTypes.Language, (string)Common.ReturnValueIfNull(language.Trim(), "")); - - if (languageId == -1) - { - Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Unable to locate language id for " + language.Trim()); - sql = "INSERT INTO Language (`Code`, `Value`) VALUES (@code, @name); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - Dictionary langDict = new Dictionary{ - { "code", language.Trim() }, - { "name", language.Trim() } - }; - languageId = int.Parse(db.ExecuteCMD(sql, langDict).Rows[0][0].ToString()); - } - } - - if (languageId > 0) - { - gameLanguages.Add(languageId); - } - } - } - - 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) - { - // entry not present, insert it - sql = "INSERT INTO Signatures_Platforms (`Platform`) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - sigDB = db.ExecuteCMD(sql, dbDict); - - gameSystem = Convert.ToInt32(sigDB.Rows[0][0]); + dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, "")); + dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Name, "")); } else { - gameSystem = (int)sigDB.Rows[0][0]; + dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, "")); + dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, "")); } - } - dbDict.Add("systemid", gameSystem); + 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 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) + // store platform + int gameSystem = 0; + if (gameObject.System != null) { - // entry not present, insert it - sql = "INSERT INTO Signatures_Publishers (`Publisher`) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - sigDB = db.ExecuteCMD(sql, dbDict); - gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]); - } - else - { - gamePublisher = (int)sigDB.Rows[0][0]; - } - } - dbDict.Add("publisherid", gamePublisher); - - // store game - long gameId = 0; - sql = "SELECT * FROM Signatures_Games WHERE `Name`=@name AND `Year`=@year AND `PublisherId`=@publisherid AND `SystemId`=@systemid"; - - 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`, `Copyright`) VALUES " + - "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - sigDB = db.ExecuteCMD(sql, dbDict); - - gameId = Convert.ToInt32(sigDB.Rows[0][0]); - } - else - { - gameId = (int)sigDB.Rows[0][0]; - } - - // insert countries - foreach (int gameCountry in gameCountries) - { - try - { - sql = "SELECT * FROM Signatures_Games_Countries WHERE GameId = @gameid AND CountryId = @Countryid"; - Dictionary countryDict = new Dictionary{ - { "gameid", gameId }, - { "Countryid", gameCountry } - }; - if (db.ExecuteCMD(sql, countryDict).Rows.Count == 0) - { - sql = "INSERT INTO Signatures_Games_Countries (GameId, CountryId) VALUES (@gameid, @Countryid)"; - db.ExecuteCMD(sql, countryDict); - } - } - catch - { - Console.WriteLine("Game id: " + gameId + " with Country " + gameCountry); - } - } - - // insert languages - foreach (int gameLanguage in gameLanguages) - { - try - { - sql = "SELECT * FROM Signatures_Games_Languages WHERE GameId = @gameid AND LanguageId = @languageid"; - Dictionary langDict = new Dictionary{ - { "gameid", gameId }, - { "languageid", gameLanguage } - }; - if (db.ExecuteCMD(sql, langDict).Rows.Count == 0) - { - sql = "INSERT INTO Signatures_Games_Languages (GameId, LanguageId) VALUES (@gameid, @languageid)"; - db.ExecuteCMD(sql, langDict); - } - } - catch - { - Console.WriteLine("Game id: " + gameId + " with language " + gameLanguage); - } - } - - // store rom - foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) - { - if (romObject.Md5 != null || romObject.Sha1 != null) - { - long romId = 0; - sql = "SELECT * FROM Signatures_Roms WHERE `GameId`=@gameid AND (`MD5`=@md5 OR `SHA1`=@sha1)"; - 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, "").ToString().ToLower()); - dbDict.Add("md5", Common.ReturnValueIfNull(romObject.Md5, "").ToString().ToLower()); - dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "").ToString().ToLower()); - dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); - - if (romObject.Attributes != null) - { - if (romObject.Attributes.Count > 0) - { - dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes)); - } - else - { - dbDict.Add("attributes", ""); - } - } - else - { - dbDict.Add("attributes", ""); - } - dbDict.Add("romtype", (int)romObject.RomType); - dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, "")); - dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, "")); - dbDict.Add("metadatasource", romObject.SignatureSource); - dbDict.Add("ingestorversion", 2); + 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`, `Attributes`, `RomType`, `RomTypeMedia`, `MediaLabel`, `MetadataSource`, `IngestorVersion`) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @attributes, @romtype, @romtypemedia, @medialabel, @metadatasource, @ingestorversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; sigDB = db.ExecuteCMD(sql, dbDict); - romId = Convert.ToInt32(sigDB.Rows[0][0]); + gameSystem = Convert.ToInt32(sigDB.Rows[0][0]); } else { - romId = (int)sigDB.Rows[0][0]; + gameSystem = (int)sigDB.Rows[0][0]; } + } + dbDict.Add("systemid", gameSystem); - // map the rom to the source - sql = "SELECT * FROM Signatures_RomToSource WHERE SourceId=@sourceid AND RomId=@romid;"; - dbDict.Add("romid", romId); - dbDict.Add("sourceId", sourceId); + // 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) { - sql = "INSERT INTO Signatures_RomToSource (`SourceId`, `RomId`) VALUES (@sourceid, @romid);"; - db.ExecuteCMD(sql, dbDict); + // entry not present, insert it + sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sigDB = db.ExecuteCMD(sql, dbDict); + gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]); + } + else + { + gamePublisher = (int)sigDB.Rows[0][0]; + } + } + 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 CAST(LAST_INSERT_ID() AS SIGNED);"; + sigDB = db.ExecuteCMD(sql, dbDict); + + gameId = Convert.ToInt32(sigDB.Rows[0][0]); + } + else + { + gameId = (int)sigDB.Rows[0][0]; + } + + // store rom + foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) + { + if (romObject.Md5 != null || romObject.Sha1 != 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, "").ToString().ToLower()); + dbDict.Add("md5", Common.ReturnValueIfNull(romObject.Md5, "").ToString().ToLower()); + dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "").ToString().ToLower()); + dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); + + if (romObject.Attributes != null) + { + if (romObject.Attributes.Count > 0) + { + dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes)); + } + else + { + dbDict.Add("attributes", "[ ]"); + } + } + else + { + dbDict.Add("attributes", "[ ]"); + } + dbDict.Add("romtype", (int)romObject.RomType); + dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, "")); + dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, "")); + dbDict.Add("metadatasource", romObject.SignatureSource); + dbDict.Add("ingestorversion", 2); + + 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, Attributes, RomType, RomTypeMedia, MediaLabel, MetadataSource, IngestorVersion) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @attributes, @romtype, @romtypemedia, @medialabel, @metadatasource, @ingestorversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sigDB = db.ExecuteCMD(sql, dbDict); + + + romId = Convert.ToInt32(sigDB.Rows[0][0]); + } + else + { + romId = (int)sigDB.Rows[0][0]; + } } } } } } } - - File.Move(XMLFile, Path.Combine(ProcessedDirectory, Path.GetFileName(XMLFile))); - if (DBFile != null) + catch (Exception ex) { - File.Move(DBFile, Path.Combine(XMLDBProcessedDirectory, Path.GetFileName(DBFile))); + Logging.Log(Logging.LogType.Warning, "Signature Ingestor - XML", "Invalid import file: " + XMLFile, ex); } } - catch (Exception ex) + else { - Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Error ingesting " + XMLType.ToString() + " file: " + XMLFile, ex); - } - } - else - { - Logging.Log(Logging.LogType.Information, "Signature Ingest", "Rejecting already imported " + XMLType.ToString() + " file: " + XMLFile); - File.Move(XMLFile, Path.Combine(ProcessedDirectory, Path.GetFileName(XMLFile))); - if (DBFile != null) - { - File.Move(DBFile, Path.Combine(XMLDBProcessedDirectory, Path.GetFileName(DBFile))); + Logging.Log(Logging.LogType.Debug, "Signature Ingestor - XML", "Rejecting already imported file: " + XMLFile); } } } diff --git a/gaseous-server/Classes/SignatureManagement.cs b/gaseous-server/Classes/SignatureManagement.cs index cad5ebc..f8dae08 100644 --- a/gaseous-server/Classes/SignatureManagement.cs +++ b/gaseous-server/Classes/SignatureManagement.cs @@ -1,6 +1,5 @@ using System.Data; using gaseous_signature_parser.models.RomSignatureObject; -using static gaseous_server.Classes.Common; namespace gaseous_server.Classes { @@ -47,7 +46,7 @@ namespace gaseous_server.Classes { Game = new gaseous_server.Models.Signatures_Games.GameItem { - Id = (long)(int)sigDbRow["Id"], + Id = (Int32)sigDbRow["Id"], Name = (string)sigDbRow["Name"], Description = (string)sigDbRow["Description"], Year = (string)sigDbRow["Year"], @@ -56,20 +55,20 @@ namespace gaseous_server.Classes System = (string)sigDbRow["Platform"], SystemVariant = (string)sigDbRow["SystemVariant"], Video = (string)sigDbRow["Video"], - Countries = new Dictionary(GetLookup(LookupTypes.Country, (long)(int)sigDbRow["Id"])), - Languages = new Dictionary(GetLookup(LookupTypes.Language, (long)(int)sigDbRow["Id"])), + Country = (string)sigDbRow["Country"], + Language = (string)sigDbRow["Language"], Copyright = (string)sigDbRow["Copyright"] }, Rom = new gaseous_server.Models.Signatures_Games.RomItem { - Id = (long)(int)sigDbRow["romid"], + Id = (Int32)sigDbRow["romid"], Name = (string)sigDbRow["romname"], Size = (Int64)sigDbRow["Size"], Crc = (string)sigDbRow["CRC"], Md5 = ((string)sigDbRow["MD5"]).ToLower(), Sha1 = ((string)sigDbRow["SHA1"]).ToLower(), DevelopmentStatus = (string)sigDbRow["DevelopmentStatus"], - Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject>((string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]")), + Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject>>((string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]")), RomType = (gaseous_server.Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["RomType"], RomTypeMedia = (string)sigDbRow["RomTypeMedia"], MediaLabel = (string)sigDbRow["MediaLabel"], @@ -80,36 +79,5 @@ namespace gaseous_server.Classes } return GamesList; } - - public Dictionary GetLookup(LookupTypes LookupType, long GameId) - { - string tableName = ""; - switch (LookupType) - { - case LookupTypes.Country: - tableName = "Countries"; - break; - - case LookupTypes.Language: - tableName = "Languages"; - break; - - } - - Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = "SELECT " + LookupType.ToString() + ".Code, " + LookupType.ToString() + ".Value FROM Signatures_Games_" + tableName + " JOIN " + LookupType.ToString() + " ON Signatures_Games_" + tableName + "." + LookupType.ToString() + "Id = " + LookupType.ToString() + ".Id WHERE Signatures_Games_" + tableName + ".GameId = @id;"; - Dictionary dbDict = new Dictionary{ - { "id", GameId } - }; - DataTable data = db.ExecuteCMD(sql, dbDict); - - Dictionary returnDict = new Dictionary(); - foreach (DataRow row in data.Rows) - { - returnDict.Add((string)row["Code"], (string)row["Value"]); - } - - return returnDict; - } } } \ No newline at end of file diff --git a/gaseous-server/Controllers/V1.0/SystemController.cs b/gaseous-server/Controllers/V1.0/SystemController.cs index 69b89a3..10eb213 100644 --- a/gaseous-server/Controllers/V1.0/SystemController.cs +++ b/gaseous-server/Controllers/V1.0/SystemController.cs @@ -260,14 +260,7 @@ namespace gaseous_server.Controllers { AlwaysLogToDisk = Config.LoggingConfiguration.AlwaysLogToDisk, MinimumLogRetentionPeriod = Config.LoggingConfiguration.LogRetention, - EmulatorDebugMode = Boolean.Parse(Config.ReadSetting("emulatorDebugMode", false.ToString())), - SignatureSource = new SystemSettingsModel.SignatureSourceItem() - { - Source = Config.MetadataConfiguration.SignatureSource, - HasheousHost = Config.MetadataConfiguration.HasheousHost, - HasheousSubmitFixes = (bool)Config.MetadataConfiguration.HasheousSubmitFixes, - HasheousAPIKey = Config.MetadataConfiguration.HasheousAPIKey - } + EmulatorDebugMode = Boolean.Parse(Config.ReadSetting("emulatorDebugMode", false.ToString())) }; return Ok(systemSettingsModel); @@ -286,10 +279,6 @@ namespace gaseous_server.Controllers Config.LoggingConfiguration.AlwaysLogToDisk = model.AlwaysLogToDisk; Config.LoggingConfiguration.LogRetention = model.MinimumLogRetentionPeriod; Config.SetSetting("emulatorDebugMode", model.EmulatorDebugMode.ToString()); - Config.MetadataConfiguration.SignatureSource = model.SignatureSource.Source; - Config.MetadataConfiguration.HasheousHost = model.SignatureSource.HasheousHost; - Config.MetadataConfiguration.HasheousAPIKey = model.SignatureSource.HasheousAPIKey; - Config.MetadataConfiguration.HasheousSubmitFixes = model.SignatureSource.HasheousSubmitFixes; Config.UpdateConfig(); } @@ -730,14 +719,5 @@ namespace gaseous_server.Controllers public bool AlwaysLogToDisk { get; set; } public int MinimumLogRetentionPeriod { get; set; } public bool EmulatorDebugMode { get; set; } - public SignatureSourceItem SignatureSource { get; set; } - - public class SignatureSourceItem - { - public HasheousClient.Models.MetadataModel.SignatureSources Source { get; set; } - public string HasheousHost { get; set; } - public string HasheousAPIKey { get; set; } - public bool HasheousSubmitFixes { get; set; } - } } } \ No newline at end of file diff --git a/gaseous-server/Models/Signatures_Games.cs b/gaseous-server/Models/Signatures_Games.cs index cc389cc..8e76f9a 100644 --- a/gaseous-server/Models/Signatures_Games.cs +++ b/gaseous-server/Models/Signatures_Games.cs @@ -4,36 +4,12 @@ using gaseous_signature_parser.models.RomSignatureObject; namespace gaseous_server.Models { - public class Signatures_Games : HasheousClient.Models.SignatureModel - { - public Signatures_Games() - { - } - - [JsonIgnore] - public int Score + public class Signatures_Games : HasheousClient.Models.LookupResponseModel + { + public Signatures_Games() { - get - { - int _score = 0; - - if (Game != null) - { - _score = _score + Game.Score; - } - - if (Rom != null) - { - _score = _score + Rom.Score; - } - - return _score; - } } - public GameItem Game = new GameItem(); - public RomItem Rom = new RomItem(); - public SignatureFlags Flags = new SignatureFlags(); public class SignatureFlags @@ -42,213 +18,5 @@ namespace gaseous_server.Models public string IGDBPlatformName { get; set; } public long IGDBGameId { get; set; } } - - public class GameItem : HasheousClient.Models.SignatureModel.GameItem - { - public GameItem() - { - - } - - [JsonIgnore] - public int Score - { - get - { - // calculate a score based on the availablility of data - int _score = 0; - var properties = this.GetType().GetProperties(); - foreach (var prop in properties) - { - if (prop.GetGetMethod() != null) - { - switch (prop.Name.ToLower()) - { - case "id": - case "score": - break; - case "name": - case "year": - case "publisher": - case "system": - if (prop.PropertyType == typeof(string)) - { - if (prop.GetValue(this) != null) - { - string propVal = prop.GetValue(this).ToString(); - if (propVal.Length > 0) - { - _score = _score + 10; - } - } - } - break; - default: - if (prop.PropertyType == typeof(string)) - { - if (prop.GetValue(this) != null) - { - string propVal = prop.GetValue(this).ToString(); - if (propVal.Length > 0) - { - _score = _score + 1; - } - } - } - break; - } - } - } - - return _score; - } - } - } - - public class RomItem : HasheousClient.Models.SignatureModel.RomItem - { - [JsonIgnore] - public int Score - { - get - { - // calculate a score based on the availablility of data - int _score = 0; - var properties = this.GetType().GetProperties(); - foreach (var prop in properties) - { - if (prop.GetGetMethod() != null) - { - switch (prop.Name.ToLower()) - { - case "name": - case "size": - case "crc": - case "developmentstatus": - case "flags": - case "attributes": - case "romtypemedia": - case "medialabel": - if (prop.PropertyType == typeof(string) || prop.PropertyType == typeof(Int64) || prop.PropertyType == typeof(List)) - { - if (prop.GetValue(this) != null) - { - string propVal = prop.GetValue(this).ToString(); - if (propVal.Length > 0) - { - _score = _score + 10; - } - } - } - break; - default: - if (prop.PropertyType == typeof(string)) - { - if (prop.GetValue(this) != null) - { - string propVal = prop.GetValue(this).ToString(); - if (propVal.Length > 0) - { - _score = _score + 1; - } - } - } - break; - } - } - } - - return _score; - } - } - - public class MediaType - { - public MediaType(SignatureSourceType Source, string MediaTypeString) - { - switch (Source) - { - case RomItem.SignatureSourceType.TOSEC: - string[] typeString = MediaTypeString.Split(" "); - - string inType = ""; - foreach (string typeStringVal in typeString) - { - if (inType == "") - { - switch (typeStringVal.ToLower()) - { - case "disk": - Media = RomItem.RomTypes.Disk; - - inType = typeStringVal; - break; - case "disc": - Media = RomItem.RomTypes.Disc; - - inType = typeStringVal; - break; - case "file": - Media = RomItem.RomTypes.File; - - inType = typeStringVal; - break; - case "part": - Media = RomItem.RomTypes.Part; - - inType = typeStringVal; - break; - case "tape": - Media = RomItem.RomTypes.Tape; - - inType = typeStringVal; - break; - case "of": - inType = typeStringVal; - break; - case "side": - inType = typeStringVal; - break; - } - } - else { - switch (inType.ToLower()) - { - case "disk": - case "disc": - case "file": - case "part": - case "tape": - Number = int.Parse(typeStringVal); - break; - case "of": - Count = int.Parse(typeStringVal); - break; - case "side": - Side = typeStringVal; - break; - } - inType = ""; - } - } - - break; - - default: - break; - - } - } - - public RomItem.RomTypes? Media { get; set; } - - public int? Number { get; set; } - - public int? Count { get; set; } - - public string? Side { get; set; } - } - } } } - diff --git a/gaseous-server/ProcessQueue.cs b/gaseous-server/ProcessQueue.cs index 07dd941..bd90002 100644 --- a/gaseous-server/ProcessQueue.cs +++ b/gaseous-server/ProcessQueue.cs @@ -9,8 +9,8 @@ using NuGet.Packaging; namespace gaseous_server { - public static class ProcessQueue - { + public static class ProcessQueue + { public static List QueueItems = new List(); public class QueueItem @@ -115,8 +115,8 @@ namespace gaseous_server }; private List _Blocks = new List(); - public List AllowedDays - { + public List AllowedDays + { get { return _AllowedDays; @@ -124,7 +124,7 @@ namespace gaseous_server set { _AllowedDays = value; - } + } } public int AllowedStartHours { get; set; } = 0; public int AllowedStartMinutes { get; set; } = 0; @@ -135,7 +135,7 @@ namespace gaseous_server public DateTime LastRunTime => _LastRunTime; public DateTime LastFinishTime => _LastFinishTime; public double LastRunDuration => _LastRunDuration; - public DateTime NextRunTime + public DateTime NextRunTime { get { @@ -245,32 +245,14 @@ namespace gaseous_server CallingQueueItem = this }; - foreach (int i in Enum.GetValues(typeof(gaseous_signature_parser.parser.SignatureParser))) - { - gaseous_signature_parser.parser.SignatureParser parserType = (gaseous_signature_parser.parser.SignatureParser)i; - if ( - parserType != gaseous_signature_parser.parser.SignatureParser.Auto && - parserType != gaseous_signature_parser.parser.SignatureParser.Unknown - ) - { - Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing " + parserType + " files"); + Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing TOSEC files"); + tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "TOSEC"), gaseous_signature_parser.parser.SignatureParser.TOSEC); - string SignaturePath = Path.Combine(Config.LibraryConfiguration.LibrarySignaturesDirectory, parserType.ToString()); - string SignatureProcessedPath = Path.Combine(Config.LibraryConfiguration.LibrarySignaturesProcessedDirectory, parserType.ToString()); + Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing MAME Arcade files"); + tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME Arcade"), gaseous_signature_parser.parser.SignatureParser.MAMEArcade); - if (!Directory.Exists(SignaturePath)) - { - Directory.CreateDirectory(SignaturePath); - } - - if (!Directory.Exists(SignatureProcessedPath)) - { - Directory.CreateDirectory(SignatureProcessedPath); - } - - tIngest.Import(SignaturePath, SignatureProcessedPath, parserType); - } - } + Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing MAME MESS files"); + tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME MESS"), gaseous_signature_parser.parser.SignatureParser.MAMEMess); _SaveLastRunTime = true; @@ -368,7 +350,8 @@ namespace gaseous_server case QueueItemType.DailyMaintainer: Logging.Log(Logging.LogType.Debug, "Timered Event", "Starting Daily Maintenance"); - Classes.Maintenance maintenance = new Maintenance{ + Classes.Maintenance maintenance = new Maintenance + { CallingQueueItem = this }; maintenance.RunDailyMaintenance(); @@ -379,7 +362,8 @@ namespace gaseous_server case QueueItemType.WeeklyMaintainer: Logging.Log(Logging.LogType.Debug, "Timered Event", "Starting Weekly Maintenance"); - Classes.Maintenance weeklyMaintenance = new Maintenance{ + Classes.Maintenance weeklyMaintenance = new Maintenance + { CallingQueueItem = this }; weeklyMaintenance.RunWeeklyMaintenance(); diff --git a/gaseous-server/Program.cs b/gaseous-server/Program.cs index a4f7ab7..b623528 100644 --- a/gaseous-server/Program.cs +++ b/gaseous-server/Program.cs @@ -71,7 +71,6 @@ if (Directory.Exists(Config.LibraryConfiguration.LibraryUploadDirectory)) // kick off any delayed upgrade tasks // run 1002 background updates in the background on every start DatabaseMigration.BackgroundUpgradeTargetSchemaVersions.Add(1002); -DatabaseMigration.BackgroundUpgradeTargetSchemaVersions.Add(1022); // start the task ProcessQueue.QueueItem queueItem = new ProcessQueue.QueueItem( ProcessQueue.QueueItemType.BackgroundDatabaseUpgrade, diff --git a/gaseous-server/Support/Country.txt b/gaseous-server/Support/Country.txt deleted file mode 100644 index 5ee02a3..0000000 --- a/gaseous-server/Support/Country.txt +++ /dev/null @@ -1,73 +0,0 @@ -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|Korea -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 -USA|United States -VN|Vietnam -YU|Yugoslavia -ZA|South Africa -World|World -Europe|Europe -Asia|Asia diff --git a/gaseous-server/Support/Database/MySQL/gaseous-1022.sql b/gaseous-server/Support/Database/MySQL/gaseous-1022.sql deleted file mode 100644 index b089e9c..0000000 --- a/gaseous-server/Support/Database/MySQL/gaseous-1022.sql +++ /dev/null @@ -1,40 +0,0 @@ -CREATE TABLE `Signatures_RomToSource` ( - `SourceId` int NOT NULL, - `RomId` int NOT NULL, - PRIMARY KEY (`SourceId`, `RomId`) -); - -CREATE TABLE `Signatures_Games_Countries` ( - `GameId` INT NOT NULL, - `CountryId` INT NOT NULL, - PRIMARY KEY (`GameId`, `CountryId`), - CONSTRAINT `GameCountry` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION -); - -CREATE TABLE `Signatures_Games_Languages` ( - `GameId` INT NOT NULL, - `LanguageId` INT NOT NULL, - PRIMARY KEY (`GameId`, `LanguageId`), - CONSTRAINT `GameLanguage` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION -); - -CREATE TABLE `Country` ( - `Id` INT NOT NULL AUTO_INCREMENT, - `Code` VARCHAR(20) NULL, - `Value` VARCHAR(255) NULL, - PRIMARY KEY (`Id`), - INDEX `id_Code` (`Code` ASC) VISIBLE, - INDEX `id_Value` (`Value` ASC) VISIBLE -); - -CREATE TABLE `Language` ( - `Id` INT NOT NULL AUTO_INCREMENT, - `Code` VARCHAR(20) NULL, - `Value` VARCHAR(255) NULL, - PRIMARY KEY (`Id`), - INDEX `id_Code` (`Code` ASC) VISIBLE, - INDEX `id_Value` (`Value` ASC) VISIBLE -); - -ALTER TABLE `Games_Roms` -ADD COLUMN `RomDataVersion` INT DEFAULT 1; \ No newline at end of file diff --git a/gaseous-server/Support/Language.txt b/gaseous-server/Support/Language.txt deleted file mode 100644 index cdf301c..0000000 --- a/gaseous-server/Support/Language.txt +++ /dev/null @@ -1,47 +0,0 @@ -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 -fr-ca|French Canadian -ga|Irish -gd|Gaelic -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 diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj index a7d42af..79071b8 100644 --- a/gaseous-server/gaseous-server.csproj +++ b/gaseous-server/gaseous-server.csproj @@ -16,9 +16,9 @@ bin\Release\net8.0\gaseous-server.xml - - - + + + @@ -29,7 +29,7 @@ - + @@ -39,8 +39,6 @@ - - @@ -66,7 +64,6 @@ - @@ -88,8 +85,6 @@ true PreserveNewest - - @@ -113,6 +108,5 @@ - \ No newline at end of file diff --git a/gaseous-server/wwwroot/.DS_Store b/gaseous-server/wwwroot/.DS_Store index d579713..f620c5d 100644 Binary files a/gaseous-server/wwwroot/.DS_Store and b/gaseous-server/wwwroot/.DS_Store differ diff --git a/gaseous-server/wwwroot/images/unknowngame.png b/gaseous-server/wwwroot/images/unknowngame.png index 4eddb02..78b8573 100644 Binary files a/gaseous-server/wwwroot/images/unknowngame.png and b/gaseous-server/wwwroot/images/unknowngame.png differ diff --git a/gaseous-server/wwwroot/images/unknowngame.pxd b/gaseous-server/wwwroot/images/unknowngame.pxd deleted file mode 100644 index 5dafd29..0000000 Binary files a/gaseous-server/wwwroot/images/unknowngame.pxd and /dev/null differ diff --git a/gaseous-server/wwwroot/pages/dialogs/librarynew.html b/gaseous-server/wwwroot/pages/dialogs/librarynew.html index 8525fce..0f9c6d9 100644 --- a/gaseous-server/wwwroot/pages/dialogs/librarynew.html +++ b/gaseous-server/wwwroot/pages/dialogs/librarynew.html @@ -39,7 +39,7 @@ }, processResults: function (data) { var arr = []; - + arr.push({ id: 0, text: 'Any' @@ -74,11 +74,11 @@ ajaxCall( '/api/v1.1/Library?Name=' + encodeURIComponent(libName) + '&DefaultPlatformId=' + libPlatform[0].id + '&Path=' + encodeURIComponent(libPath), 'POST', - function (result) { + function(result) { drawLibrary(); - closeDialog(); + closeSubDialog(); }, - function (error) { + function(error) { alert('An error occurred while creating the library:\n\n' + JSON.stringify(error.responseText)); } ); diff --git a/gaseous-server/wwwroot/pages/dialogs/rominfo.html b/gaseous-server/wwwroot/pages/dialogs/rominfo.html index 3e848b9..b5ce6e2 100644 --- a/gaseous-server/wwwroot/pages/dialogs/rominfo.html +++ b/gaseous-server/wwwroot/pages/dialogs/rominfo.html @@ -1,9 +1,7 @@ 
General
- - + +
Title Match
@@ -61,7 +59,7 @@ @@ -148,7 +144,7 @@ document.getElementById('romDelete').style.display = 'none'; } - if (result.attributes) { + if (result.attributes.length > 0) { document.getElementById('properties_bodypanel_attributes').appendChild(BuildAttributesTable(result.attributes, result.source)); document.getElementById('properties_bodypanel_archive_content').appendChild(BuildArchiveTable(result.attributes, result.source)); } @@ -280,8 +276,8 @@ var aTable = document.createElement('table'); aTable.style.width = '100%'; - for (const [key, value] of Object.entries(attributes)) { - if (key != "ZipContents") { + for (var i = 0; i < attributes.length; i++) { + if (attributes[i].key != "ZipContents") { // show attributes button document.getElementById('properties_toc_attributes').style.display = ''; var aRow = document.createElement('tr'); @@ -289,15 +285,15 @@ var aTitleCell = document.createElement('th'); aTitleCell.width = "25%"; if (sourceName == "TOSEC") { - aTitleCell.innerHTML = ConvertTOSECAttributeName(key); + aTitleCell.innerHTML = ConvertTOSECAttributeName(attributes[i].key); } else { - aTitleCell.innerHTML = key; + aTitleCell.innerHTML = attributes[i].key; } aRow.appendChild(aTitleCell); var aValueCell = document.createElement('td'); aValueCell.width = "75%"; - aValueCell.innerHTML = value; + aValueCell.innerHTML = attributes[i].value; aRow.appendChild(aValueCell); aTable.appendChild(aRow); @@ -308,13 +304,13 @@ } function BuildArchiveTable(attributes, sourceName) { - for (const [key, value] of Object.entries(attributes)) { - if (key == "ZipContents") { - var archiveContent = JSON.parse(value); - + for (var i = 0; i < attributes.length; i++) { + if (attributes[i].key == "ZipContents") { + var archiveContent = JSON.parse(attributes[i].value); + // show archive button document.getElementById('properties_toc_archive').style.display = ''; - + var aTable = document.createElement('table'); aTable.className = 'romtable'; aTable.setAttribute('cellspacing', 0); @@ -347,17 +343,6 @@ hRow.appendChild(aHashCell); aBody.appendChild(hRow); - if (archiveContent[r].isSignatureSelector == true) { - var sigRow = document.createElement('tr'); - - var sigCell = document.createElement('td'); - sigCell.setAttribute('colspan', 2); - sigCell.style.paddingLeft = '20px'; - sigCell.innerHTML = "Hash used to identify this archive"; - sigRow.appendChild(sigCell); - aBody.appendChild(sigRow); - } - aTable.appendChild(aBody); } } @@ -369,18 +354,18 @@ function ConvertTOSECAttributeName(attributeName) { var tosecAttributeNames = { "cr": "Cracked", - "f": "Fixed", - "h": "Hacked", - "m": "Modified", - "p": "Pirated", - "t": "Trained", + "f" : "Fixed", + "h" : "Hacked", + "m" : "Modified", + "p" : "Pirated", + "t" : "Trained", "tr": "Translated", - "o": "Over Dump", - "u": "Under Dump", - "v": "Virus", - "b": "Bad Dump", - "a": "Alternate", - "!": "Known Verified Dump" + "o" : "Over Dump", + "u" : "Under Dump", + "v" : "Virus", + "b" : "Bad Dump", + "a" : "Alternate", + "!" : "Known Verified Dump" }; if (attributeName in tosecAttributeNames) { @@ -393,4 +378,4 @@ SelectTab('general'); document.getElementById('romDelete').setAttribute("onclick", "showSubDialog('romdelete', " + modalVariables + ");"); - \ No newline at end of file + diff --git a/gaseous-server/wwwroot/pages/settings.html b/gaseous-server/wwwroot/pages/settings.html index 4b0b700..74cd83e 100644 --- a/gaseous-server/wwwroot/pages/settings.html +++ b/gaseous-server/wwwroot/pages/settings.html @@ -1,5 +1,4 @@ -
+
@@ -7,40 +6,27 @@
Settings
System
- - - - - + + +
Firmware
- +
About
- +
- Wallpaper by Lorenzo Herrera / Unsplash + Wallpaper by Lorenzo Herrera / Unsplash
\ No newline at end of file + diff --git a/gaseous-server/wwwroot/pages/settings/libraries.html b/gaseous-server/wwwroot/pages/settings/libraries.html deleted file mode 100644 index d30f616..0000000 --- a/gaseous-server/wwwroot/pages/settings/libraries.html +++ /dev/null @@ -1,63 +0,0 @@ -
-

Libraries

-
- - - -
-
- - \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/services.html b/gaseous-server/wwwroot/pages/settings/services.html deleted file mode 100644 index 5d61e6c..0000000 --- a/gaseous-server/wwwroot/pages/settings/services.html +++ /dev/null @@ -1,290 +0,0 @@ -
-

Services

-
- - -
-
- - \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/settings.html b/gaseous-server/wwwroot/pages/settings/settings.html index aaa8a6e..93e6a06 100644 --- a/gaseous-server/wwwroot/pages/settings/settings.html +++ b/gaseous-server/wwwroot/pages/settings/settings.html @@ -2,74 +2,37 @@

Settings

- +

Libraries

+
+ +
+
+ +

Advanced Settings

+

Warning Do not modify the below settings unless you know what you're doing.

+

Background Task Timers

+ + +
+
+ +

System Settings

+ - - - - - - - - - - - - - - - - - - - - - - - - + @@ -84,12 +47,10 @@ - + - + @@ -100,11 +61,339 @@
-

Metadata Sources

-
- Signature Source - - - -
- - -
- - - -
-

Logging

-
Logging
Write logs - +
- +
-

Emulator

-
Emulator
Enable debug mode
\ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/system.html b/gaseous-server/wwwroot/pages/settings/system.html index d7210e6..8e24b68 100644 --- a/gaseous-server/wwwroot/pages/settings/system.html +++ b/gaseous-server/wwwroot/pages/settings/system.html @@ -22,7 +22,7 @@

Database

-

Local Database Signatures

+

Signatures

\ No newline at end of file + diff --git a/gaseous-server/wwwroot/styles/style.css b/gaseous-server/wwwroot/styles/style.css index a6200cf..f141bd6 100644 --- a/gaseous-server/wwwroot/styles/style.css +++ b/gaseous-server/wwwroot/styles/style.css @@ -340,11 +340,6 @@ input[type="datetime-local"]:hover { border-color: #939393; } -textarea { - height: unset; - font-family: 'Courier New', Courier, monospace; -} - input[id='filter_panel_search'] { width: 160px; } @@ -612,22 +607,22 @@ input[name='filter_panel_range_max'] { .game_tile:hover { cursor: pointer; - /* text-decoration: underline; + text-decoration: underline; background-color: #2b2b2b; border-radius: 10px 10px 10px 10px; -webkit-border-radius: 10px 10px 10px 10px; -moz-border-radius: 10px 10px 10px 10px; - border: 1px solid #2b2b2b; */ + border: 1px solid #2b2b2b; } .game_tile_small:hover { cursor: pointer; - /* text-decoration: underline; + text-decoration: underline; background-color: #2b2b2b; border-radius: 10px 10px 10px 10px; -webkit-border-radius: 10px 10px 10px 10px; -moz-border-radius: 10px 10px 10px 10px; - border: 1px solid #2b2b2b; */ + border: 1px solid #2b2b2b; } .game_tile_small_search { @@ -657,19 +652,6 @@ input[name='filter_panel_range_max'] { display: inline-block; max-width: 200px; max-height: 200px; - border-radius: 7px; - border-width: 2px; - border-style: solid; - border-color: transparent; - overflow: hidden; -} - -.game_tile:hover .game_tile_box { - border-color: yellow; - outline-width: 2px; - outline-style: solid; - outline-offset: -3px; - outline-color: black; } .game_tile_box_row {