Inicio » Blog » Leer y carga un fichero m3u en Android studio

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 
) 

Deja un comentario

Scroll al inicio