beetbox / beets

music library manager and MusicBrainz tagger
http://beets.io/
MIT License
12.85k stars 1.82k forks source link

Discogs plugin issue - TypeError: can only join an iterable #5473

Open Gwouigwoui opened 1 week ago

Gwouigwoui commented 1 week ago

Problem

Ran into this problem importing a specific album and also individual tracks of said album. Issue happened both with flac files freshly created from a flac+cue set using foobar, and with existing alac files. I removed all the metadata except title, album and artist, and the issue persisted.

Definitely feels like same issue as #5468.

beet -v import output is

data directory: /home/user/.config/beets
plugin paths:
plexsync: JSON key: ~/beets.json
inline: adding item field multidisc
Sending event: pluginload
library database: /mnt/c/Users/user/Music/musiclibrary.blb
library directory: /mnt/music
Sending event: library_opened
Sending event: import_begin
Sending event: import_task_created
Sending event: import_task_start
Looking up: /mnt/c/Users/user/Music/À importer/1/Pascal Comelade - Traffic d'abstraction 1.flac
Tagging Pascal Comelade - Traffic d'abstraction
No album ID found.
Search terms: Pascal Comelade - Traffic d'abstraction
Additional search terms: {'media': ''}
Album might be VA: False
Searching for MusicBrainz releases with: {'release': "traffic d'abstraction", 'artist': 'pascal comelade', 'tracks': '1'}
Requesting MusicBrainz release e47d867f-b774-3d59-b6b1-e9dfb28743fa
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_album_extract
Sending event: albuminfo_received
Candidate: Pascal Comelade - Traffic d’abstraction (e47d867f-b774-3d59-b6b1-e9dfb28743fa)
Computing track assignment...
...done.
Success. Distance: 0.64
Requesting MusicBrainz release bb504020-19d3-401f-9f80-fb12bcc273d6
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_album_extract
Sending event: albuminfo_received
Candidate: Pascal Comelade - Traffic d’abstraction (bb504020-19d3-401f-9f80-fb12bcc273d6)
Computing track assignment...
...done.
Success. Distance: 0.64
Requesting MusicBrainz release 2d8a4131-9940-4b42-8a75-bc2148b6eb7f
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_album_extract
Sending event: albuminfo_received
Candidate: Pascal Comelade - Concepte general de la quincalla catalana (2d8a4131-9940-4b42-8a75-bc2148b6eb7f)
Computing track assignment...
...done.
Success. Distance: 0.83
Requesting MusicBrainz release 786731bf-bb16-499d-ae55-56d48e6d831d
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_album_extract
Sending event: albuminfo_received
Candidate: Pascal Comelade - Sentimientos (786731bf-bb16-499d-ae55-56d48e6d831d)
Computing track assignment...
...done.
Success. Distance: 0.84
Requesting MusicBrainz release 4b0b5b70-844b-4a73-96fb-898b2abe4959
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_track_extract
Sending event: mb_album_extract
Sending event: albuminfo_received
Candidate: Pascal Comelade - Sentimientos (4b0b5b70-844b-4a73-96fb-898b2abe4959)
Computing track assignment...
...done.
Success. Distance: 0.84
discogs: Searching for master release 53233
discogs: Searching for master release 53233
discogs: Searching for master release 53233
Traceback (most recent call last):
  File "/home/user/.venv/bin/beet", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/user/.venv/lib/python3.12/site-packages/beets/ui/__init__.py", line 1865, in main
    _raw_main(args)
  File "/home/user/.venv/lib/python3.12/site-packages/beets/ui/__init__.py", line 1852, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/home/user/.venv/lib/python3.12/site-packages/beets/ui/commands.py", line 1395, in import_func
    import_files(lib, paths, query)
  File "/home/user/.venv/lib/python3.12/site-packages/beets/ui/commands.py", line 1326, in import_files
    session.run()
  File "/home/user/.venv/lib/python3.12/site-packages/beets/importer.py", line 360, in run
    pl.run_parallel(QUEUE_SIZE)
  File "/home/user/.venv/lib/python3.12/site-packages/beets/util/pipeline.py", line 447, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/home/user/.venv/lib/python3.12/site-packages/beets/util/pipeline.py", line 312, in run
    out = self.coro.send(msg)
          ^^^^^^^^^^^^^^^^^^^
  File "/home/user/.venv/lib/python3.12/site-packages/beets/util/pipeline.py", line 195, in coro
    func(*(args + (task,)))
  File "/home/user/.venv/lib/python3.12/site-packages/beets/importer.py", line 1497, in lookup_candidates
    task.lookup_candidates()
  File "/home/user/.venv/lib/python3.12/site-packages/beets/importer.py", line 688, in lookup_candidates
    artist, album, prop = autotag.tag_album(
                          ^^^^^^^^^^^^^^^^^^
  File "/home/user/.venv/lib/python3.12/site-packages/beets/autotag/match.py", line 548, in tag_album
    for matched_candidate in hooks.album_candidates(
  File "/home/user/.venv/lib/python3.12/site-packages/beets/plugins.py", line 593, in decorated
    for v in generator(*args, **kwargs):
  File "/home/user/.venv/lib/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/user/.venv/lib/python3.12/site-packages/beets/plugins.py", line 390, in candidates
    yield from plugin.candidates(
               ^^^^^^^^^^^^^^^^^^
  File "/home/user/.venv/lib/python3.12/site-packages/beetsplug/discogs.py", line 188, in candidates
    return self.get_albums(query)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/.venv/lib/python3.12/site-packages/beetsplug/discogs.py", line 335, in get_albums
    return [
           ^
  File "/home/user/.venv/lib/python3.12/site-packages/beetsplug/discogs.py", line 419, in get_album_info
    ", ".join(result.data["formats"][0].get("descriptions", []))
TypeError: can only join an iterable

Setup

My configuration (output of beet config) is:

    bing_lang_from: []
    auto: yes
    google_API_key: REDACTED
    sources: google lyricwiki genius
    bing_client_secret: REDACTED
    bing_lang_to:
    google_engine_ID: REDACTED
    genius_api_key: REDACTED
    fallback:
    force: no
    local: no
    synced: no
    dist_thresh: 0.1
directory: /mnt/music
# --------------- Main ---------------

library: /mnt/c/Users/user/Music/musiclibrary.blb

# --------------- Tagging ---------------

per_disc_numbering: yes

# --------------- Performance ---------------

threaded: yes
original_date: no
va_name: Artistes divers

import:
    write: yes
    copy: no
    move: no
    resume: ask
    incremental: yes
    languages: fr en
    bell: yes

# --------------- Plugins ---------------

plugins:
- filetote
- importreplace
- stylize
- discogs
- inline
- info
- fromfilename
- fetchart
- edit
- embedart
- ftintitle
- lastimport
- lyrics
- badfiles
- plexupdate
- duplicates
- missing
- artistcountry
- autogenre
- lastgenre
- xtractor
- plexsync
- summarize
- chroma
- replaygain
replace:
    '[<>:\?\*\|]': _
    \": _
    '[\\/]': _
    ^\.: _
    \.$: _
    '[\x00-\x1f]': _
    ^-: _
    \s+$: ''
    ^\s+: ''
item_fields:
    multidisc: 1 if disctotal > 1 else 0
paths:
    default: $albumartist/$album%aunique{albumartist album,label albumdisambig releasegroupdisambig,[]}/%if{$multidisc,$disc-}$track $title
    singleton: $artist/Album inconnu/$title
    comp: Compilations/$album%aunique{}/%if{$multidisc,$disc-}$track $title

ui:
    color: yes
    colors:
        album: [blue, bold]
        albumartist: [yellow]
        artist: [bold, yellow]
        title: [normal]

# --------------- Search ---------------

format_item: '%stylize{artist,$artist} %nocolor{- }%stylize{album,$album} %nocolor{- }%stylize{title,$title}'
format_album: '%stylize{albumartist,$albumartist} %nocolor{- }%stylize{album,$album}'
plex:
    host: 192.168.2.10
    port: 32400
    token: REDACTED
    library_name: Musique
    secure: no
    ignore_cert_errors: no
openai:
    api_key: REDACTED
    model: gpt-3.5-turbo
google:
    model: gemini-pro
    api_key: REDACTED
    service_json: ~/beets.json
ftintitle:
    auto: yes
    format: (feat. {0})
    drop: no
replaygain:
    backend: ffmpeg
    overwrite: no
    auto: yes
    threads: 16
    parallel_on_import: no
    per_disc: no
    peak: 'true'
    targetlevel: 89
    r128: [Opus]
    r128_targetlevel: 84
missing:
    format: $albumartist - $album - $title
    count: yes
    total: no
    album: no
chroma:
    auto: yes
bpmanalyser:
    auto: yes
    dry-run: no
    write: yes
    threads: AUTO
    force: no
    quiet: no
acoustid:
    apikey: REDACTED
badfiles:
    check_on_import: no
    commands:
        ogg: myoggchecker --opt1 --opt2
        flac: flac --test --warnings-as-errors --silent
        m4a: ffmpeg -v error -f null - -i
        mp4: ffmpeg -v error -f null - -i
fetchart:
    auto: yes
    minwidth: 500
    maxwidth: 0
    quality: 0
    max_filesize: 0
    enforce_ratio: no
    cautious: no
    cover_names:
    - cover
    - front
    - art
    - album
    - folder
    sources:
    - filesystem
    - coverart
    - itunes
    - amazon
    - albumart
    - cover_art_url
    store_source: no
    high_resolution: no
    deinterlace: no
    cover_format:
    lastfm_key: REDACTED
    google_key: REDACTED
    google_engine: 001442825323518660753:hrh5ch1gjzm
    fanarttv_key: REDACTED
importreplace:
    replacements: [{item_fields: title artist artist_sort artist_credit, album_fields: album artist artist_sort artist_credit, replace: {'[\u0027]': "\u2019"}}]
extrafiles:
    patterns:
        all: '*.*'
        artworkdir:
        - '[sS]cans/'
        - '[sS]can/'
        - '[aA]rtwork/'
        - '[aA]rt/'
        - '[cC]over/'
        artworkfiles:
        - '*.png'
        - '*.jpg'
        - '*.jpeg'
        - '*.gif'
        - '*.pdf'
        datafiles: ['*.log', '*.cue', '*.CUE']
    paths:
        artworkdir: $albumpath/Artwork
        datafiles: $albumpath/Data/$filename
        artworkfiles: $albumpath/Artwork/$filename
musicbrainz:
    extra_tags: media
filetote:
    extensions: .cue .log .txt
    pairing:
        enabled: yes
        pairing_only: no
        extensions: .*
    paths:
        ext:.log: $albumpath/$artist - $album%if{$multidisc, CD $disc}
        ext:.cue: $albumpath/$artist - $album%if{$multidisc, CD $disc}
        paired_ext:.lrc: $albumpath/$medianame_new
        pattern:artworkdir: $albumpath/artwork/$old_filename
    patterns:
        artworkdir:
        - '[sS]cans/'
        - '[sS]can/'
        - '[aA]rtwork/'
        - '[aA]rt/'
        - '[cC]over/'
    session:
        operation:
        beets_lib:
        import_path:
    filenames: ''
    exclude: ''
    print_ignored: no
lastfm:
    user: ''
    api_key: REDACTED
lastimport:
    per_page: 500
    retry_limit: 3
autogenre:
    auto: no
    pretend: no
    all: no
    force: no
    lastgenre: yes
    xtractor: yes
    from_title: yes
    parent_genres: yes
    genre_rosamerica_strong: 0.8
    genre_electronic_strong: 0.8
    genre_electronic_prepend: 0.5
    genre_electronic_append: 0.45
lastgenre:
    whitelist: yes
    min_weight: 10
    count: 1
    fallback:
    canonical: no
    source: album
    force: yes
    auto: yes
    separator: ', '
    prefer_specific: no
    title_case: yes
pathfields: {}
album_fields: {}
duplicates:
    album: no
    checksum: ''
    copy: ''
    count: no
    delete: no
    format: ''
    full: no
    keys: []
    merge: no
    move: ''
    path: no
    tiebreak: {}
    strict: no
    tag: ''
embedart:
    maxwidth: 0
    auto: yes
    compare_threshold: 0
    ifempty: no
    remove_art_file: no
    quality: 0
plexsync:
    tokenfile: spotify_plexsync.json
    manual_search: no
discogs:
    apikey: REDACTED
    apisecret: REDACTED
    tokenfile: discogs_token.json
    source_weight: 0.5
    user_token: REDACTED
    separator: ', '
    index_tracks: no
    append_style_genre: no
edit:
    albumfields: album albumartist
    itemfields: track title artist album
    ignore_fields: id path
xtractor:
    auto: no
    dry-run: no
    write: yes
    threads: 1
    force: no
    quiet: no
    keep_output: no
    keep_profiles: no
    low_level_targets:
        bpm:
            path: rhythm.bpm
            type: integer
            required: yes
        danceability:
            path: rhythm.danceability
            type: float
        beats_count:
            path: rhythm.beats_count
            type: integer
        average_loudness:
            path: lowlevel.average_loudness
            type: float
            required: yes
    high_level_targets:
        danceable:
            path: highlevel.danceability.all.danceable
            type: float
            required: yes
        gender:
            path: highlevel.gender.value
            type: string
            required: yes
        is_male:
            path: highlevel.gender.all.male
            type: float
        is_female:
            path: highlevel.gender.all.female
            type: float
        genre_rosamerica:
            path: highlevel.genre_rosamerica.value
            type: string
            required: yes
        voice_instrumental:
            path: highlevel.voice_instrumental.value
            type: string
            required: yes
        is_voice:
            path: highlevel.voice_instrumental.all.voice
            type: float
        is_instrumental:
            path: highlevel.voice_instrumental.all.instrumental
            type: float
        mood_acoustic:
            path: highlevel.mood_acoustic.all.acoustic
            type: float
            required: yes
        mood_aggressive:
            path: highlevel.mood_aggressive.all.aggressive
            type: float
            required: yes
        mood_electronic:
            path: highlevel.mood_electronic.all.electronic
            type: float
            required: yes
        mood_happy:
            path: highlevel.mood_happy.all.happy
            type: float
            required: yes
        mood_sad:
            path: highlevel.mood_sad.all.sad
            type: float
            required: yes
        mood_party:
            path: highlevel.mood_party.all.party
            type: float
            required: yes
        mood_relaxed:
            path: highlevel.mood_relaxed.all.relaxed
            type: float
            required: yes
        mood_mirex:
            path: highlevel.moods_mirex.value
            type: string
            required: yes
        mood_mirex_cluster_1:
            path: highlevel.moods_mirex.all.Cluster1
            type: float
        mood_mirex_cluster_2:
            path: highlevel.moods_mirex.all.Cluster2
            type: float
        mood_mirex_cluster_3:
            path: highlevel.moods_mirex.all.Cluster3
            type: float
        mood_mirex_cluster_4:
            path: highlevel.moods_mirex.all.Cluster4
            type: float
        mood_mirex_cluster_5:
            path: highlevel.moods_mirex.all.Cluster5
            type: float
    essentia_extractor: /your/path/to/streaming_extractor_music
    extractor_profile:
        outputFormat: json
        outputFrames: 0
        lowlevel:
            frameSize: 2048
            hopSize: 1024
        highlevel:
            compute: 1
            svm_models: [/your/path/to/svm_model.history]
        chromaprint:
            compute: 0
m1dnight commented 22 hours ago

Same issue here. Following packages:


blinker==1.8.2
certifi==2024.8.30
charset-normalizer==3.4.0
click==8.1.7
confuse==2.0.1
Flask==3.0.3
idna==3.10
itsdangerous==2.2.0
jellyfish==1.1.0
Jinja2==3.1.4
MarkupSafe==3.0.2
mediafile==0.12.0
munkres==1.1.4
musicbrainzngs==0.7.1
mutagen==1.47.0
oauthlib==3.2.2
pillow==11.0.0
psutil==6.1.0
python-dateutil==2.9.0.post0
python3-discogs-client==2.7
PyYAML==6.0.2
requests==2.32.3
six==1.16.0
typing_extensions==4.12.2
Unidecode==1.3.8
urllib3==2.2.3
Werkzeug==3.0.6```