Skip to content

Inline plugin - iterating over items for album_fields significantly slows down operations #5773

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
BGarber42 opened this issue May 9, 2025 · 7 comments · May be fixed by #5784
Open

Inline plugin - iterating over items for album_fields significantly slows down operations #5773

BGarber42 opened this issue May 9, 2025 · 7 comments · May be fixed by #5784

Comments

@BGarber42
Copy link

Problem

Using even a simple album_field definition such as:

album_fields:
  album_bitrate: |
      total = 0
      for item in items:
          total += item.bitrate

significantly degrades performance.

Without:

root@6ea1b5cf64a4:/# time beet move -p 'title:Von dutch'
Moving 3 items.
[...]

real    0m2.702s
user    0m4.211s
sys     0m0.399s

With:

Moving 3 items.
[...]

real    0m15.705s
user    0m5.028s
sys     0m1.892s

With more items, it was significantly worse:

w/o:

root@6ea1b5cf64a4:/# time beet move -p 'artist:Charli XCX'
Moving 175 items.
[...]

real    0m5.264s
user    0m6.991s
sys     0m0.467s

with: (I actually gave up letting it run)

Moving 175 items.
[...]
^CTraceback (most recent call last):
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 1870, in main
    _raw_main(args)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 1849, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands.py", line 2216, in move_func
    move_items(
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands.py", line 2146, in move_items
    objs = [o for o in objs if (isalbummoved if album else isitemmoved)(o)]
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands.py", line 2141, in isitemmoved
    return item.path != item.destination(basedir=dest)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1115, in destination
    subpath = self.evaluate_template(subpath_tmpl, True)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 701, in evaluate_template
    return t.substitute(
           ^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 559, in substitute
    res = self.interpret(values, functions)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 552, in interpret
    return self.expr.evaluate(Environment(values, functions))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 240, in evaluate
    out.append(part.evaluate(env))
               ^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 177, in evaluate
    arg_vals = [expr.evaluate(env) for expr in self.args]
                ^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 240, in evaluate
    out.append(part.evaluate(env))
               ^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 145, in evaluate
    if self.ident in env.values:
       ^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen _collections_abc>", line 813, in __contains__
  File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 489, in __getitem__
    value = self._get(key)
            ^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 475, in _get
    return self._get_formatted(self.album, key)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 124, in _get_formatted
    value = model._type(key).format(model.get(key))
                                    ^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 449, in _get
    return getters[key](self)
           ^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beetsplug/inline.py", line 120, in _func_func
    func.__globals__.update(_dict_for(obj))
                            ^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beetsplug/inline.py", line 102, in _dict_for
    out["items"] = list(obj.items())
                        ^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1295, in items
    return self._db.items(dbcore.MatchQuery("album_id", self.id))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1697, in items
    return self._fetch(Item, query, sort or self.get_default_item_sort())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1675, in _fetch
    return super()._fetch(model_cls, query, sort)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 1257, in _fetch
    rows = tx.query(sql, subvals)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 956, in query
    cursor = self.db._connection().execute(statement, subvals)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt


real    5m15.560s
user    0m19.222s
sys     0m36.162s

Setup

  • OS: Unraid/Docker (linuxserver.io image)
  • Python version: Python 3.12.10
  • beets version: beets version 2.3.0
  • Turning off plugins made problem go away (yes/no): Yes

My configuration (output of beet config) is:

directory: /music/music
# --------------- Main ---------------

library: /config/library.db
pluginpath: /config/plugins

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

plugins:
- embedart
- fetchart
- info
- albumtypes
- lastgenre
- yearfixer
- fromfilename
- mbsync
- mbsubmit
- unimported
- zero
- missing
- inline
- badfiles
- substitute
- duplicates
- importreplace
- web
- originquery

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

threaded: yes

# --------------- UI ---------------

verbose: no

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

per_disc_numbering: yes

import:
    log: /config/beet.log
    write: yes
    copy: no
    move: yes
    resume: yes
    incremental: yes
    incremental_skip_later: yes
    quiet: no
    quiet_fallback: skip
    from_scratch: no
    default_action: apply
    none_rec_action: ask
    duplicate_action: ask
    autotag: yes
art_filename: folder
mbcollection:
    auto: yes
    collection: XXXX
    remove: yes
musicbrainz:
    user: XXXX
    pass: XXXX
    extra_tags:
    - year
    - catalognum
    - country
    - media
    - label
zero:
    fields: comments
    auto: yes
    keep_fields: []
    update_database: no

# --------------- Import ---------------

clutter:
- Thumbs.DB
- Thumbs.db
- .DS_Store
- '**.zip'
- '**.torrent'
- '**.ini'
- '**.txt'
- '**.nfo'
- '**.m3u'
missing:
    format: $albumartist - $album - $title
    count: no
    total: no
    album: no

match:
    strong_rec_thresh: 0.08
    max_rec:
        missing_tracks: medium
        unmatched_tracks: medium
    preferred:
        countries:
        - US
        - XE
        - JP
        - GB|UK
        media: [Digital Media|File, CD, SACD]
        original_year: no
item_fields:
    is_mp3_aac: 1 if format == "MP3" or format == "AAC" else 0
    is_flac: 1 if format == "FLAC" else 0
    disc0: disc
    disctotal0: disctotal
album_fields:
    title0: title
albumtypes:
    types:
    -   ep: 'EP - '
    -   single: 'Single - '
    -   live: 'Live - '
    -   remix: 'Remix - '
    bracket: ''
    ignore_va: [compilation]
paths:
    default: '%substitute{$albumartist}/($original_year) $albumartist - %ifdef{altalbum,$altalbum,$album}%ifdef{transtitle, [$transtitle]} [%ifdef{disambig,$disambig - }%if{$atypes,$atypes}${format}%if{$is_mp3_aac, - $album_bitrate}%if{$is_flac, - $max_bitdepth - $max_samplerate}]/%if{$multidisc,Disc $disc0/}${track} - %ifdef{alttitle,$alttitle,$title}'
    collection::^.+: _Other/$collection/($original_year) $albumartist - %ifdef{altalbum,$altalbum,$album}%ifdef{transtitle, [$transtitle]} [%ifdef{disambig,$disambig - }${format}%if{$is_mp3_aac, - $album_bitrate}%if{$is_flac, - $max_bitdepth - $max_samplerate}]/%if{$multidisc,Disc $disc0/}${track} - %ifdef{alttitle,$alttitle,$title}
substitute:
    bladee &.*: Bladee
    blu &.*: Blu
    bob dylan &.*: Bob Dylan
    broadcast and.*: Broadcast
    casiopea.*: Casiopea
    czarface.*: Czarface
    "death\u2019s dynamic shroud and.*": "death\u2019s dynamic shroud"
    dizzy gillespie.*: Dizzy Gillespie
    drake &.*: Drake
    "el\u2010p feat.*": "El\u2010P"
    evaboy.*: miya lowe
    fred again...*: Fred again..
    .*gene clark with.*: Gene Clark
    gorillaz feat.*|spacemonkeyz &.*: Gorillaz
    "Hiromi\u2019s Sonicbloom|\u4E0A\u539F\u3072\u308D\u307F \u30B6\u30FB\u30C8\u30EA\u30AA\u30FB\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8": Hiromi
    iglooghost.*: Iglooghost
    "jay\u2010z &.*": "JAY\u2010Z"
    john williams.*: John Williams
    jpegmafia.*: JPEGMAFIA
    "kanye west.*|kids see ghosts|\\\xA5\\$": Kanye West
    laufey with.*: Laufey
    macroblank &.*: Macroblank
    mf doom &.*|jj doom|dangerdoom|viktor vaughn|king geedorah|nehruviandoom|westsidedoom: MF DOOM
    neil young &.*: Neil Young
    quasimoto: Madlib
    rita lee &.*: Rita Lee
    round table.*: Round Table
    ryusenkei.*: Ryusenkei
    saint pepsi.*: SAINT PEPSI
    "Stan Getz & Jo\xE3o Gilberto.*": "Stan Getz & Jo\xE3o Gilberto"
    Sufjan Stevens &.*: Sufjan Stevens
    thaiboy digital &.*: Thaiboy Digital
    the moody blues.*: The Moody Blues
    the velvet underground.*: The Velvet Underground
    .*tommy heavenly.*: "Tommy february\u2076"
    trent reznor & atticus ross.*: Trent Reznor & Atticus Ross
    yung lean &.*: Yung Lean
    ^(.*?)( & Madlib| & The Alchemist).*: \1

importreplace:
    replacements: [{item_fields: artist artist_credit artists artists_credit composer, album_fields: artist artist_credit artists artists_credit composer, replace: {'Ye(?!\w)': Kanye West, 'Charli xcx(?!\w)': Charli XCX, 'RYUSENKEI(?!\w)': Ryusenkei}}, {item_fields: artist_sort artists_sort composer_sort, album_fields: artist_sort artists_sort composer_sort, replace: {'Ye(?!\w)': 'West, Kanye', 'Charli xcx(?!\w)': Charli XCX, 'RYUSENKEI(?!\w)': Ryusenkei}}]
fetchart:
    auto: no
    cover_names: folder cover front
    minwidth: 500
    maxwidth: 3000
    high_resolution: yes
    enforce_ratio: 0.5%
    sources:
    - filesystem
    - itunes
    - amazon
    - albumart
    -   coverart: releasegroup
    deinterlace: yes
    cover_format: JPEG
    quality: 98
    max_filesize: 0
    cautious: no
    store_source: no
    google_key: REDACTED
    google_engine: REDACTED
    fanarttv_key: REDACTED
    lastfm_key: REDACTED
embedart:
    auto: no
    maxwidth: 720
    quality: 95
    compare_threshold: 0
    ifempty: no
    remove_art_file: no
unimported:
    ignore_extensions: jpg png zip jepg log cue yaml db
    ignore_subdirectories: []
lastgenre:
    whitelist: /config/whitelist.txt
    auto: no
    canonical: yes
    count: 5
    fallback: ''
    force: yes
    min_weight: 10
    prefer_specific: no
    source: album
    title_case: yes
    separator: '; '
    keep_existing: no
    extended_debug: no
originquery:
    origin_file: origin.yaml
    tag_patterns:
        media: $.Media
        year: $."Edition year"
        label: $."Record label"
        catalognum: $."Catalog number"
        albumdisambig: $.Edition
web:
    host: 0.0.0.0
    port: 8337
    cors: ''
    cors_supports_credentials: no
    reverse_proxy: no
    include_paths: no
    readonly: yes
duplicates:
    album: no
    checksum: ''
    copy: ''
    count: no
    delete: no
    format: ''
    full: no
    keys: []
    merge: no
    move: ''
    path: no
    tiebreak: {}
    strict: no
    tag: ''
pathfields: {}
yearfixer:
    auto: no
    force: no
mbsubmit:
    format: $track. $title - $artist ($length)
    threshold: medium
    picard_path: picard
@RollingStar
Copy link
Collaborator

I had very similar code and I don't remember 5+ minutes to move 180 files. But it's been a while. Could also be a regression in the 7ish years it's been since I wrote my inline config.

https://gist.github.com/RollingStar/86e041338df295afbbf77a9027903068#file-beets_config-yaml-L281

@BGarber42
Copy link
Author

If I have time I'll see if I can bisect a version to narrow it down.

@BGarber42
Copy link
Author

BGarber42 commented May 11, 2025

Well I may have misattributed this to Inline since that just happened to make the issue less severe, but it seems more related to the path templating than the actual inline value generation.

Using a simple path template of:

paths:
  default: $albumartist/$original_year - $albumartist - $track - $title

It runs in about 3 seconds:

Sun May 11 22:52:58 2025    cprofile.stats

         1217609 function calls (1179922 primitive calls) in 3.679 seconds

   Ordered by: cumulative time
   List reduced from 4747 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    615/1    0.021    0.000    3.680    3.680 {built-in method builtins.exec}
        1    0.000    0.000    3.680    3.680 /venv/bin/beet:1(<module>)
        1    0.000    0.000    2.528    2.528 /root/beets/beets/ui/__init__.py:1857(main)
        1    0.000    0.000    2.528    2.528 /root/beets/beets/ui/__init__.py:1778(_raw_main)
   617/18    0.010    0.000    2.216    0.123 <frozen importlib._bootstrap>:1349(_find_and_load)
   616/18    0.005    0.000    2.214    0.123 <frozen importlib._bootstrap>:1304(_find_and_load_unlocked)
   582/18    0.004    0.000    2.198    0.122 <frozen importlib._bootstrap>:911(_load_unlocked)
   533/17    0.013    0.000    2.197    0.129 <frozen importlib._bootstrap_external>:993(exec_module)
  1386/48    0.004    0.000    2.182    0.045 <frozen importlib._bootstrap>:480(_call_with_frames_removed)
   451/21    0.001    0.000    1.865    0.089 {built-in method builtins.__import__}

Running something slightly more advanced:

paths:
  default: $albumartist/$original_year - $albumartist %ifdef{altalbum,$altalbum,$album} %ifdef{transtitle, [$transtitle] [%ifdef{disambig,$disambig - }} - $track - $title

It's about the same:

Sun May 11 22:53:47 2025    cprofile.stats

         1231084 function calls (1193243 primitive calls) in 2.951 seconds

   Ordered by: cumulative time
   List reduced from 4742 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    615/1    0.014    0.000    2.952    2.952 {built-in method builtins.exec}
        1    0.000    0.000    2.952    2.952 /venv/bin/beet:1(<module>)
        1    0.000    0.000    2.308    2.308 /root/beets/beets/ui/__init__.py:1857(main)
        1    0.000    0.000    2.308    2.308 /root/beets/beets/ui/__init__.py:1778(_raw_main)
   617/18    0.006    0.000    1.535    0.085 <frozen importlib._bootstrap>:1349(_find_and_load)
   616/18    0.004    0.000    1.533    0.085 <frozen importlib._bootstrap>:1304(_find_and_load_unlocked)
   582/18    0.004    0.000    1.521    0.084 <frozen importlib._bootstrap>:911(_load_unlocked)
   533/17    0.011    0.000    1.519    0.089 <frozen importlib._bootstrap_external>:993(exec_module)
  1352/35    0.002    0.000    1.514    0.043 <frozen importlib._bootstrap>:480(_call_with_frames_removed)
   451/21    0.001    0.000    1.321    0.063 {built-in method builtins.__import__}

But as soon as I put in one of the inline fields:

album_fields:
  multidisc: 1 if disctotal > 1 else 0
paths:
  default: $albumartist/$original_year - $albumartist - $track - $title - %if{$multidisc,A,B}

That's when it gets slow:

Sun May 11 23:01:30 2025    cprofile.stats

         1235325 function calls (1197227 primitive calls) in 9.073 seconds

   Ordered by: cumulative time
   List reduced from 4743 to 20 due to restriction <20>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    615/1    0.014    0.000    9.074    9.074 {built-in method builtins.exec}
        1    0.000    0.000    9.074    9.074 /venv/bin/beet:1(<module>)
        1    0.000    0.000    8.389    8.389 /root/beets/beets/ui/__init__.py:1857(main)
        1    0.000    0.000    8.389    8.389 /root/beets/beets/ui/__init__.py:1778(_raw_main)
        1    0.000    0.000    7.358    7.358 /root/beets/beets/ui/commands.py:2207(move_func)
        1    0.000    0.000    7.358    7.358 /root/beets/beets/ui/commands.py:2128(move_items)
       24    0.000    0.000    7.308    0.305 /root/beets/beets/dbcore/db.py:950(query)
       11    0.000    0.000    7.298    0.663 /root/beets/beets/library.py:1654(_fetch)
       11    0.001    0.000    7.298    0.663 /root/beets/beets/dbcore/db.py:1211(_fetch)
       24    7.290    0.304    7.290    0.304 {method 'execute' of 'sqlite3.Connection' objects}
        7    0.000    0.000    7.288    1.041 /root/beets/beets/library.py:1695(items)
        6    0.000    0.000    6.076    1.013 /root/beets/beets/library.py:1076(destination)
        6    0.000    0.000    6.054    1.009 /root/beets/beets/dbcore/db.py:686(evaluate_template)
        6    0.000    0.000    6.053    1.009 /root/beets/beets/util/functemplate.py:554(substitute)
        6    0.000    0.000    6.053    1.009 /root/beets/beets/util/functemplate.py:578(wrapper_func)
       30    0.000    0.000    6.051    0.202 /root/beets/beets/library.py:483(__getitem__)
       30    0.000    0.000    6.051    0.202 /root/beets/beets/library.py:469(_get)
       30    0.001    0.000    6.049    0.202 /root/beets/beets/dbcore/db.py:123(_get_formatted)
  470/129    0.001    0.000    6.049    0.047 /root/beets/beets/dbcore/db.py:443(_get)
        6    0.000    0.000    6.044    1.007 /root/beets/beetsplug/inline.py:107(_expr_func)

However if I make it an itemfield, it's fast again:

item_fields:
  multidisc: 1 if disctotal > 1 else 0
paths:
  default: $albumartist/$original_year - $albumartist - $track - $title - %if{$multidisc,A,B}
Sun May 11 23:07:50 2025    cprofile.stats

         1237616 function calls (1199285 primitive calls) in 2.934 seconds

   Ordered by: cumulative time
   List reduced from 4743 to 20 due to restriction <20>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    615/1    0.014    0.000    2.935    2.935 {built-in method builtins.exec}
        1    0.000    0.000    2.935    2.935 /venv/bin/beet:1(<module>)
        1    0.000    0.000    2.303    2.303 /root/beets/beets/ui/__init__.py:1857(main)
        1    0.000    0.000    2.303    2.303 /root/beets/beets/ui/__init__.py:1778(_raw_main)
   617/18    0.006    0.000    1.400    0.078 <frozen importlib._bootstrap>:1349(_find_and_load)
   616/18    0.004    0.000    1.399    0.078 <frozen importlib._bootstrap>:1304(_find_and_load_unlocked)
   582/18    0.003    0.000    1.387    0.077 <frozen importlib._bootstrap>:911(_load_unlocked)
   533/17    0.010    0.000    1.386    0.082 <frozen importlib._bootstrap_external>:993(exec_module)
  1352/35    0.002    0.000    1.382    0.039 <frozen importlib._bootstrap>:480(_call_with_frames_removed)
        1    0.000    0.000    1.324    1.324 /root/beets/beets/ui/commands.py:2207(move_func)
        1    0.000    0.000    1.324    1.324 /root/beets/beets/ui/commands.py:2128(move_items)
       12    0.000    0.000    1.297    0.108 /root/beets/beets/dbcore/db.py:950(query)
       12    1.285    0.107    1.285    0.107 {method 'execute' of 'sqlite3.Connection' objects}
        5    0.000    0.000    1.285    0.257 /root/beets/beets/library.py:1654(_fetch)
        5    0.000    0.000    1.284    0.257 /root/beets/beets/dbcore/db.py:1211(_fetch)
        1    0.000    0.000    1.276    1.276 /root/beets/beets/ui/commands.py:62(_do_query)
        1    0.000    0.000    1.275    1.275 /root/beets/beets/library.py:1695(items)
   451/21    0.001    0.000    1.188    0.057 {built-in method builtins.__import__}
        1    0.000    0.000    0.976    0.976 /root/beets/beets/ui/__init__.py:1662(_setup)
        1    0.000    0.000    0.768    0.768 /root/beets/beets/ui/__init__.py:1626(_load_plugins)

@RollingStar
Copy link
Collaborator

I know nothing about how the inline code works. But, could it be multiplying the overhead by the number of tracks in the album? Say f(item) = 1 second, f(album) = 10 * f(item) if it has 10 tracks.

@BGarber42
Copy link
Author

My test case was using a title query that I knew only returned a few tracks, in this case 3. However, it was split across (iirc) two albums, so if I need to repro again, I'd be sure to do it on a single album to see what the call counts end up as.

@snejus
Copy link
Member

snejus commented May 13, 2025

Attempting to get to the root cause of this

  1. Added a logging call to investigate interaction with the database.

    diff --git a/beets/dbcore/db.py b/beets/dbcore/db.py
    index 16ca54995..44cea2323 100755
    --- a/beets/dbcore/db.py
    +++ b/beets/dbcore/db.py
    @@ -33,2 +33,3 @@
     import beets
    +from beets.logging import getLogger
     
    @@ -46,2 +47,4 @@
     
    +log = getLogger("beets")
    +
     if TYPE_CHECKING:
    @@ -1221,2 +1224,3 @@ def _fetch
             """
    +        log.warning("Fetching {} with query {}", model_cls.__name__, query)
             query = query or TrueQuery()  # A null query.
  2. Using my largest album that has 136 tracks:

    $ beet list album:'Together with Ukraine' -f '$albumtotal' -a
    Fetching Item with query MatchQuery('id', 0, fast=True)
    Fetching Album with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
    Fetching Item with query MatchQuery('album_id', 10583, fast=True)
    136
  3. Checking three sets of configurations

  • Case 1: No plugins enabled
  • Case 2: inline with item_fields
    plugins: inline
    item_fields:
      has_lyrics: bool(lyrics)
      label_or_albumartist: |
        aartist = (albumartist or artist).split(", ")[0]
        if not label or label.lower() in {"self", "not on label", aartist.lower()}:
            return aartist
        return label or albumartist or artist
      singleton_track_artist: '"" if label.lower() == artist.lower() else f"{artist}_"'
      track_artist: '"" if album and (label.lower() == artist.lower() or albumartist == artist) else f"{artist}_"'
      album_name: |
        return "_".join((a for a in [
          catalognum if catalognum != album else "",
          (albumartist if albumartist not in {label, "Various Artists"} else ""),
          album
        ] if a.strip()))
      track_identification: |
        if (track_alt := globals().get("track_alt")) and track_alt[0].isalpha():
          idx = track_alt
        elif track:
          idx = str(track).zfill(2)
        else:
          return ""
    
        if disctotal > 1:
          idx = f"{disc}_{idx}"
    
        return f"{idx}_"
  • Case 3: inline with item_fields and album_fields
    album_fields:
      label_or_albumartist: |
        aartist = (albumartist or artist).split(", ")[0]
        if not label or label.lower() in {"self", "not on label", aartist.lower()}:
            return aartist
        return label or albumartist or artist
      multiple_artists: |
        ', ' in albumartist
        or 'Various' in albumartist
        or (len(set(item.artist.split()[0] for item in items)) > 1)

See the results

Case 1: No plugins enabled: 1.9s

$ count "beet move -p album:'Together with Ukraine'" >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Moving 129 items.
1s 887ms 598us | 14 pids

Case 2: inline with item_fields: 2.2s

$ count beet move -p album:'Together with Ukraine' >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Moving 0 items (129 already in place).
2s 149ms 934us | 13 pids

Case 3: inline with item_fields and album_fields: 11.2s

Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Moving 0 items (129 already in place).
11s 173ms 786us | 26 pids

Will suggest some improvements in the next comment.

@snejus snejus linked a pull request May 14, 2025 that will close this issue
@snejus
Copy link
Member

snejus commented May 14, 2025

See #5784 for a potential fix:

Case 1: No plugins enabled: 1.7s

$ count "beet move -p album:'Together with Ukraine'" >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Moving 129 items.
1s 714ms 289us | 13 pids

Case 2: inline with item_fields: 1.9s

$ count beet move -p album:'Together with Ukraine' >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Moving 0 items (129 already in place).
1s 890ms 130us | 16 pids

Case 3: inline with item_fields and album_fields: 2.2s

$ count beet move -p album:'Together with Ukraine' >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Moving 0 items (129 already in place).
2s 182ms 987us | 14 pids

Note this introduces issues (see failing tests) as the cache needs resetting, but I've coded this in just to start the work towards an eventual fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants