Commit Graph

4414 Commits

Author SHA1 Message Date
Sebastian Mohr
b5019fb180 Moved changelog entry into unreleased section. 2026-07-30 12:58:31 +02:00
chuenchen309
8518a13f3d docs: reflow changelog entry to satisfy docstrfmt
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 12:58:16 +02:00
chuenchen309
69772cdc6d fix(autotag): "featuring" pattern in string_dist matches mid-word "ft"
SD_PATTERNS' featuring/feat/ft regex has no word boundary before the
alternation, so it matches "ft" embedded in ordinary words like
"draft", "left", "gift", "craft" and treats everything after it as a
low-weight suffix. "Draft Beer" vs. "Draft Whiskey" scores 0.05
(near-identical) instead of correctly registering as very different.
2026-07-30 12:58:16 +02:00
Sebastian Mohr
5d2d3993a7 Moved changelog entry to the current unreleased section. 2026-07-30 12:53:21 +02:00
Qalipso
a8439e2d07 Fix unique_path counter for names ending in two or more digits
unique_path parses a trailing counter so it can continue from it, but the
pattern is `\.(\d)+$` -- a single-digit group repeated, not a multi-digit
group. group(1) is therefore the last digit only, and the counter restarts
from it:

    track.10.mp3 -> track.1.mp3   (expected track.11.mp3)
    track.12.mp3 -> track.3.mp3
    track.123.mp3 -> track.4.mp3

The returned path still does not exist, so nothing is overwritten, but the
new name sorts before the file it was derived from, and the scan restarts
from a low number when the neighbours are already taken.

Use `\.(\d+)$`. Existing coverage only exercised a single-digit counter
(`x.1.mp3`), which is why this held.
2026-07-30 12:52:03 +02:00
TowyTowy
348b87dd3e Normalise reversed date ranges instead of crashing
A date range query whose start lies after its end, such as
`beet ls added:2024..2020`, crashed with an uncaught ValueError
raised by DateInterval's endpoint-order check:

    ValueError: start date 2024-01-01 00:00:00 is not before end date
    2021-01-01 00:00:00

Only InvalidQueryArgumentValueError is converted into a user-facing
InvalidQueryError by Library._get_results, so the plain ValueError
escaped all the way up as a traceback.

Rather than reporting an error, accept the range and swap its two
endpoints, so `added:2024..2020` means the same as `added:2020..2024`.

The swap lives in `DateInterval.from_periods`, which is the only place
where the two user-supplied endpoints are still available as `Period`
objects. Swapping further down, in `DateInterval.__init__`, would swap
the already-derived datetimes, and those are derived asymmetrically:
the start contributes `Period.date` while the end contributes
`Period.open_right_endpoint()`. For `2024..2020` that would yield
[2021-01-01, 2024-01-01), which excludes both 2020 and 2024 -- not the
interval the user asked for. Swapping the periods first yields
[2020-01-01, 2025-01-01), which is exactly `2020..2024`.

`DateInterval.__init__` keeps raising ValueError, since it remains the
invariant guard for callers constructing an interval from datetimes
directly, where there is no notion of the order the user typed.

