beetbox / beetbox/beets

error reading /tmp/tmpf3ev1x9k.mp3: can't sync to MPEG frame

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

Description

### Problem

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

```sh
$ beet -vv import -A "(any song or directory)"
```

Led to this problem:

```
user configuration: /home/user/.config/beets/config.yaml
data directory: /home/user/.config/beets
plugin paths:
lyrics: Disabling google source: no API key configured.
Sending event: pluginload
library database: /home/user/Music/.database/musiclibrary.db
library directory: /home/user/Music
Sending event: library_opened
Sending event: import_begin
Sending event: import_task_created
/home/user/download/01 - Trojan Horse.flac
Replacing item 27979: /home/user/download/01 - Trojan Horse.flac
Sending event: database_change
Sending event: database_change
Sending event: album_removed
Sending event: item_removed
1 of 1 items replaced
Sending event: database_change
Sending event: database_change
Sending event: database_change
Sending event: database_change
Sending event: database_change
Sending event: database_change
Reimported album: added 1702122116.4249115, flexible attributes [] from album 3481 for /home/user/download
Reimported item added 1702122116.4423912 from item 27979 for /home/user/download/01 - Trojan Horse.flac
Reimported item flexible attributes [] from item 27979 for /home/user/download/01 - Trojan Horse.flac
Sending event: database_change
convert: Encoding /home/user/download/01 - Trojan Horse.flac
convert: Finished encoding /home/user/download/01 - Trojan Horse.flac
Sending event: write
Traceback (most recent call last):
File "/usr/lib/python3.11/site-packages/mediafile.py", line 137, in mutagen_call
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/home/user/.local/lib/python3.11/site-packages/mutagen/_util.py", line 168, in wrapper_func
return func(h, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/.local/lib/python3.11/site-packages/mutagen/_file.py", line 301, in File
return Kind(fileobj, filename=filething.filename)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/.local/lib/python3.11/site-packages/mutagen/_file.py", line 48, in __init__
self.load(*args, **kwargs)
File "/home/user/.local/lib/python3.11/site-packages/mutagen/_util.py", line 160, in wrapper
return func(self, h, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/.local/lib/python3.11/site-packages/mutagen/id3/_file.py", line 421, in load
self.info = self._Info(fileobj, offset)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/.local/lib/python3.11/site-packages/mutagen/_util.py", line 189, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/home/user/.local/lib/python3.11/site-packages/mutagen/mp3/__init__.py", line 402, 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 "/usr/lib/python3.11/site-packages/beets/library.py", line 755, in write
mediafile = MediaFile(syspath(path), id3v23=id3v23)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mediafile.py", line 165, in wrapper
return mutagen_call('loadfile', '', f, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mediafile.py", line 137, in mutagen_call
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/home/user/.local/lib/python3.11/site-packages/mutagen/_util.py", line 160, in wrapper
return func(self, h, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mediafile.py", line 1580, in __init__
self.mgfile = mutagen_call(
^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mediafile.py", line 140, in mutagen_call
raise UnreadableFileError(filename, six.text_type(exc))
mediafile.UnreadableFileError: can't sync to MPEG frame

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.11/site-packages/beets/ui/__init__.py", line 1285, in main
_raw_main(args)
File "/usr/lib/python3.11/site-packages/beets/ui/__init__.py", line 1272, in _raw_main
subcommand.func(lib, suboptions, subargs)
File "/usr/lib/python3.11/site-packages/beets/ui/commands.py", line 973, in import_func
import_files(lib, paths, query)
File "/usr/lib/python3.11/site-packages/beets/ui/commands.py", line 943, in import_files
session.run()
File "/usr/lib/python3.11/site-packages/beets/importer.py", line 340, in run
pl.run_parallel(QUEUE_SIZE)
File "/usr/lib/python3.11/site-packages/beets/util/pipeline.py", line 446, in run_parallel
raise exc_info[1].with_traceback(exc_info[2])
File "/usr/lib/python3.11/site-packages/beets/util/pipeline.py", line 311, in run
out = self.coro.send(msg)
^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/beets/util/pipeline.py", line 193, in coro
func(*(args + (task,)))
File "/usr/lib/python3.11/site-packages/beets/importer.py", line 1535, in plugin_stage
func(session, task)
File "/usr/lib/python3.11/site-packages/beets/plugins.py", line 145, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/beetsplug/convert.py", line 183, in auto_convert
par_map(lambda item: self.convert_on_import(config.lib, item),
File "/usr/lib/python3.11/site-packages/beets/util/__init__.py", line 1060, in par_map
pool.map(transform, items)
File "/usr/lib/python3.11/multiprocessing/pool.py", line 367, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/multiprocessing/pool.py", line 774, in get
raise self._value
File "/usr/lib/python3.11/multiprocessing/pool.py", line 125, in worker
result = (True, func(*args, **kwds))
^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/multiprocessing/pool.py", line 48, in mapstar
return list(map(*args))
^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/beetsplug/convert.py", line 183, in
par_map(lambda item: self.convert_on_import(config.lib, item),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/beetsplug/convert.py", line 521, in convert_on_import
item.write()
File "/usr/lib/python3.11/site-packages/beets/library.py", line 757, in write
raise ReadError(path, exc)
beets.library.ReadError: error reading /tmp/tmp6opl2rq7.mp3: can't sync to MPEG frame

error reading /tmp/tmp6opl2rq7.mp3: can't sync to MPEG frame

```

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

### Setup

* OS: EndeavourOS (Arch)
* Python version: 3.11.6
* beets version: 1.6.0
* Turning off plugins made problem go away (yes/no): yes (convert)

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

```yaml
directory: ~/Music/
library: ~/Music/.database/musiclibrary.db
import:
move: yes
plugins: badfiles duplicates replaygain fetchart embedart lyrics
convert:
dest: ~/converted_music
auto: yes
copy_album_art: yes
embed: yes
never_convert_lossy_files: yes
command: ffmpeg -i $source -vn -aq 2 $dest
extension: mp3
replaygain:
auto: yes
backend: ffmpeg
fetchart:
high_resolution: yes
maxwidth: 3000
quality: 80
embedart:
ifempty: yes
remove_art_file: yes
lyrics:
auto: yes

```

Contributor guide

Open the contributing guide

Research direction

Trace the conversion path from beetsplug/convert.py into beets/library.py, using the reported `beet -vv import -A` command and configuration as the reproduction. Check the generated `/tmp/*.mp3` handling alongside the reported mediafile/mutagen error; done means importing the FLAC with the convert plugin no longer ends in ReadError.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cli
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.