A Beets plugin that interactively prompts you to fill in missing or incomplete metadata fields for your music tracks
Project description
beets-fillmissing
A Beets plugin that interactively prompts you to fill in missing or incomplete metadata fields for your music tracks.
Features
- 🎯 Query-based workflow: Target specific tracks using Beets' powerful query syntax
- 📝 Interactive prompts: Fill in metadata fields one by one with clear visual feedback
- 🔄 Smart defaults: Existing field values are shown as defaults - just press Enter to keep them
- 🎵 Built-in playback: Type
porplayto listen to a track before filling in metadata - ✅ Immediate writes: Changes are saved immediately after each field update
- ⚡ Fast workflow: Skip fields with Enter, exit anytime with Ctrl+C or Ctrl+D
Installation
From Git (Recommended)
Install directly from GitHub:
# Using pip
pip install git+https://github.com/amiv1/beets-fillmissing.git
# Using pipx
pipx inject beets git+https://github.com/amiv1/beets-fillmissing.git
Configuration
Add fillmissing to your plugins in Beets config file (usually ~/.config/beets/config.yaml):
plugins:
- fillmissing
# ... other plugins
Usage
beet fillmissing [QUERY] -f 'field1 field2 field3'
Arguments
QUERY: Standard Beets query to filter tracks (e.g.,artist:Unknown,genre:Hip-Hop,album:'My Album')-f, --fields: Space-separated list of fields to populate
Examples
Add genre and mood tags to tracks in a specific album:
beet fillmissing 'album:Chill Vibes' -f 'genre mood'
Add mood tags for tracks that don't have it:
beet fillmissing '^mood::.+' -f 'mood'
Interactive Commands
While filling in metadata, you can:
- Enter a value: Type the new value and press Enter to update the field
- Skip a field: Press Enter without typing to skip (keeps existing value or leaves blank)
- Play track: Type
pto open the track in your system's default audio player - Go back: Type
bto go back to editing the previous field - Skip track: Type
sto skip the current track metadata editing and go to the next one - Exit: Press Ctrl+C or Ctrl+D to stop the process anytime
Example Session
$ beet fillmissing 'mood:' -f 'mood context language'
Found 3 track(s) matching query.
Commands: 'p' = play | 's' = skip track | 'b' = back | Ctrl+C = quit
--- Track 1 of 3 ---
Jazz Ensemble - Smooth Jazz Collection - Summer Breeze
mood: chill
→ Updated mood
context [driving]: workout
→ Updated context
language: eng
→ Updated language
--- Track 2 of 3 ---
Synthwave Artists - Neon Nights - Midnight Drive
mood: p
♪ Playing...
mood: energy
→ Updated mood
context: driving
→ Updated context
language:
--- Track 3 of 3 ---
...
Done!
Field Behavior
-
Existing values: If a field already has a value, it's shown in brackets
[current_value]- Press Enter to keep it unchanged
- Type a new value to replace it
-
Empty fields: If a field is blank or doesn't exist, no default is shown
- Press Enter to skip without setting anything
- Type a value to set the field
Contributing
Issues and pull requests are welcome!
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 beets_fillmissing-0.3.2.tar.gz.
File metadata
- Download URL: beets_fillmissing-0.3.2.tar.gz
- Upload date:
- Size: 87.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
965c7195c3a73e7359ff9e4b67a2666aed0c7e8d841e5d9a3cfe6b830395c680
|
|
| MD5 |
257f088e5888c7bb53569934c43cc11e
|
|
| BLAKE2b-256 |
d52c455c9a6ae7a1caea016b779408e7dcfa641ab24a6a3d3dd04abf5418b107
|
Provenance
The following attestation bundles were made for beets_fillmissing-0.3.2.tar.gz:
Publisher:
release.yml on amiv1/beets-fillmissing
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
beets_fillmissing-0.3.2.tar.gz -
Subject digest:
965c7195c3a73e7359ff9e4b67a2666aed0c7e8d841e5d9a3cfe6b830395c680 - Sigstore transparency entry: 957149776
- Sigstore integration time:
-
Permalink:
amiv1/beets-fillmissing@ee550692d596d4f7cf9f5c81fa631ea13bede39f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/amiv1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ee550692d596d4f7cf9f5c81fa631ea13bede39f -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file beets_fillmissing-0.3.2-py3-none-any.whl.
File metadata
- Download URL: beets_fillmissing-0.3.2-py3-none-any.whl
- Upload date:
- Size: 5.4 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 |
f3aaccdff39f2d86a6d56824e3f48651465dd707d185ee4831e9dda29855b22c
|
|
| MD5 |
7adf4bf920cd4998198e519492c6289b
|
|
| BLAKE2b-256 |
ec0b47ec57f9a794cd42a63379095b062995731bef396a52dc84d0a8f857fd08
|
Provenance
The following attestation bundles were made for beets_fillmissing-0.3.2-py3-none-any.whl:
Publisher:
release.yml on amiv1/beets-fillmissing
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
beets_fillmissing-0.3.2-py3-none-any.whl -
Subject digest:
f3aaccdff39f2d86a6d56824e3f48651465dd707d185ee4831e9dda29855b22c - Sigstore transparency entry: 957149829
- Sigstore integration time:
-
Permalink:
amiv1/beets-fillmissing@ee550692d596d4f7cf9f5c81fa631ea13bede39f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/amiv1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ee550692d596d4f7cf9f5c81fa631ea13bede39f -
Trigger Event:
workflow_run
-
Statement type: