mirror of
https://github.com/d-fi/d-fi-core.git
synced 2025-07-27 15:44:26 +02:00
add album meta tags
This commit is contained in:
parent
cd4bdef5fe
commit
e88d5e4207
@ -1,35 +1,54 @@
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import Metaflac from '../lib/metaflac-js';
|
import Metaflac from '../lib/metaflac-js';
|
||||||
import type {trackType} from '../types';
|
import type {albumTypePublicApi, trackType} from '../types';
|
||||||
|
|
||||||
export const writeMetadataFlac = (
|
export const writeMetadataFlac = (
|
||||||
buffer: Buffer,
|
buffer: Buffer,
|
||||||
track: trackType,
|
track: trackType,
|
||||||
|
album: albumTypePublicApi,
|
||||||
dimension: number,
|
dimension: number,
|
||||||
cover?: Buffer | null,
|
cover?: Buffer | null,
|
||||||
): Buffer => {
|
): Buffer => {
|
||||||
const flac = new Metaflac(buffer);
|
const flac = new Metaflac(buffer);
|
||||||
flac.setTag('TITLE=' + track.SNG_TITLE);
|
const RELEASE_YEAR = album.release_date.split('-')[0];
|
||||||
flac.setTag('ALBUM=' + track.ALB_TITLE);
|
|
||||||
|
|
||||||
const artists = track.ART_NAME.split(
|
const artists = track.ART_NAME.split(
|
||||||
new RegExp(' featuring | feat. | Ft. | ft. | vs | vs. | x | - |, ', 'g'),
|
new RegExp(' featuring | feat. | Ft. | ft. | vs | vs. | x | - |, ', 'g'),
|
||||||
).map((a) => a.trim());
|
).map((a) => a.trim());
|
||||||
|
|
||||||
|
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('ARTIST=' + artists.join(', '));
|
||||||
|
flac.setTag('ALBUMARTIST=' + album.artist.name);
|
||||||
|
flac.setTag('TRACKNUMBER=' + track.TRACK_NUMBER);
|
||||||
|
|
||||||
if (track.DISK_NUMBER) {
|
if (track.DISK_NUMBER) {
|
||||||
flac.setTag('DISCNUMBER=' + track.DISK_NUMBER);
|
flac.setTag('DISCNUMBER=' + track.DISK_NUMBER);
|
||||||
}
|
}
|
||||||
|
|
||||||
flac.setTag('LENGTH=' + track.DURATION);
|
|
||||||
flac.setTag('ISRC=' + track.ISRC);
|
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('MEDIA=Digital Media');
|
||||||
|
flac.setTag('TRACKNUMBER=' + track.TRACK_NUMBER);
|
||||||
|
flac.setTag('YEAR=' + RELEASE_YEAR);
|
||||||
|
flac.setTag('DATE=' + album.release_date);
|
||||||
|
|
||||||
if (track.LYRICS) {
|
if (track.LYRICS) {
|
||||||
flac.setTag('LYRICS=' + track.LYRICS.LYRICS_TEXT);
|
flac.setTag('LYRICS=' + track.LYRICS.LYRICS_TEXT);
|
||||||
}
|
}
|
||||||
|
if (track.EXPLICIT_LYRICS) {
|
||||||
|
flac.setTag('EXPLICIT=' + track.EXPLICIT_LYRICS);
|
||||||
|
}
|
||||||
|
|
||||||
if (track.SNG_CONTRIBUTORS) {
|
if (track.SNG_CONTRIBUTORS) {
|
||||||
|
flac.setTag(`COPYRIGHT=${RELEASE_YEAR} ${track.SNG_CONTRIBUTORS.main_artist[0]}`);
|
||||||
|
if (track.SNG_CONTRIBUTORS.publisher) {
|
||||||
|
flac.setTag('ORGANIZATION=' + track.SNG_CONTRIBUTORS.publisher.join(', '));
|
||||||
|
}
|
||||||
if (track.SNG_CONTRIBUTORS.composer) {
|
if (track.SNG_CONTRIBUTORS.composer) {
|
||||||
flac.setTag('COMPOSER=' + track.SNG_CONTRIBUTORS.composer.join(', '));
|
flac.setTag('COMPOSER=' + track.SNG_CONTRIBUTORS.composer.join(', '));
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,57 @@
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import id3Writer from 'browser-id3-writer';
|
import id3Writer from 'browser-id3-writer';
|
||||||
import type {trackType} from '../types';
|
import type {albumTypePublicApi, trackType} from '../types';
|
||||||
|
|
||||||
export const writeMetadataMp3 = (buffer: Buffer, track: trackType, cover?: Buffer | null): Buffer => {
|
export const writeMetadataMp3 = (
|
||||||
|
buffer: Buffer,
|
||||||
|
track: trackType,
|
||||||
|
album: albumTypePublicApi,
|
||||||
|
cover?: Buffer | null,
|
||||||
|
): Buffer => {
|
||||||
const writer = new id3Writer(buffer);
|
const writer = new id3Writer(buffer);
|
||||||
writer.setFrame('TIT2', track.SNG_TITLE).setFrame('TALB', track.ALB_TITLE);
|
const RELEASE_YEAR = album.release_date.split('-')[0];
|
||||||
|
|
||||||
const artists = track.ART_NAME.split(
|
const artists = track.ART_NAME.split(
|
||||||
new RegExp(' featuring | feat. | Ft. | ft. | vs | vs. | x | - |, ', 'g'),
|
new RegExp(' featuring | feat. | Ft. | ft. | vs | vs. | x | - |, ', 'g'),
|
||||||
).map((a) => a.trim());
|
).map((a) => a.trim());
|
||||||
writer.setFrame('TPE2', artists).setFrame('TPE1', [artists.join(', ')]);
|
|
||||||
|
|
||||||
writer
|
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('TMED', 'Digital Media')
|
.setFrame('TMED', 'Digital Media')
|
||||||
.setFrame('TXXX', {
|
.setFrame('TXXX', {
|
||||||
description: 'Artists',
|
description: 'Artists',
|
||||||
value: artists.join(', '),
|
value: artists.join(', '),
|
||||||
})
|
})
|
||||||
|
.setFrame('TXXX', {
|
||||||
|
description: 'RELEASETYPE',
|
||||||
|
value: album.record_type,
|
||||||
|
})
|
||||||
.setFrame('TXXX', {
|
.setFrame('TXXX', {
|
||||||
description: 'ISRC',
|
description: 'ISRC',
|
||||||
value: track.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',
|
||||||
|
})
|
||||||
.setFrame('TXXX', {
|
.setFrame('TXXX', {
|
||||||
description: 'SOURCE',
|
description: 'SOURCE',
|
||||||
value: 'Deezer',
|
value: 'Deezer',
|
||||||
@ -31,30 +62,30 @@ export const writeMetadataMp3 = (buffer: Buffer, track: trackType, cover?: Buffe
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (track.DISK_NUMBER) {
|
if (track.DISK_NUMBER) {
|
||||||
writer.setFrame('TPOS', track.DISK_NUMBER).setFrame('TXXX', {
|
writer.setFrame('TPOS', track.DISK_NUMBER).setFrame('TRCK', track.TRACK_NUMBER + '/' + album.nb_tracks);
|
||||||
description: 'DISCNUMBER',
|
|
||||||
value: track.DISK_NUMBER,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.setFrame('TXXX', {
|
|
||||||
description: 'LENGTH',
|
|
||||||
value: track.DURATION,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (track.SNG_CONTRIBUTORS) {
|
if (track.SNG_CONTRIBUTORS) {
|
||||||
if (track.SNG_CONTRIBUTORS.composer) {
|
writer.setFrame('TCOP', `${RELEASE_YEAR} ${track.SNG_CONTRIBUTORS.main_artist[0]}`);
|
||||||
writer.setFrame('TXXX', {
|
if (track.SNG_CONTRIBUTORS.publisher) {
|
||||||
description: 'COMPOSER',
|
writer.setFrame('TPUB', track.SNG_CONTRIBUTORS.publisher.join(', '));
|
||||||
value: track.SNG_CONTRIBUTORS.composer.join(', '),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
if (track.SNG_CONTRIBUTORS.composer) {
|
||||||
|
writer.setFrame('TCOM', track.SNG_CONTRIBUTORS.composer);
|
||||||
|
}
|
||||||
|
|
||||||
if (track.SNG_CONTRIBUTORS.writer) {
|
if (track.SNG_CONTRIBUTORS.writer) {
|
||||||
writer.setFrame('TXXX', {
|
writer.setFrame('TXXX', {
|
||||||
description: 'LYRICIST',
|
description: 'LYRICIST',
|
||||||
value: track.SNG_CONTRIBUTORS.writer.join(', '),
|
value: track.SNG_CONTRIBUTORS.writer.join(', '),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (track.SNG_CONTRIBUTORS.author) {
|
||||||
|
writer.setFrame('TXXX', {
|
||||||
|
description: 'AUTHOR',
|
||||||
|
value: track.SNG_CONTRIBUTORS.author.join(', '),
|
||||||
|
});
|
||||||
|
}
|
||||||
if (track.SNG_CONTRIBUTORS.mixer) {
|
if (track.SNG_CONTRIBUTORS.mixer) {
|
||||||
writer.setFrame('TXXX', {
|
writer.setFrame('TXXX', {
|
||||||
description: 'MIXARTIST',
|
description: 'MIXARTIST',
|
||||||
@ -75,6 +106,12 @@ export const writeMetadataMp3 = (buffer: Buffer, track: trackType, cover?: Buffe
|
|||||||
lyrics: track.LYRICS.LYRICS_TEXT,
|
lyrics: track.LYRICS.LYRICS_TEXT,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (track.EXPLICIT_LYRICS) {
|
||||||
|
writer.setFrame('TXXX', {
|
||||||
|
description: 'EXPLICIT',
|
||||||
|
value: track.EXPLICIT_LYRICS,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (cover) {
|
if (cover) {
|
||||||
writer.setFrame('APIC', {
|
writer.setFrame('APIC', {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import {downloadAlbumCover} from './abumCover';
|
import {downloadAlbumCover} from './abumCover';
|
||||||
import {getTrackLyrics} from './getTrackLyrics';
|
import {getTrackLyrics} from './getTrackLyrics';
|
||||||
// @ts-ignore
|
|
||||||
import {writeMetadataMp3} from './id3';
|
import {writeMetadataMp3} from './id3';
|
||||||
import {writeMetadataFlac} from './flacmetata';
|
import {writeMetadataFlac} from './flacmetata';
|
||||||
|
import {getAlbumInfoPublicApi} from '../api';
|
||||||
import type {trackType} from '../types';
|
import type {trackType} from '../types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -12,14 +12,24 @@ import type {trackType} from '../types';
|
|||||||
* @param {Number} albumCoverSize album cover size in pixel
|
* @param {Number} albumCoverSize album cover size in pixel
|
||||||
*/
|
*/
|
||||||
export const addTrackTags = async (trackBuffer: Buffer, track: trackType, 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)]);
|
const [cover, lyrics, album] = await Promise.all([
|
||||||
|
downloadAlbumCover(track, albumCoverSize),
|
||||||
|
getTrackLyrics(track),
|
||||||
|
getAlbumInfoPublicApi(track.ALB_ID),
|
||||||
|
]);
|
||||||
|
|
||||||
if (lyrics) {
|
if (lyrics) {
|
||||||
track.LYRICS = lyrics;
|
track.LYRICS = lyrics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
const isFlac = trackBuffer.slice(0, 4).toString('ascii') === 'fLaC';
|
const isFlac = trackBuffer.slice(0, 4).toString('ascii') === 'fLaC';
|
||||||
return isFlac
|
return isFlac
|
||||||
? writeMetadataFlac(trackBuffer, track, albumCoverSize, cover)
|
? writeMetadataFlac(trackBuffer, track, album, albumCoverSize, cover)
|
||||||
: writeMetadataMp3(trackBuffer, track, cover);
|
: writeMetadataMp3(trackBuffer, track, album, cover);
|
||||||
};
|
};
|
||||||
|
@ -152,7 +152,7 @@ if (process.env.CI) {
|
|||||||
|
|
||||||
const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 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, 3629256);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('DOWNLOAD TRACK320 & ADD METADATA', async (t) => {
|
test('DOWNLOAD TRACK320 & ADD METADATA', async (t) => {
|
||||||
@ -170,7 +170,7 @@ if (process.env.CI) {
|
|||||||
|
|
||||||
const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500);
|
const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500);
|
||||||
t.true(Buffer.isBuffer(trackWithMetadata));
|
t.true(Buffer.isBuffer(trackWithMetadata));
|
||||||
t.is(trackWithMetadata.length, 9023019);
|
t.is(trackWithMetadata.length, 9023438);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('DOWNLOAD TRACK1411 & ADD METADATA', async (t) => {
|
test('DOWNLOAD TRACK1411 & ADD METADATA', async (t) => {
|
||||||
@ -188,6 +188,6 @@ if (process.env.CI) {
|
|||||||
|
|
||||||
const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500);
|
const trackWithMetadata = await api.addTrackTags(decryptedTrack, track, 500);
|
||||||
t.true(Buffer.isBuffer(trackWithMetadata));
|
t.true(Buffer.isBuffer(trackWithMetadata));
|
||||||
t.is(trackWithMetadata.length, 25453167);
|
t.is(trackWithMetadata.length, 25453375);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,8 @@ interface songType {
|
|||||||
ALB_TITLE: string; // 'Discovery'
|
ALB_TITLE: string; // 'Discovery'
|
||||||
ALB_PICTURE: string; // '2e018122cb56986277102d2041a592c8'
|
ALB_PICTURE: string; // '2e018122cb56986277102d2041a592c8'
|
||||||
ARTISTS: artistType[];
|
ARTISTS: artistType[];
|
||||||
ART_ID: '27';
|
ART_ID: string; // '27'
|
||||||
ART_NAME: 'Daft Punk';
|
ART_NAME: string; // 'Daft Punk'
|
||||||
ARTIST_IS_DUMMY: boolean; // false
|
ARTIST_IS_DUMMY: boolean; // false
|
||||||
ART_PICTURE: string; //'f2bc007e9133c946ac3c3907ddc5d2ea'
|
ART_PICTURE: string; //'f2bc007e9133c946ac3c3907ddc5d2ea'
|
||||||
DATE_START: string; // '0000-00-00'
|
DATE_START: string; // '0000-00-00'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user