- Add S3Service for file operations with MinIO/AWS S3 support - Add AudioMetadataService for metadata extraction - Add MusicFile model with MongoDB integration - Add music API routes for upload, streaming, and management - Add MusicUpload component with drag-and-drop functionality - Add MusicPlayer component with custom audio controls - Add MusicStorage page with complete music management interface - Update Docker Compose with MinIO service - Add comprehensive documentation and testing utilities Features: - S3-compatible storage (MinIO for local, AWS S3 for production) - Audio file upload with metadata extraction - Browser-based music streaming and playback - File management (upload, delete, search, filter) - Integration with existing Rekordbox functionality - Security features (file validation, presigned URLs) - Performance optimizations (indexing, pagination) Supported formats: MP3, WAV, FLAC, AAC, OGG, WMA, Opus
8.3 KiB
8.3 KiB
S3 Music Storage & Playback Feature
This document describes the implementation of S3-compatible storage for music files with browser playback capabilities in the Rekordbox Reader application.
🎵 Features
- S3-Compatible Storage: Store music files in MinIO (local) or any S3-compatible service
- Audio Metadata Extraction: Automatically extract artist, album, title, duration, etc.
- Browser Playback: Stream music files directly in the browser
- File Management: Upload, delete, and organize music files
- Rekordbox Integration: Link uploaded files to existing Rekordbox songs
- Search & Filter: Find music by artist, album, genre, or text search
🏗️ Architecture
Backend Components
-
S3Service (
src/services/s3Service.ts)- Handles file upload/download/delete operations
- Generates presigned URLs for secure access
- Manages S3 bucket operations
-
AudioMetadataService (
src/services/audioMetadataService.ts)- Extracts metadata from audio files
- Validates audio file formats
- Provides utility functions for formatting
-
MusicFile Model (
src/models/MusicFile.ts)- MongoDB schema for music file metadata
- Links to existing Song model
- Includes search indexes
-
Music Routes (
src/routes/music.ts)- REST API endpoints for music operations
- File upload handling with multer
- Streaming and metadata endpoints
Frontend Components (To be implemented)
-
Music Upload Component
- Drag & drop file upload
- Progress indicators
- Batch upload support
-
Music Player Component
- HTML5 audio player
- Custom controls
- Playlist integration
-
Music Library Component
- Grid/list view of music files
- Search and filter
- Metadata display
🚀 Setup Instructions
1. Local Development Setup
Start MinIO (S3-compatible storage)
# Using Docker Compose
docker-compose -f docker-compose.dev.yml up -d
# Or manually
docker run -d \
--name minio \
-p 9000:9000 \
-p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
-v minio_data:/data \
minio/minio server /data --console-address ":9001"
Access MinIO Console
- URL: http://localhost:9001
- Username:
minioadmin - Password:
minioadmin
Create Music Bucket
# Using MinIO client
mc alias set myminio http://localhost:9000 minioadmin minioadmin
mc mb myminio/music-files
mc policy set public myminio/music-files
2. Environment Variables
Create .env file in the backend directory:
# MongoDB
MONGODB_URI=mongodb://localhost:27017/rekordbox
# S3/MinIO Configuration
S3_ENDPOINT=http://localhost:9000
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_BUCKET_NAME=music-files
S3_REGION=us-east-1
# Server
PORT=3000
NODE_ENV=development
3. Install Dependencies
# Install backend dependencies
cd packages/backend
npm install
# Install frontend dependencies (when implemented)
cd ../frontend
npm install
📡 API Endpoints
Music File Management
Upload Single File
POST /api/music/upload
Content-Type: multipart/form-data
file: [audio file]
Upload Multiple Files
POST /api/music/batch-upload
Content-Type: multipart/form-data
files: [audio files]
List Music Files
GET /api/music?page=1&limit=20&search=artist&genre=electronic
Get Streaming URL
GET /api/music/:id/stream
Get Presigned URL
GET /api/music/:id/presigned?expiresIn=3600
Get File Metadata
GET /api/music/:id/metadata
Delete File
DELETE /api/music/:id
Link to Song
POST /api/music/:id/link-song/:songId
Response Examples
Upload Response
{
"message": "File uploaded successfully",
"musicFile": {
"_id": "64f8a1b2c3d4e5f6a7b8c9d0",
"originalName": "track.mp3",
"s3Key": "music/uuid.mp3",
"s3Url": "music-files/music/uuid.mp3",
"contentType": "audio/mpeg",
"size": 5242880,
"title": "Track Title",
"artist": "Artist Name",
"album": "Album Name",
"duration": 180.5,
"format": "mp3",
"uploadedAt": "2024-01-15T10:30:00.000Z"
}
}
Streaming Response
{
"streamingUrl": "http://localhost:9000/music-files/music/uuid.mp3",
"musicFile": {
// ... music file metadata
}
}
🎵 Supported Audio Formats
- MP3 (.mp3)
- WAV (.wav)
- FLAC (.flac)
- AAC (.aac, .m4a)
- OGG (.ogg)
- WMA (.wma)
- Opus (.opus)
🔧 Configuration Options
S3 Service Configuration
const s3Config = {
endpoint: 'http://localhost:9000', // MinIO endpoint
accessKeyId: 'minioadmin', // Access key
secretAccessKey: 'minioadmin', // Secret key
bucketName: 'music-files', // Bucket name
region: 'us-east-1', // Region
};
File Upload Limits
- Single file: 100MB
- Batch upload: 10 files per request
- Supported formats: Audio files only
Streaming Configuration
- Direct URL: For public buckets (MinIO)
- Presigned URL: For private buckets (AWS S3)
- Expiration: Configurable (default: 1 hour)
🔒 Security Considerations
File Access
- Use presigned URLs for secure access
- Set appropriate expiration times
- Implement user authentication (future)
File Validation
- Validate file types on upload
- Check file size limits
- Sanitize file names
Storage Security
- Use environment variables for credentials
- Implement bucket policies
- Regular backup procedures
🚀 Production Deployment
AWS S3 Setup
- Create S3 bucket
- Configure CORS policy
- Set up IAM user with appropriate permissions
- Update environment variables
MinIO Production Setup
- Deploy MinIO cluster
- Configure SSL/TLS
- Set up monitoring
- Implement backup strategy
CDN Integration
- Use CloudFront with S3
- Configure caching policies
- Optimize for audio streaming
🧪 Testing
Manual Testing
- Start MinIO and MongoDB
- Upload test audio files
- Verify metadata extraction
- Test streaming functionality
- Check file deletion
API Testing
# Test health endpoint
curl http://localhost:3000/api/health
# Test file upload
curl -X POST -F "file=@test.mp3" http://localhost:3000/api/music/upload
# Test streaming
curl http://localhost:3000/api/music/:id/stream
🔄 Integration with Existing Features
Rekordbox XML Import
- Match uploaded files with XML entries
- Link files to existing songs
- Maintain playlist relationships
Playlist Management
- Include music files in playlists
- Stream playlist sequences
- Export playlists with file references
📈 Performance Optimization
Streaming Optimization
- Implement range requests
- Use appropriate cache headers
- Optimize for mobile playback
Database Optimization
- Index frequently queried fields
- Implement pagination
- Use text search indexes
Storage Optimization
- Implement file compression
- Use appropriate storage classes
- Monitor storage costs
🐛 Troubleshooting
Common Issues
-
MinIO Connection Error
- Check MinIO is running:
docker ps - Verify endpoint URL
- Check credentials
- Check MinIO is running:
-
File Upload Fails
- Check file size limits
- Verify file format
- Check bucket permissions
-
Streaming Issues
- Verify bucket is public (MinIO)
- Check CORS configuration
- Test with different browsers
-
Metadata Extraction Fails
- Check file format support
- Verify file integrity
- Check music-metadata library
Debug Commands
# Check MinIO status
docker logs minio
# Test S3 connection
mc ls myminio/music-files
# Check MongoDB connection
mongosh rekordbox --eval "db.musicfiles.find().limit(1)"
🔮 Future Enhancements
Planned Features
- Audio visualization (waveform)
- Playlist streaming
- Audio format conversion
- User authentication
- File sharing
- Mobile app support
Technical Improvements
- WebSocket streaming
- Progressive download
- Audio caching
- CDN integration
- Analytics tracking