{"record":{"id":"9555c6879101fed7","repo":"alyssaxuu/screenity","slug":"no-valid-media-uploaded-both-screen-and-camera-m","errorCode":null,"errorMessage":"No valid media uploaded - both screen and camera mediaId are missing","messagePattern":"No valid media uploaded - both screen and camera mediaId are missing","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"src/pages/CloudRecorder/CloudRecorder.jsx","lineNumber":6083,"sourceCode":"      \"recordedTabDomain\",\n      \"recordingType\",\n    ]);\n\n    const { cameraFlipped } = await chrome.storage.local.get([\"cameraFlipped\"]);\n\n    let insertAfterSceneId = null;\n    if (multiMode) {\n      insertAfterSceneId = multiLastSceneId || activeSceneId;\n    } else {\n      insertAfterSceneId = activeSceneId;\n    }\n\n    if (!uploadMeta.sceneId) {\n      throw new Error(\"Missing sceneId in uploadMeta\");\n    }\n\n    if (!uploadMeta.screen?.mediaId && !uploadMeta.camera?.mediaId) {\n      throw new Error(\n        \"No valid media uploaded - both screen and camera mediaId are missing\",\n      );\n    }\n\n    const sceneId = uploadMeta.sceneId;\n    const existingStatus = await getSceneCreateStatus(sceneId);\n    let sceneOutcome = null;\n    let shouldIncrementMultiSceneCount = false;\n\n    if (existingStatus?.status === \"created\") {\n      logDebugEvent(\"scene-create-skip\", {\n        projectId,\n        sceneId,\n      });\n      // No ensureMediaLinked call here: /api/bunny/videos already\n      // stamped each media's `usedIn` at TUS init time, and the prior\n      // /scenes/ POST already cleared `recoveryState`. PATCH was a\n      // no-op + a post-stop hang risk in the dying cloudrecorder tab.","sourceCodeStart":6065,"sourceCodeEnd":6101,"githubUrl":"https://github.com/alyssaxuu/screenity/blob/512606387b8d07dda5e63bb428bd063f0a2a3ed0/src/pages/CloudRecorder/CloudRecorder.jsx#L6065-L6101","documentation":"After upload completes, CloudRecorder verifies that at least one media track actually uploaded successfully. If neither uploadMeta.screen.mediaId nor uploadMeta.camera.mediaId is set, no usable media exists on the server, so scene creation cannot continue and this error is thrown.","triggerScenarios":"Both the screen and camera uploaders failed or returned no mediaId — e.g. all network uploads errored, upload credentials were rejected (401/403), recorder stopped before any data was captured, or onUploadFinished was called without a successful upload response.","commonSituations":"Recording on an unstable/offline network so chunks never finish uploading; expired auth token mid-upload; screen capture produced zero frames (protected content, no tab share chosen); very short recording stopped before the uploader flushed data.","solutions":["Inspect uploader telemetry/errors (onUploaderTelemetry/onStateChange) to find why both uploads failed, and retry the failed upload with backoff before giving up.","Verify auth: refresh tokens before upload start and handle 401/403 by re-authenticating and resuming uploads.","Check that onStop actually flushes/closes encoders so pending frames are uploaded when the recording is very short.","Add offline detection (navigator.onLine / connectivity change) to pause and resume uploads instead of failing silently.","If retry is impossible, show the user a clear 'recording could not be saved' error and offer to re-record rather than proceeding with no media."],"exampleFix":"// before\nif (!uploadMeta.screen?.mediaId && !uploadMeta.camera?.mediaId) {\n  throw new Error(\"No valid media uploaded - both screen and camera mediaId are missing\");\n}\n// after\nif (!uploadMeta.screen?.mediaId && !uploadMeta.camera?.mediaId) {\n  const retried = await retryFailedUploads(uploadMeta, { attempts: 2 });\n  if (!retried.screen?.mediaId && !retried.camera?.mediaId) {\n    throw new Error(\"No valid media uploaded - both screen and camera mediaId are missing\");\n  }\n  uploadMeta = retried;\n}","handlingStrategy":"retry","validationCode":"const hasMedia = Boolean(uploadMeta?.screen?.mediaId || uploadMeta?.camera?.mediaId);\nif (!hasMedia) {\n  console.error(\"No uploaded media present; check uploader telemetry for failures\");\n}","typeGuard":"function hasUploadedMedia(meta) {\n  return Boolean(meta?.screen?.mediaId || meta?.camera?.mediaId);\n}","tryCatchPattern":"try {\n  await finalizeUpload(uploadMeta);\n} catch (err) {\n  if (err.message.startsWith(\"No valid media uploaded\")) {\n    showRecordingLostDialog({ canRetry: navigator.onLine });\n  } else {\n    throw err;\n  }\n}","preventionTips":["Implement upload retry with exponential backoff inside the uploader","Refresh auth tokens before and during long recordings","Verify encoders flush remaining frames on stop for very short recordings","Monitor onUploaderStateChange and abort early with a clear message when uploads first fail","Check navigator.onLine and queue/resume uploads across connectivity loss"],"tags":["upload","network","cloud-recorder","media"],"backgroundTag":"upload-failed-no-media","analyzedSha":"512606387b8d07dda5e63bb428bd063f0a2a3ed0","analyzedAt":"2026-09-02T20:59:09.419Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}