- Full PWA support with offline capabilities - Comprehensive search across songs, playlists, and channels - Offline playlist manager with download tracking - Pre-built frontend for zero-build deployment - Docker-based deployment with docker compose - Material-UI dark theme interface - YouTube audio download and management - Multi-user authentication support
5.7 KiB
5.7 KiB
Playlist Controls Feature
Overview
Enhanced playlist detail page with comprehensive controls for playing, shuffling, and downloading tracks.
Features
Top-Level Controls
Located at the top of the playlist detail page:
-
Play All Button
- Plays all downloaded tracks in order
- Disabled if no tracks are downloaded
- Sets the first track to play and queues the rest
-
Shuffle Button
- Randomizes and plays all downloaded tracks
- Uses Fisher-Yates algorithm for true random shuffle
- Disabled if no tracks are downloaded
- Visual feedback with snackbar notification
-
Download All Button
- Triggers playlist sync to download all tracks
- Disabled while sync is in progress
- Uses existing playlist download API endpoint
Individual Track Controls
In the tracks table, each row includes:
-
Play Button
- Available for downloaded tracks only
- Instantly starts playback
- Disabled/grayed out for non-downloaded tracks
-
Download Button (NEW)
- Appears only for non-downloaded tracks
- Downloads individual tracks on demand
- Shows loading spinner while downloading
- Automatically refreshes playlist after download completes
- Uses new individual audio download API endpoint
Implementation Details
Backend Changes
New API Endpoint
POST /api/audio/<youtube_id>/
- Action:
download - Creates DownloadQueue entry
- Triggers Celery task
download_audio_task - Returns:
200 OK: Already downloaded or download in progress202 Accepted: Download started successfully400 Bad Request: Invalid action404 Not Found: Audio not found or not owned by user
Security:
- Owner filtering:
get_object_or_404(Audio, youtube_id=youtube_id, owner=request.user) - Checks for existing downloads before creating new queue entries
- Integrates with existing Celery task system
Frontend Changes
New Components
- Play All Button: Material-UI Button with PlayIcon
- Shuffle Button: Material-UI Button with ShuffleIcon
- Download All Button: Material-UI Button with CloudDownloadIcon
- Individual Download Button: IconButton with DownloadIcon or CircularProgress
State Management
const [downloadingTracks, setDownloadingTracks] = useState<Set<string>>(new Set());
const [snackbarOpen, setSnackbarOpen] = useState(false);
const [snackbarMessage, setSnackbarMessage] = useState('');
API Client Update
Added download method to audioAPI:
download: (youtubeId: string) => api.post(`/audio/${youtubeId}/`, { action: 'download' })
User Experience
Visual Feedback
- Snackbar Notifications: User-friendly messages for all actions
- Loading States: CircularProgress indicators during downloads
- Disabled States: Buttons properly disabled when actions aren't available
- Mobile Responsive: Touch-friendly 48px+ button sizes
- Hide/Show Labels: Text hidden on mobile, icons remain visible
PWA Optimization
- No page reloads - all actions use React state
- Touch-friendly button sizes (minimum 48px)
- Proper color contrast for accessibility
- Loading feedback for async operations
Usage
For Users
-
Navigate to any playlist from the Playlists page
-
Use top controls to:
- Play All: Start playing the entire playlist
- Shuffle: Play tracks in random order
- Download All: Download the entire playlist
-
Use track-level controls to:
- Click Play icon to play individual tracks
- Click Download icon to download specific tracks
For Developers
Testing Individual Downloads
# Test download endpoint
curl -X POST http://localhost:8889/api/audio/VIDEO_ID/ \
-H "Authorization: Token YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"action": "download"}'
Monitoring Downloads
- Check Celery logs for task execution
- Monitor DownloadQueue table for status
- View updated playlist after completion
Security Considerations
✅ Implemented Safeguards:
- User authentication required for all endpoints
- Owner filtering on all queries
- Duplicate download prevention
- Rate limiting via Celery task queue
- Input validation on action parameter
Files Modified
Backend
/backend/audio/views.py: Added POST method to AudioDetailView/backend/config/urls.py: Existing routes work with new endpoint
Frontend
/frontend/src/api/client.ts: AddedaudioAPI.download()method/frontend/src/pages/PlaylistDetailPage.tsx: Added all control buttons and handlers/frontend/src/types/index.ts: No changes needed (youtube_id already optional)
Performance Notes
- Shuffle Algorithm: O(n) Fisher-Yates shuffle, efficient for any playlist size
- State Management: Uses Set for O(1) download tracking lookups
- Auto-refresh: 2-second delay after download to allow backend processing
- Loading States: Prevents duplicate download requests via disabled buttons
Known Limitations
- Queue Visualization: Download queue not visible in UI (backend only)
- Playlist Queue: Play All/Shuffle only starts first track (no queue implementation yet)
- Progress Tracking: No real-time download progress for individual tracks
- Batch Downloads: Individual downloads don't batch (each triggers separate task)
Future Enhancements
- Real-time download progress tracking (WebSockets/SSE)
- Play queue implementation for continuous playback
- Batch download optimization for multiple tracks
- Download queue visibility in UI
- Cancel download functionality
- Retry failed downloads from UI