Merge branch 'main' into shuffle

This commit is contained in:
Théo Marchal 2021-10-05 19:20:00 +02:00
commit 3685c369b4
7 changed files with 204 additions and 16 deletions

View File

@ -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,6 +47,7 @@ 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;
@ -58,6 +70,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;
@ -417,6 +431,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 +494,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");
}
} }
} }

View File

@ -501,6 +501,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>

View File

@ -264,6 +264,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>

View File

@ -264,6 +264,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>

View File

@ -137,6 +137,9 @@ namespace unison
DefaultState(); DefaultState();
} }
} }
_mpd.QueryStats();
_settingsWin.UpdateStats();
} }
private void DefaultState(bool LostConnection = false) private void DefaultState(bool LostConnection = false)

View File

@ -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">

View File

@ -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;