1396 Commits

Author SHA1 Message Date
Ivan Kanis
4fdd8e2b96 Add Beetnik in other plugins 2026-05-02 02:47:02 +01:00
Terry Chen
e546e02596 Clarify MusicBrainz extra_tags defaults 2026-04-25 23:29:17 -04:00
Sebastian Mohr
dd58cc8ccc Added documentation. 2026-04-20 20:55:47 +02:00
J0J0 Todos
4fb9c9a816 smartplaylist: Document CLI output overhaul changes 2026-04-19 22:55:35 +02:00
Šarūnas Nejus
348eb9555f Update docs 2026-04-17 09:19:15 +01:00
Šarūnas Nejus
5528a2b7f5 Update docs 2026-04-16 09:02:28 +01:00
Christopher Larson
5bc11ea736 inline: make the album/item available directly
There have been multiple requests, in the past, for the ability to use
plugin fields in inline fields. This has not previously been available.
From what I can tell, it was intentionally left unavailable due to
performance concerns.

The way the item fields are made available to the inline python code
means that all fields are looked up, whether they're actually used by
the code or not. Doing that for all computed fields would be a
performance concern.

I don't believe there's a good way to postpone the field computation, as
python eval and compile requires that globals be a dictionary, not a
mapping. Instead, we can make available the album or item model object
to the code directly, and let the code access the fields it needs via
that object, resulting in postponing the computation of the fields until
they're actually accessed.

This is a simple approach that makes the computed and plugin fields
available to inline python, which allows for more code reuse, as well as
more options for shifting logic out of templates and into python code.
The object is available as `db_obj`.

Examples:

    item_fields:
      test_file_size: db_obj.filesize

    album_fields:
      test_album_path: db_obj.path
      # If the missing plugin is enabled
      test_album_missing: db_obj.missing

Signed-off-by: Christopher Larson <kergoth@gmail.com>
2026-04-15 11:59:19 -07:00
Andrew Yang
692ef4a923 chroma: gate candidates on the musicbrainz plugin being enabled
The chroma plugin uses Acoustid fingerprinting, which returns MusicBrainz
release and recording IDs. It then unconditionally resolved those IDs
through a privately instantiated MusicBrainzPlugin, so MusicBrainz-sourced
candidates appeared during tagging even when the user had not enabled the
musicbrainz plugin.

Replace the direct MusicBrainzPlugin() instantiation with a lookup through
the metadata-source registry via get_metadata_source("musicbrainz"). When
that returns None, short-circuit both candidates() and item_candidates()
to return empty. This also fixes an incidental issue where the private
instance bypassed any plugin that swaps the musicbrainz plugin at runtime
(e.g. mbpseudo).

Acoustid fingerprinting itself is unaffected — acoustid_id and
acoustid_fingerprint item fields are still populated as before.

Fixes #6212
2026-04-15 00:03:23 +01:00
Sebastian Mohr
396f29262e Add a link to the aisauce plugin. 2026-04-14 20:20:45 +02:00
Šarūnas Nejus
2ff7887725 Apply all matching rules to a field 2026-04-10 14:54:57 +01:00
Šarūnas Nejus
e21f56fc60 Update docs 2026-04-10 10:43:25 +01:00
J0J0 Todos
fc367165f9 lastgenre: Docs for genre ignorelist feature 2026-04-09 22:42:38 +02:00
ShimmerGlass
3194666610 feat(fetchart): add support for webp files 2026-04-08 12:39:58 +02:00
Šarūnas Nejus
86509a0ec3 Update docs 2026-04-06 20:30:13 +01:00
ShimmerGlass
1242f42b37 feat(chroma): add chromasearch command
This command lets user search the database by chromaprint fingerprint
similarity.
Database item fingerprints are computed on the fly if needed.
This is useful for example to check if an unknown / untagged audio file
already exists in the database.
2026-04-04 15:03:42 +02:00
J0J0 Todos
9b1761ac44 autobpm: Options force,quite and deprecate overwrite
- Refactor docs to use conf directives
- Rename and deprecate overwrite setting in plugin and docs
- Add quiet CLI option and config
- Add force CLI option and config
2026-04-03 11:28:33 +02:00
Šarūnas Nejus
6067ccd8b7 Update listenbrainz docs 2026-03-31 01:36:08 +01:00
kelamg
97a89e919c Update docs/plugins/lyrics.rst
Co-authored-by: Šarūnas Nejus <snejus@protonmail.com>
2026-03-22 01:46:50 +00:00
kelamg
b3bcb78349 Fix indentation 2026-03-22 01:46:50 +00:00
jochem
55b6fbe77d copied more generic implementation from snejus, and updated the tests and docs accordingly 2026-03-22 01:46:50 +00:00
kelamg
eacaa09a07 Fix docs formatting 2026-03-22 01:46:50 +00:00
jochem
2f9ee89b2a Added feature to exclude albums/songs during importing when auto is enabled, as requested in issue #3523. Also added corresponding tests and documentation. 2026-03-22 01:46:50 +00:00
Šarūnas Nejus
6eff971257 lastimport: rename flexible field because of the clash with mpdstats 2026-03-17 08:20:47 +00:00
Andrejs Mivreniks
f9f4af874b feat(play): Add -R/--randomize option to play plugin 2026-03-16 20:33:23 +02:00
Brock Grassy
2c60c3eb49 Address comments and add new test case 2026-03-16 06:52:35 +00:00
Brock Grassy
6b62380b62 Change missing plugin to allow for filtering albums by release type 2026-03-16 06:52:35 +00:00
Pierre Ayoub
5157ba6021 Update docs/plugins/smartplaylist.rst
Styling by Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-13 19:17:56 +00:00
Pierre Ayoub
7dfed4429f chore(docs): Lint double backquotes 2026-03-13 19:17:56 +00:00
Pierre Ayoub
b798465a55 chore(docs): Format with docstrfmt 2026-03-13 19:17:56 +00:00
Pierre Ayoub
d81c0518c8 [docs/spl] Add documentation for new dest_regen option 2026-03-13 19:17:56 +00:00
john doe
1c3b58c7d8 Update discogs.rst
Formatting fix
2026-03-13 00:25:39 +00:00
jdoe29103
0d8d3bfadf Add discogs.extra_tags and updated documentation 2026-03-13 00:25:39 +00:00
Šarūnas Nejus
35361a63b6 Require data_source in album_for_id and track_for_id functions
These functions now accept both an ID and data_source parameter,
enabling plugins like mbsync and missing to retrieve metadata from the
correct source.

