UNPKG

spotid3

Version:

Tags your .MP3 files with just the filename and a source from Spotify.

142 lines (141 loc) 6.5 kB
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); }); }); } };