private DeviceDiscoveryReportItem ParseServiceAnnouncement(ServiceAnnouncement announcement) { IPAddress localInterface = IPAddress.Any; // Retrieve local interface address // TODO: This will need some IPv6 love at some point if (announcement.NetworkInterface.Information.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) { var ipv4Addresses = announcement.NetworkInterface.Information.GetIPProperties().UnicastAddresses.Where((ad) => ad.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork); localInterface = ipv4Addresses.FirstOrDefault().Address; } // Retrieve version string var versionTempString = announcement.Txt.Where((kvp) => kvp.Contains("ve=")).FirstOrDefault(); int versionNumber = 2; if (string.IsNullOrEmpty(versionTempString) == false) { versionNumber = int.Parse(versionTempString.Split('=')[1]); } // Retrieve device ID var idTempString = announcement.Txt.Where((kvp) => kvp.Contains("id=")).FirstOrDefault(); string Id = ""; if (string.IsNullOrEmpty(idTempString) == false) { Id = idTempString.Split('=')[1]; } else { // Log.Error(string.Format("Unable to get ID of device {0}", e.Announcement.Hostname)); return null; } // Optional: Verify that it's a Chromecast device var tempDeviceType = announcement.Txt.Where((kvp) => kvp.Contains("md=")).FirstOrDefault(); var deviceType = DeviceType.Generic; if (string.IsNullOrEmpty(tempDeviceType) == false && tempDeviceType.Split('=')[1] == "Chromecast") { deviceType = DeviceType.Chromecast; } else { deviceType = DeviceType.Generic; } // Build baseUrl // This might not be right as there URI scheme could be something else. var scheme = "http"; var address = announcement.Addresses.First(); var port = announcement.Port; var uri = new Uri(string.Format("{0}://{1}:{2}", scheme, address, port)); var report = new ChromecastV2DeviceDiscoveryReportItem() { DeviceType = deviceType, Version = versionNumber, Id = Id, Name = announcement.Hostname, EndPoint = new IPEndPoint(announcement.Addresses.First(), announcement.Port), Interface = localInterface, BaseUri = uri, }; return report; }