Compare commits
10 Commits
v1.7.6
...
branch-v1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9922e61b44 | ||
![]() |
98a09c32f8 | ||
![]() |
81b58e9b9f | ||
![]() |
928a1538ea | ||
![]() |
f4a8892cbb | ||
![]() |
c4435628e0 | ||
![]() |
933c624885 | ||
![]() |
06e344c74a | ||
![]() |
9150ce7377 | ||
![]() |
08a40e3dd9 |
@@ -1,6 +1,10 @@
|
|||||||
FROM mcr.microsoft.com/devcontainers/dotnet:1-8.0-bookworm
|
FROM mcr.microsoft.com/devcontainers/dotnet:1-8.0-bookworm
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y p7zip-full
|
# update apt-get
|
||||||
RUN mkdir -p /workspace/gaseous-server/wwwroot/emulators/EmulatorJS
|
RUN apt-get update
|
||||||
RUN wget https://cdn.emulatorjs.org/releases/4.0.11.7z
|
|
||||||
RUN 7z x -y -o/workspace/gaseous-server/wwwroot/emulators/EmulatorJS 4.0.11.7z
|
# download and unzip EmulatorJS from CDN
|
||||||
|
RUN apt-get install -y p7zip-full
|
||||||
|
RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
||||||
|
RUN wget https://cdn.emulatorjs.org/releases/4.1.1.7z
|
||||||
|
RUN 7z x -y -oout/wwwroot/emulators/EmulatorJS 4.1.1.7z
|
85
.github/workflows/codeql.yml
vendored
85
.github/workflows/codeql.yml
vendored
@@ -1,85 +0,0 @@
|
|||||||
# For most projects, this workflow file will not need changing; you simply need
|
|
||||||
# to commit it to your repository.
|
|
||||||
#
|
|
||||||
# You may wish to alter this file to override the set of languages analyzed,
|
|
||||||
# or to provide custom queries or build logic.
|
|
||||||
#
|
|
||||||
# ******** NOTE ********
|
|
||||||
# We have attempted to detect the languages in your repository. Please check
|
|
||||||
# the `language` matrix defined below to confirm you have the correct set of
|
|
||||||
# supported CodeQL languages.
|
|
||||||
#
|
|
||||||
name: "CodeQL"
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "main", "branch-v*.*.*" ]
|
|
||||||
pull_request:
|
|
||||||
# The branches below must be a subset of the branches above
|
|
||||||
branches: [ "main" ]
|
|
||||||
schedule:
|
|
||||||
- cron: '21 11 * * 2'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyze:
|
|
||||||
name: Analyze
|
|
||||||
# Runner size impacts CodeQL analysis time. To learn more, please see:
|
|
||||||
# - https://gh.io/recommended-hardware-resources-for-running-codeql
|
|
||||||
# - https://gh.io/supported-runners-and-hardware-resources
|
|
||||||
# - https://gh.io/using-larger-runners
|
|
||||||
# Consider using larger runners for possible analysis time improvements.
|
|
||||||
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
|
|
||||||
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
|
|
||||||
permissions:
|
|
||||||
actions: read
|
|
||||||
contents: read
|
|
||||||
security-events: write
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
language: [ 'csharp', 'javascript' ]
|
|
||||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ]
|
|
||||||
# Use only 'java' to analyze code written in Java, Kotlin or both
|
|
||||||
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
|
|
||||||
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Sign in to Nuget
|
|
||||||
run: dotnet nuget add source --username michael-j-green --password ${{ secrets.NUGETKEY }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/gaseous-project/index.json"
|
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v2
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
||||||
# By default, queries listed here will override any specified in a config file.
|
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
|
||||||
|
|
||||||
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
|
||||||
# queries: security-extended,security-and-quality
|
|
||||||
|
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
|
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
|
||||||
- name: Autobuild
|
|
||||||
uses: github/codeql-action/autobuild@v2
|
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
|
||||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
|
||||||
|
|
||||||
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
|
||||||
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
|
||||||
|
|
||||||
# - run: |
|
|
||||||
# echo "Run, Build Application using script"
|
|
||||||
# ./location_of_script_within_repo/buildscript.sh
|
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v2
|
|
||||||
with:
|
|
||||||
category: "/language:${{matrix.language}}"
|
|
@@ -14,19 +14,14 @@ RUN dotnet restore "gaseous-server/gaseous-server.csproj" -a $TARGETARCH
|
|||||||
# Build and publish a release
|
# Build and publish a release
|
||||||
RUN dotnet publish "gaseous-server/gaseous-server.csproj" --use-current-runtime --self-contained true -c Release -o out -a $TARGETARCH
|
RUN dotnet publish "gaseous-server/gaseous-server.csproj" --use-current-runtime --self-contained true -c Release -o out -a $TARGETARCH
|
||||||
|
|
||||||
# disabled for 1.7.4 as the next version EmulatorJS is not yet available
|
# update apt-get
|
||||||
# # update apt-get
|
RUN apt-get update
|
||||||
# RUN apt-get update
|
|
||||||
|
|
||||||
# # download and unzip EmulatorJS from CDN
|
# download and unzip EmulatorJS from CDN
|
||||||
# RUN apt-get install -y p7zip-full
|
RUN apt-get install -y p7zip-full
|
||||||
# RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
|
||||||
# RUN wget https://cdn.emulatorjs.org/releases/4.0.12.7z
|
|
||||||
# RUN 7z x -y -oout/wwwroot/emulators/EmulatorJS 4.0.12.7z
|
|
||||||
RUN wget --recursive --no-parent https://cdn.emulatorjs.org/latest/
|
|
||||||
RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
||||||
RUN cp -fr cdn.emulatorjs.org/latest/* out/wwwroot/emulators/EmulatorJS
|
RUN wget https://cdn.emulatorjs.org/releases/4.1.1.7z
|
||||||
RUN rm -Rf cdn.emulatorjs.org
|
RUN 7z x -y -oout/wwwroot/emulators/EmulatorJS 4.1.1.7z
|
||||||
|
|
||||||
# clean up apt-get
|
# clean up apt-get
|
||||||
RUN apt-get clean && rm -rf /var/lib/apt/lists
|
RUN apt-get clean && rm -rf /var/lib/apt/lists
|
||||||
@@ -37,5 +32,8 @@ ENV INDOCKER=1
|
|||||||
WORKDIR /App
|
WORKDIR /App
|
||||||
COPY --from=build-env /App/out .
|
COPY --from=build-env /App/out .
|
||||||
|
|
||||||
|
# Configure healthcheck
|
||||||
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 CMD curl --fail http://localhost:80/healthCheck || exit 1
|
||||||
|
|
||||||
# start gaseous-server
|
# start gaseous-server
|
||||||
ENTRYPOINT ["dotnet", "gaseous-server.dll"]
|
ENTRYPOINT ["dotnet", "gaseous-server.dll"]
|
||||||
|
@@ -14,15 +14,14 @@ RUN dotnet restore "gaseous-server/gaseous-server.csproj" -a $TARGETARCH
|
|||||||
# Build and publish a release
|
# Build and publish a release
|
||||||
RUN dotnet publish "gaseous-server/gaseous-server.csproj" --use-current-runtime --self-contained true -c Release -o out -a $TARGETARCH
|
RUN dotnet publish "gaseous-server/gaseous-server.csproj" --use-current-runtime --self-contained true -c Release -o out -a $TARGETARCH
|
||||||
|
|
||||||
# disabled for 1.7.4 as the next version EmulatorJS is not yet available
|
# update apt-get
|
||||||
# # update apt-get
|
RUN apt-get update
|
||||||
# RUN apt-get update
|
|
||||||
|
|
||||||
# # download and unzip EmulatorJS from CDN
|
# download and unzip EmulatorJS from CDN
|
||||||
# RUN apt-get install -y p7zip-full
|
RUN apt-get install -y p7zip-full
|
||||||
# RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
||||||
# RUN wget https://cdn.emulatorjs.org/releases/4.0.12.7z
|
RUN wget https://cdn.emulatorjs.org/releases/4.1.1.7z
|
||||||
# RUN 7z x -y -oout/wwwroot/emulators/EmulatorJS 4.0.12.7z
|
RUN 7z x -y -oout/wwwroot/emulators/EmulatorJS 4.1.1.7z
|
||||||
|
|
||||||
RUN wget --recursive --no-parent https://cdn.emulatorjs.org/latest/
|
RUN wget --recursive --no-parent https://cdn.emulatorjs.org/latest/
|
||||||
RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
RUN mkdir -p out/wwwroot/emulators/EmulatorJS
|
||||||
|
@@ -159,6 +159,50 @@ namespace gaseous_server.Classes
|
|||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int GetLookupByCode(LookupTypes LookupType, string Code)
|
||||||
|
{
|
||||||
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
|
string sql = "SELECT Id FROM " + LookupType.ToString() + " WHERE Code = @code";
|
||||||
|
Dictionary<string, object> dbDict = new Dictionary<string, object>{
|
||||||
|
{ "code", Code }
|
||||||
|
};
|
||||||
|
|
||||||
|
DataTable data = db.ExecuteCMD(sql, dbDict);
|
||||||
|
if (data.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (int)data.Rows[0]["Id"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int GetLookupByValue(LookupTypes LookupType, string Value)
|
||||||
|
{
|
||||||
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
|
string sql = "SELECT Id FROM " + LookupType.ToString() + " WHERE Value = @value";
|
||||||
|
Dictionary<string, object> dbDict = new Dictionary<string, object>{
|
||||||
|
{ "value", Value }
|
||||||
|
};
|
||||||
|
|
||||||
|
DataTable data = db.ExecuteCMD(sql, dbDict);
|
||||||
|
if (data.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (int)data.Rows[0]["Id"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LookupTypes
|
||||||
|
{
|
||||||
|
Country,
|
||||||
|
Language
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -361,25 +361,38 @@ namespace gaseous_server.Classes
|
|||||||
{
|
{
|
||||||
sql = "REPLACE INTO Settings (Setting, ValueType, Value, ValueDate) VALUES (@SettingName, @ValueType, @Value, @ValueDate)";
|
sql = "REPLACE INTO Settings (Setting, ValueType, Value, ValueDate) VALUES (@SettingName, @ValueType, @Value, @ValueDate)";
|
||||||
Type type = typeof(T);
|
Type type = typeof(T);
|
||||||
if (type.ToString() == "System.DateTime")
|
|
||||||
|
switch (type.ToString())
|
||||||
{
|
{
|
||||||
dbDict = new Dictionary<string, object>
|
case "System.DateTime":
|
||||||
{
|
dbDict = new Dictionary<string, object>
|
||||||
{ "SettingName", SettingName },
|
{
|
||||||
{ "ValueType", 1 },
|
{ "SettingName", SettingName },
|
||||||
{ "Value", null },
|
{ "ValueType", 1 },
|
||||||
{ "ValueDate", Value }
|
{ "Value", null },
|
||||||
};
|
{ "ValueDate", Value }
|
||||||
}
|
};
|
||||||
else
|
break;
|
||||||
{
|
|
||||||
dbDict = new Dictionary<string, object>
|
case "System.Collections.Generic.List`1[gaseous_server.Classes.Metadata.Games+SearchType]":
|
||||||
{
|
dbDict = new Dictionary<string, object>
|
||||||
{ "SettingName", SettingName },
|
{
|
||||||
{ "ValueType", 0 },
|
{ "SettingName", SettingName },
|
||||||
{ "Value", Value },
|
{ "ValueType", 2 },
|
||||||
{ "ValueDate", null }
|
{ "Value", JsonConvert.SerializeObject(Value) },
|
||||||
};
|
{ "ValueDate", null }
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
dbDict = new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
{ "SettingName", SettingName },
|
||||||
|
{ "ValueType", 0 },
|
||||||
|
{ "Value", Value },
|
||||||
|
{ "ValueDate", null }
|
||||||
|
};
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -64,6 +64,8 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
public static void PostUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType)
|
public static void PostUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType)
|
||||||
{
|
{
|
||||||
|
var assembly = Assembly.GetExecutingAssembly();
|
||||||
|
|
||||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
string sql = "";
|
string sql = "";
|
||||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||||
@@ -103,6 +105,48 @@ namespace gaseous_server.Classes
|
|||||||
sql = "DELETE FROM Settings WHERE Setting LIKE 'LastRun_%';";
|
sql = "DELETE FROM Settings WHERE Setting LIKE 'LastRun_%';";
|
||||||
db.ExecuteNonQuery(sql);
|
db.ExecuteNonQuery(sql);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 1023:
|
||||||
|
// 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<string, object>{
|
||||||
|
{ "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<string, object>{
|
||||||
|
{ "code", line[0] },
|
||||||
|
{ "value", line[1] }
|
||||||
|
};
|
||||||
|
db.ExecuteNonQuery(sql, dbDict);
|
||||||
|
} while (reader.EndOfStream == false);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -181,7 +181,13 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
Logging.Log(Logging.LogType.Information, "Import Game", " Searching for title: " + SearchCandidate);
|
Logging.Log(Logging.LogType.Information, "Import Game", " Searching for title: " + SearchCandidate);
|
||||||
|
|
||||||
foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType)))
|
List<Metadata.Games.SearchType> allowedSearchTypes = Config.ReadSetting<List<Metadata.Games.SearchType>>("DefaultSearchMethods", new List<gaseous_server.Classes.Metadata.Games.SearchType>() {
|
||||||
|
Games.SearchType.where,
|
||||||
|
Games.SearchType.wherefuzzy,
|
||||||
|
Games.SearchType.search,
|
||||||
|
Games.SearchType.searchNoPlatform
|
||||||
|
});
|
||||||
|
foreach (Metadata.Games.SearchType searchType in allowedSearchTypes)
|
||||||
{
|
{
|
||||||
Logging.Log(Logging.LogType.Information, "Import Game", " Search type: " + searchType.ToString());
|
Logging.Log(Logging.LogType.Information, "Import Game", " Search type: " + searchType.ToString());
|
||||||
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
||||||
@@ -239,7 +245,13 @@ namespace gaseous_server.Classes
|
|||||||
|
|
||||||
foreach (string SearchCandidate in SearchCandidates)
|
foreach (string SearchCandidate in SearchCandidates)
|
||||||
{
|
{
|
||||||
foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType)))
|
List<Metadata.Games.SearchType> allowedSearchTypes = Config.ReadSetting<List<Metadata.Games.SearchType>>("DefaultSearchMethods", new List<gaseous_server.Classes.Metadata.Games.SearchType>() {
|
||||||
|
Games.SearchType.where,
|
||||||
|
Games.SearchType.wherefuzzy,
|
||||||
|
Games.SearchType.search,
|
||||||
|
Games.SearchType.searchNoPlatform
|
||||||
|
});
|
||||||
|
foreach (Metadata.Games.SearchType searchType in allowedSearchTypes)
|
||||||
{
|
{
|
||||||
if ((PlatformId == 0 && searchType == SearchType.searchNoPlatform) || (PlatformId != 0 && searchType != SearchType.searchNoPlatform))
|
if ((PlatformId == 0 && searchType == SearchType.searchNoPlatform) || (PlatformId != 0 && searchType != SearchType.searchNoPlatform))
|
||||||
{
|
{
|
||||||
@@ -417,23 +429,20 @@ namespace gaseous_server.Classes
|
|||||||
Logging.Log(Logging.LogType.Information, "Move Game ROM", "Moving " + romPath + " to " + DestinationPath);
|
Logging.Log(Logging.LogType.Information, "Move Game ROM", "Moving " + romPath + " to " + DestinationPath);
|
||||||
if (File.Exists(DestinationPath))
|
if (File.Exists(DestinationPath))
|
||||||
{
|
{
|
||||||
Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - aborting");
|
Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - overwriting");
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
File.Move(romPath, DestinationPath);
|
|
||||||
|
|
||||||
// update the db
|
File.Move(romPath, DestinationPath, true);
|
||||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
|
||||||
string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id";
|
|
||||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
|
||||||
dbDict.Add("id", RomId);
|
|
||||||
dbDict.Add("path", DestinationPath);
|
|
||||||
db.ExecuteCMD(sql, dbDict);
|
|
||||||
|
|
||||||
return true;
|
// update the db
|
||||||
}
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
|
string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id";
|
||||||
|
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||||
|
dbDict.Add("id", RomId);
|
||||||
|
dbDict.Add("path", DestinationPath);
|
||||||
|
db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -7,7 +7,7 @@ namespace gaseous_server.Classes.Metadata
|
|||||||
{
|
{
|
||||||
public class Games
|
public class Games
|
||||||
{
|
{
|
||||||
const string fieldList = "fields age_ratings,aggregated_rating,aggregated_rating_count,alternative_names,artworks,bundles,category,checksum,collection,collections,cover,created_at,dlcs,expanded_games,expansions,external_games,first_release_date,follows,forks,franchise,franchises,game_engines,game_localizations,game_modes,genres,hypes,involved_companies,keywords,language_supports,multiplayer_modes,name,parent_game,platforms,player_perspectives,ports,rating,rating_count,release_dates,remakes,remasters,screenshots,similar_games,slug,standalone_expansions,status,storyline,summary,tags,themes,total_rating,total_rating_count,updated_at,url,version_parent,version_title,videos,websites;";
|
const string fieldList = "fields age_ratings,aggregated_rating,aggregated_rating_count,alternative_names,artworks,bundles,category,checksum,collections,cover,created_at,dlcs,expanded_games,expansions,external_games,first_release_date,follows,forks,franchise,franchises,game_engines,game_localizations,game_modes,genres,hypes,involved_companies,keywords,language_supports,multiplayer_modes,name,parent_game,platforms,player_perspectives,ports,rating,rating_count,release_dates,remakes,remasters,screenshots,similar_games,slug,standalone_expansions,status,storyline,summary,tags,themes,total_rating,total_rating_count,updated_at,url,version_parent,version_title,videos,websites;";
|
||||||
|
|
||||||
public Games()
|
public Games()
|
||||||
{
|
{
|
||||||
|
@@ -8,21 +8,49 @@ namespace gaseous_server.SignatureIngestors.XML
|
|||||||
{
|
{
|
||||||
public class XMLIngestor : QueueItemStatus
|
public class XMLIngestor : QueueItemStatus
|
||||||
{
|
{
|
||||||
public void Import(string SearchPath, gaseous_signature_parser.parser.SignatureParser XMLType)
|
public void Import(string SearchPath, string ProcessedDirectory, gaseous_signature_parser.parser.SignatureParser XMLType)
|
||||||
{
|
{
|
||||||
// connect to database
|
// connect to database
|
||||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
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
|
// process provided files
|
||||||
Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing from " + SearchPath);
|
|
||||||
if (!Directory.Exists(SearchPath))
|
if (!Directory.Exists(SearchPath))
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(SearchPath);
|
Directory.CreateDirectory(SearchPath);
|
||||||
}
|
}
|
||||||
|
if (!Directory.Exists(ProcessedDirectory))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(ProcessedDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
string[] PathContents = Directory.GetFiles(SearchPath);
|
string[] PathContents = Directory.GetFiles(SearchPath);
|
||||||
Array.Sort(PathContents);
|
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 = "";
|
string sql = "";
|
||||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||||
System.Data.DataTable sigDB;
|
System.Data.DataTable sigDB;
|
||||||
@@ -33,226 +61,380 @@ namespace gaseous_server.SignatureIngestors.XML
|
|||||||
|
|
||||||
SetStatus(i + 1, PathContents.Length, "Processing signature file: " + XMLFile);
|
SetStatus(i + 1, PathContents.Length, "Processing signature file: " + XMLFile);
|
||||||
|
|
||||||
if (Common.SkippableFiles.Contains(Path.GetFileName(XMLFile), StringComparer.OrdinalIgnoreCase))
|
Logging.Log(Logging.LogType.Information, "Signature Ingest", "(" + (i + 1) + " / " + PathContents.Length + ") Processing " + XMLType.ToString() + " DAT file: " + XMLFile);
|
||||||
{
|
|
||||||
Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Skipping file: " + XMLFile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// check xml file md5
|
|
||||||
Common.hashObject hashObject = new Common.hashObject(XMLFile);
|
|
||||||
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
|
||||||
dbDict = new Dictionary<string, object>();
|
|
||||||
dbDict.Add("sourcemd5", hashObject.md5hash);
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
|
|
||||||
if (sigDB.Rows.Count == 0)
|
string? DBFile = null;
|
||||||
|
if (XMLDBSearchPath != null)
|
||||||
|
{
|
||||||
|
switch (XMLType)
|
||||||
{
|
{
|
||||||
try
|
case gaseous_signature_parser.parser.SignatureParser.NoIntro:
|
||||||
{
|
for (UInt16 x = 0; x < DBPathContents.Length; x++)
|
||||||
Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing file: " + XMLFile);
|
|
||||||
|
|
||||||
// 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"
|
|
||||||
};
|
|
||||||
|
|
||||||
// store source object
|
|
||||||
bool processGames = false;
|
|
||||||
if (Object.SourceMd5 != null)
|
|
||||||
{
|
{
|
||||||
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
string tempDBFileName = Path.GetFileNameWithoutExtension(DBPathContents[x].Replace(" (DB Export)", ""));
|
||||||
dbDict = new Dictionary<string, object>();
|
if (tempDBFileName == Path.GetFileNameWithoutExtension(XMLFile))
|
||||||
string sourceUriStr = "";
|
|
||||||
if (Object.Url != null)
|
|
||||||
{
|
{
|
||||||
sourceUriStr = Object.Url.ToString();
|
DBFile = DBPathContents[x];
|
||||||
|
Logging.Log(Logging.LogType.Information, "Signature Ingest", "Using DB file: " + DBFile);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
dbDict.Add("name", Common.ReturnValueIfNull(Object.Name, ""));
|
}
|
||||||
dbDict.Add("description", Common.ReturnValueIfNull(Object.Description, ""));
|
break;
|
||||||
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, ""));
|
// check xml file md5
|
||||||
dbDict.Add("homepage", Common.ReturnValueIfNull(Object.Homepage, ""));
|
Common.hashObject hashObject = new Common.hashObject(XMLFile);
|
||||||
dbDict.Add("uri", sourceUriStr);
|
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
||||||
dbDict.Add("sourcetype", Common.ReturnValueIfNull(Object.SourceType, ""));
|
dbDict = new Dictionary<string, object>();
|
||||||
dbDict.Add("sourcemd5", Object.SourceMd5);
|
dbDict.Add("sourcemd5", hashObject.md5hash);
|
||||||
dbDict.Add("sourcesha1", Object.SourceSHA1);
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
|
if (sigDB.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 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)
|
||||||
|
{
|
||||||
|
int sourceId = 0;
|
||||||
|
|
||||||
|
sql = "SELECT * FROM Signatures_Sources WHERE `SourceMD5`=@sourcemd5";
|
||||||
|
dbDict = new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
{ "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, "") }
|
||||||
|
};
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
// 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);";
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
if (sigDB.Rows.Count == 0)
|
|
||||||
|
sourceId = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||||
|
|
||||||
|
processGames = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (processGames == true)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < Object.Games.Count; ++x)
|
||||||
{
|
{
|
||||||
// entry not present, insert it
|
RomSignatureObject.Game gameObject = Object.Games[x];
|
||||||
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)";
|
|
||||||
|
|
||||||
db.ExecuteCMD(sql, dbDict);
|
// set up game dictionary
|
||||||
|
dbDict = new Dictionary<string, object>();
|
||||||
processGames = true;
|
if (flipNameAndDescription.Contains(Object.SourceType))
|
||||||
}
|
|
||||||
|
|
||||||
if (processGames == true)
|
|
||||||
{
|
|
||||||
for (int x = 0; x < Object.Games.Count; ++x)
|
|
||||||
{
|
{
|
||||||
RomSignatureObject.Game gameObject = Object.Games[x];
|
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, ""));
|
||||||
|
|
||||||
// set up game dictionary
|
List<int> gameCountries = new List<int>();
|
||||||
dbDict = new Dictionary<string, object>();
|
if (
|
||||||
if (flipNameAndDescription.Contains(Object.SourceType))
|
gameObject.Country != null &&
|
||||||
|
gameObject.Country != "Unknown"
|
||||||
|
)
|
||||||
|
{
|
||||||
|
string[] countries = gameObject.Country.Split(",");
|
||||||
|
foreach (string country in countries)
|
||||||
{
|
{
|
||||||
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, ""));
|
int countryId = -1;
|
||||||
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Name, ""));
|
countryId = Common.GetLookupByCode(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), ""));
|
||||||
}
|
if (countryId == -1)
|
||||||
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, ""));
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
// entry not present, insert it
|
countryId = Common.GetLookupByValue(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), ""));
|
||||||
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]);
|
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<string, object> countryDict = new Dictionary<string, object>{
|
||||||
|
{ "code", country.Trim() },
|
||||||
|
{ "name", country.Trim() }
|
||||||
|
};
|
||||||
|
countryId = int.Parse(db.ExecuteCMD(sql, countryDict).Rows[0][0].ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (countryId > 0)
|
||||||
{
|
{
|
||||||
gameSystem = (int)sigDB.Rows[0][0];
|
gameCountries.Add(countryId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dbDict.Add("systemid", gameSystem);
|
}
|
||||||
|
|
||||||
// store publisher
|
List<int> gameLanguages = new List<int>();
|
||||||
int gamePublisher = 0;
|
if (
|
||||||
if (gameObject.Publisher != null)
|
gameObject.Language != null &&
|
||||||
|
gameObject.Language != "nolang"
|
||||||
|
)
|
||||||
|
{
|
||||||
|
string[] languages = gameObject.Language.Split(",");
|
||||||
|
foreach (string language in languages)
|
||||||
{
|
{
|
||||||
sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher";
|
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(), ""));
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
if (languageId == -1)
|
||||||
if (sigDB.Rows.Count == 0)
|
{
|
||||||
{
|
Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Unable to locate language id for " + language.Trim());
|
||||||
// entry not present, insert it
|
sql = "INSERT INTO Language (`Code`, `Value`) VALUES (@code, @name); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||||
sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
Dictionary<string, object> langDict = new Dictionary<string, object>{
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
{ "code", language.Trim() },
|
||||||
gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]);
|
{ "name", language.Trim() }
|
||||||
|
};
|
||||||
|
languageId = int.Parse(db.ExecuteCMD(sql, langDict).Rows[0][0].ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (languageId > 0)
|
||||||
{
|
{
|
||||||
gamePublisher = (int)sigDB.Rows[0][0];
|
gameLanguages.Add(languageId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dbDict.Add("publisherid", gamePublisher);
|
}
|
||||||
|
|
||||||
// store game
|
dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, ""));
|
||||||
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";
|
// store platform
|
||||||
|
int gameSystem = 0;
|
||||||
|
if (gameObject.System != null)
|
||||||
|
{
|
||||||
|
sql = "SELECT `Id` FROM Signatures_Platforms WHERE `Platform`=@platform";
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
if (sigDB.Rows.Count == 0)
|
if (sigDB.Rows.Count == 0)
|
||||||
{
|
{
|
||||||
// entry not present, insert it
|
// entry not present, insert it
|
||||||
sql = "INSERT INTO Signatures_Games " +
|
sql = "INSERT INTO Signatures_Platforms (`Platform`) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||||
"(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);
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
gameId = Convert.ToInt32(sigDB.Rows[0][0]);
|
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gameId = (int)sigDB.Rows[0][0];
|
gameSystem = (int)sigDB.Rows[0][0];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
dbDict.Add("systemid", gameSystem);
|
||||||
|
|
||||||
// store rom
|
// store publisher
|
||||||
foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms)
|
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)
|
||||||
{
|
{
|
||||||
if (romObject.Md5 != null || romObject.Sha1 != 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<string, object> countryDict = new Dictionary<string, object>{
|
||||||
|
{ "gameid", gameId },
|
||||||
|
{ "Countryid", gameCountry }
|
||||||
|
};
|
||||||
|
if (db.ExecuteCMD(sql, countryDict).Rows.Count == 0)
|
||||||
{
|
{
|
||||||
int romId = 0;
|
sql = "INSERT INTO Signatures_Games_Countries (GameId, CountryId) VALUES (@gameid, @Countryid)";
|
||||||
sql = "SELECT * FROM Signatures_Roms WHERE `GameId`=@gameid AND (`MD5`=@md5 AND `SHA1`=@sha1)";
|
db.ExecuteCMD(sql, countryDict);
|
||||||
dbDict = new Dictionary<string, object>();
|
}
|
||||||
dbDict.Add("gameid", gameId);
|
}
|
||||||
dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, ""));
|
catch
|
||||||
dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, ""));
|
{
|
||||||
dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "").ToString().ToLower());
|
Console.WriteLine("Game id: " + gameId + " with Country " + gameCountry);
|
||||||
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)
|
// insert languages
|
||||||
|
foreach (int gameLanguage in gameLanguages)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
sql = "SELECT * FROM Signatures_Games_Languages WHERE GameId = @gameid AND LanguageId = @languageid";
|
||||||
|
Dictionary<string, object> langDict = new Dictionary<string, object>{
|
||||||
|
{ "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<string, object>();
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
if (romObject.Attributes.Count > 0)
|
dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes));
|
||||||
{
|
|
||||||
dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dbDict.Add("attributes", "[ ]");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dbDict.Add("attributes", "[ ]");
|
dbDict.Add("attributes", "");
|
||||||
}
|
}
|
||||||
dbDict.Add("romtype", (int)romObject.RomType);
|
}
|
||||||
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, ""));
|
else
|
||||||
dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, ""));
|
{
|
||||||
dbDict.Add("metadatasource", romObject.SignatureSource);
|
dbDict.Add("attributes", "");
|
||||||
dbDict.Add("ingestorversion", 2);
|
}
|
||||||
|
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);
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
romId = Convert.ToInt32(sigDB.Rows[0][0]);
|
// map the rom to the source
|
||||||
}
|
sql = "SELECT * FROM Signatures_RomToSource WHERE SourceId=@sourceid AND RomId=@romid;";
|
||||||
else
|
dbDict.Add("romid", romId);
|
||||||
{
|
dbDict.Add("sourceId", sourceId);
|
||||||
romId = (int)sigDB.Rows[0][0];
|
|
||||||
}
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
if (sigDB.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
sql = "INSERT INTO Signatures_RomToSource (`SourceId`, `RomId`) VALUES (@sourceid, @romid);";
|
||||||
|
db.ExecuteCMD(sql, dbDict);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
|
File.Move(XMLFile, Path.Combine(ProcessedDirectory, Path.GetFileName(XMLFile)));
|
||||||
|
if (DBFile != null)
|
||||||
{
|
{
|
||||||
Logging.Log(Logging.LogType.Warning, "Signature Ingestor - XML", "Invalid import file: " + XMLFile, ex);
|
File.Move(DBFile, Path.Combine(XMLDBProcessedDirectory, Path.GetFileName(DBFile)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logging.Log(Logging.LogType.Debug, "Signature Ingestor - XML", "Rejecting already imported file: " + XMLFile);
|
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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -56,8 +56,8 @@ namespace gaseous_server.Classes
|
|||||||
System = (string)sigDbRow["Platform"],
|
System = (string)sigDbRow["Platform"],
|
||||||
SystemVariant = (string)sigDbRow["SystemVariant"],
|
SystemVariant = (string)sigDbRow["SystemVariant"],
|
||||||
Video = (string)sigDbRow["Video"],
|
Video = (string)sigDbRow["Video"],
|
||||||
Country = (string)sigDbRow["Country"],
|
Country = "",
|
||||||
Language = (string)sigDbRow["Language"],
|
Language = "",
|
||||||
Copyright = (string)sigDbRow["Copyright"]
|
Copyright = (string)sigDbRow["Copyright"]
|
||||||
},
|
},
|
||||||
Rom = new gaseous_server.Models.Signatures_Games.RomItem
|
Rom = new gaseous_server.Models.Signatures_Games.RomItem
|
||||||
@@ -69,13 +69,22 @@ namespace gaseous_server.Classes
|
|||||||
Md5 = ((string)sigDbRow["MD5"]).ToLower(),
|
Md5 = ((string)sigDbRow["MD5"]).ToLower(),
|
||||||
Sha1 = ((string)sigDbRow["SHA1"]).ToLower(),
|
Sha1 = ((string)sigDbRow["SHA1"]).ToLower(),
|
||||||
DevelopmentStatus = (string)sigDbRow["DevelopmentStatus"],
|
DevelopmentStatus = (string)sigDbRow["DevelopmentStatus"],
|
||||||
Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<KeyValuePair<string, object>>>((string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]")),
|
|
||||||
RomType = (gaseous_server.Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["RomType"],
|
RomType = (gaseous_server.Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["RomType"],
|
||||||
RomTypeMedia = (string)sigDbRow["RomTypeMedia"],
|
RomTypeMedia = (string)sigDbRow["RomTypeMedia"],
|
||||||
MediaLabel = (string)sigDbRow["MediaLabel"],
|
MediaLabel = (string)sigDbRow["MediaLabel"],
|
||||||
SignatureSource = (gaseous_server.Models.Signatures_Games.RomItem.SignatureSourceType)(Int32)sigDbRow["MetadataSource"]
|
SignatureSource = (gaseous_server.Models.Signatures_Games.RomItem.SignatureSourceType)(Int32)sigDbRow["MetadataSource"]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
string attributeValues = (string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]");
|
||||||
|
Dictionary<string, object> attributesDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(attributeValues);
|
||||||
|
if (attributesDict != null)
|
||||||
|
{
|
||||||
|
gameItem.Rom.Attributes = [.. attributesDict];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gameItem.Rom.Attributes = new List<KeyValuePair<string, object>>();
|
||||||
|
}
|
||||||
GamesList.Add(gameItem);
|
GamesList.Add(gameItem);
|
||||||
}
|
}
|
||||||
return GamesList;
|
return GamesList;
|
||||||
|
@@ -15,7 +15,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class AccountController : Controller
|
public class AccountController : Controller
|
||||||
|
@@ -10,7 +10,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize(Roles = "Admin,Gamer,Player")]
|
[Authorize(Roles = "Admin,Gamer,Player")]
|
||||||
public class BackgroundTasksController : Controller
|
public class BackgroundTasksController : Controller
|
||||||
|
@@ -12,7 +12,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class BiosController : Controller
|
public class BiosController : Controller
|
||||||
|
@@ -14,7 +14,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class CollectionsController : Controller
|
public class CollectionsController : Controller
|
||||||
@@ -145,7 +145,7 @@ namespace gaseous_server.Controllers
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
return NotFound(ex);
|
return NotFound(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -277,7 +277,7 @@ namespace gaseous_server.Controllers
|
|||||||
[Route("{CollectionId}/AlwaysInclude")]
|
[Route("{CollectionId}/AlwaysInclude")]
|
||||||
[ProducesResponseType(typeof(Classes.Collections.CollectionItem), StatusCodes.Status200OK)]
|
[ProducesResponseType(typeof(Classes.Collections.CollectionItem), StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
public async Task<ActionResult> EditCollectionAlwaysInclude(long CollectionId, [FromQuery]bool Rebuild, [FromBody]Collections.CollectionItem.AlwaysIncludeItem Inclusion)
|
public async Task<ActionResult> EditCollectionAlwaysInclude(long CollectionId, [FromQuery] bool Rebuild, [FromBody] Collections.CollectionItem.AlwaysIncludeItem Inclusion)
|
||||||
{
|
{
|
||||||
var user = await _userManager.GetUserAsync(User);
|
var user = await _userManager.GetUserAsync(User);
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ using Asp.Versioning;
|
|||||||
namespace gaseous_server.Controllers
|
namespace gaseous_server.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
|
@@ -22,7 +22,7 @@ using Asp.Versioning;
|
|||||||
namespace gaseous_server.Controllers
|
namespace gaseous_server.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
@@ -53,7 +53,7 @@ namespace gaseous_server.Controllers
|
|||||||
int minrating = -1,
|
int minrating = -1,
|
||||||
int maxrating = -1,
|
int maxrating = -1,
|
||||||
bool sortdescending = false)
|
bool sortdescending = false)
|
||||||
{
|
{
|
||||||
|
|
||||||
return Ok(GetGames(name, platform, genre, gamemode, playerperspective, theme, minrating, maxrating, "Adult", true, true, sortdescending));
|
return Ok(GetGames(name, platform, genre, gamemode, playerperspective, theme, minrating, maxrating, "Adult", true, true, sortdescending));
|
||||||
}
|
}
|
||||||
@@ -474,13 +474,14 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
IGDB.Models.Artwork artworkObject = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), true);
|
IGDB.Models.Artwork artworkObject = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), true);
|
||||||
|
|
||||||
if (artworkObject != null) {
|
if (artworkObject != null)
|
||||||
|
{
|
||||||
//string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Artwork", size.ToString(), artworkObject.ImageId + ".jpg");
|
//string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Artwork", size.ToString(), artworkObject.ImageId + ".jpg");
|
||||||
|
|
||||||
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Artwork");
|
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Artwork");
|
||||||
|
|
||||||
Communications comms = new Communications();
|
Communications comms = new Communications();
|
||||||
Task<string> ImgFetch = comms.GetSpecificImageFromServer(basePath, artworkObject.ImageId, size, new List<Communications.IGDBAPI_ImageSize>{ Communications.IGDBAPI_ImageSize.original });
|
Task<string> ImgFetch = comms.GetSpecificImageFromServer(basePath, artworkObject.ImageId, size, new List<Communications.IGDBAPI_ImageSize> { Communications.IGDBAPI_ImageSize.original });
|
||||||
|
|
||||||
string coverFilePath = ImgFetch.Result;
|
string coverFilePath = ImgFetch.Result;
|
||||||
|
|
||||||
@@ -580,11 +581,12 @@ namespace gaseous_server.Controllers
|
|||||||
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Covers");
|
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Covers");
|
||||||
|
|
||||||
Communications comms = new Communications();
|
Communications comms = new Communications();
|
||||||
Task<string> ImgFetch = comms.GetSpecificImageFromServer(basePath, cover.ImageId, size, new List<Communications.IGDBAPI_ImageSize>{ Communications.IGDBAPI_ImageSize.cover_big, Communications.IGDBAPI_ImageSize.original });
|
Task<string> ImgFetch = comms.GetSpecificImageFromServer(basePath, cover.ImageId, size, new List<Communications.IGDBAPI_ImageSize> { Communications.IGDBAPI_ImageSize.cover_big, Communications.IGDBAPI_ImageSize.original });
|
||||||
|
|
||||||
string coverFilePath = ImgFetch.Result;
|
string coverFilePath = ImgFetch.Result;
|
||||||
|
|
||||||
if (System.IO.File.Exists(coverFilePath)) {
|
if (System.IO.File.Exists(coverFilePath))
|
||||||
|
{
|
||||||
string filename = cover.ImageId + ".jpg";
|
string filename = cover.ImageId + ".jpg";
|
||||||
string filepath = coverFilePath;
|
string filepath = coverFilePath;
|
||||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||||
@@ -796,7 +798,8 @@ namespace gaseous_server.Controllers
|
|||||||
companyData.Add("company", company);
|
companyData.Add("company", company);
|
||||||
|
|
||||||
return Ok(companyData);
|
return Ok(companyData);
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
@@ -1388,7 +1391,8 @@ namespace gaseous_server.Controllers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||||
if (gameObject != null) {
|
if (gameObject != null)
|
||||||
|
{
|
||||||
IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
||||||
if (screenshotObject != null)
|
if (screenshotObject != null)
|
||||||
{
|
{
|
||||||
@@ -1428,7 +1432,7 @@ namespace gaseous_server.Controllers
|
|||||||
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Screenshots");
|
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Screenshots");
|
||||||
|
|
||||||
Communications comms = new Communications();
|
Communications comms = new Communications();
|
||||||
Task<string> ImgFetch = comms.GetSpecificImageFromServer(basePath, screenshotObject.ImageId, Size, new List<Communications.IGDBAPI_ImageSize>{ Communications.IGDBAPI_ImageSize.original });
|
Task<string> ImgFetch = comms.GetSpecificImageFromServer(basePath, screenshotObject.ImageId, Size, new List<Communications.IGDBAPI_ImageSize> { Communications.IGDBAPI_ImageSize.original });
|
||||||
|
|
||||||
string coverFilePath = ImgFetch.Result;
|
string coverFilePath = ImgFetch.Result;
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize(Roles = "Admin")]
|
[Authorize(Roles = "Admin")]
|
||||||
public class LibraryController : Controller
|
public class LibraryController : Controller
|
||||||
|
@@ -11,7 +11,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize(Roles = "Admin")]
|
[Authorize(Roles = "Admin")]
|
||||||
public class LogsController : Controller
|
public class LogsController : Controller
|
||||||
|
@@ -19,7 +19,7 @@ using Asp.Versioning;
|
|||||||
namespace gaseous_server.Controllers
|
namespace gaseous_server.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
|
@@ -18,7 +18,7 @@ using Asp.Versioning;
|
|||||||
namespace gaseous_server.Controllers
|
namespace gaseous_server.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
|
@@ -19,7 +19,7 @@ using Asp.Versioning;
|
|||||||
namespace gaseous_server.Controllers
|
namespace gaseous_server.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
|
@@ -18,7 +18,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class SearchController : Controller
|
public class SearchController : Controller
|
||||||
|
@@ -17,7 +17,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]/[action]")]
|
[Route("api/v{version:apiVersion}/[controller]/[action]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class SignaturesController : Controller
|
public class SignaturesController : Controller
|
||||||
|
@@ -19,7 +19,7 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class SystemController : Controller
|
public class SystemController : Controller
|
||||||
@@ -260,7 +260,13 @@ namespace gaseous_server.Controllers
|
|||||||
{
|
{
|
||||||
AlwaysLogToDisk = Config.LoggingConfiguration.AlwaysLogToDisk,
|
AlwaysLogToDisk = Config.LoggingConfiguration.AlwaysLogToDisk,
|
||||||
MinimumLogRetentionPeriod = Config.LoggingConfiguration.LogRetention,
|
MinimumLogRetentionPeriod = Config.LoggingConfiguration.LogRetention,
|
||||||
EmulatorDebugMode = Boolean.Parse(Config.ReadSetting<string>("emulatorDebugMode", false.ToString()))
|
EmulatorDebugMode = Boolean.Parse(Config.ReadSetting<string>("emulatorDebugMode", false.ToString())),
|
||||||
|
SearchTypes = Config.ReadSetting<List<Classes.Metadata.Games.SearchType>>("DefaultSearchMethods", new List<gaseous_server.Classes.Metadata.Games.SearchType>() {
|
||||||
|
Games.SearchType.where,
|
||||||
|
Games.SearchType.wherefuzzy,
|
||||||
|
Games.SearchType.search,
|
||||||
|
Games.SearchType.searchNoPlatform
|
||||||
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
return Ok(systemSettingsModel);
|
return Ok(systemSettingsModel);
|
||||||
@@ -279,6 +285,7 @@ namespace gaseous_server.Controllers
|
|||||||
Config.LoggingConfiguration.AlwaysLogToDisk = model.AlwaysLogToDisk;
|
Config.LoggingConfiguration.AlwaysLogToDisk = model.AlwaysLogToDisk;
|
||||||
Config.LoggingConfiguration.LogRetention = model.MinimumLogRetentionPeriod;
|
Config.LoggingConfiguration.LogRetention = model.MinimumLogRetentionPeriod;
|
||||||
Config.SetSetting<string>("emulatorDebugMode", model.EmulatorDebugMode.ToString());
|
Config.SetSetting<string>("emulatorDebugMode", model.EmulatorDebugMode.ToString());
|
||||||
|
Config.SetSetting<List<Classes.Metadata.Games.SearchType>>("DefaultSearchMethods", model.SearchTypes);
|
||||||
Config.UpdateConfig();
|
Config.UpdateConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -719,5 +726,6 @@ namespace gaseous_server.Controllers
|
|||||||
public bool AlwaysLogToDisk { get; set; }
|
public bool AlwaysLogToDisk { get; set; }
|
||||||
public int MinimumLogRetentionPeriod { get; set; }
|
public int MinimumLogRetentionPeriod { get; set; }
|
||||||
public bool EmulatorDebugMode { get; set; }
|
public bool EmulatorDebugMode { get; set; }
|
||||||
|
public List<Classes.Metadata.Games.SearchType> SearchTypes { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
19
gaseous-server/Controllers/V1.1/HealthCheckController.cs
Normal file
19
gaseous-server/Controllers/V1.1/HealthCheckController.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Asp.Versioning;
|
||||||
|
|
||||||
|
namespace gaseous_server.Controllers.v1_1
|
||||||
|
{
|
||||||
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
|
[ApiVersion("1.1")]
|
||||||
|
[ApiController]
|
||||||
|
public class HealthCheckController : ControllerBase
|
||||||
|
{
|
||||||
|
[MapToApiVersion("1.1")]
|
||||||
|
[HttpGet]
|
||||||
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
|
public ActionResult Healthcheck()
|
||||||
|
{
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -11,7 +11,7 @@ using System.IO.Compression;
|
|||||||
namespace gaseous_server.Controllers.v1_1
|
namespace gaseous_server.Controllers.v1_1
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
public class StateManagerController : ControllerBase
|
public class StateManagerController : ControllerBase
|
||||||
|
@@ -9,10 +9,10 @@ using Asp.Versioning;
|
|||||||
namespace gaseous_server.Controllers.v1_1
|
namespace gaseous_server.Controllers.v1_1
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/[controller]")]
|
[Route("api/v{version:apiVersion}/[controller]")]
|
||||||
[ApiVersion("1.0")]
|
[ApiVersion("1.0", Deprecated = true)]
|
||||||
[ApiVersion("1.1")]
|
[ApiVersion("1.1")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
public class StatisticsController: ControllerBase
|
public class StatisticsController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly UserManager<ApplicationUser> _userManager;
|
private readonly UserManager<ApplicationUser> _userManager;
|
||||||
private readonly SignInManager<ApplicationUser> _signInManager;
|
private readonly SignInManager<ApplicationUser> _signInManager;
|
||||||
|
@@ -245,14 +245,32 @@ namespace gaseous_server
|
|||||||
CallingQueueItem = this
|
CallingQueueItem = this
|
||||||
};
|
};
|
||||||
|
|
||||||
Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing TOSEC files");
|
foreach (int i in Enum.GetValues(typeof(gaseous_signature_parser.parser.SignatureParser)))
|
||||||
tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "TOSEC"), gaseous_signature_parser.parser.SignatureParser.TOSEC);
|
{
|
||||||
|
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 MAME Arcade files");
|
string SignaturePath = Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, parserType.ToString());
|
||||||
tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME Arcade"), gaseous_signature_parser.parser.SignatureParser.MAMEArcade);
|
string SignatureProcessedPath = Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, parserType.ToString());
|
||||||
|
|
||||||
Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing MAME MESS files");
|
if (!Directory.Exists(SignaturePath))
|
||||||
tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME MESS"), gaseous_signature_parser.parser.SignatureParser.MAMEMess);
|
{
|
||||||
|
Directory.CreateDirectory(SignaturePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Directory.Exists(SignatureProcessedPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(SignatureProcessedPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
tIngest.Import(SignaturePath, SignatureProcessedPath, parserType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_SaveLastRunTime = true;
|
_SaveLastRunTime = true;
|
||||||
|
|
||||||
|
@@ -46,6 +46,14 @@ AgeRatings.PopulateAgeMap();
|
|||||||
// load app settings
|
// load app settings
|
||||||
Config.InitSettings();
|
Config.InitSettings();
|
||||||
|
|
||||||
|
// set default search settings
|
||||||
|
Config.SetSetting<List<gaseous_server.Classes.Metadata.Games.SearchType>>("DefaultSearchMethods", new List<gaseous_server.Classes.Metadata.Games.SearchType>() {
|
||||||
|
Games.SearchType.where,
|
||||||
|
Games.SearchType.wherefuzzy,
|
||||||
|
Games.SearchType.search,
|
||||||
|
Games.SearchType.searchNoPlatform
|
||||||
|
});
|
||||||
|
|
||||||
// disable hasheous
|
// disable hasheous
|
||||||
Config.MetadataConfiguration.SignatureSource = HasheousClient.Models.MetadataModel.SignatureSources.LocalOnly;
|
Config.MetadataConfiguration.SignatureSource = HasheousClient.Models.MetadataModel.SignatureSources.LocalOnly;
|
||||||
|
|
||||||
@@ -128,7 +136,7 @@ builder.Services.AddControllers(options =>
|
|||||||
});
|
});
|
||||||
builder.Services.AddApiVersioning(config =>
|
builder.Services.AddApiVersioning(config =>
|
||||||
{
|
{
|
||||||
config.DefaultApiVersion = new ApiVersion(1, 0);
|
config.DefaultApiVersion = new ApiVersion(1, 1);
|
||||||
config.AssumeDefaultVersionWhenUnspecified = true;
|
config.AssumeDefaultVersionWhenUnspecified = true;
|
||||||
config.ReportApiVersions = true;
|
config.ReportApiVersions = true;
|
||||||
config.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(),
|
config.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(),
|
||||||
@@ -199,6 +207,9 @@ builder.Services.AddSwaggerGen(options =>
|
|||||||
// using System.Reflection;
|
// using System.Reflection;
|
||||||
var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
|
var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
|
||||||
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
|
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
|
||||||
|
|
||||||
|
// sort the endpoints
|
||||||
|
options.OrderActionsBy((apiDesc) => $"{apiDesc.RelativePath}_{apiDesc.HttpMethod}");
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
builder.Services.AddHostedService<TimedHostedService>();
|
builder.Services.AddHostedService<TimedHostedService>();
|
||||||
@@ -263,9 +274,12 @@ app.UseSwaggerUI(options =>
|
|||||||
var descriptions = app.DescribeApiVersions();
|
var descriptions = app.DescribeApiVersions();
|
||||||
foreach (var description in descriptions)
|
foreach (var description in descriptions)
|
||||||
{
|
{
|
||||||
var url = $"/swagger/{description.GroupName}/swagger.json";
|
if (description.IsDeprecated == false)
|
||||||
var name = description.GroupName.ToUpperInvariant();
|
{
|
||||||
options.SwaggerEndpoint(url, name);
|
var url = $"/swagger/{description.GroupName}/swagger.json";
|
||||||
|
var name = description.GroupName.ToUpperInvariant();
|
||||||
|
options.SwaggerEndpoint(url, name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
73
gaseous-server/Support/Country.txt
Normal file
73
gaseous-server/Support/Country.txt
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
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
|
37
gaseous-server/Support/Database/MySQL/gaseous-1023.sql
Normal file
37
gaseous-server/Support/Database/MySQL/gaseous-1023.sql
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
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
|
||||||
|
);
|
||||||
|
|
||||||
|
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
|
||||||
|
);
|
47
gaseous-server/Support/Language.txt
Normal file
47
gaseous-server/Support/Language.txt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
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
|
File diff suppressed because it is too large
Load Diff
@@ -16,20 +16,20 @@
|
|||||||
<DocumentationFile>bin\Release\net8.0\gaseous-server.xml</DocumentationFile>
|
<DocumentationFile>bin\Release\net8.0\gaseous-server.xml</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Asp.Versioning.Mvc" Version="8.0.0" />
|
<PackageReference Include="Asp.Versioning.Mvc" Version="8.1.0" />
|
||||||
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.0.0" />
|
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
|
||||||
<PackageReference Include="gaseous-signature-parser" Version="2.1.0" />
|
<PackageReference Include="gaseous-signature-parser" Version="2.3.0" />
|
||||||
<PackageReference Include="gaseous.IGDB" Version="1.0.2" />
|
<PackageReference Include="gaseous.IGDB" Version="1.0.2" />
|
||||||
<PackageReference Include="hasheous-client" Version="0.1.0" />
|
<PackageReference Include="hasheous-client" Version="0.1.0" />
|
||||||
<PackageReference Include="Magick.NET-Q8-AnyCPU" Version="13.5.0" />
|
<PackageReference Include="Magick.NET-Q8-AnyCPU" Version="13.5.0" />
|
||||||
<PackageReference Include="sharpcompress" Version="0.36.0" />
|
<PackageReference Include="sharpcompress" Version="0.38.0" />
|
||||||
<PackageReference Include="Squid-Box.SevenZipSharp" Version="1.6.1.23" />
|
<PackageReference Include="Squid-Box.SevenZipSharp" Version="1.6.2.24" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.9.0" />
|
||||||
<PackageReference Include="MySqlConnector" Version="2.3.5" />
|
<PackageReference Include="MySqlConnector" Version="2.3.7" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="8.0.1" />
|
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="8.0.10" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.1" />
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.0" />
|
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.6" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -65,6 +65,7 @@
|
|||||||
<None Remove="Support\Database\MySQL\gaseous-1020.sql" />
|
<None Remove="Support\Database\MySQL\gaseous-1020.sql" />
|
||||||
<None Remove="Support\Database\MySQL\gaseous-1021.sql" />
|
<None Remove="Support\Database\MySQL\gaseous-1021.sql" />
|
||||||
<None Remove="Support\Database\MySQL\gaseous-1022.sql" />
|
<None Remove="Support\Database\MySQL\gaseous-1022.sql" />
|
||||||
|
<None Remove="Support\Database\MySQL\gaseous-1023.sql" />
|
||||||
<None Remove="Classes\Metadata\" />
|
<None Remove="Classes\Metadata\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -86,6 +87,8 @@
|
|||||||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Support\Country.txt" />
|
||||||
|
<EmbeddedResource Include="Support\Language.txt" />
|
||||||
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1000.sql" />
|
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1000.sql" />
|
||||||
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1001.sql" />
|
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1001.sql" />
|
||||||
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1002.sql" />
|
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1002.sql" />
|
||||||
@@ -110,5 +113,6 @@
|
|||||||
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1020.sql" />
|
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1020.sql" />
|
||||||
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1021.sql" />
|
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1021.sql" />
|
||||||
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1022.sql" />
|
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1022.sql" />
|
||||||
|
<EmbeddedResource Include="Support\Database\MySQL\gaseous-1023.sql" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@@ -41,11 +41,10 @@
|
|||||||
EJS_threads = false;
|
EJS_threads = false;
|
||||||
|
|
||||||
EJS_Buttons = {
|
EJS_Buttons = {
|
||||||
saveSavFiles: false,
|
exitEmulation: false
|
||||||
loadSavFiles: false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EJS_onSaveState = function(e) {
|
EJS_onSaveState = function (e) {
|
||||||
var returnValue = {
|
var returnValue = {
|
||||||
"ScreenshotByteArrayBase64": btoa(Uint8ToString(e.screenshot)),
|
"ScreenshotByteArrayBase64": btoa(Uint8ToString(e.screenshot)),
|
||||||
"StateByteArrayBase64": btoa(Uint8ToString(e.state))
|
"StateByteArrayBase64": btoa(Uint8ToString(e.state))
|
||||||
@@ -72,7 +71,7 @@
|
|||||||
returnValue = undefined;
|
returnValue = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
EJS_onLoadState = function(e) {
|
EJS_onLoadState = function (e) {
|
||||||
showDialog('emulatorloadstate', { "romId": romId, "IsMediaGroup": IsMediaGroup });
|
showDialog('emulatorloadstate', { "romId": romId, "IsMediaGroup": IsMediaGroup });
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
8
gaseous-server/wwwroot/images/NoIntro-logo.svg
Normal file
8
gaseous-server/wwwroot/images/NoIntro-logo.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 480 KiB |
BIN
gaseous-server/wwwroot/images/redump.png
Normal file
BIN
gaseous-server/wwwroot/images/redump.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 92 KiB |
@@ -85,6 +85,27 @@
|
|||||||
class="romlink">https://www.progettosnaps.net/index.php</a>
|
class="romlink">https://www.progettosnaps.net/index.php</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="text-align: center;">
|
||||||
|
<a href="https://no-intro.org" target="_blank" rel="noopener noreferrer"><img src="/images/NoIntro-logo.svg"
|
||||||
|
style="height: 36px;"></a>
|
||||||
|
</td>
|
||||||
|
<td colspan="2">
|
||||||
|
No-Intro<br>
|
||||||
|
<a href="https://no-intro.org" target="_blank" rel="noopener noreferrer"
|
||||||
|
class="romlink">https://no-intro.org</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="text-align: center;">
|
||||||
|
<a href="http://redump.org" target="_blank" rel="noopener noreferrer"><img src="/images/redump.png"
|
||||||
|
style="height: 36px;"></a>
|
||||||
|
</td>
|
||||||
|
<td colspan="2">
|
||||||
|
Redump<br>
|
||||||
|
<a href="http://redump.org" target="_blank" rel="noopener noreferrer" class="romlink">http://redump.org</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
@@ -6,7 +6,8 @@
|
|||||||
<table id="settings_libraries" class="romtable" style="width: 100%;" cellspacing="0">
|
<table id="settings_libraries" class="romtable" style="width: 100%;" cellspacing="0">
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
<div style="text-align: right;"><button id="settings_newlibrary" onclick="showDialog('librarynew');">New Library</button></div>
|
<div style="text-align: right;"><button id="settings_newlibrary" onclick="showDialog('librarynew');">New
|
||||||
|
Library</button></div>
|
||||||
|
|
||||||
<h2>Advanced Settings</h2>
|
<h2>Advanced Settings</h2>
|
||||||
<p><strong>Warning</strong> Do not modify the below settings unless you know what you're doing.</p>
|
<p><strong>Warning</strong> Do not modify the below settings unless you know what you're doing.</p>
|
||||||
@@ -14,7 +15,8 @@
|
|||||||
<table id="settings_tasktimers" class="romtable" style="width: 100%;" cellspacing="0">
|
<table id="settings_tasktimers" class="romtable" style="width: 100%;" cellspacing="0">
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
<div style="text-align: right;"><button id="settings_tasktimers_default" onclick="defaultTaskTimers();">Reset to Default</button><button id="settings_tasktimers_new" onclick="saveTaskTimers();">Save</button></div>
|
<div style="text-align: right;"><button id="settings_tasktimers_default" onclick="defaultTaskTimers();">Reset to
|
||||||
|
Default</button><button id="settings_tasktimers_new" onclick="saveTaskTimers();">Save</button></div>
|
||||||
|
|
||||||
<h3>System Settings</h3>
|
<h3>System Settings</h3>
|
||||||
<table cellspacing="0" style="width: 100%;">
|
<table cellspacing="0" style="width: 100%;">
|
||||||
@@ -26,13 +28,15 @@
|
|||||||
Write logs
|
Write logs
|
||||||
</th>
|
</th>
|
||||||
<td>
|
<td>
|
||||||
<input type="radio" name="settings_logs_write" id="settings_logs_write_db" value="false" checked="checked"><label for="settings_logs_write_db"> To database only (default)</label>
|
<input type="radio" name="settings_logs_write" id="settings_logs_write_db" value="false"
|
||||||
|
checked="checked"><label for="settings_logs_write_db"> To database only (default)</label>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>
|
<td>
|
||||||
<input type="radio" name="settings_logs_write" id="settings_logs_write_fs" value="true"><label for="settings_logs_write_fs"> To database and disk</label>
|
<input type="radio" name="settings_logs_write" id="settings_logs_write_fs" value="true"><label
|
||||||
|
for="settings_logs_write_fs"> To database and disk</label>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -46,6 +50,58 @@
|
|||||||
<input type="number" min="1" id="settings_logs_retention" />
|
<input type="number" min="1" id="settings_logs_retention" />
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
Allowed metadata search modes:
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" name="settings_metadata_search" id="settings_metadata_search_where" /><label
|
||||||
|
for="settings_metadata_search_where">
|
||||||
|
Exact:
|
||||||
|
<i>
|
||||||
|
Searches for exact matches only. Example search: name = "Super Mario Bros."
|
||||||
|
</i>
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" name="settings_metadata_search" id="settings_metadata_search_wherefuzzy" /><label
|
||||||
|
for="settings_metadata_search_wherefuzzy">
|
||||||
|
Partial:
|
||||||
|
<i>
|
||||||
|
Searches for partial matches. Example search: name = "Mario"
|
||||||
|
</i>
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" name="settings_metadata_search" id="settings_metadata_search_search" /><label
|
||||||
|
for="settings_metadata_search_search">
|
||||||
|
Search:
|
||||||
|
<i>
|
||||||
|
Searches for partial matches using full text search. Example search: name = "Mario"
|
||||||
|
</i>
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" name="settings_metadata_search"
|
||||||
|
id="settings_metadata_search_searchNoPlatform" /><label for="settings_metadata_search_searchNoPlatform">
|
||||||
|
Search (no platform
|
||||||
|
contraint):
|
||||||
|
<i>
|
||||||
|
Searches for partial matches using full text search, but without a platform constraint. Example
|
||||||
|
search: name = "Mario"
|
||||||
|
</i>
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th colspan="2">Emulator</th>
|
<th colspan="2">Emulator</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -115,7 +171,7 @@
|
|||||||
ajaxCall(
|
ajaxCall(
|
||||||
'/api/v1/System/Settings/BackgroundTasks/Configuration',
|
'/api/v1/System/Settings/BackgroundTasks/Configuration',
|
||||||
'GET',
|
'GET',
|
||||||
function(result) {
|
function (result) {
|
||||||
var targetTable = document.getElementById('settings_tasktimers');
|
var targetTable = document.getElementById('settings_tasktimers');
|
||||||
targetTable.innerHTML = '';
|
targetTable.innerHTML = '';
|
||||||
|
|
||||||
@@ -171,7 +227,7 @@
|
|||||||
daySelector.multiple = 'multiple';
|
daySelector.multiple = 'multiple';
|
||||||
daySelector.setAttribute('data-default', value.defaultAllowedDays.join(","));
|
daySelector.setAttribute('data-default', value.defaultAllowedDays.join(","));
|
||||||
daySelector.style.width = '95%';
|
daySelector.style.width = '95%';
|
||||||
var days = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ];
|
var days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
|
||||||
for (var d = 0; d < days.length; d++) {
|
for (var d = 0; d < days.length; d++) {
|
||||||
var dayOpt = document.createElement('option');
|
var dayOpt = document.createElement('option');
|
||||||
dayOpt.value = days[d];
|
dayOpt.value = days[d];
|
||||||
@@ -312,7 +368,7 @@
|
|||||||
var taskName = timerValues[i].getAttribute('data-name');
|
var taskName = timerValues[i].getAttribute('data-name');
|
||||||
var taskEnabled = document.getElementById('settings_enabled_' + taskName).checked;
|
var taskEnabled = document.getElementById('settings_enabled_' + taskName).checked;
|
||||||
var taskIntervalObj = document.getElementById('settings_tasktimers_' + taskName);
|
var taskIntervalObj = document.getElementById('settings_tasktimers_' + taskName);
|
||||||
var taskInterval = function() { if (taskIntervalObj.value) { return taskIntervalObj.value; } else { return taskIntervalObj.getAttribute('placeholder'); } };
|
var taskInterval = function () { if (taskIntervalObj.value) { return taskIntervalObj.value; } else { return taskIntervalObj.getAttribute('placeholder'); } };
|
||||||
var taskDaysRaw = $('#settings_alloweddays_' + taskName).select2('data');
|
var taskDaysRaw = $('#settings_alloweddays_' + taskName).select2('data');
|
||||||
var taskDays = [];
|
var taskDays = [];
|
||||||
if (taskDaysRaw.length > 0) {
|
if (taskDaysRaw.length > 0) {
|
||||||
@@ -327,10 +383,10 @@
|
|||||||
var taskEndHourObj = document.getElementById('settings_tasktimers_' + taskName + '_End_Hour');
|
var taskEndHourObj = document.getElementById('settings_tasktimers_' + taskName + '_End_Hour');
|
||||||
var taskEndMinuteObj = document.getElementById('settings_tasktimers_' + taskName + '_End_Minute');
|
var taskEndMinuteObj = document.getElementById('settings_tasktimers_' + taskName + '_End_Minute');
|
||||||
|
|
||||||
var taskStartHour = function() { if (taskStartHourObj.value) { return taskStartHourObj.value; } else { return taskStartHourObj.getAttribute('placeholder'); } };
|
var taskStartHour = function () { if (taskStartHourObj.value) { return taskStartHourObj.value; } else { return taskStartHourObj.getAttribute('placeholder'); } };
|
||||||
var taskStartMinute = function() { if (taskStartMinuteObj.value) { return taskStartMinuteObj.value; } else { return taskStartMinuteObj.getAttribute('placeholder'); } };
|
var taskStartMinute = function () { if (taskStartMinuteObj.value) { return taskStartMinuteObj.value; } else { return taskStartMinuteObj.getAttribute('placeholder'); } };
|
||||||
var taskEndHour = function() { if (taskEndHourObj.value) { return taskEndHourObj.value; } else { return taskEndHourObj.getAttribute('placeholder'); } };
|
var taskEndHour = function () { if (taskEndHourObj.value) { return taskEndHourObj.value; } else { return taskEndHourObj.getAttribute('placeholder'); } };
|
||||||
var taskEndMinute = function() { if (taskEndMinuteObj.value) { return taskEndMinuteObj.value; } else { return taskEndMinuteObj.getAttribute('placeholder'); } };
|
var taskEndMinute = function () { if (taskEndMinuteObj.value) { return taskEndMinuteObj.value; } else { return taskEndMinuteObj.getAttribute('placeholder'); } };
|
||||||
|
|
||||||
model.push(
|
model.push(
|
||||||
{
|
{
|
||||||
@@ -349,10 +405,10 @@
|
|||||||
ajaxCall(
|
ajaxCall(
|
||||||
'/api/v1/System/Settings/BackgroundTasks/Configuration',
|
'/api/v1/System/Settings/BackgroundTasks/Configuration',
|
||||||
'POST',
|
'POST',
|
||||||
function(result) {
|
function (result) {
|
||||||
getBackgroundTaskTimers();
|
getBackgroundTaskTimers();
|
||||||
},
|
},
|
||||||
function(error) {
|
function (error) {
|
||||||
getBackgroundTaskTimers();
|
getBackgroundTaskTimers();
|
||||||
},
|
},
|
||||||
JSON.stringify(model)
|
JSON.stringify(model)
|
||||||
@@ -393,7 +449,7 @@
|
|||||||
ajaxCall(
|
ajaxCall(
|
||||||
'/api/v1/System/Settings/System',
|
'/api/v1/System/Settings/System',
|
||||||
'GET',
|
'GET',
|
||||||
function(result) {
|
function (result) {
|
||||||
var optionToSelect = 'settings_logs_write_db';
|
var optionToSelect = 'settings_logs_write_db';
|
||||||
if (result.alwaysLogToDisk == true) {
|
if (result.alwaysLogToDisk == true) {
|
||||||
optionToSelect = 'settings_logs_write_fs';
|
optionToSelect = 'settings_logs_write_fs';
|
||||||
@@ -403,6 +459,11 @@
|
|||||||
document.getElementById('settings_logs_retention').value = result.minimumLogRetentionPeriod;
|
document.getElementById('settings_logs_retention').value = result.minimumLogRetentionPeriod;
|
||||||
|
|
||||||
document.getElementById('settings_emulator_debug').checked = result.emulatorDebugMode;
|
document.getElementById('settings_emulator_debug').checked = result.emulatorDebugMode;
|
||||||
|
|
||||||
|
for (let i = 0; i < result.searchTypes.length; i++) {
|
||||||
|
const element = result.searchTypes[i];
|
||||||
|
document.getElementById('settings_metadata_search_' + element).checked = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -421,19 +482,29 @@
|
|||||||
retentionValue = 7;
|
retentionValue = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let searchTypes = [];
|
||||||
|
let searchTypeElements = document.getElementsByName('settings_metadata_search');
|
||||||
|
for (let i = 0; i < searchTypeElements.length; i++) {
|
||||||
|
const element = searchTypeElements[i];
|
||||||
|
if (element.checked) {
|
||||||
|
searchTypes.push(element.id.replace('settings_metadata_search_', ''));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var model = {
|
var model = {
|
||||||
"alwaysLogToDisk": alwaysLogToDisk,
|
"alwaysLogToDisk": alwaysLogToDisk,
|
||||||
"minimumLogRetentionPeriod": retentionValue,
|
"minimumLogRetentionPeriod": retentionValue,
|
||||||
"emulatorDebugMode": document.getElementById('settings_emulator_debug').checked
|
"emulatorDebugMode": document.getElementById('settings_emulator_debug').checked,
|
||||||
|
"searchTypes": searchTypes
|
||||||
};
|
};
|
||||||
|
|
||||||
ajaxCall(
|
ajaxCall(
|
||||||
'/api/v1/System/Settings/System',
|
'/api/v1/System/Settings/System',
|
||||||
'POST',
|
'POST',
|
||||||
function(result) {
|
function (result) {
|
||||||
getSystemSettings();
|
getSystemSettings();
|
||||||
},
|
},
|
||||||
function(error) {
|
function (error) {
|
||||||
getSystemSettings();
|
getSystemSettings();
|
||||||
},
|
},
|
||||||
JSON.stringify(model)
|
JSON.stringify(model)
|
||||||
|
Reference in New Issue
Block a user