npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

cifraclub-wrapper

v1.0.3

Published

````md Wrapper em TypeScript para buscar, listar, baixar e transpor cifras do Cifra Club.

Readme

cifraclub-wrapper

Wrapper em TypeScript para buscar, listar, baixar e transpor cifras do Cifra Club.

A biblioteca permite:

- pesquisar músicas
- listar músicas de um songbook
- baixar cifras completas
- transpor tons
- ajustar capo
- filtrar apenas letras, acordes ou remover tablaturas

Ela expõe uma API simples para trabalhar com metadados e conteúdo processado das cifras.

## Instalação
npm install cifraclub-wrapper

ou

yarn add cifraclub-wrapper

Importação

import CifraClub from 'cifraclub-wrapper'

Também é possível importar os tipos e classes auxiliares:

import CifraClub, { Cifra, CifraList, CifraMeta } from 'cifraclub-wrapper'

Visão geral

A biblioteca possui três estruturas principais:

CifraClub

Classe principal da API.

Responsável por:

  • pesquisar músicas
  • listar músicas de um songbook
  • baixar várias cifras
  • carregar uma cifra individual

Cifra

Representa uma cifra individual já carregada.

Permite:

  • acessar metadados
  • acessar conteúdo estruturado
  • transpor a cifra
  • alterar capo
  • extrair apenas letras
  • extrair apenas acordes
  • remover tablaturas

CifraList

Representa uma coleção de cifras.

Permite aplicar filtros em lote, como:

  • lyrics()
  • chords()
  • noTabs()

Exemplo rápido

import CifraClub from 'cifraclub-wrapper'

async function main() {
  const results = await CifraClub.search('quanta coisa tenho feito')

  if (!results.length) return

  const cifra = await CifraClub.get(results[0])

  if (!cifra) return

  console.log(cifra.metadata)
  console.log(cifra.data)
}

main()

API

CifraClub.search(search: string): Promise<CifraMeta[]>

Pesquisa músicas no Cifra Club a partir de um texto.

Exemplo

const results = await CifraClub.search('Aclame ao Senhor')

console.log(results)

Retorno

Um array de objetos CifraMeta com dados básicos da música encontrada.

Observação

O retorno da busca é inicial e pode não conter todos os campos completos até que a cifra seja carregada com get().


CifraClub.list(id: string): Promise<CifraMeta[]>

Lista as músicas de um songbook pelo ID.

Exemplo

const musics = await CifraClub.list('123456')

console.log(musics)

Retorno

Um array de CifraMeta com informações mais completas, incluindo:

  • tom original
  • capo
  • afinação
  • versão
  • id da música
  • autor

CifraClub.get(data: CifraMeta): Promise<Cifra | boolean>

Carrega uma cifra a partir de um objeto CifraMeta.

Exemplo

const results = await CifraClub.search('Porque Ele Vive')
const cifra = await CifraClub.get(results[0])

if (cifra) {
  console.log(cifra.metadata)
  console.log(cifra.data)
}

Retorno

Retorna uma instância de Cifra em caso de sucesso, ou false em caso de erro.


CifraClub.downloadList(data?: CifraMeta[]): Promise<CifraList>

Baixa várias cifras e devolve uma coleção CifraList.

Exemplo

const musics = await CifraClub.list('123456')
const cifras = await CifraClub.downloadList(musics)

console.log(cifras.data)

Classe Cifra

Representa uma cifra já carregada e processada.

Propriedades

html_url: string

URL pública da cifra no site.

metadata

Retorna os metadados da cifra.

console.log(cifra.metadata)

data

Retorna o conteúdo estruturado da cifra.

console.log(cifra.data)

Formato do conteúdo:

Array<{
  type: string
  text: string
}>

Exemplo:

[
  { type: 'indicator_chords', text: '[Intro] C  G  Am  F' },
  { type: 'lyrics', text: 'Quanta coisa tenho feito...' },
  { type: 'chords', text: 'C      G      Am      F' }
]

Métodos

await cifra.get()

Carrega ou recarrega a cifra.

Exemplo

await cifra.get()

cifra.lyrics(): Cifra

Retorna uma nova instância contendo apenas linhas de letra.

Exemplo

const lyricsOnly = cifra.lyrics()

console.log(lyricsOnly.data)

cifra.chords(): Cifra

Retorna uma nova instância contendo apenas linhas de acordes e indicadores.

Exemplo

