spotifydb
Version:
Fetches song/album/playlist/podcast data from Spotify without any API key data.
57 lines (54 loc) • 2.73 kB
JavaScript
const https = require('https');
const request = (path, callback, subdomain) => {
var newsd = subdomain;
if (!newsd) {newsd = 'open';};
https.get({host: newsd + '.spotify.com', port: 443, path: path, headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'}}, (r) => {
var data = ''; r.setEncoding('utf8'); r.on('data', (chnk) => {data += chnk}); r.on('end', _ => {callback(data); return null;}); return null;
});
return null;
};
module.exports = {
track: (id) => {
return new Promise((resolve, reject) => {
request('/embed/track/' + id, data => {
resolve(JSON.parse(Buffer.from(data.split('<script id="initial-state" type="text/plain">')[1].split('</script>')[0], 'base64').toString('utf8'))); return null;
});
});
},
album: (id) => {
return new Promise((resolve, reject) => {
request('/embed-legacy/album/' + id, data => {
resolve(JSON.parse(Buffer.from(data.split('<script id="resource" type="text/plain">')[1].split('</script>')[0], 'base64').toString('utf8'))); return null;
});
});
},
artist: (id) => {
return new Promise((resolve, reject) => {
request('/embed-legacy/artist/' + id, data => {
resolve(JSON.parse(Buffer.from(data.split('<script id="resource" type="text/plain">')[1].split('</script>')[0], 'base64').toString('utf8'))); return null;
});
});
},
playlist: (id) => {
return new Promise((resolve, reject) => {
request('/embed/playlist/' + id, data => {
resolve(JSON.parse(Buffer.from(data.split('<script id="initial-state" type="text/plain">')[1].split('</script>')[0], 'base64').toString('utf8'))); return null;
});
});
},
episode: (id) => {
return new Promise((resolve, reject) => {
request('/embed/episode/' + id, data => {
resolve(JSON.parse(Buffer.from(data.split('<script id="initial-state" type="text/plain">')[1].split('</script>')[0], 'base64').toString('utf8'))); return null;
});
});
},
episode_url: (id) => { // .url items don't work good for playing/downloading, use .passthroughUrl instead
return new Promise((resolve, reject) => {
request('/soundfinder/v1/unauth/episode/' + id + '/com.widevine.alpha', data => {
resolve(JSON.parse(data)); return null;
}, 'spclient.wg'); return null;
});
}
// show is missing, because it would return the data from ep. 1 of the podcast :/
};