Sync your Strawberry Music Player playlists to disk M3U files with duplicate detection, automatic backups, and smart conflict resolution.
Features
Duplicate Detection: Find and remove duplicate tracks within playlists Exact duplicates (same file added multiple times) Optional fuzzy matching (same title/artist, different files) Playlist Sync: Export database playlists to M3U files Creates timestamped backups before overwriting Shows what's added/removed before syncing Add-only mode to preserve disk entries Recursive subdirectory scanning Multiple playlist directory support Backup Rotation: Automatically clean up old backup files Keep N backups per playlist (default: 3) Delete backups older than N days (default: 60) Count takes priority (always keeps minimum backups) Never-Sync List: Skip utility playlists you don't want exported Managed via neversync.txt in your playlist folder Interactive prompts to add playlists during reviewRequirements
Python 3.6+ (standard library only, no pip installs needed) Linux, macOS, or WindowsInstallation
Save the script to your preferred location, e.g.:~/.local/share/strawberry/strawberry/strawberry-playlist-sync.py Make it executable (Linux/macOS):
chmod +x strawberry-playlist-sync.py Optionally create a desktop shortcut (see below).
Usage
Interactive Mode
./strawberry-playlist-sync.py
Presents a menu to choose between duplicate checking, syncing, and backup cleanup.
Command-Line Mode
Dry run (preview changes without writing):
./strawberry-playlist-sync.py -s -p ~/Music/playlists --dry-run
Dry run with full track details:
./strawberry-playlist-sync.py -s -p ~/Music/playlists --dry-run -v
Sync playlists to disk:
./strawberry-playlist-sync.py -s -p ~/Music/playlists
Sync including subdirectories:
./strawberry-playlist-sync.py -s -p ~/Music/playlists -r
Check for duplicates:
./strawberry-playlist-sync.py -d
Include fuzzy duplicates (same song, different files):
./strawberry-playlist-sync.py -d --fuzzy
Clean up old backups:
./strawberry-playlist-sync.py -c -n 5 -a 30
(Keep 5 backups, delete those older than 30 days)
Run all operations:
./strawberry-playlist-sync.py -d -s -c -p ~/Music/playlists
Automated mode (no prompts):
./strawberry-playlist-sync.py -s -p ~/Music/playlists -y
Multiple Directories
./strawberry-playlist-sync.py -s -p ~/Music/playlists -p /media/usb/playlists
Command-Line Options
┌─────────────────────────┬─────────────────────────────────────────────────┐
│ Option │ Description │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -d, --check-duplicates │ Find and remove duplicate tracks │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ --fuzzy │ Include fuzzy duplicates in check │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -s, --sync │ Sync database playlists to disk │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -c, --cleanup-backups │ Clean up old backup files │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -p, --playlist-dir PATH │ Playlist folder (can be used multiple times) │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -r, --recursive │ Scan subdirectories for M3U files │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ --add-only │ Only add tracks, preserve existing disk entries │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ --db-path PATH │ Path to strawberry.db (auto-detects if not set) │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -n, --keep-count N │ Backups to keep per playlist (default: 3) │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -a, --max-age DAYS │ Max backup age in days (default: 60) │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ --dry-run │ Preview changes without writing │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -v, --verbose │ Show full track details (with --dry-run) │
├─────────────────────────┼─────────────────────────────────────────────────┤
│ -y, --yes │ Skip confirmation prompts │
└─────────────────────────┴─────────────────────────────────────────────────┘
Never-Sync List
To exclude playlists from syncing (e.g., utility playlists for finding missing metadata):
During interactive review, when you skip a playlist, you'll be asked if you want to add it to the never-sync list. Or manually edit neversync.txt in your playlist folder: Playlists listed here will be skipped during sync operations.NoComposerSP
BitrateLessThan129SP
UnratedSP
Desktop Shortcut (Linux)
Create a shell script on your desktop:
#!/bin/bash
Strawberry Playlist Sync~/.local/share/strawberry/strawberry/strawberry-playlist-sync.py -s -p ~/Music/playlists -r
Save as strawberry-playlist-sync.sh and make executable with chmod +x.
Database Locations
The script auto-detects Strawberry's database in these locations:
Linux: ~/.local/share/strawberry/strawberry/strawberry.db macOS: ~/Library/Application Support/Strawberry/strawberry/strawberry.db Windows: ~/AppData/Local/strawberry/strawberry/strawberry.dbUse --db-path to specify a custom location.
Notes
Safe to run with Strawberry open: The script only reads from the database (except for duplicate removal), so syncing while Strawberry is running is fine. Forduplicate removal, close Strawberry first. Backups: Before overwriting any M3U file, a timestamped backup is created in a backups/ subfolder. M3U Format: Uses extended M3U with #EXTINF:seconds,Artist - Title lines. Path Handling: Automatically converts database file:// URLs to filesystem paths and handles URL-encoded characters.
License
Public domain / CC0. Use however you like.
Created by me and Claude Code tonight.