beetbox/beets

Multiple genres are written to files joined

Open

#5,491 opened on Oct 30, 2024

View on GitHub
 (3 comments) (2 reactions) (0 assignees)Python (1,837 forks)batch import
buggood first issue

Repository metrics

Stars
 (12,133 stars)
PR merge metrics
 (Avg merge 9d 12h) (46 merged PRs in 30d)

Description

Problem

Most of my music files have multiple genres, for example

$ filepath=/run/media/sarunas/music/Music/mokum/mok208_fkinghardcore12worldresistance/13_djdano_ooooohshitshitebrooklynmix.flac                                   ~ │ 🐍 3.8 🐶
$ beet info path:$filepath | grep -i genre
               genre: early hardcore, gabber, hardcore techno, psycore
              genres: early hardcore, gabber, hardcore techno, psycore

I noticed that these get written to FLAC files as a single comma-separated GENRE field:

$ metaflac --block-type VORBIS_COMMENT --list $filepath | grep -i genre                                                                                           ~ │ 🐍 3.8 🐶
    comment[37]: GENRE=early hardcore, gabber, hardcore techno, psycore

Even though I expected to see something like this instead

    comment[37]: GENRE=early hardcore
    comment[38]: GENRE=gabber
    comment[39]: GENRE=hardcore techno
    comment[40]: GENRE=psycore

Set GENRE correctly using mediafile

If I use mediafile to inspect the metadata, I see that genres return a list with a single genre, where I see all my genres together:

>>> from mediafile import MediaFile

>>> m = MediaFile("/run/media/sarunas/music/Music/mokum/mok208_fkinghardcore12worldresistance/13_djdano_ooooohshitshitebrooklynmix.flac")

>>> m.genres
Out[4]: ['early hardcore, gabber, hardcore techno, psycore']

Let's try to correct this using the same mediafile and save the file:

>>> m.genres = m.genres[0].split(", ")

>>> m.genres
Out[6]: ['early hardcore', 'gabber', 'hardcore techno', 'psycore']

>>> m.save()
$ metaflac --block-type VORBIS_COMMENT --list $filepath | grep -i genre                                                                                           ~ │ 🐍 3.8 🐶
    comment[60]: GENRE=early hardcore
    comment[61]: GENRE=gabber
    comment[62]: GENRE=hardcore techno
    comment[63]: GENRE=psycore

And now I'm seeing what I expected to have here.

Update beets library

Let's try to update beets library:

$ beet update path:$filepath                                                                                                                                      ~ │ 🐍 3.8 🐶
29276 | 2020 / F**king Hardcore #12 - World Resistance: DJ Dano - Oooooh Shit (Shit'E' Brooklyn Mix)
  genre: early hardcore, gabber, hardcore techno, psycore -> early hardcore

$ beet info path:$filepath | grep -i genre                                                                                                                        ~ │ 🐍 3.8 🐶
               genre: early hardcore
              genres: early hardcore; gabber; hardcore techno; psycore

It seems like it's turned into a list separated by a semicolon now.

And now let's try to write this file without making any changes:

$ beet write path:$filepath                                                                                                                                       ~ │ 🐍 3.8 🐶
 | 2020 / F**king Hardcore #12 - World Resistance: DJ Dano - Oooooh Shit (Shit'E' Brooklyn Mix)
  genre: early hardcore -> early hardcore, gabber, hardcore techno, psycore

This was unexpected given that I did not adjust the metadata. Let's inspect the file and the library:

$ metaflac --block-type VORBIS_COMMENT --list $filepath | grep -i genre                                                                                           ~ │ 🐍 3.8 🐶
    comment[37]: GENRE=early hardcore, gabber, hardcore techno, psycore

$ beet info path:$filepath | grep -i genre                                                                                                                        ~ │ 🐍 3.8 🐶
               genre: early hardcore, gabber, hardcore techno, psycore
              genres: early hardcore, gabber, hardcore techno, psycore

Multiple GENRE tags have been overwritten, and we're back where we started.

Contributor guide