Compare commits
8 Commits
v1.1
...
15db118dd6
Author | SHA1 | Date | |
---|---|---|---|
15db118dd6 | |||
67315f90b0 | |||
7fdf349c28 | |||
9a5f686dde | |||
b209cb2556 | |||
6e1f43bed0 | |||
9bd088fac8 | |||
0be28ab205 |
@ -20,6 +20,17 @@ using MpcNET.Types;
|
|||||||
|
|
||||||
namespace unison
|
namespace unison
|
||||||
{
|
{
|
||||||
|
public class Statistics
|
||||||
|
{
|
||||||
|
public int Songs { get; set; }
|
||||||
|
public int Albums { get; set; }
|
||||||
|
public int Artists { get; set; }
|
||||||
|
public string TotalPlaytime { get; set; }
|
||||||
|
public string Uptime { get; set; }
|
||||||
|
public string TotalTimePlayed { get; set; }
|
||||||
|
public string DatabaseUpdate { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class MPDHandler
|
public class MPDHandler
|
||||||
{
|
{
|
||||||
private bool _connected;
|
private bool _connected;
|
||||||
@ -36,12 +47,15 @@ namespace unison
|
|||||||
private MpdStatus _currentStatus;
|
private MpdStatus _currentStatus;
|
||||||
private IMpdFile _currentSong;
|
private IMpdFile _currentSong;
|
||||||
private BitmapFrame _cover;
|
private BitmapFrame _cover;
|
||||||
|
public Statistics _stats;
|
||||||
private readonly System.Timers.Timer _elapsedTimer;
|
private readonly System.Timers.Timer _elapsedTimer;
|
||||||
private DispatcherTimer _retryTimer;
|
private DispatcherTimer _retryTimer;
|
||||||
|
|
||||||
bool _isUpdatingStatus = false;
|
bool _isUpdatingStatus = false;
|
||||||
bool _isUpdatingSong = false;
|
bool _isUpdatingSong = false;
|
||||||
|
|
||||||
|
bool _invalidIp = false;
|
||||||
|
|
||||||
private event EventHandler ConnectionChanged;
|
private event EventHandler ConnectionChanged;
|
||||||
private event EventHandler StatusChanged;
|
private event EventHandler StatusChanged;
|
||||||
private event EventHandler SongChanged;
|
private event EventHandler SongChanged;
|
||||||
@ -58,6 +72,8 @@ namespace unison
|
|||||||
|
|
||||||
Initialize(null, null);
|
Initialize(null, null);
|
||||||
|
|
||||||
|
_stats = new Statistics();
|
||||||
|
|
||||||
_retryTimer = new DispatcherTimer();
|
_retryTimer = new DispatcherTimer();
|
||||||
_retryTimer.Interval = TimeSpan.FromSeconds(5);
|
_retryTimer.Interval = TimeSpan.FromSeconds(5);
|
||||||
_retryTimer.Tick += Initialize;
|
_retryTimer.Tick += Initialize;
|
||||||
@ -81,7 +97,7 @@ namespace unison
|
|||||||
|
|
||||||
void OnConnectionChanged(object sender, EventArgs e)
|
void OnConnectionChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!_connected)
|
if (!_connected && !_invalidIp)
|
||||||
_retryTimer.Start();
|
_retryTimer.Start();
|
||||||
else
|
else
|
||||||
_retryTimer.Stop();
|
_retryTimer.Stop();
|
||||||
@ -175,12 +191,13 @@ namespace unison
|
|||||||
_connection = await ConnectInternal(token);
|
_connection = await ConnectInternal(token);
|
||||||
_commandConnection = await ConnectInternal(token);
|
_commandConnection = await ConnectInternal(token);
|
||||||
}
|
}
|
||||||
catch(MpcNET.Exceptions.MpcConnectException exception)
|
catch(MpcNET.Exceptions.MpcConnectException)
|
||||||
{
|
{
|
||||||
Trace.WriteLine("exception: " + exception);
|
_invalidIp = true;
|
||||||
}
|
}
|
||||||
if (_connection != null && _commandConnection != null)
|
if (_connection != null && _commandConnection != null)
|
||||||
{
|
{
|
||||||
|
_invalidIp = false;
|
||||||
if (_connection.IsConnected && _commandConnection.IsConnected)
|
if (_connection.IsConnected && _commandConnection.IsConnected)
|
||||||
{
|
{
|
||||||
_connected = true;
|
_connected = true;
|
||||||
@ -204,6 +221,21 @@ namespace unison
|
|||||||
{
|
{
|
||||||
IPAddress.TryParse(Properties.Settings.Default.mpd_host, out IPAddress ipAddress);
|
IPAddress.TryParse(Properties.Settings.Default.mpd_host, out IPAddress ipAddress);
|
||||||
|
|
||||||
|
if (ipAddress == null)
|
||||||
|
{
|
||||||
|
IPAddress[] addrList;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
addrList = Dns.GetHostAddresses(Properties.Settings.Default.mpd_host);
|
||||||
|
if (addrList.Length > 0)
|
||||||
|
ipAddress = addrList[0];
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
throw new MpcNET.Exceptions.MpcConnectException("No correct IP provided by user.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_mpdEndpoint = new IPEndPoint(ipAddress, Properties.Settings.Default.mpd_port);
|
_mpdEndpoint = new IPEndPoint(ipAddress, Properties.Settings.Default.mpd_port);
|
||||||
MpcConnection connection = new MpcConnection(_mpdEndpoint);
|
MpcConnection connection = new MpcConnection(_mpdEndpoint);
|
||||||
await connection.ConnectAsync(token);
|
await connection.ConnectAsync(token);
|
||||||
@ -334,14 +366,14 @@ namespace unison
|
|||||||
List<byte> data = new List<byte>();
|
List<byte> data = new List<byte>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_connection == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
long totalBinarySize = 9999;
|
long totalBinarySize = 9999;
|
||||||
long currentSize = 0;
|
long currentSize = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
if (_connection == null)
|
||||||
|
return;
|
||||||
|
|
||||||
var albumReq = await _connection.SendAsync(new AlbumArtCommand(path, currentSize));
|
var albumReq = await _connection.SendAsync(new AlbumArtCommand(path, currentSize));
|
||||||
if (!albumReq.IsResponseValid)
|
if (!albumReq.IsResponseValid)
|
||||||
break;
|
break;
|
||||||
@ -417,6 +449,7 @@ namespace unison
|
|||||||
public MpdStatus GetStatus() => _currentStatus;
|
public MpdStatus GetStatus() => _currentStatus;
|
||||||
public BitmapFrame GetCover() => _cover;
|
public BitmapFrame GetCover() => _cover;
|
||||||
public string GetVersion() => _version;
|
public string GetVersion() => _version;
|
||||||
|
public Statistics GetStats() => _stats;
|
||||||
public double GetCurrentTime() => _currentTime;
|
public double GetCurrentTime() => _currentTime;
|
||||||
|
|
||||||
public bool IsConnected() => _connected;
|
public bool IsConnected() => _connected;
|
||||||
@ -479,5 +512,25 @@ namespace unison
|
|||||||
CommandList commandList = new CommandList(new IMpcCommand<object>[] { new ClearCommand(), new AddCommand(Uri), new PlayCommand(0) });
|
CommandList commandList = new CommandList(new IMpcCommand<object>[] { new ClearCommand(), new AddCommand(Uri), new PlayCommand(0) });
|
||||||
SendCommand(commandList);
|
SendCommand(commandList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async void QueryStats()
|
||||||
|
{
|
||||||
|
Dictionary<string, string> response = await SafelySendCommandAsync(new StatsCommand());
|
||||||
|
|
||||||
|
_stats.Songs = int.Parse(response["songs"]);
|
||||||
|
_stats.Albums = int.Parse(response["albums"]);
|
||||||
|
_stats.Artists = int.Parse(response["artists"]);
|
||||||
|
|
||||||
|
TimeSpan time;
|
||||||
|
time = TimeSpan.FromSeconds(int.Parse(response["uptime"]));
|
||||||
|
_stats.Uptime = time.ToString(@"dd\:hh\:mm\:ss");
|
||||||
|
time = TimeSpan.FromSeconds(int.Parse(response["db_playtime"]));
|
||||||
|
_stats.TotalPlaytime = time.ToString(@"dd\:hh\:mm\:ss");
|
||||||
|
time = TimeSpan.FromSeconds(int.Parse(response["playtime"]));
|
||||||
|
_stats.TotalTimePlayed = time.ToString(@"dd\:hh\:mm\:ss");
|
||||||
|
|
||||||
|
DateTime date = new DateTime(1970, 1, 1).AddSeconds(int.Parse(response["db_update"])).ToLocalTime();
|
||||||
|
_stats.DatabaseUpdate = date.ToString("dd/MM/yyyy @ HH:mm");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
2
LICENSE
2
LICENSE
@ -1,4 +1,4 @@
|
|||||||
MIT License Copyright (c) 2021 Théo Marchal
|
MIT License Copyright (c) 2022 Théo Marchal
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
26
Properties/Settings.Designer.cs
generated
26
Properties/Settings.Designer.cs
generated
@ -73,7 +73,19 @@ namespace unison.Properties {
|
|||||||
|
|
||||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Configuration.DefaultSettingValueAttribute("snapclient_0.25.0-1_win64")]
|
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||||
|
public bool snapcast_window {
|
||||||
|
get {
|
||||||
|
return ((bool)(this["snapcast_window"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["snapcast_window"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("snapclient_0.26.0-1_win64")]
|
||||||
public string snapcast_path {
|
public string snapcast_path {
|
||||||
get {
|
get {
|
||||||
return ((string)(this["snapcast_path"]));
|
return ((string)(this["snapcast_path"]));
|
||||||
@ -106,17 +118,5 @@ namespace unison.Properties {
|
|||||||
this["volume_offset"] = value;
|
this["volume_offset"] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
|
||||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
|
||||||
public bool snapcast_window {
|
|
||||||
get {
|
|
||||||
return ((bool)(this["snapcast_window"]));
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
this["snapcast_window"] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<Value Profile="(Default)">False</Value>
|
<Value Profile="(Default)">False</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="snapcast_path" Type="System.String" Scope="User">
|
<Setting Name="snapcast_path" Type="System.String" Scope="User">
|
||||||
<Value Profile="(Default)">snapclient_0.25.0-1_win64</Value>
|
<Value Profile="(Default)">snapclient_0.26.0-1_win64</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="snapcast_port" Type="System.Int32" Scope="User">
|
<Setting Name="snapcast_port" Type="System.Int32" Scope="User">
|
||||||
<Value Profile="(Default)">1704</Value>
|
<Value Profile="(Default)">1704</Value>
|
||||||
|
81
Resources/Resources.Designer.cs
generated
81
Resources/Resources.Designer.cs
generated
@ -249,15 +249,6 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to 's updated MpcNET.
|
|
||||||
/// </summary>
|
|
||||||
public static string Settings_MpcNET {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("Settings_MpcNET", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Next track.
|
/// Looks up a localized string similar to Next track.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -501,6 +492,78 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Stats.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Albums:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_Albums {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_Albums", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Artists:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_Artists {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_Artists", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Last database update:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_LastDatabaseUpdate {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_LastDatabaseUpdate", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Songs:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_Songs {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_Songs", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Total playtime:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_TotalPlaytime {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_TotalPlaytime", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Total time played:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_TotalTimePlayed {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_TotalTimePlayed", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to MPD uptime:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_Uptime {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_Uptime", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Stop Snapcast.
|
/// Looks up a localized string similar to Stop Snapcast.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -180,9 +180,6 @@
|
|||||||
<data name="Settings_MadeBy" xml:space="preserve">
|
<data name="Settings_MadeBy" xml:space="preserve">
|
||||||
<value>Créé par</value>
|
<value>Créé par</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_MpcNET" xml:space="preserve">
|
|
||||||
<value> et sa version de MpcNET</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_NextTrack" xml:space="preserve">
|
<data name="Settings_NextTrack" xml:space="preserve">
|
||||||
<value>Piste suivante</value>
|
<value>Piste suivante</value>
|
||||||
</data>
|
</data>
|
||||||
@ -264,6 +261,30 @@
|
|||||||
<data name="StartSnapcast" xml:space="preserve">
|
<data name="StartSnapcast" xml:space="preserve">
|
||||||
<value>Démarrer Snapcast</value>
|
<value>Démarrer Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Stats" xml:space="preserve">
|
||||||
|
<value>Stats</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Albums" xml:space="preserve">
|
||||||
|
<value>Albums :</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Artists" xml:space="preserve">
|
||||||
|
<value>Artistes :</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_LastDatabaseUpdate" xml:space="preserve">
|
||||||
|
<value>Mise à jour de la base de données :</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Songs" xml:space="preserve">
|
||||||
|
<value>Morceaux :</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_TotalPlaytime" xml:space="preserve">
|
||||||
|
<value>Temps total :</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
||||||
|
<value>Temps d'écoute écoulé :</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Uptime" xml:space="preserve">
|
||||||
|
<value>MPD lancé depuis : </value>
|
||||||
|
</data>
|
||||||
<data name="StopSnapcast" xml:space="preserve">
|
<data name="StopSnapcast" xml:space="preserve">
|
||||||
<value>Stopper Snapcast</value>
|
<value>Stopper Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -180,9 +180,6 @@
|
|||||||
<data name="Settings_MadeBy" xml:space="preserve">
|
<data name="Settings_MadeBy" xml:space="preserve">
|
||||||
<value>Made by</value>
|
<value>Made by</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_MpcNET" xml:space="preserve">
|
|
||||||
<value>'s updated MpcNET</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_NextTrack" xml:space="preserve">
|
<data name="Settings_NextTrack" xml:space="preserve">
|
||||||
<value>Next track</value>
|
<value>Next track</value>
|
||||||
</data>
|
</data>
|
||||||
@ -264,6 +261,30 @@
|
|||||||
<data name="StartSnapcast" xml:space="preserve">
|
<data name="StartSnapcast" xml:space="preserve">
|
||||||
<value>Start Snapcast</value>
|
<value>Start Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Stats" xml:space="preserve">
|
||||||
|
<value>Stats</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Albums" xml:space="preserve">
|
||||||
|
<value>Albums:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Artists" xml:space="preserve">
|
||||||
|
<value>Artists:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_LastDatabaseUpdate" xml:space="preserve">
|
||||||
|
<value>Last database update:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Songs" xml:space="preserve">
|
||||||
|
<value>Songs:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_TotalPlaytime" xml:space="preserve">
|
||||||
|
<value>Total playtime:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
||||||
|
<value>Total time played:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_Uptime" xml:space="preserve">
|
||||||
|
<value>MPD uptime:</value>
|
||||||
|
</data>
|
||||||
<data name="StopSnapcast" xml:space="preserve">
|
<data name="StopSnapcast" xml:space="preserve">
|
||||||
<value>Stop Snapcast</value>
|
<value>Stop Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
xmlns:system="clr-namespace:System;assembly=mscorlib">
|
||||||
|
|
||||||
<system:String x:Key="snapcastPath">snapclient_0.25.0-1_win64</system:String>
|
<system:String x:Key="snapcastPath">snapclient_0.26.0-1_win64</system:String>
|
||||||
<system:String x:Key="snapcastPort">1704</system:String>
|
<system:String x:Key="snapcastPort">1704</system:String>
|
||||||
|
|
||||||
<system:String x:Key="connectionOk1"></system:String>
|
<system:String x:Key="connectionOk1"></system:String>
|
||||||
|
@ -117,7 +117,7 @@
|
|||||||
<TextBlock x:Name="SnapcastText" Text="{x:Static properties:Resources.StartSnapcast}" Margin="5, 0, 0, 0"/>
|
<TextBlock x:Name="SnapcastText" Text="{x:Static properties:Resources.StartSnapcast}" Margin="5, 0, 0, 0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Button>
|
</Button>
|
||||||
<Button x:Name="Radio" Padding="5, 2" HorizontalAlignment="Left" Click="Radios_Clicked" Margin="5,0,10,0" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" FocusVisualStyle="{x:Null}">
|
<Button x:Name="Radio" Padding="5, 2" HorizontalAlignment="Left" Click="Radios_Clicked" Margin="5,0,10,0" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" FocusVisualStyle="{x:Null}" IsEnabled="False">
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<emoji:TextBlock Text="📻" Padding="0,0,0,2"/>
|
<emoji:TextBlock Text="📻" Padding="0,0,0,2"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Radios}" Margin="5, 0, 0, 0"/>
|
<TextBlock Text="{x:Static properties:Resources.Radios}" Margin="5, 0, 0, 0"/>
|
||||||
|
@ -135,6 +135,9 @@ namespace unison
|
|||||||
DefaultState();
|
DefaultState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_mpd.QueryStats();
|
||||||
|
_settingsWin.UpdateStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DefaultState(bool LostConnection = false)
|
private void DefaultState(bool LostConnection = false)
|
||||||
@ -185,6 +188,11 @@ namespace unison
|
|||||||
SnapcastText.Text = unison.Resources.Resources.StartSnapcast;
|
SnapcastText.Text = unison.Resources.Resources.StartSnapcast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnRadioBrowserConnected()
|
||||||
|
{
|
||||||
|
Radio.IsEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
public void UpdateButton(ref Border border, bool b)
|
public void UpdateButton(ref Border border, bool b)
|
||||||
{
|
{
|
||||||
border.Style = b ? (Style)Resources["SelectedButton"] : (Style)Resources["UnselectedButton"];
|
border.Style = b ? (Style)Resources["SelectedButton"] : (Style)Resources["UnselectedButton"];
|
||||||
|
@ -59,9 +59,22 @@ namespace unison
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
_radioBrowser = new RadioBrowserClient();
|
_radioBrowser = new RadioBrowserClient();
|
||||||
Initialize();
|
Initialize();
|
||||||
}
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("Exception while connecting to RadioBrowser: " + e.Message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
MainWindow MainWin = (MainWindow)Application.Current.MainWindow;
|
||||||
|
MainWin.OnRadioBrowserConnected();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public async void Initialize()
|
public async void Initialize()
|
||||||
{
|
{
|
||||||
@ -84,6 +97,8 @@ namespace unison
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async Task SearchAdvanced(string name, string country, string tags)
|
public async Task SearchAdvanced(string name, string country, string tags)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
SearchStatus.Text = unison.Resources.Resources.Radio_Loading;
|
SearchStatus.Text = unison.Resources.Resources.Radio_Loading;
|
||||||
|
|
||||||
@ -115,6 +130,11 @@ namespace unison
|
|||||||
else
|
else
|
||||||
SearchStatus.Text = unison.Resources.Resources.Radio_NotFound;
|
SearchStatus.Text = unison.Resources.Resources.Radio_NotFound;
|
||||||
}
|
}
|
||||||
|
catch (Exception except)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("Error on RadioBrowser search advanced: " + except.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void FitToContent()
|
private void FitToContent()
|
||||||
{
|
{
|
||||||
@ -147,10 +167,17 @@ namespace unison
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async void Search_Clicked(object sender, RoutedEventArgs e)
|
private async void Search_Clicked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
CountryListItem a = (CountryListItem)CountryList.SelectedItem;
|
CountryListItem a = (CountryListItem)CountryList.SelectedItem;
|
||||||
await SearchAdvanced(NameSearch.Text, a?.Name, TagSearch.Text);
|
await SearchAdvanced(NameSearch.Text, a?.Name, TagSearch.Text);
|
||||||
}
|
}
|
||||||
|
catch (Exception except)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("Error on RadioBrowser search: " + except.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void Reset_Clicked(object sender, RoutedEventArgs e)
|
private void Reset_Clicked(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
|
@ -14,12 +14,10 @@
|
|||||||
<DockPanel Margin="8">
|
<DockPanel Margin="8">
|
||||||
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<emoji:EmojiInline Text="📶"/>
|
<emoji:EmojiInline Text="📶"/>
|
||||||
<Run Text="{x:Static properties:Resources.Settings_Connection}"/>
|
<Run Text="{x:Static properties:Resources.Settings_Connection}"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</StackPanel>
|
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<Grid VerticalAlignment="Top">
|
<Grid VerticalAlignment="Top">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
@ -46,13 +44,35 @@
|
|||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem Header="{x:Static properties:Resources.Stats}">
|
||||||
|
<DockPanel Margin="8">
|
||||||
|
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
||||||
|
<GroupBox.Header>
|
||||||
|
<TextBlock>
|
||||||
|
<emoji:EmojiInline Text="📊"/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats}"/>
|
||||||
|
</TextBlock>
|
||||||
|
</GroupBox.Header>
|
||||||
|
<Grid VerticalAlignment="Top">
|
||||||
|
<TextBlock>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats_Songs}"/><Run Text=" "/><Run x:Name="StatSong"/><LineBreak/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats_Albums}"/><Run Text=" "/><Run x:Name="StatAlbum"/><LineBreak/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats_Artists}"/><Run Text=" "/><Run x:Name="StatArtist"/><LineBreak/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats_TotalPlaytime}"/><Run Text=" "/><Run x:Name="StatTotalPlaytime"/><LineBreak/><LineBreak/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats_Uptime}"/><Run Text=" "/><Run x:Name="StatUptime"/><LineBreak/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats_TotalTimePlayed}"/><Run Text=" "/><Run x:Name="StatTotalTimePlayed"/><LineBreak/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Stats_LastDatabaseUpdate}"/><Run Text=" "/><Run x:Name="StatDatabaseUpdate"/>
|
||||||
|
</TextBlock>
|
||||||
|
</Grid>
|
||||||
|
</GroupBox>
|
||||||
|
</DockPanel>
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
<TabItem Header="Snapcast">
|
<TabItem Header="Snapcast">
|
||||||
<DockPanel Margin="8">
|
<DockPanel Margin="8">
|
||||||
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<emoji:TextBlock Text="🔊 Snapcast"/>
|
<emoji:TextBlock Text="🔊 Snapcast"/>
|
||||||
</StackPanel>
|
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<Grid VerticalAlignment="Top">
|
<Grid VerticalAlignment="Top">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
@ -82,17 +102,15 @@
|
|||||||
<DockPanel Margin="8">
|
<DockPanel Margin="8">
|
||||||
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<emoji:EmojiInline Text="⌨️ "/>
|
<emoji:EmojiInline Text="⌨️ "/>
|
||||||
<Run Text="{x:Static properties:Resources.Settings_Shortcuts}"></Run>
|
<Run Text="{x:Static properties:Resources.Settings_Shortcuts}"></Run>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</StackPanel>
|
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<Grid>
|
<Grid>
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeOffset}" TextWrapping="Wrap"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_VolumeOffset}" TextWrapping="Wrap" Margin="0,2,0,0"/>
|
||||||
<TextBox x:Name="VolumeOffset" TextWrapping="Wrap" Width="25" PreviewTextInput="NumberValidationTextBox" Margin="8,2,0,0"/>
|
<TextBox x:Name="VolumeOffset" TextWrapping="Wrap" Width="25" PreviewTextInput="NumberValidationTextBox" Margin="8,2,0,0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Grid MinWidth="300" Margin="0,5,0,0">
|
<Grid MinWidth="300" Margin="0,5,0,0">
|
||||||
@ -145,14 +163,14 @@
|
|||||||
</TextBlock>
|
</TextBlock>
|
||||||
<TextBlock TextWrapping="Wrap" VerticalAlignment="Top">
|
<TextBlock TextWrapping="Wrap" VerticalAlignment="Top">
|
||||||
<Run Text="{x:Static properties:Resources.Settings_AboutInfo}" /><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Settings_AboutInfo}" /><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/Difegue/Stylophone" RequestNavigate="Hyperlink_RequestNavigate">Stylophone</Hyperlink><Run Text="{x:Static properties:Resources.Settings_MpcNET}" /><LineBreak/>
|
※ <Hyperlink NavigateUri="https://github.com/Difegue/MpcNET" RequestNavigate="Hyperlink_RequestNavigate">MpcNET</Hyperlink><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/hardcodet/wpf-notifyicon" RequestNavigate="Hyperlink_RequestNavigate">wpf-notifyicon</Hyperlink><LineBreak/>
|
※ <Hyperlink NavigateUri="https://github.com/hardcodet/wpf-notifyicon" RequestNavigate="Hyperlink_RequestNavigate">wpf-notifyicon</Hyperlink><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/samhocevar/emoji.wpf" RequestNavigate="Hyperlink_RequestNavigate">Emoji.WPF</Hyperlink><LineBreak/>
|
※ <Hyperlink NavigateUri="https://github.com/samhocevar/emoji.wpf" RequestNavigate="Hyperlink_RequestNavigate">Emoji.WPF</Hyperlink><LineBreak/>
|
||||||
※ <Hyperlink NavigateUri="https://github.com/tof4/RadioBrowser" RequestNavigate="Hyperlink_RequestNavigate">RadioBrowser</Hyperlink>
|
※ <Hyperlink NavigateUri="https://github.com/tof4/RadioBrowser" RequestNavigate="Hyperlink_RequestNavigate">RadioBrowser</Hyperlink>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
<TextBlock Margin="0,10,0,0">
|
<TextBlock Margin="0,10,0,0">
|
||||||
<Run Text="{x:Static properties:Resources.Settings_SourceCode1}" />
|
<Run Text="{x:Static properties:Resources.Settings_SourceCode1}" />
|
||||||
<Hyperlink NavigateUri="https://git.n700.ovh/keb/unison" RequestNavigate="Hyperlink_RequestNavigate">
|
<Hyperlink NavigateUri="https://github.com/ZetaKebab/unison" RequestNavigate="Hyperlink_RequestNavigate">
|
||||||
<Run Text="{x:Static properties:Resources.Settings_SourceCode2}" />
|
<Run Text="{x:Static properties:Resources.Settings_SourceCode2}" />
|
||||||
</Hyperlink>.
|
</Hyperlink>.
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
@ -88,6 +88,18 @@ namespace unison
|
|||||||
SnapcastPort.Text = (string)Application.Current.FindResource("snapcastPort");
|
SnapcastPort.Text = (string)Application.Current.FindResource("snapcastPort");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateStats()
|
||||||
|
{
|
||||||
|
MPDHandler mpd = (MPDHandler)Application.Current.Properties["mpd"];
|
||||||
|
StatSong.Text = mpd.GetStats().Songs.ToString();
|
||||||
|
StatAlbum.Text = mpd.GetStats().Albums.ToString();
|
||||||
|
StatArtist.Text = mpd.GetStats().Artists.ToString();
|
||||||
|
StatTotalPlaytime.Text = mpd.GetStats().TotalPlaytime.ToString();
|
||||||
|
StatUptime.Text = mpd.GetStats().Uptime.ToString();
|
||||||
|
StatTotalTimePlayed.Text = mpd.GetStats().TotalTimePlayed.ToString();
|
||||||
|
StatDatabaseUpdate.Text = mpd.GetStats().DatabaseUpdate.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
public void SaveSettings()
|
public void SaveSettings()
|
||||||
{
|
{
|
||||||
Properties.Settings.Default.mpd_host = MpdHost.Text;
|
Properties.Settings.Default.mpd_host = MpdHost.Text;
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
snapclient_0.26.0-1_win64/snapclient.exe
Normal file
BIN
snapclient_0.26.0-1_win64/snapclient.exe
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -49,25 +49,25 @@
|
|||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\README.txt">
|
<Content Include="snapclient_0.25.0-1_win64\README.txt">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\FLAC.dll">
|
<Content Include="snapclient_0.25.0-1_win64\FLAC.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\ogg.dll">
|
<Content Include="snapclient_0.25.0-1_win64\ogg.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\opus.dll">
|
<Content Include="snapclient_0.25.0-1_win64\opus.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\snapclient.exe">
|
<Content Include="snapclient_0.25.0-1_win64\snapclient.exe">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\soxr.dll">
|
<Content Include="snapclient_0.25.0-1_win64\soxr.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="snapclient_0.25.0-1_win64\vorbis.dll">
|
<Content Include="snapclient_0.25.0-1_win64\vorbis.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
@ -75,10 +75,7 @@
|
|||||||
<PackageReference Include="Emoji.Wpf" Version="0.3.3" />
|
<PackageReference Include="Emoji.Wpf" Version="0.3.3" />
|
||||||
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
||||||
<PackageReference Include="RadioBrowser" Version="0.6.1" />
|
<PackageReference Include="RadioBrowser" Version="0.6.1" />
|
||||||
</ItemGroup>
|
<PackageReference Include="MpcNET" Version="1.3.0" />
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\MpcNET\MpcNET.csproj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -109,6 +106,27 @@
|
|||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
</None>
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\FLAC.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\ogg.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\opus.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\README.txt">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\snapclient.exe">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\soxr.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="snapclient_0.26.0-1_win64\vorbis.dll">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
11
unison.sln
11
unison.sln
@ -4,11 +4,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
VisualStudioVersion = 16.0.31515.178
|
VisualStudioVersion = 16.0.31515.178
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "unison", "unison.csproj", "{489048C4-3FCA-4573-B34C-943D03F94D04}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "unison", "unison.csproj", "{489048C4-3FCA-4573-B34C-943D03F94D04}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19} = {230556C6-5AC3-4FD8-8947-C9ABF1416D19}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MpcNET", "..\MpcNET\MpcNET.csproj", "{230556C6-5AC3-4FD8-8947-C9ABF1416D19}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -23,12 +18,6 @@ Global
|
|||||||
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release|Any CPU.Build.0 = Release|Any CPU
|
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.ActiveCfg = Release|Any CPU
|
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.Build.0 = Release|Any CPU
|
{489048C4-3FCA-4573-B34C-943D03F94D04}.Release-Stable|Any CPU.Build.0 = Release|Any CPU
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release-Stable|Any CPU.ActiveCfg = Release-Stable|Any CPU
|
|
||||||
{230556C6-5AC3-4FD8-8947-C9ABF1416D19}.Release-Stable|Any CPU.Build.0 = Release-Stable|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
Reference in New Issue
Block a user