#!/usr/bin/env python3
import requests
import re
import xml.etree.ElementTree as ET
import xml.dom.minidom

def parse_m3u(m3u_text):
    """
    Parsea el contenido M3U y extrae para cada canal:
    - título (tvg-name o texto tras la coma)
    - URL del canal
    - imagen (tvg-logo)
    """
    lines = m3u_text.splitlines()
    channels = []
    for i in range(len(lines)):
        if lines[i].startswith("#EXTINF"):
            line = lines[i]
            # Se utiliza una expresión regular que incluya atributos con guiones (por ejemplo, tvg-logo)
            atributos = dict(re.findall(r'([\w-]+)="(.*?)"', line))
            # Se extrae el título: se prioriza tvg-name y si no se encuentra se usa el texto después de la coma
            title_after_comma = line.split(',', 1)[1].strip() if ',' in line else ""
            channel_title = atributos.get("tvg-name", title_after_comma)
            # Se extrae la imagen del atributo tvg-logo
            tvg_logo = atributos.get("tvg-logo", "")
            # La URL del canal es la siguiente línea
            channel_url = lines[i+1].strip() if i+1 < len(lines) else ""
            channels.append({
                "title": channel_title,
                "url": channel_url,
                "logo": tvg_logo
            })
    return channels

def generate_rss(channels):
    """
    Genera un documento RSS en formato XML utilizando los datos de los canales.
    Se registra el namespace "media" para que los elementos aparezcan con dicho prefijo.
    """
    # Registra el namespace "media" para que se use ese prefijo en la salida
    ET.register_namespace("media", "http://search.yahoo.com/mrss/")
    
    # Se crea el elemento raíz sin pasar manualmente el atributo "xmlns:media"
    rss = ET.Element("rss", attrib={
        "version": "2.0"
    })
    channel_elem = ET.SubElement(rss, "channel")
    
    # Elementos fijos del canal según el formato deseado
    ET.SubElement(channel_elem, "title").text = "Tilingo"
    ET.SubElement(channel_elem, "link")
    ET.SubElement(channel_elem, "description").text = "Feed on video content for testing channel applications built on the Roku developer platform"
    ET.SubElement(channel_elem, "language").text = "en-us"
    ET.SubElement(channel_elem, "pubDate").text = "Mon, 10 Mar 2025 23:38:55 GMT"
    
    image = ET.SubElement(channel_elem, "image")
    ET.SubElement(image, "title").text = "Tilingo"
    ET.SubElement(image, "url").text = "http://mitilingo.com/logo.png"
    ET.SubElement(image, "width").text = "-1"
    ET.SubElement(image, "height").text = "-1"
    
    # Se crea un <item> por cada canal extraído del M3U
    for ch in channels:
        item = ET.SubElement(channel_elem, "item")
        ET.SubElement(item, "title").text = ch["title"]
        ET.SubElement(item, "link").text = ch["url"]
        ET.SubElement(item, "description")
        ET.SubElement(item, "pubDate")
        ET.SubElement(item, "guid", attrib={"isPermaLink": "false"})
        
        media_content = ET.SubElement(item, "{http://search.yahoo.com/mrss/}content", attrib={
            "url": ch["url"],
            "type": "stream/hls",
            "channels": "",
            "bitrate": "",
            "duration": "",
            "fileSize": "",
            "framerate": "",
            "height": "",
            "width": "",
            "isDefault": "true"
        })
        ET.SubElement(media_content, "{http://search.yahoo.com/mrss/}description")
        ET.SubElement(media_content, "{http://search.yahoo.com/mrss/}keywords")
        ET.SubElement(media_content, "{http://search.yahoo.com/mrss/}thumbnail", attrib={"url": ch["logo"]})
        ET.SubElement(media_content, "{http://search.yahoo.com/mrss/}title").text = ch["title"]
    
    # Se obtiene una cadena formateada (pretty printed) del XML
    rough_string = ET.tostring(rss, encoding="utf-8")
    reparsed = xml.dom.minidom.parseString(rough_string)
    pretty_xml = reparsed.toprettyxml(indent="  ", encoding="UTF-8")
    return pretty_xml

def main():
    # URL del archivo M3U
    url = "http://axotv.com:9191/get.php?username=RoKu&password=n8p48cmiv6vwt5bnnjk"
    try:
        response = requests.get(url)
        response.raise_for_status()
    except Exception as e:
        print("Error al obtener el archivo M3U:", e)
        return
    
    m3u_text = response.text
    channels = parse_m3u(m3u_text)
    rss_content = generate_rss(channels)
    
    # Ruta completa donde se guardará el archivo RSS
    file_path = "/home/migosu/disco/web/servidor-mitilingo/programacion/canales.rss"
    try:
        with open(file_path, "wb") as f:
            f.write(rss_content)
        print("Archivo RSS generado exitosamente en:", file_path)
    except Exception as e:
        print("Error al escribir el archivo RSS:", e)

if __name__ == "__main__":
    main()
