beetbox / beetbox/beets

albumartists separator is \NULL

Open
#5,750 4 comments 1 reaction 0 assignees View on GitHub
Dominant language
Python
Stars
15.7k
Forks
2.1k
Avg merge
4d 21h
Merged PRs (30d)
31

Description

The separator in the albumartists tag is handled as `\␀`.

Picard and ffprobe show the correct `;` in the tag.

I can handle the separated fields like so.
`%first{${albumartists},2,0,\␀,---}`
The docs imply ; as the correct separator though.

Running this command in verbose (`-vv`) mode:

```sh
$ beet -vv list -a sonicw
Parsed query: AndQuery([AnyFieldQuery('sonicw', ('album', 'albumartist', 'genre'), SubstringQuery)])
Parsed sort: NullSort()
上原ひろみ\␀Sonicwonder - 2023 - Sonicwonderland
Sending event: cli_exit
```

### Setup

* OS: arch
* Python version: Python 3.13.3
* beets version: beets 2.2.0-1
* Turning off plugins made problem go away (yes/no): no

```sh
$ beet --plugins= version
beets version 2.1.0
Python version 3.13.3
no plugins loaded
```

My configuration (output of `beet config`) is:

```yaml
# --------------- Main ---------------

library: library.db
directory: ~/Musik
statefile: state.pickle

# --------------- Plugins ---------------

plugins: []
pluginpath: []

# --------------- Import ---------------

clutter: [Thumbs.DB, .DS_Store]
ignore:
- .*
- '*~'
- System Volume Information
- lost+found
ignore_hidden: yes

import:
write: yes
copy: yes
move: no
timid: no
quiet: no
log:
default_action: apply
languages: []
quiet_fallback: skip
none_rec_action: ask
link: no
hardlink: no
reflink: no
delete: no
resume: ask
incremental: no
incremental_skip_later: no
from_scratch: no
autotag: yes
singletons: no
detail: no
flat: no
group_albums: no
pretend: no
search_ids: []
duplicate_keys:
album: albumartist album
item: artist title
duplicate_action: ask
duplicate_verbose_prompt: no
bell: no
set_fields: {}
ignored_alias_types: []
singleton_album_disambig: yes

# --------------- Paths ---------------

path_sep_replace: _
drive_sep_replace: _
asciify_paths: no
art_filename: cover
max_filename_length: 90
replace:
"[\\[\\]\\(\\)\\.\\?\\!\\*\\|\\+\\=\\,\\#~\xA7<>:]": ''
\&: ''
\": _
'[\\/]': ''
^\.: ''
\.$: ''
'[\x00-\x1f]': ''
^-: ''
_$: ''
\s+$: ''
^\s+: ''
\s: _
\': "\u2019"
-{3}$: ''

aunique:
keys: albumartist album
disambiguators: catalognum albumtype year label albumdisambig releasegroupdisambig
bracket: "\u2014"

sunique:
keys: artist title
disambiguators: year trackdisambig
bracket: "\u2014"

# --------------- Tagging ---------------

per_disc_numbering: yes
original_date: yes
artist_credit: no
id3v23: no
va_name: Various Artists
paths:
default: "%first{${albumartists},1,0,\\\u2400,\\;}/${year}---$album---${catalognum}/${disc}-${track}---${title}"
singleton: Non-Album/$genre/$artist_-_$title
comp: Compilations/$genre/$album%aunique{}/$track_-_$title

# --------------- Performance ---------------

threaded: yes
timeout: 5.0

# --------------- UI ---------------

verbose: 0
terminal_encoding:

ui:
terminal_width: 80
length_diff_thresh: 10.0
color: yes
colors:
text_success: [bold, green]
text_warning: [bold, yellow]
text_error: [bold, red]
text_highlight: [bold, red]
text_highlight_minor: [white]
action_default: [bold, cyan]
action: [bold, cyan]
text: [normal]
text_faint: [faint]
import_path: [bold, blue]
import_path_items: [bold, blue]
added: [green]
removed: [red]
changed: [yellow]
added_highlight: [bold, green]
removed_highlight: [bold, red]
changed_highlight: [bold, yellow]
text_diff_added: [bold, red]
text_diff_removed: [bold, red]
text_diff_changed: [bold, red]
action_description: [white]

import:
indentation:
match_header: 2
match_details: 2
match_tracklist: 5
layout: column

# --------------- Search ---------------

format_item: "%first{${albumartists},2,0,\\\u2400,--} - $year - $album - $track - $title"
format_album: $albumartists - $year - $album
time_format: '%Y-%m-%d %H:%M:%S'
format_raw_length: no

sort_album: albumartist+ original_year+ album+
sort_item: artist+ album+ disc+ track+
sort_case_insensitive: yes

# --------------- Autotagger ---------------

overwrite_null:
album: []
track: []
musicbrainz:
enabled: yes
host: musicbrainz.org
https: no
ratelimit: 1
ratelimit_interval: 1.0
searchlimit: 7
extra_tags:
- year
- country
- media
- label
genres: no
external_ids:
discogs: no
bandcamp: no
spotify: no
deezer: no
beatport: no
tidal: no

match:
strong_rec_thresh: 0.04
medium_rec_thresh: 0.25
rec_gap_thresh: 0.25
max_rec:
missing_tracks: medium
unmatched_tracks: medium
distance_weights:
source: 2.0
artist: 3.0
album: 3.0
media: 1.0
mediums: 1.0
year: 1.0
country: 0.5
label: 0.5
catalognum: 0.5
albumdisambig: 0.5
album_id: 5.0
tracks: 2.0
missing_tracks: 0.9
unmatched_tracks: 0.6
track_title: 3.0
track_artist: 2.0
track_index: 1.0
track_length: 2.0
track_id: 5.0
medium: 1.0
preferred:
countries: []
media: []
original_year: no
ignored: []
required: []
ignored_media: []
ignore_data_tracks: yes
ignore_video_tracks: yes
track_length_grace: 10
track_length_max: 30
album_disambig_fields: data_source media year country label catalognum albumdisambig
singleton_disambig_fields: data_source index track_alt album
```

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the separator handling with `beet -vv list -a sonicw` and compare the displayed `albumartists` value with Picard, ffprobe, and the documented `;` separator. Trace the albumartist formatting path from this command; done when separated fields use the documented separator without breaking the shown field-expansion syntax.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cli
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.