Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a2d634d96f | ||
![]() |
7a8e445471 | ||
![]() |
b010f9742b | ||
![]() |
afd70e6b02 |
2
.github/workflows/BuildDockerOnTag.yml
vendored
2
.github/workflows/BuildDockerOnTag.yml
vendored
@@ -12,6 +12,8 @@ jobs:
|
|||||||
-
|
-
|
||||||
name: Checkout
|
name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
-
|
-
|
||||||
name: Set up QEMU
|
name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v2
|
uses: docker/setup-qemu-action@v2
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "gaseous-server/wwwroot/EmulatorJS"]
|
||||||
|
path = gaseous-server/wwwroot/EmulatorJS
|
||||||
|
url = https://github.com/EmulatorJS/EmulatorJS.git
|
||||||
|
12
README.MD
12
README.MD
@@ -16,6 +16,7 @@ The following projects are used by Gaseous
|
|||||||
* https://github.com/JamesNK/Newtonsoft.Json
|
* https://github.com/JamesNK/Newtonsoft.Json
|
||||||
* https://www.nuget.org/packages/MySql.Data/8.0.32.1
|
* https://www.nuget.org/packages/MySql.Data/8.0.32.1
|
||||||
* https://github.com/kamranayub/igdb-dotnet
|
* https://github.com/kamranayub/igdb-dotnet
|
||||||
|
* https://github.com/EmulatorJS/EmulatorJS
|
||||||
|
|
||||||
## Configuration File
|
## Configuration File
|
||||||
When Gaseous-Server is started for the first time, it creates a configuration file at ~/.gaseous-server/config.json if it doesn't exist. Some values can be filled in using environment variables (such as in the case of using docker).
|
When Gaseous-Server is started for the first time, it creates a configuration file at ~/.gaseous-server/config.json if it doesn't exist. Some values can be filled in using environment variables (such as in the case of using docker).
|
||||||
@@ -57,10 +58,17 @@ When Gaseous-Server is started for the first time, it creates a configuration fi
|
|||||||
|
|
||||||
## Deploy with Docker
|
## Deploy with Docker
|
||||||
Dockerfile and docker-compose.yml files have been provided to make deployment of the server as easy as possible.
|
Dockerfile and docker-compose.yml files have been provided to make deployment of the server as easy as possible.
|
||||||
|
1. Download the docker-compose.yml file
|
||||||
|
2. Open the docker-compose.yml file and edit the igdbclientid and igdbclientsecret to the values retrieved from your IGDB account
|
||||||
|
3. Run the command "docker-compose up -d"
|
||||||
|
4. Connect to the host on port 5198
|
||||||
|
|
||||||
|
## Build and Deploy with Docker
|
||||||
|
Dockerfile and docker-compose-build.yml files have been provided to make deployment of the server as easy as possible.
|
||||||
1. Clone the repo with "git clone https://github.com/gaseous-project/gaseous-server.git"
|
1. Clone the repo with "git clone https://github.com/gaseous-project/gaseous-server.git"
|
||||||
2. Change into the gaseous-server directory
|
2. Change into the gaseous-server directory
|
||||||
3. Open the docker-compose.yml file and edit the igdbclientid and igdbclientsecret to the values retrieved from your IGDB account
|
3. Open the docker-compose-build.yml file and edit the igdbclientid and igdbclientsecret to the values retrieved from your IGDB account
|
||||||
4. Run the command "docker-compose up -d"
|
4. Run the command "docker-compose up --file docker-compose-build.yml -d"
|
||||||
5. Connect to the host on port 5198
|
5. Connect to the host on port 5198
|
||||||
|
|
||||||
## Adding Content
|
## Adding Content
|
||||||
|
BIN
gaseous-server/.DS_Store
vendored
BIN
gaseous-server/.DS_Store
vendored
Binary file not shown.
@@ -107,6 +107,19 @@ namespace gaseous_server.Classes
|
|||||||
Path = (string)romDR["path"],
|
Path = (string)romDR["path"],
|
||||||
Source = (GameRomItem.SourceType)(Int32)romDR["metadatasource"]
|
Source = (GameRomItem.SourceType)(Int32)romDR["metadatasource"]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// check for a web emulator and update the romItem
|
||||||
|
foreach (Models.PlatformMapping.PlatformMapItem platformMapping in Models.PlatformMapping.PlatformMap)
|
||||||
|
{
|
||||||
|
if (platformMapping.IGDBId == romItem.PlatformId)
|
||||||
|
{
|
||||||
|
if (platformMapping.WebEmulator != null)
|
||||||
|
{
|
||||||
|
romItem.Emulator = platformMapping.WebEmulator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return romItem;
|
return romItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,6 +128,7 @@ namespace gaseous_server.Classes
|
|||||||
public long Id { get; set; }
|
public long Id { get; set; }
|
||||||
public long PlatformId { get; set; }
|
public long PlatformId { get; set; }
|
||||||
public IGDB.Models.Platform Platform { get; set; }
|
public IGDB.Models.Platform Platform { get; set; }
|
||||||
|
public Dictionary<string, string>? Emulator { get; set; }
|
||||||
public long GameId { get; set; }
|
public long GameId { get; set; }
|
||||||
public string? Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public long Size { get; set; }
|
public long Size { get; set; }
|
||||||
|
@@ -749,6 +749,7 @@ namespace gaseous_server.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
|
[HttpHead]
|
||||||
[Route("{GameId}/roms/{RomId}/file")]
|
[Route("{GameId}/roms/{RomId}/file")]
|
||||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
|
@@ -78,6 +78,8 @@ namespace gaseous_server.Models
|
|||||||
public string IGDBName { get; set; }
|
public string IGDBName { get; set; }
|
||||||
public List<string> AlternateNames { get; set; } = new List<string>();
|
public List<string> AlternateNames { get; set; } = new List<string>();
|
||||||
public List<string> KnownFileExtensions { get; set; } = new List<string>();
|
public List<string> KnownFileExtensions { get; set; } = new List<string>();
|
||||||
|
public Dictionary<string, string>? WebEmulator { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -76,7 +76,11 @@ app.UseResponseCaching();
|
|||||||
app.UseAuthorization();
|
app.UseAuthorization();
|
||||||
|
|
||||||
app.UseDefaultFiles();
|
app.UseDefaultFiles();
|
||||||
app.UseStaticFiles();
|
app.UseStaticFiles(new StaticFileOptions
|
||||||
|
{
|
||||||
|
ServeUnknownFileTypes = true, //allow unkown file types also to be served
|
||||||
|
DefaultContentType = "plain/text" //content type to returned if fileType is not known.
|
||||||
|
});
|
||||||
|
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|
||||||
|
@@ -60,7 +60,11 @@
|
|||||||
".MD",
|
".MD",
|
||||||
".SG",
|
".SG",
|
||||||
".SMD"
|
".SMD"
|
||||||
]
|
],
|
||||||
|
"WebEmulator": {
|
||||||
|
"Type": "EmulatorJS",
|
||||||
|
"Core": "segaMD"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"IGDBId": 4,
|
"IGDBId": 4,
|
||||||
@@ -71,7 +75,11 @@
|
|||||||
],
|
],
|
||||||
"KnownFileExtensions": [
|
"KnownFileExtensions": [
|
||||||
".Z64"
|
".Z64"
|
||||||
]
|
],
|
||||||
|
"WebEmulator": {
|
||||||
|
"Type": "EmulatorJS",
|
||||||
|
"Core": "n64"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"IGDBId": 18,
|
"IGDBId": 18,
|
||||||
@@ -88,6 +96,10 @@
|
|||||||
".SFC",
|
".SFC",
|
||||||
".SMC",
|
".SMC",
|
||||||
".SWC"
|
".SWC"
|
||||||
]
|
],
|
||||||
|
"WebEmulator": {
|
||||||
|
"Type": "EmulatorJS",
|
||||||
|
"Core": "nes"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
BIN
gaseous-server/wwwroot/.DS_Store
vendored
BIN
gaseous-server/wwwroot/.DS_Store
vendored
Binary file not shown.
1
gaseous-server/wwwroot/EmulatorJS
Submodule
1
gaseous-server/wwwroot/EmulatorJS
Submodule
Submodule gaseous-server/wwwroot/EmulatorJS added at f7fa5d4148
@@ -3,10 +3,10 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<link type="text/css" rel="stylesheet" href="/styles/style.css" />
|
<link type="text/css" rel="stylesheet" href="/styles/style.css" />
|
||||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
<script src="/scripts/jquery-3.6.0.min.js"></script>
|
||||||
<script src="https://momentjs.com/downloads/moment.js"></script>
|
<script src="/scripts/moment.js"></script>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
|
<link href="/styles/select2.min.css" rel="stylesheet" />
|
||||||
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
|
<script src="/scripts/select2.min.js"></script>
|
||||||
<script src="/scripts/main.js" type="text/javascript"></script>
|
<script src="/scripts/main.js" type="text/javascript"></script>
|
||||||
<script src="/scripts/filterformating.js" type="text/javascript"></script>
|
<script src="/scripts/filterformating.js" type="text/javascript"></script>
|
||||||
<script src="/scripts/gamesformating.js" type="text/javascript"></script>
|
<script src="/scripts/gamesformating.js" type="text/javascript"></script>
|
||||||
|
25
gaseous-server/wwwroot/pages/EmulatorJS.html
Normal file
25
gaseous-server/wwwroot/pages/EmulatorJS.html
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<div style='width:640px;height:480px;max-width:100%'>
|
||||||
|
<div id='game'></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type='text/javascript'>
|
||||||
|
EJS_player = '#game';
|
||||||
|
|
||||||
|
// Can also be fceumm or nestopia
|
||||||
|
EJS_core = urlParams.get('core');
|
||||||
|
|
||||||
|
// Lightgun
|
||||||
|
EJS_lightgun = false; // can be true or false
|
||||||
|
|
||||||
|
// URL to BIOS file
|
||||||
|
EJS_biosUrl = ''; // example: https://dl.dropboxusercontent.com/s/[random-code]/bios.bin
|
||||||
|
|
||||||
|
// URL to Game rom
|
||||||
|
EJS_gameUrl = decodeURIComponent(urlParams.get('rompath'));
|
||||||
|
|
||||||
|
// Path to the data directory
|
||||||
|
EJS_pathtodata = '/EmulatorJS/data/';
|
||||||
|
|
||||||
|
EJS_DEBUG_XX = false;
|
||||||
|
</script>
|
||||||
|
<script src='/EmulatorJS/data/loader.js'></script>
|
48
gaseous-server/wwwroot/pages/emulator.html
Normal file
48
gaseous-server/wwwroot/pages/emulator.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<div id="bgImage">
|
||||||
|
<div id="bgImage_Opacity"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="emulator"></div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
|
||||||
|
var gameId = urlParams.get('gameid');
|
||||||
|
var gameData;
|
||||||
|
var artworks = null;
|
||||||
|
var artworksPosition = 0;
|
||||||
|
|
||||||
|
ajaxCall('/api/v1/Games/' + gameId, 'GET', function (result) {
|
||||||
|
gameData = result;
|
||||||
|
|
||||||
|
// load artwork
|
||||||
|
if (result.artworks) {
|
||||||
|
artworks = result.artworks.ids;
|
||||||
|
var startPos = randomIntFromInterval(0, result.artworks.ids.length);
|
||||||
|
artworksPosition = startPos;
|
||||||
|
rotateBackground();
|
||||||
|
} else {
|
||||||
|
if (result.cover) {
|
||||||
|
var bg = document.getElementById('bgImage');
|
||||||
|
bg.setAttribute('style', 'background-image: url("/api/v1/Games/' + gameId + '/cover/image"); background-position: center; background-repeat: no-repeat; background-size: cover; filter: blur(10px); -webkit-filter: blur(10px);');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function rotateBackground() {
|
||||||
|
if (artworks) {
|
||||||
|
artworksPosition += 1;
|
||||||
|
if (artworks[artworksPosition] == null) {
|
||||||
|
artworksPosition = 0;
|
||||||
|
}
|
||||||
|
var bg = document.getElementById('bgImage');
|
||||||
|
bg.setAttribute('style', 'background-image: url("/api/v1/Games/' + gameId + '/artwork/' + artworks[artworksPosition] + '/image"); background-position: center; background-repeat: no-repeat; background-size: cover; filter: blur(10px); -webkit-filter: blur(10px);');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (urlParams.get('engine')) {
|
||||||
|
case 'EmulatorJS':
|
||||||
|
$('#emulator').load('/pages/EmulatorJS.html');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
</script>
|
@@ -304,7 +304,7 @@
|
|||||||
var newTable = document.createElement('table');
|
var newTable = document.createElement('table');
|
||||||
newTable.className = 'romtable';
|
newTable.className = 'romtable';
|
||||||
newTable.setAttribute('cellspacing', 0);
|
newTable.setAttribute('cellspacing', 0);
|
||||||
newTable.appendChild(createTableRow(true, ['Name', 'Size', 'Media', '', '']));
|
newTable.appendChild(createTableRow(true, ['Name', 'Size', 'Media', '', '', '']));
|
||||||
|
|
||||||
var lastPlatform = '';
|
var lastPlatform = '';
|
||||||
for (var i = 0; i < result.length; i++) {
|
for (var i = 0; i < result.length; i++) {
|
||||||
@@ -318,11 +318,17 @@
|
|||||||
newTable.appendChild(platformRow);
|
newTable.appendChild(platformRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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>';
|
||||||
|
}
|
||||||
|
|
||||||
var newRow = [
|
var newRow = [
|
||||||
'<a href="/api/v1/Games/' + gameId + '/roms/' + result[i].id + '/file" class="romlink">' + result[i].name + '</a>',
|
'<a href="/api/v1/Games/' + gameId + '/roms/' + result[i].id + '/file" class="romlink">' + result[i].name + '</a>',
|
||||||
formatBytes(result[i].size, 2),
|
formatBytes(result[i].size, 2),
|
||||||
result[i].romTypeMedia,
|
result[i].romTypeMedia,
|
||||||
result[i].mediaLabel,
|
result[i].mediaLabel,
|
||||||
|
launchButton,
|
||||||
'<span class="romlink" onclick="showDialog(\'rominfo\', ' + result[i].id + ');">...</span>'
|
'<span class="romlink" onclick="showDialog(\'rominfo\', ' + result[i].id + ');">...</span>'
|
||||||
];
|
];
|
||||||
newTable.appendChild(createTableRow(false, newRow, 'romrow', 'romcell'));
|
newTable.appendChild(createTableRow(false, newRow, 'romrow', 'romcell'));
|
||||||
|
2
gaseous-server/wwwroot/scripts/jquery-3.6.0.min.js
vendored
Normal file
2
gaseous-server/wwwroot/scripts/jquery-3.6.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
5685
gaseous-server/wwwroot/scripts/moment.js
Normal file
5685
gaseous-server/wwwroot/scripts/moment.js
Normal file
File diff suppressed because it is too large
Load Diff
2
gaseous-server/wwwroot/scripts/select2.min.js
vendored
Normal file
2
gaseous-server/wwwroot/scripts/select2.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
gaseous-server/wwwroot/styles/select2.min.css
vendored
Normal file
1
gaseous-server/wwwroot/styles/select2.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -579,3 +579,9 @@ button:disabled {
|
|||||||
.redbutton:disabled {
|
.redbutton:disabled {
|
||||||
background-color: #555;
|
background-color: #555;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#emulator {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 640px;
|
||||||
|
padding-top: 100px;
|
||||||
|
}
|
Reference in New Issue
Block a user