WIP
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Cryptography;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
@@ -94,7 +95,7 @@ namespace gaseous_server.Classes
|
||||
{
|
||||
if (platformMapping.Bios != null)
|
||||
{
|
||||
IGDB.Models.Platform platform = Metadata.Platforms.GetPlatform(platformMapping.IGDBId);
|
||||
Platform platform = Metadata.Platforms.GetPlatform(platformMapping.IGDBId);
|
||||
|
||||
foreach (Models.PlatformMapping.PlatformMapItem.EmulatorBiosItem emulatorBios in platformMapping.Bios)
|
||||
{
|
||||
|
@@ -9,7 +9,7 @@ using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Controllers;
|
||||
using gaseous_server.Controllers.v1_1;
|
||||
using gaseous_server.Models;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Newtonsoft.Json;
|
||||
@@ -18,9 +18,10 @@ using static gaseous_server.Classes.Metadata.Games;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
public class Collections
|
||||
{
|
||||
public static List<CollectionItem> GetCollections(string userid) {
|
||||
public class Collections
|
||||
{
|
||||
public static List<CollectionItem> GetCollections(string userid)
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT * FROM RomCollections WHERE OwnedBy=@ownedby ORDER BY `Name`";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>{
|
||||
@@ -30,16 +31,18 @@ namespace gaseous_server.Classes
|
||||
|
||||
List<CollectionItem> collectionItems = new List<CollectionItem>();
|
||||
|
||||
foreach(DataRow row in data.Rows) {
|
||||
foreach (DataRow row in data.Rows)
|
||||
{
|
||||
collectionItems.Add(BuildCollectionItem(row));
|
||||
}
|
||||
|
||||
return collectionItems;
|
||||
}
|
||||
|
||||
public static CollectionItem GetCollection(long Id, string userid) {
|
||||
public static CollectionItem GetCollection(long Id, string userid)
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql;
|
||||
string sql;
|
||||
if (userid == "")
|
||||
{
|
||||
// reserved for internal operations
|
||||
@@ -50,24 +53,24 @@ namespace gaseous_server.Classes
|
||||
// instigated by a user
|
||||
sql = "SELECT * FROM RomCollections WHERE Id = @id AND OwnedBy = @ownedby ORDER BY `Name`";
|
||||
}
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>
|
||||
{
|
||||
{ "id", Id },
|
||||
{ "ownedby", userid }
|
||||
};
|
||||
DataTable romDT = db.ExecuteCMD(sql, dbDict);
|
||||
DataTable romDT = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
if (romDT.Rows.Count > 0)
|
||||
{
|
||||
DataRow row = romDT.Rows[0];
|
||||
CollectionItem collectionItem = BuildCollectionItem(row);
|
||||
if (romDT.Rows.Count > 0)
|
||||
{
|
||||
DataRow row = romDT.Rows[0];
|
||||
CollectionItem collectionItem = BuildCollectionItem(row);
|
||||
|
||||
return collectionItem;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Unknown Collection Id");
|
||||
}
|
||||
return collectionItem;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Unknown Collection Id");
|
||||
}
|
||||
}
|
||||
|
||||
public static CollectionItem NewCollection(CollectionItem item, string userid)
|
||||
@@ -130,9 +133,9 @@ namespace gaseous_server.Classes
|
||||
{ "archivetype", Common.ReturnValueIfNull(item.ArchiveType, CollectionItem.ArchiveTypes.Zip) },
|
||||
{ "ownedby", userid }
|
||||
};
|
||||
|
||||
|
||||
string CollectionZipFile = Path.Combine(Config.LibraryConfiguration.LibraryCollectionsDirectory, Id + item.ArchiveExtension);
|
||||
if (ForceRebuild == true)
|
||||
if (ForceRebuild == true)
|
||||
{
|
||||
dbDict.Add("builtstatus", CollectionItem.CollectionBuildStatus.WaitingForBuild);
|
||||
if (File.Exists(CollectionZipFile))
|
||||
@@ -153,7 +156,7 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
}
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
|
||||
CollectionItem collectionItem = GetCollection(Id, userid);
|
||||
|
||||
if (collectionItem.BuildStatus == CollectionItem.CollectionBuildStatus.WaitingForBuild)
|
||||
@@ -208,7 +211,8 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
}
|
||||
|
||||
public static CollectionContents GetCollectionContent(CollectionItem collectionItem, string userid) {
|
||||
public static CollectionContents GetCollectionContent(CollectionItem collectionItem, string userid)
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
// get age ratings for specified user
|
||||
@@ -245,30 +249,35 @@ namespace gaseous_server.Classes
|
||||
List<Platform> platforms = new List<Platform>();
|
||||
|
||||
// add platforms with an inclusion status
|
||||
foreach (CollectionItem.AlwaysIncludeItem alwaysIncludeItem in collectionItem.AlwaysInclude)
|
||||
foreach (CollectionItem.AlwaysIncludeItem alwaysIncludeItem in collectionItem.AlwaysInclude)
|
||||
{
|
||||
if (
|
||||
alwaysIncludeItem.InclusionState == CollectionItem.AlwaysIncludeStatus.AlwaysInclude ||
|
||||
alwaysIncludeItem.InclusionState == CollectionItem.AlwaysIncludeStatus.AlwaysExclude
|
||||
)
|
||||
{
|
||||
if (!platformids.Contains(alwaysIncludeItem.PlatformId))
|
||||
{
|
||||
if (!platformids.Contains(alwaysIncludeItem.PlatformId))
|
||||
{
|
||||
platformids.Add(alwaysIncludeItem.PlatformId);
|
||||
}
|
||||
platformids.Add(alwaysIncludeItem.PlatformId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add dynamic platforms
|
||||
if (DynamicPlatforms.Count > 0) {
|
||||
foreach (long PlatformId in platformids) {
|
||||
if (DynamicPlatforms.Count > 0)
|
||||
{
|
||||
foreach (long PlatformId in platformids)
|
||||
{
|
||||
platforms.Add(Platforms.GetPlatform(PlatformId));
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// get all platforms to pull from
|
||||
Dictionary<string, List<Filters.FilterItem>> FilterDict = Filters.Filter(AgeGroups.AgeRestrictionGroupings.Adult, true);
|
||||
List<Classes.Filters.FilterItem> filteredPlatforms = (List<Classes.Filters.FilterItem>)FilterDict["platforms"];
|
||||
foreach (Filters.FilterItem filterItem in filteredPlatforms) {
|
||||
foreach (Filters.FilterItem filterItem in filteredPlatforms)
|
||||
{
|
||||
platforms.Add(Platforms.GetPlatform(filterItem.Id));
|
||||
}
|
||||
}
|
||||
@@ -280,7 +289,8 @@ namespace gaseous_server.Classes
|
||||
// build collection
|
||||
List<CollectionContents.CollectionPlatformItem> platformItems = new List<CollectionContents.CollectionPlatformItem>();
|
||||
|
||||
foreach (Platform platform in platforms) {
|
||||
foreach (Platform platform in platforms)
|
||||
{
|
||||
long TotalRomSize = 0;
|
||||
long TotalGameCount = 0;
|
||||
|
||||
@@ -297,7 +307,8 @@ namespace gaseous_server.Classes
|
||||
Controllers.v1_1.GamesController.GameReturnPackage games = new Controllers.v1_1.GamesController.GameReturnPackage();
|
||||
if (isDynamic == true)
|
||||
{
|
||||
Controllers.v1_1.GamesController.GameSearchModel searchModel = new Controllers.v1_1.GamesController.GameSearchModel{
|
||||
Controllers.v1_1.GamesController.GameSearchModel searchModel = new Controllers.v1_1.GamesController.GameSearchModel
|
||||
{
|
||||
Name = "",
|
||||
Platform = new List<string>{
|
||||
platform.Id.ToString()
|
||||
@@ -306,49 +317,52 @@ namespace gaseous_server.Classes
|
||||
GameMode = collectionItem.Players.ConvertAll(s => s.ToString()),
|
||||
PlayerPerspective = collectionItem.PlayerPerspectives.ConvertAll(s => s.ToString()),
|
||||
Theme = collectionItem.Themes.ConvertAll(s => s.ToString()),
|
||||
GameRating = new Controllers.v1_1.GamesController.GameSearchModel.GameRatingItem{
|
||||
GameRating = new Controllers.v1_1.GamesController.GameSearchModel.GameRatingItem
|
||||
{
|
||||
MinimumRating = collectionItem.MinimumRating,
|
||||
MaximumRating = collectionItem.MaximumRating
|
||||
},
|
||||
GameAgeRating = new Controllers.v1_1.GamesController.GameSearchModel.GameAgeRatingItem{
|
||||
GameAgeRating = new Controllers.v1_1.GamesController.GameSearchModel.GameAgeRatingItem
|
||||
{
|
||||
AgeGroupings = UserAgeGroupings,
|
||||
IncludeUnrated = UserAgeGroupIncludeUnrated
|
||||
}
|
||||
};
|
||||
games = Controllers.v1_1.GamesController.GetGames(searchModel, userid);
|
||||
|
||||
|
||||
}
|
||||
|
||||
CollectionContents.CollectionPlatformItem collectionPlatformItem = new CollectionContents.CollectionPlatformItem(platform);
|
||||
collectionPlatformItem.Games = new List<CollectionContents.CollectionPlatformItem.CollectionGameItem>();
|
||||
|
||||
// add titles with an inclusion status
|
||||
foreach (CollectionItem.AlwaysIncludeItem alwaysIncludeItem in collectionItem.AlwaysInclude)
|
||||
foreach (CollectionItem.AlwaysIncludeItem alwaysIncludeItem in collectionItem.AlwaysInclude)
|
||||
{
|
||||
if (
|
||||
(
|
||||
alwaysIncludeItem.InclusionState == CollectionItem.AlwaysIncludeStatus.AlwaysInclude ||
|
||||
alwaysIncludeItem.InclusionState == CollectionItem.AlwaysIncludeStatus.AlwaysExclude
|
||||
) && alwaysIncludeItem.PlatformId == platform.Id
|
||||
)
|
||||
{
|
||||
MinimalGameItem AlwaysIncludeGame = new MinimalGameItem(Games.GetGame(alwaysIncludeItem.GameId, false, false, false));
|
||||
CollectionContents.CollectionPlatformItem.CollectionGameItem gameItem = new CollectionContents.CollectionPlatformItem.CollectionGameItem(AlwaysIncludeGame);
|
||||
gameItem.InclusionStatus = new CollectionItem.AlwaysIncludeItem();
|
||||
gameItem.InclusionStatus.PlatformId = alwaysIncludeItem.PlatformId;
|
||||
gameItem.InclusionStatus.GameId = alwaysIncludeItem.GameId;
|
||||
gameItem.InclusionStatus.InclusionState = alwaysIncludeItem.InclusionState;
|
||||
gameItem.Roms = Roms.GetRoms((long)gameItem.Id, (long)platform.Id).GameRomItems;
|
||||
)
|
||||
{
|
||||
MinimalGameItem AlwaysIncludeGame = new MinimalGameItem(Games.GetGame(Communications.MetadataSource, alwaysIncludeItem.GameId));
|
||||
CollectionContents.CollectionPlatformItem.CollectionGameItem gameItem = new CollectionContents.CollectionPlatformItem.CollectionGameItem(AlwaysIncludeGame);
|
||||
gameItem.InclusionStatus = new CollectionItem.AlwaysIncludeItem();
|
||||
gameItem.InclusionStatus.PlatformId = alwaysIncludeItem.PlatformId;
|
||||
gameItem.InclusionStatus.GameId = alwaysIncludeItem.GameId;
|
||||
gameItem.InclusionStatus.InclusionState = alwaysIncludeItem.InclusionState;
|
||||
gameItem.Roms = Roms.GetRoms((long)gameItem.Id, (long)platform.Id).GameRomItems;
|
||||
|
||||
collectionPlatformItem.Games.Add(gameItem);
|
||||
collectionPlatformItem.Games.Add(gameItem);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (MinimalGameItem game in games.Games) {
|
||||
foreach (MinimalGameItem game in games.Games)
|
||||
{
|
||||
bool gameAlreadyInList = false;
|
||||
foreach (CollectionContents.CollectionPlatformItem.CollectionGameItem existingGame in collectionPlatformItem.Games)
|
||||
foreach (CollectionContents.CollectionPlatformItem.CollectionGameItem existingGame in collectionPlatformItem.Games)
|
||||
{
|
||||
if (existingGame.Id == game.Id)
|
||||
if (existingGame.Id == game.Id)
|
||||
{
|
||||
gameAlreadyInList = true;
|
||||
}
|
||||
@@ -359,31 +373,37 @@ namespace gaseous_server.Classes
|
||||
CollectionContents.CollectionPlatformItem.CollectionGameItem collectionGameItem = new CollectionContents.CollectionPlatformItem.CollectionGameItem(game);
|
||||
|
||||
List<Roms.GameRomItem> gameRoms = Roms.GetRoms((long)game.Id, (long)platform.Id).GameRomItems;
|
||||
|
||||
|
||||
bool AddGame = false;
|
||||
|
||||
// calculate total rom size for the game
|
||||
long GameRomSize = 0;
|
||||
foreach (Roms.GameRomItem gameRom in gameRoms) {
|
||||
foreach (Roms.GameRomItem gameRom in gameRoms)
|
||||
{
|
||||
GameRomSize += (long)gameRom.Size;
|
||||
}
|
||||
if (collectionItem.MaximumBytesPerPlatform > 0) {
|
||||
if ((TotalRomSize + GameRomSize) < collectionItem.MaximumBytesPerPlatform) {
|
||||
if (collectionItem.MaximumBytesPerPlatform > 0)
|
||||
{
|
||||
if ((TotalRomSize + GameRomSize) < collectionItem.MaximumBytesPerPlatform)
|
||||
{
|
||||
AddGame = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
AddGame = true;
|
||||
}
|
||||
|
||||
if (AddGame == true) {
|
||||
if (AddGame == true)
|
||||
{
|
||||
TotalRomSize += GameRomSize;
|
||||
|
||||
bool AddRoms = false;
|
||||
|
||||
if (collectionItem.MaximumRomsPerPlatform > 0) {
|
||||
if (TotalGameCount < collectionItem.MaximumRomsPerPlatform) {
|
||||
if (collectionItem.MaximumRomsPerPlatform > 0)
|
||||
{
|
||||
if (TotalGameCount < collectionItem.MaximumRomsPerPlatform)
|
||||
{
|
||||
AddRoms = true;
|
||||
}
|
||||
}
|
||||
@@ -392,7 +412,8 @@ namespace gaseous_server.Classes
|
||||
AddRoms = true;
|
||||
}
|
||||
|
||||
if (AddRoms == true) {
|
||||
if (AddRoms == true)
|
||||
{
|
||||
TotalGameCount += 1;
|
||||
collectionGameItem.Roms = gameRoms;
|
||||
collectionPlatformItem.Games.Add(collectionGameItem);
|
||||
@@ -401,7 +422,8 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
|
||||
// handle age grouping
|
||||
AgeGroups.AgeRestrictionGroupings CurrentAgeGroup = AgeGroups.GetAgeGroupFromAgeRatings(game.AgeRatings);
|
||||
List<AgeRating> gameAgeRatings = game.AgeRatings.Select(s => (AgeRating)s).ToList();
|
||||
AgeGroups.AgeRestrictionGroupings CurrentAgeGroup = AgeGroups.GetAgeGroupFromAgeRatings(gameAgeRatings);
|
||||
if (CurrentAgeGroup > AgeGrouping)
|
||||
{
|
||||
AgeGrouping = CurrentAgeGroup;
|
||||
@@ -469,14 +491,14 @@ namespace gaseous_server.Classes
|
||||
{ "agu", collectionContents.ContainsUnclassifiedAgeGroup }
|
||||
};
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
|
||||
List<CollectionContents.CollectionPlatformItem> collectionPlatformItems = collectionContents.Collection;
|
||||
string ZipFilePath = Path.Combine(Config.LibraryConfiguration.LibraryCollectionsDirectory, collectionItem.Id + collectionItem.ArchiveExtension);
|
||||
string ZipFileTempPath = Path.Combine(Config.LibraryConfiguration.LibraryTempDirectory, collectionItem.Id.ToString());
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
// clean up if needed
|
||||
if (File.Exists(ZipFilePath))
|
||||
{
|
||||
@@ -500,11 +522,12 @@ namespace gaseous_server.Classes
|
||||
if (collectionItem.IncludeBIOSFiles == true)
|
||||
{
|
||||
List<Bios.BiosItem> bios = Bios.GetBios(collectionPlatformItem.Id, true);
|
||||
if (!Directory.Exists(ZipBiosPath)) {
|
||||
if (!Directory.Exists(ZipBiosPath))
|
||||
{
|
||||
Directory.CreateDirectory(ZipBiosPath);
|
||||
}
|
||||
|
||||
foreach (Bios.BiosItem biosItem in bios)
|
||||
foreach (Bios.BiosItem biosItem in bios)
|
||||
{
|
||||
if (File.Exists(biosItem.biosPath))
|
||||
{
|
||||
@@ -573,8 +596,8 @@ namespace gaseous_server.Classes
|
||||
case CollectionItem.FolderStructures.RetroPie:
|
||||
ZipGamePath = ZipPlatformPath;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// copy in roms
|
||||
foreach (Roms.GameRomItem gameRomItem in collectionGameItem.Roms)
|
||||
{
|
||||
@@ -590,7 +613,7 @@ namespace gaseous_server.Classes
|
||||
|
||||
// compress to zip
|
||||
Logging.Log(Logging.LogType.Information, "Collections", "Compressing collection");
|
||||
switch(collectionItem.ArchiveType)
|
||||
switch (collectionItem.ArchiveType)
|
||||
{
|
||||
case CollectionItem.ArchiveTypes.Zip:
|
||||
ZipFile.CreateFromDirectory(ZipFileTempPath, ZipFilePath, CompressionLevel.SmallestSize, false);
|
||||
@@ -601,10 +624,10 @@ namespace gaseous_server.Classes
|
||||
break;
|
||||
|
||||
case CollectionItem.ArchiveTypes.SevenZip:
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// clean up
|
||||
if (Directory.Exists(ZipFileTempPath))
|
||||
@@ -639,7 +662,8 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
}
|
||||
|
||||
private static CollectionItem BuildCollectionItem(DataRow row) {
|
||||
private static CollectionItem BuildCollectionItem(DataRow row)
|
||||
{
|
||||
string strPlatforms = (string)Common.ReturnValueIfNull(row["Platforms"], "[ ]");
|
||||
string strGenres = (string)Common.ReturnValueIfNull(row["Genres"], "[ ]");
|
||||
string strPlayers = (string)Common.ReturnValueIfNull(row["Players"], "[ ]");
|
||||
@@ -704,7 +728,7 @@ namespace gaseous_server.Classes
|
||||
case ArchiveTypes.Zip:
|
||||
default:
|
||||
return ".zip";
|
||||
|
||||
|
||||
case ArchiveTypes.RAR:
|
||||
return ".rar";
|
||||
|
||||
@@ -810,7 +834,8 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
}
|
||||
|
||||
public class CollectionContents {
|
||||
public class CollectionContents
|
||||
{
|
||||
[JsonIgnore]
|
||||
public List<CollectionPlatformItem> Collection { get; set; }
|
||||
|
||||
@@ -840,13 +865,16 @@ namespace gaseous_server.Classes
|
||||
public AgeGroups.AgeRestrictionGroupings AgeGroup { get; set; }
|
||||
public bool ContainsUnclassifiedAgeGroup { get; set; }
|
||||
|
||||
public class CollectionPlatformItem {
|
||||
public CollectionPlatformItem(IGDB.Models.Platform platform) {
|
||||
public class CollectionPlatformItem
|
||||
{
|
||||
public CollectionPlatformItem(Platform platform)
|
||||
{
|
||||
string[] PropertyWhitelist = new string[] { "Id", "Name", "Slug" };
|
||||
|
||||
PropertyInfo[] srcProperties = typeof(IGDB.Models.Platform).GetProperties();
|
||||
PropertyInfo[] srcProperties = typeof(Platform).GetProperties();
|
||||
PropertyInfo[] dstProperties = typeof(CollectionPlatformItem).GetProperties();
|
||||
foreach (PropertyInfo srcProperty in srcProperties) {
|
||||
foreach (PropertyInfo srcProperty in srcProperties)
|
||||
{
|
||||
if (PropertyWhitelist.Contains<string>(srcProperty.Name))
|
||||
{
|
||||
foreach (PropertyInfo dstProperty in dstProperties)
|
||||
@@ -866,10 +894,13 @@ namespace gaseous_server.Classes
|
||||
|
||||
public List<CollectionGameItem> Games { get; set; }
|
||||
|
||||
public int RomCount {
|
||||
get {
|
||||
public int RomCount
|
||||
{
|
||||
get
|
||||
{
|
||||
int Counter = 0;
|
||||
foreach (CollectionGameItem Game in Games) {
|
||||
foreach (CollectionGameItem Game in Games)
|
||||
{
|
||||
Counter += 1;
|
||||
}
|
||||
|
||||
@@ -877,11 +908,15 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
}
|
||||
|
||||
public long RomSize {
|
||||
get {
|
||||
public long RomSize
|
||||
{
|
||||
get
|
||||
{
|
||||
long Size = 0;
|
||||
foreach (CollectionGameItem Game in Games) {
|
||||
foreach (Roms.GameRomItem Rom in Game.Roms) {
|
||||
foreach (CollectionGameItem Game in Games)
|
||||
{
|
||||
foreach (Roms.GameRomItem Rom in Game.Roms)
|
||||
{
|
||||
Size += (long)Rom.Size;
|
||||
}
|
||||
}
|
||||
@@ -904,29 +939,13 @@ namespace gaseous_server.Classes
|
||||
this.FirstReleaseDate = gameObject.FirstReleaseDate;
|
||||
this.AgeRatings = gameObject.AgeRatings;
|
||||
}
|
||||
|
||||
public IGDB.Models.Cover? CoverItem
|
||||
|
||||
public AgeGroups.AgeRestrictionGroupings AgeGrouping
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Cover != null)
|
||||
{
|
||||
IGDB.Models.Cover cover = Covers.GetCover(Cover.Id, Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory, "Games", Slug), false);
|
||||
|
||||
return cover;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public AgeGroups.AgeRestrictionGroupings AgeGrouping
|
||||
{
|
||||
get
|
||||
{
|
||||
return AgeGroups.GetAgeGroupFromAgeRatings(this.AgeRatings);
|
||||
List<AgeRating> gameAgeRatings = this.AgeRatings.Select(s => (AgeRating)s).ToList();
|
||||
return AgeGroups.GetAgeGroupFromAgeRatings(gameAgeRatings);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -934,17 +953,20 @@ namespace gaseous_server.Classes
|
||||
|
||||
public List<Roms.GameRomItem> Roms { get; set; }
|
||||
|
||||
public long RomSize {
|
||||
get {
|
||||
long Size = 0;
|
||||
foreach (Roms.GameRomItem Rom in Roms) {
|
||||
Size += (long)Rom.Size;
|
||||
public long RomSize
|
||||
{
|
||||
get
|
||||
{
|
||||
long Size = 0;
|
||||
foreach (Roms.GameRomItem Rom in Roms)
|
||||
{
|
||||
Size += (long)Rom.Size;
|
||||
}
|
||||
|
||||
return Size;
|
||||
}
|
||||
|
||||
return Size;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using Newtonsoft.Json;
|
||||
using IGDB.Models;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using NuGet.Common;
|
||||
|
||||
@@ -623,21 +622,21 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
}
|
||||
|
||||
public string LibraryMetadataDirectory_Platform(Platform platform)
|
||||
public string LibraryMetadataDirectory_Platform(HasheousClient.Models.Metadata.IGDB.Platform platform)
|
||||
{
|
||||
string MetadataPath = Path.Combine(LibraryMetadataDirectory, "Platforms", platform.Slug);
|
||||
if (!Directory.Exists(MetadataPath)) { Directory.CreateDirectory(MetadataPath); }
|
||||
return MetadataPath;
|
||||
}
|
||||
|
||||
public string LibraryMetadataDirectory_Game(Game game)
|
||||
public string LibraryMetadataDirectory_Game(gaseous_server.Models.Game game)
|
||||
{
|
||||
string MetadataPath = Path.Combine(LibraryMetadataDirectory, "Games", game.Slug);
|
||||
if (!Directory.Exists(MetadataPath)) { Directory.CreateDirectory(MetadataPath); }
|
||||
return MetadataPath;
|
||||
}
|
||||
|
||||
public string LibraryMetadataDirectory_Company(Company company)
|
||||
public string LibraryMetadataDirectory_Company(HasheousClient.Models.Metadata.IGDB.Company company)
|
||||
{
|
||||
string MetadataPath = Path.Combine(LibraryMetadataDirectory, "Companies", company.Slug);
|
||||
if (!Directory.Exists(MetadataPath)) { Directory.CreateDirectory(MetadataPath); }
|
||||
|
@@ -3,7 +3,6 @@ using System.Data;
|
||||
using System.Reflection;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Models;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
@@ -394,8 +393,8 @@ namespace gaseous_server.Classes
|
||||
(string)row["Path"]
|
||||
);
|
||||
|
||||
Platform platform = Platforms.GetPlatform((long)row["PlatformId"], false);
|
||||
Game game = Games.GetGame((long)row["GameId"], false, false, false);
|
||||
HasheousClient.Models.Metadata.IGDB.Platform platform = Platforms.GetPlatform((long)row["PlatformId"]);
|
||||
Game game = Games.GetGame(Communications.MetadataSource, (long)row["GameId"]);
|
||||
|
||||
ImportGame.StoreROM(library, hash, game, platform, signature, (string)row["Path"], (long)row["Id"]);
|
||||
|
||||
|
@@ -342,7 +342,7 @@ namespace gaseous_server.Classes
|
||||
switch (metadataResult.Source)
|
||||
{
|
||||
case HasheousClient.Models.MetadataSources.IGDB:
|
||||
signature.Flags.IGDBGameId = (long)Games.GetGame(metadataResult.Id, false, false, false).Id;
|
||||
signature.Flags.IGDBGameId = (long)Games.GetGame(Communications.MetadataSource, metadataResult.Id).Id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -2,7 +2,6 @@ using System;
|
||||
using System.Data;
|
||||
using gaseous_server.Classes;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using IGDB.Models;
|
||||
using Microsoft.CodeAnalysis.FlowAnalysis.DataFlow;
|
||||
|
||||
namespace gaseous_server
|
||||
@@ -237,7 +236,7 @@ namespace gaseous_server
|
||||
{
|
||||
if (_DefaultPlatformId != 0)
|
||||
{
|
||||
Platform platform = Platforms.GetPlatform(_DefaultPlatformId);
|
||||
HasheousClient.Models.Metadata.IGDB.Platform platform = Platforms.GetPlatform(_DefaultPlatformId);
|
||||
return platform.Name;
|
||||
}
|
||||
else
|
||||
|
@@ -7,12 +7,12 @@ using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Models;
|
||||
using IGDB.Models;
|
||||
using NuGet.Common;
|
||||
using NuGet.LibraryModel;
|
||||
using static gaseous_server.Classes.Metadata.Games;
|
||||
using static gaseous_server.Classes.FileSignature;
|
||||
using HasheousClient.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
@@ -47,7 +47,7 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<string, object> ImportGameFile(string GameFileImportPath, IGDB.Models.Platform? OverridePlatform)
|
||||
public Dictionary<string, object> ImportGameFile(string GameFileImportPath, Platform? OverridePlatform)
|
||||
{
|
||||
Dictionary<string, object> RetVal = new Dictionary<string, object>();
|
||||
RetVal.Add("path", Path.GetFileName(GameFileImportPath));
|
||||
@@ -110,13 +110,13 @@ namespace gaseous_server.Classes
|
||||
gaseous_server.Models.Signatures_Games discoveredSignature = fileSignature.GetFileSignature(GameLibrary.GetDefaultLibrary, hash, fi, GameFileImportPath);
|
||||
|
||||
// get discovered platform
|
||||
IGDB.Models.Platform? determinedPlatform = null;
|
||||
Platform? determinedPlatform = null;
|
||||
if (OverridePlatform == null)
|
||||
{
|
||||
determinedPlatform = Metadata.Platforms.GetPlatform(discoveredSignature.Flags.IGDBPlatformId);
|
||||
if (determinedPlatform == null)
|
||||
{
|
||||
determinedPlatform = new IGDB.Models.Platform();
|
||||
determinedPlatform = new Platform();
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -126,7 +126,7 @@ namespace gaseous_server.Classes
|
||||
discoveredSignature.Flags.IGDBPlatformName = determinedPlatform.Name;
|
||||
}
|
||||
|
||||
IGDB.Models.Game determinedGame = SearchForGame(discoveredSignature, discoveredSignature.Flags.IGDBPlatformId, true);
|
||||
gaseous_server.Models.Game determinedGame = SearchForGame(discoveredSignature, discoveredSignature.Flags.IGDBPlatformId, true);
|
||||
|
||||
// add to database
|
||||
long RomId = StoreROM(GameLibrary.GetDefaultLibrary, hash, determinedGame, determinedPlatform, discoveredSignature, GameFileImportPath, 0, true);
|
||||
@@ -157,7 +157,7 @@ namespace gaseous_server.Classes
|
||||
File.Move(GameFileImportPath, biosItem.biosPath, true);
|
||||
|
||||
RetVal.Add("name", biosItem.filename);
|
||||
RetVal.Add("platform", Platforms.GetPlatform(biosItem.platformid, false, false));
|
||||
RetVal.Add("platform", Platforms.GetPlatform(biosItem.platformid));
|
||||
RetVal["status"] = "imported";
|
||||
|
||||
return RetVal;
|
||||
@@ -178,7 +178,7 @@ namespace gaseous_server.Classes
|
||||
return RetVal;
|
||||
}
|
||||
|
||||
public static IGDB.Models.Game SearchForGame(gaseous_server.Models.Signatures_Games Signature, long PlatformId, bool FullDownload)
|
||||
public static gaseous_server.Models.Game SearchForGame(gaseous_server.Models.Signatures_Games Signature, long PlatformId, bool FullDownload)
|
||||
{
|
||||
if (Signature.Flags != null)
|
||||
{
|
||||
@@ -187,7 +187,7 @@ namespace gaseous_server.Classes
|
||||
// game was determined elsewhere - probably a Hasheous server
|
||||
try
|
||||
{
|
||||
return Games.GetGame(Signature.Flags.IGDBGameId, false, false, FullDownload);
|
||||
return Games.GetGame(Communications.MetadataSource, Signature.Flags.IGDBGameId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -197,7 +197,7 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
|
||||
// search discovered game - case insensitive exact match first
|
||||
IGDB.Models.Game determinedGame = new IGDB.Models.Game();
|
||||
gaseous_server.Models.Game determinedGame = new gaseous_server.Models.Game();
|
||||
|
||||
string GameName = Signature.Game.Name;
|
||||
|
||||
@@ -212,13 +212,13 @@ namespace gaseous_server.Classes
|
||||
foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType)))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " Search type: " + searchType.ToString());
|
||||
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
||||
gaseous_server.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
||||
if (games != null)
|
||||
{
|
||||
if (games.Length == 1)
|
||||
{
|
||||
// exact match!
|
||||
determinedGame = Metadata.Games.GetGame((long)games[0].Id, false, false, false);
|
||||
determinedGame = Metadata.Games.GetGame(Communications.MetadataSource, (long)games[0].Id);
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " IGDB game: " + determinedGame.Name);
|
||||
GameFound = true;
|
||||
break;
|
||||
@@ -228,12 +228,12 @@ namespace gaseous_server.Classes
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " " + games.Length + " search results found");
|
||||
|
||||
// quite likely we've found sequels and alternate types
|
||||
foreach (Game game in games)
|
||||
foreach (gaseous_server.Models.Game game in games)
|
||||
{
|
||||
if (game.Name == SearchCandidate)
|
||||
{
|
||||
// found game title matches the search candidate
|
||||
determinedGame = Metadata.Games.GetGame((long)games[0].Id, false, false, false);
|
||||
determinedGame = Metadata.Games.GetGame(Communications.MetadataSource, (long)games[0].Id);
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", "Found exact match!");
|
||||
GameFound = true;
|
||||
break;
|
||||
@@ -254,7 +254,7 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
if (determinedGame == null)
|
||||
{
|
||||
determinedGame = new IGDB.Models.Game();
|
||||
determinedGame = new gaseous_server.Models.Game();
|
||||
}
|
||||
|
||||
string destSlug = "";
|
||||
@@ -266,9 +266,9 @@ namespace gaseous_server.Classes
|
||||
return determinedGame;
|
||||
}
|
||||
|
||||
public static List<IGDB.Models.Game> SearchForGame_GetAll(string GameName, long PlatformId)
|
||||
public static List<gaseous_server.Models.Game> SearchForGame_GetAll(string GameName, long PlatformId)
|
||||
{
|
||||
List<IGDB.Models.Game> searchResults = new List<IGDB.Models.Game>();
|
||||
List<gaseous_server.Models.Game> searchResults = new List<gaseous_server.Models.Game>();
|
||||
|
||||
List<string> SearchCandidates = GetSearchCandidates(GameName);
|
||||
|
||||
@@ -278,11 +278,11 @@ namespace gaseous_server.Classes
|
||||
{
|
||||
if ((PlatformId == 0 && searchType == SearchType.searchNoPlatform) || (PlatformId != 0 && searchType != SearchType.searchNoPlatform))
|
||||
{
|
||||
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
||||
foreach (IGDB.Models.Game foundGame in games)
|
||||
gaseous_server.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
||||
foreach (gaseous_server.Models.Game foundGame in games)
|
||||
{
|
||||
bool gameInResults = false;
|
||||
foreach (IGDB.Models.Game searchResult in searchResults)
|
||||
foreach (gaseous_server.Models.Game searchResult in searchResults)
|
||||
{
|
||||
if (searchResult.Id == foundGame.Id)
|
||||
{
|
||||
@@ -333,7 +333,7 @@ namespace gaseous_server.Classes
|
||||
return SearchCandidates;
|
||||
}
|
||||
|
||||
public static long StoreROM(GameLibrary.LibraryItem library, Common.hashObject hash, IGDB.Models.Game determinedGame, IGDB.Models.Platform determinedPlatform, gaseous_server.Models.Signatures_Games discoveredSignature, string GameFileImportPath, long UpdateId = 0, bool SourceIsExternal = false)
|
||||
public static long StoreROM(GameLibrary.LibraryItem library, Common.hashObject hash, gaseous_server.Models.Game determinedGame, Platform determinedPlatform, gaseous_server.Models.Signatures_Games discoveredSignature, string GameFileImportPath, long UpdateId = 0, bool SourceIsExternal = false)
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
@@ -415,8 +415,8 @@ namespace gaseous_server.Classes
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
|
||||
// get metadata
|
||||
IGDB.Models.Platform platform = gaseous_server.Classes.Metadata.Platforms.GetPlatform(rom.PlatformId);
|
||||
IGDB.Models.Game game = gaseous_server.Classes.Metadata.Games.GetGame(rom.GameId, false, false, false);
|
||||
Platform platform = gaseous_server.Classes.Metadata.Platforms.GetPlatform(rom.PlatformId);
|
||||
gaseous_server.Models.Game game = gaseous_server.Classes.Metadata.Games.GetGame(Communications.MetadataSource, rom.GameId);
|
||||
|
||||
// build path
|
||||
string platformSlug = "Unknown Platform";
|
||||
@@ -728,7 +728,7 @@ namespace gaseous_server.Classes
|
||||
{
|
||||
// get discovered platform
|
||||
long PlatformId;
|
||||
IGDB.Models.Platform determinedPlatform;
|
||||
Platform determinedPlatform;
|
||||
|
||||
if (sig.Flags.IGDBPlatformId == null || sig.Flags.IGDBPlatformId == 0)
|
||||
{
|
||||
@@ -742,7 +742,7 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
determinedPlatform = Platforms.GetPlatform(PlatformId);
|
||||
|
||||
IGDB.Models.Game determinedGame = SearchForGame(sig, PlatformId, true);
|
||||
gaseous_server.Models.Game determinedGame = SearchForGame(sig, PlatformId, true);
|
||||
|
||||
StoreROM(library, hash, determinedGame, determinedPlatform, sig, LibraryFile);
|
||||
}
|
||||
@@ -854,7 +854,7 @@ namespace gaseous_server.Classes
|
||||
|
||||
// get discovered platform
|
||||
long PlatformId;
|
||||
IGDB.Models.Platform determinedPlatform;
|
||||
Platform determinedPlatform;
|
||||
|
||||
if (sig.Flags.IGDBPlatformId == null || sig.Flags.IGDBPlatformId == 0)
|
||||
{
|
||||
@@ -868,7 +868,7 @@ namespace gaseous_server.Classes
|
||||
}
|
||||
determinedPlatform = Platforms.GetPlatform(PlatformId);
|
||||
|
||||
IGDB.Models.Game determinedGame = SearchForGame(sig, PlatformId, true);
|
||||
gaseous_server.Models.Game determinedGame = SearchForGame(sig, PlatformId, true);
|
||||
|
||||
StoreROM(library, hash, determinedGame, determinedPlatform, sig, romPath, romId);
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Text.Json.Serialization;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using gaseous_server.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
using Microsoft.CodeAnalysis.Classification;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -14,7 +14,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
|
||||
}
|
||||
|
||||
public static AgeGroup? GetAgeGroup(Game? game)
|
||||
public static AgeGroup? GetAgeGroup(Models.Game? game)
|
||||
{
|
||||
if (game == null)
|
||||
{
|
||||
@@ -23,7 +23,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
else
|
||||
{
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
cacheStatus = Storage.GetCacheStatus("AgeGroup", (long)game.Id);
|
||||
cacheStatus = Storage.GetCacheStatus(Communications.MetadataSource, "AgeGroup", (long)game.Id);
|
||||
|
||||
AgeGroup? RetVal = new AgeGroup();
|
||||
|
||||
@@ -31,16 +31,16 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
RetVal = _GetAgeGroup(game);
|
||||
Storage.NewCacheValue(RetVal, false);
|
||||
Storage.NewCacheValue(Communications.MetadataSource, RetVal, false);
|
||||
break;
|
||||
|
||||
case Storage.CacheStatus.Expired:
|
||||
RetVal = _GetAgeGroup(game);
|
||||
Storage.NewCacheValue(RetVal, true);
|
||||
Storage.NewCacheValue(Communications.MetadataSource, RetVal, true);
|
||||
break;
|
||||
|
||||
case Storage.CacheStatus.Current:
|
||||
RetVal = Storage.GetCacheValue<AgeGroup>(RetVal, "Id", game.Id);
|
||||
RetVal = Storage.GetCacheValue<AgeGroup>(Communications.MetadataSource, RetVal, "Id", game.Id);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -51,20 +51,20 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
}
|
||||
|
||||
public static AgeGroup? _GetAgeGroup(Game game)
|
||||
public static AgeGroup? _GetAgeGroup(Models.Game game)
|
||||
{
|
||||
// compile the maximum age group for the given game
|
||||
if (game != null)
|
||||
{
|
||||
if (game.AgeRatings != null)
|
||||
{
|
||||
if (game.AgeRatings.Ids != null)
|
||||
if (game.AgeRatings != null)
|
||||
{
|
||||
// collect ratings values from metadata
|
||||
List<AgeRating> ageRatings = new List<AgeRating>();
|
||||
foreach (long ratingId in game.AgeRatings.Ids)
|
||||
foreach (long ratingId in game.AgeRatings)
|
||||
{
|
||||
AgeRating? rating = AgeRatings.GetAgeRatings(ratingId);
|
||||
AgeRating? rating = AgeRatings.GetAgeRating(game.MetadataSource, ratingId);
|
||||
if (rating != null)
|
||||
{
|
||||
ageRatings.Add(rating);
|
||||
@@ -262,13 +262,13 @@ namespace gaseous_server.Classes.Metadata
|
||||
|
||||
public class AgeGroupItem
|
||||
{
|
||||
public List<IGDB.Models.AgeRatingTitle> ACB { get; set; }
|
||||
public List<IGDB.Models.AgeRatingTitle> CERO { get; set; }
|
||||
public List<IGDB.Models.AgeRatingTitle> CLASS_IND { get; set; }
|
||||
public List<IGDB.Models.AgeRatingTitle> ESRB { get; set; }
|
||||
public List<IGDB.Models.AgeRatingTitle> GRAC { get; set; }
|
||||
public List<IGDB.Models.AgeRatingTitle> PEGI { get; set; }
|
||||
public List<IGDB.Models.AgeRatingTitle> USK { get; set; }
|
||||
public List<AgeRatingTitle> ACB { get; set; }
|
||||
public List<AgeRatingTitle> CERO { get; set; }
|
||||
public List<AgeRatingTitle> CLASS_IND { get; set; }
|
||||
public List<AgeRatingTitle> ESRB { get; set; }
|
||||
public List<AgeRatingTitle> GRAC { get; set; }
|
||||
public List<AgeRatingTitle> PEGI { get; set; }
|
||||
public List<AgeRatingTitle> USK { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
|
@@ -2,8 +2,7 @@
|
||||
using System.Buffers;
|
||||
using System.Reflection;
|
||||
using System.Text.Json.Serialization;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
using Microsoft.CodeAnalysis.Classification;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -16,7 +15,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static AgeRating? GetAgeRatings(long? Id)
|
||||
public static AgeRating? GetAgeRating(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -24,72 +23,16 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<AgeRating> RetVal = _GetAgeRatings((long)Id);
|
||||
return RetVal.Result;
|
||||
AgeRating? RetVal = Metadata.GetMetadata<AgeRating>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<AgeRating> _GetAgeRatings(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("AgeRating", (long)searchValue);
|
||||
|
||||
AgeRating returnValue = new AgeRating();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<AgeRating>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<AgeRating>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(AgeRating ageRating)
|
||||
{
|
||||
if (ageRating.ContentDescriptions != null)
|
||||
{
|
||||
foreach (long AgeRatingContentDescriptionId in ageRating.ContentDescriptions.Ids)
|
||||
{
|
||||
AgeRatingContentDescription ageRatingContentDescription = AgeRatingContentDescriptions.GetAgeRatingContentDescriptions(AgeRatingContentDescriptionId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<AgeRating> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get AgeRatings metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<AgeRating>(Communications.MetadataEndpoint.AgeRating, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static GameAgeRating GetConsolidatedAgeRating(long RatingId)
|
||||
public static GameAgeRating GetConsolidatedAgeRating(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long RatingId)
|
||||
{
|
||||
GameAgeRating gameAgeRating = new GameAgeRating();
|
||||
|
||||
AgeRating ageRating = GetAgeRatings(RatingId);
|
||||
AgeRating ageRating = GetAgeRating(SourceType, RatingId);
|
||||
gameAgeRating.Id = (long)ageRating.Id;
|
||||
gameAgeRating.RatingBoard = (AgeRatingCategory)ageRating.Category;
|
||||
gameAgeRating.RatingTitle = (AgeRatingTitle)ageRating.Rating;
|
||||
@@ -97,9 +40,9 @@ namespace gaseous_server.Classes.Metadata
|
||||
List<string> descriptions = new List<string>();
|
||||
if (ageRating.ContentDescriptions != null)
|
||||
{
|
||||
foreach (long ContentId in ageRating.ContentDescriptions.Ids)
|
||||
foreach (long ContentId in ageRating.ContentDescriptions)
|
||||
{
|
||||
AgeRatingContentDescription ageRatingContentDescription = AgeRatingContentDescriptions.GetAgeRatingContentDescriptions(ContentId);
|
||||
AgeRatingContentDescription ageRatingContentDescription = AgeRatingContentDescriptions.GetAgeRatingContentDescriptions(SourceType, ContentId);
|
||||
descriptions.Add(ageRatingContentDescription.Description);
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static AgeRatingContentDescription? GetAgeRatingContentDescriptions(long? Id)
|
||||
public static AgeRatingContentDescription? GetAgeRatingContentDescriptions(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<AgeRatingContentDescription> RetVal = _GetAgeRatingContentDescriptions((long)Id);
|
||||
return RetVal.Result;
|
||||
AgeRatingContentDescription? RetVal = Metadata.GetMetadata<AgeRatingContentDescription>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<AgeRatingContentDescription> _GetAgeRatingContentDescriptions(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("AgeRatingContentDescription", searchValue);
|
||||
|
||||
AgeRatingContentDescription returnValue = new AgeRatingContentDescription();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<AgeRatingContentDescription>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<AgeRatingContentDescription>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<AgeRatingContentDescription> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get AgeRatingContentDescriptionContentDescriptions metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<AgeRatingContentDescription>(Communications.MetadataEndpoint.AgeRatingContentDescription, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static AlternativeName? GetAlternativeNames(long? Id)
|
||||
public static AlternativeName? GetAlternativeNames(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<AlternativeName> RetVal = _GetAlternativeNames((long)Id);
|
||||
return RetVal.Result;
|
||||
AlternativeName? RetVal = Metadata.GetMetadata<AlternativeName>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<AlternativeName> _GetAlternativeNames(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("AlternativeName", searchValue);
|
||||
|
||||
AlternativeName returnValue = new AlternativeName();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<AlternativeName>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<AlternativeName>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<AlternativeName> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get AlternativeNames metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<AlternativeName>(Communications.MetadataEndpoint.AlternativeName, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -13,7 +11,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Artwork? GetArtwork(long? Id, string ImagePath, bool GetImages)
|
||||
public static Artwork? GetArtwork(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,75 +19,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Artwork> RetVal = _GetArtwork((long)Id, ImagePath, GetImages);
|
||||
return RetVal.Result;
|
||||
Artwork? RetVal = Metadata.GetMetadata<Artwork>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Artwork> _GetArtwork(long searchValue, string ImagePath, bool GetImages = true)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Artwork", searchValue);
|
||||
|
||||
Artwork returnValue = new Artwork();
|
||||
bool forceImageDownload = false;
|
||||
ImagePath = Path.Combine(ImagePath, "Artwork");
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
|
||||
// check if old value is different from the new value - only download if it's different
|
||||
Artwork oldImage = Storage.GetCacheValue<Artwork>(returnValue, "id", (long)searchValue);
|
||||
if (oldImage.ImageId != returnValue.ImageId)
|
||||
{
|
||||
forceImageDownload = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Artwork>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Artwork>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if (GetImages == true)
|
||||
{
|
||||
if (forceImageDownload == true)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata: " + returnValue.GetType().Name, "Artwork download forced.");
|
||||
|
||||
Communications comms = new Communications();
|
||||
comms.GetSpecificImageFromServer(ImagePath, returnValue.ImageId, Communications.IGDBAPI_ImageSize.original, null);
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<Artwork> GetObjectFromServer(long searchValue, string ImagePath)
|
||||
{
|
||||
// get Artwork metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Artwork>(Communications.MetadataEndpoint.Artwork, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -13,7 +11,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Collection? GetCollections(long? Id)
|
||||
public static Collection? GetCollections(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +19,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Collection> RetVal = _GetCollections((long)Id);
|
||||
return RetVal.Result;
|
||||
Collection? RetVal = Metadata.GetMetadata<Collection>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Collection> _GetCollections(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Collection", searchValue);
|
||||
|
||||
Collection returnValue = new Collection();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Collection>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Collection>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<Collection> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Collections metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Collection>(Communications.MetadataEndpoint.Collection, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -211,7 +211,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request data from the metadata API using a slug
|
||||
/// Request data from the metadata API using a slug using the default source
|
||||
/// </summary>
|
||||
/// <typeparam name="T">
|
||||
/// The type of object to return
|
||||
@@ -227,7 +227,27 @@ namespace gaseous_server.Classes.Metadata
|
||||
/// </returns>
|
||||
public async Task<T[]?> APIComm<T>(MetadataEndpoint Endpoint, string Slug)
|
||||
{
|
||||
switch (_MetadataSource)
|
||||
return await APIComm<T>(_MetadataSource, Endpoint, Slug);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request data from the metadata API using a slug
|
||||
/// </summary>
|
||||
/// <typeparam name="T">
|
||||
/// The type of object to return
|
||||
/// </typeparam>
|
||||
/// <param name="Endpoint">
|
||||
/// The endpoint to access - can only be either Platform or Game
|
||||
/// </param>
|
||||
/// <param name="Slug">
|
||||
/// The slug to query for
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The object requested
|
||||
/// </returns>
|
||||
public async Task<T[]?> APIComm<T>(HasheousClient.Models.MetadataModel.MetadataSources SourceType, MetadataEndpoint Endpoint, string Slug)
|
||||
{
|
||||
switch (SourceType)
|
||||
{
|
||||
case HasheousClient.Models.MetadataModel.MetadataSources.None:
|
||||
return null;
|
||||
@@ -266,7 +286,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request data from the metadata API using an id
|
||||
/// Request data from the metadata API using an id using the default source
|
||||
/// </summary>
|
||||
/// <typeparam name="T">
|
||||
/// The type of object to return
|
||||
@@ -282,7 +302,30 @@ namespace gaseous_server.Classes.Metadata
|
||||
/// </returns>
|
||||
public async Task<T[]> APIComm<T>(MetadataEndpoint Endpoint, long Id)
|
||||
{
|
||||
switch (_MetadataSource)
|
||||
return await APIComm<T>(_MetadataSource, Endpoint, Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request data from the metadata API using an id
|
||||
/// </summary>
|
||||
/// <typeparam name="T">
|
||||
/// The type of object to return
|
||||
/// </typeparam>
|
||||
/// <param name="SourceType">
|
||||
/// The source of the metadata
|
||||
/// </param>
|
||||
/// <param name="Endpoint">
|
||||
/// The endpoint to access
|
||||
/// </param>
|
||||
/// <param name="Id">
|
||||
/// The Id to query for
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The object requested
|
||||
/// </returns>
|
||||
public async Task<T[]> APIComm<T>(HasheousClient.Models.MetadataModel.MetadataSources SourceType, MetadataEndpoint Endpoint, long Id)
|
||||
{
|
||||
switch (SourceType)
|
||||
{
|
||||
case HasheousClient.Models.MetadataModel.MetadataSources.None:
|
||||
return null;
|
||||
@@ -874,14 +917,17 @@ namespace gaseous_server.Classes.Metadata
|
||||
if (property.PropertyType.IsEnum)
|
||||
{
|
||||
// check if property is null
|
||||
if (input.GetType().GetProperty(property.Name).GetValue(input) != null)
|
||||
if (input.GetType().GetProperty(property.Name) != null)
|
||||
{
|
||||
// get the enum type
|
||||
Type enumType = property.PropertyType;
|
||||
// get the enum value
|
||||
object enumValue = Enum.Parse(enumType, input.GetType().GetProperty(property.Name).GetValue(input).ToString());
|
||||
// set the enum value
|
||||
property.SetValue(output, enumValue);
|
||||
if (input.GetType().GetProperty(property.Name).GetValue(input) != null)
|
||||
{
|
||||
// get the enum type
|
||||
Type enumType = property.PropertyType;
|
||||
// get the enum value
|
||||
object enumValue = Enum.Parse(enumType, input.GetType().GetProperty(property.Name).GetValue(input).ToString());
|
||||
// set the enum value
|
||||
property.SetValue(output, enumValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (Common.IsNullableEnum(property.PropertyType))
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -12,7 +11,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Company? GetCompanies(long? Id)
|
||||
public static Company? GetCompanies(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -20,71 +19,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Company> RetVal = _GetCompanies((long)Id);
|
||||
return RetVal.Result;
|
||||
Company? RetVal = Metadata.GetMetadata<Company>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Company> _GetCompanies(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Company", searchValue);
|
||||
|
||||
Company returnValue = new Company();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
if (returnValue != null) { Storage.NewCacheValue(returnValue); }
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Company>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Company>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Company company)
|
||||
{
|
||||
if (company.Logo != null)
|
||||
{
|
||||
CompanyLogo companyLogo = CompanyLogos.GetCompanyLogo(company.Logo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Company(company));
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Company> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Companies metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Company>(Communications.MetadataEndpoint.Company, searchValue);
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -21,74 +19,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<CompanyLogo> RetVal = _GetCompanyLogo((long)Id, ImagePath);
|
||||
return RetVal.Result;
|
||||
CompanyLogo? RetVal = Metadata.GetMetadata<CompanyLogo>((long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<CompanyLogo> _GetCompanyLogo(long searchValue, string ImagePath)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("CompanyLogo", searchValue);
|
||||
|
||||
CompanyLogo returnValue = new CompanyLogo();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
|
||||
// check if old value is different from the new value - only download if it's different
|
||||
CompanyLogo oldImage = Storage.GetCacheValue<CompanyLogo>(returnValue, "id", (long)searchValue);
|
||||
if (oldImage.ImageId != returnValue.ImageId)
|
||||
{
|
||||
forceImageDownload = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<CompanyLogo>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<CompanyLogo>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if (forceImageDownload == true)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata: " + returnValue.GetType().Name, "Company logo download forced.");
|
||||
|
||||
Communications comms = new Communications();
|
||||
comms.GetSpecificImageFromServer(ImagePath, returnValue.ImageId, Communications.IGDBAPI_ImageSize.original, null);
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<CompanyLogo> GetObjectFromServer(long searchValue, string ImagePath)
|
||||
{
|
||||
// get Artwork metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<CompanyLogo>(Communications.MetadataEndpoint.CompanyLogo, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,9 +1,5 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using Microsoft.CodeAnalysis.Elfie.Model.Strings;
|
||||
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -15,7 +11,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Cover? GetCover(long? Id, string ImagePath, bool GetImages)
|
||||
public static Cover? GetCover(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -23,75 +19,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Cover> RetVal = _GetCover((long)Id, ImagePath, GetImages);
|
||||
return RetVal.Result;
|
||||
Cover? RetVal = Metadata.GetMetadata<Cover>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Cover> _GetCover(long searchValue, string ImagePath, bool GetImages = true)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Cover", searchValue);
|
||||
|
||||
Cover returnValue = new Cover();
|
||||
bool forceImageDownload = false;
|
||||
ImagePath = Path.Combine(ImagePath, "Covers");
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
|
||||
// check if old value is different from the new value - only download if it's different
|
||||
Cover oldCover = Storage.GetCacheValue<Cover>(returnValue, "id", (long)searchValue);
|
||||
if (oldCover.ImageId != returnValue.ImageId)
|
||||
{
|
||||
forceImageDownload = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Cover>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Cover>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if (GetImages == true)
|
||||
{
|
||||
if (forceImageDownload == true)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata: " + returnValue.GetType().Name, "Cover download forced.");
|
||||
|
||||
Communications comms = new Communications();
|
||||
comms.GetSpecificImageFromServer(ImagePath, returnValue.ImageId, Communications.IGDBAPI_ImageSize.original, null);
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<Cover> GetObjectFromServer(long searchValue, string ImagePath)
|
||||
{
|
||||
// get Cover metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Cover>(Communications.MetadataEndpoint.Cover, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -13,7 +11,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static ExternalGame? GetExternalGames(long? Id)
|
||||
public static ExternalGame? GetExternalGames(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,62 +19,8 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<ExternalGame> RetVal = _GetExternalGames((long)Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<ExternalGame> _GetExternalGames(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("ExternalGame", searchValue);
|
||||
|
||||
ExternalGame returnValue = new ExternalGame();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<ExternalGame>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<ExternalGame>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<ExternalGame?> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get ExternalGames metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<ExternalGame>(Communications.MetadataEndpoint.ExternalGame, searchValue);
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
ExternalGame? RetVal = Metadata.GetMetadata<ExternalGame>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -13,7 +11,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Franchise? GetFranchises(long? Id)
|
||||
public static Franchise? GetFranchises(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +19,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Franchise> RetVal = _GetFranchises((long)Id);
|
||||
return RetVal.Result;
|
||||
Franchise? RetVal = Metadata.GetMetadata<Franchise>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Franchise> _GetFranchises(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Franchise", searchValue);
|
||||
|
||||
Franchise returnValue = new Franchise();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Franchise>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Franchise>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<Franchise> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get FranchiseContentDescriptions metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Franchise>(Communications.MetadataEndpoint.Franchise, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static GameMode? GetGame_Modes(long? Id)
|
||||
public static GameMode? GetGame_Modes(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<GameMode> RetVal = _GetGame_Modes((long)Id);
|
||||
return RetVal.Result;
|
||||
GameMode? RetVal = Metadata.GetMetadata<GameMode>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<GameMode> _GetGame_Modes(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("GameMode", searchValue);
|
||||
|
||||
GameMode returnValue = new GameMode();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<GameMode>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<GameMode>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<GameMode> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Game_Modes metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<GameMode>(Communications.MetadataEndpoint.GameMode, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static GameVideo? GetGame_Videos(long? Id)
|
||||
public static GameVideo? GetGame_Videos(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<GameVideo> RetVal = _GetGame_Videos((long)Id);
|
||||
return RetVal.Result;
|
||||
GameVideo? RetVal = Metadata.GetMetadata<GameVideo>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<GameVideo> _GetGame_Videos(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("GameVideo", searchValue);
|
||||
|
||||
GameVideo returnValue = new GameVideo();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<GameVideo>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<GameVideo>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<GameVideo> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Game_Videos metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<GameVideo>(Communications.MetadataEndpoint.GameVideo, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,8 +2,6 @@
|
||||
using System.Data;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using gaseous_server.Models;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -22,39 +20,24 @@ namespace gaseous_server.Classes.Metadata
|
||||
{ }
|
||||
}
|
||||
|
||||
public static Game? GetGame(long Id, bool getAllMetadata, bool followSubGames, bool forceRefresh)
|
||||
public static Game? GetGame(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if (Id == 0)
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
Game returnValue = new Game();
|
||||
if (Storage.GetCacheStatus("Game", 0) == Storage.CacheStatus.NotPresent)
|
||||
{
|
||||
returnValue = new Game
|
||||
{
|
||||
Id = 0,
|
||||
Name = "Unknown Title",
|
||||
Slug = "Unknown"
|
||||
};
|
||||
Storage.NewCacheValue(returnValue);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Storage.GetCacheValue<Game>(returnValue, "id", 0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Game> RetVal = _GetGame(SearchUsing.Id, Id, getAllMetadata, followSubGames, forceRefresh);
|
||||
return RetVal.Result;
|
||||
Game? RetVal = Metadata.GetMetadata<Game>(SourceType, (long)Id, false);
|
||||
RetVal.MetadataSource = SourceType;
|
||||
RetVal = MassageResult(RetVal);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
public static Game GetGame(string Slug, bool getAllMetadata, bool followSubGames, bool forceRefresh)
|
||||
public static Game? GetGame(HasheousClient.Models.MetadataModel.MetadataSources SourceType, string? Slug)
|
||||
{
|
||||
Task<Game> RetVal = _GetGame(SearchUsing.Slug, Slug, getAllMetadata, followSubGames, forceRefresh);
|
||||
return RetVal.Result;
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public static Game GetGame(DataRow dataRow)
|
||||
@@ -62,323 +45,30 @@ namespace gaseous_server.Classes.Metadata
|
||||
return Storage.BuildCacheObject<Game>(new Game(), dataRow);
|
||||
}
|
||||
|
||||
private static async Task<Game> _GetGame(SearchUsing searchUsing, object searchValue, bool getAllMetadata = true, bool followSubGames = false, bool forceRefresh = false)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.Id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Game", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Game", (string)searchValue);
|
||||
}
|
||||
|
||||
if (forceRefresh == true)
|
||||
{
|
||||
if (cacheStatus == Storage.CacheStatus.Current) { cacheStatus = Storage.CacheStatus.Expired; }
|
||||
}
|
||||
|
||||
Game returnValue = new Game();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
if (searchUsing == SearchUsing.Id)
|
||||
{
|
||||
returnValue = await GetObjectFromServer((long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
returnValue = await GetObjectFromServer((string)searchValue);
|
||||
}
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue, getAllMetadata, followSubGames, forceRefresh);
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
if (searchUsing == SearchUsing.Id)
|
||||
{
|
||||
returnValue = await GetObjectFromServer((long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
returnValue = await GetObjectFromServer((string)searchValue);
|
||||
}
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(returnValue, getAllMetadata, followSubGames, forceRefresh);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id/Slug: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Game>(returnValue, searchUsing.ToString(), searchValue);
|
||||
}
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Game>(returnValue, searchUsing.ToString(), searchValue);
|
||||
UpdateSubClasses(returnValue, false, false, false);
|
||||
return returnValue;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Game Game, bool getAllMetadata, bool followSubGames, bool forceRefresh)
|
||||
{
|
||||
// required metadata
|
||||
// if (Game.Cover != null)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// Cover GameCover = Covers.GetCover(Game.Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game), forceRefresh);
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Logging.Log(Logging.LogType.Critical, "Game Metadata", "Unable to fetch cover artwork.", ex);
|
||||
// }
|
||||
// }
|
||||
|
||||
if (Game.Genres != null)
|
||||
{
|
||||
foreach (long GenreId in Game.Genres.Ids)
|
||||
{
|
||||
Genre GameGenre = Genres.GetGenres(GenreId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.GameModes != null)
|
||||
{
|
||||
foreach (long gameModeId in Game.GameModes.Ids)
|
||||
{
|
||||
GameMode gameMode = GameModes.GetGame_Modes(gameModeId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.MultiplayerModes != null)
|
||||
{
|
||||
foreach (long multiplayerModeId in Game.MultiplayerModes.Ids)
|
||||
{
|
||||
MultiplayerMode multiplayerMode = MultiplayerModes.GetGame_MultiplayerModes(multiplayerModeId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.PlayerPerspectives != null)
|
||||
{
|
||||
foreach (long PerspectiveId in Game.PlayerPerspectives.Ids)
|
||||
{
|
||||
PlayerPerspective GamePlayPerspective = PlayerPerspectives.GetGame_PlayerPerspectives(PerspectiveId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Themes != null)
|
||||
{
|
||||
foreach (long ThemeId in Game.Themes.Ids)
|
||||
{
|
||||
Theme GameTheme = Themes.GetGame_Themes(ThemeId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.AgeRatings != null)
|
||||
{
|
||||
foreach (long AgeRatingId in Game.AgeRatings.Ids)
|
||||
{
|
||||
AgeRating GameAgeRating = AgeRatings.GetAgeRatings(AgeRatingId);
|
||||
}
|
||||
}
|
||||
AgeGroups.GetAgeGroup(Game);
|
||||
|
||||
if (Game.ReleaseDates != null)
|
||||
{
|
||||
foreach (long ReleaseDateId in Game.ReleaseDates.Ids)
|
||||
{
|
||||
ReleaseDate GameReleaseDate = ReleaseDates.GetReleaseDates(ReleaseDateId);
|
||||
}
|
||||
}
|
||||
|
||||
// optional metadata - usually downloaded as needed
|
||||
if (getAllMetadata == true)
|
||||
{
|
||||
if (Game.AlternativeNames != null)
|
||||
{
|
||||
foreach (long AlternativeNameId in Game.AlternativeNames.Ids)
|
||||
{
|
||||
AlternativeName GameAlternativeName = AlternativeNames.GetAlternativeNames(AlternativeNameId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Artworks != null)
|
||||
{
|
||||
foreach (long ArtworkId in Game.Artworks.Ids)
|
||||
{
|
||||
try
|
||||
{
|
||||
Artwork GameArtwork = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game), forceRefresh);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Critical, "Game Metadata", "Unable to fetch artwork id: " + ArtworkId, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (followSubGames)
|
||||
{
|
||||
List<long> gamesToFetch = new List<long>();
|
||||
if (Game.Bundles != null) { gamesToFetch.AddRange(Game.Bundles.Ids); }
|
||||
if (Game.Dlcs != null) { gamesToFetch.AddRange(Game.Dlcs.Ids); }
|
||||
if (Game.Expansions != null) { gamesToFetch.AddRange(Game.Expansions.Ids); }
|
||||
if (Game.ParentGame != null) { gamesToFetch.Add((long)Game.ParentGame.Id); }
|
||||
//if (Game.SimilarGames != null) { gamesToFetch.AddRange(Game.SimilarGames.Ids); }
|
||||
if (Game.StandaloneExpansions != null) { gamesToFetch.AddRange(Game.StandaloneExpansions.Ids); }
|
||||
if (Game.VersionParent != null) { gamesToFetch.Add((long)Game.VersionParent.Id); }
|
||||
|
||||
foreach (long gameId in gamesToFetch)
|
||||
{
|
||||
Game relatedGame = GetGame(gameId, false, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Collection != null)
|
||||
{
|
||||
Collection GameCollection = Collections.GetCollections(Game.Collection.Id);
|
||||
}
|
||||
|
||||
// if (Game.ExternalGames != null)
|
||||
// {
|
||||
// foreach (long ExternalGameId in Game.ExternalGames.Ids)
|
||||
// {
|
||||
// ExternalGame GameExternalGame = ExternalGames.GetExternalGames(ExternalGameId);
|
||||
// }
|
||||
// }
|
||||
|
||||
if (Game.Franchise != null)
|
||||
{
|
||||
Franchise GameFranchise = Franchises.GetFranchises(Game.Franchise.Id);
|
||||
}
|
||||
|
||||
if (Game.Franchises != null)
|
||||
{
|
||||
foreach (long FranchiseId in Game.Franchises.Ids)
|
||||
{
|
||||
Franchise GameFranchise = Franchises.GetFranchises(FranchiseId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.InvolvedCompanies != null)
|
||||
{
|
||||
foreach (long involvedCompanyId in Game.InvolvedCompanies.Ids)
|
||||
{
|
||||
InvolvedCompany involvedCompany = InvolvedCompanies.GetInvolvedCompanies(involvedCompanyId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Platforms != null)
|
||||
{
|
||||
foreach (long PlatformId in Game.Platforms.Ids)
|
||||
{
|
||||
Platform GamePlatform = Platforms.GetPlatform(PlatformId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Screenshots != null)
|
||||
{
|
||||
foreach (long ScreenshotId in Game.Screenshots.Ids)
|
||||
{
|
||||
try
|
||||
{
|
||||
Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game), forceRefresh);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Critical, "Game Metadata", "Unable to fetch screenshot id: " + ScreenshotId, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Videos != null)
|
||||
{
|
||||
foreach (long GameVideoId in Game.Videos.Ids)
|
||||
{
|
||||
GameVideo gameVideo = GamesVideos.GetGame_Videos(GameVideoId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
Id,
|
||||
Slug
|
||||
}
|
||||
|
||||
private static async Task<Game> GetObjectFromServer(string Slug)
|
||||
{
|
||||
// get Game metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Game>(Communications.MetadataEndpoint.Game, Slug);
|
||||
var result = results.First();
|
||||
|
||||
result = MassageResult(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static async Task<Game> GetObjectFromServer(long Id)
|
||||
{
|
||||
// get Game metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Game>(Communications.MetadataEndpoint.Game, Id);
|
||||
var result = results.First();
|
||||
|
||||
result = MassageResult(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static Game MassageResult(Game result)
|
||||
{
|
||||
// add artificial unknown platform mapping
|
||||
List<long> platformIds = new List<long>();
|
||||
platformIds.Add(0);
|
||||
if (result.Platforms != null)
|
||||
{
|
||||
if (result.Platforms.Ids != null)
|
||||
{
|
||||
platformIds.AddRange(result.Platforms.Ids.ToList());
|
||||
}
|
||||
}
|
||||
result.Platforms = new IdentitiesOrValues<Platform>(
|
||||
ids: platformIds.ToArray<long>()
|
||||
);
|
||||
Game? parentGame = null;
|
||||
|
||||
// get cover art from parent if this has no cover
|
||||
if (result.Cover == null)
|
||||
{
|
||||
if (result.ParentGame != null)
|
||||
{
|
||||
if (result.ParentGame.Id != null)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Game Metadata", "Game has no cover art, fetching cover art from parent game");
|
||||
Game parentGame = GetGame((long)result.ParentGame.Id, false, false, false);
|
||||
result.Cover = parentGame.Cover;
|
||||
}
|
||||
Logging.Log(Logging.LogType.Information, "Game Metadata", "Game has no cover art, fetching cover art from parent game");
|
||||
parentGame = GetGame(result.MetadataSource, (long)result.ParentGame);
|
||||
result.Cover = parentGame.Cover;
|
||||
}
|
||||
}
|
||||
|
||||
// get missing metadata from parent if this is a port
|
||||
if (result.Category == Category.Port)
|
||||
if (result.Category == HasheousClient.Models.Metadata.IGDB.Category.Port)
|
||||
{
|
||||
if (result.Summary == null)
|
||||
{
|
||||
if (result.ParentGame != null)
|
||||
{
|
||||
if (result.ParentGame.Id != null)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Game Metadata", "Game has no summary, fetching summary from parent game");
|
||||
Game parentGame = GetGame((long)result.ParentGame.Id, false, false, false);
|
||||
result.Summary = parentGame.Summary;
|
||||
}
|
||||
Logging.Log(Logging.LogType.Information, "Game Metadata", "Game has no summary, fetching summary from parent game");
|
||||
result.Summary = parentGame.Summary;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -386,20 +76,6 @@ namespace gaseous_server.Classes.Metadata
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void AssignAllGamesToPlatformIdZero()
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT * FROM Game;";
|
||||
DataTable gamesTable = db.ExecuteCMD(sql);
|
||||
foreach (DataRow gameRow in gamesTable.Rows)
|
||||
{
|
||||
sql = "DELETE FROM Relation_Game_Platforms WHERE PlatformsId = 0 AND GameId = @Id; INSERT INTO Relation_Game_Platforms (GameId, PlatformsId) VALUES (@Id, 0);";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("Id", (long)gameRow["Id"]);
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
}
|
||||
}
|
||||
|
||||
private static bool AllowNoPlatformSearch = false;
|
||||
|
||||
public static Game[] SearchForGame(string SearchString, long PlatformId, SearchType searchType)
|
||||
@@ -515,7 +191,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
Game[]? results = new Game[0];
|
||||
if (allowSearch == true)
|
||||
{
|
||||
results = await comms.APIComm<Game>(IGDBClient.Endpoints.Games, searchFields, searchBody);
|
||||
results = await comms.APIComm<Game>(IGDB.IGDBClient.Endpoints.Games, searchFields, searchBody);
|
||||
|
||||
Communications.SetSearchCache<Game[]?>(searchFields, searchBody, results);
|
||||
}
|
||||
@@ -598,7 +274,7 @@ ORDER BY Platform.`Name`;";
|
||||
List<AvailablePlatformItem> platforms = new List<AvailablePlatformItem>();
|
||||
foreach (DataRow row in data.Rows)
|
||||
{
|
||||
IGDB.Models.Platform platform = Platforms.GetPlatform((long)row["PlatformId"]);
|
||||
HasheousClient.Models.Metadata.IGDB.Platform platform = Platforms.GetPlatform((long)row["PlatformId"]);
|
||||
PlatformMapping.UserEmulatorConfiguration? emulatorConfiguration = platformMapping.GetUserEmulator(UserId, GameId, (long)platform.Id);
|
||||
|
||||
if (emulatorConfiguration == null)
|
||||
@@ -688,7 +364,7 @@ ORDER BY Platform.`Name`;";
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
}
|
||||
|
||||
public class AvailablePlatformItem : IGDB.Models.Platform
|
||||
public class AvailablePlatformItem : HasheousClient.Models.Metadata.IGDB.Platform
|
||||
{
|
||||
public PlatformMapping.UserEmulatorConfiguration emulatorConfiguration { get; set; }
|
||||
public long? LastPlayedRomId { get; set; }
|
||||
@@ -727,12 +403,12 @@ ORDER BY Platform.`Name`;";
|
||||
this.FirstReleaseDate = gameObject.FirstReleaseDate;
|
||||
|
||||
// compile age ratings
|
||||
this.AgeRatings = new List<AgeRating>();
|
||||
this.AgeRatings = new List<object>();
|
||||
if (gameObject.AgeRatings != null)
|
||||
{
|
||||
foreach (long ageRatingId in gameObject.AgeRatings.Ids)
|
||||
foreach (long ageRatingId in gameObject.AgeRatings)
|
||||
{
|
||||
AgeRating? rating = Classes.Metadata.AgeRatings.GetAgeRatings(ageRatingId);
|
||||
HasheousClient.Models.Metadata.IGDB.AgeRating? rating = Classes.Metadata.AgeRatings.GetAgeRating(gameObject.MetadataSource, ageRatingId);
|
||||
if (rating != null)
|
||||
{
|
||||
this.AgeRatings.Add(rating);
|
||||
@@ -751,9 +427,9 @@ ORDER BY Platform.`Name`;";
|
||||
public bool HasSavedGame { get; set; } = false;
|
||||
public bool IsFavourite { get; set; } = false;
|
||||
public DateTimeOffset? FirstReleaseDate { get; set; }
|
||||
public IGDB.IdentityOrValue<IGDB.Models.Cover> Cover { get; set; }
|
||||
public IGDB.IdentitiesOrValues<IGDB.Models.Artwork> Artworks { get; set; }
|
||||
public List<IGDB.Models.AgeRating> AgeRatings { get; set; }
|
||||
public object Cover { get; set; }
|
||||
public List<object> Artworks { get; set; }
|
||||
public List<object> AgeRatings { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,11 +1,10 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Genres
|
||||
public class Genres
|
||||
{
|
||||
public const string fieldList = "fields checksum,created_at,name,slug,updated_at,url;";
|
||||
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Genre? GetGenres(long? Id)
|
||||
public static Genre? GetGenres(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Genre> RetVal = _GetGenres((long)Id);
|
||||
return RetVal.Result;
|
||||
Genre? RetVal = Metadata.GetMetadata<Genre>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Genre> _GetGenres(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Genre", searchValue);
|
||||
|
||||
Genre returnValue = new Genre();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Genre>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Genre>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<Genre> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Genres metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Genre>(Communications.MetadataEndpoint.Genre, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -20,63 +19,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<InvolvedCompany> RetVal = _GetInvolvedCompanies((long)Id);
|
||||
return RetVal.Result;
|
||||
InvolvedCompany? RetVal = Metadata.GetMetadata<InvolvedCompany>(Communications.MetadataSource, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<InvolvedCompany> _GetInvolvedCompanies(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("InvolvedCompany", searchValue);
|
||||
|
||||
InvolvedCompany returnValue = new InvolvedCompany();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<InvolvedCompany>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<InvolvedCompany>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(InvolvedCompany involvedCompany)
|
||||
{
|
||||
if (involvedCompany.Company != null)
|
||||
{
|
||||
Company company = Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<InvolvedCompany> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Genres metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<InvolvedCompany>(Communications.MetadataEndpoint.InvolvedCompany, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
140
gaseous-server/Classes/Metadata/Metadata.cs
Normal file
140
gaseous-server/Classes/Metadata/Metadata.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Metadata
|
||||
{
|
||||
#region Exception Handling
|
||||
public class InvalidMetadataId : Exception
|
||||
{
|
||||
public InvalidMetadataId(long Id) : base("Invalid Metadata id: " + Id + " from source: " + Communications.MetadataSource + " (default)")
|
||||
{
|
||||
}
|
||||
|
||||
public InvalidMetadataId(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long Id) : base("Invalid Metadata id: " + Id + " from source: " + SourceType)
|
||||
{
|
||||
}
|
||||
|
||||
public InvalidMetadataId(string Id) : base("Invalid Metadata id: " + Id + " from source: " + Communications.MetadataSource + " (default)")
|
||||
{
|
||||
}
|
||||
|
||||
public InvalidMetadataId(string SourceType, string Id) : base("Invalid Metadata id: " + Id + " from source: " + SourceType)
|
||||
{
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Get Metadata
|
||||
/// <summary>
|
||||
/// Get metadata from the default source
|
||||
/// </summary>
|
||||
/// <typeparam name="T">
|
||||
/// The type of metadata to get
|
||||
/// </typeparam>
|
||||
/// <param name="Id">
|
||||
/// The id of the metadata to get
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The metadata object
|
||||
/// </returns>
|
||||
/// <exception cref="InvalidMetadataId">
|
||||
/// Thrown when the id is invalid
|
||||
/// </exception>
|
||||
public static T? GetMetadata<T>(long Id, Boolean ForceRefresh = false) where T : class
|
||||
{
|
||||
if (Id < 0)
|
||||
{
|
||||
throw new InvalidMetadataId(Id);
|
||||
}
|
||||
|
||||
return _GetMetadata<T>(Communications.MetadataSource, Id, ForceRefresh);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get metadata from the specified source
|
||||
/// </summary>
|
||||
/// <typeparam name="T">
|
||||
/// The type of metadata to get
|
||||
/// </typeparam>
|
||||
/// <param name="SourceType">
|
||||
/// The source of the metadata
|
||||
/// </param>
|
||||
/// <param name="Id">
|
||||
/// The id of the metadata to get
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The metadata object
|
||||
/// </returns>
|
||||
/// <exception cref="InvalidMetadataId">
|
||||
/// Thrown when the id is invalid
|
||||
/// </exception>
|
||||
public static T? GetMetadata<T>(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long Id, Boolean ForceRefresh = false) where T : class
|
||||
{
|
||||
if (Id < 0)
|
||||
{
|
||||
throw new InvalidMetadataId(SourceType, Id);
|
||||
}
|
||||
|
||||
return _GetMetadata<T>(SourceType, Id, ForceRefresh);
|
||||
}
|
||||
|
||||
private static T? _GetMetadata<T>(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long Id, Boolean ForceRefresh) where T : class
|
||||
{
|
||||
// get T type as string
|
||||
string type = typeof(T).Name;
|
||||
|
||||
// check cached metadata status
|
||||
// if metadata is not cached or expired, get it from the source. Otherwise, return the cached metadata
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus(SourceType, type, Id);
|
||||
|
||||
// if ForceRefresh is true, set cache status to expired if it is current
|
||||
if (ForceRefresh == true)
|
||||
{
|
||||
if (cacheStatus == Storage.CacheStatus.Current)
|
||||
{
|
||||
cacheStatus = Storage.CacheStatus.Expired;
|
||||
}
|
||||
}
|
||||
|
||||
T? metadata = (T)Activator.CreateInstance(typeof(T));
|
||||
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.Current:
|
||||
metadata = Storage.GetCacheValue<T>(SourceType, metadata, "Id", Id);
|
||||
break;
|
||||
|
||||
case Storage.CacheStatus.Expired:
|
||||
metadata = GetMetadataFromServer<T>(SourceType, Id).Result;
|
||||
Storage.NewCacheValue<T>(SourceType, metadata, true);
|
||||
break;
|
||||
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
metadata = GetMetadataFromServer<T>(SourceType, Id).Result;
|
||||
Storage.NewCacheValue<T>(SourceType, metadata, false);
|
||||
break;
|
||||
}
|
||||
|
||||
return metadata;
|
||||
}
|
||||
|
||||
private static async Task<T> GetMetadataFromServer<T>(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long Id) where T : class
|
||||
{
|
||||
// get T type as string
|
||||
string type = typeof(T).Name;
|
||||
|
||||
// get metadata from the server
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<T>(SourceType, (Communications.MetadataEndpoint)Enum.Parse(typeof(Communications.MetadataEndpoint), type, true), Id);
|
||||
|
||||
// check for errors
|
||||
if (results == null)
|
||||
{
|
||||
throw new InvalidMetadataId(SourceType, Id);
|
||||
}
|
||||
|
||||
return results.FirstOrDefault<T>();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -21,54 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<MultiplayerMode> RetVal = _GetGame_MultiplayerModes((long)Id);
|
||||
return RetVal.Result;
|
||||
MultiplayerMode? RetVal = Metadata.GetMetadata<MultiplayerMode>(Communications.MetadataSource, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<MultiplayerMode> _GetGame_MultiplayerModes(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("MultiplayerMode", searchValue);
|
||||
|
||||
MultiplayerMode returnValue = new MultiplayerMode();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<MultiplayerMode>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<MultiplayerMode>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<MultiplayerMode> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Game_MultiplayerModes metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<MultiplayerMode>(Communications.MetadataEndpoint.MultiplayerMode, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static PlatformLogo? GetPlatformLogo(long? Id, string ImagePath)
|
||||
public static PlatformLogo? GetPlatformLogo(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,77 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<PlatformLogo> RetVal = _GetPlatformLogo((long)Id, ImagePath);
|
||||
return RetVal.Result;
|
||||
PlatformLogo? RetVal = Metadata.GetMetadata<PlatformLogo>(Communications.MetadataSource, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<PlatformLogo> _GetPlatformLogo(long searchValue, string ImagePath)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("PlatformLogo", searchValue);
|
||||
|
||||
PlatformLogo returnValue = new PlatformLogo();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
|
||||
// check if old value is different from the new value - only download if it's different
|
||||
PlatformLogo oldImage = Storage.GetCacheValue<PlatformLogo>(returnValue, "id", (long)searchValue);
|
||||
if (oldImage.ImageId != returnValue.ImageId)
|
||||
{
|
||||
forceImageDownload = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<PlatformLogo>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<PlatformLogo>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if (returnValue != null)
|
||||
{
|
||||
if (forceImageDownload == true)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata: " + returnValue.GetType().Name, "Platform logo download forced.");
|
||||
|
||||
Communications comms = new Communications();
|
||||
comms.GetSpecificImageFromServer(ImagePath, returnValue.ImageId, Communications.IGDBAPI_ImageSize.original, null);
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<PlatformLogo> GetObjectFromServer(long searchValue, string ImagePath)
|
||||
{
|
||||
// get Artwork metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<PlatformLogo>(Communications.MetadataEndpoint.PlatformLogo, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static PlatformVersion? GetPlatformVersion(long Id, Platform ParentPlatform, bool GetImages = false)
|
||||
public static PlatformVersion? GetPlatformVersion(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long Id)
|
||||
{
|
||||
if (Id == 0)
|
||||
{
|
||||
@@ -21,79 +20,8 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<PlatformVersion> RetVal = _GetPlatformVersion((long)Id, ParentPlatform, GetImages);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<PlatformVersion> _GetPlatformVersion(long searchValue, Platform ParentPlatform, bool GetImages)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("PlatformVersion", searchValue);
|
||||
|
||||
PlatformVersion returnValue = new PlatformVersion();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(ParentPlatform, returnValue, GetImages);
|
||||
}
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(ParentPlatform, returnValue, GetImages);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<PlatformVersion>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Current:
|
||||
return Storage.GetCacheValue<PlatformVersion>(returnValue, "id", (long)searchValue);
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Platform ParentPlatform, PlatformVersion platformVersion, bool GetImages)
|
||||
{
|
||||
if (GetImages == true)
|
||||
{
|
||||
if (platformVersion.PlatformLogo != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
PlatformLogo platformLogo = PlatformLogos.GetPlatformLogo(platformVersion.PlatformLogo.Id, Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(ParentPlatform), "Versions", platformVersion.Slug));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Platform Update", "Unable to fetch platform logo", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<PlatformVersion?> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get PlatformVersion metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<PlatformVersion>(Communications.MetadataEndpoint.PlatformVersion, searchValue);
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
PlatformVersion? RetVal = Metadata.GetMetadata<PlatformVersion>(SourceType, Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,8 +1,7 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Net;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
@@ -15,135 +14,22 @@ namespace gaseous_server.Classes.Metadata
|
||||
|
||||
}
|
||||
|
||||
public static Platform? GetPlatform(long Id, bool forceRefresh = false, bool GetImages = false)
|
||||
public static Platform? GetPlatform(long Id)
|
||||
{
|
||||
if (Id == 0)
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
Platform returnValue = new Platform();
|
||||
if (Storage.GetCacheStatus("Platform", 0) == Storage.CacheStatus.NotPresent)
|
||||
{
|
||||
returnValue = new Platform
|
||||
{
|
||||
Id = 0,
|
||||
Name = "Unknown Platform",
|
||||
Slug = "Unknown"
|
||||
};
|
||||
Storage.NewCacheValue(returnValue);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Storage.GetCacheValue<Platform>(returnValue, "id", 0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
Task<Platform> RetVal = _GetPlatform(SearchUsing.Id, Id, forceRefresh, GetImages);
|
||||
return RetVal.Result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata", "An error occurred fetching Platform Id " + Id, ex);
|
||||
return null;
|
||||
}
|
||||
Platform? RetVal = Metadata.GetMetadata<Platform>(Communications.MetadataSource, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
public static Platform GetPlatform(string Slug, bool forceRefresh = false, bool GetImages = false)
|
||||
{
|
||||
Task<Platform> RetVal = _GetPlatform(SearchUsing.Slug, Slug, forceRefresh, GetImages);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Platform> _GetPlatform(SearchUsing searchUsing, object searchValue, bool forceRefresh, bool GetImages)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.Id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Platform", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Platform", (string)searchValue);
|
||||
}
|
||||
|
||||
if (forceRefresh == true)
|
||||
{
|
||||
if (cacheStatus == Storage.CacheStatus.Current) { cacheStatus = Storage.CacheStatus.Expired; }
|
||||
}
|
||||
|
||||
Platform returnValue = new Platform();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
if (searchUsing == SearchUsing.Id)
|
||||
{
|
||||
returnValue = await GetObjectFromServer((long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
returnValue = await GetObjectFromServer((string)searchValue);
|
||||
}
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue, GetImages);
|
||||
AddPlatformMapping(returnValue);
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
if (searchUsing == SearchUsing.Id)
|
||||
{
|
||||
returnValue = await GetObjectFromServer((long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
returnValue = await GetObjectFromServer((string)searchValue);
|
||||
}
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(returnValue, GetImages);
|
||||
AddPlatformMapping(returnValue);
|
||||
return returnValue;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id/Slug: " + searchValue, ex);
|
||||
return Storage.GetCacheValue<Platform>(returnValue, searchUsing.ToString(), searchValue);
|
||||
}
|
||||
case Storage.CacheStatus.Current:
|
||||
return Storage.GetCacheValue<Platform>(returnValue, searchUsing.ToString(), searchValue);
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Platform platform, bool GetImages)
|
||||
{
|
||||
if (platform.Versions != null)
|
||||
{
|
||||
foreach (long PlatformVersionId in platform.Versions.Ids)
|
||||
{
|
||||
PlatformVersion platformVersion = PlatformVersions.GetPlatformVersion(PlatformVersionId, platform);
|
||||
}
|
||||
}
|
||||
|
||||
if (GetImages == true)
|
||||
{
|
||||
if (platform.PlatformLogo != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
PlatformLogo platformLogo = PlatformLogos.GetPlatformLogo(platform.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platform));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Platform Update", "Unable to fetch platform logo", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
private static void AddPlatformMapping(Platform platform)
|
||||
@@ -171,46 +57,6 @@ namespace gaseous_server.Classes.Metadata
|
||||
Models.PlatformMapping.WritePlatformMap(item, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
Id,
|
||||
Slug
|
||||
}
|
||||
|
||||
private static async Task<Platform> GetObjectFromServer(string Slug)
|
||||
{
|
||||
// get platform metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Platform>(Communications.MetadataEndpoint.Platform, Slug);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static async Task<Platform> GetObjectFromServer(long Id)
|
||||
{
|
||||
// get platform metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Platform>(Communications.MetadataEndpoint.Platform, Id);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void AssignAllPlatformsToGameIdZero()
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT * FROM Platform;";
|
||||
DataTable platformsTable = db.ExecuteCMD(sql);
|
||||
foreach (DataRow platformRow in platformsTable.Rows)
|
||||
{
|
||||
sql = "DELETE FROM Relation_Game_Platforms WHERE GameId = 0 AND PlatformsId = @Id; INSERT INTO Relation_Game_Platforms (GameId, PlatformsId) VALUES (0, @Id);";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("Id", (long)platformRow["Id"]);
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static PlayerPerspective? GetGame_PlayerPerspectives(long? Id)
|
||||
public static PlayerPerspective? GetGame_PlayerPerspectives(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,56 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<PlayerPerspective> RetVal = _GetGame_PlayerPerspectives((long)Id);
|
||||
return RetVal.Result;
|
||||
PlayerPerspective? RetVal = Metadata.GetMetadata<PlayerPerspective>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<PlayerPerspective> _GetGame_PlayerPerspectives(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("PlayerPerspective", searchValue);
|
||||
|
||||
PlayerPerspective returnValue = new PlayerPerspective();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<PlayerPerspective>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<PlayerPerspective>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<PlayerPerspective> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Game_PlayerPerspectives metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<PlayerPerspective>(Communications.MetadataEndpoint.PlayerPerspective, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static ReleaseDate? GetReleaseDates(long? Id)
|
||||
public static ReleaseDate? GetReleaseDates(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,54 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<ReleaseDate> RetVal = _GetReleaseDates((long)Id);
|
||||
return RetVal.Result;
|
||||
ReleaseDate? RetVal = Metadata.GetMetadata<ReleaseDate>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<ReleaseDate> _GetReleaseDates(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("ReleaseDate", searchValue);
|
||||
|
||||
ReleaseDate returnValue = new ReleaseDate();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<ReleaseDate>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<ReleaseDate>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<ReleaseDate> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get ReleaseDates metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<ReleaseDate>(Communications.MetadataEndpoint.ReleaseDate, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Screenshot? GetScreenshot(long? Id, string ImagePath, bool GetImages)
|
||||
public static Screenshot? GetScreenshot(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,75 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Screenshot> RetVal = _GetScreenshot((long)Id, ImagePath, GetImages);
|
||||
return RetVal.Result;
|
||||
Screenshot? RetVal = Metadata.GetMetadata<Screenshot>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Screenshot> _GetScreenshot(long searchValue, string ImagePath, bool GetImages = true)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Screenshot", searchValue);
|
||||
|
||||
Screenshot returnValue = new Screenshot();
|
||||
bool forceImageDownload = false;
|
||||
ImagePath = Path.Combine(ImagePath, "Screenshots");
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue, ImagePath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
|
||||
// check if old value is different from the new value - only download if it's different
|
||||
Screenshot oldImage = Storage.GetCacheValue<Screenshot>(returnValue, "id", (long)searchValue);
|
||||
if (oldImage.ImageId != returnValue.ImageId)
|
||||
{
|
||||
forceImageDownload = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
returnValue = Storage.GetCacheValue<Screenshot>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Screenshot>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if (GetImages == true)
|
||||
{
|
||||
if (forceImageDownload == true)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata: " + returnValue.GetType().Name, "Screenshot download forced.");
|
||||
|
||||
Communications comms = new Communications();
|
||||
comms.GetSpecificImageFromServer(ImagePath, returnValue.ImageId, Communications.IGDBAPI_ImageSize.original, null);
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<Screenshot> GetObjectFromServer(long searchValue, string ImagePath)
|
||||
{
|
||||
// get Screenshot metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Screenshot>(Communications.MetadataEndpoint.Screenshot, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -9,23 +9,79 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Storage
|
||||
{
|
||||
/// <summary>
|
||||
/// Cache status of a record
|
||||
/// </summary>
|
||||
public enum CacheStatus
|
||||
{
|
||||
/// <summary>
|
||||
/// The record is not present in the database
|
||||
/// </summary>
|
||||
NotPresent,
|
||||
|
||||
/// <summary>
|
||||
/// The record is present in the database and is current
|
||||
/// </summary>
|
||||
Current,
|
||||
|
||||
/// <summary>
|
||||
/// The record is present in the database but is expired
|
||||
/// </summary>
|
||||
Expired
|
||||
}
|
||||
|
||||
public static CacheStatus GetCacheStatus(string Endpoint, string Slug)
|
||||
/// <summary>
|
||||
/// Get the cache status of a record in the database
|
||||
/// </summary>
|
||||
/// <param name="SourceType">
|
||||
/// The source of the metadata (IGDB, RAWG, etc.)
|
||||
/// </param>
|
||||
/// <param name="Endpoint">
|
||||
/// The endpoint of the metadata (games, companies, etc.)
|
||||
/// </param>
|
||||
/// <param name="Slug">
|
||||
/// The slug of the metadata record
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The cache status of the record
|
||||
/// </returns>
|
||||
public static CacheStatus GetCacheStatus(HasheousClient.Models.MetadataModel.MetadataSources SourceType, string Endpoint, string Slug)
|
||||
{
|
||||
return _GetCacheStatus(Endpoint, "slug", Slug);
|
||||
return _GetCacheStatus(SourceType, Endpoint, "slug", Slug);
|
||||
}
|
||||
|
||||
public static CacheStatus GetCacheStatus(string Endpoint, long Id)
|
||||
/// <summary>
|
||||
/// Get the cache status of a record in the database
|
||||
/// </summary>
|
||||
/// <param name="SourceType">
|
||||
/// The source of the metadata (IGDB, RAWG, etc.)
|
||||
/// </param>
|
||||
/// <param name="Endpoint">
|
||||
/// The endpoint of the metadata (games, companies, etc.)
|
||||
/// </param>
|
||||
/// <param name="Id">
|
||||
/// The ID of the metadata record
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The cache status of the record
|
||||
/// </returns>
|
||||
public static CacheStatus GetCacheStatus(HasheousClient.Models.MetadataModel.MetadataSources SourceType, string Endpoint, long Id)
|
||||
{
|
||||
return _GetCacheStatus(Endpoint, "id", Id);
|
||||
return _GetCacheStatus(SourceType, Endpoint, "id", Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the cache status of a record in the database
|
||||
/// </summary>
|
||||
/// <param name="Row">
|
||||
/// The DataRow object to check
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The cache status of the record
|
||||
/// </returns>
|
||||
/// <exception cref="Exception">
|
||||
/// Thrown when the DataRow object does not contain a "lastUpdated" column
|
||||
/// </exception>
|
||||
public static CacheStatus GetCacheStatus(DataRow Row)
|
||||
{
|
||||
if (Row.Table.Columns.Contains("lastUpdated"))
|
||||
@@ -46,13 +102,14 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
}
|
||||
|
||||
private static CacheStatus _GetCacheStatus(string Endpoint, string SearchField, object SearchValue)
|
||||
private static CacheStatus _GetCacheStatus(HasheousClient.Models.MetadataModel.MetadataSources SourceType, string Endpoint, string SearchField, object SearchValue)
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
string sql = "SELECT lastUpdated FROM " + Endpoint + " WHERE " + SearchField + " = @" + SearchField;
|
||||
string sql = "SELECT lastUpdated FROM " + Endpoint + " WHERE SourceId = @SourceType AND " + SearchField + " = @" + SearchField;
|
||||
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("SourceType", SourceType);
|
||||
dbDict.Add("Endpoint", Endpoint);
|
||||
dbDict.Add(SearchField, SearchValue);
|
||||
|
||||
@@ -76,16 +133,41 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
}
|
||||
|
||||
public static void NewCacheValue(object ObjectToCache, bool UpdateRecord = false)
|
||||
/// <summary>
|
||||
/// Add a new record to the cache
|
||||
/// </summary>
|
||||
/// <param name="SourceType">
|
||||
/// The source of the metadata (IGDB, RAWG, etc.)
|
||||
/// </param>
|
||||
/// <param name="ObjectToCache">
|
||||
/// The object to cache
|
||||
/// </param>
|
||||
/// <param name="UpdateRecord">
|
||||
/// Whether to update the record if it already exists
|
||||
/// </param>
|
||||
public static void NewCacheValue<T>(HasheousClient.Models.MetadataModel.MetadataSources SourceType, T ObjectToCache, bool UpdateRecord = false)
|
||||
{
|
||||
// get the object type name
|
||||
string ObjectTypeName = ObjectToCache.GetType().Name;
|
||||
|
||||
// build dictionary
|
||||
string objectJson = Newtonsoft.Json.JsonConvert.SerializeObject(ObjectToCache);
|
||||
Dictionary<string, object?> objectDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object?>>(objectJson);
|
||||
objectDict.Add("dateAdded", DateTime.UtcNow);
|
||||
objectDict.Add("lastUpdated", DateTime.UtcNow);
|
||||
Dictionary<string, object?> objectDict = new Dictionary<string, object?>
|
||||
{
|
||||
{ "SourceId", SourceType },
|
||||
{ "dateAdded", DateTime.UtcNow },
|
||||
{ "lastUpdated", DateTime.UtcNow }
|
||||
};
|
||||
foreach (PropertyInfo property in ObjectToCache.GetType().GetProperties())
|
||||
{
|
||||
if (property.GetCustomAttribute<Models.NoDatabaseAttribute>() == null)
|
||||
{
|
||||
object? propertyValue = property.GetValue(ObjectToCache);
|
||||
if (propertyValue != null)
|
||||
{
|
||||
objectDict.Add(property.Name, propertyValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// generate sql
|
||||
string fieldList = "";
|
||||
@@ -135,6 +217,12 @@ namespace gaseous_server.Classes.Metadata
|
||||
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(newDict["Ids"]);
|
||||
objectDict[key.Key] = newObjectValue;
|
||||
|
||||
StoreRelations(ObjectTypeName, key.Key, (long)objectDict["Id"], newObjectValue);
|
||||
break;
|
||||
case "list":
|
||||
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(objectValue);
|
||||
objectDict[key.Key] = newObjectValue;
|
||||
|
||||
StoreRelations(ObjectTypeName, key.Key, (long)objectDict["Id"], newObjectValue);
|
||||
|
||||
break;
|
||||
@@ -163,15 +251,40 @@ namespace gaseous_server.Classes.Metadata
|
||||
db.ExecuteCMD(sql, objectDict);
|
||||
}
|
||||
|
||||
public static T GetCacheValue<T>(T EndpointType, string SearchField, object SearchValue)
|
||||
/// <summary>
|
||||
/// Get a record from the cache
|
||||
/// </summary>
|
||||
/// <typeparam name="T">
|
||||
/// The type of the object to return
|
||||
/// </typeparam>
|
||||
/// <param name="SourceType">
|
||||
/// The source of the metadata (IGDB, RAWG, etc.)
|
||||
/// </param>
|
||||
/// <param name="EndpointType">
|
||||
/// The type of the endpoint (games, companies, etc.)
|
||||
/// </param>
|
||||
/// <param name="SearchField">
|
||||
/// The field to search for the record by
|
||||
/// </param>
|
||||
/// <param name="SearchValue">
|
||||
/// The value to search for
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The object from the cache
|
||||
/// </returns>
|
||||
/// <exception cref="Exception">
|
||||
/// Thrown when no record is found that matches the search criteria
|
||||
/// </exception>
|
||||
public static T GetCacheValue<T>(HasheousClient.Models.MetadataModel.MetadataSources SourceType, T? EndpointType, string SearchField, object SearchValue)
|
||||
{
|
||||
string Endpoint = EndpointType.GetType().Name;
|
||||
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
string sql = "SELECT * FROM " + Endpoint + " WHERE " + SearchField + " = @" + SearchField;
|
||||
string sql = "SELECT * FROM " + Endpoint + " WHERE SourceId = @SourceType AND " + SearchField + " = @" + SearchField;
|
||||
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("SourceType", SourceType);
|
||||
dbDict.Add("Endpoint", Endpoint);
|
||||
dbDict.Add(SearchField, SearchValue);
|
||||
|
||||
@@ -192,202 +305,63 @@ namespace gaseous_server.Classes.Metadata
|
||||
|
||||
public static T BuildCacheObject<T>(T EndpointType, DataRow dataRow)
|
||||
{
|
||||
// copy the DataRow to EndpointType
|
||||
foreach (PropertyInfo property in EndpointType.GetType().GetProperties())
|
||||
{
|
||||
if (dataRow.Table.Columns.Contains(property.Name))
|
||||
if (property.GetCustomAttribute<Models.NoDatabaseAttribute>() == null)
|
||||
{
|
||||
if (dataRow[property.Name] != DBNull.Value)
|
||||
// get the value from the DataRow with the same name as the property
|
||||
object? value = dataRow[property.Name];
|
||||
|
||||
if (value != null && value != DBNull.Value)
|
||||
{
|
||||
string objectTypeName = property.PropertyType.Name.ToLower().Split("`")[0];
|
||||
string subObjectTypeName = "";
|
||||
object? objectToStore = null;
|
||||
if (objectTypeName == "nullable")
|
||||
// check the property type - if it's a list or array, deserialize it. Otherwise, just set the value
|
||||
Type objectType = EndpointType.GetType();
|
||||
if (objectType != null)
|
||||
{
|
||||
objectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[System.", "").Replace("]", "").ToLower();
|
||||
}
|
||||
try
|
||||
{
|
||||
switch (objectTypeName)
|
||||
// fullname = System.Nullable`1[[System.DateTimeOffset,
|
||||
string propertyTypeName = property.PropertyType.FullName.Split(",")[0];
|
||||
bool isNullable = false;
|
||||
if (propertyTypeName.StartsWith("System.Nullable"))
|
||||
{
|
||||
//case "boolean":
|
||||
// Boolean storedBool = Convert.ToBoolean((int)dataRow[property.Name]);
|
||||
// property.SetValue(EndpointType, storedBool);
|
||||
// break;
|
||||
case "datetimeoffset":
|
||||
DateTimeOffset? storedDate = (DateTime?)dataRow[property.Name];
|
||||
property.SetValue(EndpointType, storedDate);
|
||||
break;
|
||||
//case "nullable":
|
||||
// Console.WriteLine("Nullable: " + property.PropertyType.UnderlyingSystemType);
|
||||
// break;
|
||||
case "identityorvalue":
|
||||
subObjectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[IGDB.Models.", "").Replace("]", "").ToLower();
|
||||
isNullable = true;
|
||||
propertyTypeName = propertyTypeName.Split("[[")[1];
|
||||
}
|
||||
propertyTypeName = propertyTypeName.Split("`")[0];
|
||||
|
||||
switch (subObjectTypeName)
|
||||
{
|
||||
case "collection":
|
||||
objectToStore = new IdentityOrValue<Collection>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "company":
|
||||
objectToStore = new IdentityOrValue<Company>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "cover":
|
||||
objectToStore = new IdentityOrValue<Cover>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "franchise":
|
||||
objectToStore = new IdentityOrValue<Franchise>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "game":
|
||||
objectToStore = new IdentityOrValue<Game>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "platformfamily":
|
||||
objectToStore = new IdentityOrValue<PlatformFamily>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "platformlogo":
|
||||
objectToStore = new IdentityOrValue<PlatformLogo>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "platformversioncompany":
|
||||
objectToStore = new IdentityOrValue<PlatformVersionCompany>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
}
|
||||
switch (propertyTypeName.ToLower())
|
||||
{
|
||||
case "system.collections.generic.list":
|
||||
var listArray = Newtonsoft.Json.JsonConvert.DeserializeObject<List<object>>(value.ToString());
|
||||
property.SetValue(EndpointType, listArray);
|
||||
break;
|
||||
|
||||
if (objectToStore != null)
|
||||
{
|
||||
property.SetValue(EndpointType, objectToStore);
|
||||
}
|
||||
case "system.int32[]":
|
||||
var int32array = Newtonsoft.Json.JsonConvert.DeserializeObject<int[]>(value.ToString());
|
||||
property.SetValue(EndpointType, int32array);
|
||||
break;
|
||||
|
||||
case "system.datetimeoffset":
|
||||
property.SetValue(EndpointType, (DateTimeOffset)(DateTime?)value);
|
||||
break;
|
||||
case "identitiesorvalues":
|
||||
subObjectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[IGDB.Models.", "").Replace("]", "").ToLower();
|
||||
|
||||
long[] fromJsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<long[]>((string)dataRow[property.Name]);
|
||||
|
||||
switch (subObjectTypeName)
|
||||
{
|
||||
case "agerating":
|
||||
objectToStore = new IdentitiesOrValues<AgeRating>(ids: fromJsonObject);
|
||||
break;
|
||||
case "alternativename":
|
||||
objectToStore = new IdentitiesOrValues<AlternativeName>(ids: fromJsonObject);
|
||||
break;
|
||||
case "artwork":
|
||||
objectToStore = new IdentitiesOrValues<Artwork>(ids: fromJsonObject);
|
||||
break;
|
||||
case "ageratingcontentdescription":
|
||||
objectToStore = new IdentitiesOrValues<AgeRatingContentDescription>(ids: fromJsonObject);
|
||||
break;
|
||||
case "game":
|
||||
objectToStore = new IdentitiesOrValues<Game>(ids: fromJsonObject);
|
||||
break;
|
||||
case "externalgame":
|
||||
objectToStore = new IdentitiesOrValues<ExternalGame>(ids: fromJsonObject);
|
||||
break;
|
||||
case "franchise":
|
||||
objectToStore = new IdentitiesOrValues<Franchise>(ids: fromJsonObject);
|
||||
break;
|
||||
case "gameengine":
|
||||
objectToStore = new IdentitiesOrValues<GameEngine>(ids: fromJsonObject);
|
||||
break;
|
||||
case "gamemode":
|
||||
objectToStore = new IdentitiesOrValues<GameMode>(ids: fromJsonObject);
|
||||
break;
|
||||
case "gamevideo":
|
||||
objectToStore = new IdentitiesOrValues<GameVideo>(ids: fromJsonObject);
|
||||
break;
|
||||
case "genre":
|
||||
objectToStore = new IdentitiesOrValues<Genre>(ids: fromJsonObject);
|
||||
break;
|
||||
case "involvedcompany":
|
||||
objectToStore = new IdentitiesOrValues<InvolvedCompany>(ids: fromJsonObject);
|
||||
break;
|
||||
case "multiplayermode":
|
||||
objectToStore = new IdentitiesOrValues<MultiplayerMode>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platform":
|
||||
objectToStore = new IdentitiesOrValues<Platform>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformversion":
|
||||
objectToStore = new IdentitiesOrValues<PlatformVersion>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformwebsite":
|
||||
objectToStore = new IdentitiesOrValues<PlatformWebsite>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformversioncompany":
|
||||
objectToStore = new IdentitiesOrValues<PlatformVersionCompany>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformversionreleasedate":
|
||||
objectToStore = new IdentitiesOrValues<PlatformVersionReleaseDate>(ids: fromJsonObject);
|
||||
break;
|
||||
case "playerperspective":
|
||||
objectToStore = new IdentitiesOrValues<PlayerPerspective>(ids: fromJsonObject);
|
||||
break;
|
||||
case "releasedate":
|
||||
objectToStore = new IdentitiesOrValues<ReleaseDate>(ids: fromJsonObject);
|
||||
break;
|
||||
case "screenshot":
|
||||
objectToStore = new IdentitiesOrValues<Screenshot>(ids: fromJsonObject);
|
||||
break;
|
||||
case "theme":
|
||||
objectToStore = new IdentitiesOrValues<Theme>(ids: fromJsonObject);
|
||||
break;
|
||||
case "website":
|
||||
objectToStore = new IdentitiesOrValues<Website>(ids: fromJsonObject);
|
||||
break;
|
||||
}
|
||||
|
||||
if (objectToStore != null)
|
||||
{
|
||||
property.SetValue(EndpointType, objectToStore);
|
||||
}
|
||||
|
||||
break;
|
||||
case "int32[]":
|
||||
Int32[] fromJsonObject_int32Array = Newtonsoft.Json.JsonConvert.DeserializeObject<Int32[]>((string)dataRow[property.Name]);
|
||||
if (fromJsonObject_int32Array != null)
|
||||
{
|
||||
property.SetValue(EndpointType, fromJsonObject_int32Array);
|
||||
}
|
||||
break;
|
||||
case "[igdb.models.category":
|
||||
property.SetValue(EndpointType, (Category)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.gamestatus":
|
||||
property.SetValue(EndpointType, (GameStatus)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.ageratingcategory":
|
||||
property.SetValue(EndpointType, (AgeRatingCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.ageratingcontentdescriptioncategory":
|
||||
property.SetValue(EndpointType, (AgeRatingContentDescriptionCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.ageratingtitle":
|
||||
property.SetValue(EndpointType, (AgeRatingTitle)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.externalcategory":
|
||||
property.SetValue(EndpointType, (ExternalCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.startdatecategory":
|
||||
property.SetValue(EndpointType, (StartDateCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.releasedateregion":
|
||||
property.SetValue(EndpointType, (ReleaseDateRegion)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.releasedatecategory":
|
||||
property.SetValue(EndpointType, (ReleaseDateCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[gaseous_server.classes.metadata.agegroups+agerestrictiongroupings":
|
||||
property.SetValue(EndpointType, (AgeGroups.AgeRestrictionGroupings)dataRow[property.Name]);
|
||||
break;
|
||||
default:
|
||||
property.SetValue(EndpointType, dataRow[property.Name]);
|
||||
// check if property is an enum
|
||||
if (property.PropertyType.IsEnum)
|
||||
{
|
||||
property.SetValue(EndpointType, Enum.Parse(property.PropertyType, value.ToString()));
|
||||
}
|
||||
else if (Common.IsNullableEnum(property.PropertyType))
|
||||
{
|
||||
property.SetValue(EndpointType, Enum.Parse(Nullable.GetUnderlyingType(property.PropertyType), value.ToString()));
|
||||
}
|
||||
else
|
||||
{
|
||||
property.SetValue(EndpointType, value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Error occurred in column " + property.Name);
|
||||
Console.WriteLine(ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
@@ -13,7 +12,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
}
|
||||
|
||||
public static Theme? GetGame_Themes(long? Id)
|
||||
public static Theme? GetGame_Themes(HasheousClient.Models.MetadataModel.MetadataSources SourceType, long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
@@ -21,56 +20,10 @@ namespace gaseous_server.Classes.Metadata
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Theme> RetVal = _GetGame_Themes((long)Id);
|
||||
return RetVal.Result;
|
||||
Theme? RetVal = Metadata.GetMetadata<Theme>(SourceType, (long)Id, false);
|
||||
return RetVal;
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<Theme> _GetGame_Themes(long searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = Storage.GetCacheStatus("Theme", searchValue);
|
||||
|
||||
Theme returnValue = new Theme();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
try
|
||||
{
|
||||
returnValue = await GetObjectFromServer(searchValue);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
return returnValue;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. Id: " + searchValue, ex);
|
||||
return Storage.GetCacheValue<Theme>(returnValue, "id", (long)searchValue);
|
||||
}
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Theme>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static async Task<Theme> GetObjectFromServer(long searchValue)
|
||||
{
|
||||
// get Game_Themes metadata
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Theme>(Communications.MetadataEndpoint.Theme, searchValue);
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Models;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
@@ -8,10 +9,10 @@ namespace gaseous_server.Classes
|
||||
{
|
||||
public void RefreshMetadata(bool forceRefresh = false)
|
||||
{
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "";
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "";
|
||||
DataTable dt = new DataTable();
|
||||
|
||||
|
||||
// disabling forceRefresh
|
||||
forceRefresh = false;
|
||||
|
||||
@@ -27,7 +28,7 @@ namespace gaseous_server.Classes
|
||||
try
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata Refresh", "(" + StatusCounter + "/" + dt.Rows.Count + "): Refreshing metadata for platform " + dr["name"] + " (" + dr["id"] + ")");
|
||||
Metadata.Platforms.GetPlatform((long)dr["id"], true);
|
||||
Metadata.Platforms.GetPlatform((long)dr["id"]);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -59,7 +60,7 @@ namespace gaseous_server.Classes
|
||||
try
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata Refresh", "(" + StatusCounter + "/" + dt.Rows.Count + "): Refreshing metadata for game " + dr["name"] + " (" + dr["id"] + ")");
|
||||
Metadata.Games.GetGame((long)dr["id"], true, false, true);
|
||||
Metadata.Games.GetGame(Communications.MetadataSource, (long)dr["id"]);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -69,7 +70,7 @@ namespace gaseous_server.Classes
|
||||
StatusCounter += 1;
|
||||
}
|
||||
ClearStatus();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,12 +2,12 @@ using System;
|
||||
using System.Data;
|
||||
using gaseous_signature_parser.models.RomSignatureObject;
|
||||
using Microsoft.VisualBasic;
|
||||
using IGDB.Models;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using System.IO.Compression;
|
||||
using SharpCompress.Archives;
|
||||
using SharpCompress.Common;
|
||||
using gaseous_server.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
@@ -296,8 +296,8 @@ namespace gaseous_server.Classes
|
||||
GameRomMediaGroupItem mediaGroupItem = GetMediaGroup(Id);
|
||||
if (mediaGroupItem.Status == GameRomMediaGroupItem.GroupBuildStatus.WaitingForBuild)
|
||||
{
|
||||
Game GameObject = Games.GetGame(mediaGroupItem.GameId, false, false, false);
|
||||
Platform PlatformObject = Platforms.GetPlatform(mediaGroupItem.PlatformId, false);
|
||||
Models.Game GameObject = Games.GetGame(Communications.MetadataSource, mediaGroupItem.GameId);
|
||||
Platform PlatformObject = Platforms.GetPlatform(mediaGroupItem.PlatformId);
|
||||
PlatformMapping.PlatformMapItem platformMapItem = PlatformMapping.GetPlatformMap(mediaGroupItem.PlatformId);
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Media Group", "Beginning build of media group: " + GameObject.Name + " for platform " + PlatformObject.Name);
|
||||
@@ -557,7 +557,7 @@ namespace gaseous_server.Classes
|
||||
{
|
||||
try
|
||||
{
|
||||
return Platforms.GetPlatform(PlatformId, false).Name;
|
||||
return Platforms.GetPlatform(PlatformId).Name;
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
@@ -3,7 +3,6 @@ using System.Data;
|
||||
using gaseous_signature_parser.models.RomSignatureObject;
|
||||
using static gaseous_server.Classes.RomMediaGroup;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using IGDB.Models;
|
||||
using static HasheousClient.Models.FixMatchModel;
|
||||
using NuGet.Protocol.Core.Types;
|
||||
using static gaseous_server.Classes.FileSignature;
|
||||
@@ -154,10 +153,10 @@ namespace gaseous_server.Classes
|
||||
public static GameRomItem UpdateRom(long RomId, long PlatformId, long GameId)
|
||||
{
|
||||
// ensure metadata for platformid is present
|
||||
IGDB.Models.Platform platform = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
HasheousClient.Models.Metadata.IGDB.Platform platform = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
// ensure metadata for gameid is present
|
||||
IGDB.Models.Game game = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid WHERE Id = @id";
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System.Data;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
@@ -62,8 +61,8 @@ namespace gaseous_server.Classes
|
||||
{
|
||||
NowPlaying = new Models.UserProfile.NowPlayingItem
|
||||
{
|
||||
Game = Games.GetGame((long)nowPlayingData.Rows[0]["GameId"], false, false, false),
|
||||
Platform = Platforms.GetPlatform((long)nowPlayingData.Rows[0]["PlatformId"], false, false),
|
||||
Game = Games.GetGame(Communications.MetadataSource, (long)nowPlayingData.Rows[0]["GameId"]),
|
||||
Platform = Platforms.GetPlatform((long)nowPlayingData.Rows[0]["PlatformId"]),
|
||||
Duration = Convert.ToInt64(nowPlayingData.Rows[0]["SessionLength"])
|
||||
};
|
||||
}
|
||||
|
@@ -10,8 +10,8 @@ using Asp.Versioning;
|
||||
using Authentication;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using gaseous_server.Models;
|
||||
using IGDB.Models;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
|
@@ -10,7 +10,6 @@ using Authentication;
|
||||
using gaseous_server.Classes;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Models;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
@@ -19,6 +18,7 @@ using Microsoft.CodeAnalysis.Scripting;
|
||||
using static gaseous_server.Classes.Metadata.AgeRatings;
|
||||
using Asp.Versioning;
|
||||
using static gaseous_server.Models.PlatformMapping;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
@@ -43,7 +43,7 @@ namespace gaseous_server.Controllers
|
||||
|
||||
[MapToApiVersion("1.0")]
|
||||
[HttpGet]
|
||||
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(typeof(List<gaseous_server.Models.Game>), StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult> Game(
|
||||
string name = "",
|
||||
string platform = "",
|
||||
@@ -59,7 +59,7 @@ namespace gaseous_server.Controllers
|
||||
return Ok(GetGames(name, platform, genre, gamemode, playerperspective, theme, minrating, maxrating, "Adult", true, true, sortdescending));
|
||||
}
|
||||
|
||||
public static List<Game> GetGames(
|
||||
public static List<gaseous_server.Models.Game> GetGames(
|
||||
string name = "",
|
||||
string platform = "",
|
||||
string genre = "",
|
||||
@@ -283,7 +283,7 @@ namespace gaseous_server.Controllers
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT DISTINCT view_Games_Roms.GameId AS ROMGameId, Game.*, case when Game.`Name` like 'The %' then CONCAT(trim(substr(Game.`Name` from 4)), ', The') else Game.`Name` end as NameThe FROM view_Games_Roms LEFT JOIN Game ON Game.Id = view_Games_Roms.GameId LEFT JOIN Relation_Game_Genres ON Game.Id = Relation_Game_Genres.GameId LEFT JOIN Relation_Game_GameModes ON Game.Id = Relation_Game_GameModes.GameId LEFT JOIN Relation_Game_PlayerPerspectives ON Game.Id = Relation_Game_PlayerPerspectives.GameId LEFT JOIN Relation_Game_Themes ON Game.Id = Relation_Game_Themes.GameId LEFT JOIN (SELECT Relation_Game_AgeRatings.GameId, AgeRating.* FROM Relation_Game_AgeRatings JOIN AgeRating ON Relation_Game_AgeRatings.AgeRatingsId = AgeRating.Id) view_AgeRatings ON Game.Id = view_AgeRatings.GameId " + whereClause + " " + havingClause + " " + orderByClause;
|
||||
|
||||
List<IGDB.Models.Game> RetVal = new List<IGDB.Models.Game>();
|
||||
List<gaseous_server.Models.Game> RetVal = new List<gaseous_server.Models.Game>();
|
||||
|
||||
DataTable dbResponse = db.ExecuteCMD(sql, whereParams);
|
||||
foreach (DataRow dr in dbResponse.Rows)
|
||||
@@ -299,14 +299,14 @@ namespace gaseous_server.Controllers
|
||||
[MapToApiVersion("1.1")]
|
||||
[HttpGet]
|
||||
[Route("{GameId}")]
|
||||
[ProducesResponseType(typeof(Game), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(typeof(gaseous_server.Models.Game), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "5Minute")]
|
||||
public async Task<ActionResult> Game(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game game = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (game != null)
|
||||
{
|
||||
@@ -334,14 +334,14 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (gameObject.AlternativeNames != null)
|
||||
if (game.AlternativeNames != null)
|
||||
{
|
||||
List<AlternativeName> altNames = new List<AlternativeName>();
|
||||
foreach (long altNameId in gameObject.AlternativeNames.Ids)
|
||||
foreach (long altNameId in game.AlternativeNames)
|
||||
{
|
||||
altNames.Add(AlternativeNames.GetAlternativeNames(altNameId));
|
||||
altNames.Add(AlternativeNames.GetAlternativeNames(game.MetadataSource, altNameId));
|
||||
}
|
||||
return Ok(altNames);
|
||||
}
|
||||
@@ -367,14 +367,14 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (gameObject.AgeRatings != null)
|
||||
if (game.AgeRatings != null)
|
||||
{
|
||||
List<AgeRatings.GameAgeRating> ageRatings = new List<AgeRatings.GameAgeRating>();
|
||||
foreach (long ageRatingId in gameObject.AgeRatings.Ids)
|
||||
foreach (long ageRatingId in game.AgeRatings)
|
||||
{
|
||||
ageRatings.Add(AgeRatings.GetConsolidatedAgeRating(ageRatingId));
|
||||
ageRatings.Add(AgeRatings.GetConsolidatedAgeRating(game.MetadataSource, ageRatingId));
|
||||
}
|
||||
return Ok(ageRatings);
|
||||
}
|
||||
@@ -400,14 +400,14 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
List<Artwork> artworks = new List<Artwork>();
|
||||
if (gameObject.Artworks != null)
|
||||
if (game.Artworks != null)
|
||||
{
|
||||
foreach (long ArtworkId in gameObject.Artworks.Ids)
|
||||
foreach (long ArtworkId in game.Artworks)
|
||||
{
|
||||
Artwork GameArtwork = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
||||
Artwork GameArtwork = Artworks.GetArtwork(game.MetadataSource, ArtworkId);
|
||||
artworks.Add(GameArtwork);
|
||||
}
|
||||
}
|
||||
@@ -431,11 +431,11 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
try
|
||||
{
|
||||
IGDB.Models.Artwork artworkObject = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
||||
Artwork artworkObject = Artworks.GetArtwork(game.MetadataSource, ArtworkId);
|
||||
if (artworkObject != null)
|
||||
{
|
||||
return Ok(artworkObject);
|
||||
@@ -467,10 +467,10 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
if (gameObject != null)
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
if (game != null)
|
||||
{
|
||||
IGDB.Models.Cover coverObject = Covers.GetCover(gameObject.Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
||||
Cover coverObject = Covers.GetCover(game.MetadataSource, (long?)game.Cover);
|
||||
if (coverObject != null)
|
||||
{
|
||||
return Ok(coverObject);
|
||||
@@ -502,7 +502,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
string? imageId = null;
|
||||
string? imageTypePath = null;
|
||||
@@ -510,14 +510,11 @@ namespace gaseous_server.Controllers
|
||||
switch (imageType)
|
||||
{
|
||||
case MetadataImageType.cover:
|
||||
if (gameObject.Cover != null)
|
||||
if (game.Cover != null)
|
||||
{
|
||||
if (gameObject.Cover.Id != null)
|
||||
{
|
||||
IGDB.Models.Cover cover = Classes.Metadata.Covers.GetCover(gameObject.Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
||||
imageId = cover.ImageId;
|
||||
imageTypePath = "Covers";
|
||||
}
|
||||
Cover cover = Classes.Metadata.Covers.GetCover(game.MetadataSource, (long?)game.Cover);
|
||||
imageId = cover.ImageId;
|
||||
imageTypePath = "Covers";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -526,11 +523,11 @@ namespace gaseous_server.Controllers
|
||||
break;
|
||||
|
||||
case MetadataImageType.screenshots:
|
||||
if (gameObject.Screenshots != null)
|
||||
if (game.Screenshots != null)
|
||||
{
|
||||
if (gameObject.Screenshots.Ids.Contains(ImageId))
|
||||
if (game.Screenshots.Contains(ImageId))
|
||||
{
|
||||
IGDB.Models.Screenshot imageObject = Screenshots.GetScreenshot(ImageId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), true);
|
||||
Screenshot imageObject = Screenshots.GetScreenshot(game.MetadataSource, ImageId);
|
||||
|
||||
imageId = imageObject.ImageId;
|
||||
imageTypePath = "Screenshots";
|
||||
@@ -543,11 +540,11 @@ namespace gaseous_server.Controllers
|
||||
break;
|
||||
|
||||
case MetadataImageType.artwork:
|
||||
if (gameObject.Artworks != null)
|
||||
if (game.Artworks != null)
|
||||
{
|
||||
if (gameObject.Artworks.Ids.Contains(ImageId))
|
||||
if (game.Artworks.Contains(ImageId))
|
||||
{
|
||||
IGDB.Models.Artwork imageObject = Artworks.GetArtwork(ImageId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), true);
|
||||
Artwork imageObject = Artworks.GetArtwork(game.MetadataSource, ImageId);
|
||||
|
||||
imageId = imageObject.ImageId;
|
||||
imageTypePath = "Artwork";
|
||||
@@ -568,13 +565,13 @@ namespace gaseous_server.Controllers
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), imageTypePath);
|
||||
string imagePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), imageTypePath, size.ToString(), imageId + ".jpg");
|
||||
string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(game), imageTypePath);
|
||||
string imagePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(game), imageTypePath, size.ToString(), imageId + ".jpg");
|
||||
|
||||
if (!System.IO.File.Exists(imagePath))
|
||||
{
|
||||
Communications comms = new Communications();
|
||||
Task<string> ImgFetch = comms.GetSpecificImageFromServer(Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), imageTypePath), imageId, size, new List<Communications.IGDBAPI_ImageSize> { Communications.IGDBAPI_ImageSize.cover_big, Communications.IGDBAPI_ImageSize.original });
|
||||
Task<string> ImgFetch = comms.GetSpecificImageFromServer(Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(game), imageTypePath), imageId, size, new List<Communications.IGDBAPI_ImageSize> { Communications.IGDBAPI_ImageSize.cover_big, Communications.IGDBAPI_ImageSize.original });
|
||||
|
||||
imagePath = ImgFetch.Result;
|
||||
}
|
||||
@@ -640,9 +637,9 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (gameObject != null)
|
||||
if (game != null)
|
||||
{
|
||||
var user = await _userManager.GetUserAsync(User);
|
||||
|
||||
@@ -677,9 +674,9 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (gameObject != null)
|
||||
if (game != null)
|
||||
{
|
||||
var user = await _userManager.GetUserAsync(User);
|
||||
|
||||
@@ -715,15 +712,15 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
if (gameObject != null)
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
if (game != null)
|
||||
{
|
||||
List<IGDB.Models.GameMode> gameModeObjects = new List<GameMode>();
|
||||
if (gameObject.GameModes != null)
|
||||
List<GameMode> gameModeObjects = new List<GameMode>();
|
||||
if (game.GameModes != null)
|
||||
{
|
||||
foreach (long gameModeId in gameObject.GameModes.Ids)
|
||||
foreach (long gameModeId in game.GameModes)
|
||||
{
|
||||
gameModeObjects.Add(Classes.Metadata.GameModes.GetGame_Modes(gameModeId));
|
||||
gameModeObjects.Add(Classes.Metadata.GameModes.GetGame_Modes(game.MetadataSource, gameModeId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -751,19 +748,19 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
if (gameObject != null)
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
if (game != null)
|
||||
{
|
||||
List<IGDB.Models.Genre> genreObjects = new List<Genre>();
|
||||
if (gameObject.Genres != null)
|
||||
List<Genre> genreObjects = new List<Genre>();
|
||||
if (game.Genres != null)
|
||||
{
|
||||
foreach (long genreId in gameObject.Genres.Ids)
|
||||
foreach (long genreId in game.Genres)
|
||||
{
|
||||
genreObjects.Add(Classes.Metadata.Genres.GetGenres(genreId));
|
||||
genreObjects.Add(Classes.Metadata.Genres.GetGenres(game.MetadataSource, genreId));
|
||||
}
|
||||
}
|
||||
|
||||
List<IGDB.Models.Genre> sortedGenreObjects = genreObjects.OrderBy(o => o.Name).ToList();
|
||||
List<Genre> sortedGenreObjects = genreObjects.OrderBy(o => o.Name).ToList();
|
||||
|
||||
return Ok(sortedGenreObjects);
|
||||
}
|
||||
@@ -789,16 +786,16 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
if (gameObject != null)
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
if (game != null)
|
||||
{
|
||||
List<Dictionary<string, object>> icObjects = new List<Dictionary<string, object>>();
|
||||
if (gameObject.InvolvedCompanies != null)
|
||||
if (game.InvolvedCompanies != null)
|
||||
{
|
||||
foreach (long icId in gameObject.InvolvedCompanies.Ids)
|
||||
foreach (long icId in game.InvolvedCompanies)
|
||||
{
|
||||
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(icId);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(game.MetadataSource, (long?)involvedCompany.Company);
|
||||
company.Developed = null;
|
||||
company.Published = null;
|
||||
|
||||
@@ -834,14 +831,14 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
if (gameObject != null)
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
if (game != null)
|
||||
{
|
||||
List<Dictionary<string, object>> icObjects = new List<Dictionary<string, object>>();
|
||||
if (gameObject.InvolvedCompanies != null)
|
||||
if (game.InvolvedCompanies != null)
|
||||
{
|
||||
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(CompanyId);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(game.MetadataSource, (long?)involvedCompany.Company);
|
||||
company.Developed = null;
|
||||
company.Published = null;
|
||||
|
||||
@@ -877,10 +874,10 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(CompanyId);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(game.MetadataSource, (long?)involvedCompany.Company);
|
||||
|
||||
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Company(company), "Logo_Medium.png");
|
||||
if (System.IO.File.Exists(coverFilePath))
|
||||
@@ -923,11 +920,11 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (gameObject != null)
|
||||
if (game != null)
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
if (platformObject != null)
|
||||
{
|
||||
@@ -965,11 +962,11 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (gameObject != null)
|
||||
if (game != null)
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
if (platformObject != null)
|
||||
{
|
||||
@@ -1004,11 +1001,11 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (gameObject != null)
|
||||
if (game != null)
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
if (platformObject != null)
|
||||
{
|
||||
@@ -1070,15 +1067,15 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
if (gameObject != null)
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
if (game != null)
|
||||
{
|
||||
List<ReleaseDate> rdObjects = new List<ReleaseDate>();
|
||||
if (gameObject.ReleaseDates != null)
|
||||
if (game.ReleaseDates != null)
|
||||
{
|
||||
foreach (long icId in gameObject.ReleaseDates.Ids)
|
||||
foreach (long icId in game.ReleaseDates)
|
||||
{
|
||||
ReleaseDate releaseDate = Classes.Metadata.ReleaseDates.GetReleaseDates(icId);
|
||||
ReleaseDate releaseDate = Classes.Metadata.ReleaseDates.GetReleaseDates(game.MetadataSource, icId);
|
||||
|
||||
rdObjects.Add(releaseDate);
|
||||
}
|
||||
@@ -1110,7 +1107,7 @@ namespace gaseous_server.Controllers
|
||||
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
return Ok(Classes.Roms.GetRoms(GameId, PlatformId, NameSearch, pageNumber, pageSize, user.Id));
|
||||
}
|
||||
@@ -1131,7 +1128,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId == GameId)
|
||||
@@ -1160,7 +1157,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId == GameId)
|
||||
@@ -1190,7 +1187,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId == GameId)
|
||||
@@ -1221,7 +1218,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
ApplicationUser? user = await _userManager.GetUserAsync(User);
|
||||
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
if (IsMediaGroup == false)
|
||||
{
|
||||
@@ -1283,7 +1280,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId != GameId)
|
||||
@@ -1322,7 +1319,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId != GameId || rom.Name != FileName)
|
||||
@@ -1361,7 +1358,7 @@ namespace gaseous_server.Controllers
|
||||
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.RomMediaGroup.GameRomMediaGroupItem rom = Classes.RomMediaGroup.GetMediaGroup(RomGroupId, user.Id);
|
||||
if (rom.GameId == GameId)
|
||||
@@ -1391,7 +1388,7 @@ namespace gaseous_server.Controllers
|
||||
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -1420,7 +1417,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -1451,7 +1448,7 @@ namespace gaseous_server.Controllers
|
||||
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.RomMediaGroup.GameRomMediaGroupItem rom = Classes.RomMediaGroup.GetMediaGroup(RomGroupId, user.Id);
|
||||
if (rom.GameId == GameId)
|
||||
@@ -1481,7 +1478,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.RomMediaGroup.GameRomMediaGroupItem rom = Classes.RomMediaGroup.GetMediaGroup(RomGroupId);
|
||||
if (rom.GameId == GameId)
|
||||
@@ -1514,7 +1511,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
Classes.RomMediaGroup.GameRomMediaGroupItem rom = Classes.RomMediaGroup.GetMediaGroup(RomGroupId);
|
||||
if (rom.GameId != GameId)
|
||||
@@ -1529,7 +1526,7 @@ namespace gaseous_server.Controllers
|
||||
string returnFileName = "";
|
||||
if (filename == "")
|
||||
{
|
||||
returnFileName = gameObject.Name + ".zip";
|
||||
returnFileName = game.Name + ".zip";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1553,7 +1550,7 @@ namespace gaseous_server.Controllers
|
||||
[MapToApiVersion("1.1")]
|
||||
[HttpGet]
|
||||
[Route("search")]
|
||||
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(typeof(List<gaseous_server.Models.Game>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public async Task<ActionResult> GameSearch(long RomId = 0, string SearchString = "")
|
||||
{
|
||||
@@ -1565,7 +1562,7 @@ namespace gaseous_server.Controllers
|
||||
Common.hashObject hash = new Common.hashObject(romItem.Path);
|
||||
FileSignature fileSignature = new FileSignature();
|
||||
gaseous_server.Models.Signatures_Games romSig = fileSignature.GetFileSignature(romItem.Library, hash, new FileInfo(romItem.Path), romItem.Path);
|
||||
List<Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(romSig.Game.Name, romSig.Flags.IGDBPlatformId);
|
||||
List<gaseous_server.Models.Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(romSig.Game.Name, romSig.Flags.IGDBPlatformId);
|
||||
|
||||
return Ok(searchResults);
|
||||
}
|
||||
@@ -1573,7 +1570,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
if (SearchString.Length > 0)
|
||||
{
|
||||
List<Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(SearchString, 0);
|
||||
List<gaseous_server.Models.Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(SearchString, 0);
|
||||
|
||||
return Ok(searchResults);
|
||||
}
|
||||
@@ -1600,14 +1597,14 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
List<Screenshot> screenshots = new List<Screenshot>();
|
||||
if (gameObject.Screenshots != null)
|
||||
if (game.Screenshots != null)
|
||||
{
|
||||
foreach (long ScreenshotId in gameObject.Screenshots.Ids)
|
||||
foreach (long ScreenshotId in game.Screenshots)
|
||||
{
|
||||
Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
||||
Screenshot GameScreenshot = Screenshots.GetScreenshot(game.MetadataSource, ScreenshotId);
|
||||
screenshots.Add(GameScreenshot);
|
||||
}
|
||||
}
|
||||
@@ -1631,10 +1628,10 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
if (gameObject != null)
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
if (game != null)
|
||||
{
|
||||
IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), false);
|
||||
Screenshot screenshotObject = Screenshots.GetScreenshot(game.MetadataSource, ScreenshotId);
|
||||
if (screenshotObject != null)
|
||||
{
|
||||
return Ok(screenshotObject);
|
||||
@@ -1655,57 +1652,6 @@ namespace gaseous_server.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
// [MapToApiVersion("1.0")]
|
||||
// [MapToApiVersion("1.1")]
|
||||
// [HttpGet]
|
||||
// [Route("{GameId}/screenshots/{ScreenshotId}/image/{size}")]
|
||||
// [Route("{GameId}/screenshots/{ScreenshotId}/image/{size}/{ImageName}")]
|
||||
// [ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
// [ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
// public async Task<ActionResult> GameScreenshotImage(long GameId, long ScreenshotId, Communications.IGDBAPI_ImageSize Size, string ImageName)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
|
||||
// IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), true);
|
||||
|
||||
// string basePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Screenshots");
|
||||
|
||||
// Communications comms = new Communications();
|
||||
// Task<string> ImgFetch = comms.GetSpecificImageFromServer(basePath, screenshotObject.ImageId, Size, new List<Communications.IGDBAPI_ImageSize> { Communications.IGDBAPI_ImageSize.original });
|
||||
|
||||
// string coverFilePath = ImgFetch.Result;
|
||||
|
||||
// if (System.IO.File.Exists(coverFilePath))
|
||||
// {
|
||||
// string filename = screenshotObject.ImageId + ".jpg";
|
||||
// string filepath = coverFilePath;
|
||||
// byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
// string contentType = "image/jpg";
|
||||
|
||||
// var cd = new System.Net.Mime.ContentDisposition
|
||||
// {
|
||||
// FileName = filename,
|
||||
// Inline = true,
|
||||
// };
|
||||
|
||||
// Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
// Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
// return File(filedata, contentType);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// return NotFound();
|
||||
// }
|
||||
// }
|
||||
// catch
|
||||
// {
|
||||
// return NotFound();
|
||||
// }
|
||||
// }
|
||||
|
||||
[MapToApiVersion("1.0")]
|
||||
[MapToApiVersion("1.1")]
|
||||
[HttpGet]
|
||||
@@ -1717,14 +1663,14 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false, false);
|
||||
gaseous_server.Models.Game game = Classes.Metadata.Games.GetGame(Communications.MetadataSource, GameId);
|
||||
|
||||
List<GameVideo> videos = new List<GameVideo>();
|
||||
if (gameObject.Videos != null)
|
||||
if (game.Videos != null)
|
||||
{
|
||||
foreach (long VideoId in gameObject.Videos.Ids)
|
||||
foreach (long VideoId in game.Videos)
|
||||
{
|
||||
GameVideo gameVideo = GamesVideos.GetGame_Videos(VideoId);
|
||||
GameVideo gameVideo = GamesVideos.GetGame_Videos(game.MetadataSource, VideoId);
|
||||
videos.Add(gameVideo);
|
||||
}
|
||||
}
|
||||
|
@@ -8,12 +8,12 @@ using System.Threading.Tasks;
|
||||
using gaseous_server.Classes;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Models;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.CodeAnalysis.Scripting;
|
||||
using Asp.Versioning;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
@@ -60,7 +60,7 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
if (platformObject != null)
|
||||
{
|
||||
@@ -87,10 +87,11 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
if (platformObject != null)
|
||||
{
|
||||
IGDB.Models.PlatformLogo logoObject = PlatformLogos.GetPlatformLogo(platformObject.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platformObject));
|
||||
PlatformLogo logoObjectParent = (PlatformLogo)platformObject.PlatformLogo;
|
||||
PlatformLogo logoObject = PlatformLogos.GetPlatformLogo(logoObjectParent.Id);
|
||||
if (logoObject != null)
|
||||
{
|
||||
return Ok(logoObject);
|
||||
@@ -121,21 +122,22 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
IGDB.Models.PlatformLogo? logoObject = null;
|
||||
Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
PlatformLogo? logoObject = null;
|
||||
try
|
||||
{
|
||||
logoObject = PlatformLogos.GetPlatformLogo(platformObject.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platformObject));
|
||||
|
||||
logoObject = PlatformLogos.GetPlatformLogo((long)platformObject.PlatformLogo);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// getting the logo failed, so we'll try a platform variant if available
|
||||
if (platformObject.Versions != null)
|
||||
{
|
||||
if (platformObject.Versions.Ids.Length > 0)
|
||||
if (platformObject.Versions.Count > 0)
|
||||
{
|
||||
IGDB.Models.PlatformVersion platformVersion = Classes.Metadata.PlatformVersions.GetPlatformVersion(platformObject.Versions.Ids[0], platformObject);
|
||||
logoObject = PlatformLogos.GetPlatformLogo(platformVersion.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platformObject));
|
||||
PlatformVersion platformVersion = Classes.Metadata.PlatformVersions.GetPlatformVersion(Communications.MetadataSource, (long)platformObject.Versions[0]);
|
||||
logoObject = PlatformLogos.GetPlatformLogo((long)platformVersion.PlatformLogo);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@@ -8,13 +8,13 @@ using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_server.Classes;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.CodeAnalysis.Scripting;
|
||||
using static gaseous_server.Classes.Metadata.AgeRatings;
|
||||
using Asp.Versioning;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
@@ -62,7 +62,7 @@ namespace gaseous_server.Controllers
|
||||
}
|
||||
|
||||
// get override platform if specified
|
||||
IGDB.Models.Platform? OverridePlatform = null;
|
||||
Platform? OverridePlatform = null;
|
||||
if (OverridePlatformId != null)
|
||||
{
|
||||
OverridePlatform = Platforms.GetPlatform((long)OverridePlatformId);
|
||||
@@ -76,10 +76,10 @@ namespace gaseous_server.Controllers
|
||||
case "rom":
|
||||
if (RetVal["status"] == "imported")
|
||||
{
|
||||
IGDB.Models.Game? game = (IGDB.Models.Game)RetVal["game"];
|
||||
gaseous_server.Models.Game? game = (gaseous_server.Models.Game)RetVal["game"];
|
||||
if (game.Id == null)
|
||||
{
|
||||
RetVal["game"] = Games.GetGame(0, false, false, false);
|
||||
RetVal["game"] = Games.GetGame(Communications.MetadataSource, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@@ -6,8 +6,7 @@ using System.Threading.Tasks;
|
||||
using gaseous_server.Classes;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Models;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NuGet.Common;
|
||||
@@ -44,7 +43,7 @@ namespace gaseous_server.Controllers
|
||||
List<Platform> platforms = new List<Platform>();
|
||||
foreach (DataRow row in data.Rows)
|
||||
{
|
||||
Platform platform = Platforms.GetPlatform((long)row["Id"], false, false);
|
||||
Platform platform = Platforms.GetPlatform((long)row["Id"]);
|
||||
|
||||
platforms.Add(platform);
|
||||
}
|
||||
@@ -56,14 +55,14 @@ namespace gaseous_server.Controllers
|
||||
[MapToApiVersion("1.1")]
|
||||
[HttpGet]
|
||||
[Route("Game")]
|
||||
[ProducesResponseType(typeof(List<GaseousGame>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(typeof(List<gaseous_server.Models.Game>), StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult> SearchGame(long PlatformId, string SearchString)
|
||||
{
|
||||
List<GaseousGame> RetVal = await _SearchForGame(PlatformId, SearchString);
|
||||
List<gaseous_server.Models.Game> RetVal = await _SearchForGame(PlatformId, SearchString);
|
||||
return Ok(RetVal);
|
||||
}
|
||||
|
||||
private static async Task<List<GaseousGame>> _SearchForGame(long PlatformId, string SearchString)
|
||||
private static async Task<List<gaseous_server.Models.Game>> _SearchForGame(long PlatformId, string SearchString)
|
||||
{
|
||||
switch (Communications.MetadataSource)
|
||||
{
|
||||
@@ -74,35 +73,35 @@ namespace gaseous_server.Controllers
|
||||
searchBody += "where platforms = (" + PlatformId + ");";
|
||||
searchBody += "limit 100;";
|
||||
|
||||
List<GaseousGame>? searchCache = Communications.GetSearchCache<List<GaseousGame>>(searchFields, searchBody);
|
||||
List<gaseous_server.Models.Game>? searchCache = Communications.GetSearchCache<List<gaseous_server.Models.Game>>(searchFields, searchBody);
|
||||
|
||||
if (searchCache == null)
|
||||
{
|
||||
// cache miss
|
||||
// get Game metadata from data source
|
||||
Communications comms = new Communications();
|
||||
var results = await comms.APIComm<Game>(IGDBClient.Endpoints.Games, searchFields, searchBody);
|
||||
var results = await comms.APIComm<gaseous_server.Models.Game>("Game", searchFields, searchBody);
|
||||
|
||||
List<GaseousGame> games = new List<GaseousGame>();
|
||||
foreach (Game game in results.ToList())
|
||||
List<gaseous_server.Models.Game> games = new List<gaseous_server.Models.Game>();
|
||||
foreach (gaseous_server.Models.Game game in results.ToList())
|
||||
{
|
||||
Storage.CacheStatus cacheStatus = Storage.GetCacheStatus("Game", (long)game.Id);
|
||||
Storage.CacheStatus cacheStatus = Storage.GetCacheStatus(Communications.MetadataSource, "Game", (long)game.Id);
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
Storage.NewCacheValue(game, false);
|
||||
Storage.NewCacheValue(Communications.MetadataSource, game, false);
|
||||
break;
|
||||
|
||||
case Storage.CacheStatus.Expired:
|
||||
Storage.NewCacheValue(game, true);
|
||||
Storage.NewCacheValue(Communications.MetadataSource, game, true);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
games.Add(new GaseousGame(game));
|
||||
games.Add(game);
|
||||
}
|
||||
|
||||
Communications.SetSearchCache<List<GaseousGame>>(searchFields, searchBody, games);
|
||||
Communications.SetSearchCache<List<gaseous_server.Models.Game>>(searchFields, searchBody, games);
|
||||
|
||||
return games;
|
||||
}
|
||||
@@ -110,11 +109,14 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
// get full version of results from database
|
||||
// this is a hacky workaround due to the readonly nature of IGDB.Model.Game IdentityOrValue fields
|
||||
List<GaseousGame> gamesToReturn = new List<GaseousGame>();
|
||||
foreach (GaseousGame game in searchCache)
|
||||
List<gaseous_server.Models.Game> gamesToReturn = new List<gaseous_server.Models.Game>();
|
||||
foreach (gaseous_server.Models.Game game in searchCache)
|
||||
{
|
||||
Game tempGame = Games.GetGame((long)game.Id, false, false, false);
|
||||
gamesToReturn.Add(new GaseousGame(tempGame));
|
||||
gaseous_server.Models.Game? tempGame = Games.GetGame(Communications.MetadataSource, (long)game.Id);
|
||||
if (tempGame != null)
|
||||
{
|
||||
gamesToReturn.Add(tempGame);
|
||||
}
|
||||
}
|
||||
|
||||
return gamesToReturn;
|
||||
@@ -123,19 +125,18 @@ namespace gaseous_server.Controllers
|
||||
case HasheousClient.Models.MetadataModel.MetadataSources.Hasheous:
|
||||
HasheousClient.Hasheous hasheous = new HasheousClient.Hasheous();
|
||||
Communications.ConfigureHasheousClient(ref hasheous);
|
||||
List<HasheousClient.Models.Metadata.IGDB.Game> hSearch = hasheous.GetMetadataProxy_SearchGame<HasheousClient.Models.Metadata.IGDB.Game>(HasheousClient.Hasheous.MetadataProvider.IGDB, PlatformId.ToString(), SearchString).ToList<HasheousClient.Models.Metadata.IGDB.Game>();
|
||||
List<gaseous_server.Models.Game> hSearch = hasheous.GetMetadataProxy_SearchGame<gaseous_server.Models.Game>(HasheousClient.Hasheous.MetadataProvider.IGDB, PlatformId.ToString(), SearchString).ToList<gaseous_server.Models.Game>();
|
||||
|
||||
List<GaseousGame> hGamesToReturn = new List<GaseousGame>();
|
||||
foreach (HasheousClient.Models.Metadata.IGDB.Game game in hSearch)
|
||||
List<gaseous_server.Models.Game> hGamesToReturn = new List<gaseous_server.Models.Game>();
|
||||
foreach (gaseous_server.Models.Game game in hSearch)
|
||||
{
|
||||
IGDB.Models.Game tempGame = Communications.ConvertToIGDBModel<IGDB.Models.Game>(game);
|
||||
hGamesToReturn.Add(new GaseousGame(tempGame));
|
||||
hGamesToReturn.Add(game);
|
||||
}
|
||||
|
||||
return hGamesToReturn;
|
||||
|
||||
default:
|
||||
return new List<GaseousGame>();
|
||||
return new List<gaseous_server.Models.Game>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -9,7 +9,6 @@ using System.Threading.Tasks;
|
||||
using Authentication;
|
||||
using gaseous_server.Classes;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
@@ -19,6 +18,7 @@ using Microsoft.CodeAnalysis.Scripting;
|
||||
using static gaseous_server.Classes.Metadata.AgeRatings;
|
||||
using Asp.Versioning;
|
||||
using Humanizer;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
|
||||
namespace gaseous_server.Controllers.v1_1
|
||||
{
|
||||
@@ -117,13 +117,13 @@ namespace gaseous_server.Controllers.v1_1
|
||||
dbDict.Add("id", GameId);
|
||||
dbDict.Add("agegroupid", (int)user.SecurityProfile.AgeRestrictionPolicy.MaximumAgeRestriction);
|
||||
|
||||
List<IGDB.Models.Game> RetVal = new List<IGDB.Models.Game>();
|
||||
List<Models.Game> RetVal = new List<Models.Game>();
|
||||
|
||||
DataTable dbResponse = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
foreach (DataRow dr in dbResponse.Rows)
|
||||
{
|
||||
RetVal.Add(Classes.Metadata.Games.GetGame((long)dr["SimilarGamesId"], false, false, false));
|
||||
RetVal.Add(Classes.Metadata.Games.GetGame(Communications.MetadataSource, (long)dr["SimilarGamesId"]));
|
||||
}
|
||||
|
||||
GameReturnPackage gameReturn = new GameReturnPackage(RetVal.Count, RetVal);
|
||||
@@ -571,7 +571,7 @@ FROM
|
||||
}
|
||||
}
|
||||
|
||||
Game retGame = Storage.BuildCacheObject<Game>(new Game(), dbResponse.Rows[i]);
|
||||
Models.Game retGame = Storage.BuildCacheObject<Models.Game>(new Models.Game(), dbResponse.Rows[i]);
|
||||
Games.MinimalGameItem retMinGame = new Games.MinimalGameItem(retGame);
|
||||
retMinGame.Index = i;
|
||||
if (dbResponse.Rows[i]["RomSaveCount"] != DBNull.Value || dbResponse.Rows[i]["MediaGroupSaveCount"] != DBNull.Value)
|
||||
@@ -654,12 +654,12 @@ FROM
|
||||
|
||||
}
|
||||
|
||||
public GameReturnPackage(int Count, List<Game> Games)
|
||||
public GameReturnPackage(int Count, List<Models.Game> Games)
|
||||
{
|
||||
this.Count = Count;
|
||||
|
||||
List<Games.MinimalGameItem> minimalGames = new List<Games.MinimalGameItem>();
|
||||
foreach (Game game in Games)
|
||||
foreach (Models.Game game in Games)
|
||||
{
|
||||
minimalGames.Add(new Classes.Metadata.Games.MinimalGameItem(game));
|
||||
}
|
||||
|
@@ -270,7 +270,7 @@ namespace gaseous_server.Controllers.v1_1
|
||||
else
|
||||
{
|
||||
RomMediaGroup.GameRomMediaGroupItem mediaGroupItem = RomMediaGroup.GetMediaGroup(RomId);
|
||||
IGDB.Models.Game game = Games.GetGame(mediaGroupItem.GameId, false, false, false);
|
||||
Models.Game game = Games.GetGame(Communications.MetadataSource, mediaGroupItem.GameId);
|
||||
Classes.Common.hashObject hashObject = new Classes.Common.hashObject(Path.Combine(Config.LibraryConfiguration.LibraryMediaGroupDirectory, mediaGroupItem.Id.ToString() + ".zip"));
|
||||
romName = game.Name;
|
||||
romMd5 = hashObject.md5hash;
|
||||
|
@@ -5,50 +5,19 @@ using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
|
||||
namespace gaseous_server.Models
|
||||
{
|
||||
public class GaseousGame : IGDB.Models.Game
|
||||
public class Game : HasheousClient.Models.Metadata.IGDB.Game
|
||||
{
|
||||
public GaseousGame()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public GaseousGame(IGDB.Models.Game game)
|
||||
{
|
||||
var targetType = this.GetType();
|
||||
var sourceType = game.GetType();
|
||||
foreach (var prop in targetType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty))
|
||||
{
|
||||
// check whether source object has the the property
|
||||
var sp = sourceType.GetProperty(prop.Name);
|
||||
if (sp != null)
|
||||
{
|
||||
// if yes, copy the value to the matching property
|
||||
var value = sp.GetValue(game, null);
|
||||
prop.SetValue(this, value, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
[NoDatabase]
|
||||
public bool IsFavourite { get; set; } = false;
|
||||
|
||||
[NoDatabase]
|
||||
public bool HasSavedGame { get; set; } = false;
|
||||
|
||||
public IGDB.Models.Cover? CoverItem
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.Cover != null)
|
||||
{
|
||||
if (this.Cover.Id != null)
|
||||
{
|
||||
// IGDB.Models.Cover cover = Covers.GetCover(Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(this), false);
|
||||
IGDB.Models.Cover cover = new IGDB.Models.Cover()
|
||||
{
|
||||
Id = this.Cover.Id
|
||||
};
|
||||
}
|
||||
}
|
||||
[NoDatabase]
|
||||
public HasheousClient.Models.MetadataModel.MetadataSources MetadataSource { get; set; }
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
internal class NoDatabaseAttribute : Attribute
|
||||
{
|
||||
}
|
||||
}
|
@@ -8,7 +8,7 @@ using System.Web;
|
||||
using gaseous_server.Classes;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_server.Controllers;
|
||||
using IGDB.Models;
|
||||
using HasheousClient.Models.Metadata.IGDB;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace gaseous_server.Models
|
||||
@@ -92,9 +92,9 @@ namespace gaseous_server.Models
|
||||
}
|
||||
}
|
||||
|
||||
private static IGDB.Models.Platform CreateDummyPlatform(PlatformMapItem mapItem)
|
||||
private static Platform CreateDummyPlatform(PlatformMapItem mapItem)
|
||||
{
|
||||
IGDB.Models.Platform platform = new IGDB.Models.Platform
|
||||
Platform platform = new Platform
|
||||
{
|
||||
Id = mapItem.IGDBId,
|
||||
Name = mapItem.IGDBName,
|
||||
@@ -102,9 +102,9 @@ namespace gaseous_server.Models
|
||||
AlternativeName = mapItem.AlternateNames.FirstOrDefault()
|
||||
};
|
||||
|
||||
if (Storage.GetCacheStatus("Platform", mapItem.IGDBId) == Storage.CacheStatus.NotPresent)
|
||||
if (Storage.GetCacheStatus(Communications.MetadataSource, "Platform", mapItem.IGDBId) == Storage.CacheStatus.NotPresent)
|
||||
{
|
||||
Storage.NewCacheValue(platform);
|
||||
Storage.NewCacheValue(Communications.MetadataSource, platform);
|
||||
}
|
||||
|
||||
return platform;
|
||||
@@ -310,15 +310,14 @@ namespace gaseous_server.Models
|
||||
string sql = "";
|
||||
|
||||
// get platform data
|
||||
// IGDB.Models.Platform? platform = Platforms.GetPlatform(IGDBId, false);
|
||||
IGDB.Models.Platform? platform = null;
|
||||
if (Storage.GetCacheStatus("Platform", IGDBId) == Storage.CacheStatus.NotPresent)
|
||||
Platform? platform = null;
|
||||
if (Storage.GetCacheStatus(Communications.MetadataSource, "Platform", IGDBId) == Storage.CacheStatus.NotPresent)
|
||||
{
|
||||
//platform = Platforms.GetPlatform(IGDBId, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
platform = (IGDB.Models.Platform)Storage.GetCacheValue<IGDB.Models.Platform>(new Platform(), "id", IGDBId);
|
||||
platform = (Platform)Storage.GetCacheValue<Platform>(Communications.MetadataSource, new Platform(), "id", IGDBId);
|
||||
}
|
||||
|
||||
if (platform != null)
|
||||
|
@@ -1,5 +1,3 @@
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Models
|
||||
{
|
||||
public class UserProfile
|
||||
@@ -11,7 +9,7 @@ namespace gaseous_server.Models
|
||||
public class NowPlayingItem
|
||||
{
|
||||
public Game Game { get; set; }
|
||||
public Platform Platform { get; set; }
|
||||
public HasheousClient.Models.Metadata.IGDB.Platform Platform { get; set; }
|
||||
public long Duration { get; set; }
|
||||
}
|
||||
public ProfileImageItem? Avatar { get; set; }
|
||||
|
@@ -329,12 +329,6 @@ app.Use(async (context, next) =>
|
||||
// setup library directories
|
||||
Config.LibraryConfiguration.InitLibrary();
|
||||
|
||||
// insert unknown platform and game if not present
|
||||
gaseous_server.Classes.Metadata.Games.GetGame(0, false, false, false);
|
||||
gaseous_server.Classes.Metadata.Games.AssignAllGamesToPlatformIdZero();
|
||||
gaseous_server.Classes.Metadata.Platforms.GetPlatform(0);
|
||||
gaseous_server.Classes.Metadata.Platforms.AssignAllPlatformsToGameIdZero();
|
||||
|
||||
// extract platform map if not present
|
||||
PlatformMapping.ExtractPlatformMap();
|
||||
|
||||
|
@@ -99,9 +99,157 @@ SELECT *, DATE_ADD(
|
||||
FROM UserTimeTracking;
|
||||
|
||||
CREATE INDEX idx_game_name ON Game (`Name`);
|
||||
|
||||
CREATE INDEX idx_game_totalratingcount ON Game (TotalRatingCount);
|
||||
|
||||
CREATE INDEX idx_alternativename_game ON AlternativeName (Game);
|
||||
|
||||
CREATE INDEX idx_gamestate_romid ON GameState (RomId);
|
||||
|
||||
CREATE INDEX idx_gamestate_ismediagroup_userid ON GameState (IsMediaGroup, UserId);
|
||||
|
||||
CREATE INDEX idx_rommediagroup_gameid ON RomMediaGroup (GameId);
|
||||
CREATE INDEX idx_favourites_userid_gameid ON Favourites (UserId, GameId);
|
||||
|
||||
CREATE INDEX idx_favourites_userid_gameid ON Favourites (UserId, GameId);
|
||||
|
||||
CREATE TABLE `MetadataMap` (
|
||||
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`PlatformId` bigint(20) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
|
||||
CREATE TABLE `MetadataMapBridge` (
|
||||
`ParentMapId` bigint(20) NOT NULL,
|
||||
`MetadataSourceType` int(11) NOT NULL DEFAULT 0,
|
||||
`MetadataSourceId` bigint(20) NOT NULL `Preferred` BOOLEAN NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (
|
||||
`ParentMapId`,
|
||||
`MetadataSourceType`,
|
||||
`MetadataSourceId`
|
||||
)
|
||||
);
|
||||
|
||||
ALTER TABLE `Games_Roms`
|
||||
ADD COLUMN `MetadataMapId` BIGINT NOT NULL DEFAULT 0;
|
||||
|
||||
ALTER TABLE `AgeGroup`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `AgeRating`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `AgeRatingContentDescription`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `AlternativeName`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Artwork`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Collection`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Company`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `CompanyLogo`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Cover`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `ExternalGame`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Franchise`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Game`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP INDEX IF EXISTS `Id_UNIQUE`,
|
||||
DROP INDEX IF EXISTS `PRIMARY`,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `GameMode`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `GameVideo`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Genre`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `InvolvedCompany`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `MultiplayerMode`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Platform`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP INDEX IF EXISTS `Id_UNIQUE`,
|
||||
DROP INDEX IF EXISTS `PRIMARY`,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `PlatformLogo`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `PlatformVersion`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `PlayerPerspective`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `ReleaseDate`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Screenshot`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
||||
|
||||
ALTER TABLE `Theme`
|
||||
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`Id`, `SourceId`);
|
Reference in New Issue
Block a user