Um software de escutar músicas open source usando a api do YouTube, zero anúncios e mensalidades!!
TypeScript
0
4 commits
updated Oct 16, 2026
Sua música, sem interrupção.
Player pessoal que toca qualquer música ou clipe do YouTube, como áudio ou vídeo, sem anúncios. Funciona no navegador, no celular (PWA) e como app de computador com instalador.
O Musike nasceu da ideia dos antigos bots de música do Discord: um servidor que busca o áudio direto do YouTube e o entrega pronto para tocar. Em vez de um chat, a interface é um player completo, rápido e simples, com cara de app moderno e um toque gamer.
Ouvir
Vídeo
F), com controles que somem enquanto você assiste e tela cheia de verdadeBiblioteca
Interface
App desktop (Windows)
Manutenção
![]() Busca e mini player no celular | ![]() Tocando agora |
![]() Modo cinema | ![]() Importar backup com prévia |
![]() Atualização do yt-dlp em um clique | |
flowchart LR
subgraph Clientes
W["Web / PWA<br/>React + Vite"]
D["App desktop<br/>Electron"]
end
subgraph S["Servidor Musike (Fastify)"]
API["API REST"]
P["Proxy de stream<br/>HTTP Range"]
L[("library.json")]
end
YTM["YouTube Music<br/>youtubei.js"]
T["yt-dlp + Deno + FFmpeg"]
YT[("YouTube / googlevideo")]
W --> API
D -- "servidor embutido" --> API
API -- "busca, sugestões, rádio, clipes" --> YTM
API -- "resolve streams, junta HD" --> T
T --> YT
P --> YT
API --> L
Range para que o avanço seja instantâneo.library.json, gravado de forma atômica.<video> é movido no DOM entre painel, tela cheia, mini player e modo cinema sem interromper a reprodução.Gere o instalador (ou baixe-o na página de Releases, se publicado):
pnpm install
pnpm installer # cria desktop\release\Musike-Setup-<versão>.exe
O instalador:
Na primeira abertura, uma tela mostra o download das ferramentas oficiais: yt-dlp e Deno (cerca de 60 MB) e, em segundo plano, FFmpeg (cerca de 80 MB, para vídeo HD). Tudo fica em %APPDATA%\Musike:
| Pasta | Conteúdo |
|---|---|
bin | yt-dlp, Deno e FFmpeg do próprio Musike (atualizáveis em Ajustes) |
data | library.json com playlists, favoritas e histórico |
cache | vídeos HD já baixados |
backups | cópias da biblioteca feitas a cada atualização |
Atualizar é só instalar a versão nova por cima. A pasta %APPDATA%\Musike fica fora da pasta do programa e nem a atualização nem a desinstalação a apagam. Por segurança, antes de trocar a versão o instalador ainda copia a biblioteca para backups\library-before-install-<versão>.json, e o app guarda outra cópia datada na primeira abertura de cada versão (mantém as 5 mais recentes). Para restaurar uma delas, feche o Musike e copie o arquivo por cima de data\library.json.
O instalador não é assinado digitalmente. Na primeira execução o Windows mostra "O Windows protegeu o computador": clique em Mais informações e depois Executar assim mesmo.
Requisitos:
| Ferramenta | Versão | Windows |
|---|---|---|
| Node.js | 22.19+ | winget install OpenJS.NodeJS.LTS |
| pnpm | 10+ | npm install -g pnpm |
| yt-dlp | recente | winget install yt-dlp.yt-dlp (instala Deno e FFmpeg junto) |
pnpm install
pnpm build # compila a interface
pnpm start # http://localhost:4180
O servidor mostra os endereços de rede ao iniciar. Abra o endereço Rede: no celular conectado ao mesmo Wi-Fi (permita o Node no firewall em redes privadas). O servidor encontra o yt-dlp mesmo em terminais abertos antes da instalação, lendo o PATH do registro do Windows.
Fora de casa: instale o Tailscale no computador e no celular. Para instalar como app (PWA) no celular, o navegador exige HTTPS: rode tailscale serve --bg 4180 e use o endereço https://...ts.net.
Não hospede em VPS ou nuvem: o YouTube bloqueia IPs de datacenter ("Sign in to confirm you're not a bot"). Rodar no seu computador usa seu IP residencial.
pnpm dev # servidor (4180) + Vite com recarga automática (5173)
pnpm desktop # abre o app Electron em modo de desenvolvimento
pnpm typecheck # checa os três pacotes
Enquanto a sincronização em nuvem não existe, o Musike exporta tudo num arquivo que qualquer instância lê: web, desktop, outro computador.
musike-backup-AAAA-MM-DD.musike.json é salvo.O arquivo é JSON legível e versionado:
{
"format": "musike-backup",
"version": 1,
"exportedAt": "2026-10-12T22:33:00.000Z",
"app": "Musike 0.1.0",
"library": {
"favorites": [{ "id": "UpvruBhcH38", "title": "Oceano", "artist": "Djavan", "duration": 297, "thumb": "https://...", "art": "https://...", "kind": "song" }],
"playlists": [{ "id": "…", "name": "Foco", "createdAt": 1791842422955, "updatedAt": 1791842422955, "tracks": [] }],
"history": []
},
"settings": { "theme": "dark", "preferVideo": false, "quality": "sd", "autoRadio": true, "volume": 0.9 }
}
Na importação o servidor valida cada faixa (ID do YouTube, tamanhos, só imagens https://), descarta entradas inválidas em vez de recusar o arquivo inteiro e recusa backups de versões mais novas com uma mensagem clara.
| Tecla | Ação |
|---|---|
Espaço | Tocar / pausar |
← → | Voltar / avançar 5 s |
Shift + ← → | Faixa anterior / próxima |
↑ ↓ | Volume |
M | Mudo |
L | Favoritar a faixa atual |
S | Ordem aleatória |
R | Repetir (desligado, fila, faixa) |
V | Alternar Áudio / Vídeo |
F | Modo cinema |
Q | Fila |
/ | Buscar |
? | Lista de atalhos |
Variáveis de ambiente do servidor (todas opcionais):
| Variável | Padrão | Uso |
|---|---|---|
PORT | 4180 | Porta HTTP |
HOST | 0.0.0.0 | Use 127.0.0.1 para aceitar só este computador |
YTDLP_PATH | automático | Força um executável específico do yt-dlp |
YTDLP_EXTRA_ARGS | Flags extras, ex.: --cookies-from-browser firefox | |
MUSIKE_DATA_DIR | server/data | Onde fica library.json |
MUSIKE_CACHE_DIR | server/cache | Vídeos HD baixados |
MUSIKE_CACHE_MAX_MB | 2048 | Limite do cache de vídeo (apaga os menos tocados) |
MUSIKE_BIN_DIR | Pasta privada de ferramentas (o app desktop usa %APPDATA%\Musike\bin) | |
MUSIKE_LANG / MUSIKE_LOCATION | en / BR | Idioma do YouTube Music quando a requisição não informa um (o app sempre informa o idioma escolhido) e região da busca |
Todas as rotas respondem JSON. Erros vêm como { "error": "mensagem", "code"?: "tool_missing" | "maybe_outdated" | "bot_check" }.
| Método | Rota | Descrição |
|---|---|---|
GET | /api/search?q=&type=song|video | Busca no YouTube Music |
GET | /api/suggest?q= | Sugestões de busca |
GET | /api/radio/:id | Faixas relacionadas (rádio) |
GET | /api/genres | Gêneros do YouTube Music |
GET | /api/genres/:gid | Artistas e músicas de um gênero |
GET | /api/genres/:gid/artists?offset= | Mais artistas do gênero ("Carregar mais") |
GET | /api/artists/:aid | Maiores sucessos de um artista |
GET | /api/video-for/:id?title=&artist=&duration= | Clipe oficial de uma música |
POST | /api/prepare/:id | Resolve o stream antes de tocar |
GET | /api/stream/:id/audio | Áudio com HTTP Range |
GET | /api/stream/:id/video?q=sd|hd | Vídeo com HTTP Range |
GET | /api/library | Biblioteca completa |
PUT / DELETE | /api/favorites/:id | Favoritar / desfavoritar |
POST | /api/favorites | Favorita várias de uma vez ({ tracks }) |
POST | /api/history | Registra uma faixa tocada |
POST | /api/playlists | Cria playlist |
PATCH / DELETE | /api/playlists/:pid | Renomeia / exclui |
POST / DELETE | /api/playlists/:pid/tracks[/:id] | Adiciona (uma faixa ou { tracks }) / remove faixa |
POST | /api/library/import | Importa backup ({ backup, mode: "merge" | "replace" }) |
GET | /api/system | Versões do yt-dlp, Deno, FFmpeg e downloads |
POST | /api/system/ytdlp | Atualiza ou instala o yt-dlp ({ channel: "stable" | "nightly" }) |
musike/
├─ server/ Fastify + yt-dlp + youtubei.js
│ └─ src/
│ ├─ app.ts rotas e inicialização (usado pelo CLI e pelo desktop)
│ ├─ ytdlp.ts resolução de streams, cache HD, tradução de erros
│ ├─ stream.ts proxy com HTTP Range
│ ├─ search.ts busca, sugestões, rádio e escolha do clipe oficial
│ ├─ library.ts playlists, favoritas, histórico e import de backup
│ ├─ tools.ts localiza yt-dlp, Deno, FFmpeg (registro do Windows, winget)
│ ├─ bootstrap.ts baixa as ferramentas para o app desktop
│ └─ system.ts versão e atualização do yt-dlp
├─ web/ React 19 + Vite + Tailwind v4 + Motion + Phosphor (PWA)
│ └─ src/
│ ├─ player/ motor de reprodução (áudio, vídeo, fila, Media Session)
│ ├─ components/ player, painéis, modo cinema, Ajustes, backup
│ ├─ views/ Início, Buscar, Biblioteca, playlists
│ └─ stores/ estado (zustand)
├─ desktop/ Electron: janela, servidor embutido, instalador NSIS
└─ docs/ benchmark de UX, design system e capturas de tela
Stack: TypeScript em tudo · Fastify 5 · youtubei.js · yt-dlp · React 19 · Vite 8 · Tailwind CSS 4 · Motion · Zustand · React Router · Phosphor Icons · Geist · Electron 44 · electron-builder.
Design: a identidade (marca de equalizador em M, cor Volt, Geist) e as regras de layout estão em docs/design-system.md. O estudo de UX que guiou o layout está em docs/ux-benchmark.md: observação do web player do Spotify, sem descompilar código.
Parou de tocar ou "O YouTube recusou o stream" O YouTube muda com frequência e o yt-dlp acompanha. Abra Ajustes e toque em Atualizar. Se a correção ainda não chegou ao canal Estável, escolha Nightly.
"O YouTube pediu verificação anti-bot" Passe cookies de um navegador logado (o Firefox funciona melhor no Windows):
$env:YTDLP_EXTRA_ARGS = "--cookies-from-browser firefox"; pnpm start
"yt-dlp não encontrado"
No app desktop, use Instalar em Ajustes. No servidor, instale com winget install yt-dlp.yt-dlp ou defina YTDLP_PATH.
O vídeo demora para começar Muitos vídeos não têm versão SD combinada; o servidor baixa e junta vídeo e áudio antes de tocar (alguns segundos na primeira vez, instantâneo depois, pelo cache).
"Esta música não tem clipe no YouTube" O Musike só aceita clipes publicados pelo canal do próprio artista, para não tocar covers ou versões erradas. A música continua tocando em áudio.
iPhone O iOS limita a reprodução em segundo plano de PWAs; o modo Áudio funciona melhor que o Vídeo.
O Musike é um projeto para uso pessoal e educacional. Reproduzir conteúdo do YouTube sem anúncios por extração de stream viola os Termos de Serviço do YouTube; serviços públicos que fizeram isso, como os bots Groovy e Rythm, foram encerrados após notificação do Google. Não publique o Musike como serviço, não o monetize e respeite os direitos dos artistas. O projeto não hospeda, distribui nem armazena conteúdo do YouTube além do cache local temporário de quem o executa.
MIT © 2026 Ernani Neto
197 followers · starred Oct 2026
Um software de escutar músicas open source usando a api do YouTube, zero anúncios e mensalidades!!
TypeScript
0
4 commits
updated Oct 16, 2026
Sua música, sem interrupção.
Player pessoal que toca qualquer música ou clipe do YouTube, como áudio ou vídeo, sem anúncios. Funciona no navegador, no celular (PWA) e como app de computador com instalador.
O Musike nasceu da ideia dos antigos bots de música do Discord: um servidor que busca o áudio direto do YouTube e o entrega pronto para tocar. Em vez de um chat, a interface é um player completo, rápido e simples, com cara de app moderno e um toque gamer.
Ouvir
Vídeo
F), com controles que somem enquanto você assiste e tela cheia de verdadeBiblioteca
Interface
App desktop (Windows)
Manutenção
![]() Busca e mini player no celular | ![]() Tocando agora |
![]() Modo cinema | ![]() Importar backup com prévia |
![]() Atualização do yt-dlp em um clique | |
flowchart LR
subgraph Clientes
W["Web / PWA<br/>React + Vite"]
D["App desktop<br/>Electron"]
end
subgraph S["Servidor Musike (Fastify)"]
API["API REST"]
P["Proxy de stream<br/>HTTP Range"]
L[("library.json")]
end
YTM["YouTube Music<br/>youtubei.js"]
T["yt-dlp + Deno + FFmpeg"]
YT[("YouTube / googlevideo")]
W --> API
D -- "servidor embutido" --> API
API -- "busca, sugestões, rádio, clipes" --> YTM
API -- "resolve streams, junta HD" --> T
T --> YT
P --> YT
API --> L
Range para que o avanço seja instantâneo.library.json, gravado de forma atômica.<video> é movido no DOM entre painel, tela cheia, mini player e modo cinema sem interromper a reprodução.Gere o instalador (ou baixe-o na página de Releases, se publicado):
pnpm install
pnpm installer # cria desktop\release\Musike-Setup-<versão>.exe
O instalador:
Na primeira abertura, uma tela mostra o download das ferramentas oficiais: yt-dlp e Deno (cerca de 60 MB) e, em segundo plano, FFmpeg (cerca de 80 MB, para vídeo HD). Tudo fica em %APPDATA%\Musike:
| Pasta | Conteúdo |
|---|---|
bin | yt-dlp, Deno e FFmpeg do próprio Musike (atualizáveis em Ajustes) |
data | library.json com playlists, favoritas e histórico |
cache | vídeos HD já baixados |
backups | cópias da biblioteca feitas a cada atualização |
Atualizar é só instalar a versão nova por cima. A pasta %APPDATA%\Musike fica fora da pasta do programa e nem a atualização nem a desinstalação a apagam. Por segurança, antes de trocar a versão o instalador ainda copia a biblioteca para backups\library-before-install-<versão>.json, e o app guarda outra cópia datada na primeira abertura de cada versão (mantém as 5 mais recentes). Para restaurar uma delas, feche o Musike e copie o arquivo por cima de data\library.json.
O instalador não é assinado digitalmente. Na primeira execução o Windows mostra "O Windows protegeu o computador": clique em Mais informações e depois Executar assim mesmo.
Requisitos:
| Ferramenta | Versão | Windows |
|---|---|---|
| Node.js | 22.19+ | winget install OpenJS.NodeJS.LTS |
| pnpm | 10+ | npm install -g pnpm |
| yt-dlp | recente | winget install yt-dlp.yt-dlp (instala Deno e FFmpeg junto) |
pnpm install
pnpm build # compila a interface
pnpm start # http://localhost:4180
O servidor mostra os endereços de rede ao iniciar. Abra o endereço Rede: no celular conectado ao mesmo Wi-Fi (permita o Node no firewall em redes privadas). O servidor encontra o yt-dlp mesmo em terminais abertos antes da instalação, lendo o PATH do registro do Windows.
Fora de casa: instale o Tailscale no computador e no celular. Para instalar como app (PWA) no celular, o navegador exige HTTPS: rode tailscale serve --bg 4180 e use o endereço https://...ts.net.
Não hospede em VPS ou nuvem: o YouTube bloqueia IPs de datacenter ("Sign in to confirm you're not a bot"). Rodar no seu computador usa seu IP residencial.
pnpm dev # servidor (4180) + Vite com recarga automática (5173)
pnpm desktop # abre o app Electron em modo de desenvolvimento
pnpm typecheck # checa os três pacotes
Enquanto a sincronização em nuvem não existe, o Musike exporta tudo num arquivo que qualquer instância lê: web, desktop, outro computador.
musike-backup-AAAA-MM-DD.musike.json é salvo.O arquivo é JSON legível e versionado:
{
"format": "musike-backup",
"version": 1,
"exportedAt": "2026-10-12T22:33:00.000Z",
"app": "Musike 0.1.0",
"library": {
"favorites": [{ "id": "UpvruBhcH38", "title": "Oceano", "artist": "Djavan", "duration": 297, "thumb": "https://...", "art": "https://...", "kind": "song" }],
"playlists": [{ "id": "…", "name": "Foco", "createdAt": 1791842422955, "updatedAt": 1791842422955, "tracks": [] }],
"history": []
},
"settings": { "theme": "dark", "preferVideo": false, "quality": "sd", "autoRadio": true, "volume": 0.9 }
}
Na importação o servidor valida cada faixa (ID do YouTube, tamanhos, só imagens https://), descarta entradas inválidas em vez de recusar o arquivo inteiro e recusa backups de versões mais novas com uma mensagem clara.
| Tecla | Ação |
|---|---|
Espaço | Tocar / pausar |
← → | Voltar / avançar 5 s |
Shift + ← → | Faixa anterior / próxima |
↑ ↓ | Volume |
M | Mudo |
L | Favoritar a faixa atual |
S | Ordem aleatória |
R | Repetir (desligado, fila, faixa) |
V | Alternar Áudio / Vídeo |
F | Modo cinema |
Q | Fila |
/ | Buscar |
? | Lista de atalhos |
Variáveis de ambiente do servidor (todas opcionais):
| Variável | Padrão | Uso |
|---|---|---|
PORT | 4180 | Porta HTTP |
HOST | 0.0.0.0 | Use 127.0.0.1 para aceitar só este computador |
YTDLP_PATH | automático | Força um executável específico do yt-dlp |
YTDLP_EXTRA_ARGS | Flags extras, ex.: --cookies-from-browser firefox | |
MUSIKE_DATA_DIR | server/data | Onde fica library.json |
MUSIKE_CACHE_DIR | server/cache | Vídeos HD baixados |
MUSIKE_CACHE_MAX_MB | 2048 | Limite do cache de vídeo (apaga os menos tocados) |
MUSIKE_BIN_DIR | Pasta privada de ferramentas (o app desktop usa %APPDATA%\Musike\bin) | |
MUSIKE_LANG / MUSIKE_LOCATION | en / BR | Idioma do YouTube Music quando a requisição não informa um (o app sempre informa o idioma escolhido) e região da busca |
Todas as rotas respondem JSON. Erros vêm como { "error": "mensagem", "code"?: "tool_missing" | "maybe_outdated" | "bot_check" }.
| Método | Rota | Descrição |
|---|---|---|
GET | /api/search?q=&type=song|video | Busca no YouTube Music |
GET | /api/suggest?q= | Sugestões de busca |
GET | /api/radio/:id | Faixas relacionadas (rádio) |
GET | /api/genres | Gêneros do YouTube Music |
GET | /api/genres/:gid | Artistas e músicas de um gênero |
GET | /api/genres/:gid/artists?offset= | Mais artistas do gênero ("Carregar mais") |
GET | /api/artists/:aid | Maiores sucessos de um artista |
GET | /api/video-for/:id?title=&artist=&duration= | Clipe oficial de uma música |
POST | /api/prepare/:id | Resolve o stream antes de tocar |
GET | /api/stream/:id/audio | Áudio com HTTP Range |
GET | /api/stream/:id/video?q=sd|hd | Vídeo com HTTP Range |
GET | /api/library | Biblioteca completa |
PUT / DELETE | /api/favorites/:id | Favoritar / desfavoritar |
POST | /api/favorites | Favorita várias de uma vez ({ tracks }) |
POST | /api/history | Registra uma faixa tocada |
POST | /api/playlists | Cria playlist |
PATCH / DELETE | /api/playlists/:pid | Renomeia / exclui |
POST / DELETE | /api/playlists/:pid/tracks[/:id] | Adiciona (uma faixa ou { tracks }) / remove faixa |
POST | /api/library/import | Importa backup ({ backup, mode: "merge" | "replace" }) |
GET | /api/system | Versões do yt-dlp, Deno, FFmpeg e downloads |
POST | /api/system/ytdlp | Atualiza ou instala o yt-dlp ({ channel: "stable" | "nightly" }) |
musike/
├─ server/ Fastify + yt-dlp + youtubei.js
│ └─ src/
│ ├─ app.ts rotas e inicialização (usado pelo CLI e pelo desktop)
│ ├─ ytdlp.ts resolução de streams, cache HD, tradução de erros
│ ├─ stream.ts proxy com HTTP Range
│ ├─ search.ts busca, sugestões, rádio e escolha do clipe oficial
│ ├─ library.ts playlists, favoritas, histórico e import de backup
│ ├─ tools.ts localiza yt-dlp, Deno, FFmpeg (registro do Windows, winget)
│ ├─ bootstrap.ts baixa as ferramentas para o app desktop
│ └─ system.ts versão e atualização do yt-dlp
├─ web/ React 19 + Vite + Tailwind v4 + Motion + Phosphor (PWA)
│ └─ src/
│ ├─ player/ motor de reprodução (áudio, vídeo, fila, Media Session)
│ ├─ components/ player, painéis, modo cinema, Ajustes, backup
│ ├─ views/ Início, Buscar, Biblioteca, playlists
│ └─ stores/ estado (zustand)
├─ desktop/ Electron: janela, servidor embutido, instalador NSIS
└─ docs/ benchmark de UX, design system e capturas de tela
Stack: TypeScript em tudo · Fastify 5 · youtubei.js · yt-dlp · React 19 · Vite 8 · Tailwind CSS 4 · Motion · Zustand · React Router · Phosphor Icons · Geist · Electron 44 · electron-builder.
Design: a identidade (marca de equalizador em M, cor Volt, Geist) e as regras de layout estão em docs/design-system.md. O estudo de UX que guiou o layout está em docs/ux-benchmark.md: observação do web player do Spotify, sem descompilar código.
Parou de tocar ou "O YouTube recusou o stream" O YouTube muda com frequência e o yt-dlp acompanha. Abra Ajustes e toque em Atualizar. Se a correção ainda não chegou ao canal Estável, escolha Nightly.
"O YouTube pediu verificação anti-bot" Passe cookies de um navegador logado (o Firefox funciona melhor no Windows):
$env:YTDLP_EXTRA_ARGS = "--cookies-from-browser firefox"; pnpm start
"yt-dlp não encontrado"
No app desktop, use Instalar em Ajustes. No servidor, instale com winget install yt-dlp.yt-dlp ou defina YTDLP_PATH.
O vídeo demora para começar Muitos vídeos não têm versão SD combinada; o servidor baixa e junta vídeo e áudio antes de tocar (alguns segundos na primeira vez, instantâneo depois, pelo cache).
"Esta música não tem clipe no YouTube" O Musike só aceita clipes publicados pelo canal do próprio artista, para não tocar covers ou versões erradas. A música continua tocando em áudio.
iPhone O iOS limita a reprodução em segundo plano de PWAs; o modo Áudio funciona melhor que o Vídeo.
O Musike é um projeto para uso pessoal e educacional. Reproduzir conteúdo do YouTube sem anúncios por extração de stream viola os Termos de Serviço do YouTube; serviços públicos que fizeram isso, como os bots Groovy e Rythm, foram encerrados após notificação do Google. Não publique o Musike como serviço, não o monetize e respeite os direitos dos artistas. O projeto não hospeda, distribui nem armazena conteúdo do YouTube além do cache local temporário de quem o executa.
MIT © 2026 Ernani Neto
197 followers · starred Oct 2026