⭐️ Genius.com API client with lyric scraping
yarn add lyricist
or
npm install lyricist
Get an access token at https://genius.com/api-clients
const lyricist = new Lyricist(accessToken);
Use song()
to fetch a song by ID:
const song = await lyricist.song(714198);
console.log(song.title);
// output: Death with Dignity
lyricist.song(714198).then(song => console.log(song.title));
The Genius API doesn't offer lyrics, but Lyricist can scrape Genius.com for you. Simply provide the fetchLyrics
option like this:
const song = await lyricist.song(714198, { fetchLyrics: true });
console.log(song.lyrics);
// output: Spirit of my silence I can hear you...
Use album()
to look up an album by ID. The Genius API doesn't allow you to search an album by title, but song() will return an album.id
:
const album = await lyricist.album(56682);
console.log(`${album.name} by ${album.artist.name}`);
// output: Lanterns by Son Lux
The Genius API doesn't provide tracklists, but Lyricist can scrape Genius.com and return the tracklist for you. Simply provide the fetchTracklist
option like this:
const album = await lyricist.album(56682, { fetchTracklist: true });
console.log(album.songs);
// output: [{ id: 502102, title: 'Alternate World', ... }, { id: 267773, title: 'Lost It To Trying', ... }, ...]
Use artist()
to look up an artist by ID:
const artist = await lyricist.artist(2);
console.log(artist.name);
// output: Jay Z
Use songsByArtist()
to list an artist's songs. Example usage:
const songs = await lyricist.songsByArtist(2);
songsByArtist()
will show 20 results per page by default, and can be as high as 50.
You can provide options as a second parameter. The available options are:
perPage
: Number (default: 20)page
: Number (default: 1)sort
String: 'title' or 'popularity' (default: 'title')
Example:
const songs = await lyricist.songsByArtist(2, { page: 2, perPage: 50 });
Use search()
to search for songs:
const songs = await lyricist.search('Virtual Insanity - Jamiroquai');
console.log(songs);
/* output: (Array of all matching songs)
[
{
annotation_count: 1,
api_path: '/songs/1952220',
full_title: 'Virtual insanity - remastered by Jamiroquai',
header_image_thumbnail_url: 'https://images.genius.com/cd9bd5e1d6d23c9a8b044843831d4b3c.300x300x1.png',
header_image_url: 'https://images.genius.com/cd9bd5e1d6d23c9a8b044843831d4b3c.820x820x1.png',
id: 1952220,
...
},
...
]
*/
The Genius API lets you specify how the response text is formatted. Supported formatting options are dom
(default), plain
and html
. See https://docs.genius.com/#/response-format-h1 for further information. The textFormat
option is supported by song()
, album()
and artist()
.
const song = lyricist.song(714198, { textFormat: 'html' });
console.log(song.description.html);
// output: <p>The first track off of Sufjan’s 2015 album...
Take care when fetching lyrics. This feature isn't officially supported by the Genius API, so use caching and rate-limit your app's requests as much as possible.
Node 6 doesn't support async/await and will need to use the transpiled version (lyricist/node6) along with promises:
const Lyricist = require('lyricist/node6');
Future updates will likely remove this support for old versions of Node
Check the Genius.com API docs for more info.