audiometa-python 0.7.1__tar.gz → 0.8.1__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 (377) hide show
  1. {audiometa_python-0.7.1/audiometa_python.egg-info → audiometa_python-0.8.1}/PKG-INFO +11 -11
  2. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/README.md +10 -10
  3. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/__init__.py +60 -18
  4. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/_audio_file.py +11 -0
  5. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +59 -1
  6. audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +35 -0
  7. audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +32 -0
  8. audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +90 -0
  9. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_invalid_md5/test_flipped_md5.py +0 -7
  10. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_invalid_md5/test_partial_md5.py +0 -9
  11. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_invalid_md5/test_random_md5.py +0 -9
  12. audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +63 -0
  13. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_unset_md5.py +0 -18
  14. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +1 -0
  15. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +306 -0
  16. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +174 -0
  17. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +306 -0
  18. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +105 -0
  19. audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
  20. audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
  21. {audiometa_python-0.7.1 → audiometa_python-0.8.1/audiometa_python.egg-info}/PKG-INFO +11 -11
  22. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/SOURCES.txt +26 -18
  23. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/pyproject.toml +1 -1
  24. audiometa_python-0.7.1/audiometa/test/tests/integration/audio_format/wav/test_wav_with_id3v2_tags.py +0 -83
  25. audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies/test_sync_strategy.py +0 -279
  26. audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -42
  27. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/LICENSE +0 -0
  28. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/__main__.py +0 -0
  29. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/cli.py +0 -0
  30. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/exceptions.py +0 -0
  31. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_MetadataManager.py +0 -0
  32. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/__init__.py +0 -0
  33. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
  34. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/__init__.py +0 -0
  35. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +0 -0
  36. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
  37. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
  38. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +0 -0
  39. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
  40. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
  41. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +0 -0
  42. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
  43. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
  44. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
  45. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/__init__.py +0 -0
  46. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_constants.py +0 -0
  47. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
  48. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
  49. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/__init__.py +0 -0
  50. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/assets/create_test_files.py +0 -0
  51. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/__init__.py +0 -0
  52. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/common/__init__.py +0 -0
  53. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
  54. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
  55. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/__init__.py +0 -0
  56. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
  57. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
  58. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
  59. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
  60. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/__init__.py +0 -0
  61. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
  62. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
  63. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
  64. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
  65. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +0 -0
  66. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/__init__.py +0 -0
  67. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
  68. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
  69. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
  70. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
  71. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_setter.py +0 -0
  72. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/scripts/__init__.py +0 -0
  73. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/technical_info_inspector.py +0 -0
  74. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
  75. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/__init__.py +0 -0
  76. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
  77. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
  78. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
  79. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
  80. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/__init__.py +0 -0
  81. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/conftest.py +0 -0
  82. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/__init__.py +0 -0
  83. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
  84. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
  85. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
  86. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
  87. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
  88. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
  89. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
  90. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
  91. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
  92. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
  93. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
  94. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
  95. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +0 -0
  96. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
  97. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
  98. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
  99. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
  100. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
  101. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
  102. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
  103. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
  104. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
  105. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
  106. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +0 -0
  107. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
  108. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
  109. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
  110. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
  111. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
  112. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
  113. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
  114. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
  115. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
  116. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
  117. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
  118. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
  119. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
  120. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/__init__.py +0 -0
  121. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
  122. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
  123. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
  124. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
  125. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
  126. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
  127. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
  128. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
  129. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
  130. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
  131. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
  132. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
  133. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
  134. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
  135. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
  136. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
  137. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/conftest.py +0 -0
  138. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
  139. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
  140. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
  141. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
  142. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
  143. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
  144. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
  145. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
  146. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
  147. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
  148. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
  149. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
  150. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
  151. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
  152. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
  153. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -0
  154. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
  155. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
  156. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
  157. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
  158. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
  159. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
  160. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
  161. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
  162. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
  163. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
  164. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
  165. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
  166. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
  167. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
  168. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
  169. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
  170. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
  171. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
  172. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
  173. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
  174. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
  175. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
  176. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
  177. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
  178. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
  179. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
  180. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
  181. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
  182. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
  183. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
  184. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
  185. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
  186. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
  187. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
  188. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
  189. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
  190. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
  191. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
  192. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
  193. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
  194. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
  195. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
  196. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
  197. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
  198. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
  199. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
  200. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
  201. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
  202. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
  203. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
  204. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
  205. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
  206. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
  207. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
  208. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
  209. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
  210. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
  211. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
  212. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
  213. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
  214. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
  215. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
  216. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/__init__.py +0 -0
  217. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
  218. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
  219. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
  220. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/__init__.py +0 -0
  221. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/__init__.py +0 -0
  222. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
  223. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
  224. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
  225. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
  226. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
  227. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/__init__.py +0 -0
  228. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/__init__.py +0 -0
  229. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
  230. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
  231. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
  232. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
  233. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/__init__.py +0 -0
  234. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
  235. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
  236. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
  237. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
  238. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
  239. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/__init__.py +0 -0
  240. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
  241. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
  242. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
  243. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
  244. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/__init__.py +0 -0
  245. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/__init__.py +0 -0
  246. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
  247. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
  248. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
  249. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
  250. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
  251. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
  252. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
  253. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
  254. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
  255. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
  256. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
  257. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
  258. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
  259. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
  260. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
  261. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
  262. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
  263. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
  264. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
  265. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
  266. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
  267. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
  268. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
  269. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
  270. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/__init__.py +0 -0
  271. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
  272. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
  273. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/__init__.py +0 -0
  274. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
  275. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
  276. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/__init__.py +0 -0
  277. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/__init__.py +0 -0
  278. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
  279. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/__init__.py +0 -0
  280. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_audio_data_corruption.py +0 -0
  281. /audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_valid_md5.py → /audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
  282. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/__init__.py +0 -0
  283. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_invalid_with_metadata_combinations.py +0 -0
  284. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_state_precedence.py +0 -0
  285. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_unset_with_metadata_combinations.py +0 -0
  286. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_validation_fails_with_id3v1.py +0 -0
  287. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_validation_with_id3v2_only.py +0 -0
  288. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_validation_works_without_id3v1.py +0 -0
  289. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_with_metadata_combinations.py +0 -0
  290. {audiometa_python-0.7.1/audiometa/test/tests/integration/writing → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/__init__.py +0 -0
  291. {audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5}/__init__.py +0 -0
  292. {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_non_flac_error.py +0 -0
  293. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
  294. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
  295. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
  296. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
  297. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_file.py +0 -0
  298. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
  299. {audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields → audiometa_python-0.8.1/audiometa/test/tests/integration/writing}/__init__.py +0 -0
  300. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
  301. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
  302. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
  303. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
  304. {audiometa_python-0.7.1/audiometa/test/tests/unit → audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies}/__init__.py +0 -0
  305. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
  306. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
  307. {audiometa_python-0.7.1/audiometa/test/tests/unit/audio_file → audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields}/__init__.py +0 -0
  308. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
  309. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
  310. {audiometa_python-0.7.1/audiometa/test/tests/unit/audio_file/technical_info → audiometa_python-0.8.1/audiometa/test/tests/unit}/__init__.py +0 -0
  311. {audiometa_python-0.7.1/audiometa/test/tests/unit/cli → audiometa_python-0.8.1/audiometa/test/tests/unit/audio_file}/__init__.py +0 -0
  312. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers → audiometa_python-0.8.1/audiometa/test/tests/unit/audio_file/technical_info}/__init__.py +0 -0
  313. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
  314. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
  315. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
  316. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
  317. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
  318. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
  319. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
  320. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
  321. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
  322. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
  323. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
  324. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
  325. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/header_info → audiometa_python-0.8.1/audiometa/test/tests/unit/cli}/__init__.py +0 -0
  326. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
  327. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers}/__init__.py +0 -0
  328. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
  329. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/header_info}/__init__.py +0 -0
  330. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
  331. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
  332. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
  333. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
  334. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field}/__init__.py +0 -0
  335. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values}/__init__.py +0 -0
  336. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading}/__init__.py +0 -0
  337. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
  338. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing}/__init__.py +0 -0
  339. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
  340. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
  341. {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating}/__init__.py +0 -0
  342. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
  343. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
  344. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
  345. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
  346. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
  347. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
  348. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_date_format_validation.py +0 -0
  349. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_disc_number_validation.py +0 -0
  350. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_format_validation.py +0 -0
  351. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_type_validation.py +0 -0
  352. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_track_number_validation.py +0 -0
  353. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
  354. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
  355. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
  356. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
  357. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/__init__.py +0 -0
  358. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/flac_md5_state.py +0 -0
  359. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/id3v1_genre_code_map.py +0 -0
  360. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/metadata_format.py +0 -0
  361. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/metadata_writing_strategy.py +0 -0
  362. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/mutagen_exception_handler.py +0 -0
  363. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
  364. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/base.py +0 -0
  365. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/config.py +0 -0
  366. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
  367. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
  368. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
  369. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/rating_profiles.py +0 -0
  370. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/tool_path_resolver.py +0 -0
  371. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/types.py +0 -0
  372. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/unified_metadata_key.py +0 -0
  373. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/dependency_links.txt +0 -0
  374. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/entry_points.txt +0 -0
  375. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/requires.txt +0 -0
  376. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/top_level.txt +0 -0
  377. {audiometa_python-0.7.1 → audiometa_python-0.8.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: audiometa-python
3
- Version: 0.7.1
3
+ Version: 0.8.1
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>
@@ -41,29 +41,29 @@ Requires-Dist: PyYAML==6.0; extra == "yaml"
41
41
  Dynamic: license-file
42
42
 
43
43
  <div align="center">
44
- <img src="https://raw.githubusercontent.com/Andreas-Garcia/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
44
+ <img src="https://raw.githubusercontent.com/BehindTheMusicTree/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
45
45
  </div>
46
46
 
47
47
  # AudioMeta Python
48
48
 
49
- [![CI](https://github.com/Andreas-Garcia/audiometa/actions/workflows/ci.yml/badge.svg)](https://github.com/Andreas-Garcia/audiometa/actions/workflows/ci.yml)
49
+ [![CI](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml/badge.svg)](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml)
50
50
  [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13%20%7C%203.14-blue)](https://www.python.org/)
51
51
  [![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](LICENSE)
52
52
  [![PyPI version](https://img.shields.io/pypi/v/audiometa-python)](https://pypi.org/project/audiometa-python/)
53
53
  [![Downloads](https://img.shields.io/pepy/dt/audiometa-python)](https://pepy.tech/project/audiometa-python)
54
- [![GitHub stars](https://img.shields.io/github/stars/Andreas-Garcia/audiometa?style=social)](https://github.com/Andreas-Garcia/audiometa/stargazers)
54
+ [![GitHub stars](https://img.shields.io/github/stars/BehindTheMusicTree/audiometa?style=social)](https://github.com/BehindTheMusicTree/audiometa/stargazers)
55
55
 
56
56
  A powerful, unified Python library for reading and writing audio metadata across multiple formats. AudioMeta supports MP3, FLAC, and WAV audio files, working seamlessly with ID3v1, ID3v2, Vorbis, and RIFF metadata formats through a single, consistent API.
57
57
 
58
- **Author**: [Andreas Garcia](https://github.com/Andreas-Garcia)
58
+ **Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
59
59
 
60
60
  ## ⭐ Show Your Support
61
61
 
62
62
  If you find AudioMeta Python useful, please consider:
63
63
 
64
64
  - ⭐ **Starring this repository** - It helps others discover the project
65
- - 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/Andreas-Garcia/audiometa/issues)
66
- - 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/Andreas-Garcia/audiometa/discussions) or [feature requests](https://github.com/Andreas-Garcia/audiometa/issues)
65
+ - 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/BehindTheMusicTree/audiometa/issues)
66
+ - 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions) or [feature requests](https://github.com/BehindTheMusicTree/audiometa/issues)
67
67
  - 🤝 **Contributing** - See [CONTRIBUTING.md](CONTRIBUTING.md) for ways to help
68
68
  - 📢 **Sharing** - Tell others about AudioMeta Python
69
69
 
@@ -111,7 +111,7 @@ Your support helps make this project better for everyone! 🎵
111
111
  - [📝 Changelog](#-changelog)
112
112
  - [🤝 Contributing](#-contributing)
113
113
  - [Code of Conduct](CODE_OF_CONDUCT.md)
114
- - [Security Policy](https://github.com/Andreas-Garcia/audiometa/security/policy)
114
+ - [Security Policy](https://github.com/BehindTheMusicTree/audiometa/security/policy)
115
115
  - [License](#license)
116
116
 
117
117
  ## ✨ Features
@@ -1561,11 +1561,11 @@ Whether you're fixing bugs, adding features, improving documentation, or sharing
1561
1561
 
1562
1562
  **Ways to contribute:**
1563
1563
 
1564
- - 🐛 **Report bugs** - Use the [bug report template](https://github.com/Andreas-Garcia/audiometa/issues/new?template=bug_report.yml)
1565
- - 💡 **Suggest features** - Use the [feature request template](https://github.com/Andreas-Garcia/audiometa/issues/new?template=feature_request.yml)
1564
+ - 🐛 **Report bugs** - Use the [bug report template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=bug_report.yml)
1565
+ - 💡 **Suggest features** - Use the [feature request template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=feature_request.yml)
1566
1566
  - 🔧 **Submit pull requests** - See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines
1567
1567
  - 📝 **Improve documentation** - Fix typos, clarify explanations, add examples
1568
- - 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/Andreas-Garcia/audiometa/discussions)
1568
+ - 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions)
1569
1569
  - ⭐ **Star the repo** - Help others discover the project
1570
1570
 
1571
1571
  For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -1,27 +1,27 @@
1
1
  <div align="center">
2
- <img src="https://raw.githubusercontent.com/Andreas-Garcia/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
2
+ <img src="https://raw.githubusercontent.com/BehindTheMusicTree/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
3
3
  </div>
4
4
 
5
5
  # AudioMeta Python
6
6
 
7
- [![CI](https://github.com/Andreas-Garcia/audiometa/actions/workflows/ci.yml/badge.svg)](https://github.com/Andreas-Garcia/audiometa/actions/workflows/ci.yml)
7
+ [![CI](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml/badge.svg)](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml)
8
8
  [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13%20%7C%203.14-blue)](https://www.python.org/)
9
9
  [![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](LICENSE)
10
10
  [![PyPI version](https://img.shields.io/pypi/v/audiometa-python)](https://pypi.org/project/audiometa-python/)
11
11
  [![Downloads](https://img.shields.io/pepy/dt/audiometa-python)](https://pepy.tech/project/audiometa-python)
12
- [![GitHub stars](https://img.shields.io/github/stars/Andreas-Garcia/audiometa?style=social)](https://github.com/Andreas-Garcia/audiometa/stargazers)
12
+ [![GitHub stars](https://img.shields.io/github/stars/BehindTheMusicTree/audiometa?style=social)](https://github.com/BehindTheMusicTree/audiometa/stargazers)
13
13
 
14
14
  A powerful, unified Python library for reading and writing audio metadata across multiple formats. AudioMeta supports MP3, FLAC, and WAV audio files, working seamlessly with ID3v1, ID3v2, Vorbis, and RIFF metadata formats through a single, consistent API.
15
15
 
16
- **Author**: [Andreas Garcia](https://github.com/Andreas-Garcia)
16
+ **Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
17
17
 
18
18
  ## ⭐ Show Your Support
19
19
 
20
20
  If you find AudioMeta Python useful, please consider:
21
21
 
22
22
  - ⭐ **Starring this repository** - It helps others discover the project
23
- - 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/Andreas-Garcia/audiometa/issues)
24
- - 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/Andreas-Garcia/audiometa/discussions) or [feature requests](https://github.com/Andreas-Garcia/audiometa/issues)
23
+ - 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/BehindTheMusicTree/audiometa/issues)
24
+ - 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions) or [feature requests](https://github.com/BehindTheMusicTree/audiometa/issues)
25
25
  - 🤝 **Contributing** - See [CONTRIBUTING.md](CONTRIBUTING.md) for ways to help
26
26
  - 📢 **Sharing** - Tell others about AudioMeta Python
27
27
 
@@ -69,7 +69,7 @@ Your support helps make this project better for everyone! 🎵
69
69
  - [📝 Changelog](#-changelog)
70
70
  - [🤝 Contributing](#-contributing)
71
71
  - [Code of Conduct](CODE_OF_CONDUCT.md)
72
- - [Security Policy](https://github.com/Andreas-Garcia/audiometa/security/policy)
72
+ - [Security Policy](https://github.com/BehindTheMusicTree/audiometa/security/policy)
73
73
  - [License](#license)
74
74
 
75
75
  ## ✨ Features
@@ -1519,11 +1519,11 @@ Whether you're fixing bugs, adding features, improving documentation, or sharing
1519
1519
 
1520
1520
  **Ways to contribute:**
1521
1521
 
1522
- - 🐛 **Report bugs** - Use the [bug report template](https://github.com/Andreas-Garcia/audiometa/issues/new?template=bug_report.yml)
1523
- - 💡 **Suggest features** - Use the [feature request template](https://github.com/Andreas-Garcia/audiometa/issues/new?template=feature_request.yml)
1522
+ - 🐛 **Report bugs** - Use the [bug report template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=bug_report.yml)
1523
+ - 💡 **Suggest features** - Use the [feature request template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=feature_request.yml)
1524
1524
  - 🔧 **Submit pull requests** - See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines
1525
1525
  - 📝 **Improve documentation** - Fix typos, clarify explanations, add examples
1526
- - 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/Andreas-Garcia/audiometa/discussions)
1526
+ - 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions)
1527
1527
  - ⭐ **Star the repo** - Help others discover the project
1528
1528
 
1529
1529
  For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -553,6 +553,7 @@ def update_metadata(
553
553
  metadata_strategy: MetadataWritingStrategy | None = None,
554
554
  metadata_format: MetadataFormat | None = None,
555
555
  fail_on_unsupported_field: bool = False,
556
+ warn_on_unsupported_field: bool = True,
556
557
  ) -> None:
557
558
  """Update metadata in an audio file.
558
559
 
@@ -575,6 +576,9 @@ def update_metadata(
575
576
  If False (default), unsupported fields are filtered out with individual warnings for each field.
576
577
  For SYNC strategy, this applies per-format: unsupported fields are skipped for each format that
577
578
  doesn't support them, while still syncing all supported fields.
579
+ warn_on_unsupported_field: If True (default), issues warnings when unsupported fields are encountered.
580
+ If False, suppresses warnings about unsupported fields. Automatically set to False when
581
+ fail_on_unsupported_field is True.
578
582
 
579
583
  Returns:
580
584
  None
@@ -600,8 +604,9 @@ def update_metadata(
600
604
 
601
605
  When metadata_strategy is used, unsupported metadata fields are handled based on the
602
606
  fail_on_unsupported_field parameter: True raises MetadataFieldNotSupportedByMetadataFormatError, False (default)
603
- filters unsupported fields and warns about each one individually. For SYNC strategy, unsupported fields
604
- are skipped per-format, allowing supported fields to sync while warning about unsupported ones.
607
+ filters unsupported fields and warns about each one individually (unless warn_on_unsupported_field is False).
608
+ For SYNC strategy, unsupported fields are skipped per-format, allowing supported fields to sync while warning
609
+ about unsupported ones.
605
610
 
606
611
  Data Filtering:
607
612
  For list-type metadata fields (e.g., ARTISTS, GENRES), empty strings and None values
@@ -642,6 +647,9 @@ def update_metadata(
642
647
  }
643
648
  # Results in: ["Artist 1", "Artist 2"] - empty strings and None filtered out
644
649
  update_metadata("song.mp3", metadata)
650
+
651
+ # Suppress warnings about unsupported fields
652
+ update_metadata("song.mp3", metadata, warn_on_unsupported_field=False)
645
653
  """
646
654
  audio_file = _AudioFile(file)
647
655
 
@@ -655,6 +663,11 @@ def update_metadata(
655
663
  )
656
664
  raise MetadataWritingConflictParametersError(msg)
657
665
 
666
+ # Automatically disable warnings when failing on unsupported fields
667
+ # This provides a more intuitive API where fail takes precedence over warn
668
+ if fail_on_unsupported_field:
669
+ warn_on_unsupported_field = False
670
+
658
671
  # Default to SYNC strategy if not specified
659
672
  if metadata_strategy is None:
660
673
  metadata_strategy = MetadataWritingStrategy.SYNC
@@ -677,6 +690,7 @@ def update_metadata(
677
690
  id3v2_version,
678
691
  metadata_format,
679
692
  fail_on_unsupported_field,
693
+ warn_on_unsupported_field,
680
694
  )
681
695
 
682
696
 
@@ -688,6 +702,7 @@ def _handle_metadata_strategy(
688
702
  id3v2_version: tuple[int, int, int] | None,
689
703
  target_format: MetadataFormat | None = None,
690
704
  fail_on_unsupported_field: bool = False,
705
+ warn_on_unsupported_field: bool = True,
691
706
  ) -> None:
692
707
  """Handle metadata strategy-specific behavior for all strategies."""
693
708
 
@@ -743,11 +758,12 @@ def _handle_metadata_strategy(
743
758
  msg = f"Fields not supported by {target_format_actual.value} format: {unsupported_fields}"
744
759
  raise MetadataFieldNotSupportedByMetadataFormatError(msg)
745
760
  # Warn about each unsupported field individually
746
- for unsupported_field in unsupported_fields:
747
- field_warn_msg = (
748
- f"Field {unsupported_field} not supported by {target_format_actual.value} format, skipped"
749
- )
750
- warnings.warn(field_warn_msg, stacklevel=2)
761
+ if warn_on_unsupported_field:
762
+ for unsupported_field in unsupported_fields:
763
+ field_warn_msg = (
764
+ f"Field {unsupported_field} not supported by {target_format_actual.value} format, skipped"
765
+ )
766
+ warnings.warn(field_warn_msg, stacklevel=2)
751
767
  # Create filtered metadata without unsupported fields
752
768
  filtered_metadata = {k: v for k, v in unified_metadata.items() if k not in unsupported_fields}
753
769
  unified_metadata = filtered_metadata
@@ -784,11 +800,12 @@ def _handle_metadata_strategy(
784
800
  unsupported_fields.append(field)
785
801
  if unsupported_fields:
786
802
  # Warn about each unsupported field individually for target format
787
- for unsupported_field in unsupported_fields:
788
- field_warn_msg = (
789
- f"Field {unsupported_field} not supported by {target_format_actual.value} format, skipped"
790
- )
791
- warnings.warn(field_warn_msg, stacklevel=2)
803
+ if warn_on_unsupported_field:
804
+ for unsupported_field in unsupported_fields:
805
+ field_warn_msg = (
806
+ f"Field {unsupported_field} not supported by {target_format_actual.value} format, skipped"
807
+ )
808
+ warnings.warn(field_warn_msg, stacklevel=2)
792
809
  # Create filtered metadata without unsupported fields
793
810
  filtered_metadata = {k: v for k, v in unified_metadata.items() if k not in unsupported_fields}
794
811
  unified_metadata = filtered_metadata
@@ -799,8 +816,9 @@ def _handle_metadata_strategy(
799
816
  target_manager.update_metadata(unified_metadata)
800
817
  except MetadataFieldNotSupportedByMetadataFormatError as e:
801
818
  # For SYNC strategy, log warning but continue with other formats
802
- format_warn_msg = f"Format {target_format_actual} doesn't support some metadata fields: {e}"
803
- warnings.warn(format_warn_msg, stacklevel=2)
819
+ if warn_on_unsupported_field:
820
+ format_warn_msg = f"Format {target_format_actual} doesn't support some metadata fields: {e}"
821
+ warnings.warn(format_warn_msg, stacklevel=2)
804
822
  except Exception as e:
805
823
  # Re-raise user errors (like InvalidRatingValueError) immediately
806
824
  from .exceptions import ConfigurationError, InvalidRatingValueError
@@ -812,6 +830,28 @@ def _handle_metadata_strategy(
812
830
  # Then sync all other available formats
813
831
  # Note: We need to be careful about the order to avoid conflicts
814
832
  for fmt_name, manager in other_managers.items():
833
+ # Check if this format has existing metadata (for SYNC strategy)
834
+ has_existing = False
835
+ if fmt_name == "id3v1":
836
+ has_existing = audio_file._has_id3v1_tags()
837
+ elif fmt_name == "id3v2":
838
+ # Check if file starts with ID3
839
+ try:
840
+ from pathlib import Path
841
+
842
+ with Path(audio_file.file_path).open("rb") as f:
843
+ header = f.read(3)
844
+ has_existing = header == b"ID3"
845
+ except Exception:
846
+ has_existing = False
847
+ elif fmt_name == "vorbis":
848
+ has_existing = audio_file.file_extension == ".flac" # Vorbis is native for FLAC
849
+ elif fmt_name == "riff":
850
+ has_existing = audio_file.file_extension == ".wav" # RIFF is native for WAV
851
+
852
+ if not has_existing:
853
+ continue
854
+
815
855
  # For non-target formats, filter out unsupported fields and warn about them
816
856
  # This allows syncing supported fields even when some fields are not supported
817
857
  unsupported_fields = []
@@ -828,9 +868,10 @@ def _handle_metadata_strategy(
828
868
  )
829
869
 
830
870
  # Warn about each unsupported field individually for non-target formats
831
- for unsupported_field in unsupported_fields:
832
- field_warn_msg = f"Field {unsupported_field} not supported by {fmt_name} format, skipped"
833
- warnings.warn(field_warn_msg, stacklevel=2)
871
+ if warn_on_unsupported_field:
872
+ for unsupported_field in unsupported_fields:
873
+ field_warn_msg = f"Field {unsupported_field} not supported by {fmt_name} format, skipped"
874
+ warnings.warn(field_warn_msg, stacklevel=2)
834
875
 
835
876
  # Try to update with supported fields only
836
877
  if format_metadata: # Only update if there are supported fields
@@ -868,7 +909,8 @@ def _handle_metadata_strategy(
868
909
  unsupported_warn_msg = (
869
910
  f"Fields not supported by {target_format_actual.value} format will be skipped: {unsupported_fields}"
870
911
  )
871
- warnings.warn(unsupported_warn_msg, stacklevel=2)
912
+ if warn_on_unsupported_field:
913
+ warnings.warn(unsupported_warn_msg, stacklevel=2)
872
914
  # Create filtered metadata without unsupported fields
873
915
  filtered_metadata = {k: v for k, v in unified_metadata.items() if k not in unsupported_fields}
874
916
  unified_metadata = filtered_metadata
@@ -5,6 +5,7 @@ import json
5
5
  import subprocess
6
6
  import tempfile
7
7
  import types
8
+ import warnings
8
9
  from pathlib import Path
9
10
  from typing import cast
10
11
 
@@ -356,6 +357,16 @@ class _AudioFile:
356
357
  msg = "The file is not a FLAC file"
357
358
  raise FileTypeNotSupportedError(msg)
358
359
 
360
+ # Warn if ID3v1 tags will be removed during re-encoding
361
+ if self._has_id3v1_tags():
362
+ warnings.warn(
363
+ "ID3v1 tags detected in FLAC file. These tags will be removed during MD5 repair "
364
+ "as they are non-standard in FLAC format and interfere with integrity validation. "
365
+ "Consider backing up ID3v1 metadata before repair if you need to preserve it.",
366
+ UserWarning,
367
+ stacklevel=3,
368
+ )
369
+
359
370
  # Create a temporary file to store the corrected FLAC content
360
371
  temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".flac")
361
372
  temp_path = temp_file.name
@@ -6,8 +6,18 @@ capabilities and limitations.
6
6
 
7
7
  import pytest
8
8
 
9
- from audiometa import delete_all_metadata, get_bitrate, get_duration_in_sec, get_unified_metadata, update_metadata
9
+ from audiometa import (
10
+ FlacMd5State,
11
+ delete_all_metadata,
12
+ fix_md5_checking,
13
+ get_bitrate,
14
+ get_duration_in_sec,
15
+ get_unified_metadata,
16
+ is_flac_md5_valid,
17
+ update_metadata,
18
+ )
10
19
  from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
20
+ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import corrupt_md5, ensure_flac_has_md5
11
21
  from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
12
22
 
13
23
 
@@ -97,6 +107,54 @@ class TestFormatSpecificWorkflows:
97
107
  assert bitrate > 0
98
108
  assert duration > 0
99
109
 
110
+ def test_flac_md5_validity_workflow(self):
111
+ """E2E test for FLAC MD5 validity checking and correction workflow."""
112
+ # Create a FLAC file with initial metadata
113
+ initial_metadata = {
114
+ "title": "MD5 Test FLAC Title",
115
+ "artist": "MD5 Test FLAC Artist",
116
+ "album": "MD5 Test FLAC Album",
117
+ }
118
+ with temp_file_with_metadata(initial_metadata, "flac") as test_file:
119
+ # Ensure the file has a valid MD5 checksum
120
+ ensure_flac_has_md5(test_file)
121
+
122
+ # 1. Verify initial MD5 is valid
123
+ initial_md5_state = is_flac_md5_valid(test_file)
124
+ assert initial_md5_state == FlacMd5State.VALID, "Initial FLAC file should have valid MD5"
125
+
126
+ # 2. Corrupt the MD5 checksum
127
+ corrupt_md5(test_file, "random")
128
+
129
+ # 3. Verify MD5 is now invalid
130
+ corrupted_md5_state = is_flac_md5_valid(test_file)
131
+ assert corrupted_md5_state == FlacMd5State.INVALID, "Corrupted MD5 should be detected as invalid"
132
+
133
+ # 4. Correct the MD5 checksum
134
+ corrected_file_path = fix_md5_checking(test_file)
135
+
136
+ # 5. Verify the corrected file has valid MD5
137
+ corrected_md5_state = is_flac_md5_valid(corrected_file_path)
138
+ assert corrected_md5_state == FlacMd5State.VALID, "Corrected file should have valid MD5"
139
+
140
+ # 6. Update metadata on the corrected file
141
+ test_metadata = {
142
+ UnifiedMetadataKey.TITLE: "Updated MD5 Test Title",
143
+ UnifiedMetadataKey.ARTISTS: ["Updated MD5 Test Artist"],
144
+ UnifiedMetadataKey.ALBUM: "Updated MD5 Test Album",
145
+ }
146
+ update_metadata(corrected_file_path, test_metadata)
147
+
148
+ # 7. Verify metadata was updated
149
+ updated_metadata = get_unified_metadata(corrected_file_path)
150
+ assert updated_metadata.get(UnifiedMetadataKey.TITLE) == "Updated MD5 Test Title"
151
+ assert updated_metadata.get(UnifiedMetadataKey.ARTISTS) == ["Updated MD5 Test Artist"]
152
+ assert updated_metadata.get(UnifiedMetadataKey.ALBUM) == "Updated MD5 Test Album"
153
+
154
+ # 8. Verify MD5 is still valid after metadata update
155
+ final_md5_state = is_flac_md5_valid(corrected_file_path)
156
+ assert final_md5_state == FlacMd5State.VALID, "MD5 should remain valid after metadata update"
157
+
100
158
  def test_complete_metadata_workflow_wav(self):
101
159
  # Use external script to set initial metadata
102
160
  initial_metadata = {"title": "Initial WAV Title", "artist": "Initial WAV Artist", "album": "Initial WAV Album"}
@@ -0,0 +1,35 @@
1
+ """Test invalid MD5 validation."""
2
+
3
+ import pytest
4
+
5
+ from audiometa import FlacMd5State, is_flac_md5_valid
6
+ from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
7
+ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import corrupt_md5, ensure_flac_has_md5
8
+
9
+
10
+ @pytest.mark.integration
11
+ class TestInvalidMd5:
12
+ def test_is_flac_md5_valid_detects_random_md5_corruption(self):
13
+ with temp_file_with_metadata({}, "flac") as test_file:
14
+ ensure_flac_has_md5(test_file)
15
+ corrupt_md5(test_file, "random")
16
+
17
+ assert (
18
+ is_flac_md5_valid(test_file) == FlacMd5State.INVALID
19
+ ), "Random MD5 corruption should be detected as INVALID"
20
+
21
+ def test_is_flac_md5_valid_detects_partial_md5_corruption(self):
22
+ with temp_file_with_metadata({}, "flac") as test_file:
23
+ ensure_flac_has_md5(test_file)
24
+ corrupt_md5(test_file, "partial")
25
+
26
+ assert (
27
+ is_flac_md5_valid(test_file) == FlacMd5State.INVALID
28
+ ), "Partially corrupted MD5 should be detected as INVALID"
29
+
30
+ def test_is_flac_md5_valid_detects_flipped_md5(self):
31
+ with temp_file_with_metadata({}, "flac") as test_file:
32
+ ensure_flac_has_md5(test_file)
33
+ corrupt_md5(test_file, "flip_all")
34
+
35
+ assert is_flac_md5_valid(test_file) == FlacMd5State.INVALID, "Flipped MD5 should be detected as INVALID"
@@ -0,0 +1,32 @@
1
+ """Test unset MD5 validation."""
2
+
3
+ import pytest
4
+
5
+ from audiometa import FlacMd5State, is_flac_md5_valid
6
+ from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
7
+ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import (
8
+ corrupt_md5,
9
+ create_flac_without_md5,
10
+ ensure_flac_has_md5,
11
+ )
12
+
13
+
14
+ @pytest.mark.integration
15
+ class TestUnsetMd5:
16
+ def test_is_flac_md5_valid_with_naturally_unset_md5(self):
17
+ with temp_file_with_metadata({}, "flac") as test_file:
18
+ # Create FLAC file without MD5 (naturally unset, not corrupted)
19
+ create_flac_without_md5(test_file)
20
+
21
+ # Unset MD5 (all zeros) should be detected as UNSET
22
+ result = is_flac_md5_valid(test_file)
23
+ assert result == FlacMd5State.UNSET, "Unset MD5 should be detected as UNSET"
24
+
25
+ def test_is_flac_md5_valid_with_corrupted_to_unset_md5(self):
26
+ with temp_file_with_metadata({}, "flac") as test_file:
27
+ ensure_flac_has_md5(test_file)
28
+ corrupt_md5(test_file, "zeros")
29
+
30
+ # Unset MD5 (all zeros) should be detected as UNSET
31
+ result = is_flac_md5_valid(test_file)
32
+ assert result == FlacMd5State.UNSET, "Unset MD5 should be detected as UNSET"
@@ -0,0 +1,90 @@
1
+ """Test delete_original parameter behavior in get_file_with_corrected_md5."""
2
+
3
+ from pathlib import Path
4
+ from unittest.mock import patch
5
+
6
+ import pytest
7
+
8
+ from audiometa import FlacMd5State, is_flac_md5_valid
9
+ from audiometa._audio_file import _AudioFile
10
+ from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
11
+ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import corrupt_md5, ensure_flac_has_md5
12
+
13
+
14
+ @pytest.mark.integration
15
+ class TestDeleteOriginalParameter:
16
+ """Test the delete_original parameter in get_file_with_corrected_md5."""
17
+
18
+ def test_delete_original_false_preserves_original_file(self):
19
+ """Test that delete_original=False (default) preserves the original file."""
20
+ with temp_file_with_metadata({}, "flac") as test_file:
21
+ ensure_flac_has_md5(test_file)
22
+ corrupt_md5(test_file, "flip_all")
23
+
24
+ # Verify initial state
25
+ assert Path(test_file).exists(), "Original file should exist before repair"
26
+ initial_state = is_flac_md5_valid(test_file)
27
+ assert initial_state == FlacMd5State.INVALID, "File should have invalid MD5 needing repair"
28
+
29
+ # Repair with delete_original=False (default)
30
+ audio_file = _AudioFile(test_file)
31
+ corrected_file_path = audio_file.get_file_with_corrected_md5(delete_original=False)
32
+
33
+ # Verify results
34
+ assert Path(test_file).exists(), "Original file should still exist after repair"
35
+ assert Path(corrected_file_path).exists(), "Corrected file should exist"
36
+
37
+ # Verify corrected file has valid MD5
38
+ final_state = is_flac_md5_valid(corrected_file_path)
39
+ assert final_state == FlacMd5State.VALID, "Corrected file should have valid MD5"
40
+
41
+ def test_delete_original_true_deletes_original_file(self):
42
+ """Test that delete_original=True deletes the original file."""
43
+ with temp_file_with_metadata({}, "flac") as test_file:
44
+ ensure_flac_has_md5(test_file)
45
+ corrupt_md5(test_file, "flip_all")
46
+
47
+ # Verify initial state
48
+ assert Path(test_file).exists(), "Original file should exist before repair"
49
+ initial_state = is_flac_md5_valid(test_file)
50
+ assert initial_state == FlacMd5State.INVALID, "File should have invalid MD5 needing repair"
51
+
52
+ # Repair with delete_original=True
53
+ audio_file = _AudioFile(test_file)
54
+ corrected_file_path = audio_file.get_file_with_corrected_md5(delete_original=True)
55
+
56
+ # Verify results
57
+ assert not Path(test_file).exists(), "Original file should be deleted after repair"
58
+ assert Path(corrected_file_path).exists(), "Corrected file should exist"
59
+
60
+ # Verify corrected file has valid MD5
61
+ final_state = is_flac_md5_valid(corrected_file_path)
62
+ assert final_state == FlacMd5State.VALID, "Corrected file should have valid MD5"
63
+
64
+ def test_delete_original_handles_deletion_error(self):
65
+ """Test that OSError is raised when original file deletion fails."""
66
+ with temp_file_with_metadata({}, "flac") as test_file:
67
+ ensure_flac_has_md5(test_file)
68
+ corrupt_md5(test_file, "flip_all")
69
+
70
+ # Verify initial state
71
+ assert Path(test_file).exists(), "Original file should exist before repair"
72
+
73
+ # Mock Path.unlink to raise OSError
74
+ with patch.object(Path, "unlink") as mock_unlink:
75
+ mock_unlink.side_effect = OSError("Permission denied")
76
+
77
+ # Attempt repair with delete_original=True
78
+ audio_file = _AudioFile(test_file)
79
+ with pytest.raises(RuntimeError) as exc_info:
80
+ audio_file.get_file_with_corrected_md5(delete_original=True)
81
+
82
+ assert "Failed to execute FLAC command" in str(exc_info.value)
83
+ assert "Failed to delete original file" in str(exc_info.value)
84
+ assert "Permission denied" in str(exc_info.value)
85
+
86
+ # Verify unlink was called (indicating the deletion attempt was made)
87
+ mock_unlink.assert_called_once()
88
+
89
+ # Original file should still exist since deletion failed (mocked)
90
+ assert Path(test_file).exists(), "Original file should still exist when deletion fails"
@@ -9,13 +9,6 @@ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import co
9
9
 
10
10
  @pytest.mark.integration
11
11
  class TestFlippedMd5:
12
- def test_is_flac_md5_valid_detects_flipped_md5(self):
13
- with temp_file_with_metadata({}, "flac") as test_file:
14
- ensure_flac_has_md5(test_file)
15
- corrupt_md5(test_file, "flip_all")
16
-
17
- assert is_flac_md5_valid(test_file) == FlacMd5State.INVALID, "Flipped MD5 should be detected as INVALID"
18
-
19
12
  def test_fix_md5_checking_flac(self):
20
13
  with temp_file_with_metadata({}, "flac") as test_file:
21
14
  ensure_flac_has_md5(test_file)
@@ -9,15 +9,6 @@ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import co
9
9
 
10
10
  @pytest.mark.integration
11
11
  class TestPartialMd5:
12
- def test_is_flac_md5_valid_detects_partial_md5_corruption(self):
13
- with temp_file_with_metadata({}, "flac") as test_file:
14
- ensure_flac_has_md5(test_file)
15
- corrupt_md5(test_file, "partial")
16
-
17
- assert (
18
- is_flac_md5_valid(test_file) == FlacMd5State.INVALID
19
- ), "Partially corrupted MD5 should be detected as INVALID"
20
-
21
12
  def test_fix_md5_checking_with_partial_corruption(self):
22
13
  with temp_file_with_metadata({}, "flac") as test_file:
23
14
  ensure_flac_has_md5(test_file)
@@ -9,15 +9,6 @@ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import co
9
9
 
10
10
  @pytest.mark.integration
11
11
  class TestRandomMd5:
12
- def test_is_flac_md5_valid_detects_random_md5_corruption(self):
13
- with temp_file_with_metadata({}, "flac") as test_file:
14
- ensure_flac_has_md5(test_file)
15
- corrupt_md5(test_file, "random")
16
-
17
- assert (
18
- is_flac_md5_valid(test_file) == FlacMd5State.INVALID
19
- ), "Random MD5 corruption should be detected as INVALID"
20
-
21
12
  def test_fix_md5_checking_with_random_corruption(self):
22
13
  with temp_file_with_metadata({}, "flac") as test_file:
23
14
  ensure_flac_has_md5(test_file)