n8n-nodes-kinescope 0.1.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/README.md +70 -22
- package/dist/credentials/KinescopeWorkspaceApi.credentials.d.ts +2 -1
- package/dist/credentials/KinescopeWorkspaceApi.credentials.js +45 -5
- package/dist/credentials/KinescopeWorkspaceApi.credentials.js.map +1 -1
- package/dist/nodes/Kinescope/Kinescope.node.d.ts +1 -0
- package/dist/nodes/Kinescope/Kinescope.node.js +7 -1
- package/dist/nodes/Kinescope/Kinescope.node.js.map +1 -1
- package/dist/nodes/Kinescope/methods.d.ts +1 -0
- package/dist/nodes/Kinescope/methods.js +16 -0
- package/dist/nodes/Kinescope/methods.js.map +1 -1
- package/dist/nodes/Kinescope/props.d.ts +2 -0
- package/dist/nodes/Kinescope/props.js +25 -0
- package/dist/nodes/Kinescope/props.js.map +1 -1
- package/dist/nodes/Kinescope/resources/folder.d.ts +2 -0
- package/dist/nodes/Kinescope/resources/folder.js +58 -0
- package/dist/nodes/Kinescope/resources/folder.js.map +1 -0
- package/dist/nodes/Kinescope/resources/project.d.ts +7 -0
- package/dist/nodes/Kinescope/resources/project.js +108 -0
- package/dist/nodes/Kinescope/resources/project.js.map +1 -0
- package/dist/nodes/Kinescope/resources/room.js +3 -2
- package/dist/nodes/Kinescope/resources/room.js.map +1 -1
- package/dist/nodes/Kinescope/resources/signingKey.js +14 -6
- package/dist/nodes/Kinescope/resources/signingKey.js.map +1 -1
- package/dist/nodes/Kinescope/resources/subtitle.d.ts +11 -0
- package/dist/nodes/Kinescope/resources/subtitle.js +380 -0
- package/dist/nodes/Kinescope/resources/subtitle.js.map +1 -0
- package/dist/nodes/Kinescope/resources/video.js +133 -0
- package/dist/nodes/Kinescope/resources/video.js.map +1 -1
- package/dist/shared/jwt.d.ts +3 -1
- package/dist/shared/jwt.js +56 -9
- package/dist/shared/jwt.js.map +1 -1
- package/dist/shared/transport.d.ts +7 -0
- package/dist/shared/transport.js +15 -7
- package/dist/shared/transport.js.map +1 -1
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
# n8n-nodes-kinescope
|
|
2
2
|
|
|
3
3
|
n8n community nodes for [Kinescope](https://kinescope.io), the video hosting platform, and Speak,
|
|
4
|
-
its video meeting tool. An action node with
|
|
4
|
+
its video meeting tool. An action node with 46 operations across 12 resources — Speak rooms and
|
|
5
5
|
signed admin links to them, participants, calls with their recordings and transcripts, restream
|
|
6
|
-
destinations, catalog videos with download,
|
|
7
|
-
|
|
6
|
+
destinations, catalog videos with download, upload by URL, editing and moving, subtitles by speech
|
|
7
|
+
recognition, projects and folders, users, webhooks and signing keys, plus a Custom Request for every
|
|
8
|
+
other route — and a trigger that subscribes itself to Kinescope's webhooks.
|
|
8
9
|
|
|
9
10
|
Written from scratch against the official documentation
|
|
10
11
|
([docs.kinescope.com/api](https://docs.kinescope.com/api/speak/), read on 22.10.2026). No code from
|
|
11
12
|
any other package.
|
|
12
13
|
|
|
13
|
-
**Status: 0.
|
|
14
|
+
**Status: 0.3.0.** Every operation ran against a live Kinescope workspace, the trigger included;
|
|
14
15
|
the two transcript operations ran but never met a transcript. See [What was checked](#what-was-checked). Where Kinescope behaves differently from its
|
|
15
16
|
documentation, this README says so.
|
|
16
17
|
|
|
@@ -47,7 +48,7 @@ node: its *Allowed HTTP Request Domains* setting is pinned to none, so the token
|
|
|
47
48
|
another server by pointing a generic node at it. Use **Custom Request** for a route the other
|
|
48
49
|
operations lack.
|
|
49
50
|
|
|
50
|
-
**
|
|
51
|
+
**Admin Link Signing Key** serves Room → Get Admin Link only and needs nothing by default; see
|
|
51
52
|
[Admin links](#admin-links).
|
|
52
53
|
|
|
53
54
|
## Kinescope node
|
|
@@ -58,7 +59,10 @@ operations lack.
|
|
|
58
59
|
| Participant | Add, Get, Get Many, Update, Remove |
|
|
59
60
|
| Call | Get, Get Many, Get Recordings, Get Transcript, Download Transcript |
|
|
60
61
|
| Restream Destination | Get Many, Update |
|
|
61
|
-
| Video | Get, Get Many, Download, Delete |
|
|
62
|
+
| Video | Get, Get Many, Download, Update, Move, Upload From URL, Delete |
|
|
63
|
+
| Subtitle | Generate, Get, Get Many, Download, Upload, Update, Delete |
|
|
64
|
+
| Project | Create, Get, Get Many |
|
|
65
|
+
| Folder | Create, Get Many |
|
|
62
66
|
| User | Get Many |
|
|
63
67
|
| Webhook | Create, Get Many, Update, Delete |
|
|
64
68
|
| Signing Key | Register, Get Many, Delete |
|
|
@@ -81,17 +85,27 @@ It is the token of Kinescope's
|
|
|
81
85
|
[Speak login link](https://docs.kinescope.com/developer-guides/speak-admin-login-link/) — RS256,
|
|
82
86
|
`aud: speak`, the room code, `role: admin` — signed in n8n with a private key Kinescope never sees.
|
|
83
87
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
4. **Room → Get Admin Link** with Valid For in minutes; keep it close to the meeting's length.
|
|
88
|
+
**There is nothing to set up.** With Admin Link Signing Key on *Generated by n8n*, the default, n8n
|
|
89
|
+
makes an RSA key on the first request with the credential and keeps it in the credential, encrypted
|
|
90
|
+
and blanked out in the editor. The first admin link registers its public half with Kinescope, valid
|
|
91
|
+
for 100 years, under an ID taken from the key itself (`n8n-` and 16 hex digits). On n8n 2.38.5 the
|
|
92
|
+
key stayed the same from one execution to the next and after the credential was saved again from the
|
|
93
|
+
editor.
|
|
91
94
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
+
- A copy of a credential — duplicated, or imported on another n8n — carries the same key. Two
|
|
96
|
+
credentials have two keys, both registered; neither touches the other's.
|
|
97
|
+
- A credential that loses its key, e.g. one created anew, gets a new one with its next request. Links
|
|
98
|
+
signed before keep working: the old public key stays in Kinescope until you delete it.
|
|
99
|
+
- **After a leak, replace the credential first**, then remove the old key with Signing Key → Delete.
|
|
100
|
+
A credential still holding the key registers it again with its next admin link.
|
|
101
|
+
|
|
102
|
+
With *My Own Key* the node signs with a key you paste — from
|
|
103
|
+
`openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048` — under an ID you choose. The first
|
|
104
|
+
link registers it for 100 years; Signing Key → Register sets another expiry if you run it first. A
|
|
105
|
+
PEM pasted into the one-line field loses its line breaks; the node puts them back.
|
|
106
|
+
|
|
107
|
+
Anyone holding an admin link is admin of that room until Valid For runs out — send it to the host,
|
|
108
|
+
not to a channel. Kinescope uses the same keys for stream chat tokens, telling them apart by `aud`.
|
|
95
109
|
|
|
96
110
|
**Participant** is a workspace user given a role in a room ahead of a meeting: Admin or Manager, both
|
|
97
111
|
need a user ID, and a user can be added once. The owner is in the room already. Update changes the
|
|
@@ -123,6 +137,26 @@ For a Speak recording Kinescope lists `file_size` of the video stream alone, whi
|
|
|
123
137
|
audio too and downloads larger. The node passes the figure on as `listedFileSize`
|
|
124
138
|
rather than pretending it is the file's size.
|
|
125
139
|
|
|
140
|
+
**Video → Update** changes the title, description and embedding privacy; **Move** puts a video into
|
|
141
|
+
another project or folder, its ID and links unchanged. **Upload From URL** has Kinescope fetch a file
|
|
142
|
+
from a direct link or a YouTube address and returns at once with status `uploading`. Upload headers
|
|
143
|
+
carry Latin-1 only, so the node percent-encodes the title, description and file name, and Kinescope
|
|
144
|
+
decodes them: a title with Cyrillic, guillemets, `&` and `%` arrived intact. Uploading a file from
|
|
145
|
+
n8n itself is not here yet.
|
|
146
|
+
|
|
147
|
+
**Subtitle → Generate** has Kinescope recognise the speech of a video, one track per language code.
|
|
148
|
+
Kinescope answers at once with the tracks `pending`; with Wait for Recognition on, the node polls
|
|
149
|
+
every ten seconds until they are `done`. A 16-second clip of Russian speech was done within the
|
|
150
|
+
first poll and came back word for word, without punctuation and without speaker names. **Download**
|
|
151
|
+
gives the cues as items with start and end in seconds, the text, or a VTT or SRT file. **Upload**
|
|
152
|
+
attaches a VTT or SRT file from binary data. Kinescope rejects an audio-only file as a video, so the
|
|
153
|
+
check used a video with sound. What recognition costs is not in Kinescope's API reference; see your
|
|
154
|
+
plan.
|
|
155
|
+
|
|
156
|
+
**Project** and **Folder** list and create the places videos live in; Move and Upload From URL pick
|
|
157
|
+
them from dropdowns. Kinescope returns a project's privacy domains as record IDs, not as the domain
|
|
158
|
+
names sent.
|
|
159
|
+
|
|
126
160
|
**Webhook.** Kinescope returns the Basic Auth password of a webhook in plain text, though its
|
|
127
161
|
reference shows it redacted; Get Many leaves it out unless Include Password is on. Kinescope's update
|
|
128
162
|
replaces the whole webhook and refuses an empty endpoint or event list, so Update reads the current
|
|
@@ -180,6 +214,13 @@ into n8n's binary storage either way.
|
|
|
180
214
|
|
|
181
215
|
From the other side — a call ID in hand — **Call → Get Recordings** finds its videos.
|
|
182
216
|
|
|
217
|
+
To keep the recording tidy, **Video → Update** gives it a title after the meeting and **Video → Move**
|
|
218
|
+
takes it out of `Speak Records` into the project or folder it belongs in.
|
|
219
|
+
|
|
220
|
+
For the text of the meeting, **Subtitle → Generate** with Wait for Recognition on and then
|
|
221
|
+
**Subtitle → Download** as Text. It is speech recognition of the recording — one stream of text with
|
|
222
|
+
no speaker names — and works where Speak's own transcript does not appear, see below.
|
|
223
|
+
|
|
183
224
|
A recording a few seconds long and without sound ended in status `error` with no files; a longer one
|
|
184
225
|
with sound went through.
|
|
185
226
|
|
|
@@ -205,14 +246,16 @@ What Kinescope's API gives today:
|
|
|
205
246
|
|
|
206
247
|
## Not here, or not known
|
|
207
248
|
|
|
208
|
-
- **
|
|
209
|
-
transcript: `transcript_id` stayed empty. Like automatic recording it may wait for the owner.
|
|
210
|
-
Transcript and Download Transcript are written to the reference and its example
|
|
211
|
-
(`[MM:SS.T-MM:SS.T] Speaker: Text`) and are untested against a real transcript.
|
|
249
|
+
- **Speak transcripts were not seen.** Automatic Transcription was on in the test room, yet no call
|
|
250
|
+
got a transcript: `transcript_id` stayed empty. Like automatic recording it may wait for the owner.
|
|
251
|
+
Get Transcript and Download Transcript are written to the reference and its example
|
|
252
|
+
(`[MM:SS.T-MM:SS.T] Speaker: Text`) and are untested against a real transcript. Subtitle → Generate
|
|
253
|
+
on the recording gives the text without speakers.
|
|
212
254
|
- Restream destinations cannot be started, stopped, added to an existing room or removed one by one
|
|
213
255
|
through the API; the room interface does that.
|
|
214
|
-
- Live events, playlists, players
|
|
215
|
-
|
|
256
|
+
- Live events, playlists, players and analytics are reachable through Custom Request only. Uploading
|
|
257
|
+
a file from n8n is not: the uploader host takes only Upload From URL here, and Custom Request is
|
|
258
|
+
fixed to `api.kinescope.io`.
|
|
216
259
|
|
|
217
260
|
## What was checked
|
|
218
261
|
|
|
@@ -229,6 +272,11 @@ runtime:
|
|
|
229
272
|
video and an audio track; Video → Delete on the test recordings;
|
|
230
273
|
- the trigger's registration, re-registration and removal against the API, and a real Kinescope
|
|
231
274
|
delivery with its Basic Auth header;
|
|
275
|
+
- Subtitle, Project, Folder and Video → Update, Move and Upload From URL in a test project, its
|
|
276
|
+
videos and folders deleted afterwards: recognition of a Russian speech clip, every download format,
|
|
277
|
+
an SRT uploaded and read back;
|
|
278
|
+
- the generated signing key in n8n 2.38.5 itself: made on the first request, the same key in later
|
|
279
|
+
executions and after the credential was saved again from the editor, blanked out in the editor;
|
|
232
280
|
- the error texts for a malformed ID, a missing call, a refused event, a sort field Kinescope does not
|
|
233
281
|
take, and a file a video does not have.
|
|
234
282
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IAuthenticateGeneric, Icon, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
1
|
+
import type { IAuthenticateGeneric, ICredentialDataDecryptedObject, Icon, ICredentialTestRequest, ICredentialType, IDataObject, IHttpRequestHelper, INodeProperties } from 'n8n-workflow';
|
|
2
2
|
export declare const API_ORIGIN = "https://api.kinescope.io";
|
|
3
3
|
export declare function normalizeApiToken(raw: unknown): string;
|
|
4
4
|
export declare class KinescopeWorkspaceApi implements ICredentialType {
|
|
@@ -7,6 +7,7 @@ export declare class KinescopeWorkspaceApi implements ICredentialType {
|
|
|
7
7
|
documentationUrl: string;
|
|
8
8
|
icon: Icon;
|
|
9
9
|
properties: INodeProperties[];
|
|
10
|
+
preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<IDataObject>;
|
|
10
11
|
authenticate: IAuthenticateGeneric;
|
|
11
12
|
test: ICredentialTestRequest;
|
|
12
13
|
}
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KinescopeWorkspaceApi = exports.API_ORIGIN = void 0;
|
|
4
4
|
exports.normalizeApiToken = normalizeApiToken;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
async function generateSigningKey() {
|
|
7
|
+
return await new Promise((resolve, reject) => {
|
|
8
|
+
(0, node_crypto_1.generateKeyPair)('rsa', {
|
|
9
|
+
modulusLength: 2048,
|
|
10
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
11
|
+
privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
|
|
12
|
+
}, (error, _publicKey, privateKey) => (error ? reject(error) : resolve(privateKey)));
|
|
13
|
+
});
|
|
14
|
+
}
|
|
5
15
|
exports.API_ORIGIN = 'https://api.kinescope.io';
|
|
6
16
|
const TOKEN_EXPRESSION = 'String($credentials.apiToken || "").trim().replace(/^Bearer\\s+/i, "")';
|
|
7
17
|
function normalizeApiToken(raw) {
|
|
@@ -27,10 +37,23 @@ class KinescopeWorkspaceApi {
|
|
|
27
37
|
description: 'A token from Settings → API tokens in Kinescope. It acts for the whole workspace it was issued in; give each integration its own token so one can be revoked without breaking the others.',
|
|
28
38
|
},
|
|
29
39
|
{
|
|
30
|
-
displayName: '
|
|
31
|
-
name: '
|
|
32
|
-
type: '
|
|
33
|
-
default: '',
|
|
40
|
+
displayName: 'Admin Link Signing Key',
|
|
41
|
+
name: 'signingKeySource',
|
|
42
|
+
type: 'options',
|
|
43
|
+
default: 'generated',
|
|
44
|
+
options: [
|
|
45
|
+
{
|
|
46
|
+
name: 'Generated by n8n',
|
|
47
|
+
value: 'generated',
|
|
48
|
+
description: 'n8n makes a key on first use and keeps it, encrypted, in this credential. Nothing to fill in.',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'My Own Key',
|
|
52
|
+
value: 'own',
|
|
53
|
+
description: 'Paste an RSA private key and give it an ID',
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
description: 'The key Room → Get Admin Link signs Speak links with. Kinescope receives its public half the first time a link is made.',
|
|
34
57
|
},
|
|
35
58
|
{
|
|
36
59
|
displayName: 'Signing Private Key',
|
|
@@ -39,7 +62,8 @@ class KinescopeWorkspaceApi {
|
|
|
39
62
|
typeOptions: { password: true },
|
|
40
63
|
default: '',
|
|
41
64
|
placeholder: '-----BEGIN PRIVATE KEY----- …',
|
|
42
|
-
|
|
65
|
+
displayOptions: { show: { signingKeySource: ['own'] } },
|
|
66
|
+
description: 'An RSA private key in PEM form, e.g. from: openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048. It never leaves n8n; Kinescope gets its public half.',
|
|
43
67
|
},
|
|
44
68
|
{
|
|
45
69
|
displayName: 'Signing Key ID',
|
|
@@ -47,8 +71,16 @@ class KinescopeWorkspaceApi {
|
|
|
47
71
|
type: 'string',
|
|
48
72
|
default: '',
|
|
49
73
|
placeholder: 'n8n-2026-10',
|
|
74
|
+
displayOptions: { show: { signingKeySource: ['own'] } },
|
|
50
75
|
description: 'A name for the key, unique in the workspace (Kinescope calls it kid). It goes into every signed link so Kinescope knows which public key to check it with.',
|
|
51
76
|
},
|
|
77
|
+
{
|
|
78
|
+
displayName: 'Generated Private Key',
|
|
79
|
+
name: 'generatedPrivateKey',
|
|
80
|
+
type: 'hidden',
|
|
81
|
+
typeOptions: { expirable: true, password: true },
|
|
82
|
+
default: '',
|
|
83
|
+
},
|
|
52
84
|
{
|
|
53
85
|
displayName: 'Allowed HTTP Request Domains',
|
|
54
86
|
name: 'allowedHttpRequestDomains',
|
|
@@ -89,6 +121,14 @@ class KinescopeWorkspaceApi {
|
|
|
89
121
|
],
|
|
90
122
|
};
|
|
91
123
|
}
|
|
124
|
+
async preAuthentication(credentials) {
|
|
125
|
+
var _a;
|
|
126
|
+
if (String((_a = credentials.generatedPrivateKey) !== null && _a !== void 0 ? _a : '') !== '')
|
|
127
|
+
return {};
|
|
128
|
+
if (credentials.signingKeySource === 'own')
|
|
129
|
+
return {};
|
|
130
|
+
return { generatedPrivateKey: await generateSigningKey() };
|
|
131
|
+
}
|
|
92
132
|
}
|
|
93
133
|
exports.KinescopeWorkspaceApi = KinescopeWorkspaceApi;
|
|
94
134
|
//# sourceMappingURL=KinescopeWorkspaceApi.credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KinescopeWorkspaceApi.credentials.js","sourceRoot":"","sources":["../../credentials/KinescopeWorkspaceApi.credentials.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"KinescopeWorkspaceApi.credentials.js","sourceRoot":"","sources":["../../credentials/KinescopeWorkspaceApi.credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare class Kinescope implements INodeType {
|
|
|
5
5
|
loadOptions: {
|
|
6
6
|
getRooms(this: import("n8n-workflow").ILoadOptionsFunctions): Promise<import("n8n-workflow").INodePropertyOptions[]>;
|
|
7
7
|
getUsers(this: import("n8n-workflow").ILoadOptionsFunctions): Promise<import("n8n-workflow").INodePropertyOptions[]>;
|
|
8
|
+
getFolders(this: import("n8n-workflow").ILoadOptionsFunctions): Promise<import("n8n-workflow").INodePropertyOptions[]>;
|
|
8
9
|
getProjects(this: import("n8n-workflow").ILoadOptionsFunctions): Promise<import("n8n-workflow").INodePropertyOptions[]>;
|
|
9
10
|
};
|
|
10
11
|
};
|
|
@@ -7,10 +7,13 @@ const transport_1 = require("../../shared/transport");
|
|
|
7
7
|
const methods_1 = require("./methods");
|
|
8
8
|
const call_1 = require("./resources/call");
|
|
9
9
|
const customRequest_1 = require("./resources/customRequest");
|
|
10
|
+
const folder_1 = require("./resources/folder");
|
|
10
11
|
const participant_1 = require("./resources/participant");
|
|
12
|
+
const project_1 = require("./resources/project");
|
|
11
13
|
const restream_1 = require("./resources/restream");
|
|
12
14
|
const room_1 = require("./resources/room");
|
|
13
15
|
const signingKey_1 = require("./resources/signingKey");
|
|
16
|
+
const subtitle_1 = require("./resources/subtitle");
|
|
14
17
|
const user_1 = require("./resources/user");
|
|
15
18
|
const video_1 = require("./resources/video");
|
|
16
19
|
const webhook_1 = require("./resources/webhook");
|
|
@@ -20,6 +23,9 @@ const resources = [
|
|
|
20
23
|
call_1.callResource,
|
|
21
24
|
restream_1.restreamResource,
|
|
22
25
|
video_1.videoResource,
|
|
26
|
+
subtitle_1.subtitleResource,
|
|
27
|
+
project_1.projectResource,
|
|
28
|
+
folder_1.folderResource,
|
|
23
29
|
user_1.userResource,
|
|
24
30
|
webhook_1.webhookResource,
|
|
25
31
|
signingKey_1.signingKeyResource,
|
|
@@ -38,7 +44,7 @@ class Kinescope {
|
|
|
38
44
|
defaults: { name: 'Kinescope' },
|
|
39
45
|
usableAsTool: true,
|
|
40
46
|
builderHint: {
|
|
41
|
-
searchHint: 'Kinescope is a video hosting platform; Speak is its video meeting tool. Room → Create needs an owner ID from User → Get Many and returns the link people join by; recording and transcription can start automatically. Each meeting held in a room is a Call: Call → Download Transcript gives phrases with speaker and time, or talk time per speaker, once Get Transcript reports status done. Meeting recordings land in the catalog as videos: Video → Download gets the original file or a signed link for Google Drive, Yandex Disk or S3; duration is in seconds. Automatic recording starts only when the owner joins; Room → Get Admin Link signs a link that lets a host in as admin, after the signing key of the credential is registered once with Signing Key → Register. Who joined a meeting is not in the API, only in Speak webhooks. Custom Request reaches every other route. Tokens are per workspace.',
|
|
47
|
+
searchHint: 'Kinescope is a video hosting platform; Speak is its video meeting tool. Room → Create needs an owner ID from User → Get Many and returns the link people join by; recording and transcription can start automatically. Each meeting held in a room is a Call: Call → Download Transcript gives phrases with speaker and time, or talk time per speaker, once Get Transcript reports status done. Meeting recordings land in the catalog as videos: Video → Download gets the original file or a signed link for Google Drive, Yandex Disk or S3; duration is in seconds. Automatic recording starts only when the owner joins; Room → Get Admin Link signs a link that lets a host in as admin, after the signing key of the credential is registered once with Signing Key → Register. Subtitle → Generate (Wait for Recognition on) then Subtitle → Download as Text gives the text of a recording without speaker names. Video → Update renames a recording, Video → Move files it into a project or folder from Project → Get Many and Folder → Get Many. Who joined a meeting is not in the API, only in Speak webhooks. Custom Request reaches every other route. Tokens are per workspace.',
|
|
42
48
|
relatedNodes: [
|
|
43
49
|
{
|
|
44
50
|
nodeType: 'n8n-nodes-kinescope.kinescopeTrigger',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kinescope.node.js","sourceRoot":"","sources":["../../../nodes/Kinescope/Kinescope.node.ts"],"names":[],"mappings":";;;AAMA,+CAAmD;AAGnD,4CAAsE;AACtE,sDAAoD;AACpD,uCAAwC;AACxC,2CAAgD;AAChD,6DAAkE;AAClE,yDAA8D;AAC9D,mDAAwD;AACxD,2CAAgD;AAChD,uDAA4D;AAC5D,2CAAgD;AAChD,6CAAkD;AAClD,iDAAsD;AAEtD,MAAM,SAAS,GAAe;IAC7B,mBAAY;IACZ,iCAAmB;IACnB,mBAAY;IACZ,2BAAgB;IAChB,qBAAa;IACb,mBAAY;IACZ,yBAAe;IACf,+BAAkB;IAClB,qCAAqB;CACrB,CAAC;AAEF,MAAa,SAAS;IAAtB;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,WAAW;YAEjB,IAAI,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,IAAI,EAAE,qCAAqC,EAAE;YAC9F,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,gEAAgE;YAC1E,WAAW,EACV,yHAAyH;YAC1H,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YAC/B,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE;gBACZ,UAAU,EACT,
|
|
1
|
+
{"version":3,"file":"Kinescope.node.js","sourceRoot":"","sources":["../../../nodes/Kinescope/Kinescope.node.ts"],"names":[],"mappings":";;;AAMA,+CAAmD;AAGnD,4CAAsE;AACtE,sDAAoD;AACpD,uCAAwC;AACxC,2CAAgD;AAChD,6DAAkE;AAClE,+CAAoD;AACpD,yDAA8D;AAC9D,iDAAsD;AACtD,mDAAwD;AACxD,2CAAgD;AAChD,uDAA4D;AAC5D,mDAAwD;AACxD,2CAAgD;AAChD,6CAAkD;AAClD,iDAAsD;AAEtD,MAAM,SAAS,GAAe;IAC7B,mBAAY;IACZ,iCAAmB;IACnB,mBAAY;IACZ,2BAAgB;IAChB,qBAAa;IACb,2BAAgB;IAChB,yBAAe;IACf,uBAAc;IACd,mBAAY;IACZ,yBAAe;IACf,+BAAkB;IAClB,qCAAqB;CACrB,CAAC;AAEF,MAAa,SAAS;IAAtB;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,WAAW;YAEjB,IAAI,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,IAAI,EAAE,qCAAqC,EAAE;YAC9F,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,gEAAgE;YAC1E,WAAW,EACV,yHAAyH;YAC1H,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YAC/B,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE;gBACZ,UAAU,EACT,moCAAmoC;gBACpoC,YAAY,EAAE;oBACb;wBACC,QAAQ,EAAE,sCAAsC;wBAChD,YAAY,EACX,uHAAuH;qBACxH;iBACD;aACD;YACD,MAAM,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YACnC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACnD,UAAU,EAAE,IAAA,sBAAe,EAAC,SAAS,EAAE,MAAM,CAAC;SAC9C,CAAC;QAEF,YAAO,GAAG,EAAE,WAAW,EAAX,qBAAW,EAAE,CAAC;IAK3B,CAAC;IAHA,KAAK,CAAC,OAAO;QACZ,OAAO,MAAM,uBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;CACD;AAnCD,8BAmCC"}
|
|
@@ -2,5 +2,6 @@ import type { ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
|
|
|
2
2
|
export declare const loadOptions: {
|
|
3
3
|
getRooms(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
4
4
|
getUsers(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
5
|
+
getFolders(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
5
6
|
getProjects(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
6
7
|
};
|
|
@@ -35,6 +35,22 @@ exports.loadOptions = {
|
|
|
35
35
|
})
|
|
36
36
|
.sort(byName);
|
|
37
37
|
},
|
|
38
|
+
async getFolders() {
|
|
39
|
+
var _a;
|
|
40
|
+
const project = String((_a = this.getCurrentNodeParameter('projectId')) !== null && _a !== void 0 ? _a : '').trim();
|
|
41
|
+
if (project === '' || project.startsWith('='))
|
|
42
|
+
return [];
|
|
43
|
+
return (await list.call(this, `/v1/projects/${encodeURIComponent(project)}/folders`))
|
|
44
|
+
.map((folder) => {
|
|
45
|
+
var _a, _b;
|
|
46
|
+
return ({
|
|
47
|
+
name: String((_a = folder.name) !== null && _a !== void 0 ? _a : '').trim() || String(folder.id),
|
|
48
|
+
value: String(folder.id),
|
|
49
|
+
description: `${String((_b = folder.items_count) !== null && _b !== void 0 ? _b : 0)} items`,
|
|
50
|
+
});
|
|
51
|
+
})
|
|
52
|
+
.sort(byName);
|
|
53
|
+
},
|
|
38
54
|
async getProjects() {
|
|
39
55
|
return (await list.call(this, '/v1/projects'))
|
|
40
56
|
.map((project) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../../nodes/Kinescope/methods.ts"],"names":[],"mappings":";;;AAEA,8CAA2D;AAC3D,sDAAiE;AAEjE,SAAS,MAAM,CAAC,CAAuB,EAAE,CAAuB;IAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAGD,KAAK,UAAU,IAAI,CAA8B,IAAY;IAC5D,MAAM,GAAG,GAAG,MAAM,wBAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,MAAM,IAAA,cAAM,EAClB,GAAG,GAAG,IAAI,IAAI,EAAE,EAChB,KAAK,IAAI,EAAE,CAAC,MAAM,qBAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,EAC3D,qBAAa,CACb,CAAC;AACH,CAAC;AAEY,QAAA,WAAW,GAAG;IAC1B,KAAK,CAAC,QAAQ;QACb,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;aAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;;YAAC,OAAA,CAAC;gBACf,IAAI,EAAE,MAAM,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,CAAC,IAAI,MAAM,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,IAAI,CAAC,EAAE,CAAC;gBAC7D,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,WAAW,EAAE,GAAG,MAAM,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,CAAC,MAAM,MAAM,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;aACzF,CAAC,CAAA;SAAA,CAAC;aACF,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;aACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;;YAAC,OAAA,CAAC;gBACf,IAAI,EAAE,MAAM,CAAC,MAAA,IAAI,CAAC,SAAS,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,IAAI,CAAC,EAAE,CAAC;gBAC1E,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,WAAW,EAAE,MAAM,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,EAAE,CAAC;aACrC,CAAC,CAAA;SAAA,CAAC;aACF,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;aAC5C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;;YAAC,OAAA,CAAC;gBAClB,IAAI,EAAE,MAAM,CAAC,MAAA,OAAO,CAAC,IAAI,mCAAI,OAAO,CAAC,EAAE,CAAC;gBACxC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,WAAW,EAAE,GAAG,MAAM,CAAC,MAAA,OAAO,CAAC,WAAW,mCAAI,CAAC,CAAC,QAAQ;aACxD,CAAC,CAAA;SAAA,CAAC;aACF,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;CACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../../nodes/Kinescope/methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,3 +4,5 @@ export declare function userProperty(displayName: string, name: string, descript
|
|
|
4
4
|
export declare function idProperty(displayName: string, name: string, description: string, placeholder?: string): INodeProperties;
|
|
5
5
|
export declare function idSegment(ctx: IExecuteFunctions, name: string, itemIndex: number, label: string): string;
|
|
6
6
|
export declare const SPEAK_ORIGIN = "https://speak.kinescope.io";
|
|
7
|
+
export declare function projectProperty(overrides?: Partial<INodeProperties>): INodeProperties;
|
|
8
|
+
export declare function folderProperty(overrides?: Partial<INodeProperties>): INodeProperties;
|
|
@@ -5,6 +5,8 @@ exports.roomProperty = roomProperty;
|
|
|
5
5
|
exports.userProperty = userProperty;
|
|
6
6
|
exports.idProperty = idProperty;
|
|
7
7
|
exports.idSegment = idSegment;
|
|
8
|
+
exports.projectProperty = projectProperty;
|
|
9
|
+
exports.folderProperty = folderProperty;
|
|
8
10
|
const params_1 = require("../../shared/params");
|
|
9
11
|
const transport_1 = require("../../shared/transport");
|
|
10
12
|
function roomProperty(overrides = {}) {
|
|
@@ -45,4 +47,27 @@ function idSegment(ctx, name, itemIndex, label) {
|
|
|
45
47
|
return (0, transport_1.segment)((0, params_1.requiredText)(ctx, name, itemIndex, label));
|
|
46
48
|
}
|
|
47
49
|
exports.SPEAK_ORIGIN = 'https://speak.kinescope.io';
|
|
50
|
+
function projectProperty(overrides = {}) {
|
|
51
|
+
return {
|
|
52
|
+
displayName: 'Project Name or ID',
|
|
53
|
+
name: 'projectId',
|
|
54
|
+
type: 'options',
|
|
55
|
+
typeOptions: { loadOptionsMethod: 'getProjects' },
|
|
56
|
+
required: true,
|
|
57
|
+
default: '',
|
|
58
|
+
description: 'The project of the catalog. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
|
|
59
|
+
...overrides,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function folderProperty(overrides = {}) {
|
|
63
|
+
return {
|
|
64
|
+
displayName: 'Folder Name or ID',
|
|
65
|
+
name: 'folderId',
|
|
66
|
+
type: 'options',
|
|
67
|
+
typeOptions: { loadOptionsMethod: 'getFolders', loadOptionsDependsOn: ['projectId'] },
|
|
68
|
+
default: '',
|
|
69
|
+
description: 'A folder inside that project; empty for the project root. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
|
|
70
|
+
...overrides,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
48
73
|
//# sourceMappingURL=props.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"props.js","sourceRoot":"","sources":["../../../nodes/Kinescope/props.ts"],"names":[],"mappings":";;;AAMA,oCAYC;AAMD,oCAcC;AAGD,gCAeC;AAGD,8BAOC;
|
|
1
|
+
{"version":3,"file":"props.js","sourceRoot":"","sources":["../../../nodes/Kinescope/props.ts"],"names":[],"mappings":";;;AAMA,oCAYC;AAMD,oCAcC;AAGD,gCAeC;AAGD,8BAOC;AAMD,0CAYC;AAGD,wCAWC;AAhGD,gDAAmD;AACnD,sDAAiD;AAGjD,SAAgB,YAAY,CAAC,YAAsC,EAAE;IACpE,OAAO;QACN,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE;QAC9C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EACV,iIAAiI;QAClI,GAAG,SAAS;KACZ,CAAC;AACH,CAAC;AAMD,SAAgB,YAAY,CAC3B,WAAmB,EACnB,IAAY,EACZ,WAAmB;IAEnB,OAAO;QACN,WAAW;QACX,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE;QAC9C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,GAAG,WAAW,mHAAmH;KAC9I,CAAC;AACH,CAAC;AAGD,SAAgB,UAAU,CACzB,WAAmB,EACnB,IAAY,EACZ,WAAmB,EACnB,WAAW,GAAG,sCAAsC;IAEpD,OAAO;QACN,WAAW;QACX,IAAI;QACJ,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,EAAE;QACX,WAAW;QACX,WAAW;KACX,CAAC;AACH,CAAC;AAGD,SAAgB,SAAS,CACxB,GAAsB,EACtB,IAAY,EACZ,SAAiB,EACjB,KAAa;IAEb,OAAO,IAAA,mBAAO,EAAC,IAAA,qBAAY,EAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAGY,QAAA,YAAY,GAAG,4BAA4B,CAAC;AAGzD,SAAgB,eAAe,CAAC,YAAsC,EAAE;IACvE,OAAO;QACN,WAAW,EAAE,oBAAoB;QACjC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE;QACjD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EACV,6IAA6I;QAC9I,GAAG,SAAS;KACZ,CAAC;AACH,CAAC;AAGD,SAAgB,cAAc,CAAC,YAAsC,EAAE;IACtE,OAAO;QACN,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC,WAAW,CAAC,EAAE;QACrF,OAAO,EAAE,EAAE;QACX,WAAW,EACV,2KAA2K;QAC5K,GAAG,SAAS;KACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.folderResource = void 0;
|
|
4
|
+
const params_1 = require("../../../shared/params");
|
|
5
|
+
const transport_1 = require("../../../shared/transport");
|
|
6
|
+
const props_1 = require("../props");
|
|
7
|
+
exports.folderResource = {
|
|
8
|
+
value: 'folder',
|
|
9
|
+
name: 'Folder',
|
|
10
|
+
description: 'Folders inside a project of the catalog',
|
|
11
|
+
operations: [
|
|
12
|
+
{
|
|
13
|
+
value: 'create',
|
|
14
|
+
name: 'Create',
|
|
15
|
+
action: 'Create a folder',
|
|
16
|
+
description: 'Create a folder in a project, at its root or inside another folder',
|
|
17
|
+
properties: [
|
|
18
|
+
(0, props_1.projectProperty)(),
|
|
19
|
+
{
|
|
20
|
+
displayName: 'Name',
|
|
21
|
+
name: 'name',
|
|
22
|
+
type: 'string',
|
|
23
|
+
required: true,
|
|
24
|
+
default: '',
|
|
25
|
+
},
|
|
26
|
+
(0, props_1.folderProperty)({
|
|
27
|
+
displayName: 'Parent Folder Name or ID',
|
|
28
|
+
name: 'parentId',
|
|
29
|
+
description: 'The folder to create it in; empty for the project root. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
|
|
30
|
+
}),
|
|
31
|
+
],
|
|
32
|
+
async execute(itemIndex) {
|
|
33
|
+
const project = (0, props_1.idSegment)(this, 'projectId', itemIndex, 'Project');
|
|
34
|
+
const body = (0, params_1.compact)({
|
|
35
|
+
name: (0, params_1.requiredText)(this, 'name', itemIndex, 'Name'),
|
|
36
|
+
parent_id: (0, params_1.text)(this, 'parentId', itemIndex),
|
|
37
|
+
});
|
|
38
|
+
return (0, transport_1.dataOf)(await transport_1.kinescopeRequest.call(this, 'POST', `/v1/projects/${project}/folders`, {
|
|
39
|
+
body,
|
|
40
|
+
itemIndex,
|
|
41
|
+
retry: false,
|
|
42
|
+
}));
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
value: 'getAll',
|
|
47
|
+
name: 'Get Many',
|
|
48
|
+
action: 'Get many folders',
|
|
49
|
+
description: 'List the folders of a project with their size and number of items',
|
|
50
|
+
properties: [(0, props_1.projectProperty)(), ...(0, params_1.returnAllProperties)('folders')],
|
|
51
|
+
async execute(itemIndex) {
|
|
52
|
+
const project = (0, props_1.idSegment)(this, 'projectId', itemIndex, 'Project');
|
|
53
|
+
return await transport_1.readPages.call(this, `/v1/projects/${project}/folders`, {}, (0, params_1.wantedRows)(this, itemIndex), itemIndex);
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=folder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder.js","sourceRoot":"","sources":["../../../../nodes/Kinescope/resources/folder.ts"],"names":[],"mappings":";;;AAAA,mDAMgC;AAEhC,yDAAgF;AAChF,oCAAsE;AAEzD,QAAA,cAAc,GAAa;IACvC,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,yCAAyC;IACtD,UAAU,EAAE;QACX;YACC,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,iBAAiB;YACzB,WAAW,EAAE,oEAAoE;YACjF,UAAU,EAAE;gBACX,IAAA,uBAAe,GAAE;gBACjB;oBACC,WAAW,EAAE,MAAM;oBACnB,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,EAAE;iBACX;gBACD,IAAA,sBAAc,EAAC;oBACd,WAAW,EAAE,0BAA0B;oBACvC,IAAI,EAAE,UAAU;oBAChB,WAAW,EACV,yKAAyK;iBAC1K,CAAC;aACF;YACD,KAAK,CAAC,OAAO,CAAC,SAAS;gBACtB,MAAM,OAAO,GAAG,IAAA,iBAAS,EAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACnE,MAAM,IAAI,GAAG,IAAA,gBAAO,EAAC;oBACpB,IAAI,EAAE,IAAA,qBAAY,EAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;oBACnD,SAAS,EAAE,IAAA,aAAI,EAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC;iBAC5C,CAAC,CAAC;gBACH,OAAO,IAAA,kBAAM,EACZ,MAAM,4BAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,OAAO,UAAU,EAAE;oBAC5E,IAAI;oBACJ,SAAS;oBACT,KAAK,EAAE,KAAK;iBACZ,CAAC,CACF,CAAC;YACH,CAAC;SACD;QACD;YACC,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,kBAAkB;YAC1B,WAAW,EAAE,mEAAmE;YAChF,UAAU,EAAE,CAAC,IAAA,uBAAe,GAAE,EAAE,GAAG,IAAA,4BAAmB,EAAC,SAAS,CAAC,CAAC;YAClE,KAAK,CAAC,OAAO,CAAC,SAAS;gBACtB,MAAM,OAAO,GAAG,IAAA,iBAAS,EAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACnE,OAAO,MAAM,qBAAS,CAAC,IAAI,CAC1B,IAAI,EACJ,gBAAgB,OAAO,UAAU,EACjC,EAAE,EACF,IAAA,mBAAU,EAAC,IAAI,EAAE,SAAS,CAAC,EAC3B,SAAS,CACT,CAAC;YACH,CAAC;SACD;KACD;CACD,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.projectResource = exports.PRIVACY_TYPES = void 0;
|
|
4
|
+
const params_1 = require("../../../shared/params");
|
|
5
|
+
const transport_1 = require("../../../shared/transport");
|
|
6
|
+
const props_1 = require("../props");
|
|
7
|
+
exports.PRIVACY_TYPES = [
|
|
8
|
+
{ name: 'Anywhere', value: 'anywhere', description: 'Any site may embed the player' },
|
|
9
|
+
{
|
|
10
|
+
name: 'Listed Domains Only',
|
|
11
|
+
value: 'custom',
|
|
12
|
+
description: 'Only the domains listed in Privacy Domains',
|
|
13
|
+
},
|
|
14
|
+
{ name: 'Nowhere', value: 'nowhere', description: 'No site may embed the player' },
|
|
15
|
+
];
|
|
16
|
+
exports.projectResource = {
|
|
17
|
+
value: 'project',
|
|
18
|
+
name: 'Project',
|
|
19
|
+
description: 'Top-level sections of the Kinescope catalog that hold videos and folders',
|
|
20
|
+
operations: [
|
|
21
|
+
{
|
|
22
|
+
value: 'create',
|
|
23
|
+
name: 'Create',
|
|
24
|
+
action: 'Create a project',
|
|
25
|
+
description: 'Create a project in the catalog for videos or for live streams',
|
|
26
|
+
properties: [
|
|
27
|
+
{
|
|
28
|
+
displayName: 'Name',
|
|
29
|
+
name: 'name',
|
|
30
|
+
type: 'string',
|
|
31
|
+
required: true,
|
|
32
|
+
default: '',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
displayName: 'Additional Fields',
|
|
36
|
+
name: 'additionalFields',
|
|
37
|
+
type: 'collection',
|
|
38
|
+
placeholder: 'Add Field',
|
|
39
|
+
default: {},
|
|
40
|
+
options: [
|
|
41
|
+
{
|
|
42
|
+
displayName: 'Catalog Type',
|
|
43
|
+
name: 'catalogType',
|
|
44
|
+
type: 'options',
|
|
45
|
+
default: 'vod',
|
|
46
|
+
options: [
|
|
47
|
+
{ name: 'Videos', value: 'vod' },
|
|
48
|
+
{ name: 'Live Streams', value: 'live' },
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
displayName: 'Privacy',
|
|
53
|
+
name: 'privacyType',
|
|
54
|
+
type: 'options',
|
|
55
|
+
default: 'anywhere',
|
|
56
|
+
options: exports.PRIVACY_TYPES,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
displayName: 'Privacy Domains',
|
|
60
|
+
name: 'privacyDomains',
|
|
61
|
+
type: 'string',
|
|
62
|
+
default: '',
|
|
63
|
+
placeholder: 'example.com, school.example.com',
|
|
64
|
+
description: 'Domains that may embed the player, for Listed Domains Only',
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
async execute(itemIndex) {
|
|
70
|
+
var _a;
|
|
71
|
+
const fields = this.getNodeParameter('additionalFields', itemIndex, {});
|
|
72
|
+
const body = {
|
|
73
|
+
name: (0, params_1.requiredText)(this, 'name', itemIndex, 'Name'),
|
|
74
|
+
privacy_type: String((_a = fields.privacyType) !== null && _a !== void 0 ? _a : 'anywhere') || 'anywhere',
|
|
75
|
+
privacy_domains: (0, params_1.idList)(fields.privacyDomains),
|
|
76
|
+
...(0, params_1.compact)({ catalog_type: fields.catalogType }),
|
|
77
|
+
};
|
|
78
|
+
return (0, transport_1.dataOf)(await transport_1.kinescopeRequest.call(this, 'POST', '/v1/projects', {
|
|
79
|
+
body,
|
|
80
|
+
itemIndex,
|
|
81
|
+
retry: false,
|
|
82
|
+
}));
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
value: 'get',
|
|
87
|
+
name: 'Get',
|
|
88
|
+
action: 'Get a project',
|
|
89
|
+
description: 'Get one project with its folders, size and number of items',
|
|
90
|
+
properties: [(0, props_1.projectProperty)()],
|
|
91
|
+
async execute(itemIndex) {
|
|
92
|
+
const id = (0, props_1.idSegment)(this, 'projectId', itemIndex, 'Project');
|
|
93
|
+
return (0, transport_1.dataOf)(await transport_1.kinescopeRequest.call(this, 'GET', `/v1/projects/${id}`, { itemIndex }));
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
value: 'getAll',
|
|
98
|
+
name: 'Get Many',
|
|
99
|
+
action: 'Get many projects',
|
|
100
|
+
description: 'List the projects of the catalog',
|
|
101
|
+
properties: [...(0, params_1.returnAllProperties)('projects'), (0, params_1.orderProperty)('name.asc')],
|
|
102
|
+
async execute(itemIndex) {
|
|
103
|
+
return await transport_1.readPages.call(this, '/v1/projects', (0, params_1.compact)({ order: (0, params_1.text)(this, 'order', itemIndex) }), (0, params_1.wantedRows)(this, itemIndex), itemIndex);
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../nodes/Kinescope/resources/project.ts"],"names":[],"mappings":"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"}
|