Dev #12

Merged
unai merged 5 commits from Dev into main 2026-02-03 16:56:17 +00:00
2 changed files with 148 additions and 2 deletions
Showing only changes of commit e62c243542 - Show all commits

View File

@ -33,6 +33,9 @@ jobs:
needs: test-and-lint
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout@v3
- name: Prepare Docker Metadata
@ -47,8 +50,8 @@ jobs:
uses: docker/login-action@v2
with:
registry: ${{ steps.meta.outputs.REGISTRY_HOST }}
username: ${{ gitea.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
username: ${{ github.actor }}
password: ${{ secrets.PACKAGES_TOKEN }}
- name: Build and Push Docker Image
uses: docker/build-push-action@v4

143
README.md
View File

@ -0,0 +1,143 @@
# Xtream Codes M3U List Builder
[![Python 3.14+](https://img.shields.io/badge/python-3.14+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Docker](https://img.shields.io/badge/docker-ready-blue.svg)](https://www.docker.com/)
Servicio Python que genera y actualiza automáticamente listas de reproducción M3U a partir de servidores **Xtream Codes API**. Ideal para centralizar y servir playlists IPTV de forma local.
## Características
- **Actualización automática** — Regenera la playlist en intervalos configurables
- **Servidor HTTP integrado** — Sirve el archivo M3U directamente sin dependencias externas
- **Docker ready** — Despliegue simple con Docker Compose
- **Escritura atómica** — Actualiza el archivo sin interrumpir descargas activas
- **Seguridad** — Se ejecuta con usuario no privilegiado en contenedor
- **Multi-hilo** — Servidor threaded para manejar múltiples clientes simultáneos
## Inicio Rápido
### Con Docker (Recomendado)
1. **Clona el repositorio:**
```bash
git clone https://github.com/tu-usuario/xtream_codes_m3u_list_builder.git
cd xtream_codes_m3u_list_builder
```
2. **Crea un archivo `.env`:**
```env
HOST=http://tu-servidor-iptv.com
USERNAME=tu_usuario
PASSWORD=tu_contraseña
PORT=8080
UPDATE_INTERVAL=3600
OUTPUT_FILE=playlist.m3u
INCLUDE_TEXT="ES:"
EXCLUDE_TEXT=["XXX","Adultos","24/7"]
```
3. **Ejecuta con Docker Compose:**
```bash
docker compose up -d
```
4. **Accede a la playlist:**
```
http://localhost:8080/playlist.m3u
```
### Sin Docker
1. **Requisitos:**
- Python 3.14+
- [Poetry](https://python-poetry.org/)
2. **Instalación:**
```bash
poetry install
```
3. **Configuración:** Crea un archivo `.env` (ver ejemplo arriba) o exporta las variables de entorno.
4. **Ejecución:**
```bash
poetry run python -m m3u_list_builder.main
```
## Configuración
| Variable | Descripción | Requerido | Default |
|----------|-------------|-----------|---------|
| `HOST` | URL del servidor Xtream Codes | ✅ | — |
| `USERNAME` | Usuario del servicio IPTV | ✅ | — |
| `PASSWORD` | Contraseña del servicio IPTV | ✅ | — |
| `PORT` | Puerto del servidor HTTP local | ❌ | `8080` |
| `UPDATE_INTERVAL` | Intervalo de actualización (segundos) | ❌ | `3600` |
| `OUTPUT_FILE` | Nombre del archivo M3U generado | ❌ | `playlist.m3u` |
## Arquitectura
```
┌─────────────────────────────────────────────────────────┐
│ M3U List Builder │
├──────────────────────┬──────────────────────────────────┤
│ Updater Thread │ HTTP Server │
│ │ │
│ ┌────────────────┐ │ ┌────────────────────────────┐ │
│ │ Fetch API │ │ │ ThreadingHTTPServer │ │
│ │ (Xtream Codes) │ │ │ │ │
│ └───────┬────────┘ │ │ GET /playlist.m3u │ │
│ │ │ │ │ │
│ ┌───────▼────────┐ │ └────────────────────────────┘ │
│ │ Generate M3U │ │ │
│ │ (Atomic Write) │──┼──────► public/playlist.m3u │
│ └───────┬────────┘ │ │
│ │ │ │
│ sleep(interval) │ │
│ ↓ │ │
│ [loop] │ │
└──────────────────────┴──────────────────────────────────┘
```
## Estructura del Proyecto
```
├── src/m3u_list_builder/
│ ├── __init__.py
│ ├── config.py # Configuración con Pydantic Settings
│ ├── main.py # Punto de entrada
│ ├── playlist.py # Lógica de generación M3U
│ └── server.py # Servidor HTTP
├── tests/ # Tests unitarios
├── public/ # Directorio servido (playlist generada)
├── Dockerfile # Multi-stage build
├── docker-compose.yml
└── pyproject.toml # Dependencias y configuración
```
## Testing
```bash
# Ejecutar tests
poetry run pytest
# Con cobertura
poetry run pytest --cov
# Verificar estilo (Ruff)
poetry run ruff check src/
```
## Desarrollo
El proyecto utiliza:
- **Pydantic Settings** — Validación de configuración
- **Requests** — Cliente HTTP
- **Ruff** — Linter y formatter
- **Pytest** — Testing framework
---
<p align="center">
<sub>Desarrollado con ❤️ para la comunidad IPTV</sub>
</p>