using Rssdp; using static TheXamlGuy.Media.Capture.SonyMediaFrameSourceDescriptor; namespace TheXamlGuy.Media.Capture; public class RemoteMediaFrameSource : IRemoteMediaFrameSource, IRemoteMediaFrameReaderFactory { private static readonly Dictionary>> supportedDeviceSchemas = new() { { "urn:schemas-sony-com:service:ScalarWebAPI:1", async args => (await CreateAsync(args))! } }; internal RemoteMediaFrameSource(string id, string displayName, Func factory) { Info = new MediaFrameSourceInfo(id); DisplayName = displayName; Factory = factory; } public string DisplayName { get; } public MediaFrameSourceInfo Info { get; } public Func Factory { get; } public static async Task> FindAllAsync() { List result = new(); using (SsdpDeviceLocator deviceLocator = new()) { IEnumerable foundDevices = await deviceLocator.SearchAsync(); foreach (DiscoveredSsdpDevice foundDevice in foundDevices) { if (supportedDeviceSchemas.TryGetValue(foundDevice.NotificationType, out Func>? factory)) { if (await factory.Invoke(foundDevice.DescriptionLocation) is IRemoteMediaFrameSourceDescriptor descriptor) { result.Add(new RemoteMediaFrameSource(descriptor.Id, descriptor.DisplayName, descriptor.FrameReaderFactory)); } } } } return await Task.FromResult(result); } }