fileshazzer.py splits DJ sets (or any MP3 you throw at it) into segments, runs them through Shazam, and spits out a timestamped tracklist. seekspawner.py takes those IDs and hunts the files down on Soulseek via slsk-batchdl. Bring your own Soulseek credentials (setup will store them for you), or create new ones if you don't have them
- Python 3.11
ffmpegcommand line tool available on your$PATH- .NET 6 SDK so we can build
slsk-batchdl git(only needed the first timesetup.shclonesslsk-batchdl)
setup.sh tries to install ffmpeg and the .NET SDK for you on macOS or Debian/Ubuntu. If you're on anything else (or the script still complains that .NET is missing), install those pieces manually, then rerun ./setup.sh.
From the repo root:
chmod +x setup.sh
./setup.sh
What that script takes care of:
- Creates a fresh virtual environment at
.venvand installsrequirements.txt - Checks for
ffmpeg; will try to install it if the binary isn't found - Makes sure
.NET 6is around, then clones and buildsslsk-batchdlintoslsk-batchdl/slsk-batchdl/bin/Release - Sets up the working folders:
sets,tracklists,spoils,user,logs,tmp/segments,tmp/queries - Stores encrypted Soulseek credentials at
user/slsk_cred.json+user/slsk.key(setSLSK_USERNAMEandSLSK_PASSWORDin your shell to skip the prompt)
You can rerun setup.sh any time; it will reuse what already exists, offer to rotate credentials, and rebuild slsk-batchdl if needed.
-
Drop MP3s into
sets/or pointfileshazzer.pyat a SoundCloud link (thesoundcloud_urlvariable near the top). -
Activate the virtualenv:
source .venv/bin/activate -
Pick your workflow:
-
Full pipeline (Shazam + Soulseek download)
chmod +x launcher.sh ./launcher.shlauncher.shactivates the venv, runsfileshazzer.py, then immediately hands the fresh queries toseekspawner.py. -
Just fingerprint and build tracklists
python3.11 fileshazzer.pyTracklists (and their original MP3s) end up under
tracklists/<set_name>/. If Shazam throttles and things look frozen, give it a minute—it will continue. Want more reliable matches? Bumpsegment_length(default60seconds) at the top of the script so each chunk contains more audio. -
Already have a tracklist and only need Soulseek
python3.11 seekspawner.pyThe script looks for
*.txttracklists undertracklists/, parses them intotmp/queries/queries.txt, and fires those queries at Soulseek. You can drop your own tracklist files in there as long as they follow the same[hh:mm:ss] Artist - Titleformat.
-
seekspawner.py logs anything it had to skip to logs/skipped_queries.log, and downloads land in spoils/.
Final Tracklist:
[00:01:00] Umek - Center of Gravity
[00:13:30] Sade - Like Tattoo
[00:21:00] Zimmie Gix - Absolute Chill
[00:21:30] Andrea Frisina & Irregular Synth - Dub City
[00:22:00] Alan Fitzpatrick - Brian's Proper Dun One
[00:23:30] R.A.W. - Unbe (Erick 'More' Mix)
[00:24:00] Terrace - Magic O
...etc