spotid3
Version:
Tags your .MP3 files with just the filename and a source from Spotify.
142 lines (141 loc) • 6.5 kB
JavaScript
const spotify = require('spotifydb');
const id3 = require('node-id3');
const fs = require('fs');
const GET = (url) => {
return new Promise((resolve, reject) => {
require('https').get(require('url').parse(url), (response) => {
var data = [];
response.on('data', (chnk) => { data.push(chnk); });
response.on('end', () => {
resolve(Buffer.concat(data));
});
});
});
};
module.exports = {
track: (path, id) => {
return new Promise((resolve, reject) => {
spotify.track(id).then(async data => {
id3.Promise.write({
image: {
mime: 'image/jpeg',
type: { id: id3.TagConstants.AttachedPicture.PictureType.FRONT_COVER },
description: JSON.stringify(data.data.entity.coverArt.extractedColors),
imageBuffer: await GET(data.data.entity.coverArt.sources[0].url)
},
artist: (() => {
var arr = data.data.entity.artists;
var str = '';
for (var i = 0; i < arr.length; i++) {
if (i) { str += ', '; };
str += arr[i].name;
};
return str;
})(),
title: data.data.entity.title,
date: data.data.entity.releaseDate.isoString,
year: (new Date(data.data.entity.releaseDate.isoString)).getFullYear(),
album: data.data.entity.name,
comment: {
language: 'eng',
text: (() => { if (data.data.entity.isExplicit) { return 'explicit lyrics' }; return 'not explicit lyrics' })()
},
performerInfo: data.data.entity.artists[0].name
}, path).then(resolve).catch(reject);
});
});
},
album: (paths, id) => {
return new Promise((resolve, reject) => {
spotify.album(id).then(async data => {
const album = {
cover: {
mime: 'image/jpeg',
type: { id: id3.TagConstants.AttachedPicture.PictureType.FRONT_COVER },
imageBuffer: await GET(data.images[0].url)
},
name: data.name,
release: data.release_date,
year: data.release_date.split('-')[0],
copyright: `(${data.copyrights[0].type}) ${data.copyrights[0].text}`,
publisher: data.label,
artist: (() => {
var arr = data.artists;
var str = '';
for (var i = 0; i < arr.length; i++) {
if (i) { str += ', '; };
str += arr[i].name;
};
return str;
})()
};
var returns = [];
for (var i = 0; i < paths.length; i++) {
const track = data.tracks.items[i];
if (paths[i] != undefined) {
returns.push(await id3.Promise.write({
image: album.cover,
artist: (() => {
var arr = track.artists;
var str = '';
for (var i = 0; i < arr.length; i++) {
if (i) { str += ', '; };
str += arr[i].name;
};
return str;
})(),
title: track.name,
date: album.release,
year: album.year,
album: album.name,
comment: {
language: 'eng',
text: (() => { if (track.explicit) { return 'explicit lyrics' }; return 'not explicit lyrics' })()
},
performerInfo: album.artist,
trackNumber: track.track_number,
publisher: album.publisher,
copyright: album.copyright
}, paths[i]).catch(reject));
};
};
resolve(returns);
});
});
},
playlist: (paths, id) => {
return new Promise((resolve, reject) => {
spotify.playlist(id).then(async data => {
const playlist = {
cover: {
mime: 'image/jpeg',
type: { id: id3.TagConstants.AttachedPicture.PictureType.FRONT_COVER },
imageBuffer: await GET(data.data.entity.coverArt.sources[0].url)
},
title: data.data.entity.title,
createdBy: data.data.entity.subtitle
};
var returns = [];
for (var i = 0; i < paths.length; i++) {
const track = data.data.entity.trackList[i];
if (paths[i] != undefined) {
returns.push(await id3.Promise.write({
image: playlist.cover,
artist: track.subtitle,
title: track.title,
album: playlist.title,
comment: {
language: 'eng',
text: (() => { if (track.isExplicit) { return 'explicit lyrics' }; return 'not explicit lyrics' })()
},
performerInfo: playlist.createdBy,
trackNumber: i + 1,
publisher: playlist.createdBy
}, paths[i]).catch(reject));
};
};
resolve(returns);
});
});
}
};