diff --git a/app/src/main/java/dev/castarr/tv/data/DispatcharrRepository.kt b/app/src/main/java/dev/castarr/tv/data/DispatcharrRepository.kt index 3702691..63ab6e5 100644 --- a/app/src/main/java/dev/castarr/tv/data/DispatcharrRepository.kt +++ b/app/src/main/java/dev/castarr/tv/data/DispatcharrRepository.kt @@ -78,14 +78,15 @@ class DispatcharrRepository(private val auth: DeviceAuth) { } } - private fun streamUrl(id: Int): String { - val base = "${auth.serverUrl}/proxy/ts/stream/$id" + // The live proxy resolves channels by UUID (integer ids 404). + private fun streamUrl(uuid: String): String { + val base = "${auth.serverUrl}/proxy/ts/stream/$uuid" return if (outputProfile.isNotEmpty()) "$base?output_profile=$outputProfile" else base } /** Re-derive stream URLs (e.g. after the output profile changed). */ fun rebuildStreamUrls() { - channels.value = channels.value.map { it.copy(url = streamUrl(it.backendId)) } + channels.value = channels.value.map { it.copy(url = streamUrl(it.streamKey)) } } private suspend fun fetchGroups(token: String): Map { @@ -107,14 +108,17 @@ class DispatcharrRepository(private val auth: DeviceAuth) { for (i in 0 until results.length()) { val obj = results.getJSONObject(i) val id = obj.getInt("id") + val uuid = obj.optString("uuid") + if (uuid.isEmpty() || obj.optBoolean("hidden_from_output")) continue list.add( Channel( - name = obj.optString("name"), - url = streamUrl(id), + name = obj.optString("effective_name").ifEmpty { obj.optString("name") }, + url = streamUrl(uuid), group = groups[obj.optInt("channel_group_id")].orEmpty(), logo = "", - tvgId = obj.optString("tvg_id"), + tvgId = obj.optString("effective_tvg_id").ifEmpty { obj.optString("tvg_id") }, backendId = id, + streamKey = uuid, ) ) } diff --git a/app/src/main/java/dev/castarr/tv/playlist/Channel.kt b/app/src/main/java/dev/castarr/tv/playlist/Channel.kt index 3392a23..ef7b478 100644 --- a/app/src/main/java/dev/castarr/tv/playlist/Channel.kt +++ b/app/src/main/java/dev/castarr/tv/playlist/Channel.kt @@ -10,6 +10,7 @@ data class Channel( val logo: String, val tvgId: String = "", val backendId: Int = 0, + val streamKey: String = "", ) { fun toJson(): JSONObject = JSONObject() .put("name", name) @@ -18,6 +19,7 @@ data class Channel( .put("logo", logo) .put("tvgId", tvgId) .put("backendId", backendId) + .put("streamKey", streamKey) companion object { fun fromJson(obj: JSONObject): Channel = Channel( @@ -27,6 +29,7 @@ data class Channel( logo = obj.optString("logo"), tvgId = obj.optString("tvgId"), backendId = obj.optInt("backendId"), + streamKey = obj.optString("streamKey"), ) fun listToJson(channels: List): JSONArray {