@norskvideo/norsk-studio-built-ins 1.14.0 → 1.16.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/README.md +16 -0
- package/client/info.js +725 -456
- package/client/style.css +321 -112
- package/lib/info.js +2 -2
- package/lib/info.js.map +1 -1
- package/lib/input.rtmp/info.js +1 -1
- package/lib/input.rtmp/info.js.map +1 -1
- package/lib/input.silence/info.js +1 -0
- package/lib/input.silence/info.js.map +1 -1
- package/lib/input.srt-caller/info.js +6 -5
- package/lib/input.srt-caller/info.js.map +1 -1
- package/lib/input.srt-caller/runtime.d.ts +1 -1
- package/lib/input.srt-listener/info.js +7 -5
- package/lib/input.srt-listener/info.js.map +1 -1
- package/lib/input.srt-listener/runtime.d.ts +1 -1
- package/lib/input.udp-ts/info.d.ts +1 -1
- package/lib/input.udp-ts/info.js +5 -4
- package/lib/input.udp-ts/info.js.map +1 -1
- package/lib/input.udp-ts/runtime.d.ts +1 -1
- package/lib/input.videoTestCard/info.js +1 -0
- package/lib/input.videoTestCard/info.js.map +1 -1
- package/lib/output.autoCmaf/info.d.ts +1 -1
- package/lib/output.autoCmaf/info.js +54 -1
- package/lib/output.autoCmaf/info.js.map +1 -1
- package/lib/output.autoCmaf/runtime.d.ts +10 -0
- package/lib/output.autoCmaf/runtime.js +35 -4
- package/lib/output.autoCmaf/runtime.js.map +1 -1
- package/lib/output.autoCmaf/summary.js +23 -1
- package/lib/output.autoCmaf/summary.js.map +1 -1
- package/lib/output.preview/info.js +1 -0
- package/lib/output.preview/info.js.map +1 -1
- package/lib/output.preview/runtime.js +8 -4
- package/lib/output.preview/runtime.js.map +1 -1
- package/lib/output.rtmp/info.js +1 -0
- package/lib/output.rtmp/info.js.map +1 -1
- package/lib/output.srt/info.js +6 -5
- package/lib/output.srt/info.js.map +1 -1
- package/lib/output.srt/runtime.d.ts +1 -1
- package/lib/output.statistics/info.js +1 -0
- package/lib/output.statistics/info.js.map +1 -1
- package/lib/output.udpTs/info.d.ts +1 -1
- package/lib/output.udpTs/info.js +4 -3
- package/lib/output.udpTs/info.js.map +1 -1
- package/lib/output.udpTs/runtime.d.ts +1 -1
- package/lib/output.whep/info.js +1 -0
- package/lib/output.whep/info.js.map +1 -1
- package/lib/processor.browserOverlay/info.d.ts +2 -2
- package/lib/processor.browserOverlay/info.js +55 -1
- package/lib/processor.browserOverlay/info.js.map +1 -1
- package/lib/processor.browserOverlay/inline-view.d.ts +6 -0
- package/lib/processor.browserOverlay/inline-view.js +8 -0
- package/lib/processor.browserOverlay/inline-view.js.map +1 -0
- package/lib/processor.browserOverlay/openApi.d.ts +174 -0
- package/lib/processor.browserOverlay/openApi.js +3 -0
- package/lib/processor.browserOverlay/openApi.js.map +1 -0
- package/lib/processor.browserOverlay/runtime.d.ts +40 -6
- package/lib/processor.browserOverlay/runtime.js +147 -18
- package/lib/processor.browserOverlay/runtime.js.map +1 -1
- package/lib/processor.browserOverlay/summary-view.d.ts +4 -0
- package/lib/processor.browserOverlay/summary-view.js +27 -0
- package/lib/processor.browserOverlay/summary-view.js.map +1 -0
- package/lib/processor.browserOverlay/types.yaml +65 -0
- package/lib/processor.cascadingSwitch/info.js +1 -0
- package/lib/processor.cascadingSwitch/info.js.map +1 -1
- package/lib/processor.fixedLadder/codec-editor.js +1 -1
- package/lib/processor.fixedLadder/codec-editor.js.map +1 -1
- package/lib/processor.fixedLadder/codec-view.js +1 -1
- package/lib/processor.fixedLadder/codec-view.js.map +1 -1
- package/lib/processor.fixedLadder/info.js +1 -0
- package/lib/processor.fixedLadder/info.js.map +1 -1
- package/lib/processor.fixedLadder/rung-view.js +1 -1
- package/lib/processor.fixedLadder/rung-view.js.map +1 -1
- package/lib/processor.onscreenGraphic/image-selection.d.ts +9 -0
- package/lib/{processor.dynamicBug/bug-selection.js → processor.onscreenGraphic/image-selection.js} +10 -10
- package/lib/processor.onscreenGraphic/image-selection.js.map +1 -0
- package/lib/processor.onscreenGraphic/info.d.ts +3 -0
- package/lib/{processor.dynamicBug → processor.onscreenGraphic}/info.js +12 -12
- package/lib/processor.onscreenGraphic/info.js.map +1 -0
- package/lib/processor.onscreenGraphic/runtime.d.ts +67 -0
- package/lib/{processor.dynamicBug → processor.onscreenGraphic}/runtime.js +109 -161
- package/lib/processor.onscreenGraphic/runtime.js.map +1 -0
- package/lib/processor.onscreenGraphic/summary-view.d.ts +4 -0
- package/lib/processor.onscreenGraphic/summary-view.js +128 -0
- package/lib/processor.onscreenGraphic/summary-view.js.map +1 -0
- package/lib/processor.onscreenGraphic/types.d.ts +257 -0
- package/lib/processor.onscreenGraphic/types.js.map +1 -0
- package/lib/processor.onscreenGraphic/types.yaml +162 -0
- package/lib/processor.whisper-transcribe/info.js +3 -2
- package/lib/processor.whisper-transcribe/info.js.map +1 -1
- package/lib/shared/drm/axinom.d.ts +2 -0
- package/lib/shared/drm/axinom.js +120 -0
- package/lib/shared/drm/axinom.js.map +1 -0
- package/lib/shared/drm/cpix.d.ts +24 -0
- package/lib/shared/drm/cpix.js +97 -0
- package/lib/shared/drm/cpix.js.map +1 -0
- package/lib/shared/drm/ezdrm.d.ts +2 -0
- package/lib/shared/drm/ezdrm.js +26 -0
- package/lib/shared/drm/ezdrm.js.map +1 -0
- package/lib/shared/srt-socket-options.js +6 -6
- package/lib/shared/srt-socket-options.js.map +1 -1
- package/lib/test/{dynamic-bug.js → onscreen-graphic.js} +79 -79
- package/lib/test/onscreen-graphic.js.map +1 -0
- package/lib/test/srt-input-caller.js +5 -5
- package/lib/test/srt-input-caller.js.map +1 -1
- package/lib/test/srt-input-listener.js +18 -18
- package/lib/test/srt-input-listener.js.map +1 -1
- package/lib/test/srt-output.js +2 -2
- package/lib/test/srt-output.js.map +1 -1
- package/lib/test/udp-output.js +2 -2
- package/lib/test/udp-output.js.map +1 -1
- package/lib/test/udp-ts-input.js +2 -2
- package/lib/test/udp-ts-input.js.map +1 -1
- package/lib/util.stats.latency/info.js +1 -0
- package/lib/util.stats.latency/info.js.map +1 -1
- package/lib/util.stats.ma35d/info.js +1 -0
- package/lib/util.stats.ma35d/info.js.map +1 -1
- package/lib/util.timestamps/info.js +1 -0
- package/lib/util.timestamps/info.js.map +1 -1
- package/package.json +10 -6
- package/Readme.adoc +0 -16
- package/lib/processor.dynamicBug/bug-selection.d.ts +0 -9
- package/lib/processor.dynamicBug/bug-selection.js.map +0 -1
- package/lib/processor.dynamicBug/info.d.ts +0 -3
- package/lib/processor.dynamicBug/info.js.map +0 -1
- package/lib/processor.dynamicBug/runtime.d.ts +0 -67
- package/lib/processor.dynamicBug/runtime.js.map +0 -1
- package/lib/processor.dynamicBug/summary-view.d.ts +0 -4
- package/lib/processor.dynamicBug/summary-view.js +0 -128
- package/lib/processor.dynamicBug/summary-view.js.map +0 -1
- package/lib/processor.dynamicBug/types.d.ts +0 -19
- package/lib/processor.dynamicBug/types.js.map +0 -1
- package/lib/processor.dynamicBug/types.yaml +0 -25
- package/lib/test/dynamic-bug.js.map +0 -1
- /package/lib/{processor.dynamicBug → processor.onscreenGraphic}/types.js +0 -0
- /package/lib/test/{dynamic-bug.d.ts → onscreen-graphic.d.ts} +0 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.axinomInit = axinomInit;
|
7
|
+
const cpix_1 = require("./cpix");
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
9
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
10
|
+
async function axinomInit(config) {
|
11
|
+
const tenantId = config?.tenantId;
|
12
|
+
const managementKey = config?.managementKey;
|
13
|
+
if (!tenantId) {
|
14
|
+
throw new Error("Missing Tenant ID for Axinom DRM authentication");
|
15
|
+
}
|
16
|
+
if (!managementKey) {
|
17
|
+
throw new Error("Missing Tenant ID for Axinom DRM authentication");
|
18
|
+
}
|
19
|
+
const auth = Buffer.from(`${tenantId}:${managementKey}`, "utf-8").toString("base64");
|
20
|
+
const encryptionKeyIds = { audio: (0, node_crypto_1.randomUUID)(), video: (0, node_crypto_1.randomUUID)() };
|
21
|
+
const endpoint = "https://key-server-management.axprod.net/api/SpekeV2";
|
22
|
+
const request = `
|
23
|
+
<?xml version="1.0"?>
|
24
|
+
<cpix:CPIX contentId="norskStudio" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
|
25
|
+
<cpix:ContentKeyList>
|
26
|
+
<cpix:ContentKey kid="${encryptionKeyIds.audio}" commonEncryptionScheme="cbcs"/>
|
27
|
+
<cpix:ContentKey kid="${encryptionKeyIds.video}" commonEncryptionScheme="cbcs"/>
|
28
|
+
</cpix:ContentKeyList>
|
29
|
+
<cpix:DRMSystemList>
|
30
|
+
<cpix:DRMSystem kid="${encryptionKeyIds.audio}" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
|
31
|
+
<cpix:HLSSignalingData playlist="media"/>
|
32
|
+
<cpix:HLSSignalingData playlist="master"/>
|
33
|
+
</cpix:DRMSystem>
|
34
|
+
<cpix:DRMSystem kid="${encryptionKeyIds.audio}" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
|
35
|
+
<cpix:PSSH/>
|
36
|
+
<cpix:ContentProtectionData/>
|
37
|
+
<cpix:HLSSignalingData playlist="media"/>
|
38
|
+
<cpix:HLSSignalingData playlist="master"/>
|
39
|
+
<cpix:SmoothStreamingProtectionHeaderData/>
|
40
|
+
</cpix:DRMSystem>
|
41
|
+
<cpix:DRMSystem kid="${encryptionKeyIds.audio}" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
42
|
+
<cpix:PSSH/>
|
43
|
+
<cpix:ContentProtectionData/>
|
44
|
+
<cpix:HLSSignalingData playlist="media"/>
|
45
|
+
<cpix:HLSSignalingData playlist="master"/>
|
46
|
+
</cpix:DRMSystem>
|
47
|
+
<cpix:DRMSystem kid="${encryptionKeyIds.video}" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
|
48
|
+
<cpix:HLSSignalingData playlist="media"/>
|
49
|
+
<cpix:HLSSignalingData playlist="master"/>
|
50
|
+
</cpix:DRMSystem>
|
51
|
+
<cpix:DRMSystem kid="${encryptionKeyIds.video}" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
|
52
|
+
<cpix:PSSH/>
|
53
|
+
<cpix:ContentProtectionData/>
|
54
|
+
<cpix:HLSSignalingData playlist="media"/>
|
55
|
+
<cpix:HLSSignalingData playlist="master"/>
|
56
|
+
<cpix:SmoothStreamingProtectionHeaderData/>
|
57
|
+
</cpix:DRMSystem>
|
58
|
+
<cpix:DRMSystem kid="${encryptionKeyIds.video}" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
59
|
+
<cpix:PSSH/>
|
60
|
+
<cpix:ContentProtectionData/>
|
61
|
+
<cpix:HLSSignalingData playlist="media"/>
|
62
|
+
<cpix:HLSSignalingData playlist="master"/>
|
63
|
+
</cpix:DRMSystem>
|
64
|
+
</cpix:DRMSystemList>
|
65
|
+
<cpix:ContentKeyUsageRuleList>
|
66
|
+
<cpix:ContentKeyUsageRule kid="${encryptionKeyIds.video}" intendedTrackType="VIDEO">
|
67
|
+
<cpix:VideoFilter />
|
68
|
+
</cpix:ContentKeyUsageRule>
|
69
|
+
<cpix:ContentKeyUsageRule kid="${encryptionKeyIds.audio}" intendedTrackType="AUDIO">
|
70
|
+
<cpix:AudioFilter />
|
71
|
+
</cpix:ContentKeyUsageRule>
|
72
|
+
</cpix:ContentKeyUsageRuleList>
|
73
|
+
</cpix:CPIX>
|
74
|
+
`.split('\n').map(line => line.substring(4)).join('\n').trim();
|
75
|
+
const response_inflight = await fetch(endpoint, {
|
76
|
+
method: "POST",
|
77
|
+
withCredentials: true,
|
78
|
+
credentials: "include",
|
79
|
+
headers: {
|
80
|
+
"Content-Type": "application/xml",
|
81
|
+
"Authorization": "Basic " + auth,
|
82
|
+
"X-Speke-Version": "2.0",
|
83
|
+
},
|
84
|
+
body: request,
|
85
|
+
});
|
86
|
+
if (!response_inflight.ok) {
|
87
|
+
throw new Error(response_inflight.status + " " + response_inflight.headers.get("x-axdrm-errormessage") || "unknown error from Axinom API");
|
88
|
+
}
|
89
|
+
const response = await response_inflight.text();
|
90
|
+
return (0, cpix_1.parseCpix)({ cpix: response, encryptionKeyIds, token: mkToken(config, [encryptionKeyIds.audio, encryptionKeyIds.video]) });
|
91
|
+
}
|
92
|
+
function mkToken(config, keys) {
|
93
|
+
const comKey = config?.comKey;
|
94
|
+
const comKeyId = config?.comKeyId;
|
95
|
+
if (!comKey || !comKeyId) {
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
const msg = {
|
99
|
+
"version": 1,
|
100
|
+
"begin_date": "2000-01-01T09:53:22+03:00",
|
101
|
+
"expiration_date": "2025-12-31T23:59:40+03:00",
|
102
|
+
"com_key_id": comKeyId,
|
103
|
+
"message": {
|
104
|
+
"type": "entitlement_message",
|
105
|
+
"version": 2,
|
106
|
+
"license": {
|
107
|
+
"duration": 3600
|
108
|
+
},
|
109
|
+
"content_keys_source": {
|
110
|
+
"inline": keys.map(id => ({ id }))
|
111
|
+
}
|
112
|
+
}
|
113
|
+
};
|
114
|
+
const communicationKey = Buffer.from(comKey, "base64");
|
115
|
+
return jsonwebtoken_1.default.sign(msg, communicationKey, {
|
116
|
+
"algorithm": "HS256",
|
117
|
+
"noTimestamp": true
|
118
|
+
});
|
119
|
+
}
|
120
|
+
//# sourceMappingURL=axinom.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"axinom.js","sourceRoot":"","sources":["../../../src/shared/drm/axinom.ts"],"names":[],"mappings":";;;;;AAKA,gCAqFC;AAzFD,iCAAmC;AACnC,6CAAyC;AACzC,gEAA+B;AAExB,KAAK,UAAU,UAAU,CAAC,MAAgC;IAC/D,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;IAClC,MAAM,aAAa,GAAG,MAAM,EAAE,aAAa,CAAC;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErF,MAAM,gBAAgB,GAAG,EAAE,KAAK,EAAE,IAAA,wBAAU,GAAE,EAAE,KAAK,EAAE,IAAA,wBAAU,GAAE,EAAE,CAAC;IAEtE,MAAM,QAAQ,GAAG,sDAAsD,CAAC;IAGxE,MAAM,OAAO,GAAG;;;;gCAIc,gBAAgB,CAAC,KAAK;gCACtB,gBAAgB,CAAC,KAAK;;;+BAGvB,gBAAgB,CAAC,KAAK;;;;+BAItB,gBAAgB,CAAC,KAAK;;;;;;;+BAOtB,gBAAgB,CAAC,KAAK;;;;;;+BAMtB,gBAAgB,CAAC,KAAK;;;;+BAItB,gBAAgB,CAAC,KAAK;;;;;;;+BAOtB,gBAAgB,CAAC,KAAK;;;;;;;;yCAQZ,gBAAgB,CAAC,KAAK;;;yCAGtB,gBAAgB,CAAC,KAAK;;;;;GAK5D,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE;YACP,cAAc,EAAE,iBAAiB;YACjC,eAAe,EAAE,QAAQ,GAAG,IAAI;YAChC,iBAAiB,EAAE,KAAK;SACzB;QACD,IAAI,EAAE,OAAO;KACC,CAAC,CAAC;IAClB,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,+BAA+B,CAAC,CAAC;IAC7I,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,IAAA,gBAAS,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAE,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC,CAAC;AACrI,CAAC;AAED,SAAS,OAAO,CAAC,MAAgC,EAAE,IAAc;IAC/D,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC;IAC9B,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;IAClC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAGD,MAAM,GAAG,GAAG;QACV,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,2BAA2B;QACzC,iBAAiB,EAAE,2BAA2B;QAC9C,YAAY,EAAE,QAAQ;QACtB,SAAS,EAAE;YACT,MAAM,EAAE,qBAAqB;YAC7B,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE;gBACT,UAAU,EAAE,IAAI;aACjB;YACD,qBAAqB,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;aACnC;SACF;KACF,CAAC;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,sBAAG,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE;QACrC,WAAW,EAAE,OAAO;QACpB,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;AACL,CAAC"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
type KeyResponse = {
|
2
|
+
encryptionKeyId: string;
|
3
|
+
encryptionKey: string;
|
4
|
+
encryptionPssh: string;
|
5
|
+
mediaSignaling: string;
|
6
|
+
multivariantSignaling: string;
|
7
|
+
dashSignalling: string;
|
8
|
+
};
|
9
|
+
export type CryptoDetails = {
|
10
|
+
audio: KeyResponse;
|
11
|
+
video: KeyResponse;
|
12
|
+
token?: string;
|
13
|
+
};
|
14
|
+
export type AVKeyIds = {
|
15
|
+
audio: string;
|
16
|
+
video: string;
|
17
|
+
};
|
18
|
+
export type CpixResponse = {
|
19
|
+
cpix: string;
|
20
|
+
encryptionKeyIds: AVKeyIds;
|
21
|
+
token?: string;
|
22
|
+
};
|
23
|
+
export declare function parseCpix(resp: CpixResponse): CryptoDetails;
|
24
|
+
export {};
|
@@ -0,0 +1,97 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.parseCpix = parseCpix;
|
4
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
5
|
+
function parseCpix(resp) {
|
6
|
+
const parsed = new fast_xml_parser_1.XMLParser({ ignoreDeclaration: true, ignorePiTags: true, ignoreAttributes: false }).parse(resp.cpix);
|
7
|
+
const cpix = parsed["cpix:CPIX"];
|
8
|
+
const result = {};
|
9
|
+
for (const key of ["audio", "video"]) {
|
10
|
+
const encryptionKeyId = resp.encryptionKeyIds[key];
|
11
|
+
let encryptionKey = "";
|
12
|
+
const ContentKeys = ensureXmlList(cpix["cpix:ContentKeyList"]["cpix:ContentKey"]);
|
13
|
+
for (const ContentKey of ContentKeys) {
|
14
|
+
if (ContentKey["@_kid"] !== encryptionKeyId)
|
15
|
+
continue;
|
16
|
+
const encryptionKeyBase64 = ContentKey["cpix:Data"]["pskc:Secret"]["pskc:PlainValue"];
|
17
|
+
encryptionKey = Buffer.from(encryptionKeyBase64, "base64").toString("hex");
|
18
|
+
}
|
19
|
+
if (!encryptionKey)
|
20
|
+
throw new Error(`Could not find encryption key ${encryptionKeyId} in response`);
|
21
|
+
const encryptionPsshs = [];
|
22
|
+
const mediaSignalings = [];
|
23
|
+
const multivariantSignalings = [];
|
24
|
+
let contentProtection = "";
|
25
|
+
contentProtection +=
|
26
|
+
`<ContentProtection xmlns:cenc="urn:mpeg:cenc:2013" cenc:default_KID="${encryptionKeyId}"
|
27
|
+
schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" />`;
|
28
|
+
const DRMSystems = ensureXmlList(cpix["cpix:DRMSystemList"]["cpix:DRMSystem"]);
|
29
|
+
for (const DRMSystem of DRMSystems) {
|
30
|
+
if (DRMSystem["@_kid"] !== encryptionKeyId)
|
31
|
+
continue;
|
32
|
+
const playlist = (name) => {
|
33
|
+
for (const signaling of ensureXmlList(DRMSystem["cpix:HLSSignalingData"])) {
|
34
|
+
if (typeof signaling === "string" && name === "media")
|
35
|
+
return signaling;
|
36
|
+
if (signaling["@_playlist"] === name)
|
37
|
+
return ensureXmlText(signaling);
|
38
|
+
}
|
39
|
+
return "";
|
40
|
+
};
|
41
|
+
encryptionPsshs.push(DRMSystem["cpix:PSSH"] || "");
|
42
|
+
mediaSignalings.push(playlist("media"));
|
43
|
+
multivariantSignalings.push(playlist("master"));
|
44
|
+
const systemId = DRMSystem["@_systemId"];
|
45
|
+
if (typeof systemId === "string") {
|
46
|
+
const contentProtectionData = ensureXmlText(DRMSystem["cpix:ContentProtectionData"]);
|
47
|
+
contentProtection += `
|
48
|
+
<ContentProtection xmlns:cenc="urn:mpeg:cenc:2013" cenc:default_KID="${encryptionKeyId}"
|
49
|
+
schemeIdUri="urn:uuid:${systemId}">
|
50
|
+
${un64(contentProtectionData)}
|
51
|
+
</ContentProtection>
|
52
|
+
`;
|
53
|
+
}
|
54
|
+
}
|
55
|
+
const encryptionPssh = cat64(encryptionPsshs);
|
56
|
+
const mediaSignaling = mediaSignalings.map(un64).join("\n");
|
57
|
+
const multivariantSignaling = multivariantSignalings.map(un64).join("\n");
|
58
|
+
result[key] = {
|
59
|
+
encryptionKey,
|
60
|
+
encryptionKeyId,
|
61
|
+
encryptionPssh,
|
62
|
+
mediaSignaling,
|
63
|
+
multivariantSignaling,
|
64
|
+
dashSignalling: contentProtection,
|
65
|
+
};
|
66
|
+
}
|
67
|
+
if (!result.audio || !result.video) {
|
68
|
+
throw new Error("Missing audio and/or video encryption data");
|
69
|
+
}
|
70
|
+
return { audio: result.audio, video: result.video, token: resp.token };
|
71
|
+
function ensureXmlList(nodes) {
|
72
|
+
if (Array.isArray(nodes))
|
73
|
+
return nodes;
|
74
|
+
return [nodes];
|
75
|
+
}
|
76
|
+
function ensureXmlText(node) {
|
77
|
+
if (node === undefined || node === null)
|
78
|
+
return "";
|
79
|
+
if (typeof node === "string")
|
80
|
+
return node;
|
81
|
+
if (typeof node === "object" && "#text" in node && typeof node["#text"] === "string")
|
82
|
+
return node["#text"];
|
83
|
+
return "";
|
84
|
+
}
|
85
|
+
function cat64(items, sep) {
|
86
|
+
let buffers = items.map(s => Buffer.from(s, "base64"));
|
87
|
+
if (sep) {
|
88
|
+
const sepb = Buffer.from(sep, "utf-8");
|
89
|
+
buffers = Array.prototype.concat(...buffers.map(b => [sepb, b])).slice(1);
|
90
|
+
}
|
91
|
+
return Buffer.concat(buffers).toString("base64");
|
92
|
+
}
|
93
|
+
function un64(encoded) {
|
94
|
+
return Buffer.from(encoded, "base64").toString("utf-8");
|
95
|
+
}
|
96
|
+
}
|
97
|
+
//# sourceMappingURL=cpix.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cpix.js","sourceRoot":"","sources":["../../../src/shared/drm/cpix.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ezdrmInit = ezdrmInit;
|
4
|
+
const cpix_1 = require("./cpix");
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
6
|
+
async function ezdrmInit(config) {
|
7
|
+
const token = config?.token;
|
8
|
+
if (!token) {
|
9
|
+
throw new Error("Missing Token for EZDRM authentication");
|
10
|
+
}
|
11
|
+
const encryptionKeyIds = { audio: (0, node_crypto_1.randomUUID)(), video: (0, node_crypto_1.randomUUID)() };
|
12
|
+
const ezdrmEndpoint = "https://cpix.ezdrm.com/KeyGenerator/cpix2.aspx";
|
13
|
+
const params = new URLSearchParams({
|
14
|
+
k: `empty,audio1=${encryptionKeyIds.audio},video1=${encryptionKeyIds.video}`,
|
15
|
+
c: "norskStudio",
|
16
|
+
t: token,
|
17
|
+
}).toString();
|
18
|
+
const url = `${ezdrmEndpoint}?${params}`;
|
19
|
+
const response_inflight = await fetch(url);
|
20
|
+
if (!response_inflight.ok) {
|
21
|
+
throw new Error(response_inflight.status + " " + response_inflight.statusText);
|
22
|
+
}
|
23
|
+
const response = await response_inflight.text();
|
24
|
+
return (0, cpix_1.parseCpix)({ cpix: response, encryptionKeyIds, token: config?.pX });
|
25
|
+
}
|
26
|
+
//# sourceMappingURL=ezdrm.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ezdrm.js","sourceRoot":"","sources":["../../../src/shared/drm/ezdrm.ts"],"names":[],"mappings":";;AAIA,8BAsBC;AAzBD,iCAAmC;AACnC,6CAAyC;AAElC,KAAK,UAAU,SAAS,CAAC,MAA+B;IAC7D,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,gBAAgB,GAAG,EAAE,KAAK,EAAE,IAAA,wBAAU,GAAE,EAAE,KAAK,EAAE,IAAA,wBAAU,GAAE,EAAE,CAAC;IACtE,MAAM,aAAa,GAAG,gDAAgD,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,CAAC,EAAE,gBAAgB,gBAAgB,CAAC,KAAK,WAAW,gBAAgB,CAAC,KAAK,EAAE;QAC5E,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,KAAK;KACT,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEd,MAAM,GAAG,GAAG,GAAG,aAAa,IAAI,MAAM,EAAE,CAAC;IAEzC,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,IAAA,gBAAS,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
@@ -4,31 +4,31 @@ const result = ({ Z }) => ({
|
|
4
4
|
receiveLatency: {
|
5
5
|
help: "The latency value in the receiving direction of the socket (SRTO_RCVLATENCY)",
|
6
6
|
hint: {
|
7
|
-
type: "numeric", validation: Z.optional(Z.number())
|
7
|
+
type: "numeric", optional: true, validation: Z.optional(Z.number())
|
8
8
|
},
|
9
9
|
},
|
10
10
|
peerLatency: {
|
11
11
|
help: "The latency value provided by the sender side as a minimum value for the receiver (SRTO_PEERLATENCY)",
|
12
12
|
hint: {
|
13
|
-
type: "numeric", validation: Z.optional(Z.number())
|
13
|
+
type: "numeric", optional: true, validation: Z.optional(Z.number())
|
14
14
|
}
|
15
15
|
},
|
16
16
|
inputBandwidth: {
|
17
|
-
help: "Input bandwidth (SRTO_INPUTBW
|
17
|
+
help: "Input bandwidth (SRTO_INPUTBW)",
|
18
18
|
hint: {
|
19
|
-
type: "numeric", validation: Z.optional(Z.number())
|
19
|
+
type: "numeric", optional: true, validation: Z.optional(Z.number())
|
20
20
|
}
|
21
21
|
},
|
22
22
|
overheadBandwidth: {
|
23
23
|
help: "Overhead bandwidth (SRTO_OHEADBW)",
|
24
24
|
hint: {
|
25
|
-
type: "numeric", validation: Z.optional(Z.number())
|
25
|
+
type: "numeric", optional: true, validation: Z.optional(Z.number())
|
26
26
|
}
|
27
27
|
},
|
28
28
|
maxBandwidth: {
|
29
29
|
help: "Max bandwidth (SRTO_MAXBW)",
|
30
30
|
hint: {
|
31
|
-
type: "numeric", validation: Z.optional(Z.number())
|
31
|
+
type: "numeric", optional: true, validation: Z.optional(Z.number())
|
32
32
|
}
|
33
33
|
},
|
34
34
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"srt-socket-options.js","sourceRoot":"","sources":["../../src/shared/srt-socket-options.ts"],"names":[],"mappings":";;AAGA,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,EAAc,EAA6B,EAAE,CAAC,CAAC;IAChE,cAAc,EAAE;QACd,IAAI,EAAE,8EAA8E;QACpF,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;
|
1
|
+
{"version":3,"file":"srt-socket-options.js","sourceRoot":"","sources":["../../src/shared/srt-socket-options.ts"],"names":[],"mappings":";;AAGA,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,EAAc,EAA6B,EAAE,CAAC,CAAC;IAChE,cAAc,EAAE;QACd,IAAI,EAAE,8EAA8E;QACpF,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpE;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,sGAAsG;QAC5G,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpE;KACF;IACD,cAAc,EAAE;QACd,IAAI,EAAE,gCAAgC;QACtC,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpE;KACF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,mCAAmC;QACzC,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpE;KACF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpE;KACF;CACF,CACA,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|