Implement desktop tray interface with media controls and QR pairing; add related tests
This commit is contained in:
+24
-3
@@ -3,6 +3,7 @@ using System.Net.Sockets;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using MusicBridge.Agent;
|
||||
using MusicBridge.Agent.Desktop;
|
||||
using MusicBridge.Agent.Media;
|
||||
using MusicBridge.Agent.Network;
|
||||
using Windows.Media.Control;
|
||||
@@ -10,15 +11,17 @@ using Windows.Media.Control;
|
||||
Console.OutputEncoding = Encoding.UTF8;
|
||||
Console.Title = "MusicBridge Agent";
|
||||
var lan = false;
|
||||
var tray = false;
|
||||
var port = 8765;
|
||||
for (var i = 0; i < args.Length; i++)
|
||||
{
|
||||
if (args[i] == "--lan") lan = true;
|
||||
else if (args[i] == "--tray") tray = true;
|
||||
else if (args[i] == "--port" && i + 1 < args.Length && int.TryParse(args[++i], out var parsed) && parsed is > 0 and <= 65535)
|
||||
port = parsed;
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Запуск: dotnet run -- [--lan] [--port 8765]");
|
||||
Console.WriteLine("Запуск: dotnet run -- [--tray] [--lan] [--port 8765]");
|
||||
Console.WriteLine("Без --lan соединения разрешены только с этого ПК. Веб-интерфейса нет.");
|
||||
return;
|
||||
}
|
||||
@@ -43,12 +46,20 @@ try
|
||||
Uri[] qrEndpoints = [];
|
||||
using var mdns = new MdnsPublisher(fingerprint, port);
|
||||
using var qrWindow = new PairingWindowHost(pairing, fingerprint, () => Volatile.Read(ref qrEndpoints));
|
||||
string networkStatus = lan ? "Подключение к домашней сети…" : "Локальный режим. Для iPhone запусти с --lan.";
|
||||
using var desktop = tray ? new DesktopHost(() => server.Latest, media, pairing,
|
||||
() => Volatile.Read(ref networkStatus), qrWindow.Open, shutdown.Cancel) : null;
|
||||
if (desktop is not null)
|
||||
{
|
||||
await desktop.StartAsync();
|
||||
DesktopHost.FreeConsole();
|
||||
}
|
||||
var message = "Готов к управлению.";
|
||||
IReadOnlyList<TrustedDevice> displayedDevices = [];
|
||||
var nextRefresh = DateTimeOffset.MinValue;
|
||||
while (!shutdown.IsCancellationRequested)
|
||||
{
|
||||
if (!Console.IsInputRedirected && Console.KeyAvailable)
|
||||
if (!tray && !Console.IsInputRedirected && Console.KeyAvailable)
|
||||
{
|
||||
var key = Console.ReadKey(intercept: true).Key;
|
||||
if (key == ConsoleKey.Q) break;
|
||||
@@ -105,14 +116,22 @@ try
|
||||
addresses = new List<string> { $"https://127.0.0.1:{port}" };
|
||||
addresses.AddRange(qrEndpoints.Select(u => u.GetLeftPart(UriPartial.Authority)));
|
||||
mdns.Refresh(ips);
|
||||
Volatile.Write(ref networkStatus, string.Join(" | ", qrEndpoints.Select(u => u.GetLeftPart(UriPartial.Authority))) + "\n" + mdns.Status);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Volatile.Write(ref qrEndpoints, []);
|
||||
mdns.Refresh([]);
|
||||
message = $"Не удалось обновить адреса: {ex.Message}";
|
||||
Volatile.Write(ref networkStatus, message);
|
||||
}
|
||||
}
|
||||
if (tray)
|
||||
{
|
||||
nextRefresh = DateTimeOffset.UtcNow.AddSeconds(1);
|
||||
await Task.Delay(50, shutdown.Token);
|
||||
continue;
|
||||
}
|
||||
if (!Console.IsOutputRedirected) Console.Clear();
|
||||
var state = server.Latest;
|
||||
Console.WriteLine("MUSICBRIDGE\n");
|
||||
@@ -154,7 +173,9 @@ try
|
||||
catch (OperationCanceledException) when (shutdown.IsCancellationRequested) { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.Error.WriteLine($"Не удалось запустить или продолжить работу агента: {ex.Message}");
|
||||
var error = $"Не удалось запустить или продолжить работу агента: {ex.Message}";
|
||||
if (tray) MessageBox.Show(error, "MusicBridge", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
else Console.Error.WriteLine(error);
|
||||
Environment.ExitCode = 1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user