Merge branch 'master' of github.com:henry-oberholtzer/beets into discogs-anv-support

This commit is contained in:
Henry 2025-10-03 15:05:48 -07:00
commit 267428f0a4
13 changed files with 74 additions and 24 deletions

3
.gitignore vendored
View file

@ -94,3 +94,6 @@ ENV/
# pyright
pyrightconfig.json
# Versioning
beets/_version.py

View file

@ -17,10 +17,26 @@ from sys import stderr
import confuse
__version__ = "2.4.0"
# Version management using poetry-dynamic-versioning
from ._version import __version__, __version_tuple__
from .util import deprecate_imports
__author__ = "Adrian Sampson <adrian@radbox.org>"
def __getattr__(name: str):
"""Handle deprecated imports."""
return deprecate_imports(
old_module=__name__,
new_module_by_name={
"art": "beetsplug._utils",
"vfs": "beetsplug._utils",
},
name=name,
version="3.0.0",
)
class IncludeLazyConfig(confuse.LazyConfig):
"""A version of Confuse's LazyConfig that also merges in data from
YAML files specified in an `include` setting.
@ -39,3 +55,6 @@ class IncludeLazyConfig(confuse.LazyConfig):
config = IncludeLazyConfig("beets", __name__)
__all__ = ["__version__", "__version_tuple__", "config"]

7
beets/_version.py Normal file
View file

@ -0,0 +1,7 @@
# This file is auto-generated during the build process.
# Do not edit this file directly.
# Placeholders are replaced during substitution.
# Run `git update-index --assume-unchanged beets/_version.py`
# to ignore local changes to this file.
__version__ = "0.0.0"
__version_tuple__ = (0, 0, 0)

View file

@ -0,0 +1,3 @@
from . import art, vfs
__all__ = ["art", "vfs"]

View file

@ -16,17 +16,25 @@
libraries.
"""
from typing import Any, NamedTuple
from __future__ import annotations
from typing import TYPE_CHECKING, NamedTuple
from beets import util
if TYPE_CHECKING:
from beets.library import Library
class Node(NamedTuple):
files: dict[str, Any]
dirs: dict[str, Any]
files: dict[str, int]
# Maps filenames to Item ids.
dirs: dict[str, Node]
# Maps directory names to child nodes.
def _insert(node, path, itemid):
def _insert(node: Node, path: list[str], itemid: int):
"""Insert an item into a virtual filesystem node."""
if len(path) == 1:
# Last component. Insert file.
@ -40,7 +48,7 @@ def _insert(node, path, itemid):
_insert(node.dirs[dirname], rest, itemid)
def libtree(lib):
def libtree(lib: Library) -> Node:
"""Generates a filesystem-like directory tree for the files
contained in `lib`. Filesystem nodes are (files, dirs) named
tuples in which both components are dictionaries. The first

View file

@ -17,10 +17,11 @@
import cProfile
import timeit
from beets import importer, library, plugins, ui, vfs
from beets import importer, library, plugins, ui
from beets.autotag import match
from beets.plugins import BeetsPlugin
from beets.util.functemplate import Template
from beetsplug._utils import vfs
def aunique_benchmark(lib, prof):

View file

@ -30,10 +30,11 @@ from typing import TYPE_CHECKING
import beets
import beets.ui
from beets import dbcore, logging, vfs
from beets import dbcore, logging
from beets.library import Item
from beets.plugins import BeetsPlugin
from beets.util import as_string, bluelet
from beetsplug._utils import vfs
if TYPE_CHECKING:
from beets.dbcore.query import Query

View file

@ -694,12 +694,10 @@ class SpotifyPlugin(
audio_features = self.track_audio_features(spotify_track_id)
if audio_features is None:
self._log.info("No audio features found for: {}", item)
continue
for feature in audio_features.keys():
if feature in self.spotify_audio_features.keys():
item[self.spotify_audio_features[feature]] = audio_features[
feature
]
else:
for feature, value in audio_features.items():
if feature in self.spotify_audio_features:
item[self.spotify_audio_features[feature]] = value
item["spotify_updated"] = time.time()
item.store()
if write:

View file

@ -26,6 +26,8 @@ New features:
Bug fixes:
- :doc:`plugins/spotify` Ensure ``spotifysync`` keeps popularity, ISRC, and
related fields current even when audio features requests fail. :bug:`6061`
- :doc:`plugins/spotify` Fixed an issue where track matching and lookups could
return incorrect or misleading results when using the Spotify plugin. The
problem occurred primarily when no album was provided or when the album field
@ -53,8 +55,13 @@ Other changes:
- Moved ``art.py`` utility module from ``beets`` into ``beetsplug`` namespace as
it is not used in the core beets codebase. It can now be found in
``beetsplug._utils``.
- Moved ``vfs.py`` utility module from ``beets`` into ``beetsplug`` namespace as
it is not used in the core beets codebase. It can now be found in
``beetsplug._utils``.
- :class:`beets.metadata_plugin.MetadataSourcePlugin`: Remove discogs specific
disambiguation stripping.
- When installing ``beets`` via git or locally the version string now reflects
the current git branch and commit hash. :bug:`4448`
For developers and plugin authors:

View file

@ -174,12 +174,6 @@ FILENAME_AND_UPDATE_TEXT: list[tuple[Path, UpdateVersionCallable]] = [
PYPROJECT,
lambda text, new: re.sub(r"(?<=\nversion = )[^\n]+", f'"{new}"', text),
),
(
BASE / "beets" / "__init__.py",
lambda text, new: re.sub(
r"(?<=__version__ = )[^\n]+", f'"{new}"', text
),
),
(CHANGELOG, update_changelog),
(BASE / "docs" / "conf.py", update_docs_config),
]

View file

@ -156,9 +156,18 @@ web = ["flask", "flask-cors"]
[tool.poetry.scripts]
beet = "beets.ui:main"
[tool.poetry-dynamic-versioning]
enable = true
vcs = "git"
format = "{base}.dev{distance}+{commit}"
[tool.poetry-dynamic-versioning.files."beets/_version.py"]
persistent-substitution = true
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning>=1.0.0,<2.0.0"]
build-backend = "poetry_dynamic_versioning.backend"
[tool.pipx-install]
poethepoet = ">=0.26"

View file

@ -14,9 +14,9 @@
"""Tests for the virtual filesystem builder.."""
from beets import vfs
from beets.test import _common
from beets.test.helper import BeetsTestCase
from beetsplug._utils import vfs
class VFSTest(BeetsTestCase):