music-metadata 7.11.6 → 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.
- package/README.md +432 -432
- package/lib/ParserFactory.d.ts +49 -49
- package/lib/ParserFactory.js +251 -251
- package/lib/aiff/AiffParser.d.ts +15 -15
- package/lib/aiff/AiffParser.js +85 -85
- package/lib/aiff/AiffToken.d.ts +22 -22
- package/lib/aiff/AiffToken.js +43 -43
- package/lib/apev2/APEv2Parser.d.ts +30 -30
- package/lib/apev2/APEv2Parser.js +162 -162
- package/lib/apev2/APEv2TagMapper.d.ts +4 -4
- package/lib/apev2/APEv2TagMapper.js +86 -86
- package/lib/apev2/APEv2Token.d.ts +100 -100
- package/lib/apev2/APEv2Token.js +126 -126
- package/lib/asf/AsfObject.d.ts +319 -319
- package/lib/asf/AsfObject.js +384 -384
- package/lib/asf/AsfParser.d.ts +17 -17
- package/lib/asf/AsfParser.js +135 -135
- package/lib/asf/AsfTagMapper.d.ts +7 -7
- package/lib/asf/AsfTagMapper.js +95 -95
- package/lib/asf/AsfUtil.d.ts +13 -13
- package/lib/asf/AsfUtil.js +40 -40
- package/lib/asf/GUID.d.ts +86 -86
- package/lib/asf/GUID.js +123 -123
- package/lib/common/BasicParser.d.ts +17 -17
- package/lib/common/BasicParser.js +18 -18
- package/lib/common/CaseInsensitiveTagMap.d.ts +10 -10
- package/lib/common/CaseInsensitiveTagMap.js +21 -21
- package/lib/common/CombinedTagMapper.d.ts +19 -19
- package/lib/common/CombinedTagMapper.js +51 -51
- package/lib/common/FourCC.d.ts +6 -6
- package/lib/common/FourCC.js +28 -28
- package/lib/common/GenericTagMapper.d.ts +51 -51
- package/lib/common/GenericTagMapper.js +55 -55
- package/lib/common/GenericTagTypes.d.ts +33 -33
- package/lib/common/GenericTagTypes.js +131 -131
- package/lib/common/MetadataCollector.d.ts +76 -76
- package/lib/common/MetadataCollector.js +275 -275
- package/lib/common/RandomFileReader.d.ts +20 -20
- package/lib/common/RandomFileReader.js +37 -37
- package/lib/common/RandomUint8ArrayReader.d.ts +18 -18
- package/lib/common/RandomUint8ArrayReader.js +25 -25
- package/lib/common/Util.d.ts +58 -57
- package/lib/common/Util.js +162 -169
- package/lib/core.d.ts +48 -48
- package/lib/core.js +90 -90
- package/lib/dsdiff/DsdiffParser.d.ts +14 -14
- package/lib/dsdiff/DsdiffParser.js +143 -143
- package/lib/dsdiff/DsdiffToken.d.ts +9 -9
- package/lib/dsdiff/DsdiffToken.js +21 -21
- package/lib/dsf/DsfChunk.d.ts +86 -86
- package/lib/dsf/DsfChunk.js +54 -54
- package/lib/dsf/DsfParser.d.ts +9 -9
- package/lib/dsf/DsfParser.js +56 -56
- package/lib/flac/FlacParser.d.ts +28 -28
- package/lib/flac/FlacParser.js +175 -175
- package/lib/id3v1/ID3v1Parser.d.ts +13 -13
- package/lib/id3v1/ID3v1Parser.js +134 -134
- package/lib/id3v1/ID3v1TagMap.d.ts +4 -4
- package/lib/id3v1/ID3v1TagMap.js +22 -22
- package/lib/id3v2/AbstractID3Parser.d.ts +17 -17
- package/lib/id3v2/AbstractID3Parser.js +60 -60
- package/lib/id3v2/FrameParser.d.ts +32 -32
- package/lib/id3v2/FrameParser.js +329 -323
- package/lib/id3v2/ID3v22TagMapper.d.ts +9 -9
- package/lib/id3v2/ID3v22TagMapper.js +55 -55
- package/lib/id3v2/ID3v24TagMapper.d.ts +14 -14
- package/lib/id3v2/ID3v24TagMapper.js +193 -193
- package/lib/id3v2/ID3v2Parser.d.ts +29 -29
- package/lib/id3v2/ID3v2Parser.js +194 -194
- package/lib/id3v2/ID3v2Token.d.ts +73 -73
- package/lib/id3v2/ID3v2Token.js +106 -106
- package/lib/iff/index.d.ts +33 -33
- package/lib/iff/index.js +19 -19
- package/lib/index.d.ts +45 -45
- package/lib/index.js +74 -74
- package/lib/lyrics3/Lyrics3.d.ts +3 -3
- package/lib/lyrics3/Lyrics3.js +17 -17
- package/lib/matroska/MatroskaDtd.d.ts +8 -8
- package/lib/matroska/MatroskaDtd.js +279 -279
- package/lib/matroska/MatroskaParser.d.ts +37 -37
- package/lib/matroska/MatroskaParser.js +235 -235
- package/lib/matroska/MatroskaTagMapper.d.ts +4 -4
- package/lib/matroska/MatroskaTagMapper.js +35 -35
- package/lib/matroska/types.d.ts +175 -175
- package/lib/matroska/types.js +32 -32
- package/lib/mp4/Atom.d.ts +16 -16
- package/lib/mp4/Atom.js +70 -70
- package/lib/mp4/AtomToken.d.ts +395 -395
- package/lib/mp4/AtomToken.js +406 -406
- package/lib/mp4/MP4Parser.d.ts +30 -30
- package/lib/mp4/MP4Parser.js +511 -511
- package/lib/mp4/MP4TagMapper.d.ts +5 -5
- package/lib/mp4/MP4TagMapper.js +115 -115
- package/lib/mpeg/ExtendedLameHeader.d.ts +27 -27
- package/lib/mpeg/ExtendedLameHeader.js +31 -31
- package/lib/mpeg/MpegParser.d.ts +49 -49
- package/lib/mpeg/MpegParser.js +529 -529
- package/lib/mpeg/ReplayGainDataFormat.d.ts +55 -55
- package/lib/mpeg/ReplayGainDataFormat.js +69 -69
- package/lib/mpeg/XingTag.d.ts +45 -45
- package/lib/mpeg/XingTag.js +69 -69
- package/lib/musepack/index.d.ts +5 -5
- package/lib/musepack/index.js +32 -32
- package/lib/musepack/sv7/BitReader.d.ts +13 -13
- package/lib/musepack/sv7/BitReader.js +54 -54
- package/lib/musepack/sv7/MpcSv7Parser.d.ts +8 -8
- package/lib/musepack/sv7/MpcSv7Parser.js +46 -46
- package/lib/musepack/sv7/StreamVersion7.d.ts +28 -28
- package/lib/musepack/sv7/StreamVersion7.js +41 -41
- package/lib/musepack/sv8/MpcSv8Parser.d.ts +6 -6
- package/lib/musepack/sv8/MpcSv8Parser.js +55 -55
- package/lib/musepack/sv8/StreamVersion8.d.ts +40 -40
- package/lib/musepack/sv8/StreamVersion8.js +80 -80
- package/lib/ogg/Ogg.d.ts +72 -72
- package/lib/ogg/Ogg.js +2 -2
- package/lib/ogg/OggParser.d.ts +23 -23
- package/lib/ogg/OggParser.js +126 -126
- package/lib/ogg/opus/Opus.d.ts +48 -48
- package/lib/ogg/opus/Opus.js +28 -28
- package/lib/ogg/opus/OpusParser.d.ts +25 -25
- package/lib/ogg/opus/OpusParser.js +56 -56
- package/lib/ogg/speex/Speex.d.ts +36 -36
- package/lib/ogg/speex/Speex.js +31 -31
- package/lib/ogg/speex/SpeexParser.d.ts +22 -22
- package/lib/ogg/speex/SpeexParser.js +35 -35
- package/lib/ogg/theora/Theora.d.ts +20 -20
- package/lib/ogg/theora/Theora.js +23 -23
- package/lib/ogg/theora/TheoraParser.d.ts +28 -28
- package/lib/ogg/theora/TheoraParser.js +44 -44
- package/lib/ogg/vorbis/Vorbis.d.ts +79 -79
- package/lib/ogg/vorbis/Vorbis.js +78 -78
- package/lib/ogg/vorbis/VorbisDecoder.d.ts +12 -12
- package/lib/ogg/vorbis/VorbisDecoder.js +32 -32
- package/lib/ogg/vorbis/VorbisParser.d.ts +36 -36
- package/lib/ogg/vorbis/VorbisParser.js +128 -128
- package/lib/ogg/vorbis/VorbisTagMapper.d.ts +7 -7
- package/lib/ogg/vorbis/VorbisTagMapper.js +132 -132
- package/lib/riff/RiffChunk.d.ts +16 -16
- package/lib/riff/RiffChunk.js +32 -32
- package/lib/riff/RiffInfoTagMap.d.ts +10 -10
- package/lib/riff/RiffInfoTagMap.js +37 -37
- package/lib/type.d.ts +599 -599
- package/lib/type.js +13 -13
- package/lib/wav/WaveChunk.d.ts +64 -64
- package/lib/wav/WaveChunk.js +65 -65
- package/lib/wav/WaveParser.d.ts +24 -24
- package/lib/wav/WaveParser.js +144 -144
- package/lib/wavpack/WavPackParser.d.ts +14 -14
- package/lib/wavpack/WavPackParser.js +105 -105
- package/lib/wavpack/WavPackToken.d.ts +64 -64
- package/lib/wavpack/WavPackToken.js +76 -76
- package/package.json +142 -142
package/lib/asf/AsfParser.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { BasicParser } from '../common/BasicParser';
|
|
2
|
-
/**
|
|
3
|
-
* Windows Media Metadata Usage Guidelines
|
|
4
|
-
* Ref: https://msdn.microsoft.com/en-us/library/ms867702.aspx
|
|
5
|
-
*
|
|
6
|
-
* Ref:
|
|
7
|
-
* https://tools.ietf.org/html/draft-fleischman-asf-01
|
|
8
|
-
* https://hwiegman.home.xs4all.nl/fileformats/asf/ASF_Specification.pdf
|
|
9
|
-
* http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html
|
|
10
|
-
* https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx
|
|
11
|
-
*/
|
|
12
|
-
export declare class AsfParser extends BasicParser {
|
|
13
|
-
parse(): Promise<void>;
|
|
14
|
-
private parseObjectHeader;
|
|
15
|
-
private addTags;
|
|
16
|
-
private parseExtensionObject;
|
|
17
|
-
}
|
|
1
|
+
import { BasicParser } from '../common/BasicParser';
|
|
2
|
+
/**
|
|
3
|
+
* Windows Media Metadata Usage Guidelines
|
|
4
|
+
* Ref: https://msdn.microsoft.com/en-us/library/ms867702.aspx
|
|
5
|
+
*
|
|
6
|
+
* Ref:
|
|
7
|
+
* https://tools.ietf.org/html/draft-fleischman-asf-01
|
|
8
|
+
* https://hwiegman.home.xs4all.nl/fileformats/asf/ASF_Specification.pdf
|
|
9
|
+
* http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html
|
|
10
|
+
* https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx
|
|
11
|
+
*/
|
|
12
|
+
export declare class AsfParser extends BasicParser {
|
|
13
|
+
parse(): Promise<void>;
|
|
14
|
+
private parseObjectHeader;
|
|
15
|
+
private addTags;
|
|
16
|
+
private parseExtensionObject;
|
|
17
|
+
}
|
package/lib/asf/AsfParser.js
CHANGED
|
@@ -1,135 +1,135 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AsfParser = void 0;
|
|
4
|
-
const _debug = require("debug");
|
|
5
|
-
const type_1 = require("../type");
|
|
6
|
-
const GUID_1 = require("./GUID");
|
|
7
|
-
const AsfObject = require("./AsfObject");
|
|
8
|
-
const BasicParser_1 = require("../common/BasicParser");
|
|
9
|
-
const debug = _debug('music-metadata:parser:ASF');
|
|
10
|
-
const headerType = 'asf';
|
|
11
|
-
/**
|
|
12
|
-
* Windows Media Metadata Usage Guidelines
|
|
13
|
-
* Ref: https://msdn.microsoft.com/en-us/library/ms867702.aspx
|
|
14
|
-
*
|
|
15
|
-
* Ref:
|
|
16
|
-
* https://tools.ietf.org/html/draft-fleischman-asf-01
|
|
17
|
-
* https://hwiegman.home.xs4all.nl/fileformats/asf/ASF_Specification.pdf
|
|
18
|
-
* http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html
|
|
19
|
-
* https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx
|
|
20
|
-
*/
|
|
21
|
-
class AsfParser extends BasicParser_1.BasicParser {
|
|
22
|
-
async parse() {
|
|
23
|
-
const header = await this.tokenizer.readToken(AsfObject.TopLevelHeaderObjectToken);
|
|
24
|
-
if (!header.objectId.equals(GUID_1.default.HeaderObject)) {
|
|
25
|
-
throw new Error('expected asf header; but was not found; got: ' + header.objectId.str);
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
await this.parseObjectHeader(header.numberOfHeaderObjects);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
debug('Error while parsing ASF: %s', err);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async parseObjectHeader(numberOfObjectHeaders) {
|
|
35
|
-
let tags;
|
|
36
|
-
do {
|
|
37
|
-
// Parse common header of the ASF Object (3.1)
|
|
38
|
-
const header = await this.tokenizer.readToken(AsfObject.HeaderObjectToken);
|
|
39
|
-
// Parse data part of the ASF Object
|
|
40
|
-
debug('header GUID=%s', header.objectId.str);
|
|
41
|
-
switch (header.objectId.str) {
|
|
42
|
-
case AsfObject.FilePropertiesObject.guid.str: // 3.2
|
|
43
|
-
const fpo = await this.tokenizer.readToken(new AsfObject.FilePropertiesObject(header));
|
|
44
|
-
this.metadata.setFormat('duration', Number(fpo.playDuration / BigInt(1000)) / 10000 - Number(fpo.preroll) / 1000);
|
|
45
|
-
this.metadata.setFormat('bitrate', fpo.maximumBitrate);
|
|
46
|
-
break;
|
|
47
|
-
case AsfObject.StreamPropertiesObject.guid.str: // 3.3
|
|
48
|
-
const spo = await this.tokenizer.readToken(new AsfObject.StreamPropertiesObject(header));
|
|
49
|
-
this.metadata.setFormat('container', 'ASF/' + spo.streamType);
|
|
50
|
-
break;
|
|
51
|
-
case AsfObject.HeaderExtensionObject.guid.str: // 3.4
|
|
52
|
-
const extHeader = await this.tokenizer.readToken(new AsfObject.HeaderExtensionObject());
|
|
53
|
-
await this.parseExtensionObject(extHeader.extensionDataSize);
|
|
54
|
-
break;
|
|
55
|
-
case AsfObject.ContentDescriptionObjectState.guid.str: // 3.10
|
|
56
|
-
tags = await this.tokenizer.readToken(new AsfObject.ContentDescriptionObjectState(header));
|
|
57
|
-
this.addTags(tags);
|
|
58
|
-
break;
|
|
59
|
-
case AsfObject.ExtendedContentDescriptionObjectState.guid.str: // 3.11
|
|
60
|
-
tags = await this.tokenizer.readToken(new AsfObject.ExtendedContentDescriptionObjectState(header));
|
|
61
|
-
this.addTags(tags);
|
|
62
|
-
break;
|
|
63
|
-
case GUID_1.default.CodecListObject.str:
|
|
64
|
-
const codecs = await AsfObject.readCodecEntries(this.tokenizer);
|
|
65
|
-
codecs.forEach(codec => {
|
|
66
|
-
this.metadata.addStreamInfo({
|
|
67
|
-
type: codec.type.videoCodec ? type_1.TrackType.video : type_1.TrackType.audio,
|
|
68
|
-
codecName: codec.codecName
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
const audioCodecs = codecs.filter(codec => codec.type.audioCodec).map(codec => codec.codecName).join('/');
|
|
72
|
-
this.metadata.setFormat('codec', audioCodecs);
|
|
73
|
-
break;
|
|
74
|
-
case GUID_1.default.StreamBitratePropertiesObject.str:
|
|
75
|
-
// ToDo?
|
|
76
|
-
await this.tokenizer.ignore(header.objectSize - AsfObject.HeaderObjectToken.len);
|
|
77
|
-
break;
|
|
78
|
-
case GUID_1.default.PaddingObject.str:
|
|
79
|
-
// ToDo: register bytes pad
|
|
80
|
-
debug('Padding: %s bytes', header.objectSize - AsfObject.HeaderObjectToken.len);
|
|
81
|
-
await this.tokenizer.ignore(header.objectSize - AsfObject.HeaderObjectToken.len);
|
|
82
|
-
break;
|
|
83
|
-
default:
|
|
84
|
-
this.metadata.addWarning('Ignore ASF-Object-GUID: ' + header.objectId.str);
|
|
85
|
-
debug('Ignore ASF-Object-GUID: %s', header.objectId.str);
|
|
86
|
-
await this.tokenizer.readToken(new AsfObject.IgnoreObjectState(header));
|
|
87
|
-
}
|
|
88
|
-
} while (--numberOfObjectHeaders);
|
|
89
|
-
// done
|
|
90
|
-
}
|
|
91
|
-
addTags(tags) {
|
|
92
|
-
tags.forEach(tag => {
|
|
93
|
-
this.metadata.addTag(headerType, tag.id, tag.value);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
async parseExtensionObject(extensionSize) {
|
|
97
|
-
do {
|
|
98
|
-
// Parse common header of the ASF Object (3.1)
|
|
99
|
-
const header = await this.tokenizer.readToken(AsfObject.HeaderObjectToken);
|
|
100
|
-
const remaining = header.objectSize - AsfObject.HeaderObjectToken.len;
|
|
101
|
-
// Parse data part of the ASF Object
|
|
102
|
-
switch (header.objectId.str) {
|
|
103
|
-
case AsfObject.ExtendedStreamPropertiesObjectState.guid.str: // 4.1
|
|
104
|
-
// ToDo: extended stream header properties are ignored
|
|
105
|
-
await this.tokenizer.readToken(new AsfObject.ExtendedStreamPropertiesObjectState(header));
|
|
106
|
-
break;
|
|
107
|
-
case AsfObject.MetadataObjectState.guid.str: // 4.7
|
|
108
|
-
const moTags = await this.tokenizer.readToken(new AsfObject.MetadataObjectState(header));
|
|
109
|
-
this.addTags(moTags);
|
|
110
|
-
break;
|
|
111
|
-
case AsfObject.MetadataLibraryObjectState.guid.str: // 4.8
|
|
112
|
-
const mlTags = await this.tokenizer.readToken(new AsfObject.MetadataLibraryObjectState(header));
|
|
113
|
-
this.addTags(mlTags);
|
|
114
|
-
break;
|
|
115
|
-
case GUID_1.default.PaddingObject.str:
|
|
116
|
-
// ToDo: register bytes pad
|
|
117
|
-
await this.tokenizer.ignore(remaining);
|
|
118
|
-
break;
|
|
119
|
-
case GUID_1.default.CompatibilityObject.str:
|
|
120
|
-
this.tokenizer.ignore(remaining);
|
|
121
|
-
break;
|
|
122
|
-
case GUID_1.default.ASF_Index_Placeholder_Object.str:
|
|
123
|
-
await this.tokenizer.ignore(remaining);
|
|
124
|
-
break;
|
|
125
|
-
default:
|
|
126
|
-
this.metadata.addWarning('Ignore ASF-Object-GUID: ' + header.objectId.str);
|
|
127
|
-
// console.log("Ignore ASF-Object-GUID: %s", header.objectId.str);
|
|
128
|
-
await this.tokenizer.readToken(new AsfObject.IgnoreObjectState(header));
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
extensionSize -= header.objectSize;
|
|
132
|
-
} while (extensionSize > 0);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
exports.AsfParser = AsfParser;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AsfParser = void 0;
|
|
4
|
+
const _debug = require("debug");
|
|
5
|
+
const type_1 = require("../type");
|
|
6
|
+
const GUID_1 = require("./GUID");
|
|
7
|
+
const AsfObject = require("./AsfObject");
|
|
8
|
+
const BasicParser_1 = require("../common/BasicParser");
|
|
9
|
+
const debug = _debug('music-metadata:parser:ASF');
|
|
10
|
+
const headerType = 'asf';
|
|
11
|
+
/**
|
|
12
|
+
* Windows Media Metadata Usage Guidelines
|
|
13
|
+
* Ref: https://msdn.microsoft.com/en-us/library/ms867702.aspx
|
|
14
|
+
*
|
|
15
|
+
* Ref:
|
|
16
|
+
* https://tools.ietf.org/html/draft-fleischman-asf-01
|
|
17
|
+
* https://hwiegman.home.xs4all.nl/fileformats/asf/ASF_Specification.pdf
|
|
18
|
+
* http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html
|
|
19
|
+
* https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx
|
|
20
|
+
*/
|
|
21
|
+
class AsfParser extends BasicParser_1.BasicParser {
|
|
22
|
+
async parse() {
|
|
23
|
+
const header = await this.tokenizer.readToken(AsfObject.TopLevelHeaderObjectToken);
|
|
24
|
+
if (!header.objectId.equals(GUID_1.default.HeaderObject)) {
|
|
25
|
+
throw new Error('expected asf header; but was not found; got: ' + header.objectId.str);
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
await this.parseObjectHeader(header.numberOfHeaderObjects);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
debug('Error while parsing ASF: %s', err);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async parseObjectHeader(numberOfObjectHeaders) {
|
|
35
|
+
let tags;
|
|
36
|
+
do {
|
|
37
|
+
// Parse common header of the ASF Object (3.1)
|
|
38
|
+
const header = await this.tokenizer.readToken(AsfObject.HeaderObjectToken);
|
|
39
|
+
// Parse data part of the ASF Object
|
|
40
|
+
debug('header GUID=%s', header.objectId.str);
|
|
41
|
+
switch (header.objectId.str) {
|
|
42
|
+
case AsfObject.FilePropertiesObject.guid.str: // 3.2
|
|
43
|
+
const fpo = await this.tokenizer.readToken(new AsfObject.FilePropertiesObject(header));
|
|
44
|
+
this.metadata.setFormat('duration', Number(fpo.playDuration / BigInt(1000)) / 10000 - Number(fpo.preroll) / 1000);
|
|
45
|
+
this.metadata.setFormat('bitrate', fpo.maximumBitrate);
|
|
46
|
+
break;
|
|
47
|
+
case AsfObject.StreamPropertiesObject.guid.str: // 3.3
|
|
48
|
+
const spo = await this.tokenizer.readToken(new AsfObject.StreamPropertiesObject(header));
|
|
49
|
+
this.metadata.setFormat('container', 'ASF/' + spo.streamType);
|
|
50
|
+
break;
|
|
51
|
+
case AsfObject.HeaderExtensionObject.guid.str: // 3.4
|
|
52
|
+
const extHeader = await this.tokenizer.readToken(new AsfObject.HeaderExtensionObject());
|
|
53
|
+
await this.parseExtensionObject(extHeader.extensionDataSize);
|
|
54
|
+
break;
|
|
55
|
+
case AsfObject.ContentDescriptionObjectState.guid.str: // 3.10
|
|
56
|
+
tags = await this.tokenizer.readToken(new AsfObject.ContentDescriptionObjectState(header));
|
|
57
|
+
this.addTags(tags);
|
|
58
|
+
break;
|
|
59
|
+
case AsfObject.ExtendedContentDescriptionObjectState.guid.str: // 3.11
|
|
60
|
+
tags = await this.tokenizer.readToken(new AsfObject.ExtendedContentDescriptionObjectState(header));
|
|
61
|
+
this.addTags(tags);
|
|
62
|
+
break;
|
|
63
|
+
case GUID_1.default.CodecListObject.str:
|
|
64
|
+
const codecs = await AsfObject.readCodecEntries(this.tokenizer);
|
|
65
|
+
codecs.forEach(codec => {
|
|
66
|
+
this.metadata.addStreamInfo({
|
|
67
|
+
type: codec.type.videoCodec ? type_1.TrackType.video : type_1.TrackType.audio,
|
|
68
|
+
codecName: codec.codecName
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
const audioCodecs = codecs.filter(codec => codec.type.audioCodec).map(codec => codec.codecName).join('/');
|
|
72
|
+
this.metadata.setFormat('codec', audioCodecs);
|
|
73
|
+
break;
|
|
74
|
+
case GUID_1.default.StreamBitratePropertiesObject.str:
|
|
75
|
+
// ToDo?
|
|
76
|
+
await this.tokenizer.ignore(header.objectSize - AsfObject.HeaderObjectToken.len);
|
|
77
|
+
break;
|
|
78
|
+
case GUID_1.default.PaddingObject.str:
|
|
79
|
+
// ToDo: register bytes pad
|
|
80
|
+
debug('Padding: %s bytes', header.objectSize - AsfObject.HeaderObjectToken.len);
|
|
81
|
+
await this.tokenizer.ignore(header.objectSize - AsfObject.HeaderObjectToken.len);
|
|
82
|
+
break;
|
|
83
|
+
default:
|
|
84
|
+
this.metadata.addWarning('Ignore ASF-Object-GUID: ' + header.objectId.str);
|
|
85
|
+
debug('Ignore ASF-Object-GUID: %s', header.objectId.str);
|
|
86
|
+
await this.tokenizer.readToken(new AsfObject.IgnoreObjectState(header));
|
|
87
|
+
}
|
|
88
|
+
} while (--numberOfObjectHeaders);
|
|
89
|
+
// done
|
|
90
|
+
}
|
|
91
|
+
addTags(tags) {
|
|
92
|
+
tags.forEach(tag => {
|
|
93
|
+
this.metadata.addTag(headerType, tag.id, tag.value);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async parseExtensionObject(extensionSize) {
|
|
97
|
+
do {
|
|
98
|
+
// Parse common header of the ASF Object (3.1)
|
|
99
|
+
const header = await this.tokenizer.readToken(AsfObject.HeaderObjectToken);
|
|
100
|
+
const remaining = header.objectSize - AsfObject.HeaderObjectToken.len;
|
|
101
|
+
// Parse data part of the ASF Object
|
|
102
|
+
switch (header.objectId.str) {
|
|
103
|
+
case AsfObject.ExtendedStreamPropertiesObjectState.guid.str: // 4.1
|
|
104
|
+
// ToDo: extended stream header properties are ignored
|
|
105
|
+
await this.tokenizer.readToken(new AsfObject.ExtendedStreamPropertiesObjectState(header));
|
|
106
|
+
break;
|
|
107
|
+
case AsfObject.MetadataObjectState.guid.str: // 4.7
|
|
108
|
+
const moTags = await this.tokenizer.readToken(new AsfObject.MetadataObjectState(header));
|
|
109
|
+
this.addTags(moTags);
|
|
110
|
+
break;
|
|
111
|
+
case AsfObject.MetadataLibraryObjectState.guid.str: // 4.8
|
|
112
|
+
const mlTags = await this.tokenizer.readToken(new AsfObject.MetadataLibraryObjectState(header));
|
|
113
|
+
this.addTags(mlTags);
|
|
114
|
+
break;
|
|
115
|
+
case GUID_1.default.PaddingObject.str:
|
|
116
|
+
// ToDo: register bytes pad
|
|
117
|
+
await this.tokenizer.ignore(remaining);
|
|
118
|
+
break;
|
|
119
|
+
case GUID_1.default.CompatibilityObject.str:
|
|
120
|
+
this.tokenizer.ignore(remaining);
|
|
121
|
+
break;
|
|
122
|
+
case GUID_1.default.ASF_Index_Placeholder_Object.str:
|
|
123
|
+
await this.tokenizer.ignore(remaining);
|
|
124
|
+
break;
|
|
125
|
+
default:
|
|
126
|
+
this.metadata.addWarning('Ignore ASF-Object-GUID: ' + header.objectId.str);
|
|
127
|
+
// console.log("Ignore ASF-Object-GUID: %s", header.objectId.str);
|
|
128
|
+
await this.tokenizer.readToken(new AsfObject.IgnoreObjectState(header));
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
extensionSize -= header.objectSize;
|
|
132
|
+
} while (extensionSize > 0);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.AsfParser = AsfParser;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { CommonTagMapper } from '../common/GenericTagMapper';
|
|
2
|
-
import { IRating, ITag } from '../type';
|
|
3
|
-
export declare class AsfTagMapper extends CommonTagMapper {
|
|
4
|
-
static toRating(rating: string): IRating;
|
|
5
|
-
constructor();
|
|
6
|
-
protected postMap(tag: ITag): void;
|
|
7
|
-
}
|
|
1
|
+
import { CommonTagMapper } from '../common/GenericTagMapper';
|
|
2
|
+
import { IRating, ITag } from '../type';
|
|
3
|
+
export declare class AsfTagMapper extends CommonTagMapper {
|
|
4
|
+
static toRating(rating: string): IRating;
|
|
5
|
+
constructor();
|
|
6
|
+
protected postMap(tag: ITag): void;
|
|
7
|
+
}
|
package/lib/asf/AsfTagMapper.js
CHANGED
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AsfTagMapper = void 0;
|
|
4
|
-
const GenericTagMapper_1 = require("../common/GenericTagMapper");
|
|
5
|
-
/**
|
|
6
|
-
* ASF Metadata tag mappings.
|
|
7
|
-
* See http://msdn.microsoft.com/en-us/library/ms867702.aspx
|
|
8
|
-
*/
|
|
9
|
-
const asfTagMap = {
|
|
10
|
-
Title: 'title',
|
|
11
|
-
Author: 'artist',
|
|
12
|
-
'WM/AlbumArtist': 'albumartist',
|
|
13
|
-
'WM/AlbumTitle': 'album',
|
|
14
|
-
'WM/Year': 'date',
|
|
15
|
-
'WM/OriginalReleaseTime': 'originaldate',
|
|
16
|
-
'WM/OriginalReleaseYear': 'originalyear',
|
|
17
|
-
Description: 'comment',
|
|
18
|
-
'WM/TrackNumber': 'track',
|
|
19
|
-
'WM/PartOfSet': 'disk',
|
|
20
|
-
'WM/Genre': 'genre',
|
|
21
|
-
'WM/Composer': 'composer',
|
|
22
|
-
'WM/Lyrics': 'lyrics',
|
|
23
|
-
'WM/AlbumSortOrder': 'albumsort',
|
|
24
|
-
'WM/TitleSortOrder': 'titlesort',
|
|
25
|
-
'WM/ArtistSortOrder': 'artistsort',
|
|
26
|
-
'WM/AlbumArtistSortOrder': 'albumartistsort',
|
|
27
|
-
'WM/ComposerSortOrder': 'composersort',
|
|
28
|
-
'WM/Writer': 'lyricist',
|
|
29
|
-
'WM/Conductor': 'conductor',
|
|
30
|
-
'WM/ModifiedBy': 'remixer',
|
|
31
|
-
'WM/Engineer': 'engineer',
|
|
32
|
-
'WM/Producer': 'producer',
|
|
33
|
-
'WM/DJMixer': 'djmixer',
|
|
34
|
-
'WM/Mixer': 'mixer',
|
|
35
|
-
'WM/Publisher': 'label',
|
|
36
|
-
'WM/ContentGroupDescription': 'grouping',
|
|
37
|
-
'WM/SubTitle': 'subtitle',
|
|
38
|
-
'WM/SetSubTitle': 'discsubtitle',
|
|
39
|
-
// 'WM/PartOfSet': 'totaldiscs',
|
|
40
|
-
'WM/IsCompilation': 'compilation',
|
|
41
|
-
'WM/SharedUserRating': 'rating',
|
|
42
|
-
'WM/BeatsPerMinute': 'bpm',
|
|
43
|
-
'WM/Mood': 'mood',
|
|
44
|
-
'WM/Media': 'media',
|
|
45
|
-
'WM/CatalogNo': 'catalognumber',
|
|
46
|
-
'MusicBrainz/Album Status': 'releasestatus',
|
|
47
|
-
'MusicBrainz/Album Type': 'releasetype',
|
|
48
|
-
'MusicBrainz/Album Release Country': 'releasecountry',
|
|
49
|
-
'WM/Script': 'script',
|
|
50
|
-
'WM/Language': 'language',
|
|
51
|
-
Copyright: 'copyright',
|
|
52
|
-
LICENSE: 'license',
|
|
53
|
-
'WM/EncodedBy': 'encodedby',
|
|
54
|
-
'WM/EncodingSettings': 'encodersettings',
|
|
55
|
-
'WM/Barcode': 'barcode',
|
|
56
|
-
'WM/ISRC': 'isrc',
|
|
57
|
-
'MusicBrainz/Track Id': 'musicbrainz_recordingid',
|
|
58
|
-
'MusicBrainz/Release Track Id': 'musicbrainz_trackid',
|
|
59
|
-
'MusicBrainz/Album Id': 'musicbrainz_albumid',
|
|
60
|
-
'MusicBrainz/Artist Id': 'musicbrainz_artistid',
|
|
61
|
-
'MusicBrainz/Album Artist Id': 'musicbrainz_albumartistid',
|
|
62
|
-
'MusicBrainz/Release Group Id': 'musicbrainz_releasegroupid',
|
|
63
|
-
'MusicBrainz/Work Id': 'musicbrainz_workid',
|
|
64
|
-
'MusicBrainz/TRM Id': 'musicbrainz_trmid',
|
|
65
|
-
'MusicBrainz/Disc Id': 'musicbrainz_discid',
|
|
66
|
-
'Acoustid/Id': 'acoustid_id',
|
|
67
|
-
'Acoustid/Fingerprint': 'acoustid_fingerprint',
|
|
68
|
-
'MusicIP/PUID': 'musicip_puid',
|
|
69
|
-
'WM/ARTISTS': 'artists',
|
|
70
|
-
'WM/InitialKey': 'key',
|
|
71
|
-
ASIN: 'asin',
|
|
72
|
-
'WM/Work': 'work',
|
|
73
|
-
'WM/AuthorURL': 'website',
|
|
74
|
-
'WM/Picture': 'picture'
|
|
75
|
-
};
|
|
76
|
-
class AsfTagMapper extends GenericTagMapper_1.CommonTagMapper {
|
|
77
|
-
static toRating(rating) {
|
|
78
|
-
return {
|
|
79
|
-
rating: parseFloat(rating + 1) / 5
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
constructor() {
|
|
83
|
-
super(['asf'], asfTagMap);
|
|
84
|
-
}
|
|
85
|
-
postMap(tag) {
|
|
86
|
-
switch (tag.id) {
|
|
87
|
-
case 'WM/SharedUserRating':
|
|
88
|
-
const keys = tag.id.split(':');
|
|
89
|
-
tag.value = AsfTagMapper.toRating(tag.value);
|
|
90
|
-
tag.id = keys[0];
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
exports.AsfTagMapper = AsfTagMapper;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AsfTagMapper = void 0;
|
|
4
|
+
const GenericTagMapper_1 = require("../common/GenericTagMapper");
|
|
5
|
+
/**
|
|
6
|
+
* ASF Metadata tag mappings.
|
|
7
|
+
* See http://msdn.microsoft.com/en-us/library/ms867702.aspx
|
|
8
|
+
*/
|
|
9
|
+
const asfTagMap = {
|
|
10
|
+
Title: 'title',
|
|
11
|
+
Author: 'artist',
|
|
12
|
+
'WM/AlbumArtist': 'albumartist',
|
|
13
|
+
'WM/AlbumTitle': 'album',
|
|
14
|
+
'WM/Year': 'date',
|
|
15
|
+
'WM/OriginalReleaseTime': 'originaldate',
|
|
16
|
+
'WM/OriginalReleaseYear': 'originalyear',
|
|
17
|
+
Description: 'comment',
|
|
18
|
+
'WM/TrackNumber': 'track',
|
|
19
|
+
'WM/PartOfSet': 'disk',
|
|
20
|
+
'WM/Genre': 'genre',
|
|
21
|
+
'WM/Composer': 'composer',
|
|
22
|
+
'WM/Lyrics': 'lyrics',
|
|
23
|
+
'WM/AlbumSortOrder': 'albumsort',
|
|
24
|
+
'WM/TitleSortOrder': 'titlesort',
|
|
25
|
+
'WM/ArtistSortOrder': 'artistsort',
|
|
26
|
+
'WM/AlbumArtistSortOrder': 'albumartistsort',
|
|
27
|
+
'WM/ComposerSortOrder': 'composersort',
|
|
28
|
+
'WM/Writer': 'lyricist',
|
|
29
|
+
'WM/Conductor': 'conductor',
|
|
30
|
+
'WM/ModifiedBy': 'remixer',
|
|
31
|
+
'WM/Engineer': 'engineer',
|
|
32
|
+
'WM/Producer': 'producer',
|
|
33
|
+
'WM/DJMixer': 'djmixer',
|
|
34
|
+
'WM/Mixer': 'mixer',
|
|
35
|
+
'WM/Publisher': 'label',
|
|
36
|
+
'WM/ContentGroupDescription': 'grouping',
|
|
37
|
+
'WM/SubTitle': 'subtitle',
|
|
38
|
+
'WM/SetSubTitle': 'discsubtitle',
|
|
39
|
+
// 'WM/PartOfSet': 'totaldiscs',
|
|
40
|
+
'WM/IsCompilation': 'compilation',
|
|
41
|
+
'WM/SharedUserRating': 'rating',
|
|
42
|
+
'WM/BeatsPerMinute': 'bpm',
|
|
43
|
+
'WM/Mood': 'mood',
|
|
44
|
+
'WM/Media': 'media',
|
|
45
|
+
'WM/CatalogNo': 'catalognumber',
|
|
46
|
+
'MusicBrainz/Album Status': 'releasestatus',
|
|
47
|
+
'MusicBrainz/Album Type': 'releasetype',
|
|
48
|
+
'MusicBrainz/Album Release Country': 'releasecountry',
|
|
49
|
+
'WM/Script': 'script',
|
|
50
|
+
'WM/Language': 'language',
|
|
51
|
+
Copyright: 'copyright',
|
|
52
|
+
LICENSE: 'license',
|
|
53
|
+
'WM/EncodedBy': 'encodedby',
|
|
54
|
+
'WM/EncodingSettings': 'encodersettings',
|
|
55
|
+
'WM/Barcode': 'barcode',
|
|
56
|
+
'WM/ISRC': 'isrc',
|
|
57
|
+
'MusicBrainz/Track Id': 'musicbrainz_recordingid',
|
|
58
|
+
'MusicBrainz/Release Track Id': 'musicbrainz_trackid',
|
|
59
|
+
'MusicBrainz/Album Id': 'musicbrainz_albumid',
|
|
60
|
+
'MusicBrainz/Artist Id': 'musicbrainz_artistid',
|
|
61
|
+
'MusicBrainz/Album Artist Id': 'musicbrainz_albumartistid',
|
|
62
|
+
'MusicBrainz/Release Group Id': 'musicbrainz_releasegroupid',
|
|
63
|
+
'MusicBrainz/Work Id': 'musicbrainz_workid',
|
|
64
|
+
'MusicBrainz/TRM Id': 'musicbrainz_trmid',
|
|
65
|
+
'MusicBrainz/Disc Id': 'musicbrainz_discid',
|
|
66
|
+
'Acoustid/Id': 'acoustid_id',
|
|
67
|
+
'Acoustid/Fingerprint': 'acoustid_fingerprint',
|
|
68
|
+
'MusicIP/PUID': 'musicip_puid',
|
|
69
|
+
'WM/ARTISTS': 'artists',
|
|
70
|
+
'WM/InitialKey': 'key',
|
|
71
|
+
ASIN: 'asin',
|
|
72
|
+
'WM/Work': 'work',
|
|
73
|
+
'WM/AuthorURL': 'website',
|
|
74
|
+
'WM/Picture': 'picture'
|
|
75
|
+
};
|
|
76
|
+
class AsfTagMapper extends GenericTagMapper_1.CommonTagMapper {
|
|
77
|
+
static toRating(rating) {
|
|
78
|
+
return {
|
|
79
|
+
rating: parseFloat(rating + 1) / 5
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
constructor() {
|
|
83
|
+
super(['asf'], asfTagMap);
|
|
84
|
+
}
|
|
85
|
+
postMap(tag) {
|
|
86
|
+
switch (tag.id) {
|
|
87
|
+
case 'WM/SharedUserRating':
|
|
88
|
+
const keys = tag.id.split(':');
|
|
89
|
+
tag.value = AsfTagMapper.toRating(tag.value);
|
|
90
|
+
tag.id = keys[0];
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.AsfTagMapper = AsfTagMapper;
|
|
96
96
|
//# sourceMappingURL=AsfTagMapper.js.map
|
package/lib/asf/AsfUtil.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { DataType } from './AsfObject';
|
|
3
|
-
export declare type AttributeParser = (buf: Buffer) => boolean | string | number | bigint | Buffer;
|
|
4
|
-
export declare class AsfUtil {
|
|
5
|
-
static getParserForAttr(i: DataType): AttributeParser;
|
|
6
|
-
static parseUnicodeAttr(buf: any): string;
|
|
7
|
-
private static attributeParsers;
|
|
8
|
-
private static parseByteArrayAttr;
|
|
9
|
-
private static parseBoolAttr;
|
|
10
|
-
private static parseDWordAttr;
|
|
11
|
-
private static parseQWordAttr;
|
|
12
|
-
private static parseWordAttr;
|
|
13
|
-
}
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DataType } from './AsfObject';
|
|
3
|
+
export declare type AttributeParser = (buf: Buffer) => boolean | string | number | bigint | Buffer;
|
|
4
|
+
export declare class AsfUtil {
|
|
5
|
+
static getParserForAttr(i: DataType): AttributeParser;
|
|
6
|
+
static parseUnicodeAttr(buf: any): string;
|
|
7
|
+
private static attributeParsers;
|
|
8
|
+
private static parseByteArrayAttr;
|
|
9
|
+
private static parseBoolAttr;
|
|
10
|
+
private static parseDWordAttr;
|
|
11
|
+
private static parseQWordAttr;
|
|
12
|
+
private static parseWordAttr;
|
|
13
|
+
}
|
package/lib/asf/AsfUtil.js
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AsfUtil = void 0;
|
|
4
|
-
const Token = require("token-types");
|
|
5
|
-
const util = require("../common/Util");
|
|
6
|
-
class AsfUtil {
|
|
7
|
-
static getParserForAttr(i) {
|
|
8
|
-
return AsfUtil.attributeParsers[i];
|
|
9
|
-
}
|
|
10
|
-
static parseUnicodeAttr(buf) {
|
|
11
|
-
return util.stripNulls(util.decodeString(buf, 'utf16le'));
|
|
12
|
-
}
|
|
13
|
-
static parseByteArrayAttr(buf) {
|
|
14
|
-
const newBuf = Buffer.alloc(buf.length);
|
|
15
|
-
buf.copy(newBuf);
|
|
16
|
-
return newBuf;
|
|
17
|
-
}
|
|
18
|
-
static parseBoolAttr(buf, offset = 0) {
|
|
19
|
-
return AsfUtil.parseWordAttr(buf, offset) === 1;
|
|
20
|
-
}
|
|
21
|
-
static parseDWordAttr(buf, offset = 0) {
|
|
22
|
-
return buf.readUInt32LE(offset);
|
|
23
|
-
}
|
|
24
|
-
static parseQWordAttr(buf, offset = 0) {
|
|
25
|
-
return Token.UINT64_LE.get(buf, offset);
|
|
26
|
-
}
|
|
27
|
-
static parseWordAttr(buf, offset = 0) {
|
|
28
|
-
return buf.readUInt16LE(offset);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
exports.AsfUtil = AsfUtil;
|
|
32
|
-
AsfUtil.attributeParsers = [
|
|
33
|
-
AsfUtil.parseUnicodeAttr,
|
|
34
|
-
AsfUtil.parseByteArrayAttr,
|
|
35
|
-
AsfUtil.parseBoolAttr,
|
|
36
|
-
AsfUtil.parseDWordAttr,
|
|
37
|
-
AsfUtil.parseQWordAttr,
|
|
38
|
-
AsfUtil.parseWordAttr,
|
|
39
|
-
AsfUtil.parseByteArrayAttr
|
|
40
|
-
];
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AsfUtil = void 0;
|
|
4
|
+
const Token = require("token-types");
|
|
5
|
+
const util = require("../common/Util");
|
|
6
|
+
class AsfUtil {
|
|
7
|
+
static getParserForAttr(i) {
|
|
8
|
+
return AsfUtil.attributeParsers[i];
|
|
9
|
+
}
|
|
10
|
+
static parseUnicodeAttr(buf) {
|
|
11
|
+
return util.stripNulls(util.decodeString(buf, 'utf16le'));
|
|
12
|
+
}
|
|
13
|
+
static parseByteArrayAttr(buf) {
|
|
14
|
+
const newBuf = Buffer.alloc(buf.length);
|
|
15
|
+
buf.copy(newBuf);
|
|
16
|
+
return newBuf;
|
|
17
|
+
}
|
|
18
|
+
static parseBoolAttr(buf, offset = 0) {
|
|
19
|
+
return AsfUtil.parseWordAttr(buf, offset) === 1;
|
|
20
|
+
}
|
|
21
|
+
static parseDWordAttr(buf, offset = 0) {
|
|
22
|
+
return buf.readUInt32LE(offset);
|
|
23
|
+
}
|
|
24
|
+
static parseQWordAttr(buf, offset = 0) {
|
|
25
|
+
return Token.UINT64_LE.get(buf, offset);
|
|
26
|
+
}
|
|
27
|
+
static parseWordAttr(buf, offset = 0) {
|
|
28
|
+
return buf.readUInt16LE(offset);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.AsfUtil = AsfUtil;
|
|
32
|
+
AsfUtil.attributeParsers = [
|
|
33
|
+
AsfUtil.parseUnicodeAttr,
|
|
34
|
+
AsfUtil.parseByteArrayAttr,
|
|
35
|
+
AsfUtil.parseBoolAttr,
|
|
36
|
+
AsfUtil.parseDWordAttr,
|
|
37
|
+
AsfUtil.parseQWordAttr,
|
|
38
|
+
AsfUtil.parseWordAttr,
|
|
39
|
+
AsfUtil.parseByteArrayAttr
|
|
40
|
+
];
|