mirror of
https://github.com/d-fi/d-fi-core.git
synced 2025-07-25 22:55:29 +02:00
auto detect flac
This commit is contained in:
parent
4c121855d5
commit
8d9ad90a3f
10
README.md
10
README.md
@ -33,7 +33,7 @@ const {data} = await axios.get(url, {responseType: 'arraybuffer'});
|
|||||||
const decryptedTrack = api.decryptDownload(data, track.SNG_ID);
|
const decryptedTrack = api.decryptDownload(data, track.SNG_ID);
|
||||||
|
|
||||||
// Add id3 metadata
|
// Add id3 metadata
|
||||||
const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, false, 500);
|
const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500);
|
||||||
|
|
||||||
// Save file to disk
|
// Save file to disk
|
||||||
fs.writeFileSync(track.SNG_TITLE + '.mp3', trackWithMetadata);
|
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 |
|
| `data` | Yes | `buffer` | downloaded song buffer |
|
||||||
| `song_id` | Yes | `string` | track id |
|
| `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
|
### 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!
|
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!
|
||||||
|
@ -69,7 +69,7 @@ class Metaflac {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
let offset = 0;
|
let offset = 4;
|
||||||
let blockType = 0;
|
let blockType = 0;
|
||||||
let isLastBlock = false;
|
let isLastBlock = false;
|
||||||
while (!isLastBlock) {
|
while (!isLastBlock) {
|
||||||
|
@ -9,21 +9,16 @@ import type {trackType} from '../types';
|
|||||||
* Add metdata to the mp3
|
* Add metdata to the mp3
|
||||||
* @param {Buffer} trackBuffer decrypted track buffer
|
* @param {Buffer} trackBuffer decrypted track buffer
|
||||||
* @param {Object} track json containing track infos
|
* @param {Object} track json containing track infos
|
||||||
* @param {Boolean} fileType buffer type, mp3 or flac
|
|
||||||
* @param {Number} albumCoverSize album cover size in pixel
|
* @param {Number} albumCoverSize album cover size in pixel
|
||||||
*/
|
*/
|
||||||
export const addTrackTags = async (
|
export const addTrackTags = async (trackBuffer: Buffer, track: trackType, albumCoverSize = 1000): Promise<Buffer> => {
|
||||||
trackBuffer: Buffer,
|
|
||||||
track: trackType,
|
|
||||||
isFlac: boolean,
|
|
||||||
albumCoverSize = 1000,
|
|
||||||
): Promise<Buffer> => {
|
|
||||||
const [cover, lyrics] = await Promise.all([downloadAlbumCover(track, albumCoverSize), getTrackLyrics(track)]);
|
const [cover, lyrics] = await Promise.all([downloadAlbumCover(track, albumCoverSize), getTrackLyrics(track)]);
|
||||||
|
|
||||||
if (lyrics) {
|
if (lyrics) {
|
||||||
track.LYRICS = lyrics;
|
track.LYRICS = lyrics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isFlac = trackBuffer.slice(0, 4).toString('ascii') === 'fLaC';
|
||||||
return isFlac
|
return isFlac
|
||||||
? writeMetadataFlac(trackBuffer, track, albumCoverSize, cover)
|
? writeMetadataFlac(trackBuffer, track, albumCoverSize, cover)
|
||||||
: writeMetadataMp3(trackBuffer, track, cover);
|
: writeMetadataMp3(trackBuffer, track, cover);
|
||||||
|
@ -121,7 +121,7 @@ test('SEARCH TRACK, ALBUM & ARTIST', async (t) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (process.env.CI) {
|
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 track = await api.getTrackInfo(SNG_ID);
|
||||||
const url = getTrackDownloadUrl(track, 1);
|
const url = getTrackDownloadUrl(track, 1);
|
||||||
const {data} = await axios.get(url, {responseType: 'arraybuffer'});
|
const {data} = await axios.get(url, {responseType: 'arraybuffer'});
|
||||||
@ -132,22 +132,46 @@ if (process.env.CI) {
|
|||||||
|
|
||||||
const decryptedTrack = decryptDownload(data, track.SNG_ID);
|
const decryptedTrack = decryptDownload(data, track.SNG_ID);
|
||||||
t.true(Buffer.isBuffer(decryptedTrack));
|
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.true(Buffer.isBuffer(trackWithMetadata));
|
||||||
t.is(trackWithMetadata.length, 3628837);
|
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 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(data);
|
||||||
t.truthy(format320.data);
|
t.true(Buffer.isBuffer(data));
|
||||||
t.true(Buffer.isBuffer(format320.data));
|
t.is(data.length, 8990301);
|
||||||
|
|
||||||
const format9 = await axios.get(getTrackDownloadUrl(track, 9), {responseType: 'arraybuffer'});
|
const decryptedTrack = decryptDownload(data, track.SNG_ID);
|
||||||
t.truthy(format9.data);
|
t.true(Buffer.isBuffer(decryptedTrack));
|
||||||
t.true(Buffer.isBuffer(format9.data));
|
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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user