sclibble
scrobble + CLI = sCLIbble
Fast, lightweight CLI that scrobbles plays from an iPod to Last.fm.
I found popular tools like Legacy Scrobbler 1) too slow to parse large databases, and 2) unnecessary to launch a whole Electron GUI just to sync and close.
Install
pip install sclibble
pipx install sclibble
Requires Python 3.9.
Quickstart
sclibble login— authenticates via browser to Last.fm- Connect your iPod in disk mode (required)
sclibble sync— finds the device, parses new plays, and asks you to review / confirm before submitting- Done. Any rejects are cached and retried automatically on the following sync
Commands
sclibble login— authenticates via browser to Last.fmsclibble logout— logs out of current Last.fm sessionsclibble sync— find connected iPod, parse new plays, review/select, scrobble; also retries cached failuressclibble status— show logged-in username and pending cached scrobblessclibble delete— toggle auto-deletion ofPlay Countsafter a fully successful sync. (you want this OFF if you're syncing with both iTunes and Last.fm!)sclibble path— set or unset a custom iPod mount path
Configuration
Folder locations:
- macOS:
~/Library/Application Support/sclibble/ - Windows:
C:\Users\<username>\AppData\Local\adityanaithani\sclibble - Linux:
~/.local/share/sclibble
Parameters
config.json— preferences:autodeletetoggle andcustom_pathsettingsession.json— Last.fm session key, cached usernamefailed_scrobbles.json— cache of failed scrobbles
How it works
- iPods store two binary database files in the
iPod_Controldirectory:iTunesDB- contains track metadata for every song on the devicePlay Counts- list of last-played tracks, play counts (of course), last-played timestamp
- sclibble scans common mount points (or a custom path) for the directory, parses the database files, then matches
Play_Countspositionally againstiTunesDB. Timestamps are also converted from mac -> unix epoch and adjusted to match local timezone - For each track,
Play Countsstores one last-played timestamp + a play count. For repeat plays, sclibble simulates one timestamp per listen by backdating from the last-played time by the track length, then resolves overlaps so plays are chronological - Scrobbles are submitted to the Last.fm API in batches of <=50. Transient failures are handled by timeouts and retry/backoff
- Failed scrobbles are cached in
failed_scrobbles.jsonand automatically retried on nextsclibble sync - The
Play Countsfile is offered for deletion when every selected new play was accepted by Last.fm and the failure cache is empty. Cache-only retries never delete it, so play data is never wiped before it's safely scrobbled
Compatibility
Currently only tested and confirmed working on macOS with an iPod Mini 2G. Windows/Linux code does exist but I don't have a machine to test it on.
If you are able to test on a different OS or with a different device please create an issue and let me know so I can update this section.
Credentials
I will note that sclibble ships with hardcoded keys, which is mega insecure, but unfortunately the Last.fm API is quite old and doesn't have security features like modern APIs. For the super limited scope I imagine this tool will have I'm okay with it for now, if usage picks up I may switch to a proxy via a secure web server.
Dev Roadmap
- Tests and CI
- Windows / Linux validation
- Auto-eject post sync
- Improve settings UX
- Clear cache command
License
MIT — see LICENSE.
Metadata
Release files for sclibble 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sclibble-0.1.0.tar.gz | 14.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sclibble-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.8 kB
Release files / sclibble-0.1.0.tar.gz
| Download URL | sclibble-0.1.0.tar.gz |
|---|---|
| Size | 14.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f2eea85ec421de2609f29a98196147783ddaf96105676b7b4723d6d464122124
|
|
BLAKE2b-256 checksum How to use checksums |
b8ece2f9e230c860c44ad7dbd0af5eddf78bd98b6d874ecdfcc9e7ec0340a936
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency logRelease files / sclibble-0.1.0-py3-none-any.whl
| Download URL | sclibble-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9ce6561b9355b8221e39e8c034a5a961199e8b4f1712a024f2b61d02806292cd
|
|
BLAKE2b-256 checksum How to use checksums |
5396fe990b831b2963a44b220a0383c3e4b17b18c03173dac7489509353f7634
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency log