# 📺 StreamPlayer [![Android](https://img.shields.io/badge/Platform-Android-green.svg)](https://android.com) [![Java](https://img.shields.io/badge/Language-Java-orange.svg)](https://www.oracle.com/java/) [![API](https://img.shields.io/badge/Min%20SDK-21%2B-brightgreen.svg)](https://android-developers.blogspot.com/) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](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 ```bash # Android SDK # Java 8+ # Gradle 8.2+ ``` ### Build con Gradle ```bash # 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 ```bash # Construir imagen docker build -t streamplayer . # Ejecutar build docker run --rm -v $(pwd)/output:/output streamplayer ``` ### Build Script Alternativo ```bash # 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` ```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. ### Flujo dentro de la app - 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. ## 📱 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 ```java // 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** ```bash # 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](LICENSE) para detalles. ## 👨‍💻 Autor **renato97** - [Gitea Profile](https://gitea.cbcren.online/renato97) --- ⚠️ **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