-
Notifications
You must be signed in to change notification settings - Fork 0
Spotify
Controle de trilha sonora via Spotify Web API. Funciona controlando qualquer dispositivo Spotify Connect (PC, celular, caixa, etc) — o servidor não toca áudio, só comanda.
Requer conta Spotify Premium.
- Acesse https://developer.spotify.com/dashboard
- Create app
- Preencha:
-
App name: livre (ex.:
GM Control Room) - App description: livre
-
Redirect URIs:
http://127.0.0.1:4000/spotify/callback(loopback é aceito sem HTTPS) - APIs/SDKs: marque Web API
-
App name: livre (ex.:
- Aceite os termos e salve.
- Em Settings, copie o Client ID.
⚠️ Não precisa de Client Secret — usamos PKCE (cliente público).
Na raiz do projeto:
SPOTIFY_CLIENT_ID=cole-aqui-o-client-id
SPOTIFY_REDIRECT_URI=http://127.0.0.1:4000/spotify/callbacknpm startO servidor lê .env no boot — mudanças exigem restart.
- Painel mostra "Conectar Spotify" se ainda não autenticado.
- Clique →
GET /spotify/loginredireciona proaccounts.spotify.com/authorizecom PKCE. - Você autoriza no Spotify.
- Spotify redireciona pra
http://127.0.0.1:4000/spotify/callbackcomcode. - Server troca o
codeporaccess_token+refresh_token, guarda em memória. - Painel atualiza pra mostrar transport + dispositivos.
Tokens ficam só em memória — restart do servidor exige re-autenticar. Persistência em disco é roadmap futuro.
user-read-playback-state ← estado atual (track, device, shuffle, repeat)
user-modify-playback-state ← controle (play/pause/next/prev/shuffle/repeat)
playlist-read-private ← listar playlists do usuário
playlist-read-collaborative ← listar playlists colaborativas
Se você atualizou da v0.1 pra v0.2+ e os escopos novos foram adicionados, precisa re-autenticar (clicar Conectar de novo) pra autorizar os escopos de playlist. Senão /spotify/playlists retorna lista vazia.
- ⏮ anterior
- ▶ play
- ⏸ pause
- ⏭ próxima
- 🔀 shuffle (toggle)
- 🔁 repeat (off → context → track → off — ciclo)
Modos ativos (shuffle on, repeat ≠ off) ganham borda verde.
Lista de dispositivos Spotify Connect ativos. Clique pra transferir playback. Se a lista estiver vazia, abra o Spotify em algum lugar (PC/celular).
Botão expansível "▸ Playlists". Carrega sob demanda (até 50). Clique numa playlist → toca via contextUri.
Cada cena da campanha pode ter uma trilha do Spotify vinculada (SceneMusic: um URI de contexto + nome amigável). Ao ativar a cena, o servidor manda tocar esse contexto no dispositivo ativo — a música acompanha a troca de cena automaticamente.
- Vincular/desvincular pelo painel:
setSceneMusic(sceneId, music | null). - Persiste em
.scene-music.json, indexado por campanha (sobrevive a trocas). Ver Persistence. - Sem dispositivo ativo ou sem Premium, a ativação da cena ignora a trilha silenciosamente.
interface SceneMusic {
uri: string // ex.: 'spotify:playlist:...'
name?: string // rótulo pra UI
}| Método | Rota | O que faz |
|---|---|---|
| GET | /spotify/login |
Inicia OAuth (redirect 302 pro Spotify) |
| GET | /spotify/callback |
Callback do OAuth, salva tokens |
| GET | /spotify/state |
Estado atual (configured/connected/devices/playback) |
| GET | /spotify/playlists |
Lista até 50 playlists do usuário |
| POST | /spotify/command |
Despacha SpotifyCommand (transport, shuffle, repeat, transfer) |
-
"Spotify não configurado" →
SPOTIFY_CLIENT_IDestá vazio ou faltando no.env. Reinicie o servidor após editar. - 403 / "Premium required" → conta Spotify não é Premium. Não tem como contornar (limitação da API).
- Nenhum dispositivo na lista → abra o Spotify em algum aparelho. Aparelhos só aparecem quando o app está rodando e acordado.
-
/spotify/loginretorna 503 → server foi iniciado antes do.envterSPOTIFY_CLIENT_ID. Restart. - Playlists vazias após atualizar → re-autentique pra autorizar os escopos novos.
Setup
Conteúdo
Ferramentas
- Combat Tracker
- Creature Library
- Encounter Library
- Clocks
- Party Resources
- Random Tables
- Dice and Roll History
- GM Notes
- RPG Systems
Display
Arquitetura