From 64832aee9dcd1e22906c1982141d19325ce003cb Mon Sep 17 00:00:00 2001 From: Sayem Chowdhury Date: Sat, 20 Mar 2021 20:51:03 +0600 Subject: [PATCH] fix DataException --- src/metadata-writer/flacmetata.ts | 23 +++++++------ src/metadata-writer/id3.ts | 56 ++++++++++++++++++------------- src/metadata-writer/index.ts | 11 +++--- 3 files changed, 51 insertions(+), 39 deletions(-) diff --git a/src/metadata-writer/flacmetata.ts b/src/metadata-writer/flacmetata.ts index 1d34b16..83dd44a 100644 --- a/src/metadata-writer/flacmetata.ts +++ b/src/metadata-writer/flacmetata.ts @@ -5,12 +5,12 @@ import type {albumTypePublicApi, trackType} from '../types'; export const writeMetadataFlac = ( buffer: Buffer, track: trackType, - album: albumTypePublicApi, + album: albumTypePublicApi | null, dimension: number, cover?: Buffer | null, ): Buffer => { const flac = new Metaflac(buffer); - const RELEASE_YEAR = album.release_date.split('-')[0]; + const RELEASE_YEAR = album ? album.release_date.split('-')[0] : null; const artists = track.ART_NAME.split( new RegExp(' featuring | feat. | Ft. | ft. | vs | vs. | x | - |, ', 'g'), @@ -18,24 +18,27 @@ export const writeMetadataFlac = ( flac.setTag('TITLE=' + track.SNG_TITLE); flac.setTag('ALBUM=' + track.ALB_TITLE); - flac.setTag('GENRE=' + album.genres.data[0].name); - flac.setTag('RELEASETYPE=' + album.record_type); flac.setTag('ARTIST=' + artists.join(', ')); - flac.setTag('ALBUMARTIST=' + album.artist.name); flac.setTag('TRACKNUMBER=' + track.TRACK_NUMBER); + if (album) { + flac.setTag('GENRE=' + album.genres.data[0].name); + flac.setTag('RELEASETYPE=' + album.record_type); + flac.setTag('ALBUMARTIST=' + album.artist.name); + flac.setTag('BARCODE=' + album.upc); + flac.setTag('LABEL=' + album.label); + flac.setTag('DATE=' + album.release_date); + flac.setTag('YEAR=' + RELEASE_YEAR); + } + if (track.DISK_NUMBER) { flac.setTag('DISCNUMBER=' + track.DISK_NUMBER); } flac.setTag('ISRC=' + track.ISRC); - flac.setTag('BARCODE=' + album.upc); - flac.setTag('LABEL=' + album.label); flac.setTag('LENGTH=' + track.DURATION); flac.setTag('MEDIA=Digital Media'); flac.setTag('TRACKNUMBER=' + track.TRACK_NUMBER); - flac.setTag('YEAR=' + RELEASE_YEAR); - flac.setTag('DATE=' + album.release_date); if (track.LYRICS) { flac.setTag('LYRICS=' + track.LYRICS.LYRICS_TEXT); @@ -46,7 +49,7 @@ export const writeMetadataFlac = ( if (track.SNG_CONTRIBUTORS && !Array.isArray(track.SNG_CONTRIBUTORS)) { if (track.SNG_CONTRIBUTORS.main_artist) { - flac.setTag(`COPYRIGHT=${RELEASE_YEAR} ${track.SNG_CONTRIBUTORS.main_artist[0]}`); + flac.setTag(`COPYRIGHT=${RELEASE_YEAR ? RELEASE_YEAR + ' ' : ''}${track.SNG_CONTRIBUTORS.main_artist[0]}`); } if (track.SNG_CONTRIBUTORS.publisher) { flac.setTag('ORGANIZATION=' + track.SNG_CONTRIBUTORS.publisher.join(', ')); diff --git a/src/metadata-writer/id3.ts b/src/metadata-writer/id3.ts index 9ab520d..09bd181 100644 --- a/src/metadata-writer/id3.ts +++ b/src/metadata-writer/id3.ts @@ -5,11 +5,11 @@ import type {albumTypePublicApi, trackType} from '../types'; export const writeMetadataMp3 = ( buffer: Buffer, track: trackType, - album: albumTypePublicApi, + album: albumTypePublicApi | null, cover?: Buffer | null, ): Buffer => { const writer = new id3Writer(buffer); - const RELEASE_YEAR = album.release_date.split('-')[0]; + const RELEASE_YEAR = album ? album.release_date.split('-')[0] : null; const artists = track.ART_NAME.split( new RegExp(' featuring | feat. | Ft. | ft. | vs | vs. | x | - |, ', 'g'), @@ -18,36 +18,42 @@ export const writeMetadataMp3 = ( writer .setFrame('TIT2', track.SNG_TITLE) .setFrame('TALB', track.ALB_TITLE) - .setFrame( - 'TCON', - album.genres.data.map((g) => g.name), - ) .setFrame('TPE1', [artists]) - .setFrame('TPE2', album.artist.name) - .setFrame('TLEN', Number(track.DURATION) * 1000) - .setFrame('TYER', RELEASE_YEAR) - .setFrame('TDAT', album.release_date) + .setFrame('TLEN', Number(track.DURATION) * 1000); + + if (album) { + writer + .setFrame( + 'TCON', + album.genres.data.map((g) => g.name), + ) + .setFrame('TPE2', album.artist.name) + .setFrame('TYER', RELEASE_YEAR) + .setFrame('TDAT', album.release_date) + .setFrame('TXXX', { + description: 'RELEASETYPE', + value: album.record_type, + }) + .setFrame('TXXX', { + description: 'BARCODE', + value: album.upc, + }) + .setFrame('TXXX', { + description: 'LABEL', + value: album.label, + }); + } + + writer .setFrame('TMED', 'Digital Media') .setFrame('TXXX', { description: 'Artists', value: artists.join(', '), }) - .setFrame('TXXX', { - description: 'RELEASETYPE', - value: album.record_type, - }) .setFrame('TXXX', { description: 'ISRC', value: track.ISRC, }) - .setFrame('TXXX', { - description: 'BARCODE', - value: album.upc, - }) - .setFrame('TXXX', { - description: 'LABEL', - value: album.label, - }) .setFrame('TXXX', { description: 'COMPILATION', value: track.ART_PICTURE === 'Various Artists' ? '1' : '0', @@ -62,12 +68,14 @@ export const writeMetadataMp3 = ( }); if (track.DISK_NUMBER) { - writer.setFrame('TPOS', track.DISK_NUMBER).setFrame('TRCK', track.TRACK_NUMBER + '/' + album.nb_tracks); + writer + .setFrame('TPOS', track.DISK_NUMBER) + .setFrame('TRCK', `${track.TRACK_NUMBER}${album ? '/' + album.nb_tracks : ''}`); } if (track.SNG_CONTRIBUTORS && !Array.isArray(track.SNG_CONTRIBUTORS)) { if (track.SNG_CONTRIBUTORS.main_artist) { - writer.setFrame('TCOP', `${RELEASE_YEAR} ${track.SNG_CONTRIBUTORS.main_artist[0]}`); + writer.setFrame('TCOP', `${RELEASE_YEAR ? RELEASE_YEAR + ' ' : ''}${track.SNG_CONTRIBUTORS.main_artist[0]}`); } if (track.SNG_CONTRIBUTORS.publisher) { writer.setFrame('TPUB', track.SNG_CONTRIBUTORS.publisher.join(', ')); diff --git a/src/metadata-writer/index.ts b/src/metadata-writer/index.ts index cdf4c80..b7c1578 100644 --- a/src/metadata-writer/index.ts +++ b/src/metadata-writer/index.ts @@ -2,15 +2,14 @@ import {downloadAlbumCover} from './abumCover'; import {getTrackLyrics} from './getTrackLyrics'; import {writeMetadataMp3} from './id3'; import {writeMetadataFlac} from './flacmetata'; -import {getAlbumInfoPublicApi, getTrackInfoPublicApi} from '../api'; +import {getAlbumInfoPublicApi} from '../api'; import type {trackType} from '../types'; const albumInfo = async (track: trackType) => { try { return getAlbumInfoPublicApi(track.ALB_ID); } catch (err) { - const {album} = await getTrackInfoPublicApi(track.SNG_ID); - return getAlbumInfoPublicApi(album.id.toString()); + return null; } }; @@ -34,8 +33,10 @@ export const addTrackTags = async (trackBuffer: Buffer, track: trackType, albumC if (track.ART_NAME.toLowerCase() === 'various') { track.ART_NAME = 'Various Artists'; } - album.record_type = - album.record_type === 'ep' ? 'EP' : album.record_type.charAt(0).toUpperCase() + album.record_type.slice(1); + if (album && album.record_type) { + album.record_type = + album.record_type === 'ep' ? 'EP' : album.record_type.charAt(0).toUpperCase() + album.record_type.slice(1); + } const isFlac = trackBuffer.slice(0, 4).toString('ascii') === 'fLaC'; return isFlac