digital-tools 2.0.2 → 2.1.1
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/CHANGELOG.md +17 -0
- package/package.json +3 -4
- package/src/define.js +267 -0
- package/src/entities/advertising.js +999 -0
- package/src/entities/ai.js +756 -0
- package/src/entities/analytics.js +1588 -0
- package/src/entities/automation.js +601 -0
- package/src/entities/communication.js +1150 -0
- package/src/entities/crm.js +1386 -0
- package/src/entities/design.js +546 -0
- package/src/entities/development.js +2212 -0
- package/src/entities/document.js +874 -0
- package/src/entities/ecommerce.js +1429 -0
- package/src/entities/experiment.js +1039 -0
- package/src/entities/finance.js +3478 -0
- package/src/entities/forms.js +1892 -0
- package/src/entities/hr.js +661 -0
- package/src/entities/identity.js +997 -0
- package/src/entities/index.js +282 -0
- package/src/entities/infrastructure.js +1153 -0
- package/src/entities/knowledge.js +1438 -0
- package/src/entities/marketing.js +1610 -0
- package/src/entities/media.js +1634 -0
- package/src/entities/notification.js +1199 -0
- package/src/entities/presentation.js +1274 -0
- package/src/entities/productivity.js +1317 -0
- package/src/entities/project-management.js +1136 -0
- package/src/entities/recruiting.js +736 -0
- package/src/entities/shipping.js +509 -0
- package/src/entities/signature.js +1102 -0
- package/src/entities/site.js +222 -0
- package/src/entities/spreadsheet.js +1341 -0
- package/src/entities/storage.js +1198 -0
- package/src/entities/support.js +1166 -0
- package/src/entities/video-conferencing.js +1750 -0
- package/src/entities/video.js +950 -0
- package/src/entities.js +1663 -0
- package/src/index.js +74 -0
- package/src/providers/analytics/index.js +17 -0
- package/src/providers/analytics/mixpanel.js +255 -0
- package/src/providers/calendar/cal-com.js +303 -0
- package/src/providers/calendar/google-calendar.js +335 -0
- package/src/providers/calendar/index.js +20 -0
- package/src/providers/crm/hubspot.js +566 -0
- package/src/providers/crm/index.js +17 -0
- package/src/providers/development/github.js +472 -0
- package/src/providers/development/index.js +17 -0
- package/src/providers/ecommerce/index.js +17 -0
- package/src/providers/ecommerce/shopify.js +378 -0
- package/src/providers/email/index.js +20 -0
- package/src/providers/email/resend.js +258 -0
- package/src/providers/email/sendgrid.js +161 -0
- package/src/providers/finance/index.js +17 -0
- package/src/providers/finance/stripe.js +549 -0
- package/src/providers/forms/index.js +17 -0
- package/src/providers/forms/typeform.js +500 -0
- package/src/providers/index.js +123 -0
- package/src/providers/knowledge/index.js +17 -0
- package/src/providers/knowledge/notion.js +389 -0
- package/src/providers/marketing/index.js +17 -0
- package/src/providers/marketing/mailchimp.js +443 -0
- package/src/providers/media/cloudinary.js +318 -0
- package/src/providers/media/index.js +17 -0
- package/src/providers/messaging/index.js +20 -0
- package/src/providers/messaging/slack.js +393 -0
- package/src/providers/messaging/twilio-sms.js +249 -0
- package/src/providers/project-management/index.js +17 -0
- package/src/providers/project-management/linear.js +575 -0
- package/src/providers/registry.js +86 -0
- package/src/providers/spreadsheet/google-sheets.js +375 -0
- package/src/providers/spreadsheet/index.js +20 -0
- package/src/providers/spreadsheet/xlsx.js +423 -0
- package/src/providers/storage/index.js +24 -0
- package/src/providers/storage/s3.js +419 -0
- package/src/providers/support/index.js +17 -0
- package/src/providers/support/zendesk.js +373 -0
- package/src/providers/tasks/index.js +17 -0
- package/src/providers/tasks/todoist.js +286 -0
- package/src/providers/types.js +9 -0
- package/src/providers/video-conferencing/google-meet.js +286 -0
- package/src/providers/video-conferencing/index.js +31 -0
- package/src/providers/video-conferencing/jitsi.js +254 -0
- package/src/providers/video-conferencing/teams.js +270 -0
- package/src/providers/video-conferencing/zoom.js +332 -0
- package/src/registry.js +128 -0
- package/src/tools/communication.js +184 -0
- package/src/tools/data.js +205 -0
- package/src/tools/index.js +11 -0
- package/src/tools/web.js +137 -0
- package/src/types.js +10 -0
- package/test/define.test.js +306 -0
- package/test/registry.test.js +357 -0
- package/test/tools.test.js +363 -0
|
@@ -0,0 +1,1634 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Entity Types (Nouns)
|
|
3
|
+
*
|
|
4
|
+
* Semantic type definitions for media-related digital tools that can be used by
|
|
5
|
+
* both remote human workers AND AI agents. Each entity defines:
|
|
6
|
+
* - Properties: The data fields
|
|
7
|
+
* - Actions: Operations that can be performed (Verbs)
|
|
8
|
+
* - Events: State changes that occur
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Image
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Image file entity
|
|
17
|
+
*
|
|
18
|
+
* Represents an image file with dimensions, format, and metadata
|
|
19
|
+
*/
|
|
20
|
+
export const Image = {
|
|
21
|
+
singular: 'image',
|
|
22
|
+
plural: 'images',
|
|
23
|
+
description: 'An image file with dimensions, format, and metadata',
|
|
24
|
+
properties: {
|
|
25
|
+
// Basic info
|
|
26
|
+
filename: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Original filename',
|
|
29
|
+
},
|
|
30
|
+
url: {
|
|
31
|
+
type: 'url',
|
|
32
|
+
description: 'URL to access the image',
|
|
33
|
+
},
|
|
34
|
+
altText: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
optional: true,
|
|
37
|
+
description: 'Alternative text for accessibility',
|
|
38
|
+
},
|
|
39
|
+
caption: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
optional: true,
|
|
42
|
+
description: 'Image caption or description',
|
|
43
|
+
},
|
|
44
|
+
title: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
optional: true,
|
|
47
|
+
description: 'Image title',
|
|
48
|
+
},
|
|
49
|
+
// Format & dimensions
|
|
50
|
+
format: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: 'Image format: jpg, jpeg, png, gif, webp, svg, heic, bmp, tiff',
|
|
53
|
+
examples: ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'heic', 'bmp', 'tiff'],
|
|
54
|
+
},
|
|
55
|
+
mimeType: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'MIME type of the image',
|
|
58
|
+
},
|
|
59
|
+
width: {
|
|
60
|
+
type: 'number',
|
|
61
|
+
description: 'Width in pixels',
|
|
62
|
+
},
|
|
63
|
+
height: {
|
|
64
|
+
type: 'number',
|
|
65
|
+
description: 'Height in pixels',
|
|
66
|
+
},
|
|
67
|
+
aspectRatio: {
|
|
68
|
+
type: 'string',
|
|
69
|
+
optional: true,
|
|
70
|
+
description: 'Aspect ratio (e.g., 16:9, 4:3)',
|
|
71
|
+
},
|
|
72
|
+
orientation: {
|
|
73
|
+
type: 'string',
|
|
74
|
+
optional: true,
|
|
75
|
+
description: 'Image orientation: landscape, portrait, square',
|
|
76
|
+
examples: ['landscape', 'portrait', 'square'],
|
|
77
|
+
},
|
|
78
|
+
// File properties
|
|
79
|
+
size: {
|
|
80
|
+
type: 'number',
|
|
81
|
+
description: 'File size in bytes',
|
|
82
|
+
},
|
|
83
|
+
hash: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
optional: true,
|
|
86
|
+
description: 'Content hash for deduplication',
|
|
87
|
+
},
|
|
88
|
+
// Technical metadata
|
|
89
|
+
colorSpace: {
|
|
90
|
+
type: 'string',
|
|
91
|
+
optional: true,
|
|
92
|
+
description: 'Color space: rgb, cmyk, grayscale',
|
|
93
|
+
examples: ['rgb', 'cmyk', 'grayscale'],
|
|
94
|
+
},
|
|
95
|
+
bitDepth: {
|
|
96
|
+
type: 'number',
|
|
97
|
+
optional: true,
|
|
98
|
+
description: 'Color bit depth',
|
|
99
|
+
},
|
|
100
|
+
dpi: {
|
|
101
|
+
type: 'number',
|
|
102
|
+
optional: true,
|
|
103
|
+
description: 'Dots per inch resolution',
|
|
104
|
+
},
|
|
105
|
+
hasAlpha: {
|
|
106
|
+
type: 'boolean',
|
|
107
|
+
optional: true,
|
|
108
|
+
description: 'Whether the image has an alpha channel',
|
|
109
|
+
},
|
|
110
|
+
// EXIF & camera metadata
|
|
111
|
+
exif: {
|
|
112
|
+
type: 'json',
|
|
113
|
+
optional: true,
|
|
114
|
+
description: 'EXIF metadata from the camera',
|
|
115
|
+
},
|
|
116
|
+
camera: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
optional: true,
|
|
119
|
+
description: 'Camera make and model',
|
|
120
|
+
},
|
|
121
|
+
lens: {
|
|
122
|
+
type: 'string',
|
|
123
|
+
optional: true,
|
|
124
|
+
description: 'Lens information',
|
|
125
|
+
},
|
|
126
|
+
focalLength: {
|
|
127
|
+
type: 'number',
|
|
128
|
+
optional: true,
|
|
129
|
+
description: 'Focal length in millimeters',
|
|
130
|
+
},
|
|
131
|
+
aperture: {
|
|
132
|
+
type: 'number',
|
|
133
|
+
optional: true,
|
|
134
|
+
description: 'Aperture f-stop value',
|
|
135
|
+
},
|
|
136
|
+
shutterSpeed: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
optional: true,
|
|
139
|
+
description: 'Shutter speed (e.g., 1/1000)',
|
|
140
|
+
},
|
|
141
|
+
iso: {
|
|
142
|
+
type: 'number',
|
|
143
|
+
optional: true,
|
|
144
|
+
description: 'ISO sensitivity',
|
|
145
|
+
},
|
|
146
|
+
flash: {
|
|
147
|
+
type: 'boolean',
|
|
148
|
+
optional: true,
|
|
149
|
+
description: 'Whether flash was used',
|
|
150
|
+
},
|
|
151
|
+
// Location & time
|
|
152
|
+
takenAt: {
|
|
153
|
+
type: 'datetime',
|
|
154
|
+
optional: true,
|
|
155
|
+
description: 'When the photo was taken',
|
|
156
|
+
},
|
|
157
|
+
location: {
|
|
158
|
+
type: 'json',
|
|
159
|
+
optional: true,
|
|
160
|
+
description: 'GPS coordinates (latitude, longitude)',
|
|
161
|
+
},
|
|
162
|
+
// Organization
|
|
163
|
+
tags: {
|
|
164
|
+
type: 'string',
|
|
165
|
+
array: true,
|
|
166
|
+
optional: true,
|
|
167
|
+
description: 'Tags for categorization',
|
|
168
|
+
},
|
|
169
|
+
keywords: {
|
|
170
|
+
type: 'string',
|
|
171
|
+
array: true,
|
|
172
|
+
optional: true,
|
|
173
|
+
description: 'Search keywords',
|
|
174
|
+
},
|
|
175
|
+
// Processing
|
|
176
|
+
thumbnail: {
|
|
177
|
+
type: 'url',
|
|
178
|
+
optional: true,
|
|
179
|
+
description: 'URL to thumbnail version',
|
|
180
|
+
},
|
|
181
|
+
versions: {
|
|
182
|
+
type: 'json',
|
|
183
|
+
optional: true,
|
|
184
|
+
description: 'Different sizes/versions of the image',
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
relationships: {
|
|
188
|
+
album: {
|
|
189
|
+
type: 'Album',
|
|
190
|
+
required: false,
|
|
191
|
+
description: 'Album this image belongs to',
|
|
192
|
+
},
|
|
193
|
+
library: {
|
|
194
|
+
type: 'MediaLibrary',
|
|
195
|
+
required: false,
|
|
196
|
+
description: 'Media library containing this image',
|
|
197
|
+
},
|
|
198
|
+
photographer: {
|
|
199
|
+
type: 'Contact',
|
|
200
|
+
required: false,
|
|
201
|
+
description: 'Photographer who took the photo',
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
actions: [
|
|
205
|
+
'upload',
|
|
206
|
+
'download',
|
|
207
|
+
'view',
|
|
208
|
+
'edit',
|
|
209
|
+
'crop',
|
|
210
|
+
'resize',
|
|
211
|
+
'rotate',
|
|
212
|
+
'flip',
|
|
213
|
+
'filter',
|
|
214
|
+
'enhance',
|
|
215
|
+
'compress',
|
|
216
|
+
'convert',
|
|
217
|
+
'tag',
|
|
218
|
+
'share',
|
|
219
|
+
'delete',
|
|
220
|
+
'restore',
|
|
221
|
+
'duplicate',
|
|
222
|
+
'addToAlbum',
|
|
223
|
+
'removeFromAlbum',
|
|
224
|
+
'setAltText',
|
|
225
|
+
],
|
|
226
|
+
events: [
|
|
227
|
+
'uploaded',
|
|
228
|
+
'downloaded',
|
|
229
|
+
'viewed',
|
|
230
|
+
'edited',
|
|
231
|
+
'cropped',
|
|
232
|
+
'resized',
|
|
233
|
+
'rotated',
|
|
234
|
+
'flipped',
|
|
235
|
+
'filtered',
|
|
236
|
+
'enhanced',
|
|
237
|
+
'compressed',
|
|
238
|
+
'converted',
|
|
239
|
+
'tagged',
|
|
240
|
+
'shared',
|
|
241
|
+
'deleted',
|
|
242
|
+
'restored',
|
|
243
|
+
'duplicated',
|
|
244
|
+
'addedToAlbum',
|
|
245
|
+
'removedFromAlbum',
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
// =============================================================================
|
|
249
|
+
// Video
|
|
250
|
+
// =============================================================================
|
|
251
|
+
/**
|
|
252
|
+
* Video file entity
|
|
253
|
+
*
|
|
254
|
+
* Represents a video file with duration, resolution, and metadata
|
|
255
|
+
*/
|
|
256
|
+
export const Video = {
|
|
257
|
+
singular: 'video',
|
|
258
|
+
plural: 'videos',
|
|
259
|
+
description: 'A video file with duration, resolution, format, and metadata',
|
|
260
|
+
properties: {
|
|
261
|
+
// Basic info
|
|
262
|
+
filename: {
|
|
263
|
+
type: 'string',
|
|
264
|
+
description: 'Original filename',
|
|
265
|
+
},
|
|
266
|
+
url: {
|
|
267
|
+
type: 'url',
|
|
268
|
+
description: 'URL to access the video',
|
|
269
|
+
},
|
|
270
|
+
title: {
|
|
271
|
+
type: 'string',
|
|
272
|
+
optional: true,
|
|
273
|
+
description: 'Video title',
|
|
274
|
+
},
|
|
275
|
+
description: {
|
|
276
|
+
type: 'string',
|
|
277
|
+
optional: true,
|
|
278
|
+
description: 'Video description',
|
|
279
|
+
},
|
|
280
|
+
// Format & technical
|
|
281
|
+
format: {
|
|
282
|
+
type: 'string',
|
|
283
|
+
description: 'Video format: mp4, mov, avi, webm, mkv, flv, wmv',
|
|
284
|
+
examples: ['mp4', 'mov', 'avi', 'webm', 'mkv', 'flv', 'wmv'],
|
|
285
|
+
},
|
|
286
|
+
mimeType: {
|
|
287
|
+
type: 'string',
|
|
288
|
+
description: 'MIME type of the video',
|
|
289
|
+
},
|
|
290
|
+
codec: {
|
|
291
|
+
type: 'string',
|
|
292
|
+
optional: true,
|
|
293
|
+
description: 'Video codec: h264, h265, vp9, av1',
|
|
294
|
+
examples: ['h264', 'h265', 'vp9', 'av1'],
|
|
295
|
+
},
|
|
296
|
+
audioCodec: {
|
|
297
|
+
type: 'string',
|
|
298
|
+
optional: true,
|
|
299
|
+
description: 'Audio codec: aac, mp3, opus, vorbis',
|
|
300
|
+
examples: ['aac', 'mp3', 'opus', 'vorbis'],
|
|
301
|
+
},
|
|
302
|
+
container: {
|
|
303
|
+
type: 'string',
|
|
304
|
+
optional: true,
|
|
305
|
+
description: 'Container format',
|
|
306
|
+
},
|
|
307
|
+
// Duration & timing
|
|
308
|
+
duration: {
|
|
309
|
+
type: 'number',
|
|
310
|
+
description: 'Duration in seconds',
|
|
311
|
+
},
|
|
312
|
+
frameRate: {
|
|
313
|
+
type: 'number',
|
|
314
|
+
optional: true,
|
|
315
|
+
description: 'Frames per second',
|
|
316
|
+
},
|
|
317
|
+
totalFrames: {
|
|
318
|
+
type: 'number',
|
|
319
|
+
optional: true,
|
|
320
|
+
description: 'Total number of frames',
|
|
321
|
+
},
|
|
322
|
+
// Dimensions
|
|
323
|
+
width: {
|
|
324
|
+
type: 'number',
|
|
325
|
+
description: 'Width in pixels',
|
|
326
|
+
},
|
|
327
|
+
height: {
|
|
328
|
+
type: 'number',
|
|
329
|
+
description: 'Height in pixels',
|
|
330
|
+
},
|
|
331
|
+
aspectRatio: {
|
|
332
|
+
type: 'string',
|
|
333
|
+
optional: true,
|
|
334
|
+
description: 'Aspect ratio (e.g., 16:9, 4:3, 21:9)',
|
|
335
|
+
examples: ['16:9', '4:3', '21:9', '1:1'],
|
|
336
|
+
},
|
|
337
|
+
resolution: {
|
|
338
|
+
type: 'string',
|
|
339
|
+
optional: true,
|
|
340
|
+
description: 'Video resolution: 480p, 720p, 1080p, 2k, 4k, 8k',
|
|
341
|
+
examples: ['480p', '720p', '1080p', '1440p', '2k', '4k', '8k'],
|
|
342
|
+
},
|
|
343
|
+
orientation: {
|
|
344
|
+
type: 'string',
|
|
345
|
+
optional: true,
|
|
346
|
+
description: 'Video orientation: landscape, portrait',
|
|
347
|
+
examples: ['landscape', 'portrait'],
|
|
348
|
+
},
|
|
349
|
+
// File properties
|
|
350
|
+
size: {
|
|
351
|
+
type: 'number',
|
|
352
|
+
description: 'File size in bytes',
|
|
353
|
+
},
|
|
354
|
+
bitrate: {
|
|
355
|
+
type: 'number',
|
|
356
|
+
optional: true,
|
|
357
|
+
description: 'Bitrate in bits per second',
|
|
358
|
+
},
|
|
359
|
+
audioBitrate: {
|
|
360
|
+
type: 'number',
|
|
361
|
+
optional: true,
|
|
362
|
+
description: 'Audio bitrate in bits per second',
|
|
363
|
+
},
|
|
364
|
+
// Thumbnail
|
|
365
|
+
thumbnail: {
|
|
366
|
+
type: 'url',
|
|
367
|
+
optional: true,
|
|
368
|
+
description: 'URL to thumbnail image',
|
|
369
|
+
},
|
|
370
|
+
poster: {
|
|
371
|
+
type: 'url',
|
|
372
|
+
optional: true,
|
|
373
|
+
description: 'URL to poster image',
|
|
374
|
+
},
|
|
375
|
+
thumbnailTime: {
|
|
376
|
+
type: 'number',
|
|
377
|
+
optional: true,
|
|
378
|
+
description: 'Time in seconds for thumbnail generation',
|
|
379
|
+
},
|
|
380
|
+
// Audio properties
|
|
381
|
+
hasAudio: {
|
|
382
|
+
type: 'boolean',
|
|
383
|
+
optional: true,
|
|
384
|
+
description: 'Whether the video has an audio track',
|
|
385
|
+
},
|
|
386
|
+
audioChannels: {
|
|
387
|
+
type: 'number',
|
|
388
|
+
optional: true,
|
|
389
|
+
description: 'Number of audio channels',
|
|
390
|
+
},
|
|
391
|
+
sampleRate: {
|
|
392
|
+
type: 'number',
|
|
393
|
+
optional: true,
|
|
394
|
+
description: 'Audio sample rate in Hz',
|
|
395
|
+
},
|
|
396
|
+
// Recording metadata
|
|
397
|
+
recordedAt: {
|
|
398
|
+
type: 'datetime',
|
|
399
|
+
optional: true,
|
|
400
|
+
description: 'When the video was recorded',
|
|
401
|
+
},
|
|
402
|
+
location: {
|
|
403
|
+
type: 'json',
|
|
404
|
+
optional: true,
|
|
405
|
+
description: 'GPS coordinates where recorded',
|
|
406
|
+
},
|
|
407
|
+
camera: {
|
|
408
|
+
type: 'string',
|
|
409
|
+
optional: true,
|
|
410
|
+
description: 'Camera or device used',
|
|
411
|
+
},
|
|
412
|
+
// Organization
|
|
413
|
+
tags: {
|
|
414
|
+
type: 'string',
|
|
415
|
+
array: true,
|
|
416
|
+
optional: true,
|
|
417
|
+
description: 'Tags for categorization',
|
|
418
|
+
},
|
|
419
|
+
keywords: {
|
|
420
|
+
type: 'string',
|
|
421
|
+
array: true,
|
|
422
|
+
optional: true,
|
|
423
|
+
description: 'Search keywords',
|
|
424
|
+
},
|
|
425
|
+
chapters: {
|
|
426
|
+
type: 'json',
|
|
427
|
+
array: true,
|
|
428
|
+
optional: true,
|
|
429
|
+
description: 'Video chapters with timestamps',
|
|
430
|
+
},
|
|
431
|
+
// Processing status
|
|
432
|
+
status: {
|
|
433
|
+
type: 'string',
|
|
434
|
+
optional: true,
|
|
435
|
+
description: 'Processing status: uploading, processing, ready, error',
|
|
436
|
+
examples: ['uploading', 'processing', 'ready', 'error'],
|
|
437
|
+
},
|
|
438
|
+
versions: {
|
|
439
|
+
type: 'json',
|
|
440
|
+
optional: true,
|
|
441
|
+
description: 'Different quality versions of the video',
|
|
442
|
+
},
|
|
443
|
+
},
|
|
444
|
+
relationships: {
|
|
445
|
+
album: {
|
|
446
|
+
type: 'Album',
|
|
447
|
+
required: false,
|
|
448
|
+
description: 'Album this video belongs to',
|
|
449
|
+
},
|
|
450
|
+
library: {
|
|
451
|
+
type: 'MediaLibrary',
|
|
452
|
+
required: false,
|
|
453
|
+
description: 'Media library containing this video',
|
|
454
|
+
},
|
|
455
|
+
transcript: {
|
|
456
|
+
type: 'Transcript',
|
|
457
|
+
required: false,
|
|
458
|
+
description: 'Transcription of the audio',
|
|
459
|
+
},
|
|
460
|
+
captions: {
|
|
461
|
+
type: 'Caption[]',
|
|
462
|
+
description: 'Subtitle/caption tracks',
|
|
463
|
+
},
|
|
464
|
+
creator: {
|
|
465
|
+
type: 'Contact',
|
|
466
|
+
required: false,
|
|
467
|
+
description: 'Person who created the video',
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
actions: [
|
|
471
|
+
'upload',
|
|
472
|
+
'download',
|
|
473
|
+
'play',
|
|
474
|
+
'pause',
|
|
475
|
+
'seek',
|
|
476
|
+
'edit',
|
|
477
|
+
'trim',
|
|
478
|
+
'crop',
|
|
479
|
+
'rotate',
|
|
480
|
+
'merge',
|
|
481
|
+
'split',
|
|
482
|
+
'transcode',
|
|
483
|
+
'compress',
|
|
484
|
+
'extract',
|
|
485
|
+
'mute',
|
|
486
|
+
'addAudio',
|
|
487
|
+
'addSubtitles',
|
|
488
|
+
'tag',
|
|
489
|
+
'share',
|
|
490
|
+
'delete',
|
|
491
|
+
'restore',
|
|
492
|
+
'duplicate',
|
|
493
|
+
'addToAlbum',
|
|
494
|
+
'removeFromAlbum',
|
|
495
|
+
'generateThumbnail',
|
|
496
|
+
'transcribe',
|
|
497
|
+
],
|
|
498
|
+
events: [
|
|
499
|
+
'uploaded',
|
|
500
|
+
'downloaded',
|
|
501
|
+
'played',
|
|
502
|
+
'paused',
|
|
503
|
+
'seeked',
|
|
504
|
+
'edited',
|
|
505
|
+
'trimmed',
|
|
506
|
+
'cropped',
|
|
507
|
+
'rotated',
|
|
508
|
+
'merged',
|
|
509
|
+
'split',
|
|
510
|
+
'transcoded',
|
|
511
|
+
'compressed',
|
|
512
|
+
'extracted',
|
|
513
|
+
'muted',
|
|
514
|
+
'audioAdded',
|
|
515
|
+
'subtitlesAdded',
|
|
516
|
+
'tagged',
|
|
517
|
+
'shared',
|
|
518
|
+
'deleted',
|
|
519
|
+
'restored',
|
|
520
|
+
'duplicated',
|
|
521
|
+
'addedToAlbum',
|
|
522
|
+
'removedFromAlbum',
|
|
523
|
+
'thumbnailGenerated',
|
|
524
|
+
'transcribed',
|
|
525
|
+
'processingStarted',
|
|
526
|
+
'processingCompleted',
|
|
527
|
+
'processingFailed',
|
|
528
|
+
],
|
|
529
|
+
};
|
|
530
|
+
// =============================================================================
|
|
531
|
+
// Audio
|
|
532
|
+
// =============================================================================
|
|
533
|
+
/**
|
|
534
|
+
* Audio file entity
|
|
535
|
+
*
|
|
536
|
+
* Represents an audio file with duration, format, and metadata
|
|
537
|
+
*/
|
|
538
|
+
export const Audio = {
|
|
539
|
+
singular: 'audio',
|
|
540
|
+
plural: 'audio files',
|
|
541
|
+
description: 'An audio file with duration, format, and metadata',
|
|
542
|
+
properties: {
|
|
543
|
+
// Basic info
|
|
544
|
+
filename: {
|
|
545
|
+
type: 'string',
|
|
546
|
+
description: 'Original filename',
|
|
547
|
+
},
|
|
548
|
+
url: {
|
|
549
|
+
type: 'url',
|
|
550
|
+
description: 'URL to access the audio',
|
|
551
|
+
},
|
|
552
|
+
title: {
|
|
553
|
+
type: 'string',
|
|
554
|
+
optional: true,
|
|
555
|
+
description: 'Audio title or track name',
|
|
556
|
+
},
|
|
557
|
+
description: {
|
|
558
|
+
type: 'string',
|
|
559
|
+
optional: true,
|
|
560
|
+
description: 'Audio description',
|
|
561
|
+
},
|
|
562
|
+
// Format & technical
|
|
563
|
+
format: {
|
|
564
|
+
type: 'string',
|
|
565
|
+
description: 'Audio format: mp3, wav, aac, flac, ogg, m4a, wma, opus',
|
|
566
|
+
examples: ['mp3', 'wav', 'aac', 'flac', 'ogg', 'm4a', 'wma', 'opus'],
|
|
567
|
+
},
|
|
568
|
+
mimeType: {
|
|
569
|
+
type: 'string',
|
|
570
|
+
description: 'MIME type of the audio',
|
|
571
|
+
},
|
|
572
|
+
codec: {
|
|
573
|
+
type: 'string',
|
|
574
|
+
optional: true,
|
|
575
|
+
description: 'Audio codec',
|
|
576
|
+
},
|
|
577
|
+
// Duration
|
|
578
|
+
duration: {
|
|
579
|
+
type: 'number',
|
|
580
|
+
description: 'Duration in seconds',
|
|
581
|
+
},
|
|
582
|
+
// Audio properties
|
|
583
|
+
bitrate: {
|
|
584
|
+
type: 'number',
|
|
585
|
+
optional: true,
|
|
586
|
+
description: 'Bitrate in bits per second',
|
|
587
|
+
},
|
|
588
|
+
sampleRate: {
|
|
589
|
+
type: 'number',
|
|
590
|
+
optional: true,
|
|
591
|
+
description: 'Sample rate in Hz (e.g., 44100, 48000)',
|
|
592
|
+
},
|
|
593
|
+
channels: {
|
|
594
|
+
type: 'number',
|
|
595
|
+
optional: true,
|
|
596
|
+
description: 'Number of audio channels: 1 (mono), 2 (stereo)',
|
|
597
|
+
},
|
|
598
|
+
bitDepth: {
|
|
599
|
+
type: 'number',
|
|
600
|
+
optional: true,
|
|
601
|
+
description: 'Bit depth (e.g., 16, 24)',
|
|
602
|
+
},
|
|
603
|
+
// File properties
|
|
604
|
+
size: {
|
|
605
|
+
type: 'number',
|
|
606
|
+
description: 'File size in bytes',
|
|
607
|
+
},
|
|
608
|
+
// Music metadata
|
|
609
|
+
artist: {
|
|
610
|
+
type: 'string',
|
|
611
|
+
optional: true,
|
|
612
|
+
description: 'Artist or performer',
|
|
613
|
+
},
|
|
614
|
+
album: {
|
|
615
|
+
type: 'string',
|
|
616
|
+
optional: true,
|
|
617
|
+
description: 'Album name',
|
|
618
|
+
},
|
|
619
|
+
albumArtist: {
|
|
620
|
+
type: 'string',
|
|
621
|
+
optional: true,
|
|
622
|
+
description: 'Album artist',
|
|
623
|
+
},
|
|
624
|
+
genre: {
|
|
625
|
+
type: 'string',
|
|
626
|
+
optional: true,
|
|
627
|
+
description: 'Music genre',
|
|
628
|
+
},
|
|
629
|
+
year: {
|
|
630
|
+
type: 'number',
|
|
631
|
+
optional: true,
|
|
632
|
+
description: 'Release year',
|
|
633
|
+
},
|
|
634
|
+
trackNumber: {
|
|
635
|
+
type: 'number',
|
|
636
|
+
optional: true,
|
|
637
|
+
description: 'Track number in album',
|
|
638
|
+
},
|
|
639
|
+
trackCount: {
|
|
640
|
+
type: 'number',
|
|
641
|
+
optional: true,
|
|
642
|
+
description: 'Total tracks in album',
|
|
643
|
+
},
|
|
644
|
+
discNumber: {
|
|
645
|
+
type: 'number',
|
|
646
|
+
optional: true,
|
|
647
|
+
description: 'Disc number for multi-disc albums',
|
|
648
|
+
},
|
|
649
|
+
composer: {
|
|
650
|
+
type: 'string',
|
|
651
|
+
optional: true,
|
|
652
|
+
description: 'Composer name',
|
|
653
|
+
},
|
|
654
|
+
publisher: {
|
|
655
|
+
type: 'string',
|
|
656
|
+
optional: true,
|
|
657
|
+
description: 'Publisher or record label',
|
|
658
|
+
},
|
|
659
|
+
copyright: {
|
|
660
|
+
type: 'string',
|
|
661
|
+
optional: true,
|
|
662
|
+
description: 'Copyright information',
|
|
663
|
+
},
|
|
664
|
+
isrc: {
|
|
665
|
+
type: 'string',
|
|
666
|
+
optional: true,
|
|
667
|
+
description: 'International Standard Recording Code',
|
|
668
|
+
},
|
|
669
|
+
// Cover art
|
|
670
|
+
coverArt: {
|
|
671
|
+
type: 'url',
|
|
672
|
+
optional: true,
|
|
673
|
+
description: 'URL to album cover art',
|
|
674
|
+
},
|
|
675
|
+
// Recording metadata
|
|
676
|
+
recordedAt: {
|
|
677
|
+
type: 'datetime',
|
|
678
|
+
optional: true,
|
|
679
|
+
description: 'When the audio was recorded',
|
|
680
|
+
},
|
|
681
|
+
// Organization
|
|
682
|
+
tags: {
|
|
683
|
+
type: 'string',
|
|
684
|
+
array: true,
|
|
685
|
+
optional: true,
|
|
686
|
+
description: 'Tags for categorization',
|
|
687
|
+
},
|
|
688
|
+
keywords: {
|
|
689
|
+
type: 'string',
|
|
690
|
+
array: true,
|
|
691
|
+
optional: true,
|
|
692
|
+
description: 'Search keywords',
|
|
693
|
+
},
|
|
694
|
+
// Lyrics & transcription
|
|
695
|
+
lyrics: {
|
|
696
|
+
type: 'string',
|
|
697
|
+
optional: true,
|
|
698
|
+
description: 'Song lyrics',
|
|
699
|
+
},
|
|
700
|
+
hasLyrics: {
|
|
701
|
+
type: 'boolean',
|
|
702
|
+
optional: true,
|
|
703
|
+
description: 'Whether lyrics are available',
|
|
704
|
+
},
|
|
705
|
+
},
|
|
706
|
+
relationships: {
|
|
707
|
+
library: {
|
|
708
|
+
type: 'MediaLibrary',
|
|
709
|
+
required: false,
|
|
710
|
+
description: 'Media library containing this audio',
|
|
711
|
+
},
|
|
712
|
+
transcript: {
|
|
713
|
+
type: 'Transcript',
|
|
714
|
+
required: false,
|
|
715
|
+
description: 'Transcription of the audio',
|
|
716
|
+
},
|
|
717
|
+
artist: {
|
|
718
|
+
type: 'Contact',
|
|
719
|
+
required: false,
|
|
720
|
+
description: 'The artist or performer',
|
|
721
|
+
},
|
|
722
|
+
},
|
|
723
|
+
actions: [
|
|
724
|
+
'upload',
|
|
725
|
+
'download',
|
|
726
|
+
'play',
|
|
727
|
+
'pause',
|
|
728
|
+
'seek',
|
|
729
|
+
'stop',
|
|
730
|
+
'edit',
|
|
731
|
+
'trim',
|
|
732
|
+
'normalize',
|
|
733
|
+
'fade',
|
|
734
|
+
'merge',
|
|
735
|
+
'split',
|
|
736
|
+
'convert',
|
|
737
|
+
'compress',
|
|
738
|
+
'tag',
|
|
739
|
+
'share',
|
|
740
|
+
'delete',
|
|
741
|
+
'restore',
|
|
742
|
+
'duplicate',
|
|
743
|
+
'transcribe',
|
|
744
|
+
'addLyrics',
|
|
745
|
+
],
|
|
746
|
+
events: [
|
|
747
|
+
'uploaded',
|
|
748
|
+
'downloaded',
|
|
749
|
+
'played',
|
|
750
|
+
'paused',
|
|
751
|
+
'seeked',
|
|
752
|
+
'stopped',
|
|
753
|
+
'edited',
|
|
754
|
+
'trimmed',
|
|
755
|
+
'normalized',
|
|
756
|
+
'faded',
|
|
757
|
+
'merged',
|
|
758
|
+
'split',
|
|
759
|
+
'converted',
|
|
760
|
+
'compressed',
|
|
761
|
+
'tagged',
|
|
762
|
+
'shared',
|
|
763
|
+
'deleted',
|
|
764
|
+
'restored',
|
|
765
|
+
'duplicated',
|
|
766
|
+
'transcribed',
|
|
767
|
+
'lyricsAdded',
|
|
768
|
+
],
|
|
769
|
+
};
|
|
770
|
+
// =============================================================================
|
|
771
|
+
// Screenshot
|
|
772
|
+
// =============================================================================
|
|
773
|
+
/**
|
|
774
|
+
* Screenshot capture entity
|
|
775
|
+
*
|
|
776
|
+
* Represents a screenshot with annotations and context
|
|
777
|
+
*/
|
|
778
|
+
export const Screenshot = {
|
|
779
|
+
singular: 'screenshot',
|
|
780
|
+
plural: 'screenshots',
|
|
781
|
+
description: 'A screenshot capture with annotations and context',
|
|
782
|
+
properties: {
|
|
783
|
+
// Basic info
|
|
784
|
+
filename: {
|
|
785
|
+
type: 'string',
|
|
786
|
+
description: 'Original filename',
|
|
787
|
+
},
|
|
788
|
+
url: {
|
|
789
|
+
type: 'url',
|
|
790
|
+
description: 'URL to access the screenshot',
|
|
791
|
+
},
|
|
792
|
+
title: {
|
|
793
|
+
type: 'string',
|
|
794
|
+
optional: true,
|
|
795
|
+
description: 'Screenshot title or caption',
|
|
796
|
+
},
|
|
797
|
+
description: {
|
|
798
|
+
type: 'string',
|
|
799
|
+
optional: true,
|
|
800
|
+
description: 'Description of what the screenshot shows',
|
|
801
|
+
},
|
|
802
|
+
// Format & dimensions
|
|
803
|
+
format: {
|
|
804
|
+
type: 'string',
|
|
805
|
+
description: 'Image format: png, jpg, jpeg',
|
|
806
|
+
examples: ['png', 'jpg', 'jpeg'],
|
|
807
|
+
},
|
|
808
|
+
width: {
|
|
809
|
+
type: 'number',
|
|
810
|
+
description: 'Width in pixels',
|
|
811
|
+
},
|
|
812
|
+
height: {
|
|
813
|
+
type: 'number',
|
|
814
|
+
description: 'Height in pixels',
|
|
815
|
+
},
|
|
816
|
+
// File properties
|
|
817
|
+
size: {
|
|
818
|
+
type: 'number',
|
|
819
|
+
description: 'File size in bytes',
|
|
820
|
+
},
|
|
821
|
+
// Capture context
|
|
822
|
+
capturedAt: {
|
|
823
|
+
type: 'datetime',
|
|
824
|
+
description: 'When the screenshot was taken',
|
|
825
|
+
},
|
|
826
|
+
source: {
|
|
827
|
+
type: 'string',
|
|
828
|
+
optional: true,
|
|
829
|
+
description: 'Source application or window',
|
|
830
|
+
},
|
|
831
|
+
sourceUrl: {
|
|
832
|
+
type: 'url',
|
|
833
|
+
optional: true,
|
|
834
|
+
description: 'URL if screenshot is of a webpage',
|
|
835
|
+
},
|
|
836
|
+
device: {
|
|
837
|
+
type: 'string',
|
|
838
|
+
optional: true,
|
|
839
|
+
description: 'Device where screenshot was taken',
|
|
840
|
+
},
|
|
841
|
+
displayName: {
|
|
842
|
+
type: 'string',
|
|
843
|
+
optional: true,
|
|
844
|
+
description: 'Display or monitor name',
|
|
845
|
+
},
|
|
846
|
+
// Capture type
|
|
847
|
+
captureType: {
|
|
848
|
+
type: 'string',
|
|
849
|
+
optional: true,
|
|
850
|
+
description: 'Capture type: fullscreen, window, region, scrolling',
|
|
851
|
+
examples: ['fullscreen', 'window', 'region', 'scrolling'],
|
|
852
|
+
},
|
|
853
|
+
// Annotations
|
|
854
|
+
hasAnnotations: {
|
|
855
|
+
type: 'boolean',
|
|
856
|
+
optional: true,
|
|
857
|
+
description: 'Whether the screenshot has annotations',
|
|
858
|
+
},
|
|
859
|
+
annotations: {
|
|
860
|
+
type: 'json',
|
|
861
|
+
array: true,
|
|
862
|
+
optional: true,
|
|
863
|
+
description: 'Annotations (arrows, text, shapes, highlights)',
|
|
864
|
+
},
|
|
865
|
+
// Organization
|
|
866
|
+
tags: {
|
|
867
|
+
type: 'string',
|
|
868
|
+
array: true,
|
|
869
|
+
optional: true,
|
|
870
|
+
description: 'Tags for categorization',
|
|
871
|
+
},
|
|
872
|
+
keywords: {
|
|
873
|
+
type: 'string',
|
|
874
|
+
array: true,
|
|
875
|
+
optional: true,
|
|
876
|
+
description: 'Search keywords',
|
|
877
|
+
},
|
|
878
|
+
// Thumbnail
|
|
879
|
+
thumbnail: {
|
|
880
|
+
type: 'url',
|
|
881
|
+
optional: true,
|
|
882
|
+
description: 'URL to thumbnail version',
|
|
883
|
+
},
|
|
884
|
+
// OCR & text extraction
|
|
885
|
+
extractedText: {
|
|
886
|
+
type: 'string',
|
|
887
|
+
optional: true,
|
|
888
|
+
description: 'Text extracted from screenshot via OCR',
|
|
889
|
+
},
|
|
890
|
+
hasText: {
|
|
891
|
+
type: 'boolean',
|
|
892
|
+
optional: true,
|
|
893
|
+
description: 'Whether text was detected in the screenshot',
|
|
894
|
+
},
|
|
895
|
+
},
|
|
896
|
+
relationships: {
|
|
897
|
+
library: {
|
|
898
|
+
type: 'MediaLibrary',
|
|
899
|
+
required: false,
|
|
900
|
+
description: 'Media library containing this screenshot',
|
|
901
|
+
},
|
|
902
|
+
capturedBy: {
|
|
903
|
+
type: 'Contact',
|
|
904
|
+
required: false,
|
|
905
|
+
description: 'Person who took the screenshot',
|
|
906
|
+
},
|
|
907
|
+
},
|
|
908
|
+
actions: [
|
|
909
|
+
'capture',
|
|
910
|
+
'upload',
|
|
911
|
+
'download',
|
|
912
|
+
'view',
|
|
913
|
+
'edit',
|
|
914
|
+
'annotate',
|
|
915
|
+
'crop',
|
|
916
|
+
'resize',
|
|
917
|
+
'blur',
|
|
918
|
+
'highlight',
|
|
919
|
+
'addText',
|
|
920
|
+
'addArrow',
|
|
921
|
+
'addShape',
|
|
922
|
+
'redact',
|
|
923
|
+
'ocr',
|
|
924
|
+
'tag',
|
|
925
|
+
'share',
|
|
926
|
+
'delete',
|
|
927
|
+
'restore',
|
|
928
|
+
'duplicate',
|
|
929
|
+
],
|
|
930
|
+
events: [
|
|
931
|
+
'captured',
|
|
932
|
+
'uploaded',
|
|
933
|
+
'downloaded',
|
|
934
|
+
'viewed',
|
|
935
|
+
'edited',
|
|
936
|
+
'annotated',
|
|
937
|
+
'cropped',
|
|
938
|
+
'resized',
|
|
939
|
+
'blurred',
|
|
940
|
+
'highlighted',
|
|
941
|
+
'textAdded',
|
|
942
|
+
'arrowAdded',
|
|
943
|
+
'shapeAdded',
|
|
944
|
+
'redacted',
|
|
945
|
+
'ocrProcessed',
|
|
946
|
+
'tagged',
|
|
947
|
+
'shared',
|
|
948
|
+
'deleted',
|
|
949
|
+
'restored',
|
|
950
|
+
'duplicated',
|
|
951
|
+
],
|
|
952
|
+
};
|
|
953
|
+
// =============================================================================
|
|
954
|
+
// Album
|
|
955
|
+
// =============================================================================
|
|
956
|
+
/**
|
|
957
|
+
* Album/collection entity
|
|
958
|
+
*
|
|
959
|
+
* Represents a collection of media items (images, videos)
|
|
960
|
+
*/
|
|
961
|
+
export const Album = {
|
|
962
|
+
singular: 'album',
|
|
963
|
+
plural: 'albums',
|
|
964
|
+
description: 'A collection of media items (images, videos)',
|
|
965
|
+
properties: {
|
|
966
|
+
// Basic info
|
|
967
|
+
name: {
|
|
968
|
+
type: 'string',
|
|
969
|
+
description: 'Album name',
|
|
970
|
+
},
|
|
971
|
+
description: {
|
|
972
|
+
type: 'string',
|
|
973
|
+
optional: true,
|
|
974
|
+
description: 'Album description',
|
|
975
|
+
},
|
|
976
|
+
slug: {
|
|
977
|
+
type: 'string',
|
|
978
|
+
optional: true,
|
|
979
|
+
description: 'URL-friendly slug',
|
|
980
|
+
},
|
|
981
|
+
// Cover
|
|
982
|
+
coverImage: {
|
|
983
|
+
type: 'url',
|
|
984
|
+
optional: true,
|
|
985
|
+
description: 'URL to cover/thumbnail image',
|
|
986
|
+
},
|
|
987
|
+
// Counts
|
|
988
|
+
itemCount: {
|
|
989
|
+
type: 'number',
|
|
990
|
+
optional: true,
|
|
991
|
+
description: 'Number of items in the album',
|
|
992
|
+
},
|
|
993
|
+
imageCount: {
|
|
994
|
+
type: 'number',
|
|
995
|
+
optional: true,
|
|
996
|
+
description: 'Number of images',
|
|
997
|
+
},
|
|
998
|
+
videoCount: {
|
|
999
|
+
type: 'number',
|
|
1000
|
+
optional: true,
|
|
1001
|
+
description: 'Number of videos',
|
|
1002
|
+
},
|
|
1003
|
+
// Dates
|
|
1004
|
+
startDate: {
|
|
1005
|
+
type: 'datetime',
|
|
1006
|
+
optional: true,
|
|
1007
|
+
description: 'Start date for event/date range albums',
|
|
1008
|
+
},
|
|
1009
|
+
endDate: {
|
|
1010
|
+
type: 'datetime',
|
|
1011
|
+
optional: true,
|
|
1012
|
+
description: 'End date for event/date range albums',
|
|
1013
|
+
},
|
|
1014
|
+
// Organization
|
|
1015
|
+
albumType: {
|
|
1016
|
+
type: 'string',
|
|
1017
|
+
optional: true,
|
|
1018
|
+
description: 'Album type: manual, smart, event, date, location',
|
|
1019
|
+
examples: ['manual', 'smart', 'event', 'date', 'location'],
|
|
1020
|
+
},
|
|
1021
|
+
sortOrder: {
|
|
1022
|
+
type: 'string',
|
|
1023
|
+
optional: true,
|
|
1024
|
+
description: 'How items are sorted: date, name, manual',
|
|
1025
|
+
examples: ['date-asc', 'date-desc', 'name-asc', 'name-desc', 'manual'],
|
|
1026
|
+
},
|
|
1027
|
+
tags: {
|
|
1028
|
+
type: 'string',
|
|
1029
|
+
array: true,
|
|
1030
|
+
optional: true,
|
|
1031
|
+
description: 'Album tags',
|
|
1032
|
+
},
|
|
1033
|
+
// Smart album criteria
|
|
1034
|
+
smartCriteria: {
|
|
1035
|
+
type: 'json',
|
|
1036
|
+
optional: true,
|
|
1037
|
+
description: 'Criteria for smart/dynamic albums',
|
|
1038
|
+
},
|
|
1039
|
+
// Privacy & sharing
|
|
1040
|
+
visibility: {
|
|
1041
|
+
type: 'string',
|
|
1042
|
+
optional: true,
|
|
1043
|
+
description: 'Album visibility: private, shared, public',
|
|
1044
|
+
examples: ['private', 'shared', 'public'],
|
|
1045
|
+
},
|
|
1046
|
+
shareUrl: {
|
|
1047
|
+
type: 'url',
|
|
1048
|
+
optional: true,
|
|
1049
|
+
description: 'Public sharing URL',
|
|
1050
|
+
},
|
|
1051
|
+
password: {
|
|
1052
|
+
type: 'string',
|
|
1053
|
+
optional: true,
|
|
1054
|
+
description: 'Password for protected albums',
|
|
1055
|
+
},
|
|
1056
|
+
// Location
|
|
1057
|
+
location: {
|
|
1058
|
+
type: 'json',
|
|
1059
|
+
optional: true,
|
|
1060
|
+
description: 'Location associated with the album',
|
|
1061
|
+
},
|
|
1062
|
+
},
|
|
1063
|
+
relationships: {
|
|
1064
|
+
images: {
|
|
1065
|
+
type: 'Image[]',
|
|
1066
|
+
description: 'Images in this album',
|
|
1067
|
+
},
|
|
1068
|
+
videos: {
|
|
1069
|
+
type: 'Video[]',
|
|
1070
|
+
description: 'Videos in this album',
|
|
1071
|
+
},
|
|
1072
|
+
library: {
|
|
1073
|
+
type: 'MediaLibrary',
|
|
1074
|
+
required: false,
|
|
1075
|
+
description: 'Media library containing this album',
|
|
1076
|
+
},
|
|
1077
|
+
owner: {
|
|
1078
|
+
type: 'Contact',
|
|
1079
|
+
description: 'Album owner/creator',
|
|
1080
|
+
},
|
|
1081
|
+
collaborators: {
|
|
1082
|
+
type: 'Contact[]',
|
|
1083
|
+
description: 'People with access to the album',
|
|
1084
|
+
},
|
|
1085
|
+
},
|
|
1086
|
+
actions: [
|
|
1087
|
+
'create',
|
|
1088
|
+
'update',
|
|
1089
|
+
'delete',
|
|
1090
|
+
'rename',
|
|
1091
|
+
'addMedia',
|
|
1092
|
+
'removeMedia',
|
|
1093
|
+
'reorder',
|
|
1094
|
+
'sort',
|
|
1095
|
+
'setCover',
|
|
1096
|
+
'share',
|
|
1097
|
+
'unshare',
|
|
1098
|
+
'export',
|
|
1099
|
+
'duplicate',
|
|
1100
|
+
'merge',
|
|
1101
|
+
'split',
|
|
1102
|
+
],
|
|
1103
|
+
events: [
|
|
1104
|
+
'created',
|
|
1105
|
+
'updated',
|
|
1106
|
+
'deleted',
|
|
1107
|
+
'renamed',
|
|
1108
|
+
'mediaAdded',
|
|
1109
|
+
'mediaRemoved',
|
|
1110
|
+
'reordered',
|
|
1111
|
+
'sorted',
|
|
1112
|
+
'coverChanged',
|
|
1113
|
+
'shared',
|
|
1114
|
+
'unshared',
|
|
1115
|
+
'exported',
|
|
1116
|
+
'duplicated',
|
|
1117
|
+
'merged',
|
|
1118
|
+
'split',
|
|
1119
|
+
],
|
|
1120
|
+
};
|
|
1121
|
+
// =============================================================================
|
|
1122
|
+
// MediaLibrary
|
|
1123
|
+
// =============================================================================
|
|
1124
|
+
/**
|
|
1125
|
+
* Media library entity
|
|
1126
|
+
*
|
|
1127
|
+
* Represents a media asset management system/library
|
|
1128
|
+
*/
|
|
1129
|
+
export const MediaLibrary = {
|
|
1130
|
+
singular: 'media library',
|
|
1131
|
+
plural: 'media libraries',
|
|
1132
|
+
description: 'A media asset management system containing organized media',
|
|
1133
|
+
properties: {
|
|
1134
|
+
// Basic info
|
|
1135
|
+
name: {
|
|
1136
|
+
type: 'string',
|
|
1137
|
+
description: 'Library name',
|
|
1138
|
+
},
|
|
1139
|
+
description: {
|
|
1140
|
+
type: 'string',
|
|
1141
|
+
optional: true,
|
|
1142
|
+
description: 'Library description',
|
|
1143
|
+
},
|
|
1144
|
+
// Storage
|
|
1145
|
+
storageLocation: {
|
|
1146
|
+
type: 'string',
|
|
1147
|
+
optional: true,
|
|
1148
|
+
description: 'Storage location or path',
|
|
1149
|
+
},
|
|
1150
|
+
storageProvider: {
|
|
1151
|
+
type: 'string',
|
|
1152
|
+
optional: true,
|
|
1153
|
+
description: 'Storage provider: local, s3, cloudinary, cloudflare',
|
|
1154
|
+
examples: ['local', 's3', 'cloudinary', 'cloudflare', 'gcs', 'azure'],
|
|
1155
|
+
},
|
|
1156
|
+
// Statistics
|
|
1157
|
+
totalItems: {
|
|
1158
|
+
type: 'number',
|
|
1159
|
+
optional: true,
|
|
1160
|
+
description: 'Total number of media items',
|
|
1161
|
+
},
|
|
1162
|
+
totalImages: {
|
|
1163
|
+
type: 'number',
|
|
1164
|
+
optional: true,
|
|
1165
|
+
description: 'Total number of images',
|
|
1166
|
+
},
|
|
1167
|
+
totalVideos: {
|
|
1168
|
+
type: 'number',
|
|
1169
|
+
optional: true,
|
|
1170
|
+
description: 'Total number of videos',
|
|
1171
|
+
},
|
|
1172
|
+
totalAudio: {
|
|
1173
|
+
type: 'number',
|
|
1174
|
+
optional: true,
|
|
1175
|
+
description: 'Total number of audio files',
|
|
1176
|
+
},
|
|
1177
|
+
totalSize: {
|
|
1178
|
+
type: 'number',
|
|
1179
|
+
optional: true,
|
|
1180
|
+
description: 'Total storage size in bytes',
|
|
1181
|
+
},
|
|
1182
|
+
albumCount: {
|
|
1183
|
+
type: 'number',
|
|
1184
|
+
optional: true,
|
|
1185
|
+
description: 'Number of albums',
|
|
1186
|
+
},
|
|
1187
|
+
// Organization
|
|
1188
|
+
organizationType: {
|
|
1189
|
+
type: 'string',
|
|
1190
|
+
optional: true,
|
|
1191
|
+
description: 'How media is organized: folders, tags, albums, flat',
|
|
1192
|
+
examples: ['folders', 'tags', 'albums', 'flat', 'hybrid'],
|
|
1193
|
+
},
|
|
1194
|
+
tags: {
|
|
1195
|
+
type: 'string',
|
|
1196
|
+
array: true,
|
|
1197
|
+
optional: true,
|
|
1198
|
+
description: 'Available tags in the library',
|
|
1199
|
+
},
|
|
1200
|
+
// Settings
|
|
1201
|
+
autoTag: {
|
|
1202
|
+
type: 'boolean',
|
|
1203
|
+
optional: true,
|
|
1204
|
+
description: 'Whether to automatically tag media',
|
|
1205
|
+
},
|
|
1206
|
+
autoOrganize: {
|
|
1207
|
+
type: 'boolean',
|
|
1208
|
+
optional: true,
|
|
1209
|
+
description: 'Whether to automatically organize media',
|
|
1210
|
+
},
|
|
1211
|
+
duplicateDetection: {
|
|
1212
|
+
type: 'boolean',
|
|
1213
|
+
optional: true,
|
|
1214
|
+
description: 'Whether to detect duplicate files',
|
|
1215
|
+
},
|
|
1216
|
+
faceRecognition: {
|
|
1217
|
+
type: 'boolean',
|
|
1218
|
+
optional: true,
|
|
1219
|
+
description: 'Whether face recognition is enabled',
|
|
1220
|
+
},
|
|
1221
|
+
// Access control
|
|
1222
|
+
visibility: {
|
|
1223
|
+
type: 'string',
|
|
1224
|
+
optional: true,
|
|
1225
|
+
description: 'Library visibility: private, team, public',
|
|
1226
|
+
examples: ['private', 'team', 'public'],
|
|
1227
|
+
},
|
|
1228
|
+
},
|
|
1229
|
+
relationships: {
|
|
1230
|
+
images: {
|
|
1231
|
+
type: 'Image[]',
|
|
1232
|
+
description: 'Images in this library',
|
|
1233
|
+
},
|
|
1234
|
+
videos: {
|
|
1235
|
+
type: 'Video[]',
|
|
1236
|
+
description: 'Videos in this library',
|
|
1237
|
+
},
|
|
1238
|
+
audio: {
|
|
1239
|
+
type: 'Audio[]',
|
|
1240
|
+
description: 'Audio files in this library',
|
|
1241
|
+
},
|
|
1242
|
+
albums: {
|
|
1243
|
+
type: 'Album[]',
|
|
1244
|
+
description: 'Albums in this library',
|
|
1245
|
+
},
|
|
1246
|
+
owner: {
|
|
1247
|
+
type: 'Contact',
|
|
1248
|
+
description: 'Library owner',
|
|
1249
|
+
},
|
|
1250
|
+
members: {
|
|
1251
|
+
type: 'Contact[]',
|
|
1252
|
+
description: 'People with access to the library',
|
|
1253
|
+
},
|
|
1254
|
+
},
|
|
1255
|
+
actions: [
|
|
1256
|
+
'create',
|
|
1257
|
+
'configure',
|
|
1258
|
+
'import',
|
|
1259
|
+
'export',
|
|
1260
|
+
'scan',
|
|
1261
|
+
'index',
|
|
1262
|
+
'search',
|
|
1263
|
+
'backup',
|
|
1264
|
+
'restore',
|
|
1265
|
+
'optimize',
|
|
1266
|
+
'deduplicate',
|
|
1267
|
+
'share',
|
|
1268
|
+
'archive',
|
|
1269
|
+
'delete',
|
|
1270
|
+
],
|
|
1271
|
+
events: [
|
|
1272
|
+
'created',
|
|
1273
|
+
'configured',
|
|
1274
|
+
'imported',
|
|
1275
|
+
'exported',
|
|
1276
|
+
'scanned',
|
|
1277
|
+
'indexed',
|
|
1278
|
+
'searched',
|
|
1279
|
+
'backedUp',
|
|
1280
|
+
'restored',
|
|
1281
|
+
'optimized',
|
|
1282
|
+
'deduplicated',
|
|
1283
|
+
'shared',
|
|
1284
|
+
'archived',
|
|
1285
|
+
'deleted',
|
|
1286
|
+
],
|
|
1287
|
+
};
|
|
1288
|
+
// =============================================================================
|
|
1289
|
+
// Transcript
|
|
1290
|
+
// =============================================================================
|
|
1291
|
+
/**
|
|
1292
|
+
* Transcript entity
|
|
1293
|
+
*
|
|
1294
|
+
* Represents a transcription of audio or video content
|
|
1295
|
+
*/
|
|
1296
|
+
export const Transcript = {
|
|
1297
|
+
singular: 'transcript',
|
|
1298
|
+
plural: 'transcripts',
|
|
1299
|
+
description: 'A transcription of audio or video content',
|
|
1300
|
+
properties: {
|
|
1301
|
+
// Basic info
|
|
1302
|
+
text: {
|
|
1303
|
+
type: 'string',
|
|
1304
|
+
description: 'Full transcript text',
|
|
1305
|
+
},
|
|
1306
|
+
title: {
|
|
1307
|
+
type: 'string',
|
|
1308
|
+
optional: true,
|
|
1309
|
+
description: 'Transcript title',
|
|
1310
|
+
},
|
|
1311
|
+
// Format
|
|
1312
|
+
format: {
|
|
1313
|
+
type: 'string',
|
|
1314
|
+
optional: true,
|
|
1315
|
+
description: 'Transcript format: plain, srt, vtt, json',
|
|
1316
|
+
examples: ['plain', 'srt', 'vtt', 'json'],
|
|
1317
|
+
},
|
|
1318
|
+
// Language
|
|
1319
|
+
language: {
|
|
1320
|
+
type: 'string',
|
|
1321
|
+
description: 'Language code (e.g., en, es, fr)',
|
|
1322
|
+
},
|
|
1323
|
+
languageName: {
|
|
1324
|
+
type: 'string',
|
|
1325
|
+
optional: true,
|
|
1326
|
+
description: 'Language name (e.g., English, Spanish)',
|
|
1327
|
+
},
|
|
1328
|
+
// Timing
|
|
1329
|
+
duration: {
|
|
1330
|
+
type: 'number',
|
|
1331
|
+
optional: true,
|
|
1332
|
+
description: 'Duration of the transcribed content in seconds',
|
|
1333
|
+
},
|
|
1334
|
+
// Segments
|
|
1335
|
+
segments: {
|
|
1336
|
+
type: 'json',
|
|
1337
|
+
array: true,
|
|
1338
|
+
optional: true,
|
|
1339
|
+
description: 'Timed segments with start, end, and text',
|
|
1340
|
+
},
|
|
1341
|
+
wordTimestamps: {
|
|
1342
|
+
type: 'json',
|
|
1343
|
+
array: true,
|
|
1344
|
+
optional: true,
|
|
1345
|
+
description: 'Word-level timestamps',
|
|
1346
|
+
},
|
|
1347
|
+
// Speaker identification
|
|
1348
|
+
hasSpeakers: {
|
|
1349
|
+
type: 'boolean',
|
|
1350
|
+
optional: true,
|
|
1351
|
+
description: 'Whether speakers are identified',
|
|
1352
|
+
},
|
|
1353
|
+
speakers: {
|
|
1354
|
+
type: 'json',
|
|
1355
|
+
array: true,
|
|
1356
|
+
optional: true,
|
|
1357
|
+
description: 'Speaker labels and segments',
|
|
1358
|
+
},
|
|
1359
|
+
speakerCount: {
|
|
1360
|
+
type: 'number',
|
|
1361
|
+
optional: true,
|
|
1362
|
+
description: 'Number of distinct speakers',
|
|
1363
|
+
},
|
|
1364
|
+
// Quality & confidence
|
|
1365
|
+
confidence: {
|
|
1366
|
+
type: 'number',
|
|
1367
|
+
optional: true,
|
|
1368
|
+
description: 'Overall transcription confidence score (0-1)',
|
|
1369
|
+
},
|
|
1370
|
+
quality: {
|
|
1371
|
+
type: 'string',
|
|
1372
|
+
optional: true,
|
|
1373
|
+
description: 'Transcript quality: low, medium, high',
|
|
1374
|
+
examples: ['low', 'medium', 'high'],
|
|
1375
|
+
},
|
|
1376
|
+
// Processing
|
|
1377
|
+
status: {
|
|
1378
|
+
type: 'string',
|
|
1379
|
+
optional: true,
|
|
1380
|
+
description: 'Processing status: pending, processing, completed, error',
|
|
1381
|
+
examples: ['pending', 'processing', 'completed', 'error'],
|
|
1382
|
+
},
|
|
1383
|
+
provider: {
|
|
1384
|
+
type: 'string',
|
|
1385
|
+
optional: true,
|
|
1386
|
+
description: 'Transcription provider: whisper, deepgram, rev, etc',
|
|
1387
|
+
examples: ['whisper', 'deepgram', 'assemblyai', 'rev', 'manual'],
|
|
1388
|
+
},
|
|
1389
|
+
method: {
|
|
1390
|
+
type: 'string',
|
|
1391
|
+
optional: true,
|
|
1392
|
+
description: 'Transcription method: automatic, manual, hybrid',
|
|
1393
|
+
examples: ['automatic', 'manual', 'hybrid'],
|
|
1394
|
+
},
|
|
1395
|
+
// Metadata
|
|
1396
|
+
wordCount: {
|
|
1397
|
+
type: 'number',
|
|
1398
|
+
optional: true,
|
|
1399
|
+
description: 'Total word count',
|
|
1400
|
+
},
|
|
1401
|
+
edited: {
|
|
1402
|
+
type: 'boolean',
|
|
1403
|
+
optional: true,
|
|
1404
|
+
description: 'Whether the transcript has been edited',
|
|
1405
|
+
},
|
|
1406
|
+
},
|
|
1407
|
+
relationships: {
|
|
1408
|
+
video: {
|
|
1409
|
+
type: 'Video',
|
|
1410
|
+
required: false,
|
|
1411
|
+
description: 'Video this is a transcript of',
|
|
1412
|
+
},
|
|
1413
|
+
audio: {
|
|
1414
|
+
type: 'Audio',
|
|
1415
|
+
required: false,
|
|
1416
|
+
description: 'Audio this is a transcript of',
|
|
1417
|
+
},
|
|
1418
|
+
editor: {
|
|
1419
|
+
type: 'Contact',
|
|
1420
|
+
required: false,
|
|
1421
|
+
description: 'Person who edited the transcript',
|
|
1422
|
+
},
|
|
1423
|
+
},
|
|
1424
|
+
actions: [
|
|
1425
|
+
'generate',
|
|
1426
|
+
'edit',
|
|
1427
|
+
'format',
|
|
1428
|
+
'export',
|
|
1429
|
+
'search',
|
|
1430
|
+
'translate',
|
|
1431
|
+
'identify',
|
|
1432
|
+
'timestamp',
|
|
1433
|
+
'sync',
|
|
1434
|
+
'review',
|
|
1435
|
+
'approve',
|
|
1436
|
+
'delete',
|
|
1437
|
+
],
|
|
1438
|
+
events: [
|
|
1439
|
+
'generated',
|
|
1440
|
+
'edited',
|
|
1441
|
+
'formatted',
|
|
1442
|
+
'exported',
|
|
1443
|
+
'searched',
|
|
1444
|
+
'translated',
|
|
1445
|
+
'identified',
|
|
1446
|
+
'timestamped',
|
|
1447
|
+
'synced',
|
|
1448
|
+
'reviewed',
|
|
1449
|
+
'approved',
|
|
1450
|
+
'deleted',
|
|
1451
|
+
'processingStarted',
|
|
1452
|
+
'processingCompleted',
|
|
1453
|
+
'processingFailed',
|
|
1454
|
+
],
|
|
1455
|
+
};
|
|
1456
|
+
// =============================================================================
|
|
1457
|
+
// Caption
|
|
1458
|
+
// =============================================================================
|
|
1459
|
+
/**
|
|
1460
|
+
* Caption/subtitle entity
|
|
1461
|
+
*
|
|
1462
|
+
* Represents captions or subtitles for video content
|
|
1463
|
+
*/
|
|
1464
|
+
export const Caption = {
|
|
1465
|
+
singular: 'caption',
|
|
1466
|
+
plural: 'captions',
|
|
1467
|
+
description: 'Captions or subtitles for video content',
|
|
1468
|
+
properties: {
|
|
1469
|
+
// Basic info
|
|
1470
|
+
label: {
|
|
1471
|
+
type: 'string',
|
|
1472
|
+
description: 'Caption track label (e.g., English, Spanish, English CC)',
|
|
1473
|
+
},
|
|
1474
|
+
// Language
|
|
1475
|
+
language: {
|
|
1476
|
+
type: 'string',
|
|
1477
|
+
description: 'Language code (e.g., en, es, fr)',
|
|
1478
|
+
},
|
|
1479
|
+
languageName: {
|
|
1480
|
+
type: 'string',
|
|
1481
|
+
optional: true,
|
|
1482
|
+
description: 'Language name (e.g., English, Spanish)',
|
|
1483
|
+
},
|
|
1484
|
+
// Type
|
|
1485
|
+
kind: {
|
|
1486
|
+
type: 'string',
|
|
1487
|
+
description: 'Caption kind: subtitles, captions, descriptions',
|
|
1488
|
+
examples: ['subtitles', 'captions', 'descriptions'],
|
|
1489
|
+
},
|
|
1490
|
+
closedCaptions: {
|
|
1491
|
+
type: 'boolean',
|
|
1492
|
+
optional: true,
|
|
1493
|
+
description: 'Whether these are closed captions (CC)',
|
|
1494
|
+
},
|
|
1495
|
+
sdh: {
|
|
1496
|
+
type: 'boolean',
|
|
1497
|
+
optional: true,
|
|
1498
|
+
description: 'Whether these are SDH (Subtitles for Deaf and Hard of hearing)',
|
|
1499
|
+
},
|
|
1500
|
+
// Format
|
|
1501
|
+
format: {
|
|
1502
|
+
type: 'string',
|
|
1503
|
+
description: 'Caption format: vtt, srt, ass, scc',
|
|
1504
|
+
examples: ['vtt', 'srt', 'ass', 'scc', 'dfxp', 'ttml'],
|
|
1505
|
+
},
|
|
1506
|
+
url: {
|
|
1507
|
+
type: 'url',
|
|
1508
|
+
optional: true,
|
|
1509
|
+
description: 'URL to the caption file',
|
|
1510
|
+
},
|
|
1511
|
+
// Content
|
|
1512
|
+
content: {
|
|
1513
|
+
type: 'string',
|
|
1514
|
+
optional: true,
|
|
1515
|
+
description: 'Raw caption content',
|
|
1516
|
+
},
|
|
1517
|
+
cues: {
|
|
1518
|
+
type: 'json',
|
|
1519
|
+
array: true,
|
|
1520
|
+
optional: true,
|
|
1521
|
+
description: 'Caption cues with timing and text',
|
|
1522
|
+
},
|
|
1523
|
+
// Processing
|
|
1524
|
+
status: {
|
|
1525
|
+
type: 'string',
|
|
1526
|
+
optional: true,
|
|
1527
|
+
description: 'Processing status: pending, processing, ready, error',
|
|
1528
|
+
examples: ['pending', 'processing', 'ready', 'error'],
|
|
1529
|
+
},
|
|
1530
|
+
provider: {
|
|
1531
|
+
type: 'string',
|
|
1532
|
+
optional: true,
|
|
1533
|
+
description: 'Caption generation provider',
|
|
1534
|
+
},
|
|
1535
|
+
method: {
|
|
1536
|
+
type: 'string',
|
|
1537
|
+
optional: true,
|
|
1538
|
+
description: 'Caption method: automatic, manual, hybrid',
|
|
1539
|
+
examples: ['automatic', 'manual', 'hybrid'],
|
|
1540
|
+
},
|
|
1541
|
+
// Settings
|
|
1542
|
+
default: {
|
|
1543
|
+
type: 'boolean',
|
|
1544
|
+
optional: true,
|
|
1545
|
+
description: 'Whether this is the default caption track',
|
|
1546
|
+
},
|
|
1547
|
+
autoGenerated: {
|
|
1548
|
+
type: 'boolean',
|
|
1549
|
+
optional: true,
|
|
1550
|
+
description: 'Whether these captions were auto-generated',
|
|
1551
|
+
},
|
|
1552
|
+
edited: {
|
|
1553
|
+
type: 'boolean',
|
|
1554
|
+
optional: true,
|
|
1555
|
+
description: 'Whether the captions have been edited',
|
|
1556
|
+
},
|
|
1557
|
+
// Metadata
|
|
1558
|
+
cueCount: {
|
|
1559
|
+
type: 'number',
|
|
1560
|
+
optional: true,
|
|
1561
|
+
description: 'Number of caption cues',
|
|
1562
|
+
},
|
|
1563
|
+
},
|
|
1564
|
+
relationships: {
|
|
1565
|
+
video: {
|
|
1566
|
+
type: 'Video',
|
|
1567
|
+
description: 'Video these captions belong to',
|
|
1568
|
+
},
|
|
1569
|
+
transcript: {
|
|
1570
|
+
type: 'Transcript',
|
|
1571
|
+
required: false,
|
|
1572
|
+
description: 'Source transcript',
|
|
1573
|
+
},
|
|
1574
|
+
editor: {
|
|
1575
|
+
type: 'Contact',
|
|
1576
|
+
required: false,
|
|
1577
|
+
description: 'Person who edited the captions',
|
|
1578
|
+
},
|
|
1579
|
+
},
|
|
1580
|
+
actions: [
|
|
1581
|
+
'generate',
|
|
1582
|
+
'upload',
|
|
1583
|
+
'download',
|
|
1584
|
+
'edit',
|
|
1585
|
+
'sync',
|
|
1586
|
+
'translate',
|
|
1587
|
+
'export',
|
|
1588
|
+
'validate',
|
|
1589
|
+
'preview',
|
|
1590
|
+
'delete',
|
|
1591
|
+
'setDefault',
|
|
1592
|
+
],
|
|
1593
|
+
events: [
|
|
1594
|
+
'generated',
|
|
1595
|
+
'uploaded',
|
|
1596
|
+
'downloaded',
|
|
1597
|
+
'edited',
|
|
1598
|
+
'synced',
|
|
1599
|
+
'translated',
|
|
1600
|
+
'exported',
|
|
1601
|
+
'validated',
|
|
1602
|
+
'previewed',
|
|
1603
|
+
'deleted',
|
|
1604
|
+
'setAsDefault',
|
|
1605
|
+
'processingStarted',
|
|
1606
|
+
'processingCompleted',
|
|
1607
|
+
'processingFailed',
|
|
1608
|
+
],
|
|
1609
|
+
};
|
|
1610
|
+
// =============================================================================
|
|
1611
|
+
// Export all entities as a collection
|
|
1612
|
+
// =============================================================================
|
|
1613
|
+
/**
|
|
1614
|
+
* All media entity types
|
|
1615
|
+
*/
|
|
1616
|
+
export const MediaEntities = {
|
|
1617
|
+
Image,
|
|
1618
|
+
Video,
|
|
1619
|
+
Audio,
|
|
1620
|
+
Screenshot,
|
|
1621
|
+
Album,
|
|
1622
|
+
MediaLibrary,
|
|
1623
|
+
Transcript,
|
|
1624
|
+
Caption,
|
|
1625
|
+
};
|
|
1626
|
+
/**
|
|
1627
|
+
* Entity categories for organization
|
|
1628
|
+
*/
|
|
1629
|
+
export const MediaCategories = {
|
|
1630
|
+
visual: ['Image', 'Video', 'Screenshot'],
|
|
1631
|
+
audio: ['Audio'],
|
|
1632
|
+
collections: ['Album', 'MediaLibrary'],
|
|
1633
|
+
text: ['Transcript', 'Caption'],
|
|
1634
|
+
};
|