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:   adam
Date:           Tue Sep  8 05:41:37 UTC 2026

Modified Files:
        pkgsrc/audio/py-beets: Makefile PLIST distinfo

Log Message:
py-beets: updated to 2.14.0

2.14.0 (September 07, 2026)

New features

- :doc:`plugins/plexupdate`: Add ``beet plexupdate --auth``, an interactive
  plex.tv login following Plex' traditional PIN authentication flow: the access
  token for the local server is stored in a token file. The manual ``token``
  configuration option is now deprecated.
- :ref:`duplicate_action`: Add an ``upgrade`` option that replaces individual
  duplicate tracks only if the new copy has a higher bitrate, adds any genuinely
  new tracks, and keeps the album together rather than splitting it. The option
  is available both through configuration and from the interactive duplicate
  prompt.
- The interactive import prompt now offers a "Rescan directory" choice for album
  tasks. It re-reads the album's directory from disk and re-runs the match, so
  files can be cleaned up (duplicates, junk) while the import is paused at the
  prompt, without restarting the whole ``beet import`` run.
- :ref:`list-cmd` Add ``-l / --limit LIMIT`` flag to the ``list`` command to
  limit query results.

Bug fixes

- Add ``editor`` config option to allow users to permanently set their preferred
  editor, overriding ``$VISUAL`` and ``$EDITOR`` environment variables.
- ``beet update`` no longer crashes when a plugin-added media field is stored as
  a flexible attribute.
- A date range query written back to front (for example ``added:2024..2020``) no
  longer crashes with an uncaught ``ValueError``. The endpoints are now swapped,
  so such a range means the same as ``added:2020..2024``.
- Deduplicating a file whose name already ends in a counter of two or more
  digits no longer restarts the numbering: ``track.10.mp3`` now yields
  ``track.11.mp3`` instead of ``track.1.mp3``. The counter was matched with
  ``\.(\d)+$``, which captures only the final digit.
- Autotagging distance calculations no longer treat ordinary words containing
  "ft" (such as "draft", "left", "gift", "craft") as a "featuring artist"
  suffix, which was silently making genuinely different titles/artists score as
  near-identical matches.
- :doc:`plugins/lyrics`: ``beet lyrics`` no longer crashes with an
  ``AttributeError`` on tracks that have no stored lyrics when ``force`` is
  enabled; a missing lyrics body is now treated as empty text.
- :doc:`plugins/deezer`: Detect compilations that Deezer credits to a single
  "main" artist instead of "Various Artists", so they are tagged as such rather
  than getting every track artist in the album artist field.
- Flexible attributes whose names contain uppercase characters (for example
  ``beet import --set Tag_With_Uppercase=true``) can now be found by queries.
  Field names are lowercased when a query is parsed, so such attributes could
  never be matched; flexible attribute lookups now fall back to a
  case-insensitive key match.
- :doc:`plugins/deezer`: Singleton searches now use plain free text rather than
  ``<title> artist:"<artist>"``. Deezer discards unquoted free text as soon as a
  query contains any ``field:"value"`` filter, so the old query was evaluated as
  ``artist:"<artist>"`` alone -- every track by the artist, in Deezer's own
  relevance order and truncated to ``search_limit``. For artists with more
  releases than that window, the track being imported was never among the
  candidates offered.
- :doc:`plugins/tidal`: The ``label`` field no longer stores Tidal's raw
  copyright/rights-statement text verbatim. It's now normalized to a concise
  label name, stripping copyright markers, years, and corporate, licensing, and
  territorial boilerplate. Affects both album and track metadata.
- :doc:`plugins/deezer`: Track conversion no longer assumes the API sends both
  ``contributors`` and ``artist``. The fallback to ``artist`` was evaluated even
  when ``contributors`` was present, so a track payload without ``artist``
  raised ``KeyError``. Albums were already guarded; this fixes the remaining
  call site.
- :doc:`plugins/discogs`: Retry a search once when Discogs returns an invalid
  JSON response instead of immediately discarding all Discogs candidates.
- Plugins built on ``SearchApiMetadataSourcePlugin``
  (:doc:`plugins/musicbrainz`, :doc:`plugins/spotify`, :doc:`plugins/deezer` and
  :doc:`plugins/discogs`) no longer send a search request when both the query
  text and the filters are empty.
- :doc:`plugins/ipfs`: Fix ``beet ipfs --play`` option to invoke the Play plugin
  through its command interface.
