blitzreels 0.1.4 → 0.1.6

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 (214) hide show
  1. package/README.md +55 -25
  2. package/dist/agent-context.d.ts +68 -0
  3. package/dist/agent-context.d.ts.map +1 -0
  4. package/dist/agent-context.js +214 -0
  5. package/dist/agent-context.js.map +1 -0
  6. package/dist/cli-command-routing.d.ts +27 -0
  7. package/dist/cli-command-routing.d.ts.map +1 -0
  8. package/dist/cli-command-routing.js +236 -0
  9. package/dist/cli-command-routing.js.map +1 -0
  10. package/dist/cli-errors.d.ts +31 -0
  11. package/dist/cli-errors.d.ts.map +1 -0
  12. package/dist/cli-errors.js +27 -0
  13. package/dist/cli-errors.js.map +1 -0
  14. package/dist/cli-flag-reader.d.ts +61 -0
  15. package/dist/cli-flag-reader.d.ts.map +1 -0
  16. package/dist/cli-flag-reader.js +207 -0
  17. package/dist/cli-flag-reader.js.map +1 -0
  18. package/dist/cli-http.d.ts +6 -0
  19. package/dist/cli-http.d.ts.map +1 -0
  20. package/dist/cli-http.js +42 -0
  21. package/dist/cli-http.js.map +1 -0
  22. package/dist/cli-presenter.d.ts +24 -0
  23. package/dist/cli-presenter.d.ts.map +1 -0
  24. package/dist/cli-presenter.js +161 -0
  25. package/dist/cli-presenter.js.map +1 -0
  26. package/dist/cli-runtime.d.ts +1 -2
  27. package/dist/cli-runtime.d.ts.map +1 -1
  28. package/dist/cli-runtime.js +2 -2
  29. package/dist/cli-runtime.js.map +1 -1
  30. package/dist/cli-timing.d.ts +4 -0
  31. package/dist/cli-timing.d.ts.map +1 -0
  32. package/dist/cli-timing.js +6 -0
  33. package/dist/cli-timing.js.map +1 -0
  34. package/dist/cli-types.d.ts +52 -0
  35. package/dist/cli-types.d.ts.map +1 -1
  36. package/dist/cli-value-parsers.d.ts +76 -0
  37. package/dist/cli-value-parsers.d.ts.map +1 -0
  38. package/dist/cli-value-parsers.js +271 -0
  39. package/dist/cli-value-parsers.js.map +1 -0
  40. package/dist/command-metadata.d.ts +11 -5
  41. package/dist/command-metadata.d.ts.map +1 -1
  42. package/dist/command-metadata.js +64 -9
  43. package/dist/command-metadata.js.map +1 -1
  44. package/dist/command-registry.d.ts +1 -1
  45. package/dist/command-registry.d.ts.map +1 -1
  46. package/dist/command-registry.js +44 -853
  47. package/dist/command-registry.js.map +1 -1
  48. package/dist/commands/ai-edit.d.ts +45 -0
  49. package/dist/commands/ai-edit.d.ts.map +1 -0
  50. package/dist/commands/ai-edit.js +370 -0
  51. package/dist/commands/ai-edit.js.map +1 -0
  52. package/dist/commands/api.d.ts +20 -0
  53. package/dist/commands/api.d.ts.map +1 -0
  54. package/dist/commands/api.js +56 -0
  55. package/dist/commands/api.js.map +1 -0
  56. package/dist/commands/audio.d.ts +65 -0
  57. package/dist/commands/audio.d.ts.map +1 -0
  58. package/dist/commands/audio.js +264 -0
  59. package/dist/commands/audio.js.map +1 -0
  60. package/dist/commands/auth-runtime.d.ts +24 -0
  61. package/dist/commands/auth-runtime.d.ts.map +1 -0
  62. package/dist/commands/auth-runtime.js +169 -0
  63. package/dist/commands/auth-runtime.js.map +1 -0
  64. package/dist/commands/auth.d.ts +26 -0
  65. package/dist/commands/auth.d.ts.map +1 -0
  66. package/dist/commands/auth.js +59 -0
  67. package/dist/commands/auth.js.map +1 -0
  68. package/dist/commands/caption-command-types.d.ts +66 -0
  69. package/dist/commands/caption-command-types.d.ts.map +1 -0
  70. package/dist/commands/caption-command-types.js +2 -0
  71. package/dist/commands/caption-command-types.js.map +1 -0
  72. package/dist/commands/caption-dry-run.d.ts +66 -0
  73. package/dist/commands/caption-dry-run.d.ts.map +1 -0
  74. package/dist/commands/caption-dry-run.js +225 -0
  75. package/dist/commands/caption-dry-run.js.map +1 -0
  76. package/dist/commands/caption-overrides.d.ts +43 -0
  77. package/dist/commands/caption-overrides.d.ts.map +1 -0
  78. package/dist/commands/caption-overrides.js +245 -0
  79. package/dist/commands/caption-overrides.js.map +1 -0
  80. package/dist/commands/caption-selection.d.ts +72 -0
  81. package/dist/commands/caption-selection.d.ts.map +1 -0
  82. package/dist/commands/caption-selection.js +89 -0
  83. package/dist/commands/caption-selection.js.map +1 -0
  84. package/dist/commands/caption-style-commands.d.ts +3 -0
  85. package/dist/commands/caption-style-commands.d.ts.map +1 -0
  86. package/dist/commands/caption-style-commands.js +240 -0
  87. package/dist/commands/caption-style-commands.js.map +1 -0
  88. package/dist/commands/caption-style-flags.d.ts +30 -0
  89. package/dist/commands/caption-style-flags.d.ts.map +1 -0
  90. package/dist/commands/caption-style-flags.js +257 -0
  91. package/dist/commands/caption-style-flags.js.map +1 -0
  92. package/dist/commands/caption-text-updates.d.ts +21 -0
  93. package/dist/commands/caption-text-updates.d.ts.map +1 -0
  94. package/dist/commands/caption-text-updates.js +23 -0
  95. package/dist/commands/caption-text-updates.js.map +1 -0
  96. package/dist/commands/captions-specs.d.ts +3 -0
  97. package/dist/commands/captions-specs.d.ts.map +1 -0
  98. package/dist/commands/captions-specs.js +241 -0
  99. package/dist/commands/captions-specs.js.map +1 -0
  100. package/dist/commands/captions.d.ts +7 -0
  101. package/dist/commands/captions.d.ts.map +1 -0
  102. package/dist/commands/captions.js +203 -0
  103. package/dist/commands/captions.js.map +1 -0
  104. package/dist/commands/clip-runtime.d.ts +67 -0
  105. package/dist/commands/clip-runtime.d.ts.map +1 -0
  106. package/dist/commands/clip-runtime.js +194 -0
  107. package/dist/commands/clip-runtime.js.map +1 -0
  108. package/dist/commands/clips.d.ts +66 -0
  109. package/dist/commands/clips.d.ts.map +1 -0
  110. package/dist/commands/clips.js +625 -0
  111. package/dist/commands/clips.js.map +1 -0
  112. package/dist/commands/command-operation.d.ts +26 -0
  113. package/dist/commands/command-operation.d.ts.map +1 -0
  114. package/dist/commands/command-operation.js +18 -0
  115. package/dist/commands/command-operation.js.map +1 -0
  116. package/dist/commands/editing-workflow-runtime.d.ts +42 -0
  117. package/dist/commands/editing-workflow-runtime.d.ts.map +1 -0
  118. package/dist/commands/editing-workflow-runtime.js +128 -0
  119. package/dist/commands/editing-workflow-runtime.js.map +1 -0
  120. package/dist/commands/editing-workflows.d.ts +70 -0
  121. package/dist/commands/editing-workflows.d.ts.map +1 -0
  122. package/dist/commands/editing-workflows.js +252 -0
  123. package/dist/commands/editing-workflows.js.map +1 -0
  124. package/dist/commands/effects-runtime.d.ts +64 -0
  125. package/dist/commands/effects-runtime.d.ts.map +1 -0
  126. package/dist/commands/effects-runtime.js +100 -0
  127. package/dist/commands/effects-runtime.js.map +1 -0
  128. package/dist/commands/effects.d.ts +69 -0
  129. package/dist/commands/effects.d.ts.map +1 -0
  130. package/dist/commands/effects.js +281 -0
  131. package/dist/commands/effects.js.map +1 -0
  132. package/dist/commands/exports.d.ts +16 -5
  133. package/dist/commands/exports.d.ts.map +1 -1
  134. package/dist/commands/exports.js +119 -2
  135. package/dist/commands/exports.js.map +1 -1
  136. package/dist/commands/faceless.d.ts +44 -0
  137. package/dist/commands/faceless.d.ts.map +1 -0
  138. package/dist/commands/faceless.js +587 -0
  139. package/dist/commands/faceless.js.map +1 -0
  140. package/dist/commands/formats.d.ts +41 -0
  141. package/dist/commands/formats.d.ts.map +1 -0
  142. package/dist/commands/formats.js +140 -0
  143. package/dist/commands/formats.js.map +1 -0
  144. package/dist/commands/jobs.d.ts +20 -0
  145. package/dist/commands/jobs.d.ts.map +1 -0
  146. package/dist/commands/jobs.js +40 -0
  147. package/dist/commands/jobs.js.map +1 -0
  148. package/dist/commands/media-assets.d.ts +100 -0
  149. package/dist/commands/media-assets.d.ts.map +1 -0
  150. package/dist/commands/media-assets.js +644 -0
  151. package/dist/commands/media-assets.js.map +1 -0
  152. package/dist/commands/media-overlays.d.ts +52 -0
  153. package/dist/commands/media-overlays.d.ts.map +1 -0
  154. package/dist/commands/media-overlays.js +314 -0
  155. package/dist/commands/media-overlays.js.map +1 -0
  156. package/dist/commands/media-runtime.d.ts +61 -0
  157. package/dist/commands/media-runtime.d.ts.map +1 -0
  158. package/dist/commands/media-runtime.js +239 -0
  159. package/dist/commands/media-runtime.js.map +1 -0
  160. package/dist/commands/onboarding.d.ts +51 -0
  161. package/dist/commands/onboarding.d.ts.map +1 -0
  162. package/dist/commands/onboarding.js +452 -0
  163. package/dist/commands/onboarding.js.map +1 -0
  164. package/dist/commands/project-read.d.ts +40 -0
  165. package/dist/commands/project-read.d.ts.map +1 -0
  166. package/dist/commands/project-read.js +184 -0
  167. package/dist/commands/project-read.js.map +1 -0
  168. package/dist/commands/projects.d.ts +16 -5
  169. package/dist/commands/projects.d.ts.map +1 -1
  170. package/dist/commands/projects.js +139 -2
  171. package/dist/commands/projects.js.map +1 -1
  172. package/dist/commands/stock-library.d.ts +72 -0
  173. package/dist/commands/stock-library.d.ts.map +1 -0
  174. package/dist/commands/stock-library.js +175 -0
  175. package/dist/commands/stock-library.js.map +1 -0
  176. package/dist/commands/system.d.ts +16 -0
  177. package/dist/commands/system.d.ts.map +1 -0
  178. package/dist/commands/system.js +147 -0
  179. package/dist/commands/system.js.map +1 -0
  180. package/dist/commands/text-overlay-spec.d.ts +24 -0
  181. package/dist/commands/text-overlay-spec.d.ts.map +1 -0
  182. package/dist/commands/text-overlay-spec.js +228 -0
  183. package/dist/commands/text-overlay-spec.js.map +1 -0
  184. package/dist/commands/text-overlays.d.ts +67 -0
  185. package/dist/commands/text-overlays.d.ts.map +1 -0
  186. package/dist/commands/text-overlays.js +272 -0
  187. package/dist/commands/text-overlays.js.map +1 -0
  188. package/dist/commands/timeline-runtime.d.ts +105 -0
  189. package/dist/commands/timeline-runtime.d.ts.map +1 -0
  190. package/dist/commands/timeline-runtime.js +508 -0
  191. package/dist/commands/timeline-runtime.js.map +1 -0
  192. package/dist/commands/timeline.d.ts +120 -0
  193. package/dist/commands/timeline.d.ts.map +1 -0
  194. package/dist/commands/timeline.js +621 -0
  195. package/dist/commands/timeline.js.map +1 -0
  196. package/dist/commands/workspace-defaults.d.ts +12 -0
  197. package/dist/commands/workspace-defaults.d.ts.map +1 -0
  198. package/dist/commands/workspace-defaults.js +115 -0
  199. package/dist/commands/workspace-defaults.js.map +1 -0
  200. package/dist/commands/workspace.d.ts +50 -0
  201. package/dist/commands/workspace.d.ts.map +1 -0
  202. package/dist/commands/workspace.js +116 -0
  203. package/dist/commands/workspace.js.map +1 -0
  204. package/dist/index.js +485 -5035
  205. package/dist/index.js.map +1 -1
  206. package/dist/preview-first-edit.d.ts +9 -1
  207. package/dist/preview-first-edit.d.ts.map +1 -1
  208. package/dist/preview-first-edit.js +16 -4
  209. package/dist/preview-first-edit.js.map +1 -1
  210. package/dist/update-notifier.d.ts +43 -0
  211. package/dist/update-notifier.d.ts.map +1 -0
  212. package/dist/update-notifier.js +265 -0
  213. package/dist/update-notifier.js.map +1 -0
  214. package/package.json +2 -2
