From 8d9ad90a3f2c4838e022281abf1e2c6052be2667 Mon Sep 17 00:00:00 2001 From: Sayem Chowdhury Date: Wed, 24 Feb 2021 01:11:17 +0600 Subject: [PATCH] auto detect flac --- README.md | 10 +++++++- src/lib/metaflac-js.ts | 2 +- src/metadata-writer/index.ts | 9 ++------ src/tests/api.ts | 44 ++++++++++++++++++++++++++++-------- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 7a5f560..86178c1 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ const {data} = await axios.get(url, {responseType: 'arraybuffer'}); const decryptedTrack = api.decryptDownload(data, track.SNG_ID); // Add id3 metadata -const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, false, 500); +const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500); // Save file to disk fs.writeFileSync(track.SNG_TITLE + '.mp3', trackWithMetadata); @@ -137,6 +137,14 @@ All method returns `Object` or throws `Error`. Make sure to catch error on your | `data` | Yes | `buffer` | downloaded song buffer | | `song_id` | Yes | `string` | track id | +### `.addTrackTags(data, track,coverSize)` + +| Parameters | Required | Type | Description | +| ----------- | :------: | --------: | ---------------------: | +| `data` | Yes | `buffer` | downloaded song buffer | +| `track` | Yes | `string` | track object | +| `coverSize` | No | `56-1800` | cover art size | + ### Donations If you want to show your appreciation, you can donate me on [ko-fi](https://ko-fi.com/Z8Z5KDA6) or [buy me a coffee](https://www.buymeacoffee.com/sayem). Thanks! diff --git a/src/lib/metaflac-js.ts b/src/lib/metaflac-js.ts index c6a8554..083ae93 100644 --- a/src/lib/metaflac-js.ts +++ b/src/lib/metaflac-js.ts @@ -69,7 +69,7 @@ class Metaflac { } init() { - let offset = 0; + let offset = 4; let blockType = 0; let isLastBlock = false; while (!isLastBlock) { diff --git a/src/metadata-writer/index.ts b/src/metadata-writer/index.ts index 7e89dcb..1e7c6f7 100644 --- a/src/metadata-writer/index.ts +++ b/src/metadata-writer/index.ts @@ -9,21 +9,16 @@ import type {trackType} from '../types'; * Add metdata to the mp3 * @param {Buffer} trackBuffer decrypted track buffer * @param {Object} track json containing track infos - * @param {Boolean} fileType buffer type, mp3 or flac * @param {Number} albumCoverSize album cover size in pixel */ -export const addTrackTags = async ( - trackBuffer: Buffer, - track: trackType, - isFlac: boolean, - albumCoverSize = 1000, -): Promise => { +export const addTrackTags = async (trackBuffer: Buffer, track: trackType, albumCoverSize = 1000): Promise => { const [cover, lyrics] = await Promise.all([downloadAlbumCover(track, albumCoverSize), getTrackLyrics(track)]); if (lyrics) { track.LYRICS = lyrics; } + const isFlac = trackBuffer.slice(0, 4).toString('ascii') === 'fLaC'; return isFlac ? writeMetadataFlac(trackBuffer, track, albumCoverSize, cover) : writeMetadataMp3(trackBuffer, track, cover); diff --git a/src/tests/api.ts b/src/tests/api.ts index e62020c..b4259bf 100644 --- a/src/tests/api.ts +++ b/src/tests/api.ts @@ -121,7 +121,7 @@ test('SEARCH TRACK, ALBUM & ARTIST', async (t) => { }); if (process.env.CI) { - test('DOWNLOAD TRACK & ADD METADATA', async (t) => { + test('DOWNLOAD TRACK128 & ADD METADATA', async (t) => { const track = await api.getTrackInfo(SNG_ID); const url = getTrackDownloadUrl(track, 1); const {data} = await axios.get(url, {responseType: 'arraybuffer'}); @@ -132,22 +132,46 @@ if (process.env.CI) { const decryptedTrack = decryptDownload(data, track.SNG_ID); t.true(Buffer.isBuffer(decryptedTrack)); - t.is(data.length, 3596119); + t.is(decryptedTrack.length, 3596119); - const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, false, 500); + const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500); t.true(Buffer.isBuffer(trackWithMetadata)); t.is(trackWithMetadata.length, 3628837); }); - test('DOWNLOAD 320kbps & FLAC', async (t) => { + test('DOWNLOAD TRACK320 & ADD METADATA', async (t) => { const track = await api.getTrackInfo(SNG_ID); + const url = getTrackDownloadUrl(track, 3); + const {data} = await axios.get(url, {responseType: 'arraybuffer'}); - const format320 = await axios.get(getTrackDownloadUrl(track, 3), {responseType: 'arraybuffer'}); - t.truthy(format320.data); - t.true(Buffer.isBuffer(format320.data)); + t.truthy(data); + t.true(Buffer.isBuffer(data)); + t.is(data.length, 8990301); - const format9 = await axios.get(getTrackDownloadUrl(track, 9), {responseType: 'arraybuffer'}); - t.truthy(format9.data); - t.true(Buffer.isBuffer(format9.data)); + const decryptedTrack = decryptDownload(data, track.SNG_ID); + t.true(Buffer.isBuffer(decryptedTrack)); + t.is(decryptedTrack.length, 8990301); + + const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500); + t.true(Buffer.isBuffer(trackWithMetadata)); + t.is(trackWithMetadata.length, 9023019); + }); + + test('DOWNLOAD TRACK1411 & ADD METADATA', async (t) => { + const track = await api.getTrackInfo(SNG_ID); + const url = getTrackDownloadUrl(track, 9); + const {data} = await axios.get(url, {responseType: 'arraybuffer'}); + + t.truthy(data); + t.true(Buffer.isBuffer(data)); + t.is(data.length, 25418289); + + const decryptedTrack = decryptDownload(data, track.SNG_ID); + t.true(Buffer.isBuffer(decryptedTrack)); + t.is(data.length, 25418289); + + const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500); + t.true(Buffer.isBuffer(trackWithMetadata)); + t.is(trackWithMetadata.length, 25453167); }); }