Leer y carga un fichero m3u en Android studio
En este pequeños tutoría voy a mostrar como leer y carga un fichero m3u con la lista de canales, nombre de canal y logo de imagen de canal. En Android studio que no puede ser de utilidad si estamos pensando en reproducir nuestra propia lista de canales en nuestra aplicación de Android. El codigo que voy a mostrar es bastante corto y los es incluido en una clase donde solo tiene un método llamado M3UFile() la clase se puede ampliar adaptarlo a vuestras necesidades.
Creamos una clase llamada «Filem3u» con un método llamado M3UFile que toma dos parámetros, un objeto Context y un entero resourceId. Esto dos parámetros se pueden cambiar para leer un fichero m3u desde internet. Pero para este ejemplo el fichero se cargará de un recurso guardado en la carpeta raw de nuestros proyectos.
import android.content.Context import java.io.BufferedReader import java.io.InputStreamReader class Filem3u { private lateinit var peliculas: MutableList<Pelicula> public fun M3UFile(context: Context, resourceId: Int): List<Pelicula> { peliculas = mutableListOf() val inputStream = context.resources.openRawResource(resourceId) val reader = BufferedReader(InputStreamReader(inputStream)) val m3uPattern = Regex("#EXTINF:-1 group-title=\"([^\"]+)\" tvg-logo=\"([^\"]+)\",(.+)$") val videoPattern = Regex("https?://.+\\.(mp4|mkv|mpeg|avi|webm|m3u8)") var VideoUrl: String? = null var Title: String? = null var logoUrl: String? = null val m3uContent = reader.readLines() m3uContent.forEachIndexed { index, line -> val m3uMatch = m3uPattern.find(line) val videoMatch = videoPattern.find(line) if (m3uMatch != null) { // Extraer título y logo Title = m3uMatch.groupValues[3] // Título logoUrl = m3uMatch.groupValues[2] // URL del logo } else if (videoMatch != null && Title != null) { // Extraer URL del video VideoUrl = videoMatch.value peliculas.add( Pelicula( Title.toString(), logoUrl.toString(), VideoUrl.toString() ) ) } } return peliculas } }
A continuación, te explico el código de estas clases Los primero es importamos las clases necesarias para leer fichero.
import android.content.Context import java.io.BufferedReader import java.io.InputStreamReader
inicializamos nuestra lista mutable de objetos.
private lateinit var peliculas: MutableList<Pelicula>
Este atributo será inicializado más tarde en la función M3UFile y servirá como contenedor principal de las entradas del archivo .m3u.
peliculas = mutableListOf()
Abrimos el recurso raw del archivo .m3u utilizando el contexto y resourceId. La siguiente dos líneas abren el archivo m3u y lo convierten en un Stream para ser leído.
val inputStream = context.resources.openRawResource(resourceId) val reader = BufferedReader(InputStreamReader(inputStream))
Expresiones Regulares:
La clase Filem3u utiliza dos expresiones regulares, una para identificar la información del archivo .m3u y otra para las URL de los archivos multimedia (vídeos en este caso). Estas expresiones regulares se pueden ampliar para identifica nueva información de fichero m3u.
val m3uPattern = Regex("#EXTINF:-1 group-title=\"([^\"]+)\" tvg-logo=\"([^\"]+)\",(.+)$") // para la información del archivo .m3u val videoPattern = Regex("https?://.+\\.(mp4|mkv|mpeg|avi|webm|m3u8)") // para las URL de los vídeos
Declaramos tres variables para almacenar el título, la url del logo y la url del video.
var VideoUrl: String? = null var Title: String? = null var logoUrl: String? = null
Leemos todo el contenido de nuestro archivo .m3u en una lista de Strings llamada
m3uContent': val m3uContent = reader.readLines()
Recorremos cada línea del contenido del archivo.
m3uContent.forEachIndexed { index, line ->}
Si encontramos una coincidencia con el patrón m3u y un video en la línea actual.
val m3uMatch = m3uPattern.find(line) val videoMatch = videoPattern.find(line)
Si existe una coincidencia m3u, extraemos el título y la url del logo.
Title = m3uMatch?.groupValues[3] // Título logoUrl = m3uMatch?.groupValues[2] // URL del logo
Si existe una coincidencia de video, extraemos su url y agregamos un nuevo objeto Pelicula a la lista.
VideoUrl = videoMatch?.value peliculas.add(Pelicula(Title.toString(), logoUrl.toString(), VideoUrl.toString()))
devolvemos la lista de objetos ‘Pelicula’.
return peliculas
Para utilizar esta clase se necesita un adaptador que no es más que unas clases llamada Peliculas con constructores para los parámetros título, logo y url del video. Se puede crear esta clase película de la siguiente forma.
data class Pelicula( val titulo: String, val urlImagen: String, val urlVideo: String )