error reading /tmp/tmpf3ev1x9k.mp3: can't sync to MPEG frame
- 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
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