audiometa-python 0.11.0__tar.gz → 1.0.0__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 (413) hide show
  1. {audiometa_python-0.11.0/audiometa_python.egg-info → audiometa_python-1.0.0}/PKG-INFO +9 -5
  2. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/README.md +8 -4
  3. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/__init__.py +66 -1
  4. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/cli.py +13 -0
  5. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_MetadataManager.py +73 -15
  6. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +36 -474
  7. audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v1_preserver.py +94 -0
  8. audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v2_flac_handler.py +140 -0
  9. audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v2_reader.py +258 -0
  10. audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v2_writer.py +327 -0
  11. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +3 -0
  12. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +4 -0
  13. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +90 -1
  14. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +34 -0
  15. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_metadata_setter.py +9 -0
  16. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +30 -0
  17. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +15 -0
  18. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +14 -0
  19. audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options/test_include_cover.py +30 -0
  20. audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options/test_include_headers.py +106 -0
  21. audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options/test_include_technical.py +69 -0
  22. audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_deleting.py +43 -0
  23. audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_reading.py +95 -0
  24. audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_writing.py +209 -0
  25. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +2 -2
  26. audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid/test_musicbrainz_artistid_format_validation.py +49 -0
  27. audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid/test_musicbrainz_artistid_type_validation.py +34 -0
  28. audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_format_validation.py +39 -0
  29. audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_format_validation.py → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_uuid/test_uuid_format_validation.py +36 -35
  30. audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
  31. audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
  32. audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date/__init__.py +0 -0
  33. audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number/__init__.py +0 -0
  34. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/config.py +19 -4
  35. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/macos.py +5 -5
  36. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/unified_metadata_key.py +3 -0
  37. {audiometa_python-0.11.0 → audiometa_python-1.0.0/audiometa_python.egg-info}/PKG-INFO +9 -5
  38. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/SOURCES.txt +17 -1
  39. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/pyproject.toml +1 -1
  40. audiometa_python-0.11.0/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -207
  41. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/LICENSE +0 -0
  42. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/__main__.py +0 -0
  43. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/_audio_file.py +0 -0
  44. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/exceptions.py +0 -0
  45. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/__init__.py +0 -0
  46. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
  47. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/__init__.py +0 -0
  48. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
  49. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
  50. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
  51. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_bext_chunk.py +0 -0
  52. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
  53. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_file_structure.py +0 -0
  54. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_info_chunk.py +0 -0
  55. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
  56. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
  57. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
  58. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/__init__.py +0 -0
  59. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/_constants.py +0 -0
  60. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
  61. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
  62. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/__init__.py +0 -0
  63. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/assets/create_test_files.py +0 -0
  64. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/__init__.py +0 -0
  65. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/common/__init__.py +0 -0
  66. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
  67. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
  68. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/__init__.py +0 -0
  69. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
  70. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
  71. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
  72. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
  73. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/__init__.py +0 -0
  74. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
  75. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
  76. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
  77. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
  78. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/__init__.py +0 -0
  79. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
  80. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
  81. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
  82. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/scripts/__init__.py +0 -0
  83. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/technical_info_inspector.py +0 -0
  84. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
  85. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/__init__.py +0 -0
  86. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
  87. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
  88. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
  89. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/__init__.py +0 -0
  90. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/conftest.py +0 -0
  91. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/__init__.py +0 -0
  92. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
  93. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
  94. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
  95. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
  96. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
  97. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
  98. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
  99. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
  100. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
  101. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
  102. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
  103. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
  104. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
  105. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
  106. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
  107. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
  108. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
  109. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
  110. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
  111. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
  112. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
  113. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
  114. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
  115. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
  116. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
  117. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
  118. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
  119. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
  120. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
  121. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
  122. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
  123. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
  124. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
  125. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
  126. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +0 -0
  127. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
  128. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/__init__.py +0 -0
  129. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
  130. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
  131. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
  132. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
  133. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
  134. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
  135. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
  136. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
  137. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
  138. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
  139. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
  140. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
  141. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
  142. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
  143. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
  144. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
  145. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/conftest.py +0 -0
  146. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
  147. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
  148. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
  149. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
  150. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
  151. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
  152. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
  153. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
  154. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
  155. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field → audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options}/__init__.py +0 -0
  156. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
  157. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
  158. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
  159. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
  160. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
  161. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
  162. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
  163. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
  164. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
  165. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/album → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field}/__init__.py +0 -0
  166. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/album_artists → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/album}/__init__.py +0 -0
  167. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
  168. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
  169. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
  170. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/artists → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/album_artists}/__init__.py +0 -0
  171. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
  172. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
  173. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
  174. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/bpm → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/artists}/__init__.py +0 -0
  175. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
  176. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
  177. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
  178. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/comment → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/bpm}/__init__.py +0 -0
  179. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
  180. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
  181. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
  182. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/composer → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/comment}/__init__.py +0 -0
  183. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
  184. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
  185. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
  186. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/copyright → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/composer}/__init__.py +0 -0
  187. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
  188. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
  189. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
  190. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/description → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/copyright}/__init__.py +0 -0
  191. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
  192. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
  193. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
  194. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/disc_number → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/description}/__init__.py +0 -0
  195. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/description/test_deleting.py +0 -0
  196. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/description/test_reading.py +0 -0
  197. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/description/test_writing.py +0 -0
  198. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/field_not_supported → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/disc_number}/__init__.py +0 -0
  199. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
  200. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
  201. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
  202. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/genre → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/field_not_supported}/__init__.py +0 -0
  203. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
  204. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
  205. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
  206. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/genre/reading → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/genre}/__init__.py +0 -0
  207. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/genre/reading}/__init__.py +0 -0
  208. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/language → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format}/__init__.py +0 -0
  209. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
  210. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
  211. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
  212. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
  213. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
  214. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
  215. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
  216. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
  217. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
  218. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
  219. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
  220. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/lyrics → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/language}/__init__.py +0 -0
  221. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
  222. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
  223. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
  224. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/lyrics}/__init__.py +0 -0
  225. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
  226. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
  227. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
  228. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/originator → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid}/__init__.py +0 -0
  229. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/publisher → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid}/__init__.py +0 -0
  230. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_deleting.py +0 -0
  231. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_reading.py +0 -0
  232. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_writing.py +0 -0
  233. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/originator}/__init__.py +0 -0
  234. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/originator/test_deleting.py +0 -0
  235. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/originator/test_reading.py +0 -0
  236. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/originator/test_writing.py +0 -0
  237. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating/reading → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/publisher}/__init__.py +0 -0
  238. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
  239. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
  240. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
  241. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating/writing → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating}/__init__.py +0 -0
  242. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating/reading}/__init__.py +0 -0
  243. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
  244. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
  245. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
  246. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
  247. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
  248. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/release_date → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating/writing}/__init__.py +0 -0
  249. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/title → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format}/__init__.py +0 -0
  250. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
  251. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
  252. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
  253. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
  254. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/track_number → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/release_date}/__init__.py +0 -0
  255. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
  256. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
  257. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
  258. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
  259. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
  260. {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/track_number/reading → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/title}/__init__.py +0 -0
  261. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
  262. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
  263. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
  264. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
  265. {audiometa_python-0.11.0/audiometa/test/tests/integration/real_audio_files → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/track_number}/__init__.py +0 -0
  266. {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/track_number/reading}/__init__.py +0 -0
  267. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
  268. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
  269. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
  270. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
  271. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
  272. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
  273. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
  274. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
  275. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
  276. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
  277. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
  278. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
  279. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
  280. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
  281. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
  282. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
  283. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
  284. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
  285. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
  286. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
  287. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
  288. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
  289. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
  290. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
  291. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/reading/__init__.py +0 -0
  292. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
  293. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
  294. {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-1.0.0/audiometa/test/tests/integration/real_audio_files}/__init__.py +0 -0
  295. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
  296. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
  297. {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info}/__init__.py +0 -0
  298. {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5}/__init__.py +0 -0
  299. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
  300. {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/__init__.py +0 -0
  301. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_audio_data_corruption.py +0 -0
  302. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
  303. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +0 -0
  304. {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5 → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations}/__init__.py +0 -0
  305. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_invalid_with_metadata_combinations.py +0 -0
  306. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_state_precedence.py +0 -0
  307. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_unset_with_metadata_combinations.py +0 -0
  308. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_fails_with_id3v1.py +0 -0
  309. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_with_id3v2_only.py +0 -0
  310. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_works_without_id3v1.py +0 -0
  311. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_with_metadata_combinations.py +0 -0
  312. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +0 -0
  313. {audiometa_python-0.11.0/audiometa/test/tests/integration/writing → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/__init__.py +0 -0
  314. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +0 -0
  315. {audiometa_python-0.11.0/audiometa/test/tests/integration/writing/writing_strategies → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5}/__init__.py +0 -0
  316. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_flipped_md5.py +0 -0
  317. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_partial_md5.py +0 -0
  318. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_random_md5.py +0 -0
  319. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +0 -0
  320. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_non_flac_error.py +0 -0
  321. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_unset_md5.py +0 -0
  322. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
  323. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
  324. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
  325. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/test_audio_file.py +0 -0
  326. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
  327. {audiometa_python-0.11.0/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields → audiometa_python-1.0.0/audiometa/test/tests/integration/writing}/__init__.py +0 -0
  328. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
  329. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
  330. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
  331. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
  332. {audiometa_python-0.11.0/audiometa/test/tests/unit → audiometa_python-1.0.0/audiometa/test/tests/integration/writing/writing_strategies}/__init__.py +0 -0
  333. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +0 -0
  334. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +0 -0
  335. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +0 -0
  336. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +0 -0
  337. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
  338. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
  339. {audiometa_python-0.11.0/audiometa/test/tests/unit/audio_file → audiometa_python-1.0.0/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields}/__init__.py +0 -0
  340. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -0
  341. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
  342. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
  343. {audiometa_python-0.11.0/audiometa/test/tests/unit/audio_file/technical_info → audiometa_python-1.0.0/audiometa/test/tests/unit}/__init__.py +0 -0
  344. {audiometa_python-0.11.0/audiometa/test/tests/unit/cli → audiometa_python-1.0.0/audiometa/test/tests/unit/audio_file}/__init__.py +0 -0
  345. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers → audiometa_python-1.0.0/audiometa/test/tests/unit/audio_file/technical_info}/__init__.py +0 -0
  346. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
  347. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
  348. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
  349. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
  350. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
  351. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
  352. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
  353. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
  354. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
  355. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
  356. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
  357. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
  358. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/header_info → audiometa_python-1.0.0/audiometa/test/tests/unit/cli}/__init__.py +0 -0
  359. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
  360. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers}/__init__.py +0 -0
  361. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
  362. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/header_info}/__init__.py +0 -0
  363. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
  364. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
  365. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
  366. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
  367. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field}/__init__.py +0 -0
  368. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number}/__init__.py +0 -0
  369. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number/test_disc_number_validation.py +0 -0
  370. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc}/__init__.py +0 -0
  371. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc/test_isrc_format_validation.py +0 -0
  372. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc/test_isrc_type_validation.py +0 -0
  373. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values}/__init__.py +0 -0
  374. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading}/__init__.py +0 -0
  375. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
  376. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing}/__init__.py +0 -0
  377. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
  378. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
  379. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid}/__init__.py +0 -0
  380. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid}/__init__.py +0 -0
  381. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_type_validation.py +0 -0
  382. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_uuid}/__init__.py +0 -0
  383. {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating}/__init__.py +0 -0
  384. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
  385. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
  386. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
  387. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
  388. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
  389. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
  390. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date/test_date_format_validation.py +0 -0
  391. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
  392. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
  393. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number/test_track_number_validation.py +0 -0
  394. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
  395. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
  396. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/__init__.py +0 -0
  397. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/flac_md5_state.py +0 -0
  398. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/id3v1_genre_code_map.py +0 -0
  399. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/metadata_format.py +0 -0
  400. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/metadata_writing_strategy.py +0 -0
  401. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/mutagen_exception_handler.py +0 -0
  402. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
  403. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/base.py +0 -0
  404. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
  405. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
  406. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/rating_profiles.py +0 -0
  407. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/tool_path_resolver.py +0 -0
  408. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/types.py +0 -0
  409. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/dependency_links.txt +0 -0
  410. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/entry_points.txt +0 -0
  411. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/requires.txt +0 -0
  412. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/top_level.txt +0 -0
  413. {audiometa_python-0.11.0 → audiometa_python-1.0.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: audiometa-python
3
- Version: 0.11.0
3
+ Version: 1.0.0
4
4
  Summary: A comprehensive Python library for reading and writing audio metadata across multiple formats
5
5
  Author: AudioMeta Python Contributors
6
6
  Author-email: Andreas Garcia <garcia.andreas.1991@gmail.com>
@@ -413,7 +413,7 @@ except MetadataFieldNotSupportedByMetadataFormatError as e:
413
413
 
414
414
  #### Reading Full Metadata From All Formats Including Headers and Technical Info
415
415
 
416
- **`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
416
+ **`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
417
417
 
418
418
  Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
419
419
 
@@ -462,7 +462,7 @@ See [Pre-Update Validation Function](#pre-update-validation-function) for detail
462
462
  from audiometa import update_metadata
463
463
 
464
464
  # Update metadata (use UnifiedMetadataKey for explicit typing)
465
- from audiometa.utils.UnifiedMetadataKey import UnifiedMetadataKey
465
+ from audiometa import UnifiedMetadataKey
466
466
 
467
467
  new_metadata = {
468
468
  UnifiedMetadataKey.TITLE: 'New Song Title',
@@ -688,7 +688,7 @@ id3v2_rating = get_unified_metadata_field("song.mp3", UnifiedMetadataKey.RATING,
688
688
 
689
689
  #### Reading Full Metadata From All Formats Including Headers and Technical Info
690
690
 
691
- **`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
691
+ **`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
692
692
 
693
693
  Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
694
694
 
@@ -738,6 +738,7 @@ print(f"Raw Vorbis Comments: {full_metadata['raw_metadata']['vorbis']['comments'
738
738
  - `file_path`: Path to the audio file (str or Path)
739
739
  - `include_headers`: Whether to include format-specific header information (default: True)
740
740
  - `include_technical`: Whether to include technical audio information (default: True)
741
+ - `include_cover`: Whether to include cover/art image info in raw_metadata (default: True)
741
742
 
742
743
  **Returns:**
743
744
  A comprehensive dictionary containing:
@@ -865,6 +866,9 @@ metadata_only = get_full_metadata("song.mp3", include_technical=False)
865
866
  # Get only technical info without headers
866
867
  tech_only = get_full_metadata("song.mp3", include_headers=False)
867
868
 
869
+ # Exclude cover/art from raw metadata
870
+ no_cover = get_full_metadata("song.mp3", include_cover=False)
871
+
868
872
  # Check if file has specific format headers
869
873
  if full_info['headers']['id3v2']['present']:
870
874
  print("File has ID3v2 tags")
@@ -971,7 +975,7 @@ Updates metadata in a file. The function automatically calls pre-update validati
971
975
  from audiometa import update_metadata
972
976
 
973
977
  # Basic writing (recommended: use UnifiedMetadataKey constants)
974
- from audiometa.utils.UnifiedMetadataKey import UnifiedMetadataKey
978
+ from audiometa import UnifiedMetadataKey
975
979
 
976
980
  update_metadata("song.mp3", {
977
981
  UnifiedMetadataKey.TITLE: 'New Title',
@@ -371,7 +371,7 @@ except MetadataFieldNotSupportedByMetadataFormatError as e:
371
371
 
372
372
  #### Reading Full Metadata From All Formats Including Headers and Technical Info
373
373
 
374
- **`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
374
+ **`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
375
375
 
376
376
  Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
377
377
 
@@ -420,7 +420,7 @@ See [Pre-Update Validation Function](#pre-update-validation-function) for detail
420
420
  from audiometa import update_metadata
421
421
 
422
422
  # Update metadata (use UnifiedMetadataKey for explicit typing)
423
- from audiometa.utils.UnifiedMetadataKey import UnifiedMetadataKey
423
+ from audiometa import UnifiedMetadataKey
424
424
 
425
425
  new_metadata = {
426
426
  UnifiedMetadataKey.TITLE: 'New Song Title',
@@ -646,7 +646,7 @@ id3v2_rating = get_unified_metadata_field("song.mp3", UnifiedMetadataKey.RATING,
646
646
 
647
647
  #### Reading Full Metadata From All Formats Including Headers and Technical Info
648
648
 
649
- **`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
649
+ **`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
650
650
 
651
651
  Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
652
652
 
@@ -696,6 +696,7 @@ print(f"Raw Vorbis Comments: {full_metadata['raw_metadata']['vorbis']['comments'
696
696
  - `file_path`: Path to the audio file (str or Path)
697
697
  - `include_headers`: Whether to include format-specific header information (default: True)
698
698
  - `include_technical`: Whether to include technical audio information (default: True)
699
+ - `include_cover`: Whether to include cover/art image info in raw_metadata (default: True)
699
700
 
700
701
  **Returns:**
701
702
  A comprehensive dictionary containing:
@@ -823,6 +824,9 @@ metadata_only = get_full_metadata("song.mp3", include_technical=False)
823
824
  # Get only technical info without headers
824
825
  tech_only = get_full_metadata("song.mp3", include_headers=False)
825
826
 
827
+ # Exclude cover/art from raw metadata
828
+ no_cover = get_full_metadata("song.mp3", include_cover=False)
829
+
826
830
  # Check if file has specific format headers
827
831
  if full_info['headers']['id3v2']['present']:
828
832
  print("File has ID3v2 tags")
@@ -929,7 +933,7 @@ Updates metadata in a file. The function automatically calls pre-update validati
929
933
  from audiometa import update_metadata
930
934
 
931
935
  # Basic writing (recommended: use UnifiedMetadataKey constants)
932
- from audiometa.utils.UnifiedMetadataKey import UnifiedMetadataKey
936
+ from audiometa import UnifiedMetadataKey
933
937
 
934
938
  update_metadata("song.mp3", {
935
939
  UnifiedMetadataKey.TITLE: 'New Title',
@@ -36,6 +36,36 @@ from .utils.metadata_writing_strategy import MetadataWritingStrategy
36
36
  from .utils.types import UnifiedMetadata, UnifiedMetadataValue
37
37
  from .utils.unified_metadata_key import UnifiedMetadataKey
38
38
 
39
+ __all__ = [
40
+ "UnifiedMetadataKey",
41
+ "FlacMd5State",
42
+ "MetadataFormat",
43
+ "MetadataWritingStrategy",
44
+ "UnifiedMetadata",
45
+ "UnifiedMetadataValue",
46
+ "FileCorruptedError",
47
+ "FileTypeNotSupportedError",
48
+ "InvalidMetadataFieldTypeError",
49
+ "MetadataFieldNotSupportedByLibError",
50
+ "MetadataFieldNotSupportedByMetadataFormatError",
51
+ "MetadataFormatNotSupportedByAudioFormatError",
52
+ "MetadataWritingConflictParametersError",
53
+ "get_unified_metadata",
54
+ "get_unified_metadata_field",
55
+ "validate_metadata_for_update",
56
+ "update_metadata",
57
+ "delete_all_metadata",
58
+ "get_bitrate",
59
+ "get_channels",
60
+ "get_file_size",
61
+ "get_sample_rate",
62
+ "is_audio_file",
63
+ "get_duration_in_sec",
64
+ "is_flac_md5_valid",
65
+ "fix_md5_checking",
66
+ "get_full_metadata",
67
+ ]
68
+
39
69
  FILE_EXTENSION_NOT_HANDLED_MESSAGE = "The file's format is not handled by the service."
40
70
 
41
71
  METADATA_FORMAT_MANAGER_CLASS_MAP: dict[MetadataFormat, type] = {
@@ -478,6 +508,16 @@ def _validate_metadata_field_formats(unified_metadata: UnifiedMetadata) -> None:
478
508
  ):
479
509
  _MetadataManager.validate_musicbrainz_trackid(musicbrainz_trackid_value)
480
510
 
511
+ # Validate MusicBrainz Artist ID format if present and non-empty
512
+ if UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS in unified_metadata:
513
+ musicbrainz_artistids_value = unified_metadata[UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS]
514
+ if (
515
+ musicbrainz_artistids_value is not None
516
+ and isinstance(musicbrainz_artistids_value, list)
517
+ and musicbrainz_artistids_value
518
+ ):
519
+ _MetadataManager.validate_musicbrainz_artistids(musicbrainz_artistids_value)
520
+
481
521
 
482
522
  def validate_metadata_for_update(
483
523
  unified_metadata: dict[UnifiedMetadataKey, Any] | UnifiedMetadata,
@@ -1221,7 +1261,10 @@ def fix_md5_checking(file: PublicFileType) -> str:
1221
1261
 
1222
1262
 
1223
1263
  def get_full_metadata(
1224
- file: PublicFileType, include_headers: bool = True, include_technical: bool = True
1264
+ file: PublicFileType,
1265
+ include_headers: bool = True,
1266
+ include_technical: bool = True,
1267
+ include_cover: bool = True,
1225
1268
  ) -> dict[str, Any]:
1226
1269
  """Get comprehensive metadata including all available information from a file.
1227
1270
 
@@ -1237,6 +1280,7 @@ def get_full_metadata(
1237
1280
  file: Audio file path (str or Path)
1238
1281
  include_headers: Whether to include format-specific header information (default: True)
1239
1282
  include_technical: Whether to include technical audio information (default: True)
1283
+ include_cover: Whether to include cover/art image info in raw_metadata (default: True)
1240
1284
 
1241
1285
  Returns:
1242
1286
  Comprehensive dictionary containing all available metadata and technical information
@@ -1383,4 +1427,25 @@ def get_full_metadata(
1383
1427
  "chunk_structure": {},
1384
1428
  }
1385
1429
 
1430
+ if not include_cover:
1431
+ id3v2_raw = raw_metadata_dict.get("id3v2", {})
1432
+ frames = id3v2_raw.get("frames", {})
1433
+ if "APIC:" in frames:
1434
+ raw_metadata_dict["id3v2"] = {
1435
+ **id3v2_raw,
1436
+ "frames": {k: v for k, v in frames.items() if k != "APIC:"},
1437
+ }
1438
+
1439
+ riff_raw = raw_metadata_dict.get("riff", {})
1440
+ riff_cover_parsed_keys = frozenset({"ICON"})
1441
+ riff_cover_chunk_keys = frozenset({"cover", "image"})
1442
+ parsed = riff_raw.get("parsed_fields", {})
1443
+ chunk = riff_raw.get("chunk_structure", {})
1444
+ if riff_cover_parsed_keys & frozenset(parsed) or riff_cover_chunk_keys & frozenset(chunk):
1445
+ raw_metadata_dict["riff"] = {
1446
+ **riff_raw,
1447
+ "parsed_fields": {k: v for k, v in parsed.items() if k not in riff_cover_parsed_keys},
1448
+ "chunk_structure": {k: v for k, v in chunk.items() if k not in riff_cover_chunk_keys},
1449
+ }
1450
+
1386
1451
  return result
@@ -95,6 +95,7 @@ def format_as_table(data: dict[str, Any]) -> str:
95
95
  "archival_location",
96
96
  "isrc",
97
97
  "musicbrainz_trackid",
98
+ "musicbrainz_artistids",
98
99
  "description",
99
100
  "originator",
100
101
  }
@@ -146,6 +147,7 @@ def _read_metadata(args: argparse.Namespace) -> None:
146
147
  file_path,
147
148
  include_headers=not getattr(args, "no_headers", False),
148
149
  include_technical=not getattr(args, "no_technical", False),
150
+ include_cover=not getattr(args, "no_cover", False),
149
151
  )
150
152
 
151
153
  output = format_output(metadata, args.output_format)
@@ -203,6 +205,10 @@ def _write_metadata(args: argparse.Namespace) -> None:
203
205
  metadata[UnifiedMetadataKey.MUSICBRAINZ_TRACKID] = args.musicbrainz_track_id
204
206
 
205
207
  # List fields (can be specified multiple times)
208
+ if args.musicbrainz_artist_ids:
209
+ artist_ids = [aid.strip() for aid in args.musicbrainz_artist_ids if aid and aid.strip()]
210
+ if artist_ids:
211
+ metadata[UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS] = artist_ids
206
212
  if args.artist:
207
213
  artists = [a.strip() for a in args.artist if a and a.strip()]
208
214
  if artists:
@@ -385,6 +391,7 @@ Examples:
385
391
  read_parser.add_argument("--output", "-o", help="Output file (default: stdout)")
386
392
  read_parser.add_argument("--no-headers", action="store_true", help="Exclude header information")
387
393
  read_parser.add_argument("--no-technical", action="store_true", help="Exclude technical information")
394
+ read_parser.add_argument("--no-cover", action="store_true", help="Exclude cover/art image from raw metadata")
388
395
  read_parser.add_argument("--recursive", "-r", action="store_true", help="Process directories recursively")
389
396
  read_parser.add_argument(
390
397
  "--continue-on-error", action="store_true", help="Continue processing other files on error"
@@ -448,6 +455,12 @@ Examples:
448
455
  dest="musicbrainz_track_id",
449
456
  help="MusicBrainz Track ID (Recording ID) - UUID format (e.g., '9d6f6f7c-9d52-4c76-8f9e-01d18d8f8ec6')",
450
457
  )
458
+ write_parser.add_argument(
459
+ "--musicbrainz-artist-ids",
460
+ action="append",
461
+ dest="musicbrainz_artist_ids",
462
+ help="MusicBrainz Artist IDs - UUID format (can be specified multiple times for multiple artists)",
463
+ )
451
464
  write_parser.add_argument(
452
465
  "--force-format",
453
466
  choices=["id3v2", "id3v1", "vorbis", "riff"],
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, TypeVar, Union, cast
4
4
 
5
5
  from mutagen._file import FileType as MutagenMetadata
6
6
 
7
- from audiometa.exceptions import InvalidMetadataFieldFormatError
7
+ from audiometa.exceptions import InvalidMetadataFieldFormatError, InvalidMetadataFieldTypeError
8
8
  from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
9
9
 
10
10
  if TYPE_CHECKING:
@@ -255,6 +255,33 @@ class _MetadataManager:
255
255
  isrc,
256
256
  )
257
257
 
258
+ @staticmethod
259
+ def _validate_musicbrainz_uuid_format(uuid_str: str, field_key: UnifiedMetadataKey) -> None:
260
+ """Validate a single MusicBrainz UUID string format.
261
+
262
+ Accepts 36-character hyphenated UUID or 32-character hex string. Empty strings are allowed.
263
+
264
+ Raises:
265
+ InvalidMetadataFieldFormatError: If the UUID format is invalid
266
+ """
267
+ if not uuid_str:
268
+ return
269
+
270
+ # 36-character hyphenated UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
271
+ if re.match(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", uuid_str):
272
+ return
273
+
274
+ # 32-character hex string without hyphens
275
+ if re.match(r"^[0-9a-fA-F]{32}$", uuid_str):
276
+ return
277
+
278
+ raise InvalidMetadataFieldFormatError(
279
+ field_key.value,
280
+ "36-character hyphenated UUID (e.g., '9d6f6f7c-9d52-4c76-8f9e-01d18d8f8ec6') or "
281
+ "32-character hex string (e.g., '9d6f6f7c9d524c768f9e01d18d8f8ec6')",
282
+ uuid_str,
283
+ )
284
+
258
285
  @staticmethod
259
286
  def validate_musicbrainz_trackid(track_id: str) -> None:
260
287
  """Validate MusicBrainz Track ID (UUID) format.
@@ -279,23 +306,28 @@ class _MetadataManager:
279
306
  >>> _MetadataManager.validate_musicbrainz_trackid("not-a-uuid")
280
307
  # Raises InvalidMetadataFieldFormatError
281
308
  """
282
- if not track_id:
283
- return
309
+ _MetadataManager._validate_musicbrainz_uuid_format(track_id, UnifiedMetadataKey.MUSICBRAINZ_TRACKID)
284
310
 
285
- # 36-character hyphenated UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
286
- if re.match(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", track_id):
287
- return
311
+ @staticmethod
312
+ def validate_musicbrainz_artistids(artist_ids: list[str]) -> None:
313
+ """Validate MusicBrainz Artist ID(s) (UUID) format.
288
314
 
289
- # 32-character hex string without hyphens
290
- if re.match(r"^[0-9a-fA-F]{32}$", track_id):
291
- return
315
+ Each Artist ID must be a valid UUID (36-char hyphenated or 32-char hex).
316
+ Empty list or list with empty strings is allowed.
292
317
 
293
- raise InvalidMetadataFieldFormatError(
294
- UnifiedMetadataKey.MUSICBRAINZ_TRACKID.value,
295
- "36-character hyphenated UUID (e.g., '9d6f6f7c-9d52-4c76-8f9e-01d18d8f8ec6') or "
296
- "32-character hex string (e.g., '9d6f6f7c9d524c768f9e01d18d8f8ec6')",
297
- track_id,
298
- )
318
+ Raises:
319
+ InvalidMetadataFieldFormatError: If any Artist ID format is invalid
320
+ InvalidMetadataFieldTypeError: If artist_ids is not a list
321
+ """
322
+ if not isinstance(artist_ids, list):
323
+ raise InvalidMetadataFieldTypeError(
324
+ UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS.value,
325
+ "list of strings",
326
+ type(artist_ids).__name__,
327
+ )
328
+
329
+ for artist_id in artist_ids:
330
+ _MetadataManager._validate_musicbrainz_uuid_format(artist_id, UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS)
299
331
 
300
332
  @abstractmethod
301
333
  def _extract_mutagen_metadata(self) -> MutagenMetadata:
@@ -714,6 +746,32 @@ class _MetadataManager:
714
746
  return self._get_genres_from_raw_clean_metadata_uppercase_keys(
715
747
  self.raw_clean_metadata_uppercase_keys, raw_metadata_key
716
748
  )
749
+ if unified_metadata_key == UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS:
750
+ # First apply smart parsing to handle separator-based values
751
+ if unified_metadata_key.can_semantically_have_multiple_values():
752
+ if self._should_apply_smart_parsing(values_list_str):
753
+ # Apply parsing for single entry (legacy data detection)
754
+ parsed_values = self._apply_smart_parsing(values_list_str)
755
+ values_list_str = parsed_values if parsed_values else []
756
+ else:
757
+ # No parsing - filter empty/whitespace values
758
+ values_list_str = [val.strip() for val in values_list_str if val.strip()]
759
+
760
+ # Then normalize UUIDs: convert 32-char hex to 36-char hyphenated format if needed
761
+ normalized_ids = []
762
+ uuid_hex_length = 32
763
+ for artist_id in values_list_str:
764
+ if artist_id and artist_id.strip():
765
+ normalized_id = artist_id.strip()
766
+ if len(normalized_id) == uuid_hex_length and all(
767
+ c in "0123456789abcdefABCDEF" for c in normalized_id
768
+ ):
769
+ normalized_id = (
770
+ f"{normalized_id[:8]}-{normalized_id[8:12]}-"
771
+ f"{normalized_id[12:16]}-{normalized_id[16:20]}-{normalized_id[20:32]}"
772
+ )
773
+ normalized_ids.append(normalized_id)
774
+ return normalized_ids if normalized_ids else None
717
775
  if unified_metadata_key.can_semantically_have_multiple_values():
718
776
  # Apply smart parsing logic for semantically multi-value fields
719
777
  if self._should_apply_smart_parsing(values_list_str):