pkgsrc-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

CVS commit: pkgsrc/audio/py-beets



Module Name:    pkgsrc
Committed By:   wiz
Date:           Mon Feb  9 12:44:18 UTC 2026

Modified Files:
        pkgsrc/audio/py-beets: Makefile PLIST distinfo
Removed Files:
        pkgsrc/audio/py-beets/patches: patch-beets_ui_____init____.py
            patch-beetsplug_lyrics.py

Log Message:
py-beets: update to 2.6.1.

2.6.1 (February 02, 2026)
-------------------------

Bug fixes:

- Make ``packaging`` a required dependency. :bug:`6332`

2.6.0 (February 01, 2026)
-------------------------

Beets now requires Python 3.10 or later since support for EOL Python 3.9 has
been dropped.

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.
- :doc:`plugins/ftintitle`: Added album template value ``album_artist_no_feat``.
- :doc:`plugins/musicbrainz`: Allow selecting tags or genres to populate the
  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
  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
  resolved. The ``extended_debug`` config setting and ``--debug`` option have
  been removed.
- :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
  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/spotify`: Added support for multi-artist albums and tracks,
  saving all contributing artists to the respective fields.
- :doc:`plugins/fetchart`: Fix colorized output text.
- :doc:`plugins/ftintitle`: Featured artists are now inserted before brackets
  containing remix/edit-related keywords (e.g., "Remix", "Live", "Edit") instead
  of being appended at the end. This improves formatting for titles like "Song 1
  (Carol Remix) ft. Bob" which becomes "Song 1 ft. Bob (Carol Remix)". A variety
  of brackets are supported and a new ``bracket_keywords`` configuration option
  allows customizing the keywords. Setting ``bracket_keywords`` to an empty list
  matches any bracket content regardless of keywords.
- :doc:`plugins/discogs`: Added support for multi value fields. :bug:`6068`
- :doc:`plugins/embedart`: Embedded arts can now be cleared during import with
  the ``clearart_on_import`` config option. Also, ``beet clearart`` is only
  going to update the files matching the query and with an embedded art, leaving
  untouched the files without.
- :doc:`plugins/fish`: Filenames are now completed in more places, like after
  ``beet import``.
- :doc:`plugins/random`: Added ``--field`` option to specify which field to use
  for equal-chance sampling (default: ``albumartist``).

Bug fixes:

- :doc:`/plugins/lastgenre`: Canonicalize genres when ``force`` and
  ``keep_existing`` are ``on``, yet no genre info on lastfm could be found.
  :bug:`6303`
- Handle potential OSError when unlinking temporary files in ArtResizer.
  :bug:`5615`
- :doc:`/plugins/spotify`: Updated Spotify API credentials. :bug:`6270`
- :doc:`/plugins/smartplaylist`: Fixed an issue where multiple queries in a
  playlist configuration were not preserving their order, causing items to
  appear in database order rather than the order specified in the config.
  :bug:`6183`
- :doc:`plugins/inline`: Fix recursion error when an inline field definition
  shadows a built-in item field (e.g., redefining ``track_no``). Inline
  expressions now skip self-references during evaluation to avoid infinite
  recursion. :bug:`6115`
- 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`
- :doc:`/plugins/spotify`: The plugin now gracefully handles audio-features API
  deprecation (HTTP 403 errors). When a 403 error is encountered from the
  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 <mypath> config -e` now edits `<mypath>` 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/…`
  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.
- Sanitize log messages by removing control characters preventing terminal
  rendering issues.
- When using :doc:`plugins/fromfilename` together with :doc:`plugins/edit`,
  temporary tags extracted from filenames are no longer lost when discarding or
  cancelling an edit session during import. :bug:`6104`
- :ref:`update-cmd` :doc:`plugins/edit` fix display formatting of field changes
  to clearly show added and removed flexible fields.
- :doc:`plugins/lastgenre`: Fix the issue where last.fm doesn't return any
  result in the artist genre stage because "concatenation" words in the artist
  name (like "feat.", "+", or "&") prevent it. Using the albumartists list field
  and fetching a genre for each artist separately improves the chance of
  receiving valid results in that stage.
- :doc:`/plugins/ftintitle`: Fixed artist name splitting to prioritize explicit
  featuring tokens (feat, ft, featuring) over generic separators (&, and),
  preventing incorrect splits when both are present.
- :doc:`reference/cli`: Fix 'from_scratch' option for singleton imports: delete
  all (old) metadata when new metadata is applied. :bug:`3706`
