Backend changes:
- Fix track deletion foreign key constraint (tracks.py)
* Clear current_track_id from rooms before deleting track
* Prevent deletion errors when track is currently playing
- Implement user ping/keepalive system (sync.py, websocket.py, ping_task.py, main.py)
* Track last pong timestamp for each user
* Background task sends ping every 30s, disconnects users after 60s timeout
* Auto-pause playback when room becomes empty
* Remove disconnected users from room_participants
- Enhance room deletion (rooms.py)
* Broadcast room_deleted event to all connected users
* Close all WebSocket connections before deletion
* Cascade delete participants, queue, and messages
Frontend changes:
- Add ping/pong WebSocket handling (activeRoom.js)
* Auto-respond to server pings
* Handle room_deleted event with redirect to home
- Add room deletion UI (RoomView.vue, HomeView.vue, RoomCard.vue)
* Delete button visible only to room owner
* Confirmation dialog with warning
* Delete button on room cards (shows on hover)
* Redirect to home page after deletion
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>