A lightweight Windows app to sync Spotify playlists to your Shokz OpenSwim Pro (or any MP3 player with limited storage).
Zero Spotify account risk - Uses YouTube matching via spotDL, no direct Spotify downloads.
- 📋 Load any public Spotify playlist
- 🔍 Preview changes before syncing (new/existing/removed tracks)
- 📊 Storage gauge to monitor 32GB device limit
- 🗑️ Optional auto-cleanup of removed tracks
- 💾 State tracking to avoid re-downloading
- ⚡ Simple one-click sync
Before running Swim Sync, you need:
Download from python.org or install via Windows Store.
Verify installation:
python --versionRequired by spotDL for audio conversion.
Option A: Chocolatey (recommended)
choco install ffmpegOption B: Manual Install
- Download from ffmpeg.org
- Extract to
C:\ffmpeg - Add
C:\ffmpeg\binto your system PATH
Verify installation:
ffmpeg -versionInstall via pip:
pip install spotdlVerify installation:
spotdl --version-
Clone or download this repository
-
Install Python dependencies:
pip install -r requirements.txt- Run the app:
python run.pyOr use the batch launcher:
scripts\SwimSync.batswimsync/
├── src/swimsync/ # Main application package
│ ├── app.py # Tkinter GUI
│ ├── sync_engine.py # spotDL integration
│ ├── state_manager.py # Track manifest
│ └── config_manager.py# Settings
├── scripts/ # Launcher scripts
├── docs/ # Documentation (PRD)
├── tests/ # Test suite
├── run.py # Quick launcher
├── pyproject.toml # Python package config
└── requirements.txt # Dependencies
-
Paste your Spotify playlist URL
Example:https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M⚠️ The playlist must be public (not private/collaborative) -
Select an output folder
Default:C:\Users\[You]\Music\SwimSync -
Click "Load Playlist"
The app will fetch all track metadata
-
Review the track list:
- 🟢 New - Will be downloaded
- ⚪ Exists - Already on disk
- 🔴 Removed - No longer in playlist
-
Check the storage gauge to ensure you won't exceed device capacity
-
Optionally check "Delete removed tracks" to clean up old files
-
Click "Sync Now"
-
Wait for downloads to complete (progress shown per-track)
- Connect your Shokz OpenSwim Pro via the magnetic USB cable
- Open the device in File Explorer (appears as "SWIM PRO" or similar)
- Drag all MP3 files from your sync folder to the device
- Safely eject the device
Access via the Settings button:
| Setting | Default | Description |
|---|---|---|
| Audio Bitrate | 320k | Download quality (128k/192k/256k/320k) |
| Storage Limit | 32 GB | Warning threshold for gauge |
| Download Timeout | 120s | Max time per track before retry |
- Ensure spotDL is installed:
pip install spotdl - Check it's in PATH:
spotdl --version - Try reinstalling:
pip uninstall spotdl && pip install spotdl
- Install FFmpeg and ensure it's in your system PATH
- Restart your terminal after installation
- Ensure the playlist is public (check Spotify settings)
- The playlist URL should look like:
https://open.spotify.com/playlist/...
- spotDL uses YouTube matching - some tracks may not have good matches
- Check the spotDL output for specific errors
- Try manually downloading problem tracks with:
spotdl "artist - title"
- This happens occasionally with covers, remixes, or live versions
- Delete the wrong file and manually download the correct one
- Report consistent issues to the spotDL GitHub
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Spotify │──────▶│ Swim Sync │──────▶│ OpenSwim Pro │
│ Public API │ meta │ (this app) │ MP3s │ (32GB) │
│ │ data │ │ │ │
└─────────────────┘ └────────┬────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ spotDL │
│ (YouTube DL) │
└─────────────────┘
- Metadata Fetch: Swim Sync uses spotDL to read track info from Spotify's public API (no login needed)
- State Compare: Local manifest tracks what's already downloaded
- Delta Preview: Shows you exactly what will change
- Download: spotDL finds matching audio on YouTube and converts to MP3
- Cleanup: Optionally removes tracks no longer in playlist
Your Spotify account is never at risk because:
- No Spotify login/authentication is used
- Audio comes from YouTube, not Spotify servers
- Only public playlist metadata is accessed
~/Music/SwimSync/
├── Artist - Song 1.mp3
├── Artist - Song 2.mp3
├── ...
└── .swimsync_manifest.json (hidden, tracks sync state)
To create a single .exe file:
pip install pyinstaller
pyinstaller --onefile --windowed --name "SwimSync" run.pyThe executable will be in dist/SwimSync.exe
MIT License - Free for personal use.