From 50959bb3165da87ce6a55da59364db52c48d2da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Mon, 2 Feb 2026 03:06:48 +0000 Subject: [PATCH 1/7] Fix rendering generated refs This specifically fixes v2.6.0 changelog: diff --git a/before b/after index dc9a2ecd2..51303c65f 100644 --- a/before +++ b/after @@ -51,3 +51,3 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee -- Added a reusable requests handler which can be used by plugins to make HTTP requests with built-in retry and backoff logic. It uses beets user-agent and configures timeouts. See `~beetsplug._utils.requests.RequestHandler` for documentation. +- Added a reusable requests handler which can be used by plugins to make HTTP requests with built-in retry and backoff logic. It uses beets user-agent and configures timeouts. See [beetsplug.\_utils.requests.RequestHandler](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.requests.RequestHandler.html#beetsplug._utils.requests.RequestHandler) for documentation. @@ -62,3 +62,3 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee - See `~beetsplug._utils.musicbrainz.MusicBrainzAPI` for documentation. + See [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) for documentation. --- extra/release.py | 2 +- test/test_release.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/extra/release.py b/extra/release.py index 0c11415a9..61b4a3a31 100755 --- a/extra/release.py +++ b/extra/release.py @@ -120,7 +120,7 @@ def create_rst_replacements() -> list[Replacement]: # Replace Sphinx directives by documentation URLs, e.g., # :ref:`/plugins/autobpm` -> [AutoBPM Plugin](DOCS/plugins/autobpm.html) ( - r":(?:ref|doc|class|conf):`+(?:([^`<]+)<)?/?([\w.:/_-]+)>?`+", + r":(?:ref|doc|class|conf):`+~?(?:([^`<]+)<)?/?([\w.:/_-]+)>?`+", lambda m: make_ref_link(m[2], m[1]), ), # Convert command references to documentation URLs diff --git a/test/test_release.py b/test/test_release.py index 62b32a714..693aab82a 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -26,6 +26,8 @@ def rst_changelog(): multi-line change. :bug:`5467` - :ref:`list-cmd` Update. +- |BeetsPlugin| Some plugin change. +- See :class:`~beetsplug._utils.musicbrainz.MusicBrainzAPI` for documentation. You can do something with this command: @@ -77,7 +79,9 @@ Bug fixes: def md_changelog(): return r"""### New features +- See [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) for documentation. - [Substitute Plugin](https://beets.readthedocs.io/en/stable/plugins/substitute.html): Some substitute multi-line change. :bug: (#5467) +- [beets.plugins.BeetsPlugin](https://beets.readthedocs.io/en/stable/api/generated/beets.plugins.BeetsPlugin.html#beets.plugins.BeetsPlugin) Some plugin change. - [list](https://beets.readthedocs.io/en/stable/reference/cli.html#list-cmd) Update. You can do something with this command: From 10d8e5fc043c4b1f1cf17cd3582ebf03aa7f5f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Mon, 2 Feb 2026 03:24:23 +0000 Subject: [PATCH 2/7] Sort changelog bullet points case-insensitively MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a case-insensitive sort key when ordering Markdown changelog bullet points to produce stable ordering regardless of capitalization. Diff for the last release: diff --git a/before b/after index 51303c65f..d88eda894 100644 --- a/before +++ b/after @@ -4,3 +4,2 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee -- Added support for Python 3.13. - [Convert Plugin](https://beets.readthedocs.io/en/stable/plugins/convert.html): `force` can be passed to override checks like no_convert, never_convert_lossy_files, same format, and max_bitrate @@ -23,2 +22,3 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee - [Titlecase Plugin](https://beets.readthedocs.io/en/stable/plugins/titlecase.html): Add the [Titlecase Plugin](https://beets.readthedocs.io/en/stable/plugins/titlecase.html) plugin to allow users to resolve differences in metadata source styles. +- Added support for Python 3.13. @@ -26,9 +26,2 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee -- Errors in metadata plugins during autotage process will now be logged but won't crash beets anymore. If you want to raise exceptions instead, set the new configuration option `raise_on_error` to `yes` :bug: (#5903), :bug: (#4789). -- Fix a bug introduced in release 2.4.0 where import from any valid import-log-file always threw a "none of the paths are importable" error. -- Handle potential OSError when unlinking temporary files in ArtResizer. :bug: (#5615) -- Running beet --config \ config -e now edits \ rather than the default config path. :bug: (#5652) -- Sanitize log messages by removing control characters preventing terminal rendering issues. -- When hardlinking from a symlink (e.g. importing a symlink with hardlinking enabled), dereference the symlink then hardlink, rather than creating a new (potentially broken) symlink :bug: (#5676) -- When using [FromFilename Plugin](https://beets.readthedocs.io/en/stable/plugins/fromfilename.html) together with [Edit Plugin](https://beets.readthedocs.io/en/stable/plugins/edit.html), temporary tags extracted from filenames are no longer lost when discarding or cancelling an edit session during import. :bug: (#6104) - [Command-Line Interface](https://beets.readthedocs.io/en/stable/reference/cli.html): Fix 'from_scratch' option for singleton imports: delete all (old) metadata when new metadata is applied. :bug: (#3706) @@ -44,4 +37,11 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee - [Spotify Plugin](https://beets.readthedocs.io/en/stable/plugins/spotify.html): Updated Spotify API credentials. :bug: (#6270) -- [Web Plugin](https://beets.readthedocs.io/en/stable/plugins/web.html): repair broken /item/values/… and /albums/values/… endpoints. Previously, due to single-quotes (ie. string literal) in the SQL query, the query eg. GET /item/values/albumartist would return the literal "albumartist" instead of a list of unique album artists. - [update](https://beets.readthedocs.io/en/stable/reference/cli.html#update-cmd) [Edit Plugin](https://beets.readthedocs.io/en/stable/plugins/edit.html) fix display formatting of field changes to clearly show added and removed flexible fields. +- [Web Plugin](https://beets.readthedocs.io/en/stable/plugins/web.html): repair broken /item/values/… and /albums/values/… endpoints. Previously, due to single-quotes (ie. string literal) in the SQL query, the query eg. GET /item/values/albumartist would return the literal "albumartist" instead of a list of unique album artists. +- Errors in metadata plugins during autotage process will now be logged but won't crash beets anymore. If you want to raise exceptions instead, set the new configuration option `raise_on_error` to `yes` :bug: (#5903), :bug: (#4789). +- Fix a bug introduced in release 2.4.0 where import from any valid import-log-file always threw a "none of the paths are importable" error. +- Handle potential OSError when unlinking temporary files in ArtResizer. :bug: (#5615) +- Running beet --config \ config -e now edits \ rather than the default config path. :bug: (#5652) +- Sanitize log messages by removing control characters preventing terminal rendering issues. +- When hardlinking from a symlink (e.g. importing a symlink with hardlinking enabled), dereference the symlink then hardlink, rather than creating a new (potentially broken) symlink :bug: (#5676) +- When using [FromFilename Plugin](https://beets.readthedocs.io/en/stable/plugins/fromfilename.html) together with [Edit Plugin](https://beets.readthedocs.io/en/stable/plugins/edit.html), temporary tags extracted from filenames are no longer lost when discarding or cancelling an edit session during import. :bug: (#6104) @@ -71,2 +71,4 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee +- [BPD Plugin](https://beets.readthedocs.io/en/stable/plugins/bpd.html): Raise ImportError instead of ValueError when GStreamer is unavailable, enabling `importorskip` usage in pytest setup. +- dbcore: Allow models to declare SQL indices; add an `items.album_id` index to speed up `album.items()` queries. :bug: (#5809) - Finally removed gmusic plugin and all related code/docs as the Google Play Music service was shut down in 2020. @@ -76,3 +78 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee - Updated color documentation with `bright_*` and `bg_bright_*` entries. -- [BPD Plugin](https://beets.readthedocs.io/en/stable/plugins/bpd.html): Raise ImportError instead of ValueError when GStreamer is unavailable, enabling `importorskip` usage in pytest setup. -- dbcore: Allow models to declare SQL indices; add an `items.album_id` index to speed up `album.items()` queries. :bug: (#5809) --- extra/release.py | 2 +- test/test_release.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extra/release.py b/extra/release.py index 61b4a3a31..2bafa90c2 100755 --- a/extra/release.py +++ b/extra/release.py @@ -146,7 +146,7 @@ MD_REPLACEMENTS: list[Replacement] = [ ] order_bullet_points = partial( re.compile(r"(\n- .*?(?=\n(?! *(-|\d\.) )|$))", flags=re.DOTALL).sub, - lambda m: "\n- ".join(sorted(m.group().split("\n- "))), + lambda m: "\n- ".join(sorted(m.group().split("\n- "), key=str.lower)), ) diff --git a/test/test_release.py b/test/test_release.py index 693aab82a..0951a5735 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -79,10 +79,10 @@ Bug fixes: def md_changelog(): return r"""### New features -- See [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) for documentation. -- [Substitute Plugin](https://beets.readthedocs.io/en/stable/plugins/substitute.html): Some substitute multi-line change. :bug: (#5467) - [beets.plugins.BeetsPlugin](https://beets.readthedocs.io/en/stable/api/generated/beets.plugins.BeetsPlugin.html#beets.plugins.BeetsPlugin) Some plugin change. - [list](https://beets.readthedocs.io/en/stable/reference/cli.html#list-cmd) Update. +- [Substitute Plugin](https://beets.readthedocs.io/en/stable/plugins/substitute.html): Some substitute multi-line change. :bug: (#5467) +- See [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) for documentation. You can do something with this command: From 616a674db08ecde2c2c1f4a5af407ebb8ae37bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Sun, 8 Feb 2026 00:49:31 +0000 Subject: [PATCH 3/7] Properly format changelog section headers --- docs/changelog.rst | 442 +++++++++++++++++++++++++++++-------------- extra/release.py | 16 +- test/test_release.py | 29 ++- 3 files changed, 327 insertions(+), 160 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 1aee35778..9ab397d0f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,20 +4,28 @@ Changelog Changelog goes here! Please add your entry to the bottom of one of the lists below! +.. Uncomment the relevant section when you add the first entry + Unreleased ---------- -New features: +.. + New features + ~~~~~~~~~~~~ -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`plugins/musicbrainz`: Fix search terms escaping. :bug:`6347` - :doc:`plugins/musicbrainz`: Fix support for ``alias`` and ``tracks`` :conf:`plugins.musicbrainz:extra_tags`. -For packagers: +.. + For plugin developers + ~~~~~~~~~~~~~~~~~~~~~ -Other changes: +Other changes +~~~~~~~~~~~~~ - :doc:`plugins/lyrics`: Disable ``tekstowo`` by default because it blocks the beets User-Agent. @@ -25,7 +33,8 @@ Other changes: 2.6.1 (February 02, 2026) ------------------------- -Bug fixes: +Bug fixes +~~~~~~~~~ - Make ``packaging`` a required dependency. :bug:`6332` @@ -35,7 +44,8 @@ Bug fixes: Beets now requires Python 3.10 or later since support for EOL Python 3.9 has been dropped. -New features: +New features +~~~~~~~~~~~~ - :doc:`plugins/fetchart`: Added config setting for a fallback cover art image. - :doc:`plugins/ftintitle`: Added argument for custom feat. words in ftintitle. @@ -80,7 +90,8 @@ New features: - :doc:`plugins/random`: Added ``--field`` option to specify which field to use for equal-chance sampling (default: ``albumartist``). -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`/plugins/lastgenre`: Canonicalize genres when ``force`` and ``keep_existing`` are ``on``, yet no genre info on lastfm could be found. @@ -141,7 +152,8 @@ Bug fixes: new configuration option ``raise_on_error`` to ``yes`` :bug:`5903`, :bug:`4789`. -For plugin developers: +For plugin developers +~~~~~~~~~~~~~~~~~~~~~ - A new plugin event, ``album_matched``, is sent when an album that is being imported has been matched to its metadata and the corresponding distance has @@ -162,12 +174,14 @@ For plugin developers: See :class:`~beetsplug._utils.musicbrainz.MusicBrainzAPI` for documentation. -For packagers: +For packagers +~~~~~~~~~~~~~ - The minimum supported Python version is now 3.10. - An unused dependency on ``mock`` has been removed. -Other changes: +Other changes +~~~~~~~~~~~~~ - The documentation chapter :doc:`dev/paths` has been moved to the "For Developers" section and revised to reflect current best practices (pathlib @@ -187,18 +201,21 @@ Other changes: 2.5.1 (October 14, 2025) ------------------------ -New features: +New features +~~~~~~~~~~~~ - :doc:`plugins/zero`: Add new configuration option, ``omit_single_disc``, to allow zeroing the disc number on write for single-disc albums. Defaults to False. -Bug fixes: +Bug fixes +~~~~~~~~~ - |BeetsPlugin|: load the last plugin class defined in the plugin namespace. :bug:`6093` -For packagers: +For packagers +~~~~~~~~~~~~~ - Fixed issue with legacy metadata plugins not copying properties from the base class. @@ -206,7 +223,8 @@ For packagers: version string now reflects the current git branch and commit hash. :bug:`6089` -Other changes: +Other changes +~~~~~~~~~~~~~ - Removed outdated mailing list contact information from the documentation :bug:`5462`. @@ -221,7 +239,8 @@ Other changes: 2.5.0 (October 11, 2025) ------------------------ -New features: +New features +~~~~~~~~~~~~ - :doc:`plugins/lastgenre`: Add a ``--pretend`` option to preview genre changes without storing or writing them. @@ -240,7 +259,8 @@ New features: specify where the variations are written. :bug:`3354` - :doc:`plugins/web` Support for `nexttrack` keyboard press -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`plugins/musicbrainz` Refresh flexible MusicBrainz metadata on reimport so format changes are applied. :bug:`6036` @@ -267,7 +287,8 @@ Bug fixes: :conf:`plugins.index:data_source_mismatch_penalty` to better reflect its purpose. :bug:`6066` -Other changes: +Other changes +~~~~~~~~~~~~~ - :doc:`plugins/index`: Clarify that musicbrainz must be mentioned if plugin list modified :bug:`6020` @@ -281,7 +302,7 @@ Other changes: - 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 +- :class:`beets.metadata_plugins.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` @@ -289,7 +310,8 @@ Other changes: renamed to ``match.distance_weights.data_source`` for consistency with the name of the field it refers to. -For developers and plugin authors: +For developers and plugin authors +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Typing improvements in ``beets/logging.py``: ``getLogger`` now returns ``BeetsLogger`` when called with a name, or ``RootLogger`` when called without @@ -305,7 +327,8 @@ For developers and plugin authors: 2.4.0 (September 13, 2025) -------------------------- -New features: +New features +~~~~~~~~~~~~ - :doc:`plugins/musicbrainz`: The MusicBrainz autotagger has been moved to a separate plugin. The default :ref:`plugins-config` includes ``musicbrainz``, @@ -335,7 +358,8 @@ New features: :conf:`plugins.index:search_limit` to limit the number of results returned by search queries. -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`plugins/musicbrainz`: fix regression where user configured :conf:`plugins.musicbrainz:extra_tags` have been read incorrectly. :bug:`5788` @@ -368,7 +392,8 @@ Bug fixes: - :doc:`/plugins/fromfilename`: Beets will no longer crash if a track's title field is missing. -For packagers: +For packagers +~~~~~~~~~~~~~ - Optional :conf:`plugins.musicbrainz:extra_tags` parameter has been removed from ``BeetsPlugin.candidates`` method signature since it is never passed in. @@ -377,7 +402,8 @@ For packagers: - Loosened ``typing_extensions`` dependency in pyproject.toml to apply to every python version. -For plugin developers: +For plugin developers +~~~~~~~~~~~~~~~~~~~~~ - The ``fetchart`` plugins has seen a few changes to function signatures and source registration in the process of introducing typings to the code. Custom @@ -386,7 +412,7 @@ For plugin developers: 1. |BeetsPlugin| is the base class for all plugins, any plugin needs to inherit from this class. - 2. :class:`beets.metadata_plugin.MetadataSourcePlugin` allows plugins to act + 2. :class:`beets.metadata_plugins.MetadataSourcePlugin` allows plugins to act like metadata sources. E.g. used by the MusicBrainz plugin. All plugins in the beets repo are opted into this class where applicable. If you are maintaining a plugin that acts like a metadata source, i.e. you expose any @@ -422,7 +448,8 @@ For plugin developers: storing the data in the SQL database due to missing type conversion. :bug:`5698` -Other changes: +Other changes +~~~~~~~~~~~~~ - Refactor: Split responsibilities of Plugins into MetaDataPlugins and general Plugins. @@ -449,13 +476,15 @@ Other changes: 2.3.1 (May 14, 2025) -------------------- -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`/reference/pathformat`: Fixed a regression where path legalization incorrectly removed parts of user-configured path formats that followed a dot (**.**). :bug:`5771` -For packagers: +For packagers +~~~~~~~~~~~~~ - Force ``poetry`` version below 2 to avoid it mangling file modification times in ``sdist`` package. :bug:`5770` @@ -466,7 +495,8 @@ For packagers: Beets now requires Python 3.9 or later since support for EOL Python 3.8 has been dropped. -New features: +New features +~~~~~~~~~~~~ - :doc:`plugins/lastgenre`: The new configuration option, ``keep_existing``, provides more fine-grained control over how pre-populated genre tags are @@ -481,7 +511,8 @@ New features: - :doc:`plugins/missing`: Add support for all metadata sources. - :doc:`plugins/mbsync`: Add support for all metadata sorces. -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`plugins/thumbnails`: Fix API call to GIO on big endian architectures (like s390x) in thumbnails plugin. :bug:`5708` @@ -531,13 +562,15 @@ Bug fixes: - :doc:`plugins/parentwork`: Only output parentwork changes when running in verbose mode. -For packagers: +For packagers +~~~~~~~~~~~~~ - The minimum supported Python version is now 3.9. - External plugin developers: ``beetsplug/__init__.py`` file can be removed from your plugin as beets now uses native/implicit namespace package setup. -Other changes: +Other changes +~~~~~~~~~~~~~ - Release workflow: fix the issue where the new release tag is created for the wrong (outdated) commit. Now the tag is created in the same workflow step @@ -553,13 +586,15 @@ Other changes: 2.2.0 (December 02, 2024) ------------------------- -New features: +New features +~~~~~~~~~~~~ - :doc:`/plugins/substitute`: Allow the replacement string to use capture groups from the match. It is thus possible to create more general rules, applying to many different artists at once. -Bug fixes: +Bug fixes +~~~~~~~~~ - Check if running python from the Microsoft Store and provide feedback to install from python.org. :bug:`5467` @@ -569,7 +604,8 @@ Bug fixes: - Bring back test files and the manual to the source distribution tarball. :bug:`5513` -Other changes: +Other changes +~~~~~~~~~~~~~ - Changed ``bitesize`` label to ``good first issue``. Our contribute_ page is now automatically populated with these issues. :bug:`4855` @@ -579,7 +615,8 @@ Other changes: 2.1.0 (November 22, 2024) ------------------------- -New features: +New features +~~~~~~~~~~~~ - New template function added: ``%capitalize``. Converts the first letter of the text to uppercase and the rest to lowercase. @@ -597,7 +634,8 @@ New features: location varies between systems -- for example, users can configure it on Unix systems via ``user-dirs.dirs(5)``. -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`plugins/ftintitle`: The detection of a "feat. X" part in a song title does not produce any false positives caused by words like "and" or "with" @@ -628,13 +666,15 @@ Bug fixes: - Fix the ``TypeError`` when :ref:`set_fields` is provided non-string values. :bug:`4840` -For packagers: +For packagers +~~~~~~~~~~~~~ - The minimum supported Python version is now 3.8. - The ``beet`` script has been removed from the repository. - The ``typing_extensions`` is required for Python 3.10 and below. -Other changes: +Other changes +~~~~~~~~~~~~~ - :doc:`contributing`: The project now uses ``poetry`` for packaging and dependency management. This change affects project management and mostly @@ -672,13 +712,15 @@ Other changes: With this release, beets now requires Python 3.7 or later (it removes support for Python 3.6). -Major new features: +Major new features +~~~~~~~~~~~~~~~~~~ - The beets importer UI received a major overhaul. Several new configuration options are available for customizing layout and colors: :ref:`ui_options`. :bug:`3721` :bug:`5028` -New features: +New features +~~~~~~~~~~~~ - :doc:`/plugins/edit`: Prefer editor from ``VISUAL`` environment variable over ``EDITOR``. @@ -816,7 +858,8 @@ New features: - :doc:`/plugins/fetchart`: Defer source removal config option evaluation to the point where they are used really, supporting temporary config changes. -Bug fixes: +Bug fixes +~~~~~~~~~ - Improve ListenBrainz error handling. :bug:`5459` - :doc:`/plugins/deezer`: Improve requests error handling. @@ -943,7 +986,8 @@ Bug fixes: - :doc:`/plugins/convert`: Fix attempt to convert and perform side-effects if library file is not readable. -For plugin developers: +For plugin developers +~~~~~~~~~~~~~~~~~~~~~ - beets now explicitly prevents multiple plugins to define replacement functions for the same field. When previously defining ``template_fields`` for the same @@ -955,13 +999,15 @@ For plugin developers: for Mopidy), if they need to create an in-memory instance of a beets music library for their tests. -For packagers: +For packagers +~~~~~~~~~~~~~ - As noted above, the minimum Python version is now 3.7. - We fixed a version for the dependency on the Confuse_ library. :bug:`4167` - The minimum required version of :pypi:`mediafile` is now 0.9.0. -Other changes: +Other changes +~~~~~~~~~~~~~ - Add ``sphinx`` and ``sphinx_rtd_theme`` as dependencies for a new ``docs`` extra :bug:`4643` @@ -990,7 +1036,8 @@ for Python 2.7, 3.4, and 3.5). There are also a few other dependency changes---if you're a maintainer of a beets package for a package manager, thank you for your ongoing efforts, and please see the list of notes below. -Major new features: +Major new features +~~~~~~~~~~~~~~~~~~ - When fetching genres from MusicBrainz, we now include genres from the release group (in addition to the release). We also prioritize genres based on the @@ -1004,7 +1051,8 @@ Major new features: now do ``beet modify title='$track $title'`` to put track numbers into songs' titles. :bug:`488` -Other new things: +Other new things +~~~~~~~~~~~~~~~~ - :doc:`/plugins/permissions`: The plugin now sets cover art permissions to match the audio file permissions. @@ -1028,7 +1076,8 @@ Other new things: - Support flexible attributes in ``%aunique``. :bug:`2678` :bug:`3553` - Make ``%aunique`` faster, especially when using inline fields. :bug:`4145` -Bug fixes: +Bug fixes +~~~~~~~~~ - :doc:`/plugins/lyrics`: Fix a crash when Beautiful Soup is not installed. :bug:`4027` @@ -1039,7 +1088,8 @@ Bug fixes: - :doc:`/plugins/aura`: Fix a potential security hole when serving image files. :bug:`4160` -For plugin developers: +For plugin developers +~~~~~~~~~~~~~~~~~~~~~ - :py:meth:`beets.library.Item.destination` now accepts a ``replacements`` argument to be used in favor of the default. @@ -1048,7 +1098,8 @@ For plugin developers: - A new plugin event, ``album_removed``, is called when an album is removed from the library (even when its file is not deleted from disk). -Here are some notes for packagers: +Here are some notes for packagers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - As noted above, the minimum Python version is now 3.6. - We fixed a flaky test, named ``test_album_art`` in the ``test_zero.py`` file, @@ -1074,7 +1125,8 @@ from freenode to Libera.Chat_. .. _libera.chat: https://libera.chat/ -Major new features: +Major new features +~~~~~~~~~~~~~~~~~~ - Fields in queries now fall back to an item's album and check its fields too. Notably, this allows querying items by an album's attribute: in other words, @@ -1115,7 +1167,8 @@ Major new features: no`` in your configuration file to enable modification via the API. :bug:`3870` -Other new things: +Other new things +~~~~~~~~~~~~~~~~ - ``beet remove`` now also allows interactive selection of items from the query, similar to ``beet modify``. @@ -1242,7 +1295,8 @@ Other new things: library folder cannot be found, preventing the user from accidentally wiping out their beets database. Thanks to user: ``logan-arens``. :bug:`1934` -Fixes: +Fixes +~~~~~ - Adapt to breaking changes in Python's ``ast`` module in Python 3.8. - :doc:`/plugins/beatport`: Fix the assignment of the ``genre`` field, and @@ -1373,7 +1427,8 @@ Fixes: ``auth`` configuration option is required in the configuration to specify the flavor of authentication to use. :bug:`4002` -For plugin developers: +For plugin developers +~~~~~~~~~~~~~~~~~~~~~ - MediaFile_ has been split into a standalone project. Where you used to do ``from beets import mediafile``, now just do ``import mediafile``. Beets @@ -1412,7 +1467,8 @@ For plugin developers: - Two new events, ``mb_album_extract`` and ``mb_track_extract``, let plugins add new fields based on MusicBrainz data. Thanks to :user:`dosoe`. -For packagers: +For packagers +~~~~~~~~~~~~~ - Beets' library for manipulating media file metadata has now been split to a standalone project called MediaFile_, released as :pypi:`mediafile`. Beets now @@ -1457,12 +1513,14 @@ This small update is part of our attempt to release new versions more often! There are a few important fixes, and we're clearing the deck for a change to beets' dependencies in the next version. -The new feature is: +The new feature is +~~~~~~~~~~~~~~~~~~ - You can use the NO_COLOR_ environment variable to disable terminal colors. :bug:`3273` -There are some fixes in this release: +There are some fixes in this release +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Fix a regression in the last release that made the image resizer fail to detect older versions of ImageMagick. :bug:`3269` @@ -1472,7 +1530,8 @@ There are some fixes in this release: ``gmusicapi`` module. :bug:`3270` - Fix an incompatibility with Python 3.8's AST changes. :bug:`3278` -Here's a note for packagers: +Here's a note for packagers +~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``pathlib`` is now an optional test dependency on Python 3.4+, removing the need for `Debian pathlib patch`_ :bug:`3275` @@ -1490,7 +1549,8 @@ also some crucial maintenance changes. We officially support Python 3.7 and 3.8, and some performance optimizations can (anecdotally) make listing your library more than three times faster than in the previous version. -The new core features are: +The new core features are +~~~~~~~~~~~~~~~~~~~~~~~~~ - A new :ref:`config-aunique` configuration option allows setting default options for the :ref:`aunique` template function. @@ -1503,7 +1563,8 @@ The new core features are: - A new importer option, :ref:`ignore_data_tracks`, lets you skip audio tracks contained in data files. :bug:`3021` -There are some new plugins: +There are some new plugins +~~~~~~~~~~~~~~~~~~~~~~~~~~ - The :doc:`/plugins/playlist` can query the beets library using M3U playlists. Thanks to :user:`Holzhaus` and :user:`Xenopathic`. :bug:`123` :bug:`3145` @@ -1513,7 +1574,8 @@ There are some new plugins: - The :doc:`/plugins/subsonicupdate` can automatically update your Subsonic library. Thanks to :user:`maffo999`. :bug:`3001` -And many improvements to existing plugins: +And many improvements to existing plugins +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/lastgenre`: Added option ``-A`` to match individual tracks and singletons. :bug:`3220` :bug:`3219` @@ -1580,7 +1642,8 @@ And many improvements to existing plugins: .. _google groups: https://groups.google.com/forum/#!searchin/beets-users/mbsync|sort:date/beets-users/iwCF6bNdh9A/i1xl4Gx8BQAJ -Some improvements have been focused on improving beets' performance: +Some improvements have been focused on improving beets' performance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Querying the library is now faster: @@ -1600,7 +1663,8 @@ Some improvements have been focused on improving beets' performance: ``playlist`` to get the current song, improving performance when the playlist is long. Thanks to :user:`ray66`. :bug:`3207` :bug:`2752` -Several improvements are related to usability: +Several improvements are related to usability +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The disambiguation string for identifying albums in the importer now shows the catalog number. Thanks to :user:`8h2a`. :bug:`2951` @@ -1616,7 +1680,8 @@ Several improvements are related to usability: - Fixed a confusing typo when the :doc:`/plugins/convert` plugin copies the art covers. :bug:`3063` -Many fixes have been focused on issues where beets would previously crash: +Many fixes have been focused on issues where beets would previously crash +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Avoid a crash when archive extraction fails during import. :bug:`3041` - Missing album art file during an update no longer causes a fatal exception @@ -1666,7 +1731,8 @@ addressing changes interfaces: - Fix a problem when resizing images with :pypi:`PIL`/:pypi:`pillow` on Python 3. Thanks to :user:`architek`. :bug:`2504` :bug:`3029` -And there are many other fixes: +And there are many other fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - R128 normalization tags are now properly deleted from files when the values are missing. Thanks to :user:`autrimpo`. :bug:`2757` @@ -1696,14 +1762,16 @@ And there are many other fixes: ``magick`` executable when it is available. Thanks to :user:`ababyduck`. :bug:`2093` :bug:`3236` -There is one new thing for plugin developers to know about: +There is one new thing for plugin developers to know about +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - In addition to prefix-based field queries, plugins can now define *named queries* that are not associated with any specific field. For example, the new :doc:`/plugins/playlist` supports queries like ``playlist:name`` although there is no field named ``playlist``. See :ref:`extend-query` for details. -And some messages for packagers: +And some messages for packagers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Note the changes to the dependencies on :pypi:`jellyfish` and :pypi:`munkres`. - The optional :pypi:`python-itunes` dependency has been removed. @@ -1722,7 +1790,8 @@ non-audio tracks listed in metadata sources like MusicBrainz: - A new importer option, :ref:`ignored_media`, can let you skip certain media formats. :bug:`2688` -There are other subtle improvements to metadata handling in the importer: +There are other subtle improvements to metadata handling in the importer +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - In the MusicBrainz backend, beets now imports the ``musicbrainz_releasetrackid`` field. This is a first step toward :bug:`406`. @@ -1730,7 +1799,8 @@ There are other subtle improvements to metadata handling in the importer: - A new importer configuration option, :ref:`artist_credit`, will tell beets to prefer the artist credit over the artist when autotagging. :bug:`1249` -And there are even more new features: +And there are even more new features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/replaygain`: The ``beet replaygain`` command now has ``--force``, ``--write`` and ``--nowrite`` options. :bug:`2778` @@ -1754,7 +1824,8 @@ And there are even more new features: - :doc:`/plugins/discogs`: Fetch the original year from master releases. :bug:`1122` -There are lots and lots of fixes: +There are lots and lots of fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/replaygain`: Fix a corner-case with the ``bs1770gain`` backend where ReplayGain values were assigned to the wrong files. The plugin now @@ -1824,7 +1895,8 @@ There are lots and lots of fixes: - :doc:`/plugins/mbsync`: We can now successfully update albums even when the first track has a missing MusicBrainz recording ID. :bug:`2920` -There are a couple of changes for developers: +There are a couple of changes for developers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Plugins can now run their import stages *early*, before other plugins. Use the ``early_import_stages`` list instead of plain ``import_stages`` to request @@ -1841,7 +1913,8 @@ importer to add new tracks to an existing album you already have in your library. This way, you no longer need to resort to removing the partial album from your library, combining the files manually, and importing again. -Here are the larger new features in this release: +Here are the larger new features in this release +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - When the importer finds duplicate albums, you can now merge all the tracks---old and new---together and try importing them as a single, combined @@ -1855,7 +1928,8 @@ Here are the larger new features in this release: keeps the new data it gets from the remote metadata source. Thanks to :user:`tummychow`. :bug:`934` :bug:`2755` -There are also somewhat littler, but still great, new features: +There are also somewhat littler, but still great, new features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/convert`: A new ``no_convert`` option lets you skip transcoding items matching a query. Instead, the files are just copied as-is. Thanks to @@ -1874,7 +1948,8 @@ There are also somewhat littler, but still great, new features: - :doc:`/plugins/acousticbrainz`: The plugin can now be configured to write only a specific list of tags. Thanks to :user:`woparry`. -There are lots and lots of bug fixes: +There are lots and lots of bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/hook`: Fixed a problem where accessing non-string properties of ``item`` or ``album`` (e.g., ``item.track``) would cause a crash. Thanks to @@ -1927,7 +2002,8 @@ There are lots and lots of bug fixes: :doc:`/plugins/fetchart` and :doc:`/plugins/embedart`. Thanks to :user:`sekjun9878`. :bug:`2729` -There are some changes for developers: +There are some changes for developers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - "Fixed fields" in Album and Item objects are now more strict about translating missing values into type-specific null-like values. This should help in cases @@ -1946,7 +2022,8 @@ can now manually set fields on the new music. Date queries have gotten much more powerful: you can write precise queries down to the second, and we now have *relative* queries like ``-1w``, which means *one week ago*. -Here are the new features: +Here are the new features +~~~~~~~~~~~~~~~~~~~~~~~~~ - You can now set fields to certain values during :ref:`import-cmd`, using either a ``--set field=value`` command-line flag or a new :ref:`set_fields` @@ -1968,7 +2045,8 @@ Here are the new features: to an external location without changing their paths in the library database. Thanks to :user:`SpirosChadoulos`. :bug:`435` :bug:`2510` -There are also some bug fixes: +There are also some bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/lastgenre`: Fix a crash when using the ``prefer_specific`` and ``canonical`` options together. Thanks to :user:`yacoob`. :bug:`2459` @@ -1986,7 +2064,8 @@ There are also some bug fixes: This release built up a longer-than-normal list of nifty new features. We now support DSF audio files and the importer can hard-link your files, for example. -Here's a full list of new features: +Here's a full list of new features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added support for DSF files, once a future version of Mutagen is released that supports them. Thanks to :user:`docbobo`. :bug:`459` :bug:`2379` @@ -2040,7 +2119,8 @@ Here's a full list of new features: further inputs. This bug mainly affected :doc:`/plugins/convert`. Thanks to :user:`jansol`. :bug:`2488` :bug:`2524` -There are also quite a few fixes: +There are also quite a few fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - In the :ref:`replace` configuration option, we now replace a leading hyphen (-) with an underscore. :bug:`549` :bug:`2509` @@ -2089,7 +2169,8 @@ There are also quite a few fixes: - Fix a crash when reading non-ASCII characters in configuration files on Windows under Python 3. :bug:`2456` :bug:`2565` :bug:`2566` -We removed backends from two metadata plugins because of bitrot: +We removed backends from two metadata plugins because of bitrot +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/lyrics`: The Lyrics.com backend has been removed. (It stopped working because of changes to the site's URL structure.) :bug:`2548` @@ -2111,7 +2192,8 @@ music---for example, you might generate a random playlist that lasts the perfect length for your walk to work. We also access as many Web services as possible over secure connections now---HTTPS everywhere! -The most visible new features are: +The most visible new features are +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - We now support the composer, lyricist, and arranger tags. The MusicBrainz data source will fetch data for these fields when the next version of @@ -2130,7 +2212,8 @@ The most visible new features are: playlist that takes a given amount of time. Thanks to :user:`diomekes`. :bug:`2305` :bug:`2322` -Some smaller new features: +Some smaller new features +~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/zero`: A new ``zero`` command manually triggers the zero plugin. Thanks to :user:`SJoshBrown`. :bug:`2274` :bug:`2329` @@ -2140,7 +2223,8 @@ Some smaller new features: - :doc:`/plugins/bpm`: The ``import.write`` configuration option now decides whether or not to write tracks after updating their BPM. :bug:`1992` -And the fixes: +And the fixes +~~~~~~~~~~~~~ - :doc:`/plugins/bpd`: Fix a crash on non-ASCII MPD commands. :bug:`2332` - :doc:`/plugins/scrub`: Avoid a crash when files cannot be read or written. @@ -2161,10 +2245,13 @@ And the fixes: - :doc:`/plugins/play`: The misspelled configuration option ``warning_treshold`` is no longer supported. -For plugin developers: when providing new importer prompt choices (see -:ref:`append_prompt_choices`), you can now provide new candidates for the user -to consider. For example, you might provide an alternative strategy for picking -between the available alternatives or for looking up a release on MusicBrainz. +For plugin developers +~~~~~~~~~~~~~~~~~~~~~ + +- :ref:`append_prompt_choices`: When providing new importer prompt choices, you + can now provide new candidates for the user to consider. For example, you + might provide an alternative strategy for picking between the available + alternatives or for looking up a release on MusicBrainz. 1.4.2 (December 16, 2016) ------------------------- @@ -2175,7 +2262,8 @@ lurk, but we've deemed things safe enough for broad adoption. If you can, please install beets with ``pip3`` instead of ``pip2`` this time and let us know how it goes! -Here are the fixes: +Here are the fixes +~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/badfiles`: Fix a crash on non-ASCII filenames. :bug:`2299` - The ``%asciify{}`` path formatting function and the :ref:`asciify-paths` @@ -2200,7 +2288,8 @@ bugs, so it may replace all your music with Limp Bizkit---but if you're brave and you have backups, please try installing on Python 3. Let us know how it goes. -If you package beets for distribution, here's what you'll want to know: +If you package beets for distribution, here's what you'll want to know +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - This version of beets now depends on the six_ library. - We also bumped our minimum required version of Mutagen_ to 1.33 (from 1.27). @@ -2219,7 +2308,8 @@ configuration that you may need to know about: - The deprecated ``list_format_album`` and ``list_format_item`` configuration options have been removed (see :ref:`format_album` and :ref:`format_item`). -The are a few new features: +The are a few new features +~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/mpdupdate`, :doc:`/plugins/mpdstats`: When the ``host`` option is not set, these plugins will now look for the ``$MPD_HOST`` environment @@ -2236,7 +2326,8 @@ The are a few new features: - The :ref:`update-cmd` command takes a new ``-F`` flag to specify the fields to update. Thanks to :user:`dangmai`. :bug:`2229` :bug:`2231` -And there are a few bug fixes too: +And there are a few bug fixes too +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/convert`: The plugin no longer asks for confirmation if the query did not return anything to convert. :bug:`2260` :bug:`2262` @@ -2295,7 +2386,8 @@ appeared in the last version. But it also features the triumphant return of the It's also the first version where beets passes all its tests on Windows! May this herald a new age of cross-platform reliability for beets. -New features: +New features +~~~~~~~~~~~~ - :doc:`/plugins/beatport`: This metadata source plugin has arisen from the dead! It now works with Beatport's new OAuth-based API. Thanks to @@ -2307,7 +2399,8 @@ New features: - A new :ref:`duplicate_action` importer config option controls how duplicate albums or tracks treated in import task. :bug:`185` -Some fixes for Windows: +Some fixes for Windows +~~~~~~~~~~~~~~~~~~~~~~ - Queries are now detected as paths when they contain backslashes (in addition to forward slashes). This only applies on Windows. @@ -2316,7 +2409,8 @@ Some fixes for Windows: - :doc:`/plugins/fetchart`: The plugin should work more reliably with non-ASCII paths. -And other fixes: +And other fixes +~~~~~~~~~~~~~~~ - :doc:`/plugins/replaygain`: The ``bs1770gain`` backend now correctly calculates sample peak instead of true peak. This comes with a major speed @@ -2350,7 +2444,8 @@ instead. .. _shutting down: https://developer.spotify.com/news-stories/2016/03/29/api-improvements-update/ -Some of the larger new features: +Some of the larger new features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The new :doc:`/plugins/hook` lets you execute commands in response to beets events. @@ -2361,7 +2456,8 @@ Some of the larger new features: :user:`Kraymer`. - :doc:`/plugins/fetchart`: Album art can now be fetched from fanart.tv_. -Smaller new things: +Smaller new things +~~~~~~~~~~~~~~~~~~ - There are two new functions available in templates: ``%first`` and ``%ifdef``. See :ref:`template-functions`. @@ -2387,7 +2483,8 @@ Smaller new things: .. _fanart.tv: https://fanart.tv/ -Fixes: +Fixes +~~~~~ - Fix a problem with the :ref:`stats-cmd` command in exact mode when filenames on Windows use non-ASCII characters. :bug:`1891` @@ -2430,7 +2527,8 @@ the import process (via the :doc:`/plugins/edit`). Also, as of this release, the beets project has some new Internet homes! Our new domain name is beets.io_, and we have a shiny new GitHub organization: beetbox_. -Here are the big new features: +Here are the big new features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - A new :doc:`/plugins/acousticbrainz` fetches acoustic-analysis information from the AcousticBrainz_ project. Thanks to :user:`opatel99`, and thanks to @@ -2450,7 +2548,8 @@ Here are the big new features: stages, so please send feedback if you find anything missing. :bug:`1846` :bug:`396` -There are even more new features: +There are even more new features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/fetchart`: The Google Images backend has been restored. It now requires an API key from Google. Thanks to :user:`lcharlick`. :bug:`1778` @@ -2469,7 +2568,8 @@ There are even more new features: .. _google code-in: https://codein.withgoogle.com/ -Fixes: +Fixes +~~~~~ - :doc:`/plugins/play`: Fix a regression in the last version where there was no default command. :bug:`1793` @@ -2509,7 +2609,8 @@ This version also adds an oft-requested "not" operator to beets' queries, so you can exclude music from any operation. It also brings friendlier formatting (and querying!) of song durations. -The big new stuff: +The big new stuff +~~~~~~~~~~~~~~~~~ - A new :doc:`/plugins/edit` lets you manually edit your music's metadata using your favorite text editor. :bug:`164` :bug:`1706` @@ -2525,7 +2626,8 @@ The big new stuff: and 30 seconds. You can turn off this new behavior using the ``format_raw_length`` configuration option. :bug:`1749` -Smaller changes: +Smaller changes +~~~~~~~~~~~~~~~ - Three commands, ``modify``, ``update``, and ``mbsync``, would previously move files by default after changing their metadata. Now, these commands will only @@ -2543,7 +2645,8 @@ Smaller changes: option for customizing how items are displayed, just like the built-in ``list`` command. :bug:`1737` -Some changes for developers: +Some changes for developers +~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Two new :ref:`plugin hooks `, ``albuminfo_received`` and ``trackinfo_received``, let plugins intercept metadata as soon as it is @@ -2551,7 +2654,8 @@ Some changes for developers: - Plugins can now add options to the interactive importer prompts. See :ref:`append_prompt_choices`. :bug:`1758` -Fixes: +Fixes +~~~~~ - :doc:`/plugins/plexupdate`: Fix a crash when Plex libraries use non-ASCII collection names. :bug:`1649` @@ -2623,7 +2727,8 @@ lyrics. The larger features are: alternative to the (default) "blacklist" mode. Thanks to :user:`adkow`. :bug:`1621` :bug:`1641` -And there are smaller new features too: +And there are smaller new features too +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Add new color aliases for standard terminal color names (e.g., cyan and magenta). Thanks to :user:`mathstuf`. :bug:`1548` @@ -2641,7 +2746,8 @@ And there are smaller new features too: which Plex library to update. :bug:`1572` :bug:`1595` - A new ``include`` option lets you import external configuration files. -This release has plenty of fixes: +This release has plenty of fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/lastgenre`: Fix a bug that prevented tag popularity from being considered. Thanks to :user:`svoos`. :bug:`1559` @@ -2678,7 +2784,8 @@ This release has plenty of fixes: This is mainly a bugfix release, but we also have a nifty new plugin for ipfs_ and a bunch of new configuration options. -The new features: +The new features +~~~~~~~~~~~~~~~~ - A new :doc:`/plugins/ipfs` lets you share music via a new, global, decentralized filesystem. :bug:`1397` @@ -2700,7 +2807,8 @@ The new features: - :doc:`/plugins/plexupdate`: A new ``token`` configuration option lets you specify a key for Plex Home setups. Thanks to :user:`edcarroll`. :bug:`1494` -Fixes: +Fixes +~~~~~ - :doc:`/plugins/fetchart`: Complain when the ``enforce_ratio`` or ``min_width`` options are enabled but no local imaging backend is available to carry them @@ -2791,7 +2899,8 @@ Packagers should also note a new dependency in this version: the Jellyfish_ Python library makes our text comparisons (a big part of the auto-tagging process) go much faster. -New features: +New features +~~~~~~~~~~~~ - Queries can now use **"or" logic**: if you use a comma to separate parts of a query, items and albums will match *either* side of the comma. For example, @@ -2813,7 +2922,8 @@ New features: width in pixels and the ``enforce_ratio`` option requires that images be square. :bug:`1394` -Little fixes and improvements: +Little fixes and improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/fetchart`: Remove a hard size limit when fetching from the Cover Art Archive. @@ -2856,7 +2966,8 @@ There's one big change with this release: **Python 2.6 is no longer supported**. You'll need Python 2.7. Please trust us when we say this let us remove a surprising number of ugly hacks throughout the code. -Major new features and bigger changes: +Major new features and bigger changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - There are now **multiple levels of output verbosity**. On the command line, you can make beets somewhat verbose with ``-v`` or very verbose with ``-vv``. @@ -2889,7 +3000,8 @@ Major new features and bigger changes: Sensitive information like passwords and API keys is not included. The new ``--clear`` option disables redaction. :bug:`1376` -You should probably also know about these core changes to the way beets works: +You should probably also know about these core changes to the way beets works +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - As mentioned above, Python 2.6 is no longer supported. - The ``tracktotal`` attribute is now a *track-level field* instead of an @@ -2917,7 +3029,8 @@ You should probably also know about these core changes to the way beets works: targeted by the query exists. Previously, just having a slash somewhere in the query was enough, so ``beet ls AC/DC`` wouldn't work to refer to the artist. -There are also lots of medium-sized features in this update: +There are also lots of medium-sized features in this update +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/duplicates`: The command has a new ``--strict`` option that will only report duplicates if all attributes are explicitly set. :bug:`1000` @@ -2949,7 +3062,8 @@ There are also lots of medium-sized features in this update: - :doc:`/plugins/ftintitle`: You can now configure the format that the plugin uses to add the artist to the title. Thanks to :user:`amishb`. :bug:`1377` -And many little fixes and improvements: +And many little fixes and improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/replaygain`: Stop applying replaygain directly to source files when using the mp3gain backend. :bug:`1316` @@ -3010,7 +3124,8 @@ And many little fixes and improvements: ``splupdate`` command can now also add a URL-encodable prefix to every path in the playlist file. -For developers: +For developers +~~~~~~~~~~~~~~ - The ``database_change`` event now sends the item or album that is subject to a change. @@ -3046,7 +3161,8 @@ Also, as an advance warning, this will be one of the last releases to support Python 2.6. If you have a system that cannot run Python 2.7, please consider upgrading soon. -The new features are: +The new features are +~~~~~~~~~~~~~~~~~~~~ - A new :doc:`/plugins/permissions` makes it easy to fix permissions on music files as they are imported. Thanks to :user:`xsteadfastx`. :bug:`1098` @@ -3066,7 +3182,8 @@ The new features are: when it has syntax errors. :bug:`1123` :bug:`1128` - :doc:`/plugins/lyrics`: Added a new ``force`` config option. :bug:`1150` -As usual, there are loads of little fixes and improvements: +As usual, there are loads of little fixes and improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Fix a new crash with the latest version of Mutagen (1.26). - :doc:`/plugins/lyrics`: Avoid fetching truncated lyrics from the Google backed @@ -3123,7 +3240,8 @@ last, imports can now create symbolic links to music files instead of copying or moving them. We also gained the ability to search for album art on the iTunes Store and a new way to compute ReplayGain levels. -The major new features are: +The major new features are +~~~~~~~~~~~~~~~~~~~~~~~~~~ - A new :doc:`/plugins/lastimport` lets you download your play count data from Last.fm into a flexible attribute. Thanks to Rafael Bodill. @@ -3144,7 +3262,8 @@ The major new features are: - :doc:`/plugins/ftintitle`: The plugin now runs automatically on import. To disable this, unset the ``auto`` config flag. -There are also core improvements and other substantial additions: +There are also core improvements and other substantial additions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The ``media`` attribute is now a *track-level field* instead of an album-level one. This field stores the delivery mechanism for the music, so in its @@ -3163,7 +3282,8 @@ There are also core improvements and other substantial additions: requires a Discogs account due to new API restrictions. Thanks to :user:`multikatt`. :bug:`1027`, :bug:`1040` -And countless little improvements and fixes: +And countless little improvements and fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Standard cover art in APEv2 metadata is now supported. Thanks to Matthias Kiefer. :bug:`1042` @@ -3242,7 +3362,8 @@ One upgrade note: if you use the :doc:`/plugins/discogs`, you will need to upgrade the Discogs client library to use this version. Just type ``pip install -U discogs-client``. -Other new features: +Other new features +~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/info`: Target files can now be specified through library queries (in addition to filenames). The ``--library`` option prints library @@ -3255,7 +3376,8 @@ Other new features: - :doc:`/plugins/convert`: A new ``--yes`` command-line flag skips the confirmation. -Still more fixes and little improvements: +Still more fixes and little improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Invalid state files don't crash the importer. - :doc:`/plugins/lyrics`: Only strip featured artists and parenthesized title @@ -3308,7 +3430,8 @@ measure a song's tempo by tapping out the beat on your keyboard. The importer deals more elegantly with duplicates and you can broaden your cover art search to the entire web with Google Image Search. -The big new features are: +The big new features are +~~~~~~~~~~~~~~~~~~~~~~~~ - Support for AIFF files. Tags are stored as ID3 frames in one of the file's IFF chunks. Thanks to Evan Purkhiser for contributing support to Mutagen_. @@ -3332,7 +3455,8 @@ The big new features are: .. _spotify: https://www.spotify.com/ -And the multitude of little improvements and fixes: +And the multitude of little improvements and fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Compatibility with the latest version of Mutagen_, 1.23. - :doc:`/plugins/web`: Lyrics now display readably with correct line breaks. @@ -3406,7 +3530,8 @@ playing music in desktop players and another for organizing your directories into "buckets." It also brings huge performance optimizations to queries---your ``beet ls`` commands will now go much faster. -New features: +New features +~~~~~~~~~~~~ - The new :doc:`/plugins/play` lets you start your desktop music player with the songs that match a query. Thanks to David Hamp-Gonsalves. @@ -3417,7 +3542,8 @@ New features: - :doc:`/plugins/ftintitle`: A new option lets you remove featured artists entirely instead of moving them to the title. Thanks to SUTJael. -And those all-important bug fixes: +And those all-important bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/mbsync`: Fix a regression in 1.3.5 that broke the plugin entirely. @@ -3452,7 +3578,8 @@ directly from compressed archives, and the lyrics plugin is more robust. One note for upgraders and packagers: this version of beets has a new dependency in enum34_, which is a backport of the new enum_ standard library module. -The major new features are: +The major new features are +~~~~~~~~~~~~~~~~~~~~~~~~~~ - Beets can now import ``zip``, ``tar``, and ``rar`` archives. Just type ``beet import music.zip`` to have beets transparently extract the files to import. @@ -3475,7 +3602,8 @@ in this release: - A new :doc:`/plugins/keyfinder` runs a command-line tool to get the key from audio data and store it in the ``initial_key`` field. -There are also many bug fixes and little enhancements: +There are also many bug fixes and little enhancements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``echonest`` plugin: Truncate files larger than 50MB before uploading for analysis. @@ -3515,7 +3643,8 @@ autotagger's matching logic. One note for upgraders: if you use the :doc:`/plugins/fetchart`, it has a new dependency, the requests_ module. -New stuff: +New stuff +~~~~~~~~~ - Added a :ref:`config-cmd` command to manage your configuration. It can show you what you currently have in your config file, point you at where the file @@ -3548,7 +3677,8 @@ New stuff: - The :ref:`import-cmd` command can now accept individual files as arguments even in non-singleton mode. Files are imported as one-track albums. -Fixes: +Fixes +~~~~~ - Error messages involving paths no longer escape non-ASCII characters (for legibility). @@ -3609,7 +3739,8 @@ provide *uniform access* across fixed, flexible, and computed attributes. You can write ``item.foo`` to access the ``foo`` field without worrying about where the data comes from. -Unrelated new stuff: +Unrelated new stuff +~~~~~~~~~~~~~~~~~~~ - The importer has a new interactive option (*G* for "Group albums"), command-line flag (``--group-albums``), and config option @@ -3626,7 +3757,8 @@ Unrelated new stuff: this plugin, you will need to update your configuration. Thanks to BrainDamage. -Other little fixes: +Other little fixes +~~~~~~~~~~~~~~~~~~ - ``echonest`` plugin: Tempo (BPM) is now always stored as an integer. Thanks to Heinz Wiesinger. @@ -3689,7 +3821,8 @@ The "core" of beets gained a new built-in command: :ref:`beet write ` updates the metadata tags for files, bringing them back into sync with your database. Thanks to Heinz Wiesinger. -We added some plugins and overhauled some existing ones: +We added some plugins and overhauled some existing ones +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The new ``echonest`` plugin plugin can fetch a wide range of `acoustic attributes`_ from `The Echo Nest`_, including the "speechiness" and "liveness" @@ -3715,7 +3848,8 @@ We added some plugins and overhauled some existing ones: - :doc:`/plugins/lyrics`: A new ``--force`` option optionally re-downloads lyrics even when files already have them. Thanks to Bitdemon. -As usual, there are also innumerable little fixes and improvements: +As usual, there are also innumerable little fixes and improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - When writing ID3 tags for ReplayGain normalization, tags are written with both upper-case and lower-case TXXX frame descriptions. Previous versions of beets @@ -3762,7 +3896,8 @@ transcoding to any format, and two new plugins: one that guesses metadata for "blank" files based on their filenames and one that moves featured artists into the title field. -Here's the new stuff: +Here's the new stuff +~~~~~~~~~~~~~~~~~~~~ - Add Opus_ audio support. Thanks to Rowan Lewis. - :doc:`/plugins/convert`: You can now transcode files to any audio format, @@ -3781,7 +3916,8 @@ Here's the new stuff: older ID3v2.3 metadata standard. Use this if you want your tags to be visible to Windows and some older players. -And some fixes: +And some fixes +~~~~~~~~~~~~~~ - :doc:`/plugins/fetchart`: Better error message when the image file has an unrecognized type. @@ -3868,7 +4004,8 @@ This is a bugfix release. We're in the midst of preparing for a large change in beets 1.3, so 1.2.2 resolves some issues that came up over the last few weeks. Stay tuned! -The improvements in this release are: +The improvements in this release are +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - A new plugin event, ``item_moved``, is sent when files are moved on disk. Thanks to dsedivec. @@ -3917,7 +4054,8 @@ customize the way that matches are selected: component. The recommendation will be downgraded if a non-zero penalty is being applied to the specified field. -And some little enhancements and bug fixes: +And some little enhancements and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Multi-disc directory names can now contain "disk" (in addition to "disc"). Thanks to John Hawthorn. @@ -3962,7 +4100,8 @@ common problems, both by Pedro Silva: - New :doc:`/plugins/missing`: Find albums in your library that are **missing tracks**. -There are also three more big features added to beets core: +There are also three more big features added to beets core +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Your library now keeps track of **when music was added** to it. The new ``added`` field is a timestamp reflecting when each item and album was @@ -3975,7 +4114,8 @@ There are also three more big features added to beets core: - **ALAC files** are now marked as ALAC instead of being conflated with AAC audio. Thanks to Simon Luijk. -In addition, the importer saw various UI enhancements, thanks to Tai Lee: +In addition, the importer saw various UI enhancements, thanks to Tai Lee +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - More consistent format and colorization of album and track metadata. - Display data source URL for matches from the new data source plugins. This @@ -4006,7 +4146,8 @@ MusicBrainz release group: identical releases: ``disctotal``, ``label``, ``catalognum``, ``country`` and ``albumdisambig``. -As usual, there were also lots of other great littler enhancements: +As usual, there were also lots of other great littler enhancements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/random`: A new ``-e`` option gives an equal chance to each artist in your collection to avoid biasing random samples to prolific artists. @@ -4032,7 +4173,8 @@ As usual, there were also lots of other great littler enhancements: - :doc:`/plugins/mpdupdate`: You can now communicate with MPD over a Unix domain socket. Thanks to John Hawthorn. -And a batch of fixes: +And a batch of fixes +~~~~~~~~~~~~~~~~~~~~ - Album art filenames now respect the :ref:`replace` configuration. - Friendly error messages are now printed when trying to read or write files @@ -4106,7 +4248,8 @@ during the import process. There's also a new plugin for synchronizing your metadata with MusicBrainz. Under the hood, plugins can now extend the query syntax. -New configuration options: +New configuration options +~~~~~~~~~~~~~~~~~~~~~~~~~ - :ref:`languages` controls the preferred languages when selecting an alias from MusicBrainz. This feature requires python-musicbrainzngs_ 0.3 or later. Thanks @@ -4119,7 +4262,8 @@ New configuration options: - :doc:`/plugins/importfeeds`: An option was added to use absolute, rather than relative, paths. Thanks to Lucas Duailibe. -Other stuff: +Other stuff +~~~~~~~~~~~ - A new :doc:`/plugins/mbsync` provides a command that looks up each item and track in MusicBrainz and updates your library to reflect it. This can help you @@ -4181,7 +4325,8 @@ release selected. Now, these fields reflect the specific release and ``original_year``, etc., reflect the earlier release date. If you want the old behavior, just set :ref:`original_date` to true in your config file. -New configuration options: +New configuration options +~~~~~~~~~~~~~~~~~~~~~~~~~ - :ref:`default_action` lets you determine the default (just-hit-return) option is when considering a candidate. @@ -4208,7 +4353,8 @@ New configuration options: in filenames via ``path_sep_replace``. The default is an underscore. Use this setting with caution. -Other new stuff: +Other new stuff +~~~~~~~~~~~~~~~ - Support for Windows Media/ASF audio files. Thanks to Dave Hayes. - New :doc:`/plugins/smartplaylist`: generate and maintain m3u playlist files @@ -4289,7 +4435,8 @@ a common directory (e.g., ``~/.config/beets`` on Unix-like systems). ``~/.beetsmusic.blb`` previously. Similarly, the runtime state file is now called ``state.pickle`` in the same directory instead of ``~/.beetsstate``. -It also adds some new features: +It also adds some new features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :doc:`/plugins/inline`: Inline definitions can now contain statements or blocks in addition to just expressions. Thanks to Florent Thoumie. @@ -5184,7 +5331,8 @@ for Windows users. This should make running beets much easier: just type ``beet`` if you have your ``PATH`` environment variable set up correctly. The :doc:`/guides/main` guide has some tips on installing beets on Windows. -Here's the detailed list of changes: +Here's the detailed list of changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - **Parallel tagger.** The autotagger has been reimplemented to use multiple threads. This means that it can concurrently read files from disk, talk to the diff --git a/extra/release.py b/extra/release.py index 2bafa90c2..febd624d1 100755 --- a/extra/release.py +++ b/extra/release.py @@ -165,13 +165,21 @@ def update_changelog(text: str, new: Version) -> str: Unreleased ---------- -New features: +.. + New features + ~~~~~~~~~~~~ -Bug fixes: +.. + Bug fixes + ~~~~~~~~~ -For packagers: +.. + For plugin developers + ~~~~~~~~~~~~~~~~~~~~~ -Other changes: +.. + Other changes + ~~~~~~~~~~~~~ {new_header} {"-" * len(new_header)} diff --git a/test/test_release.py b/test/test_release.py index 0951a5735..ab1bd7e03 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -20,7 +20,12 @@ pytestmark = pytest.mark.skipif( @pytest.fixture def rst_changelog(): - return """New features: + return """ +Unreleased +---------- + +New features +~~~~~~~~~~~~ - :doc:`/plugins/substitute`: Some substitute multi-line change. @@ -35,7 +40,8 @@ You can do something with this command: $ do-something -Bug fixes: +Bug fixes +~~~~~~~~~ - Some fix that refers to an issue. :bug:`5467` @@ -58,9 +64,11 @@ Bug fixes: Section naaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmeeeeeeeeeeeeeee with over 80 characters: -Empty section: +.. For plugin developers +.. ~~~~~~~~~~~~~~~~~~~~~ -Other changes: +Other changes +~~~~~~~~~~~~~ - Changed ``bitesize`` label to ``good first issue``. Our `contribute`_ page is now automatically populated with these issues. :bug:`4855` @@ -70,14 +78,17 @@ Other changes: 2.1.0 (November 22, 2024) ------------------------- -Bug fixes: +Bug fixes +~~~~~~~~~ - Fixed something.""" @pytest.fixture def md_changelog(): - return r"""### New features + return r"""# Unreleased + +## New features - [beets.plugins.BeetsPlugin](https://beets.readthedocs.io/en/stable/api/generated/beets.plugins.BeetsPlugin.html#beets.plugins.BeetsPlugin) Some plugin change. - [list](https://beets.readthedocs.io/en/stable/reference/cli.html#list-cmd) Update. @@ -88,7 +99,7 @@ You can do something with this command: $ do-something -### Bug fixes +## Bug fixes - Another fix with an enumerated list 1. First and some details @@ -102,13 +113,13 @@ You can do something with this command: **Section naaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmeeeeeeeeeeeeeee with over 80 characters** -### Other changes +## Other changes - Changed `bitesize` label to `good first issue`. Our [contribute](https://github.com/beetbox/beets/contribute) page is now automatically populated with these issues. :bug: (#4855) # 2.1.0 (November 22, 2024) -### Bug fixes +## Bug fixes - Fixed something.""" # noqa: E501 From 575f539282854b7a63a3c94aab97617c3a9f7844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Sun, 8 Feb 2026 00:55:01 +0000 Subject: [PATCH 4/7] Remove redundant MD_REPLACEMENTS --- extra/release.py | 8 -------- test/test_release.py | 6 +++--- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/extra/release.py b/extra/release.py index febd624d1..72520d4c0 100755 --- a/extra/release.py +++ b/extra/release.py @@ -139,11 +139,6 @@ def create_rst_replacements() -> list[Replacement]: ] -MD_REPLACEMENTS: list[Replacement] = [ - (r"^(\w[^\n]{,80}):(?=\n\n[^ ])", r"### \1"), # format section headers - (r"^(\w[^\n]{81,}):(?=\n\n[^ ])", r"**\1**"), # and bolden too long ones - (r"### [^\n]+\n+(?=### )", ""), # remove empty sections -] order_bullet_points = partial( re.compile(r"(\n- .*?(?=\n(?! *(-|\d\.) )|$))", flags=re.DOTALL).sub, lambda m: "\n- ".join(sorted(m.group().split("\n- "), key=str.lower)), @@ -255,9 +250,6 @@ def changelog_as_markdown(rst: str) -> str: md = rst2md(rst) - for pattern, repl in MD_REPLACEMENTS: - md = re.sub(pattern, repl, md, flags=re.M | re.DOTALL) - # order bullet points in each of the lists alphabetically to # improve readability return order_bullet_points(md) diff --git a/test/test_release.py b/test/test_release.py index ab1bd7e03..d578c177f 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -61,8 +61,8 @@ Bug fixes 2. Second and some details -Section naaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmeeeeeeeeeeeeeee with over 80 -characters: +Long parapgraph naaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmeeeeeeeeeeeeeee ending +with a colon: .. For plugin developers .. ~~~~~~~~~~~~~~~~~~~~~ @@ -111,7 +111,7 @@ You can do something with this command: - First nested bullet point with some text that wraps to the next line - Second nested bullet point -**Section naaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmeeeeeeeeeeeeeee with over 80 characters** +Long parapgraph naaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmmmmmeeeeeeeeeeeeeee ending with a colon: ## Other changes From 1eb74aa74049a84550f6e7732cc3811a43710d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Sun, 8 Feb 2026 01:30:20 +0000 Subject: [PATCH 5/7] Improve reference title for command links --- extra/release.py | 7 +++++-- test/test_release.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/extra/release.py b/extra/release.py index 72520d4c0..0686a08c3 100755 --- a/extra/release.py +++ b/extra/release.py @@ -99,6 +99,8 @@ def create_rst_replacements() -> list[Replacement]: refs = get_refs() def make_ref_link(ref_id: str, name: str | None = None) -> str: + if ref_id.endswith("-cmd"): + name = f"{ref_id.removesuffix('-cmd')} command" ref = refs[ref_id] return rf"`{name or ref.name} <{ref.url}>`_" @@ -118,13 +120,14 @@ def create_rst_replacements() -> list[Replacement]: lambda m: explicit_replacements.get(m[0], m[0]), ), # Replace Sphinx directives by documentation URLs, e.g., - # :ref:`/plugins/autobpm` -> [AutoBPM Plugin](DOCS/plugins/autobpm.html) + # :ref:`/plugins/autobpm` -> [AutoBPM Plugin](DOCS/plugins/autobpm.html) # noqa: E501 + # :ref:`list-cmd` -> [list command](DOCS/reference/cli.html#list-cmd) ( r":(?:ref|doc|class|conf):`+~?(?:([^`<]+)<)?/?([\w.:/_-]+)>?`+", lambda m: make_ref_link(m[2], m[1]), ), # Convert command references to documentation URLs - # `beet move` or `move` command -> [import](DOCS/reference/cli.html#import) + # `beet move` or `move` command -> [move command](DOCS/reference/cli.html#move-cmd) # noqa: E501 ( rf"`+beet ({commands})`+|`+({commands})`+(?= command)", lambda m: make_ref_link(f"{m[1] or m[2]}-cmd"), diff --git a/test/test_release.py b/test/test_release.py index d578c177f..e14d200fb 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -91,7 +91,7 @@ def md_changelog(): ## New features - [beets.plugins.BeetsPlugin](https://beets.readthedocs.io/en/stable/api/generated/beets.plugins.BeetsPlugin.html#beets.plugins.BeetsPlugin) Some plugin change. -- [list](https://beets.readthedocs.io/en/stable/reference/cli.html#list-cmd) Update. +- [list command](https://beets.readthedocs.io/en/stable/reference/cli.html#list-cmd) Update. - [Substitute Plugin](https://beets.readthedocs.io/en/stable/plugins/substitute.html): Some substitute multi-line change. :bug: (#5467) - See [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) for documentation. From e4314b700f323e1df0e5b7aae60e427b126c68bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Sun, 8 Feb 2026 01:52:23 +0000 Subject: [PATCH 6/7] Add rst inline-literal check to lint-docs task Fail the docs lint task when single-backtick inline literals are used. This is required because `pandoc` converts: `$playlist` -> \$playlist Where this `span` element has no meaning in markdown context, and `$playlist` loses its formatting. On the other hand, double backticks are converted appropriately: ``$playlist`` -> `$playlist` --- pyproject.toml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 24505d73e..2a0a1904d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -238,7 +238,17 @@ cmd = "ruff check --config=pyproject.toml" [tool.poe.tasks.lint-docs] help = "Lint the documentation" -shell = "sphinx-lint --enable all --disable default-role $(git ls-files '*.rst')" +interpreter = "bash" +shell = """ +set -o pipefail +files=$(git ls-files '*.rst') + +grep -Eno ' `[^`][^`]+`[^_]' $files | + sed 's/ .*/ Use double backticks for inline literal (double-backticks-required)/' && failed=1 +sphinx-lint --enable all --disable default-role $files || failed=1 + +exit ${failed:-0} +""" [tool.poe.tasks.update-dependencies] help = "Update dependencies to their latest versions." From 4fd5c5ef79a0bc24bcb60bed66e18460babf752a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Sun, 8 Feb 2026 08:01:31 +0000 Subject: [PATCH 7/7] Fix single backticks issues --- docs/changelog.rst | 28 ++++++++++++++-------------- docs/guides/main.rst | 2 +- docs/plugins/mbpseudo.rst | 22 +++++++++++----------- docs/plugins/titlecase.rst | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 9ab397d0f..baf5d8e02 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -54,7 +54,7 @@ New features genres tag. - :doc:`plugins/ftintitle`: Added argument to skip the processing of artist and album artist are the same in ftintitle. -- :doc:`plugins/play`: Added `$playlist` marker to precisely edit the playlist +- :doc:`plugins/play`: Added ``$playlist`` marker to precisely edit the playlist filepath into the command calling the player program. - :doc:`plugins/lastgenre`: For tuning plugin settings ``-vvv`` can be passed to receive extra verbose logging around last.fm results and how they are @@ -63,13 +63,13 @@ New features - :doc:`plugins/importsource`: Added new plugin that tracks original import paths and optionally suggests removing source files when items are removed from the library. -- :doc:`plugins/mbpseudo`: Add a new `mbpseudo` plugin to proactively receive +- :doc:`plugins/mbpseudo`: Add a new ``mbpseudo`` plugin to proactively receive MusicBrainz pseudo-releases as recommendations during import. - Added support for Python 3.13. - :doc:`/plugins/convert`: ``force`` can be passed to override checks like no_convert, never_convert_lossy_files, same format, and max_bitrate -- :doc:`plugins/titlecase`: Add the `titlecase` plugin to allow users to resolve - differences in metadata source styles. +- :doc:`plugins/titlecase`: Add the ``titlecase`` plugin to allow users to + resolve differences in metadata source styles. - :doc:`plugins/spotify`: Added support for multi-artist albums and tracks, saving all contributing artists to the respective fields. - :doc:`plugins/fetchart`: Fix colorized output text. @@ -115,15 +115,15 @@ Bug fixes audio-features endpoint, the plugin logs a warning once and skips audio features for all remaining tracks in the session, avoiding unnecessary API calls and rate limit exhaustion. -- Running `beet --config config -e` now edits `` rather than - the default config path. :bug:`5652` +- Running ``beet --config config -e`` now edits ```` rather + than the default config path. :bug:`5652` - :doc:`plugins/lyrics`: Accepts strings for lyrics sources (previously only accepted a list of strings). :bug:`5962` - Fix a bug introduced in release 2.4.0 where import from any valid import-log-file always threw a "none of the paths are importable" error. -- :doc:`/plugins/web`: repair broken `/item/values/…` and `/albums/values/…` +- :doc:`/plugins/web`: repair broken ``/item/values/…`` and `/albums/values/…` endpoints. Previously, due to single-quotes (ie. string literal) in the SQL - query, the query eg. `GET /item/values/albumartist` would return the literal + query, the query eg. ``GET /item/values/albumartist`` would return the literal "albumartist" instead of a list of unique album artists. - Sanitize log messages by removing control characters preventing terminal rendering issues. @@ -194,7 +194,7 @@ Other changes - Finally removed gmusic plugin and all related code/docs as the Google Play Music service was shut down in 2020. - Updated color documentation with ``bright_*`` and ``bg_bright_*`` entries. -- Moved `beets/random.py` into `beetsplug/random.py` to cleanup core module. +- Moved ``beets/random.py`` into ``beetsplug/random.py`` to cleanup core module. - dbcore: Allow models to declare SQL indices; add an ``items.album_id`` index to speed up ``album.items()`` queries. :bug:`5809` @@ -252,12 +252,12 @@ New features - :doc:`plugins/discogs` Added support for featured artists. :bug:`6038` - :doc:`plugins/discogs` New configuration option :conf:`plugins.discogs:featured_string` to change the default string used to - join featured artists. The default string is `Feat.`. -- :doc:`plugins/discogs` Support for `artist_credit` in Discogs tags. + join featured artists. The default string is ``Feat.``. +- :doc:`plugins/discogs` Support for ``artist_credit`` in Discogs tags. :bug:`3354` - :doc:`plugins/discogs` Support for name variations and config options to specify where the variations are written. :bug:`3354` -- :doc:`plugins/web` Support for `nexttrack` keyboard press +- :doc:`plugins/web` Support for ``nexttrack`` keyboard press Bug fixes ~~~~~~~~~ @@ -271,8 +271,8 @@ Bug fixes problem occurred primarily when no album was provided or when the album field was an empty string. :bug:`5189` - :doc:`plugins/spotify` Removed old and undocumented config options - `artist_field`, `album_field` and `track` that were causing issues with track - matching. :bug:`5189` + ``artist_field``, ``album_field`` and ``track`` that were causing issues with + track matching. :bug:`5189` - :doc:`plugins/spotify` Fixed an issue where candidate lookup would not find matches due to query escaping (single vs double quotes). - :doc:`plugins/discogs` Fixed inconsistency in stripping disambiguation from diff --git a/docs/guides/main.rst b/docs/guides/main.rst index 48b248927..de49fecab 100644 --- a/docs/guides/main.rst +++ b/docs/guides/main.rst @@ -99,7 +99,7 @@ started. write: no # Don't modify tags 4. **Add customization via plugins (optional):** Beets comes with many plugins that extend its functionality. You can - enable plugins by adding a `plugins` section to your config file. + enable plugins by adding a ``plugins`` section to your config file. We recommend adding at least one :ref:`Autotagger Plugin ` to help with fetching metadata during import. diff --git a/docs/plugins/mbpseudo.rst b/docs/plugins/mbpseudo.rst index 56658db26..92d873422 100644 --- a/docs/plugins/mbpseudo.rst +++ b/docs/plugins/mbpseudo.rst @@ -1,7 +1,7 @@ MusicBrainz Pseudo-Release Plugin ================================= -The `mbpseudo` plugin can be used *instead of* the `musicbrainz` plugin to +The ``mbpseudo`` plugin can be used *instead of* the ``musicbrainz`` plugin to search for MusicBrainz pseudo-releases_ during the import process, which are added to the normal candidates from the MusicBrainz search. @@ -20,12 +20,12 @@ Configuration ------------- Since this plugin first searches for official releases from MusicBrainz, all -options from the `musicbrainz` plugin's :ref:`musicbrainz-config` are supported, -but they must be specified under `mbpseudo` in the configuration file. -Additionally, the configuration expects an array of scripts that are desired for -the pseudo-releases. For ``artist`` in particular, keep in mind that even -pseudo-releases might specify it with the original script, so you should also -configure import :ref:`languages` to give artist aliases more priority. +options from the ``musicbrainz`` plugin's :ref:`musicbrainz-config` are +supported, but they must be specified under ``mbpseudo`` in the configuration +file. Additionally, the configuration expects an array of scripts that are +desired for the pseudo-releases. For ``artist`` in particular, keep in mind that +even pseudo-releases might specify it with the original script, so you should +also configure import :ref:`languages` to give artist aliases more priority. Therefore, the minimum configuration for this plugin looks like this: .. code-block:: yaml @@ -39,10 +39,10 @@ Therefore, the minimum configuration for this plugin looks like this: scripts: - Latn -Note that the `search_limit` configuration applies to the initial search for -official releases, and that the `data_source` in the database will be -"MusicBrainz". Nevertheless, `data_source_mismatch_penalty` must also be -specified under `mbpseudo` if desired (see also +Note that the ``search_limit`` configuration applies to the initial search for +official releases, and that the ``data_source`` in the database will be +"MusicBrainz". Nevertheless, ``data_source_mismatch_penalty`` must also be +specified under ``mbpseudo`` if desired (see also :ref:`metadata-source-plugin-configuration`). An example with multiple data sources may look like this: diff --git a/docs/plugins/titlecase.rst b/docs/plugins/titlecase.rst index e2861f0ac..33dbe6534 100644 --- a/docs/plugins/titlecase.rst +++ b/docs/plugins/titlecase.rst @@ -145,7 +145,7 @@ Default :default: yes If a field name contains ``artist``, then any lowercase ``the`` will be - capitalized. Useful for bands with `The` as part of the proper name, + capitalized. Useful for bands with ``The`` as part of the proper name, like ``Amyl and The Sniffers``. .. conf:: all_caps