Compare commits

..

15 Commits

Author SHA1 Message Date
e62c243542 Merge pull request 'main' (#10) from main into Dev
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 24s
CI/CD Pipeline / publish-container (push) Has been skipped
Reviewed-on: #10
2026-02-02 16:46:52 +00:00
6c357dd977 Merge pull request 'Dev' (#9) from Dev into main
All checks were successful
CI/CD Pipeline / test-and-lint (pull_request) Successful in 27s
CI/CD Pipeline / publish-container (pull_request) Has been skipped
CI/CD Pipeline / test-and-lint (push) Successful in 26s
CI/CD Pipeline / publish-container (push) Successful in 5m14s
Reviewed-on: #9
2026-02-02 16:45:33 +00:00
7733c7e2ac Merge pull request 'Actualizar el README para acomodar la nueva funcionalidad' (#8) from unai-patch-5 into main
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 25s
CI/CD Pipeline / publish-container (push) Has been skipped
Reviewed-on: #8
2026-02-02 16:40:37 +00:00
d95d6d6c58 Actualizar el README para acomodar la nueva funcionalidad
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 30s
CI/CD Pipeline / test-and-lint (pull_request) Successful in 27s
CI/CD Pipeline / publish-container (push) Has been skipped
CI/CD Pipeline / publish-container (pull_request) Has been skipped
2026-02-02 16:40:26 +00:00
76c12408bf Merge pull request 'fix: sacar poetry.lock del gitignore y subirlo' (#7) from Dev into main
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 28s
CI/CD Pipeline / publish-container (push) Successful in 6m17s
Reviewed-on: #7
2026-02-01 22:24:57 +00:00
0b5c5af13d Merge pull request 'Updated package access token, again' (#6) from unai-patch-4 into main
Some checks failed
CI/CD Pipeline / test-and-lint (push) Successful in 33s
CI/CD Pipeline / publish-container (push) Failing after 24s
Reviewed-on: #6
2026-02-01 22:11:29 +00:00
7c191b7ecd Updated package access token, again
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 39s
CI/CD Pipeline / test-and-lint (pull_request) Successful in 32s
CI/CD Pipeline / publish-container (push) Has been skipped
CI/CD Pipeline / publish-container (pull_request) Has been skipped
2026-02-01 22:11:14 +00:00
73778732ba Merge pull request 'Update action user for gitea publish container' (#5) from unai-patch-3 into main
Some checks failed
CI/CD Pipeline / test-and-lint (push) Successful in 32s
CI/CD Pipeline / publish-container (push) Failing after 14s
Reviewed-on: #5
2026-02-01 21:53:53 +00:00
86f8e67318 Update action user for gitea publish container
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 32s
CI/CD Pipeline / publish-container (push) Has been skipped
CI/CD Pipeline / test-and-lint (pull_request) Successful in 33s
CI/CD Pipeline / publish-container (pull_request) Has been skipped
2026-02-01 21:53:10 +00:00
ed3045f6a4 Merge pull request 'Updated permissions on gitea workflow' (#4) from unai-patch-2 into main
Some checks failed
CI/CD Pipeline / test-and-lint (push) Successful in 37s
CI/CD Pipeline / publish-container (push) Failing after 16s
Reviewed-on: #4
2026-02-01 21:39:08 +00:00
a89ee4f1a0 Updated permissions on gitea workflow
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 36s
CI/CD Pipeline / test-and-lint (pull_request) Successful in 32s
CI/CD Pipeline / publish-container (push) Has been skipped
CI/CD Pipeline / publish-container (pull_request) Has been skipped
2026-02-01 21:38:55 +00:00
79bbeeea00 Merge pull request 'Actualizar README.md' (#3) from unai-patch-1 into main
Some checks failed
CI/CD Pipeline / test-and-lint (push) Successful in 32s
CI/CD Pipeline / publish-container (push) Failing after 3m47s
Reviewed-on: #3
2026-02-01 19:44:45 +00:00
11668ce326 Actualizar README.md
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 36s
CI/CD Pipeline / test-and-lint (pull_request) Successful in 31s
CI/CD Pipeline / publish-container (push) Has been skipped
CI/CD Pipeline / publish-container (pull_request) Has been skipped
2026-02-01 19:44:25 +00:00
8124949d2e Merge pull request 'Dev' (#2) from Dev into main
All checks were successful
CI/CD Pipeline / test-and-lint (push) Successful in 33s
CI/CD Pipeline / publish-container (push) Has been skipped
Reviewed-on: #2
2026-02-01 19:39:48 +00:00
659c6350d5 Merge pull request 'Dev' (#1) from Dev into main
Some checks failed
CI/CD Pipeline / test-and-lint (push) Failing after 26s
CI/CD Pipeline / publish-container (push) Has been skipped
Reviewed-on: #1
2026-02-01 18:18:50 +00:00
2 changed files with 148 additions and 2 deletions

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>