Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dc2a6b4638 | ||
![]() |
9081b0bed9 | ||
![]() |
d64877543a | ||
![]() |
649fba1bfa | ||
![]() |
7dfb97608f | ||
![]() |
35bb2f18d9 | ||
![]() |
ad84f5ae58 | ||
![]() |
922c429716 |
4
.gitmodules
vendored
4
.gitmodules
vendored
@@ -1,3 +1,3 @@
|
||||
[submodule "gaseous-server/wwwroot/EmulatorJS"]
|
||||
path = gaseous-server/wwwroot/EmulatorJS
|
||||
[submodule "gaseous-server/wwwroot/emulators/EmulatorJS"]
|
||||
path = gaseous-server/wwwroot/emulators/EmulatorJS
|
||||
url = https://github.com/EmulatorJS/EmulatorJS.git
|
||||
|
@@ -21,6 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
||||
Dockerfile = Dockerfile
|
||||
README.MD = README.MD
|
||||
LICENSE = LICENSE
|
||||
.gitignore = .gitignore
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "screenshots", "screenshots", "{F1A847C7-57BC-4DA9-8F83-CD060A7F5122}"
|
||||
|
BIN
gaseous-server/.DS_Store
vendored
BIN
gaseous-server/.DS_Store
vendored
Binary file not shown.
120
gaseous-server/Classes/Bios.cs
Normal file
120
gaseous-server/Classes/Bios.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Cryptography;
|
||||
using gaseous_tools;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
public class Bios
|
||||
{
|
||||
public Bios()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public static Models.PlatformMapping.PlatformMapItem? BiosHashSignatureLookup(string MD5)
|
||||
{
|
||||
foreach (Models.PlatformMapping.PlatformMapItem platformMapping in Models.PlatformMapping.PlatformMap)
|
||||
{
|
||||
if (platformMapping.WebEmulator != null)
|
||||
{
|
||||
if (platformMapping.WebEmulator.Bios != null)
|
||||
{
|
||||
foreach (Models.PlatformMapping.PlatformMapItem.WebEmulatorItem.EmulatorBiosItem emulatorBiosItem in platformMapping.WebEmulator.Bios)
|
||||
{
|
||||
if (emulatorBiosItem.hash.ToLower() == MD5.ToLower())
|
||||
{
|
||||
return platformMapping;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static List<BiosItem> GetBios()
|
||||
{
|
||||
return BuildBiosList();
|
||||
}
|
||||
|
||||
public static List<BiosItem> GetBios(long PlatformId, bool HideUnavailable)
|
||||
{
|
||||
List<BiosItem> biosItems = new List<BiosItem>();
|
||||
foreach (BiosItem biosItem in BuildBiosList())
|
||||
{
|
||||
if (biosItem.platformid == PlatformId)
|
||||
{
|
||||
if (HideUnavailable == true)
|
||||
{
|
||||
if (biosItem.Available == true)
|
||||
{
|
||||
biosItems.Add(biosItem);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
biosItems.Add(biosItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return biosItems;
|
||||
}
|
||||
|
||||
private static List<BiosItem> BuildBiosList()
|
||||
{
|
||||
List<BiosItem> biosItems = new List<BiosItem>();
|
||||
|
||||
foreach (Models.PlatformMapping.PlatformMapItem platformMapping in Models.PlatformMapping.PlatformMap)
|
||||
{
|
||||
if (platformMapping.WebEmulator != null)
|
||||
{
|
||||
if (platformMapping.WebEmulator.Bios != null)
|
||||
{
|
||||
IGDB.Models.Platform platform = Metadata.Platforms.GetPlatform(platformMapping.IGDBId);
|
||||
|
||||
foreach (Models.PlatformMapping.PlatformMapItem.WebEmulatorItem.EmulatorBiosItem emulatorBios in platformMapping.WebEmulator.Bios)
|
||||
{
|
||||
BiosItem biosItem = new BiosItem
|
||||
{
|
||||
platformid = platformMapping.IGDBId,
|
||||
platformslug = platform.Slug,
|
||||
platformname = platform.Name,
|
||||
description = emulatorBios.description,
|
||||
filename = emulatorBios.filename,
|
||||
region = emulatorBios.region,
|
||||
hash = emulatorBios.hash
|
||||
};
|
||||
biosItems.Add(biosItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return biosItems;
|
||||
}
|
||||
|
||||
public class BiosItem : Models.PlatformMapping.PlatformMapItem.WebEmulatorItem.EmulatorBiosItem
|
||||
{
|
||||
public long platformid { get; set; }
|
||||
public string platformslug { get; set; }
|
||||
public string platformname { get; set; }
|
||||
public string biosPath
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.Combine(Config.LibraryConfiguration.LibraryBIOSDirectory, platformslug, base.filename);
|
||||
}
|
||||
}
|
||||
public bool Available {
|
||||
get
|
||||
{
|
||||
bool fileExists = File.Exists(biosPath);
|
||||
return fileExists;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -58,36 +58,64 @@ namespace gaseous_server.Classes
|
||||
FileInfo fi = new FileInfo(GameFileImportPath);
|
||||
Common.hashObject hash = new Common.hashObject(GameFileImportPath);
|
||||
|
||||
// check to make sure we don't already have this file imported
|
||||
sql = "SELECT COUNT(Id) AS count FROM Games_Roms WHERE MD5=@md5 AND SHA1=@sha1";
|
||||
dbDict.Add("md5", hash.md5hash);
|
||||
dbDict.Add("sha1", hash.sha1hash);
|
||||
DataTable importDB = db.ExecuteCMD(sql, dbDict);
|
||||
if ((Int64)importDB.Rows[0]["count"] > 0)
|
||||
{
|
||||
if (!GameFileImportPath.StartsWith(Config.LibraryConfiguration.LibraryImportDirectory))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Import Game", " " + GameFileImportPath + " already in database - skipping");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " " + GameFileImportPath + " not in database - processing");
|
||||
Models.PlatformMapping.PlatformMapItem? IsBios = Classes.Bios.BiosHashSignatureLookup(hash.md5hash);
|
||||
|
||||
// process as a single file
|
||||
Models.Signatures_Games discoveredSignature = GetFileSignature(hash, fi, GameFileImportPath);
|
||||
if (IsBios == null)
|
||||
{
|
||||
// file is a rom
|
||||
// check to make sure we don't already have this file imported
|
||||
sql = "SELECT COUNT(Id) AS count FROM Games_Roms WHERE MD5=@md5 AND SHA1=@sha1";
|
||||
dbDict.Add("md5", hash.md5hash);
|
||||
dbDict.Add("sha1", hash.sha1hash);
|
||||
DataTable importDB = db.ExecuteCMD(sql, dbDict);
|
||||
if ((Int64)importDB.Rows[0]["count"] > 0)
|
||||
{
|
||||
if (!GameFileImportPath.StartsWith(Config.LibraryConfiguration.LibraryImportDirectory))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Import Game", " " + GameFileImportPath + " already in database - skipping");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " " + GameFileImportPath + " not in database - processing");
|
||||
|
||||
// get discovered platform
|
||||
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(discoveredSignature.Flags.IGDBPlatformId);
|
||||
if (determinedPlatform == null)
|
||||
{
|
||||
determinedPlatform = new IGDB.Models.Platform();
|
||||
}
|
||||
// process as a single file
|
||||
Models.Signatures_Games discoveredSignature = GetFileSignature(hash, fi, GameFileImportPath);
|
||||
|
||||
IGDB.Models.Game determinedGame = SearchForGame(discoveredSignature.Game.Name, discoveredSignature.Flags.IGDBPlatformId);
|
||||
// get discovered platform
|
||||
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(discoveredSignature.Flags.IGDBPlatformId);
|
||||
if (determinedPlatform == null)
|
||||
{
|
||||
determinedPlatform = new IGDB.Models.Platform();
|
||||
}
|
||||
|
||||
// add to database
|
||||
StoreROM(hash, determinedGame, determinedPlatform, discoveredSignature, GameFileImportPath);
|
||||
IGDB.Models.Game determinedGame = SearchForGame(discoveredSignature.Game.Name, discoveredSignature.Flags.IGDBPlatformId);
|
||||
|
||||
// add to database
|
||||
StoreROM(hash, determinedGame, determinedPlatform, discoveredSignature, GameFileImportPath);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// file is a bios
|
||||
if (IsBios.WebEmulator != null)
|
||||
{
|
||||
foreach (Classes.Bios.BiosItem biosItem in Classes.Bios.GetBios())
|
||||
{
|
||||
if (biosItem.Available == false && biosItem.hash == hash.md5hash)
|
||||
{
|
||||
string biosPath = biosItem.biosPath.Replace(biosItem.filename, "");
|
||||
if (!Directory.Exists(biosPath))
|
||||
{
|
||||
Directory.CreateDirectory(biosPath);
|
||||
}
|
||||
|
||||
File.Move(GameFileImportPath, biosItem.biosPath, true);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -128,8 +128,9 @@ namespace gaseous_server.Classes
|
||||
public long Id { get; set; }
|
||||
public long PlatformId { get; set; }
|
||||
public IGDB.Models.Platform Platform { get; set; }
|
||||
public Dictionary<string, string>? Emulator { get; set; }
|
||||
public long GameId { get; set; }
|
||||
//public Dictionary<string, object>? Emulator { get; set; }
|
||||
public Models.PlatformMapping.PlatformMapItem.WebEmulatorItem? Emulator { get; set; }
|
||||
public long GameId { get; set; }
|
||||
public string? Name { get; set; }
|
||||
public long Size { get; set; }
|
||||
public string? CRC { get; set; }
|
||||
|
75
gaseous-server/Controllers/BiosController.cs
Normal file
75
gaseous-server/Controllers/BiosController.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("api/v1/[controller]")]
|
||||
public class BiosController : Controller
|
||||
{
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public List<Classes.Bios.BiosItem> GetBios()
|
||||
{
|
||||
return Classes.Bios.GetBios();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{PlatformId}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public List<Classes.Bios.BiosItem> GetBios(long PlatformId, bool AvailableOnly = true)
|
||||
{
|
||||
return Classes.Bios.GetBios(PlatformId, AvailableOnly);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[HttpHead]
|
||||
[Route("{PlatformId}/{BiosName}")]
|
||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult BiosFile(long PlatformId, string BiosName)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (Classes.Bios.BiosItem biosItem in Classes.Bios.GetBios(PlatformId, true))
|
||||
{
|
||||
if (biosItem.filename == BiosName)
|
||||
{
|
||||
if (System.IO.File.Exists(biosItem.biosPath))
|
||||
{
|
||||
string filename = Path.GetFileName(biosItem.biosPath);
|
||||
string filepath = biosItem.biosPath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "application/octet-stream";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = false,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NotFound();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -768,21 +768,9 @@ namespace gaseous_server.Controllers
|
||||
string romFilePath = rom.Path;
|
||||
if (System.IO.File.Exists(romFilePath))
|
||||
{
|
||||
string filename = Path.GetFileName(romFilePath);
|
||||
string filepath = romFilePath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "application/octet-stream";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = false,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
FileStream content = new FileStream(romFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
FileStreamResult response = File(content, "application/octet-stream", rom.Name);
|
||||
return response;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
80
gaseous-server/Controllers/RomsController.cs
Normal file
80
gaseous-server/Controllers/RomsController.cs
Normal file
@@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_tools;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.CodeAnalysis.Scripting;
|
||||
using Org.BouncyCastle.Asn1.X509;
|
||||
using static gaseous_server.Classes.Metadata.AgeRatings;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[Route("api/v1/[controller]")]
|
||||
[ApiController]
|
||||
public class RomsController : ControllerBase
|
||||
{
|
||||
[HttpPost]
|
||||
[ProducesResponseType(typeof(List<IFormFile>), StatusCodes.Status200OK)]
|
||||
[RequestSizeLimit(long.MaxValue)]
|
||||
[DisableRequestSizeLimit, RequestFormLimits(MultipartBodyLengthLimit = long.MaxValue, ValueLengthLimit = int.MaxValue)]
|
||||
public async Task<IActionResult> UploadRom(List<IFormFile> files)
|
||||
{
|
||||
Guid sessionid = Guid.NewGuid();
|
||||
|
||||
string workPath = Path.Combine(Config.LibraryConfiguration.LibraryUploadDirectory, sessionid.ToString());
|
||||
|
||||
long size = files.Sum(f => f.Length);
|
||||
|
||||
List<Dictionary<string, object>> UploadedFiles = new List<Dictionary<string, object>>();
|
||||
|
||||
foreach (IFormFile formFile in files)
|
||||
{
|
||||
if (formFile.Length > 0)
|
||||
{
|
||||
Guid FileId = Guid.NewGuid();
|
||||
|
||||
string filePath = Path.Combine(workPath, Path.GetFileName(formFile.FileName));
|
||||
|
||||
if (!Directory.Exists(workPath))
|
||||
{
|
||||
Directory.CreateDirectory(workPath);
|
||||
}
|
||||
|
||||
using (var stream = System.IO.File.Create(filePath))
|
||||
{
|
||||
await formFile.CopyToAsync(stream);
|
||||
|
||||
Dictionary<string, object> UploadedFile = new Dictionary<string, object>();
|
||||
UploadedFile.Add("id", FileId.ToString());
|
||||
UploadedFile.Add("originalname", Path.GetFileName(formFile.FileName));
|
||||
UploadedFile.Add("fullpath", filePath);
|
||||
UploadedFiles.Add(UploadedFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Process uploaded files
|
||||
// Don't rely on or trust the FileName property without validation.
|
||||
|
||||
foreach (Dictionary<string, object> UploadedFile in UploadedFiles)
|
||||
{
|
||||
Classes.ImportGame.ImportGameFile((string)UploadedFile["fullpath"]);
|
||||
}
|
||||
|
||||
if (Directory.Exists(workPath))
|
||||
{
|
||||
Directory.Delete(workPath, true);
|
||||
}
|
||||
|
||||
return Ok(new { count = files.Count, size });
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,5 +1,7 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Text.Json.Serialization;
|
||||
using gaseous_server.Classes;
|
||||
|
||||
namespace gaseous_server.Models
|
||||
{
|
||||
@@ -10,23 +12,21 @@ namespace gaseous_server.Models
|
||||
|
||||
}
|
||||
|
||||
private static List<PlatformMapItem> _PlatformMaps = new List<PlatformMapItem>();
|
||||
//private static List<PlatformMapItem> _PlatformMaps = new List<PlatformMapItem>();
|
||||
public static List<PlatformMapItem> PlatformMap
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_PlatformMaps.Count == 0)
|
||||
// load platform maps from: gaseous_server.Support.PlatformMap.json
|
||||
List<PlatformMapItem> _PlatformMaps = new List<PlatformMapItem>();
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
var resourceName = "gaseous_server.Support.PlatformMap.json";
|
||||
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
|
||||
using (StreamReader reader = new StreamReader(stream))
|
||||
{
|
||||
// load platform maps from: gaseous_server.Support.PlatformMap.json
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
var resourceName = "gaseous_server.Support.PlatformMap.json";
|
||||
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
|
||||
using (StreamReader reader = new StreamReader(stream))
|
||||
{
|
||||
string rawJson = reader.ReadToEnd();
|
||||
_PlatformMaps.Clear();
|
||||
_PlatformMaps = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PlatformMapItem>>(rawJson);
|
||||
}
|
||||
string rawJson = reader.ReadToEnd();
|
||||
_PlatformMaps.Clear();
|
||||
_PlatformMaps = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PlatformMapItem>>(rawJson);
|
||||
}
|
||||
|
||||
return _PlatformMaps;
|
||||
@@ -73,13 +73,28 @@ namespace gaseous_server.Models
|
||||
}
|
||||
|
||||
public class PlatformMapItem
|
||||
{
|
||||
{
|
||||
public int IGDBId { get; set; }
|
||||
public string IGDBName { get; set; }
|
||||
public List<string> AlternateNames { get; set; } = new List<string>();
|
||||
public List<string> KnownFileExtensions { get; set; } = new List<string>();
|
||||
public Dictionary<string, string>? WebEmulator { get; set; }
|
||||
//public Dictionary<string, object>? WebEmulator { get; set; }
|
||||
public WebEmulatorItem? WebEmulator { get; set; }
|
||||
|
||||
public class WebEmulatorItem
|
||||
{
|
||||
public string Type { get; set; }
|
||||
public string Core { get; set; }
|
||||
public List<EmulatorBiosItem> Bios { get; set; }
|
||||
|
||||
public class EmulatorBiosItem
|
||||
{
|
||||
public string hash { get; set; }
|
||||
public string description { get; set; }
|
||||
public string filename { get; set; }
|
||||
public string region { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -236,7 +236,7 @@ namespace gaseous_server.Models
|
||||
|
||||
public class SignatureFlags
|
||||
{
|
||||
public int IGDBPlatformId { get; set; }
|
||||
public long IGDBPlatformId { get; set; }
|
||||
public string IGDBPlatformName { get; set; }
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,9 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using gaseous_server;
|
||||
using gaseous_tools;
|
||||
using Microsoft.AspNetCore.Http.Features;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Startup", "Starting Gaseous Server");
|
||||
|
||||
@@ -20,6 +22,11 @@ if (Config.ReadSetting("API Key", "Test API Key") == "Test API Key")
|
||||
Logging.Log(Logging.LogType.Information, "Startup", "Setting initial API key");
|
||||
Config.SetSetting("API Key", APIKey.ToString());
|
||||
}
|
||||
if (Config.ReadSetting("Emulator: Default BIOS Region", "Default Value") == "Default Value")
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Startup", "Setting default BIOS region to US");
|
||||
Config.SetSetting("Emulator: Default BIOS Region", "US");
|
||||
}
|
||||
|
||||
// set up server
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
@@ -32,6 +39,9 @@ builder.Services.AddControllers().AddJsonOptions(x =>
|
||||
|
||||
// suppress nulls
|
||||
x.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
|
||||
|
||||
// set max depth
|
||||
x.JsonSerializerOptions.MaxDepth = 64;
|
||||
});
|
||||
builder.Services.AddResponseCaching();
|
||||
builder.Services.AddControllers(options =>
|
||||
@@ -55,6 +65,22 @@ builder.Services.AddControllers(options =>
|
||||
});
|
||||
});
|
||||
|
||||
// set max upload size
|
||||
builder.Services.Configure<IISServerOptions>(options =>
|
||||
{
|
||||
options.MaxRequestBodySize = int.MaxValue;
|
||||
});
|
||||
builder.Services.Configure<KestrelServerOptions>(options =>
|
||||
{
|
||||
options.Limits.MaxRequestBodySize = int.MaxValue;
|
||||
});
|
||||
builder.Services.Configure<FormOptions>(options =>
|
||||
{
|
||||
options.ValueLengthLimit = int.MaxValue;
|
||||
options.MultipartBodyLengthLimit = int.MaxValue;
|
||||
options.MultipartHeadersLengthLimit = int.MaxValue;
|
||||
});
|
||||
|
||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
@@ -44,7 +44,31 @@
|
||||
],
|
||||
"KnownFileExtensions": [
|
||||
".SMS"
|
||||
]
|
||||
],
|
||||
"WebEmulator": {
|
||||
"Type": "EmulatorJS",
|
||||
"Core": "segaMS",
|
||||
"Bios": [
|
||||
{
|
||||
"hash": "840481177270d5642a14ca71ee72844c",
|
||||
"description": "MasterSystem EU BIOS",
|
||||
"filename": "bios_E.sms",
|
||||
"region": "EU"
|
||||
},
|
||||
{
|
||||
"hash": "840481177270d5642a14ca71ee72844c",
|
||||
"description": "MasterSystem US BIOS",
|
||||
"filename": "bios_U.sms",
|
||||
"region": "US"
|
||||
},
|
||||
{
|
||||
"hash": "24a519c53f67b00640d0048ef7089105",
|
||||
"description": "MasterSystem JP BIOS",
|
||||
"filename": "bios_J.sms",
|
||||
"region": "JP"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"IGDBId": 29,
|
||||
@@ -101,5 +125,67 @@
|
||||
"Type": "EmulatorJS",
|
||||
"Core": "nes"
|
||||
}
|
||||
},
|
||||
{
|
||||
"IGDBId": 19,
|
||||
"IGDBName": "Super Nintendo Entertainment System",
|
||||
"AlternateNames": [
|
||||
"Nintendo Super Famicom & Super Entertainment System",
|
||||
"Super Nintendo Entertainment System",
|
||||
"Super Nintendo",
|
||||
"SNES"
|
||||
],
|
||||
"KnownFileExtensions": [],
|
||||
"WebEmulator": {
|
||||
"Type": "EmulatorJS",
|
||||
"Core": "snes"
|
||||
}
|
||||
},
|
||||
{
|
||||
"IGDBId": 7,
|
||||
"IGDBName": "PlayStation",
|
||||
"AlternateNames": [
|
||||
"Sony PlayStation",
|
||||
"PS1",
|
||||
"PSX",
|
||||
"PSOne",
|
||||
"PS"
|
||||
],
|
||||
"KnownFileExtensions": [],
|
||||
"WebEmulator": {
|
||||
"Type": "EmulatorJS",
|
||||
"Core": "psx",
|
||||
"Bios": [
|
||||
{
|
||||
"hash": "8dd7d5296a650fac7319bce665a6a53c",
|
||||
"description": "PS1 JP BIOS - Required for JP games",
|
||||
"filename": "scph5500.bin",
|
||||
"region": "JP"
|
||||
},
|
||||
{
|
||||
"hash": "490f666e1afb15b7362b406ed1cea246",
|
||||
"description": "PS1 US BIOS - Required for US games",
|
||||
"filename": "scph5501.bin",
|
||||
"region": "US"
|
||||
},
|
||||
{
|
||||
"hash": "32736f17079d0b2b7024407c39bd3050",
|
||||
"description": "PS1 EU BIOS - Required for EU games",
|
||||
"filename": "scph5502.bin",
|
||||
"region": "EU"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"IGDBId": 52,
|
||||
"IGDBName": "Arcade",
|
||||
"AlternateNames": [],
|
||||
"KnownFileExtensions": [],
|
||||
"WebEmulator": {
|
||||
"Type": "EmulatorJS",
|
||||
"Core": "arcade",
|
||||
"Bios": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@@ -14,9 +14,9 @@
|
||||
<DocumentationFile>bin\Debug\net7.0\gaseous-server.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.8" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.9" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.7" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.8" />
|
||||
<PackageReference Include="IGDB" Version="2.3.2" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -105,6 +105,7 @@
|
||||
<Folder Include="Assets\Ratings\CLASS_IND\" />
|
||||
<Folder Include="wwwroot\fonts\" />
|
||||
<Folder Include="wwwroot\pages\dialogs\" />
|
||||
<Folder Include="wwwroot\pages\settings\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\gaseous-tools\gaseous-tools.csproj">
|
||||
@@ -119,6 +120,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Remove="Support\PlatformMap.json" />
|
||||
<Content Remove="wwwroot\pages\settings\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Support\PlatformMap.json" Condition="'$(ExcludeConfigFilesFromBuildOutput)'!='true'">
|
||||
|
BIN
gaseous-server/wwwroot/.DS_Store
vendored
BIN
gaseous-server/wwwroot/.DS_Store
vendored
Binary file not shown.
BIN
gaseous-server/wwwroot/images/SettingsWallpaper.jpg
Normal file
BIN
gaseous-server/wwwroot/images/SettingsWallpaper.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 607 KiB |
Binary file not shown.
Before Width: | Height: | Size: 88 KiB |
15
gaseous-server/wwwroot/images/settings.svg
Normal file
15
gaseous-server/wwwroot/images/settings.svg
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M230.4,358.4V76.8c0-14.13,11.48-25.6,25.6-25.6c14.15,0,25.6,11.47,25.6,25.6v281.6h25.6c14.15,0,25.6,11.48,25.6,25.6
|
||||
c0,14.15-11.45,25.6-25.6,25.6h-25.6v25.6c0,14.15-11.45,25.6-25.6,25.6c-14.13,0-25.6-11.45-25.6-25.6v-25.6h-25.6
|
||||
c-14.13,0-25.6-11.45-25.6-25.6c0-14.13,11.48-25.6,25.6-25.6H230.4z M409.6,102.4V76.8c0-14.13,11.48-25.6,25.6-25.6
|
||||
c14.15,0,25.6,11.47,25.6,25.6v25.6h25.6c14.15,0,25.6,11.47,25.6,25.6c0,14.15-11.45,25.6-25.6,25.6h-25.6v281.6
|
||||
c0,14.15-11.45,25.6-25.6,25.6c-14.13,0-25.6-11.45-25.6-25.6V153.6H384c-14.13,0-25.6-11.45-25.6-25.6
|
||||
c0-14.13,11.48-25.6,25.6-25.6H409.6z M102.4,179.2H128c14.15,0,25.6,11.48,25.6,25.6c0,14.15-11.45,25.6-25.6,25.6h-25.6v204.8
|
||||
c0,14.15-11.45,25.6-25.6,25.6c-14.13,0-25.6-11.45-25.6-25.6V230.4H25.6C11.48,230.4,0,218.95,0,204.8
|
||||
c0-14.13,11.48-25.6,25.6-25.6h25.6V76.8c0-14.13,11.47-25.6,25.6-25.6c14.15,0,25.6,11.47,25.6,25.6V179.2z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
23
gaseous-server/wwwroot/images/upload.svg
Normal file
23
gaseous-server/wwwroot/images/upload.svg
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M509,261.1c-3.3-12.7-9.3-24-16.9-33.4c-5.7-7.1-12.4-13.2-19.6-18.4c-10.8-7.8-22.8-13.6-35-17.7
|
||||
c-7.8-2.5-15.7-4.4-23.5-5.6c-3-18-8.4-34.6-15.7-49.6c-13.6-27.9-34-50.1-58.7-65.3C315,55.8,286.2,47.8,256,47.8
|
||||
c-19,0-36.6,3.2-52.4,8.8c-11.9,4.2-22.7,9.8-32.5,16.4c-14.7,9.9-26.9,22-36.7,35.2c-7.5,10.2-13.6,21.1-18.1,32.2
|
||||
c-12.9,2-25.3,5.3-37.1,10c-11.1,4.5-21.6,10.2-31.1,17.1c-14.3,10.4-26.4,23.7-34.8,39.5c-4.3,8-7.6,16.5-9.9,25.6
|
||||
C1.2,241.7,0,251.4,0,261.4c0,17.9,3.9,34.8,11,49.8c5.3,11.3,12.4,21.5,20.9,30.4c12.7,13.4,28.5,23.9,46.2,31.1
|
||||
c17.7,7.2,37.4,11,57.9,11h56c8.8,0,16-7.2,16-16s-7.2-16-16-16h-56c-14.7,0-28.7-2.4-41.2-6.9c-9.4-3.3-18.1-7.8-25.7-13.2
|
||||
c-11.5-8.1-20.7-18.3-27.1-30.1c-6.4-11.8-9.9-25.2-10-40.2c0-13.4,2.8-25.1,7.6-35.4c3.6-7.8,8.4-14.8,14.3-21
|
||||
c8.8-9.4,20-17.2,32.9-23c12.9-5.8,27.5-9.6,42.7-11c6.4-0.6,11.8-4.9,13.7-11c3.2-9.8,8-19.9,14.4-29.3
|
||||
c4.8-7.1,10.5-13.8,17.1-19.9c9.8-9.1,21.5-16.8,35-22.3c13.5-5.4,28.9-8.7,46.3-8.7c16.4,0,32,2.9,46.4,8.4
|
||||
c21.6,8.2,40.3,22.2,54.6,41.3s24.1,43.5,27.1,72.8c0.8,7.8,7.3,13.9,15.1,14.3c9.2,0.5,19.3,2.3,28.9,5.5
|
||||
c7.2,2.4,14.2,5.6,20.5,9.5c4.7,2.9,9.1,6.2,12.9,9.8c5.8,5.5,10.3,11.6,13.5,18.7c3.2,7,5,14.9,5,24.2c0,5.7-0.6,10.9-1.7,15.7
|
||||
c-1.9,8.4-5.2,15.6-9.8,21.8c-3.4,4.7-7.6,8.9-12.4,12.6c-7.3,5.5-16.2,9.9-26.4,12.9s-21.6,4.6-33.7,4.6h-76c-8.8,0-16,7.2-16,16
|
||||
s7.2,16,16,16h76c15.2,0,29.8-2,43.4-6.1c10.2-3.1,19.8-7.3,28.6-12.8c6.6-4.1,12.6-8.9,18-14.4c8.1-8.3,14.7-18.1,19.1-29.3
|
||||
c4.5-11.2,6.8-23.6,6.8-37C511.9,276.1,510.9,268.4,509,261.1z"/>
|
||||
<path d="M308.7,267.1c6.2,6.2,16.4,6.2,22.6,0c6.3-6.2,6.3-16.4,0-22.6l-64-64c-6.2-6.2-16.4-6.2-22.6,0l-64,64
|
||||
c-6.2,6.2-6.2,16.4,0,22.6c6.2,6.2,16.4,6.2,22.6,0l36.7-36.7v217.8c0,8.8,7.2,16,16,16s16-7.2,16-16V230.4L308.7,267.1z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
@@ -6,7 +6,9 @@
|
||||
<script src="/scripts/jquery-3.6.0.min.js"></script>
|
||||
<script src="/scripts/moment.js"></script>
|
||||
<link href="/styles/select2.min.css" rel="stylesheet" />
|
||||
<link rel="stylesheet" href="/styles/dropzone.min.css" type="text/css" />
|
||||
<script src="/scripts/select2.min.js"></script>
|
||||
<script src="/scripts/dropzone.min.js"></script>
|
||||
<script src="/scripts/main.js" type="text/javascript"></script>
|
||||
<script src="/scripts/filterformating.js" type="text/javascript"></script>
|
||||
<script src="/scripts/gamesformating.js" type="text/javascript"></script>
|
||||
@@ -23,8 +25,12 @@
|
||||
<div id="banner_header">
|
||||
<div id="banner_header_label">Gaseous Games</div>
|
||||
</div>
|
||||
<div id="banner_cog" onclick="window.location.href = '/index.html?page=system';">
|
||||
<img src="/images/cog.jpg" alt="System" id="banner_system_image" />
|
||||
<div id="banner_upload" onclick="showDialog('upload');">
|
||||
<img src="/images/upload.svg" alt="Upload" title="Upload" id="banner_upload_image" />
|
||||
<span id="banner_upload_label">Upload Games</span>
|
||||
</div>
|
||||
<div id="banner_cog" onclick="window.location.href = '/index.html?page=settings';">
|
||||
<img src="/images/settings.svg" alt="Settings" title="Settings" id="banner_system_image" />
|
||||
</div>
|
||||
|
||||
<div id="content">
|
||||
|
@@ -12,14 +12,16 @@
|
||||
EJS_lightgun = false; // can be true or false
|
||||
|
||||
// URL to BIOS file
|
||||
EJS_biosUrl = ''; // example: https://dl.dropboxusercontent.com/s/[random-code]/bios.bin
|
||||
EJS_biosUrl = emuBios;
|
||||
|
||||
// URL to Game rom
|
||||
EJS_gameUrl = decodeURIComponent(urlParams.get('rompath'));
|
||||
|
||||
// Path to the data directory
|
||||
EJS_pathtodata = '/EmulatorJS/data/';
|
||||
EJS_pathtodata = '/emulators/EmulatorJS/data/';
|
||||
|
||||
EJS_DEBUG_XX = false;
|
||||
|
||||
EJS_startOnLoaded = false;
|
||||
</script>
|
||||
<script src='/EmulatorJS/data/loader.js'></script>
|
||||
<script src='/emulators/EmulatorJS/data/loader.js'></script>
|
@@ -85,7 +85,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">document.getElementById('modal-heading').innerHTML = "Properties";
|
||||
<script type="text/javascript">
|
||||
document.getElementById('modal-heading').innerHTML = "Properties";
|
||||
|
||||
var gameId = urlParams.get('id');
|
||||
|
||||
|
72
gaseous-server/wwwroot/pages/dialogs/upload.html
Normal file
72
gaseous-server/wwwroot/pages/dialogs/upload.html
Normal file
@@ -0,0 +1,72 @@
|
||||
<!-- The Modal -->
|
||||
<div id="myModalSub" class="modal">
|
||||
|
||||
<!-- Modal content -->
|
||||
<div class="modal-content-sub">
|
||||
<span id="modal-close-sub" class="close">×</span>
|
||||
<div id="modal-content-sub">Some text in the Modal..</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div id="upload_target" class="dropzone"></div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
document.getElementById('modal-heading').innerHTML = "Upload";
|
||||
|
||||
var myDropzone = new Dropzone("div#upload_target", {
|
||||
url: "/api/v1/Roms",
|
||||
autoProcessQueue: true,
|
||||
uploadMultiple: true,
|
||||
paramName: myParamName,
|
||||
maxFilesize: 60000,
|
||||
createImageThumbnails: false,
|
||||
disablePreviews: false
|
||||
});
|
||||
|
||||
function myParamName() {
|
||||
return "files";
|
||||
}
|
||||
|
||||
function showSubDialog(dialogPage, variables) {
|
||||
// Get the modal
|
||||
var submodal = document.getElementById("myModalSub");
|
||||
|
||||
// Get the modal content
|
||||
var subModalContent = document.getElementById("modal-content-sub");
|
||||
|
||||
// Get the button that opens the modal
|
||||
var subbtn = document.getElementById("romDelete");
|
||||
|
||||
// Get the <span> element that closes the modal
|
||||
var subspan = document.getElementById("modal-close-sub");
|
||||
|
||||
// When the user clicks on the button, open the modal
|
||||
submodal.style.display = "block";
|
||||
|
||||
// When the user clicks on <span> (x), close the modal
|
||||
subspan.onclick = function () {
|
||||
submodal.style.display = "none";
|
||||
subModalContent.innerHTML = "";
|
||||
subModalVariables = null;
|
||||
}
|
||||
|
||||
subModalVariables = modalVariables;
|
||||
|
||||
$('#modal-content-sub').load('/pages/dialogs/' + dialogPage + '.html');
|
||||
}
|
||||
|
||||
function closeSubDialog() {
|
||||
// Get the modal
|
||||
var submodal = document.getElementById("myModalSub");
|
||||
|
||||
// Get the modal content
|
||||
var subModalContent = document.getElementById("modal-content-sub");
|
||||
|
||||
submodal.style.display = "none";
|
||||
subModalContent.innerHTML = "";
|
||||
subModalVariables = null;
|
||||
}
|
||||
</script>
|
@@ -4,14 +4,27 @@
|
||||
|
||||
<div id="emulator"></div>
|
||||
|
||||
<div id="emulatorbios">
|
||||
<table style="width: 100%;">
|
||||
<tr>
|
||||
<td>Firmware:</td>
|
||||
<td><select id="emulatorbiosselector" onchange="loadEmulator();"></select></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
var gameId = urlParams.get('gameid');
|
||||
var platformId = urlParams.get('platformid');
|
||||
var gameData;
|
||||
var artworks = null;
|
||||
var artworksPosition = 0;
|
||||
|
||||
var emuBios = '';
|
||||
var availableEmuBios = [];
|
||||
|
||||
ajaxCall('/api/v1/Games/' + gameId, 'GET', function (result) {
|
||||
gameData = result;
|
||||
|
||||
@@ -29,6 +42,36 @@
|
||||
}
|
||||
});
|
||||
|
||||
ajaxCall('/api/v1/Bios/' + platformId, 'GET', function (result) {
|
||||
var emulatorbiosDiv = document.getElementById('emulatorbios');
|
||||
|
||||
availableEmuBios = result;
|
||||
|
||||
if (result.length == 0) {
|
||||
emuBios = '';
|
||||
emulatorbiosDiv.setAttribute('style', 'display: none;');
|
||||
} else {
|
||||
emuBios = '/api/v1/Bios/' + platformId + '/' + availableEmuBios[0].filename;
|
||||
|
||||
var emulatorbiosselect = document.getElementById('emulatorbiosselector');
|
||||
|
||||
for (var i = 0; i < availableEmuBios.length; i++) {
|
||||
var biosOption = document.createElement('option');
|
||||
biosOption.value = availableEmuBios[i].filename;
|
||||
biosOption.innerHTML = availableEmuBios[i].description + ' (' + availableEmuBios[i].filename + ')';
|
||||
|
||||
if (availableEmuBios[i].region == "US") {
|
||||
emuBios = '/api/v1/Bios/' + platformId + '/' + availableEmuBios[i].filename;
|
||||
biosOption.setAttribute('selected', 'selected');
|
||||
}
|
||||
|
||||
emulatorbiosselect.appendChild(biosOption);
|
||||
}
|
||||
}
|
||||
|
||||
loadEmulator();
|
||||
});
|
||||
|
||||
function rotateBackground() {
|
||||
if (artworks) {
|
||||
artworksPosition += 1;
|
||||
@@ -40,9 +83,18 @@
|
||||
}
|
||||
}
|
||||
|
||||
switch (urlParams.get('engine')) {
|
||||
case 'EmulatorJS':
|
||||
$('#emulator').load('/pages/EmulatorJS.html');
|
||||
break;
|
||||
function loadEmulator() {
|
||||
if (availableEmuBios.length > 0) {
|
||||
var emulatorbiosselect = document.getElementById('emulatorbiosselector');
|
||||
emuBios = '/api/v1/Bios/' + platformId + '/' + emulatorbiosselect.value;
|
||||
} else {
|
||||
emuBios = '';
|
||||
}
|
||||
|
||||
switch (urlParams.get('engine')) {
|
||||
case 'EmulatorJS':
|
||||
$('#emulator').load('/pages/EmulatorJS.html');
|
||||
break;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@@ -312,7 +312,7 @@
|
||||
lastPlatform = result[i].platform.name;
|
||||
var platformRow = document.createElement('tr');
|
||||
var platformHeader = document.createElement('th');
|
||||
platformHeader.setAttribute('colspan', 4);
|
||||
platformHeader.setAttribute('colspan', 6);
|
||||
platformHeader.innerHTML = result[i].platform.name;
|
||||
platformRow.appendChild(platformHeader);
|
||||
newTable.appendChild(platformRow);
|
||||
@@ -320,7 +320,7 @@
|
||||
|
||||
var launchButton = '';
|
||||
if (result[i].emulator) {
|
||||
launchButton = '<a href="/index.html?page=emulator&engine=' + result[i].emulator.Type + '&core=' + result[i].emulator.Core + '&gameid=' + gameId + '&rompath=' + encodeURIComponent('/api/v1/Games/' + gameId + '/roms/' + result[i].id + '/file') + '" class="romlink">Start</a>';
|
||||
launchButton = '<a href="/index.html?page=emulator&engine=' + result[i].emulator.type + '&core=' + result[i].emulator.core + '&platformid=' + result[i].platform.id + '&gameid=' + gameId + '&rompath=' + encodeURIComponent('/api/v1/Games/' + gameId + '/roms/' + result[i].id + '/file') + '" class="romstart">Launch</a>';
|
||||
}
|
||||
|
||||
var newRow = [
|
||||
@@ -329,7 +329,7 @@
|
||||
result[i].romTypeMedia,
|
||||
result[i].mediaLabel,
|
||||
launchButton,
|
||||
'<span class="romlink" onclick="showDialog(\'rominfo\', ' + result[i].id + ');">...</span>'
|
||||
'<div class="properties_button" onclick="showDialog(\'rominfo\', ' + result[i].id + ');">i</div>'
|
||||
];
|
||||
newTable.appendChild(createTableRow(false, newRow, 'romrow', 'romcell'));
|
||||
}
|
||||
|
48
gaseous-server/wwwroot/pages/settings.html
Normal file
48
gaseous-server/wwwroot/pages/settings.html
Normal file
@@ -0,0 +1,48 @@
|
||||
<div id="bgImage" style="background-image: url('/images/SettingsWallpaper.jpg'); background-position: center; background-repeat: no-repeat; background-size: cover; filter: blur(10px); -webkit-filter: blur(10px);">
|
||||
<div id="bgImage_Opacity"></div>
|
||||
</div>
|
||||
|
||||
<div id="gamepage">
|
||||
<div id="properties_toc" class="settings_toc">
|
||||
<div class="filter_header">Settings</div>
|
||||
<div id="properties_toc_system" name="properties_toc_item" onclick="SelectTab('system');">System</div>
|
||||
<div id="properties_toc_bios" name="properties_toc_item" onclick="SelectTab('bios');">Firmware</div>
|
||||
<div id="properties_toc_about" name="properties_toc_item" onclick="SelectTab('about');">About</div>
|
||||
</div>
|
||||
<div id="properties_bodypanel">
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="settings_photocredit">
|
||||
Wallpaper by <a href="https://unsplash.com/@lorenzoherrera" class="romlink">Lorenzo Herrera</a> / <a href="https://unsplash.com/photos/p0j-mE6mGo4" class="romlink">Unsplash</a>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
var myParam = urlParams.get('sub');
|
||||
|
||||
var selectedTab = '';
|
||||
|
||||
if (myParam) {
|
||||
selectedTab = myParam;
|
||||
} else {
|
||||
selectedTab = 'system';
|
||||
}
|
||||
|
||||
SelectTab(selectedTab);
|
||||
|
||||
function SelectTab(TabName) {
|
||||
var tocs = document.getElementsByName('properties_toc_item');
|
||||
for (var i = 0; i < tocs.length; i++) {
|
||||
if ((tocs[i].id) == ("properties_toc_" + TabName)) {
|
||||
tocs[i].className = "properties_toc_item_selected";
|
||||
} else {
|
||||
tocs[i].className = '';
|
||||
}
|
||||
}
|
||||
|
||||
$('#properties_bodypanel').load('/pages/settings/' + TabName + '.html');
|
||||
}
|
||||
</script>
|
14
gaseous-server/wwwroot/pages/settings/about.html
Normal file
14
gaseous-server/wwwroot/pages/settings/about.html
Normal file
@@ -0,0 +1,14 @@
|
||||
<div id="gametitle">
|
||||
<h1 id="gametitle_label">About Gaseous</h1>
|
||||
</div>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>Home Page</th>
|
||||
<td><a href="https://github.com/gaseous-project/gaseous-server" class="romlink">https://github.com/gaseous-project/gaseous-server</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bugs and Feature Requests</th>
|
||||
<td><a href="https://github.com/gaseous-project/gaseous-server/issues" class="romlink">https://github.com/gaseous-project/gaseous-server/issues</a></td>
|
||||
</tr>
|
||||
</table>
|
53
gaseous-server/wwwroot/pages/settings/bios.html
Normal file
53
gaseous-server/wwwroot/pages/settings/bios.html
Normal file
@@ -0,0 +1,53 @@
|
||||
<div id="gametitle">
|
||||
<h1 id="gametitle_label">Firmware</h1>
|
||||
</div>
|
||||
|
||||
<h3>Firmware Availablility</h3>
|
||||
<table id="table_firmware" class="romtable" cellspacing="0">
|
||||
|
||||
</table>
|
||||
|
||||
<script type="text/javascript">
|
||||
ajaxCall('/api/v1/Bios', 'GET', function (result) {
|
||||
result.sort((a, b) => a.platformname.charCodeAt(0) - b.platformname.charCodeAt(0));
|
||||
|
||||
var lastPlatform = '';
|
||||
|
||||
var newTable = document.getElementById('table_firmware');
|
||||
newTable.appendChild(createTableRow(true, ['Description', 'File name', 'MD5 Hash', 'Available']));
|
||||
|
||||
for (var i = 0; i < result.length; i++) {
|
||||
if (result[i].platformname != lastPlatform) {
|
||||
lastPlatform = result[i].platformname;
|
||||
var platformRow = document.createElement('tr');
|
||||
var platformHeader = document.createElement('th');
|
||||
platformHeader.setAttribute('colspan', 4);
|
||||
platformHeader.innerHTML = result[i].platformname;
|
||||
platformRow.appendChild(platformHeader);
|
||||
newTable.appendChild(platformRow);
|
||||
}
|
||||
|
||||
var biosFilename = document.createElement('a');
|
||||
biosFilename.href = '/api/v1/Bios/' + result[i].platformid + '/' + result[i].filename;
|
||||
biosFilename.innerHTML = result[i].filename;
|
||||
biosFilename.className = 'romlink';
|
||||
|
||||
var availableText = document.createElement('span');
|
||||
if (result[i].available == true) {
|
||||
availableText.innerHTML = 'Available';
|
||||
availableText.className = 'greentext';
|
||||
} else {
|
||||
availableText.innerHTML = 'Unavailable';
|
||||
availableText.className = 'redtext';
|
||||
}
|
||||
|
||||
var newRow = [
|
||||
result[i].description,
|
||||
biosFilename,
|
||||
result[i].hash,
|
||||
availableText
|
||||
];
|
||||
newTable.appendChild(createTableRow(false, newRow, 'romrow', 'romcell'));
|
||||
}
|
||||
});
|
||||
</script>
|
@@ -1,23 +1,20 @@
|
||||
<div id="gamepage">
|
||||
<div id="gametitle">
|
||||
<h1 id="gametitle_label">System</h1>
|
||||
</div>
|
||||
|
||||
<h3>Background Tasks</h3>
|
||||
<div id="system_tasks"></div>
|
||||
|
||||
<h3>Usage</h3>
|
||||
<p><strong>Library</strong></p>
|
||||
<div id="system_disks"></div>
|
||||
<p><strong>Database</strong></p>
|
||||
<div id="system_database"></div>
|
||||
|
||||
<h3>Signatures</h3>
|
||||
<div id="system_signatures"></div>
|
||||
<div id="gametitle">
|
||||
<h1 id="gametitle_label">System</h1>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
function SystemLoadStatus() {
|
||||
<h3>Background Tasks</h3>
|
||||
<div id="system_tasks"></div>
|
||||
|
||||
<h3>Usage</h3>
|
||||
<p><strong>Library</strong></p>
|
||||
<div id="system_disks"></div>
|
||||
<p><strong>Database</strong></p>
|
||||
<div id="system_database"></div>
|
||||
|
||||
<h3>Signatures</h3>
|
||||
<div id="system_signatures"></div>
|
||||
|
||||
<script type="text/javascript">function SystemLoadStatus() {
|
||||
ajaxCall('/api/v1/BackgroundTasks', 'GET', function (result) {
|
||||
var newTable = document.createElement('table');
|
||||
newTable.className = 'romtable';
|
||||
@@ -71,7 +68,7 @@
|
||||
|
||||
var startButton = '';
|
||||
if (result[i].itemState != "Running") {
|
||||
startButton = "<span id='startProcess' class='romlink' onclick='StartProcess(\"" + result[i].itemType + "\");'>Start</span>";
|
||||
startButton = "<span id='startProcess' class='romstart' onclick='StartProcess(\"" + result[i].itemType + "\");'>Start</span>";
|
||||
}
|
||||
|
||||
var newRow = [
|
||||
@@ -202,5 +199,4 @@
|
||||
SystemLoadSystemStatus();
|
||||
setInterval(SystemLoadStatus, 60000);
|
||||
SystemSignaturesStatus();
|
||||
setInterval(SystemSignaturesStatus, 300000);
|
||||
</script>
|
||||
setInterval(SystemSignaturesStatus, 300000);</script>
|
1
gaseous-server/wwwroot/scripts/dropzone.min.js
vendored
Normal file
1
gaseous-server/wwwroot/scripts/dropzone.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
gaseous-server/wwwroot/styles/dropzone.min.css
vendored
Normal file
1
gaseous-server/wwwroot/styles/dropzone.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -105,6 +105,28 @@ h3 {
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
#banner_upload {
|
||||
background-color: white;
|
||||
position: fixed;
|
||||
top: 0px;
|
||||
right: 41px;
|
||||
height: 40px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin: 0px;
|
||||
display: flex;
|
||||
color: black;
|
||||
}
|
||||
|
||||
#banner_upload:hover {
|
||||
cursor: pointer;
|
||||
background-color: lightgrey;
|
||||
}
|
||||
|
||||
#banner_cog {
|
||||
background-color: white;
|
||||
position: fixed;
|
||||
@@ -121,11 +143,18 @@ h3 {
|
||||
|
||||
#banner_cog:hover {
|
||||
cursor: pointer;
|
||||
background-color: lightgrey;
|
||||
}
|
||||
|
||||
#banner_system_image {
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
#banner_upload_image {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
#banner_header {
|
||||
@@ -168,6 +197,7 @@ h3 {
|
||||
}
|
||||
|
||||
.filter_header {
|
||||
font-weight: bold;
|
||||
padding: 10px;
|
||||
background-color: #2b2b2b;
|
||||
}
|
||||
@@ -469,7 +499,7 @@ th {
|
||||
|
||||
.romlink {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
/*text-decoration: none;*/
|
||||
}
|
||||
|
||||
.romlink:hover {
|
||||
@@ -478,6 +508,56 @@ th {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.romstart {
|
||||
padding-left: 7px;
|
||||
padding-right: 7px;
|
||||
padding-top: 3px;
|
||||
padding-bottom: 3px;
|
||||
background-color: #02B01B;
|
||||
color: white;
|
||||
text-shadow: 2px 2px 6px #003506;
|
||||
text-decoration: none;
|
||||
border-radius: 5px 5px 5px 5px;
|
||||
-webkit-border-radius: 5px 5px 5px 5px;
|
||||
-moz-border-radius: 5px 5px 5px 5px;
|
||||
border: 1px solid #19d348;
|
||||
box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44);
|
||||
-webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44);
|
||||
-moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44);
|
||||
}
|
||||
|
||||
.romstart:hover {
|
||||
background-color: #003506;
|
||||
border-color: #129834;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.properties_button {
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
border-radius: 15px;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
color: blue;
|
||||
line-height: 17px;
|
||||
text-align: center;
|
||||
border-color: blue;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
background-color: white;
|
||||
outline-color: white;
|
||||
outline-width: 1px;
|
||||
outline-style: solid;
|
||||
}
|
||||
|
||||
.properties_button:hover {
|
||||
cursor: pointer;
|
||||
color: white;
|
||||
border-color: white;
|
||||
background-color: blue;
|
||||
outline-color: blue;
|
||||
}
|
||||
|
||||
#gamedev_logo {
|
||||
float: right;
|
||||
max-height: 48px;
|
||||
@@ -492,6 +572,8 @@ th {
|
||||
display: block;
|
||||
width: 150px;
|
||||
min-width: 150px;
|
||||
background-color: #383838;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
div[name="properties_toc_item"] {
|
||||
@@ -518,6 +600,10 @@ div[name="properties_toc_item"]:hover {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.settings_toc {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.select2-container--open .select2-dropdown--below,
|
||||
.select2-container--open .select2-dropdown--above {
|
||||
background: #2b2b2b;
|
||||
@@ -585,3 +671,38 @@ button:disabled {
|
||||
width: 640px;
|
||||
padding-top: 100px;
|
||||
}
|
||||
|
||||
#emulatorbios {
|
||||
margin: 0 auto;
|
||||
width: 640px;
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
.greentext {
|
||||
color: lightgreen;
|
||||
}
|
||||
|
||||
.redtext {
|
||||
color: red;
|
||||
}
|
||||
|
||||
#settings_photocredit {
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 20px;
|
||||
background-color: rgba(0, 22, 56, 0.8);
|
||||
backdrop-filter: blur(8px);
|
||||
-webkit-backdrop-filter: blur(8px);
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#upload_target {
|
||||
background-color: #383838;
|
||||
color: white;
|
||||
border: none;
|
||||
height: 310px;
|
||||
margin-top: 10px;
|
||||
overflow: auto;
|
||||
}
|
@@ -335,6 +335,22 @@ namespace gaseous_tools
|
||||
}
|
||||
}
|
||||
|
||||
public string LibraryBIOSDirectory
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.Combine(LibraryRootDirectory, "BIOS");
|
||||
}
|
||||
}
|
||||
|
||||
public string LibraryUploadDirectory
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.Combine(LibraryRootDirectory, "Upload");
|
||||
}
|
||||
}
|
||||
|
||||
public string LibraryMetadataDirectory
|
||||
{
|
||||
get
|
||||
@@ -385,6 +401,8 @@ namespace gaseous_tools
|
||||
if (!Directory.Exists(LibraryRootDirectory)) { Directory.CreateDirectory(LibraryRootDirectory); }
|
||||
if (!Directory.Exists(LibraryImportDirectory)) { Directory.CreateDirectory(LibraryImportDirectory); }
|
||||
if (!Directory.Exists(LibraryDataDirectory)) { Directory.CreateDirectory(LibraryDataDirectory); }
|
||||
if (!Directory.Exists(LibraryBIOSDirectory)) { Directory.CreateDirectory(LibraryBIOSDirectory); }
|
||||
if (!Directory.Exists(LibraryUploadDirectory)) { Directory.CreateDirectory(LibraryUploadDirectory); }
|
||||
if (!Directory.Exists(LibraryMetadataDirectory)) { Directory.CreateDirectory(LibraryMetadataDirectory); }
|
||||
if (!Directory.Exists(LibrarySignatureImportDirectory)) { Directory.CreateDirectory(LibrarySignatureImportDirectory); }
|
||||
if (!Directory.Exists(LibrarySignatureImportDirectory_TOSEC)) { Directory.CreateDirectory(LibrarySignatureImportDirectory_TOSEC); }
|
||||
|
Reference in New Issue
Block a user