eyeD3 0.9.4__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.
Files changed (149) hide show
  1. eyed3-0.9.8/.readthedocs.yaml +17 -0
  2. {eyeD3-0.9.4 → eyed3-0.9.8}/AUTHORS.rst +14 -10
  3. {eyeD3-0.9.4 → eyed3-0.9.8}/HISTORY.rst +101 -0
  4. {eyeD3-0.9.4 → eyed3-0.9.8}/MANIFEST.in +8 -7
  5. eyed3-0.9.8/Makefile +322 -0
  6. eyed3-0.9.8/PKG-INFO +158 -0
  7. {eyeD3-0.9.4 → eyed3-0.9.8}/README.rst +5 -10
  8. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/cli.rst +2 -2
  9. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/conf.py +9 -9
  10. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/eyed3.id3.rst +5 -6
  11. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/eyed3.mp3.rst +2 -3
  12. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/eyed3.plugins.rst +15 -24
  13. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/eyed3.rst +5 -5
  14. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/eyed3.utils.rst +6 -7
  15. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/installation.rst +3 -4
  16. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/classic_plugin.rst +84 -86
  17. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/extract_plugin.rst +1 -1
  18. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/fixup_plugin.rst +12 -21
  19. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/lameinfo_plugin.rst +3 -3
  20. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/pymod_plugin.rst +6 -7
  21. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins.rst +1 -2
  22. {eyeD3-0.9.4 → eyed3-0.9.8}/examples/cli_examples.sh +1 -1
  23. eyed3-0.9.8/eyeD3.egg-info/PKG-INFO +158 -0
  24. {eyeD3-0.9.4 → eyed3-0.9.8}/eyeD3.egg-info/SOURCES.txt +32 -75
  25. {eyeD3-0.9.4 → eyed3-0.9.8}/eyeD3.egg-info/entry_points.txt +0 -1
  26. eyed3-0.9.8/eyeD3.egg-info/requires.txt +29 -0
  27. eyed3-0.9.8/eyed3/__about__.py +27 -0
  28. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/__init__.py +2 -3
  29. eyed3-0.9.8/eyed3/__regarding__.py +48 -0
  30. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/core.py +109 -68
  31. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/id3/__init__.py +8 -10
  32. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/id3/apple.py +24 -8
  33. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/id3/frames.py +111 -42
  34. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/id3/headers.py +18 -18
  35. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/id3/tag.py +106 -52
  36. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/main.py +10 -3
  37. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/mimetype.py +1 -1
  38. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/mp3/__init__.py +11 -11
  39. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/mp3/headers.py +38 -34
  40. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/__init__.py +5 -2
  41. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/art.py +26 -32
  42. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/classic.py +21 -10
  43. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/fixup.py +11 -8
  44. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/jsontag.py +9 -8
  45. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/mimetype.py +2 -37
  46. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/pymod.py +10 -10
  47. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/stats.py +3 -2
  48. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/yamltag.py +7 -13
  49. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/utils/__init__.py +30 -11
  50. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/utils/binfuncs.py +1 -1
  51. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/utils/console.py +22 -20
  52. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/utils/log.py +0 -2
  53. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/utils/prompt.py +1 -1
  54. eyed3-0.9.8/pyproject.toml +87 -0
  55. eyed3-0.9.8/requirements/dev-requirements.txt +97 -0
  56. eyed3-0.9.8/requirements/plugin-requirements.txt +21 -0
  57. eyed3-0.9.8/requirements/requirements.txt +7 -0
  58. eyed3-0.9.8/setup.cfg +4 -0
  59. eyed3-0.9.8/setup.py +4 -0
  60. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/conftest.py +19 -5
  61. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/id3/test_frames.py +0 -3
  62. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/id3/test_id3.py +1 -1
  63. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/id3/test_tag.py +19 -1
  64. eyed3-0.9.8/tests/pytest.ini +3 -0
  65. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_classic_plugin.py +24 -2
  66. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_core.py +8 -7
  67. eyed3-0.9.8/tests/test_jsonyaml_plugin.py +85 -0
  68. eyed3-0.9.8/tox.ini +39 -0
  69. eyeD3-0.9.4/Makefile +0 -282
  70. eyeD3-0.9.4/PKG-INFO +0 -140
  71. eyeD3-0.9.4/docs/plugins/display_plugin.rst +0 -206
  72. eyeD3-0.9.4/eyeD3.egg-info/PKG-INFO +0 -140
  73. eyeD3-0.9.4/eyeD3.egg-info/not-zip-safe +0 -1
  74. eyeD3-0.9.4/eyeD3.egg-info/requires.txt +0 -16
  75. eyeD3-0.9.4/eyed3/__about__.py +0 -43
  76. eyeD3-0.9.4/eyed3/plugins/DisplayPattern.ebnf +0 -34
  77. eyeD3-0.9.4/eyed3/plugins/_display_parser.py +0 -210
  78. eyeD3-0.9.4/eyed3/plugins/display.py +0 -1128
  79. eyeD3-0.9.4/requirements/dev.txt +0 -11
  80. eyeD3-0.9.4/requirements/extra_art-plugin.txt +0 -3
  81. eyeD3-0.9.4/requirements/extra_display-plugin.txt +0 -1
  82. eyeD3-0.9.4/requirements/extra_yaml-plugin.txt +0 -1
  83. eyeD3-0.9.4/requirements/main.txt +0 -3
  84. eyeD3-0.9.4/requirements/requirements.yml +0 -37
  85. eyeD3-0.9.4/requirements/test.txt +0 -7
  86. eyeD3-0.9.4/requirements.txt +0 -8
  87. eyeD3-0.9.4/setup.cfg +0 -27
  88. eyeD3-0.9.4/setup.py +0 -165
  89. eyeD3-0.9.4/test/test_display_plugin.py +0 -105
  90. eyeD3-0.9.4/tox.ini +0 -45
  91. {eyeD3-0.9.4 → eyed3-0.9.8}/CONTRIBUTING.rst +0 -0
  92. {eyeD3-0.9.4 → eyed3-0.9.8}/LICENSE +0 -0
  93. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/Makefile +0 -0
  94. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/_config.yml +0 -0
  95. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/_static/.keep +0 -0
  96. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/_static/rtd.css +0 -0
  97. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/_templates/.keepme +0 -0
  98. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/authors.rst +0 -0
  99. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/compliance.rst +0 -0
  100. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/contributing.rst +0 -0
  101. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/eyeD3.1 +0 -0
  102. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/history.rst +0 -0
  103. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/index.rst +0 -0
  104. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/make.bat +0 -0
  105. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/modules.rst +0 -0
  106. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/art_plugin.rst +0 -0
  107. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/genres_plugin.rst +0 -0
  108. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/itunes_plugin.rst +0 -0
  109. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/json_plugin.rst +0 -0
  110. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/mimetypes_plugin.rst +0 -0
  111. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/nfo_plugin.rst +0 -0
  112. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/stats_plugin.rst +0 -0
  113. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/xep118_plugin.rst +0 -0
  114. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/plugins/yaml_plugin.rst +0 -0
  115. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/readme.rst +0 -0
  116. {eyeD3-0.9.4 → eyed3-0.9.8}/docs/usage.rst +0 -0
  117. {eyeD3-0.9.4 → eyed3-0.9.8}/examples/chapters.py +0 -0
  118. {eyeD3-0.9.4 → eyed3-0.9.8}/examples/config.ini +0 -0
  119. {eyeD3-0.9.4 → eyed3-0.9.8}/examples/plugins/echo.py +0 -0
  120. {eyeD3-0.9.4 → eyed3-0.9.8}/examples/plugins/echo2.py +0 -0
  121. {eyeD3-0.9.4 → eyed3-0.9.8}/examples/tag_example.py +0 -0
  122. {eyeD3-0.9.4 → eyed3-0.9.8}/eyeD3.egg-info/dependency_links.txt +0 -0
  123. {eyeD3-0.9.4 → eyed3-0.9.8}/eyeD3.egg-info/top_level.txt +0 -0
  124. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/extract.py +0 -0
  125. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/genres.py +0 -0
  126. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/itunes.py +0 -0
  127. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/lameinfo.py +0 -0
  128. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/lastfm.py +0 -0
  129. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/nfo.py +0 -0
  130. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/plugins/xep_118.py +0 -0
  131. {eyeD3-0.9.4 → eyed3-0.9.8}/eyed3/utils/art.py +0 -0
  132. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/__init__.py +0 -0
  133. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/id3/__init__.py +0 -0
  134. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/id3/test_headers.py +0 -0
  135. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/id3/test_rva.py +0 -0
  136. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/mp3/__init__.py +0 -0
  137. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/mp3/test_infos.py +0 -0
  138. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/mp3/test_mp3.py +0 -0
  139. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test__init__.py +0 -0
  140. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_binfuncs.py +0 -0
  141. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_console.py +0 -0
  142. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_factory.py +0 -0
  143. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_issues.py +0 -0
  144. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_lameinfo_plugin.py +0 -0
  145. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_main.py +0 -0
  146. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_mimetype.py +0 -0
  147. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_plugins.py +0 -0
  148. {eyeD3-0.9.4/test → eyed3-0.9.8/tests}/test_stats_plugins.py +0 -0
  149. {eyeD3-0.9.4/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
- * Gaetano Guerriero <x.guerriero@tin.it>
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
- * deoren@users.noreply.github.com
36
- * chamatht@gmail.com
37
- * Mic92@users.noreply.github.com
38
- * gabrieldiegoteixeira@gmail.com
39
- * guillaume.web@gmail.com
40
- * tim.gates@iress.com
41
- * zhumumu@gmail.com
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,107 @@ 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
+
98
+ v0.9.5 (2020-03-28) : I Knew Her, She Knew Me
99
+ ----------------------------------------------
100
+
101
+ Fix
102
+ ~~~
103
+ - `eyeD3 --genre ""` to clear genre frame restored.
104
+ - Genre id->name mapping for non-standard genres and custom maps.
105
+
106
+
6
107
  v0.9.4 (2020-03-21) : The Devil Made Me Do It
7
108
  -----------------------------------------------
8
109
 
@@ -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 test *.py
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.txt
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 fabfile.py
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
+