beets icon indicating copy to clipboard operation
beets copied to clipboard

Crash KeyError: 'title'

Open eric-sofisoftwarellc opened this issue 1 year ago • 5 comments

Import fails with KeyError: 'title'

The problem seems to be the file name doesn't have a space. If a track is named "01LadyOfAutumn.mp3", it crashes. If I change all the tracks to have a space after the number, eg "01 LadyOfAutumn.mp3", it succeeds.

Turning off plugins works, it does not crash. Update: I narrowed down the plugin to fromfilename. If I remove that, it works.

I have latest version from git (pipx install https://github.com/beetbox/beets/tarball/master).

(beets) ➜  ~ beet import test
Traceback (most recent call last):
  File "/Users/user/.local/pipx/venvs/beets/bin/beet", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/ui/__init__.py", line 1865, in main
    _raw_main(args)
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/ui/__init__.py", line 1852, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/ui/commands.py", line 1395, in import_func
    import_files(lib, paths, query)
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/ui/commands.py", line 1326, in import_files
    session.run()
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/importer.py", line 360, in run
    pl.run_parallel(QUEUE_SIZE)
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/util/pipeline.py", line 447, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/util/pipeline.py", line 312, in run
    out = self.coro.send(msg)
          ^^^^^^^^^^^^^^^^^^^
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/util/pipeline.py", line 195, in coro
    func(*(args + (task,)))
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/importer.py", line 1490, in lookup_candidates
    plugins.send("import_task_start", session=session, task=task)
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/plugins.py", line 507, in send
    result = handler(**arguments)
             ^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beets/plugins.py", line 143, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beetsplug/fromfilename.py", line 165, in filename_task
    apply_matches(d, self._log)
  File "/Users/user/.local/pipx/venvs/beets/lib/python3.12/site-packages/beetsplug/fromfilename.py", line 124, in apply_matches
    item.title = str(d[item][title_field])
                     ~~~~~~~^^^^^^^^^^^^^
KeyError: 'title'

Setup

  • OS: Mac OSX 14.4.1
(beets) ➜  ~ beet version
beets version 1.6.1
Python version 3.12.3
plugins: badfiles, chroma, embedart, fetchart, fromfilename, mbsync, unimported, web
  • Turning off plugins made problem go away (yes/no): yes
beet --plugins=  import test

Finding tags for album "foo".
  Candidates:
[etc]

My configuration (output of beet config) is:

(beets) ➜  ~ beet config
directory: /Volumes/Bigly/music/beets/music
# --------------- Main ---------------

library: /Volumes/Bigly/music/beets/data/musiclibrary.db

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

plugins: web chroma badfiles fromfilename embedart fetchart unimported mbsync
unimported:
    ignore_extensions: jpg png DS_Store
    ignore_subdirectories: NonMusic data temp
chroma:
    auto: yes
web:
    host: 127.0.0.1
    port: 8337
    cors: ''
    cors_supports_credentials: no
    reverse_proxy: no
    include_paths: no
    readonly: yes
fetchart:
    auto: yes
    minwidth: 0
    maxwidth: 0
    quality: 0
    max_filesize: 0
    enforce_ratio: no
    cautious: no
    cover_names:
    - cover
    - front
    - art
    - album
    - folder
    sources:
    - filesystem
    - coverart
    - itunes
    - amazon
    - albumart
    - cover_art_url
    store_source: no
    high_resolution: no
    deinterlace: no
    cover_format:
    google_key: REDACTED
    google_engine: 001442825323518660753:hrh5ch1gjzm
    fanarttv_key: REDACTED
    lastfm_key: REDACTED
embedart:
    maxwidth: 0
    auto: yes
    compare_threshold: 0
    ifempty: no
    remove_art_file: no
    quality: 0

eric-sofisoftwarellc avatar May 03 '24 19:05 eric-sofisoftwarellc

Hey! I am looking to make my first contribution to an open source program

I was able to handle the filename by adding a new regex pattern in PATTERNS. r"^(?P<track>\d+)(?P<title>.+)$"

what does everyone think?

tumbleboy avatar Jun 05 '24 05:06 tumbleboy

Hey! I am looking to make my first contribution to an open source program

I was able to handle the filename by adding a new regex pattern in PATTERNS. r"^(?P<track>\d+)(?P<title>.+)$"

what does everyone think?

It still crashes with filenames like 01.mp3 02.mp3 etc

Files of this kind were working fine before the changes introduced in 2839302 and 5461ddf. Indeed I've been using a very old version of beets without problems, and I've just noticed this bug today after updating to 2.0.0

The fromfilename plugin should be fixed to allow a wider range of filenames, either relaxing/refactoring some of the regexps in PATTERNS or by not requiring existence of the title dictionary key in the checks done in apply_matches()

Vrihub avatar Jun 05 '24 14:06 Vrihub

I think not requiring the existence of the title key could be the way to go. I don't think this is a very common issue among users but happy to discuss another way.

tumbleboy avatar Jun 10 '24 04:06 tumbleboy

FYI, I'm having a closer look at the fromfilename plugin and I'll try to come up with a PR to fix the bug

Vrihub avatar Jun 13 '24 19:06 Vrihub

Hey @Vrihub, I've been working on this issue and I can create a draft PR soon for you to review?

tumbleboy avatar Jun 14 '24 04:06 tumbleboy