beetbox / beetbox/beets

beet import -s fails with "at least one query term is required"

Open
#6,060 10 comments 2 reactions 0 assignees View on GitHub
import-command musicbrainz
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.