auto detect flac

This commit is contained in:
Sayem Chowdhury 2021-02-24 01:11:17 +06:00
parent 4c121855d5
commit 8d9ad90a3f
4 changed files with 46 additions and 19 deletions

View File

@ -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!

View File

@ -69,7 +69,7 @@ class Metaflac {
}
init() {
let offset = 0;
let offset = 4;
let blockType = 0;
let isLastBlock = false;
while (!isLastBlock) {

View File

@ -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<Buffer> => {
export const addTrackTags = async (trackBuffer: Buffer, track: trackType, albumCoverSize = 1000): Promise<Buffer> => {
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);

View File

@ -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);
});
}