Where Music Meets Code
Rádio online self-hosted a correr num Raspberry Pi 5.
Descarrega música do YouTube, edita marcadores de entrada/saída,
organiza em sequências programadas e emite continuamente via Icecast2
com crossfade automático — tudo controlado por algoritmo.
▶ Ouvir agora
Como funciona
YouTube URL → yt-dlp → MP3
→ Editor (marcadores + metadados + categorias)
→ Sequências (blocos de programação ordenados)
→ Horário (mapa semanal + datas específicas)
→ stream_daemon.py (crossfade numpy + ffmpeg)
→ Icecast2 :8000 → Browser / VLC / Android Auto
Funcionalidades
🎛️ Editor de faixas com forma de onda interactiva — 4 marcadores arrastáveis (entrada, voz, saída)
📋 Sequências de programação com drag-and-drop — faixas específicas, categorias aleatórias, jingles e silêncios
🗓️ Horário semanal e por data específica com prioridades — fila pré-resolvida de 8 posições
🔀 Crossfade configurável (fade in/out/overlap) sem reiniciar o daemon
🚫 Anti-repetição por faixa e por artista — janelas de tempo configuráveis com fallback gracioso
📱 PWA com Media Session API — nome da música, temperatura dos ouvintes no ecrã bloqueado
🎵 Pedidos de faixas pelos ouvintes — rate limit 1 pedido/15 min por IP
🌡️ Temperatura em tempo real das localidades dos ouvintes (Geolocation API + Open-Meteo)
Stack técnica
🖥️
Raspberry Pi 5
ARM64 · 8 GB RAM
🐍
Python 3
Daemon + crossfade numpy
🐘
PHP 8.2
Backend + scheduling API
🎬
ffmpeg
Decode PCM + encode MP3
📡
Icecast2
Stream HTTP :8000
🗄️
MariaDB
Tracks · schedules · history
📥
yt-dlp
Download do YouTube
🌐
Apache 2
Proxy HTTPS → Icecast
🤖
Claude Code
Co-desenvolvido com IA
Roadmap
✓ feito Download YouTube, editor de marcadores, catálogo
✓ feito Stream daemon Python com crossfade real (numpy)
✓ feito Sequências de programação e horário semanal
✓ feito Player público PWA + pedidos de faixas
✓ feito Media Session API + temperatura dos ouvintes
a seguir Locutor TTS entre faixas (edge-tts, voz PT)
a seguir Estatísticas públicas — faixas mais tocadas, top artistas
a seguir Sugestões de música pelos ouvintes via YouTube