1
0
mirror of synced 2026-05-22 14:43:19 +00:00
Files
music-metadata/test/test-file-matroska.ts
T
2022-02-27 15:27:40 +01:00

163 lines
7.2 KiB
TypeScript

import path from 'node:path';
import { assert } from 'chai';
import * as mm from '../lib/index.js';
import { samplePath } from './util.js';
describe('Matroska formats', () => {
const matroskaSamplePath = path.join(samplePath, 'matroska');
function verifyTrackSolidGround(common: mm.ICommonTagsResult) {
// Common mapped EBML tags
assert.strictEqual(common.title, 'Solid Ground', 'common.title');
assert.strictEqual(common.artist, 'Poxfil', 'common.artist');
assert.strictEqual(common.artistsort, 'Poxfil', 'common.artistsort');
assert.deepEqual(common.label, ['blocSonic'], 'common.label');
assert.strictEqual(common.musicbrainz_albumid, 'abf39f57-0b01-4b51-9c1e-b21e8ada5091', 'common.musicbrainz_albumid');
assert.deepEqual(common.musicbrainz_artistid, ['ee315b01-df5e-451e-8cd6-90a9f1faaf51'], 'common.musicbrainz_artistid');
assert.strictEqual(common.musicbrainz_recordingid, '209dbf50-509d-4ac3-aec5-e96da99dfdd9', 'common.musicbrainz_recordingid');
assert.deepEqual(common.track, {no: 2, of: 10}, 'common.track');
}
describe('Matroska audio (.mka)', () => {
it('parse: "alac-in-matroska-short.mka"', async () => {
const mkaPath = path.join(matroskaSamplePath, 'alac-in-matroska-short.mka');
const {format} = await mm.parseFile(mkaPath, {duration: false});
// format chunk information
assert.strictEqual(format.container, 'EBML/matroska', 'format.container');
assert.strictEqual(format.codec, 'ALAC', 'format.codec');
assert.approximately(format.duration, 196608 / 41000, 1 / 100000, 'format.duration');
assert.strictEqual(format.sampleRate, 41000, 'format.sampleRate');
assert.strictEqual(format.numberOfChannels, 2, 'format.numberOfChannels');
});
it('parse: "02 - Poxfil - Solid Ground (5 sec).mka"', async () => {
const mkaPath = path.join(matroskaSamplePath, '02 - Poxfil - Solid Ground (5 sec).mka');
const {format, common} = await mm.parseFile(mkaPath, {duration: false});
// format chunk information
assert.strictEqual(format.container, 'EBML/matroska', 'format.container');
assert.strictEqual(format.codec, 'AAC', 'format.codec');
assert.approximately(format.duration, 221184 / 44100, 1 / 100000, 'format.duration');
assert.strictEqual(format.sampleRate, 44100, 'format.sampleRate');
assert.strictEqual(format.numberOfChannels, 2, 'format.numberOfChannels');
verifyTrackSolidGround(common);
});
});
describe('WebM', () => {
it('parse: "big-buck-bunny_trailer-short.vp8.webm"', async () => {
const webmPath = path.join(matroskaSamplePath, 'big-buck-bunny_trailer-short.vp8.webm');
const {format, common} = await mm.parseFile(webmPath, {duration: false});
// format chunk information
assert.strictEqual(format.container, 'EBML/webm', 'format.container');
assert.strictEqual(format.codec, 'VORBIS', 'format.codec');
assert.approximately(format.duration, 7.143, 1 / 100000, 'format.duration');
assert.strictEqual(format.sampleRate, 44100, 'format.sampleRate');
// common metadata
assert.strictEqual(common.title, 'Big Buck Bunny', 'common.title');
assert.isDefined(common.picture, 'common.picture');
assert.strictEqual(common.picture[0].format, 'image/jpeg', 'common.picture[0].format');
assert.strictEqual(common.picture[0].description, 'Poster', 'common.picture[0].description');
assert.strictEqual(common.picture[0].name, 'Big buck bunny poster.jpg', 'common.picture[0].name');
});
it('parse: "02 - Poxfil - Solid Ground (5 sec).opus.webm"', async () => {
const webmPath = path.join(matroskaSamplePath, '02 - Poxfil - Solid Ground (5 sec).opus.webm');
const {format, common} = await mm.parseFile(webmPath, {duration: false});
// format chunk information
assert.strictEqual(format.container, 'EBML/webm', 'format.container');
assert.strictEqual(format.codec, 'OPUS', 'format.codec');
assert.approximately(format.duration, 5.006509896, 1 / 100000, 'format.duration');
assert.strictEqual(format.sampleRate, 44100, 'format.sampleRate');
assert.strictEqual(common.title, 'Solid Ground', 'common.title');
assert.strictEqual(common.artist, 'Poxfil', 'common.artist');
assert.deepStrictEqual(common.track, {no: 2, of: 10}, 'common.track');
assert.strictEqual(common.encodedby, 'Max 0.8b', 'common.encodersettings');
assert.strictEqual(common.encodersettings, '--bitrate 96 --vbr', 'common.encodersettings');
});
it('should parse "My Baby Boy.webm"', async () => {
const filePath = path.join(matroskaSamplePath, 'My Baby Boy.webm');
const {format, common, native} = await mm.parseFile(filePath, {duration: true});
assert.strictEqual(format.container, 'EBML/webm', 'format.container');
assert.strictEqual(format.codec, 'OPUS', 'format.codec');
assert.strictEqual(common.title, 'My Baby Boy', 'common.title');
assert.strictEqual(common.artist, 'theAngelcy', 'common.artist');
assert.strictEqual(common.albumartist, 'theAngelcy', 'common.albumartist');
assert.deepStrictEqual(common.track, {no: 2, of: 13}, 'common.track');
assert.deepStrictEqual(common.disk, {no: 1, of: 1}, 'common.disk');
assert.deepStrictEqual(common.genre, ['Folk'], 'common.genre');
assert.strictEqual(common.encodedby, 'opusenc from opus-tools 0.2', 'common.encodersettings');
assert.strictEqual(common.encodersettings, '--bitrate 96 --vbr', 'common.encodersettings');
});
it('shoud ignore trailing null characters', async () => {
const webmPath = path.join(matroskaSamplePath, 'fixture-null.webm');
const {format} = await mm.parseFile(webmPath, {duration: false});
assert.strictEqual(format.container, 'EBML/webm', 'format.container');
});
});
// https://github.com/Borewit/music-metadata/issues/384
describe('Multiple audio tracks', () => {
it('parse: "matroska-test-w1-test5-short.mkv"', async () => {
const mkvPath = path.join(matroskaSamplePath, 'matroska-test-w1-test5-short.mkv');
const {format, common} = await mm.parseFile(mkvPath);
assert.deepEqual(format.container, 'EBML/matroska', 'format.container');
assert.deepEqual(format.tagTypes, [ 'matroska' ], 'format.tagTypes');
assert.deepEqual(format.codec, 'AAC', 'format.codec');
assert.approximately(format.duration, 3.417, 1 / 100000, 'format.duration');
assert.strictEqual(format.sampleRate, 48000, 'format.sampleRate');
assert.strictEqual(format.numberOfChannels, 2, 'format.numberOfChannels');
assert.deepEqual(common.title, 'Elephant Dreams', 'common.title');
assert.deepEqual(common.album, 'Matroska Test Files - Wave 1', 'common.album');
});
});
// https://www.matroska.org/technical/streaming.html
// https://github.com/Borewit/music-metadata/issues/765
describe('Parse Matroska Stream', () => {
const mkvPath = path.join(matroskaSamplePath, 'stream.weba');
it('Parse stream', async () => {
const {format} = await mm.parseFile(mkvPath);
assert.strictEqual(format.container, 'EBML/webm', 'format.container');
assert.strictEqual(format.codec, 'OPUS', 'format.codec');
assert.strictEqual(format.numberOfChannels, 1, 'format.numberOfChannels');
});
});
});