renato97 73a4f81341 Update v9.3.1: Enhanced UX and Environment Configuration
- Incremented version to 9.3.1 (versionCode: 93100)
- Added copy token button in blocked dialog for better UX
- Fixed environment variable configuration for Telegram integration
- Improved clipboard functionality for token sharing
- Enhanced dashboard environment handling with dotenv
- Corrected variable names for Telegram configuration
- Improved error handling for token copy operations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 22:18:31 +01:00

📺 StreamPlayer

Android Java API License

Aplicación Android reproductora de streaming con optimización DNS para mejor rendimiento y acceso a contenido multimedia.

🌟 Características

  • ▶️ Reproducción Streaming: Reproductor de video streaming optimizado con ExoPlayer
  • 🌐 Optimización DNS: Configuración automática de DNS de Google (8.8.8.8, 8.8.4.4) para mejor conectividad
  • 🔍 Resolución de URL: Sistema avanzado que resuelve URLs ofuscadas de streaming
  • 📱 Orientación Landscape: Diseño optimizado para experiencia multimedia inmersiva
  • Alto Rendimiento: Implementación asíncrona para respuesta rápida
  • 🛡️ Manejo de Errores: Sistema robusto de gestión de errores y estados

📋 Requisitos

  • Android SDK: API 21 (Android 5.0) o superior
  • Target SDK: API 33 (Android 13)
  • Permisos:
    • INTERNET - Acceso a streaming
    • ACCESS_NETWORK_STATE - Verificación de conectividad
    • CHANGE_NETWORK_STATE - Configuración de red

🏗️ Arquitectura

Componentes Principales

  • MainActivity.java (/app/src/main/java/com/streamplayer/MainActivity.java)

    • Gestión del ciclo de vida del reproductor
    • Configuración de ExoPlayer
    • Manejo de estados (loading, error, reproducción)
  • StreamUrlResolver.java (/app/src/main/java/com/streamplayer/StreamUrlResolver.java)

    • Resolución de URLs ofuscadas
    • Decodificación Base64
    • Extracción de claves de JavaScript
  • DNSSetter.java (/app/src/main/java/com/streamplayer/DNSSetter.java)

    • Configuración de DNS de Google
    • Optimización de red para streaming
    • Pre-resolución de dominios

🚀 Instalación y Build

Prerequisites

# Android SDK
# Java 8+
# Gradle 8.2+

Build con Gradle

# Clone el repositorio
git clone https://gitea.cbcren.online/renato97/app.git
cd app

# Build APK debug
./gradlew assembleDebug

# Build APK release
./gradlew assembleRelease

Build con Docker

# Construir imagen
docker build -t streamplayer .

# Ejecutar build
docker run --rm -v $(pwd)/output:/output streamplayer

Build Script Alternativo

# Usar script de build
chmod +x build_apk.sh
./build_apk.sh

🔄 Control de Instalaciones y Actualizaciones

StreamPlayer ahora consulta automáticamente las releases públicas del repositorio Gitea y puede forzar o sugerir actualizaciones directamente desde la app. Para aprovecharlo:

  1. Ejecuta un build nuevo incrementando versionCode/versionName en app/build.gradle.
  2. Crea una release en Gitea asignando un tag como v9.1 y sube el APK.
  3. Adjunta un archivo update-manifest.json en la misma release (puedes partir de release/update-manifest.example.json).

Formato de update-manifest.json

{
  "versionCode": 91000,
  "versionName": "9.1.0",
  "minSupportedVersionCode": 90000,
  "forceUpdate": false,
  "downloadUrl": "https://gitea.cbcren.online/renato97/app/releases/download/v9.1/StreamPlayer-v9.1.apk",
  "fileName": "StreamPlayer-v9.1.apk",
  "sizeBytes": 12345678,
  "notes": "Novedades destacadas que aparecerán en el diálogo dentro de la app"
}
  • versionCode / versionName: deben coincidir con el APK publicado.
  • minSupportedVersionCode: define desde qué versión mínima se permite seguir usando la app (ideal para bloquear instalaciones antiguas).
  • forceUpdate: si es true la app mostrará un diálogo sin opción de omitir.
  • downloadUrl / fileName: apuntan al asset .apk publicado en Gitea (puede ser el enlace de descarga directo).
  • notes: texto libre mostrado en el diálogo dentro de la app; si lo omitís se usará el cuerpo de la release.

