Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package eyeD3 for openSUSE:Factory checked 
in at 2026-01-19 18:38:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/eyeD3 (Old)
 and      /work/SRC/openSUSE:Factory/.eyeD3.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "eyeD3"

Mon Jan 19 18:38:10 2026 rev:8 rq:1328042 version:0.9.9

Changes:
--------
--- /work/SRC/openSUSE:Factory/eyeD3/eyeD3.changes      2025-07-31 
17:47:07.778470959 +0200
+++ /work/SRC/openSUSE:Factory/.eyeD3.new.1928/eyeD3.changes    2026-01-19 
18:42:15.040350183 +0100
@@ -1,0 +2,18 @@
+Sun Jan 18 13:17:31 UTC 2026 - Ben Greiner <[email protected]>
+
+- Update to 0.9.9
+  * Remove eyed3.utils.console.getTtySize() implementation by
+    @nicfit in #682
+  * Resolve logger warnings by @emmanuel-ferdman in #668
+  * User expanduser instead of expandvars by @nicfit in #670
+  * fix: catch GenreException by @nicfit in #676
+  * Fix links in docs by @gene1wood in #677
+  * Add Python 3.14, and EOL 3.9 by @nicfit in #681
+- Cleanup dependencies
+  * Remove old unused dependencies
+  * Remove hard requirements that aren't
+  * Remove unused poetry build backend from requirements: they
+    switched in 0.9.8
+- Use test data
+
+-------------------------------------------------------------------

Old:
----
  eyed3-0.9.8.tar.gz

New:
----
  eyeD3-test-data.tgz
  eyed3-0.9.9.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ eyeD3.spec ++++++
--- /var/tmp/diff_new_pack.vhObQE/_old  2026-01-19 18:42:16.808423339 +0100
+++ /var/tmp/diff_new_pack.vhObQE/_new  2026-01-19 18:42:16.812423504 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package eyeD3
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,26 +17,31 @@
 
 
 Name:           eyeD3
-Version:        0.9.8
+Version:        0.9.9
 Release:        0
 Summary:        Audio files and ID3 Manipulation Tool
 License:        GPL-2.0-or-later AND GPL-3.0-only
 Group:          Productivity/Multimedia/Sound/Utilities
 URL:            https://eyed3.readthedocs.io/en/latest/
-Source:         
https://files.pythonhosted.org/packages/source/e/eyeD3/eyed3-%{version}.tar.gz
-BuildRequires:  %{python_module base >= 3.9}
-BuildRequires:  %{python_module chardet >= 5.2.0}
-BuildRequires:  %{python_module colorama >= 0.4.6}
+Source0:        
https://files.pythonhosted.org/packages/source/e/eyeD3/eyed3-%{version}.tar.gz
+#Source1:       https://eyed3.nicfit.net/releases/eyeD3-test-data.tgz -- 
unversioned, could change with releases, download manually!
+Source1:        eyeD3-test-data.tgz
+BuildRequires:  %{python_module base >= 3.10}
 BuildRequires:  %{python_module deprecation >= 2.1.0}
-BuildRequires:  %{python_module factory_boy >= 3.3.3}
 BuildRequires:  %{python_module filetype >= 1.2.0}
-BuildRequires:  %{python_module idna >= 2.10}
 BuildRequires:  %{python_module pip}
-BuildRequires:  %{python_module poetry}
-BuildRequires:  %{python_module pytest}
-BuildRequires:  %{python_module requests >= 2.32.4}
-BuildRequires:  %{python_module toml >= 0.10.2}
+BuildRequires:  %{python_module setuptools}
 BuildRequires:  %{python_module wheel}
+# SECTION test requirements
+BuildRequires:  %{python_module pytest >= 8.3.5}
+BuildRequires:  %{python_module factory_boy >= 3.3.3}
+# /SECTION
+# SECTION optional requirements for plugins
+BuildRequires:  %{python_module PyYAML >= 6.0.2}
+BuildRequires:  %{python_module Pillow >= 11.3.0}
+BuildRequires:  %{python_module pylast >= 5.5.0}
+BuildRequires:  %{python_module requests >= 2.32.4}
+# /SECTION
 BuildRequires:  fdupes
 BuildArch:      noarch
 # %%primary_python not available in Leap yet
@@ -63,31 +68,24 @@
 %package -n python-eyed3
 Summary:        Component library of eyeD3, an ID3 tag manipulation tool
 Group:          Development/Languages/Python
-Requires:       python-chardet >= 5.2.0
-Requires:       python-colorama >= 0.4.6
 Requires:       python-deprecation >= 2.1.0
 Requires:       python-filetype >= 1.2.0
-Requires:       python-idna >= 2.10
-Requires:       python-packaging >= 20.8
-Requires:       python-pyparsing >= 2.4.7
-Requires:       python-requests >= 2.32.4
-Requires:       python-toml >= 0.10.2
-Requires:       python-urllib3 >= 2.5.0
-Recommends:     python-grako
-Recommends:     python-pillow
 # for plugins
+Recommends:     python-PyYAML
+Recommends:     python-Pillow
 Recommends:     python-pylast
 Recommends:     python-requests
-Recommends:     python-ruamel.yaml
 
 %description -n python-eyed3
 eyeD3 is a Python tool for working with audio files, specifically MP3
 files containing ID3 metadata (i.e. song info).
 
 %prep
-%autosetup -p1 -n eyed3-%{version}
+%autosetup -p1 -n eyed3-%{version} -b1
 # currently broken
 rm eyed3/plugins/mimetype.py
+# See Makefile
+ln -s $PWD/../eyeD3-test-data tests/data
 
 %build
 %pyproject_wheel
@@ -105,8 +103,8 @@
 %doc README.rst
 %doc CONTRIBUTING.rst
 %doc HISTORY.rst
-#%doc docs
-#%doc examples
+#%%doc docs
+#%%doc examples
 %{_bindir}/eyeD3
 
 %files %{python_files eyed3}

++++++ eyed3-0.9.8.tar.gz -> eyed3-0.9.9.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/AUTHORS.rst new/eyed3-0.9.9/AUTHORS.rst
--- old/eyed3-0.9.8/AUTHORS.rst 2025-04-23 04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/AUTHORS.rst 2025-11-16 16:13:46.000000000 +0100
@@ -43,3 +43,5 @@
   * Steve Kowalik <[email protected]>
   * gersonkurz <[email protected]>
   * obskyr <[email protected]>
+  * Emmanuel Ferdman <[email protected]>
+  * Gene Wood <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/MANIFEST.in new/eyed3-0.9.9/MANIFEST.in
--- old/eyed3-0.9.8/MANIFEST.in 2025-04-23 04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/MANIFEST.in 2025-10-23 05:40:24.000000000 +0200
@@ -16,7 +16,6 @@
 include tests/pytest.ini
 
 exclude .cookiecutter.yml
-exclude .gitchangelog.rc
 global-exclude __pycache__
 global-exclude .editorconfig
 global-exclude *.py[co]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/Makefile new/eyed3-0.9.9/Makefile
--- old/eyed3-0.9.8/Makefile    2025-04-26 23:18:25.000000000 +0200
+++ new/eyed3-0.9.9/Makefile    2025-11-16 16:13:46.000000000 +0100
@@ -75,7 +75,7 @@
        find . -name '*.pyc' -exec rm -f {} +
        find . -name '*.pyo' -exec rm -f {} +
        find . -name '*~' -exec rm -f {} +
-       find . -name '__pycache__' -exec rm -fr {} +
+       find . -name '__pycache__' -type d -exec rm -fr {} +
 
 clean-local:
        -rm tags
@@ -157,7 +157,9 @@
        $(BROWSER) docs/_build/html/index.html
 
 clean-docs:
-       $(MAKE) -C docs clean
+       if which sphinx-build >/dev/null 2>&1; then \
+           $(MAKE) -C docs clean;\
+       fi
        -rm README.html
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/PKG-INFO new/eyed3-0.9.9/PKG-INFO
--- old/eyed3-0.9.8/PKG-INFO    2025-04-26 23:22:31.935083900 +0200
+++ new/eyed3-0.9.9/PKG-INFO    2025-11-16 17:08:09.367206300 +0100
@@ -1,9 +1,9 @@
 Metadata-Version: 2.4
 Name: eyeD3
