From bitwize-music
Uploads promo videos and album content to Cloudflare R2 or AWS S3. Works after promo-director, before release-director. Manually invoked via /cloud-uploader.
How this skill is triggered — by the user, by Claude, or both
Slash command
/bitwize-music:cloud-uploadersonnetThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Upload promo videos and other album content to cloud storage (Cloudflare R2 or AWS S3).
Upload promo videos and other album content to cloud storage (Cloudflare R2 or AWS S3).
After generating promo videos with /bitwize-music:promo-director, upload them to cloud storage for:
Generate → Master → Promo Videos → **[Cloud Upload]** → Release
Optional step after promo-director, before release-director.
Cloud credentials must be configured in ~/.bitwize-music/config.yaml:
cloud:
enabled: true
provider: "r2" # or "s3"
# For Cloudflare R2
r2:
account_id: "your-account-id"
access_key_id: "your-access-key"
secret_access_key: "your-secret-key"
bucket: "promo-videos"
# For AWS S3
s3:
region: "us-west-2"
access_key_id: "your-access-key"
secret_access_key: "your-secret-key"
bucket: "promo-videos"
See ${CLAUDE_PLUGIN_ROOT}/reference/cloud/setup-guide.md for detailed setup instructions.
/bitwize-music:promo-director first){audio_root}/artists/{artist}/albums/{genre}/{album}/promo_videos/{audio_root}/artists/{artist}/albums/{genre}/{album}/album_sampler.mp4# If using the shared venv (recommended)
~/.bitwize-music/venv/bin/pip install -r ${CLAUDE_PLUGIN_ROOT}/requirements.txt
# Or install separately
pip install boto3
The upload script uses ~/.bitwize-music/venv if available, otherwise falls back to system Python.
Check config:
cat ~/.bitwize-music/config.yaml | grep -A 20 "cloud:"
Verify:
cloud.enabled: trueCheck promo videos exist:
ls {audio_root}/artists/{artist}/albums/{genre}/{album}/promo_videos/
ls {audio_root}/artists/{artist}/albums/{genre}/{album}/album_sampler.mp4
If missing:
Error: Promo videos not found.
Generate with: /bitwize-music:promo-director {album}
Call get_python_command() first to get the venv Python path and plugin root. Use these for all bash invocations below.
PYTHON="{python from get_python_command}"
PLUGIN_DIR="{plugin_root from get_python_command}"
Preview first:
$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --dry-run
Output shows:
Upload all (promos + sampler):
$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album}
Upload only track promos:
$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --type promos
Upload only album sampler:
$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --type sampler
Upload with public access:
$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --public
For R2:
{artist}/{album}/For S3:
aws s3 ls s3://{bucket}/{artist}/{album}/## Cloud Upload Complete
**Provider:** R2 (or S3)
**Bucket:** {bucket}
**Album:** {album}
**Uploaded Files:**
- {artist}/{album}/promos/01-track_promo.mp4
- {artist}/{album}/promos/02-track_promo.mp4
- ...
- {artist}/{album}/promos/album_sampler.mp4
**Total:** 11 files, 125.4 MB
**Next Steps:**
1. Verify files in cloud dashboard
2. If public: Test URLs work
3. Continue to release: /bitwize-music:release-director {album}
IMPORTANT: Cloud paths are FLAT - no genre folder.
The cloud path structure is different from the local content structure:
| Location | Path Structure |
|---|---|
| Local content | {content_root}/artists/{artist}/albums/{genre}/{album}/ |
| Local audio | {audio_root}/artists/{artist}/albums/{genre}/{album}/ |
| Cloud | {artist}/{album}/ (no genre!) |
Files are organized in the bucket as:
{bucket}/
└── {artist}/
└── {album}/
└── promos/
├── 01-track_promo.mp4
├── 02-track_promo.mp4
├── ...
└── album_sampler.mp4
Example for album "my-album" by "bitwize" in rock genre:
~/music/artists/bitwize/albums/rock/my-album/bitwize/my-album/promos/ (NOT bitwize/albums/rock/my-album/)| Option | Description |
|---|---|
--type promos | Upload only track promo videos |
--type sampler | Upload only album sampler |
--type all | Upload both (default) |
--dry-run | Preview without uploading |
--public | Set files as public-read |
--audio-root PATH | Override audio_root from config |
Basic upload:
/bitwize-music:cloud-uploader my-album
Preview only:
/bitwize-music:cloud-uploader my-album --dry-run
Upload promos only:
/bitwize-music:cloud-uploader my-album --type promos
Upload with public access:
/bitwize-music:cloud-uploader my-album --public
"Cloud uploads not enabled"
cloud.enabled: true to config${CLAUDE_PLUGIN_ROOT}/reference/cloud/setup-guide.md"Credentials not configured"
"Album not found"
{audio_root}/artists/{artist}/albums/{genre}/{album}/"No files found to upload"
/bitwize-music:promo-director {album}"Access Denied"
"Bucket not found"
--public flag only for files intended for public accesspromo-director:
After promo generation:
Promo videos generated successfully.
**Optional:** Upload to cloud storage: /bitwize-music:cloud-uploader {album}
release-director:
After cloud upload:
Cloud upload complete.
Ready for release workflow: /bitwize-music:release-director {album}
${CLAUDE_PLUGIN_ROOT}/reference/cloud/setup-guide.md - Detailed setup instructions${CLAUDE_PLUGIN_ROOT}/skills/promo-director/SKILL.md - Generate promo videos${CLAUDE_PLUGIN_ROOT}/skills/release-director/SKILL.md - Release workflowSonnet 4.5 - This skill runs scripts and coordinates workflow. No creative output from LLM.
npx claudepluginhub bitwize-music-studio/claude-ai-music-skills --plugin bitwize-musicGuides file storage and CDN setup with object storage (S3, GCS, Azure Blob), presigned URLs, image/video processing pipelines, lifecycle policies, cost optimization, and backups.
Provides rclone setup, configuration, and commands to upload, sync, list, and manage files in AWS S3, Cloudflare R2, Backblaze B2, Google Drive, Dropbox.
Sync files across cloud storage using rclone. Covers S3, R2, Backblaze, Google Drive, Dropbox, and S3-compatible providers with setup, upload, sync, and listing commands.