diff --git a/lib/common/MetadataCollector.ts b/lib/common/MetadataCollector.ts index a28dd3bfe..3951eef73 100644 --- a/lib/common/MetadataCollector.ts +++ b/lib/common/MetadataCollector.ts @@ -199,6 +199,7 @@ export class MetadataCollector implements INativeMetadataCollector { this.common[tag.id].of = of != null ? of : this.common[tag.id].of; return; + case 'bpm': case 'year': case 'originalyear': tag.value = parseInt(tag.value, 10); diff --git a/lib/id3v2/ID3v22TagMapper.ts b/lib/id3v2/ID3v22TagMapper.ts index fa7b80814..8b1894c06 100644 --- a/lib/id3v2/ID3v22TagMapper.ts +++ b/lib/id3v2/ID3v22TagMapper.ts @@ -45,7 +45,10 @@ export const id3v22TagMap: INativeTagMap = { TSC: 'composersort', TSP: 'artistsort', TST: 'titlesort', - WFD: 'podcasturl' + WFD: 'podcasturl', + + TBP: 'bpm' + }; export class ID3v22TagMapper extends CaseInsensitiveTagMap { diff --git a/test/samples/mp3/Betty Lou.mp3 b/test/samples/mp3/Betty Lou.mp3 new file mode 100644 index 000000000..ec7d30b9f Binary files /dev/null and b/test/samples/mp3/Betty Lou.mp3 differ diff --git a/test/test-id3v2.2.ts b/test/test-id3v2.2.ts index cf220a9e6..ba77c8f75 100644 --- a/test/test-id3v2.2.ts +++ b/test/test-id3v2.2.ts @@ -101,6 +101,23 @@ describe('ID3v2Parser', () => { assert.strictEqual(pics[0].type, 'Cover (front)', 'picture type'); }); + describe('Tag mapping', () => { + + it("TBP (beats per minute)", async () => { + + const filePath = path.join(samplePath, 'mp3', 'Betty Lou.mp3'); + + const {format, common, native} = await mm.parseFile(filePath, {duration: true}); + assert.strictEqual(format.container, 'MPEG', 'format.container'); + assert.strictEqual(format.codec, 'MPEG 1 Layer 3', 'format.codec'); + + assert.strictEqual(common.title, 'Betty Lou', 'common.title'); + assert.strictEqual(common.artist, 'The Hub Caps', 'common.artist,'); + + assert.strictEqual(common.bpm, 177, 'common.bpm,'); + }); + }); + }); describe('Post parse genre', () => {