diff --git a/package.json b/package.json index ff60e0c..b4a5515 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lucida", - "version": "2.0.0-18", + "version": "2.0.0-19", "description": "A modular music downloader tool", "main": "build/index.js", "type": "module", diff --git a/src/streamers/deezer/main.ts b/src/streamers/deezer/main.ts index e123c98..757c8e1 100644 --- a/src/streamers/deezer/main.ts +++ b/src/streamers/deezer/main.ts @@ -275,10 +275,14 @@ export default class Deezer implements StreamerWithLogin { lang: 'en' }) - return { + const data = { metadata: parseAlbum(DATA), tracks: SONGS.data.map(parseTrack) } + + if (!data.metadata.trackCount) data.metadata.trackCount = data.tracks.length + + return data } // Track @@ -294,8 +298,8 @@ export default class Deezer implements StreamerWithLogin { async #getStream(track: DeezerTrack): Promise { if ('FALLBACK' in track) track = track.FALLBACK! - const countries = track.AVAILABLE_COUNTRIES.STREAM_ADS - if (!countries.length) throw new Error('Track not available in any country') + const countries = track?.AVAILABLE_COUNTRIES?.STREAM_ADS + if (!countries?.length) throw new Error('Track not available in any country') if (!countries.includes(this.country!)) throw new Error("Track not available in the account's country") diff --git a/src/streamers/deezer/parse.ts b/src/streamers/deezer/parse.ts index 0905951..2810e9b 100644 --- a/src/streamers/deezer/parse.ts +++ b/src/streamers/deezer/parse.ts @@ -91,18 +91,27 @@ export interface DeezerAlbum { ARTISTS?: DeezerArtist[] ORIGINAL_RELEASE_DATE?: string NUMBER_TRACK?: string + COPYRIGHT?: string + UPC?: string + LABEL_NAME?: string } export function parseAlbum(album: DeezerAlbum): Album { - return { + const data: Album = { title: album.ALB_TITLE, id: album.ALB_ID, url: `https://www.deezer.com/album/${album.ALB_ID}`, trackCount: album.NUMBER_TRACK ? parseInt(album.NUMBER_TRACK) : undefined, releaseDate: album.ORIGINAL_RELEASE_DATE ? new Date(album.ORIGINAL_RELEASE_DATE) : undefined, coverArtwork: parseArtwork(album.ALB_PICTURE), - artists: album.ARTISTS ? album.ARTISTS.map((a) => parseArtist(a)) : undefined + artists: album.ARTISTS ? album.ARTISTS.map((a) => parseArtist(a)) : undefined, + label: album.LABEL_NAME } + + if (album.COPYRIGHT) data.copyright = album.COPYRIGHT + if (album.UPC) data.upc = album.UPC + + return data } export interface DeezerTrack { @@ -118,7 +127,7 @@ export interface DeezerTrack { ALB_TITLE: string ALB_PICTURE: string DURATION: string - AVAILABLE_COUNTRIES: { STREAM_ADS: string } + AVAILABLE_COUNTRIES?: { STREAM_ADS?: string } COPYRIGHT: string TRACK_TOKEN: string @@ -133,6 +142,14 @@ export interface DeezerTrack { } export function parseTrack(track: DeezerTrack): Track { + let addt: {regions?: string[], copyright?: string, producers?: string[], composers?: string[], lyricists?: string[]} = {} + + if (track?.AVAILABLE_COUNTRIES?.STREAM_ADS) addt.regions = [...track.AVAILABLE_COUNTRIES.STREAM_ADS] + if (track?.COPYRIGHT) addt.copyright = track.COPYRIGHT + if (track.SNG_CONTRIBUTORS?.producer) addt.producers = track.SNG_CONTRIBUTORS?.producer + if (track.SNG_CONTRIBUTORS?.composer) addt.composers = track.SNG_CONTRIBUTORS?.composer + if (track.SNG_CONTRIBUTORS?.composer) addt.lyricists = track.SNG_CONTRIBUTORS?.lyricist + return { title: track.SNG_TITLE, id: track.SNG_ID, @@ -140,19 +157,16 @@ export function parseTrack(track: DeezerTrack): Track { explicit: track.EXPLICIT_LYRICS == '1', trackNumber: parseInt(track.TRACK_NUMBER), discNumber: parseInt(track.DISK_NUMBER), - copyright: track.COPYRIGHT, artists: track.ARTISTS.map((a) => parseArtist(a)), isrc: track.ISRC, - producers: track.SNG_CONTRIBUTORS?.producer, - composers: track.SNG_CONTRIBUTORS?.composer, - lyricists: track.SNG_CONTRIBUTORS?.lyricist, album: parseAlbum({ ALB_ID: track.ALB_ID, ALB_PICTURE: track.ALB_PICTURE, ALB_TITLE: track.ALB_TITLE }), durationMs: parseInt(track.DURATION) * 1e3, - coverArtwork: parseArtwork(track.ALB_PICTURE) + coverArtwork: parseArtwork(track.ALB_PICTURE), + ...addt } }