-Version: 0.9.8
+Version: 0.9.9
 Summary: Python audio data toolkit (ID3 and MP3)
 Author-email: Travis Shirk <[email protected]>
-Project-URL: homepage, https://eyeD3.nicfit.net/
+Project-URL: homepage, https://eyed3.readthedocs.io/
 Project-URL: repository, https://github.com/nicfit/eyeD3
 Keywords: id3,mp3,python
 Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -15,12 +15,12 @@
 Classifier: Operating System :: POSIX
 Classifier: Natural Language :: English
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
-Requires-Python: <4.0,>=3.9
+Classifier: Programming Language :: Python :: 3.14
+Requires-Python: <4.0,>=3.10
 Description-Content-Type: text/x-rst
 License-File: LICENSE
 License-File: AUTHORS.rst
@@ -29,9 +29,9 @@
 Provides-Extra: yaml-plugin
 Requires-Dist: PyYAML>=6.0.2; extra == "yaml-plugin"
 Provides-Extra: art-plugin
-Requires-Dist: Pillow>=11.2.1; extra == "art-plugin"
+Requires-Dist: Pillow>=11.3.0; extra == "art-plugin"
 Requires-Dist: pylast>=5.5.0; extra == "art-plugin"
-Requires-Dist: requests>=2.32.3; extra == "art-plugin"
+Requires-Dist: requests>=2.32.4; extra == "art-plugin"
 Provides-Extra: test
 Requires-Dist: pytest>=8.3.5; extra == "test"
 Requires-Dist: coverage>=7.8.0; extra == "test"
@@ -45,7 +45,7 @@
 Requires-Dist: Sphinx>=7.4.7; extra == "dev"
 Requires-Dist: sphinx-rtd-theme>=3.0.2; extra == "dev"
 Requires-Dist: sphinx-issues>=5.0.1; extra == "dev"
-Requires-Dist: cogapp>=3.4.1; extra == "dev"
+Requires-Dist: cogapp>=3.5; extra == "dev"
 Requires-Dist: Paver>=1.3.4; extra == "dev"
 Requires-Dist: nicfit-py[cookiecutter]>=0.8.7; extra == "dev"
 Requires-Dist: regarding>=0.2.0; extra == "dev"
@@ -62,9 +62,14 @@
 .. image:: https://img.shields.io/pypi/pyversions/eyeD3.svg
    :target: https://pypi.python.org/pypi/eyeD3/
    :alt: Supported Python versions
-.. image:: https://img.shields.io/pypi/dm/eyeD3
+.. image:: 
https://img.shields.io/pypi/dm/eyeD3?style=plastic&label=PyPI%20Downloads
+   :target: https://pypi.org/project/eyeD3/
    :alt: PyPI - Downloads
-.. image:: https://img.shields.io/github/stars/nicfit/eyeD3
+.. image:: 
https://img.shields.io/github/downloads/nicfit/eyeD3/total?style=plastic&label=GitHub%20Downloads
+   :target: https://github.com/nicfit/eyeD3/releases
+   :alt: GitHub Downloads (all assets, all releases)
+.. image:: 
https://img.shields.io/github/stars/nicfit/eyeD3?style=plastic&label=GitHub%20Stars
+   :target: https://github.com/nicfit/eyeD3/stargazers
    :alt: GitHub Repo stars
 
 
@@ -140,19 +145,19 @@
 Get Started
 -----------
 
-Python >= 3.9 is required.
+Python >= 3.10 is required.
 
 For `installation instructions`_ or more complete `documentation`_ see
-http://eyeD3.nicfit.net/
+https://eyed3.readthedocs.io/
 
 Please post feedback and/or defects on the `issue tracker`_, or `mailing 
list`_.
 
-.. _eyeD3: http://eyeD3.nicfit.net/
+.. _eyeD3: https://eyed3.readthedocs.io/
 .. _Travis Shirk: [email protected]
 .. _issue tracker: https://github.com/nicfit/eyeD3/issues
 .. _mailing list: 
https://groups.google.com/forum/?fromgroups#!forum/eyed3-users
-.. _installation instructions: http://eyeD3.nicfit.net/index.html#installation
-.. _documentation: http://eyeD3.nicfit.net/index.html#documentation
+.. _installation instructions: 
https://eyed3.readthedocs.io/en/latest/installation.html
+.. _documentation: https://eyed3.readthedocs.io/
 .. _GPL: http://www.gnu.org/licenses/gpl-2.0.html
 .. _ID3: http://id3.org/
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/README.rst new/eyed3-0.9.9/README.rst
--- old/eyed3-0.9.8/README.rst  2025-04-23 04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/README.rst  2025-10-23 05:40:24.000000000 +0200
@@ -9,9 +9,14 @@
 .. image:: https://img.shields.io/pypi/pyversions/eyeD3.svg
    :target: https://pypi.python.org/pypi/eyeD3/
    :alt: Supported Python versions
-.. image:: https://img.shields.io/pypi/dm/eyeD3
+.. image:: 
https://img.shields.io/pypi/dm/eyeD3?style=plastic&label=PyPI%20Downloads
+   :target: https://pypi.org/project/eyeD3/
    :alt: PyPI - Downloads
-.. image:: https://img.shields.io/github/stars/nicfit/eyeD3
+.. image:: 
https://img.shields.io/github/downloads/nicfit/eyeD3/total?style=plastic&label=GitHub%20Downloads
+   :target: https://github.com/nicfit/eyeD3/releases
+   :alt: GitHub Downloads (all assets, all releases)
+.. image:: 
https://img.shields.io/github/stars/nicfit/eyeD3?style=plastic&label=GitHub%20Stars
+   :target: https://github.com/nicfit/eyeD3/stargazers
    :alt: GitHub Repo stars
 
 
@@ -87,19 +92,19 @@
 Get Started
 -----------
 
-Python >= 3.9 is required.
+Python >= 3.10 is required.
 
 For `installation instructions`_ or more complete `documentation`_ see
-http://eyeD3.nicfit.net/
+https://eyed3.readthedocs.io/
 
 Please post feedback and/or defects on the `issue tracker`_, or `mailing 
list`_.
 
-.. _eyeD3: http://eyeD3.nicfit.net/
+.. _eyeD3: https://eyed3.readthedocs.io/
 .. _Travis Shirk: [email protected]
 .. _issue tracker: https://github.com/nicfit/eyeD3/issues
 .. _mailing list: 
https://groups.google.com/forum/?fromgroups#!forum/eyed3-users
-.. _installation instructions: http://eyeD3.nicfit.net/index.html#installation
-.. _documentation: http://eyeD3.nicfit.net/index.html#documentation
+.. _installation instructions: 
https://eyed3.readthedocs.io/en/latest/installation.html
+.. _documentation: https://eyed3.readthedocs.io/
 .. _GPL: http://www.gnu.org/licenses/gpl-2.0.html
 .. _ID3: http://id3.org/
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/cli.rst new/eyed3-0.9.9/docs/cli.rst
--- old/eyed3-0.9.8/docs/cli.rst        2022-01-14 06:33:24.000000000 +0100
+++ new/eyed3-0.9.9/docs/cli.rst        2025-11-16 16:13:46.000000000 +0100
@@ -101,16 +101,16 @@
 Documenting Plugins
 ^^^^^^^^^^^^^^^^^^^^
 Plugin docs are generated. Start each plugin with the following template;
-**but replace the square brackets with curly.*** ::
+**but replace the parenthesis with curly brackets.*** ::
 
   Example Plugin
   ===============
 
-  .. [[[cog
+  .. (((cog
   .. cog.out(cog_pluginHelp("example-plugin"))
-  .. ]]]
+  .. )))
 
-  .. [[[end]]]
+  .. (((end)))
 
 The documentation build process will run `eyeD3 --plugin example-plugin` and
 generate docs from the command line options and plugin metadata such as the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/installation.rst 
new/eyed3-0.9.9/docs/installation.rst
--- old/eyed3-0.9.8/docs/installation.rst       2022-01-14 06:33:35.000000000 
+0100
+++ new/eyed3-0.9.9/docs/installation.rst       2025-10-23 05:40:24.000000000 
+0200
@@ -70,7 +70,7 @@
     $ export PYTHONPATH=`pwd`/build/lib
     $ export PATH=${PATH}:`pwd`/bin
 
-.. _release archive: http://eyed3.nicfit.net/releases/
+.. _release archive: https://github.com/nicfit/eyeD3/releases
 
 Checking Out the Source Code
 ============================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/plugins/classic_plugin.rst 
new/eyed3-0.9.9/docs/plugins/classic_plugin.rst
--- old/eyed3-0.9.8/docs/plugins/classic_plugin.rst     2025-04-23 
04:07:51.000000000 +0200
+++ new/eyed3-0.9.9/docs/plugins/classic_plugin.rst     2025-11-16 
16:13:46.000000000 +0100
@@ -27,42 +27,45 @@
 -------
 .. code-block:: text
 
-    -a, --artist STRING   Set the artist name.
-    -A, --album STRING    Set the album name.
-    -b, --album-artist STRING
-                          Set the album artist name. 'Various Artists', for 
example. Another example is collaborations when the track artist
-                          might be 'Eminem featuring Proof' the album artist 
would be 'Eminem'.
-    -t, --title STRING    Set the track title.
-    -n, --track NUM       Set the track number. Use 0 to clear.
-    -N, --track-total NUM
+    -a STRING, --artist STRING
+                          Set the artist name.
+    -A STRING, --album STRING
+                          Set the album name.
+    -b STRING, --album-artist STRING
+                          Set the album artist name. 'Various Artists', for 
example. Another example is collaborations when the track artist might be 
'Eminem featuring Proof' the album artist
+                          would be 'Eminem'.
+    -t STRING, --title STRING
+                          Set the track title.
+    -n NUM, --track NUM   Set the track number. Use 0 to clear.
+    -N NUM, --track-total NUM
                           Set total number of tracks. Use 0 to clear.
     --track-offset N      Increment/decrement the track number by [-]N. This 
option is applied after --track=N is set.
     --composer STRING     Set the composer's name.
     --orig-artist STRING  Set the orignal artist's name. For example, a cover 
song can include the orignal author of the track.
-    -d, --disc-num NUM    Set the disc number. Use 0 to clear.
-    -D, --disc-total NUM  Set total number of discs in set. Use 0 to clear.
-    -G, --genre GENRE     Set the genre. If the argument is a standard ID3 
genre name or number both will be set. Otherwise, any string can be
-                          used. Run 'eyeD3 --plugin=genres' for a list of 
standard ID3 genre names/ids.
-    --non-std-genres      Disables certain ID3 genre standards, such as the 
mapping of numeric value to genre names. For example, genre=1 is
-                          taken literally, not mapped to 'Classic Rock'.
-    -Y, --release-year YEAR
+    -d NUM, --disc-num NUM
+                          Set the disc number. Use 0 to clear.
+    -D NUM, --disc-total NUM
+                          Set total number of discs in set. Use 0 to clear.
+    -G GENRE, --genre GENRE
+                          Set the genre. If the argument is a standard ID3 
genre name or number both will be set. Otherwise, any string can be used. Run 
'eyeD3 --plugin=genres' for a list of
+                          standard ID3 genre names/ids.
+    --non-std-genres      Disables certain ID3 genre standards, such as the 
mapping of numeric value to genre names. For example, genre=1 is taken 
literally, not mapped to 'Classic Rock'.
+    -Y YEAR, --release-year YEAR
                           Set the year the track was released. Use the date 
options for more precise values or dates other than release.
-    -c, --comment STRING  Set a comment. In ID3 tags this is the comment with 
an empty description. See --add-comment to add multiple comment
-                          frames.
+    -c STRING, --comment STRING
+                          Set a comment. In ID3 tags this is the comment with 
an empty description. See --add-comment to add multiple comment frames.
     --artist-city STRING  The artist's city of origin. Stored as a user text 
frame `eyeD3#artist_origin`
     --artist-state STRING
                           The artist's state of origin. Stored as a user text 
frame `eyeD3#artist_origin`
     --artist-country STRING
                           The artist's country of origin. Stored as a user 
text frame `eyeD3#artist_origin`
-    --rename PATTERN      Rename file (the extension is not affected) based on 
data in the tag using substitution variables: $album,
-                          $album_artist, $artist, $best_date, 
$best_date:prefer_recording, $best_date:prefer_recording:year,
-                          $best_date:prefer_release, 
$best_date:prefer_release:year, $best_date:year, $disc:num, $disc:total, $file, 
$file:ext,
-                          $original_release_date, $original_release_date:year, 
$recording_date, $recording_date:year, $release_date,
-                          $release_date:year, $title, $track:num, $track:total
+    --rename PATTERN      Rename file (the extension is not affected) based on 
data in the tag using substitution variables: $album, $album_artist, $artist, 
$best_date,
+                          $best_date:prefer_recording, 
$best_date:prefer_recording:year, $best_date:prefer_release, 
$best_date:prefer_release:year, $best_date:year, $disc:num, $disc:total,
+                          $file, $file:ext, $original_release_date, 
$original_release_date:year, $recording_date, $recording_date:year, 
$release_date, $release_date:year, $title, $track:num,
+                          $track:total
   
   ID3 options:
-    -1, --v1              Only read and write ID3 v1.x tags. By default, v1.x 
tags are only read or written if there is not a v2 tag in the
-                          file.
+    -1, --v1              Only read and write ID3 v1.x tags. By default, v1.x 
tags are only read or written if there is not a v2 tag in the file.
     -2, --v2              Only read/write ID3 v2.x tags. This is the default 
unless the file only contains a v1 tag.
     --to-v1.1             Convert the file's tag to ID3 v1.1 (Or 1.0 if there 
is no track number)
     --to-v2.3             Convert the file's tag to ID3 v2.3
@@ -75,56 +78,49 @@
     --encoding-date DATE  Set the date the file was encoded
     --tagging-date DATE   Set the date the file was tagged
     --publisher STRING    Set the publisher/label name
-    --play-count <+>N     Set the number of times played counter. If the 
argument value begins with '+' the tag's play count is incremented by
-                          N, otherwise the value is set to exactly N.
+    --play-count <+>N     Set the number of times played counter. If the 
argument value begins with '+' the tag's play count is incremented by N, 
otherwise the value is set to exactly N.
     --bpm N               Set the beats per minute value.
     --unique-file-id OWNER_ID:ID
-                          Add a unique file ID frame. If the ID arg is empty 
the frame is removed. An OWNER_ID is required. The ID may be no
-                          more than 64 bytes.
+                          Add a unique file ID frame. If the ID arg is empty 
the frame is removed. An OWNER_ID is required. The ID may be no more than 64 
bytes.
     --add-comment COMMENT[:DESCRIPTION[:LANG]]
-                          Add or replace a comment. There may be more than one 
comment in a tag, as long as the DESCRIPTION and LANG values are
-                          unique. The default DESCRIPTION is '' and the 
default language code is 'eng'.
+                          Add or replace a comment. There may be more than one 
comment in a tag, as long as the DESCRIPTION and LANG values are unique. The 
default DESCRIPTION is '' and the
+                          default language code is 'eng'.
     --remove-comment DESCRIPTION[:LANG]
                           Remove comment matching DESCRIPTION and LANG. The 
default language code is 'eng'.
     --remove-all-comments
                           Remove all comments from the tag.
     --remove-all-unknown  Remove all unknown frames from the tag.
     --add-lyrics LYRICS_FILE[:DESCRIPTION[:LANG]]
-                          Add or replace a lyrics. There may be more than one 
set of lyrics in a tag, as long as the DESCRIPTION and LANG values
-                          are unique. The default DESCRIPTION is '' and the 
default language code is 'eng'.
+                          Add or replace a lyrics. There may be more than one 
set of lyrics in a tag, as long as the DESCRIPTION and LANG values are unique. 
The default DESCRIPTION is '' and
+                          the default language code is 'eng'.
     --remove-lyrics DESCRIPTION[:LANG]
                           Remove lyrics matching DESCRIPTION and LANG. The 
default language code is 'eng'.
     --remove-all-lyrics   Remove all lyrics from the tag.
     --text-frame FID:TEXT
                           Set the value of a text frame. To remove the frame, 
specify an empty value. For example, --text-frame='TDRC:'
     --user-text-frame DESC:TEXT
-                          Set the value of a user text frame (i.e., TXXX). To 
remove the frame, specify an empty value. e.g., --user-text-
-                          frame='SomeDesc:'
+                          Set the value of a user text frame (i.e., TXXX). To 
remove the frame, specify an empty value. e.g., --user-text-frame='SomeDesc:'
     --url-frame FID:URL   Set the value of a URL frame. To remove the frame, 
