@opencoredev/social-sdk 0.1.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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +223 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cloud/common.d.ts +26 -0
  8. package/dist/cloud/common.d.ts.map +1 -0
  9. package/dist/cloud/common.js +307 -0
  10. package/dist/cloud/common.js.map +1 -0
  11. package/dist/cloud/lifecycle.d.ts +11 -0
  12. package/dist/cloud/lifecycle.d.ts.map +1 -0
  13. package/dist/cloud/lifecycle.js +108 -0
  14. package/dist/cloud/lifecycle.js.map +1 -0
  15. package/dist/cloud/media.d.ts +24 -0
  16. package/dist/cloud/media.d.ts.map +1 -0
  17. package/dist/cloud/media.js +97 -0
  18. package/dist/cloud/media.js.map +1 -0
  19. package/dist/cloud/outcomes.d.ts +10 -0
  20. package/dist/cloud/outcomes.d.ts.map +1 -0
  21. package/dist/cloud/outcomes.js +188 -0
  22. package/dist/cloud/outcomes.js.map +1 -0
  23. package/dist/cloud/post-for-me.d.ts +70 -0
  24. package/dist/cloud/post-for-me.d.ts.map +1 -0
  25. package/dist/cloud/post-for-me.js +326 -0
  26. package/dist/cloud/post-for-me.js.map +1 -0
  27. package/dist/cloud/zernio.d.ts +112 -0
  28. package/dist/cloud/zernio.d.ts.map +1 -0
  29. package/dist/cloud/zernio.js +542 -0
  30. package/dist/cloud/zernio.js.map +1 -0
  31. package/dist/core/adapter.d.ts +118 -0
  32. package/dist/core/adapter.d.ts.map +1 -0
  33. package/dist/core/adapter.js +4 -0
  34. package/dist/core/adapter.js.map +1 -0
  35. package/dist/core/client.d.ts +108 -0
  36. package/dist/core/client.d.ts.map +1 -0
  37. package/dist/core/client.js +893 -0
  38. package/dist/core/client.js.map +1 -0
  39. package/dist/core/concurrency.d.ts +10 -0
  40. package/dist/core/concurrency.d.ts.map +1 -0
  41. package/dist/core/concurrency.js +78 -0
  42. package/dist/core/concurrency.js.map +1 -0
  43. package/dist/core/errors.d.ts +45 -0
  44. package/dist/core/errors.d.ts.map +1 -0
  45. package/dist/core/errors.js +44 -0
  46. package/dist/core/errors.js.map +1 -0
  47. package/dist/core/idempotency.d.ts +34 -0
  48. package/dist/core/idempotency.d.ts.map +1 -0
  49. package/dist/core/idempotency.js +59 -0
  50. package/dist/core/idempotency.js.map +1 -0
  51. package/dist/core/index.d.ts +7 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +7 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/core/pagination.d.ts +12 -0
  56. package/dist/core/pagination.d.ts.map +1 -0
  57. package/dist/core/pagination.js +81 -0
  58. package/dist/core/pagination.js.map +1 -0
  59. package/dist/core/types.d.ts +329 -0
  60. package/dist/core/types.d.ts.map +1 -0
  61. package/dist/core/types.js +7 -0
  62. package/dist/core/types.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +2 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/platforms/bluesky.d.ts +132 -0
  68. package/dist/platforms/bluesky.d.ts.map +1 -0
  69. package/dist/platforms/bluesky.js +1049 -0
  70. package/dist/platforms/bluesky.js.map +1 -0
  71. package/dist/platforms/instagram.d.ts +63 -0
  72. package/dist/platforms/instagram.d.ts.map +1 -0
  73. package/dist/platforms/instagram.js +676 -0
  74. package/dist/platforms/instagram.js.map +1 -0
  75. package/dist/platforms/linkedin.d.ts +54 -0
  76. package/dist/platforms/linkedin.d.ts.map +1 -0
  77. package/dist/platforms/linkedin.js +580 -0
  78. package/dist/platforms/linkedin.js.map +1 -0
  79. package/dist/platforms/threads.d.ts +102 -0
  80. package/dist/platforms/threads.d.ts.map +1 -0
  81. package/dist/platforms/threads.js +571 -0
  82. package/dist/platforms/threads.js.map +1 -0
  83. package/dist/platforms/tiktok.d.ts +32 -0
  84. package/dist/platforms/tiktok.d.ts.map +1 -0
  85. package/dist/platforms/tiktok.js +511 -0
  86. package/dist/platforms/tiktok.js.map +1 -0
  87. package/dist/platforms/x-engagement.d.ts +17 -0
  88. package/dist/platforms/x-engagement.d.ts.map +1 -0
  89. package/dist/platforms/x-engagement.js +47 -0
  90. package/dist/platforms/x-engagement.js.map +1 -0
  91. package/dist/platforms/x.d.ts +82 -0
  92. package/dist/platforms/x.d.ts.map +1 -0
  93. package/dist/platforms/x.js +511 -0
  94. package/dist/platforms/x.js.map +1 -0
  95. package/dist/platforms/youtube-upload.d.ts +33 -0
  96. package/dist/platforms/youtube-upload.d.ts.map +1 -0
  97. package/dist/platforms/youtube-upload.js +281 -0
  98. package/dist/platforms/youtube-upload.js.map +1 -0
  99. package/dist/platforms/youtube.d.ts +55 -0
  100. package/dist/platforms/youtube.d.ts.map +1 -0
  101. package/dist/platforms/youtube.js +561 -0
  102. package/dist/platforms/youtube.js.map +1 -0
  103. package/dist/server/connections.d.ts +124 -0
  104. package/dist/server/connections.d.ts.map +1 -0
  105. package/dist/server/connections.js +334 -0
  106. package/dist/server/connections.js.map +1 -0
  107. package/dist/server/credentials.d.ts +52 -0
  108. package/dist/server/credentials.d.ts.map +1 -0
  109. package/dist/server/credentials.js +115 -0
  110. package/dist/server/credentials.js.map +1 -0
  111. package/dist/server/index.d.ts +5 -0
  112. package/dist/server/index.d.ts.map +1 -0
  113. package/dist/server/index.js +5 -0
  114. package/dist/server/index.js.map +1 -0
  115. package/dist/server/oauth.d.ts +48 -0
  116. package/dist/server/oauth.d.ts.map +1 -0
  117. package/dist/server/oauth.js +483 -0
  118. package/dist/server/oauth.js.map +1 -0
  119. package/dist/server/webhooks.d.ts +58 -0
  120. package/dist/server/webhooks.d.ts.map +1 -0
  121. package/dist/server/webhooks.js +198 -0
  122. package/dist/server/webhooks.js.map +1 -0
  123. package/dist/testing/index.d.ts +47 -0
  124. package/dist/testing/index.d.ts.map +1 -0
  125. package/dist/testing/index.js +413 -0
  126. package/dist/testing/index.js.map +1 -0
  127. package/dist/testing.d.ts +2 -0
  128. package/dist/testing.d.ts.map +1 -0
  129. package/dist/testing.js +2 -0
  130. package/dist/testing.js.map +1 -0
  131. package/dist/transport/binary.d.ts +3 -0
  132. package/dist/transport/binary.d.ts.map +1 -0
  133. package/dist/transport/binary.js +30 -0
  134. package/dist/transport/binary.js.map +1 -0
  135. package/dist/transport/budget.d.ts +4 -0
  136. package/dist/transport/budget.d.ts.map +1 -0
  137. package/dist/transport/budget.js +27 -0
  138. package/dist/transport/budget.js.map +1 -0
  139. package/dist/transport/http.d.ts +44 -0
  140. package/dist/transport/http.d.ts.map +1 -0
  141. package/dist/transport/http.js +230 -0
  142. package/dist/transport/http.js.map +1 -0
  143. package/dist/transport/json.d.ts +3 -0
  144. package/dist/transport/json.d.ts.map +1 -0
  145. package/dist/transport/json.js +11 -0
  146. package/dist/transport/json.js.map +1 -0
  147. package/dist/transport/upload.d.ts +25 -0
  148. package/dist/transport/upload.d.ts.map +1 -0
  149. package/dist/transport/upload.js +133 -0
  150. package/dist/transport/upload.js.map +1 -0
  151. package/dist/transport/validation.d.ts +6 -0
  152. package/dist/transport/validation.d.ts.map +1 -0
  153. package/dist/transport/validation.js +24 -0
  154. package/dist/transport/validation.js.map +1 -0
  155. package/package.json +96 -0
@@ -0,0 +1,561 @@
1
+ import { remainingBudget } from "../transport/budget.js";
2
+ import { defineAdapter } from "../core/adapter.js";
3
+ import { SocialError } from "../core/errors.js";
4
+ import { managedHttp, publicFields } from "../cloud/common.js";
5
+ import { array, object, optionalString, string } from "../transport/validation.js";
6
+ import { beginYouTubeUpload, queryYouTubeUpload, sendYouTubeUpload, } from "./youtube-upload.js";
7
+ export function youtube(options) {
8
+ const request = managedHttp("https://www.googleapis.com", {
9
+ apiKey: options.auth.accessToken,
10
+ ...(options.fetch ? { fetch: options.fetch } : {}),
11
+ });
12
+ const analyticsRequest = managedHttp("https://youtubeanalytics.googleapis.com", {
13
+ apiKey: options.auth.accessToken,
14
+ ...(options.fetch ? { fetch: options.fetch } : {}),
15
+ });
16
+ const now = () => (options.clock?.() ?? new Date()).toISOString();
17
+ const authorize = (ref, context) => {
18
+ if (ref.backend !== context.backendInstance ||
19
+ ref.platform !== "youtube" ||
20
+ ref.accountId !== options.auth.channelId)
21
+ throw new SocialError({
22
+ code: "unauthorized",
23
+ operation: "youtube",
24
+ message: "The selected channel does not belong to these configured credentials.",
25
+ });
26
+ };
27
+ const get = async (ref, context) => {
28
+ authorize(ref, context);
29
+ const result = object(await request("/youtube/v3/videos", context, undefined, {
30
+ id: ref.postId,
31
+ part: "snippet,status,statistics,processingDetails",
32
+ }));
33
+ const video = array(result["items"])
34
+ .map(object)
35
+ .find((item) => item["id"] === ref.postId);
36
+ if (!video)
37
+ throw new SocialError({
38
+ code: "upstream_failure",
39
+ operation: "posts.read",
40
+ message: "Video is absent or inaccessible to this authorization.",
41
+ });
42
+ const snippet = object(video["snippet"]);
43
+ if (snippet["channelId"] !== options.auth.channelId)
44
+ throw new SocialError({
45
+ code: "unauthorized",
46
+ operation: "posts.read",
47
+ message: "Video belongs to a different channel.",
48
+ });
49
+ return video;
50
+ };
51
+ const outcome = (video, target) => {
52
+ const id = string(video["id"]);
53
+ const status = object(video["status"]);
54
+ const uploaded = optionalString(status["uploadStatus"]) ?? "unknown";
55
+ const base = {
56
+ ...target,
57
+ observedAt: now(),
58
+ backendState: uploaded,
59
+ delivery: {
60
+ kind: "delivery",
61
+ version: 1,
62
+ backend: target.account.backend,
63
+ platform: "youtube",
64
+ accountId: target.account.accountId,
65
+ deliveryId: id,
66
+ },
67
+ };
68
+ if (uploaded === "processed")
69
+ return {
70
+ ...base,
71
+ state: "published",
72
+ post: {
73
+ kind: "platform-post",
74
+ version: 1,
75
+ backend: target.account.backend,
76
+ platform: "youtube",
77
+ accountId: target.account.accountId,
78
+ postId: id,
79
+ },
80
+ url: `https://www.youtube.com/watch?v=${encodeURIComponent(id)}`,
81
+ };
82
+ if (uploaded === "uploaded")
83
+ return { ...base, state: "processing" };
84
+ if (uploaded === "failed" || uploaded === "rejected")
85
+ return {
86
+ ...base,
87
+ state: "failed",
88
+ code: "media_error",
89
+ message: "YouTube rejected or failed to process the video. Inspect channel eligibility and upload requirements.",
90
+ retryDisposition: { kind: "never" },
91
+ };
92
+ return {
93
+ ...base,
94
+ state: "unknown",
95
+ reason: "unmapped-state",
96
+ diagnostic: "Unmapped YouTube upload status.",
97
+ };
98
+ };
99
+ const accountInfo = async (context) => {
100
+ const result = object(await request("/youtube/v3/channels", context, undefined, {
101
+ mine: "true",
102
+ part: "snippet",
103
+ maxResults: "50",
104
+ }));
105
+ const channel = array(result["items"])
106
+ .map(object)
107
+ .find((item) => item["id"] === options.auth.channelId);
108
+ if (!channel)
109
+ throw new SocialError({
110
+ code: "unauthorized",
111
+ operation: "accounts.read",
112
+ message: "Configured channel was not returned for the authorized Google account. Select a channel through the connection flow.",
113
+ });
114
+ return {
115
+ ref: {
116
+ kind: "connected-account",
117
+ version: 1,
118
+ backend: context.backendInstance,
119
+ platform: "youtube",
120
+ accountId: options.auth.channelId,
121
+ },
122
+ displayName: string(object(channel["snippet"])["title"]),
123
+ status: "connected",
124
+ };
125
+ };
126
+ return defineAdapter({
127
+ id: "youtube",
128
+ capabilities: {
129
+ schemaVersion: 1,
130
+ backend: "youtube",
131
+ apiRevision: "YouTube Data API v3",
132
+ runtime: ["node22", "node24", "bun"],
133
+ capabilities: [
134
+ ...[
135
+ "accounts.read",
136
+ "posts.read",
137
+ "posts.list",
138
+ "posts.status",
139
+ "analytics.read",
140
+ "analytics.account.read",
141
+ "comments.read",
142
+ "comments.write",
143
+ ].map((operation) => ({
144
+ operation,
145
+ platform: "youtube",
146
+ availability: "available",
147
+ })),
148
+ {
149
+ operation: "posts.publish",
150
+ platform: "youtube",
151
+ availability: "available",
152
+ formats: ["video"],
153
+ requiredScopes: ["https://www.googleapis.com/auth/youtube.upload"],
154
+ notes: "Unaudited projects may be restricted to private visibility. Upload completion and video processing are separate.",
155
+ },
156
+ {
157
+ operation: "posts.schedule",
158
+ platform: "youtube",
159
+ availability: "available",
160
+ requiredScopes: ["https://www.googleapis.com/auth/youtube.upload"],
161
+ },
162
+ {
163
+ operation: "thumbnails.write",
164
+ platform: "youtube",
165
+ availability: "available",
166
+ requiredScopes: ["https://www.googleapis.com/auth/youtube"],
167
+ },
168
+ {
169
+ operation: "captions.read",
170
+ platform: "youtube",
171
+ availability: "available",
172
+ requiredScopes: ["https://www.googleapis.com/auth/youtube.force-ssl"],
173
+ },
174
+ {
175
+ operation: "captions.write",
176
+ platform: "youtube",
177
+ availability: "available",
178
+ requiredScopes: ["https://www.googleapis.com/auth/youtube.force-ssl"],
179
+ },
180
+ { operation: "playlists.read", platform: "youtube", availability: "available" },
181
+ { operation: "playlists.write", platform: "youtube", availability: "available" },
182
+ { operation: "posts.update", platform: "youtube", availability: "available" },
183
+ { operation: "posts.delete", platform: "youtube", availability: "available" },
184
+ {
185
+ operation: "analytics.youtube.read",
186
+ platform: "youtube",
187
+ availability: "available",
188
+ requiredScopes: ["https://www.googleapis.com/auth/yt-analytics.readonly"],
189
+ },
190
+ { operation: "live.broadcasts", platform: "youtube", availability: "approval-dependent" },
191
+ ],
192
+ },
193
+ accounts: {
194
+ async list(_input, context) {
195
+ return { items: [await accountInfo(context)] };
196
+ },
197
+ async get(ref, context) {
198
+ authorize(ref, context);
199
+ return accountInfo(context);
200
+ },
201
+ },
202
+ posts: {
203
+ async list(account, input, context) {
204
+ authorize(account, context);
205
+ const limit = input.limit ?? 25;
206
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 50 || input.cursor === "")
207
+ throw new SocialError({
208
+ code: "invalid_input",
209
+ operation: "posts.read",
210
+ message: "YouTube page size must be from 1 to 50 and page tokens must be nonempty.",
211
+ });
212
+ const channel = object(await request("/youtube/v3/channels", context, undefined, {
213
+ id: options.auth.channelId,
214
+ part: "contentDetails",
215
+ }));
216
+ const row = array(channel["items"])
217
+ .map(object)
218
+ .find((item) => item["id"] === options.auth.channelId);
219
+ if (!row)
220
+ throw new SocialError({
221
+ code: "unauthorized",
222
+ operation: "posts.list",
223
+ message: "Configured channel was not returned.",
224
+ });
225
+ const details = object(row["contentDetails"]), related = object(details["relatedPlaylists"]), uploads = string(related["uploads"]);
226
+ const page = object(await request("/youtube/v3/playlistItems", context, undefined, {
227
+ playlistId: uploads,
228
+ part: "snippet,contentDetails",
229
+ maxResults: String(limit),
230
+ ...(input.cursor ? { pageToken: input.cursor } : {}),
231
+ }));
232
+ return {
233
+ items: array(page["items"]).map((value) => {
234
+ const item = object(value), snippet = object(item["snippet"]), content = object(item["contentDetails"]);
235
+ if (snippet["channelId"] !== options.auth.channelId ||
236
+ (snippet["videoOwnerChannelId"] !== undefined &&
237
+ snippet["videoOwnerChannelId"] !== options.auth.channelId))
238
+ throw new SocialError({
239
+ code: "unauthorized",
240
+ operation: "posts.read",
241
+ message: "YouTube returned a video from another channel.",
242
+ });
243
+ return {
244
+ id: string(content["videoId"]),
245
+ snippet: publicFields(snippet, [
246
+ "channelId",
247
+ "title",
248
+ "description",
249
+ "publishedAt",
250
+ "videoOwnerChannelId",
251
+ ]),
252
+ contentDetails: publicFields(content, ["videoId", "videoPublishedAt"]),
253
+ };
254
+ }),
255
+ ...(typeof page["nextPageToken"] === "string"
256
+ ? { nextCursor: page["nextPageToken"] }
257
+ : {}),
258
+ };
259
+ },
260
+ prepareTarget(target) {
261
+ const issues = [];
262
+ const fail = (code, message) => issues.push({ code, message, severity: "error", targetIndex: target.targetIndex });
263
+ if (target.account.platform !== "youtube" ||
264
+ target.account.accountId !== options.auth.channelId)
265
+ fail("youtube.channel", "Select the configured YouTube channel.");
266
+ const media = target.content.media;
267
+ if (media?.length !== 1 || media[0]?.kind !== "video")
268
+ fail("youtube.video", "YouTube requires exactly one video; text-only publication is unavailable.");
269
+ const item = media?.[0];
270
+ if (item) {
271
+ if (item.source.kind !== "blob" && item.source.kind !== "stream")
272
+ fail("youtube.source", "Provide a Blob or replayable stream for resumable upload.");
273
+ if (!item.mimeType?.startsWith("video/"))
274
+ fail("youtube.mime", "Declare the actual video MIME type.");
275
+ if (item.source.kind !== "blob" && !item.byteSize)
276
+ fail("youtube.size", "Streaming upload requires its exact byte size.");
277
+ }
278
+ const config = target.options === undefined ? {} : object(target.options);
279
+ if (typeof config["title"] !== "string" ||
280
+ !config["title"] ||
281
+ [...config["title"]].length > 100)
282
+ fail("youtube.title", "Select a title of 1 to 100 characters.");
283
+ if (!["public", "unlisted", "private"].includes(String(config["visibility"])))
284
+ fail("youtube.visibility", "Explicit visibility is required.");
285
+ if (typeof config["madeForKids"] !== "boolean")
286
+ fail("youtube.audience", "Explicit made-for-kids declaration is required.");
287
+ if (target.schedule || target.replyTo)
288
+ fail("youtube.operation", "Use a job runner for scheduling or comments.reply for replies.");
289
+ return issues;
290
+ },
291
+ async publishTarget(target, context) {
292
+ authorize(target.account, context);
293
+ const media = target.content.media?.[0];
294
+ if (!media)
295
+ throw new SocialError({
296
+ code: "invalid_input",
297
+ operation: "posts.publish",
298
+ message: "Video required.",
299
+ });
300
+ const config = object(target.options);
301
+ const uploadOptions = {
302
+ timeoutMs: remainingBudget(context),
303
+ accessToken: options.auth.accessToken,
304
+ ...(options.fetch ? { fetch: options.fetch } : {}),
305
+ ...(context.signal ? { signal: context.signal } : {}),
306
+ };
307
+ const size = media.byteSize ?? (media.source.kind === "blob" ? media.source.blob.size : 0);
308
+ const session = await beginYouTubeUpload({
309
+ channelId: options.auth.channelId,
310
+ size,
311
+ mimeType: string(media.mimeType),
312
+ metadata: {
313
+ snippet: { title: string(config["title"]), description: target.content.text ?? "" },
314
+ status: {
315
+ privacyStatus: string(config["visibility"]),
316
+ selfDeclaredMadeForKids: config["madeForKids"] === true,
317
+ },
318
+ },
319
+ }, uploadOptions);
320
+ if (options.saveUploadSession)
321
+ await options.saveUploadSession(session);
322
+ const result = await sendYouTubeUpload(session, media, uploadOptions);
323
+ if (result.state === "incomplete")
324
+ return {
325
+ account: target.account,
326
+ targetIndex: target.targetIndex,
327
+ observedAt: now(),
328
+ state: "unknown",
329
+ reason: "ambiguous-submission",
330
+ diagnostic: "Upload is incomplete. Query the saved server-side session and explicitly resume confirmed bytes.",
331
+ };
332
+ return outcome(result.video, target);
333
+ },
334
+ async get(ref, context) {
335
+ const video = await get(ref, context);
336
+ return {
337
+ id: string(video["id"]),
338
+ snippet: publicFields(video["snippet"], [
339
+ "title",
340
+ "description",
341
+ "channelId",
342
+ "publishedAt",
343
+ ]),
344
+ status: publicFields(video["status"], [
345
+ "privacyStatus",
346
+ "uploadStatus",
347
+ "selfDeclaredMadeForKids",
348
+ ]),
349
+ };
350
+ },
351
+ async getDelivery(ref, context) {
352
+ const account = {
353
+ kind: "connected-account",
354
+ version: 1,
355
+ backend: ref.backend,
356
+ platform: "youtube",
357
+ accountId: ref.accountId,
358
+ };
359
+ const video = await get({ ...account, kind: "platform-post", postId: ref.deliveryId }, context);
360
+ return outcome(video, { account, targetIndex: 0 });
361
+ },
362
+ },
363
+ analytics: {
364
+ async getPostMetrics(ref, context) {
365
+ const video = await get(ref, context);
366
+ if (video["statistics"] === undefined)
367
+ return [];
368
+ const values = object(video["statistics"]);
369
+ const metrics = [];
370
+ for (const name of ["viewCount", "likeCount", "commentCount"]) {
371
+ const raw = values[name];
372
+ if (typeof raw !== "string" || !/^\d+$/.test(raw))
373
+ continue;
374
+ const value = Number(raw);
375
+ if (!Number.isSafeInteger(value))
376
+ continue;
377
+ metrics.push({
378
+ name,
379
+ value,
380
+ unit: "count",
381
+ period: "lifetime",
382
+ fetchedAt: now(),
383
+ freshness: "unknown",
384
+ source: "youtube-data-v3",
385
+ });
386
+ }
387
+ return metrics;
388
+ },
389
+ async getAccountMetrics(accountRef, context) {
390
+ // https://developers.google.com/youtube/v3/docs/channels/list
391
+ authorize(accountRef, context);
392
+ const result = object(await request("/youtube/v3/channels", context, undefined, {
393
+ id: options.auth.channelId,
394
+ part: "statistics,snippet",
395
+ }));
396
+ const channel = array(result["items"])
397
+ .map(object)
398
+ .find((item) => item["id"] === options.auth.channelId);
399
+ if (!channel)
400
+ throw new SocialError({
401
+ code: "unauthorized",
402
+ operation: "analytics.account.read",
403
+ message: "Configured channel was not returned for this authorization.",
404
+ });
405
+ const stats = object(channel["statistics"]);
406
+ const fetchedAt = now();
407
+ return ["viewCount", "subscriberCount", "videoCount"].flatMap((name) => {
408
+ if (name === "subscriberCount" && stats["hiddenSubscriberCount"] === true)
409
+ return [];
410
+ const raw = stats[name];
411
+ return typeof raw === "string" && /^\d+$/.test(raw) && Number.isSafeInteger(Number(raw))
412
+ ? [
413
+ {
414
+ name,
415
+ value: Number(raw),
416
+ unit: "count",
417
+ period: "lifetime",
418
+ fetchedAt,
419
+ freshness: "unknown",
420
+ source: "youtube-data-v3:channels.statistics",
421
+ },
422
+ ]
423
+ : [];
424
+ });
425
+ },
426
+ },
427
+ comments: {
428
+ async list(ref, input, context) {
429
+ authorize(ref, context);
430
+ const limit = input.limit ?? 25;
431
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100)
432
+ throw new SocialError({
433
+ code: "invalid_input",
434
+ operation: "comments.read",
435
+ message: "YouTube comment page size must be between 1 and 100.",
436
+ });
437
+ const result = object(await request("/youtube/v3/commentThreads", context, undefined, {
438
+ part: "snippet",
439
+ videoId: ref.postId,
440
+ textFormat: "plainText",
441
+ maxResults: String(limit),
442
+ ...(input.cursor === undefined ? {} : { pageToken: input.cursor }),
443
+ }));
444
+ const cursor = optionalString(result["nextPageToken"]);
445
+ return {
446
+ items: array(result["items"]).map((value) => {
447
+ const row = object(value);
448
+ const comment = object(object(row["snippet"])["topLevelComment"]);
449
+ return {
450
+ id: string(comment["id"]),
451
+ ...publicFields(comment["snippet"], [
452
+ "textDisplay",
453
+ "authorDisplayName",
454
+ "publishedAt",
455
+ "likeCount",
456
+ ]),
457
+ };
458
+ }),
459
+ ...(cursor ? { nextCursor: cursor } : {}),
460
+ };
461
+ },
462
+ async reply(ref, content, context) {
463
+ authorize(ref, context);
464
+ const parentResult = object(await request("/youtube/v3/comments", context, undefined, {
465
+ id: ref.commentId,
466
+ part: "snippet",
467
+ }));
468
+ const parent = array(parentResult["items"]).map(object)[0];
469
+ const parentSnippet = parent === undefined ? undefined : object(parent["snippet"]);
470
+ if (parentSnippet === undefined || parentSnippet["videoId"] !== ref.postId)
471
+ throw new SocialError({
472
+ code: "unauthorized",
473
+ operation: "comments.write",
474
+ message: "YouTube comment does not belong to the supplied video.",
475
+ });
476
+ const result = object(await request("/youtube/v3/comments", context, { snippet: { parentId: ref.commentId, textOriginal: content.text } }, { part: "snippet" }));
477
+ return { ...ref, commentId: string(result["id"]) };
478
+ },
479
+ },
480
+ native: {
481
+ async resumeUpload(session, media, context) {
482
+ if (session.channelId !== options.auth.channelId)
483
+ throw new SocialError({
484
+ code: "unauthorized",
485
+ operation: "youtube.upload",
486
+ message: "Upload session belongs to another channel.",
487
+ });
488
+ const uploadOptions = {
489
+ timeoutMs: remainingBudget(context),
490
+ accessToken: options.auth.accessToken,
491
+ ...(options.fetch ? { fetch: options.fetch } : {}),
492
+ ...(context.signal ? { signal: context.signal } : {}),
493
+ };
494
+ const confirmed = await queryYouTubeUpload(session, uploadOptions);
495
+ if (confirmed.state === "complete")
496
+ return confirmed;
497
+ return sendYouTubeUpload(session, media, uploadOptions, confirmed.nextByte);
498
+ },
499
+ async queryUpload(session, context) {
500
+ if (session.channelId !== options.auth.channelId)
501
+ throw new SocialError({
502
+ code: "unauthorized",
503
+ operation: "youtube.upload",
504
+ message: "Upload session belongs to another channel.",
505
+ });
506
+ return queryYouTubeUpload(session, {
507
+ accessToken: options.auth.accessToken,
508
+ ...(options.fetch ? { fetch: options.fetch } : {}),
509
+ ...(context.signal ? { signal: context.signal } : {}),
510
+ });
511
+ },
512
+ async setThumbnail({ videoId, thumbnail, context }) {
513
+ void thumbnail;
514
+ authorize({
515
+ backend: context.backendInstance,
516
+ platform: "youtube",
517
+ accountId: options.auth.channelId,
518
+ }, context);
519
+ return object(await request("/youtube/v3/thumbnails/set", context, undefined, { videoId, uploadType: "media" }, "POST"));
520
+ },
521
+ async captions({ action, videoId, captionId, context }) {
522
+ const method = action === "list" ? "GET" : action === "delete" ? "DELETE" : "POST";
523
+ return object(await request("/youtube/v3/captions", context, action === "insert" ? { snippet: { videoId } } : undefined, {
524
+ ...(action === "list" || action === "insert" ? { videoId } : {}),
525
+ ...(captionId ? { id: captionId } : {}),
526
+ part: "snippet",
527
+ }, method));
528
+ },
529
+ async playlists({ action, playlistId, body, context }) {
530
+ const method = action === "list"
531
+ ? "GET"
532
+ : action === "delete"
533
+ ? "DELETE"
534
+ : action === "update"
535
+ ? "PUT"
536
+ : "POST";
537
+ return object(await request("/youtube/v3/playlists", context, body, { ...(playlistId ? { id: playlistId } : {}), part: "snippet,status,contentDetails" }, method));
538
+ },
539
+ async updateVideo({ videoId, body, context }) {
540
+ return object(await request("/youtube/v3/videos", context, { id: videoId, ...body }, { part: "snippet,status" }, "PUT"));
541
+ },
542
+ async deleteVideo({ videoId, context }) {
543
+ await request("/youtube/v3/videos", context, undefined, { id: videoId }, "DELETE");
544
+ },
545
+ async analytics({ query, context }) {
546
+ return object(await analyticsRequest("/v2/reports", context, undefined, query));
547
+ },
548
+ async liveBroadcasts({ action, body, id, context }) {
549
+ if (action === "list")
550
+ return object(await request("/youtube/v3/liveBroadcasts", context, undefined, {
551
+ part: "snippet,status",
552
+ ...(id ? { id } : {}),
553
+ }));
554
+ if (action === "transition")
555
+ return object(await request("/youtube/v3/liveBroadcasts/transition", context, body, { part: "snippet,status", id: id ?? "" }, "POST"));
556
+ return object(await request("/youtube/v3/liveBroadcasts", context, body, { part: "snippet,status" }, "POST"));
557
+ },
558
+ },
559
+ });
560
+ }
561
+ //# sourceMappingURL=youtube.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/platforms/youtube.ts"],"names":[],"mappings":"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"}