Get the FREE Ultimate OpenClaw Setup Guide →

cloud-uploader

npx machina-cli add skill bitwize-music-studio/claude-ai-music-skills/cloud-uploader --openclaw
Files (1)
SKILL.md
8.4 KB

Cloud Uploader Skill

Upload promo videos and other album content to cloud storage (Cloudflare R2 or AWS S3).

Purpose

After generating promo videos with /bitwize-music:promo-director, upload them to cloud storage for:

  • Hosting on websites
  • Sharing via direct links
  • CDN distribution
  • Backup and archival

When to Use

  • After promo videos generated, user wants to upload to cloud
  • User says "upload promos to R2" or "upload to S3"
  • User says "upload promo videos for [album]"
  • Manual invocation only (not automatic)

Position in Workflow

Generate → Master → Promo Videos → **[Cloud Upload]** → Release

Optional step after promo-director, before release-director.

Prerequisites

Cloud Configuration

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.

Required Files

  • Promo videos generated (run /bitwize-music:promo-director first)
  • Located at: {audio_root}/artists/{artist}/albums/{genre}/{album}/promo_videos/
  • Album sampler at: {audio_root}/artists/{artist}/albums/{genre}/{album}/album_sampler.mp4

Python Dependencies

# 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.

Workflow

1. Verify Prerequisites

Check config:

cat ~/.bitwize-music/config.yaml | grep -A 20 "cloud:"

Verify:

  • cloud.enabled: true
  • Provider credentials configured (r2 or s3)
  • Bucket name set

Check 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}

2. Get Python Command

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}"

3. Preview Upload (Dry Run)

Preview first:

$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --dry-run

Output shows:

  • Provider and bucket
  • Files to upload
  • S3 keys (paths in bucket)
  • File sizes

4. Upload Files

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

5. Verify Upload

For R2:

  • Check Cloudflare dashboard → R2 → Your bucket
  • Files should appear under {artist}/{album}/

For S3:

  • Check AWS Console → S3 → Your bucket
  • Or use AWS CLI: aws s3 ls s3://{bucket}/{artist}/{album}/

5. Report Results

## 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}

Upload Path Structure

IMPORTANT: Cloud paths are FLAT - no genre folder.

The cloud path structure is different from the local content structure:

LocationPath 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:

  • Local: ~/music/artists/bitwize/albums/rock/my-album/
  • Cloud: bitwize/my-album/promos/ (NOT bitwize/albums/rock/my-album/)

Command Options

OptionDescription
--type promosUpload only track promo videos
--type samplerUpload only album sampler
--type allUpload both (default)
--dry-runPreview without uploading
--publicSet files as public-read
--audio-root PATHOverride audio_root from config

Invocation Examples

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

Error Handling

"Cloud uploads not enabled"

  • Add cloud.enabled: true to config
  • See ${CLAUDE_PLUGIN_ROOT}/reference/cloud/setup-guide.md

"Credentials not configured"

  • Add credentials to config file
  • For R2: account_id, access_key_id, secret_access_key
  • For S3: access_key_id, secret_access_key

"Album not found"

  • Check album exists in {audio_root}/artists/{artist}/albums/{genre}/{album}/
  • Verify artist name in config matches

"No files found to upload"

  • Generate promo videos first: /bitwize-music:promo-director {album}

"Access Denied"

  • Check credentials are correct
  • For R2: Verify API token has write permissions
  • For S3: Verify IAM policy allows s3:PutObject

"Bucket not found"

  • Create bucket first in cloud dashboard
  • Verify bucket name in config

Security Notes

  • Credentials stored in config file (ensure proper file permissions)
  • Config file should be gitignored in user's content repo
  • Default: Files uploaded as private (not public)
  • Use --public flag only for files intended for public access
  • Consider using environment variables for CI/CD (future enhancement)

Integration with Other Skills

Handoff FROM

promo-director:

After promo generation:

Promo videos generated successfully.

**Optional:** Upload to cloud storage: /bitwize-music:cloud-uploader {album}

Handoff TO

release-director:

After cloud upload:

Cloud upload complete.

Ready for release workflow: /bitwize-music:release-director {album}

Supported Providers

Cloudflare R2

  • S3-compatible API
  • No egress fees
  • Global CDN integration
  • Good for high-traffic content

AWS S3

  • Industry standard
  • Fine-grained IAM permissions
  • CloudFront CDN available
  • Good for AWS ecosystem integration

Future Enhancements

  • Environment variable credentials (for CI/CD)
  • Multiple bucket support
  • Automatic CDN invalidation
  • Progress bar for large uploads
  • Resume failed uploads
  • Bucket creation if missing
  • Additional providers (Backblaze B2, DigitalOcean Spaces)

Related Documentation

  • ${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 workflow

Model Recommendation

Sonnet 4.5 - This skill runs scripts and coordinates workflow. No creative output from LLM.

Version History

  • v0.14.0 - Initial implementation
    • R2 and S3 support via boto3
    • Dry-run mode
    • Public/private upload options
    • Path organization by artist/album

Source

git clone https://github.com/bitwize-music-studio/claude-ai-music-skills/blob/main/skills/cloud-uploader/SKILL.mdView on GitHub

Overview

Cloud Uploader sends promo videos and album content to cloud storage. It supports Cloudflare R2 and AWS S3 for hosting, direct sharing, CDN distribution, and archival backups after promos are generated.

How This Skill Works

The uploader uses Python with boto3 and credentials in ~/.bitwize-music/config.yaml to determine the provider (R2 or S3) and bucket. After promo videos are generated, you first run a dry-run preview to see which files will upload, then execute the actual upload with optional public access, and finally verify results in the provider's console.

When to Use It

  • After promo videos are generated, you want to upload them to cloud storage for hosting or distribution
  • You want to upload promos to R2 or S3 by specifying the provider (e.g., upload to R2 or upload to S3)
  • You need to upload promo videos for a specific album
  • You perform a manual invocation as part of the release workflow (not automatic)
  • You want to upload both promo videos and the album sampler for release packaging

Quick Start

  1. Step 1: Verify prerequisites and that promo videos exist under the expected {audio_root} path and that config.yaml has cloud.enabled: true and a valid provider
  2. Step 2: Preview Upload (Dry Run) with: $PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --dry-run
  3. Step 3: Upload files with: $PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} [--public] (use --type promos or --type sampler to limit scope as needed)

Best Practices

  • Confirm cloud.config is enabled and credentials (provider and bucket) are correctly set in ~/.bitwize-music/config.yaml
  • Ensure promo videos exist at {audio_root}/artists/{artist}/albums/{genre}/{album}/promo_videos/ and that the album_sampler.mp4 is present
  • Always run a dry-run first to preview provider, bucket, keys, and file sizes
  • Use --public only when you need publicly accessible files; verify access in the provider console
  • Install and use boto3 in the recommended venv to ensure compatibility with the shared setup

Example Use Cases

  • Host promo videos on a website by uploading to Cloudflare R2 or AWS S3 and linking from pages
  • Share direct download links of promos for social media campaigns
  • Distribute promo assets via a CDN by pointing the CDN origin to the S3/R2 bucket
  • Back up and archive promo videos and album sampler in cloud storage for long-term retention
  • Upload both promos and the album sampler as part of a release package for publishing

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers