mirror of
https://gitlab.com/RemixDev/deezer-js.git
synced 2024-12-28 02:16:18 +00:00
Made library work
This commit is contained in:
parent
f2ac5665e6
commit
8528617e07
314
deezer/api.js
314
deezer/api.js
|
@ -1,21 +1,21 @@
|
|||
const got = require('got')
|
||||
|
||||
// Possible values for order parameter in search
|
||||
export const SearchOrder = {
|
||||
RANKING : "RANKING"
|
||||
TRACK_ASC : "TRACK_ASC"
|
||||
TRACK_DESC : "TRACK_DESC"
|
||||
ARTIST_ASC : "ARTIST_ASC"
|
||||
ARTIST_DESC : "ARTIST_DESC"
|
||||
ALBUM_ASC : "ALBUM_ASC"
|
||||
ALBUM_DESC : "ALBUM_DESC"
|
||||
RATING_ASC : "RATING_ASC"
|
||||
RATING_DESC : "RATING_DESC"
|
||||
DURATION_ASC : "DURATION_ASC"
|
||||
const SearchOrder = {
|
||||
RANKING : "RANKING",
|
||||
TRACK_ASC : "TRACK_ASC",
|
||||
TRACK_DESC : "TRACK_DESC",
|
||||
ARTIST_ASC : "ARTIST_ASC",
|
||||
ARTIST_DESC : "ARTIST_DESC",
|
||||
ALBUM_ASC : "ALBUM_ASC",
|
||||
ALBUM_DESC : "ALBUM_DESC",
|
||||
RATING_ASC : "RATING_ASC",
|
||||
RATING_DESC : "RATING_DESC",
|
||||
DURATION_ASC : "DURATION_ASC",
|
||||
DURATION_DESC : "DURATION_DESC"
|
||||
}
|
||||
|
||||
export class API{
|
||||
class API{
|
||||
constructor(cookie_jar, headers){
|
||||
this.http_headers = headers
|
||||
this.cookie_jar = cookie_jar
|
||||
|
@ -24,15 +24,17 @@ export class API{
|
|||
|
||||
async api_call(method, args){
|
||||
if (typeof args == "undefined") args = {}
|
||||
if this.access_token: args.access_token = this.access_token
|
||||
if (this.access_token) args.access_token = this.access_token
|
||||
let result_json;
|
||||
try {
|
||||
const result_json = await got.get("https://api.deezer.com/" + method, {
|
||||
result_json = await got.get("https://api.deezer.com/" + method, {
|
||||
searchParams: args,
|
||||
cookieJar: this.cookie_jar,
|
||||
headers: this.http_headers,
|
||||
timeout: 30000
|
||||
}).json()
|
||||
} catch (error) {
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
await new Promise(r => setTimeout(r, 2000)) // sleep(2000ms)
|
||||
return await this.api_call(method, args)
|
||||
}
|
||||
|
@ -51,177 +53,177 @@ export class API{
|
|||
if (result_json.error.code == 800) throw new DataException(`DataException: ${method} ${result_json.error.message || ""}`)
|
||||
if (result_json.error.code == 901) throw new IndividualAccountChangedNotAllowedException(`IndividualAccountChangedNotAllowedException: ${method} ${result_json.error.message || ""}`)
|
||||
}
|
||||
throw APIError(result_json.error))
|
||||
throw APIError(result_json.error)
|
||||
}
|
||||
return result_json
|
||||
}
|
||||
|
||||
async get_album(album_id){
|
||||
return await this.api_call(`album/${album_id}`)
|
||||
get_album(album_id){
|
||||
return this.api_call(`album/${album_id}`)
|
||||
}
|
||||
|
||||
async get_album_by_UPC(upc){
|
||||
return await this.get_album(`upc:${upc}`)
|
||||
get_album_by_UPC(upc){
|
||||
return this.get_album(`upc:${upc}`)
|
||||
}
|
||||
|
||||
async get_album_comments(album_id, index=0, limit=10){
|
||||
return await this.api_call(`album/${album_id}/comments`, {index, limit})
|
||||
get_album_comments(album_id, index=0, limit=10){
|
||||
return this.api_call(`album/${album_id}/comments`, {index, limit})
|
||||
}
|
||||
|
||||
async get_album_fans(album_id, index=0, limit=100){
|
||||
return await this.api_call(`album/${album_id}/fans`, {index, limit})
|
||||
get_album_fans(album_id, index=0, limit=100){
|
||||
return this.api_call(`album/${album_id}/fans`, {index, limit})
|
||||
}
|
||||
|
||||
async get_album_tracks(album_id, index=0, limit=-1){
|
||||
return await this.api_call(`album/${album_id}/tracks`, {index, limit})
|
||||
get_album_tracks(album_id, index=0, limit=-1){
|
||||
return this.api_call(`album/${album_id}/tracks`, {index, limit})
|
||||
}
|
||||
|
||||
async get_artist(artist_id){
|
||||
return await this.api_call(`artist/${artist_id}`)
|
||||
get_artist(artist_id){
|
||||
return this.api_call(`artist/${artist_id}`)
|
||||
}
|
||||
|
||||
async get_artist_top(artist_id, index=0, limit=10){
|
||||
return await this.api_call(`artist/${artist_id}/top`, {index, limit})
|
||||
get_artist_top(artist_id, index=0, limit=10){
|
||||
return this.api_call(`artist/${artist_id}/top`, {index, limit})
|
||||
}
|
||||
|
||||
async get_artist_albums(artist_id, index=0, limit=-1){
|
||||
return await this.api_call(`artist/${artist_id}/albums`, {index, limit})
|
||||
get_artist_albums(artist_id, index=0, limit=-1){
|
||||
return this.api_call(`artist/${artist_id}/albums`, {index, limit})
|
||||
}
|
||||
|
||||
async get_artist_comments(artist_id, index=0, limit=10){
|
||||
return await this.api_call(`artist/${artist_id}/comments`, {index, limit})
|
||||
get_artist_comments(artist_id, index=0, limit=10){
|
||||
return this.api_call(`artist/${artist_id}/comments`, {index, limit})
|
||||
}
|
||||
|
||||
async get_artist_fans(artist_id, index=0, limit=100){
|
||||
return await this.api_call(`artist/${artist_id}/fans`, {index, limit})
|
||||
get_artist_fans(artist_id, index=0, limit=100){
|
||||
return this.api_call(`artist/${artist_id}/fans`, {index, limit})
|
||||
}
|
||||
|
||||
async get_artist_related(artist_id, index=0, limit=20){
|
||||
return await this.api_call(`artist/${artist_id}/related`, {index, limit})
|
||||
get_artist_related(artist_id, index=0, limit=20){
|
||||
return this.api_call(`artist/${artist_id}/related`, {index, limit})
|
||||
}
|
||||
|
||||
async get_artist_radio(artist_id, index=0, limit=25){
|
||||
return await this.api_call(`artist/${artist_id}/radio`, {index, limit})
|
||||
get_artist_radio(artist_id, index=0, limit=25){
|
||||
return this.api_call(`artist/${artist_id}/radio`, {index, limit})
|
||||
}
|
||||
|
||||
async get_artist_playlists(artist_id, index=0, limit=-1){
|
||||
return await this.api_call(`artist/${artist_id}/playlists`, {index, limit})
|
||||
get_artist_playlists(artist_id, index=0, limit=-1){
|
||||
return this.api_call(`artist/${artist_id}/playlists`, {index, limit})
|
||||
}
|
||||
|
||||
async get_chart(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`chart/${genre_id}`, {index, limit})
|
||||
get_chart(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`chart/${genre_id}`, {index, limit})
|
||||
}
|
||||
|
||||
async get_chart_tracks(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`chart/${genre_id}/tracks`, {index, limit})
|
||||
get_chart_tracks(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`chart/${genre_id}/tracks`, {index, limit})
|
||||
}
|
||||
|
||||
async get_chart_albums(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`chart/${genre_id}/albums`, {index, limit})
|
||||
get_chart_albums(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`chart/${genre_id}/albums`, {index, limit})
|
||||
}
|
||||
|
||||
async get_chart_artists(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`chart/${genre_id}/artists`, {index, limit})
|
||||
get_chart_artists(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`chart/${genre_id}/artists`, {index, limit})
|
||||
}
|
||||
|
||||
async get_chart_playlists(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`chart/${genre_id}/playlists`, {index, limit})
|
||||
get_chart_playlists(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`chart/${genre_id}/playlists`, {index, limit})
|
||||
}
|
||||
|
||||
async get_chart_podcasts(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`chart/${genre_id}/podcasts`, {index, limit})
|
||||
get_chart_podcasts(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`chart/${genre_id}/podcasts`, {index, limit})
|
||||
}
|
||||
|
||||
async get_comment(comment_id){
|
||||
return await this.api_call(`comment/${comment_id}`)
|
||||
get_comment(comment_id){
|
||||
return this.api_call(`comment/${comment_id}`)
|
||||
}
|
||||
|
||||
async get_editorials(index=0, limit=10){
|
||||
return await this.api_call('editorial', {index, limit})
|
||||
get_editorials(index=0, limit=10){
|
||||
return this.api_call('editorial', {index, limit})
|
||||
}
|
||||
|
||||
async get_editorial(genre_id=0){
|
||||
return await this.api_call(`editorial/${genre_id}`)
|
||||
get_editorial(genre_id=0){
|
||||
return this.api_call(`editorial/${genre_id}`)
|
||||
}
|
||||
|
||||
async get_editorial_selection(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`editorial/${genre_id}/selection`, {index, limit})
|
||||
get_editorial_selection(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`editorial/${genre_id}/selection`, {index, limit})
|
||||
}
|
||||
|
||||
async get_editorial_charts(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`editorial/${genre_id}/charts`, {index, limit})
|
||||
get_editorial_charts(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`editorial/${genre_id}/charts`, {index, limit})
|
||||
}
|
||||
|
||||
async get_editorial_releases(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`editorial/${genre_id}/releases`, {index, limit})
|
||||
get_editorial_releases(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`editorial/${genre_id}/releases`, {index, limit})
|
||||
}
|
||||
|
||||
async get_genres(index=0, limit=10){
|
||||
return await this.api_call('genre', {index, limit})
|
||||
get_genres(index=0, limit=10){
|
||||
return this.api_call('genre', {index, limit})
|
||||
}
|
||||
|
||||
async get_genre(genre_id=0){
|
||||
return await this.api_call(`genre/${genre_id}`)
|
||||
get_genre(genre_id=0){
|
||||
return this.api_call(`genre/${genre_id}`)
|
||||
}
|
||||
|
||||
async get_genre_artists(genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`genre/${genre_id}/artists`, {index, limit})
|
||||
get_genre_artists(genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`genre/${genre_id}/artists`, {index, limit})
|
||||
}
|
||||
|
||||
async get_genre_radios( genre_id=0, index=0, limit=10){
|
||||
return await this.api_call(`genre/${genre_id}/radios`, {index, limit})
|
||||
get_genre_radios( genre_id=0, index=0, limit=10){
|
||||
return this.api_call(`genre/${genre_id}/radios`, {index, limit})
|
||||
}
|
||||
|
||||
async get_infos(){
|
||||
return await this.api_call('infos')
|
||||
get_infos(){
|
||||
return this.api_call('infos')
|
||||
}
|
||||
|
||||
async get_options(){
|
||||
return await this.api_call('options')
|
||||
get_options(){
|
||||
return this.api_call('options')
|
||||
}
|
||||
|
||||
async get_playlist(playlist_id){
|
||||
return await this.api_call(`playlist/${playlist_id}`)
|
||||
get_playlist(playlist_id){
|
||||
return this.api_call(`playlist/${playlist_id}`)
|
||||
}
|
||||
|
||||
async get_playlist_comments(album_id, index=0, limit=10){
|
||||
return await this.api_call(`playlist/${album_id}/comments`, {index, limit})
|
||||
get_playlist_comments(album_id, index=0, limit=10){
|
||||
return this.api_call(`playlist/${album_id}/comments`, {index, limit})
|
||||
}
|
||||
|
||||
async get_playlist_fans(album_id, index=0, limit=100){
|
||||
return await this.api_call(`playlist/${album_id}/fans`, {index, limit})
|
||||
get_playlist_fans(album_id, index=0, limit=100){
|
||||
return this.api_call(`playlist/${album_id}/fans`, {index, limit})
|
||||
}
|
||||
|
||||
async get_playlist_tracks(album_id, index=0, limit=-1){
|
||||
return await this.api_call(`playlist/${album_id}/tracks`, {index, limit})
|
||||
get_playlist_tracks(album_id, index=0, limit=-1){
|
||||
return this.api_call(`playlist/${album_id}/tracks`, {index, limit})
|
||||
}
|
||||
|
||||
async get_playlist_radio(album_id, index=0, limit=100){
|
||||
return await this.api_call(`playlist/${album_id}/radio`, {index, limit})
|
||||
get_playlist_radio(album_id, index=0, limit=100){
|
||||
return this.api_call(`playlist/${album_id}/radio`, {index, limit})
|
||||
}
|
||||
|
||||
async get_radios(index=0, limit=10){
|
||||
return await this.api_call('radio', {index, limit})
|
||||
get_radios(index=0, limit=10){
|
||||
return this.api_call('radio', {index, limit})
|
||||
}
|
||||
|
||||
async get_radios_genres(index=0, limit=25){
|
||||
return await this.api_call('radio/genres', {index, limit})
|
||||
get_radios_genres(index=0, limit=25){
|
||||
return this.api_call('radio/genres', {index, limit})
|
||||
}
|
||||
|
||||
async get_radios_top(index=0, limit=50){
|
||||
return await this.api_call('radio/top', {index, limit})
|
||||
get_radios_top(index=0, limit=50){
|
||||
return this.api_call('radio/top', {index, limit})
|
||||
}
|
||||
|
||||
async get_radios_lists(index=0, limit=25){
|
||||
return await this.api_call('radio/lists', {index, limit})
|
||||
get_radios_lists(index=0, limit=25){
|
||||
return this.api_call('radio/lists', {index, limit})
|
||||
}
|
||||
|
||||
async get_radio(radio_id){
|
||||
return await this.api_call(`radio/${radio_id}`)
|
||||
get_radio(radio_id){
|
||||
return this.api_call(`radio/${radio_id}`)
|
||||
}
|
||||
|
||||
async get_radio_tracks(radio_id, index=0, limit=40){
|
||||
return await this.api_call(`radio/${radio_id}/tracks`, {index, limit})
|
||||
get_radio_tracks(radio_id, index=0, limit=40){
|
||||
return this.api_call(`radio/${radio_id}/tracks`, {index, limit})
|
||||
}
|
||||
|
||||
_generate_search_advanced_query(artist="", album="", track="", label="", dur_min=0, dur_max=0, bpm_min=0, bpm_max=0){
|
||||
|
@ -244,92 +246,92 @@ export class API{
|
|||
return args
|
||||
}
|
||||
|
||||
async search(query, strict=false, order, index=0, limit=25){
|
||||
search(query, strict=false, order, index=0, limit=25){
|
||||
const args = this._generate_search_args(query, strict, order, index, limit)
|
||||
return await this.api_call('search', args)
|
||||
return this.api_call('search', args)
|
||||
}
|
||||
|
||||
async advanced_search(artist="", album="", track="", label="", dur_min=0, dur_max=0, bpm_min=0, bpm_max=0, strict=false, order, index=0, limit=25){
|
||||
advanced_search(artist="", album="", track="", label="", dur_min=0, dur_max=0, bpm_min=0, bpm_max=0, strict=false, order, index=0, limit=25){
|
||||
const query = this._generate_search_advanced_query(artist, album, track, label, dur_min, dur_max, bpm_min, bpm_max)
|
||||
return await this.search(query, strict, order, index, limit)
|
||||
return this.search(query, strict, order, index, limit)
|
||||
}
|
||||
|
||||
async search_album(query, strict=false, order, index=0, limit=25){
|
||||
search_album(query, strict=false, order, index=0, limit=25){
|
||||
const args = this._generate_search_args(query, strict, order, index, limit)
|
||||
return await this.api_call('search/album', args)
|
||||
return this.api_call('search/album', args)
|
||||
}
|
||||
|
||||
async search_artist(query, strict=false, order, index=0, limit=25){
|
||||
search_artist(query, strict=false, order, index=0, limit=25){
|
||||
const args = this._generate_search_args(query, strict, order, index, limit)
|
||||
return await this.api_call('search/artist', args)
|
||||
return this.api_call('search/artist', args)
|
||||
}
|
||||
|
||||
async search_playlist(query, strict=false, order, index=0, limit=25){
|
||||
search_playlist(query, strict=false, order, index=0, limit=25){
|
||||
const args = this._generate_search_args(query, strict, order, index, limit)
|
||||
return await this.api_call('search/playlist', args)
|
||||
return this.api_call('search/playlist', args)
|
||||
}
|
||||
|
||||
async search_radio(query, strict=false, order, index=0, limit=25){
|
||||
search_radio(query, strict=false, order, index=0, limit=25){
|
||||
const args = this._generate_search_args(query, strict, order, index, limit)
|
||||
return await this.api_call('search/radio', args)
|
||||
return this.api_call('search/radio', args)
|
||||
}
|
||||
|
||||
async search_track(query, strict=false, order, index=0, limit=25){
|
||||
search_track(query, strict=false, order, index=0, limit=25){
|
||||
const args = this._generate_search_args(query, strict, order, index, limit)
|
||||
return await this.api_call('search/track', args)
|
||||
return this.api_call('search/track', args)
|
||||
}
|
||||
|
||||
async search_user(query, strict=false, order, index=0, limit=25){
|
||||
search_user(query, strict=false, order, index=0, limit=25){
|
||||
const args = this._generate_search_args(query, strict, order, index, limit)
|
||||
return await this.api_call('search/user', args)
|
||||
return this.api_call('search/user', args)
|
||||
}
|
||||
|
||||
async get_track(song_id){
|
||||
return await this.api_call(`track/${song_id}`)
|
||||
get_track(song_id){
|
||||
return this.api_call(`track/${song_id}`)
|
||||
}
|
||||
|
||||
async get_track_by_ISRC(isrc){
|
||||
return await this.get_track(`isrc:${isrc}`)
|
||||
get_track_by_ISRC(isrc){
|
||||
return this.get_track(`isrc:${isrc}`)
|
||||
}
|
||||
|
||||
async get_user(user_id){
|
||||
return await this.api_call(`user/${user_id}`)
|
||||
get_user(user_id){
|
||||
return this.api_call(`user/${user_id}`)
|
||||
}
|
||||
|
||||
async get_user_albums(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/albums`, {index, limit})
|
||||
get_user_albums(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/albums`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_artists(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/artists`, {index, limit})
|
||||
get_user_artists(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/artists`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_artists(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/artists`, {index, limit})
|
||||
get_user_artists(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/artists`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_flow(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/flow`, {index, limit})
|
||||
get_user_flow(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/flow`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_following(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/followings`, {index, limit})
|
||||
get_user_following(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/followings`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_followers(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/followers`, {index, limit})
|
||||
get_user_followers(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/followers`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_playlists(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/playlists`, {index, limit})
|
||||
get_user_playlists(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/playlists`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_radios(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/radios`, {index, limit})
|
||||
get_user_radios(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/radios`, {index, limit})
|
||||
}
|
||||
|
||||
async get_user_tracks(user_id, index=0, limit=25){
|
||||
return await this.api_call(`user/${user_id}/tracks`, {index, limit})
|
||||
get_user_tracks(user_id, index=0, limit=25){
|
||||
return this.api_call(`user/${user_id}/tracks`, {index, limit})
|
||||
}
|
||||
|
||||
// Extra calls
|
||||
|
@ -367,57 +369,71 @@ export class API{
|
|||
}
|
||||
|
||||
// Base class for Deezer exceptions
|
||||
export class APIError extends Error {
|
||||
class APIError extends Error {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "APIError";
|
||||
}
|
||||
}
|
||||
export class ItemsLimitExceededException extends APIError {
|
||||
class ItemsLimitExceededException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "ItemsLimitExceededException";
|
||||
}
|
||||
}
|
||||
export class PermissionException extends APIError {
|
||||
class PermissionException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "PermissionException";
|
||||
}
|
||||
}
|
||||
export class InvalidTokenException extends APIError {
|
||||
class InvalidTokenException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "InvalidTokenException";
|
||||
}
|
||||
}
|
||||
export class WrongParameterException extends APIError {
|
||||
class WrongParameterException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "WrongParameterException";
|
||||
}
|
||||
}
|
||||
export class MissingParameterException extends APIError {
|
||||
class MissingParameterException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "MissingParameterException";
|
||||
}
|
||||
}
|
||||
export class InvalidQueryException extends APIError {
|
||||
class InvalidQueryException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "InvalidQueryException";
|
||||
}
|
||||
}
|
||||
export class DataException extends APIError {
|
||||
class DataException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "DataException";
|
||||
}
|
||||
}
|
||||
export class IndividualAccountChangedNotAllowedException extends APIError {
|
||||
class IndividualAccountChangedNotAllowedException extends APIError {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "IndividualAccountChangedNotAllowedException";
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
SearchOrder,
|
||||
API,
|
||||
APIError,
|
||||
ItemsLimitExceededException,
|
||||
PermissionException,
|
||||
InvalidTokenException,
|
||||
WrongParameterException,
|
||||
MissingParameterException,
|
||||
InvalidQueryException,
|
||||
DataException,
|
||||
IndividualAccountChangedNotAllowedException
|
||||
}
|
||||
|
|
179
deezer/gw.js
179
deezer/gw.js
|
@ -2,25 +2,25 @@ const got = require('got')
|
|||
const {map_artist_album, map_user_track, map_user_artist, map_user_album, map_user_playlist} = require('./utils.js')
|
||||
|
||||
// Explicit Content Lyrics
|
||||
export const LyricsStatus = {
|
||||
NOT_EXPLICIT: 0 // Not Explicit
|
||||
EXPLICIT: 1 // Explicit
|
||||
UNKNOWN: 2 // Unknown
|
||||
EDITED: 3 // Edited
|
||||
PARTIALLY_EXPLICIT: 4 // Partially Explicit (Album "lyrics" only)
|
||||
PARTIALLY_UNKNOWN: 5 // Partially Unknown (Album "lyrics" only)
|
||||
NO_ADVICE: 6 // No Advice Available
|
||||
const LyricsStatus = {
|
||||
NOT_EXPLICIT: 0, // Not Explicit
|
||||
EXPLICIT: 1, // Explicit
|
||||
UNKNOWN: 2, // Unknown
|
||||
EDITED: 3, // Edited
|
||||
PARTIALLY_EXPLICIT: 4, // Partially Explicit (Album "lyrics" only)
|
||||
PARTIALLY_UNKNOWN: 5, // Partially Unknown (Album "lyrics" only)
|
||||
NO_ADVICE: 6, // No Advice Available
|
||||
PARTIALLY_NO_ADVICE: 7 // Partially No Advice Available (Album "lyrics" only)
|
||||
}
|
||||
|
||||
export const PlaylistStatus = {
|
||||
PUBLIC: 0
|
||||
PRIVATE: 1
|
||||
COLLABORATIVE: 2
|
||||
const PlaylistStatus = {
|
||||
PUBLIC: 0,
|
||||
PRIVATE: 1,
|
||||
COLLABORATIVE: 2,
|
||||
}
|
||||
|
||||
|
||||
export const EMPTY_TRACK_OBJ = {
|
||||
const EMPTY_TRACK_OBJ = {
|
||||
SNG_ID: 0,
|
||||
SNG_TITLE: '',
|
||||
DURATION: 0,
|
||||
|
@ -33,7 +33,7 @@ export const EMPTY_TRACK_OBJ = {
|
|||
ART_NAME: ""
|
||||
}
|
||||
|
||||
export class GW{
|
||||
class GW{
|
||||
constructor(cookie_jar, headers){
|
||||
this.http_headers = headers
|
||||
this.cookie_jar = cookie_jar
|
||||
|
@ -42,27 +42,28 @@ export class GW{
|
|||
async api_call(method, args, params){
|
||||
if (typeof args == "unasyncined") args = {}
|
||||
if (typeof params == "unasyncined") params = {}
|
||||
p = {
|
||||
let p = {
|
||||
api_version: "1.0",
|
||||
api_token: method == 'deezer.getUserData' ? 'null' : this._get_token(),
|
||||
api_token: method == 'deezer.getUserData' ? 'null' : await this._get_token(),
|
||||
input: '3',
|
||||
method: method,
|
||||
..params
|
||||
...params
|
||||
}
|
||||
let result_json
|
||||
try{
|
||||
const result_json = await got.get("http://www.deezer.com/ajax/gw-light.php", {
|
||||
result_json = await got.post("http://www.deezer.com/ajax/gw-light.php", {
|
||||
searchParams: p,
|
||||
json: args,
|
||||
cookieJar: this.cookie_jar,
|
||||
headers: this.http_headers,
|
||||
timeout: 30000
|
||||
}).json()
|
||||
}catch{
|
||||
}catch (e){
|
||||
console.log(e)
|
||||
await new Promise(r => setTimeout(r, 2000)) // sleep(2000ms)
|
||||
return await this.api_call(method, args, params)
|
||||
}
|
||||
if (result_json.error.length):
|
||||
throw new GWAPIError(result_json.error)
|
||||
if (result_json.error.length) throw new GWAPIError(result_json.error)
|
||||
return result_json.results
|
||||
}
|
||||
|
||||
|
@ -71,28 +72,28 @@ export class GW{
|
|||
return token_data.checkForm
|
||||
}
|
||||
|
||||
async get_user_data(){
|
||||
return await this.api_call('deezer.getUserData')
|
||||
get_user_data(){
|
||||
return this.api_call('deezer.getUserData')
|
||||
}
|
||||
|
||||
async get_user_profile_page(user_id, tab, limit=10){
|
||||
return await this.api_call('deezer.pageProfile', {user_id, tab, nb: limit})
|
||||
get_user_profile_page(user_id, tab, limit=10){
|
||||
return this.api_call('deezer.pageProfile', {user_id, tab, nb: limit})
|
||||
}
|
||||
|
||||
async get_child_accounts(){
|
||||
return await this.api_call('deezer.getChildAccounts')
|
||||
get_child_accounts(){
|
||||
return this.api_call('deezer.getChildAccounts')
|
||||
}
|
||||
|
||||
async get_track(sng_id){
|
||||
return await this.api_call('song.getData', {sng_id})
|
||||
get_track(sng_id){
|
||||
return this.api_call('song.getData', {sng_id})
|
||||
}
|
||||
|
||||
async get_track_page(sng_id){
|
||||
return await this.api_call('deezer.pageTrack', {sng_id})
|
||||
get_track_page(sng_id){
|
||||
return this.api_call('deezer.pageTrack', {sng_id})
|
||||
}
|
||||
|
||||
async get_track_lyrics(sng_id){
|
||||
return await this.api_call('song.getLyrics', {sng_id})
|
||||
get_track_lyrics(sng_id){
|
||||
return this.api_call('song.getLyrics', {sng_id})
|
||||
}
|
||||
|
||||
async get_tracks_gw(sng_ids){
|
||||
|
@ -110,12 +111,12 @@ export class GW{
|
|||
return tracks_array
|
||||
}
|
||||
|
||||
async get_album(alb_id){
|
||||
return await this.api_call('album.getData', {alb_id})
|
||||
get_album(alb_id){
|
||||
return this.api_call('album.getData', {alb_id})
|
||||
}
|
||||
|
||||
async get_album_page(alb_id){
|
||||
return await this.api_call('deezer.pageAlbum', {
|
||||
get_album_page(alb_id){
|
||||
return this.api_call('deezer.pageAlbum', {
|
||||
alb_id,
|
||||
lang: 'en',
|
||||
header: True,
|
||||
|
@ -134,11 +135,11 @@ export class GW{
|
|||
return tracks_array
|
||||
}
|
||||
|
||||
async get_artist(art_id){
|
||||
return await this.api_call('artist.getData', {art_id})
|
||||
get_artist(art_id){
|
||||
return this.api_call('artist.getData', {art_id})
|
||||
}
|
||||
|
||||
async get_artist_page(art_id){
|
||||
get_artist_page(art_id){
|
||||
return this.api_call('deezer.pageArtist', {
|
||||
art_id,
|
||||
lang: 'en',
|
||||
|
@ -157,8 +158,8 @@ export class GW{
|
|||
return tracks_array
|
||||
}
|
||||
|
||||
async get_artist_discography(art_id, index=0, limit=25){
|
||||
return await this.api_call('album.getDiscography', {
|
||||
get_artist_discography(art_id, index=0, limit=25){
|
||||
return this.api_call('album.getDiscography', {
|
||||
art_id,
|
||||
discography_mode:"all",
|
||||
nb: limit,
|
||||
|
@ -167,12 +168,12 @@ export class GW{
|
|||
})
|
||||
}
|
||||
|
||||
async get_playlist(playlist_id){
|
||||
return await this.api_call('playlist.getData', {playlist_id})
|
||||
get_playlist(playlist_id){
|
||||
return this.api_call('playlist.getData', {playlist_id})
|
||||
}
|
||||
|
||||
async get_playlist_page(playlist_id){
|
||||
return await this.api_call('deezer.pagePlaylist', {
|
||||
get_playlist_page(playlist_id){
|
||||
return this.api_call('deezer.pagePlaylist', {
|
||||
playlist_id,
|
||||
lang: 'en',
|
||||
header: True,
|
||||
|
@ -190,12 +191,12 @@ export class GW{
|
|||
return tracks_array
|
||||
}
|
||||
|
||||
async create_playlist(title, status=PlaylistStatus.PUBLIC, description, songs=[]){
|
||||
create_playlist(title, status=PlaylistStatus.PUBLIC, description, songs=[]){
|
||||
newSongs = []
|
||||
songs.forEach(song => {
|
||||
newSongs.push([song, 0])
|
||||
});
|
||||
return await this.api_call('playlist.create', {
|
||||
return this.api_call('playlist.create', {
|
||||
title,
|
||||
status,
|
||||
description,
|
||||
|
@ -203,12 +204,12 @@ export class GW{
|
|||
})
|
||||
}
|
||||
|
||||
async edit_playlist(playlist_id, title, status, description, songs=[]){
|
||||
edit_playlist(playlist_id, title, status, description, songs=[]){
|
||||
newSongs = []
|
||||
songs.forEach(song => {
|
||||
newSongs.push([song, 0])
|
||||
});
|
||||
return await this.api_call('playlist.update', {
|
||||
return this.api_call('playlist.update', {
|
||||
playlist_id,
|
||||
title,
|
||||
status,
|
||||
|
@ -217,74 +218,74 @@ export class GW{
|
|||
})
|
||||
}
|
||||
|
||||
async add_songs_to_playlist(playlist_id, songs, offset=-1){
|
||||
add_songs_to_playlist(playlist_id, songs, offset=-1){
|
||||
newSongs = []
|
||||
songs.forEach(song => {
|
||||
newSongs.push([song, 0])
|
||||
});
|
||||
return await this.api_call('playlist.addSongs', {
|
||||
return this.api_call('playlist.addSongs', {
|
||||
playlist_id,
|
||||
songs: newSongs,
|
||||
offset
|
||||
})
|
||||
}
|
||||
|
||||
async add_song_to_playlist(playlist_id, sng_id, offset=-1){
|
||||
return await this.add_songs_to_playlist(playlist_id, [sng_id], offset)
|
||||
add_song_to_playlist(playlist_id, sng_id, offset=-1){
|
||||
return this.add_songs_to_playlist(playlist_id, [sng_id], offset)
|
||||
}
|
||||
|
||||
async remove_songs_from_playlist(playlist_id, songs){
|
||||
remove_songs_from_playlist(playlist_id, songs){
|
||||
newSongs = []
|
||||
songs.forEach(song => {
|
||||
newSongs.push([song, 0])
|
||||
});
|
||||
return await this.api_call('playlist.deleteSongs', {
|
||||
return this.api_call('playlist.deleteSongs', {
|
||||
playlist_id,
|
||||
songs: newSongs
|
||||
})
|
||||
}
|
||||
|
||||
async remove_song_from_playlist(playlist_id, sng_id){
|
||||
return await this.remove_songs_from_playlist(playlist_id, [sng_id])
|
||||
remove_song_from_playlist(playlist_id, sng_id){
|
||||
return this.remove_songs_from_playlist(playlist_id, [sng_id])
|
||||
}
|
||||
|
||||
async delete_playlist(playlist_id){
|
||||
return await this.api_call('playlist.delete', {playlist_id})
|
||||
delete_playlist(playlist_id){
|
||||
return this.api_call('playlist.delete', {playlist_id})
|
||||
}
|
||||
|
||||
async add_song_to_favorites(sng_id){
|
||||
return await this.gw_api_call('favorite_song.add', {sng_id})
|
||||
add_song_to_favorites(sng_id){
|
||||
return this.gw_api_call('favorite_song.add', {sng_id})
|
||||
}
|
||||
|
||||
async remove_song_from_favorites(sng_id){
|
||||
return await this.gw_api_call('favorite_song.remove', {sng_id})
|
||||
remove_song_from_favorites(sng_id){
|
||||
return this.gw_api_call('favorite_song.remove', {sng_id})
|
||||
}
|
||||
|
||||
async add_album_to_favorites(alb_id){
|
||||
return await this.gw_api_call('album.addFavorite', {alb_id})
|
||||
add_album_to_favorites(alb_id){
|
||||
return this.gw_api_call('album.addFavorite', {alb_id})
|
||||
}
|
||||
|
||||
async remove_album_from_favorites(alb_id){
|
||||
return await this.gw_api_call('album.deleteFavorite', {alb_id})
|
||||
remove_album_from_favorites(alb_id){
|
||||
return this.gw_api_call('album.deleteFavorite', {alb_id})
|
||||
}
|
||||
|
||||
async add_artist_to_favorites(art_id){
|
||||
return await this.gw_api_call('artist.addFavorite', {art_id})
|
||||
add_artist_to_favorites(art_id){
|
||||
return this.gw_api_call('artist.addFavorite', {art_id})
|
||||
}
|
||||
|
||||
async remove_artist_from_favorites(art_id){
|
||||
return await this.gw_api_call('artist.deleteFavorite', {art_id})
|
||||
remove_artist_from_favorites(art_id){
|
||||
return this.gw_api_call('artist.deleteFavorite', {art_id})
|
||||
}
|
||||
|
||||
async add_playlist_to_favorites(playlist_id){
|
||||
return await this.gw_api_call('playlist.addFavorite', {PARENT_PLAYLIST_ID: playlist_id})
|
||||
add_playlist_to_favorites(playlist_id){
|
||||
return this.gw_api_call('playlist.addFavorite', {PARENT_PLAYLIST_ID: playlist_id})
|
||||
}
|
||||
|
||||
async remove_playlist_from_favorites(playlist_id){
|
||||
return await this.gw_api_call('playlist.deleteFavorite', {PLAYLIST_ID: playlist_id})
|
||||
remove_playlist_from_favorites(playlist_id){
|
||||
return this.gw_api_call('playlist.deleteFavorite', {PLAYLIST_ID: playlist_id})
|
||||
}
|
||||
|
||||
async get_page(page){
|
||||
get_page(page){
|
||||
let params = {
|
||||
gateway_input: JSON.stringify({
|
||||
PAGE: page,
|
||||
|
@ -294,18 +295,18 @@ export class GW{
|
|||
'channel',
|
||||
'album'
|
||||
],
|
||||
horizontal-grid: [
|
||||
'horizontal-grid': [
|
||||
'album'
|
||||
],
|
||||
},
|
||||
LANG: 'en'
|
||||
})
|
||||
}
|
||||
return await this.api_call('page.get', params=params)
|
||||
return this.api_call('page.get', params=params)
|
||||
}
|
||||
|
||||
async search(query, index=0, limit=10, suggest=true, artist_suggest=true, top_tracks=true){
|
||||
return await this.api_call('deezer.pageSearch', {
|
||||
search(query, index=0, limit=10, suggest=true, artist_suggest=true, top_tracks=true){
|
||||
return this.api_call('deezer.pageSearch', {
|
||||
query,
|
||||
start: index,
|
||||
nb: limit,
|
||||
|
@ -315,8 +316,8 @@ export class GW{
|
|||
})
|
||||
}
|
||||
|
||||
async search_music(query, type, index=0, limit=10){
|
||||
return await this.api_call('search.music', {
|
||||
search_music(query, type, index=0, limit=10){
|
||||
return this.api_call('search.music', {
|
||||
query,
|
||||
filter: "ALL",
|
||||
output: type,
|
||||
|
@ -354,7 +355,7 @@ export class GW{
|
|||
if (release.ROLE_ID == 5) { // Handle albums where the artist is featured
|
||||
if (!result.featured) result.featured = []
|
||||
result.featured.push(obj)
|
||||
} else if release.ROLE_ID == 0 { // Handle "more" albums
|
||||
} else if (release.ROLE_ID == 0) { // Handle "more" albums
|
||||
if (!result.more) result.more = []
|
||||
result.more.push(obj)
|
||||
result.all.push(obj)
|
||||
|
@ -421,9 +422,17 @@ export class GW{
|
|||
}
|
||||
|
||||
// Base class for Deezer exceptions
|
||||
export class GWAPIError extends Error {
|
||||
class GWAPIError extends Error {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "APIError";
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
LyricsStatus,
|
||||
PlaylistStatus,
|
||||
EMPTY_TRACK_OBJ,
|
||||
GW,
|
||||
GWAPIError
|
||||
}
|
||||
|
|
|
@ -4,18 +4,18 @@ const { API } = require('./api.js')
|
|||
const { GW } = require('./gw.js')
|
||||
|
||||
// Number associtation for formats
|
||||
export const TrackFormats = {
|
||||
FLAC : 9
|
||||
MP3_320 : 3
|
||||
MP3_128 : 1
|
||||
MP4_RA3 : 15
|
||||
MP4_RA2 : 14
|
||||
MP4_RA1 : 13
|
||||
DEFAULT : 8
|
||||
LOCAL : 0
|
||||
const TrackFormats = {
|
||||
FLAC : 9,
|
||||
MP3_320 : 3,
|
||||
MP3_128 : 1,
|
||||
MP4_RA3 : 15,
|
||||
MP4_RA2 : 14,
|
||||
MP4_RA1 : 13,
|
||||
DEFAULT : 8,
|
||||
LOCAL : 0,
|
||||
}
|
||||
|
||||
export class Deezer{
|
||||
class Deezer{
|
||||
constructor(accept_language=""){
|
||||
this.http_headers = {
|
||||
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
|
||||
|
@ -74,14 +74,16 @@ export class Deezer{
|
|||
|
||||
async login_via_arl(arl, child=0){
|
||||
arl = arl.trim()
|
||||
// TODO: Check how to do this
|
||||
let cookie_obj = Cookie({
|
||||
|
||||
// Create cookie
|
||||
let cookie_obj = new Cookie({
|
||||
key: 'arl',
|
||||
value: arl,
|
||||
domain: '.deezer.com',
|
||||
path: "/",
|
||||
httpOnly: true
|
||||
})
|
||||
this.cookie_jar.setCookie(cookie_obj, '.deezer.com')
|
||||
await this.cookie_jar.setCookie(cookie_obj.toString(), "https://www.deezer.com")
|
||||
|
||||
let user_data = await this.gw.get_user_data()
|
||||
// Check if user logged in
|
||||
|
@ -108,7 +110,7 @@ export class Deezer{
|
|||
})
|
||||
})
|
||||
} else {
|
||||
this.childs.append({
|
||||
this.childs.push({
|
||||
'id': user_data.USER.USER_ID,
|
||||
'name': user_data.USER.BLOG_NAME,
|
||||
'picture': user_data.USER.USER_PICTURE || ""
|
||||
|
@ -125,3 +127,11 @@ export class Deezer{
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
TrackFormats,
|
||||
Deezer,
|
||||
api: {...require('./api.js')},
|
||||
gw: {...require('./gw.js')},
|
||||
utils: {...require('./utils.js')}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
const RELEASE_TYPE = ["single", "album", "compile", "ep", "bundle"]
|
||||
|
||||
// maps gw-light api user/tracks to standard api
|
||||
export function map_user_track(track){
|
||||
function map_user_track(track){
|
||||
return {
|
||||
id: track.SNG_ID,
|
||||
title: track.SNG_TITLE,
|
||||
|
@ -39,7 +39,7 @@ export function map_user_track(track){
|
|||
}
|
||||
|
||||
// maps gw-light api user/artists to standard api
|
||||
export function map_user_artist(artist){
|
||||
function map_user_artist(artist){
|
||||
return {
|
||||
id: artist.ART_ID,
|
||||
name: artist.ART_NAME,
|
||||
|
@ -57,7 +57,7 @@ export function map_user_artist(artist){
|
|||
|
||||
|
||||
// maps gw-light api user/albums to standard api
|
||||
export function map_user_album(album){
|
||||
function map_user_album(album){
|
||||
return {
|
||||
id: album.ALB_ID,
|
||||
title: album.ALB_TITLE,
|
||||
|
@ -81,7 +81,7 @@ export function map_user_album(album){
|
|||
|
||||
|
||||
// maps gw-light api user/playlists to standard api
|
||||
export function map_user_playlist(playlist, default_user_name=""){
|
||||
function map_user_playlist(playlist, default_user_name=""){
|
||||
return {
|
||||
id: playlist.PLAYLIST_ID,
|
||||
title: playlist.TITLE,
|
||||
|
@ -105,7 +105,7 @@ export function map_user_playlist(playlist, default_user_name=""){
|
|||
|
||||
|
||||
// maps gw-light api albums to standard api
|
||||
export function map_album(album){
|
||||
function map_album(album){
|
||||
return {
|
||||
id: album.ALB_ID,
|
||||
title: album.ALB_TITLE,
|
||||
|
@ -144,7 +144,7 @@ export function map_album(album){
|
|||
|
||||
|
||||
// maps gw-light api artist/albums to standard api
|
||||
export function map_artist_album(album){
|
||||
function map_artist_album(album){
|
||||
return {
|
||||
id: album.ALB_ID,
|
||||
title: album.ALB_TITLE,
|
||||
|
@ -169,7 +169,7 @@ export function map_artist_album(album){
|
|||
|
||||
|
||||
// maps gw-light api playlists to standard api
|
||||
export function map_playlist(playlist){
|
||||
function map_playlist(playlist){
|
||||
return {
|
||||
id: playlist.PLAYLIST_ID,
|
||||
title: playlist.TITLE,
|
||||
|
@ -200,9 +200,8 @@ export function map_playlist(playlist){
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Cleanup terms that can hurt search results
|
||||
export function clean_search_query(term){
|
||||
function clean_search_query(term){
|
||||
term = term.replaceAll(/ feat[\.]? /g, " ")
|
||||
term = term.replaceAll(/ ft[\.]? /g, " ")
|
||||
term = term.replaceAll(/\(feat[\.]? /g, " ")
|
||||
|
@ -210,3 +209,14 @@ export function clean_search_query(term){
|
|||
term = term.replace(' & ', " ").replace('–', "-").replace('—', "-")
|
||||
return term
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
map_user_track,
|
||||
map_user_artist,
|
||||
map_user_album,
|
||||
map_user_playlist,
|
||||
map_album,
|
||||
map_artist_album,
|
||||
map_playlist,
|
||||
clean_search_query
|
||||
}
|
||||
|
|
4
package-lock.json
generated
4
package-lock.json
generated
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"name": "deezer-js",
|
||||
"version": "1.0.0",
|
||||
"version": "0.0.2",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"version": "1.0.0",
|
||||
"version": "0.0.2",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
"got": "^11.8.2",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "deezer-js",
|
||||
"version": "0.0.1",
|
||||
"version": "0.0.2",
|
||||
"description": "A wrapper for all Deezer's APIs",
|
||||
"main": "deezer/index.js",
|
||||
"scripts": {
|
||||
|
@ -8,7 +8,7 @@
|
|||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://git.rip/RemixDev/deezer-js"
|
||||
"url": "https://gitlab.com/RemixDev/deezer-js"
|
||||
},
|
||||
"author": "RemixDev",
|
||||
"license": "GPL-3.0-or-later",
|
||||
|
|
Loading…
Reference in a new issue