beets icon indicating copy to clipboard operation
beets copied to clipboard

crash after resuming import

Open morphodone opened this issue 1 year ago • 7 comments

Problem

Trying to resume an import over ssh. My laptop fell asleep and the import stopped.

Running this command in verbose (-vv) mode:

$ beet -vv import /media/plex/music

Led to this problem:

Traceback (most recent call last):
  File "/usr/bin/beet", line 33, in <module>
    sys.exit(load_entry_point('beets==1.6.0', 'console_scripts', 'beet')())
  File "/usr/share/beets/beets/ui/__init__.py", line 1285, in main
    _raw_main(args)
  File "/usr/share/beets/beets/ui/__init__.py", line 1272, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/usr/share/beets/beets/ui/commands.py", line 973, in import_func
    import_files(lib, paths, query)
  File "/usr/share/beets/beets/ui/commands.py", line 943, in import_files
    session.run()
  File "/usr/share/beets/beets/importer.py", line 340, in run
    pl.run_parallel(QUEUE_SIZE)
  File "/usr/share/beets/beets/util/pipeline.py", line 446, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/usr/share/beets/beets/util/pipeline.py", line 311, in run
    out = self.coro.send(msg)
  File "/usr/share/beets/beets/util/pipeline.py", line 193, in coro
    func(*(args + (task,)))
  File "/usr/share/beets/beets/importer.py", line 1376, in lookup_candidates
    task.lookup_candidates()
  File "/usr/share/beets/beets/importer.py", line 660, in lookup_candidates
    autotag.tag_album(self.items, search_ids=self.search_ids)
  File "/usr/share/beets/beets/autotag/match.py", line 461, in tag_album
    for matched_candidate in hooks.album_candidates(items,
  File "/usr/share/beets/beets/plugins.py", line 573, in decorated
    for v in generator(*args, **kwargs):
  File "/usr/share/beets/beets/autotag/hooks.py", line 629, in album_candidates
    yield from plugins.candidates(items, artist, album, va_likely,
  File "/usr/share/beets/beets/plugins.py", line 384, in candidates
    yield from plugin.candidates(items, artist, album, va_likely,
  File "/usr/share/beets/beets/plugins.py", line 732, in candidates
    results = self._search_api(query_type='album', filters=query_filters)
  File "/usr/share/beets/beetsplug/deezer.py", line 222, in _search_api
    response.raise_for_status()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 943, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://api.deezer.com/search/album?q=album%3A%22Now+%28Deluxe%29%22+artist%3A%22Shania+Twain%22

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

Setup

  • OS: Ubuntu 22.04.4 LTS
  • Python version: 3.10.12
  • beets version: 1.6.0
  • Turning off plugins made problem go away (yes/no): yes - deezer, discogs

My configuration (output of beet config) is:

directory: /media/plex/music
library: ~/data/musiclibrary.db
import:
    copy: no
    duplicate_action: keep
match:
    strong_rec_thresh: 0.10
plugins: discogs deezer

deezer:
    source_weight: 0.0

morphodone avatar Mar 20 '24 16:03 morphodone

deezer api is throwing an error because of literal "Now" followed by open and close parans.

seems like an edge case to me on deezers backend

Dr-Blank avatar Mar 22 '24 07:03 Dr-Blank

I'm having the same problem

amogus07 avatar Jul 10 '24 19:07 amogus07

It seems there is work to be done making sure api requests won't get blocked. Question marks (?) also seem to be casing problems, and I wouldn't consider question marks in album titles an edge case. Here's an example:

Album Title: The Fox (What Does the Fox Say?)

Traceback (most recent call last):
  File "/home/konstantink/.local/bin/beet", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/ui/__init__.py", line 1865, in main
    _raw_main(args)
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/ui/__init__.py", line 1852, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/ui/commands.py", line 1395, in import_func
    import_files(lib, paths, query)
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/ui/commands.py", line 1326, in import_files
    session.run()
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/importer.py", line 360, in run
    pl.run_parallel(QUEUE_SIZE)
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/util/pipeline.py", line 447, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/util/pipeline.py", line 312, in run
    out = self.coro.send(msg)
          ^^^^^^^^^^^^^^^^^^^
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/util/pipeline.py", line 195, in coro
    func(*(args + (task,)))
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/importer.py", line 1497, in lookup_candidates
    task.lookup_candidates()
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/importer.py", line 688, in lookup_candidates
    artist, album, prop = autotag.tag_album(
                          ^^^^^^^^^^^^^^^^^^
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/autotag/match.py", line 548, in tag_album
    for matched_candidate in hooks.album_candidates(
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/plugins.py", line 593, in decorated
    for v in generator(*args, **kwargs):
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/autotag/hooks.py", line 759, in album_candidates
    yield from plugins.candidates(items, artist, album, va_likely, extra_tags)
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/plugins.py", line 390, in candidates
    yield from plugin.candidates(
               ^^^^^^^^^^^^^^^^^^
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beets/plugins.py", line 772, in candidates
    results = self._search_api(query_type="album", filters=query_filters)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/beetsplug/deezer.py", line 282, in _search_api
    response.raise_for_status()
  File "/home/konstantink/.local/share/pipx/venvs/beets/lib64/python3.12/site-packages/requests/models.py", line 1024, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://api.deezer.com/search/album?q=album%3A%22The+Fox+%28What+Does+the+Fox+Say%3F%29%22+artist%3A%22Ylvis%22

amogus07 avatar Jul 24 '24 10:07 amogus07

I don‘t like the way it‘s handled now. Currently, when there’s a question mark in the title of an album I‘m importing and the crash happens, I manually remove the question mark and run import once again. I think any characters or patterns we know the Deezer API doesn‘t like should be identified and removed at some point before sending the request or something. IDK if I could implement that though…

amogus07 avatar Sep 17 '24 20:09 amogus07

Ah this makes sense, sorry I misunderstood the actual issue here!

snejus avatar Sep 18 '24 03:09 snejus