Skip to content

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A file resolving into a waveform and then into frequency bands

Song Finder

Identify any song from a link or an audio file, then read its BPM, musical key and Camelot code — from your terminal or your code.

npm downloads License Node TypeScript Dependencies API key Website

English · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français


Official clients for Song Finder, a free online song finder that identifies music from a file, a microphone recording or a link. No API key. No account. No rate card.


Quick start

npx songfinder identify "https://www.youtube.com/watch?v=..."
npx songfinder analyze "strobe deadmau5"
I Remember (Strobelight Edit) — deadmau5
Strobelite Seduction (2013)
ISRC:           USUS10800096

Tempo:          128 BPM
Key:            B Minor (Camelot 10A, Open Key 3m)
Mixes with:     10B, 9A, 11A
Energy:         59%
Danceability:   66%
Valence:        49%
Loudness:       -7.2 dB

(Real output, not a mock-up.)


Install

npm install -g songfinder      # CLI on your PATH
npm install songfinder         # as a library

Node.js 20+. Zero runtime dependencies.


CLI

songfinder identify <url|file> [--start <seconds>]
songfinder search   <query>
songfinder analyze  <query|ISRC>
songfinder similar  <query|ISRC> [--limit <n>] [--harmonic]

Every command that names a track accepts either an ISRC or a plain search phrase — you never have to look a code up by hand first. Add --json anywhere to get the raw API response instead of formatted text.

# what is playing in this video
songfinder identify "https://www.tiktok.com/@user/video/123..."

# what is this file on disk
songfinder identify ~/Music/unknown.mp3

# sample 90 seconds in, when the opening is silence or an intro
songfinder identify "https://youtu.be/..." --start 90

# five tracks that mix harmonically into this one
songfinder similar "strobe deadmau5" --harmonic --limit 5

Library

import { SongFinder, tempoDisagrees } from 'songfinder';

const sf = new SongFinder();

const [track] = await sf.search('blinding lights weeknd');
const detail = await sf.detail(track.isrc);

console.log(detail.features?.tempo);        // 171.005
console.log(detail.features?.key?.camelot); // "3B"
console.log(detail.features?.key?.compatible); // ["3A", "2B", "4B"]

if (tempoDisagrees(detail)) {
  // a second provider read this at half or double time — see below
}
Method Returns
search(query) Up to 10 catalogue candidates with ISRCs
detail(isrc) Tempo, key, Camelot code, energy/danceability/valence, genre
similar(isrc, { limit, harmonic }) Neighbouring tracks, each with its own tempo and key
identifyUrl(url, startSeconds?) Recognition from a page or media URL
identifyFile(bytes, name, mime) Recognition from an audio buffer (max 10MB)
resolveIsrc(title, artist) Bridges recognition output to the analysis methods

Everything is fully typed. SongFinderError carries the HTTP status when there was one.


Two things this gets right

Half-time and double-time tempo. detail() returns a second provider's reading in tempoCrossCheck. When the two disagree by more than 3 BPM, one of them counted the groove at half speed — an 87/174 pair is the same track. tempoDisagrees(detail) tells you; the CLI prints a warning. Reporting the primary figure alone is how tempo data most often misleads people.

Recognition returns no ISRC. Every analysis endpoint is keyed by ISRC, so the chain would dead-end right after the interesting part. resolveIsrc() closes that gap with one catalogue search, and never throws — a lookup failure must not sink a successful match.


Notes

Recognition is rate-limited per IP because it spends paid third-party quota. The analysis endpoints allow roughly one call per 1–5 seconds depending on how far they fan out upstream. A 429 means you went too fast, not that the track is missing.

The credited artist is not always the original artist. Widely re-uploaded tracks match white-label catalogue entries, so a famous song can come back credited to a label nobody has heard of. The title is still right — search that title to find the original release.

Audio you identify is uploaded to songfinder.dev and is not retained. Analysis calls send only a text query or an ISRC — no audio.

Coverage is uneven for long-tail releases. Many have a tempo but no key, or no analysis at all. Missing fields come back null rather than being invented.


Also available

songfinder-mcp MCP server — the same capabilities inside Claude, Cursor, Windsurf or Zed
songfinder-skills Claude Code Agent Skills, no install beyond curl
Song Finder — free online song finder The web app: identify by file, microphone or link, plus BPM/key detection, a Camelot wheel, stem separation, audio trimming and more
Song finder browser extensions Chrome, Edge, Firefox and a userscript

Repository layout

js/       npm package "songfinder" — client + CLI
assets/   README artwork

Development

cd js
pnpm install
pnpm build
node dist/cli.js analyze "strobe deadmau5"

License

MIT

About

Identify any song from a link or an audio file, then read its BPM, musical key and Camelot code — from your terminal or your code. Node.js and Python clients, zero runtime dependencies, no API key.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages