Commit graph

4068 commits

Author SHA1 Message Date
Šarūnas Nejus
fcfa8ddfac
Invoke album_matched hook from AlbumMatch.__post_init__ 2026-03-10 00:56:35 +00:00
Šarūnas Nejus
85aa1d7a9c
Take data source into account when deciding duplicate candidates 2026-03-10 00:56:13 +00:00
spaceage64
fbe9495bdd Pulled latest changelog and added my entry to 'Unreleased > Bug fixes' section. 2026-03-10 00:25:02 +01:00
spaceage64
b8823dddde Merge remote-tracking branch 'origin/drive-separator-fix' 2026-03-10 00:14:25 +01:00
spaceage64
031c2a8aeb Moved changelog note to top, under Unreleased. 2026-03-10 00:09:32 +01:00
spaceage64
e14191ed05 This PR improves the regex detection used for the drive_sep_replace default. 2026-03-09 20:19:17 +00:00
spaceage64
7b26733e04 This PR improves the regex detection used for the drive_sep_replace default. 2026-03-09 11:07:37 +01: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
Konstantin
d2705fef4e Update changelog.rst 2026-03-08 14:16:49 +01:00
Šarūnas Nejus
4cccb70921
Document shared metadata search plugin workflow
Add developer guidance for SearchApiMetadataSourcePlugin and its hooks.

Clarify migration advice for API-backed metadata source plugins.
2026-03-08 09:00:14 +00:00
Emil Hammarberg
1f2beb6d02 Format 2026-03-08 08:51:42 +00:00
Emil Hammarberg
763dc7ccb1 Fix empty literal error 2026-03-08 08:51:42 +00:00
Emil Hammarberg
8a57472224 Reword 2026-03-08 08:51:42 +00:00
Emil Hammarberg
654b76190c Clarify %if template behavior
Closes #4991
2026-03-08 08:51:42 +00:00
snejus
13665a5a55 Increment version to 2.7.1 2026-03-08 08:30:00 +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
a7325e7483
Skip langdetect-dependent tests when package is not installed
Add a `requires_import` pytest marker and `is_importable` fixture to
conditionally skip or adjust assertions based on whether optional
dependencies are available. Apply this to `langdetect`-dependent
language detection tests in lyrics and migration test suites.
2026-03-08 08:19:55 +00:00
snejus
156870419e Increment version to 2.7.0 2026-03-07 21:16:10 +00:00
Šarūnas Nejus
b3f5585849
Add a changelog note 2026-03-06 11:29:05 +00:00
Šarūnas Nejus
192217da5d
Format docs 2026-03-06 11:28:29 +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
e8605747d6
Document migrations 2026-03-06 10:57:08 +00:00
Šarūnas Nejus
7d30efa82c
Migrate lyrics metadata to flex fields on library open
- Add `LyricsMetadataInFlexFieldsMigration` to extract legacy source
  URLs and language metadata from lyrics text into flex attributes
- Add `Lyrics.from_legacy_text` to parse legacy lyrics format
- Move `with_row_factory` context manager up to base `Migration` class
- Rename `migrate_table` to `migrate_model` and pass model class
  instead of table name string. This is so that the migration can access
  both `_table` and `_flex_table` attributes.
- Make `langdetect` import optional in `Lyrics.__post_init__`: users may
  not have have the dependency installed, and we do not want the
  migration to fail because of that.
- Move `BACKEND_BY_NAME` to module level for use outside plugin class
2026-03-06 10:57:08 +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
Šarūnas Nejus
24ca6abcfe
lyrics: validate synced lyrics duration 2026-03-05 15:34:32 +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
e90bda31d1
Merge branch 'master' into pr-fix-convert-ext 2026-03-04 15:24:54 +00:00
Šarūnas Nejus
c46f99a82b
Merge branch 'master' into pr-fix-convert-ext 2026-03-04 15:22:40 +00:00
Šarūnas Nejus
bf7997d45f
Move changelog note under Unreleased section 2026-03-04 14:32:44 +00:00
Axel Wikström
b5d8ced9d9 Enable duplicate detection for as-is imports
When importing with autotag=no, duplicate detection was skipped entirely
because the import_asis stage called _apply_choice() directly without
first calling _resolve_duplicates(). This meant the duplicate_keys and
duplicate_action config options were ignored for as-is imports.

This was a known limitation documented by a FIXME comment added in
commit 79d1203541 (Sep 2014): "We should also resolve duplicates when
not autotagging." The FIXME was later removed during a comment cleanup
(f145e3b18) but the issue was never addressed.

This commit adds the _resolve_duplicates() call to import_asis, ensuring
duplicate detection works consistently regardless of the autotag setting.
This applies to both album imports and singleton imports.

Test changes:
- Renamed test_no_autotag_keeps_duplicate_album to
  test_no_autotag_removes_duplicate_album to verify the corrected behavior
- Added test_no_autotag_removes_duplicate_singleton to verify singleton
  duplicate detection also works with autotag=no

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-04 14:26:13 +00:00
Šarūnas Nejus
48763eee4f
Force slow queries for FuzzyPlugin 2026-03-03 14:05:35 +00:00
Šarūnas Nejus
56e86a7966
Add changelog note 2026-03-03 13:53:12 +00:00
Šarūnas Nejus
503d5c75ff
Merge branch 'master' into bugfix_editor 2026-03-03 12:03:52 +00:00
Šarūnas Nejus
1838482c7a
Keep missing multi-value fields as None instead of empty list 2026-03-03 07:48:51 +00:00
Danny Trunk
974d917df4 fix(fetchart): prevent deletion of configured fallback cover art
When `import.delete` or `import.move` is enabled, the `assign_art` method calls `task.prune(candidate.path)` unconditionally.
This incorrectly deletes the configured `fetchart.fallback` file.
Add explicit check to skip pruning when the candidate path matches the configured fallback.
2026-03-02 18:10:19 +01:00
Šarūnas Nejus
5c3ba8e006
Move changelog note under unreleased section 2026-03-02 16:38:02 +00:00
Šarūnas Nejus
91fae7c879
Merge branch 'master' into zero-total-discs 2026-03-02 16:37:43 +00:00
Šarūnas Nejus
b17305aa1e
Update changelog note 2026-03-02 14:54:34 +00:00
Fredrik Möllerstrand
bfd95f47d0 fix: ftintitle can handle a list of ampersanded artists
This was inspired by real life events:
https://musicbrainz.org/release/7c4d7a15-6b30-4bef-8b20-af200186fbdb
by the artist Danny L Harle has a a track with a featuring list
that contains "Danny L Harle, Oklou & MNEK".
2026-03-02 14:53:23 +00:00
J0J0 Todos
532b0dabb1 Update my teams page entry 2026-03-02 08:31:44 +01:00
Serene
aa81232336 Use proper syntax highlighting for code block
Co-authored-by: Šarūnas Nejus <snejus@protonmail.com>
2026-03-01 11:46:44 +00:00
Serene-Arc
dd1bda4bd0 Format docs 2026-03-01 11:46:44 +00:00
edvatar
a40bd7ca3c docs: Document match.distance_weights in autotagger docs
Add documentation for the distance_weights configuration option in
the autotagger matching section. This includes all available fields
with their default values and an example of how to customize them.

Closes #6081

Signed-off-by: edvatar <88481784+toroleapinc@users.noreply.github.com>
2026-03-01 11:46:44 +00:00
Šarūnas Nejus
62e232983a
Document ordering of the genre split separator 2026-02-27 18:36:04 +00:00
Šarūnas Nejus
67cf15b0bd
Remove lastgenre separator config 2026-02-27 18:36:04 +00:00