crea un panel iptv para administrar listas m3u con funcion de editar listas m3u y colocar tiempo de vencimiento a las listas m3u con una url generada para compartir a usuarios
To upload files, please first save the app
import streamlit as st
import pandas as pd
from datetime import datetime, timedelta
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text
from sqlalchemy.orm import DeclarativeBase, Session
from urllib.parse import urljoin
import requests
import json
from slugify import slugify
import base64
# Configuración de la página
st.set_page_config(page_title="IPTV Manager", layout="wide")
# Definición de la base de datos
class Base(DeclarativeBase):
pass
class IPTVList(Base):
__tablename__ = 'iptv_lists'
id = Column(Integer, primary_key=True)
name = Column(String(100))
content = Column(Text)
expiration_date = Column(DateTime)
share_code = Column(String(100), unique=True)
created_at = Column(DateTime, default=datetime.utcnow)
# Crear el motor de base de datos y las tablas
engine = create_engine('sqlite:///iptv.db')
Base.metadata.create_all(engine)
def generate_share_code(name):
"""Genera un código único para compartir basado en el nombre de la lista"""
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
base = slugify(name)
return f"{base}-{timestamp}"
def save_list(name, content, expiration_days):
"""Guarda una lista M3U en la base de datos"""
expiration_date = datetime.utcnow() + timedelta(days=expiration_days)
share_code = generate_share_code(name)
with Session(engine) as session:
iptv_list = IPTVList(
name=name,
content=content,
expiration_date=expiration_date,
share_code=share_code
)
session.add(iptv_list)
session.commit()
return share_code
def get_lists():
"""Obtiene todas las listas guardadas"""
with Session(engine) as session:
return session.query(IPTVList).all()
def get_list_by_code(share_code):
"""Obtiene una lista por su código de compartir"""
with Session(engine) as session:
return session.query(IPTVList).filter_by(share_code=share_code).first()
def update_list(list_id, name, content, expiration_days):
"""Actualiza una lista existente"""
with Session(engine) as session:
iptv_list = session.query(IPTVList).get(list_id)
if iptv_list:
iptv_list.name = name
iptv_list.content = content
iptv_list.expiration_date = datetime.utcnow() + timedelta(days=expiration_days)
session.commit()
# Interfaz de usuario
st.title("🎥 IPTV List Manager")
# Sidebar para añadir nuevas listas
with st.sidebar:
st.header("Añadir Nueva Lista")
new_list_name = st.text_input("Nombre de la lista")
new_list_content = st.text_area("Contenido M3U", height=300)
expiration_days = st.number_input("Días de validez", min_value=1, value=30)
if st.button("Guardar Lista"):
if new_list_name and new_list_content:
share_code = save_list(new_list_name, new_list_content, expiration_days)
st.success(f"Lista guardada exitosamente!")
st.code(f"Código de compartir: {share_code}")
else:
st.error("Por favor completa todos los campos")
# Área principal para mostrar y editar listas
tab1, tab2 = st.tabs(["📋 Gestionar Listas", "🔗 Compartir Lista"])
with tab1:
st.header("Listas M3U Guardadas")
lists = get_lists()
for iptv_list in lists:
with st.expander(f"{iptv_list.name} (Expira: {iptv_list.expiration_date.strftime('%Y-%m-%d')})"):
col1, col2 = st.columns([3, 1])
with col1:
edited_name = st.text_input("Nombre", iptv_list.name, key=f"name_{iptv_list.id}")
edited_content = st.text_area("Contenido", iptv_list.content, height=200, key=f"content_{iptv_list.id}")
edited_days = st.number_input("Días de validez", min_value=1, value=30, key=f"days_{iptv_list.id}")
with col2:
if st.button("Actualizar", key=f"update_{iptv_list.id}"):
update_list(iptv_list.id, edited_name, edited_content, edited_days)
st.success("Lista actualizada!")
st.rerun()
st.markdown("**Código de compartir:**")
st.code(iptv_list.share_code)
base_url = st.text_input("URL Base del servidor", "http://example.com", key=f"url_{iptv_list.id}")
share_url = urljoin(base_url, f"/iptv/{iptv_list.share_code}")
st.markdown("**URL para compartir:**")
st.code(share_url)
with tab2:
st.header("Obtener Lista Compartida")
share_code = st.text_input("Ingresa el código de compartir")
if st.button("Buscar Lista"):
if share_code:
shared_list = get_list_by_code(share_code)
if shared_list:
if shared_list.expiration_date > datetime.utcnow():
st.success("Lista encontrada!")
st.text_area("Contenido de la lista", shared_list.content, height=300)
st.info(f"Esta lista expira el: {shared_list.expiration_date.strftime('%Y-%m-%d')}")
else:
st.error("Esta lista ha expirado")
else:
st.error("Lista no encontrada")
else:
st.error("Por favor ingresa un código de compartir")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?