Self-hosted + Cloudflare R2: camera-only Instant recordings fail with "InvalidPart: All non-trailing parts must have the same length"
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 68/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- typescript
- Lĩnh vực
- cloud
Hướng nghiên cứu
Bắt đầu với packages/recorder-core/src/instant-mp4-uploader.ts và lần theo đường dẫn upload của Instant Mode chỉ dành cho camera, so sánh với đường dẫn đang hoạt động cho màn hình hoặc cửa sổ. Tái hiện vấn đề với Cloudflare R2 bằng các bước trong issue và kiểm tra cách các phần multipart được đệm được flush. Hoàn thành có nghĩa là các bản ghi chỉ từ camera hoàn tất thành công với R2 trong khi vẫn giữ nguyên các upload hiện có đang hoạt động.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
On a self-hosted instance that uses Cloudflare R2 as the S3 bucket, camera-only Instant Mode recordings from Cap Desktop (Windows) never finish uploading. Screen, window and area Instant recordings upload and play fine against the same bucket.
cap-web logs this on each camera-only attempt:
Multipart upload failed: eS [StorageError]: { "cause": S3Error: { "cause": InvalidPart: All non-trailing parts must have the same length. } (cause: InvalidPart: All non-trailing parts must have the same length.) }
The video row is created with source: {"type": "desktopMP4"}, but no outputKey, previewKey or thumbnailKey is ever set.
Likely cause
Cloudflare R2's multipart API has a rule AWS S3 doesn't: every part except the last must be exactly the same size (R2 docs: "All parts except the last one must be the same size"). The progressive uploader appears to send variable-size parts: flushes of at least MIN_PART_SIZE_BYTES (5 MiB), sized by whatever was buffered, as in packages/recorder-core/src/instant-mp4-uploader.ts. AWS and MinIO accept that; R2 rejects it at CompleteMultipartUpload. Camera-only seems to take a different upload path from screen recordings, so only that mode hits it.
Environment
- Self-hosted via Docker Compose,
ghcr.io/capsoftware/cap-web@sha256:8ee4cbd3fd87...(latest as of 2026-09-07) andcap-media-server@sha256:886ecc9b5684... - Storage: Cloudflare R2,
CAP_AWS_REGION=auto, path-style, private bucket - Cap Desktop for Windows (current download as of 2026-09-11; bundled CLI 0.1.0)
Steps to reproduce
- Point Cap Desktop at a self-hosted server whose bucket is Cloudflare R2.
- Instant Mode, choose camera only (no screen), record about 30 s, stop.
- The upload never completes;
cap-weblogs theInvalidParterror above. - Repeat with a screen or window target: it works.
Possible fixes
- Use fixed-size parts for all non-final parts (re-chunk the buffer to a constant size, e.g. 5 or 8 MiB, carrying the remainder forward), or
- Detect R2 endpoints (or add a
S3_FIXED_PART_SIZEoption) and switch to constant part sizes there.
Workaround for now: record camera-only videos in Studio Mode.
- Ngôn ngữ chính
- Rust
- Star
- 23k
- Fork
- 2k
- Merge trung bình
- 13 giờ 2 phút
- Pull request đã merge (30 ngày)
- 70
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của CapSoftware/Cap
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
CapSoftware/Cap#2384 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Dashboard pagination causes full page reloads on self-hosted CapCó thể đã có người làm @Dewin đã nhận 17 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
CapSoftware/Cap#2305 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
CapSoftware/Cap#1714 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
CapSoftware/Cap#2409 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 64/100
CapSoftware/Cap#2408 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của CapSoftware/Cap
Issue tương tự
-
Rust: `const _` gets its file's node ID, so the file node is relabelled `_` and gains a self-loopĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Graphify-Labs/graphify#4064 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
MessageField::clone copies the whole payload, even for an unset field: clone 1.4× slower than prost on small messagesCó thể đã có người làm @benedikt-bartscher đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
anthropics/buffa#549 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
apache/datafusion#26030 ·
Maintainer thường phản hồi trong vòng 1 ngày