Skip to content

Import crashes with TypeError: 'NoneType' object is not subscriptable for Musicbrainz plugin #6256

@Nedra1998

Description

@Nedra1998

Problem

Running this command in verbose (-vv) mode:

$ beet -vv import --move /import

Led to this problem:

Traceback (most recent call last):
  File "/usr/bin/beet", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/lib/python3.12/site-packages/beets/ui/__init__.py", line 1629, in main
    _raw_main(args)
  File "/usr/lib/python3.12/site-packages/beets/ui/__init__.py", line 1608, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/usr/lib/python3.12/site-packages/beets/ui/commands/import_/__init__.py", line 131, in import_func
    import_files(lib, byte_paths, query)
  File "/usr/lib/python3.12/site-packages/beets/ui/commands/import_/__init__.py", line 75, in import_files
    session.run()
  File "/usr/lib/python3.12/site-packages/beets/importer/session.py", line 236, in run
    pl.run_parallel(QUEUE_SIZE)
  File "/usr/lib/python3.12/site-packages/beets/util/pipeline.py", line 471, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/usr/lib/python3.12/site-packages/beets/util/pipeline.py", line 336, in run
    out = self.coro.send(msg)
          ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/beets/util/pipeline.py", line 219, in coro
    func(*(args + (task,)))
  File "/usr/lib/python3.12/site-packages/beets/importer/stages.py", line 146, in lookup_candidates
    task.lookup_candidates(session.config["search_ids"].as_str_seq())
  File "/usr/lib/python3.12/site-packages/beets/importer/tasks.py", line 367, in lookup_candidates
    autotag.tag_album(self.items, search_ids=search_ids)
  File "/usr/lib/python3.12/site-packages/beets/autotag/match.py", line 319, in tag_album
    for matched_candidate in metadata_plugins.candidates(
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/beets/plugins.py", line 559, in wrapper
    for v in func(*args, **kwargs):
             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/beets/metadata_plugins.py", line 41, in candidates
    yield from plugin.candidates(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/beetsplug/chroma.py", line 210, in candidates
    album = self.mb.album_for_id(relid)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/beetsplug/musicbrainz.py", line 920, in album_for_id
    release = self.album_info(res)
              ^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/beetsplug/musicbrainz.py", line 731, in album_info
    info.country, release_date = _preferred_release_event(release)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/beetsplug/musicbrainz.py", line 336, in _preferred_release_event
    if country in event["area"]["iso-3166-1-codes"]:
                  ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not subscriptable

Here's a link to the music files that trigger the bug (if relevant):

The files are not relevant, but I think it is crashing while trying to request this release: https://musicbrainz.org/release/15c0351a-f2cf-434c-861c-dc9b82893f3d

I suspect this may be a regression from #6052?

Setup

  • OS: Alpine (Docker container)
  • Python version: 3.12.12
  • beets version: 2.5.1(on master)
  • Turning off plugins made problem go away (yes/no): yes if I turn off the musicbrainz plugin

My configuration (output of beet config) is:

#  _____         _
# | __  |___ ___| |_ ___
# | __ -| -_| -_|  _|_ -|
# |_____|___|___|_| |___|

# Global Options ##############################################################

threaded: yes
original_date: yes

# Path ########################################################################

directory: /library
library: /database/beets.db
statefile: /database/state.pickle

asciify_paths: yes
per_disc_numbering: no

aunique:
  keys: albumartist album year
  disambiguators: albumtype label catalognum albumdisambig releasegroupdisambig
  bracket: "[]"

paths:
  default: $firstAlbumArtist/$album ($year)%aunique{}/$track $title
  singleton: $firstAlbumArtist/Non-Album/$title
  albumtype:soundtrack: Soundtracks/$album ($year)%aunique{}/$track $title
  comp: Various Artists/$album ($year)%aunique{}/$track $title

  # copyartifacts
  ext:jpg: $albumpath/cover
  ext:jpeg: $albumpath/cover
  ext:png: $albumpath/cover
  ext:webp: $albumpath/cover

# Import ######################################################################

import:
  write: yes
  copy: no
  move: no
  resule: yes
  incremental: yes
  timied: no
  languages: en jp
  log: /config/log.txt

# Autotagger ##################################################################

match:
  preferred:
    media: ["Digital Media|File", "Digital Media"]
    countries: ["XW", "US", "GB|UK", "CA"]

  strong_rec_thresh: 0.30
  medium_rec_thresh: 0.50

# Plugins #####################################################################

plugins:
  # Autotagger Extensions
  - bandcamp
  - chroma
  - deezer
  - fromfilename
  - musicbrainz
  - spotify

  # Metadata
  - edit
  - embedart
  - fetchart
  - importadded
  - lastgenre
  - lyrics
  - replaygain
  # - scrub

  # Path Formats
  - copyartifacts
  - inline

  # Interoperability
  - badfiles
  # - check

  # Miscellaneous
  - duplicates
  - info
  - missing
  - permissions
  - unimported

# Autotagger Extensions
musicbrainz:
  search_limit: 10
  data_source_mismatch_penalty: 0.4
  extra_tags: [year, catalognum, country, label, media]
  external_ids:
    bandcamp: yes
    beatport: yes
    deezer: yes
    discogs: yes
    spority: yes
    tidal: yes

spotify:
  search_limit: 5
  data_source_mismatch_penalty: 0.5

bandcamp:
  search_max: 5
  data_source_mismatch_penalty: 0.6
  art: true

deezer:
  search_limit: 5
  data_source_mismatch_penalty: 0.7

chroma:
  auto: yes

# Metadata
fetchart:
  auto: yes
  minwidth: 500
  maxwidth: 1000
  enforce_ratio: yes

embedart:
  auto: no
  compare_threshold: 50
  ifempty: no
  maxwidth: 500
  remove_art_file: no

lastgenre:
  auto: yes
  count: 5
  canonical: no
  whitelist: /config/genres.txt
  force: yes
  fallback: ""

lyrics:
  auto: yes
  synced: yes
  fallback: ""
  sources: [lrclib]

replaygain:
  auto: yes
  backend: ffmpeg

# Path Formats
copyartifacts:
  extensions: .jpg .png .webp
  print_ignored: yes

item_fields:
  firstAlbumArtist: albumartists[0]

# Miscellaneous
permissions:
  file: 644
  dir: 755

duplicates:
  count: yes
  full: yes

check:
  import: yes

missing:
  count: yes
  total: yes

# UI ##########################################################################

verbose: no
ui:
  terminal_width: 120
  color: yes

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions