sanity-plugin-mux-input 3.0.5 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/index.js +20 -92
  2. package/dist/index.js.map +1 -1
  3. package/package.json +5 -15
  4. package/dist/index.cjs +0 -5746
  5. package/dist/index.cjs.map +0 -1
  6. package/dist/index.d.cts +0 -288
  7. package/dist/index.d.cts.map +0 -1
  8. package/sanity.json +0 -8
  9. package/src/_exports/index.ts +0 -73
  10. package/src/actions/assets.ts +0 -152
  11. package/src/actions/secrets.ts +0 -110
  12. package/src/actions/upload.ts +0 -308
  13. package/src/clients/upChunkObservable.ts +0 -54
  14. package/src/components/AddCaptionDialog.tsx +0 -440
  15. package/src/components/CaptionsDialog.tsx +0 -23
  16. package/src/components/ConfigureApi.styled.tsx +0 -19
  17. package/src/components/ConfigureApi.tsx +0 -296
  18. package/src/components/DraggableWatermark.tsx +0 -885
  19. package/src/components/EditCaptionDialog.tsx +0 -511
  20. package/src/components/EditThumbnailDialog.tsx +0 -121
  21. package/src/components/ErrorBoundaryCard.tsx +0 -97
  22. package/src/components/FileInputButton.tsx +0 -54
  23. package/src/components/FileInputMenuItem.styled.tsx +0 -36
  24. package/src/components/FileInputMenuItem.tsx +0 -85
  25. package/src/components/FormField.tsx +0 -38
  26. package/src/components/IconInfo.tsx +0 -22
  27. package/src/components/ImportVideosFromMux.tsx +0 -339
  28. package/src/components/Input.styled.tsx +0 -22
  29. package/src/components/Input.tsx +0 -78
  30. package/src/components/InputBrowser.tsx +0 -41
  31. package/src/components/MuxLogo.tsx +0 -42
  32. package/src/components/Onboard.tsx +0 -65
  33. package/src/components/PageSelector.tsx +0 -54
  34. package/src/components/Player.styled.tsx +0 -11
  35. package/src/components/Player.tsx +0 -117
  36. package/src/components/PlayerActionsMenu.tsx +0 -191
  37. package/src/components/ResyncMetadata.tsx +0 -278
  38. package/src/components/SelectAsset.tsx +0 -39
  39. package/src/components/SelectSortOptions.tsx +0 -45
  40. package/src/components/SpinnerBox.tsx +0 -16
  41. package/src/components/StudioTool.tsx +0 -24
  42. package/src/components/TextTracksEditor.tsx +0 -117
  43. package/src/components/TextTracksManager.tsx +0 -738
  44. package/src/components/UploadConfiguration.tsx +0 -696
  45. package/src/components/UploadPlaceholder.tsx +0 -88
  46. package/src/components/UploadProgress.tsx +0 -80
  47. package/src/components/Uploader.styled.tsx +0 -65
  48. package/src/components/Uploader.tsx +0 -499
  49. package/src/components/VideoDetails/DeleteDialog.tsx +0 -148
  50. package/src/components/VideoDetails/VideoDetails.tsx +0 -358
  51. package/src/components/VideoDetails/VideoReferences.tsx +0 -63
  52. package/src/components/VideoDetails/useVideoDetails.ts +0 -103
  53. package/src/components/VideoInBrowser.tsx +0 -245
  54. package/src/components/VideoMetadata.tsx +0 -45
  55. package/src/components/VideoPlayer.tsx +0 -241
  56. package/src/components/VideoThumbnail.tsx +0 -139
  57. package/src/components/VideosBrowser.tsx +0 -100
  58. package/src/components/documentPreview/DocumentPreview.tsx +0 -84
  59. package/src/components/documentPreview/DraftStatus.tsx +0 -34
  60. package/src/components/documentPreview/MissingSchemaType.tsx +0 -32
  61. package/src/components/documentPreview/PaneItemPreview.tsx +0 -67
  62. package/src/components/documentPreview/PublishedStatus.tsx +0 -35
  63. package/src/components/documentPreview/TimeAgo.tsx +0 -12
  64. package/src/components/icons/Audio.tsx +0 -13
  65. package/src/components/icons/Resolution.tsx +0 -12
  66. package/src/components/icons/StopWatch.tsx +0 -20
  67. package/src/components/icons/ToolIcon.tsx +0 -19
  68. package/src/components/uploadConfiguration/PlaybackPolicy.tsx +0 -133
  69. package/src/components/uploadConfiguration/PlaybackPolicyOption.tsx +0 -76
  70. package/src/components/uploadConfiguration/PlaybackPolicyWarning.tsx +0 -29
  71. package/src/components/uploadConfiguration/ResolutionTierSelector.tsx +0 -72
  72. package/src/components/uploadConfiguration/StaticRenditionSelector.tsx +0 -180
  73. package/src/components/withFocusRing/helpers.ts +0 -24
  74. package/src/components/withFocusRing/index.ts +0 -1
  75. package/src/components/withFocusRing/withFocusRing.ts +0 -30
  76. package/src/context/DialogStateContext.tsx +0 -33
  77. package/src/context/DrmPlaybackWarningContext.tsx +0 -97
  78. package/src/hooks/useAccessControl.ts +0 -13
  79. package/src/hooks/useAssetDocumentValues.ts +0 -11
  80. package/src/hooks/useAssets.ts +0 -73
  81. package/src/hooks/useCancelUpload.ts +0 -22
  82. package/src/hooks/useClient.ts +0 -8
  83. package/src/hooks/useDialogState.ts +0 -11
  84. package/src/hooks/useDocReferences.ts +0 -21
  85. package/src/hooks/useFetchFileSize.ts +0 -55
  86. package/src/hooks/useImportMuxAssets.ts +0 -132
  87. package/src/hooks/useInView.ts +0 -41
  88. package/src/hooks/useMediaMetadata.ts +0 -104
  89. package/src/hooks/useMuxAssets.ts +0 -179
  90. package/src/hooks/useMuxPolling.ts +0 -52
  91. package/src/hooks/useResyncAsset.ts +0 -110
  92. package/src/hooks/useResyncMuxMetadata.ts +0 -169
  93. package/src/hooks/useSaveSecrets.ts +0 -78
  94. package/src/hooks/useSecretsDocumentValues.ts +0 -38
  95. package/src/hooks/useSecretsFormState.ts +0 -47
  96. package/src/plugin.tsx +0 -31
  97. package/src/sanity-ui.d.ts +0 -5
  98. package/src/schema.ts +0 -196
  99. package/src/util/addKeysToMuxData.ts +0 -30
  100. package/src/util/asserters.ts +0 -23
  101. package/src/util/assetTitlePlaceholder.ts +0 -31
  102. package/src/util/constants.ts +0 -15
  103. package/src/util/convertWatermarkToMux.ts +0 -160
  104. package/src/util/createSearchFilter.ts +0 -76
  105. package/src/util/createUrlParamsObject.ts +0 -29
  106. package/src/util/extractFiles.ts +0 -67
  107. package/src/util/formatBytes.ts +0 -31
  108. package/src/util/formatDriveShareLink.ts +0 -64
  109. package/src/util/formatSeconds.ts +0 -48
  110. package/src/util/generateJwt.ts +0 -57
  111. package/src/util/getAnimatedPosterSrc.ts +0 -26
  112. package/src/util/getPlaybackPolicy.ts +0 -69
  113. package/src/util/getPosterSrc.ts +0 -28
  114. package/src/util/getVideoMetadata.ts +0 -23
  115. package/src/util/getVideoSrc.ts +0 -23
  116. package/src/util/parsers.ts +0 -5
  117. package/src/util/pluginVersion.ts +0 -5
  118. package/src/util/readSecrets.ts +0 -38
  119. package/src/util/roundPxString.ts +0 -16
  120. package/src/util/textTracks.ts +0 -222
  121. package/src/util/tryWithSuspend.ts +0 -22
  122. package/src/util/types.ts +0 -566
  123. package/v2-incompatible.js +0 -11
