audiometa-python 0.8.0__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 (376) hide show
  1. {audiometa_python-0.8.0/audiometa_python.egg-info → audiometa_python-0.8.1}/PKG-INFO +11 -11
  2. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/README.md +10 -10
  3. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/__init__.py +22 -0
  4. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +59 -1
  5. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +1 -0
  6. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +306 -0
  7. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +174 -0
  8. audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +306 -0
  9. {audiometa_python-0.8.0 → audiometa_python-0.8.1/audiometa_python.egg-info}/PKG-INFO +11 -11
  10. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/SOURCES.txt +4 -2
  11. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/pyproject.toml +1 -1
  12. audiometa_python-0.8.0/audiometa/test/tests/integration/audio_format/wav/test_wav_with_id3v2_tags.py +0 -83
  13. audiometa_python-0.8.0/audiometa/test/tests/integration/writing/writing_strategies/test_sync_strategy.py +0 -279
  14. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/LICENSE +0 -0
  15. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/__main__.py +0 -0
  16. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/_audio_file.py +0 -0
  17. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/cli.py +0 -0
  18. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/exceptions.py +0 -0
  19. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_MetadataManager.py +0 -0
  20. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/__init__.py +0 -0
  21. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
  22. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/__init__.py +0 -0
  23. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +0 -0
  24. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
  25. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
  26. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +0 -0
  27. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
  28. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
  29. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +0 -0
  30. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
  31. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
  32. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
  33. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/__init__.py +0 -0
  34. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_constants.py +0 -0
  35. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
  36. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
  37. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/__init__.py +0 -0
  38. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/assets/create_test_files.py +0 -0
  39. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/__init__.py +0 -0
  40. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/common/__init__.py +0 -0
  41. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
  42. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
  43. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/__init__.py +0 -0
  44. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
  45. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
  46. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
  47. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
  48. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/__init__.py +0 -0
  49. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
  50. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
  51. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
  52. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
  53. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +0 -0
  54. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/__init__.py +0 -0
  55. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
  56. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
  57. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
  58. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
  59. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_setter.py +0 -0
  60. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/scripts/__init__.py +0 -0
  61. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/technical_info_inspector.py +0 -0
  62. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
  63. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/__init__.py +0 -0
  64. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
  65. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
  66. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
  67. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
  68. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/__init__.py +0 -0
  69. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/conftest.py +0 -0
  70. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/__init__.py +0 -0
  71. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
  72. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
  73. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
  74. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
  75. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
  76. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
  77. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
  78. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
  79. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
  80. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
  81. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
  82. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
  83. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +0 -0
  84. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
  85. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
  86. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
  87. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
  88. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
  89. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
  90. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
  91. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
  92. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
  93. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
  94. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +0 -0
  95. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
  96. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
  97. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
  98. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
  99. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
  100. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
  101. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
  102. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
  103. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
  104. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
  105. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
  106. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
  107. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
  108. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/__init__.py +0 -0
  109. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
  110. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
  111. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
  112. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
  113. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
  114. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
  115. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
  116. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
  117. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
  118. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
  119. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
  120. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
  121. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
  122. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
  123. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
  124. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
  125. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/conftest.py +0 -0
  126. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
  127. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
  128. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
  129. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
  130. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
  131. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
  132. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
  133. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
  134. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
  135. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
  136. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
  137. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
  138. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
  139. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
  140. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
  141. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -0
  142. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
  143. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
  144. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
  145. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
  146. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
  147. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
  148. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
  149. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
  150. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
  151. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
  152. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
  153. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
  154. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
  155. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
  156. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
  157. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
  158. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
  159. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
  160. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
  161. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
  162. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
  163. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
  164. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
  165. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
  166. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
  167. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
  168. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
  169. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
  170. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
  171. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
  172. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
  173. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
  174. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
  175. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
  176. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
  177. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
  178. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
  179. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
  180. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
  181. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
  182. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
  183. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
  184. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
  185. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
  186. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
  187. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
  188. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
  189. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
  190. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
  191. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
  192. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
  193. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
  194. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
  195. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
  196. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
  197. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
  198. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
  199. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
  200. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
  201. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
  202. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
  203. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
  204. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/__init__.py +0 -0
  205. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
  206. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
  207. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
  208. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/__init__.py +0 -0
  209. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/__init__.py +0 -0
  210. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
  211. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
  212. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
  213. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
  214. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
  215. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/__init__.py +0 -0
  216. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/__init__.py +0 -0
  217. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
  218. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
  219. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
  220. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
  221. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/__init__.py +0 -0
  222. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
  223. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
  224. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
  225. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
  226. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
  227. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/__init__.py +0 -0
  228. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
  229. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
  230. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
  231. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
  232. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/__init__.py +0 -0
  233. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/__init__.py +0 -0
  234. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
  235. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
  236. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
  237. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
  238. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
  239. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
  240. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
  241. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
  242. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
  243. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
  244. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
  245. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
  246. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
  247. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
  248. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
  249. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
  250. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
  251. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
  252. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
  253. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
  254. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
  255. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
  256. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
  257. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
  258. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/__init__.py +0 -0
  259. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
  260. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
  261. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/__init__.py +0 -0
  262. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
  263. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
  264. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/__init__.py +0 -0
  265. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/__init__.py +0 -0
  266. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
  267. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/__init__.py +0 -0
  268. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_audio_data_corruption.py +0 -0
  269. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
  270. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +0 -0
  271. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/__init__.py +0 -0
  272. {audiometa_python-0.8.0 → 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
  273. {audiometa_python-0.8.0 → 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
  274. {audiometa_python-0.8.0 → 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
  275. {audiometa_python-0.8.0 → 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
  276. {audiometa_python-0.8.0 → 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
  277. {audiometa_python-0.8.0 → 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
  278. {audiometa_python-0.8.0 → 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
  279. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +0 -0
  280. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/__init__.py +0 -0
  281. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +0 -0
  282. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/__init__.py +0 -0
  283. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_flipped_md5.py +0 -0
  284. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_partial_md5.py +0 -0
  285. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_random_md5.py +0 -0
  286. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +0 -0
  287. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_non_flac_error.py +0 -0
  288. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_unset_md5.py +0 -0
  289. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
  290. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
  291. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
  292. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
  293. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_file.py +0 -0
  294. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
  295. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/__init__.py +0 -0
  296. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
  297. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
  298. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
  299. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
  300. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/__init__.py +0 -0
  301. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
  302. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
  303. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/__init__.py +0 -0
  304. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -0
  305. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
  306. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
  307. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/__init__.py +0 -0
  308. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/__init__.py +0 -0
  309. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/__init__.py +0 -0
  310. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
  311. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
  312. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
  313. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
  314. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
  315. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
  316. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
  317. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
  318. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
  319. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
  320. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
  321. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
  322. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/cli/__init__.py +0 -0
  323. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
  324. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/__init__.py +0 -0
  325. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
  326. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/__init__.py +0 -0
  327. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
  328. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
  329. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
  330. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
  331. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/__init__.py +0 -0
  332. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/__init__.py +0 -0
  333. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/__init__.py +0 -0
  334. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
  335. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/__init__.py +0 -0
  336. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
  337. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
  338. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/__init__.py +0 -0
  339. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
  340. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
  341. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
  342. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
  343. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
  344. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
  345. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
  346. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
  347. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_date_format_validation.py +0 -0
  348. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_disc_number_validation.py +0 -0
  349. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_format_validation.py +0 -0
  350. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_type_validation.py +0 -0
  351. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_track_number_validation.py +0 -0
  352. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
  353. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
  354. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
  355. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
  356. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/__init__.py +0 -0
  357. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/flac_md5_state.py +0 -0
  358. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/id3v1_genre_code_map.py +0 -0
  359. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/metadata_format.py +0 -0
  360. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/metadata_writing_strategy.py +0 -0
  361. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/mutagen_exception_handler.py +0 -0
  362. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
  363. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/base.py +0 -0
  364. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/config.py +0 -0
  365. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
  366. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
  367. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
  368. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/rating_profiles.py +0 -0
  369. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/tool_path_resolver.py +0 -0
  370. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/types.py +0 -0
  371. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa/utils/unified_metadata_key.py +0 -0
  372. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/dependency_links.txt +0 -0
  373. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/entry_points.txt +0 -0
  374. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/requires.txt +0 -0
  375. {audiometa_python-0.8.0 → audiometa_python-0.8.1}/audiometa_python.egg-info/top_level.txt +0 -0
  376. {audiometa_python-0.8.0 → 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.8.0
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).
@@ -830,6 +830,28 @@ def _handle_metadata_strategy(
830
830
  # Then sync all other available formats
831
831
  # Note: We need to be careful about the order to avoid conflicts
832
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
+
833
855
  # For non-target formats, filter out unsupported fields and warn about them
834
856
  # This allows syncing supported fields even when some fields are not supported
835
857
  unsupported_fields = []
@@ -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 @@
1
+ """SYNC strategy tests organized by file extension."""
@@ -0,0 +1,306 @@
1
+ """Tests for SYNC metadata writing strategy on FLAC files.
2
+
3
+ This module tests the SYNC strategy which writes to native format (Vorbis) and synchronizes other metadata formats
4
+ that are already present (ID3v1, ID3v2).
5
+ """
6
+
7
+ import pytest
8
+
9
+ from audiometa import get_unified_metadata, update_metadata
10
+ from audiometa.test.helpers.id3v1.id3v1_metadata_setter import ID3v1MetadataSetter
11
+ from audiometa.test.helpers.id3v2.id3v2_metadata_setter import ID3v2MetadataSetter
12
+ from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
13
+ from audiometa.utils.metadata_format import MetadataFormat
14
+ from audiometa.utils.metadata_writing_strategy import MetadataWritingStrategy
15
+ from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
16
+
17
+
18
+ @pytest.mark.integration
19
+ class TestFlacSyncStrategy:
20
+ def test_flac_no_metadata_sync(self):
21
+ """Test SYNC strategy on FLAC file with no existing metadata.
22
+
23
+ SYNC should write to Vorbis (native) but NOT create ID3v1 or ID3v2.
24
+ """
25
+ with temp_file_with_metadata({}, "flac") as test_file:
26
+ # File starts with no metadata
27
+ flac_metadata = {
28
+ UnifiedMetadataKey.TITLE: "FLAC Title",
29
+ UnifiedMetadataKey.ARTISTS: ["FLAC Artist"],
30
+ UnifiedMetadataKey.ALBUM: "FLAC Album",
31
+ }
32
+ update_metadata(test_file, flac_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
33
+
34
+ # Verify Vorbis metadata was written
35
+ vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
36
+ assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "FLAC Title"
37
+ assert vorbis_after.get(UnifiedMetadataKey.ARTISTS) == ["FLAC Artist"]
38
+ assert vorbis_after.get(UnifiedMetadataKey.ALBUM) == "FLAC Album"
39
+
40
+ # Verify ID3v1 was NOT created
41
+ id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
42
+ assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
43
+
44
+ # Verify ID3v2 was NOT created
45
+ id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
46
+ assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
47
+
48
+ # Merged metadata should show Vorbis values
49
+ merged = get_unified_metadata(test_file)
50
+ assert merged.get(UnifiedMetadataKey.TITLE) == "FLAC Title"
51
+
52
+ def test_flac_vorbis_only_sync(self):
53
+ """Test SYNC strategy on FLAC file with only Vorbis metadata.
54
+
55
+ SYNC should write to Vorbis (native) but NOT create ID3v1 or ID3v2.
56
+ """
57
+ with temp_file_with_metadata(
58
+ {"title": "Initial Title", "artist": "Initial Artist", "album": "Initial Album"}, "flac"
59
+ ) as test_file:
60
+ # File has Vorbis metadata
61
+ vorbis_initial = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
62
+ assert vorbis_initial.get(UnifiedMetadataKey.TITLE) == "Initial Title"
63
+
64
+ # Now write Vorbis metadata with SYNC strategy
65
+ vorbis_metadata = {
66
+ UnifiedMetadataKey.TITLE: "Updated Title",
67
+ UnifiedMetadataKey.ARTISTS: ["Updated Artist"],
68
+ UnifiedMetadataKey.ALBUM: "Updated Album",
69
+ }
70
+ update_metadata(test_file, vorbis_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
71
+
72
+ # Verify Vorbis metadata was updated
73
+ vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
74
+ assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Updated Title"
75
+
76
+ # Verify ID3v1 was NOT created
77
+ id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
78
+ assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
79
+
80
+ # Verify ID3v2 was NOT created
81
+ id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
82
+ assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
83
+
84
+ # Merged metadata should show updated Vorbis values
85
+ merged = get_unified_metadata(test_file)
86
+ assert merged.get(UnifiedMetadataKey.TITLE) == "Updated Title"
87
+
88
+ def test_flac_id3v1_only_sync(self):
89
+ """Test SYNC strategy on FLAC file with only ID3v1 metadata.
90
+
91
+ SYNC should write to Vorbis (native) and sync to ID3v1 (existing).
92
+ """
93
+ with temp_file_with_metadata({}, "flac") as test_file:
94
+ # Add ID3v1 metadata using external tools
95
+ ID3v1MetadataSetter.set_metadata(
96
+ test_file, {"title": "ID3v1 Title", "artist": "ID3v1 Artist", "album": "ID3v1 Album"}
97
+ )
98
+
99
+ # Verify ID3v1 metadata was written
100
+ id3v1_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
101
+ assert id3v1_result.get(UnifiedMetadataKey.TITLE) == "ID3v1 Title"
102
+
103
+ # Now write Vorbis metadata with SYNC strategy
104
+ vorbis_metadata = {
105
+ UnifiedMetadataKey.TITLE: "Synced Title",
106
+ UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
107
+ UnifiedMetadataKey.ALBUM: "Synced Album",
108
+ }
109
+ update_metadata(test_file, vorbis_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
110
+
111
+ # Verify Vorbis metadata was written
112
+ vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
113
+ assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
114
+
115
+ # Verify ID3v1 metadata was synced (overwritten)
116
+ id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
117
+ assert id3v1_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
118
+
119
+ # Verify ID3v2 was NOT created
120
+ id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
121
+ assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
122
+
123
+ # Merged metadata should prefer Vorbis (higher precedence)
124
+ merged = get_unified_metadata(test_file)
125
+ assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
126
+
127
+ def test_flac_id3v2_only_sync(self):
128
+ """Test SYNC strategy on FLAC file with only ID3v2 metadata.
129
+
130
+ SYNC should write to Vorbis (native) and sync to ID3v2 (existing).
131
+ """
132
+ with temp_file_with_metadata({}, "flac") as test_file:
133
+ # Add ID3v2 metadata using external tools
134
+ ID3v2MetadataSetter.set_metadata(
135
+ test_file,
136
+ {"title": "ID3v2 Title", "artist": "ID3v2 Artist", "album": "ID3v2 Album"},
137
+ version="2.3",
138
+ )
139
+
140
+ # Verify ID3v2 metadata was written
141
+ id3v2_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
142
+ assert id3v2_result.get(UnifiedMetadataKey.TITLE) == "ID3v2 Title"
143
+
144
+ # Now write Vorbis metadata with SYNC strategy
145
+ vorbis_metadata = {
146
+ UnifiedMetadataKey.TITLE: "Synced Title",
147
+ UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
148
+ UnifiedMetadataKey.ALBUM: "Synced Album",
149
+ }
150
+ update_metadata(test_file, vorbis_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
151
+
152
+ # Verify Vorbis metadata was written
153
+ vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
154
+ assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
155
+
156
+ # Verify ID3v2 metadata was synced (overwritten)
157
+ id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
158
+ assert id3v2_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
159
+
160
+ # Verify ID3v1 was NOT created
161
+ id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
162
+ assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
163
+
164
+ # Merged metadata should prefer Vorbis (higher precedence)
165
+ merged = get_unified_metadata(test_file)
166
+ assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
167
+
168
+ def test_flac_vorbis_plus_id3v1_sync(self):
169
+ """Test SYNC strategy on FLAC file with Vorbis and ID3v1 metadata.
170
+
171
+ SYNC should write to Vorbis (native) and sync to ID3v1 (existing).
172
+ """
173
+ with temp_file_with_metadata(
174
+ {"title": "Vorbis Title", "artist": "Vorbis Artist", "album": "Vorbis Album"}, "flac"
175
+ ) as test_file:
176
+ # Add ID3v1 metadata using external tools
177
+ ID3v1MetadataSetter.set_metadata(
178
+ test_file, {"title": "ID3v1 Title", "artist": "ID3v1 Artist", "album": "ID3v1 Album"}
179
+ )
180
+
181
+ # Verify both formats have metadata
182
+ vorbis_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
183
+ assert vorbis_result.get(UnifiedMetadataKey.TITLE) == "Vorbis Title"
184
+ id3v1_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
185
+ assert id3v1_result.get(UnifiedMetadataKey.TITLE) == "ID3v1 Title"
186
+
187
+ # Now write Vorbis metadata with SYNC strategy
188
+ sync_metadata = {
189
+ UnifiedMetadataKey.TITLE: "Synced Title",
190
+ UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
191
+ UnifiedMetadataKey.ALBUM: "Synced Album",
192
+ }
193
+ update_metadata(test_file, sync_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
194
+
195
+ # Verify Vorbis metadata was updated
196
+ vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
197
+ assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
198
+
199
+ # Verify ID3v1 metadata was synced
200
+ id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
201
+ assert id3v1_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
202
+
203
+ # Verify ID3v2 was NOT created
204
+ id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
205
+ assert id3v2_after.get(UnifiedMetadataKey.TITLE) is None
206
+
207
+ # Merged metadata should prefer Vorbis
208
+ merged = get_unified_metadata(test_file)
209
+ assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
210
+
211
+ def test_flac_vorbis_plus_id3v2_sync(self):
212
+ """Test SYNC strategy on FLAC file with Vorbis and ID3v2 metadata.
213
+
214
+ SYNC should write to Vorbis (native) and sync to ID3v2 (existing).
215
+ """
216
+ with temp_file_with_metadata(
217
+ {"title": "Vorbis Title", "artist": "Vorbis Artist", "album": "Vorbis Album"}, "flac"
218
+ ) as test_file:
219
+ # Add ID3v2 metadata using external tools
220
+ ID3v2MetadataSetter.set_metadata(
221
+ test_file,
222
+ {"title": "ID3v2 Title", "artist": "ID3v2 Artist", "album": "ID3v2 Album"},
223
+ version="2.3",
224
+ )
225
+
226
+ # Verify both formats have metadata
227
+ vorbis_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
228
+ assert vorbis_result.get(UnifiedMetadataKey.TITLE) == "Vorbis Title"
229
+ id3v2_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
230
+ assert id3v2_result.get(UnifiedMetadataKey.TITLE) == "ID3v2 Title"
231
+
232
+ # Now write Vorbis metadata with SYNC strategy
233
+ sync_metadata = {
234
+ UnifiedMetadataKey.TITLE: "Synced Title",
235
+ UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
236
+ UnifiedMetadataKey.ALBUM: "Synced Album",
237
+ }
238
+ update_metadata(test_file, sync_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
239
+
240
+ # Verify Vorbis metadata was updated
241
+ vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
242
+ assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
243
+
244
+ # Verify ID3v2 metadata was synced
245
+ id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
246
+ assert id3v2_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
247
+
248
+ # Verify ID3v1 was NOT created
249
+ id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
250
+ assert id3v1_after.get(UnifiedMetadataKey.TITLE) is None
251
+
252
+ # Merged metadata should prefer Vorbis
253
+ merged = get_unified_metadata(test_file)
254
+ assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"
255
+
256
+ def test_flac_all_formats_sync(self):
257
+ """Test SYNC strategy on FLAC file with Vorbis, ID3v1, and ID3v2 metadata.
258
+
259
+ SYNC should write to Vorbis (native) and sync to ID3v1 and ID3v2 (existing).
260
+ """
261
+ with temp_file_with_metadata(
262
+ {"title": "Vorbis Title", "artist": "Vorbis Artist", "album": "Vorbis Album"}, "flac"
263
+ ) as test_file:
264
+ # Add ID3v1 metadata using external tools
265
+ ID3v1MetadataSetter.set_metadata(
266
+ test_file, {"title": "ID3v1 Title", "artist": "ID3v1 Artist", "album": "ID3v1 Album"}
267
+ )
268
+
269
+ # Add ID3v2 metadata using external tools
270
+ ID3v2MetadataSetter.set_metadata(
271
+ test_file,
272
+ {"title": "ID3v2 Title", "artist": "ID3v2 Artist", "album": "ID3v2 Album"},
273
+ version="2.3",
274
+ )
275
+
276
+ # Verify all formats have metadata
277
+ vorbis_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
278
+ assert vorbis_result.get(UnifiedMetadataKey.TITLE) == "Vorbis Title"
279
+ id3v1_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
280
+ assert id3v1_result.get(UnifiedMetadataKey.TITLE) == "ID3v1 Title"
281
+ id3v2_result = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
282
+ assert id3v2_result.get(UnifiedMetadataKey.TITLE) == "ID3v2 Title"
283
+
284
+ # Now write Vorbis metadata with SYNC strategy
285
+ sync_metadata = {
286
+ UnifiedMetadataKey.TITLE: "Synced Title",
287
+ UnifiedMetadataKey.ARTISTS: ["Synced Artist"],
288
+ UnifiedMetadataKey.ALBUM: "Synced Album",
289
+ }
290
+ update_metadata(test_file, sync_metadata, metadata_strategy=MetadataWritingStrategy.SYNC)
291
+
292
+ # Verify Vorbis metadata was updated
293
+ vorbis_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.VORBIS)
294
+ assert vorbis_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
295
+
296
+ # Verify ID3v1 metadata was synced
297
+ id3v1_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V1)
298
+ assert id3v1_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
299
+
300
+ # Verify ID3v2 metadata was synced
301
+ id3v2_after = get_unified_metadata(test_file, metadata_format=MetadataFormat.ID3V2)
302
+ assert id3v2_after.get(UnifiedMetadataKey.TITLE) == "Synced Title"
303
+
304
+ # Merged metadata should prefer Vorbis
305
+ merged = get_unified_metadata(test_file)
306
+ assert merged.get(UnifiedMetadataKey.TITLE) == "Synced Title"