Update mbsync and missing plugins to use the restored functions with
explicit data_source parameters. Add data_source validation to prevent
lookups when the source is not specified.

Add get_metadata_source helper function to retrieve plugins by their
data_source name, cached for performance.
2026-03-10 00:56:35 +00:00
Szymon Tarasiński
bdb039c760 Fix docs: use single-line deprecated directive compatible with docstrfmt 2026-03-08 17:10:29 +00:00
Szymon Tarasiński
740db4d500 Fix docs formatting for beatport and bpsync rst files 2026-03-08 17:10:29 +00:00
Szymon Tarasiński
efa1f370b7 Deprecate beatport and bpsync plugins
Beatport has retired the API these plugins rely on, making them
non-functional. Add deprecation warnings and update documentation
to reflect the current state.

Fixes #3862
2026-03-08 17:10:29 +00:00
Šarūnas Nejus
a8b34d2976 Pin docstrfmt>=2.0.2 and add --preserve-adornments flag 2026-03-08 08:19:55 +00:00
Šarūnas Nejus
ae3a2e5729 Fix redirect URLs 2026-03-06 11:28:29 +00:00
Šarūnas Nejus
441c838387 Fix broken URLs 2026-03-06 11:28:29 +00:00
Šarūnas Nejus
3d0d032987 Replace http URLs with https 2026-03-06 11:28:29 +00:00
Šarūnas Nejus
38708ae592 Refactor lyrics handling to use structured Lyrics object
* Introduce a `Lyrics` dataclass to carry text, source URL, and language
  metadata through fetch, translation, and storage paths.
* Return `Lyrics` from backends and plugin lookup methods instead of raw
  tuples/strings.
* Store backend name in `lyrics_source` derived from fetched URL root
  domain.
* Simplify translator flow to operate on `Lyrics`, reuse line splitting,
  append translations in-place, and record translation language
  metadata.
2026-03-06 10:57:08 +00:00
Šarūnas Nejus
82bfc03494 Preserve synced lyrics when fetched result is plain text
When lyrics.synced is enabled, avoid replacing existing synced lyrics with
newly fetched unsynced lyrics, even with force enabled.

Allow replacement when the new lyrics are also synced, or when synced mode
is disabled.
2026-03-05 15:36:59 +00:00
Arne Beer
13fe82f394 feat(lastgenre): cleanup_existing
Introduce a new lastgenre `cleanup_existing` flag.

It handles the case where canonicalization is desired on existing tags.
The new logic triggers if:
- `force`: False
- `cleanup_existing: True

Depending on whether `whitelist: True` or `canonical: True`, the genres
are then canonicalized and/or whitelisting is applied
2026-03-04 21:01:37 +01:00
Šarūnas Nejus
91fae7c879 Merge branch 'master' into zero-total-discs 2026-03-02 16:37:43 +00:00
Šarūnas Nejus
67cf15b0bd Remove lastgenre separator config 2026-02-27 18:36:04 +00:00
Šarūnas Nejus
52375472e8 Replace genre: with genres: in docs 2026-02-27 18:34:26 +00:00
Šarūnas Nejus
a8d53f78de Fix the rest of the tests 2026-02-27 18:34:26 +00:00
Šarūnas Nejus
cf36ed0754 Only handle multiple genres in discogs 2026-02-27 18:34:26 +00:00
dunkla
36a30b3c65 Implement automatic database-level genre migration
- Add Library._make_table() override to automatically migrate genres when database schema is updated
- Migration splits comma/semicolon/slash-separated genre strings into genres list
- Writes changes to both database and media files with progress reporting
- Remove lazy migration from correct_list_fields() - now handled at database level
- Remove migration-specific tests (migration is now automatic, not lazy)
- Update changelog to reflect automatic migration behavior

Related PR review comment changes:
- Replace _is_valid with _filter_valid method in lastgenre plugin
- Use unique_list and remove genre field from Beatport plugin
- Simplify LastGenre tests - remove separator logic
- Document separator deprecation in lastgenre plugin
- Add deprecation warning for genre parameter in Info.__init__()
2026-02-27 18:24:54 +00:00
Andrey M.
34fe39d066 Add beets-fillmissing to the list of plugins 2026-02-16 20:15:22 +02:00