private async Task <bool> TryGetCredentialsFromUser(SonosMusicApiDevice device, Auth auth) { if (auth != Auth.DeviceLink) { return(false); } var householdId = await ZoneService.GetHouseholdId(); var deviceLink = await device.MusicApiService.GetDeviceLinkCode(householdId); if (deviceLink == null) { return(false); } var shouldPoll = true; MessageBus.Send(new DeviceAuthTokenNeededEventArgs(true, deviceLink.Url)); MessageBus.Register <DeviceAuthTokenNeededEventArgs>(this, e => shouldPoll = e.IsNeeded); DeviceAuthToken deviceAuthToken; do { await Task.Delay(2000); // poll every 2nd second deviceAuthToken = await device.MusicApiService.GetDeviceAuthToken(householdId, deviceLink.LinkCode); } while (deviceAuthToken == null && shouldPoll); MessageBus.Unregister <DeviceAuthTokenNeededEventArgs>(this); MessageBus.Send(new DeviceAuthTokenNeededEventArgs(false, "")); return(deviceAuthToken != null); }
public async Task <List <MusicServiceContainer> > GetAvailableMusicServices() { if (_musicServices != null) { return(_musicServices); } var activeAccounts = await GetActiveServiceAccounts(); var logos = await GetServiceLogos(); var actionResult = await _zoneService.GetAvailableServices(); var availableServiceDescriptorList = actionResult.Result.Element(XName.Get("AvailableServiceDescriptorList")); if (availableServiceDescriptorList != null) { _serviceList = XElement.Parse(availableServiceDescriptorList.Value); } var query = (from service in _serviceList.Elements() from logo in logos let serviceName = service.GetName() where string.Compare(logo.Name, serviceName, StringComparison.CurrentCultureIgnoreCase) == 0 select new MusicServiceContainer(service, logo.ImageUri, logo.Id, "root")).ToList(); var radio = _serviceList.Elements().FirstOrDefault(x => x.GetName() == "TuneIn"); if (radio != null) { var tuneIn = new MusicServiceContainer(radio, "/Assets/tunein-logo.jpg", radio.TryGetAttributeValue("Id"), "root"); tuneIn.SetTitle("Radio"); tuneIn.SetClassId("Radio"); query.Add(tuneIn); } _musicServices = activeAccounts .Select(musicServiceAccount => query.FirstOrDefault(x => x.ServiceId == musicServiceAccount.ServiceId)) .Where(service => service != null) .OrderBy(x => x.Title) .ToList(); var deviceId = _zoneService.CoordinatorDeviceId; foreach (var serviceModel in _musicServices) { var device = new SonosMusicApiDevice(this, deviceId, serviceModel, new Uri(serviceModel.Uri), _zoneService); Apis.Add(device); } return(_musicServices); }