specify an empty value. e.g., --url-frame='WCOM:'
     --user-url-frame DESCRIPTION:URL
-                          Set the value of a user URL frame (i.e., WXXX). To 
remove the frame, specify an empty value. e.g., --user-url-
-                          frame='SomeDesc:'
+                          Set the value of a user URL frame (i.e., WXXX). To 
remove the frame, specify an empty value. e.g., --user-url-frame='SomeDesc:'
     --add-image IMG_PATH:TYPE[:DESCRIPTION]
-                          Add or replace an image. There may be more than one 
image in a tag, as long as the DESCRIPTION values are unique. The
-                          default DESCRIPTION is ''. If PATH begins with 
'http[s]://' then it is interpreted as a URL instead of a file
-                          containing image data. The TYPE must be one of the 
following: OTHER, ICON, OTHER_ICON, FRONT_COVER, BACK_COVER,
-                          LEAFLET, MEDIA, LEAD_ARTIST, ARTIST, CONDUCTOR, 
BAND, COMPOSER, LYRICIST, RECORDING_LOCATION, DURING_RECORDING,
-                          DURING_PERFORMANCE, VIDEO, BRIGHT_COLORED_FISH, 
ILLUSTRATION, BAND_LOGO, PUBLISHER_LOGO.
+                          Add or replace an image. There may be more than one 
image in a tag, as long as the DESCRIPTION values are unique. The default 
DESCRIPTION is ''. If PATH begins with
+                          'http[s]://' then it is interpreted as a URL instead 
of a file containing image data. The TYPE must be one of the following: OTHER, 
ICON, OTHER_ICON, FRONT_COVER,
+                          BACK_COVER, LEAFLET, MEDIA, LEAD_ARTIST, ARTIST, 
CONDUCTOR, BAND, COMPOSER, LYRICIST, RECORDING_LOCATION, DURING_RECORDING, 
DURING_PERFORMANCE, VIDEO,
+                          BRIGHT_COLORED_FISH, ILLUSTRATION, BAND_LOGO, 
PUBLISHER_LOGO.
     --remove-image DESCRIPTION
                           Remove image matching DESCRIPTION.
     --remove-all-images   Remove all images from the tag
     --write-images DIR    Causes all attached images (APIC frames) to be 
written to the specified directory.
     --add-object OBJ_PATH:MIME-TYPE[:DESCRIPTION[:FILENAME]]
-                          Add or replace an object. There may be more than one 
object in a tag, as long as the DESCRIPTION values are unique.
-                          The default DESCRIPTION is ''.
+                          Add or replace an object. There may be more than one 
object in a tag, as long as the DESCRIPTION values are unique. The default 
DESCRIPTION is ''.
     --remove-object DESCRIPTION
                           Remove object matching DESCRIPTION.
     --write-objects DIR   Causes all attached objects (GEOB frames) to be 
written to the specified directory.
     --remove-all-objects  Remove all objects from the tag
     --add-popularity EMAIL:RATING[:PLAY_COUNT]
-                          Adds a pupularity metric. There may be multiples 
popularity values, but each must have a unique email address
-                          component. The rating is a number between 0 (worst) 
and 255 (best). The play count is optional, and defaults to 0,
-                          since there is already a dedicated play count frame.
+                          Adds a pupularity metric. There may be multiples 
popularity values, but each must have a unique email address component. The 
rating is a number between 0 (worst) and
+                          255 (best). The play count is optional, and defaults 
to 0, since there is already a dedicated play count frame.
     --remove-popularity EMAIL
                           Removes the popularity frame with the specified 
email key.
     --remove-v1           Remove ID3 v1.x tag.
@@ -132,12 +128,12 @@
     --remove-all          Remove ID3 v1.x and v2.x tags.
     --remove-frame FID    Remove all frames with the given ID. This option may 
be specified multiple times.
     --max-padding NUM_BYTES
-                          Shrink file if tag padding (unused space) exceeds 
the given number of bytes. (Useful e.g. after removal of large cover
-                          art.) Default is 64 KiB, file will be rewritten with 
default padding (1 KiB) or max padding, whichever is smaller.
+                          Shrink file if tag padding (unused space) exceeds 
the given number of bytes. (Useful e.g. after removal of large cover art.) 
Default is 64 KiB, file will be rewritten
+                          with default padding (1 KiB) or max padding, 
whichever is smaller.
     --no-max-padding      Disable --max-padding altogether.
     --encoding latin1|utf8|utf16|utf16-be
-                          Set the encoding that is used for all text frames. 
This option is only applied if the tag is updated as the result of
-                          an edit option (e.g. --artist, --title, etc.) or 
--force-update is specified.
+                          Set the encoding that is used for all text frames. 
This option is only applied if the tag is updated as the result of an edit 
option (e.g. --artist, --title, etc.) or
+                          --force-update is specified.
   
   Misc options:
     --force-update        Rewrite the tag despite there being no edit options.
@@ -203,7 +199,7 @@
   # Convert the current v2.4 frame to v2.3
   $ eyeD3 --to-v2.3 example.id3 -Q
 
-  /home/travis/devel/eyeD3/git/example.id3                         [ 0.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                            [ 0.00 
Bytes ]
   
-------------------------------------------------------------------------------
   ID3 v2.4: 0 frames
   Writing ID3 version v2.3
@@ -212,7 +208,7 @@
   # Convert back
   $ eyeD3 --to-v2.4 example.id3 -Q
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 266.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 266.00 
Bytes ]
   
-------------------------------------------------------------------------------
   ID3 v2.3: 0 frames
   Writing ID3 version v2.4
@@ -221,7 +217,7 @@
   # Convert to v1, this will lose all the more advanced data members ID3 v2 
offers
   $ eyeD3 --to-v1.1 example.id3 -Q
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 266.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 266.00 
Bytes ]
   
-------------------------------------------------------------------------------
   ID3 v2.4: 0 frames
   Writing ID3 version v1.1
@@ -242,7 +238,7 @@
 
   $ eyeD3 -1 example.id3
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 394.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 394.00 
Bytes ]
   
-------------------------------------------------------------------------------
   ID3 v1.0:
   title: 
@@ -263,7 +259,7 @@
   # Set an artist value in the ID3 v1 tag
   $ eyeD3 -1 example.id3 -a id3v1
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 394.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 394.00 
Bytes ]
   
-------------------------------------------------------------------------------
   Setting artist: id3v1
   ID3 v1.0:
@@ -277,7 +273,7 @@
   # The file now has a v1 and v2 tag, change the v2 artist
   $ eyeD3 -2 example.id3 -a id3v2
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 394.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 394.00 
Bytes ]
   
-------------------------------------------------------------------------------
   Setting artist: id3v2
   ID3 v2.4:
@@ -291,7 +287,7 @@
   # Take all the values from v2.4 tag (the default) and set them in the v1 tag.
   $ eyeD3 -2 --to-v1.1 example.id3
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 394.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 394.00 
Bytes ]
   
-------------------------------------------------------------------------------
   ID3 v2.4:
   title: 
@@ -304,7 +300,7 @@
   # Take all the values from v1 tag and convert to ID3 v2.3
   $ eyeD3 -1 --to-v2.3 example.id3
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 394.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 394.00 
Bytes ]
   
-------------------------------------------------------------------------------
   ID3 v1.0:
   title: 
@@ -325,7 +321,7 @@
 
   $ eyeD3 --remove-all example.id3
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 394.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 394.00 
Bytes ]
   
-------------------------------------------------------------------------------
   Removing ID3 v1.x and/or v2.x tag: SUCCESS
   No ID3 v1.x/v2.x tag found!
@@ -370,7 +366,7 @@
 
   $ eyeD3 --add-image http\\://example.com/cover.jpg:FRONT_COVER example.id3
 
