music-metadata 7.11.3 → 7.11.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +432 -432
  2. package/lib/ParserFactory.d.ts +49 -49
  3. package/lib/ParserFactory.js +251 -251
  4. package/lib/aiff/AiffParser.d.ts +15 -15
  5. package/lib/aiff/AiffParser.js +85 -85
  6. package/lib/aiff/AiffToken.d.ts +22 -22
  7. package/lib/aiff/AiffToken.js +43 -43
  8. package/lib/apev2/APEv2Parser.d.ts +30 -30
  9. package/lib/apev2/APEv2Parser.js +162 -162
  10. package/lib/apev2/APEv2TagMapper.d.ts +4 -4
  11. package/lib/apev2/APEv2TagMapper.js +87 -86
  12. package/lib/apev2/APEv2Token.d.ts +100 -100
  13. package/lib/apev2/APEv2Token.js +127 -126
  14. package/lib/asf/AsfObject.d.ts +319 -319
  15. package/lib/asf/AsfObject.js +384 -384
  16. package/lib/asf/AsfParser.d.ts +17 -17
  17. package/lib/asf/AsfParser.js +135 -135
  18. package/lib/asf/AsfTagMapper.d.ts +7 -7
  19. package/lib/asf/AsfTagMapper.js +96 -95
  20. package/lib/asf/AsfUtil.d.ts +13 -13
  21. package/lib/asf/AsfUtil.js +40 -40
  22. package/lib/asf/GUID.d.ts +86 -86
  23. package/lib/asf/GUID.js +123 -123
  24. package/lib/common/BasicParser.d.ts +17 -17
  25. package/lib/common/BasicParser.js +18 -18
  26. package/lib/common/CaseInsensitiveTagMap.d.ts +10 -10
  27. package/lib/common/CaseInsensitiveTagMap.js +22 -21
  28. package/lib/common/CombinedTagMapper.d.ts +19 -19
  29. package/lib/common/CombinedTagMapper.js +52 -51
  30. package/lib/common/FourCC.d.ts +6 -6
  31. package/lib/common/FourCC.js +29 -28
  32. package/lib/common/GenericTagMapper.d.ts +51 -51
  33. package/lib/common/GenericTagMapper.js +56 -55
  34. package/lib/common/GenericTagTypes.d.ts +33 -33
  35. package/lib/common/GenericTagTypes.js +132 -131
  36. package/lib/common/MetadataCollector.d.ts +76 -76
  37. package/lib/common/MetadataCollector.js +276 -274
  38. package/lib/common/RandomFileReader.d.ts +20 -20
  39. package/lib/common/RandomFileReader.js +37 -37
  40. package/lib/common/RandomUint8ArrayReader.d.ts +18 -18
  41. package/lib/common/RandomUint8ArrayReader.js +25 -25
  42. package/lib/common/Util.d.ts +58 -57
  43. package/lib/common/Util.js +163 -169
  44. package/lib/core.d.ts +48 -48
  45. package/lib/core.js +90 -90
  46. package/lib/dsdiff/DsdiffParser.d.ts +14 -14
  47. package/lib/dsdiff/DsdiffParser.js +143 -143
  48. package/lib/dsdiff/DsdiffToken.d.ts +9 -9
  49. package/lib/dsdiff/DsdiffToken.js +21 -21
  50. package/lib/dsf/DsfChunk.d.ts +86 -86
  51. package/lib/dsf/DsfChunk.js +54 -54
  52. package/lib/dsf/DsfParser.d.ts +9 -9
  53. package/lib/dsf/DsfParser.js +56 -56
  54. package/lib/flac/FlacParser.d.ts +28 -28
  55. package/lib/flac/FlacParser.js +175 -175
  56. package/lib/id3v1/ID3v1Parser.d.ts +13 -13
  57. package/lib/id3v1/ID3v1Parser.js +134 -134
  58. package/lib/id3v1/ID3v1TagMap.d.ts +4 -4
  59. package/lib/id3v1/ID3v1TagMap.js +23 -22
  60. package/lib/id3v2/AbstractID3Parser.d.ts +17 -17
  61. package/lib/id3v2/AbstractID3Parser.js +60 -60
  62. package/lib/id3v2/FrameParser.d.ts +32 -32
  63. package/lib/id3v2/FrameParser.js +329 -323
  64. package/lib/id3v2/ID3v22TagMapper.d.ts +9 -9
  65. package/lib/id3v2/ID3v22TagMapper.js +56 -54
  66. package/lib/id3v2/ID3v24TagMapper.d.ts +14 -14
  67. package/lib/id3v2/ID3v24TagMapper.js +194 -193
  68. package/lib/id3v2/ID3v2Parser.d.ts +29 -29
  69. package/lib/id3v2/ID3v2Parser.js +194 -194
  70. package/lib/id3v2/ID3v2Token.d.ts +73 -73
  71. package/lib/id3v2/ID3v2Token.js +106 -106
  72. package/lib/iff/index.d.ts +33 -33
  73. package/lib/iff/index.js +19 -19
  74. package/lib/index.d.ts +45 -34
  75. package/lib/index.js +74 -64
  76. package/lib/lyrics3/Lyrics3.d.ts +3 -3
  77. package/lib/lyrics3/Lyrics3.js +17 -17
  78. package/lib/matroska/MatroskaDtd.d.ts +8 -8
  79. package/lib/matroska/MatroskaDtd.js +279 -279
  80. package/lib/matroska/MatroskaParser.d.ts +37 -37
  81. package/lib/matroska/MatroskaParser.js +235 -234
  82. package/lib/matroska/MatroskaTagMapper.d.ts +4 -4
  83. package/lib/matroska/MatroskaTagMapper.js +36 -35
  84. package/lib/matroska/types.d.ts +175 -175
  85. package/lib/matroska/types.js +32 -32
  86. package/lib/mp4/Atom.d.ts +16 -16
  87. package/lib/mp4/Atom.js +70 -70
  88. package/lib/mp4/AtomToken.d.ts +395 -395
  89. package/lib/mp4/AtomToken.js +406 -406
  90. package/lib/mp4/MP4Parser.d.ts +30 -30
  91. package/lib/mp4/MP4Parser.js +511 -511
  92. package/lib/mp4/MP4TagMapper.d.ts +5 -5
  93. package/lib/mp4/MP4TagMapper.js +116 -115
  94. package/lib/mpeg/ExtendedLameHeader.d.ts +27 -27
  95. package/lib/mpeg/ExtendedLameHeader.js +31 -31
  96. package/lib/mpeg/MpegParser.d.ts +49 -49
  97. package/lib/mpeg/MpegParser.js +529 -529
  98. package/lib/mpeg/ReplayGainDataFormat.d.ts +55 -55
  99. package/lib/mpeg/ReplayGainDataFormat.js +69 -69
  100. package/lib/mpeg/XingTag.d.ts +45 -45
  101. package/lib/mpeg/XingTag.js +69 -69
  102. package/lib/musepack/index.d.ts +5 -5
  103. package/lib/musepack/index.js +32 -32
  104. package/lib/musepack/sv7/BitReader.d.ts +13 -13
  105. package/lib/musepack/sv7/BitReader.js +54 -54
  106. package/lib/musepack/sv7/MpcSv7Parser.d.ts +8 -8
  107. package/lib/musepack/sv7/MpcSv7Parser.js +46 -46
  108. package/lib/musepack/sv7/StreamVersion7.d.ts +28 -28
  109. package/lib/musepack/sv7/StreamVersion7.js +41 -41
  110. package/lib/musepack/sv8/MpcSv8Parser.d.ts +6 -6
  111. package/lib/musepack/sv8/MpcSv8Parser.js +55 -55
  112. package/lib/musepack/sv8/StreamVersion8.d.ts +40 -40
  113. package/lib/musepack/sv8/StreamVersion8.js +80 -80
  114. package/lib/ogg/Ogg.d.ts +72 -72
  115. package/lib/ogg/Ogg.js +2 -2
  116. package/lib/ogg/OggParser.d.ts +23 -23
  117. package/lib/ogg/OggParser.js +126 -126
  118. package/lib/ogg/opus/Opus.d.ts +48 -48
  119. package/lib/ogg/opus/Opus.js +28 -28
  120. package/lib/ogg/opus/OpusParser.d.ts +25 -25
  121. package/lib/ogg/opus/OpusParser.js +56 -56
  122. package/lib/ogg/speex/Speex.d.ts +36 -36
  123. package/lib/ogg/speex/Speex.js +31 -31
  124. package/lib/ogg/speex/SpeexParser.d.ts +22 -22
  125. package/lib/ogg/speex/SpeexParser.js +35 -35
  126. package/lib/ogg/theora/Theora.d.ts +20 -20
  127. package/lib/ogg/theora/Theora.js +23 -23
  128. package/lib/ogg/theora/TheoraParser.d.ts +28 -28
  129. package/lib/ogg/theora/TheoraParser.js +44 -44
  130. package/lib/ogg/vorbis/Vorbis.d.ts +79 -79
  131. package/lib/ogg/vorbis/Vorbis.js +78 -78
  132. package/lib/ogg/vorbis/VorbisDecoder.d.ts +12 -12
  133. package/lib/ogg/vorbis/VorbisDecoder.js +32 -32
  134. package/lib/ogg/vorbis/VorbisParser.d.ts +36 -36
  135. package/lib/ogg/vorbis/VorbisParser.js +128 -128
  136. package/lib/ogg/vorbis/VorbisTagMapper.d.ts +7 -7
  137. package/lib/ogg/vorbis/VorbisTagMapper.js +133 -132
  138. package/lib/riff/RiffChunk.d.ts +16 -16
  139. package/lib/riff/RiffChunk.js +32 -32
  140. package/lib/riff/RiffInfoTagMap.d.ts +10 -10
  141. package/lib/riff/RiffInfoTagMap.js +38 -37
  142. package/lib/type.d.ts +599 -599
  143. package/lib/type.js +14 -13
  144. package/lib/wav/WaveChunk.d.ts +64 -64
  145. package/lib/wav/WaveChunk.js +65 -65
  146. package/lib/wav/WaveParser.d.ts +24 -24
  147. package/lib/wav/WaveParser.js +144 -144
  148. package/lib/wavpack/WavPackParser.d.ts +14 -14
  149. package/lib/wavpack/WavPackParser.js +105 -105
  150. package/lib/wavpack/WavPackToken.d.ts +64 -64
  151. package/lib/wavpack/WavPackToken.js +76 -76
  152. package/package.json +142 -142
