soundwave/docs/QUICK_REFERENCE.md
Iulian 51679d1943 Initial commit - SoundWave v1.0
- 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
2025-12-16 23:43:07 +00:00

6.4 KiB

🚀 Quick Reference Card - Soundwave PWA

📦 What Changed?

1. Database Now Persists!

# Database location changed:
OLD: /app/backend/db.sqlite3  ❌ Lost on rebuild
NEW: /app/data/db.sqlite3     ✅ Persists forever

# New volume in docker-compose.yml:
- ./data:/app/data

2. API Routes Fixed

# Old (conflicting):
/api/playlist/           # Main views
/api/playlist/           # Downloads (CONFLICT!)

# New (no conflicts):
/api/playlist/           # Main views
/api/playlist/downloads/ # Downloads (NO CONFLICT!)

3. PWA Offline Playlists

// New PWA features:
const { cachePlaylist, removePlaylistCache } = usePWA();

// Download playlist offline:
await cachePlaylist(playlistId, audioUrls);
await offlineStorage.savePlaylist(playlist);

// Remove offline playlist:
await removePlaylistCache(playlistId, audioUrls);
await offlineStorage.removePlaylist(playlistId);

🎯 Quick Start

Deploy/Restart

# Fresh deployment:
docker-compose build
docker-compose up -d

# Update existing:
docker-compose down
mkdir -p data  # Create data dir
docker-compose up -d

Verify Persistence

# Check database exists:
ls -lh data/db.sqlite3

# Test persistence:
docker-compose down
docker-compose up -d
ls -lh data/db.sqlite3  # Still there!

💻 Developer Usage

Cache Playlist for Offline

import { usePWA } from '../context/PWAContext';
import { offlineStorage } from '../utils/offlineStorage';

function DownloadButton({ playlist }) {
  const { cachePlaylist } = usePWA();
  
  const download = async () => {
    const urls = playlist.items.map(i => i.audio_url);
    await cachePlaylist(playlist.id, urls);
    await offlineStorage.savePlaylist({
      ...playlist,
      offline: true,
    });
  };
  
  return <button onClick={download}>Download</button>;
}

Check if Offline Available

const playlist = await offlineStorage.getPlaylist(id);
if (playlist?.offline) {
  console.log('Available offline!');
}

Get All Offline Playlists

const offline = await offlineStorage.getOfflinePlaylists();
console.log(`${offline.length} playlists offline`);

🔒 Security Status

All Secure

  • Token authentication: Working
  • User isolation: Enforced
  • Admin protection: Active
  • CORS: Configured
  • CSRF: Protected

📊 File Structure

soundwave/
├── data/               ⭐ NEW: Database storage
│   ├── db.sqlite3      ← Persists between rebuilds
│   └── .gitignore
├── audio/              ✅ Audio files (persists)
├── cache/              ✅ App cache (persists)
├── es/                 ✅ Elasticsearch (persists)
├── redis/              ✅ Redis (persists)
└── backend/
    ├── config/
    │   ├── settings.py ⭐ Updated DB path
    │   └── urls.py
    └── playlist/
        └── urls.py     ⭐ Fixed route conflicts

🎨 PWA Features

Available Functions

const {
  isOnline,              // Network status
  cachePlaylist,         // Download playlist
  removePlaylistCache,   // Remove cache
  cacheAudio,            // Cache single file
  clearCache,            // Clear all cache
  getCacheSize,          // Storage info
  showInstallPrompt,     // Install PWA
  isInstalled,           // Is installed?
  canInstall,            // Can install?
} = usePWA();

Storage Functions

// Playlists
offlineStorage.savePlaylist(playlist)
offlineStorage.getPlaylist(id)
offlineStorage.getOfflinePlaylists()
offlineStorage.removePlaylist(id)

// Audio Queue
offlineStorage.saveAudioQueue(queue)
offlineStorage.getAudioQueue()

// Favorites
offlineStorage.addFavorite(item)
offlineStorage.getFavorites()

// Settings
offlineStorage.saveSetting(key, value)
offlineStorage.getSetting(key)

🧪 Testing

Check Database Persistence

# Create test data
docker exec soundwave python manage.py shell -c "from user.models import Account; print(Account.objects.count())"

# Rebuild
docker-compose down
docker-compose up -d

# Verify data still there
docker exec soundwave python manage.py shell -c "from user.models import Account; print(Account.objects.count())"
# Should show same count!

Test Offline Mode

  1. Open DevTools → Network
  2. Set to "Offline"
  3. Navigate to downloaded playlist
  4. Should work without network!

Check Routes

curl http://localhost:8889/api/playlist/
curl http://localhost:8889/api/playlist/downloads/
# Both should work (no conflicts)

📝 Key Changes Summary

Component Before After Status
Database Lost on rebuild Persists Fixed
Routes Conflicting Clean Fixed
Offline Limited Full support Enhanced
Security Good Verified Audited
Docs Basic Complete Created

📚 Documentation

  1. AUDIT_SUMMARY_COMPLETE.md - This file
  2. DATA_PERSISTENCE_FIX.md - Technical deep dive
  3. OFFLINE_PLAYLISTS_GUIDE.md - Usage guide
  4. PWA_COMPLETE.md - PWA features overview

🎉 Status

All Issues Resolved

  • Database persistence: FIXED
  • Route conflicts: RESOLVED
  • Security: VERIFIED
  • PWA offline: ENHANCED
  • Multi-user: WORKING
  • Build: SUCCESSFUL
  • Tests: PASSING

🟢 Production Ready


💡 Tips

Storage Management

// Check available space
const { cacheSize } = usePWA();
const availableMB = (cacheSize.quota - cacheSize.usage) / 1024 / 1024;
console.log(`Available: ${availableMB.toFixed(2)} MB`);

Cleanup Old Data

// Clear everything except settings
await offlineStorage.clearAllData();
await clearCache();

Smart Downloads

// Only download if online and space available
if (isOnline && availableSpace > playlistSize) {
  await cachePlaylist(id, urls);
}

🆘 Troubleshooting

Database not persisting

# Check volume mount
docker inspect soundwave | grep -A 5 Mounts

# Verify directory
ls -lh data/

Routes not working

# Check route order in urls.py
# Downloads must come BEFORE catch-all

Offline not working

// Check service worker
navigator.serviceWorker.getRegistrations().then(console.log)

// Clear cache and retry
await clearCache();
location.reload();

Last Updated: December 16, 2025
Version: 1.0.0
Status: Complete