From 8528617e07f95b7cb27238f14c9ba7bc4777ab82 Mon Sep 17 00:00:00 2001 From: RemixDev Date: Sat, 13 Mar 2021 13:18:22 +0100 Subject: [PATCH] Made library work --- deezer/api.js | 314 ++++++++++++++++++++++++---------------------- deezer/gw.js | 179 +++++++++++++------------- deezer/index.js | 38 +++--- deezer/utils.js | 28 +++-- package-lock.json | 4 +- package.json | 4 +- 6 files changed, 306 insertions(+), 261 deletions(-) diff --git a/deezer/api.js b/deezer/api.js index 73c6029..c47f86f 100644 --- a/deezer/api.js +++ b/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 +} diff --git a/deezer/gw.js b/deezer/gw.js index f79c90e..6c99faa 100644 --- a/deezer/gw.js +++ b/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 +} diff --git a/deezer/index.js b/deezer/index.js index 9abaaf4..c930486 100644 --- a/deezer/index.js +++ b/deezer/index.js @@ -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')} +} diff --git a/deezer/utils.js b/deezer/utils.js index 742b539..4394ac8 100644 --- a/deezer/utils.js +++ b/deezer/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 +} diff --git a/package-lock.json b/package-lock.json index e639b44..a8cebc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 868a045..4523294 100644 --- a/package.json +++ b/package.json @@ -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",