-  /home/travis/devel/eyeD3/git/example.id3                         [ 0.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                            [ 0.00 
Bytes ]
   
-------------------------------------------------------------------------------
   Adding image http://example.com/cover.jpg
   ID3 v2.4:
@@ -394,7 +390,7 @@
 
   $ eyeD3 --add-image http\\://example.com/cover.jpg:FRONT_COVER example.id3
 
-  /home/travis/devel/eyeD3/git/example.id3                       [ 311.00 
Bytes ]
+  /home/trshirk/devel/eyeD3/example.id3                          [ 311.00 
Bytes ]
   
-------------------------------------------------------------------------------
   Adding image http://example.com/cover.jpg
   ID3 v2.4:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/plugins/extract_plugin.rst 
new/eyed3-0.9.9/docs/plugins/extract_plugin.rst
--- old/eyed3-0.9.8/docs/plugins/extract_plugin.rst     2025-04-23 
04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/docs/plugins/extract_plugin.rst     2025-11-16 
16:13:46.000000000 +0100
@@ -19,7 +19,7 @@
 -------
 .. code-block:: text
 
-    -o, --output-file OUTPUT_FILE
+    -o OUTPUT_FILE, --output-file OUTPUT_FILE
                           The the tag is written to this file in native format.
     -H, --hex             Output hexadecimal format.
     --strip-padding       Exclude tag padding, if any.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/plugins/fixup_plugin.rst 
new/eyed3-0.9.9/docs/plugins/fixup_plugin.rst
--- old/eyed3-0.9.8/docs/plugins/fixup_plugin.rst       2025-04-23 
04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/docs/plugins/fixup_plugin.rst       2025-11-16 
16:13:46.000000000 +0100
@@ -73,24 +73,20 @@
 .. code-block:: text
 
     --type {lp,ep,compilation,live,various,demo,single}
-                          How to treat each directory. The default is 'lp', 
although you may be prompted for an alternate choice if the files
-                          look like another type.
+                          How to treat each directory. The default is 'lp', 
although you may be prompted for an alternate choice if the files look like 
another type.
     --fix-case            Fix casing on each string field by capitalizing each 
word.
     -n, --dry-run         Only print the operations that would take place, but 
do not execute them.
     --no-prompt           Exit if prompted.
     --dotted-dates        Separate date with '.' instead of '-' when naming 
directories.
     --file-rename-pattern FILE_RENAME_PATTERN
-                          Rename file (the extension is not affected) based on 
data in the tag using substitution variables: $album,
-                          $album_artist, $artist, $best_date, 
$best_date:prefer_recording, $best_date:prefer_recording:year,
-                          $best_date:prefer_release, 
$best_date:prefer_release:year, $best_date:year, $disc:num, $disc:total, $file, 
$file:ext,
-                          $original_release_date, $original_release_date:year, 
$recording_date, $recording_date:year, $release_date,
-                          $release_date:year, $title, $track:num, $track:total
+                          Rename file (the extension is not affected) based on 
data in the tag using substitution variables: $album, $album_artist, $artist, 
$best_date,
+                          $best_date:prefer_recording, 
$best_date:prefer_recording:year, $best_date:prefer_release, 
$best_date:prefer_release:year, $best_date:year, $disc:num, $disc:total,
+                          $file, $file:ext, $original_release_date, 
$original_release_date:year, $recording_date, $recording_date:year, 
$release_date, $release_date:year, $title, $track:num,
+                          $track:total
     --dir-rename-pattern DIR_RENAME_PATTERN
-                          Rename directory based on data in the tag using 
substitution variables: $album, $album_artist, $artist, $best_date,
-                          $best_date:prefer_recording, 
$best_date:prefer_recording:year, $best_date:prefer_release,
-                          $best_date:prefer_release:year, $best_date:year, 
$disc:num, $disc:total, $file, $file:ext, $original_release_date,
-                          $original_release_date:year, $recording_date, 
$recording_date:year, $release_date, $release_date:year, $title,
-                          $track:num, $track:total
+                          Rename directory based on data in the tag using 
substitution variables: $album, $album_artist, $artist, $best_date, 
$best_date:prefer_recording,
+                          $best_date:prefer_recording:year, 
$best_date:prefer_release, $best_date:prefer_release:year, $best_date:year, 
$disc:num, $disc:total, $file, $file:ext,
+                          $original_release_date, $original_release_date:year, 
$recording_date, $recording_date:year, $release_date, $release_date:year, 
$title, $track:num, $track:total
     --no-dir-rename       Do not rename the directory.
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/plugins/itunes_plugin.rst 
new/eyed3-0.9.9/docs/plugins/itunes_plugin.rst
--- old/eyed3-0.9.8/docs/plugins/itunes_plugin.rst      2025-04-23 
04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/docs/plugins/itunes_plugin.rst      2025-11-16 
16:13:46.000000000 +0100
@@ -34,19 +34,19 @@
 
   $ eyeD3 -P itunes-podcast example.id3
 
-  /home/travis/devel/eyeD3/git/example.id3
+  /home/trshirk/devel/eyeD3/example.id3
        iTunes podcast? :-(
 
   $ eyeD3 -P itunes-podcast example.id3 --add
 
-  /home/travis/devel/eyeD3/git/example.id3
+  /home/trshirk/devel/eyeD3/example.id3
        iTunes podcast? :-(
        Adding...
        iTunes podcast? :-)
 
   $ eyeD3 -P itunes-podcast example.id3 --remove
 
-  /home/travis/devel/eyeD3/git/example.id3
+  /home/trshirk/devel/eyeD3/example.id3
        iTunes podcast? :-)
        Removing...
        iTunes podcast? :-(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/plugins/lameinfo_plugin.rst 
new/eyed3-0.9.9/docs/plugins/lameinfo_plugin.rst
--- old/eyed3-0.9.8/docs/plugins/lameinfo_plugin.rst    2025-04-23 
04:07:51.000000000 +0200
+++ new/eyed3-0.9.9/docs/plugins/lameinfo_plugin.rst    2025-11-16 
16:13:46.000000000 +0100
@@ -34,7 +34,7 @@
 
   $ eyeD3 -P lameinfo tests/data/notag-vbr.mp3
 
-  /home/travis/devel/eyeD3/git/tests/data/notag-vbr.mp3               [ 5.98 
MB ]
+  /home/trshirk/devel/eyeD3/tests/data/notag-vbr.mp3                  [ 5.98 
MB ]
   
-------------------------------------------------------------------------------
   Encoder Version     : LAME3.91
   LAME Tag Revision   : 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/docs/plugins/pymod_plugin.rst 
new/eyed3-0.9.9/docs/plugins/pymod_plugin.rst
--- old/eyed3-0.9.8/docs/plugins/pymod_plugin.rst       2025-04-23 
04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/docs/plugins/pymod_plugin.rst       2025-11-16 
16:13:46.000000000 +0100
@@ -37,7 +37,8 @@
 -------
 .. code-block:: text
 
-    -m, --module MODULE  The Python module module to invoke. The default is 
./eyeD3mod.py
+    -m MODULE, --module MODULE
+                          The Python module module to invoke. The default is 
./eyeD3mod.py
 
 
 .. {{{end}}}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyeD3.egg-info/PKG-INFO 
new/eyed3-0.9.9/eyeD3.egg-info/PKG-INFO
--- old/eyed3-0.9.8/eyeD3.egg-info/PKG-INFO     2025-04-26 23:22:31.000000000 
+0200
+++ new/eyed3-0.9.9/eyeD3.egg-info/PKG-INFO     2025-11-16 17:08:09.000000000 
+0100
@@ -1,9 +1,9 @@
 Metadata-Version: 2.4
 Name: eyeD3
-Version: 0.9.8
+Version: 0.9.9
 Summary: Python audio data toolkit (ID3 and MP3)
 Author-email: Travis Shirk <[email protected]>
-Project-URL: homepage, https://eyeD3.nicfit.net/
+Project-URL: homepage, https://eyed3.readthedocs.io/
 Project-URL: repository, https://github.com/nicfit/eyeD3
 Keywords: id3,mp3,python
 Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -15,12 +15,12 @@
 Classifier: Operating System :: POSIX
 Classifier: Natural Language :: English
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
-Requires-Python: <4.0,>=3.9
+Classifier: Programming Language :: Python :: 3.14
+Requires-Python: <4.0,>=3.10
 Description-Content-Type: text/x-rst
 License-File: LICENSE
 License-File: AUTHORS.rst
@@ -29,9 +29,9 @@
 Provides-Extra: yaml-plugin
 Requires-Dist: PyYAML>=6.0.2; extra == "yaml-plugin"
 Provides-Extra: art-plugin
-Requires-Dist: Pillow>=11.2.1; extra == "art-plugin"
+Requires-Dist: Pillow>=11.3.0; extra == "art-plugin"
 Requires-Dist: pylast>=5.5.0; extra == "art-plugin"
-Requires-Dist: requests>=2.32.3; extra == "art-plugin"
+Requires-Dist: requests>=2.32.4; extra == "art-plugin"
 Provides-Extra: test
 Requires-Dist: pytest>=8.3.5; extra == "test"
 Requires-Dist: coverage>=7.8.0; extra == "test"
@@ -45,7 +45,7 @@
 Requires-Dist: Sphinx>=7.4.7; extra == "dev"
 Requires-Dist: sphinx-rtd-theme>=3.0.2; extra == "dev"
 Requires-Dist: sphinx-issues>=5.0.1; extra == "dev"
-Requires-Dist: cogapp>=3.4.1; extra == "dev"
+Requires-Dist: cogapp>=3.5; extra == "dev"
 Requires-Dist: Paver>=1.3.4; extra == "dev"
 Requires-Dist: nicfit-py[cookiecutter]>=0.8.7; extra == "dev"
 Requires-Dist: regarding>=0.2.0; extra == "dev"
@@ -62,9 +62,14 @@
 .. image:: https://img.shields.io/pypi/pyversions/eyeD3.svg
    :target: https://pypi.python.org/pypi/eyeD3/
    :alt: Supported Python versions
-.. image:: https://img.shields.io/pypi/dm/eyeD3
+.. image:: 
https://img.shields.io/pypi/dm/eyeD3?style=plastic&label=PyPI%20Downloads
+   :target: https://pypi.org/project/eyeD3/
    :alt: PyPI - Downloads
-.. image:: https://img.shields.io/github/stars/nicfit/eyeD3
+.. image:: 
https://img.shields.io/github/downloads/nicfit/eyeD3/total?style=plastic&label=GitHub%20Downloads
+   :target: https://github.com/nicfit/eyeD3/releases
+   :alt: GitHub Downloads (all assets, all releases)
+.. image:: 
https://img.shields.io/github/stars/nicfit/eyeD3?style=plastic&label=GitHub%20Stars
+   :target: https://github.com/nicfit/eyeD3/stargazers
    :alt: GitHub Repo stars
 
 
@@ -140,19 +145,19 @@
 Get Started
 -----------
 
-Python >= 3.9 is required.
+Python >= 3.10 is required.
 
 For `installation instructions`_ or more complete `documentation`_ see
-http://eyeD3.nicfit.net/
+https://eyed3.readthedocs.io/
 
 Please post feedback and/or defects on the `issue tracker`_, or `mailing 
list`_.
 
-.. _eyeD3: http://eyeD3.nicfit.net/
+.. _eyeD3: https://eyed3.readthedocs.io/
 .. _Travis Shirk: [email protected]
 .. _issue tracker: https://github.com/nicfit/eyeD3/issues
 .. _mailing list: 
https://groups.google.com/forum/?fromgroups#!forum/eyed3-users
-.. _installation instructions: http://eyeD3.nicfit.net/index.html#installation
-.. _documentation: http://eyeD3.nicfit.net/index.html#documentation
+.. _installation instructions: 
https://eyed3.readthedocs.io/en/latest/installation.html
+.. _documentation: https://eyed3.readthedocs.io/
 .. _GPL: http://www.gnu.org/licenses/gpl-2.0.html
 .. _ID3: http://id3.org/
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyeD3.egg-info/requires.txt 
new/eyed3-0.9.9/eyeD3.egg-info/requires.txt
--- old/eyed3-0.9.8/eyeD3.egg-info/requires.txt 2025-04-26 23:22:31.000000000 
+0200
+++ new/eyed3-0.9.9/eyeD3.egg-info/requires.txt 2025-11-16 17:08:09.000000000 
+0100
@@ -2,16 +2,16 @@
 deprecation>=2.1.0
 
 [art-plugin]
-Pillow>=11.2.1
+Pillow>=11.3.0
 pylast>=5.5.0
-requests>=2.32.3
+requests>=2.32.4
 
 [dev]
 twine>=6.1.0
 Sphinx>=7.4.7
 sphinx-rtd-theme>=3.0.2
 sphinx-issues>=5.0.1
-cogapp>=3.4.1
+cogapp>=3.5
 Paver>=1.3.4
 nicfit-py[cookiecutter]>=0.8.7
 regarding>=0.2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyed3/__regarding__.py 
new/eyed3-0.9.9/eyed3/__regarding__.py
--- old/eyed3-0.9.8/eyed3/__regarding__.py      2025-04-26 23:22:30.000000000 
+0200
+++ new/eyed3-0.9.9/eyed3/__regarding__.py      2025-11-16 17:08:07.000000000 
+0100
@@ -22,20 +22,20 @@
 
 
 project_name = "eyeD3"
-version = "0.9.8"
+version = "0.9.9"
 version_info = Version(
-    0, 9, 8,
+    0, 9, 9,
     None,
     None,
     None,
-    "Armed & Dangerous",
+    "Guilty Conscience",
 )
 
 author = "Travis Shirk"
 author_email = "[email protected]"
 years = "2002-2025"
 description = "Python audio data toolkit (ID3 and MP3)"
-homepage = "https://eyeD3.nicfit.net/";
+homepage = "https://eyed3.readthedocs.io/";
 
 
 def versionBanner() -> str:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyed3/id3/tag.py 
new/eyed3-0.9.9/eyed3/id3/tag.py
--- old/eyed3-0.9.8/eyed3/id3/tag.py    2025-04-23 04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/eyed3/id3/tag.py    2025-10-23 05:40:24.000000000 +0200
@@ -10,7 +10,7 @@
 from ..core import TXXX_ALBUM_TYPE, TXXX_ARTIST_ORIGIN, ALBUM_TYPE_IDS, 
ArtistOrigin
 from .. import Error
 from . import (ID3_ANY_VERSION, ID3_DEFAULT_VERSION, ID3_V1, ID3_V1_0, 
ID3_V1_1,
-               ID3_V2, ID3_V2_2, ID3_V2_3, ID3_V2_4, versionToString)
+               ID3_V2, ID3_V2_2, ID3_V2_3, ID3_V2_4, versionToString, 
GenreException)
 from . import DEFAULT_LANG
 from . import Genre
 from . import frames
@@ -174,7 +174,7 @@
                 self.release_date = int(year)
         except ValueError:
             # Bogus year strings.
-            log.warn("ID3v1.x tag contains invalid year: %s" % year)
+            log.warning("ID3v1.x tag contains invalid year: %s" % year)
             pass
 
         # Can't use ID3_V1_STRIP_CHARS here, since the final byte is numeric
@@ -202,7 +202,7 @@
         log.debug(f"Genre ID: {genre}")
         try:
             self.genre = genre
-        except ValueError as ex:
+        except GenreException as ex:
             log.warning(ex)
             self.genre = None
 
@@ -535,7 +535,7 @@
     The date the work was originally released.
 
     NOTE: ID3v2.3 only stores year. If the Date object is more precise it is 
store in `XDOR`, and
-    XDOR is preferred when acessing. The year-only date is stored in the 
standard `TORY` frame as
+    XDOR is preferred when accessing. The year-only date is stored in the 
standard `TORY` frame as
     well.
     """)
 
@@ -1845,7 +1845,7 @@
         return super().get(element_id)
 
     def __getitem__(self, elem_id):
-        """Overiding the index based __getitem__ for one indexed with chapter
+        """Overriding the index based __getitem__ for one indexed with chapter
         element IDs. These are stored in the tag's table of contents frames."""
         for chapter in (self._fs[frames.CHAPTER_FID] or []):
             if chapter.element_id == elem_id:
@@ -1905,7 +1905,7 @@
         return super().get(element_id)
 
     def __getitem__(self, elem_id):
-        """Overiding the index based __getitem__ for one indexed with table
+        """Overriding the index based __getitem__ for one indexed with table
         of contents element IDs."""
         for toc in (self._fs[frames.TOC_FID] or []):
             if toc.element_id == elem_id:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyed3/main.py 
new/eyed3-0.9.9/eyed3/main.py
--- old/eyed3-0.9.8/eyed3/main.py       2025-04-23 04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/eyed3/main.py       2025-10-23 05:40:24.000000000 +0200
@@ -17,10 +17,10 @@
 from eyed3.utils.log import initLogging
 
 DEFAULT_PLUGIN = "classic"
-DEFAULT_CONFIG = os.path.expandvars("${HOME}/.config/eyeD3/config.ini")
-USER_PLUGINS_DIR = os.path.expandvars("${HOME}/.config/eyeD3/plugins")
-DEFAULT_CONFIG_DEPRECATED = os.path.expandvars("${HOME}/.eyeD3/config.ini")
-USER_PLUGINS_DIR_DEPRECATED = os.path.expandvars("${HOME}/.eyeD3/plugins")
+DEFAULT_CONFIG = os.path.expanduser("~/.config/eyeD3/config.ini")
+USER_PLUGINS_DIR = os.path.expanduser("~/.config/eyeD3/plugins")
+DEFAULT_CONFIG_DEPRECATED = os.path.expanduser("~/.eyeD3/config.ini")
+USER_PLUGINS_DIR_DEPRECATED = os.path.expanduser("~/.eyeD3/plugins")
 
 
 def main(args, config):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyed3/plugins/classic.py 
new/eyed3-0.9.9/eyed3/plugins/classic.py
--- old/eyed3-0.9.8/eyed3/plugins/classic.py    2025-04-23 04:07:47.000000000 
+0200
+++ new/eyed3-0.9.9/eyed3/plugins/classic.py    2025-10-23 05:40:39.000000000 
+0200
@@ -1,6 +1,7 @@
 import os
 import re
 import dataclasses
+import shutil
 from functools import partial
 from argparse import ArgumentTypeError
 
@@ -8,7 +9,7 @@
 from eyed3 import core, id3, mp3
 from eyed3.utils import makeUniqueFileName, b, formatTime
 from eyed3.utils.console import (
-    printMsg, printError, printWarning, boldText, getTtySize,
+    printMsg, printError, printWarning, boldText,
 )
 from eyed3.id3.frames import ImageFrame
 from eyed3.mimetype import guessMimetype
@@ -444,7 +445,7 @@
         if not self.audio_file:
             return
 
-        self.terminal_width = getTtySize()[1]
+        self.terminal_width = shutil.get_terminal_size()[1]
         self.printHeader(f)
 
         if self.audio_file.tag and self.handleRemoves(self.audio_file.tag):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyed3/plugins/lameinfo.py 
new/eyed3-0.9.9/eyed3/plugins/lameinfo.py
--- old/eyed3-0.9.8/eyed3/plugins/lameinfo.py   2021-01-01 05:10:12.000000000 
+0100
+++ new/eyed3-0.9.9/eyed3/plugins/lameinfo.py   2025-10-23 05:40:39.000000000 
+0200
@@ -1,6 +1,8 @@
 import math
+import shutil
+
 from eyed3.utils import formatSize
-from eyed3.utils.console import printMsg, getTtySize
+from eyed3.utils.console import printMsg
 from eyed3.plugins import LoaderPlugin
 
 
@@ -16,7 +18,7 @@
        )
 
     def printHeader(self, file_path):
-        w = getTtySize()[1]
+        w = shutil.get_terminal_size()[1]
         printMsg(self._getFileHeader(file_path, w))
         printMsg(self._getHardRule(w))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/eyed3/utils/console.py 
new/eyed3-0.9.9/eyed3/utils/console.py
--- old/eyed3-0.9.8/eyed3/utils/console.py      2025-04-23 04:07:47.000000000 
+0200
+++ new/eyed3-0.9.9/eyed3/utils/console.py      2025-10-23 05:40:39.000000000 
+0200
@@ -1,13 +1,14 @@
 import os
-import struct
 import sys
 import time
 import typing
+import shutil
 from typing import Union
 
+import deprecation
+from ..__about__ import __version__
+
 try:
-    import fcntl
-    import termios
     import signal
     _CAN_RESIZE_TERMINAL = True
 except ImportError:
@@ -277,8 +278,7 @@
         self.update(0)
 
     def _handle_resize(self, signum=None, frame=None):
-        self._terminal_width = getTtySize(self._file,
-                                          self._should_handle_resize)[1]
+        self._terminal_width = shutil.get_terminal_size()[1]
 
     def __enter__(self):
         return self
@@ -469,21 +469,10 @@
     return output
 
 
[email protected](deprecated_in="0.9.9", removed_in="1.0", 
current_version=__version__,
+                        details="Use shutil.get_terminal_size() instead.")
 def getTtySize(fd=sys.stdout, check_tty=True):
-    hw = None
-    if check_tty:
-        try:
-            data = fcntl.ioctl(fd, termios.TIOCGWINSZ, '\0' * 4)
-            hw = struct.unpack("hh", data)
-        except (OSError, NameError):
-            pass
-    if not hw:
-        try:
-            hw = (int(os.environ.get('LINES')),
-                  int(os.environ.get('COLUMNS')))
-        except (TypeError, ValueError):
-            hw = (25, 79)
-    return hw
+    return shutil.get_terminal_size()  # Added in Python 3.3
 
 
 def cprint(msg, fg, bg=None, styles=None, file=sys.stdout):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/pyproject.toml 
new/eyed3-0.9.9/pyproject.toml
--- old/eyed3-0.9.8/pyproject.toml      2025-04-26 23:22:30.000000000 +0200
+++ new/eyed3-0.9.9/pyproject.toml      2025-11-16 17:08:06.000000000 +0100
@@ -6,10 +6,10 @@
 
 [tool.regarding]
 years = "2002-2025"
-release_name = "Armed & Dangerous"
+release_name = "Guilty Conscience"
 
 [project]
-version = "0.9.8"
+version = "0.9.9"
 name = "eyeD3"
 description = "Python audio data toolkit (ID3 and MP3)"
 readme = "README.rst"
@@ -17,7 +17,7 @@
     {name = "Travis Shirk", email = "[email protected]"},
 ]
 #license = "GPL-3.0-or-later"
-requires-python = ">=3.9,<4.0"
+requires-python = ">=3.10,<4.0"
 classifiers = [
     "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
     "Environment :: Console",
@@ -28,11 +28,11 @@
     "Operating System :: POSIX",
     "Natural Language :: English",
     "Programming Language :: Python",
-    "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
     "Programming Language :: Python :: 3.13",
+    "Programming Language :: Python :: 3.14",
 ]
 keywords = ["id3", "mp3", "python"]
 dependencies = [
@@ -41,7 +41,7 @@
 ]
 
 [project.urls]
-homepage = "https://eyeD3.nicfit.net/";
+homepage = "https://eyed3.readthedocs.io/";
 repository = "https://github.com/nicfit/eyeD3";
 
 [project.scripts]
@@ -55,9 +55,9 @@
     "PyYAML>=6.0.2",
 ]
 art-plugin = [
-    "Pillow>=11.2.1",
+    "Pillow>=11.3.0",
     "pylast>=5.5.0",
-    "requests>=2.32.3",
+    "requests>=2.32.4",
 ]
 test = [
     "pytest>=8.3.5",
@@ -73,11 +73,10 @@
     "Sphinx>=7.4.7",
     "sphinx-rtd-theme>=3.0.2",
     "sphinx-issues>=5.0.1",
-    "cogapp>=3.4.1",
+    "cogapp>=3.5",
     "Paver>=1.3.4",
     "nicfit-py[cookiecutter]>=0.8.7",
     "regarding>=0.2.0",
-    #"git+https://github.com/nicfit/[email protected]";,
 ]
 
 [tool.pdm]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/requirements/dev-requirements.txt 
new/eyed3-0.9.9/requirements/dev-requirements.txt
--- old/eyed3-0.9.8/requirements/dev-requirements.txt   2025-04-26 
23:21:49.000000000 +0200
+++ new/eyed3-0.9.9/requirements/dev-requirements.txt   2025-11-16 
17:02:46.000000000 +0100
@@ -1,79 +1,79 @@
 # This file is @generated by PDM.
 # Please do not edit it manually.
 
-alabaster==0.7.16
-arrow==1.3.0
-attrs==25.3.0
+alabaster==1.0.0
+arrow==1.4.0
+attrs==25.4.0
 babel==2.17.0
 backports-tarfile==1.2.0; (platform_machine != "ppc64le" and platform_machine 
!= "s390x") and python_version < "3.12"
 binaryornot==0.4.4
-build==1.2.2.post1
-cachetools==5.5.2
-certifi==2025.4.26
-cffi==1.17.1; (platform_machine != "ppc64le" and platform_machine != "s390x") 
and sys_platform == "linux" and platform_python_implementation != "PyPy"
+build==1.3.0
+cachetools==6.2.2
+certifi==2025.11.12
+cffi==2.0.0; python_full_version >= "3.9" and platform_python_implementation 
!= "PyPy" and (platform_machine != "ppc64le" and platform_machine != "s390x") 
and sys_platform == "linux"
 chardet==5.2.0
-charset-normalizer==3.4.1
-check-manifest==0.50
-click==8.1.8
-cogapp==3.4.1
+charset-normalizer==3.4.4
+check-manifest==0.51
+click==8.3.1
+cogapp==3.6.0
 colorama==0.4.6
 cookiecutter==2.6.0
-coverage[toml]==7.8.0
-cryptography==43.0.3; (platform_machine != "ppc64le" and platform_machine != 
"s390x") and sys_platform == "linux"
+coverage[toml]==7.11.3
+cryptography==46.0.3; (platform_machine != "ppc64le" and platform_machine != 
"s390x") and sys_platform == "linux"
 deprecation==2.1.0
-distlib==0.3.9
+distlib==0.4.0
 docutils==0.21.2
-exceptiongroup==1.2.2; python_version < "3.11"
+exceptiongroup==1.3.0; python_version < "3.11"
 factory-boy==3.3.3
-faker==37.1.0
-filelock==3.18.0
+faker==38.0.0
+filelock==3.20.0
 filetype==1.2.0
-flake8==7.2.0
+flake8==7.3.0
 id==1.5.0
-idna==3.10
+idna==3.11
 imagesize==1.4.1
-importlib-metadata==8.6.1; (platform_machine != "ppc64le" and platform_machine 
!= "s390x") and python_version < "3.12" or python_full_version < "3.10.2"
-iniconfig==2.1.0
+importlib-metadata==8.7.0; (platform_machine != "ppc64le" and platform_machine 
!= "s390x") and python_version < "3.12" or python_full_version < "3.10.2"
+iniconfig==2.3.0
 jaraco-classes==3.4.0; platform_machine != "ppc64le" and platform_machine != 
"s390x"
 jaraco-context==6.0.1; platform_machine != "ppc64le" and platform_machine != 
"s390x"
-jaraco-functools==4.1.0; platform_machine != "ppc64le" and platform_machine != 
"s390x"
+jaraco-functools==4.3.0; platform_machine != "ppc64le" and platform_machine != 
"s390x"
 jeepney==0.9.0; (platform_machine != "ppc64le" and platform_machine != 
"s390x") and sys_platform == "linux"
 jinja2==3.1.6
 keyring==25.6.0; platform_machine != "ppc64le" and platform_machine != "s390x"
-markdown-it-py==3.0.0
-markupsafe==3.0.2
+markdown-it-py==4.0.0
+markupsafe==3.0.3
 mccabe==0.7.0
 mdurl==0.1.2
-more-itertools==10.7.0; platform_machine != "ppc64le" and platform_machine != 
"s390x"
-nh3==0.2.21
+more-itertools==10.8.0; platform_machine != "ppc64le" and platform_machine != 
"s390x"
+nh3==0.3.2
 nicfit-py[cookiecutter]==0.8.7
 packaging==25.0
 paver==1.3.4
-platformdirs==4.3.7
-pluggy==1.5.0
-pycodestyle==2.13.0
-pycparser==2.22; (platform_machine != "ppc64le" and platform_machine != 
"s390x") and sys_platform == "linux" and platform_python_implementation != 
"PyPy"
-pyflakes==3.3.2
-pygments==2.19.1
-pyproject-api==1.9.0
+platformdirs==4.5.0
+pluggy==1.6.0
+pycodestyle==2.14.0
+pycparser==2.23; python_full_version >= "3.9" and 
platform_python_implementation != "PyPy" and (platform_machine != "ppc64le" and 
platform_machine != "s390x") and sys_platform == "linux" and 
implementation_name != "PyPy"
+pyflakes==3.4.0
+pygments==2.19.2
+pyproject-api==1.10.0
 pyproject-hooks==1.2.0
-pytest==8.3.5
-pytest-cov==6.1.1
+pytest==9.0.1
+pytest-cov==7.0.0
 python-dateutil==2.9.0.post0
 python-slugify==8.0.4
 pywin32-ctypes==0.2.3; (platform_machine != "ppc64le" and platform_machine != 
"s390x") and sys_platform == "win32"
-pyyaml==6.0.2
+pyyaml==6.0.3
 readme-renderer==44.0
 regarding==0.2.0
-requests==2.32.3
+requests==2.32.5
 requests-toolbelt==1.0.0
 rfc3986==2.0.0
-rich==14.0.0
-secretstorage==3.3.3; (platform_machine != "ppc64le" and platform_machine != 
"s390x") and sys_platform == "linux"
-setuptools==79.0.1
+rich==14.2.0
+secretstorage==3.4.1; (platform_machine != "ppc64le" and platform_machine != 
"s390x") and sys_platform == "linux"
+setuptools==80.9.0
 six==1.17.0
-snowballstemmer==2.2.0
-sphinx==7.4.7
+snowballstemmer==3.0.1
+sphinx==8.1.3
 sphinx-issues==5.0.1
 sphinx-rtd-theme==3.0.2
 sphinxcontrib-applehelp==2.0.0
@@ -85,13 +85,12 @@
 sphinxcontrib-serializinghtml==2.0.0
 text-unidecode==1.3
 toml==0.10.2
-tomli==2.2.1; python_version < "3.11"
-tox==4.25.0
-twine==6.1.0
-types-python-dateutil==2.9.0.20241206
-typing-extensions==4.13.2; python_version < "3.13"
+tomli==2.3.0; python_version < "3.11"
+tox==4.32.0
+twine==6.2.0
+typing-extensions==4.15.0; python_version < "3.13"
 tzdata==2025.2
-urllib3==2.4.0
-virtualenv==20.30.0
-zipp==3.21.0; (platform_machine != "ppc64le" and platform_machine != "s390x") 
and python_version < "3.12" or python_full_version < "3.10.2"
+urllib3==2.5.0
+virtualenv==20.35.4
+zipp==3.23.0; (platform_machine != "ppc64le" and platform_machine != "s390x") 
and python_version < "3.12" or python_full_version < "3.10.2"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/requirements/plugin-requirements.txt 
new/eyed3-0.9.9/requirements/plugin-requirements.txt
--- old/eyed3-0.9.8/requirements/plugin-requirements.txt        2025-04-26 
23:21:49.000000000 +0200
+++ new/eyed3-0.9.9/requirements/plugin-requirements.txt        2025-11-16 
17:02:46.000000000 +0100
@@ -1,21 +1,21 @@
 # This file is @generated by PDM.
 # Please do not edit it manually.
 
-anyio==4.9.0
-certifi==2025.4.26
-charset-normalizer==3.4.1
+anyio==4.11.0
+certifi==2025.11.12
+charset-normalizer==3.4.4
 deprecation==2.1.0
-exceptiongroup==1.2.2; python_version < "3.11"
+exceptiongroup==1.3.0; python_version < "3.11"
 filetype==1.2.0
 h11==0.16.0
 httpcore==1.0.9
 httpx==0.28.1
-idna==3.10
+idna==3.11
 packaging==25.0
-pillow==11.2.1
-pylast==5.5.0
-requests==2.32.3
+pillow==12.0.0
+pylast==6.0.0
+requests==2.32.5
 sniffio==1.3.1
-typing-extensions==4.13.2; python_version < "3.13"
-urllib3==2.4.0
+typing-extensions==4.15.0; python_version < "3.13"
+urllib3==2.5.0
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/eyed3-0.9.8/tox.ini new/eyed3-0.9.9/tox.ini
--- old/eyed3-0.9.8/tox.ini     2025-04-23 04:07:47.000000000 +0200
+++ new/eyed3-0.9.9/tox.ini     2025-10-23 05:40:24.000000000 +0200
@@ -1,5 +1,5 @@
 [tox]
-envlist = py{39,310,311,312,313},pypy3
+envlist = py{310,311,312,313,314},pypy3
 
 [default]
 src_dir = ./eyed3

Reply via email to