@dxos/plugin-youtube 0.8.3
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/LICENSE +21 -0
- package/dist/lib/browser/ChannelArticle-CDQR4BBY.mjs +90 -0
- package/dist/lib/browser/ChannelArticle-CDQR4BBY.mjs.map +7 -0
- package/dist/lib/browser/ChannelSettings-ZYUNW3VS.mjs +28 -0
- package/dist/lib/browser/ChannelSettings-ZYUNW3VS.mjs.map +7 -0
- package/dist/lib/browser/VideoArticle-FC4A6E7B.mjs +76 -0
- package/dist/lib/browser/VideoArticle-FC4A6E7B.mjs.map +7 -0
- package/dist/lib/browser/VideoCard-CCPXDCB7.mjs +64 -0
- package/dist/lib/browser/VideoCard-CCPXDCB7.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-MJY6A6SN.mjs +195 -0
- package/dist/lib/browser/app-graph-builder-MJY6A6SN.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-FRYUYJ22.mjs +22 -0
- package/dist/lib/browser/blueprint-definition-FRYUYJ22.mjs.map +7 -0
- package/dist/lib/browser/blueprints/index.mjs +13 -0
- package/dist/lib/browser/blueprints/index.mjs.map +7 -0
- package/dist/lib/browser/chunk-C26XKDK2.mjs +355 -0
- package/dist/lib/browser/chunk-C26XKDK2.mjs.map +7 -0
- package/dist/lib/browser/chunk-DFRSBBSO.mjs +21 -0
- package/dist/lib/browser/chunk-DFRSBBSO.mjs.map +7 -0
- package/dist/lib/browser/chunk-GFRR4TTX.mjs +72 -0
- package/dist/lib/browser/chunk-GFRR4TTX.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/browser/chunk-MUE22YUM.mjs +57 -0
- package/dist/lib/browser/chunk-MUE22YUM.mjs.map +7 -0
- package/dist/lib/browser/chunk-P67QEKBQ.mjs +72 -0
- package/dist/lib/browser/chunk-P67QEKBQ.mjs.map +7 -0
- package/dist/lib/browser/chunk-YMDT37TA.mjs +62 -0
- package/dist/lib/browser/chunk-YMDT37TA.mjs.map +7 -0
- package/dist/lib/browser/chunk-Z3DGTMKC.mjs +8 -0
- package/dist/lib/browser/chunk-Z3DGTMKC.mjs.map +7 -0
- package/dist/lib/browser/clear-synced-videos-EVMJIZPD.mjs +66 -0
- package/dist/lib/browser/clear-synced-videos-EVMJIZPD.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +153 -0
- package/dist/lib/browser/index.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -0
- package/dist/lib/browser/react-surface-EDA5VYDC.mjs +77 -0
- package/dist/lib/browser/react-surface-EDA5VYDC.mjs.map +7 -0
- package/dist/lib/browser/sync-423Q4BDD.mjs +360 -0
- package/dist/lib/browser/sync-423Q4BDD.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +14 -0
- package/dist/lib/browser/types/index.mjs.map +7 -0
- package/dist/lib/node-esm/ChannelArticle-GQ64BO7V.mjs +91 -0
- package/dist/lib/node-esm/ChannelArticle-GQ64BO7V.mjs.map +7 -0
- package/dist/lib/node-esm/ChannelSettings-DM2HWNKO.mjs +29 -0
- package/dist/lib/node-esm/ChannelSettings-DM2HWNKO.mjs.map +7 -0
- package/dist/lib/node-esm/VideoArticle-WLTWZO3K.mjs +77 -0
- package/dist/lib/node-esm/VideoArticle-WLTWZO3K.mjs.map +7 -0
- package/dist/lib/node-esm/VideoCard-FOWQZK75.mjs +65 -0
- package/dist/lib/node-esm/VideoCard-FOWQZK75.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-builder-IU5TBAXN.mjs +196 -0
- package/dist/lib/node-esm/app-graph-builder-IU5TBAXN.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-W264MZ3D.mjs +23 -0
- package/dist/lib/node-esm/blueprint-definition-W264MZ3D.mjs.map +7 -0
- package/dist/lib/node-esm/blueprints/index.mjs +14 -0
- package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-5KNC2JMP.mjs +58 -0
- package/dist/lib/node-esm/chunk-5KNC2JMP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6BUJ2DQX.mjs +73 -0
- package/dist/lib/node-esm/chunk-6BUJ2DQX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CX6MV3QM.mjs +23 -0
- package/dist/lib/node-esm/chunk-CX6MV3QM.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CZSLL3XQ.mjs +63 -0
- package/dist/lib/node-esm/chunk-CZSLL3XQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-JM5SBBP5.mjs +356 -0
- package/dist/lib/node-esm/chunk-JM5SBBP5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-JSGRZMG3.mjs +73 -0
- package/dist/lib/node-esm/chunk-JSGRZMG3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-M4S6BE47.mjs +10 -0
- package/dist/lib/node-esm/chunk-M4S6BE47.mjs.map +7 -0
- package/dist/lib/node-esm/clear-synced-videos-5UCH6XHL.mjs +67 -0
- package/dist/lib/node-esm/clear-synced-videos-5UCH6XHL.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +154 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/react-surface-5DJAQPHJ.mjs +78 -0
- package/dist/lib/node-esm/react-surface-5DJAQPHJ.mjs.map +7 -0
- package/dist/lib/node-esm/sync-CEF5DX2J.mjs +361 -0
- package/dist/lib/node-esm/sync-CEF5DX2J.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +15 -0
- package/dist/lib/node-esm/types/index.mjs.map +7 -0
- package/dist/types/src/YouTubePlugin.d.ts +3 -0
- package/dist/types/src/YouTubePlugin.d.ts.map +1 -0
- package/dist/types/src/blueprints/index.d.ts +3 -0
- package/dist/types/src/blueprints/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/youtube.d.ts +4 -0
- package/dist/types/src/blueprints/youtube.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +6 -0
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +4 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +8 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelArticle/index.d.ts +3 -0
- package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelSettings/ChannelSettings.d.ts +7 -0
- package/dist/types/src/containers/ChannelSettings/ChannelSettings.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelSettings/index.d.ts +3 -0
- package/dist/types/src/containers/ChannelSettings/index.d.ts.map +1 -0
- package/dist/types/src/containers/VideoArticle/VideoArticle.d.ts +11 -0
- package/dist/types/src/containers/VideoArticle/VideoArticle.d.ts.map +1 -0
- package/dist/types/src/containers/VideoArticle/index.d.ts +3 -0
- package/dist/types/src/containers/VideoArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/VideoCard/VideoCard.d.ts +9 -0
- package/dist/types/src/containers/VideoCard/VideoCard.d.ts.map +1 -0
- package/dist/types/src/containers/VideoCard/index.d.ts +3 -0
- package/dist/types/src/containers/VideoCard/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +11 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +3 -0
- package/dist/types/src/meta.d.ts.map +1 -0
- package/dist/types/src/operations/apis/index.d.ts +2 -0
- package/dist/types/src/operations/apis/index.d.ts.map +1 -0
- package/dist/types/src/operations/apis/youtube/api.d.ts +251 -0
- package/dist/types/src/operations/apis/youtube/api.d.ts.map +1 -0
- package/dist/types/src/operations/apis/youtube/index.d.ts +3 -0
- package/dist/types/src/operations/apis/youtube/index.d.ts.map +1 -0
- package/dist/types/src/operations/apis/youtube/types.d.ts +493 -0
- package/dist/types/src/operations/apis/youtube/types.d.ts.map +1 -0
- package/dist/types/src/operations/clear-synced-videos.d.ts +5 -0
- package/dist/types/src/operations/clear-synced-videos.d.ts.map +1 -0
- package/dist/types/src/operations/definitions.d.ts +45 -0
- package/dist/types/src/operations/definitions.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +5 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/operations/services/google-credentials.d.ts +35 -0
- package/dist/types/src/operations/services/google-credentials.d.ts.map +1 -0
- package/dist/types/src/operations/services/index.d.ts +2 -0
- package/dist/types/src/operations/services/index.d.ts.map +1 -0
- package/dist/types/src/operations/sync.d.ts +5 -0
- package/dist/types/src/operations/sync.d.ts.map +1 -0
- package/dist/types/src/operations/sync.test.d.ts +2 -0
- package/dist/types/src/operations/sync.test.d.ts.map +1 -0
- package/dist/types/src/operations/transcript.d.ts +12 -0
- package/dist/types/src/operations/transcript.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +49 -0
- package/dist/types/src/translations.d.ts.map +1 -0
- package/dist/types/src/types/Channel.d.ts +54 -0
- package/dist/types/src/types/Channel.d.ts.map +1 -0
- package/dist/types/src/types/Video.d.ts +41 -0
- package/dist/types/src/types/Video.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +4 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/types.d.ts +5 -0
- package/dist/types/src/types/types.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +113 -0
- package/src/YouTubePlugin.tsx +66 -0
- package/src/blueprints/index.ts +7 -0
- package/src/blueprints/youtube.ts +52 -0
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +148 -0
- package/src/capabilities/app-graph-builder/index.ts +7 -0
- package/src/capabilities/blueprint-definition/blueprint-definition.ts +17 -0
- package/src/capabilities/blueprint-definition/index.ts +7 -0
- package/src/capabilities/index.ts +7 -0
- package/src/capabilities/react-surface/index.ts +7 -0
- package/src/capabilities/react-surface/react-surface.tsx +54 -0
- package/src/containers/ChannelArticle/ChannelArticle.tsx +115 -0
- package/src/containers/ChannelArticle/index.ts +7 -0
- package/src/containers/ChannelSettings/ChannelSettings.tsx +34 -0
- package/src/containers/ChannelSettings/index.ts +7 -0
- package/src/containers/VideoArticle/VideoArticle.tsx +109 -0
- package/src/containers/VideoArticle/index.ts +7 -0
- package/src/containers/VideoCard/VideoCard.tsx +86 -0
- package/src/containers/VideoCard/index.ts +7 -0
- package/src/containers/index.ts +24 -0
- package/src/index.ts +8 -0
- package/src/meta.ts +19 -0
- package/src/operations/apis/index.ts +5 -0
- package/src/operations/apis/youtube/api.ts +149 -0
- package/src/operations/apis/youtube/index.ts +6 -0
- package/src/operations/apis/youtube/types.ts +254 -0
- package/src/operations/clear-synced-videos.ts +50 -0
- package/src/operations/definitions.ts +62 -0
- package/src/operations/index.ts +13 -0
- package/src/operations/services/google-credentials.ts +81 -0
- package/src/operations/services/index.ts +5 -0
- package/src/operations/sync.test.ts +114 -0
- package/src/operations/sync.ts +309 -0
- package/src/operations/transcript.ts +47 -0
- package/src/translations.ts +59 -0
- package/src/types/Channel.ts +80 -0
- package/src/types/Video.ts +67 -0
- package/src/types/index.ts +8 -0
- package/src/types/types.ts +10 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Resource } from '@dxos/react-ui';
|
|
6
|
+
|
|
7
|
+
import { meta } from './meta';
|
|
8
|
+
import { Channel, Video } from './types';
|
|
9
|
+
|
|
10
|
+
export const translations = [
|
|
11
|
+
{
|
|
12
|
+
'en-US': {
|
|
13
|
+
[Channel.YouTubeChannel.typename]: {
|
|
14
|
+
'typename label': 'YouTube Channel',
|
|
15
|
+
'typename label_zero': 'YouTube Channels',
|
|
16
|
+
'typename label_one': 'YouTube Channel',
|
|
17
|
+
'typename label_other': 'YouTube Channels',
|
|
18
|
+
'object name placeholder': 'New YouTube channel',
|
|
19
|
+
'add object label': 'Add YouTube channel',
|
|
20
|
+
'rename object label': 'Rename YouTube channel',
|
|
21
|
+
'delete object label': 'Delete YouTube channel',
|
|
22
|
+
'object deleted label': 'YouTube channel deleted',
|
|
23
|
+
},
|
|
24
|
+
[Video.YouTubeVideo.typename]: {
|
|
25
|
+
'typename label': 'Video',
|
|
26
|
+
'typename label_zero': 'Videos',
|
|
27
|
+
'typename label_one': 'Video',
|
|
28
|
+
'typename label_other': 'Videos',
|
|
29
|
+
'object name placeholder': 'New video',
|
|
30
|
+
'add object label': 'Add video',
|
|
31
|
+
'rename object label': 'Rename video',
|
|
32
|
+
'delete object label': 'Delete video',
|
|
33
|
+
'object deleted label': 'Video deleted',
|
|
34
|
+
},
|
|
35
|
+
[meta.id]: {
|
|
36
|
+
'plugin name': 'YouTube',
|
|
37
|
+
'channel label': 'YouTube Channel',
|
|
38
|
+
'video label': 'Video',
|
|
39
|
+
'sync channel label': 'Sync channel',
|
|
40
|
+
'sync channel error title': 'Failed to sync channel',
|
|
41
|
+
'clear synced videos label': 'Clear synced videos',
|
|
42
|
+
'clear synced videos error title': 'Failed to clear synced videos',
|
|
43
|
+
'close label': 'Close',
|
|
44
|
+
'new channel label': 'New YouTube Channel',
|
|
45
|
+
'empty channel message': 'No videos synced yet',
|
|
46
|
+
'no video message': 'Select a video to view it',
|
|
47
|
+
|
|
48
|
+
'channel account label': 'Account',
|
|
49
|
+
'channel account placeholder': 'Select account...',
|
|
50
|
+
'channel sync label': 'Channel Sync',
|
|
51
|
+
|
|
52
|
+
'enable background sync label': 'Enable background sync',
|
|
53
|
+
'enabling background sync label': 'Enabling...',
|
|
54
|
+
'disable background sync label': 'Disable background sync',
|
|
55
|
+
'view trigger label': 'View trigger',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
] as const satisfies Resource[];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { Annotation, Feed, Obj, Ref, Type } from '@dxos/echo';
|
|
8
|
+
import { FormInputAnnotation } from '@dxos/echo/internal';
|
|
9
|
+
import { FeedAnnotation } from '@dxos/schema';
|
|
10
|
+
import { AccessToken } from '@dxos/types';
|
|
11
|
+
|
|
12
|
+
// @import-as-namespace
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* YouTubeChannel schema representing a YouTube channel to sync videos from.
|
|
16
|
+
*/
|
|
17
|
+
export const YouTubeChannel = Schema.Struct({
|
|
18
|
+
/** Display name for the channel. */
|
|
19
|
+
name: Schema.String.pipe(Schema.optional),
|
|
20
|
+
/** YouTube channel ID (e.g., UC...). */
|
|
21
|
+
channelId: Schema.String.pipe(Schema.optional),
|
|
22
|
+
/** YouTube channel URL or handle. */
|
|
23
|
+
channelUrl: Schema.String.pipe(Schema.optional),
|
|
24
|
+
/** Feed containing YouTubeVideo objects. */
|
|
25
|
+
feed: Ref.Ref(Feed.Feed).pipe(FormInputAnnotation.set(false)),
|
|
26
|
+
/** Last sync timestamp. */
|
|
27
|
+
lastSyncedAt: Schema.String.pipe(FormInputAnnotation.set(false), Schema.optional),
|
|
28
|
+
/** Google API credentials for fetching channel data. */
|
|
29
|
+
accessToken: Schema.optional(
|
|
30
|
+
Ref.Ref(AccessToken.AccessToken).annotations({
|
|
31
|
+
title: 'Account',
|
|
32
|
+
description: 'Google account credentials for syncing this YouTube channel.',
|
|
33
|
+
}),
|
|
34
|
+
),
|
|
35
|
+
}).pipe(
|
|
36
|
+
Type.object({
|
|
37
|
+
typename: 'org.dxos.type.youtube-channel',
|
|
38
|
+
version: '0.1.0',
|
|
39
|
+
}),
|
|
40
|
+
Annotation.IconAnnotation.set({
|
|
41
|
+
icon: 'ph--youtube-logo--regular',
|
|
42
|
+
hue: 'red',
|
|
43
|
+
}),
|
|
44
|
+
FeedAnnotation.set(true),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
export interface YouTubeChannel extends Schema.Schema.Type<typeof YouTubeChannel> {}
|
|
48
|
+
|
|
49
|
+
/** Checks if a value is a YouTubeChannel object. */
|
|
50
|
+
export const instanceOf = (value: unknown): value is YouTubeChannel => Obj.instanceOf(YouTubeChannel, value);
|
|
51
|
+
|
|
52
|
+
export const CreateYouTubeChannelSchema = Schema.Struct({
|
|
53
|
+
name: Schema.optional(Schema.String.annotations({ title: 'Name' })),
|
|
54
|
+
channelUrl: Schema.optional(
|
|
55
|
+
Schema.String.annotations({
|
|
56
|
+
title: 'Channel URL',
|
|
57
|
+
description: 'YouTube channel URL, handle (e.g., @channelname), or channel ID.',
|
|
58
|
+
}),
|
|
59
|
+
),
|
|
60
|
+
accessToken: Schema.optional(
|
|
61
|
+
Ref.Ref(AccessToken.AccessToken).annotations({
|
|
62
|
+
title: 'Account',
|
|
63
|
+
description: 'Google account credentials for syncing this YouTube channel.',
|
|
64
|
+
}),
|
|
65
|
+
),
|
|
66
|
+
});
|
|
67
|
+
export interface CreateYouTubeChannelSchema extends Schema.Schema.Type<typeof CreateYouTubeChannelSchema> {}
|
|
68
|
+
|
|
69
|
+
type YouTubeChannelProps = Omit<Obj.MakeProps<typeof YouTubeChannel>, 'feed' | 'lastSyncedAt'>;
|
|
70
|
+
|
|
71
|
+
/** Creates a YouTubeChannel object with a backing feed. */
|
|
72
|
+
export const make = (props: YouTubeChannelProps = {}) => {
|
|
73
|
+
const feed = Feed.make();
|
|
74
|
+
const channel = Obj.make(YouTubeChannel, {
|
|
75
|
+
feed: Ref.make(feed),
|
|
76
|
+
...props,
|
|
77
|
+
});
|
|
78
|
+
Obj.setParent(feed, channel);
|
|
79
|
+
return channel;
|
|
80
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { Annotation, Obj, Type } from '@dxos/echo';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Transcript segment from a YouTube video.
|
|
11
|
+
*/
|
|
12
|
+
export const TranscriptSegment = Schema.Struct({
|
|
13
|
+
/** Transcript text. */
|
|
14
|
+
text: Schema.String,
|
|
15
|
+
/** Start time in seconds. */
|
|
16
|
+
offset: Schema.Number,
|
|
17
|
+
/** Duration in seconds. */
|
|
18
|
+
duration: Schema.Number,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type TranscriptSegment = Schema.Schema.Type<typeof TranscriptSegment>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* YouTubeVideo schema representing a video from a YouTube channel.
|
|
25
|
+
*/
|
|
26
|
+
export const YouTubeVideo = Schema.Struct({
|
|
27
|
+
/** Video title. */
|
|
28
|
+
title: Schema.String,
|
|
29
|
+
/** YouTube video ID. */
|
|
30
|
+
videoId: Schema.String,
|
|
31
|
+
/** Video description. */
|
|
32
|
+
description: Schema.String.pipe(Schema.optional),
|
|
33
|
+
/** Video URL. */
|
|
34
|
+
url: Schema.String,
|
|
35
|
+
/** Thumbnail URL. */
|
|
36
|
+
thumbnailUrl: Schema.String.pipe(Schema.optional),
|
|
37
|
+
/** Channel name. */
|
|
38
|
+
channelTitle: Schema.String.pipe(Schema.optional),
|
|
39
|
+
/** Published date as ISO string. */
|
|
40
|
+
publishedAt: Schema.String,
|
|
41
|
+
/** Video duration in ISO 8601 format (e.g., PT1H30M15S). */
|
|
42
|
+
duration: Schema.String.pipe(Schema.optional),
|
|
43
|
+
/** View count. */
|
|
44
|
+
viewCount: Schema.Number.pipe(Schema.optional),
|
|
45
|
+
/** Like count. */
|
|
46
|
+
likeCount: Schema.Number.pipe(Schema.optional),
|
|
47
|
+
/** Full transcript text. */
|
|
48
|
+
transcript: Schema.String.pipe(Schema.optional),
|
|
49
|
+
/** Transcript segments with timestamps. */
|
|
50
|
+
transcriptSegments: Schema.Array(TranscriptSegment).pipe(Schema.optional),
|
|
51
|
+
/** True when transcript text was successfully loaded; false when disabled or none available. */
|
|
52
|
+
transcriptFetched: Schema.Boolean.pipe(Schema.optional),
|
|
53
|
+
}).pipe(
|
|
54
|
+
Type.object({
|
|
55
|
+
typename: 'org.dxos.type.youtube-video',
|
|
56
|
+
version: '0.1.0',
|
|
57
|
+
}),
|
|
58
|
+
Annotation.IconAnnotation.set({
|
|
59
|
+
icon: 'ph--play--regular',
|
|
60
|
+
hue: 'red',
|
|
61
|
+
}),
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
export interface YouTubeVideo extends Schema.Schema.Type<typeof YouTubeVideo> {}
|
|
65
|
+
|
|
66
|
+
/** Checks if a value is a YouTubeVideo object. */
|
|
67
|
+
export const instanceOf = (value: unknown): value is YouTubeVideo => Obj.instanceOf(YouTubeVideo, value);
|