[VIBECODED!] A native Rust application to sync songs and albums from your self-hosted Navidrome instance to your iPod running either stock OS or Rockbox 🎸
Find a file
SindreKjelsrud f1b31fabda
feat: Add scrobble-command to Listenbrainz
Signed-off-by: SindreKjelsrud <sindre@kjelsrud.dev>
2026-01-13 22:11:01 +01:00
src feat: Add scrobble-command to Listenbrainz 2026-01-13 22:11:01 +01:00
.gitignore feat: Working sync between Navidrome & iPod 2025-12-21 21:18:17 +01:00
Cargo.lock feat: Add scrobble-command to Listenbrainz 2026-01-13 22:11:01 +01:00
Cargo.toml feat: Add scrobble-command to Listenbrainz 2026-01-13 22:11:01 +01:00
config.example.toml feat: Add scrobble-command to Listenbrainz 2026-01-13 22:11:01 +01:00
README.md feat: Add scrobble-command to Listenbrainz 2026-01-13 22:11:01 +01:00
shell.nix feat: Add scrobble-command to Listenbrainz 2026-01-13 22:11:01 +01:00

NaviPod

A native Rust application to sync songs and albums from your self-hosted Navidrome instance to your iPod running either stock OS or Rockbox.

Features

  • 🎵 Sync songs and albums from Navidrome
  • 📱 Support for iPod stock OS
  • 🎸 Support for Rockbox firmware
  • 📊 Scrobble listening history to ListenBrainz
  • ⚙️ Configurable sync options
  • 🔄 Incremental sync support
  • 📈 Terminal progress bars with live status

Installation

cargo build --release

Configuration

  1. Copy config.example.toml to config.toml:

    cp config.example.toml config.toml
    
  2. Edit config.toml with your settings:

    [navidrome]
    url = "http://localhost:4533"
    username = "your_username"
    password = "your_password"
    
    [ipod]
    mount_point = "/media/ipod"
    firmware = "rockbox"  # or "stock"
    
    [sync]
    albums = true
    playlists = false
    format = "mp3"
    
    [listenbrainz]
    # Optional - only needed for scrobbling to ListenBrainz
    token = "your_listenbrainz_token"
    
  3. Alternatively, use environment variables (prefixed with NAVIPOD__):

    export NAVIPOD__NAVIDROME__URL="http://localhost:4533"
    export NAVIPOD__NAVIDROME__USERNAME="your_username"
    export NAVIPOD__NAVIDROME__PASSWORD="your_password"
    export NAVIPOD__IPOD__MOUNT_POINT="/media/ipod"
    export NAVIPOD__IPOD__FIRMWARE="rockbox"
    

Note: Navidrome must have JSON API enabled (default in recent versions). The application uses Subsonic API with f=json parameter.

Usage

# Sync all configured content (with progress bar)
cargo run -- sync

# Sync specific album
cargo run -- sync --album "Album Name"

# Sync specific artist
cargo run -- sync --artist "Artist Name"

# List available albums
cargo run -- list-albums

# Check iPod connection
cargo run -- check

# Scrobble listening history to ListenBrainz
cargo run -- scrobble

# Scrobble and clear the log (with backup)
cargo run -- scrobble --clear

# Scrobble and clear without backup
cargo run -- scrobble --clear --no-backup

Scrobbling to ListenBrainz

NaviPod can read the .scrobbler.log file from your Rockbox iPod and submit your listening history to ListenBrainz:

  1. Get your ListenBrainz user token from https://listenbrainz.org/profile/
  2. Add it to your config.toml:
    [listenbrainz]
    token = "your_token_here"
    
  3. Run the scrobble command:
    cargo run -- scrobble --clear
    

The --clear flag will remove the scrobbler log after successful submission (with automatic backup). This is useful to avoid re-submitting the same listens next time.

Requirements

  • Rust 1.70+ (and Cargo)
  • C compiler (for building native dependencies)
  • iPod mounted and accessible
  • Navidrome instance running and accessible
  • Navidrome with JSON API support (enabled by default)

NixOS Setup

If you're using NixOS, enter the development shell:

nix-shell

This will provide Rust, Cargo, and all necessary build tools. The shell.nix file is already configured for this project.

Building

# On NixOS, first enter the development shell:
nix-shell

# Build in release mode
cargo build --release

# The binary will be at:
# - target/release/navipod

# Install to your PATH (optional)
cargo install --path .

Development

# Run in debug mode
cargo run -- sync

# Run tests
cargo test

# Check code
cargo check

License

MIT OR Apache-2.0