transloadit/uppy · error · Error
Failed to get a media items
Error message
Failed to get a media items
What it means
Thrown while resolving the photos a user picked: a paginated GET of photospicker.googleapis.com/v1/mediaItems returned a non-OK response. It aborts resolution of the picked media items after the user has already made their selection in the Google Photos picker.
Source
Thrown at packages/@uppy/core/src/companion-client/googlePicker.ts:424
accessToken,
pickingSession,
signal,
}: {
accessToken: string
pickingSession: PickingSession
signal: AbortSignal
}) {
const headers = getAuthHeader(accessToken)
let pageToken: string | undefined
let mediaItems: MediaItem[] = []
do {
const pageSize = 100
const response = await fetch(
`https://photospicker.googleapis.com/v1/mediaItems?${new URLSearchParams({ sessionId: pickingSession.id, pageSize: String(pageSize), ...(pageToken && { pageToken }) }).toString()}`,
{ headers, signal },
)
if (!response.ok) throw new Error('Failed to get a media items')
const {
mediaItems: batchMediaItems,
nextPageToken,
}: { mediaItems: MediaItem[]; nextPageToken?: string } =
await response.json()
pageToken = nextPageToken
mediaItems.push(...batchMediaItems)
} while (pageToken)
// Filter out items that aren't fully processed or ready
mediaItems = mediaItems.flatMap((i) =>
i.type === 'PHOTO' ||
(i.type === 'VIDEO' &&
i.mediaFile.mediaFileMetadata.videoMetadata.processingStatus === 'READY')
? [i]
: [],
)
View on GitHub (pinned to 5d4dedd02a)
Solutions
- Retry the pick flow with a smaller selection
- Provide an onAccessTokenRequired handler that silently refreshes the token so pagination never uses a stale token
- Retry once after a short delay for transient failures
- Check quota in Google Cloud Console if 429s recur
Example fix
// before
const picker = uppy.getPlugin('GooglePicker')
await picker.showPicker() // large selection -> Failed to get a media items
// after
renderButton(uppy, {
clientId: 'xxx',
onAccessTokenRequired: async (pickerInstance) => {
const token = await getFreshToken() // silent re-auth
pickerInstance.setOAuthToken(token)
},
}) Defensive patterns
Strategy: retry
Validate before calling
null
Type guard
function isMediaItemsError(e: unknown): boolean {
return e instanceof Error && e.message === 'Failed to get a media items'
} Try / catch
try { await picker.showPicker() }
catch (err) {
if (isMediaItemsError(err)) {
uppy.info('Could not load all picked photos. Please pick fewer items and retry.', 'error', 5000)
}
} Prevention
- Implement onAccessTokenRequired to silently refresh tokens mid-pagination
- Suggest smaller selections in UI copy
- Retry transient failures once before surfacing to the user
When it happens
Trigger: During pollPickingSession -> resolvePickedPhotos, any mediaItems page fetch failing (expired token mid-pagination, 429 quota, 5xx) throws this error.
Common situations: Large selections requiring many pages hit rate limits; long picker sessions let the access token expire before all pages are fetched; transient Google Photos Picker errors.
Related errors
- Failed to create a session
- Failed to get session
- OAuth2 error: ${response.error}
- Failed to list folder contents for '${doc.name}' (${doc.id})
- Invalid request body
AI-assisted analysis of transloadit/uppy@5d4dedd02a (2026-08-28).
Data as JSON: /api/errors/d774135f5e7e9c83.
Report an issue: GitHub.