        } catch (Exception e) {
            return "";
        }
    }

    private int calcularProgreso(String ini, String fin) {
        try {
            long s = Long.parseLong(ini.trim());
            long e = Long.parseLong(fin.trim());
            long n = System.currentTimeMillis() / 1000;

            if (s <= 0 || e <= 0 || e <= s) return 0;
            if (n <= s) return 0;
            if (n >= e) return 100;

            return (int)Math.max(0, Math.min(100, ((n - s) * 100) / (e - s)));
        } catch(Exception e) {
            return 0;
        }
    }

    private String minutosRestantes(String fin) {
        try {
            long e = Long.parseLong(fin.trim());
            long n = System.currentTimeMillis() / 1000;

            if (e <= 0 || e <= n) return "";

            long m = (e - n) / 60;
            if (m <= 0) return "";

            return m + " min";
        } catch(Exception e) {
            return "";
        }
    }

    private void cargarLogo(String logoUrl) {
        if (logoUrl == null || !logoUrl.startsWith("http")) return;

        new Thread(() -> {
            try {
                InputStream in = new URL(logoUrl).openStream();
                Bitmap bmp = BitmapFactory.decodeStream(in);
                runOnUiThread(() -> logoView.setImageBitmap(bmp));
            } catch (Exception ignored) {}
        }).start();
    }

    private void playUrl(String playUrl) {
        DefaultHttpDataSource.Factory httpFactory = new DefaultHttpDataSource.Factory()
                .setAllowCrossProtocolRedirects(true)
                .setConnectTimeoutMs(12000)
                .setReadTimeoutMs(12000)
                .setUserAgent("Mozilla/5.0 Android TV PuntozPro");

        MediaItem item = new MediaItem.Builder().setUri(Uri.parse(playUrl)).build();
        String lower = playUrl.toLowerCase();

        if (lower.contains(".m3u8")) {
            player.setMediaSource(new HlsMediaSource.Factory(httpFactory).createMediaSource(item));
        } else {
            player.setMediaSource(new ProgressiveMediaSource.Factory(httpFactory).createMediaSource(item));
        }

        player.prepare();
        player.play();
    }

    private void mostrarOSD() {
        osdBox.setVisibility(View.VISIBLE);
        handler.removeCallbacksAndMessages(null);
        handler.postDelayed(() -> osdBox.setVisibility(View.GONE), 10000);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            int key = event.getKeyCode();

            if (key == KeyEvent.KEYCODE_DPAD_CENTER || key == KeyEvent.KEYCODE_ENTER) {
                mostrarOSD();
                return true;
            }
        }

        return super.dispatchKeyEvent(event);
    }

    @Override
    protected void onDestroy() {
        try { if (epgTicker != null) handler.removeCallbacks(epgTicker); } catch (Exception ignored) {}
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
        if (player != null) {
            player.release();
            player = null;
        }
    }
}