- :doc:`plugins/lyrics`: LRCLib entries that carry no lyrics text at all, with
  both ``plainLyrics`` and ``syncedLyrics`` null while ``instrumental`` is
  ``False``, are no longer considered matches. Previously such an entry was
  accepted and its null text propagated, raising ``AttributeError: 'NoneType'
  object has no attribute 'splitlines'``. During an import this aborted the
  whole run rather than a single track. A null ``plainLyrics`` now also falls
  back to the synced lyrics instead of discarding them.
- :ref:`modify-cmd`: Fix applying changes when choosing objects in interactive
  select mode.
- :ref:`move-cmd`: Fix moving albums in interactive select/timid mode.
- :doc:`plugins/bpd`: Fix ``search`` command when ``any`` field is used.
- :doc:`plugins/aura`: Prevent multi-valued field filters from crashing with an
  ``sqlite3.InterfaceError``.
- :doc:`plugins/aura`: When sorting by ``field``, do not exclude resources that
  have no value for ``field``.
- :doc:`plugins/scrub`: The scrub plugin now respects the ``--nowrite`` (``-W``)
  flag during import. Previously, ``beet import -W`` with the scrub plugin
  enabled would still remove tags from imported files; the plugin now skips
  scrubbing when ``should_write()`` returns ``False``.
- :doc:`plugins/convert`: Fixed convert plugin not taking into account the new
  format when determining the target path.
- :doc:`plugins/edit`: Item-only fields rejected from the album header remain
  available in per-track documents during interactive import when they are also
  configured in ``itemfields``.
- :doc:`plugins/tidal`: Pass the converted track duration as ``length`` so it
  contributes to the autotagging track-length distance instead of being silently
  stored as a ``duration`` flexible attribute.
- :doc:`plugins/tidal`: Restore catalog searches after TIDAL moved search
  queries from the request path to the required ``filter[query]`` parameter.
- :ref:`import-cmd`: Restore the ability to import from tar and 7z archives.
  Both failed with an ``'... object has no attribute 'infolist'`` error because
  ``tarfile.TarFile`` lost its ``ZipFileCompat`` interface in Python 3 and
  ``py7zr.SevenZipFile`` exposes ``list()`` rather than ``infolist()``.
- :doc:`plugins/listenbrainz` and :doc:`plugins/lastimport`: Play counts are now
  matched more accurately. An exact MusicBrainz recording ID match is preferred
  when one exists, and titles are matched exactly (confirmed by the artist or
  album) before falling back to the previous substring-based matching.
  Previously all queries were combined, so a listen for "Song" also updated
  "Song (inst.)" or any other item whose title only contained the listened
  title.
- :doc:`plugins/limit` Deprecate the ``limit`` plugin in favor of the new ``-l``
  / ``--limit`` flag for the :ref:`list-cmd` command.


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 pkgsrc/audio/py-beets/Makefile
cvs rdiff -u -r1.34 -r1.35 pkgsrc/audio/py-beets/PLIST
cvs rdiff -u -r1.36 -r1.37 pkgsrc/audio/py-beets/distinfo

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.59 pkgsrc/audio/py-beets/Makefile:1.60
--- pkgsrc/audio/py-beets/Makefile:1.59 Mon Aug  3 17:48:45 2026
+++ pkgsrc/audio/py-beets/Makefile      Tue Sep  8 05:41:37 2026
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.59 2026/08/03 17:48:45 wiz Exp $
+# $NetBSD: Makefile,v 1.60 2026/09/08 05:41:37 adam Exp $
 
-DISTNAME=      beets-2.13.1
+DISTNAME=      beets-2.14.0
 PKGNAME=       ${PYPKGPREFIX}-${DISTNAME}
 CATEGORIES=    audio python
 MASTER_SITES=  ${MASTER_SITE_PYPI:=b/beets/}
@@ -14,9 +14,9 @@ TOOL_DEPENDS+=        ${PYPKGPREFIX}-hatchling>
 DEPENDS+=      ${PYPKGPREFIX}-Unidecode>=1.3.6:../../textproc/py-Unidecode
 DEPENDS+=      ${PYPKGPREFIX}-beautifulsoup4>=0:../../www/py-beautifulsoup4
 DEPENDS+=      ${PYPKGPREFIX}-confuse>=2.2.0:../../devel/py-confuse
-DEPENDS+=      ${PYPKGPREFIX}-jellyfish-[0-9]*:../../textproc/py-jellyfish
+DEPENDS+=      ${PYPKGPREFIX}-jellyfish>=0:../../textproc/py-jellyfish
 DEPENDS+=      ${PYPKGPREFIX}-lap>=0.5.12:../../math/py-lap