- :doc:`/plugins/convert`: ``auto_keep`` now respects ``no_convert`` and
  ``never_convert_lossy_files`` when deciding whether to copy/transcode items,
  avoiding extra lossy duplicates.
- :doc:`plugins/discogs`: Fixed unexpected flex attr from the Discogs plugin.
  :bug:`6177`
- 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`.

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
  been calculated.
- 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 :class:`~beetsplug._utils.requests.RequestHandler`
  for documentation.
- Replaced dependency on ``python-musicbrainzngs`` with a lightweight custom
  MusicBrainz client implementation and updated relevant plugins accordingly:

  - :doc:`plugins/listenbrainz`
  - :doc:`plugins/mbcollection`
  - :doc:`plugins/mbpseudo`
  - :doc:`plugins/missing`
  - :doc:`plugins/musicbrainz`
  - :doc:`plugins/parentwork`

  See :class:`~beetsplug._utils.musicbrainz.MusicBrainzAPI` for documentation.

For packagers:

- The minimum supported Python version is now 3.10.
- An unused dependency on ``mock`` has been removed.

Other changes:

- The documentation chapter :doc:`dev/paths` has been moved to the "For
  Developers" section and revised to reflect current best practices (pathlib
  usage).
- Refactored the ``beets/ui/commands.py`` monolithic file (2000+ lines) into
  multiple modules within the ``beets/ui/commands`` directory for better
  maintainability.
- :doc:`plugins/bpd`: Raise ImportError instead of ValueError when GStreamer is
  unavailable, enabling ``importorskip`` usage in pytest setup.
- 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.
- dbcore: Allow models to declare SQL indices; add an ``items.album_id`` index
  to speed up ``album.items()`` queries. :bug:`5809`


To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 pkgsrc/audio/py-beets/Makefile
cvs rdiff -u -r1.26 -r1.27 pkgsrc/audio/py-beets/PLIST
cvs rdiff -u -r1.27 -r1.28 pkgsrc/audio/py-beets/distinfo
cvs rdiff -u -r1.1 -r0 \
    pkgsrc/audio/py-beets/patches/patch-beets_ui_____init____.py \
    pkgsrc/audio/py-beets/patches/patch-beetsplug_lyrics.py

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: pkgsrc/audio/py-beets/Makefile
diff -u pkgsrc/audio/py-beets/Makefile:1.48 pkgsrc/audio/py-beets/Makefile:1.49
--- pkgsrc/audio/py-beets/Makefile:1.48 Mon Dec 29 17:54:57 2025
+++ pkgsrc/audio/py-beets/Makefile      Mon Feb  9 12:44:18 2026
@@ -1,8 +1,7 @@
-# $NetBSD: Makefile,v 1.48 2025/12/29 17:54:57 wiz Exp $
+# $NetBSD: Makefile,v 1.49 2026/02/09 12:44:18 wiz Exp $
 
-DISTNAME=      beets-2.5.1
+DISTNAME=      beets-2.6.1
 PKGNAME=       ${PYPKGPREFIX}-${DISTNAME}
-PKGREVISION=   1
 CATEGORIES=    audio python
 MASTER_SITES=  ${MASTER_SITE_PYPI:=b/beets/}
 
@@ -43,8 +42,8 @@ INSTALLATION_DIRS+=   ${PKGMANDIR}/man1 ${
 
 PYTHON_VERSIONS_INCOMPATIBLE=  310
 
-# as of 2.5.1
-# 1082 passed, 101 skipped
+# as of 2.6.1
+# 898 passed, 100 skipped
 .if make(test)
 ALLOW_NETWORK_ACCESS=  yes
 .endif
@@ -59,8 +58,6 @@ post-install:
        ${INSTALL_DATA} ${WRKSRC}/man/beet.1 ${DESTDIR}${PREFIX}/${PKGMANDIR}/man1/beet-${PYVERSSUFFIX}.1
        ${INSTALL_DATA} ${WRKSRC}/man/beetsconfig.5 ${DESTDIR}${PREFIX}/${PKGMANDIR}/man5/beetsconfig-${PYVERSSUFFIX}.5
        cd ${DESTDIR}${PREFIX}/bin && ${MV} beet beet-${PYVERSSUFFIX} || ${TRUE}
-       ${RM} ${DESTDIR}${PREFIX}/${PYSITELIB}/beets/ui/__init__.py.orig
-       ${RM} ${DESTDIR}${PREFIX}/${PYSITELIB}/beetsplug/lyrics.py.orig
 
 .include "../../lang/python/batteries-included.mk"
 .include "../../lang/python/wheel.mk"

Index: pkgsrc/audio/py-beets/PLIST
diff -u pkgsrc/audio/py-beets/PLIST:1.26 pkgsrc/audio/py-beets/PLIST:1.27
--- pkgsrc/audio/py-beets/PLIST:1.26    Sun Oct 19 18:42:55 2025
+++ pkgsrc/audio/py-beets/PLIST Mon Feb  9 12:44:18 2026
@@ -1,4 +1,4 @@
-@comment $NetBSD: PLIST,v 1.26 2025/10/19 18:42:55 wiz Exp $
+@comment $NetBSD: PLIST,v 1.27 2026/02/09 12:44:18 wiz Exp $
 bin/beet-${PYVERSSUFFIX}
 ${PYSITELIB}/${WHEEL_INFODIR}/METADATA
 ${PYSITELIB}/${WHEEL_INFODIR}/RECORD
@@ -82,9 +82,6 @@ ${PYSITELIB}/beets/plugins.py
 ${PYSITELIB}/beets/plugins.pyc
 ${PYSITELIB}/beets/plugins.pyo
 ${PYSITELIB}/beets/py.typed
-${PYSITELIB}/beets/random.py
-${PYSITELIB}/beets/random.pyc
-${PYSITELIB}/beets/random.pyo
 ${PYSITELIB}/beets/test/__init__.py
 ${PYSITELIB}/beets/test/__init__.pyc
 ${PYSITELIB}/beets/test/__init__.pyo
@@ -97,10 +94,58 @@ ${PYSITELIB}/beets/test/helper.pyo
 ${PYSITELIB}/beets/ui/__init__.py
 ${PYSITELIB}/beets/ui/__init__.pyc
 ${PYSITELIB}/beets/ui/__init__.pyo
-${PYSITELIB}/beets/ui/commands.py
-${PYSITELIB}/beets/ui/commands.pyc
-${PYSITELIB}/beets/ui/commands.pyo
-${PYSITELIB}/beets/ui/completion_base.sh
+${PYSITELIB}/beets/ui/commands/__init__.py
+${PYSITELIB}/beets/ui/commands/__init__.pyc
+${PYSITELIB}/beets/ui/commands/__init__.pyo
+${PYSITELIB}/beets/ui/commands/completion.py
+${PYSITELIB}/beets/ui/commands/completion.pyc
+${PYSITELIB}/beets/ui/commands/completion.pyo
+${PYSITELIB}/beets/ui/commands/completion_base.sh
+${PYSITELIB}/beets/ui/commands/config.py
+${PYSITELIB}/beets/ui/commands/config.pyc
+${PYSITELIB}/beets/ui/commands/config.pyo
+${PYSITELIB}/beets/ui/commands/fields.py
+${PYSITELIB}/beets/ui/commands/fields.pyc
+${PYSITELIB}/beets/ui/commands/fields.pyo
+${PYSITELIB}/beets/ui/commands/help.py
+${PYSITELIB}/beets/ui/commands/help.pyc
+${PYSITELIB}/beets/ui/commands/help.pyo
+${PYSITELIB}/beets/ui/commands/import_/__init__.py
+${PYSITELIB}/beets/ui/commands/import_/__init__.pyc
+${PYSITELIB}/beets/ui/commands/import_/__init__.pyo
+${PYSITELIB}/beets/ui/commands/import_/display.py
+${PYSITELIB}/beets/ui/commands/import_/display.pyc
+${PYSITELIB}/beets/ui/commands/import_/display.pyo
+${PYSITELIB}/beets/ui/commands/import_/session.py
+${PYSITELIB}/beets/ui/commands/import_/session.pyc
+${PYSITELIB}/beets/ui/commands/import_/session.pyo
+${PYSITELIB}/beets/ui/commands/list.py
+${PYSITELIB}/beets/ui/commands/list.pyc
+${PYSITELIB}/beets/ui/commands/list.pyo
+${PYSITELIB}/beets/ui/commands/modify.py
+${PYSITELIB}/beets/ui/commands/modify.pyc
+${PYSITELIB}/beets/ui/commands/modify.pyo
+${PYSITELIB}/beets/ui/commands/move.py
+${PYSITELIB}/beets/ui/commands/move.pyc
+${PYSITELIB}/beets/ui/commands/move.pyo
+${PYSITELIB}/beets/ui/commands/remove.py
+${PYSITELIB}/beets/ui/commands/remove.pyc
+${PYSITELIB}/beets/ui/commands/remove.pyo
+${PYSITELIB}/beets/ui/commands/stats.py
+${PYSITELIB}/beets/ui/commands/stats.pyc
+${PYSITELIB}/beets/ui/commands/stats.pyo
+${PYSITELIB}/beets/ui/commands/update.py
+${PYSITELIB}/beets/ui/commands/update.pyc
+${PYSITELIB}/beets/ui/commands/update.pyo
+${PYSITELIB}/beets/ui/commands/utils.py
+${PYSITELIB}/beets/ui/commands/utils.pyc
+${PYSITELIB}/beets/ui/commands/utils.pyo
+${PYSITELIB}/beets/ui/commands/version.py
+${PYSITELIB}/beets/ui/commands/version.pyc
+${PYSITELIB}/beets/ui/commands/version.pyo
+${PYSITELIB}/beets/ui/commands/write.py
+${PYSITELIB}/beets/ui/commands/write.pyc
+${PYSITELIB}/beets/ui/commands/write.pyo
 ${PYSITELIB}/beets/util/__init__.py
 ${PYSITELIB}/beets/util/__init__.pyc
 ${PYSITELIB}/beets/util/__init__.pyo
@@ -113,6 +158,9 @@ ${PYSITELIB}/beets/util/bluelet.pyo
 ${PYSITELIB}/beets/util/config.py
 ${PYSITELIB}/beets/util/config.pyc
 ${PYSITELIB}/beets/util/config.pyo
+${PYSITELIB}/beets/util/deprecation.py
+${PYSITELIB}/beets/util/deprecation.pyc
+${PYSITELIB}/beets/util/deprecation.pyo
 ${PYSITELIB}/beets/util/functemplate.py
 ${PYSITELIB}/beets/util/functemplate.pyc
 ${PYSITELIB}/beets/util/functemplate.pyo
@@ -140,6 +188,12 @@ ${PYSITELIB}/beetsplug/_utils/__init__.p
 ${PYSITELIB}/beetsplug/_utils/art.py
 ${PYSITELIB}/beetsplug/_utils/art.pyc
 ${PYSITELIB}/beetsplug/_utils/art.pyo
+${PYSITELIB}/beetsplug/_utils/musicbrainz.py
+${PYSITELIB}/beetsplug/_utils/musicbrainz.pyc
+${PYSITELIB}/beetsplug/_utils/musicbrainz.pyo
+${PYSITELIB}/beetsplug/_utils/requests.py
+${PYSITELIB}/beetsplug/_utils/requests.pyc
+${PYSITELIB}/beetsplug/_utils/requests.pyo
 ${PYSITELIB}/beetsplug/_utils/vfs.py
 ${PYSITELIB}/beetsplug/_utils/vfs.pyc
 ${PYSITELIB}/beetsplug/_utils/vfs.pyo
@@ -197,9 +251,15 @@ ${PYSITELIB}/beetsplug/convert.pyo
 ${PYSITELIB}/beetsplug/deezer.py
 ${PYSITELIB}/beetsplug/deezer.pyc
 ${PYSITELIB}/beetsplug/deezer.pyo
-${PYSITELIB}/beetsplug/discogs.py
-${PYSITELIB}/beetsplug/discogs.pyc
-${PYSITELIB}/beetsplug/discogs.pyo
+${PYSITELIB}/beetsplug/discogs/__init__.py
+${PYSITELIB}/beetsplug/discogs/__init__.pyc
+${PYSITELIB}/beetsplug/discogs/__init__.pyo
+${PYSITELIB}/beetsplug/discogs/states.py
+${PYSITELIB}/beetsplug/discogs/states.pyc
+${PYSITELIB}/beetsplug/discogs/states.pyo
+${PYSITELIB}/beetsplug/discogs/types.py
+${PYSITELIB}/beetsplug/discogs/types.pyc
+${PYSITELIB}/beetsplug/discogs/types.pyo
 ${PYSITELIB}/beetsplug/duplicates.py
 ${PYSITELIB}/beetsplug/duplicates.pyc
 ${PYSITELIB}/beetsplug/duplicates.pyo
@@ -236,9 +296,6 @@ ${PYSITELIB}/beetsplug/ftintitle.pyo
 ${PYSITELIB}/beetsplug/fuzzy.py
 ${PYSITELIB}/beetsplug/fuzzy.pyc
 ${PYSITELIB}/beetsplug/fuzzy.pyo
-${PYSITELIB}/beetsplug/gmusic.py
-${PYSITELIB}/beetsplug/gmusic.pyc
-${PYSITELIB}/beetsplug/gmusic.pyo
 ${PYSITELIB}/beetsplug/hook.py
 ${PYSITELIB}/beetsplug/hook.pyc
 ${PYSITELIB}/beetsplug/hook.pyo
@@ -251,6 +308,9 @@ ${PYSITELIB}/beetsplug/importadded.pyo
 ${PYSITELIB}/beetsplug/importfeeds.py
 ${PYSITELIB}/beetsplug/importfeeds.pyc
 ${PYSITELIB}/beetsplug/importfeeds.pyo
+${PYSITELIB}/beetsplug/importsource.py
+${PYSITELIB}/beetsplug/importsource.pyc
+${PYSITELIB}/beetsplug/importsource.pyo
 ${PYSITELIB}/beetsplug/info.py
 ${PYSITELIB}/beetsplug/info.pyc
 ${PYSITELIB}/beetsplug/info.pyo
@@ -289,6 +349,9 @@ ${PYSITELIB}/beetsplug/lyrics.pyo
 ${PYSITELIB}/beetsplug/mbcollection.py
 ${PYSITELIB}/beetsplug/mbcollection.pyc
 ${PYSITELIB}/beetsplug/mbcollection.pyo
+${PYSITELIB}/beetsplug/mbpseudo.py
+${PYSITELIB}/beetsplug/mbpseudo.pyc
+${PYSITELIB}/beetsplug/mbpseudo.pyo
 ${PYSITELIB}/beetsplug/mbsubmit.py
 ${PYSITELIB}/beetsplug/mbsubmit.pyc
 ${PYSITELIB}/beetsplug/mbsubmit.pyo
@@ -370,6 +433,9 @@ ${PYSITELIB}/beetsplug/the.pyo
 ${PYSITELIB}/beetsplug/thumbnails.py
 ${PYSITELIB}/beetsplug/thumbnails.pyc
 ${PYSITELIB}/beetsplug/thumbnails.pyo
+${PYSITELIB}/beetsplug/titlecase.py
+${PYSITELIB}/beetsplug/titlecase.pyc
+${PYSITELIB}/beetsplug/titlecase.pyo
 ${PYSITELIB}/beetsplug/types.py
 ${PYSITELIB}/beetsplug/types.pyc
 ${PYSITELIB}/beetsplug/types.pyo

Index: pkgsrc/audio/py-beets/distinfo
diff -u pkgsrc/audio/py-beets/distinfo:1.27 pkgsrc/audio/py-beets/distinfo:1.28
--- pkgsrc/audio/py-beets/distinfo:1.27 Mon Dec 29 17:54:57 2025
+++ pkgsrc/audio/py-beets/distinfo      Mon Feb  9 12:44:18 2026
@@ -1,7 +1,5 @@
-$NetBSD: distinfo,v 1.27 2025/12/29 17:54:57 wiz Exp $
+$NetBSD: distinfo,v 1.28 2026/02/09 12:44:18 wiz Exp $
 
-BLAKE2s (beets-2.5.1.tar.gz) = 41091492b86070d8b52fa354466ee02923c2ea229809b89d4fa64d15dd432a1b
-SHA512 (beets-2.5.1.tar.gz) = 289f68804e7293e93044b7ab7ed1537e0cbf07bb4e0f081d89875fabdb22af747f377dde30bf9d489086dd53525cbac348ec3b5c9642fdb551eeda63e2b5dcc0
-Size (beets-2.5.1.tar.gz) = 2147257 bytes
-SHA1 (patch-beets_ui_____init____.py) = d424cb78976cd619840e317f68470cdb51c709bf
-SHA1 (patch-beetsplug_lyrics.py) = e113e8ccd31510e8850e7d12a4f2f9849032af1e
+BLAKE2s (beets-2.6.1.tar.gz) = ed7e2bb1526e1bb44deb88d0050c15567291a2814fe49a43d0149c2325bf7549
+SHA512 (beets-2.6.1.tar.gz) = 8ea25d87a7415bfc7cb1b197aa3295d4cb007e39fd1ba38c34995aba59d069b180ae387ddf2101c00fad4065a9320455d4ffc741a6989b8343903b7832853128
+Size (beets-2.6.1.tar.gz) = 2175882 bytes



Home | Main Index | Thread Index | Old Index