Depois de clonar ou baixar este repositorio, execute o instalador na pasta raiz:
- Linux/Termux:
bash serversetup.sh - Windows:
serversetup.bat
O instalador prepara Node.js 22+, Git e yt-dlp, instala as dependencias do
backend e inicia o servidor. No Linux, o script suporta Termux e distribuicoes
Debian/Ubuntu com apt-get; no Windows, requer o WinGet.
O Lify é um projeto experimental de aplicativo móvel para descoberta e reprodução de música. Busca faixas e metadados no YouTube Music, mantém uma biblioteca local e reproduz áudio por meio de um servidor Node.js independente.
Projeto de estudo, sem finalidade comercial. O Lify é fornecido como projeto experimental, sem garantias de disponibilidade ou adequação para qualquer uso. Não é um serviço oficial do Spotify, do YouTube ou do Google, nem é afiliado ou endossado por essas empresas.
- Busca faixas e informações de catálogo usando
youtubei.js. - Na versão web, usa o backend para pesquisar o catálogo e carregar artistas, álbuns e playlists.
- Reproduz áudio em segundo plano com
react-native-track-player. - Mantém favoritos, histórico, playlists e preferências no próprio dispositivo, usando SQLite; esses dados não são enviados ao servidor de áudio.
- Permite organizar uma fila de reprodução e importar playlists públicas do YouTube Music para a biblioteca local.
- Permite importar arquivos de áudio do dispositivo para playlists locais e reproduzi-los sem conexão.
- Permite guardar faixas para reprodução offline no aplicativo móvel.
- Permite exportar/importar backups da biblioteca e agendar cópias locais
diárias, semanais ou mensais. O sistema pode atrasar as tarefas em segundo
plano; os backups portáteis
.lifybackupincluem os arquivos de áudio importados e podem ser exportados ou restaurados em outro aparelho. - Oferece interface em português e inglês, escolha do servidor de áudio e reprodução fixa no perfil de poupança de dados.
O aplicativo é feito com React Native, Expo e Expo Router.
O código-fonte está disponÃvel neste repositório. As versões preparadas para uso
são o app Android e a versão web executada localmente em localhost; não há um
site público hospedado por este projeto.
O projeto pode ser compilado para iPhone usando um ambiente de desenvolvimento iOS compatÃvel, mas não há um app iOS compilado ou distribuÃdo neste repositório. A compilação para iOS não é uma versão pronta para instalação aqui.
O servidor de áudio está em backend/. Ele é uma API Node.js
independente, não um servidor de contas ou de biblioteca. O app envia o ID de
uma faixa; o servidor usa yt-dlp para resolver uma URL de áudio disponÃvel e
encaminha a resposta do YouTube CDN ao player.
App mobile ── busca e metadados ──> YouTube Music (youtubei.js)
App web ── catálogo ──> API Node ──> YouTube Music (youtubei.js)
│
├── ID da faixa ──> API Node (yt-dlp) ──> YouTube CDN ──> player
└── biblioteca, fila e preferências ──> SQLite no dispositivo
O endpoint de áudio encaminha pedidos HTTP Range, necessários para o player
procurar diferentes posições da faixa. O servidor não acumula o áudio inteiro
na memória nem o guarda em cache; mantém em cache, por tempo limitado, apenas
metadados da resolução e URLs temporárias. O app usa sempre o perfil
dataSaver; a API também mantém o perfil standard para compatibilidade com
outros clientes. Se um bloco tardio do Innertube falhar, a próxima tentativa
usa yt-dlp por até dois minutos. Há limites para resoluções simultâneas e
timeouts para pedidos. O endpoint
/health informa se o servidor está ativo.
Rotas da API:
GET /healthGET /stream/:videoId?profile=standardGET /stream/:videoId?profile=dataSaverGET /download/:videoId?profile=dataSaverpara downloads explÃcitos.GET /catalog/search,/catalog/suggestions,/catalog/artist/:id,/catalog/collection/:kind/:ide/catalog/related/:videoIdpara o catálogo usado pelo cliente web.
O perfil dataSaver é o usado pelo app. A API também aceita standard em
/stream para compatibilidade com outros clientes. Consulte o
README do backend para detalhes dos resolvedores,
timeouts, pedidos Range, configuração e publicação.
Requer Node.js compatÃvel com Expo SDK 57. Para executar no Android, configure o ambiente de desenvolvimento Android e, na raiz do repositório, execute:
cd frontend
npm install
npx expo prebuild
npm run androidPara iPhone, a compilação exige um ambiente iOS compatÃvel; o repositório não
inclui um binário iOS pronto. Os scripts da raiz encaminham os comandos start,
android, ios, test e typecheck para frontend/.
Requer Node.js 22 ou superior. Em outro terminal, na raiz do repositório:
cd backend
npm install
npm run devO servidor escuta na porta 4000 por padrão. Para escolher outra porta,
defina a variável PORT. Para iniciar em modo normal, use npm start.
O app não vem com um servidor de áudio predefinido. Na primeira abertura, ele mostra um aviso para configurar o endereço em Ajustes → Servidor de áudio. Inicie sua própria cópia do backend e informe o respectivo endereço. Em um dispositivo fÃsico, use o endereço local do computador e conecte ambos à mesma rede. Esses valores são instruções de configuração e não vêm preenchidos no app ou no build.
O app também permite escolher um servidor personalizado em Ajustes → Servidor
de áudio. Um servidor personalizado precisa implementar as rotas e encaminhar
os pedidos Range descritos acima.
Para gerar os arquivos web localmente, execute na raiz do repositório:
- Windows:
webbuild.bat - Linux/macOS:
bash webbuild.sh
Os scripts instalam as dependências do frontend com npm ci e exportam o site
para frontend/dist. No Windows, depois execute web.bat para servi-lo na
porta 5000 e abra http://localhost:5000 no navegador. web.bat apenas serve
a exportação existente; não a compila.
A versão web usa o backend para busca e reprodução. Inicie o backend separadamente e informe o endereço dele em Ajustes → Servidor de áudio. A biblioteca e as preferências continuam armazenadas localmente no navegador.
A interface foi inspirada em padrões visuais de aplicativos de streaming,
especialmente na organização de conteúdo, navegação e apresentação do player
associadas ao Spotify. O Lify é um projeto independente e não representa o
Spotify. Parte das telas e dos componentes deriva de um projeto de interface
distribuÃdo sob licença MIT; os créditos e avisos de licença estão em
frontend/THIRD_PARTY_NOTICES.md.
O servidor incluÃdo existe para desenvolvimento e experimentação neste projeto;
não é uma oferta de hospedagem ou um serviço público para uso comercial. Quem
quiser usar a API deve copiar o diretório backend/ para seu próprio ambiente,
instalá-lo e iniciá-lo localmente, ou em infraestrutura sob seu próprio
controle. Não dependa de uma instância hospedada por outra pessoa.
O app e o backend interagem com serviços e conteúdos de terceiros, incluindo YouTube/YouTube Music e o YouTube CDN. Antes de executar ou disponibilizar uma cópia, cada pessoa deve verificar e cumprir, por sua própria conta, os termos, condições, polÃticas e leis aplicáveis desses terceiros. O fato de o código estar disponÃvel não concede direitos sobre conteúdos, não constitui autorização do YouTube ou de titulares de direitos e não garante que qualquer uso seja permitido. O mantenedor deste projeto não fornece aconselhamento jurÃdico nem assume a responsabilidade pelo uso feito por terceiros.
# App: testes de lógica e verificação TypeScript
cd frontend
npm test
npm run typecheck
# API: testes do servidor
cd ..\backend
npm testfrontend/src/app/— rotas e telas do aplicativo.frontend/src/components/— componentes reutilizáveis e interface.frontend/src/features/— lógica e estado das funcionalidades.frontend/src/services/catalog/— busca e integração com o catálogo.frontend/src/services/audio/— fila, controle e serviço de reprodução.frontend/src/database/— banco SQLite, migrações e repositórios.frontend/src/storage/backups/— backups manuais e agendados.backend/— API Node.js para resolver e encaminhar áudio.frontend/THIRD_PARTY_NOTICES.md— créditos e licenças de terceiros.