Added exact artist matching

This commit is contained in:
Connor Johnstone
2026-03-05 11:31:53 -05:00
parent 70aedb49f2
commit 2ffdce4fbc
8 changed files with 152 additions and 74 deletions

72
README.md Normal file
View File

@@ -0,0 +1,72 @@
# drift
Discovers similar artists via Last.fm and builds playlists from your local music library. Point it at a directory, pick a seed artist, and get a playlist of tracks weighted by artist similarity and popularity.
## Metadata requirements
Your music files need **MusicBrainz artist IDs** in their tags (`MUSICBRAINZ_ARTISTID`). Without these, tracks are skipped during indexing. Track titles help with popularity scoring — drift matches them against Last.fm's top tracks to bias toward well-known songs.
Most taggers (Picard, beets, etc.) can write MusicBrainz IDs automatically.
## Setup
You need a Last.fm API key. Create one at https://www.last.fm/api/account/create, then set it:
```
echo 'LASTFM_API_KEY=your_key_here' > .env
```
Or export it directly — drift loads `.env` automatically via dotenvy.
## Usage
### Index your library
```
drift index /path/to/music
```
Scans for tagged files, fetches similar artists and top tracks from Last.fm, and stores everything in a local SQLite database (`~/.local/share/drift/drift.db`).
Flags:
- `-v` — print progress
- `-f` — re-index artists that were already indexed
### Build a playlist
```
drift build
```
Opens an interactive picker to choose a seed artist. Or pass an artist name directly:
```
drift build "Radiohead"
```
Flags:
- `-n 30` — number of tracks (default 20)
- `-p 8` — popularity bias, 010 (default 5, higher = prefer popular tracks)
- `-s` — interleave artists evenly instead of score order
- `-r` — fully randomize track order
- `-v` — print track scores to stderr
### Output
By default, drift prints file paths to stdout — pipe it wherever you want.
#### MPD
```
drift build -m
```
Queues tracks directly in MPD. Requires `MPD_HOST` and `MPD_MUSIC_DIR` environment variables.
#### Airsonic
```
drift build -a
```
Creates a playlist in Airsonic/Navidrome. Requires `AIRSONIC_URL`, `AIRSONIC_USER`, and `AIRSONIC_PASS` environment variables.