- 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>
📺 StreamPlayer
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 streamingACCESS_NETWORK_STATE- Verificación de conectividadCHANGE_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:
- Ejecuta un build nuevo incrementando
versionCode/versionNameenapp/build.gradle. - Crea una release en Gitea asignando un tag como
v9.1y sube el APK. - Adjunta un archivo
update-manifest.jsonen la misma release (puedes partir derelease/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 estruela app mostrará un diálogo sin opción de omitir.downloadUrl/fileName: apuntan al asset.apkpublicado 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/:
- Instala dependencias y ejecuta el servidor:
cd dashboard
npm install
npm start # escucha en http://localhost:4000
- Copia
dashboard/config.example.jsonadashboard/config.jsony completatelegramBotToken+telegramChatId(o usa variables de entornoTELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID). - Ajusta
DEVICE_REGISTRY_URLenapp/build.gradlepara apuntar al dominio/puerto donde despliegues el servidor (ya configurado comohttp://194.163.191.200:4000). - Distribuye el APK; cada instalación reportará
ANDROID_ID, modelo, IP pública y país. - 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_IDdel equipodeviceName,manufacturer,model,osVersionappVersionName/Codeip,countrydetectados automáticamentefirstSeen,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
MainActivityse consultahttps://gitea.cbcren.online/api/v1/repos/renato97/app/releases/latest. - Si
versionCodedel servidor es mayor al instalado se muestra un diálogo para actualizar; el usuario puede abrir la release o descargarla directamente. - Si
minSupportedVersionCodees mayor al instalado la app bloqueará el uso hasta actualizar, cumpliendo con el requerimiento de controlar instalaciones. - La descarga se gestiona con
DownloadManagery, 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:
- Parte cliente: se muestra en el diálogo del dispositivo bloqueado para que el usuario pueda copiarla.
- Parte admin: llega al bot de Telegram configurado junto con la IP, país y datos del dispositivo.
Para autorizar un dispositivo pendiente:
- Obtén la parte cliente desde el usuario (visible en pantalla).
- Copia la parte admin del mensaje de Telegram.
- En el dashboard presiona “Verificar token” e introduce ambas mitades. Si coinciden, el estado pasa a "Verificado" y la app se desbloquea automáticamente.
- 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
- MainActivity inicializa y configura DNS de Google
- StreamUrlResolver obtiene y decodifica la URL real del stream
- ExoPlayer inicia la reproducción con la URL resuelta
- 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
- Fork del repositorio
- Feature branch (
git checkout -b feature/NuevaCaracteristica) - Commit cambios (
git commit -m 'Add feature') - Push al branch (
git push origin feature/NuevaCaracteristica) - 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