From bac564eb4ff779432174a985c30367cc6395d22b Mon Sep 17 00:00:00 2001 From: renato97 Date: Mon, 26 Jan 2026 21:44:07 +0100 Subject: [PATCH] Fix: Crash on HTML response in EventRepository and others - Fixed: Value parseEvents(String json) throws JSONException { + if (json == null || json.trim().isEmpty()) { + throw new JSONException("La respuesta está vacía"); + } + + // Validar que no sea HTML antes de parsear + String trimmed = json.trim(); + if (trimmed.startsWith(" events = new ArrayList<>(); for (int i = 0; i < array.length(); i++) { diff --git a/app/src/main/java/com/streamplayer/PlayerActivity.java b/app/src/main/java/com/streamplayer/PlayerActivity.java index dc60596..88da3e0 100644 --- a/app/src/main/java/com/streamplayer/PlayerActivity.java +++ b/app/src/main/java/com/streamplayer/PlayerActivity.java @@ -22,6 +22,7 @@ import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.util.Util; +import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; @@ -100,8 +101,10 @@ public class PlayerActivity extends AppCompatActivity { try { String resolvedUrl = StreamUrlResolver.resolve(channelUrl); runOnUiThread(() -> startPlayback(resolvedUrl)); + } catch (IOException e) { + runOnUiThread(() -> showError("No se pudo conectar con el canal: " + e.getMessage())); } catch (Exception e) { - runOnUiThread(() -> showError("Error al obtener stream: " + e.getMessage())); + runOnUiThread(() -> showError("Error inesperado: " + e.getMessage())); } }).start(); } diff --git a/app/src/main/java/com/streamplayer/StreamUrlResolver.java b/app/src/main/java/com/streamplayer/StreamUrlResolver.java index 203f839..7c9f5e8 100644 --- a/app/src/main/java/com/streamplayer/StreamUrlResolver.java +++ b/app/src/main/java/com/streamplayer/StreamUrlResolver.java @@ -61,15 +61,32 @@ public final class StreamUrlResolver { connection.setReadTimeout(15000); connection.setRequestProperty("User-Agent", USER_AGENT); connection.setRequestProperty("Accept", "text/html,application/xhtml+xml"); - connection.connect(); - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { - StringBuilder builder = new StringBuilder(); - String line; - while ((line = reader.readLine()) != null) { - builder.append(line); + + try { + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + throw new IOException("Error HTTP " + responseCode + " al cargar la página del stream"); + } + + String contentType = connection.getContentType(); + // Validar que sea contenido web (HTML) + if (contentType != null && !contentType.contains("html") && !contentType.contains("text")) { + // A veces puede venir sin content type o application/octet-stream, + // pero si es explícitamente una imagen o algo así, abortamos. + if (contentType.startsWith("image/") || contentType.startsWith("video/") || contentType.startsWith("audio/")) { + throw new IOException("El servidor devolvió " + contentType + " en lugar de HTML"); + } + } + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder builder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + builder.append(line); + } + return builder.toString(); } - return builder.toString(); } finally { connection.disconnect(); } diff --git a/app/src/main/java/com/streamplayer/UpdateManager.java b/app/src/main/java/com/streamplayer/UpdateManager.java index 71043e6..09832dd 100644 --- a/app/src/main/java/com/streamplayer/UpdateManager.java +++ b/app/src/main/java/com/streamplayer/UpdateManager.java @@ -172,6 +172,16 @@ public class UpdateManager { } private UpdateInfo parseRelease(String responseBody) throws JSONException, IOException { + if (responseBody == null || responseBody.trim().isEmpty()) { + throw new JSONException("La respuesta está vacía"); + } + + // Validar que no sea HTML antes de parsear + String trimmed = responseBody.trim(); + if (trimmed.startsWith("