Commit Graph

3768 Commits

Author SHA1 Message Date
Šarūnas Nejus
49266072e8 Refactor autotag to use Source abstraction
Introduce Source class to encapsulate metadata extraction logic,
replacing scattered `get_most_common_tags` calls throughout codebase.

- Add Source class in importer.tasks with artist, name, and metadata
- Simplify `distance()` to accept Source.data instead of items list
- Update display functions to use Source objects
- Cache Source creation with @cached_property on ImportTask

This centralizes metadata handling and reduces coupling between
autotag and library modules.
2026-07-17 09:06:54 +01:00
Šarūnas Nejus
6e2ed46ad4 Move AttrDict under beets.util 2026-07-17 09:06:51 +01:00
Šarūnas Nejus
7b59604c54 Fix the issue 2026-07-16 14:21:52 +01:00
Šarūnas Nejus
84c01ef4f9 Add a failing test 2026-07-16 14:21:41 +01:00
Šarūnas Nejus
856087258b dbcore: rename Database._fetch to Database.get_results
This removes ambiguity with Library._fetch
2026-07-16 13:11:16 +01:00
Šarūnas Nejus
3f277ad5a0 typing: feed PathLike as database path 2026-07-16 13:11:16 +01:00
Šarūnas Nejus
439a7fa75d discogs: Refactor _coalesce_tracks to make use of various tracks type_ 2026-07-16 11:57:10 +01:00
Šarūnas Nejus
8867848612 discogs: Add descriptions of each possible Tracks 2026-07-16 11:57:10 +01:00
Šarūnas Nejus
c46f6a549b discogs: Dedupe test_strip_disambiguation 2026-07-16 11:51:32 +01:00
Šarūnas Nejus
bbb1b5c1ef discogs: And now add full _coalesce_tracks coverage 2026-07-16 11:51:32 +01:00
Šarūnas Nejus
bd9c753b99 discogs: Test index_tracks behaviour 2026-07-16 11:51:32 +01:00
Šarūnas Nejus
b8f43e994a discogs: Test inherited track group artist 2026-07-16 11:51:31 +01:00
Šarūnas Nejus
bc0591fdb6 discogs: Consolidate test_parse_tracklist_subtracks... tests 2026-07-16 11:50:58 +01:00
Šarūnas Nejus
1343d613d3 discogs: Move test_parse_tracklist_positions... under TestTracklist 2026-07-16 11:50:58 +01:00
Šarūnas Nejus
951af6d3e8 discogs: Use a single global fixture to kill DiscogsPlugin.setup 2026-07-16 11:50:58 +01:00
Šarūnas Nejus
a126a3aaa3 discogs: Use Release instead of Bag in tests 2026-07-16 11:50:58 +01:00
Šarūnas Nejus
69cdd58240 discogs: remove redundant check for required fields 2026-07-16 11:50:58 +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
Šarūnas Nejus
1266256f5e typing: fix beets.dbcore.types 2026-07-15 20:23:55 +01: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
c51f5755f3 lastgenre: Whitelist/Tree fixes; Default aliases
- Fixes some inconsistencies in spelling in the data files we ship with
  the plugin as well as adds some new genres to both files that seem to
  be returned often by last.fm.
  - For some changes the default aliases feature helps to streamline
    inconsistencies that come from last.fm already.
- The default aliases file that ships with beets
  - Tests fixes that prove that most of the alias normalization patterns
    work as they are supposed to.

Co-authored-by: Šarūnas Nejus <snejus@protonmail.com>
2026-07-15 16:04:51 +02:00
J0J0 Todos
3ce8c9bbf5 lastgenre: Tests for _filter_valid helper,
even though it's indirectly tested via resolve_genres tests and
elsewhere, it makes sense to keep them to help with future refactoring.
2026-07-15 16:04:51 +02:00
J0J0 Todos
1674b5e7f9 lastgenre: Tests for genre alias normalization
Co-authored-by: Šarūnas Nejus <snejus@protonmail.com>
2026-07-15 16:04:51 +02: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
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
Sebastian Mohr
19f944698d rewrite: PluginTestCase -> PluginTestHelper 2026-07-14 17:24:17 +02:00
Sebastian Mohr
5364644238 replace: PluginTestCase -> PluginTestHelper 2026-07-14 17:24:17 +02:00
Sebastian Mohr
9f75017d72 mpdstats: PluginTestCase -> PluginTestHelper 2026-07-14 17:24:17 +02:00
Sebastian Mohr
a06c4b4736 inline: PluginTestCase -> PluginTestHelper 2026-07-14 17:24:17 +02:00
Sebastian Mohr
ca2acfc28a tidal: PluginTestCase -> PluginTestHelper 2026-07-14 17:24:17 +02:00
Sebastian Mohr
2b90679100 advancedrewrite: PluginTestCase -> PluginTestHelper 2026-07-14 17:24:17 +02:00
Sebastian Mohr
9f75e2b211 acousticbrainz: Removed unittest.TestCase 2026-07-14 17:24:17 +02:00
Sebastian Mohr
757af4aebd util/m3u: Removed unittest.TestCase 2026-07-14 17:24:17 +02:00
Sebastian Mohr
d19e36a0a1 substitute: PluginTestCase -> PluginTestHelper 2026-07-14 17:24:17 +02:00
Sebastian Mohr
9616065591 the: Removed unittest.TestCase 2026-07-14 17:24:17 +02:00
Sebastian Mohr
c04bae3c8f ihate: Removed unittest.TestCase 2026-07-14 17:24:17 +02:00
Šarūnas Nejus
e671c375f1 Make music_dir a Path, simplify setup 2026-07-14 14:36:12 +01:00
Šarūnas Nejus
364d027371 Define attribute for item paths 2026-07-14 14:36:12 +01:00
Šarūnas Nejus
70174db929 Write playlists inside setUp 2026-07-14 14:36:12 +01:00
Šarūnas Nejus
ea12df17a9 Define write_relative_playlist 2026-07-14 14:36:12 +01:00
Šarūnas Nejus
6586ea82cb Define write_absolute_playlist 2026-07-14 14:36:12 +01:00
Šarūnas Nejus
f8ed00386e Define absolute_playlist_path, relative_playlist_path 2026-07-14 14:36:12 +01:00
Alok Saboo
01c2943e76 remove redundant test 2026-07-13 12:37:07 -04:00
Alok Saboo
3ce00617e9 switch the logic ot strip item-only fixed fields 2026-07-13 12:29:55 -04: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