@@ -1,308 +0,0 @@
1
- import {uuid as generateUuid} from '@sanity/uuid'
2
- import {concat, defer, from, type Observable, of, throwError} from 'rxjs'
3
- import {catchError, mergeMap, mergeMapTo, switchMap} from 'rxjs/operators'
4
- import type {SanityClient} from 'sanity'
5
-
6
- import {createUpChunkObservable} from '../clients/upChunkObservable'
7
- import {formatDriveShareLink} from '../util/formatDriveShareLink'
8
- import {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'
9
- import {roundPxString} from '../util/roundPxString'
10
- import type {MuxAsset, MuxNewAssetSettings, WatermarkConfig} from '../util/types'
11
- import {getAsset} from './assets'
12
- import {testSecretsObservable} from './secrets'
13
-
14
- function sanitizeOverlaySettingsInPlace(settings: MuxNewAssetSettings) {
15
- const inputs = settings.input
16
- if (!inputs) return
17
- for (const input of inputs) {
18
- const overlay = (input as {overlay_settings?: Record<string, unknown>}).overlay_settings
19
- if (!overlay) continue
20
-
21
- const hm = roundPxString(overlay['horizontal_margin'])
22
- const vm = roundPxString(overlay['vertical_margin'])
23
- const w = roundPxString(overlay['width'])
24
-
25
- if (hm) overlay['horizontal_margin'] = hm
26
- if (vm) overlay['vertical_margin'] = vm
27
- if (w) overlay['width'] = w
28
- }
29
- }
30
-
31
- function sanitizePxStringsInJson(json: string): string {
32
- return json.replace(/"(-?\d+(?:\.\d+)?)px"/g, (_match, num) => {
33
- const n = Number(num)
34
- if (!Number.isFinite(n)) return _match
35
- let rounded = Math.round(n)
36
- if (rounded === 0) rounded = n < 0 ? -1 : 1
37
- return `"${rounded}px"`
38
- })
39
- }
40
-
41
- function cancelUpload(client: SanityClient, uuid: string) {
42
- return client.observable.request({
43
- url: `/addons/mux/uploads/${client.config().dataset}/${uuid}`,
44
- withCredentials: true,
45
- method: 'DELETE',
46
- query: PLUGIN_VERSION_QUERY,
47
- })
48
- }
49
-
50
- export function uploadUrl({
51
- url,
52
- settings,
53
- client,
54
- }: {
55
- url: string
56
- settings: MuxNewAssetSettings
57
- client: SanityClient
58
- watermark?: WatermarkConfig
59
- }) {
60
- return testUrl(url).pipe(
61
- switchMap((validUrl) => {
62
- return concat(
63
- of({type: 'url' as const, url: validUrl}),
64
- testSecretsObservable(client).pipe(
65
- switchMap((json) => {
66
- if (!json || !json.status) {
67
- return throwError(new Error('Invalid credentials'))
68
- }
69
- const uuid = generateUuid()
70
- const muxBody = settings
71
- if (!muxBody.input) muxBody.input = [{type: 'video'}]
72
- muxBody.input[0]!.url = validUrl
73
- sanitizeOverlaySettingsInPlace(muxBody)
74
-
75
- const query: Record<string, string> = {
76
- muxBody: sanitizePxStringsInJson(JSON.stringify(muxBody)),
77
- }
78
- const filename = validUrl.split('/').slice(-1)[0]
79
- if (filename) {
80
- query['filename'] = filename
81
- }
82
-
83
- const dataset = client.config().dataset
84
- return defer(() =>
85
- client.observable.request({
86
- url: `/addons/mux/assets/${dataset}`,
87
- withCredentials: true,
88
- method: 'POST',
89
- headers: {
90
- 'MUX-Proxy-UUID': uuid,
91
- 'Content-Type': 'application/json',
92
- },
93
- query: {...query, ...PLUGIN_VERSION_QUERY},
94
- }),
95
- ).pipe(
96
- mergeMap((result) => {
97
- const asset =
98
- (result && result.results && result.results[0] && result.results[0].document) ||
99
- null
100
-
101
- if (!asset) {
102
- return throwError(new Error('No asset document returned'))
103
- }
104
- return of({type: 'success' as const, id: uuid, asset})
105
- }),
106
- )
107
- }),
108
- ),
109
- )
110
- }),
111
- )
112
- }
113
-
114
- export function uploadFile({
115
- settings,
116
- client,
117
- file,
118
- watermark,
119
- }: {
120
- settings: MuxNewAssetSettings
121
- client: SanityClient
122
- file: File
123
- watermark?: WatermarkConfig
124
- }) {
125
- return testFile(file).pipe(
126
- switchMap((fileOptions) => {
127
- return concat(
128
- of({type: 'file' as const, file: fileOptions}),
129
- testSecretsObservable(client).pipe(
130
- switchMap((json) => {
131
- if (!json || !json.status) {
132
- return throwError(() => new Error('Invalid credentials'))
133
- }
134
- const uuid = generateUuid()
135
- const body = settings
136
- sanitizeOverlaySettingsInPlace(body)
137
-
138
- return concat(
139
- of({type: 'uuid' as const, uuid}),
140
- defer(() =>
141
- client.observable.request<{
142
- sanityAssetId: string
143
- upload: {
144
- cors_origin: string
145
- id: string
146
- new_asset_settings: MuxNewAssetSettings
147
- status: 'waiting'
148
- timeout: number
149
- url: string
150
- }
151
- }>({
152
- url: `/addons/mux/uploads/${client.config().dataset}`,
153
- withCredentials: true,
154
- method: 'POST',
155
- headers: {
156
- 'MUX-Proxy-UUID': uuid,
157
- 'Content-Type': 'application/json',
158
- },
159
- body,
160
- query: PLUGIN_VERSION_QUERY,
161
- }),
162
- ).pipe(
163
- mergeMap((result) => {
164
- return createUpChunkObservable(uuid, result.upload.url, file).pipe(
165
- // @TODO type the observable events
166
- mergeMap((event) => {
167
- if (event.type !== 'success') {
168
- return of(event)
169
- }
170
- return from(updateAssetDocumentFromUpload(client, uuid, watermark)).pipe(
171
- mergeMap((doc) => of({...event, asset: doc})),
172
- )
173
- }),
174
- catchError((err) => {
175
- // Delete asset document
176
- return cancelUpload(client, uuid).pipe(mergeMapTo(throwError(err)))
177
- }),
178
- )
179
- }),
180
- ),
181
- )
182
- }),
183
- ),
184
- )
185
- }),
186
- )
187
- }
188
-
189
- type UploadResponse = {
190
- data: {
191
- asset_id: string
192
- cors_origin: string
193
- id: string
194
- new_asset_settings: {
195
- static_renditions?: {resolution: string}[]
196
- passthrough: string
197
- playback_policies: ['public' | 'signed' | 'drm']
198
- }
199
- status: string
200
- timeout: number
201
- }
202
- }
203
- function getUpload(client: SanityClient, assetId: string) {
204
- const {dataset} = client.config()
205
- return client.request<UploadResponse>({
206
- url: `/addons/mux/uploads/${dataset}/${assetId}`,
207
- withCredentials: true,
208
- method: 'GET',
209
- query: PLUGIN_VERSION_QUERY,
210
- })
211
- }
212
-
213
- function pollUpload(client: SanityClient, uuid: string): Promise<UploadResponse> {
214
- const maxTries = 10
215
- let pollInterval: number
216
- let tries = 0
217
- let assetId: string
218
- let upload: UploadResponse
219
- return new Promise((resolve, reject) => {
220
- pollInterval = (setInterval as typeof window.setInterval)(async () => {
221
- try {
222
- upload = await getUpload(client, uuid)
223
- } catch (err) {
224
- reject(err)
225
- return
226
- }
227
- assetId = upload && upload.data && upload.data.asset_id
228
- if (assetId) {
229
- clearInterval(pollInterval)
230
- resolve(upload)
231
- }
232
- if (tries > maxTries) {
233
- clearInterval(pollInterval)
234
- reject(new Error('Upload did not finish'))
235
- }
236
- tries++
237
- }, 2000)
238
- })
239
- }
240
-
241
- async function updateAssetDocumentFromUpload(
242
- client: SanityClient,
243
- uuid: string,
244
- _watermark?: WatermarkConfig,
245
- ) {
246
- let upload: UploadResponse
247
- let asset: {data: MuxAsset}
248
- try {
249
- upload = await pollUpload(client, uuid)
250
- } catch (err) {
251
- return Promise.reject(err)
252
- }
253
- try {
254
- asset = await getAsset(client, upload.data.asset_id)
255
- } catch (err) {
256
- return Promise.reject(err)
257
- }
258
-
259
- const doc = {
260
- _id: uuid,
261
- _type: 'mux.videoAsset',
262
- status: asset.data.status,
263
- data: asset.data,
264
- assetId: asset.data.id,
265
- playbackId: asset.data.playback_ids[0]?.id,
266
- uploadId: upload.data.id,
267
- }
268
- return client.createOrReplace(doc).then(() => {
269
- return doc
270
- })
271
- }
272
-
273
- function testFile(file: File) {
274
- if (typeof window !== 'undefined' && file instanceof window.File) {
275
- const fileOptions = optionsFromFile({}, file)
276
- return of(fileOptions)
277
- }
278
- return throwError(new Error('Invalid file'))
279
- }
280
-
281
- function testUrl(url: string): Observable<string> {
282
- const error = new Error('Invalid URL')
283
- if (typeof url !== 'string') {
284
- return throwError(error)
285
- }
286
- let formattedUrl = url.trim()
287
- formattedUrl = formatDriveShareLink(formattedUrl)
288
- let parsed
289
- try {
290
- parsed = new URL(formattedUrl)
291
- } catch {
292
- return throwError(error)
293
- }
294
- if (parsed && !parsed.protocol.match(/http:|https:/)) {
295
- return throwError(error)
296
- }
297
- return of(formattedUrl)
298
- }
299
-
300
- function optionsFromFile(opts: {preserveFilename?: boolean}, file: File) {
301
- if (typeof window === 'undefined' || !(file instanceof window.File)) {
302
- return undefined
303
- }
304
- return {
305
- name: opts.preserveFilename === false ? undefined : file.name,
306
- type: file.type,
307
- }
308
- }
@@ -1,54 +0,0 @@
1
- import {UpChunk} from '@mux/upchunk'
2
- import {Observable} from 'rxjs'
3
-
4
- export function createUpChunkObservable(uuid: string, uploadUrl: string, source: File) {
5
- return new Observable<
6
- | {type: 'pause' | 'resume'; id: string}
7
- | {type: 'success'; id: string}
8
- | {type: 'progress'; percent: number}
9
- >((subscriber) => {
10
- const upchunk = UpChunk.createUpload({
11
- endpoint: uploadUrl,
12
- file: source,
13
- dynamicChunkSize: true, // changes the chunk size based on network speeds
14
- })
15
-
16
- const successHandler = () => {
17
- subscriber.next({
18
- type: 'success',
19
- id: uuid,
20
- })
21
- subscriber.complete()
22
- }
23
-
24
- const errorHandler = (data: CustomEvent) => subscriber.error(new Error(data.detail.message))
25
-
26
- const progressHandler = (data: CustomEvent) => {
27
- return subscriber.next({type: 'progress', percent: data.detail})
28
- }
29
-
30
- const offlineHandler = () => {
31
- upchunk.pause()
32
- subscriber.next({
33
- type: 'pause',
34
- id: uuid,
35
- })
36
- }
37
-
38
- const onlineHandler = () => {
39
- upchunk.resume()
40
- subscriber.next({
41
- type: 'resume',
42
- id: uuid,
43
- })
44
- }
45
-
46
- upchunk.on('success', successHandler)
47
- upchunk.on('error', errorHandler)
48
- upchunk.on('progress', progressHandler)
49
- upchunk.on('offline', offlineHandler)
50
- upchunk.on('online', onlineHandler)
51
-
52
- return () => upchunk.abort()
53
- })
54
- }