170 lines
4.9 KiB
Markdown
170 lines
4.9 KiB
Markdown
# LRX-CLI
|
||
|
||
> [!WARNING]
|
||
>
|
||
> This project is primarily provided for educational and experimental purposes.
|
||
> It is yet not ready for production or commercial use and may violate the terms
|
||
> of service (ToS) of third‑party music platforms. Use of this software is at
|
||
> your own risk; the authors provide no warranties and accept no liability for any
|
||
> consequences arising from its use.
|
||
|
||
A CLI tool for fetching LRC lyrics on Linux. Automatically detects the currently
|
||
playing track via MPRIS/DBus and retrieves the best-matching lyrics from
|
||
multiple sources, ranked by confidence scoring.
|
||
|
||
## Sources
|
||
|
||
Sources are queried in order. High-confidence results (exact match or manual
|
||
insert) terminate the pipeline early; otherwise all sources are tried and the
|
||
highest-confidence result wins.
|
||
|
||
1. **Local** — sidecar `.lrc` files or embedded audio metadata (FLAC, MP3)
|
||
2. **Cache Search** — fuzzy cross-album lookup in local cache
|
||
3. **Spotify** — synced lyrics via Spotify's API
|
||
(requires `SPOTIFY_SP_DC` and Spotify trackid)
|
||
4. **LRCLIB** — exact match from [lrclib.net](https://lrclib.net)
|
||
(requires full metadata)
|
||
5. **Musixmatch (Spotify)** — Musixmatch API with Spotify trackid
|
||
(requires Spotify trackid)
|
||
6. **LRCLIB Search** — fuzzy search from lrclib.net (requires at least a title)
|
||
7. **Musixmatch** — Musixmatch API with metadata search (requires at least a title)
|
||
8. **Netease** — Netease Cloud Music public API
|
||
9. **QQ Music** — QQ Music via self-hosted API proxy
|
||
(requires `QQ_MUSIC_API_URL` that provides the same interface as [tooplick/qq-music-api](https://github.com/tooplick/qq-music-api))
|
||
|
||
> I'm aware that Spotify's lyrics are provided by Musixmatch, but the fact is
|
||
> that Musixmatch's own search will yield different (and more) results than
|
||
> Spotify's, so I treat them as separate sources.
|
||
|
||
## Usage
|
||
|
||
See `lrx --help` for full command reference. Common use cases:
|
||
|
||
- Fetch lyrics for the currently playing track:
|
||
|
||
```bash
|
||
lrx fetch
|
||
```
|
||
|
||
targeting a specific player and a source to fetch from:
|
||
|
||
```bash
|
||
lrx fetch --player mpd --method lrclib-search
|
||
```
|
||
|
||
- Search by metadata (bypasses MPRIS):
|
||
|
||
```bash
|
||
lrx search -t "My Love" -a "Westlife"
|
||
lrx search --trackid "5p0ietGkLNEqx1Z7ijkw5g"
|
||
```
|
||
|
||
or by path to a local audio file:
|
||
|
||
```bash
|
||
lrx search --path "/path/to/Westlife - My Love.flac"
|
||
```
|
||
|
||
- Export to sidecar `.lrc` file (or `.txt` with `--plain`):
|
||
|
||
```bash
|
||
lrx export
|
||
lrx export --plain
|
||
lrx export --output /path/to/lyrics.lrc
|
||
```
|
||
|
||
- Cache management:
|
||
|
||
```bash
|
||
lrx cache stats # statistics
|
||
lrx cache query # inspect cache entries for current track
|
||
lrx cache clear # clear cache of current track
|
||
lrx cache clear --all # clear entire cache
|
||
lrx cache confidence spotify 100 # manually set confidence for a source
|
||
```
|
||
|
||
## Configuration
|
||
|
||
Set credentials via environment variable or `.env` file:
|
||
|
||
- `~/.config/lrx/.env` — user-level
|
||
- `.env` in working directory — project-local
|
||
- Shell environment — highest priority
|
||
|
||
```env
|
||
SPOTIFY_SP_DC=your_cookie_value
|
||
MUSIXMATCH_USERTOKEN=your_musixmatch_usertoken
|
||
QQ_MUSIC_API_URL=https://api.example.com
|
||
PREFERRED_PLAYER=spotify
|
||
```
|
||
|
||
- `SPOTIFY_SP_DC` — required for Spotify source. Defaults to empty
|
||
(disabled Spotify source).
|
||
- `MUSIXMATCH_USERTOKEN` — optional for Musixmatch sources
|
||
([Curators Settings Page](https://curators.musixmatch.com/settings)
|
||
-> Login (if required)
|
||
-> "Copy debug info").
|
||
If not set, an anonymous token will be fetched at runtime.
|
||
- `QQ_MUSIC_API_URL` — required for QQ Music source. Defaults to empty
|
||
(disabled QQ Music source).
|
||
- `PREFERRED_PLAYER` — preferred MPRIS player when multiple are active.
|
||
Defaults to `spotify`. Only used when no `--player` flag is given and more
|
||
than one player (or none of them) is currently playing.
|
||
|
||
Shell completion (zsh/fish/bash):
|
||
|
||
```bash
|
||
lrx --install-completion
|
||
```
|
||
|
||
## Development
|
||
|
||
Clone this repository:
|
||
|
||
```bash
|
||
git clone https://github.com/Uyanide/LRX-CLI.git
|
||
cd LRX-CLI
|
||
```
|
||
|
||
Create a virtual environment and install dependencies (for example, using uv):
|
||
|
||
```bash
|
||
uv venv .venv
|
||
uv sync
|
||
```
|
||
|
||
Run tests without network calls
|
||
|
||
```bash
|
||
uv run pytest -m "not network"
|
||
```
|
||
|
||
or full tests:
|
||
|
||
```bash
|
||
uv run pytest
|
||
```
|
||
|
||
Run the CLI:
|
||
|
||
```bash
|
||
uv run lrx --help
|
||
```
|
||
|
||
Install to user-level (optional):
|
||
|
||
```bash
|
||
uv tool install .
|
||
```
|
||
|
||
## Credits
|
||
|
||
- [lrclib.net](https://lrclib.net)
|
||
- [spotify-lyrics-api](https://github.com/akashrchandran/spotify-lyrics-api)
|
||
- [librelyrics-spotify](https://github.com/libre-lyrics/librelyrics-spotify)
|
||
- [NeteaseCloudMusicAPI](https://www.npmjs.com/package/NeteaseCloudMusicApi?activeTab=readme)
|
||
- [qq-music-api](https://github.com/tooplick/qq-music-api)
|
||
- [LyricsMPRIS-Rust](https://github.com/BEST8OY/LyricsMPRIS-Rust)
|
||
- [onetagger](https://github.com/Marekkon5/onetagger)
|
||
- [Rise Media Player](https://github.com/theimpactfulcompany/Rise-Media-Player)
|