const chordsOnly = cifra.chords()

console.log(chordsOnly.data)

cifra.noTabs(): Cifra

Retorna uma nova instância sem linhas de tablatura.

Exemplo

const semTabs = cifra.noTabs()

console.log(semTabs.data)

await cifra.transpose(halfsteps = 0)

Transpõe a cifra em semitons.

Exemplo

await cifra.transpose(2)   // sobe 2 semitons
await cifra.transpose(-1)  // desce 1 semitom

Observação

A transposição altera o conteúdo carregado da cifra.


await cifra.capo(capo = 0)

Altera o capo da música e recalcula o tom exibido nos metadados.

Exemplo

await cifra.capo(2)

console.log(cifra.metadata.tone)

Classe CifraList

Coleção de cifras.

Propriedade

data: Cifra[]

Array com todas as cifras carregadas.


Métodos

push(...items)

Adiciona cifras à lista.

list.push(cifra1, cifra2)

lyrics(): CifraList

Aplica lyrics() em todas as cifras da lista.

const onlyLyrics = list.lyrics()

chords(): CifraList

Aplica chords() em todas as cifras da lista.

const onlyChords = list.chords()

noTabs(): CifraList

Remove tablaturas de todas as cifras da lista.

const noTabs = list.noTabs()

Tipo CifraMeta

Estrutura de metadados usada pela biblioteca.

type CifraMeta = {
  path: string
  position: number
  hash: URLSearchParams
  name: string
  author: string
  tone_songbook: string
  capo_songbook: number
  tone: string
  id: string
  tuning: string
  version: string
  minor: boolean
}

Campos principais

name

Nome da música.

author

Nome do artista ou autor.

tone_songbook

Tom original informado no songbook.

capo_songbook

Capotraste original informado.

tone

Tom calculado considerando capo.

tuning

Afinação da música.

version

Versão da cifra.

minor

Indica se a música está em tonalidade menor.


Tipos de linha no conteúdo

O conteúdo processado da cifra é dividido em linhas com tipos.

Os tipos mais comuns são:

lyrics

Linha de letra.

chords

Linha de acordes.

tab

Linha de tablatura.

indicator_lyrics

Linha de seção com letra, como [Refrão].

indicator_chords

Linha de seção com acordes, como [Intro].

empty

Linha vazia.


Exemplos completos

Buscar e carregar a primeira música encontrada

import CifraClub from 'cifraclub-wrapper'

async function main() {
  const results = await CifraClub.search('Aclame ao Senhor')

  if (!results.length) {
    console.log('Nenhuma música encontrada')
    return
  }

  const cifra = await CifraClub.get(results[0])

  if (!cifra) {
    console.log('Erro ao carregar cifra')
    return
  }

  console.log('Metadados:', cifra.metadata)
  console.log('Conteúdo:', cifra.data)
}

main()

Baixar várias cifras de um songbook

import CifraClub from 'cifraclub-wrapper'

async function main() {
  const musics = await CifraClub.list('123456')
  const list = await CifraClub.downloadList(musics)

  console.log(list.data.length)
}

main()

Trabalhar apenas com letras

const cifra = await CifraClub.get(meta)

if (cifra) {
  const onlyLyrics = cifra.lyrics()
  console.log(onlyLyrics.data)
}

Trabalhar apenas com acordes

const cifra = await CifraClub.get(meta)

if (cifra) {
  const onlyChords = cifra.chords()
  console.log(onlyChords.data)
}

Remover tablaturas

const cifra = await CifraClub.get(meta)

if (cifra) {
  const clean = cifra.noTabs()
  console.log(clean.data)
}

Transpor música

const cifra = await CifraClub.get(meta)

if (cifra) {
  await cifra.transpose(1)
  console.log(cifra.data)
}

Ajustar capo

const cifra = await CifraClub.get(meta)

if (cifra) {
  await cifra.capo(3)
  console.log(cifra.metadata.tone)
}

Observações

Esta biblioteca depende da estrutura atual das respostas e páginas do Cifra Club. Mudanças no HTML ou nos endpoints utilizados podem impactar o funcionamento.

As operações de download em lote incluem pequeno intervalo entre requisições para reduzir a agressividade das chamadas.


Compatibilidade

Compatível com ambientes Node.js que suportem:

  • URLSearchParams
  • async/await

Licença

MIT

MIT License

Copyright (c) 2026 Sebastião Jonas

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.