diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/AVTransportClient.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/AVTransportClient.kt index fba29910..89c06644 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/AVTransportClient.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/AVTransportClient.kt @@ -184,11 +184,13 @@ class AVTransportClient( } private fun parseHhMmSs(raw: String): Long { - if (raw.isBlank()) return 0L val parts = raw.split(':').mapNotNull { it.trim().toLongOrNull() } - if (parts.size != 3) return 0L - val (h, m, s) = parts - return ((h * SECONDS_PER_HOUR) + (m * SECONDS_PER_MINUTE) + s) * MILLIS_PER_SECOND + return if (parts.size == EXPECTED_HMS_PARTS) { + val (h, m, s) = parts + ((h * SECONDS_PER_HOUR) + (m * SECONDS_PER_MINUTE) + s) * MILLIS_PER_SECOND + } else { + 0L + } } private companion object { @@ -196,6 +198,7 @@ class AVTransportClient( const val MILLIS_PER_SECOND = 1000L const val SECONDS_PER_MINUTE = 60L const val SECONDS_PER_HOUR = 3600L + const val EXPECTED_HMS_PARTS = 3 } } diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/SoapClient.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/SoapClient.kt index 938f2ef4..31365683 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/SoapClient.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/output/upnp/SoapClient.kt @@ -127,33 +127,41 @@ class SoapClient( private fun readUntilEndTag(parser: XmlPullParser, tagName: String): String { val sb = StringBuilder() var depth = 1 - while (depth > 0) { + var done = false + while (!done && depth > 0) { when (parser.next()) { XmlPullParser.START_TAG -> { - sb.append('<').append(parser.name) - for (i in 0 until parser.attributeCount) { - sb.append(' ') - .append(parser.getAttributeName(i)) - .append("=\"") - .append(parser.getAttributeValue(i)) - .append('"') - } - sb.append('>') + appendStartTag(sb, parser) depth += 1 } XmlPullParser.END_TAG -> { depth -= 1 - if (depth == 0 && parser.name == tagName) break - sb.append("') + if (depth == 0 && parser.name == tagName) { + done = true + } else { + sb.append("') + } } XmlPullParser.TEXT -> sb.append(parser.text.orEmpty()) - XmlPullParser.END_DOCUMENT -> break + XmlPullParser.END_DOCUMENT -> done = true else -> Unit } } return sb.toString() } + private fun appendStartTag(sb: StringBuilder, parser: XmlPullParser) { + sb.append('<').append(parser.name) + for (i in 0 until parser.attributeCount) { + sb.append(' ') + .append(parser.getAttributeName(i)) + .append("=\"") + .append(parser.getAttributeValue(i)) + .append('"') + } + sb.append('>') + } + private fun faultCodeOf(body: String): String = extractBetween(body, "", "") ?: "unknown"