Merge branch 'feature/grid_images' into feature/grid_images_merge

# Conflicts:
#	UWPHook/GamesWindow.xaml.cs
pull/50/head
Allex Rodrigues 3 years ago
commit b5fb3a1af0

@ -14,7 +14,7 @@
<value>False</value>
</setting>
<setting name="TargetLanguage" serializeAs="String">
<value/>
<value />
</setting>
<setting name="Seconds" serializeAs="String">
<value>5</value>
@ -22,6 +22,9 @@
<setting name="StreamMode" serializeAs="String">
<value>False</value>
</setting>
<setting name="SteamGridDbApiKey" serializeAs="String">
<value />
</setting>
</UWPHook.Properties.Settings>
</userSettings>
</configuration>

@ -0,0 +1,48 @@
using System;
namespace UWPHook
{
public class Crc32
{
uint[] table;
public uint ComputeChecksum(byte[] bytes)
{
uint crc = 0xffffffff;
for (int i = 0; i < bytes.Length; ++i)
{
byte index = (byte)(((crc) & 0xff) ^ bytes[i]);
crc = (uint)((crc >> 8) ^ table[index]);
}
return ~crc;
}
public byte[] ComputeChecksumBytes(byte[] bytes)
{
return BitConverter.GetBytes(ComputeChecksum(bytes));
}
public Crc32()
{
uint poly = 0xedb88320;
table = new uint[256];
uint temp = 0;
for (uint i = 0; i < table.Length; ++i)
{
temp = i;
for (int j = 8; j > 0; --j)
{
if ((temp & 1) == 1)
{
temp = (uint)((temp >> 1) ^ poly);
}
else
{
temp >>= 1;
}
}
table[i] = temp;
}
}
}
}

