FLAC downloader with a terminal UI and CLI. Searches the Monochrome API, matches via Spotify ISRC, and tags downloaded files with MusicBrainz metadata.
Project description
spidal
FLAC downloader with a terminal UI and CLI. Searches the Monochrome API, matches via Spotify ISRC, and tags downloaded files with MusicBrainz metadata.
Install
Requires Python 3.12+
pip install spidal
or run it with uv.
uvx spidal
TUI
Launch the interactive interface:
spidal
Tabs
| Key | Tab | Description |
|---|---|---|
s |
Search | Search the Monochrome API for tracks and albums |
e |
Get | Paste up to 25 URLs and bulk download |
p |
Spotify | Browse and download your Spotify playlists from Monochrome |
l |
Library | View downloaded tracks, no-match records, failures |
g |
Logs | View the application log |
Press q to quit.
Search tab
| Key | Action |
|---|---|
/ |
New search |
d |
Download all results |
t |
Switch to Tracks tab |
a |
Switch to Albums tab |
Press Enter on a track or album to download it, open it in a browser, or open its location on disk.
Note: Search results are limited to 25 items — this is a limitation of the upstream API.
Get tab
Paste up to 25 Monochrome or Spotify URLs (one per field) and press Download All or Ctrl+D. Supported URL types:
https://monochrome.tf/track/<id>https://monochrome.tf/album/<id>https://open.spotify.com/track/<id>https://open.spotify.com/album/<id>https://open.spotify.com/playlist/<id>
Press Esc while typing in a field to return to hotkey navigation.
Spotify tab
On first use, you will be prompted to enter a Spotify access token:
- Press Open Spotify Developer Console to open developer.spotify.com in your browser, log in, and copy the token from the example code
- Paste the token into the input field and press Enter
Once authenticated, your playlists are listed. Press Enter on a playlist to download it or open it in your browser.
| Key | Action |
|---|---|
a |
Enter / update token |
r |
Reload playlists |
Esc |
Dismiss token prompt |
Library tab
Three sub-tabs showing track records from the database. Press Enter on any row to open an action menu.
| Key | Sub-tab | Description | Enter action |
|---|---|---|---|
d |
Downloaded | Successfully downloaded tracks | Open file location |
n |
No Match | Spotify tracks with no Monochrome match | Reprocess (re-match) |
f |
Failed | Tracks that matched but failed to download | Reprocess (re-download) |
| Key | Action |
|---|---|
r |
Reload |
Logs tab
| Key | Action |
|---|---|
r |
Reload |
Home |
Scroll to top |
End |
Scroll to bottom |
CLI commands
spidal get <url>
Download a track, album, playlist, or liked songs by URL.
spidal get https://open.spotify.com/track/...
spidal get https://open.spotify.com/album/...
spidal get https://open.spotify.com/playlist/...
spidal get liked
spidal get https://monochrome.tf/track/123
spidal get https://monochrome.tf/album/456
spidal search [query]
Open the search TUI directly, optionally with an initial query.
spidal search "Bohemian Rhapsody"
spidal logs
Display the application log.
spidal logs # last 50 lines, color-coded by level
spidal logs -n 100 # last 100 lines
spidal logs --plain # plain text (useful for piping)
spidal config
Manage configuration values. Only config set persists values to the config file.
spidal config list # show all current values and sources
spidal config get <key> # show a single value and its source
spidal config set <key> <value> # persist a value to the config file
Examples:
spidal config get audio-quality
spidal config set download-dir ~/Music/flac
spidal config set audio-quality LOSSLESS
spidal config set download-delay 3
spidal config set spotify-token <token>
spidal config set hifi-api https://my-instance.example.com
spidal where
Open a file location in your system file manager.
spidal where config # open config directory (~/.config/spidal/)
spidal where logs # open log directory
spidal where dl # open download directory
spidal where db # open database directory
Configuration
Options can be set via spidal config set, environment variables, or CLI flags. Only spidal config set persists values across sessions — CLI flags and environment variables are applied at runtime only.
Priority: CLI flags > config file > environment variables > defaults
Config file: ~/.config/spidal/config.json
| Key | CLI flag | Env var | Default | Description |
|---|---|---|---|---|
spotify-token |
--spotify-token |
SPIDAL_SPOTIFY_TOKEN |
— | Spotify access token |
hifi-api |
--hifi-api |
SPIDAL_HIFI_API |
— | Direct Monochrome API endpoint |
hifi-api-file |
--hifi-api-file |
SPIDAL_HIFI_API_FILE |
monochrome instances URL | URL or path to JSON file with API list |
download-dir |
--download-dir |
SPIDAL_DOWNLOAD_DIR |
~/Music/spidal |
Download directory |
download-delay |
— | SPIDAL_DOWNLOAD_DELAY |
0 |
Seconds to wait between track downloads |
audio-quality |
— | SPIDAL_AUDIO_QUALITY |
HI_RES_LOSSLESS |
Audio quality (see below) |
disable-tagging |
— | SPIDAL_DISABLE_TAGGING |
false |
Skip MusicBrainz tagging after download |
--hifi-api and --hifi-api-file are mutually exclusive.
Audio quality
| Value | Format |
|---|---|
HI_RES_LOSSLESS |
Up to 24-bit/192kHz FLAC |
LOSSLESS |
16-bit/44.1kHz FLAC |
HIGH |
320kbps AAC |
LOW |
96kbps AAC |
Tagging
Downloaded tracks are automatically tagged using the MusicBrainz API (via ISRC lookup). No API key is required. Tagging can be disabled with spidal config set disable-tagging true.
The actual file format is detected from magic bytes after download and the file is renamed accordingly (e.g. DASH streams produce .m4a, not .flac). Tags are written using the appropriate format:
| Format | Container | Tag standard |
|---|---|---|
.flac |
FLAC | VorbisComment |
.m4a |
MPEG-4 | iTunes (MP4) |
.ogg |
Ogg | VorbisComment (Vorbis or Opus) |
Tags written per track:
| Tag | Source |
|---|---|
TITLE |
Monochrome API |
ARTIST |
Monochrome API |
ALBUM |
Monochrome API / Spotify |
TRACKNUMBER |
Monochrome API |
ISRC |
Monochrome API |
DATE |
MusicBrainz release |
GENRE |
MusicBrainz tag list |
ALBUMARTIST |
MusicBrainz artist credit |
DISCNUMBER |
MusicBrainz release medium |
DISCTOTAL |
MusicBrainz release medium |
TRACKTOTAL |
MusicBrainz release medium |
MUSICBRAINZ_TRACKID |
MusicBrainz recording MBID |
MUSICBRAINZ_ALBUMID |
MusicBrainz release MBID |
MUSICBRAINZ_ARTISTID |
MusicBrainz artist MBID |
Tag names follow MusicBrainz Picard conventions and are compatible with Plex, Roon, and other media servers.
Tagging is best-effort — failures are logged but never interrupt the download.
Data
- Config:
~/.config/spidal/config.json - Database:
~/.local/state/spidal/db.json— tracks downloaded files, no-match records, and playlist progress by ISRC - Logs:
~/.local/state/spidal/logs/spidal.log
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spidal-0.1.2.tar.gz.
File metadata
- Download URL: spidal-0.1.2.tar.gz
- Upload date:
- Size: 32.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
817e3e4f57f94753772307144671d1d8140d197c2fd0f7ad3990e7693d56a713
|
|
| MD5 |
4801ff45f829b41790aadec3e16f96ce
|
|
| BLAKE2b-256 |
11643776ba55557be77899cce5666bd9bdff37b5751bc651afffdb8b0bfa2b4b
|
Provenance
The following attestation bundles were made for spidal-0.1.2.tar.gz:
Publisher:
publish.yml on minhio/spidal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spidal-0.1.2.tar.gz -
Subject digest:
817e3e4f57f94753772307144671d1d8140d197c2fd0f7ad3990e7693d56a713 - Sigstore transparency entry: 962202123
- Sigstore integration time:
-
Permalink:
minhio/spidal@9313cc849fd7f5357fb639ecebb440bfc20062b7 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/minhio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9313cc849fd7f5357fb639ecebb440bfc20062b7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file spidal-0.1.2-py3-none-any.whl.
File metadata
- Download URL: spidal-0.1.2-py3-none-any.whl
- Upload date:
- Size: 39.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a02dee5fa619c2e203f0b7db915814d162ded9591aa0b18a8c6bb4227b4b9069
|
|
| MD5 |
768cede939d9e02dea7b3000b073b5dc
|
|
| BLAKE2b-256 |
15578bd5dcdbb8fd6f6f919125f5080c86f521dcf2f2586323f3228bade27cae
|
Provenance
The following attestation bundles were made for spidal-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on minhio/spidal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spidal-0.1.2-py3-none-any.whl -
Subject digest:
a02dee5fa619c2e203f0b7db915814d162ded9591aa0b18a8c6bb4227b4b9069 - Sigstore transparency entry: 962202127
- Sigstore integration time:
-
Permalink:
minhio/spidal@9313cc849fd7f5357fb639ecebb440bfc20062b7 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/minhio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9313cc849fd7f5357fb639ecebb440bfc20062b7 -
Trigger Event:
push
-
Statement type: