diff --git a/LANCommander.Packager/Views/MetadataSearchDialog.axaml b/LANCommander.Packager/Views/MetadataSearchDialog.axaml
index e4c19701..4f75b730 100644
--- a/LANCommander.Packager/Views/MetadataSearchDialog.axaml
+++ b/LANCommander.Packager/Views/MetadataSearchDialog.axaml
@@ -29,14 +29,20 @@
SelectionMode="Single">
-
+
+
+ VerticalAlignment="Center"
+ IsVisible="{Binding HasReleasedOn}" />
diff --git a/LANCommander.Packager/Views/MetadataSearchDialog.axaml.cs b/LANCommander.Packager/Views/MetadataSearchDialog.axaml.cs
index d4776830..9d5afe6b 100644
--- a/LANCommander.Packager/Views/MetadataSearchDialog.axaml.cs
+++ b/LANCommander.Packager/Views/MetadataSearchDialog.axaml.cs
@@ -1,4 +1,5 @@
using System.Collections.ObjectModel;
+using System.Linq;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,7 +13,7 @@ namespace LANCommander.Packager.Views;
public partial class MetadataSearchDialog : Window
{
private readonly MetadataClient _metadataClient;
- private readonly ObservableCollection _results = new();
+ private readonly ObservableCollection _results = new();
private readonly List _rawResults = new();
private string? _selectedProvider;
private int _offset;
@@ -128,7 +129,7 @@ public partial class MetadataSearchDialog : Window
foreach (var result in results.Results)
{
_rawResults.Add(result);
- _results.Add(result.Data);
+ _results.Add(new SearchResultItem(result.Data));
}
_hasMore = results.More;
@@ -177,7 +178,7 @@ public partial class MetadataSearchDialog : Window
foreach (var result in results.Results)
{
_rawResults.Add(result);
- _results.Add(result.Data);
+ _results.Add(new SearchResultItem(result.Data));
}
_hasMore = results.More;
@@ -222,3 +223,28 @@ public partial class MetadataSearchDialog : Window
}
}
}
+
+internal class SearchResultItem
+{
+ public string Title { get; }
+ public string? ReleasedOn { get; }
+ public bool HasReleasedOn { get; }
+ public string? Platforms { get; }
+ public bool HasPlatforms { get; }
+
+ public SearchResultItem(Game game)
+ {
+ Title = game.Title ?? string.Empty;
+
+ HasReleasedOn = game.ReleasedOn != default;
+ ReleasedOn = HasReleasedOn ? game.ReleasedOn.ToString("yyyy-MM-dd") : null;
+
+ var platformNames = game.Platforms?
+ .Select(p => p.Name)
+ .Where(n => !string.IsNullOrWhiteSpace(n))
+ .ToList();
+
+ HasPlatforms = platformNames != null && platformNames.Count > 0;
+ Platforms = HasPlatforms ? string.Join(", ", platformNames!) : null;
+ }
+}
diff --git a/LANCommander.Server.Services/Providers/Metadata/IgdbMetadataProvider.cs b/LANCommander.Server.Services/Providers/Metadata/IgdbMetadataProvider.cs
index 5b182a71..c0a8b4a6 100644
--- a/LANCommander.Server.Services/Providers/Metadata/IgdbMetadataProvider.cs
+++ b/LANCommander.Server.Services/Providers/Metadata/IgdbMetadataProvider.cs
@@ -37,6 +37,7 @@ public class IgdbMetadataProvider(
fields.Add("involved_companies.developer");
fields.Add("involved_companies.publisher");
fields.Add("involved_companies.company.name");
+ fields.Add("platforms.*");
var sb = new StringBuilder();
@@ -114,6 +115,13 @@ public class IgdbMetadataProvider(
};
}
+ if (igdbGame.Platforms?.Values?.Any() ?? false)
+ {
+ game.Platforms = igdbGame.Platforms.Values
+ .Select(p => new Platform { Name = p.Name })
+ .ToList();
+ }
+
if (igdbGame.Genres?.Values?.Any() ?? false)
{
game.Genres = igdbGame.Genres.Values
diff --git a/LANCommander.Server/UI/Pages/Games/Components/MetadataLookupPanel.razor b/LANCommander.Server/UI/Pages/Games/Components/MetadataLookupPanel.razor
index 340108eb..156ea82d 100644
--- a/LANCommander.Server/UI/Pages/Games/Components/MetadataLookupPanel.razor
+++ b/LANCommander.Server/UI/Pages/Games/Components/MetadataLookupPanel.razor
@@ -38,8 +38,13 @@
-
-
+
+ @(context.Data.ReleasedOn != default ? context.Data.ReleasedOn.ToString("MM/dd/yyyy") : "—")
+
+
+ @string.Join(", ", context.Data.Platforms?.Select(p => p.Name) ?? [])
+
+
@string.Join(", ", context.Data.Developers?.Select(d => d.Name) ?? [])