Skip to content

Instantly share code, notes, and snippets.

@LukeChannings
Last active December 23, 2015 22:49
Show Gist options
  • Save LukeChannings/6706354 to your computer and use it in GitHub Desktop.
Save LukeChannings/6706354 to your computer and use it in GitHub Desktop.
Simple function to read ID3V1 tags.
module.exports = {
/**
* reads ID3v1 tags from a buffer.
* @param buffer {Buffer} a file buffer containing the tag. (Does not have to be the entire file.)
* @returns {Object} with properties for {String}"title" {String}"artist" {String}"album" {Number}"year" {Number}"track" {String}"comment" {String}"genre".
*/
getID3v1Tags: function(buffer) {
// who thought of this? it's stupid.
var genres = [
"Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies",
"Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska","Death Metal",
"Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion",
"Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock",
"Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave",
"Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta",
"Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native US", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes",
"Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk",
"Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde",
"Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening",
"Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus",
"Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul",
"Freestyle", "Duet", "Punk Rock", "Drum Solo", "Acapella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club - House",
"Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta Rap", "Heavy Metal",
"Black Metal", "Crossover", "Contemporary Christian", "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", "Synthpop"
];
// offsets.
var tagOffset = buffer.length - 128;
var titleOffset = tagOffset + 3;
var artistOffset = titleOffset + 30;
var albumOffset = artistOffset + 30;
var yearOffset = albumOffset + 30;
var commentOffset = yearOffset + 4;
var genreOffset = commentOffset + 30;
var tags = {};
var extraSpaceRegex = /[\u0]+$/g;
var header = buffer.toString("utf8", tagOffset, titleOffset);
if ( header === "TAG" ) {
// populate tags.
tags.title = buffer.toString("utf8", titleOffset, titleOffset + 30).replace(extraSpaceRegex, "");
tags.artist = buffer.toString("utf8", artistOffset, artistOffset + 30).replace(extraSpaceRegex, "");
tags.album = buffer.toString("utf8", albumOffset, albumOffset + 30).replace(extraSpaceRegex, "");
tags.year = parseInt(buffer.toString("utf8", yearOffset, yearOffset + 4), 10);
tags.track = buffer.readInt8(commentOffset + 28) === 0 ? buffer.readInt8(commentOffset + 29) : 0;
tags.comment = buffer.toString("utf8", commentOffset, commentOffset + ( tags.track ? 28 : 30)).replace(extraSpaceRegex, "");
tags.genre = genres[buffer.readInt8(genreOffset)];
}
return tags;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment