Skip to main content

Sync your music library to a classic iPod from a modern Mac

Project description

clickwheel

CI Python Bash ShellCheck License: MIT

A CLI for syncing a music library to a classic iPod from a modern Mac.

Handles the full workflow: audit and clean up your library's metadata and album art, interactively select what goes on the iPod, and sync with a progress bar — all without iTunes.

Prerequisites

  • macOS with Homebrew
  • Python 3.11+
  • Music library accessible via local or network mount
  • iPod Classic (stock firmware, connected via USB)

Quick Start

git clone https://github.com/pdugan20/clickwheel.git
cd clickwheel
cp .env.example .env        # edit with your music path + API key
./scripts/setup.sh          # install all dependencies

# metadata cleanup (one-time)
clickwheel scan              # audit library quality
clickwheel fix               # fix tags, art, genres via beets

# iPod workflow (ongoing)
clickwheel select            # pick artists/albums for iPod
clickwheel diff              # preview changes
clickwheel sync              # push to iPod

Commands

Command Description
clickwheel scan Index the music library, report on metadata/art quality
clickwheel fix Clean up metadata, fetch album art, fill genres (beets)
clickwheel select Interactive picker — browse by artist/album/genre, track size vs. capacity
clickwheel playlist List, save, and load selections
clickwheel diff Preview what would be added/removed on the iPod
clickwheel sync Push current selection to iPod with progress bar
clickwheel ls Show what's currently on the iPod
clickwheel eject Safely unmount the iPod

Configuration

All config lives in .env in the project root:

MUSIC_DIR=/path/to/your/music       # local path or network mount
ACOUSTID_API_KEY=your_key_here      # from acoustid.org (free)
IPOD_MOUNT=/Volumes/IPOD            # iPod mount point (auto-detected if omitted)

Project Structure

clickwheel/         # Python CLI package
  __main__.py       # entry point
  cli.py            # Typer command definitions
  library.py        # music library indexing
  selector.py       # interactive subset picker
  ipod.py           # iPod sync via libgpod
  db.py             # local SQLite for library index + selections
beets/              # beets configuration
  config.yaml.template
scripts/            # bash utilities
  setup.sh          # install all dependencies
  audit.sh          # standalone metadata audit (ffprobe-based)
  fix-metadata.sh   # standalone beets cleanup
playlists/          # saved selections
reports/            # audit output and logs (gitignored)

Stack

  • Typer — CLI framework
  • Rich — terminal UI (tables, progress bars, trees)
  • beets — metadata cleanup engine
  • libgpod — iPod database management
  • tqdm — progress bars for sync
  • ffprobe — audio file inspection

Notes

  • Metadata changes are written in-place. If your library is shared with Plex or other apps, changes will be picked up on their next scan.
  • beets is configured to never move or rename files.
  • FLAC files are not synced to the iPod (stock firmware doesn't support FLAC). Convert them separately if needed.
  • The scan and audit.sh commands are fully non-destructive (read-only).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

clickwheel-0.2.0.tar.gz (539.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

clickwheel-0.2.0-py3-none-any.whl (545.8 kB view details)

Uploaded Python 3

File details

Details for the file clickwheel-0.2.0.tar.gz.

File metadata

  • Download URL: clickwheel-0.2.0.tar.gz
  • Upload date:
  • Size: 539.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for clickwheel-0.2.0.tar.gz
Algorithm Hash digest
SHA256 7c94ee5b523f14458feaec305138e3a7a1434f96af4365d9f96183dc411f3e61
MD5 922826d3277a284a08cbb0911764b359
BLAKE2b-256 67c08acc47fb87e99ab080d58a3dcb9e0b9f1e501aad95ea1bb73d42c49254ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for clickwheel-0.2.0.tar.gz:

Publisher: publish.yml on pdugan20/clickwheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file clickwheel-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: clickwheel-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 545.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for clickwheel-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 604f362a62f9dfe5b3dc108cffea3956cbade91c5e78923e2c82969e836e4805
MD5 75bdccacc8931ac784cacd5965a3df6c
BLAKE2b-256 a6d88c5154e0c8f7d1d02a7a653096b9d3ebeb674da148ecac8943a67b2fd081

See more details on using hashes here.

Provenance

The following attestation bundles were made for clickwheel-0.2.0-py3-none-any.whl:

Publisher: publish.yml on pdugan20/clickwheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page