@opencoredev/social-sdk 0.1.1 → 0.1.2

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 (154) hide show
  1. package/README.md +4 -2
  2. package/package.json +1 -1
  3. package/dist/cli.d.ts +0 -14
  4. package/dist/cli.d.ts.map +0 -1
  5. package/dist/cli.js +0 -234
  6. package/dist/cli.js.map +0 -1
  7. package/dist/cloud/common.d.ts +0 -26
  8. package/dist/cloud/common.d.ts.map +0 -1
  9. package/dist/cloud/common.js +0 -307
  10. package/dist/cloud/common.js.map +0 -1
  11. package/dist/cloud/lifecycle.d.ts +0 -11
  12. package/dist/cloud/lifecycle.d.ts.map +0 -1
  13. package/dist/cloud/lifecycle.js +0 -108
  14. package/dist/cloud/lifecycle.js.map +0 -1
  15. package/dist/cloud/media.d.ts +0 -24
  16. package/dist/cloud/media.d.ts.map +0 -1
  17. package/dist/cloud/media.js +0 -97
  18. package/dist/cloud/media.js.map +0 -1
  19. package/dist/cloud/outcomes.d.ts +0 -10
  20. package/dist/cloud/outcomes.d.ts.map +0 -1
  21. package/dist/cloud/outcomes.js +0 -188
  22. package/dist/cloud/outcomes.js.map +0 -1
  23. package/dist/cloud/post-for-me.d.ts +0 -70
  24. package/dist/cloud/post-for-me.d.ts.map +0 -1
  25. package/dist/cloud/post-for-me.js +0 -326
  26. package/dist/cloud/post-for-me.js.map +0 -1
  27. package/dist/cloud/zernio.d.ts +0 -112
  28. package/dist/cloud/zernio.d.ts.map +0 -1
  29. package/dist/cloud/zernio.js +0 -542
  30. package/dist/cloud/zernio.js.map +0 -1
  31. package/dist/core/adapter.d.ts +0 -118
  32. package/dist/core/adapter.d.ts.map +0 -1
  33. package/dist/core/adapter.js +0 -4
  34. package/dist/core/adapter.js.map +0 -1
  35. package/dist/core/client.d.ts +0 -108
  36. package/dist/core/client.d.ts.map +0 -1
  37. package/dist/core/client.js +0 -893
  38. package/dist/core/client.js.map +0 -1
  39. package/dist/core/concurrency.d.ts +0 -10
  40. package/dist/core/concurrency.d.ts.map +0 -1
  41. package/dist/core/concurrency.js +0 -78
  42. package/dist/core/concurrency.js.map +0 -1
  43. package/dist/core/errors.d.ts +0 -45
  44. package/dist/core/errors.d.ts.map +0 -1
  45. package/dist/core/errors.js +0 -44
  46. package/dist/core/errors.js.map +0 -1
  47. package/dist/core/idempotency.d.ts +0 -34
  48. package/dist/core/idempotency.d.ts.map +0 -1
  49. package/dist/core/idempotency.js +0 -59
  50. package/dist/core/idempotency.js.map +0 -1
  51. package/dist/core/index.d.ts +0 -7
  52. package/dist/core/index.d.ts.map +0 -1
  53. package/dist/core/index.js +0 -7
  54. package/dist/core/index.js.map +0 -1
  55. package/dist/core/pagination.d.ts +0 -12
  56. package/dist/core/pagination.d.ts.map +0 -1
  57. package/dist/core/pagination.js +0 -81
  58. package/dist/core/pagination.js.map +0 -1
  59. package/dist/core/types.d.ts +0 -329
  60. package/dist/core/types.d.ts.map +0 -1
  61. package/dist/core/types.js +0 -7
  62. package/dist/core/types.js.map +0 -1
  63. package/dist/index.d.ts +0 -2
  64. package/dist/index.d.ts.map +0 -1
  65. package/dist/index.js +0 -2
  66. package/dist/index.js.map +0 -1
  67. package/dist/platforms/bluesky.d.ts +0 -132
  68. package/dist/platforms/bluesky.d.ts.map +0 -1
  69. package/dist/platforms/bluesky.js +0 -1049
  70. package/dist/platforms/bluesky.js.map +0 -1
  71. package/dist/platforms/instagram.d.ts +0 -63
  72. package/dist/platforms/instagram.d.ts.map +0 -1
  73. package/dist/platforms/instagram.js +0 -676
  74. package/dist/platforms/instagram.js.map +0 -1
  75. package/dist/platforms/linkedin.d.ts +0 -54
  76. package/dist/platforms/linkedin.d.ts.map +0 -1
  77. package/dist/platforms/linkedin.js +0 -580
  78. package/dist/platforms/linkedin.js.map +0 -1
  79. package/dist/platforms/threads.d.ts +0 -102
  80. package/dist/platforms/threads.d.ts.map +0 -1
  81. package/dist/platforms/threads.js +0 -571
  82. package/dist/platforms/threads.js.map +0 -1
  83. package/dist/platforms/tiktok.d.ts +0 -32
  84. package/dist/platforms/tiktok.d.ts.map +0 -1
  85. package/dist/platforms/tiktok.js +0 -511
  86. package/dist/platforms/tiktok.js.map +0 -1
  87. package/dist/platforms/x-engagement.d.ts +0 -17
  88. package/dist/platforms/x-engagement.d.ts.map +0 -1
  89. package/dist/platforms/x-engagement.js +0 -47
  90. package/dist/platforms/x-engagement.js.map +0 -1
  91. package/dist/platforms/x.d.ts +0 -82
  92. package/dist/platforms/x.d.ts.map +0 -1
  93. package/dist/platforms/x.js +0 -511
  94. package/dist/platforms/x.js.map +0 -1
  95. package/dist/platforms/youtube-upload.d.ts +0 -33
  96. package/dist/platforms/youtube-upload.d.ts.map +0 -1
  97. package/dist/platforms/youtube-upload.js +0 -281
  98. package/dist/platforms/youtube-upload.js.map +0 -1
  99. package/dist/platforms/youtube.d.ts +0 -55
  100. package/dist/platforms/youtube.d.ts.map +0 -1
  101. package/dist/platforms/youtube.js +0 -561
  102. package/dist/platforms/youtube.js.map +0 -1
  103. package/dist/server/connections.d.ts +0 -124
  104. package/dist/server/connections.d.ts.map +0 -1
  105. package/dist/server/connections.js +0 -334
  106. package/dist/server/connections.js.map +0 -1
  107. package/dist/server/credentials.d.ts +0 -52
  108. package/dist/server/credentials.d.ts.map +0 -1
  109. package/dist/server/credentials.js +0 -115
  110. package/dist/server/credentials.js.map +0 -1
  111. package/dist/server/index.d.ts +0 -5
  112. package/dist/server/index.d.ts.map +0 -1
  113. package/dist/server/index.js +0 -5
  114. package/dist/server/index.js.map +0 -1
  115. package/dist/server/oauth.d.ts +0 -48
  116. package/dist/server/oauth.d.ts.map +0 -1
  117. package/dist/server/oauth.js +0 -483
  118. package/dist/server/oauth.js.map +0 -1
  119. package/dist/server/webhooks.d.ts +0 -58
  120. package/dist/server/webhooks.d.ts.map +0 -1
  121. package/dist/server/webhooks.js +0 -198
  122. package/dist/server/webhooks.js.map +0 -1
  123. package/dist/testing/index.d.ts +0 -47
  124. package/dist/testing/index.d.ts.map +0 -1
  125. package/dist/testing/index.js +0 -413
  126. package/dist/testing/index.js.map +0 -1
  127. package/dist/testing.d.ts +0 -2
  128. package/dist/testing.d.ts.map +0 -1
  129. package/dist/testing.js +0 -2
  130. package/dist/testing.js.map +0 -1
  131. package/dist/transport/binary.d.ts +0 -3
  132. package/dist/transport/binary.d.ts.map +0 -1
  133. package/dist/transport/binary.js +0 -30
  134. package/dist/transport/binary.js.map +0 -1
  135. package/dist/transport/budget.d.ts +0 -4
  136. package/dist/transport/budget.d.ts.map +0 -1
  137. package/dist/transport/budget.js +0 -27
  138. package/dist/transport/budget.js.map +0 -1
  139. package/dist/transport/http.d.ts +0 -44
  140. package/dist/transport/http.d.ts.map +0 -1
  141. package/dist/transport/http.js +0 -230
  142. package/dist/transport/http.js.map +0 -1
  143. package/dist/transport/json.d.ts +0 -3
  144. package/dist/transport/json.d.ts.map +0 -1
  145. package/dist/transport/json.js +0 -11
  146. package/dist/transport/json.js.map +0 -1
  147. package/dist/transport/upload.d.ts +0 -25
  148. package/dist/transport/upload.d.ts.map +0 -1
  149. package/dist/transport/upload.js +0 -133
  150. package/dist/transport/upload.js.map +0 -1
  151. package/dist/transport/validation.d.ts +0 -6
  152. package/dist/transport/validation.d.ts.map +0 -1
  153. package/dist/transport/validation.js +0 -24
  154. package/dist/transport/validation.js.map +0 -1
@@ -1,561 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/platforms/youtube.ts"],"names":[],"mappings":"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"}