beets icon indicating copy to clipboard operation
beets copied to clipboard

Using auto: yes in convert fails imports for any music file

Open TacticalLaptopBag opened this issue 1 month ago • 0 comments

Problem

Running this command in verbose (-vv) mode:

$ beet -vv import "almost monday"

Led to this problem:

Command Output
➜ [A]pply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? 
Sending event: import_task_choice
Sending event: import_task_apply
0 of 1 items replaced
Sending event: database_change
Parsed query: OrQuery([AndQuery([SubstringQuery('format', 'MP3', fast=True)]), AndQuery([SubstringQuery('format', 'FLAC', fast=True)]), AndQuery([SubstringQuery('format', 'OPUS', fast=True)])])
Parsed sort: NullSort()
convert: Encoding /home/user/.var/app/com.usebottles.bottles/data/bottles/bottles/iTunes/drive_c/users/steamuser/Music/iTunes/iTunes Media/Music/almost monday/only wanna dance - Single/01 only wanna dance.m4a
convert: Finished encoding /home/user/.var/app/com.usebottles.bottles/data/bottles/bottles/iTunes/drive_c/users/steamuser/Music/iTunes/iTunes Media/Music/almost monday/only wanna dance - Single/01 only wanna dance.m4a
Sending event: write
Traceback (most recent call last):
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mediafile.py", line 132, in mutagen_call
    return func(*args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/_util.py", line 164, in wrapper_func
    return func(h, *args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/_file.py", line 302, in File
    return Kind(fileobj, filename=filething.filename)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/_file.py", line 48, in __init__
    self.load(*args, **kwargs)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/_util.py", line 156, in wrapper
    return func(self, h, *args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/id3/_file.py", line 420, in load
    self.info = self._Info(fileobj, offset)
                ~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/_util.py", line 185, in wrapper
    return func(*args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/mp3/__init__.py", line 401, in __init__
    raise HeaderNotFoundError("can't sync to MPEG frame")
mutagen.mp3.HeaderNotFoundError: can't sync to MPEG frame

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/library/models.py", line 969, in write
    mediafile = MediaFile(syspath(path), id3v23=id3v23)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mediafile.py", line 160, in wrapper
    return mutagen_call('loadfile', '', f, *args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mediafile.py", line 132, in mutagen_call
    return func(*args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mutagen/_util.py", line 156, in wrapper
    return func(self, h, *args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mediafile.py", line 1540, in __init__
    self.mgfile = mutagen_call(
                  ~~~~~~~~~~~~^
        'open', self.filename, mutagen.File, filething
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/mediafile.py", line 135, in mutagen_call
    raise UnreadableFileError(filename, str(exc))
mediafile.UnreadableFileError: can't sync to MPEG frame

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/ui/__init__.py", line 1713, in main
    _raw_main(args)
    ~~~~~~~~~^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/ui/__init__.py", line 1692, in _raw_main
    subcommand.func(lib, suboptions, subargs)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/ui/commands.py", line 1378, in import_func
    import_files(lib, byte_paths, query)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/ui/commands.py", line 1322, in import_files
    session.run()
    ~~~~~~~~~~~^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/importer/session.py", line 234, in run
    pl.run_parallel(QUEUE_SIZE)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/util/pipeline.py", line 468, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/util/pipeline.py", line 333, in run
    out = self.coro.send(msg)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/util/pipeline.py", line 216, in coro
    func(*(args + (task,)))
    ~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/importer/stages.py", line 247, in plugin_stage
    func(session, task)
    ~~~~^^^^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/plugins.py", line 329, in wrapper
    return func(*args, **kwargs)
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beetsplug/convert.py", line 245, in auto_convert
    par_map(
    ~~~~~~~^
        lambda item: self.convert_on_import(config.lib, item),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        task.imported_items(),
        ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/util/__init__.py", line 1050, in par_map
    pool.map(transform, items)
    ~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/multiprocessing/pool.py", line 367, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/multiprocessing/pool.py", line 774, in get
    raise self._value
  File "/usr/lib/python3.13/multiprocessing/pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
                    ~~~~^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/multiprocessing/pool.py", line 48, in mapstar
    return list(map(*args))
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beetsplug/convert.py", line 246, in <lambda>
    lambda item: self.convert_on_import(config.lib, item),
                 ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beetsplug/convert.py", line 665, in convert_on_import
    item.write()
    ~~~~~~~~~~^^
  File "/home/user/.beet-venv/lib/python3.13/site-packages/beets/library/models.py", line 971, in write
    raise ReadError(path, exc)
beets.library.exceptions.ReadError: error reading <super: <class 'ReadError'>, <ReadError object>>

error reading <super: <class 'ReadError'>, <ReadError object>>

Here's a link to the music files that trigger the bug (if relevant): This happens with any music file I give it.

Setup

  • OS: Kubuntu 25.04
  • Python version: 3.13.3
  • beets version: 2.5.1
  • Turning off plugins made problem go away (yes/no): no - I disabled every plugin but convert and still have this issue

My configuration (output of beet config) is:

directory: /music/Library
library: /music/beets/musiclibrary.db
artist_credit: no

replace: {
    "“": '',
    "”": '',
    '"': "",
    "’": "'",
    # remove ascii control characters
    '[\x00-\x1f]': "_",
    # spaces at the beginning and and
    '\s+$': "",
    '^\s+': "",
    ":": "",
    "\\?": "",
}

import:
    move: yes
    bell: yes
    timid: yes

paths:
    default: $albumartist/$album%aunique{}/$track $title
    singleton: $artist/Singles/$title
    comp: Compilations/$album%aunique{}/$track $title

plugins:
    - convert

convert:
  auto: yes
  format: mp3
  dest: /music/Originals
  max_bitrate: 256
  no_convert: "format:MP3 , format:FLAC , format:OPUS"
  delete_originals: true
  formats:
    mp3:
      command: ffmpeg -i $source -hide_banner -loglevel error -acodec libmp3lame -ar 44100 -b:a 256k -vn $dest
      extension: mp3
    aac:
      command: ffmpeg -i $source -c:a aac -b:a 256k -c:v copy -map_metadata 0 -map 0:a -map 0:v? -disposition:v:0 attached_pic $dest
      extension: m4a

If I set convert's config to use auto: no, import works fine.

TacticalLaptopBag avatar Nov 23 '25 13:11 TacticalLaptopBag