@@ -1,80 +1,80 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StreamReader = void 0;
4
- const Token = require("token-types");
5
- const util = require("../../common/Util");
6
- const initDebug = require("debug");
7
- const debug = initDebug('music-metadata:parser:musepack:sv8');
8
- const PacketKey = new Token.StringType(2, 'binary');
9
- /**
10
- * Stream Header Packet part 1
11
- * Ref: http://trac.musepack.net/musepack/wiki/SV8Specification#StreamHeaderPacket
12
- */
13
- const SH_part1 = {
14
- len: 5,
15
- get: (buf, off) => {
16
- return {
17
- crc: Token.UINT32_LE.get(buf, off),
18
- streamVersion: Token.UINT8.get(buf, off + 4)
19
- };
20
- }
21
- };
22
- /**
23
- * Stream Header Packet part 3
24
- * Ref: http://trac.musepack.net/musepack/wiki/SV8Specification#StreamHeaderPacket
25
- */
26
- const SH_part3 = {
27
- len: 2,
28
- get: (buf, off) => {
29
- return {
30
- sampleFrequency: [44100, 48000, 37800, 32000][util.getBitAllignedNumber(buf, off, 0, 3)],
31
- maxUsedBands: util.getBitAllignedNumber(buf, off, 3, 5),
32
- channelCount: util.getBitAllignedNumber(buf, off + 1, 0, 4) + 1,
33
- msUsed: util.isBitSet(buf, off + 1, 4),
34
- audioBlockFrames: util.getBitAllignedNumber(buf, off + 1, 5, 3)
35
- };
36
- }
37
- };
38
- class StreamReader {
39
- constructor(tokenizer) {
40
- this.tokenizer = tokenizer;
41
- }
42
- async readPacketHeader() {
43
- const key = await this.tokenizer.readToken(PacketKey);
44
- const size = await this.readVariableSizeField();
45
- return {
46
- key,
47
- payloadLength: size.value - 2 - size.len
48
- };
49
- }
50
- async readStreamHeader(size) {
51
- const streamHeader = {};
52
- debug(`Reading SH at offset=${this.tokenizer.position}`);
53
- const part1 = await this.tokenizer.readToken(SH_part1);
54
- size -= SH_part1.len;
55
- Object.assign(streamHeader, part1);
56
- debug(`SH.streamVersion = ${part1.streamVersion}`);
57
- const sampleCount = await this.readVariableSizeField();
58
- size -= sampleCount.len;
59
- streamHeader.sampleCount = sampleCount.value;
60
- const bs = await this.readVariableSizeField();
61
- size -= bs.len;
62
- streamHeader.beginningOfSilence = bs.value;
63
- const part3 = await this.tokenizer.readToken(SH_part3);
64
- size -= SH_part3.len;
65
- Object.assign(streamHeader, part3);
66
- // assert.equal(size, 0);
67
- await this.tokenizer.ignore(size);
68
- return streamHeader;
69
- }
70
- async readVariableSizeField(len = 1, hb = 0) {
71
- let n = await this.tokenizer.readNumber(Token.UINT8);
72
- if ((n & 0x80) === 0) {
73
- return { len, value: hb + n };
74
- }
75
- n &= 0x7F;
76
- n += hb;
77
- return this.readVariableSizeField(len + 1, n << 7);
78
- }
79
- }
80
- exports.StreamReader = StreamReader;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamReader = void 0;
4
+ const Token = require("token-types");
5
+ const initDebug = require("debug");
6
+ const util = require("../../common/Util");
7
+ const debug = initDebug('music-metadata:parser:musepack:sv8');
8
+ const PacketKey = new Token.StringType(2, 'binary');
9
+ /**
10
+ * Stream Header Packet part 1
11
+ * Ref: http://trac.musepack.net/musepack/wiki/SV8Specification#StreamHeaderPacket
12
+ */
13
+ const SH_part1 = {
14
+ len: 5,
15
+ get: (buf, off) => {
16
+ return {
17
+ crc: Token.UINT32_LE.get(buf, off),
18
+ streamVersion: Token.UINT8.get(buf, off + 4)
19
+ };
20
+ }
21
+ };
22
+ /**
23
+ * Stream Header Packet part 3
24
+ * Ref: http://trac.musepack.net/musepack/wiki/SV8Specification#StreamHeaderPacket
25
+ */
26
+ const SH_part3 = {
27
+ len: 2,
28
+ get: (buf, off) => {
29
+ return {
30
+ sampleFrequency: [44100, 48000, 37800, 32000][util.getBitAllignedNumber(buf, off, 0, 3)],
31
+ maxUsedBands: util.getBitAllignedNumber(buf, off, 3, 5),
32
+ channelCount: util.getBitAllignedNumber(buf, off + 1, 0, 4) + 1,
33
+ msUsed: util.isBitSet(buf, off + 1, 4),
34
+ audioBlockFrames: util.getBitAllignedNumber(buf, off + 1, 5, 3)
35
+ };
36
+ }
37
+ };
38
+ class StreamReader {
39
+ constructor(tokenizer) {
40
+ this.tokenizer = tokenizer;
41
+ }
42
+ async readPacketHeader() {
43
+ const key = await this.tokenizer.readToken(PacketKey);
44
+ const size = await this.readVariableSizeField();
45
+ return {
46
+ key,
47
+ payloadLength: size.value - 2 - size.len
48
+ };
49
+ }
50
+ async readStreamHeader(size) {
51
+ const streamHeader = {};
52
+ debug(`Reading SH at offset=${this.tokenizer.position}`);
53
+ const part1 = await this.tokenizer.readToken(SH_part1);
54
+ size -= SH_part1.len;
55
+ Object.assign(streamHeader, part1);
56
+ debug(`SH.streamVersion = ${part1.streamVersion}`);
57
+ const sampleCount = await this.readVariableSizeField();
58
+ size -= sampleCount.len;
59
+ streamHeader.sampleCount = sampleCount.value;
60
+ const bs = await this.readVariableSizeField();
61
+ size -= bs.len;
62
+ streamHeader.beginningOfSilence = bs.value;
63
+ const part3 = await this.tokenizer.readToken(SH_part3);
64
+ size -= SH_part3.len;
65
+ Object.assign(streamHeader, part3);
66
+ // assert.equal(size, 0);
67
+ await this.tokenizer.ignore(size);
68
+ return streamHeader;
69
+ }
70
+ async readVariableSizeField(len = 1, hb = 0) {
71
+ let n = await this.tokenizer.readNumber(Token.UINT8);
72
+ if ((n & 0x80) === 0) {
73
+ return { len, value: hb + n };
74
+ }
75
+ n &= 0x7F;
76
+ n += hb;
77
+ return this.readVariableSizeField(len + 1, n << 7);
78
+ }
79
+ }
80
+ exports.StreamReader = StreamReader;
package/lib/ogg/Ogg.d.ts CHANGED
@@ -1,72 +1,72 @@
1
- /**
2
- * Page header
3
- * Ref: https://www.xiph.org/ogg/doc/framing.html#page_header
4
- */
5
- export interface IPageHeader {
6
- /**
7
- * capture_pattern
8
- * A header begins with a capture pattern that simplifies identifying pages;
9
- * once the decoder has found the capture pattern it can do a more intensive job of verifying that it has in fact found a page boundary (as opposed to an inadvertent coincidence in the byte stream).
10
- */
11
- capturePattern: string;
12
- /**
13
- * stream_structure_version
14
- */
15
- version: number;
16
- /**
17
- * header_type_flag
18
- */
19
- headerType: {
20
- /**
21
- * True: continued packet;
22
- * False: fresh packet
23
- */
24
- continued: boolean;
25
- /**
26
- * True: first page of logical bitstream (bos)
27
- * False: not first page of logical bitstream
28
- */
29
- firstPage: boolean;
30
- /**
31
- * True: last page of logical bitstream (eos)
32
- * False: not last page of logical bitstream
33
- */
34
- lastPage: boolean;
35
- };
36
- /**
37
- * The total samples encoded after including all packets finished on this page
38
- * The position specified in the frame header of the last page tells how long the data coded by the bitstream is.
39
- */
40
- absoluteGranulePosition: number;
41
- streamSerialNumber: number;
42
- pageSequenceNo: number;
43
- pageChecksum: number;
44
- /**
45
- * The number of segment entries to appear in the segment table.
46
- * The maximum number of 255 segments (255 bytes each) sets the maximum possible physical page size at 65307 bytes or
47
- * just under 64kB (thus we know that a header corrupted so as destroy sizing/alignment information will not cause a
48
- * runaway bitstream. We'll read in the page according to the corrupted size information that's guaranteed to be a
49
- * reasonable size regardless, notice the checksum mismatch, drop sync and then look for recapture).
50
- */
51
- page_segments: number;
52
- }
53
- export interface ISegmentTable {
54
- totalPageSize: number;
55
- }
56
- export interface IPageConsumer {
57
- /**
58
- * Parse Ogg page
59
- * @param {IPageHeader} header Ogg page header
60
- * @param {Buffer} pageData Ogg page data
61
- */
62
- parsePage(header: IPageHeader, pageData: Uint8Array): any;
63
- /**
64
- * Calculate duration of provided header
65
- * @param header Ogg header
66
- */
67
- calculateDuration(header: IPageHeader): any;
68
- /**
69
- * Force to parse pending segments
70
- */
71
- flush(): any;
72
- }
1
+ /**
2
+ * Page header
3
+ * Ref: https://www.xiph.org/ogg/doc/framing.html#page_header
4
+ */
5
+ export interface IPageHeader {
6
+ /**
7
+ * capture_pattern
8
+ * A header begins with a capture pattern that simplifies identifying pages;
9
+ * once the decoder has found the capture pattern it can do a more intensive job of verifying that it has in fact found a page boundary (as opposed to an inadvertent coincidence in the byte stream).
10
+ */
11
+ capturePattern: string;
12
+ /**
13
+ * stream_structure_version
14
+ */
15
+ version: number;
16
+ /**
17
+ * header_type_flag
18
+ */
19
+ headerType: {
20
+ /**
21
+ * True: continued packet;
22
+ * False: fresh packet
23
+ */
24
+ continued: boolean;
25
+ /**
26
+ * True: first page of logical bitstream (bos)
27
+ * False: not first page of logical bitstream
28
+ */
29
+ firstPage: boolean;
30
+ /**
31
+ * True: last page of logical bitstream (eos)
32
+ * False: not last page of logical bitstream
33
+ */
34
+ lastPage: boolean;
35
+ };
36
+ /**
37
+ * The total samples encoded after including all packets finished on this page
38
+ * The position specified in the frame header of the last page tells how long the data coded by the bitstream is.
39
+ */
40
+ absoluteGranulePosition: number;
41
+ streamSerialNumber: number;
42
+ pageSequenceNo: number;
43
+ pageChecksum: number;
44
+ /**
45
+ * The number of segment entries to appear in the segment table.
46
+ * The maximum number of 255 segments (255 bytes each) sets the maximum possible physical page size at 65307 bytes or
47
+ * just under 64kB (thus we know that a header corrupted so as destroy sizing/alignment information will not cause a
48
+ * runaway bitstream. We'll read in the page according to the corrupted size information that's guaranteed to be a
49
+ * reasonable size regardless, notice the checksum mismatch, drop sync and then look for recapture).
50
+ */
51
+ page_segments: number;
52
+ }
53
+ export interface ISegmentTable {
54
+ totalPageSize: number;
55
+ }
56
+ export interface IPageConsumer {
57
+ /**
58
+ * Parse Ogg page
59
+ * @param {IPageHeader} header Ogg page header
60
+ * @param {Buffer} pageData Ogg page data
61
+ */
62
+ parsePage(header: IPageHeader, pageData: Uint8Array): any;
63
+ /**
64
+ * Calculate duration of provided header
65
+ * @param header Ogg header
66
+ */
67
+ calculateDuration(header: IPageHeader): any;
68
+ /**
69
+ * Force to parse pending segments
70
+ */
71
+ flush(): any;
72
+ }
package/lib/ogg/Ogg.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,23 +1,23 @@
1
- import * as Ogg from './Ogg';
2
- import { BasicParser } from '../common/BasicParser';
3
- import { IGetToken } from 'strtok3/lib/core';
4
- export declare class SegmentTable implements IGetToken<Ogg.ISegmentTable> {
5
- private static sum;
6
- len: number;
7
- constructor(header: Ogg.IPageHeader);
8
- get(buf: any, off: any): Ogg.ISegmentTable;
9
- }
10
- /**
11
- * Parser for Ogg logical bitstream framing
12
- */
13
- export declare class OggParser extends BasicParser {
14
- private static Header;
15
- private header;
16
- private pageNumber;
17
- private pageConsumer;
18
- /**
19
- * Parse page
20
- * @returns {Promise<void>}
21
- */
22
- parse(): Promise<void>;
23
- }
1
+ import { IGetToken } from 'strtok3/lib/core';
2
+ import { BasicParser } from '../common/BasicParser';
3
+ import * as Ogg from './Ogg';
4
+ export declare class SegmentTable implements IGetToken<Ogg.ISegmentTable> {
5
+ private static sum;
6
+ len: number;
7
+ constructor(header: Ogg.IPageHeader);
8
+ get(buf: any, off: any): Ogg.ISegmentTable;
9
+ }
10
+ /**
11
+ * Parser for Ogg logical bitstream framing
12
+ */
13
+ export declare class OggParser extends BasicParser {
14
+ private static Header;
15
+ private header;
16
+ private pageNumber;
17
+ private pageConsumer;
18
+ /**
19
+ * Parse page
20
+ * @returns {Promise<void>}
21
+ */
22
+ parse(): Promise<void>;
23
+ }
@@ -1,126 +1,126 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OggParser = exports.SegmentTable = void 0;
4
- const Token = require("token-types");
5
- const initDebug = require("debug");
6
- const util = require("../common/Util");
7
- const FourCC_1 = require("../common/FourCC");
8
- const VorbisParser_1 = require("./vorbis/VorbisParser");
9
- const OpusParser_1 = require("./opus/OpusParser");
10
- const SpeexParser_1 = require("./speex/SpeexParser");
11
- const BasicParser_1 = require("../common/BasicParser");
12
- const TheoraParser_1 = require("./theora/TheoraParser");
13
- const core_1 = require("strtok3/lib/core");
14
- const debug = initDebug('music-metadata:parser:ogg');
15
- class SegmentTable {
16
- constructor(header) {
17
- this.len = header.page_segments;
18
- }
19
- static sum(buf, off, len) {
20
- let s = 0;
21
- for (let i = off; i < off + len; ++i) {
22
- s += buf[i];
23
- }
24
- return s;
25
- }
26
- get(buf, off) {
27
- return {
28
- totalPageSize: SegmentTable.sum(buf, off, this.len)
29
- };
30
- }
31
- }
32
- exports.SegmentTable = SegmentTable;
33
- /**
34
- * Parser for Ogg logical bitstream framing
35
- */
36
- class OggParser extends BasicParser_1.BasicParser {
37
- /**
38
- * Parse page
39
- * @returns {Promise<void>}
40
- */
41
- async parse() {
42
- debug('pos=%s, parsePage()', this.tokenizer.position);
43
- try {
44
- let header;
45
- do {
46
- header = await this.tokenizer.readToken(OggParser.Header);
47
- if (header.capturePattern !== 'OggS')
48
- throw new Error('Invalid Ogg capture pattern');
49
- this.metadata.setFormat('container', 'Ogg');
50
- this.header = header;
51
- this.pageNumber = header.pageSequenceNo;
52
- debug('page#=%s, Ogg.id=%s', header.pageSequenceNo, header.capturePattern);
53
- const segmentTable = await this.tokenizer.readToken(new SegmentTable(header));
54
- debug('totalPageSize=%s', segmentTable.totalPageSize);
55
- const pageData = await this.tokenizer.readToken(new Token.Uint8ArrayType(segmentTable.totalPageSize));
56
- debug('firstPage=%s, lastPage=%s, continued=%s', header.headerType.firstPage, header.headerType.lastPage, header.headerType.continued);
57
- if (header.headerType.firstPage) {
58
- const id = new Token.StringType(7, 'ascii').get(Buffer.from(pageData), 0);
59
- switch (id) {
60
- case '\x01vorbis': // Ogg/Vorbis
61
- debug('Set page consumer to Ogg/Vorbis');
62
- this.pageConsumer = new VorbisParser_1.VorbisParser(this.metadata, this.options);
63
- break;
64
- case 'OpusHea': // Ogg/Opus
65
- debug('Set page consumer to Ogg/Opus');
66
- this.pageConsumer = new OpusParser_1.OpusParser(this.metadata, this.options, this.tokenizer);
67
- break;
68
- case 'Speex ': // Ogg/Speex
69
- debug('Set page consumer to Ogg/Speex');
70
- this.pageConsumer = new SpeexParser_1.SpeexParser(this.metadata, this.options, this.tokenizer);
71
- break;
72
- case 'fishead':
73
- case '\x00theora': // Ogg/Theora
74
- debug('Set page consumer to Ogg/Theora');
75
- this.pageConsumer = new TheoraParser_1.TheoraParser(this.metadata, this.options, this.tokenizer);
76
- break;
77
- default:
78
- throw new Error('gg audio-codec not recognized (id=' + id + ')');
79
- }
80
- }
81
- this.pageConsumer.parsePage(header, pageData);
82
- } while (!header.headerType.lastPage);
83
- }
84
- catch (err) {
85
- if (err instanceof core_1.EndOfStreamError) {
86
- this.metadata.addWarning('Last OGG-page is not marked with last-page flag');
87
- debug(`End-of-stream`);
88
- this.metadata.addWarning('Last OGG-page is not marked with last-page flag');
89
- if (this.header) {
90
- this.pageConsumer.calculateDuration(this.header);
91
- }
92
- }
93
- else if (err.message.startsWith('FourCC')) {
94
- if (this.pageNumber > 0) {
95
- // ignore this error: work-around if last OGG-page is not marked with last-page flag
96
- this.metadata.addWarning('Invalid FourCC ID, maybe last OGG-page is not marked with last-page flag');
97
- this.pageConsumer.flush();
98
- }
99
- }
100
- else {
101
- throw err;
102
- }
103
- }
104
- }
105
- }
106
- exports.OggParser = OggParser;
107
- OggParser.Header = {
108
- len: 27,
109
- get: (buf, off) => {
110
- return {
111
- capturePattern: FourCC_1.FourCcToken.get(buf, off),
112
- version: Token.UINT8.get(buf, off + 4),
113
- headerType: {
114
- continued: util.getBit(buf, off + 5, 0),
115
- firstPage: util.getBit(buf, off + 5, 1),
116
- lastPage: util.getBit(buf, off + 5, 2)
117
- },
118
- // packet_flag: buf.readUInt8(off + 5),
119
- absoluteGranulePosition: Number(Token.UINT64_LE.get(buf, off + 6)),
120
- streamSerialNumber: Token.UINT32_LE.get(buf, off + 14),
121
- pageSequenceNo: Token.UINT32_LE.get(buf, off + 18),
122
- pageChecksum: Token.UINT32_LE.get(buf, off + 22),
123
- page_segments: Token.UINT8.get(buf, off + 26)
124
- };
125
- }
126
- };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OggParser = exports.SegmentTable = void 0;
4
+ const Token = require("token-types");
5
+ const core_1 = require("strtok3/lib/core");
6
+ const initDebug = require("debug");
7
+ const util = require("../common/Util");
8
+ const FourCC_1 = require("../common/FourCC");
9
+ const BasicParser_1 = require("../common/BasicParser");
10
+ const VorbisParser_1 = require("./vorbis/VorbisParser");
11
+ const OpusParser_1 = require("./opus/OpusParser");
12
+ const SpeexParser_1 = require("./speex/SpeexParser");
13
+ const TheoraParser_1 = require("./theora/TheoraParser");
14
+ const debug = initDebug('music-metadata:parser:ogg');
15
+ class SegmentTable {
16
+ constructor(header) {
17
+ this.len = header.page_segments;
18
+ }
19
+ static sum(buf, off, len) {
20
+ let s = 0;
21
+ for (let i = off; i < off + len; ++i) {
22
+ s += buf[i];
23
+ }
24
+ return s;
25
+ }
26
+ get(buf, off) {
27
+ return {
28
+ totalPageSize: SegmentTable.sum(buf, off, this.len)
29
+ };
30
+ }
31
+ }
32
+ exports.SegmentTable = SegmentTable;
33
+ /**
34
+ * Parser for Ogg logical bitstream framing
35
+ */
36
+ class OggParser extends BasicParser_1.BasicParser {
37
+ /**
38
+ * Parse page
39
+ * @returns {Promise<void>}
40
+ */
41
+ async parse() {
42
+ debug('pos=%s, parsePage()', this.tokenizer.position);
43
+ try {
44
+ let header;
45
+ do {
46
+ header = await this.tokenizer.readToken(OggParser.Header);
47
+ if (header.capturePattern !== 'OggS')
48
+ throw new Error('Invalid Ogg capture pattern');
49
+ this.metadata.setFormat('container', 'Ogg');
50
+ this.header = header;
51
+ this.pageNumber = header.pageSequenceNo;
52
+ debug('page#=%s, Ogg.id=%s', header.pageSequenceNo, header.capturePattern);
53
+ const segmentTable = await this.tokenizer.readToken(new SegmentTable(header));
54
+ debug('totalPageSize=%s', segmentTable.totalPageSize);
55
+ const pageData = await this.tokenizer.readToken(new Token.Uint8ArrayType(segmentTable.totalPageSize));
56
+ debug('firstPage=%s, lastPage=%s, continued=%s', header.headerType.firstPage, header.headerType.lastPage, header.headerType.continued);
57
+ if (header.headerType.firstPage) {
58
+ const id = new Token.StringType(7, 'ascii').get(Buffer.from(pageData), 0);
59
+ switch (id) {
60
+ case '\x01vorbis': // Ogg/Vorbis
61
+ debug('Set page consumer to Ogg/Vorbis');
62
+ this.pageConsumer = new VorbisParser_1.VorbisParser(this.metadata, this.options);
63
+ break;
64
+ case 'OpusHea': // Ogg/Opus
65
+ debug('Set page consumer to Ogg/Opus');
66
+ this.pageConsumer = new OpusParser_1.OpusParser(this.metadata, this.options, this.tokenizer);
67
+ break;
68
+ case 'Speex ': // Ogg/Speex
69
+ debug('Set page consumer to Ogg/Speex');
70
+ this.pageConsumer = new SpeexParser_1.SpeexParser(this.metadata, this.options, this.tokenizer);
71
+ break;
72
+ case 'fishead':
73
+ case '\x00theora': // Ogg/Theora
74
+ debug('Set page consumer to Ogg/Theora');
75
+ this.pageConsumer = new TheoraParser_1.TheoraParser(this.metadata, this.options, this.tokenizer);
76
+ break;
77
+ default:
78
+ throw new Error('gg audio-codec not recognized (id=' + id + ')');
79
+ }
80
+ }
81
+ this.pageConsumer.parsePage(header, pageData);
82
+ } while (!header.headerType.lastPage);
83
+ }
84
+ catch (err) {
85
+ if (err instanceof core_1.EndOfStreamError) {
86
+ this.metadata.addWarning('Last OGG-page is not marked with last-page flag');
87
+ debug(`End-of-stream`);
88
+ this.metadata.addWarning('Last OGG-page is not marked with last-page flag');
89
+ if (this.header) {
90
+ this.pageConsumer.calculateDuration(this.header);
91
+ }
92
+ }
93
+ else if (err.message.startsWith('FourCC')) {
94
+ if (this.pageNumber > 0) {
95
+ // ignore this error: work-around if last OGG-page is not marked with last-page flag
96
+ this.metadata.addWarning('Invalid FourCC ID, maybe last OGG-page is not marked with last-page flag');
97
+ this.pageConsumer.flush();
98
+ }
99
+ }
100
+ else {
101
+ throw err;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ exports.OggParser = OggParser;
107
+ OggParser.Header = {
108
+ len: 27,
109
+ get: (buf, off) => {
110
+ return {
111
+ capturePattern: FourCC_1.FourCcToken.get(buf, off),
112
+ version: Token.UINT8.get(buf, off + 4),
113
+ headerType: {
114
+ continued: util.getBit(buf, off + 5, 0),
115
+ firstPage: util.getBit(buf, off + 5, 1),
116
+ lastPage: util.getBit(buf, off + 5, 2)
117
+ },
118
+ // packet_flag: buf.readUInt8(off + 5),
119
+ absoluteGranulePosition: Number(Token.UINT64_LE.get(buf, off + 6)),
120
+ streamSerialNumber: Token.UINT32_LE.get(buf, off + 14),
121
+ pageSequenceNo: Token.UINT32_LE.get(buf, off + 18),
122
+ pageChecksum: Token.UINT32_LE.get(buf, off + 22),
123
+ page_segments: Token.UINT8.get(buf, off + 26)
124
+ };
125
+ }
126
+ };