beet import -s fails with "at least one query term is required"
- Dominant language
- Python
- Stars
- 15.7k
- Forks
- 2.1k
- Avg merge
- 4d 21h
- Merged PRs (30d)
- 31
Description
I'm trying to import a bunch of songs to my library, using `beet import -s .`
### Problem
Running this command in verbose (`-vv`) mode:
```sh
beet -vv import -s .
```
Led to this problem:
```
user configuration: /home/soso/.config/beets/config.yaml
data directory: /home/soso/.config/beets
plugin paths: []
Loading plugins: musicbrainz
Sending event: pluginload
library database: /home/soso/.config/beets/library.db
library directory: /home/soso/Music
Sending event: library_opened
Sending event: import_begin
Sending event: import_task_created
Sending event: import_task_start
Looking up: /home/soso/Downloads/music/Agar Agar ~ Prettiest Virgin [Yp257b5APOg].opus
Item search terms: -
musicbrainz: Searching for MusicBrainz recordings with: {}
Sending event: import_task_created
Traceback (most recent call last):
File "/usr/bin/beet", line 8, in
sys.exit(main())
~~~~^^
File "/usr/lib/python3.13/site-packages/beets/ui/__init__.py", line 1713, in main
_raw_main(args)
~~~~~~~~~^^^^^^
File "/usr/lib/python3.13/site-packages/beets/ui/__init__.py", line 1692, in _raw_main
subcommand.func(lib, suboptions, subargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/beets/ui/commands.py", line 1378, in import_func
import_files(lib, byte_paths, query)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/beets/ui/commands.py", line 1322, in import_files
session.run()
~~~~~~~~~~~^^
File "/usr/lib/python3.13/site-packages/beets/importer/session.py", line 234, in run
pl.run_parallel(QUEUE_SIZE)
~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/beets/util/pipeline.py", line 468, in run_parallel
raise exc_info[1].with_traceback(exc_info[2])
File "/usr/lib/python3.13/site-packages/beets/util/pipeline.py", line 333, in run
out = self.coro.send(msg)
File "/usr/lib/python3.13/site-packages/beets/util/pipeline.py", line 216, in coro
func(*(args + (task,)))
~~~~^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/beets/importer/stages.py", line 144, in lookup_candidates
task.lookup_candidates(session.config["search_ids"].as_str_seq())
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/beets/importer/tasks.py", line 686, in lookup_candidates
self.candidates, self.rec = autotag.tag_item(
~~~~~~~~~~~~~~~~^
self.item, search_ids=search_ids
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/lib/python3.13/site-packages/beets/autotag/match.py", line 373, in tag_item
for track_info in metadata_plugins.item_candidates(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
item, search_artist, search_title
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
):
^
File "/usr/lib/python3.13/site-packages/beets/plugins.py", line 473, in wrapper
for v in func(*args, **kwargs):
~~~~^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/beets/metadata_plugins.py", line 69, in item_candidates
yield from plugin.item_candidates(*args, **kwargs)
File "/usr/lib/python3.13/site-packages/beetsplug/musicbrainz.py", line 837, in item_candidates
None, map(self.track_info, self._search_api("recording", criteria))
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/beetsplug/musicbrainz.py", line 812, in _search_api
res = method(limit=self.config["search_limit"].get(), **filters)
File "/usr/lib/python3.13/site-packages/musicbrainzngs/musicbrainz.py", line 971, in search_recordings
return _do_mb_search('recording', query, fields, limit, offset, strict)
File "/usr/lib/python3.13/site-packages/musicbrainzngs/musicbrainz.py", line 773, in _do_mb_search
raise ValueError('at least one query term is required')
ValueError: at least one query term is required
```
There needs to be at least on music file in the directory where this is called. An empty opus file generated by `ffmpeg` is enough: `ffmpeg -f lavfi -i anullsrc -ac 2 -ar 48000 -t 30 -c:a libopus file.opus`
### Setup
* OS: Arch Linux
* Python version: 3.13.7
* beets version: beets version 2.4.0
* Turning off plugins made problem go away (yes/no): yes (the only plugin I use is musicbrainz)
Config:
```yaml
disabled_plugins: []
musicbrainz:
search_limit: 5
source_weight: 0.5
host: musicbrainz.org
https: no
ratelimit: 1
ratelimit_interval: 1
genres: no
external_ids:
discogs: no
bandcamp: no
spotify: no
deezer: no
tidal: no
extra_tags: []
```
Contributor guide
Research direction
Start with beets/importer/stages.py and beets/importer/tasks.py at lookup_candidates, then inspect beetsplug/musicbrainz.py around item_candidates and _search_api. Reproduce with `beet -vv import -s .` and confirm the import no longer raises ValueError when MusicBrainz receives empty search criteria.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100