- Move query and sort construction into `ModelQuery` classmethods and parse
tokenized input once.
- Switch call sites to consume `parse_query(...).query` and
`parse_query(...).sort` instead of tuple unpacking.
- Remove legacy `dbcore` re-exports and obsolete helper functions in
`queryparse`.
- Update query/sort tests to match the new parsing behavior and simplified
query object shapes.
- Move field alias handling, shared-table qualification, and path pattern
normalization into FieldQuery.from_model with a query-specific
normalize_pattern hook.
- Update query parsing and plugin call sites to construct queries through
query_cls.from_model and remove redundant model-level field query helpers.
This keeps model entrypoints focused on orchestration and colocates
transformation behavior with the query types that own it.
- Add ModelQuery in dbcore.queryparse and expose LibModel.parse_query as
the single parsing entrypoint for string and sequence query inputs.
- Route library fetch, path format matching, and plugin query parsing
through the model-level API, and deprecate
beets.library.parse_query_string and parse_query_parts.
- Update tests to cover invalid query parsing via ModelQuery and align
smartplaylist sort assertions with parsed sort behavior.
- Replace default sort helpers with LibModel.default_sort as a shared,
config-driven sort helper for Item and Album.
- Route Library._fetch through get_results with parsed query sort, explicit sort,
or model default_sort fallback.
Test whether fetchart is run during the import phase and, specifically,
whether the `fetch_for_asis` setting is honored. Mock boundary is
between `FetchArtPlugin` and `ArtSource`, an already-existing internal
API boundary.
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>
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.
- Factor common album and track Tidal fields into a shared
MediaAttributes TypedDict.
- Use the shared type in parser helpers that only need common Tidal
metadata.
- Fix mypy: avoid {} default in relationships.get() that creates Never type
- Fix doc build: use :doc:\etchart\ instead of :doc:\plugins/fetchart\ from within plugins/ directory