-DEPENDS+=      ${PYPKGPREFIX}-mediafile>=0.16.2:../../audio/py-mediafile
+DEPENDS+=      ${PYPKGPREFIX}-mediafile>=0.17.0:../../audio/py-mediafile
 DEPENDS+=      ${PYPKGPREFIX}-musicbrainz-ngs>=0.4:../../audio/py-musicbrainz-ngs
 DEPENDS+=      ${PYPKGPREFIX}-numpy>=2.3.5:../../math/py-numpy
 DEPENDS+=      ${PYPKGPREFIX}-packaging>=24.0:../../devel/py-packaging
@@ -24,23 +24,23 @@ DEPENDS+=   ${PYPKGPREFIX}-platformdirs>=3
 DEPENDS+=      ${PYPKGPREFIX}-requests>=2.32.5:../../devel/py-requests
 DEPENDS+=      ${PYPKGPREFIX}-requests-ratelimiter>=0.7.0:../../net/py-requests-ratelimiter
 DEPENDS+=      ${PYPKGPREFIX}-titlecase>=0:../../devel/py-titlecase
-DEPENDS+=      ${PYPKGPREFIX}-typing-extensions-[0-9]*:../../devel/py-typing-extensions
-DEPENDS+=      ${PYPKGPREFIX}-yaml-[0-9]*:../../textproc/py-yaml
+DEPENDS+=      ${PYPKGPREFIX}-typing-extensions>=0:../../devel/py-typing-extensions
+DEPENDS+=      ${PYPKGPREFIX}-yaml>=0:../../textproc/py-yaml
 # lastgenre
-DEPENDS+=      ${PYPKGPREFIX}-last-[0-9]*:../../audio/py-last
+DEPENDS+=      ${PYPKGPREFIX}-last>=0:../../audio/py-last
 # scrub
 DEPENDS+=      ${PYPKGPREFIX}-mutagen>=1.33:../../audio/py-mutagen
 # ffprobe
-DEPENDS+=      ffmpeg8-[0-9]*:../../multimedia/ffmpeg8
-TEST_DEPENDS+= ${PYPKGPREFIX}-discogs-client-[0-9]*:../../audio/py-discogs-client
-TEST_DEPENDS+= ${PYPKGPREFIX}-flask-[0-9]*:../../www/py-flask
-TEST_DEPENDS+= ${PYPKGPREFIX}-mock-[0-9]*:../../devel/py-mock
-TEST_DEPENDS+= ${PYPKGPREFIX}-mpd2-[0-9]*:../../audio/py-mpd2
-TEST_DEPENDS+= ${PYPKGPREFIX}-requests-oauthlib-[0-9]*:../../security/py-requests-oauthlib
+DEPENDS+=      ffmpeg8>=0:../../multimedia/ffmpeg8
+TEST_DEPENDS+= ${PYPKGPREFIX}-discogs-client>=0:../../audio/py-discogs-client
+TEST_DEPENDS+= ${PYPKGPREFIX}-flask>=0:../../www/py-flask
+TEST_DEPENDS+= ${PYPKGPREFIX}-mock>=0:../../devel/py-mock
+TEST_DEPENDS+= ${PYPKGPREFIX}-mpd2>=0:../../audio/py-mpd2
+TEST_DEPENDS+= ${PYPKGPREFIX}-requests-oauthlib>=0:../../security/py-requests-oauthlib
 TEST_DEPENDS+= ${PYPKGPREFIX}-responses>=0.3.0:../../net/py-responses
-TEST_DEPENDS+= ${PYPKGPREFIX}-test-cov-[0-9]*:../../devel/py-test-cov
-TEST_DEPENDS+= ${PYPKGPREFIX}-test-factoryboy-[0-9]*:../../devel/py-test-factoryboy
-TEST_DEPENDS+= ${PYPKGPREFIX}-xdg-[0-9]*:../../devel/py-xdg
+TEST_DEPENDS+= ${PYPKGPREFIX}-test-cov>=0:../../devel/py-test-cov
+TEST_DEPENDS+= ${PYPKGPREFIX}-test-factoryboy>=0:../../devel/py-test-factoryboy
+TEST_DEPENDS+= ${PYPKGPREFIX}-xdg>=0:../../devel/py-xdg
 
 USE_LANGUAGES= # none
 USE_TOOLS+=    git