The swap only triggers when the interval would otherwise be empty, so
partially overlapping mixed-precision ranges that are valid today, such
as `2000-06..2000`, are unaffected. Genuinely malformed input such as
`added:notadate` still raises InvalidQueryArgumentValueError from
`Period.parse` as before.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 12:36:04 +02:00
snejus
b795229994 Increment version to 2.13.1 2026-07-29 10:44:53 +00:00
Sebastian Mohr
0234e38f78 Removed unused doc sections. Preparing for hotfix. 2026-07-29 12:05:52 +02:00
Sebastian Mohr
87a07553fd Changelog entry 2026-07-29 12:05:52 +02:00
Alok Saboo
a486f92693 reformat beatport/bpsync docs 2026-07-28 15:28:32 -04:00
snejus
48d44d15ed Increment version to 2.13.0 2026-07-27 19:07:11 +00:00
Alok Saboo
d392729b64 Merge branch 'master' into spotify 2026-07-24 10:14:31 -04:00
Alok Saboo
3909065ad5 Add changelog 2026-07-24 09:57:44 -04:00
Alok Saboo
801fe8f6d9 improve 503 error handling 2026-07-24 09:56:24 -04:00
Sebastian Cao
d3f36f678b docs: mention terminal emulator for Windows (#6866)
## Description

Fixes #2848.

The classic Windows console (`cmd.exe`) doesn't render beets' output
(special characters, colors) correctly. Added a note in the Windows
installation guide pointing people at a terminal emulator like Windows
Terminal or cmder, or a Unix-like shell such as Git Bash.
2026-07-23 20:02:25 +02:00
Dodothereal
30683b01bf Document art_set event
Assisted-by: Claude Code
2026-07-16 20:20:06 +02:00
Samad
3d197ee024 replaygain: use a yaml code-block for the docs config example 2026-07-15 22:22:07 +01:00
Samad
4ccdcc90c9 replaygain: add metaflac backend
Add a MetaflacBackend that computes ReplayGain for FLAC files with metaflac --add-replay-gain and reads the values back with --show-tag. Only FLAC is supported. Includes docs, a changelog entry, and tests.
2026-07-15 22:22:07 +01:00
TowyTowy
4a1e9164a1 Fix uncaught KeyError on date queries containing a stray pipe
The relative-date regex used character classes [+|-] and [y|m|w|d],
which mistakenly treat | as a literal member rather than alternation.
As a result a value like added:2000|2001 (as a user might type expecting
| to mean "or") captured | as the relative-date unit and crashed with
an uncaught KeyError in Period.parse instead of raising the documented
InvalidQueryArgumentValueError.

Remove the stray | from both character classes so malformed date strings
fall through to the normal invalid-date error path.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-15 21:55:46 +02:00
Vinícius Martins Cotrim
6a051f9699 Recognize native Spotify URIs when extracting IDs (#6840)
### Description

`extract_release_id` now accepts the native Spotify URI format
(`spotify:album:<id>`, `spotify:track:<id>`) in addition to the already
supported `open.spotify.com` URLs and bare IDs.

Co-authored-by: Marina Pena Malschitzky Crespo <marinacrespo@estudante.ufscar.br>
2026-07-15 21:21:25 +02:00
f1nn
0d65a46bbc lyrics: add lrcmux backend 2026-07-15 16:12:21 +02:00
J0J0 Todos
fda3fef148 lastgenre: Genre aliases docs; Tools chapter, More
- Document the genre alias normalization feature and the default aliases
  we ship with the plugin (by using rst "literalinclude" referring to
  aliases.yaml directly)
- Clarify what canonicalization acutually does when used without a
  whitelist enabled.
- New docs chapter "Using the right tool"
2026-07-15 16:04:51 +02:00
J0J0 Todos
a78c94c443 Changelog for #6466 genre aliases 2026-07-15 16:04:51 +02:00
AleksZyro
bb0c0992e5 Format changelog entry 2026-07-15 14:30:42 +01:00
AleksZyro
a6d576d039 Preserve null artpath in edit 2026-07-15 14:30:42 +01:00
Valentyn Kit
eb7c832fc9 Make InQuery hashable when its pattern is a list
InQuery inherited FieldQuery.__hash__, which hashes the pattern directly.
A list pattern raises `unhashable type: 'list'`, which broke the
smartplaylist `splupdate` command whenever a `playlist:` query was configured.
2026-07-15 08:02:01 +01:00
Sebastian Cao
2ada8a947d move the changelog entry under unreleased 2026-07-15 14:32:13 +08:00
Sebastian Cao
7d4f160c36 missing: honor -f/--format in album mode 2026-07-15 14:31:58 +08:00
AleksZyro
04f2c3e794 Improve subsonicupdate server error 2026-07-14 20:09:56 +02:00
Alok Saboo
58fb167750 Merge branch 'master' into edit 2026-07-13 08:47:53 -04:00
TowyTowy
2293d2f60a Fix crash when sorting by a nullable field missing on some items
Sorting by a field whose declared type is nullable (its null value is
`None`, e.g. `NullInteger`/`NullFloat`) raised `TypeError: '<' not
supported between instances of ...` when the field was present on some
objects but missing on others, because `FieldSort.sort` compared `None`
against real values.

Group missing values together in the sort key so they are never compared
against present ones: they are ordered first when sorting ascending and
last when descending, matching SQLite's default ordering of NULLs used by
the fast `FixedFieldSort` path.

Fixes #3461.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-13 13:36:23 +01:00
Alok Saboo
7f45f51690 Merge branch 'master' into edit 2026-07-12 20:39:16 -04:00
Šarūnas Nejus
d9a1bde1c9 Add --no-keep-synced CLI option to lyrics
- Allow manual lyrics fetches to override keep_synced configuration for a single
  run.
2026-07-13 01:14:41 +01:00
Alok Saboo
aeaab7320d Merge branch 'master' into edit 2026-07-12 20:14:33 -04:00
Šarūnas Nejus
95854c7770 Add a migration 2026-07-13 01:07:59 +01:00
Šarūnas Nejus
8020c07acf Track instrumental lyrics metadata
- Leave lyrics text empty when a backend reports an instrumental track and
  persist that state in lyrics_instrumental.
2026-07-13 01:07:59 +01:00
Alok Saboo
f91ba3a315 Merge branch 'master' into edit 2026-07-12 09:12:02 -04:00
Ross Williams
c3de685484 Add fetch_for_asis setting to FetchArt plugin
Enable fetching art for imports even when as-is is selected as the
metadata source. Allows for the case when files with good metadata
but without album art are being imported (e.g. digital download store).

Signed-off-by: Ross Williams <ross@ross-williams.net>
2026-07-10 22:15:32 +01:00
Alok Saboo
094e38e002 Merge remote-tracking branch 'upstream/master' into edit
# Conflicts:
#	docs/changelog.rst
2026-07-10 16:31:13 -04:00
Alok Saboo
9551562d3b removed conflict marker 2026-07-10 08:46:59 -04:00
Alok Saboo
bf94ae66ef sync branch 2026-07-10 08:27:23 -04:00
Trey Turner
1160d31cfa feat(ftintitle): hook metadata events, fixing mbsync 2026-07-08 21:10:47 -05:00
J0J0 Todos
cd9653d7df Changelog for PR 6648 multi-value modify operators 2026-07-08 12:12:15 +01:00
J0J0 Todos
582e3ccce4 Docs for multi-value modify operators 2026-07-08 12:12:15 +01:00
Temitope S Olugbemi
65a01c2c2a fix(importfeeds): keep import going when a symlink can't be created
When `formats` includes `link`, importfeeds creates a symlink per imported
item. A failed symlink (lacking privilege on Windows, a read-only directory, or
a filesystem without symlink support) raised beets.util.FilesystemError out of
the import pipeline and aborted the whole `beet import` run, even though the
tracks were already imported.

Catch FilesystemError around the link() call, log a per-item warning, and
continue with the remaining items. Add regression tests for the
warn-and-continue behaviour, that only FilesystemError is caught, and that a
successful link still creates the symlink. Add a changelog entry.

Fixes #840.
2026-07-03 10:26:17 -07:00
Šarūnas Nejus
4cfbb0167d Replace pipx tool installs with uv tool
- Use uv tool install for poethepoet in GitHub workflows and contributor docs.
- Recommend uv tool for isolated beets and plugin installs.
2026-06-30 12:44:24 +01:00
Šarūnas Nejus
a4e00380a8 Add a note to the changelog 2026-06-30 12:44:24 +01:00
Šarūnas Nejus
99b5da869d Replace poetry by uv 2026-06-30 12:44:21 +01:00
Alok Saboo
1eecbf3726 update changelog 2026-06-24 14:13:55 -04:00
Alok Saboo
9c39443067 fix changelog formatting 2026-06-24 14:10:11 -04:00