Si por algún motivo olvidas subir el manifiesto, la app igualmente tomará el primer asset .apk de la release, pero no podrá forzar versiones mínimas.

Dashboard de Dispositivos y Bloqueo Remoto

Para saber en qué equipo está instalada la app y bloquear el acceso cuando lo necesites, se incluye un dashboard liviano en dashboard/:

  1. Instala dependencias y ejecuta el servidor:
cd dashboard
npm install
npm start # escucha en http://localhost:4000
  1. Copia dashboard/config.example.json a dashboard/config.json y completa telegramBotToken + telegramChatId (o usa variables de entorno TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID).
  2. Ajusta DEVICE_REGISTRY_URL en app/build.gradle para apuntar al dominio/puerto donde despliegues el servidor (ya configurado como http://194.163.191.200:4000).
  3. Distribuye el APK; cada instalación reportará ANDROID_ID, modelo, IP pública y país.
  4. Entra a http://TU_HOST:4000/ para ver el listado, asignar alias, bloquear/desbloquear o validar tokens.

El servidor guarda los datos en dashboard/data/devices.json, por lo que puedes versionarlo o respaldarlo fácilmente. Cada registro almacena:

  • deviceId: Settings.Secure.ANDROID_ID del equipo
  • deviceName, manufacturer, model, osVersion
  • appVersionName/Code
  • ip, country detectados automáticamente
  • firstSeen, lastSeen, blocked, notes, verification.status

Cuando presionas “Bloquear”, la app recibe la respuesta {"blocked": true} y muestra un diálogo irreversible hasta que lo habilites. Esto añade una capa adicional de control aparte del sistema de actualizaciones.

Flujo dentro de la app y tokens divididos

  • Cada vez que se abre MainActivity se consulta https://gitea.cbcren.online/api/v1/repos/renato97/app/releases/latest.
  • Si versionCode del servidor es mayor al instalado se muestra un diálogo para actualizar; el usuario puede abrir la release o descargarla directamente.
  • Si minSupportedVersionCode es mayor al instalado la app bloqueará el uso hasta actualizar, cumpliendo con el requerimiento de controlar instalaciones.
  • La descarga se gestiona con DownloadManager y, una vez completada, se lanza el instalador usando FileProvider.
  • Mientras el dashboard mantenga un dispositivo "Pendiente" o "Bloqueado", la app muestra un diálogo con el motivo y la mitad del token que debe compartir la persona.

Cada instalación genera un token interno dividido en dos:

  1. Parte cliente: se muestra en el diálogo del dispositivo bloqueado para que el usuario pueda copiarla.
  2. Parte admin: llega al bot de Telegram configurado junto con la IP, país y datos del dispositivo.

Para autorizar un dispositivo pendiente:

  1. Obtén la parte cliente desde el usuario (visible en pantalla).
  2. Copia la parte admin del mensaje de Telegram.
  3. En el dashboard presiona “Verificar token” e introduce ambas mitades. Si coinciden, el estado pasa a "Verificado" y la app se desbloquea automáticamente.
  4. A partir de allí puedes bloquear/desbloquear manualmente cuando quieras.

Cada nuevo registro también dispara una notificación de Telegram para que puedas reaccionar en tiempo real.

📱 Estructura del Proyecto

app/
├── src/main/
│   ├── java/com/streamplayer/
│   │   ├── MainActivity.java          # Actividad principal
│   │   ├── StreamUrlResolver.java     # Resolvedor de URLs
│   │   └── DNSSetter.java            # Configuración DNS
│   ├── res/
│   │   ├── layout/
│   │   │   └── activity_main.xml     # UI principal
│   │   ├── mipmap-*/                 # Íconos de la app
│   │   ├── values/
│   │   │   ├── strings.xml          # Cadenas de texto
│   │   │   ├── colors.xml           # Colores
│   │   │   └── themes.xml           # Temas
│   │   └── xml/                     # Configuraciones
│   └── AndroidManifest.xml          # Manifiesto Android
├── build.gradle                     # Configuración Gradle
└── proguard-rules.pro              # Reglas ProGuard

⚙️ Configuración

URL de Streaming

La aplicación está configurada por defecto para:

https://streamtpmedia.com/global2.php?stream=espn

Configuración DNS

// DNS configurados automáticamente
String[] GOOGLE_DNS = {"8.8.8.8", "8.8.4.4"};

🔧 Dependencias Principales

  • ExoPlayer 2.18.7: Motor de reproducción multimedia
  • AndroidX AppCompat 1.6.1: Compatibilidad hacia atrás
  • ConstraintLayout 2.1.4: Layout moderno y flexible

🛠️ Desarrollo

Flujo de Reproducción

  1. MainActivity inicializa y configura DNS de Google
  2. StreamUrlResolver obtiene y decodifica la URL real del stream
  3. ExoPlayer inicia la reproducción con la URL resuelta
  4. UI actualiza estados (loading, playing, error)

Características Técnicas

  • Threading: Operaciones de red en background thread
  • Memory Management: Proper lifecycle management de ExoPlayer
  • Error Handling: Captura y display de errores al usuario
  • Network Optimization: Configuración DNS específica para streaming

📊 Build Configuration

Atributo Valor
applicationId com.streamplayer
minSdk 21
targetSdk 33
versionCode 90000
versionName "9.0.0"
compileSdk 33

🔐 Permisos y Seguridad

La aplicación requiere los siguientes permisos:

  • INTERNET - Para streaming de contenido
  • ACCESS_NETWORK_STATE - Para verificar conectividad
  • CHANGE_NETWORK_STATE - Para optimización de red

🐛 Troubleshooting

Problemas Comunes

Error de Conexión

  • Verificar conexión a internet
  • Confirmar configuración DNS
  • Revisar disponibilidad del servicio de streaming

Error de Reproducción

  • Validar formato de URL
  • Verificar permisos de red
  • Revisar logs de ExoPlayer

Build Fail

# Limpiar proyecto
./gradlew clean

# Rebuild
./gradlew build

📝 Logs y Debug

La aplicación incluye console logging para:

  • Configuración DNS
  • Resolución de URLs
  • Estados del reproductor
  • Errores de red

🤝 Contribución

  1. Fork del repositorio
  2. Feature branch (git checkout -b feature/NuevaCaracteristica)
  3. Commit cambios (git commit -m 'Add feature')
  4. Push al branch (git push origin feature/NuevaCaracteristica)
  5. Pull Request

📄 Licencia

Este proyecto está licenciado bajo la Licencia MIT - ver archivo LICENSE para detalles.

👨‍💻 Autor

renato97 - Gitea Profile


⚠️ Disclaimer: Esta aplicación es para fines educativos y de demostración. El usuario es responsable de cumplir con los términos de servicio de las plataformas de streaming utilizadas.

📞 Soporte

Para soporte y preguntas:

  • 📧 Crear un issue en el repositorio
  • 💬 Comentarios en el código
  • 📱 Testing en dispositivos reales recomendado

🔗 Repositorio: https://gitea.cbcren.online/renato97/app

Description
🔒 Repositorio Privado - Acceso Restringido
Readme 130 MiB
v9.4.6 Latest
2025-11-25 20:23:17 +01:00
Languages
Java 67.8%
JavaScript 15.7%
Shell 9%
Python 2.4%
Batchfile 2.2%
Other 2.9%