@@ -0,0 +1,644 @@
1
+ import { commandSpec } from "../command-metadata.js";
2
+ import { requireDeleteConfirmation, } from "../preview-first-edit.js";
3
+ export const MEDIA_ASSET_COMMAND_SPECS = [
4
+ commandSpec({
5
+ command: ["media", "list"],
6
+ usage: "blitzreels media list [--folder-id ID] [--asset-type video|audio|image|document] [--search QUERY] [--limit 100] [--offset 0] [--json]",
7
+ flags: ["folder-id", "asset-type", "search", "limit", "offset"],
8
+ }),
9
+ commandSpec({
10
+ command: ["media", "get"],
11
+ usage: "blitzreels media get --asset-id ID [--json]",
12
+ flags: ["asset-id"],
13
+ }),
14
+ commandSpec({
15
+ command: ["media", "delete"],
16
+ usage: "blitzreels media delete --asset-id ID --confirm-delete",
17
+ flags: ["asset-id", "confirm-delete"],
18
+ }),
19
+ commandSpec({
20
+ command: ["media", "upload"],
21
+ usage: "blitzreels media upload --file ./video.mp4 [--name NAME] [--content-type video/mp4] [--auto-process true] [--auto-transcribe true] [--auto-describe true] [--auto-suggest-shorts true]",
22
+ flags: [
23
+ "file",
24
+ "name",
25
+ "content-type",
26
+ "auto-process",
27
+ "auto-transcribe",
28
+ "auto-describe",
29
+ "auto-suggest-shorts",
30
+ ],
31
+ }),
32
+ commandSpec({
33
+ command: ["media", "import-youtube"],
34
+ usage: "blitzreels media import-youtube --url URL [--folder-id ID|root] [--quality 1080p] [--fps 30] [--audio-language fr|null]",
35
+ flags: ["url", "folder-id", "quality", "fps", "audio-language"],
36
+ }),
37
+ commandSpec({
38
+ command: ["media", "import-google-drive"],
39
+ usage: "blitzreels media import-google-drive --url URL [--folder-id ID|root] [--content-profile auto|podcast] [--auto-trim-silence]",
40
+ flags: [
41
+ "url",
42
+ "folder-id",
43
+ {
44
+ name: "content-profile",
45
+ enum: ["auto", "podcast"],
46
+ description: "short suggestion content profile",
47
+ },
48
+ {
49
+ name: "auto-trim-silence",
50
+ type: "boolean",
51
+ description: "auto trim silence before suggesting shorts",
52
+ },
53
+ ],
54
+ description: "Import a shared Google Drive video into workspace media library.",
55
+ dryRunSupported: false,
56
+ }),
57
+ commandSpec({
58
+ command: ["media", "rename"],
59
+ usage: "blitzreels media rename --asset-id ID --name NAME",
60
+ flags: ["asset-id", "name"],
61
+ }),
62
+ commandSpec({
63
+ command: ["media", "update"],
64
+ usage: "blitzreels media update --asset-id ID [--name NAME] [--description TEXT|null] [--folder-id ID|root] [--allow-broll true]",
65
+ flags: ["asset-id", "name", "description", "folder-id", "allow-broll"],
66
+ }),
67
+ commandSpec({
68
+ command: ["media", "move"],
69
+ usage: "blitzreels media move --asset-id ID|--asset-ids ID1,ID2 --target-folder-id ID|root",
70
+ flags: ["asset-id", "asset-ids", "target-folder-id"],
71
+ }),
72
+ commandSpec({
73
+ command: ["media", "wait"],
74
+ usage: "blitzreels media wait --asset-id ID [--for processing|processed|transcription|description|shorts|all] [--project-id ID] [--interval-ms 3000] [--timeout-ms 600000] [--json]",
75
+ flags: ["asset-id", "for", "project-id", "interval-ms", "timeout-ms"],
76
+ description: "Poll a media asset until background processing or description metadata is ready.",
77
+ }),
78
+ commandSpec({
79
+ command: ["media", "shorts", "list"],
80
+ usage: "blitzreels media shorts list --asset-id ID [--limit 20] [--offset 0] [--json]",
81
+ flags: ["asset-id", "limit", "offset"],
82
+ description: "List saved and draft short suggestions for a media asset.",
83
+ }),
84
+ commandSpec({
85
+ command: ["media", "shorts", "generate"],
86
+ usage: "blitzreels media shorts generate --asset-id ID [--content-profile auto|podcast|tutorial|generic] [--auto-trim-silence true]",
87
+ flags: ["asset-id", "content-profile", "auto-trim-silence"],
88
+ description: "Start short suggestion generation for a media asset.",
89
+ dryRunSupported: false,
90
+ }),
91
+ commandSpec({
92
+ command: ["media", "shorts", "apply"],
93
+ usage: "blitzreels media shorts apply --asset-id ID --suggestion-id ID --project-id ID [--caption-style-id ID|null] [--mark-saved true] [--automatic-layout-json JSON]",
94
+ flags: [
95
+ "asset-id",
96
+ "suggestion-id",
97
+ "project-id",
98
+ "caption-style-id",
99
+ "mark-saved",
100
+ "automatic-layout-json",
101
+ ],
102
+ description: "Apply a short suggestion to a project timeline.",
103
+ dryRunSupported: false,
104
+ }),
105
+ commandSpec({
106
+ command: ["media", "folders", "list"],
107
+ usage: "blitzreels media folders list [--parent-folder-id ID] [--json]",
108
+ flags: ["parent-folder-id"],
109
+ }),
110
+ commandSpec({
111
+ command: ["media", "folders", "create"],
112
+ usage: "blitzreels media folders create --name NAME [--parent-folder-id ID] [--description TEXT|null] [--icon-type video]",
113
+ flags: ["name", "parent-folder-id", "description", "icon-type"],
114
+ }),
115
+ commandSpec({
116
+ command: ["media", "folders", "rename"],
117
+ usage: "blitzreels media folders rename --folder-id ID --name NAME",
118
+ flags: ["folder-id", "name"],
119
+ }),
120
+ commandSpec({
121
+ command: ["media", "folders", "update"],
122
+ usage: "blitzreels media folders update --folder-id ID [--name NAME] [--parent-folder-id ID|root] [--description TEXT|null] [--icon-type video]",
123
+ flags: [
124
+ "folder-id",
125
+ "name",
126
+ "parent-folder-id",
127
+ "description",
128
+ "icon-type",
129
+ ],
130
+ }),
131
+ commandSpec({
132
+ command: ["media", "folders", "delete"],
133
+ usage: "blitzreels media folders delete --folder-id ID --confirm-delete [--cascade true]",
134
+ flags: ["folder-id", "confirm-delete", "cascade"],
135
+ }),
136
+ ];
137
+ export function createMediaAssetCommandOperation({ helpers, }) {
138
+ return {
139
+ name: "media-assets",
140
+ matches: ({ command }) => matchesMediaAssetCommand({ command }),
141
+ handle: ({ context }) => handleMediaAssetCommand({ context, helpers }),
142
+ buildDryRun: ({ context, spec }) => buildMediaAssetDryRun({ context, spec, helpers }),
143
+ };
144
+ }
145
+ async function handleMediaAssetCommand({ context, helpers, }) {
146
+ const [group, action, subaction] = context.args.command;
147
+ const flags = context.args.flags;
148
+ if (group !== "media") {
149
+ return false;
150
+ }
151
+ if (action === "list") {
152
+ const result = await context.client.media.list({
153
+ folderId: helpers.getStringFlag({ flags, name: "folder-id" }),
154
+ assetType: helpers.parseAssetType({
155
+ value: helpers.getStringFlag({ flags, name: "asset-type" }),
156
+ }),
157
+ search: helpers.getStringFlag({ flags, name: "search" }),
158
+ limit: helpers.getNumberFlag({ flags, name: "limit" }),
159
+ offset: helpers.getNumberFlag({ flags, name: "offset" }),
160
+ });
161
+ helpers.printResult({
162
+ json: context.json,
163
+ value: result,
164
+ human: result.assets.map((asset) => `${asset.id} ${asset.assetType} ${asset.name ?? ""} ${asset.durationSeconds ?? "-"}s`),
165
+ });
166
+ return true;
167
+ }
168
+ if (action === "get") {
169
+ const result = await context.client.media.get({
170
+ assetId: helpers.requireStringFlag({ flags, name: "asset-id" }),
171
+ });
172
+ helpers.printResult({
173
+ json: context.json,
174
+ value: result,
175
+ fields: readEffectiveFields({
176
+ fields: context.fields,
177
+ flags,
178
+ getStringFlag: helpers.getStringFlag,
179
+ }),
180
+ human: [
181
+ `${result.asset.id} ${result.asset.assetType} ${result.asset.name}`,
182
+ `Processing: ${result.asset.processingStatus ?? "unknown"}${result.asset.processingSubstage ? `/${result.asset.processingSubstage}` : ""}`,
183
+ ...(result.asset.processingError
184
+ ? [`Processing error: ${result.asset.processingError}`]
185
+ : []),
186
+ `Retryable: ${result.asset.retryable ? "yes" : "no"}`,
187
+ ...(result.asset.providerRequestIds.processJobRunId
188
+ ? [`Process job: ${result.asset.providerRequestIds.processJobRunId}`]
189
+ : []),
190
+ ...(result.asset.providerRequestIds.transcribeJobRunId
191
+ ? [
192
+ `Transcribe job: ${result.asset.providerRequestIds.transcribeJobRunId}`,
193
+ ]
194
+ : []),
195
+ `URL: ${result.asset.fileUrl ?? ""}`,
196
+ ],
197
+ });
198
+ return true;
199
+ }
200
+ if (action === "delete") {
201
+ requireDeleteConfirmation({
202
+ confirmed: helpers.getBooleanFlag({ flags, name: "confirm-delete" }),
203
+ });
204
+ const result = await context.client.media.delete({
205
+ assetId: helpers.requireStringFlag({ flags, name: "asset-id" }),
206
+ });
207
+ helpers.printResult({
208
+ json: context.json,
209
+ value: result,
210
+ human: ["Media asset deleted."],
211
+ });
212
+ return true;
213
+ }
214
+ if (action === "upload") {
215
+ const result = await helpers.uploadMediaFile({ context });
216
+ helpers.printResult({
217
+ json: context.json,
218
+ value: result,
219
+ human: [
220
+ `Media uploaded: ${result.id} ${result.name} (${result.asset_type}, ${result.processing_status})`,
221
+ ],
222
+ });
223
+ return true;
224
+ }
225
+ if (action === "import-youtube") {
226
+ const result = await context.client.media.importYoutube({
227
+ url: helpers.requireStringFlag({ flags, name: "url" }),
228
+ folderId: helpers.parseFolderIdFlag({ flags, name: "folder-id" }),
229
+ quality: helpers.parseYoutubeQuality({
230
+ value: helpers.getStringFlag({ flags, name: "quality" }),
231
+ }),
232
+ fps: helpers.getNumberFlag({ flags, name: "fps" }),
233
+ audioLanguage: helpers.parseNullableStringFlag({
234
+ flags,
235
+ name: "audio-language",
236
+ }),
237
+ });
238
+ helpers.printResult({
239
+ json: context.json,
240
+ value: result,
241
+ human: [`YouTube import queued: ${result.asset_id} ${result.status}`],
242
+ });
243
+ return true;
244
+ }
245
+ if (action === "import-google-drive") {
246
+ const result = await context.client.media.importGoogleDrive({
247
+ url: helpers.requireStringFlag({ flags, name: "url" }),
248
+ folderId: helpers.parseFolderIdFlag({ flags, name: "folder-id" }),
249
+ shortSuggestionContentProfile: parseGoogleDriveImportContentProfile({
250
+ value: helpers.getStringFlag({ flags, name: "content-profile" }),
251
+ }),
252
+ autoTrimSilence: helpers.getOptionalBooleanFlag({
253
+ flags,
254
+ name: "auto-trim-silence",
255
+ }),
256
+ });
257
+ helpers.printResult({
258
+ json: context.json,
259
+ value: result,
260
+ human: [
261
+ `Google Drive import queued: ${result.asset_id} ${result.status}`,
262
+ ],
263
+ });
264
+ return true;
265
+ }
266
+ if (action === "update" || action === "rename") {
267
+ const result = await context.client.media.update({
268
+ assetId: helpers.requireStringFlag({ flags, name: "asset-id" }),
269
+ name: action === "rename"
270
+ ? helpers.requireStringFlag({ flags, name: "name" })
271
+ : helpers.getStringFlag({ flags, name: "name" }),
272
+ description: action === "rename"
273
+ ? undefined
274
+ : helpers.parseNullableStringFlag({ flags, name: "description" }),
275
+ folderId: action === "rename"
276
+ ? undefined
277
+ : helpers.parseFolderIdFlag({ flags, name: "folder-id" }),
278
+ allowUsingAsBroll: action === "rename"
279
+ ? undefined
280
+ : helpers.getOptionalBooleanFlag({ flags, name: "allow-broll" }),
281
+ });
282
+ helpers.printResult({
283
+ json: context.json,
284
+ value: result,
285
+ human: [
286
+ action === "rename"
287
+ ? `Media renamed: ${result.asset.id} ${result.asset.name}`
288
+ : `Media updated: ${result.asset.id} ${result.asset.name}`,
289
+ ],
290
+ });
291
+ return true;
292
+ }
293
+ if (action === "move") {
294
+ const result = await context.client.media.move({
295
+ assetIds: helpers.parseAssetIds({ flags }),
296
+ targetFolderId: helpers.requireFolderIdFlag({
297
+ flags,
298
+ name: "target-folder-id",
299
+ }),
300
+ });
301
+ helpers.printResult({
302
+ json: context.json,
303
+ value: result,
304
+ human: [`Moved ${result.moved_count} media asset(s).`],
305
+ });
306
+ return true;
307
+ }
308
+ if (action === "wait") {
309
+ const result = await helpers.waitForMediaAsset({ context });
310
+ helpers.printResult({
311
+ json: context.json,
312
+ value: result,
313
+ human: [
314
+ `Media ready: ${result.asset.id} ${result.asset.name} (${result.ready_for.join(", ")})`,
315
+ `Processing: ${result.asset.processingStatus ?? "unknown"}${result.asset.processingSubstage ? `/${result.asset.processingSubstage}` : ""}`,
316
+ ...(result.asset.processingError
317
+ ? [`Processing error: ${result.asset.processingError}`]
318
+ : []),
319
+ ],
320
+ });
321
+ return true;
322
+ }
323
+ if (action === "shorts") {
324
+ return handleMediaShortsCommand({ context, helpers, subaction });
325
+ }
326
+ if (action === "folders") {
327
+ return handleMediaFoldersCommand({ context, helpers, subaction });
328
+ }
329
+ return false;
330
+ }
331
+ async function handleMediaShortsCommand({ context, helpers, subaction, }) {
332
+ const flags = context.args.flags;
333
+ if (subaction === "list") {
334
+ const result = await context.client.media.shorts.list({
335
+ assetId: helpers.requireStringFlag({ flags, name: "asset-id" }),
336
+ limit: helpers.getNumberFlag({ flags, name: "limit" }),
337
+ offset: helpers.getNumberFlag({ flags, name: "offset" }),
338
+ });
339
+ helpers.printResult({
340
+ json: context.json,
341
+ value: result,
342
+ fields: readEffectiveFields({
343
+ fields: context.fields,
344
+ flags,
345
+ getStringFlag: helpers.getStringFlag,
346
+ }),
347
+ human: [
348
+ `Saved: ${result.saved.length}`,
349
+ `Drafts: ${result.drafts.length}`,
350
+ ...[...result.saved, ...result.drafts].map((suggestion) => JSON.stringify(suggestion)),
351
+ ],
352
+ });
353
+ return true;
354
+ }
355
+ if (subaction === "generate") {
356
+ const result = await context.client.media.shorts.generate({
357
+ assetId: helpers.requireStringFlag({ flags, name: "asset-id" }),
358
+ contentProfile: helpers.parseShortContentProfile({
359
+ value: helpers.getStringFlag({ flags, name: "content-profile" }),
360
+ }),
361
+ autoTrimSilence: helpers.getOptionalBooleanFlag({
362
+ flags,
363
+ name: "auto-trim-silence",
364
+ }),
365
+ });
366
+ helpers.printResult({
367
+ json: context.json,
368
+ value: result,
369
+ human: [`Short suggestion generation queued: ${result.run_id}`],
370
+ });
371
+ return true;
372
+ }
373
+ if (subaction === "apply") {
374
+ const result = await context.client.media.shorts.apply({
375
+ assetId: helpers.requireStringFlag({ flags, name: "asset-id" }),
376
+ suggestionId: helpers.requireStringFlag({ flags, name: "suggestion-id" }),
377
+ projectId: helpers.requireStringFlag({ flags, name: "project-id" }),
378
+ captionStyleId: helpers.parseNullableStringFlag({
379
+ flags,
380
+ name: "caption-style-id",
381
+ }),
382
+ markSaved: helpers.getOptionalBooleanFlag({ flags, name: "mark-saved" }),
383
+ allowUnverifiedExport: false,
384
+ automaticLayout: helpers.parseJsonObjectFlag({
385
+ flags,
386
+ name: "automatic-layout-json",
387
+ }),
388
+ });
389
+ helpers.printResult({
390
+ json: context.json,
391
+ value: result,
392
+ human: [
393
+ `Short applied: ${result.timeline_item_id} in project ${result.project_id}`,
394
+ ],
395
+ });
396
+ return true;
397
+ }
398
+ return false;
399
+ }
400
+ function readEffectiveFields({ fields, flags, getStringFlag, }) {
401
+ if (fields && fields.length > 0) {
402
+ return fields;
403
+ }
404
+ const value = getStringFlag({ flags, name: "fields" });
405
+ if (value === undefined) {
406
+ return undefined;
407
+ }
408
+ return value
409
+ .split(",")
410
+ .map((item) => item.trim())
411
+ .filter((item) => item.length > 0);
412
+ }
413
+ function parseGoogleDriveImportContentProfile({ value, }) {
414
+ if (value === undefined) {
415
+ return undefined;
416
+ }
417
+ if (value === "auto" || value === "podcast") {
418
+ return value;
419
+ }
420
+ throw new Error("--content-profile must be auto or podcast.");
421
+ }
422
+ async function handleMediaFoldersCommand({ context, helpers, subaction, }) {
423
+ const flags = context.args.flags;
424
+ if (subaction === "list") {
425
+ const result = await context.client.media.folders.list({
426
+ parentFolderId: helpers.getStringFlag({
427
+ flags,
428
+ name: "parent-folder-id",
429
+ }),
430
+ });
431
+ helpers.printResult({
432
+ json: context.json,
433
+ value: result,
434
+ human: result.folders.map((folder) => `${folder.id} ${folder.name} (${folder.assetCount ?? 0} assets)`),
435
+ });
436
+ return true;
437
+ }
438
+ if (subaction === "create") {
439
+ const result = await context.client.media.folders.create({
440
+ name: helpers.requireStringFlag({ flags, name: "name" }),
441
+ parentFolderId: helpers.parseFolderIdFlag({
442
+ flags,
443
+ name: "parent-folder-id",
444
+ }),
445
+ description: helpers.parseNullableStringFlag({
446
+ flags,
447
+ name: "description",
448
+ }),
449
+ iconType: helpers.getStringFlag({ flags, name: "icon-type" }),
450
+ });
451
+ helpers.printResult({
452
+ json: context.json,
453
+ value: result,
454
+ human: [`Folder created: ${result.folder.id} ${result.folder.name}`],
455
+ });
456
+ return true;
457
+ }
458
+ if (subaction === "rename" || subaction === "update") {
459
+ const result = await context.client.media.folders.update({
460
+ folderId: helpers.requireStringFlag({ flags, name: "folder-id" }),
461
+ name: subaction === "rename"
462
+ ? helpers.requireStringFlag({ flags, name: "name" })
463
+ : helpers.getStringFlag({ flags, name: "name" }),
464
+ parentFolderId: subaction === "rename"
465
+ ? undefined
466
+ : helpers.parseFolderIdFlag({ flags, name: "parent-folder-id" }),
467
+ description: subaction === "rename"
468
+ ? undefined
469
+ : helpers.parseNullableStringFlag({ flags, name: "description" }),
470
+ iconType: subaction === "rename"
471
+ ? undefined
472
+ : helpers.getStringFlag({ flags, name: "icon-type" }),
473
+ });
474
+ helpers.printResult({
475
+ json: context.json,
476
+ value: result,
477
+ human: [
478
+ subaction === "rename"
479
+ ? `Folder renamed: ${result.folder.id} ${result.folder.name}`
480
+ : `Folder updated: ${result.folder.id} ${result.folder.name}`,
481
+ ],
482
+ });
483
+ return true;
484
+ }
485
+ if (subaction === "delete") {
486
+ requireDeleteConfirmation({
487
+ confirmed: helpers.getBooleanFlag({ flags, name: "confirm-delete" }),
488
+ });
489
+ const result = await context.client.media.folders.delete({
490
+ folderId: helpers.requireStringFlag({ flags, name: "folder-id" }),
491
+ cascade: helpers.getOptionalBooleanFlag({ flags, name: "cascade" }),
492
+ });
493
+ helpers.printResult({
494
+ json: context.json,
495
+ value: result,
496
+ human: ["Folder deleted."],
497
+ });
498
+ return true;
499
+ }
500
+ return false;
501
+ }
502
+ function buildMediaAssetDryRun({ context, spec, helpers, }) {
503
+ const [group, action, subaction] = context.args.command;
504
+ if (group !== "media") {
505
+ return undefined;
506
+ }
507
+ const flags = context.args.flags;
508
+ if (action === "delete") {
509
+ requireDeleteConfirmation({
510
+ confirmed: helpers.getBooleanFlag({ flags, name: "confirm-delete" }),
511
+ });
512
+ return helpers.dryRunRequest({
513
+ spec,
514
+ method: "POST",
515
+ path: `/workspace/media/assets/${encodeURIComponent(helpers.requireStringFlag({ flags, name: "asset-id" }))}/delete`,
516
+ body: {},
517
+ });
518
+ }
519
+ if (action === "update" || action === "rename") {
520
+ return helpers.dryRunRequest({
521
+ spec,
522
+ method: "PATCH",
523
+ path: `/workspace/media/assets/${encodeURIComponent(helpers.requireStringFlag({ flags, name: "asset-id" }))}`,
524
+ body: {
525
+ name: action === "rename"
526
+ ? helpers.requireStringFlag({ flags, name: "name" })
527
+ : helpers.getStringFlag({ flags, name: "name" }),
528
+ description: action === "rename"
529
+ ? undefined
530
+ : helpers.parseNullableStringFlag({ flags, name: "description" }),
531
+ folder_id: action === "rename"
532
+ ? undefined
533
+ : helpers.parseFolderIdFlag({ flags, name: "folder-id" }),
534
+ allow_using_as_broll: action === "rename"
535
+ ? undefined
536
+ : helpers.getOptionalBooleanFlag({ flags, name: "allow-broll" }),
537
+ },
538
+ });
539
+ }
540
+ if (action === "move") {
541
+ return helpers.dryRunRequest({
542
+ spec,
543
+ method: "POST",
544
+ path: "/workspace/media/assets/move",
545
+ body: {
546
+ asset_ids: helpers.parseAssetIds({ flags }),
547
+ target_folder_id: helpers.requireFolderIdFlag({
548
+ flags,
549
+ name: "target-folder-id",
550
+ }),
551
+ },
552
+ });
553
+ }
554
+ if (action === "folders" && subaction === "create") {
555
+ return helpers.dryRunRequest({
556
+ spec,
557
+ method: "POST",
558
+ path: "/workspace/media/folders",
559
+ body: {
560
+ name: helpers.requireStringFlag({ flags, name: "name" }),
561
+ parent_folder_id: helpers.parseFolderIdFlag({
562
+ flags,
563
+ name: "parent-folder-id",
564
+ }),
565
+ description: helpers.parseNullableStringFlag({
566
+ flags,
567
+ name: "description",
568
+ }),
569
+ icon_type: helpers.getStringFlag({ flags, name: "icon-type" }),
570
+ },
571
+ });
572
+ }
573
+ if (action === "folders" &&
574
+ (subaction === "rename" || subaction === "update")) {
575
+ const folderId = helpers.requireStringFlag({ flags, name: "folder-id" });
576
+ return helpers.dryRunRequest({
577
+ spec,
578
+ method: "PATCH",
579
+ path: `/workspace/media/folders/${encodeURIComponent(folderId)}`,
580
+ body: {
581
+ name: subaction === "rename"
582
+ ? helpers.requireStringFlag({ flags, name: "name" })
583
+ : helpers.getStringFlag({ flags, name: "name" }),
584
+ parent_folder_id: subaction === "rename"
585
+ ? undefined
586
+ : helpers.parseFolderIdFlag({ flags, name: "parent-folder-id" }),
587
+ description: subaction === "rename"
588
+ ? undefined
589
+ : helpers.parseNullableStringFlag({ flags, name: "description" }),
590
+ icon_type: subaction === "rename"
591
+ ? undefined
592
+ : helpers.getStringFlag({ flags, name: "icon-type" }),
593
+ },
594
+ });
595
+ }
596
+ if (action === "folders" && subaction === "delete") {
597
+ requireDeleteConfirmation({
598
+ confirmed: helpers.getBooleanFlag({ flags, name: "confirm-delete" }),
599
+ });
600
+ const folderId = helpers.requireStringFlag({ flags, name: "folder-id" });
601
+ return helpers.dryRunRequest({
602
+ spec,
603
+ method: "DELETE",
604
+ path: `/workspace/media/folders/${encodeURIComponent(folderId)}`,
605
+ query: {
606
+ cascade: helpers.getOptionalBooleanFlag({ flags, name: "cascade" }),
607
+ },
608
+ body: undefined,
609
+ });
610
+ }
611
+ return undefined;
612
+ }
613
+ function matchesMediaAssetCommand({ command }) {
614
+ const [group, action, subaction] = command;
615
+ if (group !== "media") {
616
+ return false;
617
+ }
618
+ if (action === "attach" || action === "overlay") {
619
+ return false;
620
+ }
621
+ if (action === "shorts") {
622
+ return (subaction === "list" || subaction === "generate" || subaction === "apply");
623
+ }
624
+ if (action === "folders") {
625
+ return (subaction === "list" ||
626
+ subaction === "create" ||
627
+ subaction === "rename" ||
628
+ subaction === "update" ||
629
+ subaction === "delete");
630
+ }
631
+ return [
632
+ "list",
633
+ "get",
634
+ "delete",
635
+ "upload",
636
+ "import-youtube",
637
+ "import-google-drive",
638
+ "rename",
639
+ "update",
640
+ "move",
641
+ "wait",
642
+ ].includes(action ?? "");
643
+ }
644
+ //# sourceMappingURL=media-assets.js.map