@ -2,12 +2,17 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using UWPHook.SteamGridDb;
using VDFParser;
using VDFParser.Models;
@ -104,25 +109,112 @@ namespace UWPHook
}
}
private void ExportButton_Click(object sender, RoutedEventArgs e)
private UInt64 GenerateSteamGridAppId(string appName, string appTarget)
{
bwrSave = new BackgroundWorker();
bwrSave.DoWork += BwrSave_DoWork;
bwrSave.RunWorkerCompleted += BwrSave_RunWorkerCompleted;
grid.IsEnabled = false;
progressBar.Visibility = Visibility.Visible;
byte[] nameTargetBytes = Encoding.UTF8.GetBytes(appTarget + appName + "");
UInt64 crc = new Crc32().ComputeChecksum(nameTargetBytes);
UInt64 gameId = crc | 0x80000000;
bwrSave.RunWorkerAsync();
return gameId;
}
private void BwrSave_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
private async void ExportButton_Click(object sender, RoutedEventArgs e)
{
grid.IsEnabled = false;
progressBar.Visibility = Visibility.Visible;
await ExportGames();
grid.IsEnabled = true;
progressBar.Visibility = Visibility.Collapsed;
MessageBox.Show("Your apps were successfuly exported, please restart Steam in order to see your apps.", "UWPHook", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void BwrSave_DoWork(object sender, DoWorkEventArgs e)
private async Task SaveImage(string imageUrl, string destinationFilename, ImageFormat format)
{
await Task.Run(() =>
{
WebClient client = new WebClient();
Stream stream = client.OpenRead(imageUrl);
Bitmap bitmap; bitmap = new Bitmap(stream);
if (bitmap != null)
{
bitmap.Save(destinationFilename, format);
}
stream.Flush();
stream.Close();
client.Dispose();
});
}
private async Task DownloadGridImages(string userId, string appName, string appTarget)
{
SteamGridDbApi api = new SteamGridDbApi(Properties.Settings.Default.SteamGridDbApiKey);
string gridDirectory = userId + @"\\config\\grid\\";
var games = await api.SearchGame(appName);
if (games != null)
{
var game = games[0];
UInt64 gameId = GenerateSteamGridAppId(appName, appTarget);
if (!Directory.Exists(gridDirectory))
{
Directory.CreateDirectory(gridDirectory);
}
var gameGridsVertical = api.GetGameGrids(game.Id, "600x900", "static");
var gameGridsHorizontal = api.GetGameGrids(game.Id, "460x215", "static");
var gameHeroes = api.GetGameHeroes(game.Id, "static");
var gameLogos = api.GetGameLogos(game.Id, "static");
await Task.WhenAll(
gameGridsVertical,
gameGridsHorizontal,
gameHeroes,
gameLogos
);
var gridsVertical = await gameGridsVertical;
var gridsHorizontal = await gameGridsHorizontal;
var heroes = await gameHeroes;
var logos = await gameLogos;
List<Task> saveImagesTasks = new List<Task>();
if (gridsHorizontal != null && gridsHorizontal.Length > 0)
{
var grid = gridsHorizontal[0];
saveImagesTasks.Add(SaveImage(grid.Url, $"{gridDirectory}\\{gameId}.png", ImageFormat.Png));
}
if (gridsVertical != null && gridsVertical.Length > 0)
{
var grid = gridsVertical[0];
saveImagesTasks.Add(SaveImage(grid.Url, $"{gridDirectory}\\{gameId}p.png", ImageFormat.Png));
}
if (heroes != null && heroes.Length > 0)
{
var hero = heroes[0];
saveImagesTasks.Add(SaveImage(hero.Url, $"{gridDirectory}\\{gameId}_hero.png", ImageFormat.Png));
}
if (logos != null && logos.Length > 0)
{
var logo = logos[0];
saveImagesTasks.Add(SaveImage(logo.Url, $"{gridDirectory}\\{gameId}_logo.png", ImageFormat.Png));
}
await Task.WhenAll(saveImagesTasks);
}
}
private async Task ExportGames()
{
string steam_folder = SteamManager.GetSteamFolder();
if (Directory.Exists(steam_folder))
@ -158,6 +250,9 @@ namespace UWPHook
{
var exePath = @"""" + System.Reflection.Assembly.GetExecutingAssembly().Location + @"""";
var exeDir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
List<Task> gridImagesDownloadTasks = new List<Task>();
bool downloadGridImages = !String.IsNullOrEmpty(Properties.Settings.Default.SteamGridDbApiKey);
foreach (var app in selected_apps)
{
VDFEntry newApp = new VDFEntry()
@ -182,6 +277,11 @@ namespace UWPHook
//Resize this array so it fits the new entries
Array.Resize(ref shortcuts, shortcuts.Length + 1);
shortcuts[shortcuts.Length - 1] = newApp;
if (downloadGridImages)
{
gridImagesDownloadTasks.Add(DownloadGridImages(user, app.Name, exePath));
}
}
try
@ -192,6 +292,11 @@ namespace UWPHook
}
//Write the file with all the shortcuts
File.WriteAllBytes(user + @"\\config\\shortcuts.vdf", VDFSerializer.Serialize(shortcuts));
if (gridImagesDownloadTasks.Count > 0)
{
await Task.WhenAll(gridImagesDownloadTasks);
}
}
catch (Exception ex)
{

@ -12,7 +12,7 @@ namespace UWPHook.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")]
public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@ -70,5 +70,17 @@ namespace UWPHook.Properties {
this["StreamMode"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string SteamGridDbApiKey {
get {
return ((string)(this["SteamGridDbApiKey"]));
}
set {
this["SteamGridDbApiKey"] = value;
}
}
}
}

@ -14,5 +14,8 @@
<Setting Name="StreamMode" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="SteamGridDbApiKey" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

@ -26,9 +26,12 @@
<Image x:Name="image" HorizontalAlignment="Left" Width="178" Height="80" VerticalAlignment="Top" Source="Resources/WhiteTransparent.png" Stretch="UniformToFill" ToolTip="Welcome to UWPHook, add your UWP apps and games to Steam!"/>
<Grid Margin="10,9.4,10.2,10.2" Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="93.6"/>
<RowDefinition Height="48.8"/>
<RowDefinition/>
<RowDefinition Height="72"/>
<RowDefinition Height="44"/>
<RowDefinition Height="41*"/>
<RowDefinition Height="72*"/>
<RowDefinition Height="56*"/>
<RowDefinition Height="51*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="52*"/>
@ -39,16 +42,19 @@
<materialDesign:ColorZone Padding="16" materialDesign:ShadowAssist.ShadowDepth="Depth2" Mode="PrimaryMid" VerticalAlignment="Top" Height="27" Grid.ColumnSpan="4">
<Label Content="Settings" HorizontalAlignment="Left" Margin="-10,-15,0,-17" VerticalAlignment="Top" FontFamily="Segoe UI Semibold" FontSize="14" Height="32" Foreground="#DDFFFFFF"/>
</materialDesign:ColorZone>
<ToggleButton x:Name="language_toggle" Style="{StaticResource MaterialDesignSwitchToggleButton}" VerticalAlignment="Top" Margin="4,56,0,0" ToolTip="MaterialDesignSwitchToggleButton" IsChecked="False" Height="18" HorizontalAlignment="Left" Width="46" />
<Label ToolTip="Some apps use the system language to choose what language to display, this setting will store your current language, change it so you can play in another language and then revert your system back to your default display language." x:Name="label1" Content="Set system language when launching an app*" Margin="5,48,0,0" VerticalAlignment="Top" Height="29" Grid.Column="1" Grid.ColumnSpan="2"/>
<ComboBox ToolTip="Some apps use the system language to choose what language to display, this setting will store your current language, change it so you can play in another language and then revert your system back to your default display language." x:Name="cultures_comboBox" Margin="0,48,10,0" VerticalAlignment="Top" Height="31" Grid.Column="3" HorizontalAlignment="Right" Width="93"/>
<Button x:Name="save_button" Content="Save" HorizontalAlignment="Right" Margin="0,42,10,0" VerticalAlignment="Top" Width="93" Click="saveButton_Click" Grid.Column="3" Grid.Row="2"/>
<Label x:Name="label3" Content="Check if the launched app is running every" Margin="5,0,0,0" VerticalAlignment="Top" Height="29" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2"/>
<ComboBox x:Name="seconds_comboBox" Margin="0,10,10,0" VerticalAlignment="Top" Height="31" Grid.Column="3" HorizontalAlignment="Right" Width="93" Grid.Row="1"/>
<Button x:Name="update_button" Click="update_button_Click" Content="Check for updates" Grid.Column="1" Margin="0,0,5,10" Grid.Row="2" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="162"/>
<Button x:Name="help_button" Click="help_button_Click" Content="Get help at our Reddit" Grid.Column="2" Margin="8,0,0,10" Grid.Row="2" VerticalAlignment="Bottom" Grid.ColumnSpan="2" HorizontalAlignment="Left" Width="163"/>
<ToggleButton x:Name="streaming_toggle" Style="{StaticResource MaterialDesignSwitchToggleButton}" VerticalAlignment="Top" Margin="0,17,0,0" ToolTip="MaterialDesignSwitchToggleButton" IsChecked="False" Height="18" HorizontalAlignment="Left" Width="46" Grid.Row="2" />
<Label ToolTip="This fixes Steam in-home Streaming, set this in the host computer." x:Name="label1_Copy" Content="Enable streaming mode" Margin="5,10,0,0" VerticalAlignment="Top" Height="29" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2"/>
<ToggleButton x:Name="language_toggle" Style="{StaticResource MaterialDesignSwitchToggleButton}" VerticalAlignment="Top" Margin="0,42,0,0" ToolTip="MaterialDesignSwitchToggleButton" IsChecked="False" Height="18" HorizontalAlignment="Left" Width="46" RenderTransformOrigin="0.304,0.444" />
<Label ToolTip="Some apps use the system language to choose what language to display, this setting will store your current language, change it so you can play in another language and then revert your system back to your default display language." x:Name="label1" Content="Set system language when launching an app*" Margin="5,34,0,0" VerticalAlignment="Top" Height="29" Grid.Column="1" Grid.ColumnSpan="2"/>
<ComboBox ToolTip="Some apps use the system language to choose what language to display, this setting will store your current language, change it so you can play in another language and then revert your system back to your default display language." x:Name="cultures_comboBox" Margin="0,34,10,0" VerticalAlignment="Top" Height="31" Grid.Column="3" HorizontalAlignment="Right" Width="93"/>
<Button x:Name="save_button" Content="Save" HorizontalAlignment="Right" Margin="0,14.333,10,0" VerticalAlignment="Top" Width="93" Click="saveButton_Click" Grid.Column="3" Grid.Row="4"/>
<Label x:Name="label3" Content="Check if the launched app is running every" Margin="5,7,0,0" VerticalAlignment="Top" Height="29" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2"/>
<ComboBox x:Name="seconds_comboBox" Margin="0,7,10,0" VerticalAlignment="Top" Height="31" Grid.Column="3" HorizontalAlignment="Right" Width="93" Grid.Row="1"/>
<Button x:Name="update_button" Click="update_button_Click" Content="Check for updates" Margin="0,0,8,9" Grid.Row="5" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="162" Grid.Column="1"/>
<Button x:Name="help_button" Click="help_button_Click" Content="Get help at our Reddit" Grid.Column="2" Margin="0,0,0,9" Grid.Row="5" VerticalAlignment="Bottom" Grid.ColumnSpan="2" HorizontalAlignment="Left" Width="163"/>
<ToggleButton x:Name="streaming_toggle" Style="{StaticResource MaterialDesignSwitchToggleButton}" VerticalAlignment="Top" Margin="0,12,0,0" ToolTip="MaterialDesignSwitchToggleButton" IsChecked="False" Height="18" HorizontalAlignment="Left" Width="46" Grid.Row="2" />
<Label ToolTip="This fixes Steam in-home Streaming, set this in the host computer." x:Name="label1_Copy" Content="Enable streaming mode" Margin="5,5,0,0" VerticalAlignment="Top" Height="29" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2"/>
<Label ToolTip="SteamGridDB API key used to download Steam's library artwork. Leave it blank if you don't want to download artwork." x:Name="label1_Copy1" Content="SteamGridDB API key" Margin="5,6,0,0" VerticalAlignment="Top" Height="29" Grid.Row="3" Grid.Column="1"/>
<TextBox x:Name="steamgriddb_api_key" Grid.Column="2" Height="29" Margin="0,6,10,0" Grid.Row="3" TextWrapping="Wrap" VerticalAlignment="Top" Grid.ColumnSpan="2"/>
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="5,40,0,0" Grid.Row="3" TextWrapping="Wrap" Text="To get an api key, visit https://www.steamgriddb.com and create an account. You'll be able to generate a key in your account preferences." VerticalAlignment="Top" Grid.ColumnSpan="3" Height="32" Width="399" FontSize="11"/>
</Grid>
<Grid Margin="9.8,9.6,9.6,0.4" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2">
<Grid.ColumnDefinitions>

@ -32,6 +32,7 @@ namespace UWPHook
cultures_comboBox.SelectedItem = Properties.Settings.Default.TargetLanguage;
language_toggle.IsChecked = Properties.Settings.Default.ChangeLanguage;
streaming_toggle.IsChecked = Properties.Settings.Default.StreamMode;
steamgriddb_api_key.Text = Properties.Settings.Default.SteamGridDbApiKey;
}
private void saveButton_Click(object sender, RoutedEventArgs e)
@ -40,6 +41,7 @@ namespace UWPHook
Properties.Settings.Default.TargetLanguage = cultures_comboBox.SelectedItem.ToString();
Properties.Settings.Default.Seconds = Int32.Parse(seconds_comboBox.SelectedItem.ToString().Substring(0, 1));
Properties.Settings.Default.StreamMode = (bool)streaming_toggle.IsChecked;
Properties.Settings.Default.SteamGridDbApiKey = steamgriddb_api_key.Text;
Properties.Settings.Default.Save();
this.Close();
}

@ -0,0 +1,10 @@
namespace UWPHook.SteamGridDb
{
class GameResponse
{
public int Id { get; set; }
public string Name { get; set; }
}
}

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UWPHook.SteamGridDb
{
class GridResponse
{
public string Url { get; set; }
}
}

@ -0,0 +1,7 @@
namespace UWPHook.SteamGridDb
{
public class HeroResponse
{
public string Url { get; set; }
}
}

@ -0,0 +1,7 @@
namespace UWPHook.SteamGridDb
{
public class LogoResponse
{
public string Url { get; set; }
}
}

@ -0,0 +1,153 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace UWPHook.SteamGridDb
{
class SteamGridDbApi
{
private const string BASE_URL = "https://www.steamgriddb.com/api/v2/";
private HttpClient httpClient;
public SteamGridDbApi(string apiKey)
{
httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(BASE_URL);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
}
public async Task<GameResponse[]> SearchGame(string gameName)
{
string path = $"search/autocomplete/{gameName}";
GameResponse[] games = null;
HttpResponseMessage response = await httpClient.GetAsync(path);
if(response.IsSuccessStatusCode)
{
var parsedResponse = await response.Content.ReadAsAsync<ResponseWrapper<GameResponse>>();
games = parsedResponse.Data;
}
return games;
}
public async Task<GridResponse[]> GetGameGrids(
int gameId,
string dimensions = null,
string types = null,
string styles = null,
string nsfw = "any",
string humor = "any")
{
string path = $"grids/game/{gameId}?";
if (!String.IsNullOrEmpty(dimensions))
path += $"dimensions={dimensions}&";
if (!String.IsNullOrEmpty(types))
path += $"types={types}&";
if (!String.IsNullOrEmpty(styles))
path += $"styles={styles}&";
if (!String.IsNullOrEmpty(nsfw))
path += $"nsfw={nsfw}&";
if (!String.IsNullOrEmpty(humor))
path += $"humor={humor}&";
GridResponse[] grids = null;
HttpResponseMessage response = await httpClient.GetAsync(path);
if (response.IsSuccessStatusCode)
{
var parsedResponse = await response.Content.ReadAsAsync<ResponseWrapper<GridResponse>>();
grids = parsedResponse.Data;
}
return grids;
}
public async Task<HeroResponse[]> GetGameHeroes(
int gameId,
string types = null,
string dimensions = null,
string styles = null,
string nsfw = "any",
string humor = "any")
{
string path = $"heroes/game/{gameId}?";
if (!String.IsNullOrEmpty(dimensions))
path += $"dimensions={dimensions}&";
if (!String.IsNullOrEmpty(types))
path += $"types={types}&";
if (!String.IsNullOrEmpty(styles))
path += $"styles={styles}&";
if (!String.IsNullOrEmpty(nsfw))
path += $"nsfw={nsfw}&";
if (!String.IsNullOrEmpty(humor))
path += $"humor={humor}&";
HeroResponse[] heroes = null;
HttpResponseMessage response = await httpClient.GetAsync(path);
if (response.IsSuccessStatusCode)
{
var parsedResponse = await response.Content.ReadAsAsync<ResponseWrapper<HeroResponse>>();
heroes = parsedResponse.Data;
}
return heroes;
}
public async Task<LogoResponse[]> GetGameLogos(
int gameId,
string types = null,
string styles = null,
string nsfw = "any",
string humor = "any")
{
string path = $"logos/game/{gameId}?";
if (!String.IsNullOrEmpty(types))
path += $"types={types}&";
if (!String.IsNullOrEmpty(styles))
path += $"styles={styles}&";
if (!String.IsNullOrEmpty(nsfw))
path += $"nsfw={nsfw}&";
if (!String.IsNullOrEmpty(humor))
path += $"humor={humor}&";
LogoResponse[] logos = null;
HttpResponseMessage response = await httpClient.GetAsync(path);
if (response.IsSuccessStatusCode)
{
var parsedResponse = await response.Content.ReadAsAsync<ResponseWrapper<LogoResponse>>();
logos = parsedResponse.Data;
}
return logos;
}
private class ResponseWrapper<T>
{
public bool Success { get; set; }
public T[] Data { get; set; }
}
}
}

@ -65,6 +65,9 @@
<Reference Include="MaterialDesignThemes.Wpf, Version=3.1.3.1513, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialDesignThemes.3.1.3\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="SharpSteam">
<HintPath>..\..\SharpSteam\SharpSteam\bin\Release\SharpSteam.dll</HintPath>
</Reference>
@ -74,6 +77,9 @@
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.PowerShell.5.ReferenceAssemblies.1.1.0\lib\net4\System.Management.Automation.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
@ -97,6 +103,7 @@
</ApplicationDefinition>
<Compile Include="AppEntry.cs" />
<Compile Include="AppEntryModel.cs" />
<Compile Include="Crc32.cs" />
<Compile Include="FullScreenLauncher.xaml.cs">
<DependentUpon>FullScreenLauncher.xaml</DependentUpon>
</Compile>
@ -108,6 +115,11 @@
<Compile Include="SettingsWindow.xaml.cs">
<DependentUpon>SettingsWindow.xaml</DependentUpon>
</Compile>
<Compile Include="SteamGridDb\GameResponse.cs" />
<Compile Include="SteamGridDb\GridResponse.cs" />
<Compile Include="SteamGridDb\HeroResponse.cs" />
<Compile Include="SteamGridDb\LogoResponse.cs" />
<Compile Include="SteamGridDb\SteamGridDbApi.cs" />
<Page Include="FullScreenLauncher.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>

@ -2,6 +2,8 @@
<packages>
<package id="MaterialDesignColors" version="1.2.6" targetFramework="net461" />
<package id="MaterialDesignThemes" version="3.1.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.7" targetFramework="net461" />
<package id="Microsoft.PowerShell.5.ReferenceAssemblies" version="1.1.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net461" />
<package id="System.Management.Automation" version="7.0.1" targetFramework="net461" />
</packages>
Loading…
Cancel
Save