Index: pkgsrc/audio/py-beets/PLIST
diff -u pkgsrc/audio/py-beets/PLIST:1.34 pkgsrc/audio/py-beets/PLIST:1.35
--- pkgsrc/audio/py-beets/PLIST:1.34    Mon Aug  3 17:48:45 2026
+++ pkgsrc/audio/py-beets/PLIST Tue Sep  8 05:41:37 2026
@@ -1,4 +1,4 @@
-@comment $NetBSD: PLIST,v 1.34 2026/08/03 17:48:45 wiz Exp $
+@comment $NetBSD: PLIST,v 1.35 2026/09/08 05:41:37 adam Exp $
 bin/beet-${PYVERSSUFFIX}
 ${PYSITELIB}/${WHEEL_INFODIR}/METADATA
 ${PYSITELIB}/${WHEEL_INFODIR}/RECORD
@@ -23,6 +23,9 @@ ${PYSITELIB}/beets/autotag/hooks.pyo
 ${PYSITELIB}/beets/autotag/match.py
 ${PYSITELIB}/beets/autotag/match.pyc
 ${PYSITELIB}/beets/autotag/match.pyo
+${PYSITELIB}/beets/autotag/source.py
+${PYSITELIB}/beets/autotag/source.pyc
+${PYSITELIB}/beets/autotag/source.pyo
 ${PYSITELIB}/beets/config_default.yaml
 ${PYSITELIB}/beets/context.py
 ${PYSITELIB}/beets/context.pyc
@@ -48,6 +51,9 @@ ${PYSITELIB}/beets/dbcore/sort.pyo
 ${PYSITELIB}/beets/dbcore/types.py
 ${PYSITELIB}/beets/dbcore/types.pyc
 ${PYSITELIB}/beets/dbcore/types.pyo
+${PYSITELIB}/beets/events.py
+${PYSITELIB}/beets/events.pyc
+${PYSITELIB}/beets/events.pyo
 ${PYSITELIB}/beets/exceptions.py
 ${PYSITELIB}/beets/exceptions.pyc
 ${PYSITELIB}/beets/exceptions.pyo
@@ -161,9 +167,6 @@ ${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
@@ -176,9 +179,6 @@ ${PYSITELIB}/beets/util/__init__.pyo
 ${PYSITELIB}/beets/util/artresizer.py
 ${PYSITELIB}/beets/util/artresizer.pyc
 ${PYSITELIB}/beets/util/artresizer.pyo
-${PYSITELIB}/beets/util/bluelet.py
-${PYSITELIB}/beets/util/bluelet.pyc
-${PYSITELIB}/beets/util/bluelet.pyo
 ${PYSITELIB}/beets/util/color.py
 ${PYSITELIB}/beets/util/color.pyc
 ${PYSITELIB}/beets/util/color.pyo

Index: pkgsrc/audio/py-beets/distinfo
diff -u pkgsrc/audio/py-beets/distinfo:1.36 pkgsrc/audio/py-beets/distinfo:1.37
--- pkgsrc/audio/py-beets/distinfo:1.36 Mon Aug  3 17:48:45 2026
+++ pkgsrc/audio/py-beets/distinfo      Tue Sep  8 05:41:37 2026
@@ -1,5 +1,5 @@
-$NetBSD: distinfo,v 1.36 2026/08/03 17:48:45 wiz Exp $
+$NetBSD: distinfo,v 1.37 2026/09/08 05:41:37 adam Exp $
 
-BLAKE2s (beets-2.13.1.tar.gz) = bec40f8213f9d20f52faaf17d531c95eb815875defe12dad08a8bc81890b075b
-SHA512 (beets-2.13.1.tar.gz) = 3a3eaeb16f061ede4648da1b1df9324ec9c7ec026e2ab8f59fcc19521c8715b4c98eb1ea04aa91c654ef10183f8053a41d4f5b7c72dec641bffa2dc979efc1d6
-Size (beets-2.13.1.tar.gz) = 2447541 bytes
+BLAKE2s (beets-2.14.0.tar.gz) = b543be239696311c45c2b434afcfe4330fcef872ecb81bbb68a0e64b4f17fd9a
+SHA512 (beets-2.14.0.tar.gz) = 7dd1db0c7c398e635f0ec00cc9216242af904893d2e8a535c7de09f79373437eb3d19cae4182fa73c276632d9e0afdcc9da12b802d72657d6ce62827b11db2c8
+Size (beets-2.14.0.tar.gz) = 2481050 bytes



Home | Main Index | Thread Index | Old Index