No description
Find a file
2026-04-03 08:55:54 -07:00
data first pass 2026-03-27 17:28:36 -07:00
src custom musicbrainz 2026-04-03 08:55:54 -07:00
tests tutorial 2026-03-31 13:00:15 -07:00
.gitignore init 2026-03-31 21:48:46 -07:00
backlog.md custom musicbrainz 2026-04-03 08:55:54 -07:00
Cargo.lock init 2026-03-31 21:48:46 -07:00
Cargo.toml init 2026-03-31 21:48:46 -07:00
README.md custom musicbrainz 2026-04-03 08:55:54 -07:00
rust-toolchain.toml first pass 2026-03-27 17:28:36 -07:00
TODO.md first pass 2026-03-27 17:28:36 -07:00
TUTORIAL.md custom musicbrainz 2026-04-03 08:55:54 -07:00

Music Recommender

A Bay Area-first music discovery engine that starts from upcoming local shows, then helps you figure out what to listen to next.

Current scope

  • Ingest local shows from 19hz and Foopee via the structured crawler on localhost:11235
  • Capture editorial recommendation signals from NPR and The Needle Drop
  • Store artists, venues, events, genres, images, and source evidence in SQLite
  • Enrich artists with Every Noise and MusicBrainz genre data
  • Produce genre-first artist recommendations using simple likes and dislikes

Quick start

cargo run -- init-db
cargo run -- doctor
cargo run -- completions --all-shells --output-dir ./completions
cargo run -- ingest-all --artist-limit 500
cargo run -- recommend --liked-genre punk --disliked-genre edm

Notes

  • The app expects the crawler service at http://localhost:11235/crawl
  • The app now defaults to XDG locations: ~/.cache/music-recommender, ~/.config/music-recommender, and ~/.local/share/music-recommender
  • On first run, the app writes a config template to ~/.config/music-recommender/config.toml
  • Point the app at your own MusicBrainz by setting musicbrainz_domain = "192.168.50.109:5000" or musicbrainz_domain = "https://musicbrainz.example.com" in config; the app derives the /ws/2 base URL automatically
  • musicbrainz_base_url still exists as an explicit full-URL override and takes precedence over musicbrainz_domain
  • The default SQLite database lives at ~/.local/share/music-recommender/music-recommender.sqlite3
  • On first run, the bundled Every Noise seed file is copied into ~/.local/share/music-recommender/everynoise_genres_20260317_135315.json unless MUSIC_RECOMMENDER_EVERYNOISE_PATH is set
  • Crawler and MusicBrainz responses are cached under ~/.cache/music-recommender
  • Set musicbrainz_user_agent in ~/.config/music-recommender/config.toml or via MUSIC_RECOMMENDER_MUSICBRAINZ_USER_AGENT; use a real contactable value like music-recommender/0.1.0 (you@example.com)
  • MusicBrainz lookups now self-throttle and retry transient failures; tune them with musicbrainz_min_interval_ms, musicbrainz_max_retries, and musicbrainz_retry_base_delay_ms
  • Use cargo run -- doctor to print resolved config and endpoint reachability
  • Use cargo run -- completions --all-shells --output-dir ./completions to generate Bash, Zsh, Fish, Elvish, Nushell, and PowerShell completions plus an install guide
  • Use cargo run -- completions --shell zsh --stdout to print a single shell script directly to stdout
  • Use cargo run -- ingest-all --artist-limit 500 to run ingest-shows, ingest-signals, and enrich-artists in one command
  • Use --refresh or --no-cache on ingestion and enrichment commands to bypass cached network responses
  • The Rust implementation avoids unsafe