eyeD3 0.9.5__tar.gz → 0.9.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- eyed3-0.9.8/.readthedocs.yaml +17 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/AUTHORS.rst +14 -10
- {eyeD3-0.9.5 → eyed3-0.9.8}/HISTORY.rst +92 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/MANIFEST.in +8 -7
- eyed3-0.9.8/Makefile +322 -0
- eyed3-0.9.8/PKG-INFO +158 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/README.rst +5 -10
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/cli.rst +2 -2
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/conf.py +9 -9
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/eyed3.id3.rst +5 -6
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/eyed3.mp3.rst +2 -3
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/eyed3.plugins.rst +15 -24
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/eyed3.rst +5 -5
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/eyed3.utils.rst +6 -7
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/installation.rst +3 -4
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/classic_plugin.rst +84 -86
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/extract_plugin.rst +1 -1
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/fixup_plugin.rst +12 -21
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/lameinfo_plugin.rst +3 -3
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/pymod_plugin.rst +6 -7
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins.rst +0 -1
- {eyeD3-0.9.5 → eyed3-0.9.8}/examples/cli_examples.sh +1 -1
- eyed3-0.9.8/eyeD3.egg-info/PKG-INFO +158 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyeD3.egg-info/SOURCES.txt +32 -75
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyeD3.egg-info/entry_points.txt +0 -1
- eyed3-0.9.8/eyeD3.egg-info/requires.txt +29 -0
- eyed3-0.9.8/eyed3/__about__.py +27 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/__init__.py +2 -3
- eyed3-0.9.8/eyed3/__regarding__.py +48 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/core.py +109 -68
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/id3/__init__.py +6 -8
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/id3/apple.py +24 -8
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/id3/frames.py +111 -42
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/id3/headers.py +18 -18
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/id3/tag.py +103 -50
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/main.py +10 -3
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/mimetype.py +1 -1
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/mp3/__init__.py +11 -11
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/mp3/headers.py +38 -34
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/__init__.py +5 -2
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/art.py +26 -32
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/classic.py +21 -10
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/fixup.py +11 -8
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/jsontag.py +9 -8
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/mimetype.py +2 -37
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/pymod.py +10 -10
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/stats.py +3 -2
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/yamltag.py +7 -13
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/utils/__init__.py +30 -11
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/utils/binfuncs.py +1 -1
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/utils/console.py +22 -20
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/utils/log.py +0 -2
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/utils/prompt.py +1 -1
- eyed3-0.9.8/pyproject.toml +87 -0
- eyed3-0.9.8/requirements/dev-requirements.txt +97 -0
- eyed3-0.9.8/requirements/plugin-requirements.txt +21 -0
- eyed3-0.9.8/requirements/requirements.txt +7 -0
- eyed3-0.9.8/setup.cfg +4 -0
- eyed3-0.9.8/setup.py +4 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/conftest.py +16 -5
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/id3/test_frames.py +0 -3
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/id3/test_id3.py +1 -1
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/id3/test_tag.py +19 -1
- eyed3-0.9.8/tests/pytest.ini +3 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_classic_plugin.py +18 -2
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_core.py +8 -7
- eyed3-0.9.8/tests/test_jsonyaml_plugin.py +85 -0
- eyed3-0.9.8/tox.ini +39 -0
- eyeD3-0.9.5/Makefile +0 -282
- eyeD3-0.9.5/PKG-INFO +0 -140
- eyeD3-0.9.5/docs/plugins/display_plugin.rst +0 -206
- eyeD3-0.9.5/eyeD3.egg-info/PKG-INFO +0 -140
- eyeD3-0.9.5/eyeD3.egg-info/not-zip-safe +0 -1
- eyeD3-0.9.5/eyeD3.egg-info/requires.txt +0 -16
- eyeD3-0.9.5/eyed3/__about__.py +0 -43
- eyeD3-0.9.5/eyed3/plugins/DisplayPattern.ebnf +0 -34
- eyeD3-0.9.5/eyed3/plugins/_display_parser.py +0 -210
- eyeD3-0.9.5/eyed3/plugins/display.py +0 -1128
- eyeD3-0.9.5/requirements/dev.txt +0 -11
- eyeD3-0.9.5/requirements/extra_art-plugin.txt +0 -3
- eyeD3-0.9.5/requirements/extra_display-plugin.txt +0 -1
- eyeD3-0.9.5/requirements/extra_yaml-plugin.txt +0 -1
- eyeD3-0.9.5/requirements/main.txt +0 -3
- eyeD3-0.9.5/requirements/requirements.yml +0 -37
- eyeD3-0.9.5/requirements/test.txt +0 -7
- eyeD3-0.9.5/requirements.txt +0 -8
- eyeD3-0.9.5/setup.cfg +0 -27
- eyeD3-0.9.5/setup.py +0 -165
- eyeD3-0.9.5/test/test_display_plugin.py +0 -105
- eyeD3-0.9.5/tox.ini +0 -45
- {eyeD3-0.9.5 → eyed3-0.9.8}/CONTRIBUTING.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/LICENSE +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/Makefile +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/_config.yml +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/_static/.keep +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/_static/rtd.css +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/_templates/.keepme +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/authors.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/compliance.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/contributing.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/eyeD3.1 +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/history.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/index.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/make.bat +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/modules.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/art_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/genres_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/itunes_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/json_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/mimetypes_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/nfo_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/stats_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/xep118_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/plugins/yaml_plugin.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/readme.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/docs/usage.rst +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/examples/chapters.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/examples/config.ini +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/examples/plugins/echo.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/examples/plugins/echo2.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/examples/tag_example.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyeD3.egg-info/dependency_links.txt +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyeD3.egg-info/top_level.txt +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/extract.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/genres.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/itunes.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/lameinfo.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/lastfm.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/nfo.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/plugins/xep_118.py +0 -0
- {eyeD3-0.9.5 → eyed3-0.9.8}/eyed3/utils/art.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/__init__.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/id3/__init__.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/id3/test_headers.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/id3/test_rva.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/mp3/__init__.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/mp3/test_infos.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/mp3/test_mp3.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test__init__.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_binfuncs.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_console.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_factory.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_issues.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_lameinfo_plugin.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_main.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_mimetype.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_plugins.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_stats_plugins.py +0 -0
- {eyeD3-0.9.5/test → eyed3-0.9.8/tests}/test_utils.py +0 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
# Read the Docs configuration file for Sphinx projects
|
2
|
+
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
3
|
+
|
4
|
+
version: 2
|
5
|
+
|
6
|
+
build:
|
7
|
+
os: ubuntu-22.04
|
8
|
+
tools:
|
9
|
+
python: "3.12"
|
10
|
+
|
11
|
+
sphinx:
|
12
|
+
configuration: docs/conf.py
|
13
|
+
|
14
|
+
python:
|
15
|
+
install:
|
16
|
+
- method: pip
|
17
|
+
path: .[dev]
|
@@ -27,15 +27,19 @@ and has been contributed to by (ordered by date of first contribution):
|
|
27
27
|
* Hans Petter Jansson <hpj@copyleft.no>
|
28
28
|
* Sebastian Patschorke <sludgefeast@users.noreply.github.com>
|
29
29
|
* Bouke Versteegh <info@boukeversteegh.nl>
|
30
|
+
* gaetano-guerriero <x.guerriero@tin.it>
|
30
31
|
* mafro <github@mafro.net>
|
31
|
-
*
|
32
|
-
* Grun Seid <grunseid@gmail.com>
|
33
|
-
* pyup-bot <github-bot@pyup.io>
|
32
|
+
* Gabriel Diego Teixeira <gabrieldiegoteixeira@gmail.com>
|
34
33
|
* Chris Newton <redshodan@gmail.com>
|
35
|
-
*
|
36
|
-
*
|
37
|
-
*
|
38
|
-
*
|
39
|
-
* guillaume.web@gmail.com
|
40
|
-
*
|
41
|
-
*
|
34
|
+
* Thomas Klausner <tk@giga.or.at>
|
35
|
+
* Tim Gates <tim.gates@iress.com>
|
36
|
+
* chamatht <chamatht@gmail.com>
|
37
|
+
* grun <grunseid@gmail.com>
|
38
|
+
* guiweber <guillaume.web@gmail.com>
|
39
|
+
* zhu <zhumumu@gmail.com>
|
40
|
+
* Michał Górny <mgorny@gentoo.org>
|
41
|
+
* Jonathan Herlin <Jonte@jherlin.se>
|
42
|
+
* Ramiro Gómez <code@ramiro.org>
|
43
|
+
* Steve Kowalik <steven@wedontsleep.org>
|
44
|
+
* gersonkurz <gerson.kurz@gmail.com>
|
45
|
+
* obskyr <powpowd@gmail.com>
|
@@ -3,6 +3,98 @@ Release History
|
|
3
3
|
|
4
4
|
.. :changelog:
|
5
5
|
|
6
|
+
v0.9.8 (2025-04-26) : Armed & Dangerous
|
7
|
+
---------------------------------------
|
8
|
+
|
9
|
+
New
|
10
|
+
~~~
|
11
|
+
* Added rudimentary support for iTunes MVNM and MVIN frames. (#644) (obskyr <powpowd@gmail.com>)
|
12
|
+
|
13
|
+
Changes
|
14
|
+
~~~~~~~
|
15
|
+
* Added support for Python 3.11, 3.12, and 3.13 (Travis Shirk <travis@pobox.com>)
|
16
|
+
* Using PDM for dependency management. (Travis Shirk <travis@pobox.com>)
|
17
|
+
* Raise GenreException instead of ValueError (Travis Shirk <travis@pobox.com>)
|
18
|
+
* Removed support for Python 3.7 and 3.8 (Travis Shirk <travis@pobox.com>)
|
19
|
+
|
20
|
+
Fix
|
21
|
+
~~~
|
22
|
+
* recording date fix (#623) (TJ-59>)
|
23
|
+
* improve printing of WXXX frames (#662) (Todd Zullinger <tmz@pobox.com>)
|
24
|
+
* align output from classic plugin (#660) (Todd Zullinger <tmz@pobox.com>)
|
25
|
+
* classic plugin: decode ufid.owner_id for display (#661) (Todd Zullinger <tmz@pobox.com>)
|
26
|
+
* handle BrokenPipeError (#663) (Todd Zullinger <tmz@pobox.com>)
|
27
|
+
* Improved TextFrame ID checking. (Travis Shirk <travis@pobox.com>)
|
28
|
+
* Fix dependency on `coverage` to be conditional to `test` extra (#606) (Michał Górny <mgorny@gentoo.org>)
|
29
|
+
|
30
|
+
Other
|
31
|
+
~~~~~
|
32
|
+
* Skip tests if the data directory isn't found (#647) (Steve Kowalik <steven@wedontsleep.org>)
|
33
|
+
|
34
|
+
|
35
|
+
v0.9.7 (2022-10-07) : Sunshine
|
36
|
+
----------------------------------
|
37
|
+
|
38
|
+
New
|
39
|
+
~~~
|
40
|
+
- [fixup-plugin] Added --no-dir-rename.
|
41
|
+
- Add remove-all-unknown to classic plugin. <gobater@users.noreply.github.com>
|
42
|
+
- Track/disc number support for JSON/YAML plugins (and tests)
|
43
|
+
- CountAndTotalTuple named tuple for count/total values.
|
44
|
+
- EyeD3 __all__ includes core.AudioFile.
|
45
|
+
- AudioFile.__str__ returns path.
|
46
|
+
- Strict render Frame flag to continue on render errors. Applied to RelVolAdjFrameV24, etc
|
47
|
+
- Track unsupported frames and add `--remove-all-unknown` classic plugin
|
48
|
+
option (#586) <gobater@users.noreply.github.com>
|
49
|
+
|
50
|
+
Changes
|
51
|
+
~~~~~~~
|
52
|
+
- Removed display-plugin due to Grako EOL (#585)
|
53
|
+
- [stats] Print bytes as text and filter private members.
|
54
|
+
- Remove Python 3.6 support, EOL. (#560)
|
55
|
+
|
56
|
+
Fix
|
57
|
+
~~~
|
58
|
+
- Doc grammar fixed (#537) <74979584+piatrashkakanstantinass@users.noreply.github.com>
|
59
|
+
- Fix problem when frame file format invalid, and input.read() returns
|
60
|
+
no more data at all - this had the potential to loop endlessly. (#539)
|
61
|
+
<gerson.kurz@ng-branch-technology.com, gerson.kurz@gmail.com>
|
62
|
+
|
63
|
+
Other
|
64
|
+
~~~~~
|
65
|
+
- Create codeql-analysis.yml.
|
66
|
+
- Documentation updates.
|
67
|
+
- Also updated deps, and removed Python 3.7 from official testing.
|
68
|
+
- Docs: Fix a few typos (#573) <tim.gates@iress.com>
|
69
|
+
- Spelling fixes (#559) <Jonte@jherlin.se>
|
70
|
+
- Typo fixes (#558) <code@ramiro.org>
|
71
|
+
|
72
|
+
v0.9.6 (2020-12-28) : True Blue
|
73
|
+
----------------------------------
|
74
|
+
|
75
|
+
New
|
76
|
+
~~~
|
77
|
+
- Id3.Tag(version=) keyword argument.
|
78
|
+
- Expose TextFrame ctor kwargs to Apple frames. fixes #407
|
79
|
+
- Added --about CLI argument for extra version/program info.
|
80
|
+
|
81
|
+
Fix
|
82
|
+
~~~
|
83
|
+
- Preserve linked file info in Tag.clear(). fixes #442
|
84
|
+
- Handle v1 .id3/.tag files.
|
85
|
+
- Improved `art` plugin behavior when missing dependencies.
|
86
|
+
- [art plugin] Improved error for missing dependencies.
|
87
|
+
- TYER conversion (and restored non v2.2 breakage, for now)
|
88
|
+
- ID3 v2.2, date getters return values again.
|
89
|
+
- Passed filtered files list or handleDirectory, and skip non-existant symlinks
|
90
|
+
- Fixed installation supported Python text. fixes #405
|
91
|
+
- Implement v1.0/v1.1 tag conversion rules.
|
92
|
+
|
93
|
+
Other
|
94
|
+
~~~~~
|
95
|
+
- Poetry build system (#500)
|
96
|
+
|
97
|
+
|
6
98
|
v0.9.5 (2020-03-28) : I Knew Her, She Knew Me
|
7
99
|
----------------------------------------------
|
8
100
|
|
@@ -5,11 +5,15 @@ include LICENSE
|
|
5
5
|
include README.rst
|
6
6
|
include Makefile
|
7
7
|
include tox.ini
|
8
|
+
include setup.py
|
9
|
+
include pdm.lock
|
10
|
+
include .readthedocs.yaml
|
8
11
|
|
9
12
|
graft docs
|
10
13
|
prune docs/_build
|
11
14
|
|
12
|
-
recursive-include
|
15
|
+
recursive-include tests *.py
|
16
|
+
include tests/pytest.ini
|
13
17
|
|
14
18
|
exclude .cookiecutter.yml
|
15
19
|
exclude .gitchangelog.rc
|
@@ -17,14 +21,11 @@ global-exclude __pycache__
|
|
17
21
|
global-exclude .editorconfig
|
18
22
|
global-exclude *.py[co]
|
19
23
|
|
20
|
-
include requirements
|
21
|
-
recursive-include requirements *.txt *.yml
|
24
|
+
recursive-include requirements *.txt
|
22
25
|
|
23
26
|
recursive-include eyed3 *.py
|
24
|
-
include eyed3/plugins/DisplayPattern.ebnf
|
25
27
|
recursive-include examples *
|
26
28
|
|
27
|
-
exclude
|
28
|
-
exclude mkenv.sh
|
29
|
-
exclude pavement.py
|
29
|
+
exclude pdm.lock
|
30
30
|
prune etc
|
31
|
+
|
eyed3-0.9.8/Makefile
ADDED
@@ -0,0 +1,322 @@
|
|
1
|
+
SHELL := /bin/bash
|
2
|
+
.DEFAULT_GOAL := build
|
3
|
+
|
4
|
+
## User settings
|
5
|
+
PYTEST_ARGS ?= ./tests
|
6
|
+
PYPI_REPO ?= pypi
|
7
|
+
BUMP ?= prerelease
|
8
|
+
TEST_DATA_DIR ?= $(shell pwd)/tests
|
9
|
+
CC_MERGE ?= yes
|
10
|
+
CC_OPTS ?= --no-input
|
11
|
+
|
12
|
+
ifdef TERM
|
13
|
+
BOLD_COLOR = $(shell tput bold)
|
14
|
+
HELP_COLOR = $(shell tput setaf 6)
|
15
|
+
HEADER_COLOR = $(BOLD_COLOR)$(shell tput setaf 2)
|
16
|
+
NO_COLOR = $(shell tput sgr0)
|
17
|
+
endif
|
18
|
+
|
19
|
+
help: ## List all commands
|
20
|
+
@printf "\n$(BOLD_COLOR)***** eyeD3 Makefile help *****$(NO_COLOR)\n"
|
21
|
+
@# This code borrowed from https://github.com/jedie/poetry-publish/blob/master/Makefile
|
22
|
+
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9 -]+:.*?## / {printf "$(HELP_COLOR)%-20s$(NO_COLOR) %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
23
|
+
@echo ""
|
24
|
+
@printf "$(BOLD_COLOR)Options:$(NO_COLOR)\n"
|
25
|
+
@printf "$(HELP_COLOR)%-20s$(NO_COLOR) %s\n" PYTEST_ARGS "If defined PDB options are added when 'pytest' is invoked"
|
26
|
+
@printf "$(HELP_COLOR)%-20s$(NO_COLOR) %s\n" PYPI_REPO "The package index to publish, 'pypi' by default."
|
27
|
+
@printf "$(HELP_COLOR)%-20s$(NO_COLOR) %s\n" BROWSER "HTML viewer used by docs-view/coverage-view"
|
28
|
+
@printf "$(HELP_COLOR)%-20s$(NO_COLOR) %s\n" CC_MERGE "Set to no to disable cookiecutter merging."
|
29
|
+
@printf "$(HELP_COLOR)%-20s$(NO_COLOR) %s\n" CC_OPTS "OVerrided the default options (--no-input) with your own."
|
30
|
+
@echo ""
|
31
|
+
|
32
|
+
|
33
|
+
all: clean build test ## Build and test
|
34
|
+
|
35
|
+
|
36
|
+
## Config
|
37
|
+
PROJECT_NAME := $(shell sed -n "s/^name = \"\(.*\)\"/\1/p" pyproject.toml)
|
38
|
+
ifeq ($(strip $(PROJECT_NAME)),)
|
39
|
+
$(error "PROJECT_NAME not set")
|
40
|
+
endif
|
41
|
+
VERSION := $(shell sed -n "s/^version = \"\(.*\)\"/\1/p" pyproject.toml)
|
42
|
+
ifeq ($(strip $(VERSION)),)
|
43
|
+
$(error "VERSION not set")
|
44
|
+
endif
|
45
|
+
RELEASE_NAME = $(shell sed -n "s/^release_name = \"\(.*\)\"/\1/p" pyproject.toml)
|
46
|
+
RELEASE_TAG := v$(VERSION)
|
47
|
+
|
48
|
+
SRC_DIRS = ./eyed3
|
49
|
+
GITHUB_USER = nicfit
|
50
|
+
GITHUB_REPO = eyeD3
|
51
|
+
CHANGELOG = HISTORY.rst
|
52
|
+
CHANGELOG_HEADER = v${VERSION} ($(shell date --iso-8601))$(if ${RELEASE_NAME}, : ${RELEASE_NAME},)
|
53
|
+
TEST_DATA = eyeD3-test-data
|
54
|
+
TEST_DATA_FILE = ${TEST_DATA}.tgz
|
55
|
+
ABOUT_PY := eyed3/__regarding__.py
|
56
|
+
|
57
|
+
|
58
|
+
## Build
|
59
|
+
.PHONY: build
|
60
|
+
BUILD_OPTS ?=
|
61
|
+
build: $(ABOUT_PY) ## Build the project
|
62
|
+
pdm build -d dist/ $(BUILD_OPTS)
|
63
|
+
|
64
|
+
$(ABOUT_PY): pyproject.toml
|
65
|
+
regarding -o $@
|
66
|
+
|
67
|
+
|
68
|
+
## Clean
|
69
|
+
clean: clean-test clean-dist clean-local clean-docs # Clean the project
|
70
|
+
touch pyproject.toml
|
71
|
+
rm -rf ./build
|
72
|
+
rm -rf eye{d,D}3.egg-info
|
73
|
+
rm -fr .eggs/
|
74
|
+
find . -name '*.egg' -exec rm -f {} +
|
75
|
+
find . -name '*.pyc' -exec rm -f {} +
|
76
|
+
find . -name '*.pyo' -exec rm -f {} +
|
77
|
+
find . -name '*~' -exec rm -f {} +
|
78
|
+
find . -name '__pycache__' -exec rm -fr {} +
|
79
|
+
|
80
|
+
clean-local:
|
81
|
+
-rm tags
|
82
|
+
-rm all.id3 example.id3
|
83
|
+
find . -name '*.rej' -exec rm -f '{}' \;
|
84
|
+
find . -name '*.orig' -exec rm -f '{}' \;
|
85
|
+
find . -type f -name '*~' | xargs -r rm
|
86
|
+
|
87
|
+
|
88
|
+
### Test
|
89
|
+
.PHONY: test
|
90
|
+
test: ## Run tests with default python
|
91
|
+
tox -e py,lint
|
92
|
+
|
93
|
+
SKIP_TEST_ALL ?= no
|
94
|
+
test-all: ## Run tests with all supported versions of Python
|
95
|
+
@if [ "$(SKIP_TEST_ALL)" != yes ]; then \
|
96
|
+
tox --parallel=all ;\
|
97
|
+
fi
|
98
|
+
|
99
|
+
test-data:
|
100
|
+
# Move these to eyed3.nicfit.net
|
101
|
+
test -f ${TEST_DATA_DIR}/${TEST_DATA_FILE} || \
|
102
|
+
wget --quiet "http://eyed3.nicfit.net/releases/${TEST_DATA_FILE}" \
|
103
|
+
-O ${TEST_DATA_DIR}/${TEST_DATA_FILE}
|
104
|
+
tar xzf ${TEST_DATA_DIR}/${TEST_DATA_FILE} -C ${TEST_DATA_DIR}
|
105
|
+
cd tests && rm -f ./data && ln -s ${TEST_DATA_DIR}/${TEST_DATA} ./data
|
106
|
+
|
107
|
+
clean-test:
|
108
|
+
rm -fr .tox/
|
109
|
+
rm -f .coverage
|
110
|
+
find . -name '.pytest_cache' -type d -exec rm -rf {} +
|
111
|
+
-rm .testmondata
|
112
|
+
-rm examples/*.id3
|
113
|
+
|
114
|
+
clean-test-data:
|
115
|
+
-rm tests/data
|
116
|
+
-rm tests/${TEST_DATA_FILE}
|
117
|
+
|
118
|
+
pkg-test-data:
|
119
|
+
test -d build || mkdir build
|
120
|
+
tar czf ./build/${TEST_DATA_FILE} -h --exclude-vcs -C ./tests \
|
121
|
+
./eyeD3-test-data
|
122
|
+
|
123
|
+
publish-test-data: pkg-test-data
|
124
|
+
scp ./build/${TEST_DATA_FILE} eyed3.nicfit.net:./data1/eyeD3-releases/
|
125
|
+
|
126
|
+
coverage:
|
127
|
+
coverage run --source $(SRC_DIRS) -m pytest $(PYTEST_ARGS)
|
128
|
+
coverage report
|
129
|
+
coverage html
|
130
|
+
|
131
|
+
coverage-view:
|
132
|
+
@if [ ! -f build/tests/coverage/index.html ]; then \
|
133
|
+
${MAKE} coverage; \
|
134
|
+
fi
|
135
|
+
@${BROWSER} build/tests/coverage/index.html
|
136
|
+
|
137
|
+
lint: ## Check coding style
|
138
|
+
tox -e lint
|
139
|
+
|
140
|
+
|
141
|
+
### Documentation
|
142
|
+
.PHONY: docs
|
143
|
+
docs: ## Generate project documentation with Sphinx
|
144
|
+
rm -f docs/eyed3.rst
|
145
|
+
rm -f docs/modules.rst
|
146
|
+
sphinx-apidoc --force -H "$(shell echo $(PROJECT_NAME) | tr '[:upper:]' '[:lower:]') module" -V $(VERSION) -o docs/ ${SRC_DIRS}
|
147
|
+
$(MAKE) -C docs clean
|
148
|
+
etc/mycog.py
|
149
|
+
$(MAKE) -C docs html
|
150
|
+
-rm example.id3
|
151
|
+
|
152
|
+
DOCS_DIST := $(PROJECT_NAME)-$(VERSION)-docs.tar.gz
|
153
|
+
docs-dist: docs
|
154
|
+
cd docs/_build && tar czvf ./$(DOCS_DIST) html
|
155
|
+
|
156
|
+
docs-view: docs
|
157
|
+
$(BROWSER) docs/_build/html/index.html
|
158
|
+
|
159
|
+
clean-docs:
|
160
|
+
$(MAKE) -C docs clean
|
161
|
+
-rm README.html
|
162
|
+
|
163
|
+
|
164
|
+
### Distribute
|
165
|
+
.PHONY: dist
|
166
|
+
dist: clean-dist lint all docs-dist ## Create source and binary distribution files
|
167
|
+
|
168
|
+
_dist-md5:
|
169
|
+
@# The cd dist/docs keeps the dist/ prefix out of the md5sum files
|
170
|
+
cd docs/_build/ && md5sum $(DOCS_DIST) >| $(DOCS_DIST).md5
|
171
|
+
@cd dist && \
|
172
|
+
for f in $$(ls -I '*.md5'); do \
|
173
|
+
md5sum $${f} >| $${f}.md5; \
|
174
|
+
done
|
175
|
+
@ls -l docs/_build/$(DOCS_DIST)* dist
|
176
|
+
|
177
|
+
|
178
|
+
clean-dist: ## Clean distribution artifacts (included in `clean`)
|
179
|
+
rm -rf dist
|
180
|
+
|
181
|
+
check-manifest:
|
182
|
+
check-manifest
|
183
|
+
|
184
|
+
release-tag: _check-clean-repo _check-version-tag _check-main-branch
|
185
|
+
@if ! git tag --annotate $(RELEASE_TAG) -m "$(RELEASE_NAME)" 2> /dev/null; then \
|
186
|
+
echo "!!! $(RELEASE_TAG) already exists; update pyproject.toml !!!"; \
|
187
|
+
exit 1; \
|
188
|
+
fi
|
189
|
+
git push origin $(RELEASE_TAG)
|
190
|
+
|
191
|
+
authors:
|
192
|
+
@# requires git-extras
|
193
|
+
@git authors --list | while read auth ; do \
|
194
|
+
email=`echo "$$auth" | awk 'match($$0, /.*<(.*)>/, m) {print m[1]}'`;\
|
195
|
+
echo "Checking $$email...";\
|
196
|
+
if echo "$$email" | grep -v 'users.noreply.github.com'\
|
197
|
+
| grep -v 'github-bot@pyup.io' \
|
198
|
+
> /dev/null ; then \
|
199
|
+
grep "$$email" AUTHORS.rst > /dev/null || echo " * $$auth" >> AUTHORS.rst;\
|
200
|
+
fi;\
|
201
|
+
done
|
202
|
+
|
203
|
+
|
204
|
+
## Install
|
205
|
+
install: ## Install project and dependencies
|
206
|
+
python -m pip install --editable .
|
207
|
+
|
208
|
+
install-dev: ## Install project, dependencies, and developer tools
|
209
|
+
python -m pip install --editable .[dev,test]
|
210
|
+
|
211
|
+
install-extra: ## Install project, dependencies, and developer tools
|
212
|
+
python -m pip install --editable .[art-plugin,yaml-plugin]
|
213
|
+
|
214
|
+
install-all: install install-extra install-dev
|
215
|
+
|
216
|
+
|
217
|
+
## Release
|
218
|
+
.PHONY: release
|
219
|
+
release: _check-on-release-tag _check-clean-repo _check-gh _check-pypi dist publish-release
|
220
|
+
|
221
|
+
pre-release: _check-version-tag dist check-manifest test-all requirements authors _check-clean-repo
|
222
|
+
#pre-release: # changelog
|
223
|
+
|
224
|
+
# Order is import here
|
225
|
+
publish-release: _pypi-publish _web-publish _github-publish _docs-publish
|
226
|
+
|
227
|
+
_pypi-publish:
|
228
|
+
pdm publish --no-build -r $(PYPI_REPO) --skip-existing --dest ./dist
|
229
|
+
|
230
|
+
_web-publish: _dist-md5
|
231
|
+
for f in `find ./dist -type f`; do \
|
232
|
+
scp $$f eyed3.nicfit.net:./data1/eyeD3-releases/`basename $$f`; \
|
233
|
+
done
|
234
|
+
|
235
|
+
_docs-publish:
|
236
|
+
# TODO: READTHEDOCS move latest to release version
|
237
|
+
|
238
|
+
_github-publish:
|
239
|
+
@# TODO: --prerelease if appropriate
|
240
|
+
@# TODO: --notes-file when release notes are available
|
241
|
+
@# TODO: --latest=false when prerelease is used
|
242
|
+
gh release --repo nicfit/eyeD3 create $(RELEASE_TAG) --verify-tag \
|
243
|
+
--title "$(RELEASE_TAG) ($(RELEASE_NAME))" \
|
244
|
+
--draft \
|
245
|
+
--generate-notes ./dist/*.tar.gz ./dist/*.whl
|
246
|
+
|
247
|
+
|
248
|
+
### MISC
|
249
|
+
#
|
250
|
+
#GIT_COMMIT_HOOK = .git/hooks/commit-msg
|
251
|
+
#cookiecutter:
|
252
|
+
# tmp_d=`mktemp -d`; cc_d=$$tmp_d/eyeD3; \
|
253
|
+
# if test "${CC_MERGE}" = "no"; then \
|
254
|
+
# nicfit cookiecutter ${CC_OPTS} "$${tmp_d}"; \
|
255
|
+
# git -C "$$cc_d" diff; \
|
256
|
+
# git -C "$$cc_d" status -s -b; \
|
257
|
+
# else \
|
258
|
+
# nicfit cookiecutter --merge ${CC_OPTS} "$${tmp_d}" \
|
259
|
+
# --extra-merge ${GIT_COMMIT_HOOK} ${GIT_COMMIT_HOOK};\
|
260
|
+
# fi; \
|
261
|
+
# rm -rf $$tmp_d
|
262
|
+
|
263
|
+
## Runtime environment
|
264
|
+
VENV_NAME ?= dev-eyeD3
|
265
|
+
VENV_DIR ?= $(HOME)/.virtualenvs
|
266
|
+
VENV_ACTIVATE := $(VENV_DIR)/$(VENV_NAME)/bin/activate
|
267
|
+
clean-venv:
|
268
|
+
test -n "$(VENV_DIR)" && test -n "$(VENV_NAME)" && rm -rf $(VENV_DIR)/$(VENV_NAME)
|
269
|
+
|
270
|
+
venv:
|
271
|
+
python -m venv --upgrade-deps $(VENV_DIR)/$(VENV_NAME)
|
272
|
+
@printf "\n$(BOLD_COLOR)To activate the virtualenv:$(NO_COLOR) source $(VENV_ACTIVATE)\n"
|
273
|
+
@printf "$(BOLD_COLOR)To deactivate the virtualenv:$(NO_COLOR) deactivate\n\n"
|
274
|
+
|
275
|
+
|
276
|
+
_check-version-tag:
|
277
|
+
@if git tag -l | grep -E '^$(shell echo ${RELEASE_TAG} | sed 's|\.|.|g')$$' > /dev/null; then \
|
278
|
+
echo "!!! Version tag '${RELEASE_TAG}' already exists !!!"; \
|
279
|
+
false; \
|
280
|
+
else\
|
281
|
+
echo "Version tag '${RELEASE_TAG}' is available."; \
|
282
|
+
fi
|
283
|
+
|
284
|
+
MAIN_BRANCH ?= 0.9.x
|
285
|
+
_check-main-branch:
|
286
|
+
@if [ `git branch --show-current` != $(MAIN_BRANCH) ]; then \
|
287
|
+
echo "!!! Not on $(MAIN_BRANCH) branch. !!!"; \
|
288
|
+
exit 1; \
|
289
|
+
fi
|
290
|
+
|
291
|
+
_check-on-release-tag:
|
292
|
+
@if [ "`git describe --tags`" != "$(RELEASE_TAG)" ]; then \
|
293
|
+
echo "!!! Not on $(RELEASE_TAG) checkout. !!!"; \
|
294
|
+
exit 1; \
|
295
|
+
fi
|
296
|
+
|
297
|
+
_check-clean-repo:
|
298
|
+
@if [ -n "`git status --porcelain --untracked-files=no`" ]; then \
|
299
|
+
echo "!!! Working repo has uncommitted/un-staged changes. !!!"; \
|
300
|
+
exit 1; \
|
301
|
+
else \
|
302
|
+
echo "Repo clean.";\
|
303
|
+
fi
|
304
|
+
|
305
|
+
_check-gh:
|
306
|
+
@test -n "${GH_TOKEN}" || (echo "GH_TOKEN not set, needed for gh" && false)
|
307
|
+
@gh --help > /dev/null || (echo "gh not installed" && false)
|
308
|
+
|
309
|
+
_check-pypi:
|
310
|
+
@(test -n "${PDM_PUBLISH_USERNAME}" && test -n "${PDM_PUBLISH_PASSWORD}") || \
|
311
|
+
(echo "PDM_BUBLISH_* not set, needed for PyPI publish" && false)
|
312
|
+
|
313
|
+
#bump-release:
|
314
|
+
# @# TODO: is not a pre-release, clear release_name
|
315
|
+
# poetry version $(BUMP)
|
316
|
+
|
317
|
+
.PHONY: requirements
|
318
|
+
requirements:
|
319
|
+
pdm lock -G:all
|
320
|
+
pdm export --prod --no-hashes >| requirements/requirements.txt
|
321
|
+
pdm export -G test,dev --no-hashes >| requirements/dev-requirements.txt
|
322
|
+
pdm export -G yaml-plugim,art-plugin --no-hashes >| requirements/plugin-requirements.txt
|
eyed3-0.9.8/PKG-INFO
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: eyeD3
|
3
|
+
Version: 0.9.8
|
4
|
+
Summary: Python audio data toolkit (ID3 and MP3)
|
5
|
+
Author-email: Travis Shirk <travis@pobox.com>
|
6
|
+
Project-URL: homepage, https://eyeD3.nicfit.net/
|
7
|
+
Project-URL: repository, https://github.com/nicfit/eyeD3
|
8
|
+
Keywords: id3,mp3,python
|
9
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
10
|
+
Classifier: Environment :: Console
|
11
|
+
Classifier: Intended Audience :: End Users/Desktop
|
12
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Editors
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
14
|
+
Classifier: Intended Audience :: Developers
|
15
|
+
Classifier: Operating System :: POSIX
|
16
|
+
Classifier: Natural Language :: English
|
17
|
+
Classifier: Programming Language :: Python
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
23
|
+
Requires-Python: <4.0,>=3.9
|
24
|
+
Description-Content-Type: text/x-rst
|
25
|
+
License-File: LICENSE
|
26
|
+
License-File: AUTHORS.rst
|
27
|
+
Requires-Dist: filetype>=1.2.0
|
28
|
+
Requires-Dist: deprecation>=2.1.0
|
29
|
+
Provides-Extra: yaml-plugin
|
30
|
+
Requires-Dist: PyYAML>=6.0.2; extra == "yaml-plugin"
|
31
|
+
Provides-Extra: art-plugin
|
32
|
+
Requires-Dist: Pillow>=11.2.1; extra == "art-plugin"
|
33
|
+
Requires-Dist: pylast>=5.5.0; extra == "art-plugin"
|
34
|
+
Requires-Dist: requests>=2.32.3; extra == "art-plugin"
|
35
|
+
Provides-Extra: test
|
36
|
+
Requires-Dist: pytest>=8.3.5; extra == "test"
|
37
|
+
Requires-Dist: coverage>=7.8.0; extra == "test"
|
38
|
+
Requires-Dist: tox>=4.25.0; extra == "test"
|
39
|
+
Requires-Dist: factory-boy>=3.3.3; extra == "test"
|
40
|
+
Requires-Dist: pytest-cov>=6.1.1; extra == "test"
|
41
|
+
Requires-Dist: check-manifest>=0.50; extra == "test"
|
42
|
+
Requires-Dist: flake8>=7.2.0; extra == "test"
|
43
|
+
Provides-Extra: dev
|
44
|
+
Requires-Dist: twine>=6.1.0; extra == "dev"
|
45
|
+
Requires-Dist: Sphinx>=7.4.7; extra == "dev"
|
46
|
+
Requires-Dist: sphinx-rtd-theme>=3.0.2; extra == "dev"
|
47
|
+
Requires-Dist: sphinx-issues>=5.0.1; extra == "dev"
|
48
|
+
Requires-Dist: cogapp>=3.4.1; extra == "dev"
|
49
|
+
Requires-Dist: Paver>=1.3.4; extra == "dev"
|
50
|
+
Requires-Dist: nicfit-py[cookiecutter]>=0.8.7; extra == "dev"
|
51
|
+
Requires-Dist: regarding>=0.2.0; extra == "dev"
|
52
|
+
Dynamic: license-file
|
53
|
+
|
54
|
+
Status
|
55
|
+
------
|
56
|
+
.. image:: https://img.shields.io/pypi/v/eyeD3.svg
|
57
|
+
:target: https://pypi.python.org/pypi/eyeD3/
|
58
|
+
:alt: Latest Version
|
59
|
+
.. image:: https://img.shields.io/pypi/l/eyeD3.svg
|
60
|
+
:target: https://pypi.python.org/pypi/eyeD3/
|
61
|
+
:alt: License
|
62
|
+
.. image:: https://img.shields.io/pypi/pyversions/eyeD3.svg
|
63
|
+
:target: https://pypi.python.org/pypi/eyeD3/
|
64
|
+
:alt: Supported Python versions
|
65
|
+
.. image:: https://img.shields.io/pypi/dm/eyeD3
|
66
|
+
:alt: PyPI - Downloads
|
67
|
+
.. image:: https://img.shields.io/github/stars/nicfit/eyeD3
|
68
|
+
:alt: GitHub Repo stars
|
69
|
+
|
70
|
+
|
71
|
+
About
|
72
|
+
-----
|
73
|
+
eyeD3_ is a Python tool for working with audio files, specifically MP3 files
|
74
|
+
containing ID3_ metadata (i.e. song info).
|
75
|
+
|
76
|
+
It provides a command-line tool (``eyeD3``) and a Python library
|
77
|
+
(``import eyed3``) that can be used to write your own applications or
|
78
|
+
plugins that are callable from the command-line tool.
|
79
|
+
|
80
|
+
For example, to set some song information in an mp3 file called
|
81
|
+
``song.mp3``::
|
82
|
+
|
83
|
+
$ eyeD3 -a Integrity -A "Humanity Is The Devil" -t "Hollow" -n 2 song.mp3
|
84
|
+
|
85
|
+
With this command we've set the artist (``-a/--artist``), album
|
86
|
+
(``-A/--album``), title (``-t/--title``), and track number
|
87
|
+
(``-n/--track-num``) properties in the ID3 tag of the file. This is the
|
88
|
+
standard interface that eyeD3 has always had in the past, therefore it
|
89
|
+
is also the default plugin when no other is specified.
|
90
|
+
|
91
|
+
The results of this command can be seen by running the ``eyeD3`` with no
|
92
|
+
options.
|
93
|
+
|
94
|
+
::
|
95
|
+
|
96
|
+
$ eyeD3 song.mp3
|
97
|
+
song.mp3 [ 3.06 MB ]
|
98
|
+
-------------------------------------------------------------------------
|
99
|
+
ID3 v2.4:
|
100
|
+
title: Hollow
|
101
|
+
artist: Integrity
|
102
|
+
album: Humanity Is The Devil
|
103
|
+
album artist: None
|
104
|
+
track: 2
|
105
|
+
-------------------------------------------------------------------------
|
106
|
+
|
107
|
+
The same can be accomplished using Python.
|
108
|
+
|
109
|
+
::
|
110
|
+
|
111
|
+
import eyed3
|
112
|
+
|
113
|
+
audiofile = eyed3.load("song.mp3")
|
114
|
+
audiofile.tag.artist = "Token Entry"
|
115
|
+
audiofile.tag.album = "Free For All Comp LP"
|
116
|
+
audiofile.tag.album_artist = "Various Artists"
|
117
|
+
audiofile.tag.title = "The Edge"
|
118
|
+
audiofile.tag.track_num = 3
|
119
|
+
|
120
|
+
audiofile.tag.save()
|
121
|
+
|
122
|
+
eyeD3_ is written and maintained by `Travis Shirk`_ and is licensed under
|
123
|
+
version 3 of the GPL_.
|
124
|
+
|
125
|
+
Features
|
126
|
+
--------
|
127
|
+
|
128
|
+
* Python package (`import eyed3`) for writing applications and plugins.
|
129
|
+
* `eyeD3` : Command-line tool driver script that supports plugins.
|
130
|
+
* Easy ID3 editing/viewing of audio metadata from the command-line.
|
131
|
+
* Plugins for: Tag to string formatting (display), album fixing (fixup),
|
132
|
+
cover art downloading (art), collection stats (stats),
|
133
|
+
and json/yaml/jabber/nfo output formats, and more included.
|
134
|
+
* Support for ID3 versions 1.x, 2.2 (read-only), 2.3, and 2.4.
|
135
|
+
* Support for the MP3 audio format exposing details such as play time, bit
|
136
|
+
rate, sampling frequency, etc.
|
137
|
+
* Abstract design allowing future support for different audio formats and
|
138
|
+
metadata containers.
|
139
|
+
|
140
|
+
Get Started
|
141
|
+
-----------
|
142
|
+
|
143
|
+
Python >= 3.9 is required.
|
144
|
+
|
145
|
+
For `installation instructions`_ or more complete `documentation`_ see
|
146
|
+
http://eyeD3.nicfit.net/
|
147
|
+
|
148
|
+
Please post feedback and/or defects on the `issue tracker`_, or `mailing list`_.
|
149
|
+
|
150
|
+
.. _eyeD3: http://eyeD3.nicfit.net/
|
151
|
+
.. _Travis Shirk: travis@pobox.com
|
152
|
+
.. _issue tracker: https://github.com/nicfit/eyeD3/issues
|
153
|
+
.. _mailing list: https://groups.google.com/forum/?fromgroups#!forum/eyed3-users
|
154
|
+
.. _installation instructions: http://eyeD3.nicfit.net/index.html#installation
|
155
|
+
.. _documentation: http://eyeD3.nicfit.net/index.html#documentation
|
156
|
+
.. _GPL: http://www.gnu.org/licenses/gpl-2.0.html
|
157
|
+
.. _ID3: http://id3.org/
|
158
|
+
|
@@ -3,21 +3,16 @@ Status
|
|
3
3
|
.. image:: https://img.shields.io/pypi/v/eyeD3.svg
|
4
4
|
:target: https://pypi.python.org/pypi/eyeD3/
|
5
5
|
:alt: Latest Version
|
6
|
-
.. image:: https://img.shields.io/pypi/status/eyeD3.svg
|
7
|
-
:target: https://pypi.python.org/pypi/eyeD3/
|
8
|
-
:alt: Project Status
|
9
|
-
.. image:: https://travis-ci.org/nicfit/eyeD3.svg?branch=master
|
10
|
-
:target: https://travis-ci.org/nicfit/eyeD3
|
11
|
-
:alt: Build Status
|
12
6
|
.. image:: https://img.shields.io/pypi/l/eyeD3.svg
|
13
7
|
:target: https://pypi.python.org/pypi/eyeD3/
|
14
8
|
:alt: License
|
15
9
|
.. image:: https://img.shields.io/pypi/pyversions/eyeD3.svg
|
16
10
|
:target: https://pypi.python.org/pypi/eyeD3/
|
17
11
|
:alt: Supported Python versions
|
18
|
-
.. image:: https://
|
19
|
-
:
|
20
|
-
|
12
|
+
.. image:: https://img.shields.io/pypi/dm/eyeD3
|
13
|
+
:alt: PyPI - Downloads
|
14
|
+
.. image:: https://img.shields.io/github/stars/nicfit/eyeD3
|
15
|
+
:alt: GitHub Repo stars
|
21
16
|
|
22
17
|
|
23
18
|
About
|
@@ -92,7 +87,7 @@ Features
|
|
92
87
|
Get Started
|
93
88
|
-----------
|
94
89
|
|
95
|
-
Python >= 3.
|
90
|
+
Python >= 3.9 is required.
|
96
91
|
|
97
92
|
For `installation instructions`_ or more complete `documentation`_ see
|
98
93
|
http://eyeD3.nicfit.net/
|