ddex-json-codec 0.2.0 → 0.3.0
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/dist/index.d.mts +44 -27
- package/dist/index.mjs +46 -14
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -69,6 +69,7 @@ interface ResourceContributor {
|
|
|
69
69
|
name: string;
|
|
70
70
|
role: string;
|
|
71
71
|
sequenceNumber?: number;
|
|
72
|
+
instrumentType?: string;
|
|
72
73
|
/** UserDefined時の属性 */
|
|
73
74
|
roleNamespace?: string;
|
|
74
75
|
roleUserDefinedValue?: string;
|
|
@@ -88,16 +89,19 @@ interface Contributor {
|
|
|
88
89
|
}
|
|
89
90
|
//#endregion
|
|
90
91
|
//#region src/types/image.d.ts
|
|
91
|
-
interface
|
|
92
|
+
interface ImageBase {
|
|
92
93
|
resourceReference: string;
|
|
93
94
|
type?: string;
|
|
94
95
|
imageId?: ImageId;
|
|
95
|
-
|
|
96
|
+
}
|
|
97
|
+
interface Image38 extends ImageBase {
|
|
96
98
|
detailsByTerritory?: ImageDetailsByTerritory[];
|
|
97
|
-
|
|
99
|
+
}
|
|
100
|
+
interface Image4 extends ImageBase {
|
|
98
101
|
parentalWarningType?: string;
|
|
99
102
|
technicalDetails?: TechnicalImageDetails;
|
|
100
103
|
}
|
|
104
|
+
type Image = Image38 | Image4;
|
|
101
105
|
interface ImageId {
|
|
102
106
|
proprietaryId?: string;
|
|
103
107
|
proprietaryIdNamespace?: string;
|
|
@@ -125,25 +129,26 @@ interface HashSum {
|
|
|
125
129
|
}
|
|
126
130
|
//#endregion
|
|
127
131
|
//#region src/types/sound-recording.d.ts
|
|
128
|
-
interface
|
|
132
|
+
interface SoundRecordingBase {
|
|
129
133
|
resourceReference: string;
|
|
130
134
|
type?: string;
|
|
131
135
|
soundRecordingId?: SoundRecordingId;
|
|
132
|
-
referenceTitle?: ReferenceTitle$1;
|
|
133
136
|
displayArtists: DisplayArtist[];
|
|
134
137
|
duration?: string;
|
|
135
138
|
creationDate?: string;
|
|
136
139
|
languageOfPerformance?: string;
|
|
137
140
|
pLine?: PLine;
|
|
138
|
-
|
|
141
|
+
}
|
|
142
|
+
interface SoundRecording38 extends SoundRecordingBase {
|
|
143
|
+
referenceTitle?: ReferenceTitle$1;
|
|
139
144
|
detailsByTerritory?: SoundRecordingDetailsByTerritory[];
|
|
140
|
-
|
|
145
|
+
}
|
|
146
|
+
interface SoundRecording4 extends SoundRecordingBase {
|
|
141
147
|
displayTitleText?: string;
|
|
142
|
-
/** 4系: 複数のDisplayTitle(territory+lang属性) */
|
|
143
148
|
displayTitles?: DisplayTitle[];
|
|
144
|
-
/** 4系: PartyReference参照のContributor */
|
|
145
149
|
contributors?: Contributor[];
|
|
146
150
|
}
|
|
151
|
+
type SoundRecording = SoundRecording38 | SoundRecording4;
|
|
147
152
|
interface SoundRecordingId {
|
|
148
153
|
isrc?: string;
|
|
149
154
|
catalogNumber?: string;
|
|
@@ -157,6 +162,7 @@ interface TechnicalSoundRecordingDetails {
|
|
|
157
162
|
audioCodecType?: string;
|
|
158
163
|
bitRate?: number;
|
|
159
164
|
bitRateUnit?: string;
|
|
165
|
+
bitsPerSample?: number;
|
|
160
166
|
numberOfChannels?: number;
|
|
161
167
|
samplingRate?: number;
|
|
162
168
|
samplingRateUnit?: string;
|
|
@@ -179,28 +185,30 @@ interface SoundRecordingDetailsByTerritory {
|
|
|
179
185
|
}
|
|
180
186
|
//#endregion
|
|
181
187
|
//#region src/types/release.d.ts
|
|
182
|
-
interface
|
|
188
|
+
interface ReleaseBase {
|
|
183
189
|
releaseReference: string;
|
|
184
190
|
releaseType?: string;
|
|
185
191
|
releaseId?: ReleaseId;
|
|
186
|
-
referenceTitle?: ReferenceTitle;
|
|
187
192
|
displayArtists: DisplayArtist[];
|
|
188
193
|
releaseResourceReferences?: ReleaseResourceReference[];
|
|
189
|
-
resourceGroup?: ResourceGroup;
|
|
190
194
|
duration?: string;
|
|
191
195
|
pLine?: PLine;
|
|
192
196
|
cLine?: CLine;
|
|
193
|
-
|
|
197
|
+
}
|
|
198
|
+
interface Release38 extends ReleaseBase {
|
|
199
|
+
referenceTitle?: ReferenceTitle;
|
|
194
200
|
detailsByTerritory?: ReleaseDetailsByTerritory[];
|
|
195
|
-
|
|
201
|
+
resourceGroup?: ResourceGroup;
|
|
202
|
+
}
|
|
203
|
+
interface Release4 extends ReleaseBase {
|
|
196
204
|
displayTitleText?: string;
|
|
197
|
-
/** 4系: 複数のDisplayTitle(territory+lang属性) */
|
|
198
205
|
displayTitles?: DisplayTitle[];
|
|
199
|
-
/** 4系: ReleaseLabelReference(PartyRef値) */
|
|
200
206
|
releaseLabelReferences?: string[];
|
|
201
207
|
genre?: Genre;
|
|
202
208
|
parentalWarningType?: string;
|
|
209
|
+
resourceGroup?: ResourceGroup;
|
|
203
210
|
}
|
|
211
|
+
type Release = Release38 | Release4;
|
|
204
212
|
interface ReferenceTitle {
|
|
205
213
|
titleText: string;
|
|
206
214
|
subTitle?: string;
|
|
@@ -211,6 +219,7 @@ interface ReleaseId {
|
|
|
211
219
|
isrc?: string;
|
|
212
220
|
gridOrIcpn?: string;
|
|
213
221
|
catalogNumber?: string;
|
|
222
|
+
catalogNumberNamespace?: string;
|
|
214
223
|
proprietaryId?: string;
|
|
215
224
|
}
|
|
216
225
|
interface ReleaseResourceReference {
|
|
@@ -234,9 +243,7 @@ interface TrackRelease {
|
|
|
234
243
|
referenceTitle?: ReferenceTitle;
|
|
235
244
|
displayArtists?: DisplayArtist[];
|
|
236
245
|
releaseResourceReference: string;
|
|
237
|
-
/** 4系: 複数のDisplayTitle */
|
|
238
246
|
displayTitles?: DisplayTitle[];
|
|
239
|
-
/** 4系: ReleaseLabelReference */
|
|
240
247
|
releaseLabelReferences?: string[];
|
|
241
248
|
genre?: Genre;
|
|
242
249
|
}
|
|
@@ -289,7 +296,9 @@ interface PriceInformation {
|
|
|
289
296
|
/**
|
|
290
297
|
* パッチレベルまでのバージョン(namespace URIから検出)
|
|
291
298
|
*/
|
|
292
|
-
type
|
|
299
|
+
type ErnVersion38 = '3.8' | '3.8.1' | '3.8.2' | '3.8.3';
|
|
300
|
+
type ErnVersion4 = '4.1' | '4.1.1' | '4.2' | '4.3' | '4.3.1' | '4.3.2';
|
|
301
|
+
type ErnVersion = ErnVersion38 | ErnVersion4;
|
|
293
302
|
/**
|
|
294
303
|
* 変換ロジックの分岐用(メジャー系統のみ)
|
|
295
304
|
*/
|
|
@@ -308,19 +317,27 @@ interface MessageHeader {
|
|
|
308
317
|
messageRecipient: MessageParty;
|
|
309
318
|
messageCreatedDateTime: string;
|
|
310
319
|
}
|
|
311
|
-
interface
|
|
312
|
-
ernVersion: ErnVersion;
|
|
320
|
+
interface DdexMessageBase {
|
|
313
321
|
messageHeader: MessageHeader;
|
|
314
322
|
updateIndicator?: string;
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
323
|
+
}
|
|
324
|
+
interface DdexMessage38 extends DdexMessageBase {
|
|
325
|
+
ernVersion: ErnVersion38;
|
|
326
|
+
resourceList: SoundRecording38[];
|
|
327
|
+
imageList?: Image38[];
|
|
328
|
+
releaseList: Release38[];
|
|
329
|
+
dealList: ReleaseDeal[];
|
|
330
|
+
}
|
|
331
|
+
interface DdexMessage4 extends DdexMessageBase {
|
|
332
|
+
ernVersion: ErnVersion4;
|
|
333
|
+
resourceList: SoundRecording4[];
|
|
334
|
+
imageList?: Image4[];
|
|
335
|
+
releaseList: Release4[];
|
|
318
336
|
dealList: ReleaseDeal[];
|
|
319
|
-
/** 4系のみ: PartyList(ラウンドトリップ用に保持) */
|
|
320
337
|
partyList?: Party[];
|
|
321
|
-
/** 4系のみ: TrackRelease */
|
|
322
338
|
trackReleaseList?: TrackRelease[];
|
|
323
339
|
}
|
|
340
|
+
type DdexMessage = DdexMessage38 | DdexMessage4;
|
|
324
341
|
//#endregion
|
|
325
342
|
//#region src/converter/xml-to-json/index.d.ts
|
|
326
343
|
/**
|
|
@@ -346,4 +363,4 @@ declare function jsonToXml(message: DdexMessage, version?: ErnVersion): string;
|
|
|
346
363
|
*/
|
|
347
364
|
declare function detectVersion(xml: string): ErnVersion;
|
|
348
365
|
//#endregion
|
|
349
|
-
export { type Artist, type ArtistRole, type CLine, type Contributor, type DdexMessage, type Deal, type DealTerms, type DisplayArtist, type DisplayTitle, type ErnMajorVersion, type ErnVersion, type FileDetails, type Genre, type HashSum, type Image, type ImageDetailsByTerritory, type ImageId, type IndirectResourceContributor, type MessageHeader, type MessageParty, type PLine, type Party, type Release, type ReleaseDeal, type ReleaseResourceReference, type ResourceContributor, type ResourceGroup, type SoundRecording, type TechnicalImageDetails, type TechnicalSoundRecordingDetails, type TextWithAttribute, type Title, type TrackRelease, type Usage, detectVersion, jsonToXml, xmlToJson };
|
|
366
|
+
export { type Artist, type ArtistRole, type CLine, type Contributor, type DdexMessage, type DdexMessage38, type DdexMessage4, type DdexMessageBase, type Deal, type DealTerms, type DisplayArtist, type DisplayTitle, type ErnMajorVersion, type ErnVersion, type ErnVersion38, type ErnVersion4, type FileDetails, type Genre, type HashSum, type Image, type Image38, type Image4, type ImageBase, type ImageDetailsByTerritory, type ImageId, type IndirectResourceContributor, type MessageHeader, type MessageParty, type PLine, type Party, type PartyName, type Release, type Release38, type Release4, type ReleaseBase, type ReleaseDeal, type ReleaseDetailsByTerritory, type ReleaseId, type ReleaseResourceReference, type ResourceContributor, type ResourceGroup, type SoundRecording, type SoundRecording38, type SoundRecording4, type SoundRecordingBase, type SoundRecordingDetailsByTerritory, type TechnicalImageDetails, type TechnicalSoundRecordingDetails, type TextWithAttribute, type Title, type TrackRelease, type Usage, detectVersion, jsonToXml, xmlToJson };
|
package/dist/index.mjs
CHANGED
|
@@ -230,6 +230,7 @@ var Ern38Converter = class {
|
|
|
230
230
|
audioCodecType: raw.AudioCodecType ?? void 0,
|
|
231
231
|
bitRate: bitRate ? Number(typeof bitRate === "string" ? bitRate : bitRate["#text"]) : void 0,
|
|
232
232
|
bitRateUnit: typeof bitRate === "object" ? bitRate["@_UnitOfMeasure"] ?? void 0 : void 0,
|
|
233
|
+
bitsPerSample: raw.BitsPerSample ? Number(raw.BitsPerSample) : void 0,
|
|
233
234
|
numberOfChannels: raw.NumberOfChannels ? Number(raw.NumberOfChannels) : void 0,
|
|
234
235
|
samplingRate: samplingRate ? Number(typeof samplingRate === "string" ? samplingRate : samplingRate["#text"]) : void 0,
|
|
235
236
|
samplingRateUnit: typeof samplingRate === "object" ? samplingRate["@_UnitOfMeasure"] ?? void 0 : void 0,
|
|
@@ -316,10 +317,19 @@ var Ern38Converter = class {
|
|
|
316
317
|
icpn: typeof icpnRaw === "string" ? icpnRaw : icpnRaw["#text"],
|
|
317
318
|
isEan: typeof icpnRaw === "object" && icpnRaw["@_IsEan"] === "true" ? true : void 0
|
|
318
319
|
};
|
|
320
|
+
const catalogNumberRaw = raw.CatalogNumber;
|
|
321
|
+
let catalogNumber;
|
|
322
|
+
let catalogNumberNamespace;
|
|
323
|
+
if (catalogNumberRaw) if (typeof catalogNumberRaw === "string") catalogNumber = catalogNumberRaw;
|
|
324
|
+
else {
|
|
325
|
+
catalogNumber = catalogNumberRaw["#text"] ?? void 0;
|
|
326
|
+
catalogNumberNamespace = catalogNumberRaw["@_Namespace"] ?? void 0;
|
|
327
|
+
}
|
|
319
328
|
return {
|
|
320
329
|
isrc: raw.ISRC ?? void 0,
|
|
321
330
|
gridOrIcpn: raw.GRid ?? void 0,
|
|
322
|
-
catalogNumber
|
|
331
|
+
catalogNumber,
|
|
332
|
+
catalogNumberNamespace
|
|
323
333
|
};
|
|
324
334
|
}
|
|
325
335
|
parseReleaseResourceReferences(raw) {
|
|
@@ -455,6 +465,7 @@ var Ern38Converter = class {
|
|
|
455
465
|
name: c.PartyName?.FullName ?? "",
|
|
456
466
|
role,
|
|
457
467
|
sequenceNumber: c["@_SequenceNumber"] ? Number(c["@_SequenceNumber"]) : void 0,
|
|
468
|
+
instrumentType: c.InstrumentType ?? void 0,
|
|
458
469
|
roleNamespace,
|
|
459
470
|
roleUserDefinedValue
|
|
460
471
|
};
|
|
@@ -510,6 +521,7 @@ var Ern4Converter = class {
|
|
|
510
521
|
return {
|
|
511
522
|
ernVersion: version,
|
|
512
523
|
messageHeader: this.parseMessageHeader(root.MessageHeader),
|
|
524
|
+
updateIndicator: root["@_UpdateIndicator"] ?? void 0,
|
|
513
525
|
resourceList: this.parseSoundRecordings(root.ResourceList),
|
|
514
526
|
imageList: this.parseImages(root.ResourceList),
|
|
515
527
|
releaseList: this.parseReleases(root.ReleaseList),
|
|
@@ -694,10 +706,19 @@ var Ern4Converter = class {
|
|
|
694
706
|
const propId = raw.ProprietaryId;
|
|
695
707
|
let proprietaryId;
|
|
696
708
|
if (propId) proprietaryId = typeof propId === "string" ? propId : propId["#text"];
|
|
709
|
+
const catalogNumberRaw = raw.CatalogNumber;
|
|
710
|
+
let catalogNumber;
|
|
711
|
+
let catalogNumberNamespace;
|
|
712
|
+
if (catalogNumberRaw) if (typeof catalogNumberRaw === "string") catalogNumber = catalogNumberRaw;
|
|
713
|
+
else {
|
|
714
|
+
catalogNumber = catalogNumberRaw["#text"] ?? void 0;
|
|
715
|
+
catalogNumberNamespace = catalogNumberRaw["@_Namespace"] ?? void 0;
|
|
716
|
+
}
|
|
697
717
|
return {
|
|
698
718
|
isrc: raw.ISRC ?? void 0,
|
|
699
719
|
gridOrIcpn: raw.GRid ?? void 0,
|
|
700
|
-
catalogNumber
|
|
720
|
+
catalogNumber,
|
|
721
|
+
catalogNumberNamespace,
|
|
701
722
|
proprietaryId
|
|
702
723
|
};
|
|
703
724
|
}
|
|
@@ -874,6 +895,7 @@ var Ern4Converter = class {
|
|
|
874
895
|
//#region src/converter/json-to-xml/ern38-builder.ts
|
|
875
896
|
var Ern38Builder = class {
|
|
876
897
|
build(message, version) {
|
|
898
|
+
const msg = message;
|
|
877
899
|
const nsUri = VERSION_NAMESPACE_MAP.get(version);
|
|
878
900
|
if (!nsUri) throw new Error(`Unknown version: ${version}`);
|
|
879
901
|
const nsPath = new URL(nsUri).pathname.replace(/^\/xml\//, "");
|
|
@@ -882,11 +904,11 @@ var Ern38Builder = class {
|
|
|
882
904
|
"@_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
|
|
883
905
|
"@_MessageSchemaVersionId": nsPath,
|
|
884
906
|
"@_xsi:schemaLocation": `${nsUri} ${nsUri}/release-notification.xsd`,
|
|
885
|
-
MessageHeader: this.buildMessageHeader(
|
|
886
|
-
...
|
|
887
|
-
ResourceList: this.buildResourceList(
|
|
888
|
-
ReleaseList: this.buildReleaseList(
|
|
889
|
-
DealList: this.buildDealList(
|
|
907
|
+
MessageHeader: this.buildMessageHeader(msg.messageHeader),
|
|
908
|
+
...msg.updateIndicator ? { UpdateIndicator: msg.updateIndicator } : {},
|
|
909
|
+
ResourceList: this.buildResourceList(msg.resourceList, msg.imageList),
|
|
910
|
+
ReleaseList: this.buildReleaseList(msg.releaseList),
|
|
911
|
+
DealList: this.buildDealList(msg.dealList)
|
|
890
912
|
} };
|
|
891
913
|
return `<?xml version="1.0" encoding="UTF-8"?>\n${new XMLBuilder(BUILDER_OPTIONS).build(root)}`.trimEnd();
|
|
892
914
|
}
|
|
@@ -960,6 +982,7 @@ var Ern38Builder = class {
|
|
|
960
982
|
"#text": String(td.bitRate),
|
|
961
983
|
"@_UnitOfMeasure": td.bitRateUnit
|
|
962
984
|
} : String(td.bitRate);
|
|
985
|
+
if (td.bitsPerSample != null) result.BitsPerSample = String(td.bitsPerSample);
|
|
963
986
|
if (td.numberOfChannels != null) result.NumberOfChannels = String(td.numberOfChannels);
|
|
964
987
|
if (td.samplingRate != null) result.SamplingRate = td.samplingRateUnit ? {
|
|
965
988
|
"#text": String(td.samplingRate),
|
|
@@ -1044,7 +1067,10 @@ var Ern38Builder = class {
|
|
|
1044
1067
|
const result = {};
|
|
1045
1068
|
if (id.isrc) result.ISRC = id.isrc;
|
|
1046
1069
|
if (id.gridOrIcpn) result.GRid = id.gridOrIcpn;
|
|
1047
|
-
if (id.catalogNumber) result.CatalogNumber = id.
|
|
1070
|
+
if (id.catalogNumber) result.CatalogNumber = id.catalogNumberNamespace ? {
|
|
1071
|
+
"#text": id.catalogNumber,
|
|
1072
|
+
"@_Namespace": id.catalogNumberNamespace
|
|
1073
|
+
} : id.catalogNumber;
|
|
1048
1074
|
return result;
|
|
1049
1075
|
}
|
|
1050
1076
|
buildReleaseResourceReference(ref) {
|
|
@@ -1139,6 +1165,7 @@ var Ern38Builder = class {
|
|
|
1139
1165
|
"@_UserDefinedValue": c.roleUserDefinedValue
|
|
1140
1166
|
};
|
|
1141
1167
|
else result.ResourceContributorRole = c.role;
|
|
1168
|
+
if (c.instrumentType) result.InstrumentType = c.instrumentType;
|
|
1142
1169
|
return result;
|
|
1143
1170
|
}
|
|
1144
1171
|
buildIndirectResourceContributor(c) {
|
|
@@ -1178,6 +1205,7 @@ var Ern38Builder = class {
|
|
|
1178
1205
|
//#region src/converter/json-to-xml/ern4-builder.ts
|
|
1179
1206
|
var Ern4Builder = class {
|
|
1180
1207
|
build(message, version) {
|
|
1208
|
+
const msg = message;
|
|
1181
1209
|
const nsUri = VERSION_NAMESPACE_MAP.get(version);
|
|
1182
1210
|
if (!nsUri) throw new Error(`Unknown version: ${version}`);
|
|
1183
1211
|
const root = { "ern:NewReleaseMessage": {
|
|
@@ -1185,11 +1213,12 @@ var Ern4Builder = class {
|
|
|
1185
1213
|
"@_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
|
|
1186
1214
|
"@_xsi:schemaLocation": `${nsUri} ${nsUri}/release-notification.xsd`,
|
|
1187
1215
|
"@_LanguageAndScriptCode": "en",
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1216
|
+
...msg.updateIndicator ? { "@_UpdateIndicator": msg.updateIndicator } : {},
|
|
1217
|
+
MessageHeader: this.buildMessageHeader(msg.messageHeader),
|
|
1218
|
+
PartyList: this.buildPartyList(msg.partyList ?? []),
|
|
1219
|
+
ResourceList: this.buildResourceList(msg.resourceList, msg.imageList, version),
|
|
1220
|
+
ReleaseList: this.buildReleaseList(msg.releaseList, msg.trackReleaseList),
|
|
1221
|
+
DealList: this.buildDealList(msg.dealList)
|
|
1193
1222
|
} };
|
|
1194
1223
|
return `<?xml version="1.0" encoding="UTF-8"?>\n${new XMLBuilder(BUILDER_OPTIONS).build(root)}`.trimEnd();
|
|
1195
1224
|
}
|
|
@@ -1312,7 +1341,10 @@ var Ern4Builder = class {
|
|
|
1312
1341
|
if (id.isrc) result.ISRC = id.isrc;
|
|
1313
1342
|
if (id.gridOrIcpn) result.GRid = id.gridOrIcpn;
|
|
1314
1343
|
if (id.proprietaryId) result.ProprietaryId = id.proprietaryId;
|
|
1315
|
-
if (id.catalogNumber) result.CatalogNumber = id.
|
|
1344
|
+
if (id.catalogNumber) result.CatalogNumber = id.catalogNumberNamespace ? {
|
|
1345
|
+
"#text": id.catalogNumber,
|
|
1346
|
+
"@_Namespace": id.catalogNumberNamespace
|
|
1347
|
+
} : id.catalogNumber;
|
|
1316
1348
|
return result;
|
|
1317
1349
|
}
|
|
1318
1350
|
buildTrackRelease(tr) {
|