diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerController.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerController.kt index 76ee9b9b..1f6a178b 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerController.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerController.kt @@ -178,13 +178,28 @@ class OutputPickerController @Inject constructor( * deserialize / SOAP-parse code paths). */ private suspend fun selectUpnp(route: OutputRoute) { - val trackId = playerController.uiState.value.currentTrack?.id ?: return - val transport = upnpDiscovery.transportFor(route.id) ?: return + val trackId = playerController.uiState.value.currentTrack?.id + if (trackId == null) { + Timber.w("UPnP select skipped: no currentTrack (start playback first)") + return + } + val transport = upnpDiscovery.transportFor(route.id) + if (transport == null) { + Timber.w( + "UPnP select skipped: no transport for route id=${route.id} " + + "(route disappeared or id mismatch with discovery list)", + ) + return + } runCatching { + Timber.i("UPnP select: mint token for track=$trackId, route=${route.name}") val token = castApi.streamToken(StreamTokenRequest(trackId = trackId)) + Timber.i("UPnP select: SetAVTransportURI to ${token.url}") transport.setAVTransportURI(token.url) + Timber.i("UPnP select: Play") transport.play() playerController.pause() + Timber.i("UPnP select: done") }.onFailure { e -> Timber.w(e, "UPnP select failed for route ${route.id}") }