No description
- Rust 100%
| data | ||
| src | ||
| tests | ||
| .gitignore | ||
| backlog.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
| rust-toolchain.toml | ||
| TODO.md | ||
| TUTORIAL.md | ||
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"ormusicbrainz_domain = "https://musicbrainz.example.com"in config; the app derives the/ws/2base URL automatically musicbrainz_base_urlstill exists as an explicit full-URL override and takes precedence overmusicbrainz_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.jsonunlessMUSIC_RECOMMENDER_EVERYNOISE_PATHis set - Crawler and MusicBrainz responses are cached under
~/.cache/music-recommender - Set
musicbrainz_user_agentin~/.config/music-recommender/config.tomlor viaMUSIC_RECOMMENDER_MUSICBRAINZ_USER_AGENT; use a real contactable value likemusic-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, andmusicbrainz_retry_base_delay_ms - Use
cargo run -- doctorto print resolved config and endpoint reachability - Use
cargo run -- completions --all-shells --output-dir ./completionsto generate Bash, Zsh, Fish, Elvish, Nushell, and PowerShell completions plus an install guide - Use
cargo run -- completions --shell zsh --stdoutto print a single shell script directly to stdout - Use
cargo run -- ingest-all --artist-limit 500to runingest-shows,ingest-signals, andenrich-artistsin one command - Use
--refreshor--no-cacheon ingestion and enrichment commands to bypass cached network responses - The Rust implementation avoids
unsafe